glsl/s_expression: Read and ignore Scheme-style comments.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 1 Jan 2011 20:43:03 +0000 (12:43 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 13 Jan 2011 07:55:34 +0000 (23:55 -0800)
A single-semicolon until the end of the line, i.e.
; this is a comment.

src/glsl/s_expression.cpp

index 852a049d43fd31bafa16720b2802c0f6579145fc..6edbf62e488bc64731ba364240d1ef9eb7bfa785 100644 (file)
@@ -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;