This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Standardize spelling of program name on American English.
[perl5.git] / x2p / walk.c
index de1263f..d6962ed 100644 (file)
@@ -19,11 +19,11 @@ 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;
 
 static void addsemi ( STR *str );
 static void emit_split ( STR *str, int level );
@@ -35,18 +35,18 @@ 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);
+char *cpytill(char *to, char *from, int delim);
+char *instr(char *big, const char *little);
 #endif
 
 STR *
-walk(int useval, int level, register int node, int *numericptr, int minprec)
+walk(int useval, int level, int node, int *numericptr, int minprec)
 {
-    register int len;
-    register STR *str;
-    register int type;
-    register int i;
-    register STR *tmpstr;
+    int len;
+    STR *str;
+    int type;
+    int i;
+    STR *tmpstr;
     STR *tmp2str;
     STR *tmp3str;
     char *t;
@@ -69,7 +69,7 @@ walk(int useval, int level, register int node, int *numericptr, int minprec)
        if (namelist) {
            while (isALPHA(*namelist)) {
                for (d = tokenbuf,s=namelist;
-                 isALPHA(*s) || isDIGIT(*s) || *s == '_';
+                 isWORDCHAR(*s);
                  *d++ = *s++) ;
                *d = '\0';
                while (*s && !isALPHA(*s)) s++;
@@ -84,11 +84,6 @@ walk(int useval, int level, register int node, int *numericptr, int minprec)
        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)
@@ -259,7 +254,6 @@ sub Pick {\n\
        break;
     case OHUNK:
        if (len == 1) {
-           str = str_new(0);
            str = walk(0,level,oper1(OPRINT,0),&numarg,P_MIN);
            str_cat(str," if ");
            str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
@@ -589,7 +583,7 @@ sub Pick {\n\
                    *t &= 127;
                    if (isLOWER(*t))
                        *t = toUPPER(*t);
-                   if (!isALPHA(*t) && !isDIGIT(*t))
+                   if (!isALPHANUMERIC(*t))
                        *t = '_';
                }
                if (!strchr(tokenbuf,'_'))
@@ -650,9 +644,10 @@ 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,")-1");
        if (len == 3) {
            str_cat(str,", ");
            str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
@@ -712,13 +707,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:
@@ -729,7 +724,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:
@@ -741,10 +736,10 @@ 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 ")))
            s = t++;
@@ -838,29 +833,32 @@ 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++ = '$' + (char)128;
-               else if (*t == '$')
+               else if (*t == '$' || *t == '/')
                    *d++ = '\\' + (char)128;
                *d = *t + 128;
            }
            *d = '\0';
            str_set(tmp2str,tokenbuf);
-           s = (char *) (gsub ? "/g" : "/");
-       }
-       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 = (char *) (gsub ? "/ge" : "/e");
+           s = (gsub ? "/ge" : "/e");
            i++;
+         }
+         str_cat(tmp2str,s);
        }
-       str_cat(tmp2str,s);
        type = ops[ops[node+1].ival].ival;
        len = type >> 8;
        type &= 255;
@@ -909,8 +907,9 @@ sub Pick {\n\
        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 == '\\') {
@@ -924,13 +923,14 @@ sub Pick {\n\
                }
            }
            *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;
