• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 %{
2 #include "../gst_private.h"
3 
4 #include <math.h>
5 #include <string.h>
6 
7 #include <glib/gprintf.h>
8 
9 #include "types.h"
10 #include "../gstinfo.h"
11 #include "../gsturi.h"
12 #include "grammar.tab.h"
13 
14 #ifdef malloc
15 #undef malloc
16 #endif
17 
18 #ifdef free
19 #undef free
20 #endif
21 
22 #ifdef realloc
23 #undef realloc
24 #endif
25 
26 #define malloc g_malloc
27 #define free g_free
28 #define realloc g_realloc
29 
30 /* Override the default ECHO so as to avoid fortify warnings. Ignore the
31    embedded-NUL case for now. We know yytext is NUL-terminated. */
32 #define ECHO g_fprintf(yyout, "%s", yytext)
33 
34 #ifdef G_HAVE_ISO_VARARGS
35 #define PRINT(...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " __VA_ARGS__)
36 #elif defined(G_HAVE_GNUC_VARARGS)
37 #define PRINT(args...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " args)
38 #else
39 static inline void
40 PRINT (const char *format, ...)
41 {
42   va_list varargs;
43 
44   va_start (varargs, format);
45   GST_CAT_LEVEL_LOG_valist (GST_CAT_PIPELINE, GST_LEVEL_DEBUG, NULL,
46     format, varargs);
47   va_end (varargs);
48 }
49 #endif
50 
51 %}
52 
53 _operator [(){}.!:,;=]
54 _identifier [[:alnum:]_][[:alnum:]\-_%:]*
55 
56 _char ("\\".)|([^[:space:]])
57 _string {_char}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\'")*"'")
58 
59 _assign [[:space:]]*"="[[:space:]]*
60 
61 _protocol [[:alpha:]][[:alnum:]+-\.]*
62 _url ({_protocol}"://"{_string}|["."{_identifier}]?"/"{_string})|({_protocol}"://")
63 
64 /* we must do this here, because nearly everything matches a {_string} */
65 _assignment {_identifier}{_assign}{_string}
66 
67 _preset @preset{_assign}{_string}
68 
69 /* get pad/element references and stuff with dots right */
70 _padref "."{_identifier}
71 _ref {_identifier}"."{_identifier}?
72 _binref {_identifier}[[:space:]]*"."[[:space:]]*"("
73 
74 /* links */
75 _mimechar [[:alnum:]-]
76 _mimetype {_mimechar}+"/"{_mimechar}+
77 _capschar ("\\".)|([^\;!])
78 _capsstring {_capschar}+
79 _caps {_mimetype}(","[^!]|{_capsstring})*
80 _link ([!:][[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)*[!:])|([!:])
81 
82 %x value
83 %option noyywrap
84 %option nounput
85 %option reentrant
86 %option bison-bridge
87 %option never-interactive
88 %option noinput
89 %%
90 
91 {_assignment} {
92     /* "=" */
93     PRINT ("ASSIGNMENT: %s", yytext);
94     yylval->ss = gst_parse_strdup (yytext);
95     BEGIN (INITIAL);
96     return ASSIGNMENT;
97 }
98 
99 {_preset} {
100     gchar *pos = yytext;
101     while (*pos && (*pos != '=')) pos++;
102     while (*pos && g_ascii_isspace (*pos)) pos++;
103     PRINT ("PRESET: %s", &pos[1]);
104     yylval->ss = gst_parse_strdup (&pos[1]);
105     BEGIN (INITIAL);
106     return PRESET;
107 }
108 
109 {_padref} {
110     yytext++;
111     PRINT ("PADREF: %s", yytext);
112     yylval->ss = gst_parse_strdup (yytext);
113     BEGIN (INITIAL);
114     return PADREF;
115 }
116 
117 {_ref} {
118     PRINT ("REF: %s", yytext);
119     yylval->ss = gst_parse_strdup (yytext);
120     BEGIN (INITIAL);
121     return REF;
122 }
123 
124 {_binref} {
125     gchar *pos = yytext;
126     while (!g_ascii_isspace (*pos) && (*pos != '.')) pos++;
127     *pos = '\0';
128     PRINT ("BINREF: %s", yytext);
129     yylval->ss = gst_parse_strdup (yytext);
130     BEGIN (INITIAL);
131     return BINREF;
132 }
133 
134 {_identifier} {
135     PRINT ("IDENTIFIER: %s", yytext);
136     yylval->ss = gst_parse_strdup (yytext);
137     BEGIN (INITIAL);
138     return IDENTIFIER;
139 }
140 
141 {_link} {
142     gchar *c = yytext;
143     gchar op;
144     gboolean link_all;
145 
146     PRINT ("LINK: %s", yytext);
147     /* First char is a link operator */
148     link_all = (*c == ':');
149     c++;
150     if (*c) {
151       while (g_ascii_isspace (*c)) c++;
152       c = yylval->ss = gst_parse_strdup (c);
153       while (*c) c++;
154       /* Last non-space char is a link operator */
155       op = *--c;
156       if (op != '!' && op != ':')
157 	g_assert_not_reached ();
158       if (op == ':')
159         link_all = TRUE;
160 
161       /* Walk backward past whitespaces - what remains
162        * is a filter caps string, or empty */
163       while (g_ascii_isspace (*--c));
164       *++c = '\0';
165     } else {
166       yylval->ss = NULL;
167     }
168     BEGIN (INITIAL);
169     return link_all ? LINK_ALL : LINK;
170 }
171 {_url} {
172   PRINT ("URL: %s", yytext);
173   yylval->ss = g_strdup (yytext);
174   gst_parse_unescape (yylval->ss);
175   BEGIN (INITIAL);
176   return PARSE_URL;
177 }
178 
179 {_operator} { PRINT ("OPERATOR: [%s]", yytext); return *yytext; }
180 
181 [[:space:]]+ { PRINT ("SPACE: [%s]", yytext); }
182 
183 . {
184     PRINT ("Invalid Lexer element: %s\n", yytext);
185     return *yytext;
186 }
187 
188 %%
189