%{
+#include "../gst_private.h"
+
#include <math.h>
-#include <ctype.h>
#include <string.h>
+
+#include <glib/gprintf.h>
+
#include "types.h"
#include "../gstinfo.h"
+#include "../gsturi.h"
#include "grammar.tab.h"
-#ifdef HAVE_CONFIG_H
-#include <config.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
-# ifdef GST_DEBUG_ENABLED
-# define PRINT(...) GST_DEBUG (GST_CAT_PIPELINE, "flex: "__VA_ARGS__)
-# endif
+#define PRINT(...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " __VA_ARGS__)
#elif defined(G_HAVE_GNUC_VARARGS)
-# ifdef GST_DEBUG_ENABLED
-# define PRINT(...) GST_DEBUG (GST_CAT_PIPELINE, "flex: "##args)
-# endif
+#define PRINT(args...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " args)
#else
-# ifdef GST_DEBUG_ENABLED
-# define PRINT(a...) GST_DEBUG (GST_CAT_PIPELINE, "flex: "##a)
-# endif
-#endif // G_HAVE_ISO_VARARGS
+static inline void
+PRINT (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_PIPELINE, GST_LEVEL_DEBUG, NULL,
+ format, varargs);
+ va_end (varargs);
+}
+#endif
-#define YY_DECL int _gst_parse_yylex (YYSTYPE *lvalp)
%}
-_operators [(){}.:!,=]
-_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})|({_protocol}"://")
+
/* we must do this here, because nearly everything matches a {_string} */
_assignment {_identifier}{_assign}{_string}
_ref {_identifier}"."{_identifier}?
_binref {_identifier}[[:space:]]*"."[[:space:]]*"("
+/* links */
+_mimechar [[:alnum:]-]
+_mimetype {_mimechar}+"/"{_mimechar}+
+_capschar ("\\".)|([^\;!])
+_capsstring {_capschar}+
+_caps {_mimetype}(","[^!]|{_capsstring})*
+_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\n", yytext);
- lvalp->s = gst_parse_strdup (yytext);
+ PRINT ("ASSIGNMENT: %s", yytext);
+ yylval->ss = gst_parse_strdup (yytext);
BEGIN (INITIAL);
return ASSIGNMENT;
}
{_padref} {
yytext++;
- PRINT ("PADREF: %s\n", yytext);
- lvalp->s = gst_parse_strdup (yytext);
+ PRINT ("PADREF: %s", yytext);
+ yylval->ss = gst_parse_strdup (yytext);
BEGIN (INITIAL);
return PADREF;
}
{_ref} {
- PRINT ("REF: %s\n", yytext);
- lvalp->s = gst_parse_strdup (yytext);
+ PRINT ("REF: %s", yytext);
+ yylval->ss = gst_parse_strdup (yytext);
BEGIN (INITIAL);
return REF;
}
gchar *pos = yytext;
while (!g_ascii_isspace (*pos) && (*pos != '.')) pos++;
*pos = '\0';
- PRINT ("BINREF: %s\n", yytext);
- lvalp->s = gst_parse_strdup (yytext);
+ PRINT ("BINREF: %s", yytext);
+ yylval->ss = gst_parse_strdup (yytext);
BEGIN (INITIAL);
return BINREF;
}
{_identifier} {
- PRINT ("IDENTIFIER: %s\n", yytext);
- lvalp->s = gst_parse_strdup (yytext);
+ PRINT ("IDENTIFIER: %s", yytext);
+ yylval->ss = gst_parse_strdup (yytext);
BEGIN (INITIAL);
return IDENTIFIER;
}
-{_operators} { PRINT ("OPERATOR: [%s]\n", yytext); return *yytext; }
+{_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->ss = gst_parse_strdup (c);
+ while (*c) 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->ss = NULL;
+ }
+ BEGIN (INITIAL);
+ return link_all ? LINK_ALL : LINK;
+}
+{_url} {
+ PRINT ("URL: %s", yytext);
+ yylval->ss = g_strdup (yytext);
+ gst_parse_unescape (yylval->ss);
+ BEGIN (INITIAL);
+ return PARSE_URL;
+}
+
+{_operator} { PRINT ("OPERATOR: [%s]", yytext); return *yytext; }
-[[:space:]]+ { PRINT ("SPACE: [%s]\n", yytext); }
+[[:space:]]+ { PRINT ("SPACE: [%s]", yytext); }
. {
- printf ("???: %s\n", yytext);
+ PRINT ("Invalid Lexer element: %s\n", yytext);
return *yytext;
}