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 );
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;
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++;
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)
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));
*t &= 127;
if (isLOWER(*t))
*t = toUPPER(*t);
- if (!isALPHA(*t) && !isDIGIT(*t))
+ if (!isALPHANUMERIC(*t))
*t = '_';
}
if (!strchr(tokenbuf,'_'))
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));
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:
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:
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++ = '$' + (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;
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;
}
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
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));
}
else {
if (tmp2str && atoi(tmp2str->str_ptr))
- strcpy(tokenbuf,"]");
+ strcpy(tokenbuf,")-1]");
else
strcpy(tokenbuf,"}");
*tokenbuf += (char)128;
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);
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);
*t &= 127;
if (isLOWER(*t))
*t = toUPPER(*t);
- if (!isALPHA(*t) && !isDIGIT(*t))
+ if (!isALPHANUMERIC(*t))
*t = '_';
}
if (!strchr(tokenbuf,'_'))
*t &= 127;
if (isLOWER(*t))
*t = toUPPER(*t);
- if (!isALPHA(*t) && !isDIGIT(*t))
+ if (!isALPHANUMERIC(*t))
*t = '_';
}
if (!strchr(tokenbuf,'_'))
}
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);
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)
tmp2str = hfetch(symtab,str->str_ptr);
if (tmp2str && atoi(tmp2str->str_ptr)) {
sprintf(tokenbuf,
- "foreach %s ($[ .. $#%s) ",
+ "foreach %s (0 .. $#%s) ",
s,
d+1);
}
}
}
else {
- str = Nullstr;
+ str = NULL;
}
break;
}
}
static void
-tab(register STR *str, register int lvl)
+tab(STR *str, int lvl)
{
while (lvl > 1) {
str_cat(str,"\t");
}
static void
-fixtab(register STR *str, register int lvl)
+fixtab(STR *str, int lvl)
{
- register char *s;
+ char *s;
/* strip trailing white space */
}
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'))
}
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");
}
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;
}
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;