void getnams (void) { register COLLECTION *c; char buf[STRINGLENGTH]; register FILE *f; char *p,*q; for (c = firstC; c && c->Chtree != NULL; c = c->Cnext); if (c == NULL) return; (void) sprintf (buf,FILEHOSTS,DEFDIR); f = fopen (buf,"r"); if (f == NULL) logquit (1,"Can't open %s",buf); while ((p = fgets (buf,STRINGLENGTH,f)) != NULL) { if ((q = strchr (p,'\n'))) *q = '\0'; if (strchr ("#;:",*p)) continue; q = (char *)nxtarg (&p,"= \t"); p = (char *)skipover (p," \t"); if (*p == '=') p++; p = (char *)skipover (p," \t"); if (*p == '\0') goaway ("error in collection/host file"); do { if (strcmp (c->Cname, q) == 0) { do { q = (char *)nxtarg (&p,", \t"); p = (char *)skipover (p," \t"); if (*p == ',') p++; p = (char *)skipover (p," \t"); (void) Tinsert (&c->Chtree,q,FALSE); } while (*p != '\0'); } while ((c = c->Cnext) != NULL && c->Chtree != NULL); } while (c != NULL); for (c = firstC; c && c->Chtree != NULL; c = c->Cnext); if (c == NULL) break; } (void) fclose (f); if (c == NULL) return; do { logerr ("Host for collection %s not found",c->Cname); while ((c = c->Cnext) != NULL && c->Chtree != NULL); } while (c); logquit (1,"Hosts not found for all collections"); }
ubyte *scan (int (*skipover) (int), int (*stopat) (int)) { int byte; do { byte = getchar(); if (byte == EOF) return NULL; } while (skipover (byte)); ubyte buffer[0x1000]; ubyte *end = buffer; do { *end++ = byte; assert (end < buffer + sizeof buffer); *end = '\0'; byte = getchar(); }while (byte != EOF && ! stopat (byte)); ubyte *result = (ubyte *) strdup ((char *) buffer); assert (result != NULL); return result; }
/* * tokenize -- a version of the standard strtok with specific behavior. */ static char * tokenize(char *line) { static char *p = NULL; static char saved = 0; char *q; if (line == NULL && p == NULL) { /* It's the very first time */ return (NULL); } else if (line != NULL) { /* Initialize with a new line */ q = skipb(line); } else { /* Restore previous line. */ *p = saved; q = skipb(p); } /* q is at the beginning of a token or at EOL, p is irrelevant. */ if (*q == '\0') { /* It's at EOL. */ p = q; } else if (in_specials(*q)) { /* We have a special-character token. */ p = q + 1; } else if (*q == '#') { /* The whole rest of the line is a comment token. */ return (NULL); } else { /* We have a word token. */ p = skipover(q); } saved = *p; *p = '\0'; if (p == q) { /* End of line */ return (NULL); } else { return (q); } }
void dopage P1H(void) { register shalfword cmd ; register integer p ; register chardesctype *cd ; register integer h ; register fontmaptype *cfnt ; register frametype *frp = frames ; integer fnt ; #ifdef Omega integer mychar; #endif int charmove ; struct dvistack *sp = stack ; integer v, w, x, y, z ; integer roundpos ; integer thinspace ; integer vertsmallspace ; #ifdef XENIX integer iconv ; integer viconv ; iconv = (integer)(1.0 / conv + 0.5) ; viconv = (integer)(1.0 / vconv + 0.5) ; #else #ifdef __THINK__ integer iconv ; integer viconv ; iconv = (integer)(1.0 / conv + 0.5) ; viconv = (integer)(1.0 / vconv + 0.5) ; #endif #endif #ifdef EMTEX emclear() ; #endif pageinit() ; bopcolor(1) ; thinspace = (integer)(0.025*DPI/conv) ; /* 0.025 inches */ vertsmallspace = (integer)(0.025*VDPI/vconv) ; /* 0.025 inches */ #ifdef HPS if (HPS_FLAG) pagecounter++ ; H_BREAK = (30 * DPI / 400 ) ; /* 30 seems to have worked well at 400 dpi */ #endif w = x = y = z = 0 ; h = (integer) (DPI / conv * hoff / 4736286.72) ; v = (integer) (DPI / conv * voff / 4736286.72) ; hh = PixRound(h) ; vv = PixRound(v) ; curfnt = NULL ; curpos = NULL ; charmove = 0 ; beginloop: switch (cmd=dvibyte()) { case 138: goto beginloop ; /* nop command does nuttin */ /* * For put1 commands, we subtract the width of the character before * dropping through to the normal character setting routines. This */ #ifdef Omega case 134: /* put2 */ mychar = dvibyte() ; mychar = (mychar << 8) + dvibyte() ; charmove = 0 ; goto dochar ; case 133: /* put1 */ mychar = dvibyte() ; charmove = 0 ; goto dochar ; case 129: /* set2 */ mychar = dvibyte() ; mychar = (mychar << 8) + dvibyte() ; charmove = 1 ; goto dochar ; case 128: /* set1 */ mychar = dvibyte() ; charmove = 1 ; goto dochar ; default: /* these are commands 0 (setchar0) thru 127 (setchar127) */ mychar = cmd ; charmove = 1 ; dochar: #else case 133: /* put1 */ cmd = dvibyte() ; charmove = 0 ; goto dochar ; case 128: cmd = dvibyte() ; /* set1 command drops through to setchar */ default: /* these are commands 0 (setchar0) thru 127 (setchar127) */ charmove = 1 ; dochar: #endif #ifdef HPS if (HPS_FLAG && PAGEUS_INTERUPPTUS) { HREF_COUNT-- ; start_new_box() ; PAGEUS_INTERUPPTUS = 0 ; } if (HPS_FLAG && NEED_NEW_BOX) { vertical_in_hps(); NEED_NEW_BOX = 0; } #endif #ifdef Omega cd = &(curfnt->chardesc[mychar]) ; #else cd = &(curfnt->chardesc[cmd]) ; #endif if (cd->flags & EXISTS) { if (curfnt->loaded == 2) { /* virtual character being typeset */ if (charmove) { sp->hh = hh + cd->pixelwidth ; sp->h = h + cd->TFMwidth ; } else { sp->hh = hh ; sp->h = h ; } sp->vv = vv ; sp-> v = v ; sp->w = w ; sp->x = x ; sp->y = y ; sp->z = z ; if (++sp >= &stack[STACKSIZE]) error("! Out of stack space") ; w = x = y = z = 0 ; /* will be in relative units at new stack level */ frp->curp = curpos ; frp->curl = curlim ; frp->ff = ffont ; frp->curf = curfnt ; if (++frp == &frames[MAXFRAME] ) error("! virtual recursion stack overflow") ; curpos = cd->packptr + 2 ; curlim = curpos + (256*(long)(*cd->packptr)+(*(cd->packptr+1))) ; ffont = curfnt->localfonts ; if (ffont) { curfnt = ffont->desc ; thinspace = curfnt->thinspace ; } else { curfnt = NULL ; thinspace = vertsmallspace ; } goto beginloop ; } #ifdef Omega drawchar(cd, mychar) ; #else drawchar(cd, cmd) ; #endif } if (charmove) { h += cd->TFMwidth ; hh += cd->pixelwidth ; } goto setmotion ; #ifdef Omega case 130: case 131: case 135: case 136: case 139: #else case 129: case 130: case 131: case 134: case 135: case 136: case 139: #endif case 247: case 248: case 249: case 250: case 251: case 252: case 253: case 254: case 255: /* unimplemented or illegal commands */ error("! synch") ; case 132: case 137: /* rules */ { integer ry, rx , rxx, ryy ; ry = signedquad() ; rx = signedquad() ; if (rx>0 && ry>0) { if (curpos) { rx = scalewidth(rx, (frp-1)->curf->scaledsize) ; ry = scalewidth(ry, (frp-1)->curf->scaledsize) ; } rxx = (int)(conv * rx + 0.9999999) ; ryy = (int)(vconv * ry + 0.9999999) ; drawrule(rxx, ryy) ; } else rxx = 0 ; if (cmd == 137) goto beginloop ; h += rx ; hh += rxx ; goto setmotion ; } case 141: /* push */ #ifdef HPS if (HPS_FLAG) pushcount++ ; /* if (HPS_FLAG && PAGEUS_INTERUPPTUS) { HREF_COUNT-- ; start_new_box() ; PAGEUS_INTERUPPTUS = 0 ; } */ if (HPS_FLAG && NEED_NEW_BOX) { vertical_in_hps(); NEED_NEW_BOX = 0; } /* printf("push %i, %i\n", pushcount, inHTMLregion) ; */ #endif sp->hh = hh ; sp->vv = vv ; sp->h = h ; sp->v = v ; sp->w = w ; sp->x = x ; sp->y = y ; sp->z = z ; if (++sp >= &stack[STACKSIZE]) error("! Out of stack space") ; goto beginloop ; case 140: /* eop or end of virtual character */ if (curpos == NULL) { /* eop */ #ifdef HPS if (HPS_FLAG && inHTMLregion) PAGEUS_INTERUPPTUS = 1 ; /* printf("Page interrupted"); */ #endif break; } --frp ; curfnt = frp->curf ; thinspace = (curfnt) ? curfnt->thinspace : vertsmallspace ; ffont = frp->ff ; curlim = frp->curl ; curpos = frp->curp ; if (hh < (sp-1)->hh+2 && hh > (sp-1)->hh-2) (sp-1)->hh = hh; /* retain `intelligence' of pixel width, if close */ /* falls through */ case 142: /* pop */ #ifdef HPS pushcount-- ; /* printf("pop %i\n", pushcount) ; */ #endif if (--sp < stack) error("! More pops than pushes") ; #ifdef HPS if (HPS_FLAG) { hhmem = hh ; vvmem = vv ; } #endif hh = sp->hh ; vv = sp->vv ; h = sp->h ; v = sp->v ; w = sp->w ; x = sp->x ; y = sp->y ; z = sp->z ; #ifdef HPS if (HPS_FLAG && inHTMLregion && (hhmem - hh > H_BREAK) && (pushcount > 0) && (pushcount < current_pushcount)) end_current_box() ; #endif goto beginloop ; case 143: /* right1 */ p = signedbyte() ; goto horizontalmotion ; case 144: /* right2 */ p = signedpair() ; goto horizontalmotion ; case 145: /* right3 */ p = signedtrio() ; goto horizontalmotion ; case 146: /* right4 */ p = signedquad() ; goto horizontalmotion ; case 147: /* w0 */ p = w ; goto horizontalmotion ; case 148: /* w1 */ p = w = signedbyte() ; goto horizontalmotion ; case 149: /* w2 */ p = w = signedpair() ; goto horizontalmotion ; case 150: /* w3 */ p = w = signedtrio() ; goto horizontalmotion ; case 151: /* w4 */ p = w = signedquad() ; goto horizontalmotion ; case 152: /* x0 */ p = x ; goto horizontalmotion ; case 153: /* x1 */ p = x = signedbyte() ; goto horizontalmotion ; case 154: /* x2 */ p = x = signedpair() ; goto horizontalmotion ; case 155: /* x3 */ p = x = signedtrio() ; goto horizontalmotion ; case 156: /* x4 */ p = x = signedquad() ; goto horizontalmotion ; case 157: /* down1 */ p = signedbyte() ; goto verticalmotion ; case 158: /* down2 */ p = signedpair() ; goto verticalmotion ; case 159: /* down3 */ p = signedtrio() ; goto verticalmotion ; case 160: /* down4 */ p = signedquad() ; goto verticalmotion ; case 161: /* y0 */ p = y ; goto verticalmotion ; case 162: /* y1 */ p = y = signedbyte() ; goto verticalmotion ; case 163: /* y2 */ p = y = signedpair() ; goto verticalmotion ; case 164: /* y3 */ p = y = signedtrio() ; goto verticalmotion ; case 165: /* y4 */ p = y = signedquad() ; goto verticalmotion ; case 166: /* z0 */ p = z ; goto verticalmotion ; case 167: /* z1 */ p = z = signedbyte() ; goto verticalmotion ; case 168: /* z2 */ p = z = signedpair() ; goto verticalmotion ; case 169: /* z3 */ p = z = signedtrio() ; goto verticalmotion ; case 170: /* z4 */ p = z = signedquad() ; goto verticalmotion ; case 171: case 172: case 173: case 174: case 175: case 176: case 177: case 178: case 179: case 180: case 181: case 182: case 183: case 184: case 185: case 186: case 187: case 188: case 189: case 190: case 191: case 192: case 193: case 194: case 195: case 196: case 197: case 198: case 199: case 200: case 201: case 202: case 203: case 204: case 205: case 206: case 207: case 208: case 209: case 210: case 211: case 212: case 213: case 214: case 215: case 216: case 217: case 218: case 219: case 220: case 221: case 222: case 223: case 224: case 225: case 226: case 227: case 228: case 229: case 230: case 231: case 232: case 233: case 234: case 235: case 236: case 237: case 238: /* font selection commands */ if (cmd < 235) fnt = cmd - 171 ; /* fntnum0 thru fntnum63 */ else { fnt = dvibyte() ; while (cmd-- > 235) fnt = (fnt << 8) + dvibyte() ; } if (curpos || fnt > 255) { for (cfnt=ffont; cfnt; cfnt = cfnt->next) if (cfnt->fontnum == fnt) break ; curfnt = cfnt->desc ; } else curfnt = baseFonts[fnt] ; thinspace = curfnt->thinspace ; goto beginloop ; case 243: case 244: case 245: case 246: /*fntdef1 */ skipover(cmd - 230) ; skipover(dvibyte() + dvibyte()) ; goto beginloop ; case 239: /* xxx1 */ p = dvibyte() ; dospecial(p) ; goto beginloop ; case 240: /* xxx2 */ p = twobytes() ; dospecial(p) ; goto beginloop ; case 241: /* xxx3 */ p = threebytes() ; dospecial(p) ; goto beginloop ; case 242: /* xxx4 */ p = signedquad() ; dospecial(p) ; goto beginloop ; /* * The calculations here are crucial to the appearance of the document. * If the motion is small, we round the amount of relative motion; otherwise, * we update the position and round the new position. Then we check to * insure that the rounded position didn't accumulate an error that was * greater than maxdrift. */ verticalmotion: /* vertical motion cases */ if (curpos) p = scalewidth(p, (frp-1)->curf->scaledsize) ; v += p ; if (p >= vertsmallspace) vv = VPixRound(v) ; else if (p <= -vertsmallspace) vv = VPixRound(v) ; else { vv += VPixRound(p) ; roundpos = VPixRound(v) ; if (roundpos - vv > vmaxdrift) vv = roundpos - vmaxdrift ; else if (vv - roundpos > vmaxdrift) vv = roundpos + vmaxdrift ; } #ifdef HPS /* printf("Doing vertical motion: p = %i, v = %i, vv = %i\n",p,v,vv); */ /* printf("inHTMLregion %i\n", inHTMLregion) ; */ if (HPS_FLAG && inHTMLregion) NEED_NEW_BOX = 1 /* vertical_in_hps() */; #endif goto beginloop ; /* * Horizontal motion is analogous. We know the exact width of each * character in pixels. Kerning is distinguished from space between * words if it's less than a thinspace and not more negative than would * occur when an accent is being positioned by backspacing. */ horizontalmotion: /* horizontal motion cases */ if (curpos) p = scalewidth(p, (frp-1)->curf->scaledsize) ; h += p ; if (p >= thinspace || p <= -6 * thinspace) { hh = PixRound(h) ; goto beginloop ; } else hh += PixRound(p) ; #ifdef HPS /* printf("Doing horizontal motion: p = %i, h = %i, hh = %i\n",p,h,hh); */ #endif setmotion: roundpos = PixRound(h) ; if (roundpos - hh > maxdrift) { hh = roundpos - maxdrift ; } else if (hh - roundpos > maxdrift) { hh = roundpos + maxdrift ; } goto beginloop ; } /* end of the big switch */ pageend() ; }
void pprescanpages(void) { register int cmd; integer lmaxpages = maxpages; integer mpagenum; integer pageseq = 0; int ntfirst = notfirst; pprescan = 1; readpreamble(); /* * Now we look for the first page to process. If we get to the end of * the file before the page, we complain (fatally). * Incidentally, we don't use the DVI file's bop backpointer to skip * over pages at high speed, because we want to look to for special * header that might be in skipped pages. */ while (1) { cmd = skipnop(); if (cmd==248) error("! End of document before first specified page"); if (cmd!=139) error("! Bad DVI file: expected bop"); pagenum = signedquad(); pageseq++; mpagenum = abspage ? pageseq : pagenum; if (mpagenum == firstpage && ntfirst) firstmatch++; if (mpagenum == lastpage && notlast) lastmatch++; if (ntfirst && mpagenum == firstpage && firstmatch == firstseq) ntfirst = 0; if (ntfirst || ((evenpages && (pagenum & 1)) || (oddpages && (pagenum & 1)==0) || (pagelist && !InPageList(pagenum)))) { skipover(40); skippage(); } else { if (notlast && mpagenum == lastpage) lastmatch--; break; } } /* * Here we scan for each of the sections. First we initialize some of * the variables we need. We don't have to be as smart as before in * skipping pages. */ skipover(40); while (lmaxpages > 0) { if (!(evenpages && (pagenum & 1)) && !(oddpages && (pagenum & 1)==0) && !(pagelist && !InPageList(pagenum))) { pscanpage(); lmaxpages--; } else skippage(); mpagenum = abspage ? pageseq : pagenum; if (mpagenum == lastpage && notlast) lastmatch++; if (notlast && mpagenum == lastpage && lastmatch == lastseq) lmaxpages = -1; /* we are done after this page. */ cmd=skipnop(); if (cmd==248) break; if (cmd!=139) error("! Bad DVI file: expected bop"); pagenum = signedquad(); skipover(40); pageseq++; } fseek(dvifile, 0L, 0); pprescan = 0; }
/* * And now the big routine. */ void skippage() { register shalfword cmd ; register integer i ; #ifdef DEBUG if (dd(D_PAGE)) #ifdef SHORTINT (void)fprintf(stderr,"Skipping page %ld\n", pagenum) ; #else /* ~SHORTINT */ (void)fprintf(stderr,"Skipping page %d\n", pagenum) ; #endif /* ~SHORTINT */ #endif /* DEBUG */ skipover(40) ; /* skip rest of bop command */ while ((cmd=dvibyte())!=140) { switch (cmd) { /* illegal options */ case 129: case 130: case 131: case 134: case 135: case 136: case 139: case 247: case 248: case 249: case 250: case 251: case 252: case 253: case 254: case 255: (void)sprintf(errbuf, #ifdef SHORTINT "! DVI file contains unexpected command (%ld)",cmd) ; #else /* ~SHORTINT */ "! DVI file contains unexpected command (%d)",cmd) ; #endif /* ~SHORTINT */ error(errbuf) ; /* eight byte commands */ case 132: case 137: cmd = dvibyte() ; cmd = dvibyte() ; cmd = dvibyte() ; cmd = dvibyte() ; /* four byte commands */ case 146: case 151: case 156: case 160: case 165: case 170: case 238: cmd = dvibyte() ; /* three byte commands */ case 145: case 150: case 155: case 159: case 164: case 169: case 237: cmd = dvibyte() ; /* two byte commands */ case 144: case 149: case 154: case 158: case 163: case 168: case 236: cmd = dvibyte() ; /* one byte commands */ case 128: case 133: case 143: case 148: case 153: case 157: case 162: case 167: case 235: cmd = dvibyte() ; break ; /* specials */ case 239: i = dvibyte() ; predospecial(i, 0) ; break ; case 240: i = twobytes() ; predospecial(i, 0) ; break ; case 241: i = threebytes() ; predospecial(i, 0) ; break ; case 242: i = signedquad() ; predospecial(i, 0) ; break ; /* font definition */ case 243: case 244: case 245: case 246: fontdef(cmd - 242) ; break ; default: ; } } }
/* * Now we have the main procedure. */ void dosection(sectiontype *s, int c) { charusetype *cu; integer prevptr; int np; int k; integer thispage = 0; char buf[104]; dopsfont(s); #ifdef HPS if (HPS_FLAG) pagecounter = 0; #endif if (multiplesects) { setup(); } cmdout("TeXDict"); cmdout("begin"); numout(hpapersize); numout(vpapersize); doubleout(mag); numout((integer)DPI); numout((integer)VDPI); snprintf(buf, sizeof(buf), "(%.99s)", fulliname); cmdout(buf); newline(); cmdout("@start"); if (multiplesects) cmdout("bos"); /* * We insure raster is even-word aligned, because download might want that. */ if (bytesleft & 1) { bytesleft--; raster++; } cleanres(); cu = (charusetype *) (s + 1); psfont = 1; while (cu->fd) { if (cu->psfused) cu->fd->psflag = EXISTS; download(cu++, psfont++); } fonttableout(); if (! multiplesects) { cmdout("end"); setup(); } for (cu=(charusetype *)(s+1); cu->fd; cu++) cu->fd->psflag = 0; while (c > 0) { c--; prevptr = s->bos; if (! reverse) fseek(dvifile, (long)prevptr, 0); np = s->numpages; while (np-- != 0) { if (reverse) fseek(dvifile, (long)prevptr, 0); pagenum = signedquad(); if ((evenpages && (pagenum & 1)) || (oddpages && (pagenum & 1)==0) || (pagelist && !InPageList(pagenum))) { if (reverse) { skipover(36); prevptr = signedquad()+1; } else { skipover(40); skippage(); skipnop(); } ++np; /* this page wasn't counted for s->numpages */ continue; } /* * We want to take the base 10 log of the number. It's probably * small, so we do it quick. */ if (! quiet) { int t = pagenum, i = 0; if (t < 0) { t = -t; i++; } do { i++; t /= 10; } while (t > 0); if (pagecopies < 20) i += pagecopies - 1; if (i + prettycolumn > STDOUTSIZE) { fprintf(stderr, "\n"); prettycolumn = 0; } prettycolumn += i + 1; #ifdef SHORTINT fprintf(stderr, "[%ld", pagenum); #else /* ~SHORTINT */ fprintf(stderr, "[%d", pagenum); #endif /* ~SHORTINT */ fflush(stderr); } skipover(36); prevptr = signedquad()+1; for (k=0; k<pagecopies; k++) { if (k == 0) { if (pagecopies > 1) thispage = ftell(dvifile); } else { fseek(dvifile, (long)thispage, 0); if (prettycolumn + 1 > STDOUTSIZE) { fprintf(stderr, "\n"); prettycolumn = 0; } fprintf(stderr, "."); fflush(stderr); prettycolumn++; } dopage(); } if (! quiet) { fprintf(stderr, "] "); fflush(stderr); prettycolumn += 2; } if (! reverse) skipnop(); } } if (! multiplesects && ! disablecomments) { newline(); fprintf(bitfile, "%%%%Trailer\n"); } if (multiplesects) { if (! disablecomments) { newline(); fprintf(bitfile, "%%DVIPSSectionTrailer\n"); } cmdout("eos"); cmdout("end"); } #ifdef HPS if (HPS_FLAG) cmdout("\nend"); /* close off HPSDict */ #endif if (multiplesects && ! disablecomments) { newline(); fprintf(bitfile, "%%DVIPSEndSection\n"); linepos = 0; } }
static SCAN_COLLECTION * getscancoll(char *filename, char *collname, char *basedir) { char buf[STRINGLENGTH], *p, *q; FILE *f; SCAN_COLLECTION *c; if (basedir == NULL) { if ((f = fopen(filename, "r")) != NULL) { while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; q = nxtarg(&p, " \t="); if (strcmp(q, collname) == 0) { p = skipover(p, " \t="); basedir = estrdup(p); break; } } (void) fclose(f); } if (basedir == NULL) { (void) sprintf(buf, FILEBASEDEFAULT, collname); basedir = estrdup(buf); } } if (chdir(basedir) < 0) { fprintf(stderr, "supscan: Can't chdir to base directory %s " "for %s (%s)\n", basedir, collname, strerror(errno)); return (NULL); } prefix = NULL; (void) sprintf(buf, FILEPREFIX, collname); if ((f = fopen(buf, "r")) != NULL) { while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; prefix = estrdup(p); if (chdir(prefix) < 0) { fprintf(stderr, "supscan: can't chdir to %s " " from base directory %s for %s (%s)\n", prefix, basedir, collname, strerror(errno)); fclose(f); free(prefix); return (NULL); } break; } (void) fclose(f); } if ((c = malloc(sizeof(*c))) == NULL) quit(1, "supscan: can't malloc collection structure\n"); c->Cname = collname; c->Cbase = basedir; c->Cprefix = prefix; c->Cnext = NULL; return (c); }
int init(int argc, char **argv) { char buf[STRINGLENGTH], fbuf[STRINGLENGTH], *p, *q; FILE *f; SCAN_COLLECTION **c; int fflag, sflag; char *filename = NULL; int errs = 0; quiet = FALSE; trace = FALSE; fflag = FALSE; sflag = FALSE; while (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { case 'f': fflag = TRUE; if (argc == 2) usage(); --argc; argv++; filename = argv[1]; break; case 'q': quiet = TRUE; break; case 'v': trace = TRUE; break; case 's': sflag = TRUE; break; default: fprintf(stderr, "supscan: Invalid flag %s ignored\n", argv[1]); (void) fflush(stderr); } --argc; argv++; } if (!fflag) { (void) sprintf(fbuf, FILEDIRS, DEFDIR); filename = fbuf; } if (sflag) { if (argc != 1) usage(); firstC = NULL; c = &firstC; (void) sprintf(buf, FILEHOSTS, DEFDIR); if ((f = fopen(buf, "r")) == NULL) quit(1, "supscan: Unable to open %s\n", buf); while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; collname = nxtarg(&p, " \t="); p = skipover(p, " \t="); if (!localhost(p)) continue; *c = getscancoll(filename, estrdup(collname), NULL); if (*c) c = &((*c)->Cnext); else errs++; } (void) fclose(f); return errs; } if (argc < 2 && fflag) { firstC = NULL; c = &firstC; if ((f = fopen(filename, "r")) == NULL) quit(1, "supscan: Unable to open %s\n", filename); while ((p = fgets(buf, STRINGLENGTH, f)) != NULL) { q = strchr(p, '\n'); if (q) *q = 0; if (strchr("#;:", *p)) continue; q = nxtarg(&p, " \t="); p = skipover(p, " \t="); *c = getscancoll(filename, estrdup(q), estrdup(p)); if (*c) c = &((*c)->Cnext); else errs++; } (void) fclose(f); return errs; } if (argc < 2 || argc > 3) usage(); firstC = getscancoll(filename, estrdup(argv[1]), argc > 2 ? estrdup(argv[2]) : NULL); if (firstC == NULL) errs++; return errs; }