summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2011-01-01 12:43:03 -0800
committerKenneth Graunke <kenneth@whitecape.org>2011-01-12 23:55:34 -0800
commit47b2af2c62fec3ac0fb501a31e93fc8d00c18cb8 (patch)
tree2988cd8206098a03e1e262a928f4f4e325404a5d
parent5bfb68cd0f1d2941645a1fe133ffe1c6a4f5786b (diff)
glsl/s_expression: Read and ignore Scheme-style comments.
A single-semicolon until the end of the line, i.e. ; this is a comment.
-rw-r--r--src/glsl/s_expression.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/glsl/s_expression.cpp b/src/glsl/s_expression.cpp
index 852a049d43f..6edbf62e488 100644
--- a/src/glsl/s_expression.cpp
+++ b/src/glsl/s_expression.cpp
@@ -38,15 +38,25 @@ s_list::s_list()
{
}
+static void
+skip_whitespace(const char *& src)
+{
+ src += strspn(src, " \v\t\r\n");
+ /* Also skip Scheme-style comments: semi-colon 'til end of line */
+ if (src[0] == ';') {
+ src += strcspn(src, "\n");
+ skip_whitespace(src);
+ }
+}
+
static s_expression *
read_atom(void *ctx, const char *& src)
{
s_expression *expr = NULL;
- // Skip leading spaces.
- src += strspn(src, " \v\t\r\n");
+ skip_whitespace(src);
- size_t n = strcspn(src, "( \v\t\r\n)");
+ size_t n = strcspn(src, "( \v\t\r\n);");
if (n == 0)
return NULL; // no atom
@@ -80,8 +90,7 @@ s_expression::read_expression(void *ctx, const char *&src)
if (atom != NULL)
return atom;
- // Skip leading spaces.
- src += strspn(src, " \v\t\r\n");
+ skip_whitespace(src);
if (src[0] == '(') {
++src;
@@ -91,7 +100,7 @@ s_expression::read_expression(void *ctx, const char *&src)
while ((expr = read_expression(ctx, src)) != NULL) {
list->subexpressions.push_tail(expr);
}
- src += strspn(src, " \v\t\r\n");
+ skip_whitespace(src);
if (src[0] != ')') {
printf("Unclosed expression (check your parenthesis).\n");
return NULL;