diff options
author | ceastha <none@none> | 2005-10-04 20:57:27 -0700 |
---|---|---|
committer | ceastha <none@none> | 2005-10-04 20:57:27 -0700 |
commit | cb4658fbb85e4290093c4fea0eb396a7d98de1fb (patch) | |
tree | 20ef4412dd7a449f5c1af3d26d8b72c2e235b4db /usr/src/cmd | |
parent | 45a9d96181a0a0ac4f9f1f7c59834d5d4047d482 (diff) | |
download | illumos-joyent-cb4658fbb85e4290093c4fea0eb396a7d98de1fb.tar.gz |
6320514 UNIX03/UNIX98 *vsc* awk.ex 35 fails - new test, awk fails on filenames with "=", i.e. x=y
Diffstat (limited to 'usr/src/cmd')
-rw-r--r-- | usr/src/cmd/awk/lib.c | 33 | ||||
-rw-r--r-- | usr/src/cmd/awk_xpg4/awk1.c | 401 | ||||
-rw-r--r-- | usr/src/cmd/awk_xpg4/awk2.c | 332 | ||||
-rw-r--r-- | usr/src/cmd/oawk/lib.c | 77 |
4 files changed, 481 insertions, 362 deletions
diff --git a/usr/src/cmd/awk/lib.c b/usr/src/cmd/awk/lib.c index 588700e870..063883122a 100644 --- a/usr/src/cmd/awk/lib.c +++ b/usr/src/cmd/awk/lib.c @@ -151,7 +151,7 @@ getrec(uchar **bufp, size_t *bufsizep) int readrec(uchar **bufp, size_t *sizep, FILE *inf) /* read one record into buf */ { - register int sep, c; + int sep, c; uchar *buf; int count; size_t bufsize; @@ -225,7 +225,7 @@ setclvar(uchar *s) /* set var=value from s */ void fldbld(void) { - register uchar *r, *fr, sep; + uchar *r, *fr, sep; Cell *p; int i; size_t len; @@ -313,7 +313,7 @@ static void cleanfld(int n1, int n2) /* clean out fields n1..n2 inclusive */ { static uchar *nullstat = (uchar *) ""; - register Cell *p; + Cell *p; int i; for (i = n2; i > n1; i--) { @@ -464,7 +464,7 @@ void recbld(void) { int i; - register uchar *p; + uchar *p; size_t cnt, len, olen; static uchar *rec; size_t osize, nsize; @@ -673,12 +673,25 @@ PUTS(uchar *s) int isclvar(uchar *s) /* is s of form var=something? */ { - uchar *os = s; + if (s != NULL) { + + /* Must begin with an underscore or alphabetic character */ + if (isalpha(*s) || (*s == '_')) { + + for (s++; *s; s++) { + /* + * followed by a sequence of underscores, + * digits, and alphabetics + */ + if (!(isalnum(*s) || *s == '_')) { + break; + } + } + return (*s == '=' && *(s + 1) != '='); + } + } - for (; *s; s++) - if (!(isalnum(*s) || *s == '_')) - break; - return (*s == '=' && s > os && *(s + 1) != '='); + return (0); } #define MAXEXPON 38 /* maximum exponent for fp number */ @@ -686,7 +699,7 @@ isclvar(uchar *s) /* is s of form var=something? */ int is_number(uchar *s) { - register int d1, d2; + int d1, d2; int point; uchar *es; extern char radixpoint; diff --git a/usr/src/cmd/awk_xpg4/awk1.c b/usr/src/cmd/awk_xpg4/awk1.c index e63c550814..e9407c2cea 100644 --- a/usr/src/cmd/awk_xpg4/awk1.c +++ b/usr/src/cmd/awk_xpg4/awk1.c @@ -25,15 +25,17 @@ */ /* - * awk -- mainline, yylex, etc. - * * Copyright 1986, 1994 by Mortice Kern Systems Inc. All rights reserved. - * - * Based on MKS awk(1) ported to be /usr/xpg4/bin/awk with POSIX/XCU4 changes */ #pragma ident "%Z%%M% %I% %E% SMI" +/* + * awk -- mainline, yylex, etc. + * + * Based on MKS awk(1) ported to be /usr/xpg4/bin/awk with POSIX/XCU4 changes + */ + #include "awk.h" #include "y.tab.h" #include <stdarg.h> @@ -47,13 +49,13 @@ static int proglen; /* Length of progptr */ static wchar_t context[NCONTEXT]; /* Circular buffer of context */ static wchar_t *conptr = &context[0]; /* context ptr */ static FILE *progfp; /* Stdio stream for programme */ -static char *filename; +static char *filename; #ifdef DEBUG static int dflag; #endif -#define AWK_EXEC_MAGIC "<MKS AWKC>" -#define LEN_EXEC_MAGIC 10 +#define AWK_EXEC_MAGIC "<MKS AWKC>" +#define LEN_EXEC_MAGIC 10 static char unbal[] = "unbalanced E char"; @@ -61,7 +63,7 @@ static void awkarginit(int c, char **av); static int lexid(wint_t c); static int lexnumber(wint_t c); static int lexstring(wint_t endc); -static int lexregexp(register wint_t endc); +static int lexregexp(wint_t endc); static void awkvarinit(void); static wint_t lexgetc(void); @@ -70,10 +72,11 @@ static size_t lexescape(wint_t endc, int regx, int cmd_line_operand); static void awkierr(int perr, char *fmt, va_list ap); static int usage(void); void strescape(wchar_t *str); -static const char *toprint(wint_t); +static const char *toprint(wint_t); char *_cmdname; static wchar_t *mbconvert(char *str); +extern int isclvar(wchar_t *arg); /* * mainline for awk @@ -81,28 +84,28 @@ static wchar_t *mbconvert(char *str); int main(int argc, char *argv[]) { - register wchar_t *ap; - register char *cmd; + wchar_t *ap; + char *cmd; cmd = argv[0]; _cmdname = cmd; - linebuf = emalloc(NLINE * sizeof(wchar_t)); + linebuf = emalloc(NLINE * sizeof (wchar_t)); - /*l + /* * At this point only messaging should be internationalized. * numbers are still scanned as in the Posix locale. */ - (void) setlocale(LC_ALL,""); - (void) setlocale(LC_NUMERIC,"C"); + (void) setlocale(LC_ALL, ""); + (void) setlocale(LC_NUMERIC, "C"); #if !defined(TEXT_DOMAIN) #define TEXT_DOMAIN "SYS_TEST" #endif (void) textdomain(TEXT_DOMAIN); - + awkvarinit(); - /*running = 1;*/ - while (argc>1 && *argv[1]=='-') { + /* running = 1; */ + while (argc > 1 && *argv[1] == '-') { void *save_ptr = NULL; ap = mbstowcsdup(&argv[1][1]); if (ap == NULL) @@ -114,9 +117,9 @@ main(int argc, char *argv[]) save_ptr = (void *) ap; ++argv; --argc; - if (*ap=='-' && ap[1]=='\0') + if (*ap == '-' && ap[1] == '\0') break; - for ( ; *ap != '\0'; ++ap) { + for (; *ap != '\0'; ++ap) { switch (*ap) { #ifdef DEBUG case 'd': @@ -138,7 +141,7 @@ main(int argc, char *argv[]) case 'F': if (ap[1] == '\0') { if (argc < 2) { - (void) fprintf(stderr, + (void) fprintf(stderr, gettext("Missing field separator\n")); return (1); } @@ -149,12 +152,12 @@ main(int argc, char *argv[]) ++ap; strescape(ap); strassign(varFS, linebuf, FALLOC, - wcslen(linebuf)); + wcslen(linebuf)); break; case 'v': { - register wchar_t *vp; - register wchar_t *arg; + wchar_t *vp; + wchar_t *arg; if (argc < 2) { (void) fprintf(stderr, @@ -162,12 +165,23 @@ main(int argc, char *argv[]) return (1); } arg = mbconvert(argv[1]); - if ((vp = wcschr(arg, '=')) != NULL) { + /* + * Ensure the variable expression + * is valid (correct form). + */ + if (((vp = wcschr(arg, '=')) != NULL) && + isclvar(arg)) { *vp = '\0'; strescape(vp+1); strassign(vlook(arg), linebuf, - FALLOC|FSENSE, wcslen(linebuf)); + FALLOC|FSENSE, + wcslen(linebuf)); *vp = '='; + } else { + (void) fprintf(stderr, gettext( + "Invalid form for variable " + "assignment: %S\n"), arg); + return (1); } --argc; ++argv; @@ -175,7 +189,7 @@ main(int argc, char *argv[]) } default: - (void) fprintf(stderr, + (void) fprintf(stderr, gettext("Unknown option \"-%S\"\n"), ap); return (usage()); } @@ -198,15 +212,15 @@ main(int argc, char *argv[]) awkarginit(argc, argv); - /*running = 0;*/ - (void)yyparse(); + /* running = 0; */ + (void) yyparse(); lineno = 0; /* * Ok, done parsing, so now activate the rest of the nls stuff, set * the radix character. */ - (void) setlocale(LC_ALL,""); + (void) setlocale(LC_ALL, ""); radixpoint = *localeconv()->decimal_point; awk(); /* NOTREACHED */ @@ -223,7 +237,7 @@ main(int argc, char *argv[]) static void awkvarinit() { - register NODE *np; + NODE *np; (void) setvbuf(stderr, NULL, _IONBF, 0); @@ -232,18 +246,18 @@ awkvarinit() gettext("not enough available file descriptors")); exit(1); } - ofiles = (OFILE *) emalloc(sizeof(OFILE)*NIOSTREAM); + ofiles = (OFILE *)emalloc(sizeof (OFILE)*NIOSTREAM); #ifdef A_ZERO_POINTERS - (void) memset((wchar_t *) ofiles, 0, sizeof(OFILE) * NIOSTREAM); + (void) memset((wchar_t *)ofiles, 0, sizeof (OFILE) * NIOSTREAM); #else { - /* initialize file descriptor table */ - OFILE *fp; - for (fp = ofiles; fp < &ofiles[NIOSTREAM]; fp += 1) { - fp->f_fp = FNULL; - fp->f_mode = 0; - fp->f_name = (char *)0; - } + /* initialize file descriptor table */ + OFILE *fp; + for (fp = ofiles; fp < &ofiles[NIOSTREAM]; fp += 1) { + fp->f_fp = FNULL; + fp->f_mode = 0; + fp->f_name = (char *)0; + } } #endif constant = intnode((INT)0); @@ -260,14 +274,14 @@ awkvarinit() field0 = node(FIELD, const0, NNULL); { - register RESFUNC near*rp; + RESFUNC near*rp; for (rp = &resfuncs[0]; rp->rf_name != (LOCCHARP)NULL; ++rp) { np = finstall(rp->rf_name, rp->rf_func, rp->rf_type); } } { - register RESERVED near*rp; + RESERVED near*rp; for (rp = &reserved[0]; rp->r_name != (LOCCHARP)NULL; ++rp) { switch (rp->r_type) { @@ -282,7 +296,7 @@ awkvarinit() (size_t)rp->r_ivalue); else { constant->n_int = rp->r_ivalue; - (void)assign(np, constant); + (void) assign(np, constant); } running = 0; break; @@ -319,13 +333,13 @@ awkvarinit() static void awkarginit(int ac, char **av) { - register int i; - register wchar_t *cp; + int i; + wchar_t *cp; ARGVsubi = node(INDEX, vlook(s_ARGV), constant); running = 1; constant->n_int = ac; - (void)assign(varARGC, constant); + (void) assign(varARGC, constant); for (i = 0; i < ac; ++i) { cp = mbstowcsdup(av[i]); constant->n_int = i; @@ -347,7 +361,7 @@ awkarginit(int ac, char **av) void uexit(NODE *np) { - register NODE *formal; + NODE *formal; while ((formal = getlist(&np)) != NNULL) delsymtab(formal, 0); @@ -360,7 +374,7 @@ int yylex() #ifdef DEBUG { - register int l; + int l; l = yyhex(); if (dflag) @@ -370,7 +384,7 @@ yylex() yyhex() #endif { - register wint_t c, c1; + wint_t c, c1; int i; static int savetoken = 0; static int wasfield; @@ -379,13 +393,13 @@ yyhex() static struct ctosymstruct { wint_t c, sym; } ctosym[] = { - { '|', BAR }, { '^', CARAT }, - { '~', TILDE }, { '<', LANGLE }, - { '>', RANGLE }, { '+', PLUSC }, - { '-', HYPHEN }, { '*', STAR }, - { '/', SLASH }, { '%', PERCENT }, - { '!', EXCLAMATION }, { '$', DOLLAR }, - { '[', LSQUARE }, { ']', RSQUARE }, + { '|', BAR }, { '^', CARAT }, + { '~', TILDE }, { '<', LANGLE }, + { '>', RANGLE }, { '+', PLUSC }, + { '-', HYPHEN }, { '*', STAR }, + { '/', SLASH }, { '%', PERCENT }, + { '!', EXCLAMATION }, { '$', DOLLAR }, + { '[', LSQUARE }, { ']', RSQUARE }, { '(', LPAREN }, { ')', RPAREN }, { ';', SEMI }, { '{', LBRACE }, { '}', RBRACE }, { 0, 0 } @@ -401,9 +415,9 @@ yyhex() savetoken = c; return (lexlast = lexregexp(c)); } else while ((c = lexgetc()) != WEOF) { - if (iswalpha(c) || c=='_') { + if (iswalpha(c) || c == '_') { c = lexid(c); - } else if (iswdigit(c) || c=='.') { + } else if (iswdigit(c) || c == '.') { c = lexnumber(c); } else if (isWblank(c)) { continue; @@ -418,7 +432,7 @@ yyhex() break; case '#': - while ((c = lexgetc())!='\n' && c!=WEOF) + while ((c = lexgetc()) != '\n' && c != WEOF) ; lexungetc(c); continue; @@ -465,10 +479,10 @@ yyhex() break; case '/': - if ((c1 = lexgetc()) == '=' - && lexlast!=RE && lexlast!=NRE - && lexlast!=';' && lexlast!='\n' - && lexlast!=',' && lexlast!='(') + if ((c1 = lexgetc()) == '=' && + lexlast != RE && lexlast != NRE && + lexlast != ';' && lexlast != '\n' && + lexlast != ',' && lexlast != '(') c = ADIV; else lexungetc(c1); @@ -505,7 +519,7 @@ yyhex() c = APPEND; else { lexungetc(c1); - if (nparen==0 && inprint) + if (nparen == 0 && inprint) c = WRITE; } break; @@ -632,8 +646,8 @@ yyhex() default: if (!iswprint(c)) awkerr( - gettext("invalid character \"%s\""), - toprint(c)); + gettext("invalid character \"%s\""), + toprint(c)); break; } break; @@ -650,7 +664,7 @@ yyhex() c = CONCAT; catterm = 0; } else if (!isfuncdef) { - if ((c1=lexgetc()) != '(') + if ((c1 = lexgetc()) != '(') ++catterm; lexungetc(c1); } @@ -672,7 +686,7 @@ yyhex() case INC: case DEC: - if (!catterm || lexlast!=CONSTANT || wasfield) + if (!catterm || lexlast != CONSTANT || wasfield) break; case UFUNC: @@ -688,7 +702,7 @@ yyhex() } break; - /*{*/case '}': + /* { */ case '}': if (nbrace == 0) savetoken = ';'; case ';': @@ -720,9 +734,9 @@ yyhex() static int lexnumber(wint_t c) { - register wchar_t *cp; - register int dotfound = 0; - register int efound = 0; + wchar_t *cp; + int dotfound = 0; + int efound = 0; INT number; cp = linebuf; @@ -732,8 +746,8 @@ lexnumber(wint_t c) else if (c == '.') { if (dotfound++) break; - } else if (c=='e' || c=='E') { - if ((c = lexgetc())!='-' && c!='+') { + } else if (c == 'e' || c == 'E') { + if ((c = lexgetc()) != '-' && c != '+') { lexungetc(c); c = 'e'; } else @@ -745,13 +759,12 @@ lexnumber(wint_t c) *cp++ = c; } while ((c = lexgetc()) != WEOF); *cp = '\0'; - if (dotfound && cp==linebuf+1) + if (dotfound && cp == linebuf+1) return (DOT); lexungetc(c); errno = 0; - if (!dotfound - && !efound - && ((number=wcstol(linebuf, (wchar_t **)0, 10)), errno!=ERANGE)) + if (!dotfound && !efound && + ((number = wcstol(linebuf, (wchar_t **)0, 10)), errno != ERANGE)) yylval.node = intnode(number); else yylval.node = realnode((REAL)wcstod(linebuf, (wchar_t **)0)); @@ -766,20 +779,20 @@ lexnumber(wint_t c) static int lexid(wint_t c) { - register wchar_t *cp; - register size_t i; - register NODE *np; + wchar_t *cp; + size_t i; + NODE *np; cp = linebuf; do { *cp++ = c; c = lexgetc(); - } while (iswalpha(c) || iswdigit(c) || c=='_'); + } while (iswalpha(c) || iswdigit(c) || c == '_'); *cp = '\0'; lexungetc(c); yylval.node = np = vlook(linebuf); - switch(np->n_type) { + switch (np->n_type) { case KEYWORD: switch (np->n_keywtype) { case PRINT: @@ -801,16 +814,16 @@ lexid(wint_t c) */ if (funparm) { do_funparm: - np = emptynode(PARM, i=(cp-linebuf)); + np = emptynode(PARM, i = (cp-linebuf)); np->n_flags = FSTRING; np->n_string = _null; np->n_strlen = 0; (void) memcpy(np->n_name, linebuf, - (i+1) * sizeof(wchar_t)); + (i+1) * sizeof (wchar_t)); addsymtab(np); yylval.node = np; } else if (np == varNF || (np == varFS && - (!doing_begin || begin_getline))) { + (!doing_begin || begin_getline))) { /* * If the user program references NF or sets * FS either outside of a begin block or @@ -851,7 +864,7 @@ do_funparm: static int lexstring(wint_t endc) { - register size_t length = lexescape(endc, 0, 0); + size_t length = lexescape(endc, 0, 0); yylval.node = stringnode(linebuf, FALLOC, length); return (CONSTANT); @@ -907,7 +920,7 @@ lexescape(wint_t endc, int regx, int cmd_line_operand) (void) strcpy(eofre, gettext("EOF in regular expression\n")); (void) strcpy(eofstr, gettext("EOF in string\n")); first_time = 0; - } + } cp = linebuf; while ((c = lexgetc()) != endc) { @@ -949,7 +962,7 @@ lexescape(wint_t endc, int regx, int cmd_line_operand) break; case 'a': - c = (char) 0x07; + c = (char)0x07; break; case 'x': @@ -997,7 +1010,7 @@ lexescape(wint_t endc, int regx, int cmd_line_operand) n = 0; do { n = (n<<3) + c-'0'; - if ((c = lexgetc())>'7' || c<'0') + if ((c = lexgetc()) > '7' || c < '0') break; } while (--max); lexungetc(c); @@ -1040,12 +1053,12 @@ lexescape(wint_t endc, int regx, int cmd_line_operand) NODE * renode(wchar_t *s) { - register NODE *np; + NODE *np; int n; np = emptynode(RE, 0); np->n_left = np->n_right = NNULL; - np->n_regexp = (REGEXP)emalloc(sizeof(regex_t)); + np->n_regexp = (REGEXP)emalloc(sizeof (regex_t)); if ((n = REGWCOMP(np->n_regexp, s, REG_EXTENDED)) != REG_OK) { int m; char *p; @@ -1063,10 +1076,10 @@ renode(wchar_t *s) static wint_t lexgetc() { - register wint_t c; + wint_t c; static char **files = &progfiles[0]; - if (progfp!=FNULL && (c = fgetwc(progfp))!=WEOF) + if (progfp != FNULL && (c = fgetwc(progfp)) != WEOF) ; else { if (progptr != NULL) { @@ -1077,16 +1090,17 @@ lexgetc() } else { if (progfp != FNULL) if (progfp != stdin) - (void)fclose(progfp); + (void) fclose(progfp); else clearerr(progfp); progfp = FNULL; if (files < progfilep) { filename = *files++; lineno = 1; - if (filename[0]=='-' && filename[1]=='\0') + if (filename[0] == '-' && filename[1] == '\0') progfp = stdin; - else if ((progfp=fopen(filename, r)) == FNULL) { + else if ((progfp = fopen(filename, r)) + == FNULL) { (void) fprintf(stderr, gettext("script file \"%s\""), filename); exit(1); @@ -1119,7 +1133,7 @@ lexungetc(wint_t c) *--conptr = '\0'; } if (progfp != FNULL) { - (void)ungetwc(c, progfp); + (void) ungetwc(c, progfp); return; } if (c == WEOF) @@ -1134,7 +1148,7 @@ lexungetc(wint_t c) void yyerror(char *s, ...) { - if (lexlast==FUNC || lexlast==GETLINE || lexlast==KEYWORD) + if (lexlast == FUNC || lexlast == GETLINE || lexlast == KEYWORD) if (lexlast == KEYWORD) awkerr(gettext("inadmissible use of reserved keyword")); else @@ -1184,12 +1198,13 @@ awkierr(int perr, char *fmt, va_list ap) (void) fprintf(stderr, "%s: ", _cmdname); if (running) { (void) fprintf(stderr, gettext("line %u ("), - curnode==NNULL ? 0 : curnode->n_lineno); + curnode == NNULL ? 0 : curnode->n_lineno); if (phase == 0) - (void) fprintf(stderr, "NR=%lld): ", (INT)exprint(varNR)); + (void) fprintf(stderr, "NR=%lld): ", + (INT)exprint(varNR)); else - (void) fprintf(stderr, "%s): ", - phase==BEGIN ? s_BEGIN : s_END); + (void) fprintf(stderr, "%s): ", + phase == BEGIN ? s_BEGIN : s_END); } else if (lineno != 0) { (void) fprintf(stderr, gettext("file \"%s\": "), filename); (void) fprintf(stderr, gettext("line %u: "), lineno); @@ -1198,9 +1213,9 @@ awkierr(int perr, char *fmt, va_list ap) if (perr == 1) (void) fprintf(stderr, ": %s", strerror(saveerr)); if (perr != 2 && !running) { - register wchar_t *cp; - register int n; - register int c; + wchar_t *cp; + int n; + int c; (void) fprintf(stderr, gettext(" Context is:%s"), sep1); cp = conptr; @@ -1209,10 +1224,10 @@ awkierr(int perr, char *fmt, va_list ap) if (cp >= &context[NCONTEXT]) cp = &context[0]; if ((c = *cp++) != '\0') - (void)fputs(c=='\n' ? sep1 : toprint(c), - stderr); + (void) fputs(c == '\n' ? sep1 : toprint(c), + stderr); } while (--n != 0); - (void)fputs(sep2, stderr); + (void) fputs(sep2, stderr); } (void) fprintf(stderr, "\n"); exit(1); @@ -1225,7 +1240,7 @@ emalloc(unsigned n) if ((cp = malloc(n)) == NULL) awkerr(nomem); - return cp; + return (cp); } wchar_t * @@ -1235,7 +1250,7 @@ erealloc(wchar_t *p, unsigned n) if ((cp = realloc(p, n)) == NULL) awkerr(nomem); - return cp; + return (cp); } @@ -1276,53 +1291,53 @@ mbunconvert(wchar_t *str) * Solaris port - following functions are typical MKS functions written * to work for Solaris. */ - + wchar_t * mbstowcsdup(s) char *s; { - int n; - wchar_t *w; - - n = strlen(s) + 1; - if ((w = (wchar_t *)malloc(n * sizeof (wchar_t))) == NULL) - return (NULL); - - if (mbstowcs(w, s, n) == -1) - return (NULL); - return (w); - + int n; + wchar_t *w; + + n = strlen(s) + 1; + if ((w = (wchar_t *)malloc(n * sizeof (wchar_t))) == NULL) + return (NULL); + + if (mbstowcs(w, s, n) == -1) + return (NULL); + return (w); + } - + char * wcstombsdup(wchar_t *w) { - int n; - char *mb; - - /* Fetch memory for worst case string length */ - n = wslen(w) + 1; - n *= MB_CUR_MAX; - if ((mb = (char *)malloc(n)) == NULL) { - return (NULL); - } - - /* Convert the string */ - if ((n = wcstombs(mb, w, n)) == -1) { - int saverr = errno; - - free(mb); - errno = saverr; - return (0); - } - - /* Shrink the string down */ - if ((mb = (char *)realloc(mb, strlen(mb)+1)) == NULL) { - return (NULL); - } - return (mb); + int n; + char *mb; + + /* Fetch memory for worst case string length */ + n = wslen(w) + 1; + n *= MB_CUR_MAX; + if ((mb = (char *)malloc(n)) == NULL) { + return (NULL); + } + + /* Convert the string */ + if ((n = wcstombs(mb, w, n)) == -1) { + int saverr = errno; + + free(mb); + errno = saverr; + return (0); + } + + /* Shrink the string down */ + if ((mb = (char *)realloc(mb, strlen(mb)+1)) == NULL) { + return (NULL); + } + return (mb); } - + /* * The upe_ctrls[] table contains the printable 'control-sequences' for the * character values 0..31 and 127. The first entry is for value 127, thus the @@ -1330,11 +1345,11 @@ wcstombsdup(wchar_t *w) */ static const char *const upe_ctrls[] = { - "^?", - "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", - "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O", - "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", - "^X", "^Y", "^Z", "^[", "^\\", "^]", "^^", "^_" + "^?", + "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", + "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O", + "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", + "^X", "^Y", "^Z", "^[", "^\\", "^]", "^^", "^_" }; @@ -1348,30 +1363,30 @@ static const char * toprint(c) wchar_t c; { - int n, len; - unsigned char *ptr; - static char mbch[MB_LEN_MAX+1]; - static char buf[5 * MB_LEN_MAX + 1]; - - if ((n = wctomb(mbch, c)) == -1) { - /* Should never happen */ - (void) sprintf(buf, "\\%x", c); - return (buf); - } - mbch[n] = '\0'; - if (iswprint(c)) { - return (mbch); - } else if (c == 127) { - return (upe_ctrls[0]); - } else if (c < 32) { - /* Print as in Table 5-101 in the UPE */ - return (upe_ctrls[c+1]); - } else { - /* Print as an octal escape sequence */ - for (len = 0, ptr = (unsigned char *) mbch; 0 < n; --n, ++ptr) - len += sprintf(buf+len, "\\%03o", *ptr); - } - return (buf); + int n, len; + unsigned char *ptr; + static char mbch[MB_LEN_MAX+1]; + static char buf[5 * MB_LEN_MAX + 1]; + + if ((n = wctomb(mbch, c)) == -1) { + /* Should never happen */ + (void) sprintf(buf, "\\%x", c); + return (buf); + } + mbch[n] = '\0'; + if (iswprint(c)) { + return (mbch); + } else if (c == 127) { + return (upe_ctrls[0]); + } else if (c < 32) { + /* Print as in Table 5-101 in the UPE */ + return (upe_ctrls[c+1]); + } else { + /* Print as an octal escape sequence */ + for (len = 0, ptr = (unsigned char *) mbch; 0 < n; --n, ++ptr) + len += sprintf(buf+len, "\\%03o", *ptr); + } + return (buf); } static int @@ -1395,12 +1410,12 @@ wcoff(const wchar_t *astring, const int off) } int -int_regwcomp(register regex_t *r, const wchar_t *pattern, int uflags) +int_regwcomp(regex_t *r, const wchar_t *pattern, int uflags) { char *mbpattern; int ret; - if ((mbpattern = wcstombsdup((wchar_t *) pattern)) == NULL) + if ((mbpattern = wcstombsdup((wchar_t *)pattern)) == NULL) return (REG_ESPACE); ret = regcomp(r, mbpattern, uflags); @@ -1419,9 +1434,9 @@ int_regwexec(const regex_t *r, /* compiled RE */ { char *mbs; regmatch_t *mbsub = NULL; - register int i; + int i; - if ((mbs = wcstombsdup((wchar_t *) astring)) == NULL) + if ((mbs = wcstombsdup((wchar_t *)astring)) == NULL) return (REG_ESPACE); if (nsub > 0 && sub) { @@ -1433,7 +1448,7 @@ int_regwexec(const regex_t *r, /* compiled RE */ /* Now, adjust the pointers/counts in sub */ if (i == REG_OK && nsub > 0 && mbsub) { - register int j, k; + int j, k; for (j = 0; j < nsub; j++) { regmatch_t *ms = &mbsub[j]; @@ -1457,7 +1472,7 @@ int_regwexec(const regex_t *r, /* compiled RE */ } int -int_regwdosuba(register regex_t *rp, /* compiled RE: Pattern */ +int_regwdosuba(regex_t *rp, /* compiled RE: Pattern */ const wchar_t *rpl, /* replacement string: /rpl/ */ const wchar_t *src, /* source string */ wchar_t **dstp, /* destination string */ @@ -1465,10 +1480,10 @@ int_regwdosuba(register regex_t *rp, /* compiled RE: Pattern */ int *globp) /* IN: occurence, 0 for all; OUT: substitutions */ { wchar_t *dst, *odst; - register const wchar_t *ip, *xp; - register wchar_t *op; - register int i; - register wchar_t c; + const wchar_t *ip, *xp; + wchar_t *op; + int i; + wchar_t c; int glob, iglob = *globp, oglob = 0; #define NSUB 10 int_regwmatch_t rm[NSUB], *rmp; @@ -1481,7 +1496,7 @@ int_regwdosuba(register regex_t *rp, /* compiled RE: Pattern */ #undef OVERFLOW #define OVERFLOW(i) if (1) { \ int pos = op - dst; \ - dst = (wchar_t *) realloc(odst = dst, \ + dst = (wchar_t *)realloc(odst = dst, \ (len += len + i) * sizeof (wchar_t)); \ if (dst == NULL) \ goto nospace; \ @@ -1490,7 +1505,7 @@ int_regwdosuba(register regex_t *rp, /* compiled RE: Pattern */ } else #endif - *dstp = dst = (wchar_t *) malloc(len * sizeof (wchar_t)); + *dstp = dst = (wchar_t *)malloc(len * sizeof (wchar_t)); if (dst == NULL) return (REG_ESPACE); @@ -1560,11 +1575,11 @@ int_regwdosuba(register regex_t *rp, /* compiled RE: Pattern */ if (op + (i = wcslen(ip)) >= end) OVERFLOW(i); while (i--) - *op++ = *ip++; + *op++ = *ip++; *op++ = '\0'; - if ((*dstp = dst = (wchar_t *) realloc(odst = dst, - sizeof (wchar_t) * (size_t)(op - dst))) == NULL) { + if ((*dstp = dst = (wchar_t *)realloc(odst = dst, + sizeof (wchar_t) * (size_t)(op - dst))) == NULL) { nospace: free(odst); return (REG_ESPACE); diff --git a/usr/src/cmd/awk_xpg4/awk2.c b/usr/src/cmd/awk_xpg4/awk2.c index d5e8b0e934..60d74338b1 100644 --- a/usr/src/cmd/awk_xpg4/awk2.c +++ b/usr/src/cmd/awk_xpg4/awk2.c @@ -20,18 +20,22 @@ * CDDL HEADER END */ /* - * awk -- process input files, field extraction, output - * - * Copyright (c) 1995, 1996-2000 by Sun Microsystems, Inc. - * All rights reserved. - * + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* * Copyright 1986, 1994 by Mortice Kern Systems Inc. All rights reserved. - * - * Based on MKS awk(1) ported to be /usr/xpg4/bin/awk with POSIX/XCU4 changes */ #pragma ident "%Z%%M% %I% %E% SMI" +/* + * awk -- process input files, field extraction, output + * + * Based on MKS awk(1) ported to be /usr/xpg4/bin/awk with POSIX/XCU4 changes + */ + #include "awk.h" #include "y.tab.h" @@ -42,7 +46,7 @@ static int exstat; /* Exit status */ static FILE *openfile(NODE *np, int flag, int fatal); static FILE *newfile(void); static NODE *nextarg(NODE **npp); -static void adjust_buf(wchar_t **,int *, wchar_t **, char *, size_t); +static void adjust_buf(wchar_t **, int *, wchar_t **, char *, size_t); static void awk_putwc(wchar_t, FILE *); /* @@ -69,12 +73,12 @@ nextrecord(wchar_t *cp, FILE *fp) wchar_t *ep = cp; nextfile: - if (fp==FNULL && (fp=newfile())==FNULL) + if (fp == FNULL && (fp = newfile()) == FNULL) return (0); if ((*awkrecord)(ep, NLINE, fp) == NULL) { if (fp == awkinfp) { if (fp != stdin) - (void)fclose(awkinfp); + (void) fclose(awkinfp); awkinfp = fp = FNULL; goto nextfile; } @@ -84,11 +88,13 @@ nextfile: } if (fp == awkinfp) { if (varNR->n_flags & FINT) - ++varNR->n_int; else - (void)exprreduce(incNR); + ++varNR->n_int; + else + (void) exprreduce(incNR); if (varFNR->n_flags & FINT) - ++varFNR->n_int; else - (void)exprreduce(incFNR); + ++varFNR->n_int; + else + (void) exprreduce(incFNR); } if (cp == linebuf) { lbuflen = reclen; @@ -99,13 +105,52 @@ nextfile: /* if record length is too long then bail out */ if (reclen > NLINE - 2) { awkerr(gettext("Record too long (LIMIT: %d bytes)"), - NLINE - 1); + NLINE - 1); /* Not Reached */ } return (1); } /* + * isclvar() + * + * Returns 1 if the input string, arg, is a variable assignment, + * otherwise returns 0. + * + * An argument to awk can be either a pathname of a file, or a variable + * assignment. An operand that begins with an undersore or alphabetic + * character from the portable character set, followed by a sequence of + * underscores, digits, and alphabetics from the portable character set, + * followed by the '=' character, shall specify a variable assignment + * rather than a pathname. + */ +int +isclvar(wchar_t *arg) +{ + wchar_t *tmpptr = arg; + + if (tmpptr != NULL) { + + /* Begins with an underscore or alphabetic character */ + if (iswalpha(*tmpptr) || *tmpptr == '_') { + + /* + * followed by a sequence of underscores, digits, + * and alphabetics + */ + for (tmpptr++; *tmpptr; tmpptr++) { + if (!(isalnum(*tmpptr) || (*tmpptr == '_'))) { + break; + } + } + return (*tmpptr == '='); + } + } + + return (0); +} + +/* * Return the next file from the command line. * Return FNULL when no more files. * Sets awkinfp variable to the new current input file. @@ -115,8 +160,8 @@ newfile() { static int argindex = 1; static int filedone; - register wchar_t *ap; - register int argc; + wchar_t *ap; + int argc; wchar_t *arg; extern void strescape(wchar_t *); @@ -132,24 +177,29 @@ newfile() } constant->n_int = argindex++; arg = (wchar_t *)exprstring(ARGVsubi); - if ((ap = wcschr(arg, '=')) != NULL) { + /* + * If the argument contains a '=', determine if the + * argument needs to be treated as a variable assignment + * or as the pathname of a file. + */ + if (((ap = wcschr(arg, '=')) != NULL) && isclvar(arg)) { *ap = '\0'; strescape(ap+1); - strassign(vlook(arg),linebuf,FALLOC|FSENSE, - wcslen(linebuf)); + strassign(vlook(arg), linebuf, FALLOC|FSENSE, + wcslen(linebuf)); *ap = '='; continue; } if (arg[0] == '\0') continue; ++filedone; - if (arg[0]=='-' && arg[1]=='\0') { + if (arg[0] == '-' && arg[1] == '\0') { awkinfp = stdin; break; } if ((awkinfp = fopen(mbunconvert(arg), r)) == FNULL) { (void) fprintf(stderr, gettext("input file \"%s\""), - mbunconvert(arg)); + mbunconvert(arg)); exstat = 1; continue; } @@ -157,8 +207,9 @@ newfile() } strassign(varFILENAME, arg, FALLOC, wcslen(arg)); if (varFNR->n_flags & FINT) - varFNR->n_int = 0; else - (void)exprreduce(clrFNR); + varFNR->n_int = 0; + else + (void) exprreduce(clrFNR); return (awkinfp); } @@ -170,26 +221,27 @@ newfile() wchar_t * defrecord(wchar_t *bp, int lim, FILE *fp) { - register wchar_t *endp; + wchar_t *endp; if (fgetws(bp, lim, fp) == NULL) { *bp = '\0'; return (NULL); } -/* XXXX - switch (fgetws(bp, lim, fp)) { - case M_FGETS_EOF: - *bp = '\0'; - return (NULL); - case M_FGETS_BINARY: - awkerr(gettext("file is binary")); - case M_FGETS_LONG: - awkerr(gettext("line too long: limit %d"), - lim); - case M_FGETS_ERROR: - awkperr(gettext("error reading file")); - } -*/ +/* + * XXXX + * switch (fgetws(bp, lim, fp)) { + * case M_FGETS_EOF: + * *bp = '\0'; + * return (NULL); + * case M_FGETS_BINARY: + * awkerr(gettext("file is binary")); + * case M_FGETS_LONG: + * awkerr(gettext("line too long: limit %d"), + * lim); + * case M_FGETS_ERROR: + * awkperr(gettext("error reading file")); + * } + */ if (*(endp = (bp + (reclen = wcslen(bp))-1)) == '\n') { *endp = '\0'; @@ -206,18 +258,18 @@ defrecord(wchar_t *bp, int lim, FILE *fp) wchar_t * charrecord(wchar_t *abp, int alim, FILE *fp) { - register wchar_t *bp; - register wint_t c; - register int limit = alim; - register wint_t endc; + wchar_t *bp; + wint_t c; + int limit = alim; + wint_t endc; bp = abp; endc = *(wchar_t *)varRS->n_string; - while (--limit>0 && (c = getwc(fp))!=endc && c!=WEOF) + while (--limit > 0 && (c = getwc(fp)) != endc && c != WEOF) *bp++ = c; *bp = '\0'; reclen = bp-abp; - return (c==WEOF && bp==abp ? NULL : abp); + return (c == WEOF && bp == abp ? NULL : abp); } /* @@ -226,8 +278,8 @@ charrecord(wchar_t *abp, int alim, FILE *fp) wchar_t * multirecord(wchar_t *abp, int limit, FILE *fp) { - register wchar_t *bp; - register int c; + wchar_t *bp; + int c; while ((c = getwc(fp)) == '\n') ; @@ -235,7 +287,7 @@ multirecord(wchar_t *abp, int limit, FILE *fp) if (c != WEOF) do { if (--limit == 0) break; - if (c=='\n' && bp[-1]=='\n') + if (c == '\n' && bp[-1] == '\n') break; *bp++ = c; @@ -244,7 +296,7 @@ multirecord(wchar_t *abp, int limit, FILE *fp) if (bp > abp) *--bp = '\0'; reclen = bp-abp; - return (c==WEOF && bp==abp ? NULL : abp); + return (c == WEOF && bp == abp ? NULL : abp); } /* @@ -257,15 +309,16 @@ multirecord(wchar_t *abp, int limit, FILE *fp) wchar_t * whitefield(wchar_t **endp) { - register wchar_t *sp; - register wchar_t *ep; + wchar_t *sp; + wchar_t *ep; sp = *endp; - while (*sp==' ' || *sp=='\t' || *sp=='\n') + while (*sp == ' ' || *sp == '\t' || *sp == '\n') ++sp; if (*sp == '\0') return (NULL); - for (ep = sp; *ep!=' ' && *ep!='\0' && *ep!='\t' && *ep!='\n'; ++ep) + for (ep = sp; *ep != ' ' && *ep != '\0' && *ep != '\t' && + *ep != '\n'; ++ep) ; *endp = ep; return (sp); @@ -278,14 +331,14 @@ whitefield(wchar_t **endp) wchar_t * blackfield(wchar_t **endp) { - register wchar_t *cp; - register int endc; + wchar_t *cp; + int endc; endc = *(wchar_t *)varFS->n_string; cp = *endp; if (*cp == '\0') return (NULL); - if (*cp==endc && fcount!=0) + if (*cp == endc && fcount != 0) cp++; if ((*endp = wcschr(cp, endc)) == NULL) *endp = wcschr(cp, '\0'); @@ -300,8 +353,8 @@ blackfield(wchar_t **endp) wchar_t * refield(wchar_t **endpp) { - register wchar_t *cp, *start; - register int flags; + wchar_t *cp, *start; + int flags; static REGWMATCH_T match[10]; int result; @@ -336,9 +389,10 @@ again: *endpp = wcschr(cp, '\0'); break; default: - regerror(result, resep, (char *)linebuf, sizeof(linebuf)); + (void) regerror(result, resep, (char *)linebuf, + sizeof (linebuf)); awkerr(gettext("error splitting record: %s"), - (char *)linebuf); + (char *)linebuf); } return (start); } @@ -349,13 +403,13 @@ again: void dobegin() { - /*l + /* * Free all keyword nodes to save space. */ { NODE *np; int nbuck; - register NODE *knp; + NODE *knp; np = NNULL; nbuck = 0; @@ -363,22 +417,22 @@ dobegin() if (knp->n_type == KEYWORD) delsymtab(knp, 1); } - /*l + /* * Copy ENVIRON array only if needed. * Note the convoluted work to assign to an array * and that the temporary nodes will be freed by * freetemps() because we are "running". */ if (needenviron) { - register char **app; - register wchar_t *name, *value; - register NODE *namep = stringnode(_null, FSTATIC, 0); - register NODE *valuep = stringnode(_null, FSTATIC, 0); - register NODE *ENVsubname = node(INDEX, varENVIRON, namep); + char **app; + wchar_t *name, *value; + NODE *namep = stringnode(_null, FSTATIC, 0); + NODE *valuep = stringnode(_null, FSTATIC, 0); + NODE *ENVsubname = node(INDEX, varENVIRON, namep); extern char **environ; /* (void) m_setenv(); XXX what's this do? */ - for (app = environ; *app != NULL;) { + for (app = environ; *app != NULL; /* empty */) { name = mbstowcsdup(*app++); if ((value = wcschr(name, '=')) != NULL) { @@ -390,7 +444,7 @@ dobegin() valuep->n_string = _null; } namep->n_strlen = wcslen(namep->n_string = name); - (void)assign(ENVsubname, valuep); + (void) assign(ENVsubname, valuep); if (value != NULL) value[-1] = '='; } @@ -414,7 +468,7 @@ dobegin() void doend(int s) { - register OFILE *op; + OFILE *op; if (phase != END) { phase = END; @@ -435,36 +489,35 @@ doend(int s) void s_print(NODE *np) { - register FILE *fp; + FILE *fp; NODE *listp; - register char *ofs; - register int notfirst = 0; + char *ofs; + int notfirst = 0; fp = openfile(np->n_right, 1, 1); if (np->n_left == NNULL) - (void)fputs(mbunconvert(linebuf), fp); + (void) fputs(mbunconvert(linebuf), fp); else { - ofs = wcstombsdup((isstring(varOFS->n_flags)) ? - (wchar_t *)varOFS->n_string : - (wchar_t *)exprstring(varOFS)); + ofs = wcstombsdup((isstring(varOFS->n_flags)) ? + (wchar_t *)varOFS->n_string : + (wchar_t *)exprstring(varOFS)); listp = np->n_left; while ((np = getlist(&listp)) != NNULL) { if (notfirst++) - (void)fputs(ofs, fp); + (void) fputs(ofs, fp); np = exprreduce(np); if (np->n_flags & FINT) (void) fprintf(fp, "%lld", (INT)np->n_int); else if (isstring(np->n_flags)) - (void) fprintf(fp, "%S", - np->n_string); + (void) fprintf(fp, "%S", np->n_string); else (void) fprintf(fp, - mbunconvert((wchar_t *)exprstring(varOFMT)), + mbunconvert((wchar_t *)exprstring(varOFMT)), (double)np->n_real); } free(ofs); } - (void)fputs(mbunconvert(isstring(varORS->n_flags) ? + (void) fputs(mbunconvert(isstring(varORS->n_flags) ? (wchar_t *)varORS->n_string : (wchar_t *)exprstring(varORS)), fp); if (ferror(fp)) @@ -477,10 +530,10 @@ s_print(NODE *np) void s_prf(NODE *np) { - register FILE *fp; + FILE *fp; fp = openfile(np->n_right, 1, 1); - (void)xprintf(np->n_left, fp, (wchar_t **)NULL); + (void) xprintf(np->n_left, fp, (wchar_t **)NULL); if (ferror(fp)) awkperr("error on printf"); } @@ -496,31 +549,32 @@ s_prf(NODE *np) NODE * f_getline(NODE *np) { - register wchar_t *cp; - register INT ret; - register FILE *fp; - register size_t len; + wchar_t *cp; + INT ret; + FILE *fp; + size_t len; if (np->n_right == NULL && phase == END) { /* Pretend we've reached end of (the non-existant) file. */ - return intnode(0); - } + return (intnode(0)); + } if ((fp = openfile(np->n_right, 0, 0)) != FNULL) { if (np->n_left == NNULL) { ret = nextrecord(linebuf, fp); } else { - cp = emalloc(NLINE * sizeof(wchar_t)); + cp = emalloc(NLINE * sizeof (wchar_t)); ret = nextrecord(cp, fp); np = np->n_left; len = wcslen(cp); - cp = erealloc(cp, (len+1)*sizeof(wchar_t)); + cp = erealloc(cp, (len+1)*sizeof (wchar_t)); if (isleaf(np->n_flags)) { if (np->n_type == PARM) np = np->n_next; strassign(np, cp, FNOALLOC, len); } else - (void)assign(np, stringnode(cp, FNOALLOC, len)); + (void) assign(np, stringnode(cp, + FNOALLOC, len)); } } else ret = -1; @@ -533,11 +587,11 @@ f_getline(NODE *np) static FILE * openfile(NODE *np, int flag, int fatal) { - register OFILE *op; - register char *cp; - register FILE *fp; - register int type; - register OFILE *fop; + OFILE *op; + char *cp; + FILE *fp; + int type; + OFILE *fop; if (np == NNULL) { if (flag) @@ -556,8 +610,7 @@ openfile(NODE *np, int flag, int fatal) fop = op; continue; } - if (op->f_mode == type - && strcmp(op->f_name, cp)==0) + if (op->f_mode == type && strcmp(op->f_name, cp) == 0) return (op->f_fp); } if (fop == (OFILE *)NULL) @@ -565,7 +618,7 @@ openfile(NODE *np, int flag, int fatal) flag ? "print/printf" : "getline", cp); (void) fflush(stdout); op = fop; - if (cp[0]=='-' && cp[1]=='\0') { + if (cp[0] == '-' && cp[1] == '\0') { fp = flag ? stdout : stdin; } else { switch (np->n_type) { @@ -575,24 +628,24 @@ openfile(NODE *np, int flag, int fatal) (void) setvbuf(fp, 0, _IONBF, 0); } break; - + case APPEND: fp = fopen(cp, "a"); break; - + case PIPE: fp = popen(cp, w); - (void) setvbuf(fp, (char *) 0, _IOLBF, 0); + (void) setvbuf(fp, (char *)0, _IOLBF, 0); break; - + case PIPESYM: fp = popen(cp, r); break; - + case LT: fp = fopen(cp, r); break; - + default: awkerr(interr, "openfile"); } @@ -603,7 +656,7 @@ openfile(NODE *np, int flag, int fatal) op->f_mode = type; } else if (fatal) { awkperr(flag ? gettext("output file \"%s\"") : - gettext("input file \"%s\""), cp); + gettext("input file \"%s\""), cp); } return (fp); } @@ -614,8 +667,8 @@ openfile(NODE *np, int flag, int fatal) void awkclose(OFILE *op) { - if (op->f_mode==PIPE || op->f_mode==PIPESYM) - (void)pclose(op->f_fp); + if (op->f_mode == PIPE || op->f_mode == PIPESYM) + (void) pclose(op->f_fp); else if (fclose(op->f_fp) == EOF) awkperr("error on stream \"%s\"", op->f_name); op->f_fp = FNULL; @@ -635,19 +688,19 @@ awkclose(OFILE *op) size_t xprintf(NODE *np, FILE *fp, wchar_t **cp) { - register wchar_t *fmt; - register int c; + wchar_t *fmt; + int c; wchar_t *bptr = (wchar_t *)NULL; char fmtbuf[40]; - register size_t length = 0; - register char *ofmtp; - register NODE *fnp; - register wchar_t *fmtsave; + size_t length = 0; + char *ofmtp; + NODE *fnp; + wchar_t *fmtsave; int slen; int cplen; fnp = getlist(&np); - if (isleaf(fnp->n_flags) && fnp->n_type==PARM) + if (isleaf(fnp->n_flags) && fnp->n_type == PARM) fnp = fnp->n_next; if (isstring(fnp->n_flags)) { fmt = fnp->n_string; @@ -662,7 +715,7 @@ xprintf(NODE *np, FILE *fp, wchar_t **cp) */ if (cp != (wchar_t **)NULL) { cplen = LINE_MAX; - bptr = *cp = emalloc(sizeof(wchar_t) * (cplen + wcslen(fmt))); + bptr = *cp = emalloc(sizeof (wchar_t) * (cplen + wcslen(fmt))); } while ((c = *fmt++) != '\0') { @@ -727,9 +780,9 @@ xprintf(NODE *np, FILE *fp, wchar_t **cp) wchar_t *ts = exprstring(nextarg(&np)); adjust_buf(cp, &cplen, &bptr, fmtbuf, - wcslen(ts)); + wcslen(ts)); (void) wsprintf(bptr, (const char *) fmtbuf, - ts); + ts); bptr += (slen = wcslen(bptr)); length += slen; } @@ -750,11 +803,11 @@ xprintf(NODE *np, FILE *fp, wchar_t **cp) *ofmtp = '\0'; if (bptr == (wchar_t *)NULL) length += fprintf(fp, fmtbuf, - exprint(nextarg(&np))); + exprint(nextarg(&np))); else { adjust_buf(cp, &cplen, &bptr, fmtbuf, 0); (void) wsprintf(bptr, (const char *) fmtbuf, - exprint(nextarg(&np))); + exprint(nextarg(&np))); bptr += (slen = wcslen(bptr)); length += slen; } @@ -770,11 +823,11 @@ xprintf(NODE *np, FILE *fp, wchar_t **cp) *ofmtp = '\0'; if (bptr == (wchar_t *)NULL) length += fprintf(fp, fmtbuf, - exprreal(nextarg(&np))); + exprreal(nextarg(&np))); else { adjust_buf(cp, &cplen, &bptr, fmtbuf, 0); (void) wsprintf(bptr, (const char *) fmtbuf, - exprreal(nextarg(&np))); + exprreal(nextarg(&np))); bptr += (slen = wcslen(bptr)); length += slen; } @@ -789,17 +842,17 @@ xprintf(NODE *np, FILE *fp, wchar_t **cp) sprintf(ofmtp, "%lld", (INT)exprint(nextarg(&np))); ofmtp += strlen(ofmtp); #else - ofmtp += sprintf(ofmtp, "%lld", (INT)exprint(nextarg(&np))); + ofmtp += sprintf(ofmtp, "%lld", + (INT)exprint(nextarg(&np))); #endif break; default: - if(c=='\0') { + if (c == '\0') { *ofmtp = (wchar_t)NULL; - fprintf(fp,"%s",fmtbuf); + (void) fprintf(fp, "%s", fmtbuf); continue; - } - else { + } else { *ofmtp++ = (wchar_t)c; break; } @@ -814,7 +867,7 @@ xprintf(NODE *np, FILE *fp, wchar_t **cp) */ if (bptr != (wchar_t *)NULL) { *bptr = '\0'; - *cp = erealloc(*cp, (length+1) * sizeof(wchar_t)); + *cp = erealloc(*cp, (length+1) * sizeof (wchar_t)); } return (length); } @@ -825,11 +878,11 @@ xprintf(NODE *np, FILE *fp, wchar_t **cp) static NODE * nextarg(NODE **npp) { - register NODE *np; + NODE *np; if ((np = getlist(npp)) == NNULL) awkerr(gettext("insufficient arguments to printf or sprintf")); - if (isleaf(np->n_flags) && np->n_type==PARM) + if (isleaf(np->n_flags) && np->n_type == PARM) return (np->n_next); return (np); } @@ -837,7 +890,7 @@ nextarg(NODE **npp) /* * Check and adjust the length of the buffer that has been passed in - * to make sure that it has space to accomodate the sequence string + * to make sure that it has space to accomodate the sequence string * described in fmtstr. This routine is used by xprintf() to allow * for arbitrarily long sprintf() strings. * @@ -856,8 +909,7 @@ adjust_buf(wchar_t **bp, int *len, wchar_t **offset, char *fmtstr, size_t slen) do { fmtstr++; - } while (strchr("-+ 0", *fmtstr) != (char *)0 || - *fmtstr == ('#')); + } while (strchr("-+ 0", *fmtstr) != (char *)0 || *fmtstr == ('#')); if (*fmtstr != '*') { if (isdigit(*fmtstr)) { width = *fmtstr-'0'; @@ -876,8 +928,7 @@ adjust_buf(wchar_t **bp, int *len, wchar_t **offset, char *fmtstr, size_t slen) } if (strchr("Llh", *fmtstr) != (char *)0) fmtstr++; - if (*fmtstr == 'S') - { + if (*fmtstr == 'S') { if (width && slen < width) slen = width; if (prec && slen > prec) @@ -890,7 +941,7 @@ adjust_buf(wchar_t **bp, int *len, wchar_t **offset, char *fmtstr, size_t slen) if (*offset+ width > *bp+ *len) { ioff = *offset-*bp; *len += width+1; - *bp = erealloc(*bp, *len * sizeof(wchar_t)); + *bp = erealloc(*bp, *len * sizeof (wchar_t)); *offset = *bp+ioff; } } @@ -903,8 +954,7 @@ awk_putwc(wchar_t c, FILE *fp) if ((mbl = wctomb(mb, c)) > 0) { mb[mbl] = '\0'; - (void)fputs(mb, fp); + (void) fputs(mb, fp); } else awkerr(gettext("invalid wide character %x"), c); } - diff --git a/usr/src/cmd/oawk/lib.c b/usr/src/cmd/oawk/lib.c index 05d2bb9a85..fe090e3c5d 100644 --- a/usr/src/cmd/oawk/lib.c +++ b/usr/src/cmd/oawk/lib.c @@ -19,15 +19,14 @@ * * CDDL HEADER END */ -/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ -/* All Rights Reserved */ - - /* - * Copyright (c) 1996-1999 by Sun Microsystems, Inc. - * All rights reserved. + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. */ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + #pragma ident "%Z%%M% %I% %E% SMI" #include <stdio.h> @@ -71,14 +70,13 @@ int maxfld = 0; /* last used field */ /* pointer to CELL for maximum field assigned to */ CELL *maxmfld = &fldtab[0]; - - +static int isclvar(wchar_t *); getrec() { - register wchar_t *rr, *er; - register c, sep; - register FILE *inf; + wchar_t *rr, *er; + int c, sep; + FILE *inf; extern int svargc; extern wchar_t **svargv; @@ -91,7 +89,12 @@ getrec() while (svargc > 0) { dprintf("svargc=%d, *svargv=%ws\n", svargc, *svargv, NULL); if (infile == NULL) { /* have to open a new file */ - if (member('=', *svargv)) { + /* + * If the argument contains a '=', determine if the + * argument needs to be treated as a variable assignment + * or as the pathname of a file. + */ + if (isclvar(*svargv)) { /* it's a var=value argument */ setclvar(*svargv); if (svargc > 1) { @@ -149,6 +152,44 @@ getrec() return (0); /* true end of file */ } +/* + * isclvar() + * + * Returns 1 if the input string, arg, is a variable assignment, + * otherwise returns 0. + * + * An argument to awk can be either a pathname of a file, or a variable + * assignment. An operand that begins with an undersore or alphabetic + * character from the portable character set, followed by a sequence of + * underscores, digits, and alphabetics from the portable character set, + * followed by the '=' character, shall specify a variable assignment + * rather than a pathname. + */ +static int +isclvar(wchar_t *arg) +{ + wchar_t *tmpptr = arg; + + if (tmpptr != NULL) { + + /* Begins with an underscore or alphabetic character */ + if (iswalpha(*tmpptr) || *tmpptr == '_') { + + /* + * followed by a sequence of underscores, digits, + * and alphabetics + */ + for (tmpptr++; *tmpptr; tmpptr++) { + if (!(isalnum(*tmpptr) || (*tmpptr == '_'))) { + break; + } + } + return (*tmpptr == '='); + } + } + + return (0); +} setclvar(s) /* set var=value from s */ wchar_t *s; @@ -168,7 +209,7 @@ wchar_t *s; fldbld() { - register wchar_t *r, *fr, sep, c; + wchar_t *r, *fr, sep, c; static wchar_t L_NF[] = L"NF"; CELL *p, *q; int i, j; @@ -196,7 +237,7 @@ fldbld() *fr++ = *r++; c = *r; } while (! iswblank(c) && c != '\t' && - c != '\n' && c != '\0'); + c != '\n' && c != '\0'); *fr++ = 0; @@ -244,7 +285,7 @@ fldbld() recbld() { int i; - register wchar_t *r, *p; + wchar_t *r, *p; if (donefld == 0 || donerec == 1) @@ -281,7 +322,7 @@ int errorflag = 0; yyerror(char *s) { fprintf(stderr, - gettext("awk: %s near line %lld\n"), gettext(s), lineno); + gettext("awk: %s near line %lld\n"), gettext(s), lineno); errorflag = 2; } @@ -307,9 +348,9 @@ PUTS(s) char *s; { isanumber(s) -register wchar_t *s; +wchar_t *s; { - register d1, d2; + int d1, d2; int point; wchar_t *es; extern wchar_t radixpoint; |