1 #ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
2 #define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
3 
4 
5 typedef enum {
6     NO_EXTRA_TEXT = 0,
7     SHORT_COMMENT,
8     LONG_COMMENT,
9     COPY_TEXT,
10     WHITESPACE
11 } which_extra_text;
12 
13 typedef struct extra_text_type {
14     unsigned lineno;
15     which_extra_text which;
16     char* data;
17     unsigned len;
18     struct extra_text_type* next;
19 } extra_text_type;
20 
21 typedef struct buffer_type {
22     unsigned lineno;
23     unsigned token;
24     char *data;
25     extra_text_type* extra;
26 } buffer_type;
27 
28 typedef struct type_type {
29     buffer_type type;
30     buffer_type array_token;
31     int dimension;
32 } type_type;
33 
34 typedef struct arg_type {
35     buffer_type comma_token; // empty in the first one in the list
36     buffer_type direction;
37     type_type type;
38     buffer_type name;
39     struct arg_type *next;
40 } arg_type;
41 
42 enum {
43     METHOD_TYPE
44 };
45 
46 typedef struct interface_item_type {
47     unsigned item_type;
48     struct interface_item_type* next;
49 } interface_item_type;
50 
51 typedef struct method_type {
52     interface_item_type interface_item;
53     type_type type;
54     bool oneway;
55     buffer_type oneway_token;
56     buffer_type name;
57     buffer_type open_paren_token;
58     arg_type* args;
59     buffer_type close_paren_token;
60     bool hasId;
61     buffer_type equals_token;
62     buffer_type id;
63     // XXX missing comments/copy text here
64     buffer_type semicolon_token;
65     buffer_type* comments_token; // points into this structure, DO NOT DELETE
66     int assigned_id;
67 } method_type;
68 
69 enum {
70     USER_DATA_TYPE = 12,
71     INTERFACE_TYPE_BINDER,
72     INTERFACE_TYPE_RPC
73 };
74 
75 typedef struct document_item_type {
76     unsigned item_type;
77     struct document_item_type* next;
78 } document_item_type;
79 
80 
81 // for user_data_type.flattening_methods
82 enum {
83     PARCELABLE_DATA = 0x1,
84     RPC_DATA = 0x2
85 };
86 
87 typedef struct user_data_type {
88     document_item_type document_item;
89     buffer_type keyword_token; // only the first one
90     char* package;
91     buffer_type name;
92     buffer_type semicolon_token;
93     int flattening_methods;
94 } user_data_type;
95 
96 typedef struct interface_type {
97     document_item_type document_item;
98     buffer_type interface_token;
99     bool oneway;
100     buffer_type oneway_token;
101     char* package;
102     buffer_type name;
103     buffer_type open_brace_token;
104     interface_item_type* interface_items;
105     buffer_type close_brace_token;
106     buffer_type* comments_token; // points into this structure, DO NOT DELETE
107 } interface_type;
108 
109 typedef union lexer_type {
110     buffer_type buffer;
111     type_type type;
112     arg_type *arg;
113     method_type* method;
114     interface_item_type* interface_item;
115     interface_type* interface_obj;
116     user_data_type* user_data;
117     document_item_type* document_item;
118 } lexer_type;
119 
120 
121 #define YYSTYPE lexer_type
122 
123 #if __cplusplus
124 extern "C" {
125 #endif
126 
127 int parse_aidl(char const *);
128 
129 // strips off the leading whitespace, the "import" text
130 // also returns whether it's a local or system import
131 // we rely on the input matching the import regex from below
132 char* parse_import_statement(const char* text);
133 
134 // in, out or inout
135 enum {
136     IN_PARAMETER = 1,
137     OUT_PARAMETER = 2,
138     INOUT_PARAMETER = 3
139 };
140 int convert_direction(const char* direction);
141 
142 // callbacks from within the parser
143 // these functions all take ownership of the strings
144 typedef struct ParserCallbacks {
145     void (*document)(document_item_type* items);
146     void (*import)(buffer_type* statement);
147 } ParserCallbacks;
148 
149 extern ParserCallbacks* g_callbacks;
150 
151 // true if there was an error parsing, false otherwise
152 extern int g_error;
153 
154 // the name of the file we're currently parsing
155 extern char const* g_currentFilename;
156 
157 // the package name for our current file
158 extern char const* g_currentPackage;
159 
160 typedef enum {
161     STATEMENT_INSIDE_INTERFACE
162 } error_type;
163 
164 void init_buffer_type(buffer_type* buf, int lineno);
165 
166 
167 #if __cplusplus
168 }
169 #endif
170 
171 
172 #endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
173