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