X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=x2p%2Fa2py.c;h=286f7cc106a35ff0b16c2662c7eb969b19a420ff;hb=eda4663d0f345e78f0a82529a08f3aa28c98ff2c;hp=cd396a28de2061a3d59feb8619c7ca66786c58cb;hpb=c5cf9ec268be725ef943af3a8c93c6ce5c5492de;p=p5sagit%2Fp5-mst-13.2.git diff --git a/x2p/a2py.c b/x2p/a2py.c index cd396a2..286f7cc 100644 --- a/x2p/a2py.c +++ b/x2p/a2py.c @@ -1,11 +1,10 @@ -/* $RCSfile: a2py.c,v $$Revision: 4.1 $$Date: 92/08/07 18:29:14 $ +/* a2py.c * - * Copyright (c) 1991-1997, Larry Wall + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + * 2000, 2001, 2002, by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. - * - * $Log: a2py.c,v $ */ #if defined(OS2) || defined(WIN32) || defined(NETWARE) @@ -19,8 +18,8 @@ #endif #include "util.h" -char *filename; -char *myname; +const char *filename; +const char *myname; int checkers = 0; @@ -31,6 +30,10 @@ int oper3(int type, int arg1, int arg2, int arg3); int oper4(int type, int arg1, int arg2, int arg3, int arg4); int oper5(int type, int arg1, int arg2, int arg3, int arg4, int arg5); STR *walk(int useval, int level, register int node, int *numericptr, int minprec); +#ifdef NETWARE +char *savestr(char *str); +char *cpy2(register char *to, register char *from, register int delim); +#endif #if defined(OS2) || defined(WIN32) || defined(NETWARE) static void usage(void); @@ -51,15 +54,20 @@ usage() } #endif +#ifdef __osf__ +#pragma message disable (mainparm) /* We have the envp in main(). */ +#endif + int -main(register int argc, register char **argv, register char **env) +main(register int argc, register const char **argv, register const char **env) { register STR *str; int i; STR *tmpstr; + /* char *namelist; */ #ifdef NETWARE - fnInitGpfGlobals(); // For importing the CLIB calls in place of Watcom calls + fnInitGpfGlobals(); /* For importing the CLIB calls in place of Watcom calls */ #endif /* NETWARE */ myname = argv[0]; @@ -109,7 +117,7 @@ main(register int argc, register char **argv, register char **env) /* open script */ - if (argv[0] == Nullch) { + if (argv[0] == NULL) { #if defined(OS2) || defined(WIN32) || defined(NETWARE) if ( isatty(fileno(stdin)) ) usage(); @@ -118,14 +126,13 @@ main(register int argc, register char **argv, register char **env) } filename = savestr(argv[0]); - filename = savestr(argv[0]); if (strEQ(filename,"-")) argv[0] = ""; if (!*argv[0]) rsfp = stdin; else rsfp = fopen(argv[0],"r"); - if (rsfp == Nullfp) + if (rsfp == NULL) fatal("Awk script \"%s\" doesn't seem to exist.\n",filename); /* init tokener */ @@ -246,10 +253,10 @@ yylex(void) if (!rsfp) RETURN(0); line++; - if ((s = str_gets(linestr, rsfp)) == Nullch) { + if ((s = str_gets(linestr, rsfp)) == NULL) { if (rsfp != stdin) fclose(rsfp); - rsfp = Nullfp; + rsfp = NULL; s = str_get(linestr); RETURN(0); } @@ -419,7 +426,14 @@ yylex(void) maxfld = tmp; XOP(FIELD); } - split_to_array = set_array_base = TRUE; + for (d = s; isALPHA(*s) || isDIGIT(*s) || *s == '_'; ) + s++; + split_to_array = TRUE; + if (d != s) + { + yylval = string(d,s-d); + XTERM(SVFIELD); + } XOP(VFIELD); case '/': /* may either be division or pattern */ @@ -450,8 +464,6 @@ yylex(void) case 'a': case 'A': SNARFWORD; - if (strEQ(d,"ARGC")) - set_array_base = TRUE; if (strEQ(d,"ARGV")) { yylval=numary(string("ARGV",0)); XOP(VAR); @@ -547,7 +559,7 @@ yylex(void) else if (strEQ(d,"function")) XTERM(FUNCTION); if (strEQ(d,"FILENAME")) - d = "ARGV"; + ID("ARGV"); if (strEQ(d,"foreach")) *d = toUPPER(*d); else if (strEQ(d,"format")) @@ -584,7 +596,6 @@ yylex(void) if (strEQ(d,"in")) XTERM(IN); if (strEQ(d,"index")) { - set_array_base = TRUE; XTERM(INDEX); } if (strEQ(d,"int")) { @@ -630,7 +641,6 @@ yylex(void) case 'm': case 'M': SNARFWORD; if (strEQ(d,"match")) { - set_array_base = TRUE; XTERM(MATCH); } if (strEQ(d,"m")) @@ -639,7 +649,7 @@ yylex(void) case 'n': case 'N': SNARFWORD; if (strEQ(d,"NF")) - do_chop = do_split = split_to_array = set_array_base = TRUE; + do_chop = do_split = split_to_array = TRUE; if (strEQ(d,"next")) { saw_line_op = TRUE; XTERM(NEXT); @@ -651,14 +661,14 @@ yylex(void) SNARFWORD; if (strEQ(d,"ORS")) { saw_ORS = TRUE; - d = "\\"; + ID("\\"); } if (strEQ(d,"OFS")) { saw_OFS = TRUE; - d = ","; + ID(","); } if (strEQ(d,"OFMT")) { - d = "#"; + ID("#"); } if (strEQ(d,"open")) *d = toUPPER(*d); @@ -686,8 +696,8 @@ yylex(void) case 'r': case 'R': SNARFWORD; if (strEQ(d,"RS")) { - d = "/"; saw_RS = TRUE; + ID("/"); } if (strEQ(d,"rand")) { yylval = ORAND; @@ -705,11 +715,9 @@ yylex(void) case 's': case 'S': SNARFWORD; if (strEQ(d,"split")) { - set_array_base = TRUE; XOP(SPLIT); } if (strEQ(d,"substr")) { - set_array_base = TRUE; XTERM(SUBSTR); } if (strEQ(d,"sub")) @@ -728,7 +736,7 @@ yylex(void) XTERM(FUN1); } if (strEQ(d,"SUBSEP")) { - d = ";"; + ID(";"); } if (strEQ(d,"sin")) { yylval = OSIN; @@ -863,7 +871,7 @@ scanpat(register char *s) } void -yyerror(char *s) +yyerror(const char *s) { fprintf(stderr,"%s in file %s at line %d\n", s,filename,line); @@ -906,7 +914,7 @@ scannum(register char *s) } int -string(char *ptr, int len) +string(const char *ptr, int len) { int retval = mop; @@ -1190,7 +1198,6 @@ numary(int arg) str_cat(key,"[]"); hstore(symtab,key->str_ptr,str_make("1")); str_free(key); - set_array_base = TRUE; return arg; }