X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=x2p%2Fwalk.c;h=63ceb47cdc54506a0a8ec2b60800b33ee4b3bc56;hb=bbebedcee2d85ac9383303646f2e341ed1eec388;hp=f38968b0d501b71a861b52b83dd3f44eeb952592;hpb=d48672a2009b4897fb5bf74d6723c050cdd015e0;p=p5sagit%2Fp5-mst-13.2.git diff --git a/x2p/walk.c b/x2p/walk.c index f38968b..63ceb47 100644 --- a/x2p/walk.c +++ b/x2p/walk.c @@ -1,24 +1,17 @@ -/* $RCSfile: walk.c,v $$Revision: 4.0.1.1 $$Date: 91/06/07 12:22:04 $ +/* $RCSfile: walk.c,v $$Revision: 4.1 $$Date: 92/08/07 18:29:31 $ * - * Copyright (c) 1991, Larry Wall + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 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: walk.c,v $ - * Revision 4.0.1.1 91/06/07 12:22:04 lwall - * patch4: new copyright notice - * patch4: a2p didn't correctly implement -n switch - * - * Revision 4.0 91/03/20 01:58:36 lwall - * 4.0 baseline. - * */ -#include "handy.h" #include "EXTERN.h" -#include "util.h" #include "a2p.h" +#include "util.h" bool exitval = FALSE; bool realexit = FALSE; @@ -30,16 +23,31 @@ bool saw_fh = FALSE; int maxtmp = 0; char *lparen; char *rparen; +char *limit; STR *subs; STR *curargs = Nullstr; +static void addsemi ( STR *str ); +static void emit_split ( STR *str, int level ); +static void fixtab ( STR *str, int lvl ); +static void numericize ( int node ); +static void tab ( STR *str, int lvl ); + +int prewalk ( int numit, int level, int node, int *numericptr ); +STR * walk ( int useval, int level, int node, int *numericptr, int minprec ); +#ifdef NETWARE +char *savestr(char *str); +char *cpytill(register char *to, register char *from, register int delim); +char *instr(char *big, char *little); +#endif + STR * -walk(useval,level,node,numericptr,minprec) -int useval; -int level; -register int node; -int *numericptr; -int minprec; /* minimum precedence without parens */ +walk(int useval, int level, register int node, int *numericptr, int minprec) + + + + + /* minimum precedence without parens */ { register int len; register STR *str; @@ -54,7 +62,6 @@ int minprec; /* minimum precedence without parens */ int numeric = FALSE; STR *fstr; int prec = P_MAX; /* assume no parens needed */ - char *index(); if (!node) { *numericptr = 0; @@ -67,12 +74,12 @@ int minprec; /* minimum precedence without parens */ case OPROG: arymax = 0; if (namelist) { - while (isalpha(*namelist)) { + while (isALPHA(*namelist)) { for (d = tokenbuf,s=namelist; - isalpha(*s) || isdigit(*s) || *s == '_'; + isALPHA(*s) || isDIGIT(*s) || *s == '_'; *d++ = *s++) ; *d = '\0'; - while (*s && !isalpha(*s)) s++; + while (*s && !isALPHA(*s)) s++; namelist = s; nameary[++arymax] = savestr(tokenbuf); } @@ -97,7 +104,7 @@ int minprec; /* minimum precedence without parens */ do_chop = TRUE; if (fswitch) { str_cat(str,"$FS = '"); - if (index("*+?.[]()|^$\\",fswitch)) + if (strchr("*+?.[]()|^$\\",fswitch)) str_cat(str,"\\"); sprintf(tokenbuf,"%c",fswitch); str_cat(str,tokenbuf); @@ -131,7 +138,7 @@ int minprec; /* minimum precedence without parens */ if (saw_FS && !const_FS) do_chop = TRUE; if (do_chop) { - str_cat(str,"chop;\t# strip record separator\n"); + str_cat(str,"chomp;\t# strip record separator\n"); tab(str,level); } if (do_split) @@ -143,7 +150,7 @@ int minprec; /* minimum precedence without parens */ if (saw_FNR) str_cat(str,"continue {\n $FNRbase = $. if eof;\n}\n"); } - else + else if (old_awk) str_cat(str,"while (<>) { } # (no line actions)\n"); if (ops[node+4].ival) { realexit = TRUE; @@ -188,7 +195,7 @@ int minprec; /* minimum precedence without parens */ i = 0; if (do_chop) { i++; - str_cat(str,"chop;\t# strip record separator\n"); + str_cat(str,"chomp;\t# strip record separator\n"); tab(str,level); } if (do_split && !(len & 1)) { @@ -207,11 +214,8 @@ int minprec; /* minimum precedence without parens */ str_cat(str,"\n\ sub Pick {\n\ local($mode,$name,$pipe) = @_;\n\ - $fh = $opened{$name};\n\ - if (!$fh) {\n\ - $fh = $opened{$name} = 'fh_' . ($nextfh++ + 0);\n\ - open($fh,$mode.$name.$pipe);\n\ - }\n\ + $fh = $name;\n\ + open($name,$mode.$name.$pipe) unless $opened{$name}++;\n\ }\n\ "); } @@ -242,7 +246,7 @@ sub Pick {\n\ tmpstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN); /* translate \nnn to [\nnn] */ for (s = tmpstr->str_ptr, d = tokenbuf; *s; s++, d++) { - if (*s == '\\' && isdigit(s[1]) && isdigit(s[2]) && isdigit(s[3])){ + if (*s == '\\' && isDIGIT(s[1]) && isDIGIT(s[2]) && isDIGIT(s[3])){ *d++ = '['; *d++ = *s++; *d++ = *s++; @@ -255,7 +259,7 @@ sub Pick {\n\ } *d = '\0'; for (d=tokenbuf; *d; d++) - *d += 128; + *d += (char)128; str_cat(str,tokenbuf); str_free(tmpstr); str_cat(str,"/"); @@ -388,8 +392,8 @@ sub Pick {\n\ str_set(tmpstr,"gt"); else if (strEQ(t,">=")) str_set(tmpstr,"ge"); - if (!index(tmpstr->str_ptr,'\'') && !index(tmpstr->str_ptr,'"') && - !index(tmp2str->str_ptr,'\'') && !index(tmp2str->str_ptr,'"') ) + if (!strchr(tmpstr->str_ptr,'\'') && !strchr(tmpstr->str_ptr,'"') && + !strchr(tmp2str->str_ptr,'\'') && !strchr(tmp2str->str_ptr,'"') ) numeric |= 2; } if (numeric & 2) { @@ -464,6 +468,8 @@ sub Pick {\n\ str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec)); str_free(fstr); numeric |= numarg; + if (strEQ(str->str_ptr,"$/ = ''")) + str_set(str, "$/ = \"\\n\\n\""); break; case OADD: prec = P_ADD; @@ -566,10 +572,9 @@ sub Pick {\n\ if (useval) str_cat(str,"("); if (len > 0) { - str_cat(str,"$"); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); if (!*fstr->str_ptr) { - str_cat(str,"_"); + str_cat(str,"$_"); len = 2; /* a legal fiction */ } str_free(fstr); @@ -589,12 +594,12 @@ sub Pick {\n\ s = savestr(tokenbuf); for (t = tokenbuf; *t; t++) { *t &= 127; - if (islower(*t)) - *t = toupper(*t); - if (!isalpha(*t) && !isdigit(*t)) + if (isLOWER(*t)) + *t = toUPPER(*t); + if (!isALPHA(*t) && !isDIGIT(*t)) *t = '_'; } - if (!index(tokenbuf,'_')) + if (!strchr(tokenbuf,'_')) strcpy(t,"_FH"); tmp3str = hfetch(symtab,tokenbuf); if (!tmp3str) { @@ -670,6 +675,7 @@ sub Pick {\n\ break; case OSPLIT: str = str_new(0); + limit = ", 9999)"; numeric = 1; tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN); if (useval) @@ -682,7 +688,7 @@ sub Pick {\n\ fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1); if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') { i = fstr->str_ptr[1] & 127; - if (index("*+?.[]()|^$\\",i)) + if (strchr("*+?.[]()|^$\\",i)) sprintf(tokenbuf,"/\\%c/",i); else if (i == ' ') sprintf(tokenbuf,"' '"); @@ -700,12 +706,14 @@ sub Pick {\n\ } else if (saw_FS) str_cat(str,"$FS"); - else + else { str_cat(str,"' '"); + limit = ")"; + } str_cat(str,", "); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1)); str_free(fstr); - str_cat(str,", 9999)"); + str_cat(str,limit); if (useval) { str_cat(str,")"); } @@ -747,7 +755,7 @@ sub Pick {\n\ subretnum |= numarg; s = Nullch; t = tmp2str->str_ptr; - while (t = instr(t,"return ")) + while ((t = instr(t,"return "))) s = t++; if (s) { i = 0; @@ -819,11 +827,8 @@ sub Pick {\n\ str_cat(str,")"); break; case OGSUB: - case OSUB: - if (type == OGSUB) - s = "g"; - else - s = ""; + case OSUB: { + int gsub = type == OGSUB ? 1 : 0; str = str_new(0); tmpstr = str_new(0); i = 0; @@ -846,13 +851,14 @@ sub Pick {\n\ tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN); for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) { if (*t == '&') - *d++ = '$' + 128; + *d++ = '$' + (char)128; else if (*t == '$') - *d++ = '\\' + 128; + *d++ = '\\' + (char)128; *d = *t + 128; } *d = '\0'; str_set(tmp2str,tokenbuf); + s = gsub ? "/g" : "/"; } else { tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN); @@ -860,9 +866,10 @@ sub Pick {\n\ str_scat(tmp3str,tmp2str); str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, "); str_set(tmp2str,"eval $s_"); - s = (*s == 'g' ? "ge" : "e"); + s = gsub ? "/ge" : "/e"; i++; } + str_cat(tmp2str,s); type = ops[ops[node+1].ival].ival; len = type >> 8; type &= 255; @@ -874,8 +881,6 @@ sub Pick {\n\ str_scat(str,tmpstr); str_scat(str,fstr); str_scat(str,tmp2str); - str_cat(str,"/"); - str_cat(str,s); } else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) { if (useval && i) @@ -886,8 +891,6 @@ sub Pick {\n\ str_scat(str,fstr); str_cat(str,"/"); str_scat(str,tmp2str); - str_cat(str,"/"); - str_cat(str,s); } else { i++; @@ -900,8 +903,6 @@ sub Pick {\n\ str_scat(str,tmpstr); str_cat(str,"/$s/"); str_scat(str,tmp2str); - str_cat(str,"/"); - str_cat(str,s); } if (useval && i) str_cat(str,")"); @@ -910,7 +911,7 @@ sub Pick {\n\ str_free(tmp2str); str_free(tmp3str); numeric = 1; - break; + break; } case ONUM: str = walk(1,level,ops[node+1].ival,&numarg,P_MIN); numeric = 1; @@ -928,7 +929,7 @@ sub Pick {\n\ case '\\': case '"': case 'n': case 't': case '$': break; default: /* hide this from perl */ - *d++ = '\\' + 128; + *d++ = '\\' + (char)128; } } *d = *t + 128; @@ -1005,7 +1006,7 @@ sub Pick {\n\ strcpy(tokenbuf,"]"); else strcpy(tokenbuf,"}"); - *tokenbuf += 128; + *tokenbuf += (char)128; str_cat(str,tokenbuf); } } @@ -1057,7 +1058,7 @@ sub Pick {\n\ str_set(str,";"); tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN); for (s = tmpstr->str_ptr; *s && *s != '\n'; s++) - *s += 128; + *s += (char)128; str_scat(str,tmpstr); str_free(tmpstr); tab(str,level); @@ -1066,7 +1067,7 @@ sub Pick {\n\ str = str_new(0); tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN); for (s = tmpstr->str_ptr; *s && *s != '\n'; s++) - *s += 128; + *s += (char)128; str_scat(str,tmpstr); str_free(tmpstr); tab(str,level); @@ -1117,12 +1118,12 @@ sub Pick {\n\ s = savestr(tokenbuf); for (t = tokenbuf; *t; t++) { *t &= 127; - if (islower(*t)) - *t = toupper(*t); - if (!isalpha(*t) && !isdigit(*t)) + if (isLOWER(*t)) + *t = toUPPER(*t); + if (!isALPHA(*t) && !isDIGIT(*t)) *t = '_'; } - if (!index(tokenbuf,'_')) + if (!strchr(tokenbuf,'_')) strcpy(t,"_FH"); str_free(tmpstr); safefree(s); @@ -1130,8 +1131,8 @@ sub Pick {\n\ str_cat(str,tokenbuf); } else { - sprintf(tokenbuf,"$fh = delete $opened{%s} && close($fh)", - tmpstr->str_ptr); + sprintf(tokenbuf,"delete $opened{%s} && close(%s)", + tmpstr->str_ptr, tmpstr->str_ptr); str_free(tmpstr); str_set(str,tokenbuf); } @@ -1154,12 +1155,12 @@ sub Pick {\n\ s = savestr(tokenbuf); for (t = tokenbuf; *t; t++) { *t &= 127; - if (islower(*t)) - *t = toupper(*t); - if (!isalpha(*t) && !isdigit(*t)) + if (isLOWER(*t)) + *t = toUPPER(*t); + if (!isALPHA(*t) && !isDIGIT(*t)) *t = '_'; } - if (!index(tokenbuf,'_')) + if (!strchr(tokenbuf,'_')) strcpy(t,"_FH"); tmp3str = hfetch(symtab,tokenbuf); if (!tmp3str) { @@ -1216,7 +1217,7 @@ sub Pick {\n\ } tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN); if (!*tmpstr->str_ptr && lval_field) { - t = saw_OFS ? "$," : "' '"; + t = (char*)(saw_OFS ? "$," : "' '"); if (split_to_array) { sprintf(tokenbuf,"join(%s,@Fld)",t); str_cat(tmpstr,tokenbuf); @@ -1289,10 +1290,10 @@ sub Pick {\n\ if (len > 0) tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN); else - tmpstr = str_new(0);; + tmpstr = str_new(0); if (!tmpstr->str_ptr || !*tmpstr->str_ptr) { if (lval_field) { - t = saw_OFS ? "$," : "' '"; + t = (char*)(saw_OFS ? "$," : "' '"); if (split_to_array) { sprintf(tokenbuf,"join(%s,@Fld)",t); str_cat(tmpstr,tokenbuf); @@ -1408,6 +1409,18 @@ sub Pick {\n\ str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); break; + case ODO: + str = str_new(0); + str_set(str,"do "); + str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); + str_free(fstr); + if (str->str_ptr[str->str_cur - 1] == '\n') + --str->str_cur; + str_cat(str," while ("); + str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); + str_free(fstr); + str_cat(str,");"); + break; case OFOR: str = str_new(0); str_set(str,"for ("); @@ -1415,7 +1428,7 @@ sub Pick {\n\ i = numarg; if (i) { t = s = tmpstr->str_ptr; - while (isalpha(*t) || isdigit(*t) || *t == '$' || *t == '_') + while (isALPHA(*t) || isDIGIT(*t) || *t == '$' || *t == '_') t++; i = t - s; if (i < 2) @@ -1423,7 +1436,7 @@ sub Pick {\n\ } str_cat(str,"; "); fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN); - if (i && (t = index(fstr->str_ptr,0377))) { + if (i && (t = strchr(fstr->str_ptr,0377))) { if (strnEQ(fstr->str_ptr,s,i)) *t = ' '; } @@ -1439,16 +1452,16 @@ sub Pick {\n\ break; case OFORIN: tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN); - d = index(tmpstr->str_ptr,'$'); + d = strchr(tmpstr->str_ptr,'$'); if (!d) fatal("Illegal for loop: %s",tmpstr->str_ptr); - s = index(d,'{'); + s = strchr(d,'{'); if (!s) - s = index(d,'['); + s = strchr(d,'['); if (!s) fatal("Illegal for loop: %s",d); *s++ = '\0'; - for (t = s; i = *t; t++) { + for (t = s; (i = *t); t++) { i &= 127; if (i == '}' || i == ']') break; @@ -1540,9 +1553,8 @@ sub Pick {\n\ return str; } -tab(str,lvl) -register STR *str; -register int lvl; +static void +tab(register STR *str, register int lvl) { while (lvl > 1) { str_cat(str,"\t"); @@ -1552,9 +1564,8 @@ register int lvl; str_cat(str," "); } -fixtab(str,lvl) -register STR *str; -register int lvl; +static void +fixtab(register STR *str, register int lvl) { register char *s; @@ -1571,8 +1582,8 @@ register int lvl; tab(str,lvl); } -addsemi(str) -register STR *str; +static void +addsemi(register STR *str) { register char *s; @@ -1583,9 +1594,8 @@ register STR *str; str_cat(str,";"); } -emit_split(str,level) -register STR *str; -int level; +static void +emit_split(register STR *str, int level) { register int i; @@ -1617,17 +1627,12 @@ int level; tab(str,level); } -prewalk(numit,level,node,numericptr) -int numit; -int level; -register int node; -int *numericptr; +int +prewalk(int numit, int level, register int node, int *numericptr) { register int len; register int type; register int i; - char *t; - char *d, *s; int numarg; int numeric = FALSE; STR *tmpstr; @@ -1747,7 +1752,7 @@ int *numericptr; prewalk(0,level,ops[node+2].ival,&numarg); prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+3].ival,&numarg); - if (numarg || strlen(ops[ops[node+1].ival+1].cval) > 1) { + if (numarg || strlen(ops[ops[node+1].ival+1].cval) > (Size_t)1) { numericize(ops[node+2].ival); if (!numarg) numericize(ops[node+3].ival); @@ -2039,12 +2044,11 @@ int *numericptr; return 1; } -numericize(node) -register int node; +static void +numericize(register int node) { register int len; register int type; - register int i; STR *tmpstr; STR *tmp2str; int numarg;