1#ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H 2#define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H 3 4 5typedef enum { 6 NO_EXTRA_TEXT = 0, 7 SHORT_COMMENT, 8 LONG_COMMENT, 9 COPY_TEXT, 10 WHITESPACE 11} which_extra_text; 12 13typedef 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 21typedef struct buffer_type { 22 unsigned lineno; 23 unsigned token; 24 char *data; 25 extra_text_type* extra; 26} buffer_type; 27 28typedef struct type_type { 29 buffer_type type; 30 buffer_type array_token; 31 int dimension; 32} type_type; 33 34typedef 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 42enum { 43 METHOD_TYPE 44}; 45 46typedef struct interface_item_type { 47 unsigned item_type; 48 struct interface_item_type* next; 49} interface_item_type; 50 51typedef 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 69enum { 70 USER_DATA_TYPE = 12, 71 INTERFACE_TYPE_BINDER, 72 INTERFACE_TYPE_RPC 73}; 74 75typedef 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 82enum { 83 PARCELABLE_DATA = 0x1, 84 RPC_DATA = 0x2 85}; 86 87typedef 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 96typedef 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 109typedef 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 124extern "C" { 125#endif 126 127int 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 132char* parse_import_statement(const char* text); 133 134// in, out or inout 135enum { 136 IN_PARAMETER = 1, 137 OUT_PARAMETER = 2, 138 INOUT_PARAMETER = 3 139}; 140int convert_direction(const char* direction); 141 142// callbacks from within the parser 143// these functions all take ownership of the strings 144typedef struct ParserCallbacks { 145 void (*document)(document_item_type* items); 146 void (*import)(buffer_type* statement); 147} ParserCallbacks; 148 149extern ParserCallbacks* g_callbacks; 150 151// true if there was an error parsing, false otherwise 152extern int g_error; 153 154// the name of the file we're currently parsing 155extern char const* g_currentFilename; 156 157// the package name for our current file 158extern char const* g_currentPackage; 159 160typedef enum { 161 STATEMENT_INSIDE_INTERFACE 162} error_type; 163 164void 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