/* * This routine handles the PostScript prologs that might * be included through: * * - Default * - Use of PostScript fonts * - Specific inclusion through specials, etc. * - Use of graphic specials that require them. * * Things are real simple. We build a linked list of headers to * include. Then, when the time comes, we simply copy those * headers down. */ #include "dvips.h" /* The copyright notice in that file is included too! */ struct header_list *header_head ; /* * The external routines we use. */ #include "protos.h" extern char errbuf[] ; extern integer fontmem, swmem ; #ifndef KPATHSEA extern char *headerpath ; #endif extern char *infont ; extern int headersready ; #ifdef DEBUG extern integer debug_flag ; #endif #ifdef HPS extern Boolean noprocset ; extern Boolean HPS_FLAG ; #endif /* * This more general routine adds a name to a list of unique * names. */ int add_name P2C(char *, s, struct header_list **, what) { struct header_list *p, *q ; for (p = *what ; p != NULL; p = p->next) if (strcmp(p->name, s)==0) return 0 ; q = (struct header_list *)mymalloc((integer)(sizeof(struct header_list) + strlen(s))) ; q->Hname = infont ; q->next = NULL ; strcpy(q->name, s) ; if (*what == NULL) *what = q ; else { for (p = *what; p->next != NULL; p = p->next) ; p->next = q ; } return 1 ; } /* * This function checks the virtual memory usage of a header file. * If we can find a VMusage comment, we use that; otherwise, we use * length of the file. */ void checkhmem P1C(char *, s) { FILE *f = search(headerpath, s, READBIN) ; if (f==0) { (void)sprintf(errbuf, "! Couldn't find header file %s", s) ; error(errbuf) ; } else { int len, i, j ; long mem = -1 ; char buf[1024] ; len = fread(buf, sizeof(char), 1024, f) ; for (i=0; i 0) { mem += len ; len = fread(buf, sizeof(char), 1024, f) ; } } if (mem < 0) mem = DNFONTCOST ; (*close_file) (f) ; #ifdef DEBUG if (dd(D_HEADER)) (void)fprintf(stderr, "Adding header file \"%s\" %ld\n", s, mem) ; #endif fontmem -= mem ; if (fontmem > 0) /* so we don't count it twice. */ swmem -= mem ; } } /* * This routine is responsible for adding a header file. We also * calculate the VM usage. If we can find a VMusage comment, we * use that; otherwise, we use the length of the file. */ int add_header P1C(char *, s) { int r ; r = add_name(s, &header_head) ; if (r) { if (headersready == 1) { struct header_list *p = header_head ; while (p) { checkhmem(p->name) ; p = p->next ; } headersready = 2 ; } else if (headersready == 2) { checkhmem(s) ; } } return r ; } /* * This routine runs down a list, returning each in order. */ char * get_name P1C(struct header_list **, what) { if (what && *what) { char *p = (*what)->name ; infont = (*what)->Hname ; *what = (*what)->next ; return p ; } else return 0 ; } /* * This routine actually sends the headers. */ void send_headers P1H(void) { struct header_list *p = header_head ; char *q ; while (0 != (q=get_name(&p))) { #ifdef DEBUG if (dd(D_HEADER)) (void)fprintf(stderr, "Sending header file \"%s\"\n", q) ; #endif #ifdef HPS if (HPS_FLAG) { if (strcmp(q,"target.dct")==0) noprocset = 1 ; } #endif copyfile(q) ; } infont = 0 ; }