This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Mention the Unicode UTR #18 version referenced.
[perl5.git] / x2p / walk.c
index 59ac8a9..63ceb47 100644 (file)
@@ -1,6 +1,7 @@
 /* $RCSfile: walk.c,v $$Revision: 4.1 $$Date: 92/08/07 18:29:31 $
  *
- *    Copyright (c) 1991-2001, 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.
@@ -34,7 +35,11 @@ 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(int useval, int level, register int node, int *numericptr, int minprec)
@@ -69,12 +74,12 @@ walk(int useval, int level, register int node, int *numericptr, int minprec)
     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);
            }
@@ -241,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++;
@@ -254,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,"/");
@@ -589,9 +594,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,'_'))
@@ -750,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;
@@ -822,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;
@@ -849,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);
@@ -863,9 +866,10 @@ sub Pick {\n\
            str_scat(tmp3str,tmp2str);
            str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
            str_set(tmp2str,"eval $s_");
-           s = (char*)(*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;
@@ -877,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)
@@ -889,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++;
@@ -903,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,")");
@@ -913,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;
@@ -931,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;
@@ -1008,7 +1006,7 @@ sub Pick {\n\
                    strcpy(tokenbuf,"]");
                else
                    strcpy(tokenbuf,"}");
-               *tokenbuf += 128;
+               *tokenbuf += (char)128;
                str_cat(str,tokenbuf);
            }
        }
@@ -1060,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);
@@ -1069,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);
@@ -1120,9 +1118,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,'_'))
@@ -1157,9 +1155,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,'_'))
@@ -1430,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)
@@ -1463,7 +1461,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;