%{
+#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)
}
#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:]+-\.]*
_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;
}
{_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;
}
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;
}
[[:space:]]+ { PRINT ("SPACE: [%s]", yytext); }
. {
- printf ("???: %s\n", yytext);
+ PRINT ("Invalid Lexer element: %s\n", yytext);
return *yytext;
}