diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 1997-01-20 19:43:25 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 1997-01-20 19:43:25 +0000 |
commit | f7e578b681f2047c43e6d75930fb5f278543dc32 (patch) | |
tree | 71e7f54a3183f4732b8ae0271c305720236851a4 /usr.bin/awk/OpenBSD-PATCHES | |
parent | 0f2a4655788de684b2544b1175a3aeb883569249 (diff) |
Latest research awk from June 29, 1996
Diffstat (limited to 'usr.bin/awk/OpenBSD-PATCHES')
-rw-r--r-- | usr.bin/awk/OpenBSD-PATCHES | 384 |
1 files changed, 384 insertions, 0 deletions
diff --git a/usr.bin/awk/OpenBSD-PATCHES b/usr.bin/awk/OpenBSD-PATCHES new file mode 100644 index 00000000000..b011fb71ed0 --- /dev/null +++ b/usr.bin/awk/OpenBSD-PATCHES @@ -0,0 +1,384 @@ +These are the changes made from Research Awk to allow it to +build on OpenBSD with flex. Below is the inof that came +with the original set of diffs (from 4.4BSD). ytab.* was +changed to awkgram.* for make's benefit. + + - todd + +From: Vern Paxson <vern@daffy.ee.lbl.gov> + +I've ported Research Awk to flex and tested it moderately. Note that I +didn't have time to support the nice error-message context stuff (where +it points out exactly where on a line it thinks an error occurred), as +the original code made a lot of assumptions regarding the internal +buffering of a lex scanner that are no longer valid with flex. Also, the +sources had a function called "isnumber" which conflicted with a macro by +the same name in <ctype.h>, so I changed its name to is_a_number. + +Let me know if you find more problems. + + Vern + +--- /home/millert/tmp/awk/awk.1 Sun Jan 19 18:06:25 1997 ++++ awk.1 Sun Jan 19 17:51:39 1997 +@@ -1,3 +1,4 @@ ++.\" $OpenBSD: OpenBSD-PATCHES,v 1.1 1997/01/20 19:43:16 millert Exp $ + .de EX + .nf + .ft CW +@@ -13,7 +14,7 @@ + .SH NAME + awk \- pattern-directed scanning and processing language + .SH SYNOPSIS +-.B awk ++.B awk|nawk + [ + .BI \-F + .I fs +--- /home/millert/tmp/awk/awklex.l Sun Jan 19 18:06:24 1997 ++++ awklex.l Sun Jan 19 18:00:52 1997 +@@ -29,13 +29,15 @@ + may not be preserved in other implementations of lex. + */ + ++#ifndef FLEX_SCANNER + #undef input /* defeat lex */ + #undef unput ++#endif /* !FLEX_SCANNER */ + + #include <stdlib.h> + #include <string.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + extern YYSTYPE yylval; + extern int infunc; +@@ -60,6 +62,20 @@ + char *s; + Gstring *gs = 0; /* initialized in main() */ + int cflag; ++ ++#ifdef FLEX_SCANNER ++static int my_input( YY_CHAR *buf, int max_size ); ++ ++#undef YY_INPUT ++#define YY_INPUT(buf,result,max_size) result = my_input(buf, max_size); ++ ++#undef YY_USER_INIT ++#define YY_USER_INIT init_input_source(); ++ ++#define FIRST ((yy_start - 1) / 2) ++#else /* FLEX_SCANNER */ ++#define FIRST (yybgin - yysvec - 1) ++#endif /* FLEX_SCANNER */ + %} + + A [a-zA-Z_] +@@ -70,7 +86,7 @@ + WS [ \t] + + %% +- switch (yybgin-yysvec-1) { /* witchcraft */ ++ switch (FIRST) { /* witchcraft */ + case 0: + BEGIN A; + break; +@@ -116,14 +132,20 @@ + + <A>"$"{D}+ { yylval.cp = fieldadr(atoi(yytext+1)); RET(FIELD); } + <A>"$NF" { unputstr("(NF)"); return(INDIRECT); } +-<A>"$"{A}{B}* { int c, n; +- c = input(); unput(c); +- if (c == '(' || c == '[' || (infunc && (n=isarg(yytext+1)) >= 0)) { +- unputstr(yytext+1); +- return(INDIRECT); ++<A>"$"{A}{B}* { ++ int c; ++ char *yytext_copy = strdup(yytext); ++ c = input(); unput(c); /* look for '(' or '[' */ ++ if (c == '(' || c == '[' || ++ infunc && isarg(yytext_copy+1) >= 0) { ++ unputstr(yytext_copy+1); ++ free(yytext_copy); ++ return(INDIRECT); + } else { +- yylval.cp = setsymtab(yytext+1, "", 0.0, STR|NUM, symtab); +- RET(IVAR); ++ yylval.cp = ++ setsymtab(yytext_copy+1,"",0.0,STR|NUM,symtab); ++ free(yytext_copy); ++ RET(IVAR); + } + } + <A>"$" { RET(INDIRECT); } +@@ -173,12 +195,15 @@ + <A>fflush { yylval.i = FFLUSH; RET(BLTIN); } + + <A>{A}{B}* { int n, c; ++ char *yytext_copy = strdup(yytext); + c = input(); unput(c); /* look for '(' */ +- if (c != '(' && infunc && (n=isarg(yytext)) >= 0) { ++ if (c != '(' && infunc && (n=isarg(yytext_copy)) >= 0) { + yylval.i = n; ++ free(yytext_copy); + RET(ARG); + } else { +- yylval.cp = setsymtab(yytext, "", 0.0, STR|NUM, symtab); ++ yylval.cp = setsymtab(yytext_copy, "", 0.0, STR|NUM, symtab); ++ free(yytext_copy); + if (c == '(') { + RET(CALL); + } else { +@@ -237,6 +262,32 @@ + caddreset(gs); + } + ++#ifdef FLEX_SCANNER ++static int my_input( YY_CHAR *buf, int max_size ) ++{ ++ extern uschar *lexprog; ++ ++ if ( lexprog ) { /* awk '...' */ ++ int num_chars = strlen( lexprog ); ++ if ( num_chars > max_size ) ++ { ++ num_chars = max_size; ++ strncpy( buf, lexprog, num_chars ); ++ } ++ else ++ strcpy( buf, lexprog ); ++ lexprog += num_chars; ++ return num_chars; ++ ++ } else { /* awk -f ... */ ++ int c = pgetc(); ++ if (c == EOF) ++ return 0; ++ buf[0] = c; ++ return 1; ++ } ++} ++#else /* FLEX_SCANNER */ + /* input() and unput() are transcriptions of the standard lex + macros for input and output with additions for error message + printing. God help us all if someone changes how lex works. +@@ -275,7 +326,7 @@ + if (--ep < ebuf) + ep = ebuf + sizeof(ebuf) - 1; + } +- ++#endif /* FLEX_SCANNER */ + + void unputstr(char *s) /* put a string back on input */ + { +@@ -285,6 +336,11 @@ + unput(s[i]); + } + ++int lex_input() ++{ ++ return input(); ++} ++ + /* growing-string code */ + + const int CBUFLEN = 400; +@@ -330,3 +386,20 @@ + free((void *) gs->cbuf); + free((void *) gs); + } ++ ++#ifdef FLEX_SCANNER ++void init_input_source(void) ++{ ++ extern int curpfile; ++ extern char *pfile[]; ++ ++ if (yyin == NULL) { ++ if (pfile[curpfile] == 0) ++ return; ++ if (strcmp((char *) pfile[curpfile], "-") == 0) ++ yyin = stdin; ++ else if ((yyin = fopen((char *) pfile[curpfile], "r")) == NULL) ++ ERROR "can't open file %s", pfile[curpfile] FATAL; ++ } ++} ++#endif +--- /home/millert/tmp/awk/b.c Sun Jan 19 18:06:24 1997 ++++ b.c Sun Jan 19 18:00:55 1997 +@@ -31,7 +31,7 @@ + #include <string.h> + #include <stdlib.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + #define HAT (NCHARS-1) /* matches ^ in regular expr */ + /* NCHARS is 2**n */ +--- /home/millert/tmp/awk/lib.c Sun Jan 19 18:06:24 1997 ++++ lib.c Sun Jan 19 18:01:45 1997 +@@ -29,7 +29,7 @@ + #include <errno.h> + #include <stdlib.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + FILE *infile = NULL; + char *file = ""; +@@ -431,7 +431,7 @@ + + if (beenhere++) + return; +- while ((c = input()) != EOF && c != '\0') ++ while ((c = lex_input()) != EOF && c != '\0') + bclass(c); + bcheck2(bracecnt, '{', '}'); + bcheck2(brackcnt, '[', ']'); +@@ -479,6 +479,7 @@ + + void eprint(void) /* try to print context around error */ + { ++#if 0 + char *p, *q; + int c; + static int been_here = 0; +@@ -511,6 +512,7 @@ + } + putc('\n', stderr); + ep = ebuf; ++#endif + } + + void bclass(int c) +--- /home/millert/tmp/awk/main.c Sun Jan 19 18:06:24 1997 ++++ main.c Sun Jan 19 18:00:57 1997 +@@ -27,11 +27,12 @@ + #define DEBUG + #include <stdio.h> + #include <ctype.h> ++#include <locale.h> + #include <stdlib.h> + #include <string.h> + #include <signal.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + extern char **environ; + extern int nfields; +@@ -53,7 +54,12 @@ + char *fs = NULL, *marg; + int temp; + +- cmdname = argv[0]; ++ setlocale(LC_ALL, ""); ++ ++ if ((cmdname = strrchr(argv[0], '/')) != NULL) ++ cmdname++; ++ else ++ cmdname = argv[0]; + if (argc == 1) { + fprintf(stderr, "Usage: %s [-f programfile | 'program'] [-Ffieldsep] [-v var=value] [-mf n] [-mr n] [files]\n", cmdname); + exit(1); +--- /home/millert/tmp/awk/maketab.c Sun Jan 19 18:06:24 1997 ++++ maketab.c Sun Jan 19 18:01:08 1997 +@@ -25,14 +25,14 @@ + /* + * this program makes the table to link function names + * and type indices that is used by execute() in run.c. +- * it finds the indices in ytab.h, produced by yacc. ++ * it finds the indices in awkgram.h, produced by yacc. + */ + + #include <stdio.h> + #include <string.h> + #include <stdlib.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + struct xx + { int token; +@@ -120,12 +120,12 @@ + + printf("#include <stdio.h>\n"); + printf("#include \"awk.h\"\n"); +- printf("#include \"ytab.h\"\n\n"); ++ printf("#include \"awkgram.h\"\n\n"); + for (i = SIZE; --i >= 0; ) + names[i] = ""; + +- if ((fp = fopen("ytab.h", "r")) == NULL) { +- fprintf(stderr, "maketab can't open ytab.h!\n"); ++ if ((fp = fopen("awkgram.h", "r")) == NULL) { ++ fprintf(stderr, "maketab can't open awkgram.h!\n"); + exit(1); + } + printf("static char *printname[%d] = {\n", SIZE); +--- /home/millert/tmp/awk/parse.c Sun Jan 19 18:06:24 1997 ++++ parse.c Sun Jan 19 18:01:11 1997 +@@ -27,7 +27,7 @@ + #include <string.h> + #include <stdlib.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + Node *nodealloc(int n) + { +--- /home/millert/tmp/awk/proto.h Sun Jan 19 18:06:24 1997 ++++ proto.h Sun Jan 19 17:51:39 1997 +@@ -22,7 +22,6 @@ + USE OR PERFORMANCE OF THIS SOFTWARE. + ****************************************************************/ + +-extern int yywrap(void); + extern void setfname(Cell *); + extern int constnode(Node *); + extern char *strnode(Node *); +@@ -31,12 +30,8 @@ + + extern int yylex(void); + extern void startreg(void); +-extern int input(void); +-extern void unput(int); ++extern int lex_input(void); + extern void unputstr(char *); +-extern int yylook(void); +-extern int yyback(int *, int); +-extern int yyinput(void); + + extern fa *makedfa(char *, int); + extern fa *mkdfa(char *, int); +@@ -65,6 +60,7 @@ + extern void freefa(fa *); + + extern int pgetc(void); ++extern void init_input_source(void); + + extern Node *nodealloc(int); + extern Node *exptostat(Node *); +--- /home/millert/tmp/awk/run.c Sun Jan 19 18:06:24 1997 ++++ run.c Sun Jan 19 18:01:15 1997 +@@ -31,7 +31,7 @@ + #include <stdlib.h> + #include <time.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + #define tempfree(x) if (istemp(x)) tfree(x); else + +--- /home/millert/tmp/awk/tran.c Sun Jan 19 18:06:24 1997 ++++ tran.c Sun Jan 19 18:01:18 1997 +@@ -29,7 +29,7 @@ + #include <string.h> + #include <stdlib.h> + #include "awk.h" +-#include "ytab.h" ++#include "awkgram.h" + + #define FULLTAB 2 /* rehash when table gets this x full */ + #define GROWTAB 4 /* grow table by this factor */ |