/* * A new file included. * If ifiles == NULL, this is the first file and already opened (stdin). * Return 0 on success, -1 if file to be included is not found. */ int pushfile(const usch *file, const usch *fn, int idx, void *incs) { extern struct initar *initar; struct includ ibuf; struct includ *ic; int otrulvl; ic = &ibuf; ic->next = ifiles; if (file != NULL) { if ((ic->infil = open((const char *)file, O_RDONLY)) < 0) return -1; ic->orgfn = ic->fname = file; if (++inclevel > MAX_INCLEVEL) error("Limit for nested includes exceeded"); } else { ic->infil = 0; ic->orgfn = ic->fname = (const usch *)"<stdin>"; } ic->buffer = ic->bbuf+NAMEMAX; ic->curptr = ic->buffer; ifiles = ic; ic->lineno = 1; ic->maxread = ic->curptr; ic->idx = idx; ic->incs = incs; ic->fn = fn; prtline(); if (initar) { int oin = ic->infil; ic->infil = -1; *ic->maxread = 0; prinit(initar, ic); if (dMflag) write(ofd, ic->buffer, strlen((char *)ic->buffer)); fastscan(); prtline(); ic->infil = oin; initar = NULL; } otrulvl = trulvl; fastscan(); if (otrulvl != trulvl || flslvl) error("unterminated conditional"); ifiles = ic->next; close(ic->infil); inclevel--; return 0; }
/* * A new file included. * If ifiles == NULL, this is the first file and already opened (stdin). * Return 0 on success, -1 if file to be included is not found. */ int pushfile(const usch *file, const usch *fn, int idx, void *incs) { struct includ ibuf; struct includ *ic; int otrulvl; ic = &ibuf; ic->next = ifiles; if (file != NULL) { if ((ic->infil = open((const char *)file, O_RDONLY)) < 0) return -1; ic->orgfn = ic->fname = file; if (++inclevel > MAX_INCLEVEL) error("limit for nested includes exceeded"); } else { ic->infil = 0; ic->orgfn = ic->fname = (const usch *)"<stdin>"; } #if LIBVMF if (ifiles) { vmmodify(ifiles->vseg); vmunlock(ifiles->vseg); } ic->vseg = vmmapseg(&ibspc, inclevel); vmlock(ic->vseg); #endif ifiles = ic; ic->ib = getobuf(BINBUF); ic->lineno = 1; ic->escln = 0; ic->maxread = ic->curptr; ic->idx = idx; ic->incs = incs; ic->fn = fn; prtline(1); otrulvl = trulvl; fastscan(); if (otrulvl != trulvl || flslvl) error("unterminated conditional"); ifiles = ic->next; inclevel--; #if LIBVMF vmmodify(ic->vseg); vmunlock(ic->vseg); ic->ib->ro = 1; /* XXX no free */ if (ifiles) { ifiles->vseg = vmmapseg(&ibspc, inclevel); vmlock(ifiles->vseg); ifiles->ib->buf = (usch *)ifiles->vseg->s_cinfo; } #endif close(ic->infil); bufree(ic->ib); return 0; }
int main(int argc, char **argv) { getfile(); fastscan(); return 0; }