📄 awk.shar
字号:
- then unchanged it -- it really does run slower in too many cases.- left the code in place, commented out.--Feb 10, 1991:- check error status on all writes, to avoid banging on full disks.--Jan 28, 1991:- awk -f - reads the program from stdin.--Jan 11, 1991:- failed to set numeric state on $0 in cmd|getline context in run.c.--Nov 2, 1990:- fixed sleazy test for integrality in getsval; use modf.--Oct 29, 1990:- fixed sleazy buggy code in lib.c that looked (incorrectly) for- too long input lines.--Oct 14, 1990:- fixed the bug on p. 198 in which it couldn't deduce that an- argument was an array in some contexts. replaced the error- message in intest() by code that damn well makes it an array.--Oct 8, 1990:- fixed horrible bug: types and values were not preserved in- some kinds of self-assignment. (in assign().)--Aug 24, 1990:- changed NCHARS to 256 to handle 8-bit characters in strings- presented to match(), etc.--Jun 26, 1990:- changed struct rrow (awk.h) to use long instead of int for lval,- since cfoll() stores a pointer in it. now works better when int's- are smaller than pointers!--May 6, 1990:- AVA fixed the grammar so that ! is uniformly of the same precedence as- unary + and -. This renders illegal some constructs like !x=y, which- now has to be parenthesized as !(x=y), and makes others work properly:- !x+y is (!x)+y, and x!y is x !y, not two pattern-action statements.- (These problems were pointed out by Bob Lenk of Posix.)-- Added \x to regular expressions (already in strings).- Limited octal to octal digits; \8 and \9 are not octal.- Centralized the code for parsing escapes in regular expressions.- Added a bunch of tests to T.re and T.sub to verify some of this.--Feb 9, 1990:- fixed null pointer dereference bug in main.c: -F[nothing]. sigh.-- restored srand behavior: it returns the current seed.--Jan 18, 1990:- srand now returns previous seed value (0 to start).--Jan 5, 1990:- fix potential problem in tran.c -- something was freed,- then used in freesymtab.--Oct 18, 1989:- another try to get the max number of open files set with- relatively machine-independent code.-- small fix to input() in case of multiple reads after EOF.--Oct 11, 1989:- FILENAME is now defined in the BEGIN block -- too many old- programs broke.-- "-" means stdin in getline as well as on the commandline.-- added a bunch of casts to the code to tell the truth about- char * vs. unsigned char *, a right royal pain. added a- setlocale call to the front of main, though probably no one- has it usefully implemented yet.--Aug 24, 1989:- removed redundant relational tests against nullnode if parse- tree already had a relational at that point.--Aug 11, 1989:- fixed bug: commandline variable assignment has to look like- var=something. (consider the man page for =, in file =.1)-- changed number of arguments to functions to static arrays- to avoid repeated malloc calls.--Aug 2, 1989:- restored -F (space) separator--Jul 30, 1989:- added -v x=1 y=2 ... for immediate commandline variable assignment;- done before the BEGIN block for sure. they have to precede the- program if the program is on the commandline.- Modified Aug 2 to require a separate -v for each assignment.--Jul 10, 1989:- fixed ref-thru-zero bug in environment code in tran.c--Jun 23, 1989:- add newline to usage message.--Jun 14, 1989:- added some missing ansi printf conversion letters: %i %X %E %G.- no sensible meaning for h or L, so they may not do what one expects.-- made %* conversions work.-- changed x^y so that if n is a positive integer, it's done- by explicit multiplication, thus achieving maximum accuracy.- (this should be done by pow() but it seems not to be locally.)- done to x ^= y as well.--Jun 4, 1989:- ENVIRON array contains environment: if shell variable V=thing,- ENVIRON["V"] is "thing"-- multiple -f arguments permitted. error reporting is naive.- (they were permitted before, but only the last was used.)-- fixed a really stupid botch in the debugging macro dprintf-- fixed order of evaluation of commandline assignments to match- what the book claims: an argument of the form x=e is evaluated- at the time it would have been opened if it were a filename (p 63).- this invalidates the suggested answer to ex 4-1 (p 195).-- removed some code that permitted -F (space) fieldseparator,- since it didn't quite work right anyway. (restored aug 2)--Apr 27, 1989:- Line number now accumulated correctly for comment lines.--Apr 26, 1989:- Debugging output now includes a version date,- if one compiles it into the source each time.--Apr 9, 1989:- Changed grammar to prohibit constants as 3rd arg of sub and gsub;- prevents class of overwriting-a-constant errors. (Last one?)- This invalidates the "banana" example on page 43 of the book.-- Added \a ("alert"), \v (vertical tab), \xhhh (hexadecimal),- as in ANSI, for strings. Rescinded the sloppiness that permitted- non-octal digits in \ooo. Warning: not all compilers and libraries- will be able to deal with \x correctly.--Jan 9, 1989:- Fixed bug that caused tempcell list to contain a duplicate.- The fix is kludgy.--Dec 17, 1988:- Catches some more commandline errors in main.- Removed redundant decl of modf in run.c (confuses some compilers).- Warning: there's no single declaration of malloc, etc., in awk.h- that seems to satisfy all compilers.--Dec 7, 1988:- Added a bit of code to error printing to avoid printing nulls.- (Not clear that it actually would.)--Nov 27, 1988:- With fear and trembling, modified the grammar to permit- multiple pattern-action statements on one line without- an explicit separator. By definition, this capitulation- to the ghost of ancient implementations remains undefined- and thus subject to change without notice or apology.- DO NOT COUNT ON IT.--Oct 30, 1988:- Fixed bug in call() that failed to recover storage.-- A warning is now generated if there are more arguments- in the call than in the definition (in lieu of fixing- another storage leak).--Oct 20, 1988:- Fixed %c: if expr is numeric, use numeric value;- otherwise print 1st char of string value. still- doesn't work if the value is 0 -- won't print \0.-- Added a few more checks for running out of malloc.--Oct 12, 1988:- Fixed bug in call() that freed local arrays twice.-- Fixed to handle deletion of non-existent array right;- complains about attempt to delete non-array element.--Sep 30, 1988:- Now guarantees to evaluate all arguments of built-in- functions, as in C; the appearance is that arguments- are evaluated before the function is called. Places- affected are sub (gsub was ok), substr, printf, and- all the built-in arithmetic functions in bltin().- A warning is generated if a bltin() is called with- the wrong number of arguments.-- This requires changing makeprof on p167 of the book.--Aug 23, 1988:- setting FILENAME in BEGIN caused core dump, apparently- because it was freeing space not allocated by malloc.--July 24, 1988:- fixed egregious error in toupper/tolower functions.- still subject to rescinding, however.--July 2, 1988:- flush stdout before opening file or pipe--July 2, 1988:- performance bug in b.c/cgoto(): not freeing some sets of states.- partial fix only right now, and the number of states increased- to make it less obvious.--June 1, 1988:- check error status on close--May 28, 1988:- srand returns seed value it's using.- see 1/18/90--May 22, 1988:- Removed limit on depth of function calls.--May 10, 1988:- Fixed lib.c to permit _ in commandline variable names.--Mar 25, 1988:- main.c fixed to recognize -- as terminator of command-- line options. Illegal options flagged.- Error reporting slightly cleaned up.--Dec 2, 1987:- Newer C compilers apply a strict scope rule to extern- declarations within functions. Two extern declarations in- lib.c and tran.c have been moved to obviate this problem.--Oct xx, 1987:- Reluctantly added toupper and tolower functions.- Subject to rescinding without notice.--Sep 17, 1987:- Error-message printer had printf(s) instead of- printf("%s",s); got core dumps when the message- included a %.--Sep 12, 1987:- Very long printf strings caused core dump;- fixed aprintf, asprintf, format to catch them.- Can still get a core dump in printf itself.--//GO.SYSIN DD FIXESecho awk.h 1>&2sed 's/.//' >awk.h <<'//GO.SYSIN DD awk.h'-/****************************************************************-Copyright (C) Lucent Technologies 1997-All Rights Reserved--Permission to use, copy, modify, and distribute this software and-its documentation for any purpose and without fee is hereby-granted, provided that the above copyright notice appear in all-copies and that both that the copyright notice and this-permission notice and warranty disclaimer appear in supporting-documentation, and that the name Lucent Technologies or any of-its entities not be used in advertising or publicity pertaining-to distribution of the software without specific, written prior-permission.--LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.-IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY-SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER-IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF-THIS SOFTWARE.-****************************************************************/--#include <assert.h>--typedef double Awkfloat;--/* unsigned char is more trouble than it's worth */--typedef unsigned char uschar;--#define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } }--#define NN(p) ((p) ? (p) : "(null)") /* guaranteed non-null for dprintf -*/-#define DEBUG-#ifdef DEBUG- /* uses have to be doubly parenthesized */-# define dprintf(x) if (dbg) printf x-#else-# define dprintf(x)-#endif--extern int compile_time; /* 1 if compiling, 0 if running */-extern int safe; /* 0 => unsafe, 1 => safe */--#define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */-extern int recsize; /* size of current record, orig RECSIZE */--extern char **FS;-extern char **RS;-extern char **ORS;-extern char **OFS;-extern char **OFMT;-extern Awkfloat *NR;-extern Awkfloat *FNR;-extern Awkfloat *NF;-extern char **FILENAME;-extern char **SUBSEP;-extern Awkfloat *RSTART;-extern Awkfloat *RLENGTH;--extern char *record; /* points to $0 */-extern int lineno; /* line number in awk program */-extern int errorflag; /* 1 if error has occurred */-extern int donefld; /* 1 if record broken into fields */-extern int donerec; /* 1 if record is valid (no fld has changed */-extern char inputFS[]; /* FS at time of input, for field splitting */--extern int dbg;--extern char *patbeg; /* beginning of pattern matched */-extern int patlen; /* length of pattern matched. set in b.c */--/* Cell: all information about a variable or constant */--typedef struct Cell {- uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */- uschar csub; /* CCON, CTEMP, CFLD, etc. */- char *nval; /* name, for variables only */- char *sval; /* string value */- Awkfloat fval; /* value as number */- int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */- struct Cell *cnext; /* ptr to next if chained */-} Cell;--typedef struct Array { /* symbol table array */- int nelem; /* elements in table right now */- int size; /* size of tab */- Cell **tab; /* hash table pointers */-} Array;--#define NSYMTAB 50 /* initial size of a symbol table */-extern Array *symtab;--extern Cell *nrloc; /* NR */-extern Cell *fnrloc; /* FNR */-extern Cell *nfloc; /* NF */-extern Cell *rstartloc; /* RSTART */-extern Cell *rlengthloc; /* RLENGTH */--/* Cell.tval values: */-#define NUM 01 /* number value is valid */-#define STR 02 /* string value is valid */-#define DONTFREE 04 /* string space is not freeable */-#define CON 010 /* this is a constant */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -