#define GFTODVI #include "cpascal.h" #define maxlabels ( 2000 ) #define poolsize ( 10000 ) #define maxstrings ( 1100 ) #define terminallinelength ( 150 ) #define filenamesize ( 50 ) #define fontmemsize ( 2000 ) #define dvibufsize ( 800 ) #define widestrow ( 8192 ) #define liglookahead ( 20 ) typedef integer scaled ; typedef unsigned char ASCIIcode ; typedef text /* of ASCIIcode */ textfile ; typedef unsigned char eightbits ; typedef text /* of eightbits */ bytefile ; typedef integer fontindex ; typedef unsigned char quarterword ; typedef struct { quarterword B0 ; quarterword B1 ; quarterword B2 ; quarterword B3 ; } fourquarters ; #include "gftodmem.h" typedef char internalfontnumber ; typedef integer poolpointer ; typedef integer strnumber ; typedef char keywordcode ; typedef integer dviindex ; typedef integer nodepointer ; ASCIIcode xord[256] ; ASCIIcode xchr[256] ; unsigned char buffer[terminallinelength + 1] ; integer bufptr ; integer linelength ; short lf, lh, bc, ec, nw, nh, nd, ni, nl, nk, ne, np ; bytefile gffile ; bytefile dvifile ; bytefile tfmfile ; integer curloc ; ASCIIcode * nameoffile ; eightbits b0, b1, b2, b3 ; memoryword fontinfo[fontmemsize + 1] ; fontindex fmemptr ; fourquarters fontcheck[6] ; scaled fontsize[6] ; scaled fontdsize[6] ; eightbits fontbc[6] ; eightbits fontec[6] ; integer charbase[6] ; integer widthbase[6] ; integer heightbase[6] ; integer depthbase[6] ; integer italicbase[6] ; integer ligkernbase[6] ; integer kernbase[6] ; integer extenbase[6] ; integer parambase[6] ; fontindex bcharlabel[6] ; short fontbchar[6] ; ASCIIcode strpool[poolsize + 1] ; poolpointer strstart[maxstrings + 1] ; poolpointer poolptr ; strnumber strptr ; strnumber initstrptr ; integer l ; eightbits curgf ; strnumber curstring ; eightbits labeltype ; strnumber curname ; strnumber curarea ; strnumber curext ; poolpointer areadelimiter ; poolpointer extdelimiter ; strnumber jobname ; boolean interaction ; boolean fontsnotloaded ; strnumber fontname[6] ; strnumber fontarea[6] ; scaled fontat[6] ; integer totalpages ; scaled maxv ; scaled maxh ; integer lastbop ; eightbits dvibuf[dvibufsize + 1] ; dviindex halfbuf ; dviindex dvilimit ; dviindex dviptr ; integer dvioffset ; scaled boxwidth ; scaled boxheight ; scaled boxdepth ; quarterword ligstack[liglookahead + 1] ; fourquarters dummyinfo ; boolean suppresslig ; short c[121] ; short d[121] ; short twotothe[14] ; real ruleslant ; integer slantn ; real slantunit ; real slantreported ; scaled xl[maxlabels + 1], xr[maxlabels + 1], yt[maxlabels + 1], yb[maxlabels + 1] ; scaled xx[maxlabels + 1], yy[maxlabels + 1] ; nodepointer prev[maxlabels + 1], next[maxlabels + 1] ; strnumber info[maxlabels + 1] ; nodepointer maxnode ; scaled maxheight ; scaled maxdepth ; nodepointer firstdot ; boolean twin ; scaled rulethickness ; scaled offsetx, offsety ; scaled xoffset, yoffset ; scaled preminx, premaxx, preminy, premaxy ; nodepointer ruleptr ; nodepointer labeltail ; nodepointer titlehead, titletail ; integer charcode, ext ; integer minx, maxx, miny, maxy ; integer x, y ; integer z ; real xratio, yratio, slantratio ; real unscxratio, unscyratio, unscslantratio ; real fudgefactor ; scaled deltax, deltay ; scaled dvix, dviy ; scaled overcol ; scaled pageheight, pagewidth ; scaled grayrulethickness ; scaled tempx, tempy ; integer overflowline ; scaled delta ; scaled halfxheight ; scaled thricexheight ; scaled dotwidth, dotheight ; char b[4096] ; short rho[4096] ; short a[widestrow + 1] ; integer blankrows ; integer k, m, p, q, r, s, t, dx, dy ; strnumber timestamp ; boolean uselogo ; cinttype verbose ; integer overflowlabeloffset ; real offsetinpoints ; #include "gftodvi.h" void #ifdef HAVE_PROTOTYPES parsearguments ( void ) #else parsearguments ( ) #endif { #define noptions ( 4 ) getoptstruct longoptions[noptions + 1] ; integer getoptreturnval ; cinttype optionindex ; integer currentoption ; verbose = false ; overflowlabeloffset = 10000000L ; currentoption = 0 ; longoptions [currentoption ].name = "help" ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = 0 ; longoptions [currentoption ].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 = "verbose" ; longoptions [currentoption ].hasarg = 0 ; longoptions [currentoption ].flag = addressof ( verbose ) ; longoptions [currentoption ].val = 1 ; currentoption = currentoption + 1 ; longoptions [currentoption ].name = "overflow-label-offset" ; 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 ; do { getoptreturnval = getoptlongonly ( argc , argv , "" , longoptions , addressof ( optionindex ) ) ; if ( getoptreturnval == -1 ) { ; } else if ( getoptreturnval == 63 ) { usage ( 1 , "gftodvi" ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "help" ) == 0 ) ) { usage ( 0 , GFTODVIHELP ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "version" ) == 0 ) ) { printversionandexit ( "This is GFtoDVI, Version 3.0" , nil , "D.E. Knuth" ) ; } else if ( ( strcmp ( longoptions [optionindex ].name , "overflow-label-offset" ) == 0 ) ) { offsetinpoints = atof ( optarg ) ; overflowlabeloffset = round ( offsetinpoints * 65536L ) ; } } while ( ! ( getoptreturnval == -1 ) ) ; if ( ( optind + 1 != argc ) ) { fprintf( stderr , "%s\n", "gftodvi: Need exactly one file argument." ) ; usage ( 1 , "gftodvi" ) ; } } void #ifdef HAVE_PROTOTYPES initialize ( void ) #else initialize ( ) #endif { integer i, j, m, n ; kpsesetprogname ( argv [0 ]) ; kpseinitprog ( "GFTODVI" , 0 , nil , nil ) ; parsearguments () ; if ( verbose ) { Fputs( stdout , "This is GFtoDVI, Version 3.0" ) ; fprintf( stdout , "%s\n", versionstring ) ; } 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 = 1 ;for_end = 31 ; if ( i <= for_end) do xchr [i ]= chr ( i ) ; while ( i++ < for_end ) ;} {register integer for_end; i = 127 ;for_end = 255 ; if ( i <= for_end) do xchr [i ]= chr ( 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 = 1 ;for_end = 255 ; if ( i <= for_end) do xord [xchr [i ]]= i ; while ( i++ < for_end ) ;} xord ['?' ]= 63 ; fmemptr = 0 ; interaction = false ; fontsnotloaded = true ; fontname [1 ]= 29 ; fontname [2 ]= 30 ; fontname [3 ]= 31 ; fontname [4 ]= 0 ; fontname [5 ]= 32 ; {register integer for_end; k = 1 ;for_end = 5 ; if ( k <= for_end) do { fontarea [k ]= 0 ; fontat [k ]= 0 ; } while ( k++ < for_end ) ;} totalpages = 0 ; maxv = 0 ; maxh = 0 ; lastbop = -1 ; halfbuf = dvibufsize / 2 ; dvilimit = dvibufsize ; dviptr = 0 ; dvioffset = 0 ; dummyinfo .B0 = 0 ; dummyinfo .B1 = 0 ; dummyinfo .B2 = 0 ; dummyinfo .B3 = 0 ; c [1 ]= 1 ; d [1 ]= 2 ; twotothe [0 ]= 1 ; m = 1 ; {register integer for_end; k = 1 ;for_end = 13 ; if ( k <= for_end) do twotothe [k ]= 2 * twotothe [k - 1 ]; while ( k++ < for_end ) ;} {register integer for_end; k = 2 ;for_end = 6 ; if ( k <= for_end) do { n = twotothe [k - 1 ]; {register integer for_end; j = 0 ;for_end = n - 1 ; if ( j <= for_end) do { m = m + 1 ; c [m ]= m ; d [m ]= n + n ; } while ( j++ < for_end ) ;} } while ( k++ < for_end ) ;} {register integer for_end; k = 7 ;for_end = 12 ; if ( k <= for_end) do { n = twotothe [k - 1 ]; {register integer for_end; j = k ;for_end = 1 ; if ( j >= for_end) do { m = m + 1 ; d [m ]= n + n ; if ( j == k ) c [m ]= n ; else c [m ]= c [m - 1 ]+ twotothe [j - 1 ]; } while ( j-- > for_end ) ;} } while ( k++ < for_end ) ;} yy [0 ]= -1073741824L ; yy [maxlabels ]= 1073741824L ; } void #ifdef HAVE_PROTOTYPES jumpout ( void ) #else jumpout ( ) #endif { uexit ( 0 ) ; } void #ifdef HAVE_PROTOTYPES inputln ( void ) #else inputln ( ) #endif { fflush ( stdout ) ; if ( eoln ( stdin ) ) readln ( stdin ) ; linelength = 0 ; while ( ( linelength < terminallinelength ) && ! eoln ( stdin ) ) { buffer [linelength ]= xord [getc ( stdin ) ]; linelength = linelength + 1 ; } } void #ifdef HAVE_PROTOTYPES opengffile ( void ) #else opengffile ( ) #endif { gffile = kpseopenfile ( (char*)nameoffile , kpsegfformat ) ; curloc = 0 ; } void #ifdef HAVE_PROTOTYPES opentfmfile ( void ) #else opentfmfile ( ) #endif { tfmfile = kpseopenfile ( (char*)nameoffile , kpsetfmformat ) ; } void #ifdef HAVE_PROTOTYPES opendvifile ( void ) #else opendvifile ( ) #endif { rewritebin ( dvifile , (char*)nameoffile ) ; } void #ifdef HAVE_PROTOTYPES readtfmword ( void ) #else readtfmword ( ) #endif { read ( tfmfile , b0 ) ; read ( tfmfile , b1 ) ; read ( tfmfile , b2 ) ; read ( tfmfile , b3 ) ; } integer #ifdef HAVE_PROTOTYPES getbyte ( void ) #else getbyte ( ) #endif { register integer Result; eightbits b ; if ( eof ( gffile ) ) Result = 0 ; else { read ( gffile , b ) ; curloc = curloc + 1 ; Result = b ; } return Result ; } integer #ifdef HAVE_PROTOTYPES gettwobytes ( void ) #else gettwobytes ( ) #endif { register integer Result; eightbits a, b ; read ( gffile , a ) ; read ( gffile , b ) ; curloc = curloc + 2 ; Result = a * toint ( 256 ) + b ; return Result ; } integer #ifdef HAVE_PROTOTYPES getthreebytes ( void ) #else getthreebytes ( ) #endif { register integer Result; eightbits a, b, c ; read ( gffile , a ) ; read ( gffile , b ) ; read ( gffile , c ) ; curloc = curloc + 3 ; Result = ( a * toint ( 256 ) + b ) * 256 + c ; return Result ; } integer #ifdef HAVE_PROTOTYPES signedquad ( void ) #else signedquad ( ) #endif { register integer Result; eightbits a, b, c, d ; read ( gffile , a ) ; read ( gffile , b ) ; read ( gffile , c ) ; read ( gffile , d ) ; curloc = curloc + 4 ; if ( a < 128 ) Result = ( ( a * toint ( 256 ) + b ) * 256 + c ) * 256 + d ; else Result = ( ( ( a - 256 ) * toint ( 256 ) + b ) * 256 + c ) * 256 + d ; return Result ; } void #ifdef HAVE_PROTOTYPES zreadfontinfo ( integer f , scaled s ) #else zreadfontinfo ( f , s ) integer f ; scaled s ; #endif { /* 30 11 */ fontindex k ; unsigned short lf, lh, bc, ec, nw, nh, nd, ni, nl, nk, ne, np ; integer bchlabel ; short bchar ; fourquarters qw ; scaled sw ; scaled z ; integer alpha ; char beta ; { readtfmword () ; lf = b0 * toint ( 256 ) + b1 ; lh = b2 * toint ( 256 ) + b3 ; readtfmword () ; bc = b0 * toint ( 256 ) + b1 ; ec = b2 * toint ( 256 ) + b3 ; if ( ( bc > ec + 1 ) || ( ec > 255 ) ) goto lab11 ; if ( bc > 255 ) { bc = 1 ; ec = 0 ; } readtfmword () ; nw = b0 * toint ( 256 ) + b1 ; nh = b2 * toint ( 256 ) + b3 ; readtfmword () ; nd = b0 * toint ( 256 ) + b1 ; ni = b2 * toint ( 256 ) + b3 ; readtfmword () ; nl = b0 * toint ( 256 ) + b1 ; nk = b2 * toint ( 256 ) + b3 ; readtfmword () ; ne = b0 * toint ( 256 ) + b1 ; np = b2 * toint ( 256 ) + b3 ; if ( lf != 6 + lh + ( ec - bc + 1 ) + nw + nh + nd + ni + nl + nk + ne + np ) goto lab11 ; } lf = lf - 6 - lh ; if ( np < 8 ) lf = lf + 8 - np ; if ( fmemptr + lf > fontmemsize ) { fprintf( stderr , "%s\n", "No room for TFM file!" ) ; uexit ( 1 ) ; } charbase [f ]= fmemptr - bc ; widthbase [f ]= charbase [f ]+ ec + 1 ; heightbase [f ]= widthbase [f ]+ nw ; depthbase [f ]= heightbase [f ]+ nh ; italicbase [f ]= depthbase [f ]+ nd ; ligkernbase [f ]= italicbase [f ]+ ni ; kernbase [f ]= ligkernbase [f ]+ nl ; extenbase [f ]= kernbase [f ]+ nk ; parambase [f ]= extenbase [f ]+ ne ; { if ( lh < 2 ) goto lab11 ; { readtfmword () ; qw .B0 = b0 + 0 ; qw .B1 = b1 + 0 ; qw .B2 = b2 + 0 ; qw .B3 = b3 + 0 ; fontcheck [f ]= qw ; } readtfmword () ; if ( b0 > 127 ) goto lab11 ; z = ( ( b0 * toint ( 256 ) + b1 ) * toint ( 256 ) + b2 ) * 16 + ( b3 / 16 ) ; if ( z < 65536L ) goto lab11 ; while ( lh > 2 ) { readtfmword () ; lh = lh - 1 ; } fontdsize [f ]= z ; if ( s > 0 ) z = s ; fontsize [f ]= z ; } {register integer for_end; k = fmemptr ;for_end = widthbase [f ]- 1 ; if ( k <= for_end) do { { readtfmword () ; qw .B0 = b0 + 0 ; qw .B1 = b1 + 0 ; qw .B2 = b2 + 0 ; qw .B3 = b3 + 0 ; fontinfo [k ].qqqq = qw ; } if ( ( b0 >= nw ) || ( b1 / 16 >= nh ) || ( b1 % 16 >= nd ) || ( b2 / 4 >= ni ) ) goto lab11 ; switch ( b2 % 4 ) {case 1 : if ( b3 >= nl ) goto lab11 ; break ; case 3 : if ( b3 >= ne ) goto lab11 ; break ; case 0 : case 2 : ; break ; } } while ( k++ < for_end ) ;} { { alpha = 16 * z ; beta = 16 ; while ( z >= 8388608L ) { z = z / 2 ; beta = beta / 2 ; } } {register integer for_end; k = widthbase [f ];for_end = ligkernbase [ f ]- 1 ; if ( k <= for_end) do { readtfmword () ; sw = ( ( ( ( ( b3 * z ) / 256 ) + ( b2 * z ) ) / 256 ) + ( b1 * z ) ) / beta ; if ( b0 == 0 ) fontinfo [k ].sc = sw ; else if ( b0 == 255 ) fontinfo [k ].sc = sw - alpha ; else goto lab11 ; } while ( k++ < for_end ) ;} if ( fontinfo [widthbase [f ]].sc != 0 ) goto lab11 ; if ( fontinfo [heightbase [f ]].sc != 0 ) goto lab11 ; if ( fontinfo [depthbase [f ]].sc != 0 ) goto lab11 ; if ( fontinfo [italicbase [f ]].sc != 0 ) goto lab11 ; } { bchlabel = 32767 ; bchar = 256 ; if ( nl > 0 ) { {register integer for_end; k = ligkernbase [f ];for_end = kernbase [ f ]- 1 ; if ( k <= for_end) do { { readtfmword () ; qw .B0 = b0 + 0 ; qw .B1 = b1 + 0 ; qw .B2 = b2 + 0 ; qw .B3 = b3 + 0 ; fontinfo [k ].qqqq = qw ; } if ( b0 > 128 ) { if ( 256 * b2 + b3 >= nl ) goto lab11 ; if ( b0 == 255 ) if ( k == ligkernbase [f ]) bchar = b1 ; } else { if ( b1 != bchar ) { if ( ( b1 < bc ) || ( b1 > ec ) ) goto lab11 ; } if ( b2 < 128 ) { if ( ( b3 < bc ) || ( b3 > ec ) ) goto lab11 ; } else if ( toint ( 256 ) * ( b2 - 128 ) + b3 >= nk ) goto lab11 ; } } while ( k++ < for_end ) ;} if ( b0 == 255 ) bchlabel = 256 * b2 + b3 ; } {register integer for_end; k = kernbase [f ];for_end = extenbase [f ] - 1 ; if ( k <= for_end) do { readtfmword () ; sw = ( ( ( ( ( b3 * z ) / 256 ) + ( b2 * z ) ) / 256 ) + ( b1 * z ) ) / beta ; if ( b0 == 0 ) fontinfo [k ].sc = sw ; else if ( b0 == 255 ) fontinfo [k ].sc = sw - alpha ; else goto lab11 ; } while ( k++ < for_end ) ;} } {register integer for_end; k = extenbase [f ];for_end = parambase [f ] - 1 ; if ( k <= for_end) do { { readtfmword () ; qw .B0 = b0 + 0 ; qw .B1 = b1 + 0 ; qw .B2 = b2 + 0 ; qw .B3 = b3 + 0 ; fontinfo [k ].qqqq = qw ; } if ( b0 != 0 ) { if ( ( b0 < bc ) || ( b0 > ec ) ) goto lab11 ; } if ( b1 != 0 ) { if ( ( b1 < bc ) || ( b1 > ec ) ) goto lab11 ; } if ( b2 != 0 ) { if ( ( b2 < bc ) || ( b2 > ec ) ) goto lab11 ; } { if ( ( b3 < bc ) || ( b3 > ec ) ) goto lab11 ; } } while ( k++ < for_end ) ;} { {register integer for_end; k = 1 ;for_end = np ; if ( k <= for_end) do if ( k == 1 ) { readtfmword () ; if ( b0 > 127 ) sw = b0 - 256 ; else sw = b0 ; sw = sw * 256 + b1 ; sw = sw * 256 + b2 ; fontinfo [parambase [f ]].sc = ( sw * 16 ) + ( b3 / 16 ) ; } else { readtfmword () ; sw = ( ( ( ( ( b3 * z ) / 256 ) + ( b2 * z ) ) / 256 ) + ( b1 * z ) ) / beta ; if ( b0 == 0 ) fontinfo [parambase [f ]+ k - 1 ].sc = sw ; else if ( b0 == 255 ) fontinfo [parambase [f ]+ k - 1 ].sc = sw - alpha ; else goto lab11 ; } while ( k++ < for_end ) ;} {register integer for_end; k = np + 1 ;for_end = 8 ; if ( k <= for_end) do fontinfo [parambase [f ]+ k - 1 ].sc = 0 ; while ( k++ < for_end ) ;} } fontbc [f ]= bc ; fontec [f ]= ec ; if ( bchlabel < nl ) bcharlabel [f ]= bchlabel + ligkernbase [f ]; else bcharlabel [f ]= fontmemsize ; fontbchar [f ]= bchar + 0 ; widthbase [f ]= widthbase [f ]- 0 ; ligkernbase [f ]= ligkernbase [f ]- 0 ; kernbase [f ]= kernbase [f ]- 0 ; extenbase [f ]= extenbase [f ]- 0 ; parambase [f ]= parambase [f ]- 1 ; fmemptr = fmemptr + lf ; goto lab30 ; lab11: { putc ('\n', stdout ); Fputs( stdout , "Bad TFM file for" ) ; } switch ( f ) {case 1 : { fprintf( stderr , "%s\n", "titles!" ) ; uexit ( 1 ) ; } break ; case 2 : { fprintf( stderr , "%s\n", "labels!" ) ; uexit ( 1 ) ; } break ; case 3 : { fprintf( stderr , "%s\n", "pixels!" ) ; uexit ( 1 ) ; } break ; case 4 : { fprintf( stderr , "%s\n", "slants!" ) ; uexit ( 1 ) ; } break ; case 5 : { fprintf( stderr , "%s\n", "METAFONT logo!" ) ; uexit ( 1 ) ; } break ; } lab30: ; } strnumber #ifdef HAVE_PROTOTYPES makestring ( void ) #else makestring ( ) #endif { register strnumber Result; if ( strptr == maxstrings ) { fprintf( stderr , "%s\n", "Too many labels!" ) ; uexit ( 1 ) ; } strptr = strptr + 1 ; strstart [strptr ]= poolptr ; Result = strptr - 1 ; return Result ; } void #ifdef HAVE_PROTOTYPES zfirststring ( integer c ) #else zfirststring ( c ) integer c ; #endif { if ( strptr != c ) { fprintf( stderr , "%c\n", '?' ) ; uexit ( 1 ) ; } while ( l > 0 ) { { strpool [poolptr ]= buffer [l ]; poolptr = poolptr + 1 ; } l = l - 1 ; } strptr = strptr + 1 ; strstart [strptr ]= poolptr ; } keywordcode #ifdef HAVE_PROTOTYPES interpretxxx ( void ) #else interpretxxx ( ) #endif { /* 30 31 45 */ register keywordcode Result; integer k ; integer j ; char l ; keywordcode m ; char n1 ; poolpointer n2 ; keywordcode c ; c = 19 ; curstring = 0 ; switch ( curgf ) {case 244 : goto lab30 ; break ; case 243 : { k = signedquad () ; goto lab30 ; } break ; case 239 : k = getbyte () ; break ; case 240 : k = gettwobytes () ; break ; case 241 : k = getthreebytes () ; break ; case 242 : k = signedquad () ; break ; } j = 0 ; if ( k < 2 ) goto lab45 ; while ( true ) { l = j ; if ( j == k ) goto lab31 ; if ( j == 13 ) goto lab45 ; j = j + 1 ; buffer [j ]= getbyte () ; if ( buffer [j ]== 32 ) goto lab31 ; } lab31: { register integer for_end; m = 0 ;for_end = 18 ; if ( m <= for_end) do if ( ( strstart [m + 1 ]- strstart [m ]) == l ) { n1 = 0 ; n2 = strstart [m ]; while ( ( n1 < l ) && ( buffer [n1 + 1 ]== strpool [n2 ]) ) { n1 = n1 + 1 ; n2 = n2 + 1 ; } if ( n1 == l ) { c = m ; if ( m == 0 ) { j = j + 1 ; labeltype = getbyte () ; } { if ( poolptr + k - j > poolsize ) { fprintf( stderr , "%s\n", "Too many strings!" ) ; uexit ( 1 ) ; } } while ( j < k ) { j = j + 1 ; { strpool [poolptr ]= getbyte () ; poolptr = poolptr + 1 ; } } curstring = makestring () ; goto lab30 ; } } while ( m++ < for_end ) ;} lab45: while ( j < k ) { j = j + 1 ; curgf = getbyte () ; } lab30: curgf = getbyte () ; Result = c ; return Result ; } scaled #ifdef HAVE_PROTOTYPES getyyy ( void ) #else getyyy ( ) #endif { register scaled Result; scaled v ; if ( curgf != 243 ) Result = 0 ; else { v = signedquad () ; curgf = getbyte () ; Result = v ; } return Result ; } void #ifdef HAVE_PROTOTYPES skipnop ( void ) #else skipnop ( ) #endif { /* 30 */ integer k ; integer j ; switch ( curgf ) {case 244 : goto lab30 ; break ; case 243 : { k = signedquad () ; goto lab30 ; } break ; case 239 : k = getbyte () ; break ; case 240 : k = gettwobytes () ; break ; case 241 : k = getthreebytes () ; break ; case 242 : k = signedquad () ; break ; } {register integer for_end; j = 1 ;for_end = k ; if ( j <= for_end) do curgf = getbyte () ; while ( j++ < for_end ) ;} lab30: curgf = getbyte () ; } void #ifdef HAVE_PROTOTYPES beginname ( void ) #else beginname ( ) #endif { areadelimiter = 0 ; extdelimiter = 0 ; } boolean #ifdef HAVE_PROTOTYPES zmorename ( ASCIIcode c ) #else zmorename ( c ) ASCIIcode c ; #endif { register boolean Result; if ( c == 32 ) Result = false ; else { if ( ( c == 47 ) ) { areadelimiter = poolptr ; extdelimiter = 0 ; } else if ( c == 46 ) extdelimiter = poolptr ; { if ( poolptr + 1 > poolsize ) { fprintf( stderr , "%s\n", "Too many strings!" ) ; uexit ( 1 ) ; } } { strpool [poolptr ]= c ; poolptr = poolptr + 1 ; } Result = true ; } return Result ; } void #ifdef HAVE_PROTOTYPES endname ( void ) #else endname ( ) #endif { if ( strptr + 3 > maxstrings ) { fprintf( stderr , "%s\n", "Too many strings!" ) ; uexit ( 1 ) ; } if ( areadelimiter == 0 ) curarea = 0 ; else { curarea = strptr ; strptr = strptr + 1 ; strstart [strptr ]= areadelimiter + 1 ; } if ( extdelimiter == 0 ) { curext = 0 ; curname = makestring () ; } else { curname = strptr ; strptr = strptr + 1 ; strstart [strptr ]= extdelimiter ; curext = makestring () ; } } void #ifdef HAVE_PROTOTYPES zpackfilename ( strnumber n , strnumber a , strnumber e ) #else zpackfilename ( n , a , e ) strnumber n ; strnumber a ; strnumber e ; #endif { integer k ; ASCIIcode c ; integer j ; integer namelength ; namelength = ( strstart [a + 1 ]- strstart [a ]) + ( strstart [n + 1 ] - strstart [n ]) + ( strstart [e + 1 ]- strstart [e ]) ; nameoffile = xmalloc ( namelength + 1 ) ; k = -1 ; {register integer for_end; j = strstart [a ];for_end = strstart [a + 1 ]- 1 ; if ( j <= for_end) do { c = strpool [j ]; k = k + 1 ; nameoffile [k ]= xchr [c ]; } while ( j++ < for_end ) ;} {register integer for_end; j = strstart [n ];for_end = strstart [n + 1 ]- 1 ; if ( j <= for_end) do { c = strpool [j ]; k = k + 1 ; nameoffile [k ]= xchr [c ]; } while ( j++ < for_end ) ;} {register integer for_end; j = strstart [e ];for_end = strstart [e + 1 ]- 1 ; if ( j <= for_end) do { c = strpool [j ]; k = k + 1 ; nameoffile [k ]= xchr [c ]; } while ( j++ < for_end ) ;} nameoffile [namelength ]= 0 ; } void #ifdef HAVE_PROTOTYPES startgf ( void ) #else startgf ( ) #endif { /* 30 */ char * argbuffer ; integer argbufptr ; argbuffer = cmdline ( optind ) ; argbufptr = 0 ; while ( ( linelength < terminallinelength ) && ( argbuffer [argbufptr ]!= 0 ) ) { buffer [linelength ]= xord [argbuffer [argbufptr ]]; linelength = linelength + 1 ; argbufptr = argbufptr + 1 ; } bufptr = 0 ; buffer [linelength ]= 63 ; while ( buffer [bufptr ]== 32 ) bufptr = bufptr + 1 ; if ( bufptr < linelength ) { if ( buffer [linelength - 1 ]== 47 ) { interaction = true ; linelength = linelength - 1 ; } beginname () ; while ( true ) { if ( bufptr == linelength ) goto lab30 ; if ( ! morename ( buffer [bufptr ]) ) goto lab30 ; bufptr = bufptr + 1 ; } lab30: endname () ; if ( curext == 0 ) curext = 19 ; packfilename ( curname , curarea , curext ) ; opengffile () ; } jobname = curname ; packfilename ( jobname , 0 , 20 ) ; opendvifile () ; } void #ifdef HAVE_PROTOTYPES zwritedvi ( dviindex a , dviindex b ) #else zwritedvi ( a , b ) dviindex a ; dviindex b ; #endif { writechunk ( dvifile , dvibuf , a , b ) ; } void #ifdef HAVE_PROTOTYPES dviswap ( void ) #else dviswap ( ) #endif { if ( dvilimit == dvibufsize ) { writedvi ( 0 , halfbuf - 1 ) ; dvilimit = halfbuf ; dvioffset = dvioffset + dvibufsize ; dviptr = 0 ; } else { writedvi ( halfbuf , dvibufsize - 1 ) ; dvilimit = dvibufsize ; } } void #ifdef HAVE_PROTOTYPES zdvifour ( integer x ) #else zdvifour ( x ) integer x ; #endif { if ( x >= 0 ) { dvibuf [dviptr ]= x / 16777216L ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } else { x = x + 1073741824L ; x = x + 1073741824L ; { dvibuf [dviptr ]= ( x / 16777216L ) + 128 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } x = x % 16777216L ; { dvibuf [dviptr ]= x / 65536L ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } x = x % 65536L ; { dvibuf [dviptr ]= x / 256 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= x % 256 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } void #ifdef HAVE_PROTOTYPES zdvifontdef ( internalfontnumber f ) #else zdvifontdef ( f ) internalfontnumber f ; #endif { integer k ; { dvibuf [dviptr ]= 243 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= f ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= fontcheck [f ].B0 - 0 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= fontcheck [f ].B1 - 0 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= fontcheck [f ].B2 - 0 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= fontcheck [f ].B3 - 0 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( fontsize [f ]) ; dvifour ( fontdsize [f ]) ; { dvibuf [dviptr ]= ( strstart [fontarea [f ]+ 1 ]- strstart [ fontarea [f ]]) ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= ( strstart [fontname [f ]+ 1 ]- strstart [ fontname [f ]]) ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } {register integer for_end; k = strstart [fontarea [f ]];for_end = strstart [fontarea [f ]+ 1 ]- 1 ; if ( k <= for_end) do { dvibuf [dviptr ]= strpool [k ]; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } while ( k++ < for_end ) ;} {register integer for_end; k = strstart [fontname [f ]];for_end = strstart [fontname [f ]+ 1 ]- 1 ; if ( k <= for_end) do { dvibuf [dviptr ]= strpool [k ]; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } while ( k++ < for_end ) ;} } void #ifdef HAVE_PROTOTYPES loadfonts ( void ) #else loadfonts ( ) #endif { /* 30 22 40 45 */ internalfontnumber f ; fourquarters i ; integer j, k, v ; char m ; char n1 ; poolpointer n2 ; if ( interaction ) while ( true ) { lab45: { putc ('\n', stdout ); Fputs( stdout , "Special font substitution: " ) ; } lab22: inputln () ; if ( linelength == 0 ) goto lab30 ; bufptr = 0 ; buffer [linelength ]= 32 ; while ( buffer [bufptr ]!= 32 ) bufptr = bufptr + 1 ; {register integer for_end; m = 1 ;for_end = 8 ; if ( m <= for_end) do if ( ( strstart [m + 1 ]- strstart [m ]) == bufptr ) { n1 = 0 ; n2 = strstart [m ]; while ( ( n1 < bufptr ) && ( buffer [n1 ]== strpool [n2 ]) ) { n1 = n1 + 1 ; n2 = n2 + 1 ; } if ( n1 == bufptr ) goto lab40 ; } while ( m++ < for_end ) ;} Fputs( stdout , "Please say, e.g., \"grayfont foo\" or \"slantfontarea baz\"." ) ; goto lab45 ; lab40: bufptr = bufptr + 1 ; { if ( poolptr + linelength - bufptr > poolsize ) { fprintf( stderr , "%s\n", "Too many strings!" ) ; uexit ( 1 ) ; } } while ( bufptr < linelength ) { { strpool [poolptr ]= buffer [bufptr ]; poolptr = poolptr + 1 ; } bufptr = bufptr + 1 ; } if ( m > 4 ) fontarea [m - 4 ]= makestring () ; else { fontname [m ]= makestring () ; fontarea [m ]= 0 ; fontat [m ]= 0 ; } initstrptr = strptr ; Fputs( stdout , "OK; any more? " ) ; goto lab22 ; } lab30: ; fontsnotloaded = false ; {register integer for_end; f = 1 ;for_end = 5 ; if ( f <= for_end) do if ( ( f != 4 ) || ( ( strstart [fontname [f ]+ 1 ]- strstart [ fontname [f ]]) > 0 ) ) { if ( ( strstart [fontarea [f ]+ 1 ]- strstart [fontarea [f ]]) == 0 ) fontarea [f ]= 34 ; packfilename ( fontname [f ], fontarea [f ], 21 ) ; opentfmfile () ; readfontinfo ( f , fontat [f ]) ; if ( fontarea [f ]== 34 ) fontarea [f ]= 0 ; dvifontdef ( f ) ; } while ( f++ < for_end ) ;} if ( ( strstart [fontname [4 ]+ 1 ]- strstart [fontname [4 ]]) == 0 ) ruleslant = 0.0 ; else { ruleslant = fontinfo [1 + parambase [4 ]].sc / ((double) 65536L ) ; slantn = fontec [4 ]; i = fontinfo [charbase [4 ]+ slantn ].qqqq ; slantunit = fontinfo [heightbase [4 ]+ ( i .B1 - 0 ) / 16 ].sc / ((double) slantn ) ; } slantreported = 0.0 ; i = fontinfo [charbase [3 ]+ 1 ].qqqq ; if ( ! ( i .B0 > 0 ) ) { fprintf( stderr , "%s\n", "Missing pixel char!" ) ; uexit ( 1 ) ; } unscxratio = fontinfo [widthbase [3 ]+ i .B0 ].sc ; xratio = unscxratio / ((double) 65536L ) ; unscyratio = fontinfo [heightbase [3 ]+ ( i .B1 - 0 ) / 16 ].sc ; yratio = unscyratio / ((double) 65536L ) ; unscslantratio = fontinfo [1 + parambase [3 ]].sc * yratio ; slantratio = unscslantratio / ((double) 65536L ) ; if ( xratio * yratio == 0 ) { fprintf( stderr , "%s\n", "Vanishing pixel size!" ) ; uexit ( 1 ) ; } fudgefactor = ( slantratio / ((double) xratio ) ) / ((double) yratio ) ; grayrulethickness = fontinfo [8 + parambase [3 ]].sc ; if ( grayrulethickness == 0 ) grayrulethickness = 26214 ; i = fontinfo [charbase [3 ]+ 0 ].qqqq ; if ( ! ( i .B0 > 0 ) ) { fprintf( stderr , "%s\n", "Missing dot char!" ) ; uexit ( 1 ) ; } dotwidth = fontinfo [widthbase [3 ]+ i .B0 ].sc ; dotheight = fontinfo [heightbase [3 ]+ ( i .B1 - 0 ) / 16 ].sc ; delta = fontinfo [2 + parambase [2 ]].sc / 2 ; thricexheight = 3 * fontinfo [5 + parambase [2 ]].sc ; halfxheight = thricexheight / 6 ; {register integer for_end; k = 0 ;for_end = 4095 ; if ( k <= for_end) do b [k ]= 0 ; while ( k++ < for_end ) ;} {register integer for_end; k = fontbc [3 ];for_end = fontec [3 ]; if ( k <= for_end) do if ( k >= 1 ) if ( k <= 120 ) if ( ( fontinfo [charbase [3 ]+ k ].qqqq .B0 > 0 ) ) { v = c [k ]; do { b [v ]= k ; v = v + d [k ]; } while ( ! ( v > 4095 ) ) ; } while ( k++ < for_end ) ;} {register integer for_end; j = 0 ;for_end = 11 ; if ( j <= for_end) do { k = twotothe [j ]; v = k ; do { rho [v ]= k ; v = v + k + k ; } while ( ! ( v > 4095 ) ) ; } while ( j++ < for_end ) ;} rho [0 ]= 4096 ; } void #ifdef HAVE_PROTOTYPES ztypeset ( eightbits c ) #else ztypeset ( c ) eightbits c ; #endif { if ( c >= 128 ) { dvibuf [dviptr ]= 128 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= c ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } void #ifdef HAVE_PROTOTYPES zdviscaled ( real x ) #else zdviscaled ( x ) real x ; #endif { integer n ; integer m ; integer k ; n = round ( x / ((double) 6553.6 ) ) ; if ( n < 0 ) { { dvibuf [dviptr ]= 45 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } n = - (integer) n ; } m = n / 10 ; k = 0 ; do { k = k + 1 ; buffer [k ]= ( m % 10 ) + 48 ; m = m / 10 ; } while ( ! ( m == 0 ) ) ; do { { dvibuf [dviptr ]= buffer [k ]; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } k = k - 1 ; } while ( ! ( k == 0 ) ) ; if ( n % 10 != 0 ) { { dvibuf [dviptr ]= 46 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= ( n % 10 ) + 48 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } } void #ifdef HAVE_PROTOTYPES zhbox ( strnumber s , internalfontnumber f , boolean sendit ) #else zhbox ( s , f , sendit ) strnumber s ; internalfontnumber f ; boolean sendit ; #endif { /* 22 30 */ poolpointer k, endk, maxk ; fourquarters i, j ; short curl ; short curr ; short bchar ; integer stackptr ; fontindex l ; scaled kernamount ; eightbits hd ; scaled x ; ASCIIcode savec ; boxwidth = 0 ; boxheight = 0 ; boxdepth = 0 ; k = strstart [s ]; maxk = strstart [s + 1 ]; savec = strpool [maxk ]; strpool [maxk ]= 32 ; while ( k < maxk ) { if ( strpool [k ]== 32 ) { boxwidth = boxwidth + fontinfo [2 + parambase [f ]].sc ; if ( sendit ) { { dvibuf [dviptr ]= 146 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( fontinfo [2 + parambase [f ]].sc ) ; } k = k + 1 ; } else { endk = k ; do { endk = endk + 1 ; } while ( ! ( strpool [endk ]== 32 ) ) ; kernamount = 0 ; curl = 256 ; stackptr = 0 ; bchar = fontbchar [f ]; if ( k < endk ) curr = strpool [k ]+ 0 ; else curr = bchar ; suppresslig = false ; lab22: if ( ( curl < fontbc [f ]) || ( curl > fontec [f ]) ) { i = dummyinfo ; if ( curl == 256 ) l = bcharlabel [f ]; else l = fontmemsize ; } else { i = fontinfo [charbase [f ]+ curl ].qqqq ; if ( ( ( i .B2 - 0 ) % 4 ) != 1 ) l = fontmemsize ; else { l = ligkernbase [f ]+ i .B3 ; j = fontinfo [l ].qqqq ; if ( j .B0 - 0 > 128 ) l = ligkernbase [f ]+ 256 * ( j .B2 - 0 ) + j .B3 ; } } if ( suppresslig ) suppresslig = false ; else while ( l < kernbase [f ]+ 0 ) { j = fontinfo [l ].qqqq ; if ( j .B1 == curr ) if ( j .B0 - 0 <= 128 ) if ( j .B2 - 0 >= 128 ) { kernamount = fontinfo [kernbase [f ]+ 256 * ( j .B2 - 128 ) + j .B3 ].sc ; goto lab30 ; } else { switch ( j .B2 - 0 ) {case 1 : case 5 : curl = j .B3 - 0 ; break ; case 2 : case 6 : { curr = j .B3 ; if ( stackptr == 0 ) { stackptr = 1 ; if ( k < endk ) k = k + 1 ; else bchar = 256 ; } ligstack [stackptr ]= curr ; } break ; case 3 : case 7 : case 11 : { curr = j .B3 ; stackptr = stackptr + 1 ; ligstack [stackptr ]= curr ; if ( j .B2 - 0 == 11 ) suppresslig = true ; } break ; default: { curl = j .B3 - 0 ; if ( stackptr > 0 ) { stackptr = stackptr - 1 ; if ( stackptr > 0 ) curr = ligstack [stackptr ]; else if ( k < endk ) curr = strpool [k ]+ 0 ; else curr = bchar ; } else if ( k == endk ) goto lab30 ; else { k = k + 1 ; if ( k < endk ) curr = strpool [k ]+ 0 ; else curr = bchar ; } } break ; } if ( j .B2 - 0 > 3 ) goto lab30 ; goto lab22 ; } if ( j .B0 - 0 >= 128 ) goto lab30 ; l = l + j .B0 + 1 ; } lab30: ; if ( ( i .B0 > 0 ) ) { boxwidth = boxwidth + fontinfo [widthbase [f ]+ i .B0 ].sc + kernamount ; hd = i .B1 - 0 ; x = fontinfo [heightbase [f ]+ ( hd ) / 16 ].sc ; if ( x > boxheight ) boxheight = x ; x = fontinfo [depthbase [f ]+ hd % 16 ].sc ; if ( x > boxdepth ) boxdepth = x ; if ( sendit ) { typeset ( curl ) ; if ( kernamount != 0 ) { { dvibuf [dviptr ]= 146 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( kernamount ) ; } } kernamount = 0 ; } curl = curr - 0 ; if ( stackptr > 0 ) { { stackptr = stackptr - 1 ; if ( stackptr > 0 ) curr = ligstack [stackptr ]; else if ( k < endk ) curr = strpool [k ]+ 0 ; else curr = bchar ; } goto lab22 ; } if ( k < endk ) { k = k + 1 ; if ( k < endk ) curr = strpool [k ]+ 0 ; else curr = bchar ; goto lab22 ; } } } strpool [maxk ]= savec ; } void #ifdef HAVE_PROTOTYPES zslantcomplaint ( real r ) #else zslantcomplaint ( r ) real r ; #endif { if ( fabs ( r - slantreported ) > 0.001 ) { { putc ('\n', stdout ); Fputs( stdout , "Sorry, I can't make diagonal rules of slant " ) ; } printreal ( r , 10 , 5 ) ; putc ( '!' , stdout ); slantreported = r ; } } nodepointer #ifdef HAVE_PROTOTYPES getavail ( void ) #else getavail ( ) #endif { register nodepointer Result; maxnode = maxnode + 1 ; if ( maxnode == maxlabels ) { fprintf( stderr , "%s\n", "Too many labels and/or rules!" ) ; uexit ( 1 ) ; } Result = maxnode ; return Result ; } void #ifdef HAVE_PROTOTYPES znodeins ( nodepointer p , nodepointer q ) #else znodeins ( p , q ) nodepointer p ; nodepointer q ; #endif { nodepointer r ; if ( yy [p ]>= yy [q ]) { do { r = q ; q = next [q ]; } while ( ! ( yy [p ]<= yy [q ]) ) ; next [r ]= p ; prev [p ]= r ; next [p ]= q ; prev [q ]= p ; } else { do { r = q ; q = prev [q ]; } while ( ! ( yy [p ]>= yy [q ]) ) ; prev [r ]= p ; next [p ]= r ; prev [p ]= q ; next [q ]= p ; } if ( yy [p ]- yt [p ]> maxheight ) maxheight = yy [p ]- yt [p ]; if ( yb [p ]- yy [p ]> maxdepth ) maxdepth = yb [p ]- yy [p ]; } boolean #ifdef HAVE_PROTOTYPES zoverlap ( nodepointer p , nodepointer q ) #else zoverlap ( p , q ) nodepointer p ; nodepointer q ; #endif { /* 10 */ register boolean Result; scaled ythresh ; scaled xleft, xright, ytop, ybot ; nodepointer r ; xleft = xl [p ]; xright = xr [p ]; ytop = yt [p ]; ybot = yb [p ]; ythresh = ybot + maxheight ; r = next [q ]; while ( yy [r ]< ythresh ) { if ( ybot > yt [r ]) if ( xleft < xr [r ]) if ( xright > xl [r ]) if ( ytop < yb [r ]) { Result = true ; goto lab10 ; } r = next [r ]; } ythresh = ytop - maxdepth ; r = q ; while ( yy [r ]> ythresh ) { if ( ybot > yt [r ]) if ( xleft < xr [r ]) if ( xright > xl [r ]) if ( ytop < yb [r ]) { Result = true ; goto lab10 ; } r = prev [r ]; } Result = false ; lab10: ; return Result ; } nodepointer #ifdef HAVE_PROTOTYPES znearestdot ( nodepointer p , scaled d0 ) #else znearestdot ( p , d0 ) nodepointer p ; scaled d0 ; #endif { register nodepointer Result; nodepointer bestq ; scaled dmin, d ; twin = false ; bestq = 0 ; dmin = 268435456L ; q = next [p ]; while ( yy [q ]< yy [p ]+ dmin ) { d = abs ( xx [q ]- xx [p ]) ; if ( d < yy [q ]- yy [p ]) d = yy [q ]- yy [p ]; if ( d < d0 ) twin = true ; else if ( d < dmin ) { dmin = d ; bestq = q ; } q = next [q ]; } q = prev [p ]; while ( yy [q ]> yy [p ]- dmin ) { d = abs ( xx [q ]- xx [p ]) ; if ( d < yy [p ]- yy [q ]) d = yy [p ]- yy [q ]; if ( d < d0 ) twin = true ; else if ( d < dmin ) { dmin = d ; bestq = q ; } q = prev [q ]; } Result = bestq ; return Result ; } void #ifdef HAVE_PROTOTYPES zconvert ( scaled x , scaled y ) #else zconvert ( x , y ) scaled x ; scaled y ; #endif { x = x + xoffset ; y = y + yoffset ; dviy = - (integer) round ( yratio * y ) + deltay ; dvix = round ( xratio * x + slantratio * y ) + deltax ; } void #ifdef HAVE_PROTOTYPES zdvigoto ( scaled x , scaled y ) #else zdvigoto ( x , y ) scaled x ; scaled y ; #endif { { dvibuf [dviptr ]= 141 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } if ( x != 0 ) { { dvibuf [dviptr ]= 146 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( x ) ; } if ( y != 0 ) { { dvibuf [dviptr ]= 160 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( y ) ; } } void #ifdef HAVE_PROTOTYPES ztopcoords ( nodepointer p ) #else ztopcoords ( p ) nodepointer p ; #endif { xx [p ]= dvix - ( boxwidth / 2 ) ; xl [p ]= xx [p ]- delta ; xr [p ]= xx [p ]+ boxwidth + delta ; yb [p ]= dviy - dotheight ; yy [p ]= yb [p ]- boxdepth ; yt [p ]= yy [p ]- boxheight - delta ; } void #ifdef HAVE_PROTOTYPES zbotcoords ( nodepointer p ) #else zbotcoords ( p ) nodepointer p ; #endif { xx [p ]= dvix - ( boxwidth / 2 ) ; xl [p ]= xx [p ]- delta ; xr [p ]= xx [p ]+ boxwidth + delta ; yt [p ]= dviy + dotheight ; yy [p ]= yt [p ]+ boxheight ; yb [p ]= yy [p ]+ boxdepth + delta ; } void #ifdef HAVE_PROTOTYPES zrightcoords ( nodepointer p ) #else zrightcoords ( p ) nodepointer p ; #endif { xl [p ]= dvix + dotwidth ; xx [p ]= xl [p ]; xr [p ]= xx [p ]+ boxwidth + delta ; yy [p ]= dviy + halfxheight ; yb [p ]= yy [p ]+ boxdepth + delta ; yt [p ]= yy [p ]- boxheight - delta ; } void #ifdef HAVE_PROTOTYPES zleftcoords ( nodepointer p ) #else zleftcoords ( p ) nodepointer p ; #endif { xr [p ]= dvix - dotwidth ; xx [p ]= xr [p ]- boxwidth ; xl [p ]= xx [p ]- delta ; yy [p ]= dviy + halfxheight ; yb [p ]= yy [p ]+ boxdepth + delta ; yt [p ]= yy [p ]- boxheight - delta ; } boolean #ifdef HAVE_PROTOTYPES zplacelabel ( nodepointer p ) #else zplacelabel ( p ) nodepointer p ; #endif { /* 10 40 */ register boolean Result; char oct ; nodepointer dfl ; hbox ( info [p ], 2 , false ) ; dvix = xx [p ]; dviy = yy [p ]; dfl = xl [p ]; oct = xr [p ]; switch ( oct ) {case 0 : case 4 : case 9 : case 13 : leftcoords ( p ) ; break ; case 1 : case 2 : case 8 : case 11 : botcoords ( p ) ; break ; case 3 : case 7 : case 10 : case 14 : rightcoords ( p ) ; break ; case 6 : case 5 : case 15 : case 12 : topcoords ( p ) ; break ; } if ( ! overlap ( p , dfl ) ) goto lab40 ; switch ( oct ) {case 0 : case 3 : case 15 : case 12 : botcoords ( p ) ; break ; case 1 : case 5 : case 10 : case 14 : leftcoords ( p ) ; break ; case 2 : case 6 : case 9 : case 13 : rightcoords ( p ) ; break ; case 7 : case 4 : case 8 : case 11 : topcoords ( p ) ; break ; } if ( ! overlap ( p , dfl ) ) goto lab40 ; switch ( oct ) {case 0 : case 3 : case 14 : case 13 : topcoords ( p ) ; break ; case 1 : case 5 : case 11 : case 15 : rightcoords ( p ) ; break ; case 2 : case 6 : case 8 : case 12 : leftcoords ( p ) ; break ; case 7 : case 4 : case 9 : case 10 : botcoords ( p ) ; break ; } if ( ! overlap ( p , dfl ) ) goto lab40 ; switch ( oct ) {case 0 : case 4 : case 8 : case 12 : rightcoords ( p ) ; break ; case 1 : case 2 : case 9 : case 10 : topcoords ( p ) ; break ; case 3 : case 7 : case 11 : case 15 : leftcoords ( p ) ; break ; case 6 : case 5 : case 14 : case 13 : botcoords ( p ) ; break ; } if ( ! overlap ( p , dfl ) ) goto lab40 ; xx [p ]= dvix ; yy [p ]= dviy ; xl [p ]= dfl ; Result = false ; goto lab10 ; lab40: nodeins ( p , dfl ) ; dvigoto ( xx [p ], yy [p ]) ; hbox ( info [p ], 2 , true ) ; { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } Result = true ; lab10: ; return Result ; } void #ifdef HAVE_PROTOTYPES dopixels ( void ) #else dopixels ( ) #endif { /* 30 31 21 22 10 */ boolean paintblack ; integer startingcol, finishingcol ; integer j ; integer l ; fourquarters i ; eightbits v ; { dvibuf [dviptr ]= 174 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } deltax = deltax + round ( unscxratio * minx ) ; {register integer for_end; j = 0 ;for_end = maxx - minx ; if ( j <= for_end) do a [j ]= 0 ; while ( j++ < for_end ) ;} l = 1 ; z = 0 ; startingcol = 0 ; finishingcol = 0 ; y = maxy + 12 ; paintblack = false ; blankrows = 0 ; curgf = getbyte () ; while ( true ) { do { if ( blankrows > 0 ) blankrows = blankrows - 1 ; else if ( curgf != 69 ) { x = z ; if ( startingcol > x ) startingcol = x ; while ( true ) { lab22: if ( ( curgf >= 74 ) && ( curgf <= 238 ) ) { z = curgf - 74 ; paintblack = true ; curgf = getbyte () ; goto lab31 ; } else switch ( curgf ) {case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : case 8 : case 9 : case 10 : case 11 : case 12 : case 13 : case 14 : case 15 : case 16 : case 17 : case 18 : case 19 : case 20 : case 21 : case 22 : case 23 : case 24 : case 25 : case 26 : case 27 : case 28 : case 29 : case 30 : case 31 : case 32 : case 33 : case 34 : case 35 : case 36 : case 37 : case 38 : case 39 : case 40 : case 41 : case 42 : case 43 : case 44 : case 45 : case 46 : case 47 : case 48 : case 49 : case 50 : case 51 : case 52 : case 53 : case 54 : case 55 : case 56 : case 57 : case 58 : case 59 : case 60 : case 61 : case 62 : case 63 : k = curgf ; break ; case 64 : k = getbyte () ; break ; case 65 : k = gettwobytes () ; break ; case 66 : k = getthreebytes () ; break ; case 69 : goto lab31 ; break ; case 70 : { blankrows = 0 ; z = 0 ; paintblack = false ; curgf = getbyte () ; goto lab31 ; } break ; case 71 : { blankrows = getbyte () ; z = 0 ; paintblack = false ; curgf = getbyte () ; goto lab31 ; } break ; case 72 : { blankrows = gettwobytes () ; z = 0 ; paintblack = false ; curgf = getbyte () ; goto lab31 ; } break ; case 73 : { blankrows = getthreebytes () ; z = 0 ; paintblack = false ; curgf = getbyte () ; goto lab31 ; } break ; case 239 : case 240 : case 241 : case 242 : case 243 : case 244 : { skipnop () ; goto lab22 ; } break ; default: { fprintf( stderr , "%s%s%s%ld%c\n", "Bad GF file: " , "Improper opcode" , "! (at byte " , (long)curloc - 1 , ')' ) ; uexit ( 1 ) ; } break ; } if ( x + k > finishingcol ) finishingcol = x + k ; if ( paintblack ) {register integer for_end; j = x ;for_end = x + k - 1 ; if ( j <= for_end) do a [j ]= a [j ]+ l ; while ( j++ < for_end ) ;} paintblack = ! paintblack ; x = x + k ; curgf = getbyte () ; } lab31: ; } l = l + l ; y = y - 1 ; } while ( ! ( l == 4096 ) ) ; dvigoto ( 0 , deltay - round ( unscyratio * y ) ) ; j = startingcol ; while ( true ) { while ( ( j <= finishingcol ) && ( b [a [j ]]== 0 ) ) j = j + 1 ; if ( j > finishingcol ) goto lab30 ; { dvibuf [dviptr ]= 141 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= 146 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( round ( unscxratio * j + unscslantratio * y ) + deltax ) ; do { v = b [a [j ]]; a [j ]= a [j ]- c [v ]; k = j ; j = j + 1 ; while ( b [a [j ]]== v ) { a [j ]= a [j ]- c [v ]; j = j + 1 ; } k = j - k ; lab21: if ( k == 1 ) typeset ( v ) ; else { i = fontinfo [charbase [3 ]+ v ].qqqq ; if ( ( ( i .B2 - 0 ) % 4 ) == 2 ) { if ( odd ( k ) ) typeset ( v ) ; k = k / 2 ; v = i .B3 - 0 ; goto lab21 ; } else do { typeset ( v ) ; k = k - 1 ; } while ( ! ( k == 0 ) ) ; } } while ( ! ( b [a [j ]]== 0 ) ) ; { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } lab30: ; { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } l = rho [a [startingcol ]]; {register integer for_end; j = startingcol + 1 ;for_end = finishingcol ; if ( j <= for_end) do if ( l > rho [a [j ]]) l = rho [a [j ]]; while ( j++ < for_end ) ;} if ( l == 4096 ) if ( curgf == 69 ) goto lab10 ; else { y = y - blankrows ; blankrows = 0 ; l = 1 ; startingcol = z ; finishingcol = z ; } else { while ( a [startingcol ]== 0 ) startingcol = startingcol + 1 ; while ( a [finishingcol ]== 0 ) finishingcol = finishingcol - 1 ; {register integer for_end; j = startingcol ;for_end = finishingcol ; if ( j <= for_end) do a [j ]= a [j ]/ l ; while ( j++ < for_end ) ;} l = 4096 / l ; } } lab10: ; } void mainbody() { initialize () ; strptr = 0 ; poolptr = 0 ; strstart [0 ]= 0 ; l = 0 ; firststring ( 0 ) ; l = 9 ; buffer [9 ]= 116 ; buffer [8 ]= 105 ; buffer [7 ]= 116 ; buffer [6 ]= 108 ; buffer [5 ]= 101 ; buffer [4 ]= 102 ; buffer [3 ]= 111 ; buffer [2 ]= 110 ; buffer [1 ]= 116 ; firststring ( 1 ) ; l = 9 ; buffer [9 ]= 108 ; buffer [8 ]= 97 ; buffer [7 ]= 98 ; buffer [6 ]= 101 ; buffer [5 ]= 108 ; buffer [4 ]= 102 ; buffer [3 ]= 111 ; buffer [2 ]= 110 ; buffer [1 ]= 116 ; firststring ( 2 ) ; l = 8 ; buffer [8 ]= 103 ; buffer [7 ]= 114 ; buffer [6 ]= 97 ; buffer [5 ]= 121 ; buffer [4 ]= 102 ; buffer [3 ]= 111 ; buffer [2 ]= 110 ; buffer [1 ]= 116 ; firststring ( 3 ) ; l = 9 ; buffer [9 ]= 115 ; buffer [8 ]= 108 ; buffer [7 ]= 97 ; buffer [6 ]= 110 ; buffer [5 ]= 116 ; buffer [4 ]= 102 ; buffer [3 ]= 111 ; buffer [2 ]= 110 ; buffer [1 ]= 116 ; firststring ( 4 ) ; l = 13 ; buffer [13 ]= 116 ; buffer [12 ]= 105 ; buffer [11 ]= 116 ; buffer [10 ]= 108 ; buffer [9 ]= 101 ; buffer [8 ]= 102 ; buffer [7 ]= 111 ; buffer [6 ]= 110 ; buffer [5 ]= 116 ; buffer [4 ]= 97 ; buffer [3 ]= 114 ; buffer [2 ]= 101 ; buffer [1 ]= 97 ; firststring ( 5 ) ; l = 13 ; buffer [13 ]= 108 ; buffer [12 ]= 97 ; buffer [11 ]= 98 ; buffer [10 ]= 101 ; buffer [9 ]= 108 ; buffer [8 ]= 102 ; buffer [7 ]= 111 ; buffer [6 ]= 110 ; buffer [5 ]= 116 ; buffer [4 ]= 97 ; buffer [3 ]= 114 ; buffer [2 ]= 101 ; buffer [1 ]= 97 ; firststring ( 6 ) ; l = 12 ; buffer [12 ]= 103 ; buffer [11 ]= 114 ; buffer [10 ]= 97 ; buffer [9 ]= 121 ; buffer [8 ]= 102 ; buffer [7 ]= 111 ; buffer [6 ]= 110 ; buffer [5 ]= 116 ; buffer [4 ]= 97 ; buffer [3 ]= 114 ; buffer [2 ]= 101 ; buffer [1 ]= 97 ; firststring ( 7 ) ; l = 13 ; buffer [13 ]= 115 ; buffer [12 ]= 108 ; buffer [11 ]= 97 ; buffer [10 ]= 110 ; buffer [9 ]= 116 ; buffer [8 ]= 102 ; buffer [7 ]= 111 ; buffer [6 ]= 110 ; buffer [5 ]= 116 ; buffer [4 ]= 97 ; buffer [3 ]= 114 ; buffer [2 ]= 101 ; buffer [1 ]= 97 ; firststring ( 8 ) ; l = 11 ; buffer [11 ]= 116 ; buffer [10 ]= 105 ; buffer [9 ]= 116 ; buffer [8 ]= 108 ; buffer [7 ]= 101 ; buffer [6 ]= 102 ; buffer [5 ]= 111 ; buffer [4 ]= 110 ; buffer [3 ]= 116 ; buffer [2 ]= 97 ; buffer [1 ]= 116 ; firststring ( 9 ) ; l = 11 ; buffer [11 ]= 108 ; buffer [10 ]= 97 ; buffer [9 ]= 98 ; buffer [8 ]= 101 ; buffer [7 ]= 108 ; buffer [6 ]= 102 ; buffer [5 ]= 111 ; buffer [4 ]= 110 ; buffer [3 ]= 116 ; buffer [2 ]= 97 ; buffer [1 ]= 116 ; firststring ( 10 ) ; l = 10 ; buffer [10 ]= 103 ; buffer [9 ]= 114 ; buffer [8 ]= 97 ; buffer [7 ]= 121 ; buffer [6 ]= 102 ; buffer [5 ]= 111 ; buffer [4 ]= 110 ; buffer [3 ]= 116 ; buffer [2 ]= 97 ; buffer [1 ]= 116 ; firststring ( 11 ) ; l = 11 ; buffer [11 ]= 115 ; buffer [10 ]= 108 ; buffer [9 ]= 97 ; buffer [8 ]= 110 ; buffer [7 ]= 116 ; buffer [6 ]= 102 ; buffer [5 ]= 111 ; buffer [4 ]= 110 ; buffer [3 ]= 116 ; buffer [2 ]= 97 ; buffer [1 ]= 116 ; firststring ( 12 ) ; l = 4 ; buffer [4 ]= 114 ; buffer [3 ]= 117 ; buffer [2 ]= 108 ; buffer [1 ]= 101 ; firststring ( 13 ) ; l = 5 ; buffer [5 ]= 116 ; buffer [4 ]= 105 ; buffer [3 ]= 116 ; buffer [2 ]= 108 ; buffer [1 ]= 101 ; firststring ( 14 ) ; l = 13 ; buffer [13 ]= 114 ; buffer [12 ]= 117 ; buffer [11 ]= 108 ; buffer [10 ]= 101 ; buffer [9 ]= 116 ; buffer [8 ]= 104 ; buffer [7 ]= 105 ; buffer [6 ]= 99 ; buffer [5 ]= 107 ; buffer [4 ]= 110 ; buffer [3 ]= 101 ; buffer [2 ]= 115 ; buffer [1 ]= 115 ; firststring ( 15 ) ; l = 6 ; buffer [6 ]= 111 ; buffer [5 ]= 102 ; buffer [4 ]= 102 ; buffer [3 ]= 115 ; buffer [2 ]= 101 ; buffer [1 ]= 116 ; firststring ( 16 ) ; l = 7 ; buffer [7 ]= 120 ; buffer [6 ]= 111 ; buffer [5 ]= 102 ; buffer [4 ]= 102 ; buffer [3 ]= 115 ; buffer [2 ]= 101 ; buffer [1 ]= 116 ; firststring ( 17 ) ; l = 7 ; buffer [7 ]= 121 ; buffer [6 ]= 111 ; buffer [5 ]= 102 ; buffer [4 ]= 102 ; buffer [3 ]= 115 ; buffer [2 ]= 101 ; buffer [1 ]= 116 ; firststring ( 18 ) ; l = 7 ; buffer [7 ]= 46 ; buffer [6 ]= 50 ; buffer [5 ]= 54 ; buffer [4 ]= 48 ; buffer [3 ]= 50 ; buffer [2 ]= 103 ; buffer [1 ]= 102 ; firststring ( 19 ) ; l = 4 ; buffer [4 ]= 46 ; buffer [3 ]= 100 ; buffer [2 ]= 118 ; buffer [1 ]= 105 ; firststring ( 20 ) ; l = 4 ; buffer [4 ]= 46 ; buffer [3 ]= 116 ; buffer [2 ]= 102 ; buffer [1 ]= 109 ; firststring ( 21 ) ; l = 7 ; buffer [7 ]= 32 ; buffer [6 ]= 32 ; buffer [5 ]= 80 ; buffer [4 ]= 97 ; buffer [3 ]= 103 ; buffer [2 ]= 101 ; buffer [1 ]= 32 ; firststring ( 22 ) ; l = 12 ; buffer [12 ]= 32 ; buffer [11 ]= 32 ; buffer [10 ]= 67 ; buffer [9 ]= 104 ; buffer [8 ]= 97 ; buffer [7 ]= 114 ; buffer [6 ]= 97 ; buffer [5 ]= 99 ; buffer [4 ]= 116 ; buffer [3 ]= 101 ; buffer [2 ]= 114 ; buffer [1 ]= 32 ; firststring ( 23 ) ; l = 6 ; buffer [6 ]= 32 ; buffer [5 ]= 32 ; buffer [4 ]= 69 ; buffer [3 ]= 120 ; buffer [2 ]= 116 ; buffer [1 ]= 32 ; firststring ( 24 ) ; l = 4 ; buffer [4 ]= 32 ; buffer [3 ]= 32 ; buffer [2 ]= 96 ; buffer [1 ]= 96 ; firststring ( 25 ) ; l = 2 ; buffer [2 ]= 39 ; buffer [1 ]= 39 ; firststring ( 26 ) ; l = 3 ; buffer [3 ]= 32 ; buffer [2 ]= 61 ; buffer [1 ]= 32 ; firststring ( 27 ) ; l = 4 ; buffer [4 ]= 32 ; buffer [3 ]= 43 ; buffer [2 ]= 32 ; buffer [1 ]= 40 ; firststring ( 28 ) ; l = 4 ; buffer [4 ]= 99 ; buffer [3 ]= 109 ; buffer [2 ]= 114 ; buffer [1 ]= 56 ; firststring ( 29 ) ; l = 6 ; buffer [6 ]= 99 ; buffer [5 ]= 109 ; buffer [4 ]= 116 ; buffer [3 ]= 116 ; buffer [2 ]= 49 ; buffer [1 ]= 48 ; firststring ( 30 ) ; l = 4 ; buffer [4 ]= 103 ; buffer [3 ]= 114 ; buffer [2 ]= 97 ; buffer [1 ]= 121 ; firststring ( 31 ) ; l = 5 ; buffer [5 ]= 108 ; buffer [4 ]= 111 ; buffer [3 ]= 103 ; buffer [2 ]= 111 ; buffer [1 ]= 56 ; firststring ( 32 ) ; l = 8 ; buffer [8 ]= 77 ; buffer [7 ]= 69 ; buffer [6 ]= 84 ; buffer [5 ]= 65 ; buffer [4 ]= 70 ; buffer [3 ]= 79 ; buffer [2 ]= 78 ; buffer [1 ]= 84 ; firststring ( 33 ) ; l = 0 ; firststring ( 34 ) ; startgf () ; if ( getbyte () != 247 ) { fprintf( stderr , "%s%s%s%ld%c\n", "Bad GF file: " , "No preamble" , "! (at byte " , (long)curloc - 1 , ')' ) ; uexit ( 1 ) ; } if ( getbyte () != 131 ) { fprintf( stderr , "%s%s%s%ld%c\n", "Bad GF file: " , "Wrong ID" , "! (at byte " , (long)curloc - 1 , ')' ) ; uexit ( 1 ) ; } k = getbyte () ; {register integer for_end; m = 1 ;for_end = k ; if ( m <= for_end) do { strpool [poolptr ]= getbyte () ; poolptr = poolptr + 1 ; } while ( m++ < for_end ) ;} { dvibuf [dviptr ]= 247 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= 2 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( 25400000L ) ; dvifour ( 473628672L ) ; dvifour ( 1000 ) ; { dvibuf [dviptr ]= k ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } uselogo = false ; s = strstart [strptr ]; {register integer for_end; m = 1 ;for_end = k ; if ( m <= for_end) do { dvibuf [dviptr ]= strpool [s + m - 1 ]; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } while ( m++ < for_end ) ;} if ( strpool [s ]== 32 ) if ( strpool [s + 1 ]== 77 ) if ( strpool [s + 2 ]== 69 ) if ( strpool [s + 3 ]== 84 ) if ( strpool [s + 4 ]== 65 ) if ( strpool [s + 5 ]== 70 ) if ( strpool [s + 6 ]== 79 ) if ( strpool [s + 7 ]== 78 ) if ( strpool [s + 8 ]== 84 ) { strptr = strptr + 1 ; strstart [strptr ]= s + 9 ; uselogo = true ; } timestamp = makestring () ; curgf = getbyte () ; initstrptr = strptr ; while ( true ) { maxnode = 0 ; next [0 ]= maxlabels ; prev [maxlabels ]= 0 ; maxheight = 0 ; maxdepth = 0 ; rulethickness = 0 ; offsetx = 0 ; offsety = 0 ; xoffset = 0 ; yoffset = 0 ; preminx = 268435456L ; premaxx = -268435456L ; preminy = 268435456L ; premaxy = -268435456L ; ruleptr = 0 ; titlehead = 0 ; titletail = 0 ; next [maxlabels ]= 0 ; labeltail = maxlabels ; firstdot = maxlabels ; while ( ( curgf >= 239 ) && ( curgf <= 244 ) ) { k = interpretxxx () ; switch ( k ) {case 19 : ; break ; case 1 : case 2 : case 3 : case 4 : if ( fontsnotloaded ) { fontname [k ]= curstring ; fontarea [k ]= 0 ; fontat [k ]= 0 ; initstrptr = strptr ; } else { putc ('\n', stdout ); fprintf( stdout , "%s%ld%s", "(Tardy font change will be ignored (byte " , (long)curloc , ")!)" ) ; } break ; case 5 : case 6 : case 7 : case 8 : if ( fontsnotloaded ) { fontarea [k - 4 ]= curstring ; initstrptr = strptr ; } else { putc ('\n', stdout ); fprintf( stdout , "%s%ld%s", "(Tardy font change will be ignored (byte " , (long)curloc , ")!)" ) ; } break ; case 9 : case 10 : case 11 : case 12 : if ( fontsnotloaded ) { fontat [k - 8 ]= getyyy () ; initstrptr = strptr ; } else { putc ('\n', stdout ); fprintf( stdout , "%s%ld%s", "(Tardy font change will be ignored (byte " , (long)curloc , ")!)" ) ; } break ; case 15 : rulethickness = getyyy () ; break ; case 13 : { p = getavail () ; next [p ]= ruleptr ; ruleptr = p ; xl [p ]= getyyy () ; yt [p ]= getyyy () ; xr [p ]= getyyy () ; yb [p ]= getyyy () ; if ( xl [p ]< preminx ) preminx = xl [p ]; if ( xl [p ]> premaxx ) premaxx = xl [p ]; if ( yt [p ]< preminy ) preminy = yt [p ]; if ( yt [p ]> premaxy ) premaxy = yt [p ]; if ( xr [p ]< preminx ) preminx = xr [p ]; if ( xr [p ]> premaxx ) premaxx = xr [p ]; if ( yb [p ]< preminy ) preminy = yb [p ]; if ( yb [p ]> premaxy ) premaxy = yb [p ]; xx [p ]= rulethickness ; } break ; case 16 : { offsetx = getyyy () ; offsety = getyyy () ; } break ; case 17 : xoffset = getyyy () ; break ; case 18 : yoffset = getyyy () ; break ; case 14 : { p = getavail () ; info [p ]= curstring ; if ( titlehead == 0 ) titlehead = p ; else next [titletail ]= p ; titletail = p ; } break ; case 0 : if ( ( labeltype < 47 ) || ( labeltype > 56 ) ) { putc ('\n', stdout ); fprintf( stdout , "%s%ld%c", "Bad label type precedes byte " , (long)curloc , '!' ) ; } else { p = getavail () ; next [labeltail ]= p ; labeltail = p ; prev [p ]= labeltype ; info [p ]= curstring ; xx [p ]= getyyy () ; yy [p ]= getyyy () ; if ( xx [p ]< preminx ) preminx = xx [p ]; if ( xx [p ]> premaxx ) premaxx = xx [p ]; if ( yy [p ]< preminy ) preminy = yy [p ]; if ( yy [p ]> premaxy ) premaxy = yy [p ]; } break ; } } if ( curgf == 248 ) { { dvibuf [dviptr ]= 248 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( lastbop ) ; lastbop = dvioffset + dviptr - 5 ; dvifour ( 25400000L ) ; dvifour ( 473628672L ) ; dvifour ( 1000 ) ; dvifour ( maxv ) ; dvifour ( maxh ) ; { dvibuf [dviptr ]= 0 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= 3 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= totalpages / 256 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= totalpages % 256 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } if ( ! fontsnotloaded ) {register integer for_end; k = 1 ;for_end = 5 ; if ( k <= for_end) do if ( ( strstart [fontname [k ]+ 1 ]- strstart [fontname [k ]]) > 0 ) dvifontdef ( k ) ; while ( k++ < for_end ) ;} { dvibuf [dviptr ]= 249 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( lastbop ) ; { dvibuf [dviptr ]= 2 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } k = 4 + ( ( dvibufsize - dviptr ) % 4 ) ; while ( k > 0 ) { { dvibuf [dviptr ]= 223 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } k = k - 1 ; } if ( dvilimit == halfbuf ) writedvi ( halfbuf , dvibufsize - 1 ) ; if ( dviptr > 0 ) writedvi ( 0 , dviptr - 1 ) ; if ( verbose ) fprintf( stdout , "%c\n", ' ' ) ; uexit ( 0 ) ; } if ( curgf != 67 ) if ( curgf != 68 ) { fprintf( stderr , "%s\n", "Missing boc!" ) ; uexit ( 1 ) ; } { if ( fontsnotloaded ) loadfonts () ; if ( curgf == 67 ) { ext = signedquad () ; charcode = ext % 256 ; if ( charcode < 0 ) charcode = charcode + 256 ; ext = ( ext - charcode ) / 256 ; k = signedquad () ; minx = signedquad () ; maxx = signedquad () ; miny = signedquad () ; maxy = signedquad () ; } else { ext = 0 ; charcode = getbyte () ; minx = getbyte () ; maxx = getbyte () ; minx = maxx - minx ; miny = getbyte () ; maxy = getbyte () ; miny = maxy - miny ; } if ( maxx - minx > widestrow ) { fprintf( stderr , "%s\n", "Character too wide!" ) ; uexit ( 1 ) ; } if ( preminx < minx * 65536L ) offsetx = offsetx + minx * 65536L - preminx ; if ( premaxy > maxy * 65536L ) offsety = offsety + maxy * 65536L - premaxy ; if ( premaxx > maxx * 65536L ) premaxx = premaxx / 65536L ; else premaxx = maxx ; if ( preminy < miny * 65536L ) preminy = preminy / 65536L ; else preminy = miny ; deltay = round ( unscyratio * ( maxy + 1 ) - yratio * offsety ) + 3276800L ; deltax = round ( xratio * offsetx - unscxratio * minx ) ; if ( slantratio >= 0 ) overcol = round ( unscxratio * premaxx + unscslantratio * maxy ) ; else overcol = round ( unscxratio * premaxx + unscslantratio * miny ) ; overcol = overcol + deltax + overflowlabeloffset ; pageheight = round ( unscyratio * ( maxy + 1 - preminy ) ) + 3276800L - offsety ; if ( pageheight > maxv ) maxv = pageheight ; pagewidth = overcol - 10000000L ; { dvibuf [dviptr ]= 139 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } totalpages = totalpages + 1 ; dvifour ( totalpages ) ; dvifour ( charcode ) ; dvifour ( ext ) ; {register integer for_end; k = 3 ;for_end = 9 ; if ( k <= for_end) do dvifour ( 0 ) ; while ( k++ < for_end ) ;} dvifour ( lastbop ) ; lastbop = dvioffset + dviptr - 45 ; dvigoto ( 0 , 655360L ) ; if ( uselogo ) { { dvibuf [dviptr ]= 176 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } hbox ( 33 , 5 , true ) ; } { dvibuf [dviptr ]= 172 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } hbox ( timestamp , 1 , true ) ; hbox ( 22 , 1 , true ) ; dviscaled ( totalpages * 65536.0 ) ; if ( ( charcode != 0 ) || ( ext != 0 ) ) { hbox ( 23 , 1 , true ) ; dviscaled ( charcode * 65536.0 ) ; if ( ext != 0 ) { hbox ( 24 , 1 , true ) ; dviscaled ( ext * 65536.0 ) ; } } if ( titlehead != 0 ) { next [titletail ]= 0 ; do { hbox ( 25 , 1 , true ) ; hbox ( info [titlehead ], 1 , true ) ; hbox ( 26 , 1 , true ) ; titlehead = next [titlehead ]; } while ( ! ( titlehead == 0 ) ) ; } { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } if ( verbose ) { fprintf( stdout , "%c%ld", '[' , (long)totalpages ) ; fflush ( stdout ) ; } if ( ruleslant != 0 ) { dvibuf [dviptr ]= 175 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } while ( ruleptr != 0 ) { p = ruleptr ; ruleptr = next [p ]; if ( xx [p ]== 0 ) xx [p ]= grayrulethickness ; if ( xx [p ]> 0 ) { convert ( xl [p ], yt [p ]) ; tempx = dvix ; tempy = dviy ; convert ( xr [p ], yb [p ]) ; if ( abs ( tempx - dvix ) < 6554 ) { if ( tempy > dviy ) { k = tempy ; tempy = dviy ; dviy = k ; } dvigoto ( dvix - ( xx [p ]/ 2 ) , dviy ) ; { dvibuf [dviptr ]= 137 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( dviy - tempy ) ; dvifour ( xx [p ]) ; { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } else if ( abs ( tempy - dviy ) < 6554 ) { if ( tempx < dvix ) { k = tempx ; tempx = dvix ; dvix = k ; } dvigoto ( dvix , dviy + ( xx [p ]/ 2 ) ) ; { dvibuf [dviptr ]= 137 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( xx [p ]) ; dvifour ( tempx - dvix ) ; { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } else if ( ( ruleslant == 0 ) || ( abs ( tempx + ruleslant * ( tempy - dviy ) - dvix ) > xx [p ]) ) slantcomplaint ( ( dvix - tempx ) / ((double) ( tempy - dviy ) ) ) ; else { if ( tempy > dviy ) { k = tempy ; tempy = dviy ; dviy = k ; k = tempx ; tempx = dvix ; dvix = k ; } m = round ( ( dviy - tempy ) / ((double) slantunit ) ) ; if ( m > 0 ) { dvigoto ( dvix , dviy ) ; q = ( ( m - 1 ) / slantn ) + 1 ; k = m / q ; p = m % q ; q = q - p ; typeset ( k ) ; dy = round ( k * slantunit ) ; { dvibuf [dviptr ]= 170 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( - (integer) dy ) ; while ( q > 1 ) { typeset ( k ) ; { dvibuf [dviptr ]= 166 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } q = q - 1 ; } if ( p > 0 ) { k = k + 1 ; typeset ( k ) ; dy = round ( k * slantunit ) ; { dvibuf [dviptr ]= 170 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dvifour ( - (integer) dy ) ; while ( p > 1 ) { typeset ( k ) ; { dvibuf [dviptr ]= 166 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } p = p - 1 ; } } { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } } } } overflowline = 1 ; if ( next [maxlabels ]!= 0 ) { next [labeltail ]= 0 ; { dvibuf [dviptr ]= 174 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } p = next [maxlabels ]; firstdot = maxnode + 1 ; while ( p != 0 ) { convert ( xx [p ], yy [p ]) ; xx [p ]= dvix ; yy [p ]= dviy ; if ( prev [p ]< 53 ) { q = getavail () ; xl [p ]= q ; info [q ]= p ; xx [q ]= dvix ; xl [q ]= dvix - dotwidth ; xr [q ]= dvix + dotwidth ; yy [q ]= dviy ; yt [q ]= dviy - dotheight ; yb [q ]= dviy + dotheight ; nodeins ( q , 0 ) ; dvigoto ( xx [q ], yy [q ]) ; { dvibuf [dviptr ]= 0 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } p = next [p ]; } p = next [maxlabels ]; while ( p != 0 ) { if ( prev [p ]<= 48 ) { r = xl [p ]; q = nearestdot ( r , 10 ) ; if ( twin ) xr [p ]= 8 ; else xr [p ]= 0 ; if ( q != 0 ) { dx = xx [q ]- xx [r ]; dy = yy [q ]- yy [r ]; if ( dy > 0 ) xr [p ]= xr [p ]+ 4 ; if ( dx < 0 ) xr [p ]= xr [p ]+ 1 ; if ( dy > dx ) xr [p ]= xr [p ]+ 1 ; if ( - (integer) dy > dx ) xr [p ]= xr [p ]+ 1 ; } } p = next [p ]; } { dvibuf [dviptr ]= 173 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } q = maxlabels ; while ( next [q ]!= 0 ) { p = next [q ]; if ( prev [p ]> 48 ) { next [q ]= next [p ]; { hbox ( info [p ], 2 , false ) ; dvix = xx [p ]; dviy = yy [p ]; if ( prev [p ]< 53 ) r = xl [p ]; else r = 0 ; switch ( prev [p ]) {case 49 : case 53 : topcoords ( p ) ; break ; case 50 : case 54 : leftcoords ( p ) ; break ; case 51 : case 55 : rightcoords ( p ) ; break ; case 52 : case 56 : botcoords ( p ) ; break ; } nodeins ( p , r ) ; dvigoto ( xx [p ], yy [p ]) ; hbox ( info [p ], 2 , true ) ; { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } } else q = next [q ]; } q = maxlabels ; while ( next [q ]!= 0 ) { p = next [q ]; r = next [p ]; s = xl [p ]; if ( placelabel ( p ) ) next [q ]= r ; else { info [s ]= 0 ; if ( prev [p ]== 47 ) next [q ]= r ; else q = p ; } } p = next [0 ]; while ( p != maxlabels ) { q = next [p ]; if ( ( p < firstdot ) || ( info [p ]== 0 ) ) { r = prev [p ]; next [r ]= q ; prev [q ]= r ; next [p ]= r ; } p = q ; } p = next [maxlabels ]; while ( p != 0 ) { { r = next [xl [p ]]; s = next [r ]; t = next [p ]; next [p ]= s ; prev [s ]= p ; next [r ]= p ; prev [p ]= r ; q = nearestdot ( p , 0 ) ; next [r ]= s ; prev [s ]= r ; next [p ]= t ; overflowline = overflowline + 1 ; dvigoto ( overcol , overflowline * thricexheight + 655360L ) ; hbox ( info [p ], 2 , true ) ; if ( q != 0 ) { hbox ( 27 , 2 , true ) ; hbox ( info [info [q ]], 2 , true ) ; hbox ( 28 , 2 , true ) ; dviscaled ( ( xx [p ]- xx [q ]) / ((double) xratio ) + ( yy [p ]- yy [q ]) * fudgefactor ) ; { dvibuf [dviptr ]= 44 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } dviscaled ( ( yy [q ]- yy [p ]) / ((double) yratio ) ) ; { dvibuf [dviptr ]= 41 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } { dvibuf [dviptr ]= 142 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } } p = next [p ]; } } dopixels () ; { dvibuf [dviptr ]= 140 ; dviptr = dviptr + 1 ; if ( dviptr == dvilimit ) dviswap () ; } if ( overflowline > 1 ) pagewidth = overcol + 10000000L ; if ( pagewidth > maxh ) maxh = pagewidth ; if ( verbose ) { putc ( ']' , stdout ); if ( totalpages % 13 == 0 ) fprintf( stdout , "%c\n", ' ' ) ; else putc ( ' ' , stdout ); fflush ( stdout ) ; } } curgf = getbyte () ; strptr = initstrptr ; poolptr = strstart [strptr ]; } if ( verbose && ( totalpages % 13 != 0 ) ) fprintf( stdout , "%c\n", ' ' ) ; }