dvi2dvi-2.0-alpha/ 40755 163 163 0 7202315063 13241 5ustar sakuraisakuraidvi2dvi-2.0-alpha/README100644 163 163 1754 7202305360 14224 0ustar sakuraisakuraiREADME for dvi2dvi (2.0 alpha) $B:y0f5.J8(B(sakurai@math.s.chiba-u.ac.jp) $B@iMUBg(B $BM}3XIt(B $B?t3X!&>pJs?tM}3X2J(B [] Copyright$B5Z$SG[I[>r7o$K$D$$$F$O!"%U%!%$%k(B COPYRIGHT $B$r8fMw2<$5$$!#(B $B:y0f$,(Bcopyright$B$r;}$DItJ,$K$D$$$F$O!"4pK\E*$K$O%=!<%9(B $B%3!<%I$rIU$1$l$P2~JQ<+M3$K$J$C$F$$$^$9$,!"2~JQ$7$?(Bpackage$B$N(B $BG[I[$K$D$$$F$O0J2<$N>r7o$rIU$1$F$$$^$9!#(B version$BL>$O$^$.$i$o$7$/$J$$$b$N$K$9$k(B (<$B?t(B>$B$@$1$+$i$J$k(Bversion$BHV9f$O;H$o$J$$(B) $B$^$?!">r7o$H$O$7$^$;$s$,!"2~JQFbMF$rCN$i$;$F2<$5$k$3$H$r4|BT$7$^$9!#(B ($BFC$K(Bbug fix$B$N>l9g$O$<$R$H$b!#(B) [] dvi2dvi$B$N$NC1=c$JCV$-49$((B $B!&(B2byte$B$N(Bfont$B$N(Bsubfont$B$X$NJ,2r(B $B!&(Bkpathsea$BJ}<0$K$h$k%U%)%s%H;XDj$b2DG=(B dvi2dvi$B$N(Binstall$B$N;EJ}$K$D$$$F$O!"(Bdoc/install.doc$B$rFI$s$G2<$5$$!#(B dvi2dvi$B$N;H$$J}$K$D$$$F$O!"(Bdoc/dvi2dvi.doc$B$rFI$s$G2<$5$$!#(B dvi2dvi-2.0-alpha/doc/ 40755 163 163 0 7202314202 14000 5ustar sakuraisakuraidvi2dvi-2.0-alpha/doc/dvi2dvi.doc100644 163 163 13766 5773573737 16227 0ustar sakuraisakurai1. fontdesc * dvi2ps j-version$B$N(Bfontdesc$B$N=q$-J}$rM}2r$7$F$$$k$H2>Dj$7$^$9!#(B * virtual font$B$H$O2?$+$K$D$$$F$bCN$C$F$$$k$H$7$^$9!#(B virtutal font$B$r;XDj$9$k$K$O!"(B font vf * 0 /usr/local/lib/tex/fonts/vf/%f.vf $B$N$h$&$K$9$k!#(B($BBh(B3$B%U%#!<%k%I$HBh(B4$B%U%#!<%k%I$O;H$o$l$J$$!#(B) $B$3$N$H$-(B virtual font$B$GDj5A$5$l$kJ8;z$N(Bcode$B$O(B0-255$B$H2>Dj$7$F$$$k$,!"$=$l0J30$N(B $BHO0O$N(Bcode$B$NJ8;z$rDj5A$7$F$$$k>l9g$G$b!"(Bjis code$B$NHO0O$J$i(B font jvf * 0 /usr/local/lib/tex/jfonts/vf/%f.vf $B$N$h$&$KBh(B2$B%U%#!<%k%I$r(Bjvf$B$H$9$l$P$h$$!#(B $BCm0U(B: $B!&(BA$B$H$$$&L>A0$N%U%)%s%H$,(Bvirtual font$B$GDj5A$5$l(B $B$=$NCf$G(BB$B$H$$$&%U%)%s%H$r;H$C$F$$$k!"(B $B!&(BB$B$H$$$&L>A0$N%U%)%s%H$,(Bvirtual font$B$GDj5A$5$l(B $B$=$NCf$G(BA$B$H$$$&%U%)%s%H$r;H$C$F$$$k!"(B $B$H$$$&>l9g(B($B$?$H$($P(BNTT JTeX$B$H(BASCII$BF|K\8l(BTeX$B$NAj8_JQ49$N$?$a$N(Bvirtural fonts)$B!"F1$8(Bdirectory$B$KN>J}$rCV$/$HL58B%k!<%W$K$*$A$$$k(B($B>l9g$b$"$k(B)$B$N(B $B$G!"Cm0U$,I,MW$G$"$k!#(B virtual font$BCf$G;H$o$l$F$$$k%U%)%s%H$N(Bmetrics$B$O$o$+$C$F$$$J$/$F$b(B virtual font$B$NE83+$O2DG=$G$"$k$,!"$o$+$C$F$$$l$PF@$i$l$k(Bdvi$B$N%5%$%:$r(B $B$h$j>.$5$/$G$-$k!#$=$l$i$N%U%)%s%H$N(Btfm$B$r;XDj$9$k$K$O!"(Bdvi2ps$B$N$H$-$H(B $B$HF1MM$K!"(B font tfm * 0 /usr/local/lib/tex/fonts/tfm/%f.tfm font jfm * 0 /usr/local/lib/tex/jfonts/jfm/%f.tfm $B$N$h$&$K$9$k!#(B $B$^$?C1=c$K%U%)%s%H$NL>A0$rCV$-49$($?$$$@$1$N>l9g$O!"(Bvirtual font$B$,$J$/(B $B$F$b(B replfont dmjsy10 jmjsy10 10 $B$N$h$&$K$9$l$P!"(Bdmjsy10$B$H$$$&%U%)%s%H$NBe$o$j$K(Bjmjsy10$B$H$$$&%U%)%s%H$r(B $B;H$&$3$H$,$G$-$k!#(B4$BHVL\$N%U%#!<%k%I$O(B3$BHVL\$N%U%)%s%H$N(Bdesign size$B$N;X(B $BDj$G$"$k!#$b$A$m$sN>H!#(B) $B$^$?C1=c$JL>A0$NCV$-49$($G:Q$`Nc$H$7$F$O!"(B $B!&(BNTT JTeX$B$NBgF|K\%U%)%s%H$rEOJU(BDNP$B%U%)%s%H$KCV$-49$($k(B (lib-dist/n2w) $B$3$H$,$G$-$k!#(B $B$5$i$K!"(BpTeX$B$N(Bdvi$B$r(BNTT JTeX$B$N(Bdvi$B$KJQ49$9$k$3$H$b$G$-$k!#6qBNE*$J;XDjNc(B $B$O(Blib.doc$B$G@bL@$9$k$,!"JQ49$9$k$K$O(BpTeX$B$KFCM-$J(Bdir$BL?Na(B($BJ8;zAw$j$NJ}8~(B $B$rJQ$($k!"$9$J$o$ADL>o$N%b!<%I$+=D=q$-%b!<%I$+$rJQ99$9$kL?Na(B)$B$r>C5n$7(B $B$J$1$l$P$J$i$J$$$N$G!"$3$3$G$O$=$l$K$D$$$F@bL@$9$k!#Bg$-$/J,$1$k$H>C5n(B $B$K;EJ}$K$O0J2<$N(B3$B$D$NCJ3,$,$"$k!#(B 1. dir$BL?Na$O$=$N$^$^$G!"(Bvirtural font$B$NE83+$N$_$r$9$k!#(B 2. dir$BL?Na$r$G$-$k$@$1>C5n$9$k!#(B 3. $B$H$K$+$/(Bdir$BL?Na$r>C5n$9$k!#(B 1$B$N;XDj$r$7$?$$$H$-$O(B ptex keep $B$H$$$&9T$r(Bfontdesc$B%U%!%$%k$K2C$($k!#(B 2$B$N;XDj(B($B$3$l$,%G%U%)%k%H(B)$B$r$7$?$$$H$-$O(B ptex elim $B$H$$$&9T$r(Bfontdesc$B%U%!%$%k$K2C$($k!#$3$N;XDj$r$7$?$H$-(Bdir$BL?Na$OJ8;zL?(B $BNa$NA08e$K$N$_;D$j!"A0$K;D$k$N$OJ}8~$rJQ$($k(Bdir$BL?Na!"8e$K;D$k$N$ODL>o(B $B$N>uBV(B($BB'$A?eJ?J}8~(B)$B$KLa$k(Bdir$BL?Na$G$"$k!#(B 3$B$N;XDj$r$7$?>l9g!"(B2$B$G;D$C$?(Bdir$BL?Na$*$h$S(B($B>l9g$K$h$C$F$O(B)$B$=$l$i$K$O$5(B $B$^$l$?J8;zL?Na$rJQ49$9$k!#JQ49$N;EJ}$K$h$C$F0J2<$N$h$&$K;XDj$9$k!#(B 3.1. $BJ8;z$NA08e$K;D$k(Bdir$BL?Na$r(Bspecial$BL?Na$KJQ49$9$k!#A0$K;D$k(B $BJ}8~JQ99$N(Bdir$BL?Na(B($B8=:_$N=j!"=D=q$-J}8~$X$NJQ99$N$_$G$"$k(B) $B$NJQ49$O0J2<$N$h$&$K!"(B ptex special vert "ps:gsave currentpoint $BN,(B" $B8e$K;D$k(Bdir$BL?Na$NJQ49$O(B ptex special end "ps:currentpoint grestore moveto" $B$N$h$&$K;XDj$9$k!#(B 3.2. $BJ8;z$NA08e$K;D$k(Bdir$BL?Na$O>C5n$7!"J8;z$b=PNO$;$:$=$NI}$@$1(B $B6uGr$K$9$k!#(B ptex ignore 3.3. $BJ8;z$NA08e$K;D$k(Bdir$BL?Na$O>C5n$7!"J8;z$b=PNO$;$:$=$NI}$@$1(B $B@~$r0z$/!#(B ptex mark line 3.4. $BJ8;z$NA08e$K;D$k(Bdir$BL?Na$O>C5n$7!"J8;z$O?eJ?$N$^$^E,Ev$J0LCV(B $B$K=PNO$9$k!#(B($BI,$:$7$bJ8;z$O8+$d$9$/$O$J$$!#(B) ptex mark char $B$7$?$,$C$F!"$3$l$i(B3$B$N>l9g$K$OJ8;z$NI}$rCN$kI,MW$,$"$k$N$G!"(Bfontdesc$B$G(B $BI,MW$J>pJs$r;XDj$7$J$1$l$P$J$i$J$$!#$9$J$o$A(B font tfm * 0 /usr/local/lib/tex/fonts/tfm/%f.tfm $B$N$h$&$K;XDj$9$k!#(B ptex$B$G;O$^$k9T$,(B2$B$D0J>e$"$k$H$-$O:G8e$K$"$k$b$N$,M-8z$G$"$k!#(B $B$^$?!"(B vfont vf * 0 /usr/local/lib/tex/jfonts/vf-tjsy/%f.vf $B$N$h$&$K(Bvfont$B$G;O$^$k9T$O!"=D=q$-%b!<%I$K8=$o$l$?%U%)%s%H$KBP$7$F$N$_(B $BE,MQ$5$l$k!#(B 2. $B;H$$J}(B $B0z?t$K(Bdvi$B%U%!%$%k$r$H$j(B dvi2dvi dvi-file $B$H$9$k$H!"I8=`=PNO$KJQ49$5$l$?(Bdvi$B$,=PNO$5$l$k!#(Bfontdesc$B$r;XDj$9$k$K$O(B dvi2dvi -F your-fontdesc dvi-file $B$H$9$k!#$3$N(Byour-fontdesc$B$,$I$N$h$&$J(Bfontdesc$B%U%!%$%k$r;XDj$9$k$+$N5,(B $BB'$O(Bdvi2ps$B$HF1$8$G$"$k!#(B-F $B$rJ#?t2s;XDj$9$k$H!"=g$K$=$l$i$N(Bfontdesc$B%U%!(B $B%$%k$rFI$`!#$^$?(B dvi2dvi -c outdvi dvi-file $B$H$9$k$H(Boutdvi$B$H$$$&%U%!%$%k$KJQ49$5$l$?(Bdvi$B$,=q$-9~$^$l$k!#(B $B4D6-JQ?t$K$h$k(Bfontdesc$B%U%!%$%k;XDj$b(Bdvi2ps$B$HF1MM$G$"$k$,!"(B DVI2PSLIB -> DVI2DVILIB DVI2PSPATH -> DVI2DVIPATH FONTDESC -> FONTDESCDVI $B$HJQ99$7$?$b$N$K$h$k!#(B 3. $BF&CN<1(B a) $B$?$H$($P(Blib.doc$B$G@bL@$7$?Nc$G$O!"(B-90$BEY2sE>$7$?(Bbitmap$B$r;}$D%U%)%s%H(B $B$N$?$a$K(Bvirtual font$B$r<+F0E*$K@8@.$7$?$,!"!#(B($B%G%#%l%/%H%jL>$O4^$^$J$$!#(B${DVI2LIB} $B$N2<$KCV$+$l$k!#(B) $B!&(BDVI2DVIPATH$B$N@_Dj(B DVI2PATH fontdesc$B%U%!%$%k$NC5:w$N%G%U%)%k%H%Q%9!#(B ($B$?$@$7$3$3$G$$$&%Q%9$O!"%G%#%l%/%H%j$r!V(B:$B!W(B(MSDOS$B$N$H$-(B $B$O!V(B;$B!W(B)$B$G6h@Z$C$?$b$N!#(B) $B$3$l$O4D6-JQ?t(BDVI2DVIPATH$B$,%;%C%H$5$l$F$$$J$$$H$-$N%G%U%)%k%H(B $BCM$N;XDj$G$"$k!#(B $B!&(BC$B%3%s%Q%$%iMQ$N@_Dj(B CFLAGS $B<+J,$N%7%9%F%`$K$"$o$;$FJQ99$9$k!#(B $B$9$Y$F$N%7%9%F%`$G%3%s%Q%$%k$G$-$k$3$H$r3NG'$7$?$o$1$G$O(B $B$J$$$N$G!"<+J,$N%7%9%F%`$G$&$^$/$$$+$J$$$H$-$O(BPOSIX$B$d(B SYSV$B$rDj5A$7$?$j$7$J$+$C$?$j$7$F;n$_$F2<$5$$!#(B(defs.h$B$N(B $B:G=i$N$"$?$j$r;2>H$7$F2<$5$$!#(B) gcc$B$N>l9g$O$5$i$K(B -traditional $B$r$D$1$?$j$O$:$7$?$j$7$F$_$F2<$5$$!#(B $B$^$?(BANSI$B$K87L)$K=>$&%3%s%Q%$%i$@$H:8JUCM$K(Bcast$B$r5v$5$J$$$N$G(B $B%(%i!<$,=P$k8D=j$,(B($BB??t(B)$B$"$k!#$3$N>l9g!":8JUCM$K(Bcast$B$r5v$9(B $B$h$&$J%*%W%7%g%s$r;H$&$7$+$J$$!#(B $B!&(BMSDOS$B$G$N(BMakefile MSDOS$B$G$O%3%^%s%I%i%$%s$ND9$5$N@)8B(B(128$BJ8;z0JFb(B)$B$,$"$k$N$G!":G8e$N(Blink$B$N(B $B$H$-$K$O%l%9%]%s%9%U%!%$%k$r;H$&$h$&$K=$@5$9$kI,MW$,$"$k$=$&$G$9!#(B 2. fontdesc$B$N5-=R(B $BG[I[MQ$N(Bfontdesc$B$N5-=R$,(Blib-dist$B$K$"$k!#?7$K5-=R$r;O$a$k$H$-$O(B make newlib $B$9$k$H(Blib-dist$B$N2<$N%U%!%$%k$,(Blib$B$N2<$K%3%T!<$5$l$k!#(B doc/lib.doc$B$rFI$_!"$=$N;X<($K=>$C$F(Blib$B$N2<$K$"$k%U%!%$%k$rJQ99$9$k!#(B (doc/dvi2dvi.doc$B$bFI$`!#(B) $B<+J,$N%5%$%H$G$N%G%U%)%k%H$G$NF0:n$r$I$&$9$k$+(B $B7h$a$F!"(Bfontdesc$B%U%!%$%k(Blib/${FONTDESC}$B$r=q$/$+!"$9$G$K$"$k$b$N$r%3%T!<$9$k!#(B 3. $B%3%s%Q%$%k(B make $B$9$k$H(Bdvi2dvi$B$,%3%s%Q%$%k$5$l$k!#>e5-$N(Bfontdesc$B$N5-=R$,@5$7$$$+(B $B$I$&$+%F%9%H$7$?$$$H$-$O4D6-JQ?t(BDVI2DVILIB$B$r(Blib$B$K@_Dj$9$k$H$h$$!#(B 4. $B%$%s%9%H!<%k(B make install $B$9$k$HK\BN(Bdvi2dvi$B$,(B${BINAREA}$B$K%$%s%9%H!<%k$5$l$k!#(B make install-lib $B$9$k$H(Blib$B$N2<$N(Bfontdesc$B$N5-=R$,(B${DVI2LIB}$B$K%3%T!<$5$l$k!#(B dvi2dvi-2.0-alpha/doc/changes.doc100644 163 163 2766 7202044614 16216 0ustar sakuraisakurai------------------------------------------------------------------------------- [1.2 -> 2.0 alpha] $B!&(Bfontdesc$B%U%!%$%k$NC5$7J}!"$9$J$o$A(BDVI2PS, DV2PSLIB$B$N0UL#$rJQ99$7$?!#(B $B!&(Bjfm$B$r4V0c$($F(Btfm$B$H$9$k$H(B core dump $B$9$k$H$$$&%P%0$r=$@5$7!"(Bfont tfm $B$G;XDj$7$?$H$-$O!"(Btfm$B$G$b(Bjfm$B$G$bBP1~$G$-$k$h$&$K$7$?!#(B ------------------------------------------------------------------------------- [1.1 -> 1.2] $B!&(B256$B%P%$%H0J>e$N(Bspecial$B$r4^$s$@(Bdvi$B$rJQ49$7$?$H$-!"(BPOST_POST$BL?NaCf$G<($5(B $B$l$k%]%9%H%"%s%V%k$N3+;O0LCV$, 1.1] $B!&(Bkpathsea$BJ}<0$K$h$k%U%)%s%H;XDj$r%5%]!<%H$7$?!#(B ------------------------------------------------------------------------------- [0.9 -> 1.0] $B!&(BpTeX$BFCM-$NL?Na$r>C5n$7!"DL>o$N(Bdvi$B$7$+07$($J$$$h$&$J(Bdvi driver$B$G$b07$($k(B $B$h$&$J7A$KJQ49$G$-$k$h$&$K$7$?!#(B $B!&%Q%9L>Cf$GCV$-49$($kL>A0$rDj5A$G$-$k$h$&$K$7$?!#(B $B!&$"$k>r7o$,K~$?$5$l$?$H$-%U%)%s%H$N5-=R$rE,MQ$9$k!"$H$$$&=q$-J}$,$G$-$k(B $B$h$&$K$7$?!#(B ------------------------------------------------------------------------------- [0.8 -> 0.9] $B!&%5%V%U%)%s%H$X$NJ,2r$*$h$S%5%V%U%)%s%H$N9g@.$rAH$_9~$_$K$7$?!#(B $B!&(BSystemV$B$N(Bfseek$B$O>o$K(Bstream$B$r(Bflush$B$9$k$?$a8zN($,0-$$!"$H$$$&LdBjE@$r(B $B2r>C$7$?!#(B($BN6C+Bg$NCfLn$5$s$K$h$k(B xxstdio.[ch] $B$r$=$N$^$^MQ$$$?!#(B) dvi2dvi-2.0-alpha/doc/bugs.doc100644 163 163 3111 6505227332 15534 0ustar sakuraisakurai------------------------------------------------------------------------------ --- dvi2dvi 1.0 ------------------------------------------------------------------------------ May, 1998 $BJs9pI>u!'(B $B%5%V%U%)%s%H$N9g@.(B font comp * 0 dm,ntt $B$r;H$&$H(Bcore dump$B$9$k!#(B ------------------------------------------------------------------------------ --- dvi2dvi 1.0alpha ------------------------------------------------------------------------------ Oct, 1995 $BJs9pI>u!'(B ptex special $B$r;XDj$7$?$H$-!"2sE>$5$l$?J8;z$NI}$,L5;k$5$l$F$$$k!#(B ------------------------------------------------------------------------------ --- dvi2dvi 0.7 ------------------------------------------------------------------------------ Jan, 1993 $BJs9ppJs4IM}3X2J(B $B>.Eg0l?M(B(kazz@nanzan-u.ac.jp)$B$5$s(B $BFbMF!'(B $B!&(Bspecial$B$rJQ49$7$?$H$-L?NaD9$r4V0c$($F$$$k!#(B $B!&(B($BM>$j$KCQ$:$+$7$$%P%0$J$N$G=q$+$J$$(B:-)) ------------------------------------------------------------------------------ Dec, 1993 $BJs9ppJsA};38&;MG/I>u!'(B MSDOS$B$G$O(Bstdin$B$*$h$S(Bstdout$B$O%F%-%9%H%b!<%I$G(Bopen$B$5$l$F$$$k$N$G!"(Bdvi$B$r@5>o$K(B $BF~=PNO$G$-$J$$!#(B $BBP:v!'(B stdin$B$H(Bstdout$B$r(Bsetmode$B$7$?$,$&$^$/$$$C$F$$$k$+$I$&$+ITL@!#(B $B$C$F(Blib$B$N2<$K$"$k%U%!%$%k$rJQ99$9$k!#(B 1. $BJQ?tDj5A(B configk (kpathsea$BJ}<0$G$N;XDj!#(Bbk$B0J30$NJQ?t$O$3$N%U%!%$%k$GDj5A$5$l$k(B) $B$3$3$GDj5A$5$l$F$$$kJQ?t$r<+J,$N%5%$%H$N>u67$K9g$o$;$FJQ99$9$k!#(B $B$?$H$($P(B define tmf /usr/local/share/texmf/fonts $B$N$h$&$KJQ?t$rDj5A$9$k$H!"0J2<(B $tmf $B$G(B /usr/local/share/texmf/fonts $B$H$$$&(Bdirectory$B$,;2>H$5$l!"$=$N2<$KI,MW$J(Bdirectory$B$,$"$k$HA[Dj$5$l(B $B$F$$$k$N$G!"(B/usr/..../fonts $B$NItJ,$r%5%$%H$K9g$o$;$FJQ99$7$J$1$l$P(B $B$J$i$J$$!#(Bkpathsea$BJ}<0$N5-=R$,2DG=$J$N$G(B define tmf /usr/local/share/{texmf.local,texmf}/fonts $B$H$$$&$h$&$JDj5A$r$7$F$7$F$b$h$$!#(Blib-dist/fontsk $B$N2<$K$"$k5-=R$r(B $B$=$N$^$^;H$&$K$O!"(Btfm$B%U%!%$%k$d(Bpk$B%U%!%$%kEy$,0J2<$N>l=j$K$J$1$l$P(B $B$J$i$J$$!#0J2<$N>l=j$K$J$$$H$-$O!"(Bfontsk $B$N2<$K$"$k!VItIJ!W$N(Bpath$B$r(B $BJQ99$9$k$3$H!#$?$@$7!"0J2<$G0c$&(Bdirectory$B$KCV$/$3$H$rA[Dj$7$F$$$k(B $B$b$N$O0c$&(Bdirectory$B$KCV$/$3$H!#(B ($B;H$o$J$$$b$N$N(Bpath$B$O$I$&$J$C$F$$$F$bF0:n$KL54X78$G$"$k!#(B) $tmf/vf//a2$bk/ pTeX->$B%W%j%s%?FbB"4A;zJQ49MQ$N(Bvirtual font $tmf/tfm//jp/ $B%W%j%s%?FbB"4A;z%U%)%s%H$N(Bjfm (rml.tfm $BEy(B) $tmf/vf//jp/ rmlv->rml+rmlvsy $BEy(B $tmf/vf//jp-ps/ rmlvsy -> rml (rotate/mirror by PS special) $tmf/vf//jp-dir/ rmlvsy -> rml (rotate by DIR) $tmf/vf//a2n/ pTeX->NTT JTeX$BJQ49MQ$N(Bvirtual font $tmf/vf//n2a/ NTT JTeX->pTeX$BJQ49MQ$N(Bvirtual font config (kpathsea$BJ}<0$G$J$$;XDj!#(Bbk$B0J30$NJQ?t$O$3$N%U%!%$%k$GDj5A$5$l$k(B) $B$3$3$GDj5A$5$l$F$$$kJQ?t$r<+J,$N%5%$%H$N>u67$K9g$o$;$FJQ99$9$k!#(B $B$?$@$7!"0J2<$K$"$k5-=R$r$=$N$^$^;H$&$K$O!"(Btfm$B%U%!%$%k$d(Bvf$B%U%!%$%k(B $BEy$,0J2<$N>l=j$K$J$1$l$P$J$i$J$$!#0J2<$N>l=j$K$J$$$H$-$O!"0J2<$N(B fontdesc$BCf$N(Bpath$B$rJQ99$9$k$3$H!#(B ($B;H$o$J$$$b$N$N(Bpath$B$O$I$&$J$C$F$$$F$bF0:n$KL54X78$G$"$k!#(B) $f/tfm $B1Q;z%U%)%s%H(B(cm,ams$BEy(B)$B$N(Btfm $af/jfm pTeX$BMQ$N(Bjfm ([t]min*, [t]goth*) $af/vf-a2$bk pTeX->$B%W%j%s%?FbB"4A;zJQ49MQ$N(Bvirtual font $af/jfm $B%W%j%s%?FbB"4A;z%U%)%s%H$N(Bjfm (rml.tfm $BEy(B) $af/vf-v2h$bk rmlv->rml+rmlvsy $BEy(B $af/vf-vsy$bk rmlvsy -> rml (rotate/mirror by PS special) $af/vf-vsyd$bk rmlvsy -> rml (rotate by DIR) $af/vf-a2n pTeX->NTT JTeX$BJQ49MQ$N(Bvirtual font $nsf/vf-n2a NTT JTeX->pTeX$BJQ49MQ$N(Bvirtual font 2. fontdesc$B$NNc(B p2bk pTeX$B$N(Bdvi$B$r%W%j%s%?FbB"4A;z%U%)%s%HJQ49$9$k!#(B (bk$B$r%G%U%)%k%H$N%W%j%s%?FbB"4A;z%U%)%s%H$K$9$k!#(B) p2bkd pTeX$B$N(Bdvi$B$r%W%j%s%?FbB"4A;z%U%)%s%HJQ49$9$k!#(B (bk$B$r%G%U%)%k%H$N%W%j%s%?FbB"4A;z%U%)%s%H$K$9$k!#(B) a2n pTeX$B$N(Bdvi$B$r(BNTT JTeX$B$N(Bdvi$B$KJQ49$9$k!#(B n2a NTT JTeX$B$N(Bdvi$B$r(BpTeX$B$N(Bdvi$B$KJQ49$9$k!#(B n2w NTT JTeX$B$NBgF|K\%U%)%s%H$rEOJU(BDNP$B%U%)%s%H$KCV$-49$($k!#(B $BJQ99$9$kI,MW$O$J$$!#(B 3. $B>e$G;H$o$l$F$$$k(Bvirtual font$B$K$D$$$F(B $B$3$3$G;H$o$l$F$$$k(Bvirtual font$B$O(B ftp://ftp.math.s.chiba-u.ac.jp/tex/fontdata/vf/ $B$+$i(Banonymous ftp$B$G$-$k!#$b$7$/$O(B ftp://ftp.math.s.chiba-u.ac.jp/tex/vftool-2.0-alpha.tar.gz $B$r;H$C$F:n$k$3$H$b$G$-$k!#(B dvi2dvi-2.0-alpha/Makefile100644 163 163 5622 7054266232 15013 0ustar sakuraisakurai# The following file and directory specifications may need changing at # your site: # # BINAREA and DVI2LIB are relative to PREFIX PREFIX=/usr/local # where dvi2dvi is installed BINAREA=${PREFIX}/bin # # directory for dvi2dvi: where the auxiliary files are installed DVI2LIB=${PREFIX}/lib/dvi2dvi # # name of default fontdesc file in your site FONTDESC=fontdesc # DVI2PATH=. # kpathsea KPSELIB = -L${PREFIX}/lib -lkpathsea KPSEINC = -I${PREFIX}/include -DKPATHSEA # CC=gcc # CCFLAGS = -g -DPOSIX #CCFLAGS = -O # SUN etc ... #CCFLAGS = -O -traditional -DPOSIX # 386bsd (gcc 1.X) #CCFLAGS = -O -DPOSIX # Netbsd (gcc 2.X), Linux #CCFLAGS = -O -bsd # NeXT #CCFLAGS = -O -DMSDOS -DPOSIX # DJGCC (gcc 2.X) #CCFLAGS = -O -DSYSV # SysV #CCFLAGS = -O -DPOSIX -DSYSV -DSYSVIO # Solaris 2.X (acc, gcc -- warnings) #CCFLAGS = -O -DSYSVIO # Solaris 2.X (ucb/cc -- warnings) # BSD-type install assumed INSTALL=install # You don't have to change the definition variables in the folllowing. # CFLAGS = ${CCFLAGS} ${KPSEINC} CNFCFLAGS = ${CFLAGS} -DDVI2PATH=\"${DVI2PATH}\" \ -DDVI2LIB=\"${DVI2LIB}\" -DFONTDESC=\"//${FONTDESC}\" FILES = README doc Makefile lib-dist tools \ defs.h xxstdio.h global.h commands.h set.h dconv.h \ virfont.h bifont.h funcfont.h \ jsub.h \ dvi.h \ dvi2.c dviconv.c dfdcom.c fontcom.c set.c rfset.c vfset.c \ dconv.c run.c fontdesc.c scanfont.c \ virfont.c vfdcom.c \ bifont.c \ compfont.c decompfont.c execfont.c \ funcfont.c \ kpse.c kanji.c open.c io.c util.c \ xxstdio.c \ version.c \ dvi.c dvifont.c dvitfm.c DVI2OBJS = dvi2.o dviconv.o dfdcom.o fontcom.o set.o rfset.o vfset.o \ dconv.o run.o fontdesc.o scanfont.o \ virfont.o vfdcom.o \ bifont.o \ compfont.o decompfont.o execfont.o \ funcfont.o \ kpse.o kanji.o open.o io.o util.o \ xxstdio.o \ version.o DVIOBJS = dvi.o dvifont.o dvitfm.o all: dvi2dvi dvi2dvi: ${DVI2OBJS} ${DVIOBJS} ${CC} -o $@ ${DVI2OBJS} ${DVIOBJS} ${KPSELIB} dvi2.o: Makefile ${CC} -c ${CNFCFLAGS} dvi2.c newlib: -mkdir lib cp -pr lib-dist/* lib install: install-dvi2dvi install-dvi2dvi: dvi2dvi install -s -m 755 dvi2dvi ${BINAREA}/dvi2dvi install-lib: -mkdir ${DVI2LIB} cp -pr lib/* ${DVI2LIB} chmod -R a+r ${DVI2LIB} clean: rm -f dvi2dvi *.o *.orig core lint: lint *.c dist: tar cf - ${FILES} | gzip > dvi2dvi.tar.gz dvi2.o: dconv.h defs.h dviconv.o: dconv.h defs.h set.h dfdcom.o: dconv.h defs.h fontcom.o: defs.h set.h set.o: defs.h set.h rfset.o: defs.h set.h vfset.o: defs.h set.h dconv.o : dconv.h run.o: defs.h fontdesc.o: defs.h scanfont.o: dconv.h defs.h set.h virfont.o: defs.h set.h virfont.h vfdcom.o: dconv.h defs.h bifont.o: defs.h bifont.h compfont.o: defs.h set.h funcfont.h jsub.h decompfont.o: defs.h set.h funcfont.h jsub.h execfont.o: defs.h funcfont.o: defs.h funcfont.h kpse.o: defs.h kanji.o: defs.h jsub.h open.o: defs.h io.o: defs.h xxstdio.o: defs.h xxstdio.h dvi.o: defs.h dvi.h dvifont.o: defs.h dvi.h dvitfm.o: defs.h bifont.h dvi.h dvi2dvi-2.0-alpha/lib-dist/ 40755 163 163 0 7202764276 14766 5ustar sakuraisakuraidvi2dvi-2.0-alpha/lib-dist/n2a100644 163 163 142 6536536260 15442 0ustar sakuraisakurai# NTT dvi (subfont) -> ASCII dvi # # configuration fontdesc config$kpse # fontdesc fonts$kpse/n2a dvi2dvi-2.0-alpha/lib-dist/a2n100644 163 163 164 6540265407 15443 0ustar sakuraisakurai# ASCII dvi -> NTT dvi (subfont) # # configuration fontdesc config$kpse # min,goth -> dm,dg fontdesc fonts$kpse/a2n dvi2dvi-2.0-alpha/lib-dist/w2n100644 163 163 440 5457051157 15467 0ustar sakuraisakurai# Watanabe DNP -> NTT DNP (subfont) # replfont jm%j8 dm%j8 8 replfont jm%j9 dm%j9 9 replfont jm%j10 dm%j10 10 replfont jm%j12 dm%j12 12 replfont jm%j17 dm%j17 17 # replfont jb%j8 dg%j8 8 replfont jb%j9 dg%j9 9 replfont jb%j10 dg%j10 10 replfont jb%j12 dg%j12 12 replfont jb%j17 dg%j17 17 dvi2dvi-2.0-alpha/lib-dist/n2w100644 163 163 1017 5457051704 15506 0ustar sakuraisakurai# NTT DNP (subfont) -> Watanabe DNP # # 8, 9, 10, 12, 17pt replfont dm%j8 jm%j8 8 replfont dm%j9 jm%j9 9 replfont dm%j10 jm%j10 10 replfont dm%j12 jm%j12 12 replfont dm%j17 jm%j17 17 # replfont dg%j8 jb%j8 8 replfont dg%j9 jb%j9 9 replfont dg%j10 jb%j10 10 replfont dg%j12 jb%j12 12 replfont dg%j17 jb%j17 17 # # 5, 6, 7pt replfont dm%j5 jm%j8 8 replfont dm%j6 jm%j8 8 replfont dm%j7 jm%j8 8 # replfont dg%j5 jb%j8 8 replfont dg%j6 jb%j8 8 replfont dg%j7 jb%j8 8 # # 20pt replfont dm%j20 jm%j10 10 # replfont dg%j20 jb%j10 10 dvi2dvi-2.0-alpha/lib-dist/config100644 163 163 153 5750756007 16231 0ustar sakuraisakuraidefine f /usr/local/lib/tex/fonts define nsf /usr/local/lib/tex/jfonts define af /usr/local/lib/tex/jfonts dvi2dvi-2.0-alpha/lib-dist/p2bk100644 163 163 152 7201315111 15575 0ustar sakuraisakurai# pTeX dvi -> BKfont dvi # # configuration fontdesc config$kpse define bk mor2 # fontdesc fonts$kpse/p2bk dvi2dvi-2.0-alpha/lib-dist/fonts/ 40755 163 163 0 7202764376 16120 5ustar sakuraisakuraidvi2dvi-2.0-alpha/lib-dist/fonts/n2a100644 163 163 304 6773202103 16560 0ustar sakuraisakurai# compose NTT subfont font comp * 0 dm,ntt font comp * 0 dg,ntt # virtual font font vf * 0 $nsf/vf-n2a/%f.vf # tfm used in the above vf (ASCII jfm, i.e. min10.tfm ...) font jfm * 0 $af/jfm/%f.tfm dvi2dvi-2.0-alpha/lib-dist/fonts/a2n100644 163 163 140 6540265417 16567 0ustar sakuraisakurai# min,goth -> dm,dg font jvf * 0 $af/vf-a2n/%f.vf font decomp * 0 dm,ntt font decomp * 0 dg,ntt dvi2dvi-2.0-alpha/lib-dist/fonts/p2bk100644 163 163 464 7202305223 16740 0ustar sakuraisakurai# min,goth,tmin,tgoth -> bk,bkv font jvf * 0 $af/vf-a2$bk/%f.vf # bkv -> bk + bkvsy font jvf * 0 $af/vf-v2h$bk/%f.vf # bkvsy -> bk (rotate/mirror by PS special) font vf * 0 $af/vf-vsy$bk/%f.vf # # tfm of printer BKfont (rml.tfm ...) font tfm * 0 $af/jfm/%f.tfm # tfm of ascii font font tfm * 0 $f/tfm/%f.tfm dvi2dvi-2.0-alpha/lib-dist/fonts/p2bkd100644 163 163 652 7202305257 17112 0ustar sakuraisakurai# min,goth,tmin,tgoth -> bk,bkv font jvf * 0 $af/vf-a2$bk/%f.vf # bkv -> bk + bkvsy font jvf * 0 $af/vf-v2h$bk/%f.vf # bkvsy -> bk (rotate/mirror by PS special) font vf * 0 $af/vf-vsyd$bk/%f.vf # # tfm of printer BKfont (rml.tfm ...) font tfm * 0 $af/jfm/%f.tfm # tfm of ascii font font tfm * 0 $f/tfm/%f.tfm # ptex special vert "ps:gsave 90 rotate" ptex special end "ps:grestore" #ptex ignore #ptex mark line #ptex mark char dvi2dvi-2.0-alpha/lib-dist/fontsk/ 40755 163 163 0 7202764376 16273 5ustar sakuraisakuraidvi2dvi-2.0-alpha/lib-dist/fontsk/n2a100644 163 163 302 6773115367 16750 0ustar sakuraisakurai# compose NTT subfont font comp * 0 dm,ntt font comp * 0 dg,ntt # virtual font font jvf * 0 $tmf/vf//n2a/ # tfm used in the above vf (ASCII jfm, i.e. min10.tfm ...) font jfm * 0 $tmf/tfm//ptex/ dvi2dvi-2.0-alpha/lib-dist/fontsk/a2n100644 163 163 136 6540265405 16744 0ustar sakuraisakurai# min,goth -> dm,dg font jvf * 0 $tmf/vf//a2n/ font decomp * 0 dm,ntt font decomp * 0 dg,ntt dvi2dvi-2.0-alpha/lib-dist/fontsk/p2bk100644 163 163 340 7202042301 17077 0ustar sakuraisakurai# min,goth,tmin,tgoth -> bk,bkv font jvf * 0 $tmf/vf//a2$bk/ # bkv -> bk + bkvsy font jvf * 0 $tmf/vf//jp/ # bkvsy -> bk (rotate/mirror by PS special) font vf * 0 $tmf/vf//jp-ps/ # # tfm of all fonts font tfm * 0 $tmf/tfm// dvi2dvi-2.0-alpha/lib-dist/fontsk/p2bkd100644 163 163 470 7202043016 17253 0ustar sakuraisakurai# min,goth,tmin,tgoth -> bk,bkv font jvf * 0 $tmf/vf//a2$bk/ # bkv -> bk + bkvsy font jvf * 0 $tmf/vf//jp/ # bkvsy -> bk font vf * 0 $tmf/vf//jp-dir/ # # tfm of all fonts font tfm * 0 $tmf/tfm// # ptex special vert "ps:gsave 90 rotate" ptex special end "ps:grestore" #ptex ignore #ptex mark line #ptex mark char dvi2dvi-2.0-alpha/lib-dist/configk100644 163 163 66 7054563630 16364 0ustar sakuraisakuraidefine tmf /usr/local/share/{texmf.local,texmf}/fonts dvi2dvi-2.0-alpha/lib-dist/multex100644 163 163 667 6456213403 16304 0ustar sakuraisakurai# MuLTeX dvi (jfm) -> NTT/MuLTeX subfont dvi # # covert to NTT subfont, i.e. dmjsys10 ... font decomp * 0 dm,ntt font decomp * 0 dg,ntt # covert to MuLTeX subfont, i.e. cnCXXC10.tfm ... font decomp * 0 cn,code font decomp * 0 cnb,code font decomp * 0 kr,code font decomp * 0 krb,code font decomp * 0 jps,code font decomp * 0 jpsb,code font decomp * 0 bvi,code font decomp * 0 bvib,code font decomp * 0 bvii,code font decomp * 0 bviib,code dvi2dvi-2.0-alpha/lib-dist/n2bk100644 163 163 760 7200325523 15607 0ustar sakuraisakuraifont comp * 0 dm,ntt replfont dm5 rml 10,f959887 replfont dm6 rml 10,f968307 replfont dm7 rml 10,f974321 replfont dm8 rml 10,f947257 replfont dm9 rml 10,f954274 replfont dm10 rml 10,f959887 replfont dm12 rml 10,f968307 replfont dm20 rml 10,f959887 font comp * 0 dg,ntt replfont dg5 gbm 10,f959887 replfont dg6 gbm 10,f968307 replfont dg7 gbm 10,f974321 replfont dg8 gbm 10,f947257 replfont dg9 gbm 10,f954274 replfont dg10 gbm 10,f959887 replfont dg12 gbm 10,f968307 replfont dg20 gbm 10,f959887 dvi2dvi-2.0-alpha/lib-dist/p2bkd100644 163 163 153 7201322422 15745 0ustar sakuraisakurai# pTeX dvi -> BKfont dvi # # configuration fontdesc config$kpse define bk mor2 # fontdesc fonts$kpse/p2bkd dvi2dvi-2.0-alpha/tools/ 40755 163 163 0 6150631645 14411 5ustar sakuraisakuraidvi2dvi-2.0-alpha/tools/mxdvi100755 163 163 513 6150033225 15530 0ustar sakuraisakurai#!/bin/sh TEXFONTS=/usr/local/lib/tex/fonts TEXJFONTS=/usr/local/lib/tex/jfonts MLFONTS=/usr/local/lib/texmf/fonts/ml XDVIFONTS="$TEXFONTS/pk300:$TEXJFONTS/pk300:$MLFONTS/sub/pk/bdf:$MLFONTS/one/pk/bdf" export XDVIFONTS XDVISIZES="240:270:300:190:340:328.6:360:432.0:518.4:622.0:746.4:895.7:1074.9:1289.9" export XDVISIZES xdvi $@ dvi2dvi-2.0-alpha/defs.h100644 163 163 14034 7054267022 14460 0ustar sakuraisakurai/**********************************************************************/ /************************ Global Definitions ************************/ /**********************************************************************/ #include #include #ifdef SYSVIO #include "xxstdio.h" #endif /* R_OK, F_OK */ #ifndef POSIX #ifdef SYSV #include #else #include #endif #else /* POSIX */ #include #endif /* Hack */ #ifndef R_OK #define R_OK 4 #endif #ifndef F_OK #define F_OK 0 #endif #ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif /* string operation */ #ifdef SYSV #include #define index strchr #define rindex strrchr #define bcopy(s, d, n) memcpy(d, s, n) #define bzero(p, n) memset(p, 0, n) #else #include #endif #ifndef POSIX char *malloc(); char *realloc(); char *calloc(); int free(); #ifdef ANSI char *sprintf(char *, const char *, ...); #else char *sprintf(); #endif #else /* POSIX */ void *malloc(); void *realloc(); void *calloc(); void free(); #ifdef ANSI int sprintf(char *, const char *, ...); #else int sprintf(); #endif #endif char *mktemp(); char *getenv(); void exit(); #define DEBUG /* for massive printing of input */ /* trace information; select by -d */ #define STATS /* to enable statistics reporting via -s option */ #define DEBUGoff 0 #define DEBUGuser 1 #define DEBUGsys 2 #define Debugoff (debug<=DEBUGoff) #define Debuguser (debug>=DEBUGuser) #define Debug (debug>=DEBUGsys) #if defined(MSDOS) || defined(WIN32) #define BINARYOPEN(f) fopen(f,"rb") /* byte-oriented host version */ #define BINARYWOPEN(f) fopen(f,"w+b") #define BINARYPOPEN(f) popen(f,"rb") /*#define DIR_SEP '\\'*/ #define DIR_SEP '/' #define PATH_SEP ';' #define TMP "c:/temp" #define DVITEMPLATE "D2DXXXXX" #else #define BINARYOPEN(f) fopen(f,"r") /* byte-oriented host version */ #define BINARYWOPEN(f) fopen(f,"w+") #define BINARYPOPEN(f) popen(f,"r") #define DIR_SEP '/' #define PATH_SEP ':' #define TMP "/tmp/" #define DVITEMPLATE "DVI2DVI-XXXXXX" #endif #ifdef WIN32 #define STDC_HEADERS #include #include #define O_BINARY _O_BINARY #define SET_BINARY(fd) _setmode((fd), _O_BINARY) #endif /* ARITHRSHIFT not used */ #define ARITHRSHIFT /* define if ">>" operator is a */ /* sign-propagating arithmetic */ /* right shift */ #define USEGLOBALMAG /* when defined, the dvi global */ /* magnification is applied */ /* We can leave USEGLOBALMAG undefined when we have a limited number of font magnifications (at 300dpi) available. Otherwise, we will simply complain about missing PXL files */ /* #undef USEGLOBALMAG */ #define INCEXT NULL #define MAXOPEN 12 /* limit on number of open font files */ #define DVIFORMAT 2 #define EXTDVIFORMAT 3 #define STACKSIZE 100 #define STRSIZE 257 #define PATHLEN 1024 #define NO_FILE (FILE *)-1 #define NEW(A,e) ((A *)alloc_check(malloc((unsigned)sizeof(A)), e)) #define NEWTAB(A,n,e) ((A *)alloc_check(malloc((unsigned)sizeof(A)*n), e)) #define MAGSIZE(f) ((unsigned int)(1000.0*(f) + 0.5)) #define ROUND(f) ((int)((f) + 0.5)) #define STREQ(s,t) (strcmp(s,t) == 0) typedef unsigned char byte; /* typedef float SCALED; #define scale(x,s) (int)((SCALED)(x)*(SCALED)(s)/(1<<20)) */ typedef int SCALED; #define scale(x,s) scale_exact(x,s) typedef int BOOLEAN; typedef char Boolean; #define TRUE 1 #define FALSE 0 /**********************************************************************/ /*********************** Font Data Structures ***********************/ /**********************************************************************/ struct font_index { /* pointer to font entry */ int k; struct font_entry *fent; struct font_index *next; }; typedef struct font_entry *DEV_FONT; #define DEV_NULLFONT (DEV_FONT)NULL #define FT_UNDEF 0 #define FT_DVI 1 #define FT_TFM 2 #define FT_JFM 3 #define FT_VF 4 #define FU_NOTUSED 0 #define FU_USED 1 struct font_entry { /* font entry */ int k; /* unique id */ int c, s, d, a, l; char n[STRSIZE]; /* FNT_DEF command parameters */ char fnt_type; char fnt_use; int vert_use; struct font_entry *vert_fe; struct font_entry *base_fe; void (*fnt_readfontinfo)(); void (*rvf_setchar)(); void (*rvf_setstring)(); DEV_FONT (*dev_fontdict)(); /* returns the font in device */ int (*dev_setchar)(); /* device dependent part of setchar */ int (*dev_setstring)(); /* device dependent part of setstring */ struct finfo *finfo; /* font/device dependent information */ struct font_entry *next; char name[PATHLEN]; /* full name of font file */ FILE *openfile; /* file stream (NO_FILE if none) */ struct openfont_list *openlist; int ncdl; /* # of different chars actually downloaded */ #ifdef STATS int nbpxl; /* # of bytes of PXL data downloaded */ int ncts; /* total # of characters typeset */ #endif }; #define setcurfont(fe) curfontent = fe #define fnt_markchar dev_setchar #define FNT_markchar DEV_setchar #define DEV_fontdict (*(curfontent->dev_fontdict)) #define DEV_setchar (*(curfontent->dev_setchar)) #define DEV_setstring (*(curfontent->dev_setstring)) #define VU_UNDEF 0 #define VU_USED 1 #define VU_NOTUSED 2 #define VU_VERT 3 #define NDIR 4 #define HOR 0 #define VER 1 struct fontop { char *fo_type; int (*fo_init)(); int (*fo_access)(); void (*fo_initfontinfo)(); }; #define FDQUO '"' struct confop { char *co_name; void (*co_get)(); }; #define ACC_EXACT 0 #define ACC_SUBST 1 #define ACC_MAGSTEP 2 #define ACC_GEN 4 #define ACC_SELF 8 #define ACC_EXIST (ACC_SUBST|ACC_MAGSTEP) struct accarg { int acc_mode; float rawmagfact; float actmagfact; int submag, reqmag; float stepmagfact; char *pv_name; /* font name */ int pv_mag; /* magnification */ char *pv_fam; /* family */ int pv_ds; /* design size */ char *pv_jsub; /* jsubfont name */ }; #define DIR_KEEP 0 #define DIR_ELIM 1 #define DIR_SPECIAL 2 #define DIR_IGNORE 3 #define DIR_MARKLINE 4 #define DIR_MARKCHAR 5 #define dir_with_width (dirmode >= DIR_SPECIAL) dvi2dvi-2.0-alpha/xxstdio.h100644 163 163 1326 5607035721 15222 0ustar sakuraisakurai/* * We use our own fseek because SVR4's seem to flush the stream * unconditionally. SVR4 is supposed for this package. * * H.Nakano (94/03/23) */ extern FILE *xxfopen(); extern FILE *xxfreopen(); extern FILE *xxfdopen(); extern int xxfflush(); extern int xxfread(); extern int xxfgetc(); extern int xxgetw(); extern char *xxgets(); extern char *xxfgets(); extern int xxfseek(); extern long xxftell(); extern int xx__filbuf(); #define fopen xxfopen #define freopen xxfreopen #define fdopen xxfdopen #define fflush xxfflush #define fread xxfread #define fgetc xxfgetc #define getw xxgetw #define gets xxgets #define fgets xxfgets #define fseek xxfseek #define ftell xxftell #define __filbuf xx__filbuf dvi2dvi-2.0-alpha/global.h100644 163 163 5076 7054266527 14776 0ustar sakuraisakurai/* dvi2.c */ extern int FirstPage, LastPage; extern int mag, usermag; extern struct font_entry *hdfontent, *curfontent; extern char *dvi2path; extern char *dvi2lib; extern int resolution; extern char dvifilename[]; extern char dvidirpath[]; extern char rootname[]; extern FILE *dvifp; extern FILE *outfp; extern int ncopies; extern int ndone; #ifdef DEBUG extern int debug; #endif extern int PreLoad; extern int Reverse; extern int G_errenc; extern char G_Logname[]; extern int G_logging; extern int G_logfile; extern FILE *G_logfp; extern char *G_progname; extern int G_quiet; extern int G_nowarn; extern int G_removecomments; #ifdef MSDOS extern int G_longfontname; #endif extern int SpecialSize; extern char *SpecialStr; #ifdef STATS extern int Stats; extern int Snbpxl; extern int Sonbpx; extern int Sndc; extern int Stnc; extern int Snbpx0, Sndc0, Stnc0; #endif /* dviconv.c */ extern int h, v; extern int dir; extern int *move; extern BOOLEAN chmove; /* dfdcom.c */ void ReadFontDef(); void SkipFontDef(); /* fontcom.c */ void readfontdef(); struct font_entry *get_font_entry(); void SetFntNum(); void read_fontinfo(); /* dconv.c */ extern struct dconv *curdconvp; extern struct dconv dfd_dconv_templ, vfd_dconv_templ; extern int (*dc_getcommand)(); extern void (*dc_backupone)(); extern void (*dc_getbytes)(); extern void (*dc_skipbytes)(); extern int (*dc_getuint)(); extern int (*dc_getint)(); extern FILE *dc_file; extern byte *dc_bufbeg; extern byte *dc_bufend; extern void (*dc_movedown)(); extern void (*dc_moveover)(); extern void (*dc_setrule)(); extern int dc_scale; /* run.c */ void init_settings(); void AbortRun(); void AllDone(); void Fatal(); void Warning(); /* mag.c */ float actfact(); float apprfact(); extern float mag_table[]; extern int mag_index; extern int magtabsize; /* fontdesc.c */ void read_fontdesc(); void skipline(); void skipblanks(); struct fontop *findfontop(); int pathtype_init(); void arg_fontdesc(); void defexpand(); void add_include(); void add_setup(); void init_fontinfo(); void pave(); /* open.c */ void openfontfile(); /* io.c */ void getbytes(); void skipbytes(); int getuint(); int getint(); void putint(); void putoct(); /* util.c */ char *alloc_check(); int makeuint(); int makeint(); char *strsave(); /* version.c */ extern char *version; /* * Interface with device driver */ /* ps.c */ float dev_fontmag(); /* psspecial.c */ void dev_predospecial(); void dev_dospecial(); /* psio.c */ void dev_copyfile(); void dev_copystring(); #ifdef KPATHSEA /* * */ /* kpse.c */ char *kpsearch_glyph(); char *kpsearch_make(); char *kpsearch_file(); #endif dvi2dvi-2.0-alpha/commands.h100644 163 163 14114 5627564766 15362 0ustar sakuraisakurai/* * * $Revision: 1.1 $ * $Log: commands.h,v $ * Revision 1.1 83/11/23 10:56:00 mds * Initial revision * * */ #define SETC_000 0 #define SETC_001 1 #define SETC_002 2 #define SETC_003 3 #define SETC_004 4 #define SETC_005 5 #define SETC_006 6 #define SETC_007 7 #define SETC_008 8 #define SETC_009 9 #define SETC_010 10 #define SETC_011 11 #define SETC_012 12 #define SETC_013 13 #define SETC_014 14 #define SETC_015 15 #define SETC_016 16 #define SETC_017 17 #define SETC_018 18 #define SETC_019 19 #define SETC_020 20 #define SETC_021 21 #define SETC_022 22 #define SETC_023 23 #define SETC_024 24 #define SETC_025 25 #define SETC_026 26 #define SETC_027 27 #define SETC_028 28 #define SETC_029 29 #define SETC_030 30 #define SETC_031 31 #define SETC_032 32 #define SETC_033 33 #define SETC_034 34 #define SETC_035 35 #define SETC_036 36 #define SETC_037 37 #define SETC_038 38 #define SETC_039 39 #define SETC_040 40 #define SETC_041 41 #define SETC_042 42 #define SETC_043 43 #define SETC_044 44 #define SETC_045 45 #define SETC_046 46 #define SETC_047 47 #define SETC_048 48 #define SETC_049 49 #define SETC_050 50 #define SETC_051 51 #define SETC_052 52 #define SETC_053 53 #define SETC_054 54 #define SETC_055 55 #define SETC_056 56 #define SETC_057 57 #define SETC_058 58 #define SETC_059 59 #define SETC_060 60 #define SETC_061 61 #define SETC_062 62 #define SETC_063 63 #define SETC_064 64 #define SETC_065 65 #define SETC_066 66 #define SETC_067 67 #define SETC_068 68 #define SETC_069 69 #define SETC_070 70 #define SETC_071 71 #define SETC_072 72 #define SETC_073 73 #define SETC_074 74 #define SETC_075 75 #define SETC_076 76 #define SETC_077 77 #define SETC_078 78 #define SETC_079 79 #define SETC_080 80 #define SETC_081 81 #define SETC_082 82 #define SETC_083 83 #define SETC_084 84 #define SETC_085 85 #define SETC_086 86 #define SETC_087 87 #define SETC_088 88 #define SETC_089 89 #define SETC_090 90 #define SETC_091 91 #define SETC_092 92 #define SETC_093 93 #define SETC_094 94 #define SETC_095 95 #define SETC_096 96 #define SETC_097 97 #define SETC_098 98 #define SETC_099 99 #define SETC_100 100 #define SETC_101 101 #define SETC_102 102 #define SETC_103 103 #define SETC_104 104 #define SETC_105 105 #define SETC_106 106 #define SETC_107 107 #define SETC_108 108 #define SETC_109 109 #define SETC_110 110 #define SETC_111 111 #define SETC_112 112 #define SETC_113 113 #define SETC_114 114 #define SETC_115 115 #define SETC_116 116 #define SETC_117 117 #define SETC_118 118 #define SETC_119 119 #define SETC_120 120 #define SETC_121 121 #define SETC_122 122 #define SETC_123 123 #define SETC_124 124 #define SETC_125 125 #define SETC_126 126 #define SETC_127 127 #define SET1 128 #define SET2 129 #define SET3 130 #define SET4 131 #define SET_RULE 132 #define PUT1 133 #define PUT2 134 #define PUT3 135 #define PUT4 136 #define PUT_RULE 137 #define NOP 138 #define BOP 139 #define EOP 140 #define PUSH 141 #define POP 142 #define RIGHT1 143 #define RIGHT2 144 #define RIGHT3 145 #define RIGHT4 146 #define W0 147 #define W1 148 #define W2 149 #define W3 150 #define W4 151 #define X0 152 #define X1 153 #define X2 154 #define X3 155 #define X4 156 #define DOWN1 157 #define DOWN2 158 #define DOWN3 159 #define DOWN4 160 #define Y0 161 #define Y1 162 #define Y2 163 #define Y3 164 #define Y4 165 #define Z0 166 #define Z1 167 #define Z2 168 #define Z3 169 #define Z4 170 #define FONT_00 171 #define FONT_01 172 #define FONT_02 173 #define FONT_03 174 #define FONT_04 175 #define FONT_05 176 #define FONT_06 177 #define FONT_07 178 #define FONT_08 179 #define FONT_09 180 #define FONT_10 181 #define FONT_11 182 #define FONT_12 183 #define FONT_13 184 #define FONT_14 185 #define FONT_15 186 #define FONT_16 187 #define FONT_17 188 #define FONT_18 189 #define FONT_19 190 #define FONT_20 191 #define FONT_21 192 #define FONT_22 193 #define FONT_23 194 #define FONT_24 195 #define FONT_25 196 #define FONT_26 197 #define FONT_27 198 #define FONT_28 199 #define FONT_29 200 #define FONT_30 201 #define FONT_31 202 #define FONT_32 203 #define FONT_33 204 #define FONT_34 205 #define FONT_35 206 #define FONT_36 207 #define FONT_37 208 #define FONT_38 209 #define FONT_39 210 #define FONT_40 211 #define FONT_41 212 #define FONT_42 213 #define FONT_43 214 #define FONT_44 215 #define FONT_45 216 #define FONT_46 217 #define FONT_47 218 #define FONT_48 219 #define FONT_49 220 #define FONT_50 221 #define FONT_51 222 #define FONT_52 223 #define FONT_53 224 #define FONT_54 225 #define FONT_55 226 #define FONT_56 227 #define FONT_57 228 #define FONT_58 229 #define FONT_59 230 #define FONT_60 231 #define FONT_61 232 #define FONT_62 233 #define FONT_63 234 #define FNT1 235 #define FNT2 236 #define FNT3 237 #define FNT4 238 #define XXX1 239 #define XXX2 240 #define XXX3 241 #define XXX4 242 #define FNT_DEF1 243 #define FNT_DEF2 244 #define FNT_DEF3 245 #define FNT_DEF4 246 #define PRE 247 #define POST 248 #define POST_POST 249 /* extension for pTeX */ #define DIR 255 dvi2dvi-2.0-alpha/set.h100644 163 163 357 5733011614 14271 0ustar sakuraisakuraivoid MarkChar(); void MarkString(); void SetChar(); void SetString(); struct font_entry *getcurrentfontent(); struct font_entry *currentfontent(); void realf_setchar(); void realf_setstring(); void virf_setchar(); void virf_setstring(); dvi2dvi-2.0-alpha/dconv.h100644 163 163 1343 5627604640 14634 0ustar sakuraisakuraistruct dconv { int (*dc_getcommand)(); void (*dc_backupone)(); void (*dc_getbytes)(); void (*dc_skipbytes)(); int (*dc_getuint)(); int (*dc_getint)(); FILE *dc_file; byte *dc_bufbeg; byte *dc_bufend; void (*dc_movedown)(); void (*dc_movedown_v)(); void (*dc_moveover)(); void (*dc_moveover_v)(); void (*dc_setrule)(); void (*dc_setrule_v)(); int dc_scale; }; #define DC_getcommand (*dc_getcommand) #define DC_backupone (*dc_backupone) #define DC_getbytes (*dc_getbytes) #define DC_skipbytes (*dc_skipbytes) #define DC_getuint (*dc_getuint) #define DC_getint (*dc_getint) #define DC_movedown (*dc_movedown) #define DC_moveover (*dc_moveover) #define DC_setrule (*dc_setrule) dvi2dvi-2.0-alpha/virfont.h100644 163 163 1656 6235107607 15216 0ustar sakuraisakurai#define MAXVFCHAR 255 /* <= MAXMARKCHAR */ #define VFD_UNDEF 0 #define VFD_NOTLD 1 #define VFD_NULL 2 #define VFD_SETFC 3 #define VFD_DVI 4 struct vfchar_entry { char vfdstat; union { struct { struct font_entry *f; int c; } set; struct { unsigned int dvilen; union { unsigned int fileoffset; unsigned char *dviptr; } where; } dvi; } vfd; int tfmw; /* TFM width */ }; struct virfntinfo { struct font_index *vf_fontidx; struct font_entry *vf_default_fent; struct vfchar_entry ch[1]; }; #ifdef ANSI #define virfinfo(fe) (*(struct virfntinfo **)&(fe->finfo)) #else #define virfinfo(fe) ((struct virfntinfo *)(fe->finfo)) #endif /* vf codes */ #define VF_ID 202 #define VF_SHORT_CHAR241 241 #define VF_LONG_CHAR 242 #define VF_FNT_DEF1 243 #define VF_FNT_DEF2 244 #define VF_FNT_DEF3 245 #define VF_FNT_DEF4 246 #define VF_PRE 247 #define VF_POST 248 #include "commands.h" dvi2dvi-2.0-alpha/bifont.h100644 163 163 10302 7054276625 15023 0ustar sakuraisakurai#define LASTTFMCHAR 255 #define NTFMCHARS 256 struct tfmchar_entry { /* character entry */ short dev_font, dev_char; int tfmw; /* TFM width */ }; struct tfmfntinfo { struct bifont *tfm_bf; int lastfntchar; struct tfmchar_entry ch[NTFMCHARS]; /* character information */ }; #ifdef ANSI #define tfmfinfo(fe) (*(struct tfmfntinfo **)&(fe->finfo)) #else #define tfmfinfo(fe) ((struct tfmfntinfo *)(fe->finfo)) #endif struct jstfmchar_entry { /* character entry */ unsigned short dev_ku, dev_ten; int tfmw; /* TFM width */ }; struct jstfmfntinfo { struct bifont *js_bf; /* = js_share->jss_bf */ int lastfntchar; struct jstfmchar_entry ch[LASTTFMCHAR+1]; /* character information */ short jsubfont; short dev_font; /* = js_share->jss_dev_font */ struct jssinfo *js_info; /* = js_share->jss_info */ struct jsubshare *js_share; }; #ifdef ANSI #define jstfmfinfo(fe) (*(struct jstfmfntinfo **)&(fe->finfo)) #else #define jstfmfinfo(fe) ((struct jstfmfntinfo *)(fe->finfo)) #endif #define JFM_ID 11 #define TJFM_ID 9 struct jfmtype_entry { /* character type entry */ int jfm_code; int jfm_type; }; struct jfmchar_entry { /* character entry */ int tfmw; /* TFM width */ }; struct jfmfntinfo { struct bifont *jfm_bf; int nctype; struct jfmtype_entry *ctype; /* character type information */ int lasttypecode; struct jfmchar_entry *ch; /* character information indexed by type */ }; #ifdef ANSI #define jfmfinfo(fe) (*(struct jfmfntinfo **)&(fe->finfo)) #else #define jfmfinfo(fe) ((struct jfmfntinfo *)(fe->finfo)) #endif #ifdef UNDEF struct wlchar_entry { /* character entry */ short dev_font, dev_char; int tfmw; /* TFM width */ }; struct wlfntinfo { struct bifont *wl_bf; int nfntchars; struct wlchar_entry ch[1]; /* character information */ }; #ifdef ANSI #define wlfinfo(fe) (*(struct wlfntinfo **)&(fe->finfo)) #else #define wlfinfo(fe) ((struct wlfntinfo *)(fe->finfo)) #endif #ifdef ANSI #define jswlfinfo(jsfi) (*(struct wlfntinfo **)&(jsfi->js_info)) #else #define jswlfinfo(jsfi) ((struct wlfntinfo *)(jsfi->js_info)) #endif #define jftchar_entry wlchar_entry struct jftfntinfo { struct bifont *jft_bf; int nfntchars; int width; int height; int depth; struct jftchar_entry ch[1]; /* character information */ }; #ifdef ANSI #define jftfinfo(fe) (*(struct jftfntinfo **)&(fe->finfo)) #else #define jftfinfo(fe) ((struct jftfntinfo *)(fe->finfo)) #endif #ifdef ANSI #define jsftfinfo(jsfi) (*(struct jftfntinfo **)&(jsfi->js_info)) #else #define jsftfinfo(jsfi) ((struct jftfntinfo *)(jsfi->js_info)) #endif #define vflfntinfo jftfntinfo #define vfl_bf jft_bf #define vflchar_entry jftchar_entry #ifdef ANSI #define vflfinfo(fe) (*(struct vflfntinfo **)&(fe->finfo)) #else #define vflfinfo(fe) ((struct vflfntinfo *)(fe->finfo)) #endif #ifdef ANSI #define jsvflfinfo(jsfi) (*(struct vflfntinfo **)&(jsfi->js_info)) #else #define jsvflfinfo(jsfi) ((struct vflfntinfo *)(jsfi->js_info)) #endif #endif /* struct to share subfont information */ #define JSS_CLOSED 0 #define JSS_INIT 1 #define JSS_READ 2 struct jsubshare { int jss_stat; struct bifont *jss_bf; int jss_s; int jss_dev_font; /* jstfm */ struct jssinfo *jss_info; /* jstfm wadalab */ struct jsubshare *jss_next; }; /* used to pass information from access to initfontinfo */ struct biaccessinfo { struct bifont *bf; short jsubf; }; /* used to pass marking information from initfontinfo to readfontinfo */ struct biinitfontinfo { struct bifont *bf; int maxc; Boolean mark[1]; }; #ifdef ANSI #define biaccinfo(fe) (*(struct biaccessinfo **)&(fe->finfo)) #define biinifinfo(fe) (*(struct biinitfontinfo **)&(fe->finfo)) #define bfinfo(fe) (*(struct bifont **)&(fe->finfo)) #else #define biaccinfo(fe) ((struct biaccessinfo *)(fe->finfo)) #define biinifinfo(fe) ((struct biinitfontinfo *)(fe->finfo)) #define bfinfo(fe) ((struct bifont *)(fe->finfo)) #endif struct biinitfontinfo *alloc_biinif(); /* * Interface with device driver (only `non-standard' ones are listed) */ /* psbi.c */ int dev_is_tfm(); int dev_is_jstfm(); int dev_jstfm_kind(); int dev_getjsubfont(); int dev_is_jfm(); int dev_jfm_kind(); dvi2dvi-2.0-alpha/funcfont.h100644 163 163 1302 5661210441 15326 0ustar sakuraisakurai/* * functional font */ struct funcfont { struct fontop *ff_fop; BOOLEAN ff_body; struct ffinfo *ff_info; struct funcfont *ff_next; }; /* decomp */ #define CMP_NTT 0 #define CMP_DCD 1 struct decomp { char dcmp_type; char *dcmp_name; struct font_entry *dcmp_fetab[1]; }; #define dcmpfinfo(fe) ((struct decomp *)(fe->finfo)) /* comp */ struct comp { char cmp_type; char *cmp_name; struct font_entry *cmp_fe; unsigned short cmp_sub; }; #define cmpfinfo(fe) ((struct comp *)(fe->finfo)) /* repl */ struct repl { char *repl_replfont; char *repl_font; int repl_ds; int repl_fix; }; #define replfinfo(fe) ((struct repl *)(fe->finfo)) dvi2dvi-2.0-alpha/jsub.h100644 163 163 322 5654711376 14447 0ustar sakuraisakurai#define NJSUBS 33 #define JSF_HIRA (unsigned short)3 #define JSTFM_MAGIC 142857 extern char *jsf_names[]; #define jsubfontname(f) jsf_names[f] extern int foundjsubf; #define NCSUBS 47 #define CSUB_SEP 'C' dvi2dvi-2.0-alpha/dvi.h100644 163 163 116 5733510100 14243 0ustar sakuraisakuraiextern int dvi_h; extern int dvi_v; extern int *dvi_move; extern long dvipos; dvi2dvi-2.0-alpha/dvi2.c100644 163 163 22165 7054302055 14376 0ustar sakuraisakurai#include "defs.h" #include "commands.h" #include "dconv.h" #include "global.h" #ifdef KPATHSEA #include #include #endif #define DVI2PATHENV "DVI2DVIPATH" #ifndef DVI2PATH #define DVI2PATH "." #endif #define DVI2LIBENV "DVI2DVILIB" #ifndef DVI2LIB #define DVI2LIB "/usr/local/lib/dvi2dvi" #endif #define FONTDESCENV "FONTDESCDVI" #ifndef FONTDESC #define FONTDESC "/usr/local/lib/dvi2dvi/fontdesc" #endif /* used as drift */ #ifndef RESOLUTION #define RESOLUTION 5 #endif #ifndef PAGEREVERSE #define PAGEREVERSE FALSE #endif #ifdef KPATHSEA #define KPSENAME "k" #else #define KPSENAME "" #endif void ReadPreAmble(); void ReadPostAmble(); void FindPostAmblePtr(); void GetFontDef(); /**********************************************************************/ /************************* Global Variables *************************/ /**********************************************************************/ int FirstPage = -1000000; /* first page to print (uses count0) */ int LastPage = 1000000; /* last page to print */ int den; /* denominator specified in preamble */ int mag; /* magnification specified in preamble */ int num; /* numerator specified in preamble */ int usermag = 0; /* user specified magnification */ char *dvi2path; /* fontdesc library directories path */ char *dvi2lib; /* fontdesc library directory */ char *fontdescfile; /* default fontdesc file name */ int resolution = 0; long postambleptr; /* pointer to the postamble */ long fpagep; /* pointer to the final page */ char dvifilename[PATHLEN]; /* DVI file name */ char dvidirpath[PATHLEN]; /* DVI file directory */ char rootname[PATHLEN]; /* DVI filename without extension */ FILE *dvifp = NULL; /* DVI file pointer */ FILE *outfp = NULL; /* output file */ int ncopies = 1; /* number of copies to print */ int ndone = 0; /* number of pages converted */ #ifdef DEBUG int debug = DEBUGoff; #endif int PreLoad = TRUE; /* preload the font descriptions? */ int Reverse = PAGEREVERSE; /* process DVI pages in reverse order ? */ int G_errenc = FALSE; /* has an error been encountered? */ char G_Logname[PATHLEN]; /* name of log file, if created */ int G_logging = 0; /* Are we logging warning messages? */ int G_logfile = FALSE; /* Are these messages going to a log file? */ FILE *G_logfp; /* log file pointer (for errors) */ char *G_progname; /* program name */ int G_quiet = FALSE; /* for quiet operation */ int G_nowarn = FALSE; /* don't print out warnings */ int G_removecomments = FALSE; /* remove comments from included PS files */ #ifdef MSDOS int G_longfontname = FALSE; /* truncate file name to 8 characters */ #endif int SpecialSize; char *SpecialStr; /* "\special" strings */ #ifdef STATS int Stats = FALSE; /* are we reporting stats ? */ int Snbpxl = 0; /* # of bytes of pixel data */ int Sonbpx = 0; /* "optimal" number of bytes of pixel data */ int Sndc = 0; /* # of different characters typeset */ int Stnc = 0; /* total # of chars typeset */ int Snbpx0, Sndc0, Stnc0; /* used for printing incremental changes per dvi page */ #endif /**********************************************************************/ /******************************* main *******************************/ /**********************************************************************/ main(argc, argv) int argc; char *argv[]; { struct font_index *hdfontidx; struct font_entry *fe; int i; #ifdef WIN32 getlongname(argv[0]); #endif G_progname = argv[0]; #ifdef KPATHSEA kpse_set_progname(G_progname); #endif if ((dvi2path = getenv(DVI2PATHENV)) == NULL) #ifdef KPATHSEA if ((dvi2path = kpse_var_value(DVI2PATHENV)) == NULL) #endif dvi2path = DVI2PATH; if ((dvi2lib = getenv(DVI2LIBENV)) == NULL) #ifdef KPATHSEA if ((dvi2lib = kpse_var_value(DVI2LIBENV)) == NULL) #endif dvi2lib = DVI2LIB; if ((fontdescfile = getenv(FONTDESCENV)) == NULL) #ifdef KPATHSEA if ((fontdescfile = kpse_var_value(FONTDESCENV)) == NULL) #endif fontdescfile = FONTDESC; init_default(KPSENAME); init_settings(argc, argv, fontdescfile); fix_default(RESOLUTION); if (!G_quiet) { (void)fprintf(stderr, "%s\n", version); (void)fflush(stderr); } if ((i = getuint(dvifp, 1)) != PRE) Fatal("PRE doesn't occur first--are you sure this is a DVI file?"); if ((i = getint(dvifp, 1)) != DVIFORMAT) Fatal("DVI format = %d, can only process DVI format %d files", i, DVIFORMAT); SpecialSize = STRSIZE; if ((SpecialStr = malloc((unsigned)SpecialSize)) == NULL) Fatal("can't malloc space for special"); dev_init(); dfd_dconv_templ.dc_file = dvifp; dir = HOR; setcurdconv(&dfd_dconv_templ); if (Reverse || PreLoad) { ReadPostAmble(PreLoad, &hdfontidx); (void)fseek(dvifp, 14L, SEEK_SET); } else ReadPreAmble(); skipbytes(dvifp, getuint(dvifp, 1)); dev_setup(); if (!G_quiet) { (void)fprintf(stderr, "\nPrescanning "); (void)fflush(stderr); } setcurfont(NULL); scanfont(PreLoad, &hdfontidx); if (!G_quiet) { (void)fprintf(stderr, "\nReading font info "); (void)fflush(stderr); } for (fe = hdfontent; fe != NULL; fe = fe->next) { read_fontinfo(fe); if (fe->vert_use == VU_USED) read_fontinfo(fe->vert_fe); if (!G_quiet) { (void)putc('.', stderr); (void)fflush(stderr); } } if (!G_quiet) { (void)putc('\n', stderr); (void)fflush(stderr); } dev_endsetup(); if (Reverse) (void)fseek(dvifp, fpagep, SEEK_SET); else { (void)fseek(dvifp, 14L, SEEK_SET); skipbytes(dvifp, getuint(dvifp, 1)); } setcurfont(NULL); initdir(); dviconv(hdfontidx); AllDone(); /*NOTREACHED*/ } void ReadPreAmble() { num = getuint(dvifp, 4); den = getuint(dvifp, 4); mag = getuint(dvifp, 4); #ifdef USEGLOBALMAG if (usermag > 0 && usermag != mag) (void)fprintf(stderr, "DVI magnification of %d over-ridden by user mag of %d\n", mag, usermag); #endif if (usermag > 0) mag = usermag; #ifndef USEGLOBALMAG if (mag != 1000) (void)fprintf(stderr, "Magnification of %d ignored.\n", mag); #endif } void ReadPostAmble(load, hdfip) int load; struct font_index **hdfip; /*********************************************************************** This routine is used to read in the postamble values. It initializes the magnification and checks the stack height prior to starting printing the document. ***********************************************************************/ { FindPostAmblePtr(&postambleptr); if (getuint(dvifp, 1) != POST) Fatal("POST missing at head of postamble"); #ifdef DEBUG if (Debug) (void)fprintf(stderr, "got POST command\n"); #endif fpagep = getuint(dvifp, 4); num = getuint(dvifp, 4); den = getuint(dvifp, 4); mag = getuint(dvifp, 4); #ifdef USEGLOBALMAG if (usermag > 0 && usermag != mag) (void)fprintf(stderr, "DVI magnification of %d over-ridden by user mag of %d\n", mag, usermag); #endif if (usermag > 0) mag = usermag; #ifndef USEGLOBALMAG if (mag != 1000) (void)fprintf(stderr, "Magnification of %d ignored.\n", mag); #endif skipbytes(dvifp, 4); /* height-plus-depth of tallest page */ skipbytes(dvifp, 4); /* width of widest page */ if (getuint(dvifp, 2) >= STACKSIZE) Fatal("Stack size is too small"); skipbytes(dvifp, 2); /* number of pages in the DVI file */ #ifdef DEBUG if (Debug) (void)fprintf(stderr, "now reading font defs\n"); #endif if (load) GetFontDef(hdfip); } void FindPostAmblePtr(postambleptr) long *postambleptr; /* this routine will move to the end of the file and find the start of the postamble */ { int i; (void)fseek(dvifp, 0L, SEEK_END); /* goto end of file */ *postambleptr = ftell(dvifp) - 4; (void)fseek(dvifp, *postambleptr, SEEK_SET); while (TRUE) { (void)fseek(dvifp, --(*postambleptr), SEEK_SET); if (((i = getuint(dvifp, 1)) != 223) && (i != DVIFORMAT) && (i != EXTDVIFORMAT)) Fatal("Bad end of DVI file"); if (i == DVIFORMAT || i == EXTDVIFORMAT) break; } (void)fseek(dvifp, (*postambleptr) - 4, SEEK_SET); (*postambleptr) = getuint(dvifp, 4); (void)fseek(dvifp, *postambleptr, SEEK_SET); } /*-->GetFontDef*/ /**********************************************************************/ /**************************** GetFontDef *****************************/ /**********************************************************************/ void GetFontDef(hdfip) struct font_index **hdfip; /*********************************************************************** Read the font definitions as they are in the postamble of the DVI file. ***********************************************************************/ { int cmd; for (;;) { cmd = getuint(dvifp, 1); if (FNT_DEF1 <= cmd && cmd <= FNT_DEF4) ReadFontDef(getuint(dvifp, cmd-FNT_DEF1+1), hdfip); else if (cmd == NOP) ; else if (cmd == POST_POST) return; else Fatal("POST_POST missing after fontdefs"); } } dvi2dvi-2.0-alpha/dviconv.c100644 163 163 13554 5725403331 15206 0ustar sakuraisakurai#include "defs.h" #include "commands.h" #include "dconv.h" #include "set.h" #include "global.h" int h; /* current horizontal position */ int v; /* current vertical position */ int dir; /* current direction */ int *move; /* &h or &v */ BOOLEAN chmove; /* TRUE if char moves */ #define MoveDown DC_movedown #define MoveOver DC_moveover #define SetRule DC_setrule /* * convert dvi to printer language */ int command; /* current command */ int sp = 0; /* stack pointer */ struct { int h, v, w, x, y, z; /* what's on stack */ int d; /* pTeX */ } stack[STACKSIZE]; /* stack */ dviconv(hdfidx) struct font_index *hdfidx; { int SkipMode = FALSE; /* in skip mode flag */ int count[10]; /* the 10 counters at begining of each page */ int basedir; int i; /* command parameter; loop index */ int k; /* temporary parameter */ int val, val2; /* temporarys to hold command information*/ byte par[4], par2[4]; /* temporarys to hold command information*/ int w; /* current horizontal spacing */ int x; /* current horizontal spacing */ int y; /* current vertical spacing */ int z; /* current vertical spacing */ /*long cpagep; /* current page pointer */ long ppagep; /* previous page pointer */ /* initialize for virtual font */ w = x = y = z = 0; basedir = dir; while (TRUE) switch (command=DC_getcommand()) { case SET1:case SET2:case SET3:case SET4: val = DC_getuint(command-SET1+1); if (!SkipMode) SetChar(val, TRUE); break; case SET_RULE: DC_getbytes(par, 4); DC_getbytes(par2, 4); if (!SkipMode) SetRule(par, par2, TRUE); break; case PUT1:case PUT2:case PUT3:case PUT4: val = DC_getuint(command-PUT1+1); if (!SkipMode) SetChar(val, FALSE); break; case PUT_RULE: DC_getbytes(par, 4); DC_getbytes(par2, 4); if (!SkipMode) SetRule(par, par2, FALSE); break; case NOP: break; case BOP: /*cpagep = ftell(dc_file) - 1;*/ for (i=0; i<=9; i++) count[i] = DC_getuint(4); ppagep = DC_getuint(4); h = v = w = x = y = z = 0; setdir(HOR, FALSE); basedir = HOR; sp = 0; setcurfont((struct font_entry *)NULL); dev_initpage(); SkipMode = (count[0] < FirstPage || count[0] > LastPage); if (!SkipMode) { dev_bop(count); if (!G_quiet) (void)fprintf(stderr, "[%d", count[0]); } break; case EOP: if (!SkipMode) { dev_eop(); #ifdef STATS if (Stats) (void)fprintf(stderr, " - %d total ch, %d diff ch, %d pxl bytes]\n", Stnc-Stnc0, Sndc-Sndc0, Snbpxl-Snbpx0); else #endif if (!G_quiet) { (void)fprintf(stderr,"] "); if ((++ndone % 10) == 0) (void)putc('\n', stderr); (void)fflush(stderr); } } if (Reverse) if (ppagep > 0) (void)fseek(dc_file, ppagep, 0); else return; break; case PUSH: if (sp >= STACKSIZE) Fatal("stack overflow"); stack[sp].h = h; stack[sp].v = v; stack[sp].w = w; stack[sp].x = x; stack[sp].y = y; stack[sp].z = z; stack[sp].d = dir; sp++; dev_push(); break; case POP: --sp; if (sp < 0) Fatal("stack underflow"); h = stack[sp].h; v = stack[sp].v; w = stack[sp].w; x = stack[sp].x; y = stack[sp].y; z = stack[sp].z; setdir(stack[sp].d, FALSE); dev_pop(); break; case RIGHT1:case RIGHT2:case RIGHT3:case RIGHT4: DC_getbytes(par, command-RIGHT1+1); if (!SkipMode) MoveOver(par, command-RIGHT1+1, 0); break; case W0: if (!SkipMode) MoveOver(par, 0, w); break; case W1:case W2:case W3:case W4: DC_getbytes(par, command-W1+1); w = makeint(par, command-W1+1); if (!SkipMode) MoveOver(par, command-W1+1, w); break; case X0: if (!SkipMode) MoveOver(par, 0, x); break; case X1:case X2:case X3:case X4: DC_getbytes(par, command-X1+1); x = makeint(par, command-X1+1); if (!SkipMode) MoveOver(par, command-X1+1, x); break; case DOWN1:case DOWN2:case DOWN3:case DOWN4: DC_getbytes(par, command-DOWN1+1); if (!SkipMode) MoveDown(par, command-DOWN1+1, 0); break; case Y0: if (!SkipMode) MoveDown(par, 0, y); break; case Y1:case Y2:case Y3:case Y4: DC_getbytes(par, command-Y1+1); y = makeint(par, command-Y1+1); if (!SkipMode) MoveDown(par, command-Y1+1, y); break; case Z0: if (!SkipMode) MoveDown(par, 0, z); break; case Z1:case Z2:case Z3:case Z4: DC_getbytes(par, command-Z1+1); z = makeint(par, command-Z1+1); if (!SkipMode) MoveDown(par, command-Z1+1, z); break; case FNT1:case FNT2:case FNT3:case FNT4: k = DC_getuint(command-FNT1+1); if (!SkipMode) SetFntNum(k, hdfidx); break; case XXX1:case XXX2:case XXX3:case XXX4: k = DC_getuint(command-XXX1+1); DC_getbytes(SpecialStr, k); if (!SkipMode) dev_dospecial(SpecialStr, k); break; case FNT_DEF1:case FNT_DEF2:case FNT_DEF3:case FNT_DEF4: DC_skipbytes(command-FNT_DEF1+1); SkipFontDef(); break; case PRE: Fatal("PRE occurs within file"); break; case POST: return; case POST_POST: Fatal("POST_POST with no preceding POST"); break; case DIR: setdir(basedir+DC_getuint(1), TRUE); break; default: if (command >= FONT_00 && command <= FONT_63) { if (!SkipMode) SetFntNum(command-FONT_00, hdfidx); } else if (command >= SETC_000 && command <= SETC_127) { if (!SkipMode) SetString(command); } else Fatal("%d is an undefined command", command); break; } } initdir() { dir = VER; setdir(HOR, FALSE); } setdir(d, dev) int d; BOOLEAN dev; { d = d%NDIR; if (dir != d) { dir = d; if (d == HOR) { move = &h; setdirhor(); } else if (d == VER) { move = &v; setdirver(); } else Fatal("direction %d not supported", d); if (dev) dev_dir(d); } } dvi2dvi-2.0-alpha/dfdcom.c100644 163 163 6152 7054277302 14752 0ustar sakuraisakurai/* * funtions for analyzing dvi in dvi-file (dfd stands for dvi-file dvi) */ #include "defs.h" #include "commands.h" #include "dconv.h" #include "global.h" int dfd_getcommand(); void dfd_backupone(); void dfd_getbytes(); void dfd_skipbytes(); int dfd_getuint(); int dfd_getint(); void dfd_movedown(); void dfd_movedown_v(); void dfd_moveover(); void dfd_moveover_v(); void dfd_setrule(); void dfd_setrule_v(); struct dconv dfd_dconv_templ = { dfd_getcommand, dfd_backupone, dfd_getbytes, dfd_skipbytes, dfd_getuint, dfd_getint, NULL, NULL, NULL, dfd_movedown, dfd_movedown_v, dfd_moveover, dfd_moveover_v, dfd_setrule, dfd_setrule_v, 0 }; dfd_dirkeep() { dfd_dconv_templ.dc_movedown_v = dfd_dconv_templ.dc_movedown; dfd_dconv_templ.dc_moveover_v = dfd_dconv_templ.dc_moveover; dfd_dconv_templ.dc_setrule_v = dfd_dconv_templ.dc_setrule; } int dfd_getcommand() { return getuint(dc_file, 1); } void dfd_backupone() { (void)fseek(dc_file, -1L, SEEK_CUR); } void dfd_getbytes(cp, n) byte *cp; int n; { getbytes(dc_file, cp, n); } void dfd_skipbytes(n) int n; { (void)fseek(dc_file, (long)n, SEEK_CUR); } int dfd_getuint(n) int n; { return getuint(dc_file, n); } int dfd_getint(n) int n; { return getint(dc_file, n); } void ReadFontDef(k, hdfip) int k; struct font_index **hdfip; { int c, s, d, a, l; byte n[STRSIZE]; c = getuint(dc_file, 4); /* checksum */ s = getuint(dc_file, 4); /* scaled size */ d = getuint(dc_file, 4); /* design size */ a = getuint(dc_file, 1); /* area length for font name */ l = getuint(dc_file, 1); /* device length */ getbytes(dc_file, n, a+l); n[a+l] = '\0'; readfontdef(k, c, s, d, a, l, (char *)n, hdfip); } void SkipFontDef() { int a, l; skipbytes(dc_file, 4*3); a = getuint(dc_file, 1); l = getuint(dc_file, 1); skipbytes(dc_file, a+l); } int HasBeenRead(k, hdfidx) int k; struct font_index *hdfidx; { struct font_index *ptr; for (ptr = hdfidx; (ptr!=NULL) && (ptr->k!=k); ) ptr = ptr->next; return (ptr != NULL); } extern int command; void dfd_movedown(a, n, l) byte *a; int n, l; { dev_move(a, n, command-n); } void dfd_movedown_v(a, n, l) byte *a; int n, l; { if (DOWN1 <= command && command <= DOWN4) l = makeint(a, n); dev_makemove(-l, RIGHT1-1); } void dfd_moveover(b, n, l) byte *b; int n, l; { dev_move(b, n, command-n); } void dfd_moveover_v(b, n, l) byte *b; int n, l; { if (RIGHT1 <= command && command <= RIGHT4) l = makeint(b, n); dev_makemove(l, DOWN1-1); } void dfd_setrule(a, b, Set) /* this routine will draw a rule */ byte *a, *b; BOOLEAN Set; { dev_setrule(makeint(a, 4), makeint(b, 4), command); } void d_setrule_v(x, y, Set) int x, y; BOOLEAN Set; { if (x <= 0 || y <= 0) { if (Set) dev_makemove(y, DOWN1-1); } else { if (!Set) dev_push(); dev_makemove(y, DOWN1-1); dev_setrule(y, x, PUT_RULE); if (!Set) dev_pop(); } } void dfd_setrule_v(a, b, Set) /* this routine will draw a rule */ byte *a, *b; BOOLEAN Set; { d_setrule_v(makeint(a, 4), makeint(b, 4), Set); } dvi2dvi-2.0-alpha/fontcom.c100644 163 163 7320 7054277341 15164 0ustar sakuraisakurai#include "defs.h" #include "commands.h" #include "global.h" #include "set.h" struct font_entry *hdfontent = NULL; struct font_entry *curfontent; /*-->ReadFontDef*/ /**********************************************************************/ /**************************** ReadFontDef ***************************/ /**********************************************************************/ void readfontdef(k, c, s, d, a, l, n, hdfip) int k, c, s, d, a, l; char *n; struct font_index **hdfip; { struct font_index *fi; fi = NEW(struct font_index, "font_index"); fi->k = k; fi->next = *hdfip; *hdfip = fi; #ifdef DEBUG if (Debug) (void)fprintf(stderr, "readfontdef %s k = %d s = %d d = %d", n, k, s, d); #endif fi->fent = get_font_entry(c, s, d, a, l, n); } struct font_entry * get_font_entry(c, s, d, a, l, n) int c, s, d, a, l; char *n; { struct font_entry *fe; char rn[STRSIZE]; int rd, rs; int first_markchar(); void read_null_fontinfo(); if (replfont(n, s, rn, &rd, &rs)) { #ifdef DEBUG if (Debug) (void)fprintf(stderr, " -> %s s = %d d = %d", rn, rs, rd); #endif n = rn; l = strlen(rn); d = rd; s = rs; } for (fe = hdfontent; fe != NULL; fe = fe->next) if (strcmp(n, fe->n) == 0 && s == fe->s) { #ifdef DEBUG if (Debug) (void)fprintf(stderr, " [already read]\n"); #endif return fe; } #ifdef DEBUG if (Debug) (void)fprintf(stderr, "\n"); #endif fe = NEW(struct font_entry, "font_entry"); fe->next = hdfontent; hdfontent = fe; fe->c = c; fe->s = s; fe->d = d; fe->a = a; fe->l = l; (void)strcpy(fe->n, n); fe->fnt_type = FT_UNDEF; fe->fnt_use = FU_NOTUSED; fe->vert_use = VU_UNDEF; fe->base_fe = fe; fe->openfile = NO_FILE; fe->ncdl = -1; #ifdef STATS fe->nbpxl = 0; fe->ncts = 0; #endif fe->fnt_markchar = first_markchar; fe->fnt_readfontinfo = read_null_fontinfo; return fe; } /* * We postpone the initialization of font info till the char in the font * is first used. This is because if the font is declared in the virtual * font, the font may be used only in some chars of vf and the chars may * not be used in a particular dvi. */ first_markchar(fe, c) struct font_entry *fe; int c; { init_fontinfo(fe); fe->fnt_markchar(fe, c); } /*-->SetFntNum*/ /**********************************************************************/ /**************************** SetFntNum *****************************/ /**********************************************************************/ void SetFntNum(k, hdfidx) int k; struct font_index *hdfidx; /* this routine is used to specify the font to be used in printing future characters */ { struct font_index *ptr; for (ptr = hdfidx; (ptr!=NULL) && (ptr->k!=k); ) ptr = ptr->next; if (ptr == NULL) Fatal("font %d undefined", k); setcurfont(ptr->fent); } /* * read_fontinfo */ void read_fontinfo(fe) struct font_entry *fe; { #ifdef DEBUG if (Debug) (void)fprintf(stderr, "<%s>\n", fe->n); #endif /* most fonts are real fonts */ fe->rvf_setchar = realf_setchar; fe->rvf_setstring = realf_setstring; (*(fe->fnt_readfontinfo))(fe); } /* operations for null font */ /* ARGSUSED */ null_markchar(fe, c) struct font_entry *fe; int c; { } void read_null_fontinfo(fe) struct font_entry *fe; { DEV_FONT null_fontdict(); int null_setchar(), null_setstring(); fe->dev_fontdict = null_fontdict; fe->dev_setchar = null_setchar; fe->dev_setstring = null_setstring; } /* ARGSUSED */ DEV_FONT null_fontdict(fe, c) struct font_entry *fe; int c; { return DEV_NULLFONT; } /* ARGSUSED */ null_setchar(c) int c; { return 0; } /* ARGSUSED */ null_setstring(s, len) byte *s; int len; { return 0; } dvi2dvi-2.0-alpha/set.c100644 163 163 4205 7054301536 14303 0ustar sakuraisakurai#include "defs.h" #include "commands.h" #include "dconv.h" #include "global.h" #include "set.h" extern int dirmode; struct font_entry * getcurrentfontent() { static struct font_entry *new_vfe = NULL; if (dir == VER) { if (curfontent->vert_use == VU_UNDEF) { if (new_vfe == NULL) new_vfe = NEW(struct font_entry, "font_entry"); *new_vfe = *curfontent; new_vfe->openfile = NO_FILE; if (init_vfontinfo(new_vfe)) { curfontent->vert_use = VU_USED; curfontent->vert_fe = new_vfe; curfontent->vert_fe->base_fe = curfontent; curfontent->vert_fe->vert_use = VU_VERT; new_vfe = NULL; } else curfontent->vert_use = VU_NOTUSED; if (dir_with_width) { if (curfontent->vert_use == VU_NOTUSED) { if (curfontent->fnt_type == FT_UNDEF) init_fontinfo(curfontent); if (curfontent->fnt_type == FT_DVI) Fatal("font info necessary for vertical use of %s\n", curfontent->n); } if (curfontent->vert_use == VU_NOTUSED) { curfontent->vert_use = VU_USED; curfontent->vert_fe = NEW(struct font_entry, "font_entry"); *(curfontent->vert_fe) = *curfontent; curfontent->vert_fe->base_fe = curfontent; curfontent->vert_fe->openfile = NO_FILE; } curfontent->vert_fe->vert_use = VU_VERT; } } if (curfontent->vert_use == VU_USED) return curfontent->vert_fe; } return curfontent; } struct font_entry * currentfontent() { if (dir == VER) { if (curfontent->vert_use == VU_USED) return curfontent->vert_fe; } return curfontent; } void MarkChar(c) int c; { struct font_entry *fe; fe = getcurrentfontent(); fe->fnt_markchar(fe, c); } void MarkString(firstch) int firstch; { int c; struct font_entry *fe; fe = getcurrentfontent(); for (c = firstch; c >= SETC_000 && c <= SETC_127; ) { fe->fnt_markchar(fe, c); c = DC_getcommand(); } DC_backupone(); } void SetChar(c, Move) int c; BOOLEAN Move; { struct font_entry *fe; fe = currentfontent(); fe->rvf_setchar(fe, c, Move); } void SetString(firstch) int firstch; { struct font_entry *fe; fe = currentfontent(); fe->rvf_setstring(fe, firstch); } dvi2dvi-2.0-alpha/rfset.c100644 163 163 2621 7054301525 14631 0ustar sakuraisakurai/* * setchar for real font (non-virtual font) */ #include "defs.h" #include "commands.h" #include "dconv.h" #include "global.h" #include "set.h" void realf_setchar(fe, c, Move) struct font_entry *fe; int c; BOOLEAN Move; { int cw; DEV_FONT devf; devf = fe->dev_fontdict(fe, c); if (devf != DEV_NULLFONT) { /* ignore missing fonts */ chmove = Move; dev_setfont(devf); dev_setposn(h, v); cw = fe->dev_setchar(fe, c); if (Move) *move += cw; } else dev_setposn(h, v); #ifdef STATS Stnc += 1; fe->ncts += 1; #endif } #define STRLEN 256 void realf_setstring(fe, firstch) /* read and set a consecutive string of chars */ struct font_entry *fe; int firstch; { char s[STRLEN]; char *sp; int c, len; DEV_FONT devf; /* read entire string of chars */ /* ensure that all characters are loaded, */ devf = fe->dev_fontdict(fe, firstch); for (c = firstch, sp = s, len = 0; c >= SETC_000 && c <= SETC_127 && len < STRLEN; len++) { if (devf != fe->dev_fontdict(fe, c)) break; *sp++ = c; c = DC_getcommand(); } DC_backupone(); /* NULL's are valid chars, so cant use for string termination */ if (devf != DEV_NULLFONT) { /* ignore missing fonts */ chmove = TRUE; dev_setfont(devf); dev_setposn(h, v); *move += fe->dev_setstring(fe, s, len); } else dev_setposn(h, v); #ifdef STATS Stnc += len; fe->ncts += len; #endif } dvi2dvi-2.0-alpha/vfset.c100644 163 163 1632 7054261756 14651 0ustar sakuraisakurai/* * setchar for virtual font */ #include "defs.h" #include "commands.h" #include "dconv.h" #include "global.h" #include "set.h" void virf_setchar(fe, c, Move) struct font_entry *fe; int c; BOOLEAN Move; { int cw; chmove = Move; cw = fe->dev_setchar(fe, c); if (Move) *move += cw; #ifdef STATS Stnc += 1; fe->ncts += 1; #endif } #define STRLEN 256 void virf_setstring(fe, firstch) /* read and set a consecutive string of chars */ struct font_entry *fe; int firstch; { char s[STRLEN]; char *sp; int c, len; /* read entire string of chars */ /* ensure that all characters are loaded, */ for (c = firstch, sp = s, len = 0; c >= SETC_000 && c <= SETC_127 && len < STRLEN; len++) { *sp++ = c; c = DC_getcommand(); } DC_backupone(); chmove = TRUE; *move += fe->dev_setstring(fe, s, len); #ifdef STATS Stnc += len; fe->ncts += len; #endif } dvi2dvi-2.0-alpha/dconv.c100644 163 163 2356 6767750127 14644 0ustar sakuraisakurai#include "defs.h" #include "dconv.h" #include "global.h" struct dconv *curdconvp; int (*dc_getcommand)(); void (*dc_backupone)(); void (*dc_getbytes)(); void (*dc_skipbytes)(); int (*dc_getuint)(); int (*dc_getint)(); FILE *dc_file; byte *dc_bufbeg; byte *dc_bufend; void (*dc_movedown)(); void (*dc_moveover)(); void (*dc_setrule)(); int dc_scale; setcurdconv(dp) struct dconv *dp; { curdconvp = dp; dc_getcommand = dp->dc_getcommand; dc_backupone = dp->dc_backupone; dc_getbytes = dp->dc_getbytes; dc_skipbytes = dp->dc_skipbytes; dc_getuint = dp->dc_getuint; dc_getint = dp->dc_getint; dc_file = dp->dc_file; dc_bufbeg = dp->dc_bufbeg; dc_bufend = dp->dc_bufend; if (dir == HOR) { dc_movedown = dp->dc_movedown; dc_moveover = dp->dc_moveover; dc_setrule = dp->dc_setrule; } else { dc_movedown = dp->dc_movedown_v; dc_moveover = dp->dc_moveover_v; dc_setrule = dp->dc_setrule_v; } dc_scale = dp->dc_scale; } setdirhor() { dc_movedown = curdconvp->dc_movedown; dc_moveover = curdconvp->dc_moveover; dc_setrule = curdconvp->dc_setrule; } setdirver() { dc_movedown = curdconvp->dc_movedown_v; dc_moveover = curdconvp->dc_moveover_v; dc_setrule = curdconvp->dc_setrule_v; } dvi2dvi-2.0-alpha/run.c100644 163 163 23470 6526107667 14355 0ustar sakuraisakurai#include #include "defs.h" #include "global.h" #define ChangeFlag(bool) ((bool) = (bool)?FALSE:TRUE) static BOOLEAN stdindvi = FALSE; void sigabort(sig) int sig; { AbortRun(2); } /* * decode args and read fontdesc */ void init_settings(argc, argv, fontdescfile) int argc; char *argv[]; char *fontdescfile; { int argind; /* argument index for flags */ int argdvi; int nff = 0; /* number of fontdesc files */ char curname[STRSIZE]; /* current file name */ char *outfile = NULL; char *tcp, *tcp1; /* temporary character pointers */ char *tmp; int ch; for (argind = 1; argind < argc; argind++) { tcp = argv[argind]; if (*tcp == '-') { switch (*++tcp) { case 'D': /* D defines a variable */ if (++argind >= argc) Fatal("No argument following -D\n"); arg_define(argv[argind]); break; case 'F': /* F selects different fontdesc */ if (++argind >= argc) Fatal("No argument following -F\n"); nff++; break; case 'K': /* remove comments from included PS files */ ChangeFlag(G_removecomments); break; #ifdef MSDOS case 'L': /* L truncate file name to 8 characters */ ChangeFlag(G_longfontname); break; #endif case 'R': /* R selects different resolution */ if (++argind >= argc) Fatal("No argument following -R\n"); break; #ifdef STATS case 'S': /* print some statistics */ ChangeFlag(Stats); break; #endif case 'c': /* next arg is an output dvi file */ if (++argind >= argc) Fatal("No argument following -c\n"); outfile = argv[argind]; break; case 'd': /* d selects Debug output */ if (*++tcp == '\0') debug = DEBUGuser; else debug = DEBUGsys; break; case 'f': /* next arg is starting pagenumber */ if (++argind >= argc || sscanf(argv[argind], "%d", &FirstPage) != 1) Fatal("Argument is not a valid integer\n"); break; case 'i': /* next arg is a PostScript prologue file */ if (++argind >= argc) Fatal("No argument following -i\n"); break; case 'l': /* l prohibits logging of errors */ G_logging = -1; break; #ifdef USEGLOBALMAG case 'm': /* specify magnification to use */ switch(*++tcp) { case '\0': /* next arg is a magnification to use */ if (++argind >= argc || sscanf(argv[argind], "%d", &usermag) != 1) Fatal("Argument is not a valid integer\n", 0); break; case '0': usermag = 1000; break; case 'h': usermag = 1095; break; case '1': usermag = 1200; break; case '2': usermag = 1440; break; case '3': usermag = 1728; break; case '4': usermag = 2074; break; case '5': usermag = 2488; break; default: Fatal("%c is a bad mag step\n", *tcp); } break; #endif case 'n': /* next arg is number of copies to print */ if (++argind >= argc || sscanf(argv[argind], "%d", &ncopies) != 1) Fatal("Argument is not a valid integer\n"); break; case 'o': /* next arg is a PostScript command to send */ if (++argind >= argc) Fatal("No argument following -o\n"); dev_arg('o', argv[argind]); break; case 'p': /* p prohibits pre-font loading */ ChangeFlag(PreLoad); if (PreLoad == FALSE) Reverse = FALSE; /* must then process in forward order */ break; case 'q': /* quiet operation */ ChangeFlag(G_quiet); break; case 'r': /* don't process pages in reverse order */ ChangeFlag(Reverse); break; case 's': /* next arg is a PostScript setup file */ if (++argind >= argc) Fatal("No argument following -s\n"); break; case 't': /* next arg is ending pagenumber */ if (++argind >= argc || sscanf(argv[argind], "%d", &LastPage) != 1) Fatal("Argument is not a valid integer\n"); break; case 'w': /* don't print out warnings */ ChangeFlag(G_nowarn); break; default: usage(*tcp); } } else break; } /* dvifilename, dvidirpath, dvifp, (rootname, G_Logname) are set */ if (argind < argc) { tcp = rindex(argv[argind], DIR_SEP); /* split into directory + file name */ if (tcp == NULL) { dvidirpath[0] = '\0'; tcp = argv[argind]; } else { (void)strcpy(dvidirpath, argv[argind]); dvidirpath[tcp-argv[argind]+1] = '\0'; tcp += 1; } (void)strcpy(curname, tcp); tcp1 = rindex(tcp, '.'); /* split into file name + extension */ if (tcp1 == NULL) { (void)strcpy(rootname, curname); /* not used now */ (void)strcat(curname, ".dvi"); } else { *tcp1 = '\0'; (void)strcpy(rootname, curname); /* not used now */ *tcp1 = '.'; } (void)strcpy(dvifilename, dvidirpath); (void)strcat(dvifilename, curname); if ((dvifp = BINARYOPEN(dvifilename)) == NULL) Fatal("can't find DVI file \"%s\"", dvifilename); /* not used now */ (void)strcpy(G_Logname, rootname); (void)strcat(G_Logname, ".log"); } else { /* get dvi file from stdin */ dvidirpath[0] = '\0'; if ((tmp = getenv("TMP")) == NULL) tmp = TMP; (void)strcpy(dvifilename, tmp); (void)mktemp(strcat(dvifilename, DVITEMPLATE)); (void)strcpy(rootname, dvifilename); /* not used now */ (void)strcat(dvifilename, ".dvi"); if ((dvifp = BINARYWOPEN(dvifilename)) == NULL) Fatal("can't create DVI file for stdin"); stdindvi = TRUE; (void)signal(SIGHUP, sigabort); (void)signal(SIGINT, sigabort); #ifdef MSDOS setmode(fileno(stdin), O_BINARY); #endif for (; !ferror(stdin) && (ch = getchar()) != EOF; ) (void)putc(ch, dvifp); if (ferror(stdin)) Fatal("can't input DVI from stdin"); (void)fseek(dvifp, 0L, 0); /* not used now */ (void)strcpy(G_Logname, "dvi2.log"); } if (nff == 0) read_fontdesc(fontdescfile, TRUE); argdvi = argind; for (argind = 1; argind < argdvi; argind++) switch (*(argv[argind]+1)) { case 'F': /* F selects different fontdesc */ arg_fontdesc(argv[++argind]); break; case 'R': /* R selects different resolution */ resolution = atoi(argv[++argind]); break; case 'i': /* next arg is a PostScript prologue file */ add_include(argv[++argind], TRUE); break; case 's': /* next arg is a PostScript setup file */ add_setup(argv[++argind], TRUE); break; } if (outfile == NULL) { outfp = stdout; #ifdef MSDOS setmode(fileno(outfp), O_BINARY); #endif } else if ((outfp = BINARYWOPEN(outfile)) == NULL) Fatal("can't write to output file \"%s\"", outfile); } usage(c) char c; { (void)fprintf(stderr, "%c is not a legal flag\n", c); (void)fprintf(stderr, "Usage: %s %s\n\t%s\n\t%s\n", G_progname, "[-d] [-f n] [-i file] [-l] [-m{0|h|1|2|3|4|5}] [-m mag]", "[-n n] [-o option] [-q] [-r] [-s file] [-t n] [-w]", "[-D var=val] [-F fontdesc] [-K] [-L] [-R resolution] [-S]", "[dvifile]"); (void)fprintf(stderr, "%s\n", version); AbortRun(2); } /*-->AbortRun*/ /**********************************************************************/ /*************************** AbortRun *******************************/ /**********************************************************************/ void AbortRun(code) int code; { if (stdindvi) (void)unlink(dvifilename); exit(code); } /*-->AllDone*/ /**********************************************************************/ /****************************** AllDone ******************************/ /**********************************************************************/ void AllDone() { struct font_entry *p; dev_finish(); if (!G_quiet) (void)fprintf(stderr,"\n"); #ifdef STATS if (Stats) { (void)fprintf(stderr, "Total chars diff chars raster bytes\n"); (void)fprintf(stderr, " # %% # %% # %%\n"); (void)fprintf(stderr, "------- --- ------ --- ----- ---\n"); for (p = hdfontent; p != NULL; p = p->next) { (void)fprintf(stderr, "%7d%4d", p->ncts, 100*p->ncts/Stnc); if (Sndc != 0) (void)fprintf(stderr, "%9d%4d", p->ncdl, 100*p->ncdl/Sndc); else (void)fprintf(stderr, "%9d --", p->ncdl); if (Snbpxl != 0) (void)fprintf(stderr, "%8d%4d", p->nbpxl, 100*p->nbpxl/Snbpxl); else (void)fprintf(stderr, "%8d --", p->nbpxl); (void)fprintf(stderr, " %s\n", p->name); } (void)fprintf(stderr, "\nTotal number of characters typeset: %d\n", Stnc); (void)fprintf(stderr, "Number of different characters downloaded: %d\n", Sndc); (void)fprintf(stderr, "Number of bytes of raster data downloaded: %d\n", Snbpxl); (void)fprintf(stderr, "Optimal # of bytes of raster data: %d\n", Sonbpx); } #endif AbortRun(G_errenc ? 1 : 0); } /*-->Fatal*/ /**********************************************************************/ /****************************** Fatal *******************************/ /**********************************************************************/ /* VARARGS1 */ void Fatal(fmt, a, b, c) /* issue a fatal error message */ char *fmt; /* format */ char *a, *b, *c; /* arguments */ { if (G_logging == 1 && G_logfile) { (void)fprintf(G_logfp, "%s: FATAL-- ", G_progname); (void)fprintf(G_logfp, fmt, a, b, c); (void)fprintf(G_logfp, "\n"); } (void)fprintf(stderr,"\n"); (void)fprintf(stderr, "%s: FATAL-- ", G_progname); (void)fprintf(stderr, fmt, a, b, c); (void)fprintf(stderr, "\n\n"); AbortRun(2); } /*-->Warning*/ /**********************************************************************/ /***************************** Warning ******************************/ /**********************************************************************/ /* VARARGS1 */ void Warning(fmt, a, b, c) /* issue a warning */ char *fmt; /* format */ char *a, *b, *c; /* arguments */ { if (G_logging == 0) { if (G_logfile) G_logfp = fopen(G_Logname, "w+"); else { G_logfp = stderr; if (G_nowarn) return; } G_logging = 1; if (G_logfp == NULL) G_logging = -1; } G_errenc = TRUE; if (G_logging == 1) { (void)fprintf(G_logfp, fmt, a, b, c); (void)fprintf(G_logfp,"\n"); } } dvi2dvi-2.0-alpha/fontdesc.c100644 163 163 50117 7116475116 15345 0ustar sakuraisakurai#include "defs.h" #include "global.h" #include "commands.h" extern struct fontop vfop, /* virfont.c */ jvfop, /* virfont.c */ tfmop, /* bifont.c */ jfmop, /* bifont.c */ cmpop, /* compfont.c */ dcmpop, /* decompfont.c */ execop, /* execfont.c */ funcop; /* funcfont.c */ struct fontop *fontops[] = { &vfop, &jvfop, &tfmop, &jfmop, &cmpop, &dcmpop, &execop, &funcop, NULL }; extern struct confop fdcop, /* fontdesc.c */ fontcop, /* fontdesc.c */ vfontcop, /* fontdesc.c */ defcop, /* fontdesc.c */ replfcop, /* fontdesc.c */ ptexcop; /* fontdesc.c */ struct confop *confops[] = { &fdcop, &fontcop, &vfontcop, &defcop, &replfcop, &ptexcop, NULL }; /* * read_fontdesc */ static struct fdin { char *name; FILE *file; int ch; int line; } fdin; #define fdname fdin.name #define fdf fdin.file #define fdch fdin.ch #define fdline fdin.line static struct libdir { char *dir, *lcldir; /* library directory and local directory */ char *defpath; /* default path used when not found */ } libdir = { "", "", "" }; struct libdir_body { char dir[PATHLEN], lcldir[PATHLEN]; char *defpath; }; static void setlibdir(nld) struct libdir_body *nld; { libdir.dir = nld->dir; libdir.lcldir = nld->lcldir; libdir.defpath = nld->defpath; } void read_fontdesc(fdn, top) char *fdn; BOOLEAN top; { char fdfile[PATHLEN]; FILE *f; char field[STRSIZE]; struct libdir_body newlibdir; struct fdin save_fdin; struct libdir save_libdir; struct confop *findconfop(); if (searchfile(fdn, fdfile, &newlibdir, top, (char *)NULL)) { #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "open fontdesc %s\n", fdfile); #endif f = fopen(fdfile, "r"); } else Fatal("cannot open fontdesc file %s", fdn); save_fdin = fdin; save_libdir = libdir; fdname = fdfile; fdf = f; setlibdir(&newlibdir); for (fdline = 1; (fdch = getc(fdf)) != EOF; fdline++) { if (fdch == '#' || fdch == '\n') { skipline(); continue; } getfield(field); (*(findconfop(field)->co_get))(); } (void)fclose(fdf); fdin = save_fdin; libdir = save_libdir; } /* newf <- ld+lcd+f(+ext) * newlcd <- dir part of lcd+f */ static findsearchfile(newf, newlcd, ld, lcd, f, ext) char *newf, *newlcd, *ld, *lcd, *f, *ext; { char *p; (void)strcpy(newlcd, lcd); (void)strcat(newlcd, f); (void)strcpy(newf, ld); (void)strcat(newf, newlcd); if (access(newf, R_OK) != 0) { if (ext != NULL) { (void)strcat(newf, ext); if (access(newf, R_OK) != 0) return FALSE; } else return FALSE; } if ((p = rindex(newlcd, '/')) != NULL) *(p+1) = '\0'; else *newlcd = '\0'; return TRUE; } /* newld <- copy of directory in path * newf, newlcd <- set by findsearchfile */ static pathsearchfile(nextpath, path, newf, newlcd, newld, lcd, f, ext) char **nextpath, *path; char *newf, *newlcd, *newld, *lcd, *f, *ext; { char *p, *d; for (; *path != '\0'; ) { for (; *path == PATH_SEP; path++) ; for (p = path, d = newld; *p != PATH_SEP && *p != '\0'; ) *d++ = *p++; if (d == newld) continue; if (*(d-1) != '/') *d++ = '/'; *d = '\0'; if (findsearchfile(newf, newlcd, newld, lcd, f, ext)) { *nextpath = p; return TRUE; } if (*p == '\0') break; path = p+1; } return FALSE; } searchfile(f, newf, nld, top, ext) char *f, *newf; struct libdir_body *nld; BOOLEAN top; char *ext; { char *dfp, *lcd, *next, *p; #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "search file %s in %s+%s\n", f, libdir.dir, libdir.lcldir); #endif if (strncmp(f, "//", 2) == 0) { f += 2; lcd = ""; dfp = top ? dvi2lib : libdir.defpath; } else if (*f == '/' #if defined(MSDOS) || defined(WIN32) || (isalpha(*f) && *(f+1) == ':') #endif ) { p = rindex(f, '/'); #if defined(MSDOS) || defined(WIN32) if (p == NULL) p = f+1; #endif (void)strncpy(nld->dir, f, p+1-f); nld->dir[p+1-f] = '\0'; nld->defpath = dvi2lib; return findsearchfile(newf, nld->lcldir, nld->dir, "", p+1, ext); } else if (top) { nld->defpath = dvi2lib; if (strncmp(f, "./", 2) == 0 || strncmp(f, "../", 3) == 0) { p = rindex(f, '/'); (void)strncpy(nld->dir, f, p+1-f); nld->dir[p+1-f] = '\0'; return findsearchfile(newf, nld->lcldir, nld->dir, "", p+1, ext); } if (pathsearchfile(&next, dvi2path, newf, nld->lcldir, nld->dir, "", f, ext)) return TRUE; lcd = ""; dfp = dvi2lib; } else { if (findsearchfile(newf, nld->lcldir, libdir.dir, libdir.lcldir, f, ext)) { (void)strcpy(nld->dir, libdir.dir); nld->defpath = libdir.defpath; return TRUE; } lcd = libdir.lcldir; dfp = libdir.defpath; } #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "search file %s in lib %s+%s\n", f, dfp, lcd); #endif if (pathsearchfile(&next, dfp, newf, nld->lcldir, nld->dir, lcd, f, ext)) { nld->defpath = next; return TRUE; } return FALSE; } #ifdef UNDEF searchfiledir(f, ld, newf) char *f; struct libdir_body *ld; char *newf; { struct libdir_body newlibdir; /* dummy */ struct libdir save_libdir; int found; save_libdir = libdir; setlibdir(ld); found = searchfile(f, newf, &newlibdir, FALSE, (char *)NULL); libdir = save_libdir; return found; } #endif void skipline() { for (; fdch != '\n' && fdch != EOF; fdch = getc(fdf)) ; } void skipblanks0() { int c; for (; fdch == ' ' || fdch == '\t' || fdch == '\\'; fdch = getc(fdf)) if (fdch == '\\') if ((c = getc(fdf)) != '\n') { (void)ungetc(c, fdf); break; } } void skipblanks() { skipblanks0(); if (fdch == '\n') Fatal("fontdesc: %s illegal line %d", fdname, fdline); } getfield(field) char *field; { char *fend; int c; skipblanks(); for (fend = field+STRSIZE-1; fdch != ' ' && fdch != '\t' && fdch != '\n' && fdch != EOF; fdch = getc(fdf)) { if (fdch == '\\') if ((c = getc(fdf)) != '\n') { (void)ungetc(c, fdf); } else { fdch = ' '; break; } if (field < fend) *field++ = fdch; else Fatal("fontdesc: field too long (%s line %d)", fdname, fdline); } *field = '\0'; } getqfield0(field) char *field; { char *fend; int c; if (fdch == FDQUO) { *field++ = fdch; for (fend = field+STRSIZE-1; (*field++ = fdch = getc(fdf)) != FDQUO && fdch != EOF; ) { if (fdch == '\\') *(field-1) = getc(fdf); if (field >= fend) Fatal("fontdesc: field too long (%s line %d)", fdname, fdline); } if (fdch == EOF) Fatal("fontdesc: %c not closed (%s line %d)", FDQUO, fdname, fdline); *field = '\0'; fdch = getc(fdf); } else getfield(field); } getqfield(field) char *field; { skipblanks(); getqfield0(field); } #ifdef UNDEF getoqfield(field) char *field; { skipblanks0(); if (fdch != '\n') getqfield0(field); else *field = '\0'; } #endif getlfield(field) char *field; { char *fend; int c; skipblanks(); for (fend = field+STRSIZE-1; fdch != '\n' && fdch != EOF; fdch = getc(fdf)) { if (fdch == '\\') if ((c = getc(fdf)) != '\n') { (void)ungetc(c, fdf); } else { fdch = ' '; } if (field < fend) *field++ = fdch; else Fatal("fontdesc: field too long (%s line %d)", fdname, fdline); } *field = '\0'; } struct confop skipcop = { "", skipline }; struct confop * findconfop(field) char *field; { struct confop **co; for (co = confops; *co != NULL; co++) if (STREQ((*co)->co_name, field)) return *co; Warning("fontdesc: %s illegal (%s line %d)", field, fdname, fdline); return &skipcop; } /* * configuration operations */ void getfontdesc(); struct confop fdcop = { "fontdesc", getfontdesc }; void getfontdesc() { char field_file[PATHLEN]; char path[PATHLEN]; getfield(field_file); skipline(); defexpand(path, field_file); read_fontdesc(path, FALSE); } void arg_fontdesc(fdn) char *fdn; { char path[PATHLEN]; defexpand(path, fdn); read_fontdesc(path, TRUE); } void getfdfont(); struct confop fontcop = { "font", getfdfont }; void getfdvfont(); struct confop vfontcop = { "vfont", getfdvfont }; struct fontdesc { struct fontop *fd_op; char *fd_spec; /* specifier */ /* not used */ int fd_sub; /* font substitution */ struct funcfont *fd_path; /* prototype path */ struct fontdesc *fd_next; }; static struct fontdesc *fontdescs = NULL; static struct fontdesc **nextfd = &fontdescs; static struct fontdesc *vfontdescs = NULL; static struct fontdesc **nextvfd = &vfontdescs; struct fontdesc * getfontline() { char field_type[STRSIZE]; char field_spec[STRSIZE]; char field_sub[STRSIZE]; char field_path[STRSIZE]; struct fontdesc *fd; struct fontop *fop; struct funcfont *ff; getfield(field_type); if ((fop = findfontop(field_type)) == NULL) { Warning("fontdesc: illegal font type %s (%s line %d)", field_type, fdname, fdline); skipline(); return NULL; } getfield(field_spec); getfield(field_sub); getlfield(field_path); if (!(*fop->fo_init)(field_path, &ff)) { Warning("fontdesc: illegal font line (%s line %d)", fdname, fdline); return NULL; } fd = NEW(struct fontdesc, "fontdesc"); fd->fd_op = fop; fd->fd_spec = strsave(field_spec); fd->fd_sub = atoi(field_sub); fd->fd_path = ff; fd->fd_next = NULL; return fd; } void getfdfont() { struct fontdesc *fd; if ((fd = getfontline()) != NULL) { *nextfd = fd; nextfd = &(fd->fd_next); } } void getfdvfont() { struct fontdesc *fd; if ((fd = getfontline()) != NULL) { *nextvfd = fd; nextvfd = &(fd->fd_next); } } struct fontop * findfontop(type) char *type; { struct fontop **fo; for (fo = fontops; *fo != NULL; fo++) if (STREQ((*fo)->fo_type, type)) return *fo; return NULL; } pathtype_init(proto, ff) char *proto; struct funcfont **ff; { char path[PATHLEN]; defexpand(path, proto); *ff = (struct funcfont *)strsave(path); return TRUE; } void getdef(); struct confop defcop = { "define", getdef }; struct definition { char *def_name; char *def_body; struct definition *def_next; }; static struct definition *definitions = NULL; static struct definition *arg_defs = NULL; add_def0(var, val) char *var, *val; { struct definition *def; def = NEW(struct definition, "definition"); def->def_name = var; def->def_body = val; def->def_next = definitions; definitions = def; } add_def(var, val) char *var, *val; { char path[PATHLEN]; struct definition *def; def = NEW(struct definition, "definition"); def->def_name = strsave(var); defexpand(path, val); def->def_body = strsave(path); def->def_next = definitions; definitions = def; } struct definition * get_def(var, defs) char *var; struct definition *defs; { struct definition *def; for (def = defs; def != NULL; def = def->def_next) if (STREQ(var, def->def_name)) return def; return NULL; } arg_define(def) char *def; { char *val; for (val = def; *val != '=' && *val != '\0'; val++) ; if (*val == '=') *val++ = '\0'; add_def(def, val); arg_defs = definitions; } void getdef() { char field_name[STRSIZE]; char field_body[STRSIZE]; char path[PATHLEN]; struct definition *def; getfield(field_name); getfield(field_body); skipline(); if (get_def(field_name, arg_defs) == NULL) add_def(field_name, field_body); } char * getdefbody(var) char *var; { struct definition *def; return (def = get_def(var, definitions)) != NULL ? def->def_body : ""; } void defexpand(path, proto) char *path, *proto; { char *p, *s, *t; char *pend; char dname[STRSIZE]; for (p = path, s = proto, pend = path+PATHLEN-1; *s != '\0'; s++) if (*s == '$') { if (*++s == '{') { for (t = dname, ++s; *s != '}' && *s != '\0'; s++, t++) *t = *s; if (*s == '\0') --s; /* error */ } else { for (t = dname; isalnum(*s); s++, t++) *t = *s; --s; } *t = '\0'; t = getdefbody(dname); if (p+strlen(t) >= pend) Fatal("font path too long %s", proto); (void)strcpy(p, t); p += strlen(t); } else if (p < pend) { *p++ = *s; } else Fatal("font path too long %s", proto); *p = '\0'; } /* dummy */ /* ARGSUSED */ void add_include(f, top) char *f; BOOLEAN top; { } /* dummy */ /* ARGSUSED */ void add_setup(f, top) char *f; BOOLEAN top; { } #ifdef UNDEF void getsubst(); struct confop substcop = { "subst", getsubst }; struct fontsubst { char *fs_font; int fs_len; int fs_reqmag; int fs_submag; struct fontsubst *fs_next; }; static struct fontsubst *fontsubsts = NULL; static struct fontsubst **nextfs = &fontsubsts; void getsubst() { char field_font[STRSIZE]; char field_reqmag[STRSIZE]; char field_submag[STRSIZE]; struct fontsubst *fs;; getfield(field_font); getfield(field_reqmag); getfield(field_submag); skipline(); fs = NEW(struct fontsubst, "fontsubst"); fs->fs_font = strsave(field_font); fs->fs_len = strlen(field_font); if (strcmp(field_reqmag, "%R") == 0) fs->fs_reqmag = resolution; else fs->fs_reqmag = atoi(field_reqmag); fs->fs_submag = atoi(field_submag); fs->fs_next = NULL; *nextfs = fs; nextfs = &(fs->fs_next); } #endif void getreplfont(); struct confop replfcop = { "replfont", getreplfont }; struct fontreplace { char *fr_replfont; char *fr_font; int fr_ds; int fr_fix; struct fontreplace *fr_next; }; static struct fontreplace *fontreplaces = NULL; static struct fontreplace **nextfr = &fontreplaces; void getreplfont() { char field_replfont[STRSIZE]; char field_font[STRSIZE]; char field_par[STRSIZE]; struct fontreplace *fr; char *c, *f; BOOLEAN fixs; float fx; getfield(field_replfont); getfield(field_font); getfield(field_par); skipline(); fr = NEW(struct fontreplace, "fontreplace"); fr->fr_replfont = strsave(field_replfont); fr->fr_font = strsave(field_font); for (c = field_par; *c != '\0' && *c != ','; c++) ; fixs = *c == ','; *c = '\0'; fr->fr_ds = atoi(field_par)<<16; fr->fr_fix = -1; while (fixs) { for (f = ++c; *c != '\0' && *c != '*'; c++) ; fixs = *c == '*'; *c = '\0'; if (*f == 'f') { if (fr->fr_fix >= 0) fr->fr_fix = scale_exact(fr->fr_fix, atoi(f+1)); else fr->fr_fix = atoi(f+1); } else { (void)sscanf(f, "%f", &fx); if (fr->fr_fix >= 0) fr->fr_fix = scale_exact(fr->fr_fix, (int)(fx*(float)(1<<20))); else fr->fr_fix = (int)(fx*(float)(1<<20)); } } fr->fr_next = NULL; *nextfr = fr; nextfr = &(fr->fr_next); } void getptex(); struct confop ptexcop = { "ptex", getptex }; int dirmode = DIR_ELIM; char *dir_spec_vert; char *dir_spec_end; int dir_spec_vert_len = 0; int dir_spec_end_len = 0; char ds_begin[STRSIZE+5]; char ds_end[STRSIZE+5]; #define get_special(ds_p, ds_len, ds_buf) \ off = 5; \ getqfield(ds_buf+off); \ len = strlen(ds_buf+off); \ if (*(ds_buf+off) == FDQUO) { \ off++; \ len -= 2; \ } \ n = inttob(k, len); \ off -= n+1; \ ds_buf[off] = XXX1+len/256; \ strncpy(ds_buf+off+1, k, n); \ ds_p = ds_buf+off; \ ds_len = 1+n+len; void getptex() { char field_mode[STRSIZE]; int len, off, n; byte k[sizeof(int)]; getfield(field_mode); if (STREQ(field_mode, "keep")) dirmode = DIR_KEEP; else if (STREQ(field_mode, "elim")) dirmode = DIR_ELIM; else if (STREQ(field_mode, "special")) dirmode = DIR_SPECIAL; else if (STREQ(field_mode, "ignore")) dirmode = DIR_IGNORE; else if (STREQ(field_mode, "mark")) dirmode = DIR_MARKLINE; else { Warning("fontdesc: illegal ptex %s (%s line %d)", field_mode, fdname, fdline); dirmode = DIR_ELIM; } if (dirmode == DIR_SPECIAL) { getfield(field_mode); if (STREQ(field_mode, "vert")) { get_special(dir_spec_vert, dir_spec_vert_len, ds_begin); } else if (STREQ(field_mode, "end")) { get_special(dir_spec_end, dir_spec_end_len, ds_end); } } else if (dirmode == DIR_MARKLINE) { getfield(field_mode); if (STREQ(field_mode, "char")) dirmode = DIR_MARKCHAR; } skipline(); } /* * initialize and fix some default values */ char *kpsevname = "kpse"; init_default(def_kpse) char *def_kpse; { add_def0(kpsevname, def_kpse); } fix_default(def_resolution) int def_resolution; { /* use resolution as drift!! */ if (resolution <= 0) resolution = def_resolution; } /* * replace font */ replfont(n, s, rn, rd, rs) char *n; int s; char *rn; int *rd, *rs; { struct fontreplace *fr; char *sb, *se; for (fr = fontreplaces; fr != NULL; fr = fr->fr_next) if (match_subf(fr->fr_replfont, n, FALSE, &sb, &se)) { subst_subf(rn, fr->fr_font, sb, se); *rd = fr->fr_ds; if (fr->fr_fix < 0) *rs = s; else *rs = scale_exact(fr->fr_fix, s); return TRUE; } return FALSE; } /* * init_fontinfo */ init_finfo(fe, fonts) struct font_entry *fe; struct fontdesc *fonts; { struct accarg acca; float rawmagfact, newmagfact; struct fontdesc *fd; int i, next; /*acca.rawmagfact = rawmagfact = newmagfact = dev_fontmag(fe);*/ acca.pv_name = fe->n; /* We don't treat the case fe->a != 0 */ acca.acc_mode = ACC_EXACT; /*acca.actmagfact = actfact(acca.rawmagfact);*/ for (fd = fonts; fd != NULL; fd = fd->fd_next) { if ((*(fd->fd_op->fo_access))(fd->fd_path, fe, &acca)) { #ifdef DEBUG if (Debuguser) Warning("Font info for %s found", fe->n); #endif (*(fd->fd_op->fo_initfontinfo))(fe); return TRUE; } } return FALSE; } void init_fontinfo(fe) struct font_entry *fe; { void init_dvi_fontinfo(); if (!init_finfo(fe, fontdescs)) { /* if missing, pass through dvi */ #ifdef DEBUG if (Debuguser) Warning("Font info for %s not found, used unmodified", fe->n); #endif init_dvi_fontinfo(fe); } } init_vfontinfo(fe) struct font_entry *fe; { return init_finfo(fe, vfontdescs); } /* * Turn a prototype path into a fullpath. */ void pave(path, proto, acca) char *path, *proto; struct accarg *acca; { char *p, *s, *t; char *pend; int len; char buf[32]; #ifdef MSDOS char *l, *b; #endif for (p = path, s = proto, pend = path+PATHLEN-1; *s != '\0'; s++) if (*s == '%') { switch (*++s) { case 'f': case 'n': case 's': #ifdef MSDOS len = strlen(t = acca->pv_name); if ((l = rindex(t, '.')) == NULL) l = t+len; if (l-t > 8) { if (G_longfontname) { (void)strncpy(buf, t, 4); (void)strncpy(buf+4, l-4, 4); } else { (void)strncpy(buf, t, 8); } b = buf+8; } else { (void)strncpy(buf, t, l-t); b = buf+(l-t); } (void)strncpy(b, l, len-(l-t)+1); t = buf; #else t = acca->pv_name; #endif break; case 'd': case 'm': (void)sprintf(t = buf, "%d", acca->pv_mag); break; case 'M': (void)sprintf(t = buf, "%f", acca->actmagfact); break; case 'R': (void)sprintf(t = buf, "%d", resolution); break; case 'F': t = acca->pv_fam; break; case 'D': (void)sprintf(t = buf, "%d", acca->pv_ds); break; case 'j': t = acca->pv_jsub; break; default: *(t = buf) = *s; *(t+1) = '\0'; break; } if (p + (len = strlen(t)) <= pend) { (void)strncpy(p, t, len); p += len; } else Fatal("font path too long %s", proto); } else if (p < pend) { *p++ = *s; } else Fatal("font path too long %s", proto); *p = '\0'; } #ifdef KPATHSEA static char pathk[PATHLEN], pathk0[PATHLEN], base[PATHLEN]; void pavek(path, pathp, basep, proto, acca) char *path, **pathp, **basep, *proto; struct accarg *acca; { char *p, *pthk; pave(pathk, proto, acca); if (strncmp(pathk, "//", 2) == 0) { (void)strcpy(pathk0, dvi2lib); (void)strcat(pathk0, "/"); (void)strcat(pathk0, pathk+2); pthk = pathk0; } else pthk = pathk; (void)strcpy(path, pthk); *pathp = pthk; for (p = pthk+strlen(pthk)-1; p >= pthk; --p) if (*p == '/' || *p == '}') break; if (p < pthk) { *basep = pthk; *pathp = NULL; } else if (*++p != '\0') { strcpy(base, p); *basep = base; *p = '\0'; } else { *basep = NULL; } } #endif dvi2dvi-2.0-alpha/scanfont.c100644 163 163 6723 5733507466 15346 0ustar sakuraisakurai#include "defs.h" #include "commands.h" #include "dconv.h" #include "set.h" #include "global.h" /* * prescan fonts and mark chars used in dvi */ scanfont(PreLoad, hdfip) BOOLEAN PreLoad; /* TRUE if all necessary fonts are loaded */ struct font_index **hdfip; /* *hdfip is not changed if PreLoad */ { int SkipMode = FALSE; /* in skip mode flag */ int command; /* current command */ int count[10]; /* the 10 counters at begining of each page */ int sp; /* stack pointer */ struct { int d; /* pTeX */ } stack[STACKSIZE]; /* stack */ int basedir; int i; /* command parameter; loop index */ int k; /* temporary parameter */ int val, val2; /* temporarys to hold command information*/ basedir = dir; sp = 0; while (TRUE) switch (command=DC_getcommand()) { case SET1:case SET2:case SET3:case SET4: val = DC_getuint(command-SET1+1); if (!SkipMode) MarkChar(val); break; case SET_RULE: case PUT_RULE: DC_skipbytes(8); break; case PUT1:case PUT2:case PUT3:case PUT4: val = DC_getuint(command-PUT1+1); if (!SkipMode) MarkChar(val); break; case NOP: break; case BOP: /* vf check */ for (i=0; i<=9; i++) count[i] = DC_getuint(4); (void)DC_getuint(4); dir = HOR; basedir = HOR; sp = 0; setcurfont((struct font_entry *)NULL); SkipMode = (count[0] < FirstPage || count[0] > LastPage); if (!G_quiet) { (void)fprintf(stderr, "."); (void)fflush(stderr); } break; case EOP: break; case PUSH: if (sp >= STACKSIZE) Fatal("stack overflow"); stack[sp].d = dir; sp++; break; case POP: --sp; if (sp < 0) Fatal("stack underflow"); dir = stack[sp].d; break; case RIGHT4: case X4: case W4: case Y4: case Z4: case DOWN4: DC_skipbytes(4); break; case RIGHT3: case X3: case W3: case Y3: case Z3: case DOWN3: DC_skipbytes(3); break; case RIGHT2: case X2: case W2: case Y2: case Z2: case DOWN2: DC_skipbytes(2); break; case RIGHT1: case X1: case W1: case Y1: case Z1: case DOWN1: DC_skipbytes(1); break; case X0: case W0: case Y0: case Z0: break; case FNT1:case FNT2:case FNT3:case FNT4: k = DC_getuint(command-FNT1+1); if (!SkipMode) SetFntNum(k, *hdfip); break; case XXX1:case XXX2:case XXX3:case XXX4: if ((k = DC_getuint(command-XXX1+1))+1 > SpecialSize) { SpecialSize = k+1; if ((SpecialStr = realloc(SpecialStr, (unsigned)SpecialSize)) == NULL) Fatal("can't malloc space for special"); } DC_getbytes(SpecialStr, k); if (!SkipMode) dev_predospecial(SpecialStr, k); break; case FNT_DEF1:case FNT_DEF2:case FNT_DEF3:case FNT_DEF4: /* vf check */ k = DC_getuint(command-FNT_DEF1+1); if (PreLoad || HasBeenRead(k, *hdfip)) SkipFontDef(); else ReadFontDef(k, hdfip); break; case PRE: /* vf check */ Fatal("PRE occurs within file"); break; case POST: return; break; case POST_POST: /* vf check */ Fatal("POST_POST with no preceding POST"); break; case DIR: dir = (basedir+DC_getuint(1))%NDIR; break; default: if (command >= FONT_00 && command <= FONT_63) { if (!SkipMode) SetFntNum(command-FONT_00, *hdfip); } else if (command >= SETC_000 && command <= SETC_127) { if (!SkipMode) MarkString(command); } else Fatal("%d is an undefined command", command); break; } } dvi2dvi-2.0-alpha/virfont.c100644 163 163 30002 7054267421 15215 0ustar sakuraisakurai/* * virtual font */ #include "defs.h" #include "dconv.h" #include "set.h" #include "global.h" #include "virfont.h" #ifdef KPATHSEA #include #endif int vftype_access(); void init_vf_fontinfo(); void init_jvf_fontinfo(); struct fontop vfop = { "vf", pathtype_init, vftype_access, init_vf_fontinfo, }; struct fontop jvfop = { "jvf", pathtype_init, vftype_access, init_jvf_fontinfo, }; vftype_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { char *filename; BOOLEAN ok; #ifdef KPATHSEA if (ok = ((filename = kpsearch_make(proto, fe->n, kpse_vf_format, acca, fe->name)) != NULL)) strcpy(fe->name, filename); #else pave(fe->name, proto, acca); ok = access(fe->name, R_OK) == 0; #endif #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "trying to access %s\n", fe->name); #endif return ok; } void init_vf_fontinfo(fe) struct font_entry *fe; { int vf_markchar(); void read_vf_fontinfo(); read_vf_dviinfo(fe); fe->fnt_type = FT_VF; fe->fnt_markchar = vf_markchar; fe->fnt_readfontinfo = read_vf_fontinfo; } void init_jvf_fontinfo(fe) struct font_entry *fe; { int jvf_markchar(); void read_jvf_fontinfo(); read_jvf_dviinfo(fe); fe->fnt_type = FT_VF; fe->fnt_markchar = jvf_markchar; fe->fnt_readfontinfo = read_jvf_fontinfo; } #define CODE_NORMAL 0 #define CODE_JIS 1 #define NJISCHARS (94*94+1) #define JISDEFAULT (94*94) read_vf_dviinfo(fe) struct font_entry *fe; { read_vf_di(fe, CODE_NORMAL); } read_jvf_dviinfo(fe) struct font_entry *fe; { read_vf_di(fe, CODE_JIS); } read_vf_di(fe, coding) struct font_entry *fe; int coding; { FILE *fntfp; int cmd, t; int ds; int k, c, s, d, a, l; byte n[STRSIZE]; struct font_index *fip; struct vfchar_entry *ce; int pl, cc, idx, tfm; int misschar = 0; struct virfntinfo *alloc_virfinfo(); openfontfile(fe); fntfp = fe->openfile; if (getuint(fntfp,1) != VF_PRE || getuint(fntfp,1) != VF_ID) Fatal("bad vf file %s\n", fe->name); (void)fseek(fntfp, (long)getuint(fntfp, 1), SEEK_CUR); /* comment */ if ((t = getuint(fntfp, 4)) && fe->c && t != fe->c) Warning("font = \"%s\",\n-->font checksum = %d,\n-->dvi checksum = %d", fe->name, fe->c, t); ds = getuint(fntfp, 4); /* design size */ virfinfo(fe) = alloc_virfinfo((coding == CODE_NORMAL) ? MAXVFCHAR+1 : NJISCHARS); for (; (cmd = getuint(fntfp,1)) >= VF_FNT_DEF1 && cmd <= VF_FNT_DEF4; ) { k = getuint(fntfp, cmd-VF_FNT_DEF1+1); c = getuint(fntfp, 4); /* checksum */ s = scale(fe->s, getuint(fntfp, 4)); /* scaled size */ d = getuint(fntfp, 4) >> 4; /* design size (pt -> sp) */ a = getuint(fntfp, 1); /* area length for font name */ l = getuint(fntfp, 1); /* device length */ getbytes(fntfp, n, a+l); n[a+l] = '\0'; readfontdef(k, c, s, d, a, l, (char *)n, &(virfinfo(fe)->vf_fontidx)); } if (virfinfo(fe)->vf_fontidx == NULL) { virfinfo(fe)->vf_default_fent = NULL; } else { for (fip = virfinfo(fe)->vf_fontidx; fip->next != NULL; fip = fip->next) ; virfinfo(fe)->vf_default_fent = fip->fent; } for (;; cmd = getuint(fntfp, 1)) { if (cmd <= VF_LONG_CHAR) { if (cmd == VF_LONG_CHAR) { pl = getuint(fntfp, 4); cc = getuint(fntfp, 4); tfm = getuint(fntfp, 4); } else { pl = cmd; cc = getuint(fntfp, 1); tfm = getuint(fntfp, 3); } if (coding == CODE_NORMAL) { if (cc > MAXVFCHAR) { misschar++; #ifdef DEBUG if (Debug) (void)fprintf(stderr, "cc 0x%x in vf file %s (skipped)\n", cc, fe->name); #endif (void)fseek(fntfp, (long)pl, SEEK_CUR); continue; } else ce = &virfinfo(fe)->ch[cc]; } else { if (cc == 0) ce = &virfinfo(fe)->ch[JISDEFAULT]; else if ((idx = jis_to_idx94(cc)) < 0) { misschar++; #ifdef DEBUG if (Debug) (void)fprintf(stderr, "cc 0x%x in vf file %s (skipped)\n", cc, fe->name); #endif (void)fseek(fntfp, (long)pl, SEEK_CUR); continue; } else ce = &virfinfo(fe)->ch[idx]; } ce->tfmw = scale(tfm, fe->s); if (pl == 0) ce->vfdstat = VFD_NULL; else { ce->vfdstat = VFD_NOTLD; ce->vfd.dvi.dvilen = pl; ce->vfd.dvi.where.fileoffset = ftell(fntfp); (void)fseek(fntfp, (long)pl, SEEK_CUR); } } else if (cmd == VF_POST) { break; } else Fatal("illegal vf command %d in %s\n", cmd, fe->name); } if (misschar > 0) { Warning("char(s) in vf file %s skipped", fe->name); /* There is no ground for the number NJISCHARS/2. */ if (coding == CODE_NORMAL && misschar >= NJISCHARS/2) Warning("\t\"font vf\" may be the mistake of \"font jvf\""); else if (coding == CODE_JIS) Warning("\t\"font jvf\" may be the mistake of \"font vf\""); } } struct virfntinfo * alloc_virfinfo(nchars) int nchars; { struct virfntinfo *vfi; struct vfchar_entry *ce; int i; vfi = (struct virfntinfo *) alloc_check(malloc((unsigned)sizeof(struct virfntinfo)+ (nchars-1)*sizeof(struct vfchar_entry)), "virfont info"); vfi->vf_fontidx = NULL; for (i = 0; i < nchars; i++) { ce = &(vfi->ch[i]); ce->vfdstat = VFD_UNDEF; ce->tfmw = 0; } return vfi; } vf_markchar(fe, c) struct font_entry *fe; int c; { if (c > MAXVFCHAR) { #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "char 0x%x (font %s) too big\n", c, fe->n); #endif } else vf_mc(fe, &virfinfo(fe)->ch[c], c); } jvf_markchar(fe, c) struct font_entry *fe; int c; { int idx; if ((idx = jis_to_idx94(c)) < 0) { #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "char 0x%x (font %s) invalid\n", c, fe->n); #endif } else vf_mc(fe, &virfinfo(fe)->ch[idx], c); } byte * getvfdvi(fe, ce) struct font_entry *fe; struct vfchar_entry *ce; { int dvilen; byte *dvip, *dp; FILE *fntfp; openfontfile(fe); fntfp = fe->openfile; (void)fseek(fntfp, (long)ce->vfd.dvi.where.fileoffset, SEEK_SET); dvilen = ce->vfd.dvi.dvilen; if ((dvip = (byte *)malloc((unsigned)dvilen)) == NULL) Fatal("Unable to allocate memory for vf char\n"); (void)fread((char *)dvip, 1, dvilen, fntfp); return dvip; } vf_mc(fe, ce, c) struct font_entry *fe; struct vfchar_entry *ce; int c; { int cmd, dvilen, k; struct vfchar_entry *defce; byte *dvip, *dp; struct font_index *fi; struct dconv save_curdconv, *save_curdconvp; struct font_entry *save_curfontent; int save_dir; if (ce->vfdstat >= VFD_NULL) return; if (ce->vfdstat == VFD_UNDEF) { if ((defce = &virfinfo(fe)->ch[JISDEFAULT])->vfdstat == VFD_UNDEF) Fatal("char %d in vf file %s is not defined", c, fe->n); if (defce->vfdstat == VFD_NOTLD) { defce->vfd.dvi.where.dviptr = getvfdvi(fe, defce); defce->vfdstat = VFD_NULL; } dvilen = ce->vfd.dvi.dvilen = defce->vfd.dvi.dvilen; if ((dvip = (byte *)malloc((unsigned)dvilen)) == NULL) Fatal("Unable to allocate memory for vf char\n"); /* Hack. depend on the fact that default char is of the form ... SET2 0x2121. */ memcpy(dvip, defce->vfd.dvi.where.dviptr, dvilen); *(dvip+dvilen-2) = c>>8; *(dvip+dvilen-1) = c&0xff; ce->tfmw = defce->tfmw; } else { dvip = getvfdvi(fe, ce); dvilen = ce->vfd.dvi.dvilen; } /* short cut for simple cases */ ce->vfdstat = VFD_DVI; if (setc_com(cmd = *dvip, dvip, dvilen, ce)) { ce->vfdstat = VFD_SETFC; ce->vfd.set.f = virfinfo(fe)->vf_default_fent; } else if (FONT_00 <= cmd && cmd <= FNT4) { if (cmd <= FONT_63) { --dvilen; dp = dvip+1; } else { dvilen -= cmd-FNT1+2; dp = dvip+cmd-FNT1+2; } if (setc_com(*dp, dp, dvilen, ce)) { ce->vfdstat = VFD_SETFC; k = (cmd <= FONT_63) ? cmd-FONT_00 : makeuint(dvip+1, cmd-FNT1+1); for (fi = virfinfo(fe)->vf_fontidx; fi != NULL && fi->k != k; fi = fi->next) ; ce->vfd.set.f = fi->fent; } } if (ce->vfdstat == VFD_SETFC) { save_curfontent = curfontent; setcurfont(ce->vfd.set.f); MarkChar(ce->vfd.set.c); setcurfont(save_curfontent); free((char *)dvip); return; } ce->vfd.dvi.where.dviptr = dvip; /* save */ save_curdconvp = curdconvp; curdconvp->dc_bufbeg = dc_bufbeg; save_curdconv = *curdconvp; vfd_dconv_templ.dc_bufbeg = dvip; vfd_dconv_templ.dc_bufend = dvip+ce->vfd.dvi.dvilen; /*vfd_dconv_templ.dc_scale = fe->s;*/ setcurdconv(&vfd_dconv_templ); save_curfontent = curfontent; setcurfont(virfinfo(fe)->vf_default_fent); save_dir = dir; scanfont(TRUE, &(virfinfo(fe)->vf_fontidx)); /* restore */ *save_curdconvp = save_curdconv; setcurdconv(save_curdconvp); setcurfont(save_curfontent); dir = save_dir; } setc_com(cmd, dvip, dvilen, ce) byte cmd; byte *dvip; int dvilen; struct vfchar_entry *ce; { if (cmd <= SETC_127 && dvilen <= 1) { ce->vfd.set.c = cmd; return TRUE; } else if (SET1 <= cmd && cmd <= SET4 && dvilen == cmd-SET1+2) { ce->vfd.set.c = makeuint(dvip+1, dvilen-1); return TRUE; } return FALSE; } void read_vf_fontinfo(fe) struct font_entry *fe; { DEV_FONT vf_fontdict(); int vf_setchar(), vf_setstring(); fe->rvf_setchar = virf_setchar; fe->rvf_setstring = virf_setstring; fe->dev_fontdict = vf_fontdict; fe->dev_setchar = vf_setchar; fe->dev_setstring = vf_setstring; } void read_jvf_fontinfo(fe) struct font_entry *fe; { DEV_FONT vf_fontdict(); int jvf_setchar(), jvf_setstring(); fe->rvf_setchar = virf_setchar; fe->rvf_setstring = virf_setstring; fe->dev_fontdict = vf_fontdict; fe->dev_setchar = jvf_setchar; fe->dev_setstring = jvf_setstring; } /* ARGSUSED */ DEV_FONT vf_fontdict(fe, c) struct font_entry *fe; int c; { Fatal("%s implementation error: vf_fontdict", G_progname); } vf_setchar(fe, c) struct font_entry *fe; int c; { if (c > MAXVFCHAR) return 0; else return vf_sc(fe, &virfinfo(fe)->ch[c], c); } jvf_setchar(fe, c) struct font_entry *fe; int c; { int idx; if ((idx = jis_to_idx94(c)) < 0) return 0; else return vf_sc(fe, &virfinfo(fe)->ch[idx], c); } /* ARGSUSED */ vf_sc(fe, ce, c) struct font_entry *fe; struct vfchar_entry *ce; int c; { struct dconv save_curdconv, *save_curdconvp; struct font_entry *save_curfontent; int save_h, save_v, save_dir; BOOLEAN save_chmove; if (ce->vfdstat == VFD_SETFC) { if (ce->vfd.set.f->fnt_type == FT_TFM) { dev_vftfm_char(ce->vfd.set.f, ce->vfd.set.c, ce->tfmw); } else if (ce->vfd.set.f->fnt_type == FT_JFM) { dev_vfjfm_char(ce->vfd.set.f, ce->vfd.set.c, ce->tfmw); } else { save_curfontent = curfontent; setcurfont(ce->vfd.set.f); save_chmove = chmove; SetChar(ce->vfd.set.c, FALSE); setcurfont(save_curfontent); chmove = save_chmove; if (chmove) dev_makemoveover(ce->tfmw); } return ce->tfmw; } if (ce->vfdstat == VFD_NULL) { if (chmove) dev_makemoveover(ce->tfmw); return ce->tfmw; } /* save */ save_curdconvp = curdconvp; curdconvp->dc_bufbeg = dc_bufbeg; save_curdconv = *curdconvp; vfd_dconv_templ.dc_bufbeg = ce->vfd.dvi.where.dviptr; vfd_dconv_templ.dc_bufend = ce->vfd.dvi.where.dviptr+ce->vfd.dvi.dvilen; vfd_dconv_templ.dc_scale = fe->s; setcurdconv(&vfd_dconv_templ); save_curfontent = curfontent; setcurfont(virfinfo(fe)->vf_default_fent); save_h = h; save_v = v; save_dir = dir; save_chmove = chmove; dev_push(); dviconv(virfinfo(fe)->vf_fontidx); dev_pop(); /* restore */ *save_curdconvp = save_curdconv; setcurdconv(save_curdconvp); setcurfont(save_curfontent); h = save_h; v = save_v; setdir(save_dir, TRUE); chmove = save_chmove; if (chmove) dev_makemoveover(ce->tfmw); return ce->tfmw; } vf_setstring(fe, s, len) struct font_entry *fe; unsigned char *s; int len; { unsigned char *sp; /* should be optimized */ for (sp = s; sp < s+len; sp++) *move += vf_setchar(fe, *sp); } jvf_setstring(fe, s, len) struct font_entry *fe; unsigned char *s; int len; { unsigned char *sp; /* should be optimized */ for (sp = s; sp < s+len; sp++) *move += jvf_setchar(fe, *sp); } dvi2dvi-2.0-alpha/vfdcom.c100644 163 163 4651 7054277731 15004 0ustar sakuraisakurai/* * funtions for analyzing dvi in vf-file (vfd stands for vf-file dvi) */ #include "defs.h" #include "commands.h" #include "dconv.h" #include "global.h" int vfd_getcommand(); void vfd_backupone(); void vfd_getbytes(); void vfd_skipbytes(); int vfd_getuint(); int vfd_getint(); void vfd_movedown(); void vfd_movedown_v(); void vfd_moveover(); void vfd_moveover_v(); void vfd_setrule(); void vfd_setrule_v(); struct dconv vfd_dconv_templ = { vfd_getcommand, vfd_backupone, vfd_getbytes, vfd_skipbytes, vfd_getuint, vfd_getint, NULL, NULL, NULL, vfd_movedown, vfd_movedown_v, vfd_moveover, vfd_moveover_v, vfd_setrule, vfd_setrule_v, 0 }; vfd_dirkeep() { vfd_dconv_templ.dc_movedown_v = vfd_dconv_templ.dc_movedown; vfd_dconv_templ.dc_moveover_v = vfd_dconv_templ.dc_moveover; vfd_dconv_templ.dc_setrule_v = vfd_dconv_templ.dc_setrule; } int vfd_getcommand() { dc_bufbeg++; return (dc_bufbeg > dc_bufend ? POST : *(dc_bufbeg-1)); } void vfd_backupone() { --dc_bufbeg; } void vfd_getbytes(cp, n) char *cp; int n; { (void)strncpy(cp, (char *)dc_bufbeg, n); dc_bufbeg += n; } void vfd_skipbytes(n) int n; { dc_bufbeg += n; } int vfd_getuint(n) int n; { int x; x = makeuint(dc_bufbeg, n); dc_bufbeg += n; return x; } int vfd_getint(n) int n; { int x; x = makeint(dc_bufbeg, n); dc_bufbeg += n; return x; } extern int command; void vfd_movedown(a, n) byte *a; int n; { if (n == 0) dev_move0(command); else dev_makemove(scale(makeint(a, n), dc_scale), command-n); } void vfd_movedown_v(a, n, l) byte *a; int n, l; { if (DOWN1 <= command && command <= DOWN4) l = makeint(a, n); dev_makemove(-scale(l, dc_scale), RIGHT1-1); } void vfd_moveover(b, n) byte *b; int n; { if (n == 0) dev_move0(command); else dev_makemove(scale(makeint(b, n), dc_scale), command-n); } void vfd_moveover_v(b, n, l) byte *b; int n, l; { if (RIGHT1 <= command && command <= RIGHT4) l = makeint(b, n); dev_makemove(scale(l, dc_scale), DOWN1-1); } void vfd_setrule(a, b, Set) /* this routine will draw a rule */ byte *a, *b; BOOLEAN Set; { dev_setrule(scale(makeint(a, 4), dc_scale), scale(makeint(b, 4), dc_scale), command); } void vfd_setrule_v(a, b, Set) /* this routine will draw a rule */ byte *a, *b; BOOLEAN Set; { d_setrule_v(scale(makeint(a, 4), dc_scale), scale(makeint(b, 4), dc_scale), Set); } dvi2dvi-2.0-alpha/bifont.c100644 163 163 22222 7202042036 15000 0ustar sakuraisakurai/* * built-in font */ #include "defs.h" #include "global.h" #include "bifont.h" #include "jsub.h" #ifdef KPATHSEA #include #include #endif /* There are three kinds of tfm files, e.g. Times-Roman.tfm, Courier.tfm, ... XXjhira10.tfm, XXja10.tfm, ... (XX: japanese font) XX.tfm, ... (jfm format, XX: japanese font) The first one: (TYPE tfm) easy. The second one: (TYPE jstfm) dev_font: assgined when XX first appears dev_ku, dev_ten: calculated from j?? and charcode The third one: (TYPE jfm) easy, but tfmw information can be stored efficiently by using jfm structure */ /* tfm_access, jstfm_access, jfm_access may be device dependent, because not all devices allow arbitrary magnification. */ int tfm_access(); int jstfm_access(); int jfm_access(); void init_tfm_fontinfo(); void init_jstfm_fontinfo(); void init_jfm_fontinfo(); struct fontop tfmop = { "tfm", pathtype_init, tfm_access, init_tfm_fontinfo, }; #ifdef UNDEF struct fontop jstfmop = { "jstfm", pathtype_init, jstfm_access, init_jstfm_fontinfo, }; #endif struct fontop jfmop = { "jfm", pathtype_init, tfm_access, init_jfm_fontinfo, }; struct biaccessinfo biainfo; /* set by readtfm, readjfm */ static byte width[4*256]; static int id, nt, lh, bc, ec, nw; #define JSTFMHEAD 4*2 static byte header[JSTFMHEAD]; /* TYPE: tfm */ tfm_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { char *filename; BOOLEAN ok; #ifdef KPATHSEA if (ok = ((filename = kpsearch_make(proto, fe->n, kpse_tfm_format, acca, fe->name)) != NULL)) strcpy(fe->name, filename); #else pave(fe->name, proto, acca); ok = access(fe->name, R_OK) == 0; #endif #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "trying to access %s\n", fe->name); #endif if (ok) { fe->finfo = (struct finfo *)&biainfo; return TRUE; } return FALSE; } void init_tfm_fontinfo(fe) struct font_entry *fe; { int null_markchar(); void read_tfm_fontinfo(), read_jfm_fontinfo(); bfinfo(fe) = biaccinfo(fe)->bf; openfontfile(fe); if (checkjfm(fe->openfile)) { fe->fnt_type = FT_JFM; /*fe->base_fe->fnt_use = FU_USED;*/ fe->fnt_markchar = null_markchar; fe->fnt_readfontinfo = read_jfm_fontinfo; } else { fe->fnt_type = FT_TFM; /*fe->base_fe->fnt_use = FU_USED;*/ fe->fnt_markchar = null_markchar; fe->fnt_readfontinfo = read_tfm_fontinfo; } } void read_tfm_finfo(fe) struct font_entry *fe; { FILE *fntfp; struct tfmchar_entry *ce; int i; SCALED s; openfontfile(fe); readtfm(fntfp = fe->openfile); tfmfinfo(fe)->lastfntchar = ec; s = (SCALED)fe->s; for (i = bc, ce = (tfmfinfo(fe)->ch)+bc; i <= ec; i++, ce++) { /* ce->dev_font = fe->k; /* Not used */ ce->dev_char = i; ce->tfmw = scale(makeuint(width+4*getuint(fntfp,1),4), s); (void)fseek(fntfp, 3L, SEEK_CUR); } } void read_tfm_fontinfo(fe) struct font_entry *fe; { struct tfmfntinfo *tfmfi; tfmfi = NEW(struct tfmfntinfo, "tfmfont info"); tfmfi->tfm_bf = bfinfo(fe); tfmfinfo(fe) = tfmfi; read_tfm_finfo(fe); dev_tfm_initfe(fe); dev_tfm_initfontdict(fe); } #ifdef UNDEF /* ARGSUSED */ DEV_FONT tfm_fontdict(fe, c) struct font_entry *fe; int c; { return fe->k; } #endif #ifdef UNDEF /* TYPE: jstfm */ struct jsubshare *jsubshares = NULL; struct jsubshare **nextjss = &jsubshares; struct jsubshare * getjsubshare(fe) struct font_entry *fe; { int s; struct jsubshare *jss; struct bifont *jbf; s = fe->s; jbf = biaccinfo(fe)->bf; for (jss = jsubshares; jss != NULL; jss = jss->jss_next) if (jss->jss_s == s && jss->jss_bf == jbf) { return jss; } jss = NEW(struct jsubshare, "jsubshare"); jss->jss_s = s; jss->jss_bf = jbf; jss->jss_stat = JSS_CLOSED; jss->jss_next = NULL; *nextjss = jss; nextjss = &(jss->jss_next); return jss; } jstfm_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { int dev_is_jstfm(); return gentfm_access(proto, fe, acca, dev_is_jstfm); } void init_jstfm_fontinfo(fe) struct font_entry *fe; { struct jstfmfntinfo *jsfi; int null_markchar(); void read_jstfm_fontinfo(); void init_jswl_fontinfo(), init_jsft_fontinfo(), init_jsvfl_fontinfo(); jsfi = NEW(struct jstfmfntinfo, "jstfmfont info"); jsfi->jsubfont = biaccinfo(fe)->jsubf; jsfi->js_bf = biaccinfo(fe)->bf; jsfi->js_share = getjsubshare(fe); jstfmfinfo(fe) = jsfi; switch (dev_jstfm_kind(fe)) { case MF_KIND_PRINTER: fe->fnt_markchar = null_markchar; fe->fnt_readfontinfo = read_jstfm_fontinfo; break; case MF_KIND_TYPE1: init_jswl_fontinfo(fe); break; case MF_KIND_FT: case MF_KIND_FTO: init_jsft_fontinfo(fe); break; case MF_KIND_VFLIB: case MF_KIND_VFLIBO: init_jsvfl_fontinfo(fe); break; default: Fatal("%s implementation error: init_jstfm_fontinfo", G_progname); } } void read_jstfm_finfo(fe) struct font_entry *fe; { FILE *fntfp; struct jstfmchar_entry *ce; int i; SCALED s; int subfont; openfontfile(fe); readtfm(fntfp = fe->openfile); if (lh <= 2 || makeuint(header, 4) != JSTFM_MAGIC) Fatal("%s is not japanese subfont", fe->name); subfont = header[JSTFMHEAD-1]; if (subfont != jstfmfinfo(fe)->jsubfont) Warning("%s has subfont number %d", fe->name, subfont); jstfmfinfo(fe)->lastfntchar = ec; s = (SCALED)fe->s; for (i = bc, ce = (jstfmfinfo(fe)->ch)+bc; i <= ec; i++, ce++) { jsub_to_jis(subfont, i, &(ce->dev_ku), &(ce->dev_ten)); ce->tfmw = scale(makeuint(width+4*getuint(fntfp,1),4), s); (void)fseek(fntfp, 3L, SEEK_CUR); } } void read_jstfm_fontinfo(fe) struct font_entry *fe; { struct jsubshare *jss; read_jstfm_finfo(fe); dev_jstfm_initfe(fe); jss = jstfmfinfo(fe)->js_share; if (jss->jss_stat < JSS_READ) { dev_jstfm_initfontdict(fe); jss->jss_stat = JSS_READ; } jstfmfinfo(fe)->dev_font = jss->jss_dev_font; } /* ARGSUSED */ DEV_FONT jstfm_fontdict(fe, c) struct font_entry *fe; int c; { return jstfmfinfo(fe)->dev_font; } #endif /* TYPE: jfm */ #ifdef UNDEF jfm_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { int dev_is_jfm(); return gentfm_access(proto, fe, acca, dev_is_jfm); } #endif void init_jfm_fontinfo(fe) struct font_entry *fe; { int null_markchar(); void read_jfm_fontinfo(); bfinfo(fe) = biaccinfo(fe)->bf; fe->fnt_type = FT_JFM; /*fe->base_fe->fnt_use = FU_USED;*/ fe->fnt_markchar = null_markchar; fe->fnt_readfontinfo = read_jfm_fontinfo; } void read_jfm_finfo(fe) struct font_entry *fe; { FILE *fntfp; struct jfmtype_entry *te; struct jfmchar_entry *ce; int i; SCALED s; openfontfile(fe); if (!readjfm(fntfp = fe->openfile)) Fatal("%s is not jfm file", fe->name); jfmfinfo(fe)->nctype = nt; jfmfinfo(fe)->ctype = NEWTAB(struct jfmtype_entry, nt, "jfmtype table"); for (i = 0, te = jfmfinfo(fe)->ctype; i < nt; i++, te++) { te->jfm_code = getuint(fntfp, 2); te->jfm_type = getuint(fntfp, 2); } jfmfinfo(fe)->lasttypecode = (te-1)->jfm_code; jfmfinfo(fe)->ch = NEWTAB(struct jfmchar_entry, ec+1, "jfmchar table"); s = (SCALED)fe->s; for (i = bc, ce = (jfmfinfo(fe)->ch)+bc; i <= ec; i++, ce++) { ce->tfmw = scale(makeuint(width+4*getuint(fntfp,1),4), s); (void)fseek(fntfp, 3L, SEEK_CUR); } } void read_jfm_fontinfo(fe) struct font_entry *fe; { struct jfmfntinfo *jfmfi; jfmfi = NEW(struct jfmfntinfo, "jfmfont info"); jfmfi->jfm_bf = bfinfo(fe); jfmfinfo(fe) = jfmfi; read_jfm_finfo(fe); dev_jfm_initfe(fe, id); dev_jfm_initfontdict(fe); } getctype(c, jfmfi) int c; struct jfmfntinfo *jfmfi; { int m; int left, right; struct jfmtype_entry *te; int code; if (c > jfmfi->lasttypecode) return 0; for (left = 0, right = jfmfi->nctype, te = jfmfi->ctype; left <= right;) { m = (left+right)/2; if (c < (code = (te+m)->jfm_code)) right = m-1; else if (c > code) left = m+1; else if (c == code) return (te+m)->jfm_type; } return 0; } /* utilities */ readtfm(fntfp) FILE *fntfp; { (void)fseek(fntfp, 2L, SEEK_SET); /* lf */ lh = getuint(fntfp, 2); bc = getuint(fntfp, 2); ec = getuint(fntfp, 2); nw = getuint(fntfp, 2); (void)fseek(fntfp, 8*4L, SEEK_SET); getbytes(fntfp, header, (lh-2)*4 > JSTFMHEAD ? JSTFMHEAD : (lh-2)*4); (void)fseek(fntfp, (6+lh+(ec-bc)+1)*4L, SEEK_SET); getbytes(fntfp, width, 4*nw); (void)fseek(fntfp, (6+lh)*4L, SEEK_SET); /* ready to read char_info */ } checkjfm(fntfp) FILE *fntfp; { int id; if ((id=getuint(fntfp, 2)) != JFM_ID && id != TJFM_ID) return FALSE; } readjfm(fntfp) FILE *fntfp; { if ((id=getuint(fntfp, 2)) != JFM_ID && id != TJFM_ID) return FALSE; nt = getuint(fntfp, 2); (void)fseek(fntfp, 2L, SEEK_CUR); /* lf */ lh = getuint(fntfp, 2); bc = getuint(fntfp, 2); /* bc should be 0 */ ec = getuint(fntfp, 2); nw = getuint(fntfp, 2); (void)fseek(fntfp, (7+lh+nt+(ec-bc)+1)*4L, SEEK_SET); getbytes(fntfp, width, 4*nw); (void)fseek(fntfp, (7+lh)*4L, SEEK_SET); /* ready to read char_type and char_info */ return TRUE; } dvi2dvi-2.0-alpha/compfont.c100644 163 163 12653 6505011336 15357 0ustar sakuraisakurai/* compose font from subfonts */ #include "defs.h" #include "set.h" #include "global.h" #include "funcfont.h" #include "jsub.h" int comptype_init(); int comptype_access(); void init_comp_fontinfo(); struct fontop cmpop = { "comp", comptype_init, comptype_access, init_comp_fontinfo, }; comptype_init(pars, ff) char *pars; struct comp **ff; { char *p1, *p2; int dt; struct comp *ffcmp; if (!getstrtok(pars, ',', &p1)) return FALSE; if (!getstrtok(p1, '\0', &p2)) return FALSE; dt = STREQ(p1, "ntt") ? CMP_NTT : CMP_DCD; ffcmp = NEW(struct comp, "comp init"); ffcmp->cmp_type = dt; ffcmp->cmp_name = strsave(pars); *ff = ffcmp; return TRUE; } comptype_access(ffcmp, fe, acca) struct comp *ffcmp; struct font_entry *fe; struct accarg *acca; { BOOLEAN subpre; int s; char *se; struct comp *ffnew; #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "trying to comp(ose) %s/%s\n", fe->n, ffcmp->cmp_name); #endif if (strncmp(fe->n, ffcmp->cmp_name, strlen(ffcmp->cmp_name)) == 0) { if (ffcmp->cmp_type == CMP_NTT) subpre = (s = getjsubfont(fe->n+strlen(ffcmp->cmp_name), &se)) > 0; else subpre = (s = getdcode(fe->n+strlen(ffcmp->cmp_name), &se)) > 0; if (subpre && numstr(se+1)) { (void)sprintf(fe->name, "%s%s", ffcmp->cmp_name, se+1); ffnew = NEW(struct comp, "comp init"); *ffnew = *ffcmp; ffnew->cmp_sub = s; fe->finfo = (struct finfo *)ffnew; return TRUE; } } return FALSE; } void init_comp_fontinfo(fe) struct font_entry *fe; { void init_cmpntt_fontinfo(), init_cmpdcd_fontinfo(); if (cmpfinfo(fe)->cmp_type == CMP_NTT) init_cmpntt_fontinfo(fe); else init_cmpdcd_fontinfo(fe); } void init_cmpntt_fontinfo(fe) struct font_entry *fe; { struct comp *ffcmp; struct font_index *fontidx; int cmpntt_markchar(); void read_cmpntt_fontinfo(); ffcmp = cmpfinfo(fe); fontidx = NULL; readfontdef(0, 0, fe->s, fe->d, 0, strlen(fe->name), fe->name, &fontidx); ffcmp->cmp_fe = fontidx->fent; fe->fnt_markchar = cmpntt_markchar; fe->fnt_readfontinfo = read_cmpntt_fontinfo; } #define makejis(k,t) ((k)*256+t) #define cmp_markchar(save, ku, ten) \ save = curfontent; \ setcurfont(cmpfinfo(curfontent)->cmp_fe); \ MarkChar(makejis(ku,ten)); \ setcurfont(save); cmpntt_markchar(fe, c) struct font_entry *fe; int c; { unsigned short ku, ten; struct font_entry *save_curfontent; jsub_to_jis(cmpfinfo(curfontent)->cmp_sub, c, &ku, &ten); cmp_markchar(save_curfontent, ku, ten); } void read_cmpntt_fontinfo(fe) struct font_entry *fe; { DEV_FONT cmpntt_fontdict(); int cmpntt_setchar(), cmpntt_setstring(); fe->rvf_setchar = virf_setchar; fe->rvf_setstring = virf_setstring; fe->dev_fontdict = cmpntt_fontdict; fe->dev_setchar = cmpntt_setchar; fe->dev_setstring = cmpntt_setstring; } DEV_FONT cmpntt_fontdict(fe, c) struct font_entry *fe; int c; { unsigned short ku, ten; struct font_entry *sfe; jsub_to_jis(cmpfinfo(curfontent)->cmp_sub, c, &ku, &ten); sfe = cmpfinfo(fe)->cmp_fe; return sfe->dev_fontdict(sfe, makejis(ku, ten)); } #define cmp_setchar(save, ku, ten) \ save = curfontent; \ setcurfont(cmpfinfo(curfontent)->cmp_fe); \ SetChar(makejis(ku,ten), chmove); \ setcurfont(save); cmpntt_setchar(fe, c) struct font_entry *fe; unsigned int c; { unsigned short ku, ten; struct font_entry *save_curfontent; jsub_to_jis(cmpfinfo(curfontent)->cmp_sub, c, &ku, &ten); cmp_setchar(save_curfontent, ku, ten); return 0; } cmpntt_setstring(fe, s, len) struct font_entry *fe; byte *s; int len; { unsigned char *sp; /* should be optimized */ for (sp = s; sp < s+len; sp++) (void)cmpntt_setchar(fe, *sp); return 0; } void init_cmpdcd_fontinfo(fe) struct font_entry *fe; { struct comp *ffcmp; struct font_index *fontidx; int cmpdcd_markchar(); void read_cmpdcd_fontinfo(); ffcmp = cmpfinfo(fe); fontidx = NULL; readfontdef(0, 0, fe->s, fe->d, 0, strlen(fe->name), fe->name, &fontidx); ffcmp->cmp_fe = fontidx->fent; fe->fnt_markchar = cmpdcd_markchar; fe->fnt_readfontinfo = read_cmpdcd_fontinfo; } cmpdcd_markchar(fe, c) struct font_entry *fe; int c; { unsigned short ku, ten; struct font_entry *save_curfontent; code_to_jis(cmpfinfo(curfontent)->cmp_sub, c, &ku, &ten); cmp_markchar(save_curfontent, ku, ten); } void read_cmpdcd_fontinfo(fe) struct font_entry *fe; { DEV_FONT cmpdcd_fontdict(); int cmpdcd_setchar(), cmpdcd_setstring(); fe->rvf_setchar = virf_setchar; fe->rvf_setstring = virf_setstring; fe->dev_fontdict = cmpdcd_fontdict; fe->dev_setchar = cmpdcd_setchar; fe->dev_setstring = cmpdcd_setstring; } DEV_FONT cmpdcd_fontdict(fe, c) struct font_entry *fe; int c; { unsigned short ku, ten; struct font_entry *sfe; code_to_jis(cmpfinfo(curfontent)->cmp_sub, c, &ku, &ten); sfe = cmpfinfo(fe)->cmp_fe; return sfe->dev_fontdict(sfe, makejis(ku, ten)); } cmpdcd_setchar(fe, c) struct font_entry *fe; unsigned int c; { unsigned short ku, ten; struct font_entry *save_curfontent; code_to_jis(cmpfinfo(curfontent)->cmp_sub, c, &ku, &ten); cmp_setchar(save_curfontent, ku, ten); return 0; } cmpdcd_setstring(fe, s, len) struct font_entry *fe; byte *s; int len; { unsigned char *sp; /* should be optimized */ for (sp = s; sp < s+len; sp++) (void)cmpdcd_setchar(fe, *sp); return 0; } dvi2dvi-2.0-alpha/decompfont.c100644 163 163 13056 6142330051 15661 0ustar sakuraisakurai/* decompose font to subfonts */ #include "defs.h" #include "set.h" #include "global.h" #include "funcfont.h" #include "jsub.h" int decomptype_init(); int decomptype_access(); void init_decomp_fontinfo(); struct fontop dcmpop = { "decomp", decomptype_init, decomptype_access, init_decomp_fontinfo, }; decomptype_init(pars, ff) char *pars; struct decomp **ff; { char *p1, *p2; int dt; struct decomp *ffdcmp; if (!getstrtok(pars, ',', &p1)) return FALSE; if (!getstrtok(p1, '\0', &p2)) return FALSE; dt = STREQ(p1, "ntt") ? CMP_NTT : CMP_DCD; ffdcmp = NEW(struct decomp, "decomp init"); ffdcmp->dcmp_type = dt; ffdcmp->dcmp_name = strsave(pars); *ff = ffdcmp; return TRUE; } decomptype_access(ffdcmp, fe, acca) struct decomp *ffdcmp; struct font_entry *fe; struct accarg *acca; { struct decomp *ffnew; #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "trying to decompose %s/%s\n", fe->n, ffdcmp->dcmp_name); #endif if (strncmp(fe->n, ffdcmp->dcmp_name, strlen(ffdcmp->dcmp_name)) == 0) { if (numstr(fe->n+strlen(ffdcmp->dcmp_name)) ) { ffnew = (struct decomp *) alloc_check(malloc((unsigned)sizeof(struct decomp)+ (ffdcmp->dcmp_type == CMP_NTT ? NJSUBS : NCSUBS)* sizeof(struct font_entry *)), "decomp init"); *ffnew = *ffdcmp; fe->finfo = (struct finfo *)ffnew; return TRUE; } } return FALSE; } void init_decomp_fontinfo(fe) struct font_entry *fe; { void init_dcmpntt_fontinfo(), init_dcmpdcd_fontinfo(); if (dcmpfinfo(fe)->dcmp_type == CMP_NTT) init_dcmpntt_fontinfo(fe); else init_dcmpdcd_fontinfo(fe); } void init_dcmpntt_fontinfo(fe) struct font_entry *fe; { struct decomp *ffdcmp; char *ntail; byte n[STRSIZE]; int i; struct font_index *fontidx; int dcmpntt_markchar(); void read_dcmpntt_fontinfo(); ffdcmp = dcmpfinfo(fe); ntail = fe->n+strlen(ffdcmp->dcmp_name); fontidx = NULL; for (i = 1; i <= NJSUBS; i++) { (void)sprintf(n, "%s%s%s", ffdcmp->dcmp_name, jsubfontname(i), ntail); readfontdef(i, 0, fe->s, fe->d, 0, strlen(n), (char *)n, &fontidx); ffdcmp->dcmp_fetab[i] = fontidx->fent; } fe->fnt_markchar = dcmpntt_markchar; fe->fnt_readfontinfo = read_dcmpntt_fontinfo; } #define ku(c) ((c)>>8) #define ten(c) ((c)&0xff) #define dcmp_markchar(save, f, c) \ save = curfontent; \ setcurfont(dcmpfinfo(curfontent)->dcmp_fetab[f]); \ MarkChar(c); \ setcurfont(save); dcmpntt_markchar(fe, c) struct font_entry *fe; int c; { unsigned short f, cc; struct font_entry *save_curfontent; jis_to_jsub(ku(c), ten(c), &f, &cc); dcmp_markchar(save_curfontent, f, cc); } void read_dcmpntt_fontinfo(fe) struct font_entry *fe; { DEV_FONT dcmpntt_fontdict(); int dcmpntt_setchar(), dcmpntt_setstring(); fe->rvf_setchar = virf_setchar; fe->rvf_setstring = virf_setstring; fe->dev_fontdict = dcmpntt_fontdict; fe->dev_setchar = dcmpntt_setchar; fe->dev_setstring = dcmpntt_setstring; } DEV_FONT dcmpntt_fontdict(fe, c) struct font_entry *fe; int c; { unsigned short f, cc; struct font_entry *sfe; jis_to_jsub(ku(c), ten(c), &f, &cc); sfe = dcmpfinfo(fe)->dcmp_fetab[f]; return sfe->dev_fontdict(sfe, cc); } #define dcmp_setchar(save, f, c) \ save = curfontent; \ setcurfont(dcmpfinfo(curfontent)->dcmp_fetab[f]); \ SetChar(c, chmove); \ setcurfont(save); dcmpntt_setchar(fe, c) struct font_entry *fe; int c; { unsigned short f, cc; struct font_entry *save_curfontent; jis_to_jsub(ku(c), ten(c), &f, &cc); dcmp_setchar(save_curfontent, f, cc); return 0; } /* ARGSUSED */ dcmpntt_setstring(fe, s, len) struct font_entry *fe; byte *s; int len; { Fatal("%s implementation error: dcmpntt_setstring", G_progname); } void init_dcmpdcd_fontinfo(fe) struct font_entry *fe; { struct decomp *ffdcmp; char *ntail; byte n[STRSIZE]; int i; struct font_index *fontidx; int dcmpdcd_markchar(); void read_dcmpdcd_fontinfo(); ffdcmp = dcmpfinfo(fe); ntail = fe->n+strlen(ffdcmp->dcmp_name); fontidx = NULL; for (i = 1; i <= NCSUBS; i++) { (void)sprintf(n, "%s%c%02x%c%s", ffdcmp->dcmp_name, CSUB_SEP, 31+i*2, CSUB_SEP, ntail); readfontdef(i, 0, fe->s, fe->d, 0, strlen(n), (char *)n, &fontidx); ffdcmp->dcmp_fetab[i] = fontidx->fent; } fe->fnt_markchar = dcmpdcd_markchar; fe->fnt_readfontinfo = read_dcmpdcd_fontinfo; } dcmpdcd_markchar(fe, c) struct font_entry *fe; int c; { unsigned short f, cc; struct font_entry *save_curfontent; jis_to_dcode(ku(c), ten(c), &f, &cc); dcmp_markchar(save_curfontent, f, cc); } void read_dcmpdcd_fontinfo(fe) struct font_entry *fe; { DEV_FONT dcmpdcd_fontdict(); int dcmpdcd_setchar(), dcmpdcd_setstring(); fe->rvf_setchar = virf_setchar; fe->rvf_setstring = virf_setstring; fe->dev_fontdict = dcmpdcd_fontdict; fe->dev_setchar = dcmpdcd_setchar; fe->dev_setstring = dcmpdcd_setstring; } DEV_FONT dcmpdcd_fontdict(fe, c) struct font_entry *fe; int c; { unsigned short f, cc; struct font_entry *sfe; jis_to_dcode(ku(c), ten(c), &f, &cc); sfe = dcmpfinfo(fe)->dcmp_fetab[f]; return sfe->dev_fontdict(sfe, cc); } dcmpdcd_setchar(fe, c) struct font_entry *fe; int c; { unsigned short f, cc; struct font_entry *save_curfontent; jis_to_dcode(ku(c), ten(c), &f, &cc); dcmp_setchar(save_curfontent, f, cc); return 0; } /* ARGSUSED */ dcmpdcd_setstring(fe, s, len) struct font_entry *fe; byte *s; int len; { Fatal("%s implementation error: dcmpdcd_setstring", G_progname); } dvi2dvi-2.0-alpha/execfont.c100644 163 163 2646 7053026737 15340 0ustar sakuraisakurai/* * exec font */ #include "defs.h" #include "global.h" int cexectype_access(); int exectype_access(); void init_exec_fontinfo(); struct fontop cexecop = { "exec", pathtype_init, cexectype_access, init_exec_fontinfo, /* never called */ }; struct fontop execop = { "exec", pathtype_init, exectype_access, init_exec_fontinfo, /* never called */ }; int cexectype_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { FILE *f; int c; char execline[PATHLEN]; int stat; if (acca->acc_mode != ACC_EXACT) return FALSE; acca->pv_mag = ROUND(acca->actmagfact*resolution); pave(execline, proto, acca); #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "trying to exec for %s\n\t%s\n", fe->n, execline); #endif if ((f = BINARYPOPEN(execline)) != NULL) { if (Debug) while ((c = getc(f)) != EOF) putc(c, stderr); else while ((c = getc(f)) != EOF) ; if ((stat = pclose(f)) != 0) Warning("exec font generation failed : %s", execline); } else Warning("exec font execution failed : %s", execline); return !stat; } int exectype_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { (void)cexectype_access(proto, fe, acca); return FALSE; } /* ARGSUSED */ void init_exec_fontinfo(fe) struct font_entry *fe; { Fatal("%s implementation error: init_exec_fontinfo", G_progname); } dvi2dvi-2.0-alpha/funcfont.c100644 163 163 11644 6767750251 15373 0ustar sakuraisakurai/* * functional font */ #include "defs.h" #include "global.h" #include "funcfont.h" #ifdef KPATHSEA #include #include #endif int functype_init(); int functype_access(); void init_func_fontinfo(); struct fontop funcop = { "func", functype_init, functype_access, init_func_fontinfo, }; functype_init(desc, ff) char *desc; struct funcfont **ff; { char *d, *e; struct fontop *fop; BOOLEAN body; int numbody; struct ffinfo *ffi; struct funcfont *ffs, **nextff; struct funcfont *ffnew; struct fontop *findcondop(); extern struct fontop falseop; for (ffs = NULL, nextff = &ffs, numbody = 0;;) { if (!getstrtok(desc, '(', &d)) return FALSE; if ((fop = findcondop(desc)) != NULL) { body = FALSE; } else if ((fop = findfontop(desc)) != NULL && fop != &funcop) { body = TRUE; numbody++; } else { Warning("illegal functional font %s", desc); return FALSE; } if (!getstrtok(d, ')', &e)) return FALSE; if (!fop->fo_init(d, &ffi)) return FALSE; ffnew = NEW(struct funcfont, "funcfont init"); ffnew->ff_fop = fop; ffnew->ff_body = body; ffnew->ff_info = (struct ffinfo *)ffi; ffnew->ff_next = NULL; *nextff = ffnew; nextff = &(ffnew->ff_next); skipstrblank(e, &d); if (*d == '\0') break; else if (*d == ',') skipstrblank(e+1, &desc); else return FALSE; } if (numbody == 0) { ffnew = NEW(struct funcfont, "funcfont init"); ffnew->ff_fop = &falseop; ffnew->ff_body = TRUE; ffnew->ff_info = NULL; ffnew->ff_next = NULL; *nextff = ffnew; } *ff = ffs; return TRUE; } functype_access(ff, fe, acca) struct funcfont *ff; struct font_entry *fe; struct accarg *acca; { struct funcfont *ffnew; for (; ff != NULL; ff = ff->ff_next) { #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, "trying to apply %s to %s\n", ff->ff_fop->fo_type, fe->n); #endif if (ff->ff_fop->fo_access(ff->ff_info, fe, acca)) { if (ff->ff_body) { ffnew = NEW(struct funcfont, "funcfont access"); *ffnew = *ff; ffnew->ff_info = (struct ffinfo *)fe->finfo; fe->finfo = (struct finfo *)ffnew; } } else return FALSE; } return TRUE; } void init_func_fontinfo(fe) struct font_entry *fe; { struct funcfont *ff; ff = (struct funcfont *)fe->finfo; fe->finfo = (struct finfo *)ff->ff_info; ff->ff_fop->fo_initfontinfo(fe); } /* funcfont conditions */ extern struct fontop cexecop, /* execfont.c */ existop, preop, notpreop, falseop; struct fontop *condops[] = { &cexecop, &existop, &preop, ¬preop, &falseop, NULL }; struct fontop * findcondop(type) char *type; { struct fontop **fo; for (fo = condops; *fo != NULL; fo++) if (STREQ((*fo)->fo_type, type)) return *fo; return NULL; } /* ARGSUSED */ void init_dummy_fontinfo(fe) struct font_entry *fe; { Fatal("%s implementation error: init_dummy_fontinfo", G_progname); } int false_access(); struct fontop falseop = { "false", pathtype_init, false_access, init_dummy_fontinfo, /* never called */ }; /* ARGSUSED */ int false_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { return FALSE; } int exist_access(); struct fontop existop = { "exist", pathtype_init, exist_access, init_dummy_fontinfo, /* never called */ }; int exist_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { BOOLEAN ok; #ifdef KPATHSEA char *path, *base, *filename; const_string savepath; kpse_format_info_type *spec = &kpse_format_info[kpse_texsource_format]; #endif #ifdef KPATHSEA pavek(fe->name, &path, &base, proto, acca); if (path == NULL || base == NULL) return FALSE; spec->path = NULL; spec->override_path = path; kpse_init_format(kpse_texsource_format); filename = kpse_path_search(spec->path, base, false); if (ok = (filename != NULL)) strcpy(fe->name, filename); #else pave(fe->name, proto, acca); ok = access(fe->name, R_OK) == 0; #endif #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, " condition: exist %s\n", fe->name); #endif return ok; } int pre_access(); int notpre_access(); struct fontop preop = { "pre", pathtype_init, pre_access, init_dummy_fontinfo, /* never called */ }; struct fontop notpreop = { "!pre", pathtype_init, notpre_access, init_dummy_fontinfo, /* never called */ }; int pre_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, " condition: pre(%s) %s\n", proto, fe->n); #endif return !strncmp(fe->n, proto, strlen(proto)); } int notpre_access(proto, fe, acca) char *proto; struct font_entry *fe; struct accarg *acca; { #ifdef DEBUG if (Debuguser) (void)fprintf(stderr, " condition: !pre(%s) %s\n", proto, fe->n); #endif return strncmp(fe->n, proto, strlen(proto)); } dvi2dvi-2.0-alpha/kpse.c100644 163 163 5777 6767736672 14520 0ustar sakuraisakurai#ifdef KPATHSEA #include "defs.h" #include #include #include char * kpsearch_glyph(proto, n, format, acca, name) char *proto, *n; kpse_file_format_type format; struct accarg *acca; char *name; { char *path, *base; const_string save_path, save_orpath; kpse_format_info_type *spec = &kpse_format_info[format]; kpse_glyph_file_type font_file; char *filename; pavek(name, &path, &base, proto, acca); if (path != NULL) { save_path = spec->path; save_orpath = spec->override_path; spec->path = NULL; spec->override_path = path; } if (spec->path == NULL) kpse_init_format(format); if (acca->acc_mode&ACC_GEN) spec->program_enabled_p = true; if (base == NULL) filename = kpse_find_glyph(n, acca->pv_mag, format, &font_file); else if (path == NULL) filename = kpse_find_glyph(base, acca->pv_mag, format, &font_file); else if (path == NULL) filename = kpse_find_file(base, format, true); else filename = kpse_path_search(spec->path, base, false); if (path != NULL) { spec->path = save_path; spec->override_path = save_orpath; } if (acca->acc_mode&ACC_GEN) spec->program_enabled_p = false; return filename; } char * kpsearch_make(proto, n, format, acca, name) char *proto, *n; kpse_file_format_type format; struct accarg *acca; char *name; { char *path, *base; const_string save_path, save_orpath; kpse_format_info_type *spec = &kpse_format_info[format]; char *filename; pavek(name, &path, &base, proto, acca); if (path != NULL) { save_path = spec->path; save_orpath = spec->override_path; spec->path = NULL; spec->override_path = path; } if (spec->path == NULL) kpse_init_format(format); if (acca->acc_mode&ACC_GEN) spec->program_enabled_p = true; if (base == NULL) filename = kpse_find_file(n, format, true); else if (path == NULL) filename = kpse_find_file(base, format, true); else filename = kpse_path_search(spec->path, base, false); if (path != NULL) { spec->path = save_path; spec->override_path = save_orpath; } if (acca->acc_mode&ACC_GEN) spec->program_enabled_p = false; return filename; } char * kpsearch_file(proto, n, format) char *proto, *n; kpse_file_format_type format; { char pathname[PATHLEN]; /* dummy */ char *path, *base; const_string save_path, save_orpath; kpse_format_info_type *spec = &kpse_format_info[format]; char *filename; pavek(pathname, &path, &base, proto, NULL); if (path != NULL) { save_path = spec->path; save_orpath = spec->override_path; spec->path = NULL; spec->override_path = path; } if (spec->path == NULL) kpse_init_format(format); if (base == NULL) filename = kpse_find_file(n, format, true); else if (path == NULL) filename = kpse_find_file(base, format, true); else filename = kpse_path_search(spec->path, base, false); if (path != NULL) { spec->path = save_path; spec->override_path = save_orpath; } return filename; } #endif dvi2dvi-2.0-alpha/kanji.c100644 163 163 11507 7054300672 14627 0ustar sakuraisakurai/* * utilities for japanese */ #include "defs.h" #include "global.h" /* jsubfont */ #include "jsub.h" char *jsf_names[] = { "", "jsy", "jroma", "jhira", "jkata", "jgreek", "jrussian", "jkeisen", "jka", "jkb", "jkc", "jkd", "jke", "jkf", "jkg", "jkh", "jki", "jkj", "jkk", "jkl", "jkm", "jkn", "jko", "jkp", "jkq", "jkr", "jks", "jkt", "jku", "jkv", "jkw", "jkx", "jky", "jkz", NULL }; getjsubfont(n, subend) char *n; char **subend; { int f; for (f = 1; f <= NJSUBS; f++) if (!strncmp(n, jsf_names[f], strlen(jsf_names[f]))) { *subend = n + strlen(jsf_names[f])-1; return f; } return 0; } #define hex(c) (c>='a' ? c-'a'+10 : c-'0') getdcode(n, subend) char *n; char **subend; { if (*n == CSUB_SEP && *(n+3) == CSUB_SEP) { *subend = n+3; return (hex(*(n+1))*16+hex(*(n+2))); } return 0; } #define kushift(c) (c+0x20) #define tenshift(c) (c+0x20) void jsub_to_jis(f, c, ku, ten) short f, c; unsigned short *ku, *ten; { int n; if (f <= 7) { if (f == 1) { if (c >= 100) { *ku = kushift(2); *ten = tenshift(c-100); } else { *ku = kushift(1); *ten = tenshift(c); } } else if (f == 2) { *ku = kushift(3); *ten = tenshift(c-32); } else { *ku = kushift(f+1); *ten = tenshift(c); } } else if (f <= 19) { /* Daiichi Suijun */ n = (f-8)*256+c; *ku = kushift((n/94)+16); *ten = tenshift((n%94)+1); } else { /* Daini Suijun */ n = (f-20)*256+c; *ku = kushift((n/94)+48); *ten = tenshift((n%94)+1); } } void jis_to_jsub(ku, ten, f, c) short ku, ten; unsigned short *f, *c; { int n; ku -= 0x20; ten -= 0x20; *f = 1; *c = 1; if (ku <= 0 || (9 <= ku && ku <= 15) || ku > 84) { Warning("invalid ku in jis (%x, %x)", ku+0x20, ten+0x20); return; } if (ten < 1 || ten > 94) { Warning("invalid ten in jis (%x, %x)", ku+0x20, ten+0x20); return; } if (ku <= 8) { if (ku == 1) { *f = 1; *c = ten; } else if (ku == 2) { *f = 1; *c = ten+100; } else if (ku == 3) { *f = 2; *c = ten+32; } else { *f = ku-1; *c = ten; } } else if (ku <= 47) { /* Daiich Suijun */ n = (ku-16)*94+ten-1; *f = (n/256)+8; *c = n%256; } else { /* Daini Suijun */ n = (ku-48)*94+ten-1; *f = (n/256)+20; *c = n%256; } } void code_to_jis(s, c, ku, ten) unsigned short s, c; unsigned short *ku, *ten; { if (c >= 128) { *ku = s+1; *ten = c-128; } else { *ku = s; *ten = c; } } #if 0 void dcode_to_jis(f, c, ku, ten) unsigned short f, c; unsigned short *ku, *ten; { if (c >= 128) { *ku = f*2+0x20; *ten = c-128; } else { *ku = f*2+0x1f; *ten = c; } } #endif void jis_to_dcode(ku, ten, f, c) unsigned short ku, ten; unsigned short *f, *c; { *f = (unsigned short)(ku-0x21)/2 + 1; *c = (ku%2 == 1) ? ten : ten+128; } int foundjsubf; /* fname is obtained by substituting subfont of sname. * if ini, initial match, otherwise strict match. * sb and se points subfont part of fname. */ match_subf(sname, fname, ini, sb, se) char *sname, *fname; BOOLEAN ini; char **sb, **se; { *sb = NULL; for (; *sname != '\0'; sname++, fname++) { if (*sname == '%') { if (*++sname == 'j') { if ((foundjsubf = getjsubfont(fname, se)) == 0) return FALSE; } else if (*sname == 'c') { if (*fname == CSUB_SEP && *(fname+3) == CSUB_SEP) { *se = fname+3; } else return FALSE; } else return FALSE; *sb = fname; fname = *se; } else if (*sname != *fname) return FALSE; } if (*fname == '\0') return TRUE; else return ini; } void subst_subf(fname, sname, sb, se) char *fname, *sname; char *sb, *se; { char *s; for (; *sname != '\0'; sname++) { if (*sname == '%') { sname++; for (s = sb; s <= se; s++, fname++) *fname = *s; } else *fname++ = *sname; } *fname = '\0'; } /* converts jis code to 94*94 code intex, * but if jis is out of range, return -1 */ jis_to_idx94(jis) unsigned int jis; { int kanji, c1, c2; if ((kanji = jis - 0x2121) < 0) return -1; c1 = (kanji>>8)&0xff; if (c1 >= 94) return -1; c2 = kanji&0xff; if (c2 >= 94) return -1; return (c1*94 + c2); } #ifdef UNDEF idx94_to_std(idx) int idx; { return ((idx/94)*256 + (idx%94) + 0x2121); } jsub_to_idx94(f, c) short f, c; { unsigned short ku, ten; jsub_to_jis(f, c, &ku, &ten); return jis_to_idx94(ku*256+ten); } idx94_to_sjis(idx) int idx; { int i1, i2, c1, c2; i1 = idx/94; i2 = idx%94; if ((i1 & 1) == 0) { if (i1 < 0x3e) c1 = i1/2 + 0x81; else c1 = i1/2 + 0xc1; if (i2 >= 0x3f) c2 = i2 + 0x41; else c2 = i2 + 0x40; } else { if (i1 < 0x3e) c1 = i1/2 + 0x81; else c1 = i1/2 + 0xc0; c2 = i2 + 0x9f; } return (c1*256 + c2); } #endif dvi2dvi-2.0-alpha/open.c100644 163 163 5670 6770232653 14467 0ustar sakuraisakurai#include #include "defs.h" #include "global.h" struct openfont_list { struct font_entry *openfont_entry; /* font entry */ int use_count; /* count of "opens" */ int last_use; } openfont_files[MAXOPEN]; /* list of open FNT file identifiers */ int nopen = 0; /* number of open FNT files */ int openfont_time = 0; void openfontfile(fe) struct font_entry *fe; /*********************************************************************** The original version of this dvi driver reopened the font file each time the font changed, resulting in an enormous number of relatively expensive file openings. This version keeps a cache of up to MAXOPEN open files, so that when a font change is made, the file pointer, fntfp, can usually be updated from the cache. When the file is not found in the cache, it must be opened. In this case, the next empty slot in the cache is assigned, or if the cache is full, the least used font file is closed and its slot reassigned for the new file. Identification of the least used file is based on the counts of the number of times each file has been "opened" by this routine. On return, the file pointer is always repositioned to the beginning of the file. ***********************************************************************/ { int i, least_used, current; struct openfont_list *curopen; int prio; struct font_entry *lu_fe; FILE *fntfp; #ifdef DEBUG /*if (Debug) (void)fprintf(stderr, "Open Font file\n");*/ #endif openfont_time++; if ((fntfp = fe->openfile) != NO_FILE) { /* file already open */ (void)fseek(fntfp, 0L, SEEK_SET); /* reposition to start of file */ curopen = fe->openlist; #ifdef STATS if (Stats) (void)fprintf(stderr, "FNT file %s already open.\n", fe->name); #endif } else { if (nopen < MAXOPEN) /* just add it to list */ current = nopen++; else { /* list full -- find least used file, */ /* close it, and reuse slot for new file */ least_used = 0; prio = priority(least_used); for (i = 1; i < MAXOPEN; ++i) if (prio > priority(i)) prio = priority(least_used = i); lu_fe = openfont_files[least_used].openfont_entry; #ifdef STATS if (Stats) (void)fprintf(stderr, "FNT file %s closed.\n", lu_fe->name); #endif (void)fclose(lu_fe->openfile); lu_fe->openfile = NO_FILE; current = least_used; } if ((fe->openfile = BINARYOPEN(fe->name)) == NULL) { Fatal("FNT file %s could not be opened", fe->name); } else { #ifdef STATS if (Stats) (void)fprintf(stderr, "FNT file %s opened.\n", fe->name); #endif } fe->openlist = curopen = &openfont_files[current]; curopen->openfont_entry = fe; curopen->use_count = 0; } curopen->use_count++; /* update reference count */ curopen->last_use = openfont_time; } priority(i) int i; { return (openfont_files[i].use_count - (openfont_time-openfont_files[i].last_use)); } dvi2dvi-2.0-alpha/io.c100644 163 163 4047 7054270073 14124 0ustar sakuraisakurai#include "defs.h" #include "global.h" /*-->getbytes*/ /**********************************************************************/ /***************************** getbytes *****************************/ /**********************************************************************/ void getbytes(fp, cp, n) /* get n bytes from file fp */ FILE *fp; /* file pointer */ byte *cp; /* character pointer */ int n; /* number of bytes */ { (void)fread((char *)cp, 1, n, fp); } void skipbytes(fp, n) FILE *fp; int n; { (void)fseek(fp, (long)n, SEEK_CUR); } /*-->getuint*/ /**********************************************************************/ /*************************** getuint ********************************/ /**********************************************************************/ int getuint(fp, n) /* return n byte quantity from file fd */ FILE *fp; /* file pointer */ int n; /* number of bytes */ { byte s[sizeof(int)]; (void)fread((char *)s, 1, n, fp); return makeuint(s, n); } /*-->getint*/ /**********************************************************************/ /**************************** getint ********************************/ /**********************************************************************/ int getint(fp, n) /* return n byte quantity from file fd */ FILE *fp; /* file pointer */ int n; /* number of bytes */ { byte s[sizeof(int)]; (void)fread((char *)s, 1, n, fp); return makeint(s, n); } /**********************************************************************/ /**********************************************************************/ putbyte(fp, c) FILE *fp; byte c; { (void)putc(c, fp); } copybytes(sfp, dfp, n) FILE *sfp, *dfp; /* file pointer */ int n; /* number of bytes */ { for (; n > 0; --n) (void)putc(getc(sfp), dfp); } putbytes(fp, cp, n) FILE *fp; byte *cp; int n; { (void)fwrite((char *)cp, 1, n, fp); } putnint(fp, x, n) FILE *fp; /* file pointer */ unsigned int x; int n; /* number of bytes */ { if (n > 0) { putnint(fp, x>>8, n-1); (void)putc((int)x&0xff, fp); } } dvi2dvi-2.0-alpha/util.c100644 163 163 5705 7054266332 14477 0ustar sakuraisakurai#include "defs.h" #include "global.h" char * alloc_check(p, e) char *p, *e; { if (p == NULL) Fatal("can't malloc space for %s", e); return p; } makeuint(s, n) /* return n byte quantity from string */ byte *s; int n; { int x; /* number being constructed */ x = 0; while (n--) { x <<= 8; x |= *s++; } return x; } makeint(s, n) /* return n byte quantity from string */ byte *s; int n; { int n1; /* number of bytes */ int x; /* number being constructed */ x = *s++; /* get first (high-order) byte */ n1 = n--; while (n--) { x <<= 8; x |= *s++; } /* NOTE: This code assumes that the right-shift is an arithmetic, rather than logical, shift which will propagate the sign bit right. According to Kernighan and Ritchie, this is compiler dependent! */ x<<=32-8*n1; x>>=32-8*n1; /* sign extend */ return x; } static int i2b(); uinttob(b, x) byte *b; unsigned int x; { static unsigned char buf[sizeof(int)+1]; int i, j, n; if (x == 0) { b[0] = 0; return 1; } n = i2b((unsigned int)x, buf); for (i = 1; i+1 < n && buf[i] == 0; i++) ; for (j = i; j < n; j++) b[j-i] = buf[j]; return n-i; } inttob(b, x) byte *b; int x; { static unsigned char buf[sizeof(int)+1]; int i, j, n; if (x == 0) { b[0] = 0; return 1; } n = i2b((unsigned int)x, buf); if (x > 0) for (i = 0; i+1 < n && buf[i] == 0 && (buf[i+1]&0x80) == 0; i++) ; else for (i = 1; i+1 < n && buf[i] == 0xff && (buf[i+1]&0x80); i++) ; for (j = i; j < n; j++) b[j-i] = buf[j]; return n-i; } static i2b(x, b) unsigned int x; unsigned char *b; { int n; if (x == 0) { *b = 0; return 1; } n = i2b(x>>8, b); *(b+n) = x & 0xff; return n+1; } numstr(s) char *s; { for (; *s != '\0'; s++) if (!isdigit(*s)) return FALSE; return TRUE; } char * strsave(s) char *s; { char *t; int len; if ((t = malloc((unsigned)(len = strlen(s)+1))) == NULL) Fatal("cannot save string %s", s); bcopy(s, t, len); return t; } /* getstrtok: * find the first c in d, put '\0' there, and let *e point the next position. */ getstrtok(d, c, e) char *d; char c; char **e; { for (; *d != c && *d != '\0'; d++) ; if (*d == c) { *d = '\0'; *e = d+1; return TRUE; } return FALSE; } skipstrblank(d, e) char *d; char **e; { for (; *d == ' ' || *d == '\t'; d++) ; *e = d; } #define LOWP 16 #define FIXP 20 #define LOWMASK ((1<>(y)) /* x / 2^y */ scale_exact(s, d) int s, d; { int sign; unsigned int s1, s0, d1, d0; if (s < 0) { sign = -1; s *= -1; } else sign = 1; s0 = s & LOWMASK; d0 = d & LOWMASK; s1 = s >> LOWP; d1 = d >> LOWP; return (sign * (TPT(s1*d1, 2*LOWP-FIXP) + DPT(s1*d0+s0*d1 + DPT(s0*d0, LOWP), FIXP-LOWP)) ); } dvi2dvi-2.0-alpha/xxstdio.c100644 163 163 7255 5647561776 15246 0ustar sakuraisakurai#ifdef SYSVIO #include #include #include #include #ifndef _NFILE #define _NFILE 20 #endif #undef fopen #undef freopen #undef fdopen #undef fflush #undef fread #undef fgetc #undef getw #undef gets #undef fgets #undef fseek #undef ftell #undef __filbuf typedef struct { FILE *fp; long pos; } xxFILE; static xxFILE *xxfiles = (xxFILE *)NULL; static int xxnfiles = 0; #define XXOK(p) ((p) && fileno(p) < xxnfiles && xxfiles[fileno(p)].fp == (p)) #define XXPOS(p) (xxfiles[fileno(p)].pos) static void xxinit(fp) FILE *fp; { int fd; if (!fp || (fp->_flag & (_IOREAD|_IORW|_IOMYBUF)) != _IOREAD) return; fd = fileno(fp); if (fd >= xxnfiles) { int max = fd+_NFILE; if (xxfiles) xxfiles = (xxFILE *)realloc((void *)xxfiles, sizeof(xxFILE)*(max+1)); else xxfiles = (xxFILE *)malloc(sizeof(xxFILE)*(max+1)); if (!xxfiles) return; while (xxnfiles <= max) xxfiles[xxnfiles++].fp = (FILE *)NULL; } if ((xxfiles[fd].pos = lseek(fd, (long)0, SEEK_CUR)) >= 0) xxfiles[fd].fp = fp; else xxfiles[fd].fp = (FILE *)NULL; } static long xxlseek(fp, offset, ptrname) FILE *fp; long offset; int ptrname; { long pos = offset, cur; unsigned char *ptr; /* assume XXOK(fp) */ if (ptrname == SEEK_END) { if (fseek(fp, offset, ptrname)) return -1; XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return XXPOS(fp) - fp->_cnt; } cur = XXPOS(fp); if (ptrname == SEEK_CUR) pos += cur - fp->_cnt; ptr = (pos - cur) + (fp->_ptr + fp->_cnt); if (ptr < fp->_base || fp->_ptr + fp->_cnt <= ptr) { if (fseek(fp, offset, ptrname)) return -1; XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return XXPOS(fp) - fp->_cnt; } fp->_cnt -= ptr - fp->_ptr; fp->_ptr = ptr; return pos; } FILE * xxfopen(filename, type) char *filename; char *type; { FILE *fp = fopen(filename, type); xxinit(fp); return fp; } FILE * xxfreopen(filename, type, fp) char *filename; char *type; FILE *fp; { xxinit(fp = freopen(filename, type, fp)); return fp; } FILE * xxfdopen(fd, type) int fd; char *type; { FILE *fp = fdopen(fd, type); xxinit(fp); return fp; } int xxfflush(fp) FILE *fp; { int rc = fflush(fp); if (XXOK(fp)) XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return rc; } int xxfread(ptr, size, nitems, fp) void *ptr; int size; int nitems; FILE *fp; { int noseek = (fp && (size <= fp->_cnt)); size = fread(ptr, size, nitems, fp); if (!noseek && XXOK(fp)) XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return size; } int xxfgetc(fp) FILE *fp; { int c = fgetc(fp); if (XXOK(fp)) XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return c; } int xxgetw(fp) FILE *fp; { int w = getw(fp); if (XXOK(fp)) XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return w; } char * xxgets(s) char *s; { s = gets(s); if (XXOK(stdin)) XXPOS(stdin) = lseek(fileno(stdin), 0, SEEK_CUR); return s; } char * xxfgets(s, n, fp) char *s; int n; FILE *fp; { s = fgets(s, n, fp); if (XXOK(fp)) XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return s; } int xxfseek(fp, offset, ptrname) FILE *fp; long offset; int ptrname; { if (XXOK(fp)) return (xxlseek(fp, offset, ptrname) >= 0) ? 0 : -1; else return fseek(fp, offset, ptrname); } long xxftell(fp) FILE *fp; { if (XXOK(fp)) return xxlseek(fp, 0, SEEK_CUR); else return ftell(fp); } int xx__filbuf(fp) FILE *fp; { int c = __filbuf(fp); if (XXOK(fp)) XXPOS(fp) = lseek(fileno(fp), 0, SEEK_CUR); return c; } #endif /* SYSVIO */ dvi2dvi-2.0-alpha/version.c100644 163 163 763 7202305641 15156 0ustar sakuraisakurai/* * version 0.1 (Oct 1992) * version 0.2 (Dec 1992) * version 0.3 (Dec 1992) * version 0.4 (Jun 1993) * version 0.5 (Sep 1993) * version 0.6 (Oct 1993) * version 0.7 (Nov 1993) * version 0.8 (Jan 1994) * version 0.9 (Nov 1994) * version 1.0 alpha (Mar 1995) * version 1.0 alpha1 (Oct 1995) * version 1.0 (May 1996) * version 1.01 (May 1998) * version 1.1 (Sep 1999) * version 1.2 (May 2000) * version 2.0 alpha (May 2000) */ char *version = "@(#)dvi2dvi 2.0 alpha"; dvi2dvi-2.0-alpha/dvi.c100644 163 163 14421 7116235442 14314 0ustar sakuraisakurai#include "defs.h" #include "global.h" #include "commands.h" int dvi_h = 0; /* current h on output dvi */ int dvi_v = 0; /* current v on output dvi */ int *dvi_move; static DEV_FONT dvi_curf; int spmax = 0; long dvipos; long lpagep; static int vert_moveovercom; static BOOLEAN dir_used; extern int command; extern int num, den; extern long postambleptr; extern int dirmode; extern char *dir_spec_vert; extern char *dir_spec_end; extern int dir_spec_vert_len; extern int dir_spec_end_len; /* ARGSUSED */ dev_arg(option, c) char option; char *c; { } dev_init() { } dev_setup() { if (dirmode == DIR_KEEP) { dfd_dirkeep(); vfd_dirkeep(); vert_moveovercom = RIGHT1-1; } else vert_moveovercom = DOWN1-1; init_begend_str(); dir_used = FALSE; } dev_endsetup() { struct font_entry *fe; int k; /* for (fe = hdfontent, k = 0; fe != NULL; fe = fe->next) if (fe->fnt_use == FU_USED) { fe->k = k; fe->fnt_use = FU_NOTUSED; k++; } */ /* output preamble */ putbyte(outfp, PRE); putnint(outfp, DVIFORMAT, 1); putnint(outfp, num, 4); putnint(outfp, den, 4); putnint(outfp, mag, 4); (void)fseek(dvifp, (long)14, 0); putnint(outfp, k = getuint(dvifp, 1), 1); copybytes(dvifp, outfp, k); dvipos = 15+k; lpagep = -1; } dev_finish() { long postpos; int i; struct font_entry *fe; end_string(); postpos = dvipos; /* output postamble */ putbyte(outfp, POST); putnint(outfp, lpagep, 4); putnint(outfp, num, 4); putnint(outfp, den, 4); putnint(outfp, mag, 4); (void)fseek(dvifp, postambleptr+17, 0); copybytes(dvifp, outfp, 8); putnint(outfp, spmax+1, 2); (void)fseek(dvifp, (long)2, 1); copybytes(dvifp, outfp, 2); dvipos += 29; for (fe = hdfontent; fe != NULL; fe = fe->next) if (fe->fnt_use == FU_USED) putfontdef(fe); putbyte(outfp, POST_POST); putnint(outfp, postpos, 4); putnint(outfp, dir_used ? EXTDVIFORMAT : DVIFORMAT, 1); dvipos += 6; for (i = 0; i < 7 - (dvipos+3) % 4; i++) putbyte(outfp, 223); } putfontdef(fe) struct font_entry *fe; { byte b[sizeof(int)]; int n; n = uinttob(b, fe->k); putbyte(outfp, FNT_DEF1+n-1); putbytes(outfp, b, n); putnint(outfp, fe->c, 4); putnint(outfp, fe->s, 4); putnint(outfp, fe->d, 4); putnint(outfp, fe->a, 1); putnint(outfp, fe->l, 1); putbytes(outfp, fe->n, fe->a+fe->l); dvipos += n+15+fe->a+fe->l; } static int devicefont = 0; dev_initpage() { dvi_h = dvi_v = 0; dev_initfont(); } dev_bop(count) int count[]; { int i; end_string(); putbyte(outfp, BOP); for (i = 0; i < 10; i++) putnint(outfp, count[i], 4); putnint(outfp, lpagep, 4); lpagep = dvipos; dvipos += 45; } dev_eop() { end_string(); putbyte(outfp, EOP); dvipos++; } dvi_push() { extern int sp; putbyte(outfp, PUSH); dvipos++; if (sp > spmax) spmax = sp; } dev_push() { end_string(); dvi_push(); } dvi_pop() { putbyte(outfp, POP); dvipos++; } dev_pop() { end_string(); dvi_pop(); } dev_initfont() { dvi_curf = DEV_NULLFONT; } dev_setfont(dvif) DEV_FONT dvif; { byte b[sizeof(int)]; int n; if (dvif != dvi_curf) { end_string(); if (dvif->fnt_use == FU_NOTUSED) { dvif->k = devicefont++; putfontdef(dvif); dvif->fnt_use = FU_USED; } if (0 <= dvif->k && dvif->k <= 63) { putbyte(outfp, FONT_00+dvif->k); dvipos++; } else { n = uinttob(b, dvif->k); putbyte(outfp, FNT1+n-1); putbytes(outfp, b, n); dvipos += n+1; } dvi_curf = dvif; } } dev_move0(com) int com; { end_string(); putbyte(outfp, com); dvipos++; } dev_move(x, n, com) byte *x; int n, com; { end_string(); putbyte(outfp, com+n); putbytes(outfp, x, n); dvipos += n+1; } dev_makemove(x, com) int x, com; { byte s[sizeof(int)]; int n; /* use resolution as drift!! */ if (-resolution < x && x < resolution) return; n = inttob(s, x); dev_move(s, n, com); } dev_makemoveover(x) int x; { dev_makemove(x, dir == HOR ? RIGHT1-1 : vert_moveovercom); } /* ARGSUSED */ dev_setposn(x, y) int x, y; { } dvi_setrule(a, b, com) int a, b, com; { putbyte(outfp, com); putnint(outfp, a, 4); putnint(outfp, b, 4); dvipos += 9; } dev_setrule(a, b, com) int a, b, com; { end_string(); dvi_setrule(a, b, com); } dvi_dir(d) int d; { dir_used = TRUE; putbyte(outfp, DIR); putnint(outfp, d, 1); dvipos += 2; } dev_dir(d) int d; { if (d == HOR) dvi_move = &dvi_h; else if (d == VER) dvi_move = &dvi_v; if (dirmode == DIR_KEEP) dvi_dir(d); } BOOLEAN instring = FALSE; int (*begstr)(); int (*endstr)(); int dvi_move_beg; begin_string() { if (dirmode != DIR_KEEP && !instring && dir != HOR) { instring = TRUE; begstr(); } } end_string() { if (dirmode != DIR_KEEP && instring) { instring = FALSE; endstr(); } } bs_elim() { dvi_dir(dir); } es_elim() { dvi_dir(HOR); } bs_spec() { dvi_move_beg = *dvi_move; dvi_push(); putbytes(outfp, dir_spec_vert, dir_spec_vert_len); dvipos += dir_spec_vert_len; } es_spec() { putbytes(outfp, dir_spec_end, dir_spec_end_len); dvipos += dir_spec_end_len; dvi_pop(); dev_makemove(*dvi_move-dvi_move_beg, DOWN1-1); } bs_ignore() { dvi_move_beg = *dvi_move; } es_ignore() { dev_makemove(*dvi_move-dvi_move_beg, DOWN1-1); } #define MARKWIDTH 50000 bs_mline() { dvi_move_beg = *dvi_move; } es_mline() { dev_makemove(*dvi_move-dvi_move_beg, DOWN1-1); dvi_setrule(*dvi_move-dvi_move_beg, MARKWIDTH, PUT_RULE); } bs_mchar() { } es_mchar() { } init_begend_str() { if (dirmode == DIR_ELIM) { begstr = bs_elim; endstr = es_elim; } else if (dirmode == DIR_SPECIAL) { begstr = bs_spec; endstr = es_spec; } else if (dirmode == DIR_IGNORE) { begstr = bs_ignore; endstr = es_ignore; } else if (dirmode == DIR_MARKLINE) { begstr = bs_mline; endstr = es_mline; } else if (dirmode == DIR_MARKCHAR) { begstr = bs_mchar; endstr = es_mchar; } } /* ARGSUSED */ void dev_predospecial(str, n) byte *str; int n; { } void dev_dospecial(str, n) byte *str; int n; { end_string(); putbyte(outfp, command); putnint(outfp, n, command-XXX1+1); putbytes(outfp, str, n); dvipos += n+1+command-XXX1+1; } dvi2dvi-2.0-alpha/dvifont.c100644 163 163 2456 7054301770 15167 0ustar sakuraisakurai#include "defs.h" #include "commands.h" #include "global.h" #include "dvi.h" void init_dvi_fontinfo(fe) struct font_entry *fe; { int null_markchar(); void read_dvi_fontinfo(); fe->fnt_type = FT_DVI; /*fe->base_fe->fnt_use = FU_USED;*/ fe->fnt_markchar = null_markchar; fe->fnt_readfontinfo = read_dvi_fontinfo; } void read_dvi_fontinfo(fe) struct font_entry *fe; { DEV_FONT dvi_fontdict(); int dvi_setchar(), dvi_setstring(); fe->dev_fontdict = dvi_fontdict; fe->dev_setchar = dvi_setchar; fe->dev_setstring = dvi_setstring; } /* ARGSUSED */ DEV_FONT dvi_fontdict(fe, c) struct font_entry *fe; int c; { return fe->base_fe; } dvichar(c) unsigned int c; { byte b[sizeof(int)]; int n; if (chmove) { if (c <= SETC_127) { putbyte(outfp, c); dvipos++; } else { n = uinttob(b, c); putbyte(outfp, SET1+n-1); putbytes(outfp, b, n); dvipos += n+1; } } else { n = uinttob(b, c); putbyte(outfp, PUT1+n-1); putbytes(outfp, b, n); dvipos += n+1; } } dvi_setchar(fe, c) struct font_entry *fe; unsigned int c; { begin_string(); dvichar(c); } dvi_setstring(fe, s, len) struct font_entry *fe; byte *s; int len; { int i; begin_string(); for (i = 0; i < len; i++, s++) putbyte(outfp, *s); dvipos += len; } dvi2dvi-2.0-alpha/dvitfm.c100644 163 163 6716 7054302000 14775 0ustar sakuraisakurai#include "defs.h" #include "global.h" #include "commands.h" #include "bifont.h" #include "dvi.h" extern int dirmode; /* ARGSUSED */ dev_tfm_initfontdict(fe) struct font_entry *fe; { } dev_tfm_initfe(fe) struct font_entry *fe; { DEV_FONT dvi_fontdict(); int tfm_setchar(), tfm_setstring(); int blank_setchar(), blank_setstring(); int mchar_setchar(), mchar_setstring(); int dvi_setchar(), dvi_setstring(); fe->dev_fontdict = dvi_fontdict; if (fe->vert_use == VU_VERT) { if (dirmode == DIR_KEEP || dirmode == DIR_ELIM) { fe->dev_setchar = dvi_setchar; fe->dev_setstring = dvi_setstring; } else if (dirmode == DIR_SPECIAL) { fe->dev_setchar = tfm_setchar; fe->dev_setstring = tfm_setstring; } else if (dirmode == DIR_IGNORE || dirmode == DIR_MARKLINE) { fe->dev_setchar = blank_setchar; fe->dev_setstring = blank_setstring; } else if (dirmode == DIR_MARKCHAR) { fe->dev_setchar = mchar_setchar; fe->dev_setstring = mchar_setstring; } } else { fe->dev_setchar = dvi_setchar; fe->dev_setstring = dvi_setstring; } } tfm_setchar(fe, c) struct font_entry *fe; int c; { struct tfmchar_entry *ce = &(tfmfinfo(fe)->ch[c]); int cw; begin_string(); dvichar(ce->dev_char); *dvi_move += (cw = ce->tfmw); return cw; } tfm_setstring(fe, s, len) struct font_entry *fe; char *s; int len; { char *sp; struct tfmchar_entry *ce = tfmfinfo(fe)->ch; int cw; begin_string(); for (sp = s, cw = 0; sp < s+len; sp++) { putbyte(outfp, (ce+*sp)->dev_char); cw += (ce+*sp)->tfmw; } *dvi_move += cw; dvipos += len; return cw; } blank_setchar(fe, c) struct font_entry *fe; int c; { struct tfmchar_entry *ce = &(tfmfinfo(fe)->ch[c]); int cw; begin_string(); *dvi_move += (cw = ce->tfmw); return cw; } blank_setstring(fe, s, len) struct font_entry *fe; char *s; int len; { char *sp; struct tfmchar_entry *ce = tfmfinfo(fe)->ch; int cw; begin_string(); for (sp = s, cw = 0; sp < s+len; sp++) { cw += (ce+*sp)->tfmw; } *dvi_move += cw; return cw; } mchar_setchar(fe, c) struct font_entry *fe; int c; { struct tfmchar_entry *ce = &(tfmfinfo(fe)->ch[c]); int cw; dev_makemove(ce->tfmw, DOWN1-1); dvi_push(); dvichar(ce->dev_char); dvi_pop(); *dvi_move += (cw = ce->tfmw); return cw; } mchar_setstring(fe, s, len) struct font_entry *fe; char *s; int len; { char *sp; struct tfmchar_entry *ce = tfmfinfo(fe)->ch; int cw; begin_string(); for (sp = s, cw = 0; sp < s+len; sp++) { dev_makemove((ce+*sp)->tfmw, DOWN1-1); dvi_push(); putbyte(outfp, (ce+*sp)->dev_char); dvi_pop(); cw += (ce+*sp)->tfmw; } *dvi_move += cw; dvipos += len; return cw; } dev_vftfm_char(fe, c, tfmw) struct font_entry *fe; int c, tfmw; { dev_setfont(fe); dvi_vfchar(c, tfmw-tfmfinfo(fe)->ch[c].tfmw); } /* ARGSUSED */ dev_jfm_initfontdict(fe) struct font_entry *fe; { } dev_jfm_initfe(fe, id) struct font_entry *fe; int id; { DEV_FONT dvi_fontdict(); int dvi_setchar(), dvi_setstring(); fe->dev_fontdict = dvi_fontdict; fe->dev_setchar = dvi_setchar; fe->dev_setstring = dvi_setstring; } dev_vfjfm_char(fe, c, tfmw) struct font_entry *fe; int c, tfmw; { dev_setfont(fe); dvi_vfchar(c, tfmw-jfmfinfo(fe)->ch[getctype(c,jfmfinfo(fe))].tfmw); } dvi_vfchar(c, dtfmw) int c, dtfmw; { begin_string(); dvichar(c); if (chmove && dtfmw != 0) dev_makemoveover(dtfmw); }