📄 main.c
字号:
GNU General Public License for more details.\n\\n"; static char blurb_part3[] ="You should have received a copy of the GNU General Public License\n\along with this program; if not, write to the Free Software\n\Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"; version(); fputs(blurb_part1, stderr); fputs(blurb_part2, stderr); fputs(blurb_part3, stderr); fflush(stderr);}static voidcmdline_fs(str)char *str;{ register NODE **tmp; int len = strlen(str); tmp = get_lhs(FS_node, (Func_ptr *) 0); unref(*tmp); /* * Only if in full compatibility mode check for the stupid special * case so -F\t works as documented in awk even though the shell * hands us -Ft. Bleah! * * Thankfully, Posix didn't propogate this "feature". */ if (str[0] == 't' && str[1] == '\0') { if (do_lint) warning("-Ft does not set FS to tab in POSIX awk"); if (do_unix && ! do_posix) str[0] = '\t'; } *tmp = make_str_node(str, len, SCAN); /* do process escapes */ set_FS();}static voidinit_args(argc0, argc, argv0, argv)int argc0, argc;char *argv0;char **argv;{ int i, j; NODE **aptr; ARGV_node = install("ARGV", node(Nnull_string, Node_var, (NODE *)NULL)); aptr = assoc_lookup(ARGV_node, tmp_number(0.0)); *aptr = make_string(argv0, strlen(argv0)); (*aptr)->flags |= MAYBE_NUM; for (i = argc0, j = 1; i < argc; i++) { aptr = assoc_lookup(ARGV_node, tmp_number((AWKNUM) j)); *aptr = make_string(argv[i], strlen(argv[i])); (*aptr)->flags |= MAYBE_NUM; j++; } ARGC_node = install("ARGC", node(make_number((AWKNUM) j), Node_var, (NODE *) NULL));}/* * Set all the special variables to their initial values. */struct varinit { NODE **spec; char *name; NODETYPE type; char *strval; AWKNUM numval; Func_ptr assign;};static struct varinit varinit[] = {{&NF_node, "NF", Node_NF, 0, -1, set_NF },{&FIELDWIDTHS_node, "FIELDWIDTHS", Node_FIELDWIDTHS, "", 0, 0 },{&NR_node, "NR", Node_NR, 0, 0, set_NR },{&FNR_node, "FNR", Node_FNR, 0, 0, set_FNR },{&FS_node, "FS", Node_FS, " ", 0, 0 },{&RS_node, "RS", Node_RS, "\n", 0, set_RS },{&IGNORECASE_node, "IGNORECASE", Node_IGNORECASE, 0, 0, set_IGNORECASE },{&FILENAME_node, "FILENAME", Node_var, "-", 0, 0 },{&OFS_node, "OFS", Node_OFS, " ", 0, set_OFS },{&ORS_node, "ORS", Node_ORS, "\n", 0, set_ORS },{&OFMT_node, "OFMT", Node_OFMT, "%.6g", 0, set_OFMT },{&CONVFMT_node, "CONVFMT", Node_CONVFMT, "%.6g", 0, set_CONVFMT },{&RLENGTH_node, "RLENGTH", Node_var, 0, 0, 0 },{&RSTART_node, "RSTART", Node_var, 0, 0, 0 },{&SUBSEP_node, "SUBSEP", Node_var, "\034", 0, 0 },{&ARGIND_node, "ARGIND", Node_var, 0, 0, 0 },{&ERRNO_node, "ERRNO", Node_var, 0, 0, 0 },{0, 0, Node_illegal, 0, 0, 0 },};static voidinit_vars(){ register struct varinit *vp; for (vp = varinit; vp->name; vp++) { *(vp->spec) = install(vp->name, node(vp->strval == 0 ? make_number(vp->numval) : make_string(vp->strval, strlen(vp->strval)), vp->type, (NODE *) NULL)); if (vp->assign) (*(vp->assign))(); }}voidload_environ(){#if !defined(MSDOS) && !(defined(VMS) && defined(__DECC)) extern char **environ;#endif register char *var, *val; NODE **aptr; register int i; ENVIRON_node = install("ENVIRON", node(Nnull_string, Node_var, (NODE *) NULL)); for (i = 0; environ[i]; i++) { static char nullstr[] = ""; var = environ[i]; val = strchr(var, '='); if (val) *val++ = '\0'; else val = nullstr; aptr = assoc_lookup(ENVIRON_node, tmp_string(var, strlen (var))); *aptr = make_string(val, strlen (val)); (*aptr)->flags |= MAYBE_NUM; /* restore '=' so that system() gets a valid environment */ if (val != nullstr) *--val = '='; }}/* Process a command-line assignment */char *arg_assign(arg)char *arg;{ char *cp; Func_ptr after_assign = NULL; NODE *var; NODE *it; NODE **lhs; cp = strchr(arg, '='); if (cp != NULL) { *cp++ = '\0'; /* * Recent versions of nawk expand escapes inside assignments. * This makes sense, so we do it too. */ it = make_str_node(cp, strlen(cp), SCAN); it->flags |= MAYBE_NUM; var = variable(arg, 0); lhs = get_lhs(var, &after_assign); unref(*lhs); *lhs = it; if (after_assign) (*after_assign)(); *--cp = '='; /* restore original text of ARGV */ } return cp;}static voidpre_assign(v)char *v;{ if (!arg_assign(v)) { fprintf (stderr, "%s: '%s' argument to -v not in 'var=value' form\n", myname, v); usage(1); }}SIGTYPEcatchsig(sig, code)int sig, code;{#ifdef lint code = 0; sig = code; code = sig;#endif if (sig == SIGFPE) { fatal("floating point exception"); } else if (sig == SIGSEGV#ifdef SIGBUS || sig == SIGBUS#endif ) { msg("fatal error: internal error"); /* fatal won't abort() if not compiled for debugging */ abort(); } else cant_happen(); /* NOTREACHED */}/* gawk_option --- do gawk specific things */static voidgawk_option(optstr)char *optstr;{ char *cp; for (cp = optstr; *cp; cp++) { switch (*cp) { case ' ': case '\t': case ',': break; case 'v': case 'V': /* print version */ if (strncasecmp(cp, "version", 7) != 0) goto unknown; else cp += 6; version(); break; case 'c': case 'C': if (strncasecmp(cp, "copyright", 9) == 0) { cp += 8; copyleft(); } else if (strncasecmp(cp, "copyleft", 8) == 0) { cp += 7; copyleft(); } else if (strncasecmp(cp, "compat", 6) == 0) { cp += 5; do_unix = 1; } else goto unknown; break; case 'n': case 'N': /* * Undocumented feature, * inspired by nostalgia, and a T-shirt */ if (strncasecmp(cp, "nostalgia", 9) != 0) goto unknown; nostalgia(); break; case 'p': case 'P':#ifdef DEBUG if (strncasecmp(cp, "parsedebug", 10) == 0) { cp += 9; yydebug = 2; break; }#endif if (strncasecmp(cp, "posix", 5) != 0) goto unknown; cp += 4; do_posix = do_unix = 1; break; case 'l': case 'L': if (strncasecmp(cp, "lint", 4) != 0) goto unknown; cp += 3; do_lint = 1; break; case 'H': case 'h': if (strncasecmp(cp, "help", 4) != 0) goto unknown; cp += 3; usage(0); break; case 'U': case 'u': if (strncasecmp(cp, "usage", 5) != 0) goto unknown; cp += 4; usage(0); break; case 's': case 'S': if (strncasecmp(cp, "source=", 7) != 0) goto unknown; cp += 7; if (strlen(cp) == 0) warning("empty argument to -Wsource ignored"); else { srcfiles[++numfiles].stype = CMDLINE; srcfiles[numfiles].val = cp; return; } break; default: unknown: fprintf(stderr, "'%c' -- unknown option, ignored\n", *cp); break; } }}/* nostalgia --- print the famous error message and die */static voidnostalgia(){ fprintf(stderr, "awk: bailing out near line 1\n"); abort();}/* version --- print version message */static voidversion(){ fprintf(stderr, "%s, patchlevel %d\n", version_string, PATCHLEVEL);}/* static */char *gawk_name(filespec)char *filespec;{ char *p; #ifdef VMS /* "device:[root.][directory.subdir]GAWK.EXE;n" -> "GAWK" */ char *q; p = strrchr(filespec, ']'); /* directory punctuation */ q = strrchr(filespec, '>'); /* alternate <international> punct */ if (p == NULL || q > p) p = q; p = strdup(p == NULL ? filespec : (p + 1)); if ((q = strrchr(p, '.')) != NULL) *q = '\0'; /* strip .typ;vers */ return p;#endif /*VMS*/#if defined(MSDOS) || defined(atarist) char *q; p = filespec; if (q = strrchr(p, '\\')) p = q + 1; if (q = strchr(p, '.')) *q = '\0'; strlwr(p); return (p == NULL ? filespec : p);#endif /* MSDOS || atarist */ /* "path/name" -> "name" */ p = strrchr(filespec, '/'); return (p == NULL ? filespec : p + 1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -