element: Enforce that elements created by gst_element_factory_create/make() are floating
[platform/upstream/gstreamer.git] / gst / parse / parse.l
index 46ec251..50acf5c 100644 (file)
@@ -1,14 +1,36 @@
 %{
+#include "../gst_private.h"
+
 #include <math.h>
 #include <string.h>
 
-#include "../gst_private.h"
+#include <glib/gprintf.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)
+
 #ifdef G_HAVE_ISO_VARARGS
 #define PRINT(...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " __VA_ARGS__)
 #elif defined(G_HAVE_GNUC_VARARGS)
@@ -26,20 +48,18 @@ PRINT (const char *format, ...)
 }
 #endif
 
-#define YY_DECL int _gst_parse_yylex (YYSTYPE *lvalp)
 %}
 
-_operator [(){}.:!,;=]
-_identifier [[:alpha:]][[:alnum:]\-_%]*
+_operator [(){}.!:,;=]
+_identifier [[:alnum:]_][[:alnum:]\-_%:]*
 
 _char ("\\".)|([^[:space:]])
-_string {_char}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
+_string {_char}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\'")*"'")
 
-_comma [[:space:]]*","[[:space:]]*
 _assign [[:space:]]*"="[[:space:]]*
 
 _protocol [[:alpha:]][[:alnum:]+-\.]*
-_url {_protocol}"://"{_string}|["."{_identifier}]?"/"{_string}
+_url ({_protocol}"://"{_string}|["."{_identifier}]?"/"{_string})|({_protocol}"://")
 
 /* we must do this here, because nearly everything matches a {_string} */ 
 _assignment {_identifier}{_assign}{_string}
@@ -50,22 +70,26 @@ _ref {_identifier}"."{_identifier}?
 _binref {_identifier}[[:space:]]*"."[[:space:]]*"("
 
 /* links */
-_mimechar ([[:alnum:]-])
-_mimetype ({_mimechar}+"/"{_mimechar}+)|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
+_mimechar [[:alnum:]-]
+_mimetype {_mimechar}+"/"{_mimechar}+
 _capschar ("\\".)|([^\;!])
-_capsstring {_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);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return ASSIGNMENT;
 }
@@ -73,14 +97,14 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
 {_padref} {
     yytext++;
     PRINT ("PADREF: %s", yytext);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return PADREF;
 }
 
 {_ref} {
     PRINT ("REF: %s", yytext);
-    lvalp->s = gst_parse_strdup (yytext);
+    yylval->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return REF;
 }
@@ -90,44 +114,52 @@ _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->ss = gst_parse_strdup (yytext);
     BEGIN (INITIAL);
     return BINREF;
 }
 
 {_identifier} {
     PRINT ("IDENTIFIER: %s", yytext);
-    lvalp->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 = lvalp->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 {
-      lvalp->s = NULL;
+      yylval->ss = NULL;
     }
     BEGIN (INITIAL);
-    return LINK;
+    return link_all ? LINK_ALL : LINK;
 }
 {_url} {
   PRINT ("URL: %s", yytext);
-  if (gst_uri_is_valid (yytext)) {
-    lvalp->s = g_strdup (yytext);
-  } else {
-    lvalp->s = gst_uri_construct ("file", yytext);
-  }
-  gst_parse_unescape (lvalp->s);
+  yylval->ss = g_strdup (yytext);
+  gst_parse_unescape (yylval->ss);
   BEGIN (INITIAL);
   return PARSE_URL;
 }
@@ -137,7 +169,7 @@ _link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)
 [[:space:]]+ { PRINT ("SPACE: [%s]", yytext); }
 
 . {
-    printf ("???: %s\n", yytext);
+    PRINT ("Invalid Lexer element: %s\n", yytext);
     return *yytext;
 }