This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove some commented-out lines from win32/config_h.PL
[perl5.git] / x2p / walk.c
index 0d65198..86419c1 100644 (file)
@@ -1,11 +1,10 @@
-/* $RCSfile: walk.c,v $$Revision: 4.1 $$Date: 92/08/07 18:29:31 $
+/*    walk.c
  *
- *    Copyright (c) 1991, Larry Wall
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2005 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 $
  */
 
 #include "EXTERN.h"
@@ -20,28 +19,28 @@ bool saw_FNR = FALSE;
 bool saw_argv0 = FALSE;
 bool saw_fh = FALSE;
 int maxtmp = 0;
-char *lparen;
-char *rparen;
-char *limit;
+const char *lparen;
+const char *rparen;
+const char *limit;
 STR *subs;
-STR *curargs = Nullstr;
+STR *curargs = NULL;
 
-void addsemi _(( STR *str ));
-void emit_split _(( STR *str, int level ));
-void fixtab _(( STR *str, int lvl ));
-void numericize _(( int node ));
-int prewalk _(( int numit, int level, int node, int *numericptr ));
-void tab _(( STR *str, int lvl ));
-STR * walk _(( int useval, int level, int node, int *numericptr, int minprec ));
+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, const 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)
 {
     register int len;
     register STR *str;
@@ -68,12 +67,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);
            }
@@ -85,11 +84,6 @@ int minprec;                 /* minimum precedence without parens */
        str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
        if (do_split && need_entire && !absmaxfld)
            split_to_array = TRUE;
-       if (do_split && split_to_array)
-           set_array_base = TRUE;
-       if (set_array_base) {
-           str_cat(str,"$[ = 1;\t\t\t# set array base to 1\n");
-       }
        if (fswitch && !const_FS)
            const_FS = fswitch;
        if (saw_FS > 1 || saw_RS)
