/* * Add a file of strings to the pattern list. */ static void addfile(const char *fn) { FILE *fp; char *inbuf; char *bufp; size_t bufsiz, buflen, bufused; /* * Open the pattern file */ if ((fp = fopen(fn, "r")) == NULL) { (void) fprintf(stderr, gettext("%s: can't open \"%s\"\n"), cmdname, fn); exit(2); } bufsiz = BUFSIZE; if ((inbuf = malloc(bufsiz)) == NULL) { (void) fprintf(stderr, gettext("%s: out of memory\n"), cmdname); exit(2); } bufp = inbuf; bufused = 0; /* * Read in the file, reallocing as we need more memory */ while (fgets(bufp, bufsiz - bufused, fp) != NULL) { buflen = strlen(bufp); bufused += buflen; if (bufused + 1 == bufsiz && bufp[buflen - 1] != '\n') { /* * if this line does not fit to the buffer, * realloc larger buffer */ bufsiz += BUFSIZE; if ((inbuf = realloc(inbuf, bufsiz)) == NULL) { (void) fprintf(stderr, gettext("%s: out of memory\n"), cmdname); exit(2); } bufp = inbuf + bufused; continue; } if (bufp[buflen - 1] == '\n') { bufp[--buflen] = '\0'; } addpattern(inbuf); bufp = inbuf; bufused = 0; } free(inbuf); free(prntbuf); free(conbuf); (void) fclose(fp); }
int netsize() /* **-------------------------------------------------------------- ** Input: none ** Output: returns error code ** Purpose: determines number of system components **-------------------------------------------------------------- */ { char line[MAXLINE+1]; /* Line from input data file */ char *tok; /* First token of line */ int sect,newsect; /* Input data sections */ int errcode = 0; /* Error code */ /* Initialize network component counts */ MaxJuncs = 0; MaxTanks = 0; MaxPipes = 0; MaxPumps = 0; MaxValves = 0; MaxControls = 0; MaxRules = 0; MaxCurves = 0; sect = -1; /* Add a default pattern 0 */ MaxPats = -1; addpattern(""); /* Make pass through data file counting number of each component */ while (fgets(line,MAXLINE,InFile) != NULL) { /* Skip blank lines & those beginning with a comment */ tok = strtok(line,SEPSTR); if (tok == NULL) continue; if (*tok == ';') continue; /* Check if line begins with a new section heading */ if (*tok == '[') { newsect = findmatch(tok,SectTxt); if (newsect >= 0) { sect = newsect; if (sect == _END) break; continue; } else continue; } /* Add to count of current component */ switch(sect) { case _JUNCTIONS: MaxJuncs++; break; case _RESERVOIRS: case _TANKS: MaxTanks++; break; case _PIPES: MaxPipes++; break; case _PUMPS: MaxPumps++; break; case _VALVES: MaxValves++; break; case _CONTROLS: MaxControls++; break; case _RULES: addrule(tok); break; /* See RULES.C */ case _PATTERNS: errcode = addpattern(tok); break; case _CURVES: errcode = addcurve(tok); break; } if (errcode) break; } MaxNodes = MaxJuncs + MaxTanks; MaxLinks = MaxPipes + MaxPumps + MaxValves; if (MaxPats < 1) MaxPats = 1; if (!errcode) { if (MaxJuncs < 1) errcode = 223; /* Not enough nodes */ else if (MaxTanks == 0) errcode = 224; /* No tanks */ } return(errcode); } /* End of netsize */
/* * mainline for grep */ int main(int argc, char **argv) { char *ap, *test; int c; int fflag = 0; int i, n_pattern = 0, n_file = 0; char **pattern_list = NULL; char **file_list = NULL; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */ #endif (void) textdomain(TEXT_DOMAIN); /* * true if this is running on the multibyte locale */ mblocale = (MB_CUR_MAX > 1); /* * Skip leading slashes */ cmdname = argv[0]; if (ap = strrchr(cmdname, '/')) cmdname = ap + 1; ap = cmdname; /* * Detect egrep/fgrep via command name, map to -E and -F options. */ if (*ap == 'e' || *ap == 'E') { regflags |= REG_EXTENDED; egrep++; } else { if (*ap == 'f' || *ap == 'F') { fgrep++; } } /* check for non-standard "-line-count" option */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "--") == 0) break; if ((argv[i][0] == '-') && isdigit(argv[i][1])) { if (strlen(&argv[i][1]) != strspn(&argv[i][1], "0123456789")) { (void) fprintf(stderr, gettext( "%s: Bad number flag\n"), argv[0]); usage(); } conalen = conblen = strtoul(&argv[i][1], (char **)NULL, 10); /* isdigit() check prevents negative arguments */ if (conalen >= ULONG_MAX) { (void) fprintf(stderr, gettext( "%s: Bad context argument\n"), argv[0]); } if (conalen) conflag = CONTEXT; while (i < argc) { argv[i] = argv[i + 1]; i++; } argc--; } } while ((c = getopt(argc, argv, "vwchHilnrbse:f:qxEFIRA:B:C:")) != EOF) { unsigned long tval; switch (c) { case 'v': /* POSIX: negate matches */ nvflag = 0; break; case 'c': /* POSIX: write count */ cflag++; break; case 'i': /* POSIX: ignore case */ iflag++; regflags |= REG_ICASE; break; case 'l': /* POSIX: Write filenames only */ lflag++; break; case 'n': /* POSIX: Write line numbers */ nflag++; break; case 'r': /* Solaris: search recursively */ rflag++; break; case 'b': /* Solaris: Write file block numbers */ bflag++; break; case 's': /* POSIX: No error msgs for files */ sflag++; break; case 'e': /* POSIX: pattern list */ n_pattern++; pattern_list = realloc(pattern_list, sizeof (char *) * n_pattern); if (pattern_list == NULL) { (void) fprintf(stderr, gettext("%s: out of memory\n"), cmdname); exit(2); } *(pattern_list + n_pattern - 1) = optarg; break; case 'f': /* POSIX: pattern file */ fflag = 1; n_file++; file_list = realloc(file_list, sizeof (char *) * n_file); if (file_list == NULL) { (void) fprintf(stderr, gettext("%s: out of memory\n"), cmdname); exit(2); } *(file_list + n_file - 1) = optarg; break; /* based on options order h or H is set as in GNU grep */ case 'h': /* Solaris: supress printing of file name */ hflag = 1; Hflag = 0; break; /* Solaris: precede every matching with file name */ case 'H': Hflag = 1; hflag = 0; break; case 'q': /* POSIX: quiet: status only */ qflag++; break; case 'w': /* Solaris: treat pattern as word */ wflag++; break; case 'x': /* POSIX: full line matches */ xflag++; regflags |= REG_ANCHOR; break; case 'E': /* POSIX: Extended RE's */ regflags |= REG_EXTENDED; Eflag++; break; case 'F': /* POSIX: strings, not RE's */ Fflag++; break; case 'R': /* Solaris: like rflag, but follow symlinks */ Rflag++; rflag++; break; case 'A': /* print N lines after each match */ conalen = strtoul(optarg, &test, 10); /* *test will be non-null if optarg is negative */ if (*test != '\0' || conalen >= ULONG_MAX) { (void) fprintf(stderr, gettext( "%s: Bad context argument\n"), argv[0]); exit(2); } if (conalen) conflag |= AFTER; else conflag &= ~AFTER; break; case 'B': /* print N lines before each match */ conblen = strtoul(optarg, &test, 10); /* *test will be non-null if optarg is negative */ if (*test != '\0' || conblen >= ULONG_MAX) { (void) fprintf(stderr, gettext( "%s: Bad context argument\n"), argv[0]); exit(2); } if (conblen) conflag |= BEFORE; else conflag &= ~BEFORE; break; case 'C': /* print N lines around each match */ tval = strtoul(optarg, &test, 10); /* *test will be non-null if optarg is negative */ if (*test != '\0' || tval >= ULONG_MAX) { (void) fprintf(stderr, gettext( "%s: Bad context argument\n"), argv[0]); exit(2); } if (tval) { conflag = CONTEXT; conalen = conblen = tval; } break; default: usage(); } } /* * If we're invoked as egrep or fgrep we need to do some checks */ if (egrep || fgrep) { /* * Use of -E or -F with egrep or fgrep is illegal */ if (Eflag || Fflag) usage(); /* * Don't allow use of wflag with egrep / fgrep */ if (wflag) usage(); /* * For Solaris the -s flag is equivalent to XCU -q */ if (sflag) qflag++; /* * done with above checks - set the appropriate flags */ if (egrep) Eflag++; else /* Else fgrep */ Fflag++; } if (wflag && (Eflag || Fflag)) { /* * -w cannot be specified with grep -F */ usage(); } /* * -E and -F flags are mutually exclusive - check for this */ if (Eflag && Fflag) usage(); /* * -l overrides -H like in GNU grep */ if (lflag) Hflag = 0; /* * -c, -l and -q flags are mutually exclusive * We have -c override -l like in Solaris. * -q overrides -l & -c programmatically in grep() function. */ if (cflag && lflag) lflag = 0; argv += optind - 1; argc -= optind - 1; /* * Now handling -e and -f option */ if (pattern_list) { for (i = 0; i < n_pattern; i++) { addpattern(pattern_list[i]); } free(pattern_list); } if (file_list) { for (i = 0; i < n_file; i++) { addfile(file_list[i]); } free(file_list); } /* * No -e or -f? Make sure there is one more arg, use it as the pattern. */ if (patterns == NULL && !fflag) { if (argc < 2) usage(); addpattern(argv[1]); argc--; argv++; } /* * If -x flag is not specified or -i flag is specified * with fgrep in a multibyte locale, need to use * the wide character APIs. Otherwise, byte-oriented * process will be done. */ use_wchar = Fflag && mblocale && (!xflag || iflag); /* * Compile Patterns and also decide if BMG can be used */ fixpatterns(); /* Process all files: stdin, or rest of arg list */ if (argc < 2) { matched = grep(0, STDIN_FILENAME); } else { if (Hflag || (argc > 2 && hflag == 0)) outfn = 1; /* Print filename on match line */ for (argv++; *argv != NULL; argv++) { process_path(*argv); } } /* * Return() here is used instead of exit */ (void) fflush(stdout); if (errors) return (2); return (matched ? 0 : 1); }