1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef enum {
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    NO_EXTRA_TEXT = 0,
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SHORT_COMMENT,
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    LONG_COMMENT,
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    COPY_TEXT,
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    WHITESPACE
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} which_extra_text;
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct extra_text_type {
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unsigned lineno;
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    which_extra_text which;
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char* data;
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unsigned len;
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    struct extra_text_type* next;
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} extra_text_type;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct buffer_type {
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unsigned lineno;
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unsigned token;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char *data;
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    extra_text_type* extra;
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} buffer_type;
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct type_type {
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type type;
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type array_token;
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int dimension;
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} type_type;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct arg_type {
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type comma_token; // empty in the first one in the list
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type direction;
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    type_type type;
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type name;
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    struct arg_type *next;
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} arg_type;
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum {
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    METHOD_TYPE
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct interface_item_type {
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unsigned item_type;
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    struct interface_item_type* next;
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} interface_item_type;
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct method_type {
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    interface_item_type interface_item;
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    type_type type;
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool oneway;
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type oneway_token;
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type name;
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type open_paren_token;
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    arg_type* args;
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type close_paren_token;
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool hasId;
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type equals_token;
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type id;
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // XXX missing comments/copy text here
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type semicolon_token;
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type* comments_token; // points into this structure, DO NOT DELETE
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int assigned_id;
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} method_type;
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum {
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    USER_DATA_TYPE = 12,
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    INTERFACE_TYPE_BINDER,
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    INTERFACE_TYPE_RPC
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct document_item_type {
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unsigned item_type;
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    struct document_item_type* next;
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} document_item_type;
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// for user_data_type.flattening_methods
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum {
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    PARCELABLE_DATA = 0x1,
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    RPC_DATA = 0x2
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct user_data_type {
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    document_item_type document_item;
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type keyword_token; // only the first one
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char* package;
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type name;
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type semicolon_token;
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int flattening_methods;
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} user_data_type;
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct interface_type {
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    document_item_type document_item;
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type interface_token;
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool oneway;
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type oneway_token;
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    char* package;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type name;
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type open_brace_token;
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    interface_item_type* interface_items;
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type close_brace_token;
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type* comments_token; // points into this structure, DO NOT DELETE
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} interface_type;
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef union lexer_type {
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    buffer_type buffer;
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    type_type type;
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    arg_type *arg;
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    method_type* method;
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    interface_item_type* interface_item;
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    interface_type* interface_obj;
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    user_data_type* user_data;
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    document_item_type* document_item;
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} lexer_type;
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define YYSTYPE lexer_type
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if __cplusplus
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern "C" {
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint parse_aidl(char const *);
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// strips off the leading whitespace, the "import" text
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// also returns whether it's a local or system import
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// we rely on the input matching the import regex from below
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskichar* parse_import_statement(const char* text);
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// in, out or inout
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskienum {
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    IN_PARAMETER = 1,
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    OUT_PARAMETER = 2,
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    INOUT_PARAMETER = 3
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiint convert_direction(const char* direction);
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// callbacks from within the parser
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// these functions all take ownership of the strings
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef struct ParserCallbacks {
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void (*document)(document_item_type* items);
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void (*import)(buffer_type* statement);
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} ParserCallbacks;
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern ParserCallbacks* g_callbacks;
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// true if there was an error parsing, false otherwise
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern int g_error;
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// the name of the file we're currently parsing
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern char const* g_currentFilename;
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// the package name for our current file
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiextern char const* g_currentPackage;
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitypedef enum {
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    STATEMENT_INSIDE_INTERFACE
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} error_type;
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskivoid init_buffer_type(buffer_type* buf, int lineno);
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#if __cplusplus
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
173