Ilya Zakharevich on Thu, 28 Jan 1999 23:16:23 -0500


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

[PATCH] Do not create new variables if not needed


This patch makes "s"-type arguments to not create new variables for
unknown identifiers.  Currently, if you do something like (suppose n=4 and
no variable named xx)

  xx""n

then the result is "xx4", and a new variable xx is created.  With the patch
applied the value is the same, but xx is not created.

Btw, when doing this I thought that PARI has something like 
evalstring(STRING), so that

  evalstring(xx""n)

would give you a (maybe new) variable xx4.  Why there is no such
thing?

  vector(25,X,evalstring(xx""X))

Another btw: what happened to the limit on the number of user variables?
Is it lifted now?

Enjoy,
Ilya

--- ./src/language/anal.c~	Sun Nov  8 21:26:30 1998
+++ ./src/language/anal.c	Thu Jan 28 22:50:00 1999
@@ -1214,13 +1214,30 @@ identifier(void)
 	      else if (*analyseur == ',' || *analyseur == ')') break;
 	      else
 	      { /* expand string */
-		long len, av = avma;
-		char *tmp = GENtostr(expr()), *tbp;
+		long len, av = avma, alloc = 1;
+		char *tmp, *tbp, *s = analyseur;
 
-                len = strlen(tmp); tbp = bp + len;
+		while (is_keyword_char(*s)) s++;
+		if (*s == '"' || *s == ',' || *s == ')') {
+		    /* Do not create new user variables */
+		    entree *ep = is_entry_intern(analyseur, functions_hash, 0);
+
+		    if (!ep) {		/* consider as a literal */
+			tmp = analyseur;
+			len = s - analyseur;
+			analyseur = s;
+			alloc = 0;
+		    }
+		}
+		if (alloc) {
+		    tmp = GENtostr(expr());
+		    len = strlen(tmp); 
+		}
+		tbp = bp + len;
                 if (tbp>limit) break;
 		memcpy(bp,tmp,len); /* ignore trailing \0 */
-		free(tmp); avma=av; bp = tbp;
+		if (alloc) free(tmp);
+		avma=av; bp = tbp;
 	      }
 	    }
             if (bp > limit) err(talker,"string too long");