about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--lr.11
-rw-r--r--lr.c17
3 files changed, 19 insertions, 0 deletions
diff --git a/README.md b/README.md
index 1be1677..7057611 100644
--- a/README.md
+++ b/README.md
@@ -171,6 +171,7 @@ Default: `n`.
 	             | =~~               -- case insensitive POSIX Extended Regular Expressions
 	
 	<str>      ::= " ([^"] | "")+ "  -- use "" for a single " inside "
+	             | $[A-Za-z0-9_]     -- environment variable
 
 	<typetest> ::= type ( == | = | != ) ( b | c | d | p | f | l )
 
diff --git a/lr.1 b/lr.1
index d422344..3488a28 100644
--- a/lr.1
+++ b/lr.1
@@ -255,6 +255,7 @@ tests are given by the following EBNF:
              | =~~               -- case insensitive POSIX Extended Regular Expressions
 
 <str>      ::= " ([^"] | "")+ "  -- use "" for a single " inside "
+             | $[A-Za-z0-9_]+    -- environment variable
 
 <typetest> ::= type ( == | = | != ) ( b | c | d | p | f | l )
 
diff --git a/lr.c b/lr.c
index a90b786..de451fa 100644
--- a/lr.c
+++ b/lr.c
@@ -396,6 +396,23 @@ parse_string(char **s)
 		ws();
 		*s = buf ? buf : (char *) "";
 		return 1;
+	} else if (*pos == '$') {
+		char t;
+		char *e = ++pos;
+
+		while (isalnum((unsigned char) *pos) || *pos == '_')
+			pos++;
+		if (e == pos)
+			parse_error("invalid environment variable name");
+
+		t = *pos;
+		*pos = 0;
+		*s = getenv(e);
+		if (!*s)
+			*s = (char *) "";
+		*pos = t;
+		ws();
+		return 1;
 	}
 
 	return 0;