aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmar Polo <op@omarpolo.com>2021-06-29 16:35:06 +0000
committerOmar Polo <op@omarpolo.com>2021-06-29 16:35:06 +0000
commitbfb076ed7ee61a93cc6ae701b07c3d3bc7a006aa (patch)
tree03e11975a298247a687748679c0b7ec3b6b432cf
parent7252049dd77e4927049f698d06d7ebc8fbc3e3df (diff)
don't expand macros inside the quotes
Now that we have this auto concat string thingy, macros can simply expand to standalone strings in place, as single words. Forgot to point it out in previous commits, but now we can cert = "/etc/keys" server "foo" { cert $cert "/foo.crt" ... }
-rw-r--r--gmid.12
-rw-r--r--parse.y11
2 files changed, 6 insertions, 7 deletions
diff --git a/gmid.1 b/gmid.1
index 00b37d0..dfcfcd1 100644
--- a/gmid.1
+++ b/gmid.1
@@ -157,7 +157,7 @@ Macros can be defined that will later be expanded in context.
Macro names must start with a letter, digit or underscore and may
contain any of those characters.
Macro names may not be reserved words.
-Macros are expanded inside the quotes too.
+Macros are not expanded inside quotes.
.Pp
For example:
.Bd -literal -offset indent
diff --git a/parse.y b/parse.y
index 9b9b9df..02ab827 100644
--- a/parse.y
+++ b/parse.y
@@ -416,7 +416,6 @@ repeat:
goto eof;
}
-top:
/* parsing next word */
for (;; c = getc(yyfp), yylval.colno++) {
switch (c) {
@@ -433,7 +432,7 @@ top:
/* expand macros in-place */
case '$':
- if (!escape) {
+ if (!escape && !quotes) {
v = p;
while (1) {
if ((c = getc(yyfp)) == EOF) {
@@ -449,24 +448,24 @@ top:
continue;
}
*p = 0;
- ungetc(c, yyfp);
break;
}
p = v;
if ((val = symget(p)) == NULL) {
yyerror("macro '%s' not defined", v);
- goto top;
+ return TERR;
}
len = strlen(val);
if (p + len >= ebuf - 1) {
yyerror("after macro-expansion, "
"string too long");
- goto top;
+ return TERR;
}
*p = '\0';
strlcat(p, val, ebuf - p);
p += len;
- goto top;
+ nonkw = 1;
+ goto eow;
}
break;
case '\n':