• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     // XXX missing comments/copy text here
61     buffer_type semicolon_token;
62     buffer_type* comments_token; // points into this structure, DO NOT DELETE
63 } method_type;
64 
65 enum {
66     USER_DATA_TYPE = 12,
67     INTERFACE_TYPE_BINDER,
68     INTERFACE_TYPE_RPC
69 };
70 
71 typedef struct document_item_type {
72     unsigned item_type;
73     struct document_item_type* next;
74 } document_item_type;
75 
76 
77 // for user_data_type.flattening_methods
78 enum {
79     PARCELABLE_DATA = 0x1,
80     RPC_DATA = 0x2
81 };
82 
83 typedef struct user_data_type {
84     document_item_type document_item;
85     buffer_type keyword_token; // only the first one
86     char* package;
87     buffer_type name;
88     buffer_type semicolon_token;
89     int flattening_methods;
90 } user_data_type;
91 
92 typedef struct interface_type {
93     document_item_type document_item;
94     buffer_type interface_token;
95     bool oneway;
96     buffer_type oneway_token;
97     char* package;
98     buffer_type name;
99     buffer_type open_brace_token;
100     interface_item_type* interface_items;
101     buffer_type close_brace_token;
102     buffer_type* comments_token; // points into this structure, DO NOT DELETE
103 } interface_type;
104 
105 typedef union lexer_type {
106     buffer_type buffer;
107     type_type type;
108     arg_type *arg;
109     method_type* method;
110     interface_item_type* interface_item;
111     interface_type* interface_obj;
112     user_data_type* user_data;
113     document_item_type* document_item;
114 } lexer_type;
115 
116 
117 #define YYSTYPE lexer_type
118 
119 #if __cplusplus
120 extern "C" {
121 #endif
122 
123 int parse_aidl(char const *);
124 
125 // strips off the leading whitespace, the "import" text
126 // also returns whether it's a local or system import
127 // we rely on the input matching the import regex from below
128 char* parse_import_statement(const char* text);
129 
130 // in, out or inout
131 enum {
132     IN_PARAMETER = 1,
133     OUT_PARAMETER = 2,
134     INOUT_PARAMETER = 3
135 };
136 int convert_direction(const char* direction);
137 
138 // callbacks from within the parser
139 // these functions all take ownership of the strings
140 typedef struct ParserCallbacks {
141     void (*document)(document_item_type* items);
142     void (*import)(buffer_type* statement);
143 } ParserCallbacks;
144 
145 extern ParserCallbacks* g_callbacks;
146 
147 // true if there was an error parsing, false otherwise
148 extern int g_error;
149 
150 // the name of the file we're currently parsing
151 extern char const* g_currentFilename;
152 
153 // the package name for our current file
154 extern char const* g_currentPackage;
155 
156 typedef enum {
157     STATEMENT_INSIDE_INTERFACE
158 } error_type;
159 
160 void init_buffer_type(buffer_type* buf, int lineno);
161 
162 
163 #if __cplusplus
164 }
165 #endif
166 
167 
168 #endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
169