first pass of connect->link gst-plugins and other stuff compiles without change at...
[platform/upstream/gstreamer.git] / gst / parse / parse.l
1 %{
2 #include <math.h>
3 #include <ctype.h>
4 #include <string.h>
5 #include "types.h"
6 #include <grammar.tab.h>
7
8 #ifdef G_HAVE_ISO_VARARGS
9
10 #ifdef DEBUG
11 # define PRINT(...) printf(__VAR_ARGS__)
12 #else
13 #define PRINT(...)
14 #endif
15
16 #elif defined(G_HAVE_GNUC_VARARGS)
17
18 #ifdef DEBUG
19 # define PRINT(a...) printf(##a)
20 #else
21 #define PRINT(a...)
22 #endif
23
24 #endif
25
26 #define CHAR(x) PRINT ("char: %c\n", *yytext); return *yytext;
27
28 #define YY_DECL int _gst_parse_yylex (YYSTYPE *lvalp)
29 #define YY_NO_UNPUT
30 %}
31
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 _llink ({_identifier}\.)?{_identifier}!
50 _rlink !({_identifier}\.)?{_identifier}
51 _blink ({_identifier}\.)?{_identifier}!({_identifier}\.)?{_identifier}
52 _flink ({_identifier}\.)?{_identifier}!{_caps}!({_identifier}\.)?{_identifier}
53
54 %x value
55 %option noyywrap
56 %%
57
58 <value>{
59     {_integer} {
60         PRINT ("An integer: %s (%d)\n", yytext,
61                atoi (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));
65         BEGIN (INITIAL);
66         return VALUE;
67     }
68     
69     {_double}   {
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));
74         BEGIN (INITIAL);
75         return VALUE;
76     }
77     
78     {_boolean} {
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);
83         BEGIN (INITIAL);
84         return VALUE;
85     }
86     
87     {_string} {
88         if (*yytext == '"') {
89             yytext++;
90             *(yytext + strlen (yytext) - 1) = '\0';
91         }
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);
97         BEGIN (INITIAL);
98         return VALUE;
99     }
100     
101     [[:space:]]+ { /* PRINT ("space: [%s]\n", yytext); */ }
102 }
103
104 {_llink} {
105     gchar *d1, *q;
106     lvalp->c = g_new0 (link_t, 1);
107     PRINT ("An link: %s\n", yytext);
108     q = strchr (yytext, '!');
109     d1 = strchr (yytext, '.');
110     if (d1) {
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));
113     } else {
114         lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (yytext, q - yytext));
115     }
116     
117     return LINK;
118 }
119
120 {_rlink} {
121     gchar *d2;
122     lvalp->c = g_new0 (link_t, 1);
123     PRINT ("An rlink: %s\n", yytext);
124     d2 = strchr (yytext, '.');
125     if (d2) {
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));
128     } else {
129         lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (yytext + 1));
130     }
131
132     return LINK;
133 }
134
135 {_blink} {
136     gchar *d1, *d2, *q;
137     lvalp->c = g_new0 (link_t, 1);
138     PRINT ("A blink: %s\n", yytext);
139     q = strchr (yytext, '!');
140     d1 = strchr (yytext, '.');
141     d2 = strchr (q, '.');
142     if (d1 && d1 < 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));
145     } else {
146         lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (yytext, q - yytext));
147     }
148     
149     if (d2) {
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));
152     } else {
153         lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (q + 1));
154     }
155
156     return BLINK;
157 }
158
159 {_flink} {
160     gchar *d1, *d2, *q1, *q2, *a1, *m1;
161     gchar *mime;
162     GstProps *props;
163
164     lvalp->c = g_new0 (link_t, 1);
165     PRINT ("An flink: %s\n", yytext);
166     q1 = strchr (yytext, '!');
167     d1 = strchr (yytext, '.');
168     q2 = strchr (q1+1, '!');
169     d2 = strchr (q2, '.');
170     if (d1 && d1 < q1) {
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));
173     } else {
174         lvalp->c->src_pads = g_list_append (lvalp->c->src_pads, g_strndup (yytext, q1 - yytext));
175     }
176     
177     if (d2) {
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));
180     } else {
181         lvalp->c->sink_pads = g_list_append (lvalp->c->sink_pads, g_strdup (q2 + 1));
182     }
183     /* parse mime type */
184     m1 = strchr (q1 + 1, ',');
185     mime = g_strndup (q1 + 1, m1 - q1 - 1);
186
187     props = gst_props_empty_new ();
188
189     a1 = strchr (m1 + 1, ',');
190     if (a1 == NULL)
191       a1 = q2;
192
193     while (a1 && a1 <= q2) {
194       gchar *key, *t, *v;
195       gchar *k1, *k2;
196       GstPropsEntry *entry = NULL;
197
198       k1 = strchr (m1, '=');
199       key = g_strstrip (g_strndup (m1 + 1, k1 - m1 -1));
200
201       k1++;
202
203       while (g_ascii_isspace (*k1)) k1++;
204
205       k2 = strchr (k1, ' ');
206       t = g_strstrip (g_strndup (k1, k2 - k1));
207
208       while (g_ascii_isspace (*k2)) k2++;
209
210       v = g_strstrip (g_strndup (k2, a1 - k2));
211
212       if (!strcmp (t, "string")) {
213         entry = gst_props_entry_new (key, GST_PROPS_STRING (v));
214       }
215       else if (!strcmp (t, "fourcc")) {
216         entry = gst_props_entry_new (key, GST_PROPS_FOURCC (GST_STR_FOURCC(v)));
217       }
218       else if (!strcmp (t, "float")) {
219         gfloat f;
220         sscanf (v, "%f", &f);
221         entry = gst_props_entry_new (key, GST_PROPS_FLOAT (f));
222       }
223       else if (!strcmp (t, "int")) {
224         gint i;
225         sscanf (v, "%d", &i);
226         entry = gst_props_entry_new (key, GST_PROPS_INT (i));
227       }
228       else if (!strcmp (t, "boolean")) {
229         gboolean b;
230         b = (!strcmp (v, "true") || ! strcmp (v, "TRUE"));
231         entry = gst_props_entry_new (key, GST_PROPS_BOOLEAN (b));
232       }
233       gst_props_add_entry (props, entry);
234       
235       m1 = a1;
236       if (a1 < q2) {
237         a1 = strchr (m1 + 1, ',');
238         if (a1 == NULL) 
239           a1 = q2;
240       }
241       else
242         break;
243     }
244     lvalp->c->caps = gst_caps_new ("parse_caps", mime, props);
245
246     return FLINK;
247 }
248
249 {_identifier} {
250     PRINT ("An identifier: %s\n", yytext);
251     lvalp->s = g_strdup (yytext);
252     return IDENTIFIER;
253 }
254
255 "=" { BEGIN (value); CHAR ('='); }
256 "@" { CHAR ('@'); }
257 "." { CHAR ('.'); }
258 "," { CHAR (','); }
259 "{" { CHAR ('{'); }
260 "}" { CHAR ('}'); }
261 "[" { CHAR ('['); }
262 "]" { CHAR (']'); }
263 "(" { CHAR ('('); }
264 ")" { CHAR (')'); }
265 "!" { CHAR ('!'); }
266 "+" { CHAR ('+'); }
267
268 [[:space:]]+ { PRINT ("space: [%s]\n", yytext); }
269
270 . {
271     printf ("unknown: %s\n", yytext);
272     return *yytext;
273 }
274
275 %%