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
227db766c3fec2795b08d237f29b972f474983684bJoe Onorato%token FLATTENABLE
23fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato%token RPC
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token IN
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token OUT
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token INOUT
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%token ONEWAY
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%%
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument:
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        document_items                          { g_callbacks->document($1.document_item); }
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   headers document_items                  { g_callbacks->document($2.document_item); }
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectheaders:
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        package                                 { }
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   imports                                 { }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   package imports                         { }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage:
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PACKAGE                                 { }
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimports:
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IMPORT                                  { g_callbacks->import(&($1.buffer)); }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   IMPORT imports                          { g_callbacks->import(&($1.buffer)); }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument_items:
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                { $$.document_item = NULL; }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   document_items declaration              {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    if ($2.document_item == NULL) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        // error cases only
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$ = $1;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    } else {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        document_item_type* p = $1.document_item;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        while (p && p->next) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            p=p->next;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        if (p) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            p->next = (document_item_type*)$2.document_item;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            $$ = $1;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        } else {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            $$.document_item = (document_item_type*)$2.document_item;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    | document_items error                      {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    fprintf(stderr, "%s:%d: syntax error don't know what to do with \"%s\"\n", g_currentFilename,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            $2.buffer.lineno, $2.buffer.data);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    $$ = $1;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdeclaration:
77a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato        parcelable_decl                            { $$.document_item = (document_item_type*)$1.user_data; }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   interface_decl                             { $$.document_item = (document_item_type*)$1.interface_item; }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparcelable_decl:
827db766c3fec2795b08d237f29b972f474983684bJoe Onorato        PARCELABLE IDENTIFIER ';'                   {
83a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type));
84a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        b->document_item.item_type = USER_DATA_TYPE;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        b->document_item.next = NULL;
86a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        b->keyword_token = $1.buffer;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        b->name = $2.buffer;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        b->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        b->semicolon_token = $3.buffer;
90a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        b->flattening_methods = PARCELABLE_DATA;
91a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        $$.user_data = b;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   PARCELABLE ';'                              {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name.\n",
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                     g_currentFilename, $1.buffer.lineno);
96a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        $$.user_data = NULL;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   PARCELABLE error ';'                        {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        fprintf(stderr, "%s:%d syntax error in parcelable declaration. Expected type name, saw \"%s\".\n",
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                     g_currentFilename, $2.buffer.lineno, $2.buffer.data);
101a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        $$.user_data = NULL;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
1037db766c3fec2795b08d237f29b972f474983684bJoe Onorato    |   FLATTENABLE IDENTIFIER ';'                  {
104a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        user_data_type* b = (user_data_type*)malloc(sizeof(user_data_type));
105a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        b->document_item.item_type = USER_DATA_TYPE;
1067db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                        b->document_item.next = NULL;
107a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        b->keyword_token = $1.buffer;
1087db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                        b->name = $2.buffer;
1097db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                        b->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
1107db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                        b->semicolon_token = $3.buffer;
111a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        b->flattening_methods = PARCELABLE_DATA | RPC_DATA;
112a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        $$.user_data = b;
1137db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                    }
1147db766c3fec2795b08d237f29b972f474983684bJoe Onorato    |   FLATTENABLE ';'                             {
1157db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                        fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name.\n",
1167db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                                     g_currentFilename, $1.buffer.lineno);
117a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        $$.user_data = NULL;
1187db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                    }
1197db766c3fec2795b08d237f29b972f474983684bJoe Onorato    |   FLATTENABLE error ';'                       {
1207db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                        fprintf(stderr, "%s:%d syntax error in flattenable declaration. Expected type name, saw \"%s\".\n",
1217db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                                     g_currentFilename, $2.buffer.lineno, $2.buffer.data);
122a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato                                                        $$.user_data = NULL;
1237db766c3fec2795b08d237f29b972f474983684bJoe Onorato                                                    }
1247db766c3fec2795b08d237f29b972f474983684bJoe Onorato
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_header:
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        INTERFACE                                  {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        interface_type* c = (interface_type*)malloc(sizeof(interface_type));
130fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->document_item.item_type = INTERFACE_TYPE_BINDER;
131fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->document_item.next = NULL;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->interface_token = $1.buffer;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->oneway = false;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        memset(&c->oneway_token, 0, sizeof(buffer_type));
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->comments_token = &c->interface_token;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$.interface_obj = c;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   ONEWAY INTERFACE                           {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        interface_type* c = (interface_type*)malloc(sizeof(interface_type));
140fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->document_item.item_type = INTERFACE_TYPE_BINDER;
141fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->document_item.next = NULL;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->interface_token = $2.buffer;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->oneway = true;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->oneway_token = $1.buffer;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->comments_token = &c->oneway_token;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$.interface_obj = c;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   }
148fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    |   RPC                                        {
149fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        interface_type* c = (interface_type*)malloc(sizeof(interface_type));
150fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->document_item.item_type = INTERFACE_TYPE_RPC;
151fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->document_item.next = NULL;
152fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->interface_token = $1.buffer;
153fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->oneway = false;
154fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        memset(&c->oneway_token, 0, sizeof(buffer_type));
155fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        c->comments_token = &c->interface_token;
156fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                        $$.interface_obj = c;
157fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato                                                   }
158fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    ;
159fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato
160fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onoratointerface_keywords:
161fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato        INTERFACE
162fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    |   RPC
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_decl:
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        interface_header IDENTIFIER '{' interface_items '}' {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        interface_type* c = $1.interface_obj;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->name = $2.buffer;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->package = g_currentPackage ? strdup(g_currentPackage) : NULL;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->open_brace_token = $3.buffer;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->interface_items = $4.interface_item;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        c->close_brace_token = $5.buffer;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$.interface_obj = c;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
175fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    |   interface_keywords error '{' interface_items '}'     {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        fprintf(stderr, "%s:%d: syntax error in interface declaration.  Expected type name, saw \"%s\"\n",
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                    g_currentFilename, $2.buffer.lineno, $2.buffer.data);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$.document_item = NULL;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
180fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    |   interface_keywords error '}'                {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        fprintf(stderr, "%s:%d: syntax error in interface declaration.  Expected type name, saw \"%s\"\n",
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                    g_currentFilename, $2.buffer.lineno, $2.buffer.data);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$.document_item = NULL;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface_items:
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    { $$.interface_item = NULL; }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   interface_items method_decl                 {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        interface_item_type* p=$1.interface_item;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        while (p && p->next) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            p=p->next;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        if (p) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            p->next = (interface_item_type*)$2.method;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            $$ = $1;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        } else {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            $$.interface_item = (interface_item_type*)$2.method;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   interface_items error ';'                   {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        fprintf(stderr, "%s:%d: syntax error before ';' (expected method declaration)\n",
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                    g_currentFilename, $3.buffer.lineno);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$ = $1;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmethod_decl:
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type IDENTIFIER '(' arg_list ')' ';'  {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method_type *method = (method_type*)malloc(sizeof(method_type));
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->interface_item.item_type = METHOD_TYPE;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->interface_item.next = NULL;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->type = $1.type;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->oneway = false;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        memset(&method->oneway_token, 0, sizeof(buffer_type));
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->name = $2.buffer;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->open_paren_token = $3.buffer;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->args = $4.arg;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->close_paren_token = $5.buffer;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->semicolon_token = $6.buffer;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->comments_token = &method->type.type;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$.method = method;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   ONEWAY type IDENTIFIER '(' arg_list ')' ';'  {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method_type *method = (method_type*)malloc(sizeof(method_type));
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->interface_item.item_type = METHOD_TYPE;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->interface_item.next = NULL;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->oneway = true;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->oneway_token = $1.buffer;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->type = $2.type;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->name = $3.buffer;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->open_paren_token = $4.buffer;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->args = $5.arg;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->close_paren_token = $6.buffer;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->semicolon_token = $7.buffer;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        method->comments_token = &method->oneway_token;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        $$.method = method;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectarg_list:
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                { $$.arg = NULL; }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   arg                     { $$ = $1; }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   arg_list ',' arg        {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    if ($$.arg != NULL) {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        // only NULL on error
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        $$ = $1;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        arg_type *p = $1.arg;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        while (p && p->next) {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            p=p->next;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        $3.arg->comma_token = $2.buffer;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        p->next = $3.arg;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   error                   {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    fprintf(stderr, "%s:%d: syntax error in parameter list\n", g_currentFilename, $1.buffer.lineno);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.arg = NULL;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectarg:
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        direction type IDENTIFIER     {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                arg_type* arg = (arg_type*)malloc(sizeof(arg_type));
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                memset(&arg->comma_token, 0, sizeof(buffer_type));
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                arg->direction = $1.buffer;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                arg->type = $2.type;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                arg->name = $3.buffer;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                arg->next = NULL;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                $$.arg = arg;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttype:
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IDENTIFIER              {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.type.type = $1.buffer;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    init_buffer_type(&$$.type.array_token, yylineno);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.type.dimension = 0;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   IDENTIFIER ARRAY        {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.type.type = $1.buffer;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.type.array_token = $2.buffer;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.type.dimension = count_brackets($2.buffer.data);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   GENERIC                 {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.type.type = $1.buffer;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    init_buffer_type(&$$.type.array_token, yylineno);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    $$.type.dimension = 0;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdirection:
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    { init_buffer_type(&$$.buffer, yylineno); }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   IN          { $$.buffer = $1.buffer; }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   OUT         { $$.buffer = $1.buffer; }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    |   INOUT       { $$.buffer = $1.buffer; }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project%%
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ctype.h>
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint g_error = 0;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint yyerror(char* errstr)
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fprintf(stderr, "%s:%d: %s\n", g_currentFilename, yylineno, errstr);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    g_error = 1;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 1;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid init_buffer_type(buffer_type* buf, int lineno)
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buf->lineno = lineno;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buf->token = 0;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buf->data = NULL;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buf->extra = NULL;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int count_brackets(const char* s)
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int n=0;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*s) {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (*s == '[') n++;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s++;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return n;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
331