From 48afa6dc3a76c16a825bcff8494af757397863e6 Mon Sep 17 00:00:00 2001 From: Marc-Andre Lureau Date: Sun, 30 Jul 2006 18:32:49 +0000 Subject: [PATCH] gst/parse/: push & pop the state of the lexer for reentrant use case Original commit message from CVS: Patch by: Marc-Andre Lureau * 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 | 10 ++++++++++ gst/parse/Makefile.am | 2 +- gst/parse/grammar.y | 42 +++++++++++++++++++++++------------------- gst/parse/parse.l | 21 +++++++++++---------- 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index e80fb7371a..0f4b0d9424 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-07-30 Stefan Kost + + Patch by: Marc-Andre Lureau + + * 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 * libs/gst/base/gstbasesrc.h: diff --git a/gst/parse/Makefile.am b/gst/parse/Makefile.am index c4431ab173..43cf95eaed 100644 --- a/gst/parse/Makefile.am +++ b/gst/parse/Makefile.am @@ -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 ' >> grammar.tab_tmp2.c && \ diff --git a/gst/parse/grammar.y b/gst/parse/grammar.y index 654dc7bf90..794087202e 100644 --- a/gst/parse/grammar.y +++ b/gst/parse/grammar.y @@ -24,7 +24,17 @@ */ #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)); diff --git a/gst/parse/parse.l b/gst/parse/parse.l index 9d5c07a92a..03da0d485c 100644 --- a/gst/parse/parse.l +++ b/gst/parse/parse.l @@ -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; }