@@ -132,7 +126,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)
@@ -144,7 +138,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;
@@ -189,7 +183,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)) {
@@ -240,7 +234,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++;
@@ -253,7 +247,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,"/");
@@ -588,9 +582,9 @@ 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 (!strchr(tokenbuf,'_'))
@@ -651,16 +645,15 @@ sub Pick {\n\
        str_set(str,"substr(");
        str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
        str_free(fstr);
-       str_cat(str,", ");
+       str_cat(str,", (");
        str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
        str_free(fstr);
-       str_cat(str,"");
+       str_cat(str,")-1");
        if (len == 3) {
+           str_cat(str,", ");
            str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
            str_free(fstr);
        }
-       else
-           str_cat(str,"999999");
        str_cat(str,")");
        break;
     case OSTRING:
@@ -669,7 +662,7 @@ sub Pick {\n\
        break;
     case OSPLIT:
        str = str_new(0);
-       limit = ", 9999)";
+       limit = ", -1)";
        numeric = 1;
        tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
        if (useval)
@@ -715,13 +708,13 @@ sub Pick {\n\
        break;
     case OINDEX:
        str = str_new(0);
-       str_set(str,"index(");
+       str_set(str,"(1+index(");
        str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
        str_free(fstr);
        str_cat(str,", ");
        str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
        str_free(fstr);
-       str_cat(str,")");
+       str_cat(str,"))");
        numeric = 1;
        break;
     case OMATCH:
@@ -732,7 +725,7 @@ sub Pick {\n\
        str_cat(str," =~ ");
        str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1));
        str_free(fstr);
-       str_cat(str," && ($RLENGTH = length($&), $RSTART = length($`)+1)");
+       str_cat(str," ? scalar($RLENGTH = length($&), $RSTART = length($`)+1) : 0");
        numeric = 1;
        break;
     case OUSERDEF:
@@ -744,12 +737,12 @@ sub Pick {\n\
        str_cat(curargs,",");
        tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN);
        str_free(curargs);
-       curargs = Nullstr;
+       curargs = NULL;
        level--;
        subretnum |= numarg;
-       s = Nullch;
+       s = NULL;
        t = tmp2str->str_ptr;
-       while (t = instr(t,"return "))
+       while ((t = instr(t,"return ")))
            s = t++;
        if (s) {
            i = 0;
@@ -821,11 +814,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;
@@ -844,26 +834,31 @@ sub Pick {\n\
        len = type >> 8;
        type &= 255;
        tmp3str = str_new(0);
-       if (type == OSTR) {
+       {
+         const char *s;
+         if (type == OSTR) {
            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;
-               else if (*t == '$')
-                   *d++ = '\\' + 128;
+                   *d++ = '$' + (char)128;
+               else if (*t == '$' || *t == '/')
+                   *d++ = '\\' + (char)128;
                *d = *t + 128;
            }
            *d = '\0';
            str_set(tmp2str,tokenbuf);
-       }
-       else {
+           s = (gsub ? "/g" : "/");
+         }
+         else {
            tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
            str_set(tmp3str,"($s_ = '\"'.(");
            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;
@@ -876,8 +871,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)
@@ -888,8 +881,6 @@ sub Pick {\n\
            str_scat(str,fstr);
            str_cat(str,"/");
            str_scat(str,tmp2str);
-           str_cat(str,"/");
-           str_cat(str,s);
        }
        else {
            i++;
@@ -902,8 +893,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,")");
@@ -912,15 +901,16 @@ 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;
        break;
     case OSTR:
        tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
-       s = "'";
-       for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
+       {
+         const char *s = "'";
+         for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
            if (*t == '\'')
                s = "\"";
            else if (*t == '\\') {
@@ -930,17 +920,18 @@ sub Pick {\n\
                case '\\': case '"': case 'n': case 't': case '$':
                    break;
                default:        /* hide this from perl */
-                   *d++ = '\\' + 128;
+                   *d++ = '\\' + (char)128;
                }
            }
            *d = *t + 128;
+         }
+         *d = '\0';
+         str = str_new(0);
+         str_set(str,s);
+         str_cat(str,tokenbuf);
+         str_free(tmpstr);
+         str_cat(str,s);
        }
-       *d = '\0';
-       str = str_new(0);
-       str_set(str,s);
-       str_cat(str,tokenbuf);
-       str_free(tmpstr);
-       str_cat(str,s);
        break;
     case ODEFINED:
        prec = P_UNI;
@@ -975,12 +966,12 @@ sub Pick {\n\
            }
            else if (strEQ(str->str_ptr,"$NF")) {
                numeric = 1;
-               str_set(str,"$#Fld");
+               str_set(str,"($#Fld+1)");
            }
            else if (strEQ(str->str_ptr,"$0"))
                str_set(str,"$_");
            else if (strEQ(str->str_ptr,"$ARGC"))
-               str_set(str,"($#ARGV+1)");
+               str_set(str,"($#ARGV+2)");
        }
        else {
 #ifdef NOTDEF
@@ -993,7 +984,7 @@ sub Pick {\n\
            str_cat(tmpstr,"[]");
            tmp2str = hfetch(symtab,tmpstr->str_ptr);
            if (tmp2str && atoi(tmp2str->str_ptr))
-               str_cat(str,"[");
+               str_cat(str,"[(");
            else
                str_cat(str,"{");
            str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
@@ -1004,10 +995,10 @@ sub Pick {\n\
            }
            else {
                if (tmp2str && atoi(tmp2str->str_ptr))
-                   strcpy(tokenbuf,"]");
+                   strcpy(tokenbuf,")-1]");
                else
                    strcpy(tokenbuf,"}");
-               *tokenbuf += 128;
+               *tokenbuf += (char)128;
                str_cat(str,tokenbuf);
            }
        }
@@ -1017,10 +1008,10 @@ sub Pick {\n\
        str = str_new(0);
        if (split_to_array) {
            str_set(str,"$Fld");
-           str_cat(str,"[");
+           str_cat(str,"[(");
            str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
            str_free(fstr);
-           str_cat(str,"]");
+           str_cat(str,")-1]");
        }
        else {
            i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
@@ -1059,7 +1050,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);
@@ -1068,7 +1059,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);
@@ -1119,9 +1110,9 @@ 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 (!strchr(tokenbuf,'_'))
@@ -1156,9 +1147,9 @@ 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 (!strchr(tokenbuf,'_'))
@@ -1218,7 +1209,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 ? "$," : "' '";
+           const char *t = (saw_OFS ? "$," : "' '");
            if (split_to_array) {
                sprintf(tokenbuf,"join(%s,@Fld)",t);
                str_cat(tmpstr,tokenbuf);
@@ -1291,10 +1282,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 ? "$," : "' '";
+               const char *t = (saw_OFS ? "$," : "' '");
                if (split_to_array) {
                    sprintf(tokenbuf,"join(%s,@Fld)",t);
                    str_cat(tmpstr,tokenbuf);
@@ -1416,7 +1407,7 @@ sub Pick {\n\
        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->str_cur;
        str_cat(str," while (");
        str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
        str_free(fstr);
@@ -1429,7 +1420,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)
@@ -1462,7 +1453,7 @@ sub Pick {\n\
        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;
@@ -1475,7 +1466,7 @@ sub Pick {\n\
        tmp2str = hfetch(symtab,str->str_ptr);
        if (tmp2str && atoi(tmp2str->str_ptr)) {
            sprintf(tokenbuf,
-             "foreach %s ($[ .. $#%s) ",
+             "foreach %s (0 .. $#%s) ",
              s,
              d+1);
        }
@@ -1521,7 +1512,7 @@ sub Pick {\n\
            }
        }
        else {
-           str = Nullstr;
+           str = NULL;
        }
        break;
     }
@@ -1554,10 +1545,8 @@ sub Pick {\n\
     return str;
 }
 
-void
-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");
@@ -1567,10 +1556,8 @@ register int lvl;
        str_cat(str,"    ");
 }
 
-void
-fixtab(str,lvl)
-register STR *str;
-register int lvl;
+static void
+fixtab(register STR *str, register int lvl)
 {
     register char *s;
 
@@ -1587,9 +1574,8 @@ register int lvl;
     tab(str,lvl);
 }
 
-void
-addsemi(str)
-register STR *str;
+static void
+addsemi(register STR *str)
 {
     register char *s;
 
@@ -1600,10 +1586,8 @@ register STR *str;
        str_cat(str,";");
 }
 
-void
-emit_split(str,level)
-register STR *str;
-int level;
+static void
+emit_split(register STR *str, int level)
 {
     register int i;
 
@@ -1625,22 +1609,18 @@ int level;
        str_cat(str,tokenbuf);
     }
     if (const_FS) {
-       sprintf(tokenbuf," = split(/[%c\\n]/, $_, 9999);\n",const_FS);
+       sprintf(tokenbuf," = split(/[%c\\n]/, $_, -1);\n",const_FS);
        str_cat(str,tokenbuf);
     }
     else if (saw_FS)
-       str_cat(str," = split($FS, $_, 9999);\n");
+       str_cat(str," = split($FS, $_, -1);\n");
     else
-       str_cat(str," = split(' ', $_, 9999);\n");
+       str_cat(str," = split(' ', $_, -1);\n");
     tab(str,level);
 }
 
 int
-prewalk(numit,level,node,numericptr)
-int numit;
-int level;
-register int node;
-int *numericptr;
+prewalk(int numit, int level, register int node, int *numericptr)
 {
     register int len;
     register int type;
@@ -2056,9 +2036,8 @@ int *numericptr;
     return 1;
 }
 
-void
-numericize(node)
-register int node;
+static void
+numericize(register int node)
 {
     register int len;
     register int type;