diff options
author | Takuji Tanaka <ttk@t-lab.opal.ne.jp> | 2020-04-19 05:49:02 +0000 |
---|---|---|
committer | Takuji Tanaka <ttk@t-lab.opal.ne.jp> | 2020-04-19 05:49:02 +0000 |
commit | e6bccc2c57ea66b55b57fe41c69bd00a6bb1360d (patch) | |
tree | 7936e10bf3f3721aa9465dcdc7a578b84965ef12 /Build/source/texk/dvipsk/pprescan.c | |
parent | f3563c2df3706c3683e76533e9a8a09b4bed21cd (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.c | 46 |
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; |