19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%{ 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "aidl_language.h" 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint yyerror(char* errstr); 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint yylex(void); 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int yylineno; 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int count_brackets(const char*); 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%} 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token IMPORT 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token PACKAGE 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token IDENTIFIER 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token GENERIC 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token ARRAY 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token PARCELABLE 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token INTERFACE 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token IN 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token OUT 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token INOUT 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token ONEWAY 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%% 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument: 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_items { g_callbacks->document($1.document_item); } 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | headers document_items { g_callbacks->document($2.document_item); } 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectheaders: 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project package { } 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | imports { } 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | package imports { } 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage: 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PACKAGE { } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimports: 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IMPORT { g_callbacks->import(&($1.buffer)); } 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | IMPORT imports { g_callbacks->import(&($1.buffer)); } 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument_items: 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { $$.document_item = NULL; } 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | document_items declaration { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ($2.document_item == NULL) { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // error cases only 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project document_item_type* p = $1.document_item; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p && p->next) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p=p->next; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->next = (document_item_type*)$2.document_item; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.document_item = (document_item_type*)$2.document_item; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | document_items error { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error don't know what to do with \"%s\"\n", g_currentFilename, 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $2.buffer.lineno, $2.buffer.data); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdeclaration: 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcelable_decl { $$.document_item = (document_item_type*)$1.parcelable; } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | interface_decl { $$.document_item = (document_item_type*)$1.interface_item; } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparcelable_decl: 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PARCELABLE IDENTIFIER ';' { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcelable_type* b = (parcelable_type*)malloc(sizeof(parcelable_type)); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->document_item.item_type = PARCELABLE_TYPE; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->document_item.next = NULL; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->parcelable_token = $1.buffer; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->name = $2.buffer; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->package = g_currentPackage ? strdup(g_currentPackage) : NULL; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->semicolon_token = $3.buffer; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.parcelable = b; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | PARCELABLE ';' { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name.\n", 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $1.buffer.lineno); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.parcelable = NULL; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | PARCELABLE error ';' { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name, saw \"%s\".\n", 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $2.buffer.lineno, $2.buffer.data); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.parcelable = NULL; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_header: 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INTERFACE { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)malloc(sizeof(interface_type)); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->interface_token = $1.buffer; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->oneway = false; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&c->oneway_token, 0, sizeof(buffer_type)); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->comments_token = &c->interface_token; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_obj = c; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ONEWAY INTERFACE { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = (interface_type*)malloc(sizeof(interface_type)); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->interface_token = $2.buffer; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->oneway = true; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->oneway_token = $1.buffer; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->comments_token = &c->oneway_token; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_obj = c; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_decl: 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_header IDENTIFIER '{' interface_items '}' { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_type* c = $1.interface_obj; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->document_item.item_type = INTERFACE_TYPE; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->document_item.next = NULL; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->name = $2.buffer; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->package = g_currentPackage ? strdup(g_currentPackage) : NULL; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->open_brace_token = $3.buffer; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->interface_items = $4.interface_item; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->close_brace_token = $5.buffer; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_obj = c; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | INTERFACE error '{' interface_items '}' { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n", 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $2.buffer.lineno, $2.buffer.data); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.document_item = NULL; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | INTERFACE error '}' { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error in interface declaration. Expected type name, saw \"%s\"\n", 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $2.buffer.lineno, $2.buffer.data); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.document_item = NULL; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_items: 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { $$.interface_item = NULL; } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | interface_items method_decl { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interface_item_type* p=$1.interface_item; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p && p->next) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p=p->next; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->next = (interface_item_type*)$2.method; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.interface_item = (interface_item_type*)$2.method; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | interface_items error ';' { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error before ';' (expected method declaration)\n", 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_currentFilename, $3.buffer.lineno); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmethod_decl: 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type IDENTIFIER '(' arg_list ')' ';' { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type *method = (method_type*)malloc(sizeof(method_type)); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.item_type = METHOD_TYPE; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.next = NULL; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->type = $1.type; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->oneway = false; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&method->oneway_token, 0, sizeof(buffer_type)); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->name = $2.buffer; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->open_paren_token = $3.buffer; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->args = $4.arg; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->close_paren_token = $5.buffer; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->semicolon_token = $6.buffer; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->comments_token = &method->type.type; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.method = method; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ONEWAY type IDENTIFIER '(' arg_list ')' ';' { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_type *method = (method_type*)malloc(sizeof(method_type)); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.item_type = METHOD_TYPE; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->interface_item.next = NULL; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->oneway = true; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->oneway_token = $1.buffer; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->type = $2.type; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->name = $3.buffer; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->open_paren_token = $4.buffer; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->args = $5.arg; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->close_paren_token = $6.buffer; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->semicolon_token = $7.buffer; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method->comments_token = &method->oneway_token; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.method = method; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectarg_list: 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { $$.arg = NULL; } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | arg { $$ = $1; } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | arg_list ',' arg { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ($$.arg != NULL) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // only NULL on error 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$ = $1; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg_type *p = $1.arg; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (p && p->next) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p=p->next; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $3.arg->comma_token = $2.buffer; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->next = $3.arg; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | error { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: syntax error in parameter list\n", g_currentFilename, $1.buffer.lineno); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.arg = NULL; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectarg: 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project direction type IDENTIFIER { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg_type* arg = (arg_type*)malloc(sizeof(arg_type)); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&arg->comma_token, 0, sizeof(buffer_type)); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->direction = $1.buffer; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->type = $2.type; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->name = $3.buffer; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg->next = NULL; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.arg = arg; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttype: 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IDENTIFIER { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.type = $1.buffer; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init_buffer_type(&$$.type.array_token, yylineno); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.dimension = 0; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | IDENTIFIER ARRAY { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.type = $1.buffer; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.array_token = $2.buffer; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.dimension = count_brackets($2.buffer.data); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | GENERIC { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.type = $1.buffer; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init_buffer_type(&$$.type.array_token, yylineno); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project $$.type.dimension = 0; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdirection: 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { init_buffer_type(&$$.buffer, yylineno); } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | IN { $$.buffer = $1.buffer; } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | OUT { $$.buffer = $1.buffer; } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | INOUT { $$.buffer = $1.buffer; } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%% 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ctype.h> 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint g_error = 0; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint yyerror(char* errstr) 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fprintf(stderr, "%s:%d: %s\n", g_currentFilename, yylineno, errstr); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g_error = 1; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid init_buffer_type(buffer_type* buf, int lineno) 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->lineno = lineno; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->token = 0; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->data = NULL; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf->extra = NULL; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int count_brackets(const char* s) 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n=0; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*s) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*s == '[') n++; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s++; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return n; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 289