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