home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / d / dvips549.zip / DVIPS / DOSECTIO.C < prev    next >
C/C++ Source or Header  |  1992-10-14  |  5KB  |  173 lines

  1. /*
  2.  *  Code to output PostScript commands for one section of the document.
  3.  */
  4. #include "structures.h" /* The copyright notice in that file is included too! */
  5. /*
  6.  *   These are the external routines we call.
  7.  */
  8. extern void dopage() ;
  9. extern void download() ;
  10. extern integer signedquad() ;
  11. extern void skipover() ;
  12. extern void cmdout() ;
  13. extern void numout() ;
  14. extern void newline() ;
  15. extern void setup() ;
  16. extern void skipover() ;
  17. extern int skipnop() ;
  18. /*
  19.  *   These are the external variables we access.
  20.  */
  21. extern shalfword linepos ;
  22. extern FILE *dvifile ;
  23. extern FILE *bitfile ;
  24. extern integer pagenum ;
  25. extern long bytesleft ;
  26. extern quarterword *raster ;
  27. extern int quiet ;
  28. extern Boolean reverse, multiplesects, disablecomments ;
  29. extern int actualdpi ;
  30. extern int vactualdpi ;
  31. extern int prettycolumn ;
  32. extern integer hpapersize, vpapersize ;
  33. extern integer pagecopies ;
  34. static int psfont ;
  35. extern integer mag ;
  36. extern char *fulliname ;
  37. /*
  38.  *   Now we have the main procedure.
  39.  */
  40. void
  41. dosection(s, c)
  42.         sectiontype *s ;
  43.         int c ;
  44. {
  45.    charusetype *cu ;
  46.    integer prevptr ;
  47.    int np ;
  48.    int k ;
  49.    integer thispage = 0 ;
  50.    char buf[104];
  51.    extern void cleanres() ;
  52.  
  53.    if (multiplesects) {
  54.       setup() ;
  55.    } else {
  56.       cmdout("TeXDict") ;
  57.       cmdout("begin") ;
  58.    }
  59.    numout(hpapersize) ;
  60.    numout(vpapersize) ;
  61.    numout(mag) ;
  62.    numout((integer)DPI) ;
  63.    numout((integer)VDPI) ;
  64.    sprintf(buf, "(%.99s)", fulliname) ;
  65.    cmdout(buf) ;
  66.    cmdout("@start") ;
  67.    if (multiplesects)
  68.       cmdout("bos") ;
  69. /*
  70.  *   We insure raster is even-word aligned, because download might want that.
  71.  */
  72.    if (bytesleft & 1) {
  73.       bytesleft-- ;
  74.       raster++ ;
  75.    }
  76.    cleanres() ;
  77.    cu = (charusetype *) (s + 1) ;
  78.    psfont = 1 ;
  79.    while (cu->fd) {
  80.       if (cu->psfused)
  81.          cu->fd->psflag = EXISTS ;
  82.       download(cu++, psfont++) ;
  83.    }
  84.    if (! multiplesects) {
  85.       cmdout("end") ;
  86.       setup() ;
  87.    }
  88.    for (cu=(charusetype *)(s+1); cu->fd; cu++)
  89.       cu->fd->psflag = 0 ;
  90.    while (c > 0) {
  91.       c-- ;
  92.       prevptr = s->bos ;
  93.       if (! reverse)
  94.          (void)fseek(dvifile, (long)prevptr, 0) ;
  95.       np = s->numpages ;
  96.       while (np-- != 0) {
  97.          if (reverse)
  98.             (void)fseek(dvifile, (long)prevptr, 0) ;
  99.          pagenum = signedquad() ;
  100. /*
  101.  *   We want to take the base 10 log of the number.  It's probably
  102.  *   small, so we do it quick.
  103.  */
  104.          if (! quiet) {
  105.             int t = pagenum, i = 0 ;
  106.             if (t < 0) {
  107.                t = -t ;
  108.                i++ ;
  109.             }
  110.             do {
  111.                i++ ;
  112.                t /= 10 ;
  113.             } while (t > 0) ;
  114.             if (pagecopies < 20)
  115.                i += pagecopies - 1 ;
  116.             if (i + prettycolumn > STDOUTSIZE) {
  117.                fprintf(stderr, "\n") ;
  118.                prettycolumn = 0 ;
  119.             }
  120.             prettycolumn += i + 1 ;
  121. #ifdef SHORTINT
  122.             (void)fprintf(stderr, "[%ld", pagenum) ;
  123. #else  /* ~SHORTINT */
  124.             (void)fprintf(stderr, "[%d", pagenum) ;
  125. #endif /* ~SHORTINT */
  126.             (void)fflush(stderr) ;
  127.          }
  128.          skipover(36) ;
  129.          prevptr = signedquad()+1 ;
  130.          for (k=0; k<pagecopies; k++) {
  131.             if (k == 0) {
  132.                if (pagecopies > 1)
  133.                   thispage = ftell(dvifile) ;
  134.             } else {
  135.                (void)fseek(dvifile, (long)thispage, 0) ;
  136.                if (prettycolumn + 1 > STDOUTSIZE) {
  137.                   (void)fprintf(stderr, "\n") ;
  138.                   prettycolumn = 0 ;
  139.                }
  140.                (void)fprintf(stderr, ".") ;
  141.                (void)fflush(stderr) ;
  142.                prettycolumn++ ;
  143.             }
  144.             dopage() ;
  145.          }
  146.          if (! quiet) {
  147.             (void)fprintf(stderr, "] ") ;
  148.             (void)fflush(stderr) ;
  149.             prettycolumn += 2 ;
  150.          }
  151.          if (! reverse)
  152.             (void)skipnop() ;
  153.       }
  154.    }
  155.    if (! multiplesects && ! disablecomments) {
  156.       newline() ;
  157.       (void)fprintf(bitfile, "%%%%Trailer\n") ;
  158.    }
  159.    if (multiplesects) {
  160.       if (! disablecomments) {
  161.          newline() ;
  162.          (void)fprintf(bitfile, "%%DVIPSSectionTrailer\n") ;
  163.       }
  164.       cmdout("eos") ;
  165.    }
  166.    cmdout("end") ;
  167.    if (multiplesects && ! disablecomments) {
  168.       newline() ;
  169.       (void)fprintf(bitfile, "%%DVIPSEndSection\n") ;
  170.       linepos = 0 ;
  171.    }
  172. }
  173.