#define DVICOPY #include "cpascal.h" /* 9999 */ #define maxfonts ( 300 ) #define maxchars ( 750000L ) #define maxwidths ( 10000 ) #define maxpackets ( 20000 ) #define maxbytes ( 100000L ) #define maxrecursion ( 10 ) #define stacksize ( 100 ) #define terminallinelength ( 256 ) typedef integer int31 ; typedef integer int24u ; typedef integer int24 ; typedef integer int23 ; typedef unsigned short int16u ; typedef short int16 ; typedef short int15 ; typedef unsigned char int8u ; typedef schar int8 ; typedef char int7 ; typedef unsigned char ASCIIcode ; typedef text /* of ASCIIcode */ textfile ; typedef schar signedbyte ; typedef unsigned char eightbits ; typedef short signedpair ; typedef unsigned short sixteenbits ; typedef integer signedtrio ; typedef integer twentyfourbits ; typedef integer signedquad ; typedef text /* of eightbits */ bytefile ; typedef eightbits packedbyte ; typedef integer bytepointer ; typedef integer pcktpointer ; typedef short hashcode ; typedef integer widthpointer ; typedef integer charoffset ; typedef integer charpointer ; typedef char ftype ; typedef integer fontnumber ; typedef char typeflag ; typedef char cmdpar ; typedef char cmdcl ; typedef boolean vfstate [2][2] ; typedef char vftype ; typedef integer stackpointer ; typedef integer stackindex ; typedef integer pair32 [2] ; typedef struct { integer hfield ; integer vfield ; pair32 wxfield ; pair32 yzfield ; } stackrecord ; typedef integer recurpointer ; ASCIIcode xord[256] ; ASCIIcode xchr[256] ; char history ; packedbyte bytemem[maxbytes + 1] ; bytepointer pcktstart[maxpackets + 1] ; bytepointer byteptr ; pcktpointer pcktptr ; pcktpointer plink[maxpackets + 1] ; pcktpointer phash[354] ; pcktpointer strfonts, strchars, strwidths, strpackets, strbytes, strrecursion, strstack, strnamelength ; pcktpointer curpckt ; bytepointer curloc ; bytepointer curlimit ; char * curname ; int15 lcurname ; integer widths[maxwidths + 1] ; widthpointer wlink[maxwidths + 1] ; widthpointer whash[354] ; widthpointer nwidths ; widthpointer charwidths[maxchars + 1] ; pcktpointer charpackets[maxchars + 1] ; charpointer nchars ; fontnumber nf ; integer fntcheck[maxfonts + 1] ; int31 fntscaled[maxfonts + 1] ; int31 fntdesign[maxfonts + 1] ; pcktpointer fntname[maxfonts + 1] ; eightbits fntbc[maxfonts + 1] ; eightbits fntec[maxfonts + 1] ; charoffset fntchars[maxfonts + 1] ; ftype fnttype[maxfonts + 1] ; fontnumber fntfont[maxfonts + 1] ; fontnumber curfnt ; int24 curext ; int8u curres ; typeflag curtype ; int24 pcktext ; int8u pcktres ; boolean pcktdup ; pcktpointer pcktprev ; int7 pcktmmsg, pcktsmsg, pcktdmsg ; bytefile tfmfile ; pcktpointer tfmext ; eightbits tfmb0, tfmb1, tfmb2, tfmb3 ; real tfmconv ; bytefile dvifile ; integer dviloc ; char * fullname ; cmdpar dvipar[256] ; cmdcl dvicl[256] ; eightbits dvicharcmd[2] ; eightbits dvirulecmd[2] ; eightbits #define dvirightcmd (zzzaa -7) zzzaa[3] ; eightbits #define dvidowncmd (zzzab -12) zzzab[3] ; eightbits curcmd ; integer curparm ; cmdcl curclass ; charpointer curcp ; widthpointer curwp ; boolean curupd ; integer curvdimen ; integer curhdimen ; integer dviefnts[maxfonts + 1] ; fontnumber dviifnts[maxfonts + 1] ; fontnumber dvinf ; bytefile vffile ; integer vfloc ; integer vflimit ; pcktpointer vfext ; fontnumber vfcurfnt ; integer z ; integer alpha ; int15 beta ; integer vfefnts[maxfonts + 1] ; fontnumber vfifnts[maxfonts + 1] ; fontnumber vfnf ; fontnumber lclnf ; vfstate vfmove[stacksize + 1] ; bytepointer vfpushloc[stacksize + 1] ; bytepointer vflastloc[stacksize + 1] ; bytepointer vflastend[stacksize + 1] ; eightbits vfpushnum[stacksize + 1] ; vftype vflast[stacksize + 1] ; stackpointer vfptr ; stackpointer stackused ; vftype vfchartype[2] ; vftype vfruletype[2] ; integer widthdimen ; int16 nopt ; int16 kopt ; bytepointer scanptr ; ASCIIcode sepchar ; boolean typesetting ; integer selectcount[10][10] ; boolean selectthere[10][10] ; char selectvals[10] ; integer selectmax[10] ; integer outmag ; integer count[10] ; char numselect ; char curselect ; boolean selected ; boolean alldone ; pcktpointer strmag, strselect ; stackrecord stack[stacksize + 1] ; stackrecord curstack ; stackrecord zerostack ; stackpointer stackptr ; fontnumber recurfnt[maxrecursion + 1] ; int24 recurext[maxrecursion + 1] ; eightbits recurres[maxrecursion + 1] ; pcktpointer recurpckt[maxrecursion + 1] ; bytepointer recurloc[maxrecursion + 1] ; recurpointer nrecur ; recurpointer recurused ; int31 dvinum ; int31 dviden ; int31 dvimag ; bytefile outfile ; integer outloc ; integer outback ; int31 outmaxv ; int31 outmaxh ; int16u outstack ; int16u outpages ; fontnumber outfnts[maxfonts + 1] ; fontnumber outnf ; fontnumber outfnt ; text termout ; #include "dvicopy.h" void #ifdef HAVE_PROTOTYPES zprintpacket ( pcktpointer p ) #else zprintpacket ( p ) pcktpointer p ; #endif { bytepointer k ; {register integer for_end; k = pcktstart [p ];for_end = pcktstart [p + 1 ]- 1 ; if ( k <= for_end) do putc ( xchr [bytemem [k ]], termout ); while ( k++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES zprintfont ( fontnumber f ) #else zprintfont ( f ) fontnumber f ; #endif { pcktpointer p ; bytepointer k ; int31 m ; Fputs( termout , " = " ) ; p = fntname [f ]; {register integer for_end; k = pcktstart [p ]+ 1 ;for_end = pcktstart [ p + 1 ]- 1 ; if ( k <= for_end) do putc ( xchr [bytemem [k ]], termout ); while ( k++ < for_end ) ;} m = round ( ( fntscaled [f ]/ ((double) fntdesign [f ]) ) * outmag ) ; if ( m != 1000 ) fprintf( termout , "%s%ld", " scaled " , (long)m ) ; } void #ifdef HAVE_PROTOTYPES printoptions ( void ) #else printoptions ( ) #endif { fprintf( termout , "%s\n", "Valid options are:" ) ; fprintf( termout , "%s%ld%s\n", " mag" , (long)sepchar , "" ) ; fprintf( termout , "%s%ld%s%ld%s%ld%s\n", " select" , (long)sepchar , "" , (long)sepchar , "[] (up to " , (long)10 , " ranges)" ) ; } void #ifdef HAVE_PROTOTYPES jumpout ( void ) #else jumpout ( ) #endif { history = 3 ; closefilesandterminate () ; uexit ( 1 ) ; } void #ifdef HAVE_PROTOTYPES zconfusion ( pcktpointer p ) #else zconfusion ( p ) pcktpointer p ; #endif { Fputs( termout , " !This can't happen (" ) ; printpacket ( p ) ; fprintf( termout , "%s\n", ")." ) ; jumpout () ; } void #ifdef HAVE_PROTOTYPES zoverflow ( pcktpointer p , int16u n ) #else zoverflow ( p , n ) pcktpointer p ; int16u n ; #endif { fprintf( termout , "%s%s%s", " !Sorry, " , "DVIcopy" , " capacity exceeded [" ) ; printpacket ( p ) ; fprintf( termout , "%c%ld%s\n", '=' , (long)n , "]." ) ; jumpout () ; } void #ifdef HAVE_PROTOTYPES badtfm ( void ) #else badtfm ( ) #endif { Fputs( termout , "Bad TFM file" ) ; printfont ( curfnt ) ; fprintf( termout , "%c\n", '!' ) ; { fprintf( stderr , "%c%s%c\n", ' ' , "Use TFtoPL/PLtoTF to diagnose and correct the problem" , '.' ) ; jumpout () ; } } void #ifdef HAVE_PROTOTYPES badfont ( void ) #else badfont ( ) #endif { putc ('\n', termout ); switch ( fnttype [curfnt ]) {case 0 : confusion ( strfonts ) ; break ; case 1 : badtfm () ; break ; case 2 : { Fputs( termout , "Bad VF file" ) ; printfont ( curfnt ) ; fprintf( termout , "%s%ld\n", " loc=" , (long)vfloc ) ; { fprintf( stderr , "%c%s%c\n", ' ' , "Use VFtoVP/VPtoVF to diagnose and correct the problem" , '.' ) ; jumpout () ; } } break ; } } void #ifdef HAVE_PROTOTYPES baddvi ( void ) #else baddvi ( ) #endif { putc ('\n', termout ); fprintf( termout , "%s%ld%c\n", "Bad DVI file: loc=" , (long)dviloc , '!' ) ; Fputs( termout , " Use DVItype with output level" ) ; if ( true ) Fputs( termout , "=4" ) ; else Fputs( termout , "<4" ) ; { fprintf( stderr , "%c%s%c\n", ' ' , "to diagnose the problem" , '.' ) ; jumpout () ; } } void #ifdef HAVE_PROTOTYPES parsearguments ( void ) #else parsearguments ( ) #endif { #define noptions ( 5 ) getoptstruct longoptions[noptions + 1] ; integer getoptreturnval ; cinttype optionindex ; integer currentoption ; cinttype k, m ; char * endnum ; currentoption = 0 ; longoptions [0 ].name = "help" ; longoptions [0 ].hasarg = 0 ; longoptions [0 ].flag = 0 ; longoptions [0 ].val = 0 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = "version" ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = "magnification" ; longoptions [currentoption ].hasarg = 1 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = "max-pages" ; longoptions [currentoption ].hasarg = 1 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = "page-start" ; longoptions [currentoption ].hasarg = 1 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = 0 ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].val = 0 ; outmag = 0 ; curselect = 0 ; selectmax [curselect ]= 0 ; selected = true ; do { getoptreturnval = getoptlongonly ( argc , argv , "" , longoptions , addressof ( optionindex ) ) ; if ( getoptreturnval == -1 ) { ; } else if ( getoptreturnval == 63 ) { usage ( 1 , "dvicopy" ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "help" ) == 0 ) ) { usage ( 0 , DVICOPYHELP ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "version" ) == 0 ) ) { printversionandexit ( "This is DVIcopy, Version 1.5" , "Peter Breitenlohner" , nil ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "magnification" ) == 0 ) ) { outmag = atou ( optarg ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "max-pages" ) == 0 ) ) { selectmax [curselect ]= atou ( optarg ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "page-start" ) == 0 ) ) { k = 0 ; m = 0 ; while ( optarg [m ]) { if ( optarg [m ]== 42 ) { selectthere [curselect ][k ]= false ; m = m + 1 ; } else if ( optarg [m ]== 46 ) { k = k + 1 ; if ( k >= 10 ) { fprintf( stderr , "%s\n", "dvicopy: More than ten count registers specified." ) ; uexit ( 1 ) ; } m = m + 1 ; } else { selectcount [curselect ][k ]= strtol ( optarg + m , addressof ( endnum ) , 10 ) ; if ( endnum == optarg + m ) { fprintf( stderr , "%s\n", "dvicopy: -page-start values must be numeric or *." ) ; uexit ( 1 ) ; } selectthere [curselect ][k ]= true ; m = m + endnum - ( optarg + m ) ; } } selectvals [curselect ]= k ; } } while ( ! ( getoptreturnval == -1 ) ) ; if ( optind == argc ) { dvifile = makebinaryfile ( stdin ) ; outfile = makebinaryfile ( stdout ) ; termout = stderr ; } else if ( optind + 1 == argc ) { resetbin ( dvifile , extendfilename ( cmdline ( optind ) , "dvi" ) ) ; outfile = makebinaryfile ( stdout ) ; termout = stderr ; } else if ( optind + 2 == argc ) { resetbin ( dvifile , extendfilename ( cmdline ( optind ) , "dvi" ) ) ; rewritebin ( outfile , extendfilename ( cmdline ( optind + 1 ) , "dvi" ) ) ; termout = stdout ; } else { fprintf( stderr , "%s\n", "dvicopy: Need at most two file arguments." ) ; usage ( 1 , "dvicopy" ) ; } } void #ifdef HAVE_PROTOTYPES initialize ( void ) #else initialize ( ) #endif { int16 i ; hashcode h ; kpsesetprogname ( argv [0 ]) ; parsearguments () ; Fputs( termout , "This is DVIcopy, Version 1.5" ) ; fprintf( termout , "%s\n", versionstring ) ; fprintf( termout , "%s\n", "Copyright (C) 1990,95 Peter Breitenlohner" ) ; fprintf( termout , "%s\n", "Distributed under terms of GNU General Public License" ) ; {register integer for_end; i = 0 ;for_end = 31 ; if ( i <= for_end) do xchr [i ]= '?' ; while ( i++ < for_end ) ;} xchr [32 ]= ' ' ; xchr [33 ]= '!' ; xchr [34 ]= '"' ; xchr [35 ]= '#' ; xchr [36 ]= '$' ; xchr [37 ]= '%' ; xchr [38 ]= '&' ; xchr [39 ]= '\'' ; xchr [40 ]= '(' ; xchr [41 ]= ')' ; xchr [42 ]= '*' ; xchr [43 ]= '+' ; xchr [44 ]= ',' ; xchr [45 ]= '-' ; xchr [46 ]= '.' ; xchr [47 ]= '/' ; xchr [48 ]= '0' ; xchr [49 ]= '1' ; xchr [50 ]= '2' ; xchr [51 ]= '3' ; xchr [52 ]= '4' ; xchr [53 ]= '5' ; xchr [54 ]= '6' ; xchr [55 ]= '7' ; xchr [56 ]= '8' ; xchr [57 ]= '9' ; xchr [58 ]= ':' ; xchr [59 ]= ';' ; xchr [60 ]= '<' ; xchr [61 ]= '=' ; xchr [62 ]= '>' ; xchr [63 ]= '?' ; xchr [64 ]= '@' ; xchr [65 ]= 'A' ; xchr [66 ]= 'B' ; xchr [67 ]= 'C' ; xchr [68 ]= 'D' ; xchr [69 ]= 'E' ; xchr [70 ]= 'F' ; xchr [71 ]= 'G' ; xchr [72 ]= 'H' ; xchr [73 ]= 'I' ; xchr [74 ]= 'J' ; xchr [75 ]= 'K' ; xchr [76 ]= 'L' ; xchr [77 ]= 'M' ; xchr [78 ]= 'N' ; xchr [79 ]= 'O' ; xchr [80 ]= 'P' ; xchr [81 ]= 'Q' ; xchr [82 ]= 'R' ; xchr [83 ]= 'S' ; xchr [84 ]= 'T' ; xchr [85 ]= 'U' ; xchr [86 ]= 'V' ; xchr [87 ]= 'W' ; xchr [88 ]= 'X' ; xchr [89 ]= 'Y' ; xchr [90 ]= 'Z' ; xchr [91 ]= '[' ; xchr [92 ]= '\\' ; xchr [93 ]= ']' ; xchr [94 ]= '^' ; xchr [95 ]= '_' ; xchr [96 ]= '`' ; xchr [97 ]= 'a' ; xchr [98 ]= 'b' ; xchr [99 ]= 'c' ; xchr [100 ]= 'd' ; xchr [101 ]= 'e' ; xchr [102 ]= 'f' ; xchr [103 ]= 'g' ; xchr [104 ]= 'h' ; xchr [105 ]= 'i' ; xchr [106 ]= 'j' ; xchr [107 ]= 'k' ; xchr [108 ]= 'l' ; xchr [109 ]= 'm' ; xchr [110 ]= 'n' ; xchr [111 ]= 'o' ; xchr [112 ]= 'p' ; xchr [113 ]= 'q' ; xchr [114 ]= 'r' ; xchr [115 ]= 's' ; xchr [116 ]= 't' ; xchr [117 ]= 'u' ; xchr [118 ]= 'v' ; xchr [119 ]= 'w' ; xchr [120 ]= 'x' ; xchr [121 ]= 'y' ; xchr [122 ]= 'z' ; xchr [123 ]= '{' ; xchr [124 ]= '|' ; xchr [125 ]= '}' ; xchr [126 ]= '~' ; {register integer for_end; i = 127 ;for_end = 255 ; if ( i <= for_end) do xchr [i ]= '?' ; while ( i++ < for_end ) ;} {register integer for_end; i = 0 ;for_end = 255 ; if ( i <= for_end) do xord [chr ( i ) ]= 32 ; while ( i++ < for_end ) ;} {register integer for_end; i = 32 ;for_end = 126 ; if ( i <= for_end) do xord [xchr [i ]]= i ; while ( i++ < for_end ) ;} history = 0 ; pcktptr = 1 ; byteptr = 1 ; pcktstart [0 ]= 1 ; pcktstart [1 ]= 1 ; {register integer for_end; h = 0 ;for_end = 352 ; if ( h <= for_end) do phash [h ]= 0 ; while ( h++ < for_end ) ;} whash [0 ]= 1 ; wlink [1 ]= 0 ; widths [0 ]= 0 ; widths [1 ]= 0 ; nwidths = 2 ; {register integer for_end; h = 1 ;for_end = 352 ; if ( h <= for_end) do whash [h ]= 0 ; while ( h++ < for_end ) ;} nchars = 0 ; nf = 0 ; curfnt = maxfonts ; pcktmmsg = 0 ; pcktsmsg = 0 ; pcktdmsg = 0 ; {register integer for_end; i = 0 ;for_end = 136 ; if ( i <= for_end) do dvipar [i ]= 0 ; while ( i++ < for_end ) ;} {register integer for_end; i = 138 ;for_end = 255 ; if ( i <= for_end) do dvipar [i ]= 1 ; while ( i++ < for_end ) ;} dvipar [132 ]= 11 ; dvipar [137 ]= 11 ; dvipar [143 ]= 2 ; dvipar [144 ]= 4 ; dvipar [145 ]= 6 ; dvipar [146 ]= 8 ; {register integer for_end; i = 171 ;for_end = 234 ; if ( i <= for_end) do dvipar [i ]= 12 ; while ( i++ < for_end ) ;} dvipar [235 ]= 3 ; dvipar [236 ]= 5 ; dvipar [237 ]= 7 ; dvipar [238 ]= 9 ; dvipar [239 ]= 3 ; dvipar [240 ]= 5 ; dvipar [241 ]= 7 ; dvipar [242 ]= 10 ; {register integer for_end; i = 0 ;for_end = 3 ; if ( i <= for_end) do { dvipar [i + 148 ]= dvipar [i + 143 ]; dvipar [i + 153 ]= dvipar [i + 143 ]; dvipar [i + 157 ]= dvipar [i + 143 ]; dvipar [i + 162 ]= dvipar [i + 143 ]; dvipar [i + 167 ]= dvipar [i + 143 ]; dvipar [i + 243 ]= dvipar [i + 235 ]; } while ( i++ < for_end ) ;} {register integer for_end; i = 0 ;for_end = 136 ; if ( i <= for_end) do dvicl [i ]= 0 ; while ( i++ < for_end ) ;} dvicl [132 ]= 1 ; dvicl [137 ]= 1 ; dvicl [138 ]= 17 ; dvicl [139 ]= 17 ; dvicl [140 ]= 17 ; dvicl [141 ]= 3 ; dvicl [142 ]= 4 ; dvicl [147 ]= 5 ; dvicl [152 ]= 6 ; dvicl [161 ]= 10 ; dvicl [166 ]= 11 ; {register integer for_end; i = 0 ;for_end = 3 ; if ( i <= for_end) do { dvicl [i + 143 ]= 7 ; dvicl [i + 148 ]= 8 ; dvicl [i + 153 ]= 9 ; dvicl [i + 157 ]= 12 ; dvicl [i + 162 ]= 13 ; dvicl [i + 167 ]= 14 ; dvicl [i + 239 ]= 2 ; dvicl [i + 243 ]= 16 ; } while ( i++ < for_end ) ;} {register integer for_end; i = 171 ;for_end = 238 ; if ( i <= for_end) do dvicl [i ]= 15 ; while ( i++ < for_end ) ;} {register integer for_end; i = 247 ;for_end = 255 ; if ( i <= for_end) do dvicl [i ]= 17 ; while ( i++ < for_end ) ;} dvicharcmd [false ]= 133 ; dvicharcmd [true ]= 128 ; dvirulecmd [false ]= 137 ; dvirulecmd [true ]= 132 ; dvirightcmd [7 ]= 143 ; dvirightcmd [8 ]= 148 ; dvirightcmd [9 ]= 153 ; dvidowncmd [12 ]= 157 ; dvidowncmd [13 ]= 162 ; dvidowncmd [14 ]= 167 ; curcp = 0 ; curwp = 0 ; dvinf = 0 ; lclnf = 0 ; vfmove [0 ][0 ][0 ]= false ; vfmove [0 ][0 ][1 ]= false ; vfmove [0 ][1 ][0 ]= false ; vfmove [0 ][1 ][1 ]= false ; stackused = 0 ; vfchartype [false ]= 3 ; vfchartype [true ]= 0 ; vfruletype [false ]= 4 ; vfruletype [true ]= 1 ; widthdimen = -1073741824L ; widthdimen = widthdimen - 1073741824L ; nopt = 0 ; kopt = 0 ; typesetting = false ; zerostack .hfield = 0 ; zerostack .vfield = 0 ; {register integer for_end; i = 0 ;for_end = 1 ; if ( i <= for_end) do { zerostack .wxfield [i ]= 0 ; zerostack .yzfield [i ]= 0 ; } while ( i++ < for_end ) ;} nrecur = 0 ; recurused = 0 ; outloc = 0 ; outback = -1 ; outmaxv = 0 ; outmaxh = 0 ; outstack = 0 ; outpages = 0 ; outnf = 0 ; } pcktpointer #ifdef HAVE_PROTOTYPES makepacket ( void ) #else makepacket ( ) #endif { /* 31 */ register pcktpointer Result; bytepointer i, k ; hashcode h ; bytepointer s, l ; pcktpointer p ; s = pcktstart [pcktptr ]; l = byteptr - s ; if ( l == 0 ) p = 0 ; else { h = bytemem [s ]; i = s + 1 ; while ( i < byteptr ) { h = ( h + h + bytemem [i ]) % 353 ; i = i + 1 ; } p = phash [h ]; while ( p != 0 ) { if ( ( pcktstart [p + 1 ]- pcktstart [p ]) == l ) { i = s ; k = pcktstart [p ]; while ( ( i < byteptr ) && ( bytemem [i ]== bytemem [k ]) ) { i = i + 1 ; k = k + 1 ; } if ( i == byteptr ) { byteptr = pcktstart [pcktptr ]; goto lab31 ; } } p = plink [p ]; } p = pcktptr ; plink [p ]= phash [h ]; phash [h ]= p ; if ( pcktptr == maxpackets ) overflow ( strpackets , maxpackets ) ; pcktptr = pcktptr + 1 ; pcktstart [pcktptr ]= byteptr ; } lab31: Result = p ; return Result ; } pcktpointer #ifdef HAVE_PROTOTYPES newpacket ( void ) #else newpacket ( ) #endif { register pcktpointer Result; if ( pcktptr == maxpackets ) overflow ( strpackets , maxpackets ) ; Result = pcktptr ; pcktptr = pcktptr + 1 ; pcktstart [pcktptr ]= byteptr ; return Result ; } void #ifdef HAVE_PROTOTYPES flushpacket ( void ) #else flushpacket ( ) #endif { pcktptr = pcktptr - 1 ; byteptr = pcktstart [pcktptr ]; } int8 #ifdef HAVE_PROTOTYPES pcktsbyte ( void ) #else pcktsbyte ( ) #endif { register int8 Result; eightbits a ; { a = bytemem [curloc ]; curloc = curloc + 1 ; } if ( a < 128 ) Result = a ; else Result = a - 256 ; return Result ; } int8u #ifdef HAVE_PROTOTYPES pcktubyte ( void ) #else pcktubyte ( ) #endif { register int8u Result; eightbits a ; { a = bytemem [curloc ]; curloc = curloc + 1 ; } Result = a ; return Result ; } int16 #ifdef HAVE_PROTOTYPES pcktspair ( void ) #else pcktspair ( ) #endif { register int16 Result; eightbits a, b ; { a = bytemem [curloc ]; curloc = curloc + 1 ; } { b = bytemem [curloc ]; curloc = curloc + 1 ; } if ( a < 128 ) Result = a * toint ( 256 ) + b ; else Result = ( a - toint ( 256 ) ) * toint ( 256 ) + b ; return Result ; } int16u #ifdef HAVE_PROTOTYPES pcktupair ( void ) #else pcktupair ( ) #endif { register int16u Result; eightbits a, b ; { a = bytemem [curloc ]; curloc = curloc + 1 ; } { b = bytemem [curloc ]; curloc = curloc + 1 ; } Result = a * toint ( 256 ) + b ; return Result ; } int24 #ifdef HAVE_PROTOTYPES pcktstrio ( void ) #else pcktstrio ( ) #endif { register int24 Result; eightbits a, b, c ; { a = bytemem [curloc ]; curloc = curloc + 1 ; } { b = bytemem [curloc ]; curloc = curloc + 1 ; } { c = bytemem [curloc ]; curloc = curloc + 1 ; } if ( a < 128 ) Result = ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ; else Result = ( ( a - toint ( 256 ) ) * toint ( 256 ) + b ) * toint ( 256 ) + c ; return Result ; } int24u #ifdef HAVE_PROTOTYPES pcktutrio ( void ) #else pcktutrio ( ) #endif { register int24u Result; eightbits a, b, c ; { a = bytemem [curloc ]; curloc = curloc + 1 ; } { b = bytemem [curloc ]; curloc = curloc + 1 ; } { c = bytemem [curloc ]; curloc = curloc + 1 ; } Result = ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ; return Result ; } integer #ifdef HAVE_PROTOTYPES pcktsquad ( void ) #else pcktsquad ( ) #endif { register integer Result; eightbits a, b, c, d ; { a = bytemem [curloc ]; curloc = curloc + 1 ; } { b = bytemem [curloc ]; curloc = curloc + 1 ; } { c = bytemem [curloc ]; curloc = curloc + 1 ; } { d = bytemem [curloc ]; curloc = curloc + 1 ; } if ( a < 128 ) Result = ( ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ) * toint ( 256 ) + d ; else Result = ( ( ( a - toint ( 256 ) ) * toint ( 256 ) + b ) * toint ( 256 ) + c ) * toint ( 256 ) + d ; return Result ; } void #ifdef HAVE_PROTOTYPES zpcktfour ( integer x ) #else zpcktfour ( x ) integer x ; #endif { ; if ( maxbytes - byteptr < 4 ) overflow ( strbytes , maxbytes ) ; if ( x >= 0 ) { bytemem [byteptr ]= x / 16777216L ; byteptr = byteptr + 1 ; } else { x = x + 1073741824L ; x = x + 1073741824L ; { bytemem [byteptr ]= ( x / 16777216L ) + 128 ; byteptr = byteptr + 1 ; } } x = x % 16777216L ; { bytemem [byteptr ]= x / 65536L ; byteptr = byteptr + 1 ; } x = x % 65536L ; { bytemem [byteptr ]= x / 256 ; byteptr = byteptr + 1 ; } { bytemem [byteptr ]= x % 256 ; byteptr = byteptr + 1 ; } } void #ifdef HAVE_PROTOTYPES zpcktchar ( boolean upd , integer ext , eightbits res ) #else zpcktchar ( upd , ext , res ) boolean upd ; integer ext ; eightbits res ; #endif { eightbits o ; if ( maxbytes - byteptr < 5 ) overflow ( strbytes , maxbytes ) ; if ( ( ! upd ) || ( res > 127 ) || ( ext != 0 ) ) { o = dvicharcmd [upd ]; if ( ext < 0 ) ext = ext + 16777216L ; if ( ext == 0 ) { bytemem [byteptr ]= o ; byteptr = byteptr + 1 ; } else { if ( ext < 256 ) { bytemem [byteptr ]= o + 1 ; byteptr = byteptr + 1 ; } else { if ( ext < 65536L ) { bytemem [byteptr ]= o + 2 ; byteptr = byteptr + 1 ; } else { { bytemem [byteptr ]= o + 3 ; byteptr = byteptr + 1 ; } { bytemem [byteptr ]= ext / 65536L ; byteptr = byteptr + 1 ; } ext = ext % 65536L ; } { bytemem [byteptr ]= ext / 256 ; byteptr = byteptr + 1 ; } ext = ext % 256 ; } { bytemem [byteptr ]= ext ; byteptr = byteptr + 1 ; } } } { bytemem [byteptr ]= res ; byteptr = byteptr + 1 ; } } void #ifdef HAVE_PROTOTYPES zpcktunsigned ( eightbits o , integer x ) #else zpcktunsigned ( o , x ) eightbits o ; integer x ; #endif { ; if ( maxbytes - byteptr < 5 ) overflow ( strbytes , maxbytes ) ; if ( ( x < 256 ) && ( x >= 0 ) ) if ( ( o == 235 ) && ( x < 64 ) ) x = x + 171 ; else { bytemem [byteptr ]= o ; byteptr = byteptr + 1 ; } else { if ( ( x < 65536L ) && ( x >= 0 ) ) { bytemem [byteptr ]= o + 1 ; byteptr = byteptr + 1 ; } else { if ( ( x < 16777216L ) && ( x >= 0 ) ) { bytemem [byteptr ]= o + 2 ; byteptr = byteptr + 1 ; } else { { bytemem [byteptr ]= o + 3 ; byteptr = byteptr + 1 ; } if ( x >= 0 ) { bytemem [byteptr ]= x / 16777216L ; byteptr = byteptr + 1 ; } else { x = x + 1073741824L ; x = x + 1073741824L ; { bytemem [byteptr ]= ( x / 16777216L ) + 128 ; byteptr = byteptr + 1 ; } } x = x % 16777216L ; } { bytemem [byteptr ]= x / 65536L ; byteptr = byteptr + 1 ; } x = x % 65536L ; } { bytemem [byteptr ]= x / 256 ; byteptr = byteptr + 1 ; } x = x % 256 ; } { bytemem [byteptr ]= x ; byteptr = byteptr + 1 ; } } void #ifdef HAVE_PROTOTYPES zpcktsigned ( eightbits o , integer x ) #else zpcktsigned ( o , x ) eightbits o ; integer x ; #endif { int31 xx ; if ( maxbytes - byteptr < 5 ) overflow ( strbytes , maxbytes ) ; if ( x >= 0 ) xx = x ; else xx = - (integer) ( x + 1 ) ; if ( xx < 128 ) { { bytemem [byteptr ]= o ; byteptr = byteptr + 1 ; } if ( x < 0 ) x = x + 256 ; } else { if ( xx < 32768L ) { { bytemem [byteptr ]= o + 1 ; byteptr = byteptr + 1 ; } if ( x < 0 ) x = x + 65536L ; } else { if ( xx < 8388608L ) { { bytemem [byteptr ]= o + 2 ; byteptr = byteptr + 1 ; } if ( x < 0 ) x = x + 16777216L ; } else { { bytemem [byteptr ]= o + 3 ; byteptr = byteptr + 1 ; } if ( x >= 0 ) { bytemem [byteptr ]= x / 16777216L ; byteptr = byteptr + 1 ; } else { x = 2147483647L - xx ; { bytemem [byteptr ]= ( x / 16777216L ) + 128 ; byteptr = byteptr + 1 ; } } x = x % 16777216L ; } { bytemem [byteptr ]= x / 65536L ; byteptr = byteptr + 1 ; } x = x % 65536L ; } { bytemem [byteptr ]= x / 256 ; byteptr = byteptr + 1 ; } x = x % 256 ; } { bytemem [byteptr ]= x ; byteptr = byteptr + 1 ; } } void #ifdef HAVE_PROTOTYPES zmakename ( pcktpointer e ) #else zmakename ( e ) pcktpointer e ; #endif { eightbits b ; pcktpointer n ; bytepointer curloc, curlimit ; char c ; n = fntname [curfnt ]; curname = xmalloc ( ( pcktstart [n + 1 ]- pcktstart [n ]) + ( pcktstart [e + 1 ]- pcktstart [e ]) + 1 ) ; curloc = pcktstart [n ]; curlimit = pcktstart [n + 1 ]; { b = bytemem [curloc ]; curloc = curloc + 1 ; } if ( b > 0 ) lcurname = 0 ; while ( curloc < curlimit ) { { b = bytemem [curloc ]; curloc = curloc + 1 ; } { curname [lcurname ]= xchr [b ]; lcurname = lcurname + 1 ; } } curname [lcurname ]= 0 ; } widthpointer #ifdef HAVE_PROTOTYPES zmakewidth ( integer w ) #else zmakewidth ( w ) integer w ; #endif { /* 31 */ register widthpointer Result; hashcode h ; widthpointer p ; int16 x ; widths [nwidths ]= w ; if ( w >= 0 ) x = w / 16777216L ; else { w = w + 1073741824L ; w = w + 1073741824L ; x = ( w / 16777216L ) + 128 ; } w = w % 16777216L ; x = x + x + ( w / 65536L ) ; w = w % 65536L ; x = x + x + ( w / 256 ) ; h = ( x + x + ( w % 256 ) ) % 353 ; p = whash [h ]; while ( p != 0 ) { if ( widths [p ]== widths [nwidths ]) goto lab31 ; p = wlink [p ]; } p = nwidths ; wlink [p ]= whash [h ]; whash [h ]= p ; if ( nwidths == maxwidths ) overflow ( strwidths , maxwidths ) ; nwidths = nwidths + 1 ; lab31: Result = p ; return Result ; } boolean #ifdef HAVE_PROTOTYPES findpacket ( void ) #else findpacket ( ) #endif { /* 31 10 */ register boolean Result; pcktpointer p, q ; eightbits f ; int24 e ; q = charpackets [fntchars [curfnt ]+ curres ]; while ( q != maxpackets ) { p = q ; q = maxpackets ; curloc = pcktstart [p ]; curlimit = pcktstart [p + 1 ]; if ( p == 0 ) { e = 0 ; f = 0 ; } else { { f = bytemem [curloc ]; curloc = curloc + 1 ; } switch ( ( f / 64 ) ) {case 0 : e = 0 ; break ; case 1 : e = pcktubyte () ; break ; case 2 : e = pcktupair () ; break ; case 3 : e = pcktstrio () ; break ; } if ( ( f % 64 ) >= 32 ) q = pcktupair () ; f = f % 32 ; } if ( e == curext ) goto lab31 ; } if ( charpackets [fntchars [curfnt ]+ curres ]== maxpackets ) { if ( pcktmmsg < 10 ) { fprintf( termout , "%s%ld%s%ld\n", "---missing character packet for character " , (long)curres , " font " , (long)curfnt ) ; pcktmmsg = pcktmmsg + 1 ; history = 2 ; if ( pcktmmsg == 10 ) fprintf( termout , "%s\n", "---further messages suppressed." ) ; } Result = false ; goto lab10 ; } if ( pcktsmsg < 10 ) { fprintf( termout , "%s%ld%s%ld%s%ld%s%ld\n", "---substituted character packet with extension " , (long)e , " instead of " , (long)curext , " for character " , (long)curres , " font " , (long)curfnt ) ; pcktsmsg = pcktsmsg + 1 ; history = 2 ; if ( pcktsmsg == 10 ) fprintf( termout , "%s\n", "---further messages suppressed." ) ; } curext = e ; lab31: curpckt = p ; curtype = f ; Result = true ; lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES zstartpacket ( typeflag t ) #else zstartpacket ( t ) typeflag t ; #endif { /* 31 32 */ pcktpointer p, q ; int8u f ; integer e ; bytepointer curloc ; bytepointer curlimit ; q = charpackets [fntchars [curfnt ]+ curres ]; while ( q != maxpackets ) { p = q ; q = maxpackets ; curloc = pcktstart [p ]; curlimit = pcktstart [p + 1 ]; if ( p == 0 ) { e = 0 ; f = 0 ; } else { { f = bytemem [curloc ]; curloc = curloc + 1 ; } switch ( ( f / 64 ) ) {case 0 : e = 0 ; break ; case 1 : e = pcktubyte () ; break ; case 2 : e = pcktupair () ; break ; case 3 : e = pcktstrio () ; break ; } if ( ( f % 64 ) >= 32 ) q = pcktupair () ; f = f % 32 ; } if ( e == curext ) goto lab31 ; } q = charpackets [fntchars [curfnt ]+ curres ]; pcktdup = false ; goto lab32 ; lab31: pcktdup = true ; pcktprev = p ; lab32: pcktext = curext ; pcktres = curres ; if ( maxbytes - byteptr < 6 ) overflow ( strbytes , maxbytes ) ; if ( q == maxpackets ) f = t ; else f = t + 32 ; e = curext ; if ( e < 0 ) e = e + 16777216L ; if ( e == 0 ) { bytemem [byteptr ]= f ; byteptr = byteptr + 1 ; } else { if ( e < 256 ) { bytemem [byteptr ]= f + 64 ; byteptr = byteptr + 1 ; } else { if ( e < 65536L ) { bytemem [byteptr ]= f + 128 ; byteptr = byteptr + 1 ; } else { { bytemem [byteptr ]= f + 192 ; byteptr = byteptr + 1 ; } { bytemem [byteptr ]= e / 65536L ; byteptr = byteptr + 1 ; } e = e % 65536L ; } { bytemem [byteptr ]= e / 256 ; byteptr = byteptr + 1 ; } e = e % 256 ; } { bytemem [byteptr ]= e ; byteptr = byteptr + 1 ; } } if ( q != maxpackets ) { { bytemem [byteptr ]= q / 256 ; byteptr = byteptr + 1 ; } { bytemem [byteptr ]= q % 256 ; byteptr = byteptr + 1 ; } } } void #ifdef HAVE_PROTOTYPES buildpacket ( void ) #else buildpacket ( ) #endif { bytepointer k, l ; if ( pcktdup ) { k = pcktstart [pcktprev + 1 ]; l = pcktstart [pcktptr ]; if ( ( byteptr - l ) != ( k - pcktstart [pcktprev ]) ) pcktdup = false ; while ( pcktdup && ( byteptr > l ) ) { byteptr = byteptr - 1 ; k = k - 1 ; if ( bytemem [byteptr ]!= bytemem [k ]) pcktdup = false ; } if ( ( ! pcktdup ) && ( pcktdmsg < 10 ) ) { fprintf( termout , "%s%ld", "---duplicate packet for character " , (long)pcktres ) ; if ( pcktext != 0 ) fprintf( termout , "%c%ld", '.' , (long)pcktext ) ; fprintf( termout , "%s%ld\n", " font " , (long)curfnt ) ; pcktdmsg = pcktdmsg + 1 ; history = 2 ; if ( pcktdmsg == 10 ) fprintf( termout , "%s\n", "---further messages suppressed." ) ; } byteptr = l ; } else charpackets [fntchars [curfnt ]+ pcktres ]= makepacket () ; } void #ifdef HAVE_PROTOTYPES readtfmword ( void ) #else readtfmword ( ) #endif { read ( tfmfile , tfmb0 ) ; read ( tfmfile , tfmb1 ) ; read ( tfmfile , tfmb2 ) ; read ( tfmfile , tfmb3 ) ; if ( eof ( tfmfile ) ) badfont () ; } void #ifdef HAVE_PROTOTYPES zcheckchecksum ( integer c , boolean u ) #else zcheckchecksum ( c , u ) integer c ; boolean u ; #endif { if ( ( c != fntcheck [curfnt ]) && ( c != 0 ) ) { if ( fntcheck [curfnt ]!= 0 ) { putc ('\n', termout ); fprintf( termout , "%s%ld%s%ld%c\n", "---beware: check sums do not agree! (" , (long)c , " vs. " , (long)fntcheck [curfnt ], ')' ) ; if ( history == 0 ) history = 1 ; } if ( u ) fntcheck [curfnt ]= c ; } } void #ifdef HAVE_PROTOTYPES zcheckdesignsize ( integer d ) #else zcheckdesignsize ( d ) integer d ; #endif { if ( abs ( d - fntdesign [curfnt ]) > 2 ) { putc ('\n', termout ); fprintf( termout , "%s%ld%s%ld%c\n", "---beware: design sizes do not agree! (" , (long)d , " vs. " , (long)fntdesign [curfnt ], ')' ) ; history = 2 ; } } widthpointer #ifdef HAVE_PROTOTYPES zcheckwidth ( integer w ) #else zcheckwidth ( w ) integer w ; #endif { register widthpointer Result; widthpointer wp ; if ( ( curres >= fntbc [curfnt ]) && ( curres <= fntec [curfnt ]) ) wp = charwidths [fntchars [curfnt ]+ curres ]; else wp = 0 ; if ( wp == 0 ) { { putc ('\n', termout ); fprintf( termout , "%s%ld", "Bad char " , (long)curres ) ; } if ( curext != 0 ) fprintf( termout , "%c%ld", '.' , (long)curext ) ; fprintf( termout , "%s%ld", " font " , (long)curfnt ) ; printfont ( curfnt ) ; { fprintf( stderr , "%c%s%c\n", ' ' , " (compare TFM file)" , '.' ) ; jumpout () ; } } if ( w != widths [wp ]) { putc ('\n', termout ); fprintf( termout , "%s%ld%s%ld%c\n", "---beware: char widths do not agree! (" , (long)w , " vs. " , (long)widths [wp ], ')' ) ; history = 2 ; } Result = wp ; return Result ; } void #ifdef HAVE_PROTOTYPES loadfont ( void ) #else loadfont ( ) #endif { int16 l ; charpointer p ; widthpointer q ; int15 bc, ec ; int15 lh ; int15 nw ; integer w ; integer z ; integer alpha ; int15 beta ; fprintf( termout , "%s%ld", "TFM: font " , (long)curfnt ) ; printfont ( curfnt ) ; fnttype [curfnt ]= 1 ; lcurname = 0 ; makename ( tfmext ) ; fullname = kpsefindtfm ( curname ) ; if ( fullname ) { resetbin ( tfmfile , fullname ) ; free ( curname ) ; free ( fullname ) ; } else { fprintf( stderr , "%c%s%c\n", ' ' , "---not loaded, TFM file can't be opened!" , '.' ) ; jumpout () ; } readtfmword () ; if ( tfmb2 > 127 ) badfont () ; else lh = tfmb2 * toint ( 256 ) + tfmb3 ; readtfmword () ; if ( tfmb0 > 127 ) badfont () ; else bc = tfmb0 * toint ( 256 ) + tfmb1 ; if ( tfmb2 > 127 ) badfont () ; else ec = tfmb2 * toint ( 256 ) + tfmb3 ; if ( ec < bc ) { bc = 1 ; ec = 0 ; } else if ( ec > 255 ) badfont () ; readtfmword () ; if ( tfmb0 > 127 ) badfont () ; else nw = tfmb0 * toint ( 256 ) + tfmb1 ; if ( ( nw == 0 ) || ( nw > 256 ) ) badfont () ; {register integer for_end; l = -2 ;for_end = lh ; if ( l <= for_end) do { readtfmword () ; if ( l == 1 ) { if ( tfmb0 < 128 ) w = ( ( tfmb0 * toint ( 256 ) + tfmb1 ) * toint ( 256 ) + tfmb2 ) * toint ( 256 ) + tfmb3 ; else w = ( ( ( tfmb0 - toint ( 256 ) ) * toint ( 256 ) + tfmb1 ) * toint ( 256 ) + tfmb2 ) * toint ( 256 ) + tfmb3 ; checkchecksum ( w , true ) ; } else if ( l == 2 ) { if ( tfmb0 > 127 ) badfont () ; checkdesignsize ( round ( tfmconv * ( ( ( tfmb0 * toint ( 256 ) + tfmb1 ) * toint ( 256 ) + tfmb2 ) * toint ( 256 ) + tfmb3 ) ) ) ; } } while ( l++ < for_end ) ;} readtfmword () ; while ( ( tfmb0 == 0 ) && ( bc <= ec ) ) { bc = bc + 1 ; readtfmword () ; } fntbc [curfnt ]= bc ; fntchars [curfnt ]= nchars - bc ; if ( ec >= maxchars - fntchars [curfnt ]) overflow ( strchars , maxchars ) ; {register integer for_end; l = bc ;for_end = ec ; if ( l <= for_end) do { charwidths [nchars ]= tfmb0 ; nchars = nchars + 1 ; readtfmword () ; } while ( l++ < for_end ) ;} while ( ( charwidths [nchars - 1 ]== 0 ) && ( ec >= bc ) ) { nchars = nchars - 1 ; ec = ec - 1 ; } fntec [curfnt ]= ec ; if ( nw - 1 > maxchars - nchars ) overflow ( strchars , maxchars ) ; if ( ( tfmb0 != 0 ) || ( tfmb1 != 0 ) || ( tfmb2 != 0 ) || ( tfmb3 != 0 ) ) badfont () ; else charwidths [nchars ]= 0 ; z = fntscaled [curfnt ]; alpha = 16 ; while ( z >= 8388608L ) { z = z / 2 ; alpha = alpha + alpha ; } beta = 256 / alpha ; alpha = alpha * z ; {register integer for_end; p = nchars + 1 ;for_end = nchars + nw - 1 ; if ( p <= for_end) do { readtfmword () ; w = ( ( ( ( ( tfmb3 * z ) / 256 ) + ( tfmb2 * z ) ) / 256 ) + ( tfmb1 * z ) ) / beta ; if ( tfmb0 > 0 ) if ( tfmb0 == 255 ) w = w - alpha ; else badfont () ; charwidths [p ]= makewidth ( w ) ; } while ( p++ < for_end ) ;} {register integer for_end; p = fntchars [curfnt ]+ bc ;for_end = nchars - 1 ; if ( p <= for_end) do { q = charwidths [nchars + charwidths [p ]]; charwidths [p ]= q ; charpackets [p ]= maxpackets ; } while ( p++ < for_end ) ;} fprintf( termout , "%c\n", '.' ) ; } fontnumber #ifdef HAVE_PROTOTYPES zdefinefont ( boolean load ) #else zdefinefont ( load ) boolean load ; #endif { register fontnumber Result; fontnumber savefnt ; savefnt = curfnt ; curfnt = 0 ; while ( ( fntname [curfnt ]!= fntname [nf ]) || ( fntscaled [curfnt ] != fntscaled [nf ]) ) curfnt = curfnt + 1 ; printfont ( curfnt ) ; if ( curfnt < nf ) { checkchecksum ( fntcheck [nf ], true ) ; checkdesignsize ( fntdesign [nf ]) ; } else { if ( nf == maxfonts ) overflow ( strfonts , maxfonts ) ; nf = nf + 1 ; fntfont [curfnt ]= maxfonts ; fnttype [curfnt ]= 0 ; } fprintf( termout , "%c\n", '.' ) ; if ( load && ( fnttype [curfnt ]== 0 ) ) loadfont () ; Result = curfnt ; curfnt = savefnt ; return Result ; } integer #ifdef HAVE_PROTOTYPES dvilength ( void ) #else dvilength ( ) #endif { register integer Result; xfseek ( dvifile , 0 , 2 , "dvicopy" ) ; dviloc = xftell ( dvifile , "dvicopy" ) ; Result = dviloc ; return Result ; } void #ifdef HAVE_PROTOTYPES zdvimove ( integer n ) #else zdvimove ( n ) integer n ; #endif { xfseek ( dvifile , n , 0 , "dvicopy" ) ; dviloc = n ; } int8 #ifdef HAVE_PROTOTYPES dvisbyte ( void ) #else dvisbyte ( ) #endif { register int8 Result; eightbits a ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , a ) ; dviloc = dviloc + 1 ; if ( a < 128 ) Result = a ; else Result = a - 256 ; return Result ; } int8u #ifdef HAVE_PROTOTYPES dviubyte ( void ) #else dviubyte ( ) #endif { register int8u Result; eightbits a ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , a ) ; dviloc = dviloc + 1 ; Result = a ; return Result ; } int16 #ifdef HAVE_PROTOTYPES dvispair ( void ) #else dvispair ( ) #endif { register int16 Result; eightbits a, b ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , a ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , b ) ; dviloc = dviloc + 2 ; if ( a < 128 ) Result = a * toint ( 256 ) + b ; else Result = ( a - toint ( 256 ) ) * toint ( 256 ) + b ; return Result ; } int16u #ifdef HAVE_PROTOTYPES dviupair ( void ) #else dviupair ( ) #endif { register int16u Result; eightbits a, b ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , a ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , b ) ; dviloc = dviloc + 2 ; Result = a * toint ( 256 ) + b ; return Result ; } int24 #ifdef HAVE_PROTOTYPES dvistrio ( void ) #else dvistrio ( ) #endif { register int24 Result; eightbits a, b, c ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , a ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , b ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , c ) ; dviloc = dviloc + 3 ; if ( a < 128 ) Result = ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ; else Result = ( ( a - toint ( 256 ) ) * toint ( 256 ) + b ) * toint ( 256 ) + c ; return Result ; } int24u #ifdef HAVE_PROTOTYPES dviutrio ( void ) #else dviutrio ( ) #endif { register int24u Result; eightbits a, b, c ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , a ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , b ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , c ) ; dviloc = dviloc + 3 ; Result = ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ; return Result ; } integer #ifdef HAVE_PROTOTYPES dvisquad ( void ) #else dvisquad ( ) #endif { register integer Result; eightbits a, b, c, d ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , a ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , b ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , c ) ; if ( eof ( dvifile ) ) baddvi () ; else read ( dvifile , d ) ; dviloc = dviloc + 4 ; if ( a < 128 ) Result = ( ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ) * toint ( 256 ) + d ; else Result = ( ( ( a - toint ( 256 ) ) * toint ( 256 ) + b ) * toint ( 256 ) + c ) * toint ( 256 ) + d ; return Result ; } int31 #ifdef HAVE_PROTOTYPES dviuquad ( void ) #else dviuquad ( ) #endif { register int31 Result; integer x ; x = dvisquad () ; if ( x < 0 ) baddvi () ; else Result = x ; return Result ; } int31 #ifdef HAVE_PROTOTYPES dvipquad ( void ) #else dvipquad ( ) #endif { register int31 Result; integer x ; x = dvisquad () ; if ( x <= 0 ) baddvi () ; else Result = x ; return Result ; } integer #ifdef HAVE_PROTOTYPES dvipointer ( void ) #else dvipointer ( ) #endif { register integer Result; integer x ; x = dvisquad () ; if ( ( x <= 0 ) && ( x != -1 ) ) baddvi () ; else Result = x ; return Result ; } void #ifdef HAVE_PROTOTYPES dvifirstpar ( void ) #else dvifirstpar ( ) #endif { do { curcmd = dviubyte () ; } while ( ! ( curcmd != 138 ) ) ; switch ( dvipar [curcmd ]) {case 0 : { curext = 0 ; if ( curcmd < 128 ) { curres = curcmd ; curupd = true ; } else { curres = dviubyte () ; curupd = ( curcmd < 133 ) ; curcmd = curcmd - dvicharcmd [curupd ]; while ( curcmd > 0 ) { if ( curcmd == 3 ) if ( curres > 127 ) curext = -1 ; curext = curext * 256 + curres ; curres = dviubyte () ; curcmd = curcmd - 1 ; } } } break ; case 1 : ; break ; case 2 : curparm = dvisbyte () ; break ; case 3 : curparm = dviubyte () ; break ; case 4 : curparm = dvispair () ; break ; case 5 : curparm = dviupair () ; break ; case 6 : curparm = dvistrio () ; break ; case 7 : curparm = dviutrio () ; break ; case 8 : case 9 : curparm = dvisquad () ; break ; case 10 : curparm = dviuquad () ; break ; case 11 : { curvdimen = dvisquad () ; curhdimen = dvisquad () ; curupd = ( curcmd == 132 ) ; } break ; case 12 : curparm = curcmd - 171 ; break ; } curclass = dvicl [curcmd ]; } void #ifdef HAVE_PROTOTYPES dvifont ( void ) #else dvifont ( ) #endif { fontnumber f ; f = 0 ; dviefnts [dvinf ]= curparm ; while ( curparm != dviefnts [f ]) f = f + 1 ; if ( f == dvinf ) baddvi () ; curfnt = dviifnts [f ]; if ( fnttype [curfnt ]== 0 ) loadfont () ; } void #ifdef HAVE_PROTOTYPES zdvidofont ( boolean second ) #else zdvidofont ( second ) boolean second ; #endif { fontnumber f ; int15 k ; fprintf( termout , "%s%ld", "DVI: font " , (long)curparm ) ; f = 0 ; dviefnts [dvinf ]= curparm ; while ( curparm != dviefnts [f ]) f = f + 1 ; if ( ( f == dvinf ) == second ) baddvi () ; fntcheck [nf ]= dvisquad () ; fntscaled [nf ]= dvipquad () ; fntdesign [nf ]= dvipquad () ; k = dviubyte () ; if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= k ; byteptr = byteptr + 1 ; } k = k + dviubyte () ; if ( maxbytes - byteptr < k ) overflow ( strbytes , maxbytes ) ; while ( k > 0 ) { { bytemem [byteptr ]= dviubyte () ; byteptr = byteptr + 1 ; } k = k - 1 ; } fntname [nf ]= makepacket () ; dviifnts [dvinf ]= definefont ( false ) ; if ( ! second ) { if ( dvinf == maxfonts ) overflow ( strfonts , maxfonts ) ; dvinf = dvinf + 1 ; } else if ( dviifnts [f ]!= dviifnts [dvinf ]) baddvi () ; } int8u #ifdef HAVE_PROTOTYPES vfubyte ( void ) #else vfubyte ( ) #endif { register int8u Result; eightbits a ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , a ) ; vfloc = vfloc + 1 ; Result = a ; return Result ; } int16u #ifdef HAVE_PROTOTYPES vfupair ( void ) #else vfupair ( ) #endif { register int16u Result; eightbits a, b ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , a ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , b ) ; vfloc = vfloc + 2 ; Result = a * toint ( 256 ) + b ; return Result ; } int24 #ifdef HAVE_PROTOTYPES vfstrio ( void ) #else vfstrio ( ) #endif { register int24 Result; eightbits a, b, c ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , a ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , b ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , c ) ; vfloc = vfloc + 3 ; if ( a < 128 ) Result = ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ; else Result = ( ( a - toint ( 256 ) ) * toint ( 256 ) + b ) * toint ( 256 ) + c ; return Result ; } int24u #ifdef HAVE_PROTOTYPES vfutrio ( void ) #else vfutrio ( ) #endif { register int24u Result; eightbits a, b, c ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , a ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , b ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , c ) ; vfloc = vfloc + 3 ; Result = ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ; return Result ; } integer #ifdef HAVE_PROTOTYPES vfsquad ( void ) #else vfsquad ( ) #endif { register integer Result; eightbits a, b, c, d ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , a ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , b ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , c ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , d ) ; vfloc = vfloc + 4 ; if ( a < 128 ) Result = ( ( a * toint ( 256 ) + b ) * toint ( 256 ) + c ) * toint ( 256 ) + d ; else Result = ( ( ( a - toint ( 256 ) ) * toint ( 256 ) + b ) * toint ( 256 ) + c ) * toint ( 256 ) + d ; return Result ; } integer #ifdef HAVE_PROTOTYPES vffix1 ( void ) #else vffix1 ( ) #endif { register integer Result; integer x ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb3 ) ; vfloc = vfloc + 1 ; if ( tfmb3 > 127 ) tfmb1 = 255 ; else tfmb1 = 0 ; tfmb2 = tfmb1 ; x = ( ( ( ( ( tfmb3 * z ) / 256 ) + ( tfmb2 * z ) ) / 256 ) + ( tfmb1 * z ) ) / beta ; if ( tfmb1 > 127 ) x = x - alpha ; Result = x ; return Result ; } integer #ifdef HAVE_PROTOTYPES vffix2 ( void ) #else vffix2 ( ) #endif { register integer Result; integer x ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb2 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb3 ) ; vfloc = vfloc + 2 ; if ( tfmb2 > 127 ) tfmb1 = 255 ; else tfmb1 = 0 ; x = ( ( ( ( ( tfmb3 * z ) / 256 ) + ( tfmb2 * z ) ) / 256 ) + ( tfmb1 * z ) ) / beta ; if ( tfmb1 > 127 ) x = x - alpha ; Result = x ; return Result ; } integer #ifdef HAVE_PROTOTYPES vffix3 ( void ) #else vffix3 ( ) #endif { register integer Result; integer x ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb1 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb2 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb3 ) ; vfloc = vfloc + 3 ; x = ( ( ( ( ( tfmb3 * z ) / 256 ) + ( tfmb2 * z ) ) / 256 ) + ( tfmb1 * z ) ) / beta ; if ( tfmb1 > 127 ) x = x - alpha ; Result = x ; return Result ; } integer #ifdef HAVE_PROTOTYPES vffix3u ( void ) #else vffix3u ( ) #endif { register integer Result; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb1 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb2 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb3 ) ; vfloc = vfloc + 3 ; Result = ( ( ( ( ( tfmb3 * z ) / 256 ) + ( tfmb2 * z ) ) / 256 ) + ( tfmb1 * z ) ) / beta ; return Result ; } integer #ifdef HAVE_PROTOTYPES vffix4 ( void ) #else vffix4 ( ) #endif { register integer Result; integer x ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb0 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb1 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb2 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb3 ) ; vfloc = vfloc + 4 ; x = ( ( ( ( ( tfmb3 * z ) / 256 ) + ( tfmb2 * z ) ) / 256 ) + ( tfmb1 * z ) ) / beta ; if ( tfmb0 > 0 ) if ( tfmb0 == 255 ) x = x - alpha ; else badfont () ; Result = x ; return Result ; } int31 #ifdef HAVE_PROTOTYPES vfuquad ( void ) #else vfuquad ( ) #endif { register int31 Result; integer x ; x = vfsquad () ; if ( x < 0 ) badfont () ; else Result = x ; return Result ; } int31 #ifdef HAVE_PROTOTYPES vfpquad ( void ) #else vfpquad ( ) #endif { register int31 Result; integer x ; x = vfsquad () ; if ( x <= 0 ) badfont () ; else Result = x ; return Result ; } int31 #ifdef HAVE_PROTOTYPES vffixp ( void ) #else vffixp ( ) #endif { register int31 Result; integer x ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb0 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb1 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb2 ) ; if ( eof ( vffile ) ) badfont () ; else read ( vffile , tfmb3 ) ; vfloc = vfloc + 4 ; if ( tfmb0 > 0 ) badfont () ; Result = ( ( ( ( ( tfmb3 * z ) / 256 ) + ( tfmb2 * z ) ) / 256 ) + ( tfmb1 * z ) ) / beta ; return Result ; } void #ifdef HAVE_PROTOTYPES vffirstpar ( void ) #else vffirstpar ( ) #endif { curcmd = vfubyte () ; switch ( dvipar [curcmd ]) {case 0 : { { curext = 0 ; if ( curcmd < 128 ) { curres = curcmd ; curupd = true ; } else { curres = vfubyte () ; curupd = ( curcmd < 133 ) ; curcmd = curcmd - dvicharcmd [curupd ]; while ( curcmd > 0 ) { if ( curcmd == 3 ) if ( curres > 127 ) curext = -1 ; curext = curext * 256 + curres ; curres = vfubyte () ; curcmd = curcmd - 1 ; } } } curwp = 0 ; if ( vfcurfnt != maxfonts ) if ( ( curres >= fntbc [vfcurfnt ]) && ( curres <= fntec [vfcurfnt ] ) ) { curcp = fntchars [vfcurfnt ]+ curres ; curwp = charwidths [curcp ]; } if ( curwp == 0 ) badfont () ; } break ; case 1 : ; break ; case 2 : curparm = vffix1 () ; break ; case 3 : curparm = vfubyte () ; break ; case 4 : curparm = vffix2 () ; break ; case 5 : curparm = vfupair () ; break ; case 6 : curparm = vffix3 () ; break ; case 7 : curparm = vfutrio () ; break ; case 8 : curparm = vffix4 () ; break ; case 9 : curparm = vfsquad () ; break ; case 10 : curparm = vfuquad () ; break ; case 11 : { curvdimen = vffix4 () ; curhdimen = vffix4 () ; curupd = ( curcmd == 132 ) ; } break ; case 12 : curparm = curcmd - 171 ; break ; } curclass = dvicl [curcmd ]; } void #ifdef HAVE_PROTOTYPES vffont ( void ) #else vffont ( ) #endif { fontnumber f ; f = 0 ; vfefnts [vfnf ]= curparm ; while ( curparm != vfefnts [f ]) f = f + 1 ; if ( f == vfnf ) badfont () ; vfcurfnt = vfifnts [f ]; } void #ifdef HAVE_PROTOTYPES vfdofont ( void ) #else vfdofont ( ) #endif { fontnumber f ; int15 k ; fprintf( termout , "%s%ld", "VF: font " , (long)curparm ) ; f = 0 ; vfefnts [vfnf ]= curparm ; while ( curparm != vfefnts [f ]) f = f + 1 ; if ( f != vfnf ) badfont () ; fntcheck [nf ]= vfsquad () ; fntscaled [nf ]= vffixp () ; fntdesign [nf ]= round ( tfmconv * vfpquad () ) ; k = vfubyte () ; if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= k ; byteptr = byteptr + 1 ; } k = k + vfubyte () ; if ( maxbytes - byteptr < k ) overflow ( strbytes , maxbytes ) ; while ( k > 0 ) { { bytemem [byteptr ]= vfubyte () ; byteptr = byteptr + 1 ; } k = k - 1 ; } fntname [nf ]= makepacket () ; vfifnts [vfnf ]= definefont ( true ) ; if ( vfnf == lclnf ) if ( lclnf == maxfonts ) overflow ( strfonts , maxfonts ) ; else lclnf = lclnf + 1 ; vfnf = vfnf + 1 ; } boolean #ifdef HAVE_PROTOTYPES dovf ( void ) #else dovf ( ) #endif { /* 21 30 32 10 */ register boolean Result; integer tempint ; int8u tempbyte ; bytepointer k ; int15 l ; int24 saveext ; int8u saveres ; widthpointer savecp ; widthpointer savewp ; boolean saveupd ; widthpointer vfwp ; fontnumber vffnt ; boolean movezero ; boolean lastpop ; lcurname = 0 ; makename ( vfext ) ; fullname = kpsefindvf ( curname ) ; if ( fullname ) { resetbin ( vffile , fullname ) ; free ( curname ) ; free ( fullname ) ; } else goto lab32 ; vfloc = 0 ; saveext = curext ; saveres = curres ; savecp = curcp ; savewp = curwp ; saveupd = curupd ; fnttype [curfnt ]= 2 ; if ( vfubyte () != 247 ) badfont () ; if ( vfubyte () != 202 ) badfont () ; tempbyte = vfubyte () ; if ( maxbytes - byteptr < tempbyte ) overflow ( strbytes , maxbytes ) ; {register integer for_end; l = 1 ;for_end = tempbyte ; if ( l <= for_end) do { bytemem [byteptr ]= vfubyte () ; byteptr = byteptr + 1 ; } while ( l++ < for_end ) ;} Fputs( termout , "VF file: '" ) ; printpacket ( newpacket () ) ; Fputs( termout , "'," ) ; flushpacket () ; checkchecksum ( vfsquad () , false ) ; checkdesignsize ( round ( tfmconv * vfpquad () ) ) ; z = fntscaled [curfnt ]; alpha = 16 ; while ( z >= 8388608L ) { z = z / 2 ; alpha = alpha + alpha ; } beta = 256 / alpha ; alpha = alpha * z ; { putc ('\n', termout ); fprintf( termout , "%s%ld", " for font " , (long)curfnt ) ; } printfont ( curfnt ) ; fprintf( termout , "%c\n", '.' ) ; vfifnts [0 ]= maxfonts ; vfnf = 0 ; curcmd = vfubyte () ; while ( ( curcmd >= 243 ) && ( curcmd <= 246 ) ) { switch ( curcmd - 243 ) {case 0 : curparm = vfubyte () ; break ; case 1 : curparm = vfupair () ; break ; case 2 : curparm = vfutrio () ; break ; case 3 : curparm = vfsquad () ; break ; } vfdofont () ; curcmd = vfubyte () ; } fntfont [curfnt ]= vfifnts [0 ]; while ( curcmd <= 242 ) { if ( curcmd < 242 ) { vflimit = curcmd ; curext = 0 ; curres = vfubyte () ; vfwp = checkwidth ( vffix3u () ) ; } else { vflimit = vfuquad () ; curext = vfstrio () ; curres = vfubyte () ; vfwp = checkwidth ( vffix4 () ) ; } vflimit = vflimit + vfloc ; vfpushloc [0 ]= byteptr ; vflastend [0 ]= byteptr ; vflast [0 ]= 4 ; vfptr = 0 ; startpacket ( 1 ) ; vfcurfnt = fntfont [curfnt ]; vffnt = vfcurfnt ; lastpop = false ; curclass = 3 ; while ( true ) { lab21: switch ( curclass ) {case 0 : case 1 : case 2 : { if ( ( vfptr == 0 ) || ( byteptr > vfpushloc [vfptr ]) ) movezero = false ; else switch ( curclass ) {case 0 : movezero = ( ! curupd ) || ( vfcurfnt != vffnt ) ; break ; case 1 : movezero = ! curupd ; break ; case 2 : movezero = true ; break ; } if ( movezero ) { byteptr = byteptr - 1 ; vfptr = vfptr - 1 ; } switch ( curclass ) {case 0 : { if ( vfcurfnt != vffnt ) { vflast [vfptr ]= 4 ; pcktunsigned ( 235 , vfcurfnt ) ; vffnt = vfcurfnt ; } if ( ( ! movezero ) || ( ! curupd ) ) { vflast [vfptr ]= vfchartype [curupd ]; vflastloc [vfptr ]= byteptr ; pcktchar ( curupd , curext , curres ) ; } } break ; case 1 : { vflast [vfptr ]= vfruletype [curupd ]; vflastloc [vfptr ]= byteptr ; { if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= dvirulecmd [curupd ]; byteptr = byteptr + 1 ; } } pcktfour ( curvdimen ) ; pcktfour ( curhdimen ) ; } break ; case 2 : { vflast [vfptr ]= 4 ; pcktunsigned ( 239 , curparm ) ; if ( maxbytes - byteptr < curparm ) overflow ( strbytes , maxbytes ) ; while ( curparm > 0 ) { { bytemem [byteptr ]= vfubyte () ; byteptr = byteptr + 1 ; } curparm = curparm - 1 ; } } break ; } vflastend [vfptr ]= byteptr ; if ( movezero ) { vfptr = vfptr + 1 ; { if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= 141 ; byteptr = byteptr + 1 ; } } vfpushloc [vfptr ]= byteptr ; vflastend [vfptr ]= byteptr ; if ( curclass == 0 ) if ( curupd ) goto lab21 ; } } break ; case 3 : if ( ( vfptr > 0 ) && ( vfpushloc [vfptr ]== byteptr ) ) { if ( vfpushnum [vfptr ]== 255 ) overflow ( strstack , 255 ) ; vfpushnum [vfptr ]= vfpushnum [vfptr ]+ 1 ; } else { if ( vfptr == stackused ) if ( stackused == stacksize ) overflow ( strstack , stacksize ) ; else stackused = stackused + 1 ; vfptr = vfptr + 1 ; { if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= 141 ; byteptr = byteptr + 1 ; } } { vfmove [vfptr ][0 ][0 ]= vfmove [vfptr - 1 ][0 ][0 ]; vfmove [vfptr ][0 ][1 ]= vfmove [vfptr - 1 ][0 ][1 ]; vfmove [vfptr ][1 ][0 ]= vfmove [vfptr - 1 ][1 ][0 ]; vfmove [vfptr ][1 ][1 ]= vfmove [vfptr - 1 ][1 ][1 ]; } vfpushloc [vfptr ]= byteptr ; vflastend [vfptr ]= byteptr ; vflast [vfptr ]= 4 ; vfpushnum [vfptr ]= 0 ; } break ; case 4 : { if ( vfptr < 1 ) badfont () ; byteptr = vflastend [vfptr ]; if ( vflast [vfptr ]<= 1 ) if ( vflastloc [vfptr ]== vfpushloc [vfptr ]) { curclass = vflast [vfptr ]; curupd = false ; byteptr = vfpushloc [vfptr ]; } if ( byteptr == vfpushloc [vfptr ]) { if ( vfpushnum [vfptr ]> 0 ) { vfpushnum [vfptr ]= vfpushnum [vfptr ]- 1 ; { vfmove [vfptr ][0 ][0 ]= vfmove [vfptr - 1 ][0 ][0 ]; vfmove [vfptr ][0 ][1 ]= vfmove [vfptr - 1 ][0 ][1 ]; vfmove [vfptr ][1 ][0 ]= vfmove [vfptr - 1 ][1 ][0 ]; vfmove [vfptr ][1 ][1 ]= vfmove [vfptr - 1 ][1 ][1 ]; } } else { byteptr = byteptr - 1 ; vfptr = vfptr - 1 ; } if ( curclass != 4 ) goto lab21 ; } else { if ( vflast [vfptr ]== 2 ) { byteptr = byteptr - 2 ; {register integer for_end; k = vflastloc [vfptr ]+ 1 ; for_end = byteptr ; if ( k <= for_end) do bytemem [k - 1 ]= bytemem [k ]; while ( k++ < for_end ) ;} vflast [vfptr ]= 4 ; vflastend [vfptr ]= byteptr ; } { if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= 142 ; byteptr = byteptr + 1 ; } } vfptr = vfptr - 1 ; vflast [vfptr ]= 2 ; vflastloc [vfptr ]= vfpushloc [vfptr + 1 ]- 1 ; vflastend [vfptr ]= byteptr ; if ( vfpushnum [vfptr + 1 ]> 0 ) { vfptr = vfptr + 1 ; { if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= 141 ; byteptr = byteptr + 1 ; } } { vfmove [vfptr ][0 ][0 ]= vfmove [vfptr - 1 ][0 ][0 ]; vfmove [vfptr ][0 ][1 ]= vfmove [vfptr - 1 ][0 ][1 ]; vfmove [vfptr ][1 ][0 ]= vfmove [vfptr - 1 ][1 ][0 ]; vfmove [vfptr ][1 ][1 ]= vfmove [vfptr - 1 ][1 ][1 ]; } vfpushloc [vfptr ]= byteptr ; vflastend [vfptr ]= byteptr ; vflast [vfptr ]= 4 ; vfpushnum [vfptr ]= vfpushnum [vfptr ]- 1 ; } } } break ; case 5 : case 6 : if ( vfmove [vfptr ][0 ][curclass - 5 ]) { if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= curcmd ; byteptr = byteptr + 1 ; } } break ; case 7 : case 8 : case 9 : { pcktsigned ( dvirightcmd [curclass ], curparm ) ; if ( curclass >= 8 ) vfmove [vfptr ][0 ][curclass - 8 ]= true ; } break ; case 10 : case 11 : if ( vfmove [vfptr ][1 ][curclass - 10 ]) { if ( maxbytes - byteptr < 1 ) overflow ( strbytes , maxbytes ) ; { bytemem [byteptr ]= curcmd ; byteptr = byteptr + 1 ; } } break ; case 12 : case 13 : case 14 : { pcktsigned ( dvidowncmd [curclass ], curparm ) ; if ( curclass >= 13 ) vfmove [vfptr ][1 ][curclass - 13 ]= true ; } break ; case 15 : vffont () ; break ; case 16 : badfont () ; break ; case 17 : if ( curcmd != 138 ) badfont () ; break ; } if ( vfloc < vflimit ) vffirstpar () ; else if ( lastpop ) goto lab30 ; else { curclass = 4 ; lastpop = true ; } } lab30: if ( ( vfptr != 0 ) || ( vfloc != vflimit ) ) badfont () ; k = pcktstart [pcktptr ]; if ( vflast [0 ]== 3 ) if ( curwp == vfwp ) { bytemem [k ]= bytemem [k ]- 1 ; if ( ( bytemem [k ]== 0 ) && ( vfpushloc [0 ]== vflastloc [0 ]) && ( curext == 0 ) && ( curres == pcktres ) ) byteptr = k ; } buildpacket () ; curcmd = vfubyte () ; } if ( curcmd != 248 ) badfont () ; curext = saveext ; curres = saveres ; curcp = savecp ; curwp = savewp ; curupd = saveupd ; Result = true ; goto lab10 ; lab32: Result = false ; lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES inputln ( void ) #else inputln ( ) #endif { integer k ; Fputs( termout , "Enter option: " ) ; fflush ( stdout ) ; k = 0 ; if ( maxbytes - byteptr < terminallinelength ) overflow ( strbytes , maxbytes ) ; while ( ( k < terminallinelength ) && ! eoln ( input ) ) { { bytemem [byteptr ]= xord [getc ( input ) ]; byteptr = byteptr + 1 ; } k = k + 1 ; } } boolean #ifdef HAVE_PROTOTYPES zscankeyword ( pcktpointer p , int7 l ) #else zscankeyword ( p , l ) pcktpointer p ; int7 l ; #endif { register boolean Result; bytepointer i, j, k ; i = pcktstart [p ]; j = pcktstart [p + 1 ]; k = scanptr ; while ( ( i < j ) && ( ( bytemem [k ]== bytemem [i ]) || ( bytemem [k ] == bytemem [i ]- 32 ) ) ) { i = i + 1 ; k = k + 1 ; } if ( ( ( bytemem [k ]== 32 ) || ( bytemem [k ]== 47 ) ) && ( i - pcktstart [p ]>= l ) ) { scanptr = k ; while ( ( ( bytemem [scanptr ]== 32 ) || ( bytemem [scanptr ]== 47 ) ) && ( scanptr < byteptr ) ) scanptr = scanptr + 1 ; Result = true ; } else Result = false ; return Result ; } integer #ifdef HAVE_PROTOTYPES scanint ( void ) #else scanint ( ) #endif { register integer Result; integer x ; boolean negative ; if ( bytemem [scanptr ]== 45 ) { negative = true ; scanptr = scanptr + 1 ; } else negative = false ; x = 0 ; while ( ( bytemem [scanptr ]>= 48 ) && ( bytemem [scanptr ]<= 57 ) ) { x = 10 * x + bytemem [scanptr ]- 48 ; scanptr = scanptr + 1 ; } while ( ( ( bytemem [scanptr ]== 32 ) || ( bytemem [scanptr ]== 47 ) ) && ( scanptr < byteptr ) ) scanptr = scanptr + 1 ; if ( negative ) Result = - (integer) x ; else Result = x ; return Result ; } void #ifdef HAVE_PROTOTYPES scancount ( void ) #else scancount ( ) #endif { if ( bytemem [scanptr ]== 42 ) { selectthere [curselect ][selectvals [curselect ]]= false ; scanptr = scanptr + 1 ; while ( ( ( bytemem [scanptr ]== 32 ) || ( bytemem [scanptr ]== 47 ) ) && ( scanptr < byteptr ) ) scanptr = scanptr + 1 ; } else { selectthere [curselect ][selectvals [curselect ]]= true ; selectcount [curselect ][selectvals [curselect ]]= scanint () ; if ( curselect == 0 ) selected = false ; } } void #ifdef HAVE_PROTOTYPES dialog ( void ) #else dialog ( ) #endif { /* 10 */ pcktpointer p ; outmag = 0 ; curselect = 0 ; selectmax [curselect ]= 0 ; selected = true ; while ( true ) { inputln () ; p = newpacket () ; bytemem [byteptr ]= 32 ; scanptr = pcktstart [pcktptr - 1 ]; while ( ( ( bytemem [scanptr ]== 32 ) || ( bytemem [scanptr ]== 47 ) ) && ( scanptr < byteptr ) ) scanptr = scanptr + 1 ; if ( scanptr == byteptr ) { flushpacket () ; goto lab10 ; } else if ( scankeyword ( strmag , 3 ) ) outmag = scanint () ; else if ( scankeyword ( strselect , 3 ) ) if ( curselect == 10 ) fprintf( termout , "%s\n", "Too many page selections" ) ; else { selectvals [curselect ]= 0 ; scancount () ; while ( ( selectvals [curselect ]< 9 ) && ( bytemem [scanptr ]== 46 ) ) { selectvals [curselect ]= selectvals [curselect ]+ 1 ; scanptr = scanptr + 1 ; scancount () ; } selectmax [curselect ]= scanint () ; curselect = curselect + 1 ; } else { if ( nopt == 0 ) sepchar = ' ' ; else sepchar = xchr [47 ]; printoptions () ; if ( nopt > 0 ) { Fputs( termout , "Bad command line option: " ) ; printpacket ( p ) ; { fprintf( stderr , "%c%s%c\n", ' ' , "---run terminated" , '.' ) ; jumpout () ; } } } flushpacket () ; } lab10: ; } void #ifdef HAVE_PROTOTYPES zoutpacket ( pcktpointer p ) #else zoutpacket ( p ) pcktpointer p ; #endif { bytepointer k ; outloc = outloc + ( pcktstart [p + 1 ]- pcktstart [p ]) ; {register integer for_end; k = pcktstart [p ];for_end = pcktstart [p + 1 ]- 1 ; if ( k <= for_end) do putbyte ( bytemem [k ], outfile ) ; while ( k++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES zoutfour ( integer x ) #else zoutfour ( x ) integer x ; #endif { ; if ( x >= 0 ) putbyte ( x / 16777216L , outfile ) ; else { x = x + 1073741824L ; x = x + 1073741824L ; putbyte ( ( x / 16777216L ) + 128 , outfile ) ; } x = x % 16777216L ; putbyte ( x / 65536L , outfile ) ; x = x % 65536L ; putbyte ( x / 256 , outfile ) ; putbyte ( x % 256 , outfile ) ; outloc = outloc + 4 ; } void #ifdef HAVE_PROTOTYPES zoutchar ( boolean upd , integer ext , eightbits res ) #else zoutchar ( upd , ext , res ) boolean upd ; integer ext ; eightbits res ; #endif { eightbits o ; if ( ( ! upd ) || ( res > 127 ) || ( ext != 0 ) ) { o = dvicharcmd [upd ]; if ( ext < 0 ) ext = ext + 16777216L ; if ( ext == 0 ) { putbyte ( o , outfile ) ; outloc = outloc + 1 ; } else { if ( ext < 256 ) { putbyte ( o + 1 , outfile ) ; outloc = outloc + 1 ; } else { if ( ext < 65536L ) { putbyte ( o + 2 , outfile ) ; outloc = outloc + 1 ; } else { { putbyte ( o + 3 , outfile ) ; outloc = outloc + 1 ; } { putbyte ( ext / 65536L , outfile ) ; outloc = outloc + 1 ; } ext = ext % 65536L ; } { putbyte ( ext / 256 , outfile ) ; outloc = outloc + 1 ; } ext = ext % 256 ; } { putbyte ( ext , outfile ) ; outloc = outloc + 1 ; } } } { putbyte ( res , outfile ) ; outloc = outloc + 1 ; } } void #ifdef HAVE_PROTOTYPES zoutunsigned ( eightbits o , integer x ) #else zoutunsigned ( o , x ) eightbits o ; integer x ; #endif { ; if ( ( x < 256 ) && ( x >= 0 ) ) if ( ( o == 235 ) && ( x < 64 ) ) x = x + 171 ; else { putbyte ( o , outfile ) ; outloc = outloc + 1 ; } else { if ( ( x < 65536L ) && ( x >= 0 ) ) { putbyte ( o + 1 , outfile ) ; outloc = outloc + 1 ; } else { if ( ( x < 16777216L ) && ( x >= 0 ) ) { putbyte ( o + 2 , outfile ) ; outloc = outloc + 1 ; } else { { putbyte ( o + 3 , outfile ) ; outloc = outloc + 1 ; } if ( x >= 0 ) { putbyte ( x / 16777216L , outfile ) ; outloc = outloc + 1 ; } else { x = x + 1073741824L ; x = x + 1073741824L ; { putbyte ( ( x / 16777216L ) + 128 , outfile ) ; outloc = outloc + 1 ; } } x = x % 16777216L ; } { putbyte ( x / 65536L , outfile ) ; outloc = outloc + 1 ; } x = x % 65536L ; } { putbyte ( x / 256 , outfile ) ; outloc = outloc + 1 ; } x = x % 256 ; } { putbyte ( x , outfile ) ; outloc = outloc + 1 ; } } void #ifdef HAVE_PROTOTYPES zoutsigned ( eightbits o , integer x ) #else zoutsigned ( o , x ) eightbits o ; integer x ; #endif { int31 xx ; if ( x >= 0 ) xx = x ; else xx = - (integer) ( x + 1 ) ; if ( xx < 128 ) { { putbyte ( o , outfile ) ; outloc = outloc + 1 ; } if ( x < 0 ) x = x + 256 ; } else { if ( xx < 32768L ) { { putbyte ( o + 1 , outfile ) ; outloc = outloc + 1 ; } if ( x < 0 ) x = x + 65536L ; } else { if ( xx < 8388608L ) { { putbyte ( o + 2 , outfile ) ; outloc = outloc + 1 ; } if ( x < 0 ) x = x + 16777216L ; } else { { putbyte ( o + 3 , outfile ) ; outloc = outloc + 1 ; } if ( x >= 0 ) { putbyte ( x / 16777216L , outfile ) ; outloc = outloc + 1 ; } else { x = 2147483647L - xx ; { putbyte ( ( x / 16777216L ) + 128 , outfile ) ; outloc = outloc + 1 ; } } x = x % 16777216L ; } { putbyte ( x / 65536L , outfile ) ; outloc = outloc + 1 ; } x = x % 65536L ; } { putbyte ( x / 256 , outfile ) ; outloc = outloc + 1 ; } x = x % 256 ; } { putbyte ( x , outfile ) ; outloc = outloc + 1 ; } } void #ifdef HAVE_PROTOTYPES zoutfntdef ( fontnumber f ) #else zoutfntdef ( f ) fontnumber f ; #endif { pcktpointer p ; bytepointer k, l ; eightbits a ; outunsigned ( 243 , fntfont [f ]) ; outfour ( fntcheck [f ]) ; outfour ( fntscaled [f ]) ; outfour ( fntdesign [f ]) ; p = fntname [f ]; k = pcktstart [p ]; l = pcktstart [p + 1 ]- 1 ; a = bytemem [k ]; outloc = outloc + l - k + 2 ; putbyte ( a , outfile ) ; putbyte ( l - k - a , outfile ) ; while ( k < l ) { k = k + 1 ; putbyte ( bytemem [k ], outfile ) ; } } boolean #ifdef HAVE_PROTOTYPES startmatch ( void ) #else startmatch ( ) #endif { register boolean Result; char k ; boolean match ; match = true ; {register integer for_end; k = 0 ;for_end = selectvals [curselect ] ; if ( k <= for_end) do if ( selectthere [curselect ][k ]&& ( selectcount [curselect ][k ] != count [k ]) ) match = false ; while ( k++ < for_end ) ;} Result = match ; return Result ; } void #ifdef HAVE_PROTOTYPES dopre ( void ) #else dopre ( ) #endif { int15 k ; bytepointer p, q, r ; char * comment ; alldone = false ; numselect = curselect ; curselect = 0 ; if ( numselect == 0 ) selectmax [curselect ]= 0 ; { putbyte ( 247 , outfile ) ; outloc = outloc + 1 ; } { putbyte ( 2 , outfile ) ; outloc = outloc + 1 ; } outfour ( dvinum ) ; outfour ( dviden ) ; outfour ( outmag ) ; p = pcktstart [pcktptr - 1 ]; q = byteptr ; comment = "DVIcopy 1.5 output from " ; if ( maxbytes - byteptr < 24 ) overflow ( strbytes , maxbytes ) ; {register integer for_end; k = 0 ;for_end = 23 ; if ( k <= for_end) do { bytemem [byteptr ]= xord [comment [k ]]; byteptr = byteptr + 1 ; } while ( k++ < for_end ) ;} while ( bytemem [p ]== 32 ) p = p + 1 ; if ( p == q ) byteptr = byteptr - 6 ; else { k = 0 ; while ( ( k < 24 ) && ( bytemem [p + k ]== bytemem [q + k ]) ) k = k + 1 ; if ( k == 24 ) p = p + 24 ; } k = byteptr - p ; if ( k > 255 ) { k = 255 ; q = p + 231 ; } { putbyte ( k , outfile ) ; outloc = outloc + 1 ; } outpacket ( newpacket () ) ; flushpacket () ; {register integer for_end; r = p ;for_end = q - 1 ; if ( r <= for_end) do { putbyte ( bytemem [r ], outfile ) ; outloc = outloc + 1 ; } while ( r++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES dobop ( void ) #else dobop ( ) #endif { char i, j ; if ( ! selected ) selected = startmatch () ; typesetting = selected ; Fputs( termout , "DVI: " ) ; if ( typesetting ) Fputs( termout , "process" ) ; else Fputs( termout , "skipp" ) ; fprintf( termout , "%s%ld", "ing page " , (long)count [0 ]) ; j = 9 ; while ( ( j > 0 ) && ( count [j ]== 0 ) ) j = j - 1 ; {register integer for_end; i = 1 ;for_end = j ; if ( i <= for_end) do fprintf( termout , "%c%ld", '.' , (long)count [i ]) ; while ( i++ < for_end ) ;} fprintf( termout , "%c\n", '.' ) ; if ( typesetting ) { stackptr = 0 ; curstack = zerostack ; curfnt = maxfonts ; { putbyte ( 139 , outfile ) ; outloc = outloc + 1 ; } outpages = outpages + 1 ; {register integer for_end; i = 0 ;for_end = 9 ; if ( i <= for_end) do outfour ( count [i ]) ; while ( i++ < for_end ) ;} outfour ( outback ) ; outback = outloc - 45 ; outfnt = maxfonts ; } } void #ifdef HAVE_PROTOTYPES doeop ( void ) #else doeop ( ) #endif { if ( stackptr != 0 ) baddvi () ; { putbyte ( 140 , outfile ) ; outloc = outloc + 1 ; } if ( selectmax [curselect ]> 0 ) { selectmax [curselect ]= selectmax [curselect ]- 1 ; if ( selectmax [curselect ]== 0 ) { selected = false ; curselect = curselect + 1 ; if ( curselect == numselect ) alldone = true ; } } typesetting = false ; } void #ifdef HAVE_PROTOTYPES dopush ( void ) #else dopush ( ) #endif { if ( stackptr == stackused ) if ( stackused == stacksize ) overflow ( strstack , stacksize ) ; else stackused = stackused + 1 ; stackptr = stackptr + 1 ; stack [stackptr ]= curstack ; if ( stackptr > outstack ) outstack = stackptr ; { putbyte ( 141 , outfile ) ; outloc = outloc + 1 ; } } void #ifdef HAVE_PROTOTYPES dopop ( void ) #else dopop ( ) #endif { if ( stackptr == 0 ) baddvi () ; curstack = stack [stackptr ]; stackptr = stackptr - 1 ; { putbyte ( 142 , outfile ) ; outloc = outloc + 1 ; } } void #ifdef HAVE_PROTOTYPES doxxx ( void ) #else doxxx ( ) #endif { pcktpointer p ; p = newpacket () ; outunsigned ( 239 , ( pcktstart [p + 1 ]- pcktstart [p ]) ) ; outpacket ( p ) ; flushpacket () ; } void #ifdef HAVE_PROTOTYPES doright ( void ) #else doright ( ) #endif { if ( curclass >= 8 ) curstack .wxfield [curclass - 8 ]= curparm ; else if ( curclass < 7 ) curparm = curstack .wxfield [curclass - 5 ]; if ( curclass < 7 ) { putbyte ( curcmd , outfile ) ; outloc = outloc + 1 ; } else outsigned ( dvirightcmd [curclass ], curparm ) ; curstack .hfield = curstack .hfield + curparm ; if ( abs ( curstack .hfield ) > outmaxh ) outmaxh = abs ( curstack .hfield ) ; } void #ifdef HAVE_PROTOTYPES dodown ( void ) #else dodown ( ) #endif { if ( curclass >= 13 ) curstack .yzfield [curclass - 13 ]= curparm ; else if ( curclass < 12 ) curparm = curstack .yzfield [curclass - 10 ]; if ( curclass < 12 ) { putbyte ( curcmd , outfile ) ; outloc = outloc + 1 ; } else outsigned ( dvidowncmd [curclass ], curparm ) ; curstack .vfield = curstack .vfield + curparm ; if ( abs ( curstack .vfield ) > outmaxv ) outmaxv = abs ( curstack .vfield ) ; } void #ifdef HAVE_PROTOTYPES dowidth ( void ) #else dowidth ( ) #endif { { putbyte ( 132 , outfile ) ; outloc = outloc + 1 ; } outfour ( widthdimen ) ; outfour ( curhdimen ) ; curstack .hfield = curstack .hfield + curhdimen ; if ( abs ( curstack .hfield ) > outmaxh ) outmaxh = abs ( curstack .hfield ) ; } void #ifdef HAVE_PROTOTYPES dorule ( void ) #else dorule ( ) #endif { boolean visible ; if ( ( curhdimen > 0 ) && ( curvdimen > 0 ) ) { visible = true ; { putbyte ( dvirulecmd [curupd ], outfile ) ; outloc = outloc + 1 ; } outfour ( curvdimen ) ; outfour ( curhdimen ) ; } else { visible = false ; { putbyte ( dvirulecmd [curupd ], outfile ) ; outloc = outloc + 1 ; } outfour ( curvdimen ) ; outfour ( curhdimen ) ; } if ( curupd ) { curstack .hfield = curstack .hfield + curhdimen ; if ( abs ( curstack .hfield ) > outmaxh ) outmaxh = abs ( curstack .hfield ) ; } } void #ifdef HAVE_PROTOTYPES dochar ( void ) #else dochar ( ) #endif { if ( curfnt != outfnt ) { outunsigned ( 235 , fntfont [curfnt ]) ; outfnt = curfnt ; } outchar ( curupd , curext , curres ) ; if ( curupd ) { curstack .hfield = curstack .hfield + widths [curwp ]; if ( abs ( curstack .hfield ) > outmaxh ) outmaxh = abs ( curstack .hfield ) ; } } void #ifdef HAVE_PROTOTYPES dofont ( void ) #else dofont ( ) #endif { /* 30 */ charpointer p ; if ( dovf () ) goto lab30 ; if ( ( outnf >= maxfonts ) ) overflow ( strfonts , maxfonts ) ; fprintf( termout , "%s%ld", "OUT: font " , (long)curfnt ) ; printfont ( curfnt ) ; fprintf( termout , "%c\n", '.' ) ; fnttype [curfnt ]= 3 ; fntfont [curfnt ]= outnf ; outfnts [outnf ]= curfnt ; outnf = outnf + 1 ; outfntdef ( curfnt ) ; lab30: ; } void #ifdef HAVE_PROTOTYPES pcktfirstpar ( void ) #else pcktfirstpar ( ) #endif { curcmd = pcktubyte () ; switch ( dvipar [curcmd ]) {case 0 : { curext = 0 ; if ( curcmd < 128 ) { curres = curcmd ; curupd = true ; } else { curres = pcktubyte () ; curupd = ( curcmd < 133 ) ; curcmd = curcmd - dvicharcmd [curupd ]; while ( curcmd > 0 ) { if ( curcmd == 3 ) if ( curres > 127 ) curext = -1 ; curext = curext * 256 + curres ; curres = pcktubyte () ; curcmd = curcmd - 1 ; } } } break ; case 1 : ; break ; case 2 : curparm = pcktsbyte () ; break ; case 3 : curparm = pcktubyte () ; break ; case 4 : curparm = pcktspair () ; break ; case 5 : curparm = pcktupair () ; break ; case 6 : curparm = pcktstrio () ; break ; case 7 : curparm = pcktutrio () ; break ; case 8 : case 9 : case 10 : curparm = pcktsquad () ; break ; case 11 : { curvdimen = pcktsquad () ; curhdimen = pcktsquad () ; curupd = ( curcmd == 132 ) ; } break ; case 12 : curparm = curcmd - 171 ; break ; } curclass = dvicl [curcmd ]; } void #ifdef HAVE_PROTOTYPES dovfpacket ( void ) #else dovfpacket ( ) #endif { /* 22 31 30 */ recurpointer k ; int8u f ; boolean saveupd ; widthpointer savecp ; widthpointer savewp ; bytepointer savelimit ; saveupd = curupd ; savecp = curcp ; savewp = curwp ; recurfnt [nrecur ]= curfnt ; recurext [nrecur ]= curext ; recurres [nrecur ]= curres ; if ( findpacket () ) f = curtype ; else goto lab30 ; recurpckt [nrecur ]= curpckt ; savelimit = curlimit ; curfnt = fntfont [curfnt ]; if ( curpckt == 0 ) { curclass = 0 ; goto lab31 ; } if ( curloc >= curlimit ) goto lab30 ; lab22: pcktfirstpar () ; lab31: switch ( curclass ) {case 0 : { if ( fnttype [curfnt ]<= 1 ) dofont () ; curcp = fntchars [curfnt ]+ curres ; curwp = charwidths [curcp ]; if ( ( curloc == curlimit ) && ( f == 0 ) && saveupd ) { saveupd = false ; curupd = true ; } if ( fnttype [curfnt ]== 2 ) { recurloc [nrecur ]= curloc ; if ( curloc < curlimit ) if ( bytemem [curloc ]== 142 ) curupd = false ; if ( nrecur == recurused ) if ( recurused == maxrecursion ) { fprintf( termout , "%s\n", " !Infinite VF recursion?" ) ; {register integer for_end; k = maxrecursion ;for_end = 0 ; if ( k >= for_end) do { fprintf( termout , "%s%ld%s", "level=" , (long)k , " font" ) ; printfont ( recurfnt [k ]) ; fprintf( termout , "%s%ld", " char=" , (long)recurres [k ]) ; if ( recurext [k ]!= 0 ) fprintf( termout , "%c%ld", '.' , (long)recurext [k ]) ; putc ('\n', termout ); } while ( k-- > for_end ) ;} overflow ( strrecursion , maxrecursion ) ; } else recurused = recurused + 1 ; nrecur = nrecur + 1 ; dovfpacket () ; nrecur = nrecur - 1 ; curloc = recurloc [nrecur ]; curlimit = savelimit ; } else dochar () ; } break ; case 1 : dorule () ; break ; case 2 : { if ( maxbytes - byteptr < curparm ) overflow ( strbytes , maxbytes ) ; while ( curparm > 0 ) { { bytemem [byteptr ]= pcktubyte () ; byteptr = byteptr + 1 ; } curparm = curparm - 1 ; } doxxx () ; } break ; case 3 : dopush () ; break ; case 4 : dopop () ; break ; case 5 : case 6 : case 7 : case 8 : case 9 : doright () ; break ; case 10 : case 11 : case 12 : case 13 : case 14 : dodown () ; break ; case 15 : curfnt = curparm ; break ; default: confusion ( strpackets ) ; break ; } if ( curloc < curlimit ) goto lab22 ; lab30: if ( saveupd ) { curhdimen = widths [savewp ]; { dowidth () ; } } curfnt = recurfnt [nrecur ]; } void #ifdef HAVE_PROTOTYPES dodvi ( void ) #else dodvi ( ) #endif { /* 30 10 */ int8u tempbyte ; integer tempint ; integer dvistart ; integer dviboppost ; integer dviback ; int15 k ; if ( dviubyte () != 247 ) baddvi () ; if ( dviubyte () != 2 ) baddvi () ; dvinum = dvipquad () ; dviden = dvipquad () ; dvimag = dvipquad () ; tfmconv = ( 25400000.0 / ((double) dvinum ) ) * ( dviden / ((double) 473628672L ) ) / ((double) 16.0 ) ; tempbyte = dviubyte () ; if ( maxbytes - byteptr < tempbyte ) overflow ( strbytes , maxbytes ) ; {register integer for_end; k = 1 ;for_end = tempbyte ; if ( k <= for_end) do { bytemem [byteptr ]= dviubyte () ; byteptr = byteptr + 1 ; } while ( k++ < for_end ) ;} Fputs( termout , "DVI file: '" ) ; printpacket ( newpacket () ) ; fprintf( termout , "%s\n", "'," ) ; fprintf( termout , "%s%ld%s%ld%s%ld", " num=" , (long)dvinum , ", den=" , (long)dviden , ", mag=" , (long)dvimag ) ; if ( outmag <= 0 ) outmag = dvimag ; else fprintf( termout , "%s%ld", " => " , (long)outmag ) ; fprintf( termout , "%c\n", '.' ) ; dopre () ; flushpacket () ; if ( true ) { dvistart = dviloc ; tempint = dvilength () - 5 ; do { if ( tempint < 49 ) baddvi () ; dvimove ( tempint ) ; tempbyte = dviubyte () ; tempint = tempint - 1 ; } while ( ! ( tempbyte != 223 ) ) ; if ( tempbyte != 2 ) baddvi () ; dvimove ( tempint - 4 ) ; if ( dviubyte () != 249 ) baddvi () ; dviboppost = dvipointer () ; if ( ( dviboppost < 15 ) || ( dviboppost > dviloc - 34 ) ) baddvi () ; dvimove ( dviboppost ) ; if ( dviubyte () != 248 ) baddvi () ; dviback = dvipointer () ; if ( dvinum != dvipquad () ) baddvi () ; if ( dviden != dvipquad () ) baddvi () ; if ( dvimag != dvipquad () ) baddvi () ; tempint = dvisquad () ; tempint = dvisquad () ; if ( stacksize < dviupair () ) overflow ( strstack , stacksize ) ; tempint = dviupair () ; dvifirstpar () ; while ( curclass == 16 ) { dvidofont ( false ) ; dvifirstpar () ; } if ( curcmd != 249 ) baddvi () ; if ( ! selected ) { dvistart = dviboppost ; while ( dviback != -1 ) { if ( ( dviback < 15 ) || ( dviback > dviboppost - 46 ) ) baddvi () ; dviboppost = dviback ; dvimove ( dviback ) ; if ( dviubyte () != 139 ) baddvi () ; {register integer for_end; k = 0 ;for_end = 9 ; if ( k <= for_end) do count [k ]= dvisquad () ; while ( k++ < for_end ) ;} if ( startmatch () ) dvistart = dviboppost ; dviback = dvipointer () ; } } dvimove ( dvistart ) ; } do { dvifirstpar () ; while ( curclass == 16 ) { dvidofont ( true ) ; dvifirstpar () ; } if ( curcmd == 139 ) { {register integer for_end; k = 0 ;for_end = 9 ; if ( k <= for_end) do count [k ]= dvisquad () ; while ( k++ < for_end ) ;} tempint = dvipointer () ; dobop () ; dvifirstpar () ; if ( typesetting ) while ( true ) { switch ( curclass ) {case 0 : { if ( fnttype [curfnt ]<= 1 ) dofont () ; curwp = 0 ; if ( curfnt != maxfonts ) if ( ( curres >= fntbc [curfnt ]) && ( curres <= fntec [curfnt ]) ) { curcp = fntchars [curfnt ]+ curres ; curwp = charwidths [curcp ]; } if ( curwp == 0 ) baddvi () ; if ( fnttype [curfnt ]== 2 ) dovfpacket () ; else dochar () ; } break ; case 1 : if ( curupd && ( curvdimen == widthdimen ) ) { dowidth () ; } else dorule () ; break ; case 2 : { if ( maxbytes - byteptr < curparm ) overflow ( strbytes , maxbytes ) ; while ( curparm > 0 ) { { bytemem [byteptr ]= dviubyte () ; byteptr = byteptr + 1 ; } curparm = curparm - 1 ; } doxxx () ; } break ; case 3 : dopush () ; break ; case 4 : dopop () ; break ; case 5 : case 6 : case 7 : case 8 : case 9 : doright () ; break ; case 10 : case 11 : case 12 : case 13 : case 14 : dodown () ; break ; case 15 : dvifont () ; break ; case 16 : dvidofont ( true ) ; break ; case 17 : goto lab30 ; break ; } dvifirstpar () ; } else while ( true ) { switch ( curclass ) {case 2 : while ( curparm > 0 ) { tempbyte = dviubyte () ; curparm = curparm - 1 ; } break ; case 16 : dvidofont ( true ) ; break ; case 17 : goto lab30 ; break ; default: ; break ; } dvifirstpar () ; } lab30: if ( curcmd != 140 ) baddvi () ; if ( selected ) { doeop () ; if ( alldone ) goto lab10 ; } } } while ( ! ( curcmd != 140 ) ) ; if ( curcmd != 248 ) baddvi () ; lab10: ; } void #ifdef HAVE_PROTOTYPES closefilesandterminate ( void ) #else closefilesandterminate ( ) #endif { int15 k ; if ( history < 3 ) { if ( typesetting ) { while ( stackptr > 0 ) { { putbyte ( 142 , outfile ) ; outloc = outloc + 1 ; } stackptr = stackptr - 1 ; } { putbyte ( 140 , outfile ) ; outloc = outloc + 1 ; } } if ( outloc > 0 ) { { putbyte ( 248 , outfile ) ; outloc = outloc + 1 ; } outfour ( outback ) ; outback = outloc - 5 ; outfour ( dvinum ) ; outfour ( dviden ) ; outfour ( outmag ) ; outfour ( outmaxv ) ; outfour ( outmaxh ) ; { putbyte ( outstack / 256 , outfile ) ; outloc = outloc + 1 ; } { putbyte ( outstack % 256 , outfile ) ; outloc = outloc + 1 ; } { putbyte ( outpages / 256 , outfile ) ; outloc = outloc + 1 ; } { putbyte ( outpages % 256 , outfile ) ; outloc = outloc + 1 ; } k = outnf ; while ( k > 0 ) { k = k - 1 ; outfntdef ( outfnts [k ]) ; } { putbyte ( 249 , outfile ) ; outloc = outloc + 1 ; } outfour ( outback ) ; { putbyte ( 2 , outfile ) ; outloc = outloc + 1 ; } k = 7 - ( ( outloc - 1 ) % 4 ) ; while ( k > 0 ) { { putbyte ( 223 , outfile ) ; outloc = outloc + 1 ; } k = k - 1 ; } fprintf( termout , "%s%ld%s%ld%s", "OUT file: " , (long)outloc , " bytes, " , (long)outpages , " page" ) ; if ( outpages != 1 ) putc ( 's' , termout ); } else Fputs( termout , "OUT file: no output" ) ; fprintf( termout , "%s\n", " written." ) ; if ( outpages == 0 ) if ( history == 0 ) history = 1 ; } switch ( history ) {case 0 : fprintf( termout , "%s\n", "(No errors were found.)" ) ; break ; case 1 : fprintf( termout , "%s\n", "(Did you see the warning message above?)" ) ; break ; case 2 : fprintf( termout , "%s\n", "(Pardon me, but I think I spotted something wrong.)" ) ; break ; case 3 : fprintf( termout , "%s\n", "(That was a fatal error, my friend.)" ) ; break ; } } void mainbody() { initialize () ; byteptr = byteptr + 5 ; bytemem [byteptr - 5 ]= 102 ; bytemem [byteptr - 4 ]= 111 ; bytemem [byteptr - 3 ]= 110 ; bytemem [byteptr - 2 ]= 116 ; bytemem [byteptr - 1 ]= 115 ; strfonts = makepacket () ; byteptr = byteptr + 5 ; bytemem [byteptr - 5 ]= 99 ; bytemem [byteptr - 4 ]= 104 ; bytemem [byteptr - 3 ]= 97 ; bytemem [byteptr - 2 ]= 114 ; bytemem [byteptr - 1 ]= 115 ; strchars = makepacket () ; byteptr = byteptr + 6 ; bytemem [byteptr - 6 ]= 119 ; bytemem [byteptr - 5 ]= 105 ; bytemem [byteptr - 4 ]= 100 ; bytemem [byteptr - 3 ]= 116 ; bytemem [byteptr - 2 ]= 104 ; bytemem [byteptr - 1 ]= 115 ; strwidths = makepacket () ; byteptr = byteptr + 7 ; bytemem [byteptr - 7 ]= 112 ; bytemem [byteptr - 6 ]= 97 ; bytemem [byteptr - 5 ]= 99 ; bytemem [byteptr - 4 ]= 107 ; bytemem [byteptr - 3 ]= 101 ; bytemem [byteptr - 2 ]= 116 ; bytemem [byteptr - 1 ]= 115 ; strpackets = makepacket () ; byteptr = byteptr + 5 ; bytemem [byteptr - 5 ]= 98 ; bytemem [byteptr - 4 ]= 121 ; bytemem [byteptr - 3 ]= 116 ; bytemem [byteptr - 2 ]= 101 ; bytemem [byteptr - 1 ]= 115 ; strbytes = makepacket () ; byteptr = byteptr + 9 ; bytemem [byteptr - 9 ]= 114 ; bytemem [byteptr - 8 ]= 101 ; bytemem [byteptr - 7 ]= 99 ; bytemem [byteptr - 6 ]= 117 ; bytemem [byteptr - 5 ]= 114 ; bytemem [byteptr - 4 ]= 115 ; bytemem [byteptr - 3 ]= 105 ; bytemem [byteptr - 2 ]= 111 ; bytemem [byteptr - 1 ]= 110 ; strrecursion = makepacket () ; byteptr = byteptr + 5 ; bytemem [byteptr - 5 ]= 115 ; bytemem [byteptr - 4 ]= 116 ; bytemem [byteptr - 3 ]= 97 ; bytemem [byteptr - 2 ]= 99 ; bytemem [byteptr - 1 ]= 107 ; strstack = makepacket () ; byteptr = byteptr + 10 ; bytemem [byteptr - 10 ]= 110 ; bytemem [byteptr - 9 ]= 97 ; bytemem [byteptr - 8 ]= 109 ; bytemem [byteptr - 7 ]= 101 ; bytemem [byteptr - 6 ]= 108 ; bytemem [byteptr - 5 ]= 101 ; bytemem [byteptr - 4 ]= 110 ; bytemem [byteptr - 3 ]= 103 ; bytemem [byteptr - 2 ]= 116 ; bytemem [byteptr - 1 ]= 104 ; strnamelength = makepacket () ; byteptr = byteptr + 4 ; bytemem [byteptr - 4 ]= 46 ; bytemem [byteptr - 3 ]= 84 ; bytemem [byteptr - 2 ]= 70 ; bytemem [byteptr - 1 ]= 77 ; tfmext = makepacket () ; byteptr = byteptr + 3 ; bytemem [byteptr - 3 ]= 46 ; bytemem [byteptr - 2 ]= 86 ; bytemem [byteptr - 1 ]= 70 ; vfext = makepacket () ; byteptr = byteptr + 3 ; bytemem [byteptr - 3 ]= 109 ; bytemem [byteptr - 2 ]= 97 ; bytemem [byteptr - 1 ]= 103 ; strmag = makepacket () ; byteptr = byteptr + 6 ; bytemem [byteptr - 6 ]= 115 ; bytemem [byteptr - 5 ]= 101 ; bytemem [byteptr - 4 ]= 108 ; bytemem [byteptr - 3 ]= 101 ; bytemem [byteptr - 2 ]= 99 ; bytemem [byteptr - 1 ]= 116 ; strselect = makepacket () ; dviloc = 0 ; dodvi () ; closefilesandterminate () ; }