summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipsk/pprescan.c
diff options
context:
space:
mode:
authorTakuji Tanaka <ttk@t-lab.opal.ne.jp>2020-04-19 05:49:02 +0000
committerTakuji Tanaka <ttk@t-lab.opal.ne.jp>2020-04-19 05:49:02 +0000
commite6bccc2c57ea66b55b57fe41c69bd00a6bb1360d (patch)
tree7936e10bf3f3721aa9465dcdc7a578b84965ef12 /Build/source/texk/dvipsk/pprescan.c
parentf3563c2df3706c3683e76533e9a8a09b4bed21cd (diff)
texk/dvipsk: Fallback multibyte character in VF for (u)pTeX
git-svn-id: svn://tug.org/texlive/trunk@54794 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipsk/pprescan.c')
-rw-r--r--Build/source/texk/dvipsk/pprescan.c46
1 files changed, 33 insertions, 13 deletions
diff --git a/Build/source/texk/dvipsk/pprescan.c b/Build/source/texk/dvipsk/pprescan.c
index d1a024a50b8..665e40c7998 100644
--- a/Build/source/texk/dvipsk/pprescan.c
+++ b/Build/source/texk/dvipsk/pprescan.c
@@ -113,11 +113,16 @@ dochar:
if (curfnt==NULL)
error("! Bad DVI file: no font selected");
if (mychar>=curfnt->maxchars) {
- sprintf(errbuf,"! invalid char %d from font %.500s",
- mychar, curfnt->name);
- error(errbuf);
+ if (!noptex && mychar<0x1000000 && curfnt->loaded == 2 && curfnt->kind == VF_PTEX) {
+ /* fallback */
+ } else {
+ sprintf(errbuf,"! [pscanpage] invalid char %d from font %.500s",
+ mychar, curfnt->name);
+ error(errbuf);
+ }
}
if (curfnt->loaded == 2) { /* scanning a virtual font character */
+ struct tft *ffont0;
frp->curp = curpos;
frp->curl = curlim;
frp->ff = ffont;
@@ -125,17 +130,32 @@ dochar:
if (++frp == &frames[MAXFRAME] )
error("! virtual recursion stack overflow");
cd = curfnt->chardesc + mychar;
- if (cd->packptr == 0) {
- fprintf(stderr, "Wrong char code: %04X\n", mychar);
- error("! a non-existent virtual char is being used; check vf/tfm files");
+ if (mychar>=curfnt->maxchars || cd->packptr == NULL) {
+ if (!noptex && mychar<0x1000000 && curfnt->kind == VF_PTEX) { /* fallback */
+#ifdef DEBUG
+ if (dd(D_FONTS))
+ fprintf(stderr,
+ "We will fallback pTeX vf:%s to %s\n",
+ curfnt->name, curfnt->localfonts->desc->name);
+#endif /* DEBUG */
+ } else {
+ fprintf(stderr, "Wrong char code: %04X\n", mychar);
+ error("! a non-existent virtual character is being used; check vf/tfm files");
+ }
+ ffont0 = curfnt->localfonts;
+ if (ffont0==NULL)
+ curfnt = NULL;
+ else
+ ppreselectfont(ffont0->desc);
+ } else {
+ curpos = cd->packptr + 2;
+ curlim = curpos + (256*(long)(*cd->packptr)+(*(cd->packptr+1)));
+ ffont = curfnt->localfonts;
+ if (ffont==NULL)
+ curfnt = NULL;
+ else
+ ppreselectfont(ffont->desc);
}
- curpos = cd->packptr + 2;
- curlim = curpos + (256*(long)(*cd->packptr)+(*(cd->packptr+1)));
- ffont = curfnt->localfonts;
- if (ffont==NULL)
- curfnt = NULL;
- else
- ppreselectfont(ffont->desc);
} else if (curfnt->loaded == 3)
curfnt->chardesc[mychar].flags = EXISTS;
break;