X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=x2p%2Fwalk.c;h=63ceb47cdc54506a0a8ec2b60800b33ee4b3bc56;hb=63315e187a785a8535d1f84110e060293f0f744c;hp=4d5f1d3a5e636645bb4361485965f20bdb1353e3;hpb=3f939f220e50adb6f28f2dd14f06461c7cebfe14;p=p5sagit%2Fp5-mst-13.2.git diff --git a/x2p/walk.c b/x2p/walk.c index 4d5f1d3..63ceb47 100644 --- a/x2p/walk.c +++ b/x2p/walk.c @@ -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) @@ -52,7 +57,7 @@ walk(int useval, int level, register int node, int *numericptr, int minprec) STR *tmp2str; STR *tmp3str; char *t; - char *d, *s = 0; + char *d, *s; int numarg; int numeric = FALSE; STR *fstr; @@ -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,"/"); @@ -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);