int TreeParser::Next() { int c; do { c = getc(g_file); } while(c == EOF && PopFile()); if (c == '\n') ++g_line; return c; }
int ReadLine(void) { int r; /* If we're at the end of a file, pop */ while (!CLine && !fp) { r = PopFile(); if (r) return r; } /* If it's cached, read line from the cache */ if (CLine) { CurLine = CLine->text; LineNo = CLine->LineNo; CLine = CLine->next; FreshLine = 1; if (DebugFlag & DB_ECHO_LINE) OutputLine(ErrFp); return OK; } /* Not cached. Read from the file. */ return ReadLineFromFile(); }
int IncludeFile(char const *fname) { IncludeStruct *i; int oldRunDisabled; struct stat statbuf; FreshLine = 1; if (IStackPtr+1 >= INCLUDE_NEST) return E_NESTED_INCLUDE; i = &IStack[IStackPtr]; if (FileName) { i->filename = StrDup(FileName); if (!i->filename) return E_NO_MEM; } else { i->filename = NULL; } i->LineNo = LineNo; i->NumIfs = NumIfs; i->IfFlags = IfFlags; i->CLine = CLine; i->offset = -1L; i->chain = NULL; if (RunDisabled & RUN_NOTOWNER) { i->ownedByMe = 0; } else { i->ownedByMe = 1; } if (fp) { i->offset = ftell(fp); FCLOSE(fp); } IStackPtr++; #ifdef HAVE_GLOB /* If it's a directory, set up the glob chain here. */ if (stat(fname, &statbuf) == 0) { FilenameChain *fc; if (S_ISDIR(statbuf.st_mode)) { if (SetupGlobChain(fname, i) == OK) { /* Glob succeeded */ if (!i->chain) { /* Oops... no matching files */ if (!Hush) { Eprint("%s: %s", fname, ErrMsg[E_NO_MATCHING_REMS]); } PopFile(); return E_NO_MATCHING_REMS; } while(i->chain) { fc = i->chain; i->chain = i->chain->next; /* Munch first file */ oldRunDisabled = RunDisabled; if (!OpenFile(fc->filename)) { return OK; } Eprint("%s: %s", ErrMsg[E_CANT_OPEN], fc->filename); RunDisabled = oldRunDisabled; } /* Couldn't open anything... bail */ return PopFile(); } else { if (!Hush) { Eprint("%s: %s", fname, ErrMsg[E_NO_MATCHING_REMS]); } } return E_NO_MATCHING_REMS; } } #endif oldRunDisabled = RunDisabled; /* Try to open the new file */ if (!OpenFile(fname)) { return OK; } RunDisabled = oldRunDisabled; Eprint("%s: %s", ErrMsg[E_CANT_OPEN], fname); /* Ugh! We failed! */ PopFile(); return E_CANT_OPEN; }