-/* $RCSfile: walk.c,v $$Revision: 4.1 $$Date: 92/08/07 18:29:31 $
+/* walk.c
*
- * Copyright (c) 1991-2002, 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"
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 );
#ifdef NETWARE
char *savestr(char *str);
char *cpytill(register char *to, register char *from, register int delim);
-char *instr(char *big, char *little);
+char *instr(char *big, const char *little);
#endif
STR *
walk(int useval, int level, register int node, int *numericptr, int minprec)
-
-
-
-
- /* minimum precedence without parens */
{
register int len;
register STR *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,", ");
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:
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)
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++;
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 = '\0';
str_set(tmp2str,tokenbuf);
- s = 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 = 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;
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 == '\\') {
}
}
*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;
}
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);
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);
}
}
else {
- str = Nullstr;
+ str = NULL;
}
break;
}
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);
}