home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / shipout.c < prev    next >
C/C++ Source or Header  |  1993-10-11  |  32KB  |  1,365 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4. #define synch_h \
  5.   if( curh != dvih ) { movement(curh-dvih, right1); dvih = curh; }
  6.  
  7. #define synch_v \
  8.   if( curv != dviv ) { movement(curv-dviv, down1); dviv = curv; }
  9.  
  10.  
  11. /* static quarterword c, f; */
  12. static scaled ruleht, ruledp, rulewd;
  13. static scaled dvih, dviv;
  14. static scaled curh, curv;
  15. static internalfontnumber dvif;
  16. static integer curs = -1;
  17.  
  18. static halfword downptr = 0, rightptr = 0;
  19.  
  20. static void movement ( scaled w, eightbits o );
  21. static void prunemovements ( integer l );
  22. static void specialout ( halfword p );
  23. static void writeout ( halfword p );
  24. static void hlistout ( halfword thisbox );
  25. static void vlistout ( halfword thisbox );
  26.  
  27.  
  28. void dviswap ( void )
  29. { dviswap_regmem 
  30.  
  31.   if ( dvilimit == dvibufsize ) {
  32.     writedvi ( 0 , halfbuf - 1 ) ; 
  33.     dvilimit = halfbuf ; 
  34.     dvioffset = dvioffset + dvibufsize ; 
  35.     dviptr = 0 ; 
  36.   } else {
  37.     writedvi ( halfbuf , dvibufsize - 1 ) ; 
  38.     dvilimit = dvibufsize ; 
  39.   } 
  40.   dvigone = dvigone + halfbuf ; 
  41. }
  42.  
  43. void dvifour ( integer x ) 
  44. { dvifour_regmem 
  45.  
  46. #if defined(atarist) || defined(AMIGA)
  47.   /* 68000 rechnet im 2er-Komplement, deshalb nicht notwendig */
  48.   union { char cc[4]; long ll; } xx;
  49.   xx.ll = x;
  50.   dviout ( xx.cc[0] );   dviout ( xx.cc[1] );
  51.   dviout ( xx.cc[2] );   dviout ( xx.cc[3] );
  52. #else
  53.   if ( x >= 0 ) 
  54.     dviout ( x / 16777216L ) ; 
  55.   else {
  56.     x = x + 1073741824L ; 
  57.     x = x + 1073741824L ; 
  58.     dviout ( ( x / 16777216L ) + 128 ) ; 
  59.   } 
  60.   x = x % 16777216L ; 
  61.   dviout ( x / 65536L ) ; 
  62.   x = x % 65536L ; 
  63.   dviout ( x / 256 ) ; 
  64.   dviout ( x % 256 ) ;
  65. #endif
  66.  
  67. void dvipop ( integer l )
  68. { dvipop_regmem 
  69.  
  70.   if ( ( l == dvioffset + dviptr ) && ( dviptr > 0 ) ) 
  71.     decr ( dviptr ) ; 
  72.   else dviout ( pop ) ; 
  73. }
  74.  
  75. void dvifontdef ( internalfontnumber f )
  76. { dvifontdef_regmem 
  77.   register poolpointer k  ; 
  78.  
  79.   dviout ( fntdef1 ) ; 
  80.   dviout ( f - 1 ) ; 
  81.   dviout ( fontcheck(f).b0 ) ; 
  82.   dviout ( fontcheck(f).b1 ) ; 
  83.   dviout ( fontcheck(f).b2 ) ; 
  84.   dviout ( fontcheck(f).b3 ) ; 
  85.   dvifour ( fontsize(f) ) ; 
  86.   dvifour ( fontdsize(f) ) ; 
  87.   dviout ( length ( fontarea(f) ) ) ; 
  88.   dviout ( length ( fontname(f) ) ) ; 
  89.   {register integer for_end; k = strstart [ fontarea(f) ] ; for_end = 
  90.   strstart [ fontarea(f) + 1 ] - 1 ; if ( k <= for_end) do 
  91.     dviout ( strpool [ k ] ) ; 
  92.   while ( k++ < for_end ) ; } 
  93.   {register integer for_end; k = strstart [ fontname(f) ] ; for_end = 
  94.   strstart [ fontname(f) + 1 ] - 1 ; if ( k <= for_end) do 
  95.     dviout ( strpool [ k ] ) ; 
  96.   while ( k++ < for_end ) ; } 
  97.  
  98.   static
  99. void movement ( scaled w, eightbits o )        /* 607. */
  100. { movement_regmem 
  101.   register halfword q;
  102.   register smallnumber mstate  ; 
  103.   register halfword p;
  104.   register integer k  ; 
  105.  
  106.   q = getnode ( movementnodesize );
  107.  
  108.   width ( q ) = w ; 
  109.   location ( q ) = dvioffset + dviptr ; 
  110.   if ( o == down1 ) {
  111.     link ( q ) = downptr ; 
  112.     downptr = q ; 
  113.   } else {
  114.     link ( q ) = rightptr ; 
  115.     rightptr = q ; 
  116.   } 
  117.   p = link ( q ) ; 
  118.   mstate = 0 ; 
  119.   while ( p != 0 ) {
  120.     if ( width ( p ) == w ) 
  121.     switch ( mstate + info ( p ) ) 
  122.     {case 3 : 
  123.     case 4 : 
  124.     case 15 : 
  125.     case 16 : 
  126.       if ( location ( p ) < dvigone ) 
  127.       goto lab45 ; 
  128.       else {
  129.     k = location ( p ) - dvioffset ; 
  130.     if ( k < 0 ) 
  131.     k = k + dvibufsize ; 
  132.     dvibuf [ k ] = dvibuf [ k ] + y1 - down1 ; 
  133.     info ( p ) = 1 ; 
  134.     goto lab40 ; 
  135.       } 
  136.       break ; 
  137.     case 5 : 
  138.     case 9 : 
  139.     case 11 : 
  140.       if ( location ( p ) < dvigone ) 
  141.       goto lab45 ; 
  142.       else {
  143.     k = location ( p ) - dvioffset ; 
  144.     if ( k < 0 ) 
  145.     k = k + dvibufsize ; 
  146.     dvibuf [ k ] = dvibuf [ k ] + z1 - down1 ; 
  147.     info ( p ) = 2 ; 
  148.     goto lab40 ; 
  149.       } 
  150.       break ; 
  151.     case 1 : 
  152.     case 2 : 
  153.     case 8 : 
  154.     case 13 : 
  155.       goto lab40 ; 
  156.       break ; 
  157.     default: 
  158.       break ; 
  159.     } 
  160.     else switch ( mstate + info ( p ) ) 
  161.     {case 1 : 
  162.       mstate = 6 ; 
  163.       break ; 
  164.     case 2 : 
  165.       mstate = 12 ; 
  166.       break ; 
  167.     case 8 : 
  168.     case 13 : 
  169.       goto lab45 ; 
  170.       break ; 
  171.     default: 
  172.       break ; 
  173.     } 
  174.     p = link ( p ) ; 
  175.   } 
  176.  
  177. lab45:
  178.   info ( q ) = 3 ; 
  179.  
  180.   if ( abs ( w ) >= 8388608L ) {
  181.     dviout ( o + 3 ) ; dvifour ( w ) ; 
  182.     return ; 
  183.   }
  184.   if ( abs ( w ) >= 32768L ) {
  185.     dviout ( o + 2 ) ; 
  186.     if ( w < 0 ) 
  187.       w = w + 16777216L ; 
  188.     dviout ( w / 65536L ) ; 
  189.     w = w % 65536L ; 
  190.   } else if ( abs ( w ) >= 128 ) {
  191.     dviout ( o + 1 ) ; 
  192.     if ( w < 0 ) 
  193.       w = w + 65536L ; 
  194.   } else {
  195.     dviout ( o ) ; 
  196.     if ( w < 0 ) 
  197.       w = w + 256 ; 
  198.     goto lab1 ; 
  199.   }
  200.  
  201.   dviout ( w / 256 ) ;
  202. lab1:
  203.   dviout ( w % 256 ) ; 
  204.   return ; 
  205.  
  206. lab40:
  207.   info ( q ) = info ( p ) ; 
  208.   if ( info ( q ) == 1 ) {
  209.     dviout ( o + y0 - down1 ) ; 
  210.     while ( link ( q ) != p ) {
  211.       q = link ( q ) ; 
  212.       switch ( info ( q ) ) 
  213.       {case 3 : 
  214.     info ( q ) = 5 ; 
  215.     break ; 
  216.       case 4 : 
  217.     info ( q ) = 6 ; 
  218.     break ; 
  219.       default: 
  220.     break ; 
  221.       } 
  222.     } 
  223.   } else {
  224.     dviout ( o + z0 - down1 ) ; 
  225.     while ( link ( q ) != p ) {
  226.       q = link ( q ) ; 
  227.       switch ( info ( q ) ) 
  228.       {case 3 : 
  229.     info ( q ) = 4 ; 
  230.     break ; 
  231.       case 5 : 
  232.     info ( q ) = 6 ; 
  233.     break ; 
  234.       default: 
  235.     break ; 
  236.       } 
  237.     } 
  238.   }
  239. }
  240.  
  241. #if 0
  242.   static
  243. void prunemovements ( integer l )    /* 615. */
  244. {/* 30 10 */ prunemovements_regmem 
  245.   register halfword p;
  246.   register halfword drp;    /* br */
  247.  
  248.   drp = downptr;
  249.   while ( drp != 0 ) {
  250.     if ( location ( drp ) < l ) 
  251.       goto lab30;
  252.     p = drp;
  253.     drp = link ( p ) ; 
  254.     freenode ( p , movementnodesize ) ; 
  255.   }
  256. lab30:
  257.   downptr = drp;
  258.   drp = rightptr;
  259.   while ( drp != 0 ) {
  260.     if ( location ( drp ) < l ) {
  261.       rightptr = drp;
  262.       break;    /* while */
  263.     }
  264.     p = drp;
  265.     drp = link ( p );
  266.     freenode ( p , movementnodesize );
  267.   }
  268. }
  269. #else
  270.   static
  271. void prunemovements ( integer l )    /* 615. */
  272. { prunemovements_regmem 
  273.   register halfword p;
  274.  
  275.   while ( downptr != 0 ) {
  276.     if ( location ( downptr ) < l ) 
  277.       goto lab30;
  278.     p = downptr;
  279.     downptr = link ( p ) ; 
  280.     freenode ( p , movementnodesize ) ; 
  281.   }
  282. lab30:
  283.   while ( rightptr != 0 ) {
  284.     if ( location ( rightptr ) < l ) {
  285.     return;
  286.     }
  287.     p = rightptr;
  288.     rightptr = link ( p );
  289.     freenode ( p , movementnodesize );
  290.   }
  291. }
  292. #endif
  293.  
  294.   static
  295. void specialout ( halfword p )
  296. { specialout_regmem 
  297.   register integer oldsetting  ; 
  298.   register poolpointer k  ; 
  299.  
  300.   synch_h;  synch_v;
  301.  
  302.   oldsetting = selector ; 
  303.   selector = newstring ; 
  304.   showtokenlist ( link ( writetokens ( p ) ) , 0 , poolsize - poolptr ) ; 
  305.   selector = oldsetting ; 
  306.   strroom ( 1 ) ; 
  307.   if ( curlength < 256 ) {
  308.     dviout ( xxx1 ) ; 
  309.     dviout ( curlength ) ; 
  310.   } else {
  311.     dviout ( xxx4 ) ; 
  312.     dvifour ( curlength ) ; 
  313.   } 
  314.   {register integer for_end; k = strstart [ strptr ] ; for_end = poolptr - 1 
  315.   ; if ( k <= for_end) do 
  316.     dviout ( strpool [ k ] ) ; 
  317.   while ( k++ < for_end ) ; } 
  318.   poolptr = strstart [ strptr ] ; 
  319. }
  320.  
  321.   static
  322. void writeout ( halfword p )
  323. { writeout_regmem 
  324.   register integer oldsetting  ; 
  325.   register integer oldmode  ; 
  326.   register smallnumber j  ; 
  327.   register halfword q, r  ; 
  328.  
  329.   q = getavail () ; 
  330.   info ( q ) = rightbracetoken + 125 ; 
  331.   r = getavail () ; 
  332.   link ( q ) = r ; 
  333.   info ( r ) = cstokenflag + endwrite ; 
  334.   begintokenlist ( q , inserted ) ; 
  335.   begintokenlist ( writetokens ( p ) , writetext ) ; 
  336.   q = getavail () ; 
  337.   info ( q ) = leftbracetoken + 123 ; 
  338.   begintokenlist ( q , inserted ) ; 
  339.   oldmode = curlist .modefield ; 
  340.   curlist .modefield = 0 ; 
  341.   curcs = writeloc ; 
  342.   q = scantoks ( false , true ) ; 
  343.   gettoken () ; 
  344.   if ( curtok != cstokenflag + endwrite ) {
  345.     print_err("Unbalanced write command");
  346.     zhelp2( STR_H_ONTHISPAGE_WRITE, STR_H_ICANT_HANDLE_THAT );
  347.     error();
  348.     do {
  349.     gettoken () ; 
  350.     } while ( ! ( curtok == cstokenflag + endwrite ) ) ; 
  351.   }
  352.   curlist .modefield = oldmode ; 
  353.   endtokenlist () ; 
  354.   oldsetting = selector ; 
  355.   j = writestream ( p ) ; 
  356.   if ( writeopen [ j ] ) 
  357.     selector = j ; 
  358.   else {
  359.     if ( ( j == 17 ) && ( selector == termandlog ) ) 
  360.       selector = logonly ; 
  361.     c_printnl("");
  362.   }
  363.   tokenshow ( defref ) ; 
  364.   println () ; 
  365.   flushlist ( defref ) ; 
  366.   selector = oldsetting ; 
  367.  
  368. void outwhat ( halfword p )
  369. { outwhat_regmem 
  370.   register smallnumber j  ; 
  371.  
  372.   switch ( subtype ( p ) ) 
  373.   {case opennode : 
  374.   case writenode : 
  375.   case closenode : 
  376.     if ( ! doingleaders ) {
  377.       j = writestream ( p ) ; 
  378.       if ( subtype ( p ) == writenode ) 
  379.     writeout ( p ) ; 
  380.       else {
  381.     if ( writeopen [ j ] ) 
  382.       aclose ( writefile [ j ] ) ; 
  383.     if ( subtype ( p ) == closenode ) 
  384.       writeopen [ j ] = false ; 
  385.     else if ( j < 16 ) {
  386.       curname = openname ( p ) ; 
  387.       curarea = openarea ( p ) ; 
  388.       curext = openext ( p ) ; 
  389.       if ( curext == 335 ) 
  390.         curext = STR_DOT_TEX;
  391.       packfilename ( curname , curarea , curext ) ; 
  392.       while ( ! aopenout ( writefile [ j ] ) )
  393.         promptfilename("output file name", STR_DOT_TEX);
  394.       writeopen [ j ] = true;
  395.     } 
  396.       } 
  397.     } 
  398.     break ; 
  399.   case specialnode : 
  400.     specialout ( p ) ; 
  401.     break ; 
  402.   case languagenode : 
  403.     break ; 
  404.   default: 
  405.     confusion("ext4");
  406.     break ; 
  407.   } 
  408.  
  409.  
  410. #ifdef TEXXET
  411.   static
  412. long_halfword reverse ( halfword this_box, halfword t )
  413. { reverse_regmem
  414.  
  415.   register halfword l, p, q;
  416.   register char g_order;
  417.   register char g_sign;
  418.   register halfword m, n;
  419.  
  420.   g_order = glueorder(this_box);  g_sign = gluesign(this_box);
  421.   l = t;
  422.   p = tempptr;
  423.   m = minhalfword;  n = minhalfword;
  424.  
  425.   while( p != 0 ) {
  426.     /* 1393. Move node p to the new list ... */
  427. reswitch:
  428.     if( ischarnode(p) ) {
  429.       do {
  430.     f = font(p);  c = character(p);
  431.     curh += zcharwidth(f, zcharinfo(f, c));
  432.     q = link(p);  link(p) = l;  l = p;  p = q;
  433.       } while( ischarnode(p) );
  434.     } else {
  435.       /* 1394. Move the non-char_node p to the new list. */
  436.       q = link(p);
  437.       rulewd = width(p);
  438.       switch( ztype(p) ) {
  439.     case hlistnode:  case vlistnode:
  440.     case rulenode:  case kernnode:
  441.       break;
  442.     case gluenode:
  443.       g = glueptr(p); rulewd = width(g);
  444.       if( g_sign != normal ) {
  445.         if( g_sign == stretching ) {
  446.           if( stretchorder(g) == g_order )
  447.         rulewd += round(float(glueset(this_box)) * stretch(g));
  448.         } else {
  449.           if( shrinkorder(g) == g_order )
  450.         rulewd -= round(float(glueset(this_box)) * shrink(g));
  451.         }
  452.       }
  453.       tempptr = leaderptr(p);
  454.       if( tempptr == 0 ) {
  455.         deleteglueref(g);  ztype(p) = kernnode;  width(p) = rulewd;
  456.       } else if( ztype(tempptr) == rulenode ) {
  457.         deleteglueref(g);
  458.         freenode(p, smallnodesize);
  459.         p = tempptr;  width(p) = rulewd;
  460.       }
  461.       break;
  462.  
  463.     case ligaturenode:
  464.       flushnodelist(ligptr(p));
  465.       tempptr = p;
  466.       p = getavail();  mem[p] = mem[ligchar(tempptr)];
  467.       link(p) = q;
  468.       freenode(tempptr, smallnodesize);
  469.       goto reswitch;
  470.  
  471.     case mathnode:
  472.       if( end_LR(p) ) {
  473.         if( n > minhalfword ) {
  474.           decr(n);  decr(subtype(p));  /* change after into before */
  475.         } else {
  476.           if( info(LR_ptr) != subtype(p) )
  477.         confusion("LR");
  478.           pop_LR;
  479.           if( m == minhalfword ) {
  480.         /* 1398. Finish ... */
  481.         if( t == 0 )
  482.           confusion("LR");
  483.         freenode(p, smallnodesize);
  484.         link(t) = q;
  485.         width(t) = rulewd;
  486.         edge_dist(t) = - curh - rulewd;
  487.         goto done;
  488.           }
  489.           decr(m);
  490.           ztype(p) = kernnode;
  491.         }
  492.       } else if( n > minhalfword || LR_dir(p) != cur_dir ) {
  493.         incr(n);  incr(subtype(p));  /* change before into after */ 
  494.       } else {
  495.         push_LR(p);  incr(m);
  496.         ztype(p) = kernnode;
  497.       }
  498.       break;
  499.  
  500.     case R_node:  edge_node:
  501.       confusion("LR");
  502.       break;
  503.     default:
  504.       goto next_p;
  505.       break;
  506.       }
  507.       curh += rulewd;
  508. next_p:
  509.       if( (ztype(p) == kernnode) && ((rulewd == 0) || (l == 0)) )
  510.     freenode(p, smallnodesize);
  511.       else {
  512.         link(p) = l;  l = p;
  513.       }
  514.       p = q;
  515.     }
  516.   }
  517.  
  518.   if( t != 0 || m != minhalfword || n != minhalfword ) {
  519.     confusion("LR");
  520.   }
  521. done:
  522.   return(l);
  523. }
  524. #endif
  525.  
  526.  
  527.   static
  528. void hlistout ( halfword thisbox )
  529. {/* 21 13 14 15 */ hlistout_regmem 
  530.  
  531.   register eightbits *hlist_dvibuf = dvibuf;    /* (br) added this one ... */
  532. #define dvibuf hlist_dvibuf
  533.  
  534.   register scaled baseline  ; 
  535.   register scaled leftedge  ; 
  536. /* register scaled saveh, savev  ; */
  537. /* register halfword thisbox  ; */
  538.   register glueord gorder  ; 
  539.   register integer gsign  ; 
  540.   register halfword p  ; 
  541.   register integer saveloc  ; 
  542.   register halfword leaderbox  ; 
  543.   register scaled leaderwd  ; 
  544. /* register scaled lx  ; */
  545. /* boolean outerdoingleaders  ; */
  546.   register scaled edge  ; 
  547. #ifdef TEXXET
  548.   register halfword prev_p;
  549. #endif
  550.  
  551. /*  thisbox = tempptr ; */
  552.   gorder = glueorder ( thisbox ) ; 
  553.   gsign = gluesign ( thisbox ) ; 
  554.   p = listptr ( thisbox ) ; 
  555.   incr ( curs ) ; 
  556.   if ( curs > 0 ) 
  557.     dviout ( push ) ; 
  558.   if ( curs > maxpush ) 
  559.     maxpush = curs ; 
  560.   saveloc = dvioffset + dviptr ; 
  561.   baseline = curv ;
  562.   leftedge = curh ;
  563. #ifdef TEXXET
  564.   prev_p = thisbox + listoffset;
  565.  
  566.   if( cur_dir == right_to_left ) {
  567.     if( ztype(thisbox) == hlistnode ) {
  568.       /* 1390. Reverse the complete hlist and change this node into a R_node */
  569.       scaled saveh;
  570.  
  571.       saveh = curh;
  572.         tempptr = p;  /* Uebergebe `reverse' `p' */
  573.         p = newkern(0);  link(prev_p) = p;
  574.  
  575.         curh = 0;  link(p) = reverse(thisbox, 0);  width(p) = -curh;
  576.       curh = saveh;
  577.       ztype(thisbox) = R_code;
  578.     }
  579.   }
  580. #endif
  581.  
  582.   while ( p != 0 )
  583.     /* 620. Output node p ... */
  584. lab21:
  585.     if ( ischarnode ( p ) ) {
  586.       synch_h;  synch_v;
  587.  
  588.       { /* 620. Output node |p| ...  !! inner loop !! */
  589.     register quarterword tmp_f, tmp_c;
  590.     register scaled tmp_curh = curh;
  591.  
  592.       do {
  593.     tmp_f = font ( p ) ; 
  594.         tmp_c = character ( p ) ; 
  595.         if ( tmp_f != dvif ) {
  596.       if ( ! fontused(tmp_f) ) {
  597.         dvifontdef ( tmp_f ) ; 
  598.         fontused(tmp_f) = true ; 
  599.       }
  600.       if ( tmp_f <= 64 ) 
  601.         dviout ( tmp_f - 1 + fntnum0 ) ; 
  602.       else {
  603.         dviout ( fnt1 ) ; 
  604.         dviout ( tmp_f - 1 ) ; 
  605.       }
  606.       dvif = tmp_f;
  607.         }
  608. #ifdef MLTEX
  609.     if( tmp_c > fontec(tmp_f) ) {
  610.       p = substitute_char_list(p, tmp_f, tmp_c);
  611.     } else {
  612. #endif
  613.     if ( tmp_c >= 128 )
  614.       dviout ( set1 );
  615.     dviout ( tmp_c );
  616.     tmp_curh += zcharwidth(tmp_f, zcharinfo(tmp_f, tmp_c));
  617.     p = link ( p );
  618. #ifdef MLTEX
  619.         }
  620. #endif
  621.       } while ( ischarnode ( p ) );
  622.  
  623.       curh = tmp_curh;
  624.       }
  625.       dvih = curh ; 
  626.  
  627.     } else {
  628.       /* 622. Output the non-charnode p ... */
  629.  
  630.     switch ( ztype ( p ) ) {
  631.     case hlistnode : 
  632.     case vlistnode : 
  633. #ifdef TEXXET
  634.     case R_node:
  635. #endif
  636.       if ( listptr ( p ) == 0 ) 
  637.     curh += width ( p ) ;
  638.       else {
  639.         scaled saveh, savev;
  640.  
  641.     saveh = dvih ; 
  642.     savev = dviv ; 
  643.     curv = baseline + shiftamount ( p ) ; 
  644.     /* tempptr = p ; */
  645. #ifdef TEXXET
  646.     edge = curh + width(p);
  647.     if( cur_dir == right_to_left )
  648.       curh = edge;
  649. #else
  650.     edge = curh ; 
  651. #endif
  652.     if ( ztype ( p ) == vlistnode ) 
  653.       vlistout ( p ) ; 
  654.     else
  655.       hlistout ( p ) ; 
  656.     dvih = saveh ; 
  657.     dviv = savev ;
  658. #ifdef TEXXET
  659.     curh = edge;
  660. #else
  661.     curh = edge + width ( p ) ; 
  662. #endif
  663.     curv = baseline ; 
  664.       }
  665.       break ; 
  666.     case rulenode : 
  667.       {
  668.     ruleht = height ( p ) ; 
  669.     ruledp = depth ( p ) ; 
  670.     rulewd = width ( p ) ; 
  671.     goto lab14 ; 
  672.       } 
  673.       break ; 
  674.     case whatsitnode : 
  675.       outwhat ( p ) ;
  676.       break ; 
  677.     case gluenode : 
  678.       { { halfword g;
  679.     g = glueptr ( p ) ; 
  680.     rulewd = width ( g ) ; 
  681.     if ( gsign != normal ) {
  682.       if ( gsign == stretching ) {
  683.         if ( stretchorder ( g ) == gorder )
  684.           rulewd += round ( glueset ( thisbox ) * stretch ( g ) ) ;
  685.       } else {
  686.         if ( shrinkorder ( g ) == gorder ) 
  687.           rulewd -= round ( glueset ( thisbox ) * shrink ( g ) ) ;
  688.       }
  689.     }
  690.     }
  691.     if ( subtype ( p ) >= aleaders ) {
  692.       /* 626. ... */
  693.       leaderbox = leaderptr ( p ) ;
  694.       if ( ztype ( leaderbox ) == rulenode ) {
  695.         ruleht = height ( leaderbox ) ;
  696.         ruledp = depth ( leaderbox ) ;
  697.         goto lab14 ; 
  698.       }
  699.       leaderwd = width ( leaderbox ) ; 
  700.       if ( ( leaderwd > 0 ) && ( rulewd > 0 ) ) {
  701.         scaled lx;
  702.         scaled saveh, savev;
  703.         boolean outerdoingleaders;
  704.  
  705.         rulewd += 10 ;
  706. #ifdef TEXXET
  707.         if( cur_dir == right_to_left )
  708.         curh -= 10;
  709. #endif
  710.         edge = curh + rulewd ;
  711.         lx = 0 ; 
  712.         if ( subtype ( p ) == aleaders ) {
  713.           saveh = curh ;
  714.           curh = leftedge + leaderwd * ( ( curh - leftedge ) / leaderwd ) ;
  715.           if ( curh < saveh ) 
  716.         curh += leaderwd ;
  717.         } else {
  718.           integer lq, lr;
  719.  
  720.           lq = rulewd / leaderwd ; 
  721.           lr = rulewd % leaderwd ; 
  722.           if ( subtype ( p ) == cleaders ) 
  723.         curh += ( lr / 2 ) ;
  724.           else {
  725.         lx = ( 2 * lr + lq + 1 ) / ( 2 * lq + 2 ) ; 
  726.         curh += ( ( lr - ( lq - 1 ) * lx ) / 2 ) ;
  727.           }
  728.         }
  729.         while ( curh + leaderwd <= edge ) {
  730.           curv = baseline + shiftamount ( leaderbox ) ; 
  731.  
  732.           synch_v;  savev = dviv ; 
  733.           synch_h;  saveh = dvih ; 
  734.  
  735.           /* tempptr = leaderbox ; */
  736. #ifdef TEXXET
  737.           if( cur_dir == right_to_left )
  738.         curh += leaderwd;
  739. #endif
  740.           outerdoingleaders = doingleaders ; 
  741.           doingleaders = true ; 
  742.           if ( ztype ( leaderbox ) == vlistnode ) 
  743.         vlistout ( leaderbox ) ; 
  744.           else
  745.         hlistout ( leaderbox ) ; 
  746.           doingleaders = outerdoingleaders ; 
  747.           dviv = savev ; 
  748.           dvih = saveh ; 
  749. #if 0  /* 3.1415 */
  750.           curv = savev ; 
  751. #else
  752.           curv = baseline ; 
  753. #endif
  754.           curh = saveh + leaderwd + lx ; 
  755.         }
  756. #ifdef TEXXET
  757.         if( cur_dir == right_to_left )
  758.         curh = edge;
  759.         else
  760.         curh = edge - 10;
  761. #else
  762.         curh = edge - 10 ; 
  763. #endif
  764.         goto lab15 ; 
  765.       }
  766.     }
  767.     goto lab13 ; 
  768.       }
  769.       break ; 
  770. #ifdef TEXXET
  771.     case kernnode : 
  772.       curh += width ( p ) ;
  773.       break ; 
  774.     case mathnode : 
  775.       /* 1387. Adjust the LR stack ... */
  776.       if( end_LR(p) ) {
  777.     if( info(LR_ptr) != subtype(p) )
  778.       confusion("LR");
  779.     pop_LR;
  780.     ztype(p) = kernnode;
  781.       } else {
  782.     push_LR(p);
  783.     ztype(p) = kernnode;
  784.     if( LR_dir(p) != cur_dir ) {
  785.       /* 1391. Reverse the hlist segment ... */
  786.       scaled saveh;
  787.  
  788.       saveh = curh;
  789.       tempptr = link(p);  rulewd = width(p);
  790.       freenode(p, smallnodesize);
  791.       cur_dir = reflected;
  792.       p = new_edge(cur_dir, rulewd);
  793.       link(prev_p) = p;
  794.       curh = curh - leftedge + rulewd;
  795.       link(p) = reverse(thisbox, new_edge(reflected, 0));
  796.       edge_dist(p) = curh;
  797.       cur_dir = reflected;
  798.       curh = saveh;
  799.  
  800.       goto lab21 /*reswitch*/;
  801.     }
  802.     ztype(p) = kernnode;
  803.       }
  804.       curh += width ( p ) ;
  805.       break ; 
  806. #else
  807.     case kernnode : 
  808.     case mathnode : 
  809.       curh += width ( p ) ;
  810.       break ; 
  811. #endif
  812.     case ligaturenode : 
  813.       {
  814.     mem [ ligtrick ] = mem [ ligchar ( p ) ] ; 
  815.     link ( ligtrick ) = link ( p ) ; 
  816.     p = ligtrick ;
  817.     goto lab21 ;
  818.       }
  819.       break ; 
  820.     default: 
  821.       break ;
  822.     }
  823.     goto lab15 ;
  824.  
  825. lab14:
  826.     if ( isrunning ( ruleht ) )
  827.       ruleht = height ( thisbox ) ;
  828.     if ( isrunning ( ruledp ) )
  829.       ruledp = depth ( thisbox ) ;
  830.     ruleht += ruledp ;
  831.     if ( ( ruleht > 0 ) && ( rulewd > 0 ) ) {
  832.       synch_h;  curv = baseline + ruledp ;  synch_v;
  833.  
  834.       dviout ( setrule ) ;
  835.       dvifour ( ruleht ) ;
  836.       dvifour ( rulewd ) ;
  837.       curv = baseline ;
  838.       dvih += rulewd ;
  839.     }
  840. lab13:
  841.     curh += rulewd ;
  842. lab15:
  843. #ifdef TEXXET
  844.     prev_p = p;
  845. #endif
  846.     p = link(p);
  847.   }
  848.   prunemovements ( saveloc ) ;
  849.   if ( curs > 0 )
  850.     dvipop ( saveloc ) ;
  851.   decr ( curs ) ;
  852. #undef dvibuf
  853. }
  854.  
  855.  
  856.   static
  857. void vlistout ( halfword thisbox )
  858. {/* 13 14 15 */ vlistout_regmem 
  859.   register scaled leftedge  ; 
  860.   register scaled topedge  ; 
  861. /* register scaled saveh, savev  ; */
  862. /* register halfword thisbox  ; */
  863.   register glueord gorder  ; 
  864.   register integer gsign  ; 
  865.   register halfword p  ; 
  866.   register integer saveloc  ; 
  867.   register halfword leaderbox  ; 
  868.   register scaled leaderht  ; 
  869. /* register scaled lx  ; */
  870. /* boolean outerdoingleaders  ; */
  871.   register scaled edge  ;
  872.  
  873.   /* thisbox = tempptr ; */
  874.   gorder = glueorder ( thisbox ) ; 
  875.   gsign = gluesign ( thisbox ) ; 
  876.   p = listptr ( thisbox ) ; 
  877.   incr ( curs ) ; 
  878.   if ( curs > 0 ) 
  879.     dviout ( push ) ; 
  880.   if ( curs > maxpush ) 
  881.     maxpush = curs ; 
  882.   saveloc = dvioffset + dviptr ; 
  883.   leftedge = curh ; 
  884.   curv = curv - height ( thisbox ) ; 
  885.   topedge = curv ; 
  886.   while ( p != 0 ) {
  887.     if ( ischarnode ( p ) ) 
  888.       confusion("vlistout");
  889.     else {
  890.       switch ( ztype ( p ) ) 
  891.       {case hlistnode : 
  892.       case vlistnode : 
  893. #ifdef TEXXET
  894.       case R_node:
  895. #endif
  896.     if ( listptr ( p ) == 0 ) 
  897.       curv = curv + height ( p ) + depth ( p ) ; 
  898.     else {
  899.       scaled saveh, savev;
  900.  
  901.       curv = curv + height ( p ) ; 
  902.  
  903.       synch_v;
  904.  
  905.       saveh = dvih ; 
  906.       savev = dviv ;
  907. #ifdef TEXXET
  908.       if( cur_dir == right_to_left )
  909.         curh = leftedge - shiftamount(p);
  910.       else
  911.         curh = leftedge + shiftamount(p);
  912. #else
  913.       curh = leftedge + shiftamount(p);
  914. #endif
  915.       /* tempptr = p ; */
  916.       if ( ztype ( p ) == vlistnode ) 
  917.         vlistout ( p ) ; 
  918.       else hlistout ( p ) ; 
  919.       dvih = saveh ; 
  920.       dviv = savev ; 
  921.       curv = savev + depth ( p ) ; 
  922.       curh = leftedge ; 
  923.     }
  924.     break ; 
  925.       case rulenode :
  926.     {
  927.       ruleht = height ( p ) ; 
  928.       /* ruledp = depth ( p ) ; */
  929.       ruleht += depth ( p );
  930.       rulewd = width ( p ) ; 
  931.       goto lab14 ; 
  932.     } 
  933.     break ; 
  934.       case whatsitnode : 
  935.     outwhat ( p ) ; 
  936.     break ; 
  937.       case gluenode : 
  938.     { { halfword g;
  939.  
  940.       g = glueptr ( p ) ; 
  941.       ruleht = width ( g ) ; 
  942.       if ( gsign != normal ) {
  943.         if ( gsign == stretching ) {
  944.           if ( stretchorder ( g ) == gorder ) 
  945.           ruleht = ruleht + round ( glueset ( thisbox ) * stretch ( g ) );
  946.         } else {
  947.           if ( shrinkorder ( g ) == gorder ) 
  948.           ruleht = ruleht - round ( glueset ( thisbox ) * shrink ( g ) ) ; 
  949.         } 
  950.       }
  951.       }
  952.       if ( subtype ( p ) >= aleaders ) {
  953.         leaderbox = leaderptr ( p ) ; 
  954.         if ( ztype ( leaderbox ) == rulenode ) {
  955.           rulewd = width ( leaderbox ) ; 
  956.           /* ruledp = 0 ; */
  957.           goto lab14 ; 
  958.         } 
  959.         leaderht = height ( leaderbox ) + depth ( leaderbox ) ; 
  960.         if ( ( leaderht > 0 ) && ( ruleht > 0 ) ) {
  961.           scaled lx;
  962.           scaled saveh, savev;
  963.           boolean outerdoingleaders;
  964.  
  965.           ruleht = ruleht + 10 ; 
  966.           edge = curv + ruleht ; 
  967.           lx = 0 ; 
  968.           if ( subtype ( p ) == aleaders ) {
  969.         savev = curv ; 
  970.         curv = topedge + leaderht * ( ( curv - topedge ) / leaderht );
  971.         if ( curv < savev ) 
  972.         curv = curv + leaderht ; 
  973.           } else {
  974.         integer lq, lr;
  975.  
  976.         lq = ruleht / leaderht ; 
  977.         lr = ruleht % leaderht ; 
  978.         if ( subtype ( p ) == cleaders ) 
  979.           curv = curv + ( lr / 2 ) ; 
  980.         else {
  981.           lx = ( 2 * lr + lq + 1 ) / ( 2 * lq + 2 ) ; 
  982.           curv = curv + ( ( lr - ( lq - 1 ) * lx ) / 2 ) ; 
  983.         } 
  984.           } 
  985.           while ( curv + leaderht <= edge ) {
  986.         curh = leftedge + shiftamount ( leaderbox ) ; 
  987.         synch_h;  saveh = dvih ;
  988.         curv = curv + height ( leaderbox ) ; 
  989.         synch_v;  savev = dviv ; 
  990.         /* tempptr = leaderbox ; */
  991.         outerdoingleaders = doingleaders ; 
  992.         doingleaders = true ; 
  993.         if ( ztype ( leaderbox ) == vlistnode ) 
  994.           vlistout ( leaderbox ) ; 
  995.         else hlistout ( leaderbox ) ; 
  996.         doingleaders = outerdoingleaders ; 
  997.         dviv = savev ; 
  998.         dvih = saveh ; 
  999. #if 0  /* 3.1415 */
  1000.         curh = saveh ; 
  1001. #else
  1002.         curh = leftedge ; 
  1003. #endif
  1004.         curv = savev - height ( leaderbox ) + leaderht + lx ; 
  1005.           }
  1006.           curv = edge - 10 ; 
  1007.           goto lab15 ; 
  1008.         }
  1009.       } 
  1010.       goto lab13 ; 
  1011.     } 
  1012.     break ; 
  1013.       case kernnode : 
  1014.     curv = curv + width ( p ) ; 
  1015.     break ; 
  1016.       default: 
  1017.     break ; 
  1018.       } 
  1019.       goto lab15 ; 
  1020.  
  1021. lab14:
  1022.       if ( isrunning ( rulewd ) ) 
  1023.     rulewd = width ( thisbox ) ; 
  1024.       /* ruleht = ruleht + ruledp ; */
  1025.       curv = curv + ruleht ; 
  1026.       if ( ( ruleht > 0 ) && ( rulewd > 0 ) ) {
  1027. #ifdef TEXXET
  1028.     if( cur_dir == right_to_left )
  1029.       curh -= rulewd;
  1030. #endif
  1031.  
  1032.     synch_h;  synch_v;
  1033.  
  1034.     dviout ( putrule ) ; 
  1035.     dvifour ( ruleht ) ; 
  1036.     dvifour ( rulewd ) ; 
  1037. #ifdef TEXXET
  1038.     curh = leftedge;
  1039. #endif
  1040.       } 
  1041.       goto lab15 ;
  1042. lab13:
  1043.       curv = curv + ruleht ; 
  1044.     }
  1045. lab15:
  1046.     p = link ( p ) ; 
  1047.   } 
  1048.   prunemovements ( saveloc ) ; 
  1049.   if ( curs > 0 ) 
  1050.     dvipop ( saveloc ) ; 
  1051.   decr ( curs ) ; 
  1052. }
  1053.  
  1054.  
  1055. void shipout ( halfword p )
  1056. {/* 30 */ shipout_regmem 
  1057.   register integer pageloc  ; 
  1058.   register schar j, k  ; 
  1059.   register poolpointer s  ; 
  1060.   register integer oldsetting  ; 
  1061.  
  1062.   if ( tracingoutput > 0 ) {
  1063.     c_printnl("");
  1064.     println();
  1065.     c_print("Completed box being shipped out");
  1066.   } 
  1067.   if ( termoffset > maxprintline - 9 ) 
  1068.     println () ; 
  1069.   else if ( ( termoffset > 0 ) || ( fileoffset > 0 ) ) 
  1070.     printchar ( 32 ) ; 
  1071.   printchar ( 91 ) ; 
  1072.   j = 9 ; 
  1073.   while ( ( count ( j ) == 0 ) && ( j > 0 ) ) decr ( j ) ; 
  1074.   {register integer for_end; k = 0 ; for_end = j ; if ( k <= for_end) do 
  1075.     {
  1076.       printint ( count ( k ) ) ; 
  1077.       if ( k < j ) 
  1078.       printchar ( 46 ) ; 
  1079.     } 
  1080.   while ( k++ < for_end ) ; } 
  1081.   flush ( stdout ) ; 
  1082.   if ( tracingoutput > 0 ) {
  1083.     printchar ( 93 ) ; 
  1084. #ifdef MLTEX            /* no char_sub's defined print diag now */
  1085.     if( char_sub_def_max == 0 ) {    /* otherwise wait after shipbox */
  1086. #endif
  1087.       begindiagnostic () ; 
  1088.       showbox ( p ) ; 
  1089.       enddiagnostic ( true ) ;
  1090. #ifdef MLTEX
  1091.     }
  1092. #endif
  1093.   }
  1094.  
  1095. #ifdef TEXXET
  1096.   cur_dir = left_to_right; /* L-text at outer level */
  1097.   LR_ptr = getavail();  info(LR_ptr) = before; /* this will never match */
  1098. #endif
  1099.  
  1100.   if ( ( height ( p ) > maxdimen ) || ( depth ( p ) > maxdimen )
  1101.     || ( height ( p ) + depth ( p ) + voffset > maxdimen )
  1102.     || ( width ( p ) + hoffset > maxdimen ) )
  1103.   {
  1104.     print_err("Huge page cannot be shipped out");
  1105.     zhelp1( STR_H_THE_PAGE_JUST );
  1106.     error();
  1107.     if ( tracingoutput <= 0 ) {
  1108.       begindiagnostic () ; 
  1109.       c_printnl("The following box has been deleted:");
  1110.       showbox ( p ) ; 
  1111.       enddiagnostic ( true ) ; 
  1112.     } 
  1113.     goto lab30 ; 
  1114.   } 
  1115.   if ( height ( p ) + depth ( p ) + voffset > maxv ) 
  1116.     maxv = height ( p ) + depth ( p ) + voffset ; 
  1117.   if ( width ( p ) + hoffset > maxh ) 
  1118.     maxh = width ( p ) + hoffset ; 
  1119.   dvih = 0 ; 
  1120.   dviv = 0 ; 
  1121.   curh = hoffset ; 
  1122.   dvif = nullfont ; 
  1123.   if ( outputfilename == 0 ) {
  1124.     if ( jobname == 0 ) 
  1125.       openlogfile () ; 
  1126.     packjobname ( STR_DOT_DVI );
  1127.     while ( ! bopenout ( dvifile ) )
  1128.       promptfilename("file name for output", STR_DOT_DVI);
  1129.     outputfilename = bmakenamestring ( dvifile ) ; 
  1130.   } 
  1131.   if ( totalpages == 0 ) {
  1132.     dviout ( pre ) ; 
  1133.     dviout ( idbyte ) ; 
  1134.     dvifour ( 25400000L ) ; 
  1135.     dvifour ( 473628672L ) ; 
  1136.     preparemag();
  1137.     dvifour ( mag );
  1138.  
  1139.     oldsetting = selector;
  1140.     selector = newstring;
  1141. #if 1
  1142.     /* Fuer TripTest ist es ohne die Aenderung etwas einfacher, die dvi-files
  1143.      * zu vergleichen.
  1144.      */
  1145.     c_print(" TeX output ");
  1146. #else
  1147.  
  1148. #ifdef atarist
  1149.     c_print(" br-TeX output ");
  1150. #else
  1151. # ifdef AMIGA
  1152.     c_print(" Pas-TeX output ");
  1153. # else
  1154.     c_print(" TeX output ");
  1155. # endif
  1156. #endif
  1157.  
  1158. #endif
  1159.     printint ( zyear );
  1160.     printchar ( 46 ) ; 
  1161.     printtwo ( zmonth ) ; 
  1162.     printchar ( 46 ) ; 
  1163.     printtwo ( zday ) ; 
  1164.     printchar ( 58 ) ; 
  1165.     printtwo ( ztime / 60 ) ; 
  1166.     printtwo ( ztime % 60 ) ; 
  1167.     selector = oldsetting ; 
  1168.  
  1169.     dviout ( curlength ) ; 
  1170.     {register integer for_end; s = strstart [ strptr ] ; for_end = poolptr - 
  1171.     1 ; if ( s <= for_end) do 
  1172.       dviout ( strpool [ s ] ) ; 
  1173.     while ( s++ < for_end ) ; } 
  1174.     poolptr = strstart [ strptr ] ; 
  1175.   } 
  1176.   pageloc = dvioffset + dviptr ; 
  1177.   dviout ( bop ) ; 
  1178.   {register integer for_end; k = 0 ; for_end = 9 ; if ( k <= for_end) do 
  1179.     dvifour ( count ( k ) ) ; 
  1180.   while ( k++ < for_end ) ; } 
  1181.   dvifour ( lastbop ) ; 
  1182.   lastbop = pageloc ; 
  1183.   curv = height ( p ) + voffset ; 
  1184.   /* tempptr = p ; */
  1185.   if ( ztype ( p ) == vlistnode ) 
  1186.     vlistout ( p ) ; 
  1187.   else
  1188.     hlistout ( p ) ; 
  1189.   dviout ( eop ) ; 
  1190.   incr ( totalpages ) ; 
  1191.   curs = -1 ; 
  1192.  
  1193. lab30:
  1194. #ifdef TEXXET
  1195.   if( info(LR_ptr) != before )
  1196.     confusion("LR");
  1197.  
  1198.   freeavail(LR_ptr);  LR_ptr = 0;
  1199. #endif
  1200.  
  1201. #ifdef MLTEX        /* char_sub's not effected until ship out */
  1202.   if( tracingoutput > 0 && char_sub_def_max > 0 ) {
  1203.     begindiagnostic();
  1204.     showbox( p );
  1205.     enddiagnostic( true ); 
  1206.   }
  1207. #endif
  1208.  
  1209.   if ( tracingoutput <= 0 ) 
  1210.     printchar( 93 );
  1211.   deadcycles = 0;
  1212.   flush ( stdout );
  1213.  
  1214.   /* 639. */
  1215. #ifdef STAT
  1216.   if ( tracingstats > 1 ) {
  1217.     c_printnl("Memory usage before: ");
  1218.     printint( varused );  printchar( 38 );
  1219.     printint( dynused );  printchar( 59 );
  1220.   }
  1221. #endif /* STAT */
  1222.   flushnodelist ( p );
  1223.  
  1224. #ifdef STAT
  1225.   if ( tracingstats > 1 ) {
  1226.     c_print(" after: ");
  1227.     printint( varused );
  1228.     printchar( 38 );
  1229.     printint( dynused );
  1230.     c_print("; still untouched: ");
  1231.     printint( himemmin - lomemmax - 1 );
  1232.     println();
  1233.   }
  1234. #endif /* STAT */
  1235. }
  1236.  
  1237.  
  1238. void closefilesandterminate ( void )
  1239. { closefilesandterminate_regmem 
  1240.   register integer k  ; 
  1241.  
  1242.   for( k = 0 ; k <= 15 ; k++ ) {
  1243.     if ( writeopen [ k ] )
  1244.       aclose ( writefile [ k ] ) ;
  1245.   }
  1246. #ifdef STAT
  1247.   if ( tracingstats > 0 ) 
  1248.   if ( logopened ) {
  1249.     (void) fprintf(logfile, "\n\
  1250. Here is how much of TeX's memory you used:\n\
  1251.  %ld string%s out of %ld\n\
  1252.  %ld string characters out of %ld\n\
  1253.  %ld words of memory out of %ld\n",
  1254.     (long)strptr - initstrptr,
  1255.     (strptr != initstrptr + 1) ? "s" : "",
  1256.     (long)maxstrings - initstrptr,
  1257.  
  1258.     (long)poolptr - initpoolptr,
  1259.     (long)poolsize - initpoolptr,
  1260.  
  1261.     (long)lomemmax - memmin + memend - himemmin + 2,
  1262.     (long)memend + 1 - memmin );
  1263.  
  1264.     (void) fprintf(logfile, "\
  1265.  %ld multiletter control sequences out of %ld\n\
  1266.  %ld words of font info for %ld font%s, out of %ld for %ld\n",
  1267.     (long)cscount,
  1268.     (long)hashsize,
  1269.  
  1270.     (long)fmemptr,
  1271.     (long)fontptr - 0,
  1272.     ( fontptr != 1 ) ? "s" : "",
  1273.     (long)fontmemsize,
  1274.     (long)fontmax - 0 );
  1275.  
  1276.     (void) fprintf(logfile, "\
  1277.  %ld hyphenation exception%s out of %ld\n\
  1278.  %ldi,%ldn,%ldp,%ldb,%lds stack positions out of %ldi,%ldn,%ldp,%ldb,%lds\n",
  1279.     (long)hyphcount,
  1280.     ( hyphcount != 1 ) ? "s" : "",
  1281.     (long)hyphsize,
  1282.  
  1283.     (long)maxinstack, (long)maxneststack, (long)maxparamstack,
  1284.     (long)maxbufstack + 1, (long)maxsavestack + 6,
  1285.     (long)stacksize, (long)nestsize, (long)paramsize,
  1286.     (long)bufsize, (long)savesize );
  1287.   }
  1288.  
  1289. #endif /* STAT */
  1290.   wakeupterminal () ; 
  1291.   while ( curs > -1 ) {
  1292.     if ( curs > 0 ) 
  1293.       dviout ( pop ) ; 
  1294.     else {
  1295.       dviout ( eop ) ; 
  1296.       incr ( totalpages ) ; 
  1297.     } 
  1298.     decr ( curs ) ; 
  1299.   } 
  1300.   if ( totalpages == 0 ) 
  1301.     c_printnl("No pages of output.");
  1302.   else {
  1303.     dviout ( post ) ; 
  1304.     dvifour ( lastbop ) ; 
  1305.     lastbop = dvioffset + dviptr - 5 ; 
  1306.     dvifour ( 25400000L ) ; 
  1307.     dvifour ( 473628672L ) ; 
  1308.     preparemag () ; 
  1309.     dvifour ( mag ) ; 
  1310.     dvifour ( maxv ) ; 
  1311.     dvifour ( maxh ) ; 
  1312.     dviout ( maxpush / 256 ) ; 
  1313.     dviout ( maxpush % 256 ) ;
  1314.     dviout ( (totalpages / 256) % 256 ) ;    /* TeX 3.14 2.update */
  1315.     dviout ( totalpages % 256 ) ; 
  1316.     while ( fontptr > 0 ) {
  1317.       if ( fontused(fontptr) ) 
  1318.     dvifontdef ( fontptr ) ; 
  1319.       decr ( fontptr ) ; 
  1320.     }
  1321.     dviout ( postpost ) ; 
  1322.     dvifour ( lastbop ) ; 
  1323.     dviout ( idbyte ) ; 
  1324.     k = 4 + ( ( dvibufsize - dviptr ) % 4 ) ; 
  1325.     while ( k > 0 ) {
  1326.       dviout ( 223 ) ; 
  1327.       decr ( k ) ; 
  1328.     }
  1329.     if ( dvilimit == halfbuf ) 
  1330.       writedvi ( halfbuf , dvibufsize - 1 ) ; 
  1331.     if ( dviptr > 0 ) 
  1332.       writedvi ( 0 , dviptr - 1 ) ; 
  1333.     c_printnl("Output written on ");
  1334.     slowprint ( outputfilename );  /* TeX 3.141 */
  1335.     c_print(" (");
  1336.     printint ( totalpages );
  1337.     c_print(" page");
  1338.     if ( totalpages != 1 )
  1339.       printchar ( 115 );
  1340.     c_print(", ");
  1341.     printint ( dvioffset + dviptr ) ; 
  1342.     c_print(" bytes).");
  1343.     bclose ( dvifile ) ; 
  1344.   }
  1345.   if ( logopened ) {
  1346.     (void) putc('\n',  logfile );
  1347.     aclose ( logfile ) ; 
  1348.     selector = selector - 2 ; 
  1349.     if ( selector == termonly ) {
  1350.       c_printnl("Transcript written on ");
  1351.       slowprint ( logname ); /* TeX 3.141 */
  1352.       printchar ( 46 );
  1353.     }
  1354.   }
  1355.   println();
  1356.   if ( ( editnamestart != 0 ) && ( interaction > batchmode ) )
  1357.     calledit ( strpool , editnamestart , editnamelength , editline );
  1358. }
  1359.  
  1360. /* -- end -- */
  1361.