parse: Don't hold element's object lock while querying element pads' caps
[platform/upstream/gstreamer.git] / gst / parse / parse.l
index 03da0d4..50acf5c 100644 (file)
@@ -1,16 +1,32 @@
 %{
+#include "../gst_private.h"
+
 #include <math.h>
 #include <string.h>
 
 #include <glib/gprintf.h>
 
-#include "../gst_private.h"
-
 #include "types.h"
 #include "../gstinfo.h"
 #include "../gsturi.h"
 #include "grammar.tab.h"
 
+#ifdef malloc
+#undef malloc
+#endif
+
+#ifdef free
+#undef free
+#endif
+
+#ifdef realloc
+#undef realloc
+#endif
+
+#define malloc g_malloc
+#define free g_free
+#define realloc g_realloc
+
 /* Override the default ECHO so as to avoid fortify warnings. Ignore the
    embedded-NUL case for now. We know yytext is NUL-terminated. */
 #define ECHO g_fprintf(yyout, "%s", yytext)
@@ -34,8 +50,8 @@ PRINT (const char *format, ...)
 
 %}
 
-_operator [(){}.!,;=]
-_identifier [[:alpha:]][[:alnum:]\-_%:]*
+_operator [(){}.!:,;=]
+_identifier [[:alnum:]_][[:alnum:]\-_%:]*
 
 _char ("\\".)|([^[:space:]])
 _string {_char}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\'")*"'")
@@ -59,19 +75,21 @@ _mimetype {_mimechar}+"/"{_mimechar}+
 _capschar ("\\".)|([^\;!])
 _capsstring {_capschar}+
 _caps {_mimetype}(","[^!]|{_capsstring})*
-_link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)*"!")|("!")
+_link ([!:][[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)*[!:])|([!:])
 
 %x value
 %option noyywrap
 %option nounput
 %option reentrant
 %option bison-bridge
+%option never-interactive
+%option noinput
 %%
 
 {_assignment} {
     /* "=" */
     PRINT ("ASSIGNMENT: %s", yytext);
-    yylval->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return ASSIGNMENT;
 }
@@ -79,14 +97,14 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
 {_padref} {
     yytext++;
     PRINT ("PADREF: %s", yytext);
-    yylval->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return PADREF;
 }
 
 {_ref} {
     PRINT ("REF: %s", yytext);
-    yylval->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return REF;
 }
@@ -96,40 +114,52 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
     while (!g_ascii_isspace (*pos) && (*pos != '.')) pos++;
     *pos = '\0';
     PRINT ("BINREF: %s", yytext);
-    yylval->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return BINREF;
 }
 
 {_identifier} {
     PRINT ("IDENTIFIER: %s", yytext);
-    yylval->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return IDENTIFIER;
 }
 
 {_link} {
     gchar *c = yytext;
+    gchar op;
+    gboolean link_all;
+
     PRINT ("LINK: %s", yytext);
+    /* First char is a link operator */
+    link_all = (*c == ':');
     c++;
     if (*c) {
       while (g_ascii_isspace (*c)) c++;
-      c = yylval->s = gst_parse_strdup (c);
+      c = yylval->ss = gst_parse_strdup (c);
       while (*c) c++;
-      if (*--c != '!')
+      /* Last non-space char is a link operator */
+      op = *--c;
+      if (op != '!' && op != ':')
        g_assert_not_reached ();
+      if (op == ':')
+        link_all = TRUE;
+
+      /* Walk backward past whitespaces - what remains
+       * is a filter caps string, or empty */
       while (g_ascii_isspace (*--c));
       *++c = '\0';
     } else {
-      yylval->s = NULL;
+      yylval->ss = NULL;
     }
     BEGIN (INITIAL);
-    return LINK;
+    return link_all ? LINK_ALL : LINK;
 }
 {_url} {
   PRINT ("URL: %s", yytext);
-  yylval->s = g_strdup (yytext);
-  gst_parse_unescape (yylval->s);
+  yylval->ss = g_strdup (yytext);
+  gst_parse_unescape (yylval->ss);
   BEGIN (INITIAL);
   return PARSE_URL;
 }