gst/parse/: push & pop the state of the lexer for reentrant use case
authorMarc-Andre Lureau <marcandre.lureau@gmail.com>
Sun, 30 Jul 2006 18:32:49 +0000 (18:32 +0000)
committerStefan Kost <ensonic@users.sourceforge.net>
Sun, 30 Jul 2006 18:32:49 +0000 (18:32 +0000)
Original commit message from CVS:
Patch by: Marc-Andre Lureau <marcandre.lureau@gmail.com>
* gst/parse/Makefile.am:
* gst/parse/grammar.y:
* gst/parse/parse.l:
push & pop the state of the lexer for reentrant use case
Fixes #349180

ChangeLog
gst/parse/Makefile.am
gst/parse/grammar.y
gst/parse/parse.l

index e80fb73..0f4b0d9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-07-30  Stefan Kost  <ensonic@users.sf.net>
+
+       Patch by: Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+       * gst/parse/Makefile.am:
+       * gst/parse/grammar.y:
+       * gst/parse/parse.l:
+         push & pop the state of the lexer for reentrant use case
+         Fixes #349180
+
 2006-07-29  Tim-Philipp Müller  <tim at centricular dot net>
 
        * libs/gst/base/gstbasesrc.h:
index c4431ab..43cf95e 100644 (file)
@@ -18,7 +18,7 @@ libgstparse_la_LIBADD = $(GST_ALL_LIBS)
 noinst_HEADERS = grammar.tab.h
 
 grammar.tab.c grammar.tab.h: grammar.y 
-       $(BISON_PATH) -d -v -p_gst_parse__yy $(srcdir)/grammar.y -o grammar.tab.c && \
+       $(BISON_PATH) -d -v -p_gst_parse_yy $(srcdir)/grammar.y -o grammar.tab.c && \
        mv grammar.tab.c grammar.tab_tmp.c && \
        echo '#ifdef HAVE_CONFIG_H' > grammar.tab_tmp2.c && \
        echo '#include <config.h>' >> grammar.tab_tmp2.c && \
index 654dc7b..7940872 100644 (file)
  */
   
 #define YYERROR_VERBOSE 1
-#define YYPARSE_PARAM graph
+#define YYLEX_PARAM   scanner
+
+typedef void* yyscan_t;
+
+int _gst_parse_yylex (void * yylval_param , yyscan_t yyscanner);
+int _gst_parse_yylex_init (yyscan_t scanner);
+int _gst_parse_yylex_destroy (yyscan_t scanner);
+struct yy_buffer_state * _gst_parse_yy_scan_string (char* , yyscan_t);
+void _gst_parse_yypush_buffer_state (void * new_buffer ,yyscan_t yyscanner );
+void _gst_parse_yypop_buffer_state (yyscan_t yyscanner );
+
 
 #ifdef __GST_PARSE_TRACE
 static guint __strings;
@@ -533,8 +543,7 @@ error:
 }
 
 
-static int yylex (void *lvalp);
-static int yyerror (const char *s);
+static int yyerror (graph_t *graph, const char *s);
 %}
 
 %union {
@@ -565,7 +574,8 @@ static int yyerror (const char *s);
 %right '.'
 %left '!' '='
 
-%pure_parser
+%parse-param { void *scanner, graph_t *graph }
+%pure-parser
 
 %start graph
 %%
@@ -790,23 +800,16 @@ graph:            /* NOP */                     { SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERRO
 
 %%
 
-extern FILE *_gst_parse_yyin;
-int _gst_parse_yylex (YYSTYPE *lvalp);
-
-static int yylex (void *lvalp) {
-    return _gst_parse_yylex ((YYSTYPE*) lvalp);
-}
 
 static int
-yyerror (const char *s)
+yyerror (graph_t *graph, const char *s)
 {
   /* FIXME: This should go into the GError somehow, but how? */
   GST_WARNING ("Error during parsing: %s", s);
   return -1;
 }
 
-struct yy_buffer_state * _gst_parse_yy_scan_string (char*);
-void _gst_parse_yy_delete_buffer (struct yy_buffer_state *);
+
 GstElement *
 _gst_parse_launch (const gchar *str, GError **error)
 {
@@ -815,8 +818,8 @@ _gst_parse_launch (const gchar *str, GError **error)
   GSList *walk;
   GstBin *bin = NULL;
   GstElement *ret;
-  struct yy_buffer_state *buf;
-  
+  yyscan_t scanner;
+
   g_return_val_if_fail (str != NULL, NULL);
 
   g.chain = NULL;
@@ -829,21 +832,22 @@ _gst_parse_launch (const gchar *str, GError **error)
 #endif /* __GST_PARSE_TRACE */
 
   dstr = g_strdup (str);
-  buf = _gst_parse_yy_scan_string (dstr);
+  _gst_parse_yylex_init( &scanner );
+  _gst_parse_yy_scan_string (dstr, scanner);
 
 #ifndef YYDEBUG
   yydebug = 1;
 #endif
 
-  if (yyparse (&g) != 0) {
+  if (yyparse (scanner, &g) != 0) {
     SET_ERROR (error, GST_PARSE_ERROR_SYNTAX,
         "Unrecoverable syntax error while parsing pipeline %s", str);
     
     goto error1;
   }
+  _gst_parse_yylex_destroy( scanner );
   g_free (dstr);
-  _gst_parse_yy_delete_buffer (buf);
-  
+
   GST_CAT_DEBUG (GST_CAT_PIPELINE, "got %u elements and %u links",
       g.chain ? g_slist_length (g.chain->elements) : 0,
       g_slist_length (g.links));
index 9d5c07a..03da0d4 100644 (file)
@@ -32,7 +32,6 @@ PRINT (const char *format, ...)
 }
 #endif
 
-#define YY_DECL int _gst_parse_yylex (YYSTYPE *lvalp)
 %}
 
 _operator [(){}.!,;=]
@@ -65,12 +64,14 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
 %x value
 %option noyywrap
 %option nounput
+%option reentrant
+%option bison-bridge
 %%
 
 {_assignment} {
     /* "=" */
     PRINT ("ASSIGNMENT: %s", yytext);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->s = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return ASSIGNMENT;
 }
@@ -78,14 +79,14 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
 {_padref} {
     yytext++;
     PRINT ("PADREF: %s", yytext);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->s = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return PADREF;
 }
 
 {_ref} {
     PRINT ("REF: %s", yytext);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->s = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return REF;
 }
@@ -95,14 +96,14 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
     while (!g_ascii_isspace (*pos) && (*pos != '.')) pos++;
     *pos = '\0';
     PRINT ("BINREF: %s", yytext);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->s = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return BINREF;
 }
 
 {_identifier} {
     PRINT ("IDENTIFIER: %s", yytext);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->s = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return IDENTIFIER;
 }
@@ -113,22 +114,22 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
     c++;
     if (*c) {
       while (g_ascii_isspace (*c)) c++;
-      c = lvalp->s = gst_parse_strdup (c);
+      c = yylval->s = gst_parse_strdup (c);
       while (*c) c++;
       if (*--c != '!')
        g_assert_not_reached ();
       while (g_ascii_isspace (*--c));
       *++c = '\0';
     } else {
-      lvalp->s = NULL;
+      yylval->s = NULL;
     }
     BEGIN (INITIAL);
     return LINK;
 }
 {_url} {
   PRINT ("URL: %s", yytext);
-  lvalp->s = g_strdup (yytext);
-  gst_parse_unescape (lvalp->s);
+  yylval->s = g_strdup (yytext);
+  gst_parse_unescape (yylval->s);
   BEGIN (INITIAL);
   return PARSE_URL;
 }