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