6 #include <grammar.tab.h>
8 #ifdef G_HAVE_ISO_VARARGS
11 # define PRINT(...) printf(__VAR_ARGS__)
16 #elif defined(G_HAVE_GNUC_VARARGS)
19 # define PRINT(a...) printf(##a)
26 #define CHAR(x) PRINT ("char: %c\n", *yytext); return *yytext;
28 #define YY_DECL int _gst_parse_yylex (YYSTYPE *lvalp)
32 _integer [-+]?[[:digit:]]+
33 _double [-+]?[[:digit:]]+"."*[[:digit:]]*
34 _number {_integer}|{_double}
35 _boolean "true"|"false"|"TRUE"|"FALSE"
36 _identifier [[:alpha:]][[:alnum:]\-_%:]*
37 _char ([^[:space:]])|("\\".)
38 _string {_char}+|("\""([^\"]|"\\\"")*"\"")
39 _comma [[:space:]]*","[[:space:]]*
40 _assign [[:space:]]*"="[[:space:]]*
41 _caps_type_string "fourcc"|"string"
42 _caps_type_double "float"
43 _caps_string {_string}{_assign}{_caps_type_string}[[:space:]]+{_string}
44 _caps_int {_string}{_assign}"int"[[:space:]]+{_integer}
45 _caps_double {_string}{_assign}{_caps_type_double}[[:space:]]+{_double}
46 _caps_boolean {_string}{_assign}"boolean"[[:space:]]+{_boolean}
47 _caps_pair {_caps_string}|{_caps_int}|{_caps_double}|{_caps_boolean}
48 _caps {_string}({_comma}{_caps_pair})*
49 _lconnection ({_identifier}\.)?{_identifier}!
50 _rconnection !({_identifier}\.)?{_identifier}
51 _bconnection ({_identifier}\.)?{_identifier}!({_identifier}\.)?{_identifier}
52 _fconnection ({_identifier}\.)?{_identifier}!{_caps}!({_identifier}\.)?{_identifier}
60 PRINT ("An integer: %s (%d)\n", yytext,
62 lvalp->v = g_new0 (GValue, 1);
63 g_value_init (lvalp->v, G_TYPE_INT);
64 g_value_set_int (lvalp->v, atoi (yytext));
70 PRINT ("A double: %s (%g)\n", yytext, atof (yytext));
71 lvalp->v = g_new0 (GValue, 1);
72 g_value_init (lvalp->v, G_TYPE_DOUBLE);
73 g_value_set_double (lvalp->v, atof (yytext));
79 PRINT ("A boolean: %s (%d)\n", yytext, tolower (*yytext) == 't' ? 1 : 0);
80 lvalp->v = g_new0 (GValue, 1);
81 g_value_init (lvalp->v, G_TYPE_BOOLEAN);
82 g_value_set_boolean (lvalp->v, tolower (*yytext) == 't' ? TRUE : FALSE);
90 *(yytext + strlen (yytext) - 1) = '\0';
92 _gst_parse_unescape (yytext);
93 PRINT ("A string: \"%s\"\n", yytext);
94 lvalp->v = g_new0 (GValue, 1);
95 g_value_init (lvalp->v, G_TYPE_STRING);
96 g_value_set_string (lvalp->v, yytext);
101 [[:space:]]+ { /* PRINT ("space: [%s]\n", yytext); */ }
106 lvalp->c = g_new0 (connection_t, 1);
107 PRINT ("An connection: %s\n", yytext);
108 q = strchr (yytext, '!');
109 d1 = strchr (yytext, '.');
111 lvalp->c->src_name = g_strndup (yytext, d1 - yytext);
112 lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (d1 + 1, q - d1 - 1));
114 lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (yytext, q - yytext));
122 lvalp->c = g_new0 (connection_t, 1);
123 PRINT ("An rconnection: %s\n", yytext);
124 d2 = strchr (yytext, '.');
126 lvalp->c->sink_name = g_strndup (yytext + 1, d2 - yytext - 1);
127 lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (d2 + 1));
129 lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (yytext + 1));
137 lvalp->c = g_new0 (connection_t, 1);
138 PRINT ("A bconnection: %s\n", yytext);
139 q = strchr (yytext, '!');
140 d1 = strchr (yytext, '.');
141 d2 = strchr (q, '.');
143 lvalp->c->src_name = g_strndup (yytext, d1 - yytext);
144 lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (d1 + 1, q - d1 - 1));
146 lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (yytext, q - yytext));
150 lvalp->c->sink_name = g_strndup (q + 1, d2 - q - 1);
151 lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (d2 + 1));
153 lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (q + 1));
160 gchar *d1, *d2, *q1, *q2, *a1, *m1;
164 lvalp->c = g_new0 (connection_t, 1);
165 PRINT ("An fconnection: %s\n", yytext);
166 q1 = strchr (yytext, '!');
167 d1 = strchr (yytext, '.');
168 q2 = strchr (q1+1, '!');
169 d2 = strchr (q2, '.');
171 lvalp->c->src_name = g_strndup (yytext, d1 - yytext);
172 lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (d1 + 1, q1 - d1 - 1));
174 lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (yytext, q1 - yytext));
178 lvalp->c->sink_name = g_strndup (q2 + 1, d2 - q2 - 1);
179 lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (d2 + 1));
181 lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (q2 + 1));
183 /* parse mime type */
184 m1 = strchr (q1 + 1, ',');
185 mime = g_strndup (q1 + 1, m1 - q1 - 1);
187 props = gst_props_empty_new ();
189 a1 = strchr (m1 + 1, ',');
193 while (a1 && a1 <= q2) {
196 GstPropsEntry *entry = NULL;
198 k1 = strchr (m1, '=');
199 key = g_strstrip (g_strndup (m1 + 1, k1 - m1 -1));
203 while (g_ascii_isspace (*k1)) k1++;
205 k2 = strchr (k1, ' ');
206 t = g_strstrip (g_strndup (k1, k2 - k1));
208 while (g_ascii_isspace (*k2)) k2++;
210 v = g_strstrip (g_strndup (k2, a1 - k2));
212 if (!strcmp (t, "string")) {
213 entry = gst_props_entry_new (key, GST_PROPS_STRING (v));
215 else if (!strcmp (t, "fourcc")) {
216 entry = gst_props_entry_new (key, GST_PROPS_FOURCC (GST_STR_FOURCC(v)));
218 else if (!strcmp (t, "float")) {
220 sscanf (v, "%f", &f);
221 entry = gst_props_entry_new (key, GST_PROPS_FLOAT (f));
223 else if (!strcmp (t, "int")) {
225 sscanf (v, "%d", &i);
226 entry = gst_props_entry_new (key, GST_PROPS_INT (i));
228 else if (!strcmp (t, "boolean")) {
230 b = (!strcmp (v, "true") || ! strcmp (v, "TRUE"));
231 entry = gst_props_entry_new (key, GST_PROPS_BOOLEAN (b));
233 gst_props_add_entry (props, entry);
237 a1 = strchr (m1 + 1, ',');
244 lvalp->c->caps = gst_caps_new ("parse_caps", mime, props);
250 PRINT ("An identifier: %s\n", yytext);
251 lvalp->s = g_strdup (yytext);
255 "=" { BEGIN (value); CHAR ('='); }
268 [[:space:]]+ { PRINT ("space: [%s]\n", yytext); }
271 printf ("unknown: %s\n", yytext);