Re: [PATCH t/test.pl t/op/stat.t lib/Net/hostent.t] Unbail out
[p5sagit/p5-mst-13.2.git] / x2p / walk.c
index 271581b..f8fad55 100644 (file)
@@ -1,27 +1,16 @@
-/* $RCSfile: walk.c,v $$Revision: 4.0.1.2 $$Date: 91/11/05 19:25:09 $
+/* $RCSfile: walk.c,v $$Revision: 4.1 $$Date: 92/08/07 18:29:31 $
  *
- *    Copyright (c) 1991, Larry Wall
+ *    Copyright (c) 1991-2001, Larry Wall
  *
  *    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.2  91/11/05  19:25:09  lwall
- * patch11: in a2p, split on whitespace produced extra null field
- * 
- * 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;
@@ -37,13 +26,23 @@ 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 );
+
+
 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;
@@ -53,12 +52,11 @@ int minprec;                        /* minimum precedence without parens */
     STR *tmp2str;
     STR *tmp3str;
     char *t;
-    char *d, *s;
+    char *d, *s = 0;
     int numarg;
     int numeric = FALSE;
     STR *fstr;
     int prec = P_MAX;          /* assume no parens needed */
-    char *index();
 
     if (!node) {
        *numericptr = 0;
@@ -71,12 +69,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);
            }
@@ -101,7 +99,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);
@@ -135,7 +133,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)
@@ -147,7 +145,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;
@@ -192,7 +190,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)) {
@@ -211,11 +209,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\
 ");
        }
@@ -246,7 +241,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++;
@@ -259,7 +254,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,"/");
@@ -392,8 +387,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) {
@@ -468,6 +463,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;
@@ -570,10 +567,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);
@@ -593,12 +589,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) {
@@ -687,7 +683,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,"' '");
@@ -754,7 +750,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;
@@ -853,9 +849,9 @@ 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';
@@ -867,7 +863,7 @@ sub Pick {\n\
            str_scat(tmp3str,tmp2str);
            str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
            str_set(tmp2str,"eval $s_");
-           s = (*s == 'g' ? "ge" : "e");
+           s = (char*)(*s == 'g' ? "ge" : "e");
            i++;
        }
        type = ops[ops[node+1].ival].ival;
@@ -935,7 +931,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;
@@ -1012,7 +1008,7 @@ sub Pick {\n\
                    strcpy(tokenbuf,"]");
                else
                    strcpy(tokenbuf,"}");
-               *tokenbuf += 128;
+               *tokenbuf += (char)128;
                str_cat(str,tokenbuf);
            }
        }
@@ -1064,7 +1060,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);
@@ -1073,7 +1069,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);
@@ -1124,12 +1120,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);
@@ -1137,8 +1133,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);
        }
@@ -1161,12 +1157,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) {
@@ -1223,7 +1219,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);
@@ -1296,10 +1292,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);
@@ -1415,6 +1411,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 (");
@@ -1422,7 +1430,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)
@@ -1430,7 +1438,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 = ' ';
        }
@@ -1446,16 +1454,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;
@@ -1547,9 +1555,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");
@@ -1559,9 +1566,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;
 
@@ -1578,8 +1584,8 @@ register int lvl;
     tab(str,lvl);
 }
 
-addsemi(str)
-register STR *str;
+static void
+addsemi(register STR *str)
 {
     register char *s;
 
@@ -1590,9 +1596,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;
 
@@ -1624,17 +1629,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;
@@ -1754,7 +1754,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);
@@ -2046,12 +2046,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;