1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%{
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "aidl_language.h"
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "aidl_language_y.h"
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "search_path.h"
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <string.h>
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdlib.h>
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern YYSTYPE yylval;
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// comment and whitespace handling
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// these functions save a copy of the buffer
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void begin_extra_text(unsigned lineno, which_extra_text which);
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void append_extra_text(char* text);
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic extra_text_type* get_extra_text(void);   // you now own the object
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                // this returns
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void drop_extra_text(void);
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// package handling
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistatic void do_package_statement(const char* importText);
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define SET_BUFFER(t) \
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    do { \
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        yylval.buffer.lineno = yylineno; \
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        yylval.buffer.token = (t); \
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        yylval.buffer.data = strdup(yytext); \
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        yylval.buffer.extra = get_extra_text(); \
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } while(0)
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%}
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%option yylineno
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%option noyywrap
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%x COPYING LONG_COMMENT
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiidentifier  [_a-zA-Z][_a-zA-Z0-9\.]*
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiwhitespace  ([ \t\n\r]+)
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskibrackets    \[{whitespace}?\]
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiidvalue     (0|[1-9][0-9]*)
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%%
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski\%\%\{              { begin_extra_text(yylineno, COPY_TEXT); BEGIN(COPYING); }
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<COPYING>\}\%\%     { BEGIN(INITIAL); }
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<COPYING>.*\n       { append_extra_text(yytext); }
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<COPYING>.*         { append_extra_text(yytext); }
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<COPYING>\n+        { append_extra_text(yytext); }
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski\/\*                            { begin_extra_text(yylineno, (which_extra_text)LONG_COMMENT);
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                  BEGIN(LONG_COMMENT); }
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<LONG_COMMENT>[^*]*             { append_extra_text(yytext); }
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<LONG_COMMENT>\*+[^/]           { append_extra_text(yytext); }
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<LONG_COMMENT>\n                { append_extra_text(yytext); }
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<LONG_COMMENT>\**\/             { BEGIN(INITIAL); }
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski^{whitespace}?import{whitespace}[^ \t\r\n]+{whitespace}?;  {
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                SET_BUFFER(IMPORT);
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                return IMPORT;
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                            }
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski^{whitespace}?package{whitespace}[^ \t\r\n]+{whitespace}?;  {
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                do_package_statement(yytext);
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                SET_BUFFER(PACKAGE);
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                return PACKAGE;
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                            }
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski<<EOF>>             { yyterminate(); }
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski\/\/.*\n            { begin_extra_text(yylineno, SHORT_COMMENT);
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        append_extra_text(yytext); }
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{whitespace}    { /* begin_extra_text(yylineno, WHITESPACE);
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    append_extra_text(yytext); */ }
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski;               { SET_BUFFER(';'); return ';'; }
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski\{              { SET_BUFFER('{'); return '{'; }
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski\}              { SET_BUFFER('}'); return '}'; }
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski\(              { SET_BUFFER('('); return '('; }
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski\)              { SET_BUFFER(')'); return ')'; }
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski,               { SET_BUFFER(','); return ','; }
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski=               { SET_BUFFER('='); return '='; }
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* keywords */
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiparcelable      { SET_BUFFER(PARCELABLE); return PARCELABLE; }
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiinterface       { SET_BUFFER(INTERFACE); return INTERFACE; }
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiflattenable     { SET_BUFFER(FLATTENABLE); return FLATTENABLE; }
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskirpc             { SET_BUFFER(INTERFACE); return RPC; }
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiin              { SET_BUFFER(IN); return IN; }
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiout             { SET_BUFFER(OUT); return OUT; }
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiinout           { SET_BUFFER(INOUT); return INOUT; }
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskioneway          { SET_BUFFER(ONEWAY); return ONEWAY; }
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{brackets}+     { SET_BUFFER(ARRAY); return ARRAY; }
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{idvalue}       { SET_BUFFER(IDVALUE); return IDVALUE; }
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{identifier}                                        { SET_BUFFER(IDENTIFIER); return IDENTIFIER; }
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{identifier}\<{whitespace}*{identifier}({whitespace}*,{whitespace}*{identifier})*{whitespace}*\>    {
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                                      SET_BUFFER(GENERIC); return GENERIC; }
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* syntax error! */
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski.               { printf("UNKNOWN(%s)", yytext);
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                  yylval.buffer.lineno = yylineno;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                  yylval.buffer.token = IDENTIFIER;
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                  yylval.buffer.data = strdup(yytext);
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                  return IDENTIFIER;
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski%%
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// comment and whitespace handling
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// ================================================
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextra_text_type* g_extraText = NULL;
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextra_text_type* g_nextExtraText = NULL;
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid begin_extra_text(unsigned lineno, which_extra_text which)
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    extra_text_type* text = (extra_text_type*)malloc(sizeof(extra_text_type));
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    text->lineno = lineno;
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    text->which = which;
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    text->data = NULL;
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    text->len = 0;
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    text->next = NULL;
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (g_nextExtraText == NULL) {
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_extraText = text;
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_nextExtraText->next = text;
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_nextExtraText = text;
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid append_extra_text(char* text)
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (g_nextExtraText->data == NULL) {
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_nextExtraText->data = strdup(text);
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_nextExtraText->len = strlen(text);
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        char* orig = g_nextExtraText->data;
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned oldLen = g_nextExtraText->len;
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned len = strlen(text);
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_nextExtraText->len += len;
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_nextExtraText->data = (char*)malloc(g_nextExtraText->len+1);
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        memcpy(g_nextExtraText->data, orig, oldLen);
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        memcpy(g_nextExtraText->data+oldLen, text, len);
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_nextExtraText->data[g_nextExtraText->len] = '\0';
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        free(orig);
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextra_text_type*
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiget_extra_text(void)
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    extra_text_type* result = g_extraText;
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_extraText = NULL;
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_nextExtraText = NULL;
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    return result;
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid drop_extra_text(void)
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    extra_text_type* p = g_extraText;
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while (p) {
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        extra_text_type* next = p->next;
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        free(p->data);
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        free(p);
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        free(next);
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_extraText = NULL;
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_nextExtraText = NULL;
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// package handling
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// ================================================
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid do_package_statement(const char* importText)
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (g_currentPackage) free((void*)g_currentPackage);
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    g_currentPackage = parse_import_statement(importText);
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// main parse function
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// ================================================
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskichar const* g_currentFilename = NULL;
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskichar const* g_currentPackage = NULL;
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint yyparse(void);
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint parse_aidl(char const *filename)
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski{
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    yyin = fopen(filename, "r");
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if (yyin) {
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        char const* oldFilename = g_currentFilename;
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        char const* oldPackage = g_currentPackage;
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_currentFilename = strdup(filename);
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_error = 0;
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        yylineno = 1;
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int rv = yyparse();
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (g_error != 0) {
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            rv = g_error;
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        free((void*)g_currentFilename);
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_currentFilename = oldFilename;
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (g_currentPackage) free((void*)g_currentPackage);
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        g_currentPackage = oldPackage;
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return rv;
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    } else {
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fprintf(stderr, "aidl: unable to open file for read: %s\n", filename);
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 1;
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
215