19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef enum {
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NO_EXTRA_TEXT = 0,
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SHORT_COMMENT,
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LONG_COMMENT,
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    COPY_TEXT,
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WHITESPACE
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} which_extra_text;
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct extra_text_type {
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned lineno;
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    which_extra_text which;
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char* data;
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned len;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct extra_text_type* next;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} extra_text_type;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct buffer_type {
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned lineno;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned token;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char *data;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    extra_text_type* extra;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} buffer_type;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct type_type {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type type;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type array_token;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int dimension;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} type_type;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct arg_type {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type comma_token; // empty in the first one in the list
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type direction;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    type_type type;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type name;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct arg_type *next;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} arg_type;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    METHOD_TYPE
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct interface_item_type {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned item_type;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct interface_item_type* next;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} interface_item_type;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct method_type {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interface_item_type interface_item;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    type_type type;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool oneway;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type oneway_token;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type name;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type open_paren_token;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    arg_type* args;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type close_paren_token;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX missing comments/copy text here
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type semicolon_token;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type* comments_token; // points into this structure, DO NOT DELETE
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} method_type;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
66a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato    USER_DATA_TYPE = 12,
67fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    INTERFACE_TYPE_BINDER,
68fdfe2ff8c60c367a4eb7cecb4cbe1d62b41a8c20Joe Onorato    INTERFACE_TYPE_RPC
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct document_item_type {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned item_type;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct document_item_type* next;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} document_item_type;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato
77a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato// for user_data_type.flattening_methods
78a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onoratoenum {
79a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato    PARCELABLE_DATA = 0x1,
80a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato    RPC_DATA = 0x2
81a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato};
82a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato
83a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onoratotypedef struct user_data_type {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    document_item_type document_item;
85a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato    buffer_type keyword_token; // only the first one
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char* package;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type name;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type semicolon_token;
89a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato    int flattening_methods;
90a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato} user_data_type;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct interface_type {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    document_item_type document_item;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type interface_token;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool oneway;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type oneway_token;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char* package;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type name;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type open_brace_token;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interface_item_type* interface_items;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type close_brace_token;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type* comments_token; // points into this structure, DO NOT DELETE
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} interface_type;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef union lexer_type {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer_type buffer;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    type_type type;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    arg_type *arg;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    method_type* method;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interface_item_type* interface_item;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interface_type* interface_obj;
112a1c6d909c22e196ef62ddb065fc7821deda8a602Joe Onorato    user_data_type* user_data;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    document_item_type* document_item;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} lexer_type;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define YYSTYPE lexer_type
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if __cplusplus
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint parse_aidl(char const *);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// strips off the leading whitespace, the "import" text
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// also returns whether it's a local or system import
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// we rely on the input matching the import regex from below
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar* parse_import_statement(const char* text);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// in, out or inout
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IN_PARAMETER = 1,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OUT_PARAMETER = 2,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    INOUT_PARAMETER = 3
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint convert_direction(const char* direction);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// callbacks from within the parser
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// these functions all take ownership of the strings
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef struct ParserCallbacks {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*document)(document_item_type* items);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*import)(buffer_type* statement);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} ParserCallbacks;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern ParserCallbacks* g_callbacks;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// true if there was an error parsing, false otherwise
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int g_error;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// the name of the file we're currently parsing
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern char const* g_currentFilename;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// the package name for our current file
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern char const* g_currentPackage;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef enum {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STATEMENT_INSIDE_INTERFACE
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} error_type;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid init_buffer_type(buffer_type* buf, int lineno);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if __cplusplus
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
169