summary refs log tree commit diff
path: root/parse.c
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2019-05-14 14:34:23 -0700
committerQuentin Carbonneaux <quentin@c9x.me>2019-05-15 10:20:12 +0200
commit9e7e5bffc4e4af37a6c29657ba87fbb6a1123cf2 (patch)
tree9273d3f42153ce7d08db6ad6c97bb4852ebd2d0a /parse.c
parent72f2e8445adaeeb4916690263f65d6b61ffa5c1d (diff)
downloadroux-9e7e5bffc4e4af37a6c29657ba87fbb6a1123cf2.tar.gz
Allow specifying literal global names
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/parse.c b/parse.c
index c6f16ea..c4c1fe6 100644
--- a/parse.c
+++ b/parse.c
@@ -227,15 +227,20 @@ lex()
 		return Tfltd;
 	case '%':
 		t = Ttmp;
+		c = fgetc(inf);
 		goto Alpha;
 	case '@':
 		t = Tlbl;
+		c = fgetc(inf);
 		goto Alpha;
 	case '$':
 		t = Tglo;
+		if ((c = fgetc(inf)) == '"')
+			goto Quoted;
 		goto Alpha;
 	case ':':
 		t = Ttyp;
+		c = fgetc(inf);
 		goto Alpha;
 	case '#':
 		while ((c=fgetc(inf)) != '\n' && c != EOF)
@@ -251,23 +256,25 @@ lex()
 		return Tint;
 	}
 	if (c == '"') {
-		tokval.str = vnew(0, 1, Pfn);
+		t = Tstr;
+	Quoted:
+		tokval.str = vnew(2, 1, Pfn);
+		tokval.str[0] = c;
 		esc = 0;
-		for (i=0;; i++) {
+		for (i=1;; i++) {
 			c = fgetc(inf);
 			if (c == EOF)
 				err("unterminated string");
-			vgrow(&tokval.str, i+1);
+			vgrow(&tokval.str, i+2);
+			tokval.str[i] = c;
 			if (c == '"' && !esc) {
-				tokval.str[i] = 0;
-				return Tstr;
+				tokval.str[i+1] = 0;
+				return t;
 			}
 			esc = (c == '\\' && !esc);
-			tokval.str[i] = c;
 		}
 	}
-	if (0)
-Alpha:		c = fgetc(inf);
+Alpha:
 	if (!isalpha(c) && c != '.' && c != '_')
 		err("invalid character %c (%d)", c, c);
 	i = 0;