summaryrefslogtreecommitdiff
path: root/usr/src/cmd
diff options
context:
space:
mode:
authorceastha <none@none>2005-10-04 20:57:27 -0700
committerceastha <none@none>2005-10-04 20:57:27 -0700
commitcb4658fbb85e4290093c4fea0eb396a7d98de1fb (patch)
tree20ef4412dd7a449f5c1af3d26d8b72c2e235b4db /usr/src/cmd
parent45a9d96181a0a0ac4f9f1f7c59834d5d4047d482 (diff)
downloadillumos-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.c33
-rw-r--r--usr/src/cmd/awk_xpg4/awk1.c401
-rw-r--r--usr/src/cmd/awk_xpg4/awk2.c332
-rw-r--r--usr/src/cmd/oawk/lib.c77
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;