home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / dvips / header.c < prev    next >
C/C++ Source or Header  |  1994-01-08  |  4KB  |  171 lines

  1. /*
  2.  *   This routine handles the PostScript prologs that might
  3.  *   be included through:
  4.  *
  5.  *      - Default
  6.  *      - Use of PostScript fonts
  7.  *      - Specific inclusion through specials, etc.
  8.  *      - Use of graphic specials that require them.
  9.  *
  10.  *   Things are real simple.  We build a linked list of headers to
  11.  *   include.  Then, when the time comes, we simply copy those
  12.  *   headers down.
  13.  */
  14. #include "dvips.h" /* The copyright notice in that file is included too! */
  15. struct header_list *header_head ;
  16. /*
  17.  *   The external routines we use.
  18.  */
  19. #ifdef AMIGA
  20. #include "header_protos.h"
  21. #include "dvips_protos.h"
  22. #include "output_protos.h"
  23. #include "search_protos.h"
  24. #else
  25. extern char *newstring() ;
  26. extern void error() ;
  27. extern void copyfile() ;
  28. extern FILE *search() ;
  29. #endif /* AMIGA */
  30. extern long lastheadermem ;
  31. extern char errbuf[] ;
  32. extern integer fontmem, swmem ;
  33. extern char *headerpath ;
  34. extern char *infont ;
  35. extern int headersready ;
  36. #ifdef DEBUG
  37. extern integer debug_flag ;
  38. #endif
  39. /*
  40.  *   This more general routine adds a name to a list of unique
  41.  *   names.
  42.  */
  43. int
  44. add_name(s, what)
  45.    char *s ;
  46.    struct header_list **what ;
  47. {
  48.    struct header_list *p, *q ;
  49.  
  50.    for (p = *what ; p != NULL; p = p->next)
  51.       if (strcmp(p->name, s)==0)
  52.          return 0 ;
  53.    q = (struct header_list *)mymalloc((integer)(sizeof(struct header_list)
  54.                                           + strlen(s))) ;
  55.    q->Hname = infont ;
  56.    q->next = NULL ;
  57.    strcpy(q->name, s) ;
  58.    if (*what == NULL)
  59.       *what = q ;
  60.    else {
  61.       for (p = *what; p->next != NULL; p = p->next) ;
  62.       p->next = q ;
  63.    }
  64.    return 1 ;
  65. }
  66. /*
  67.  *   This function checks the virtual memory usage of a header file.
  68.  *   If we can find a VMusage comment, we use that; otherwise, we use
  69.  *   length of the file.
  70.  */
  71. void checkhmem(s)
  72. char *s ;
  73. {
  74.    FILE *f = search(headerpath, s, READ) ;
  75.  
  76.    if (f==0) {
  77.       (void)sprintf(errbuf, "! Couldn't find header file %s", s) ;
  78.       error(errbuf) ;
  79.    } else {
  80.       int len, i, j ;
  81.       long mem = -1 ;
  82.       char buf[1024] ;
  83.  
  84.       len = fread(buf, sizeof(char), 1024, f) ;
  85.       for (i=0; i<len-20; i++)
  86.          if (buf[i]=='%' && strncmp(buf+i, "%%VMusage:", 10)==0) {
  87.             if (sscanf(buf+i+10, "%d %ld", &j, &mem) != 2)
  88.                mem = -1 ;
  89.             break ;
  90.          }
  91.       if (mem == -1) {
  92.          mem = 0 ;
  93.          while (len > 0) {
  94.             mem += len ;
  95.             len = fread(buf, sizeof(char), 1024, f) ;
  96.          }
  97.       }
  98.       if (mem < 0)
  99.          mem = DNFONTCOST ;
  100.       fclose(f) ;
  101.       lastheadermem = mem ;
  102. #ifdef DEBUG
  103.       if (dd(D_HEADER))
  104.          (void)fprintf(stderr, "Adding header file \"%s\" %ld\n",
  105.                                 s, mem) ;
  106. #endif
  107.       fontmem -= mem ;
  108.       if (fontmem > 0) /* so we don't count it twice. */
  109.          swmem -= mem ;
  110.    }
  111. }
  112. /*
  113.  *   This routine is responsible for adding a header file.  We also
  114.  *   calculate the VM usage.  If we can find a VMusage comment, we
  115.  *   use that; otherwise, we use the length of the file.
  116.  */
  117. int
  118. add_header(s)
  119. char *s ;
  120. {
  121.    int r ;
  122.  
  123.    r = add_name(s, &header_head) ;
  124.    if (r) {
  125.       if (headersready == 1) {
  126.          struct header_list *p = header_head ;
  127.  
  128.          while (p) {
  129.             checkhmem(p->name) ;
  130.             p = p->next ;
  131.          }
  132.          headersready = 2 ;
  133.       } else if (headersready == 2) {
  134.          checkhmem(s) ;
  135.       }
  136.    }
  137.    return r ;
  138. }
  139. /*
  140.  *   This routine runs down a list, returning each in order.
  141.  */
  142. char *
  143. get_name(what)
  144.    struct header_list **what ;
  145. {
  146.    if (what && *what) {
  147.       char *p = (*what)->name ;
  148.       infont = (*what)->Hname ;
  149.       *what =  (*what)->next ;
  150.       return p ;
  151.    } else
  152.       return 0 ;
  153. }
  154. /*
  155.  *   This routine actually sends the headers.
  156.  */
  157. void
  158. send_headers() {
  159.    struct header_list *p = header_head ;
  160.    char *q ;
  161.  
  162.    while (0 != (q=get_name(&p))) {
  163. #ifdef DEBUG
  164.       if (dd(D_HEADER))
  165.          (void)fprintf(stderr, "Sending header file \"%s\"\n", q) ;
  166. #endif
  167.       copyfile(q) ;
  168.    }
  169.    infont = 0 ;
  170. }
  171.