@@ -965,12 +965,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
@@ -983,7 +983,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));
@@ -994,7 +994,7 @@ sub Pick {\n\
            }
            else {
                if (tmp2str && atoi(tmp2str->str_ptr))
-                   strcpy(tokenbuf,"]");
+                   strcpy(tokenbuf,")-1]");
                else
                    strcpy(tokenbuf,"}");
                *tokenbuf += (char)128;
@@ -1007,10 +1007,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);
@@ -1103,7 +1103,7 @@ sub Pick {\n\
        if (!do_fancy_opens) {
            t = tmpstr->str_ptr;
            if (*t == '"' || *t == '\'')
-               t = cpytill(tokenbuf,t+1,*t);
+               cpytill(tokenbuf,t+1,*t);
            else
                fatal("Internal error: OCLOSE %s",t);
            s = savestr(tokenbuf);
@@ -1111,7 +1111,7 @@ sub Pick {\n\
                *t &= 127;
                if (isLOWER(*t))
                    *t = toUPPER(*t);
-               if (!isALPHA(*t) && !isDIGIT(*t))
+               if (!isALPHANUMERIC(*t))
                    *t = '_';
            }
            if (!strchr(tokenbuf,'_'))
@@ -1148,7 +1148,7 @@ sub Pick {\n\
                    *t &= 127;
                    if (isLOWER(*t))
                        *t = toUPPER(*t);
-                   if (!isALPHA(*t) && !isDIGIT(*t))
+                   if (!isALPHANUMERIC(*t))
                        *t = '_';
                }
                if (!strchr(tokenbuf,'_'))
@@ -1208,7 +1208,7 @@ sub Pick {\n\
        }
        tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
        if (!*tmpstr->str_ptr && lval_field) {
-           t = (char*)(saw_OFS ? "$," : "' '");
+           const char *t = (saw_OFS ? "$," : "' '");
            if (split_to_array) {
                sprintf(tokenbuf,"join(%s,@Fld)",t);
                str_cat(tmpstr,tokenbuf);
@@ -1284,7 +1284,7 @@ sub Pick {\n\
            tmpstr = str_new(0);
        if (!tmpstr->str_ptr || !*tmpstr->str_ptr) {
            if (lval_field) {
-               t = (char*)(saw_OFS ? "$," : "' '");
+               const char *t = (saw_OFS ? "$," : "' '");
                if (split_to_array) {
                    sprintf(tokenbuf,"join(%s,@Fld)",t);
                    str_cat(tmpstr,tokenbuf);
@@ -1419,7 +1419,7 @@ sub Pick {\n\
        i = numarg;
        if (i) {
            t = s = tmpstr->str_ptr;
-           while (isALPHA(*t) || isDIGIT(*t) || *t == '$' || *t == '_')
+           while (isWORDCHAR(*t) || *t == '$')
                t++;
            i = t - s;
            if (i < 2)
@@ -1465,7 +1465,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);
        }
@@ -1511,7 +1511,7 @@ sub Pick {\n\
            }
        }
        else {
-           str = Nullstr;
+           str = NULL;
        }
        break;
     }
@@ -1545,7 +1545,7 @@ sub Pick {\n\
 }
 
 static void
-tab(register STR *str, register int lvl)
+tab(STR *str, int lvl)
 {
     while (lvl > 1) {
        str_cat(str,"\t");
@@ -1556,9 +1556,9 @@ tab(register STR *str, register int lvl)
 }
 
 static void
-fixtab(register STR *str, register int lvl)
+fixtab(STR *str, int lvl)
 {
-    register char *s;
+    char *s;
 
     /* strip trailing white space */
 
@@ -1574,9 +1574,9 @@ fixtab(register STR *str, register int lvl)
 }
 
 static void
-addsemi(register STR *str)
+addsemi(STR *str)
 {
-    register char *s;
+    char *s;
 
     s = str->str_ptr+str->str_cur - 1;
     while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
@@ -1586,9 +1586,9 @@ addsemi(register STR *str)
 }
 
 static void
-emit_split(register STR *str, int level)
+emit_split(STR *str, int level)
 {
-    register int i;
+    int i;
 
     if (split_to_array)
        str_cat(str,"@Fld");
@@ -1619,11 +1619,11 @@ emit_split(register STR *str, int level)
 }
 
 int
-prewalk(int numit, int level, register int node, int *numericptr)
+prewalk(int numit, int level, int node, int *numericptr)
 {
-    register int len;
-    register int type;
-    register int i;
+    int len;
+    int type;
+    int i;
     int numarg;
     int numeric = FALSE;
     STR *tmpstr;
@@ -2036,10 +2036,10 @@ prewalk(int numit, int level, register int node, int *numericptr)
 }
 
 static void
-numericize(register int node)
+numericize(int node)
 {
-    register int len;
-    register int type;
+    int len;
+    int type;
     STR *tmpstr;
     STR *tmp2str;
     int numarg;