Support glib-mkenums comment /*< flags >*/
[platform/upstream/gobject-introspection.git] / giscanner / sourcescanner.h
1 /* GObject introspection: public scanner api
2  *
3  * Copyright (C) 2007 Jürg Billeter
4  * Copyright (C) 2008 Johan Dahlin
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22
23 #ifndef __SOURCE_SCANNER_H__
24 #define __SOURCE_SCANNER_H__
25
26 #include <glib.h>
27 #include <stdio.h>
28
29 G_BEGIN_DECLS
30
31 typedef struct _GISourceComment GISourceComment;
32 typedef struct _GISourceScanner GISourceScanner;
33 typedef struct _GISourceSymbol GISourceSymbol;
34 typedef struct _GISourceType GISourceType;
35
36 typedef enum
37 {
38   CSYMBOL_TYPE_INVALID,
39   CSYMBOL_TYPE_ELLIPSIS,
40   CSYMBOL_TYPE_CONST,
41   CSYMBOL_TYPE_OBJECT,
42   CSYMBOL_TYPE_FUNCTION,
43   CSYMBOL_TYPE_STRUCT,
44   CSYMBOL_TYPE_UNION,
45   CSYMBOL_TYPE_ENUM,
46   CSYMBOL_TYPE_TYPEDEF,
47   CSYMBOL_TYPE_MEMBER
48 } GISourceSymbolType;
49
50 typedef enum
51 {
52   CTYPE_INVALID,
53   CTYPE_VOID,
54   CTYPE_BASIC_TYPE,
55   CTYPE_TYPEDEF,
56   CTYPE_STRUCT,
57   CTYPE_UNION,
58   CTYPE_ENUM,
59   CTYPE_POINTER,
60   CTYPE_ARRAY,
61   CTYPE_FUNCTION
62 } GISourceTypeType;
63
64 typedef enum
65 {
66   STORAGE_CLASS_NONE = 0,
67   STORAGE_CLASS_TYPEDEF = 1 << 1,
68   STORAGE_CLASS_EXTERN = 1 << 2,
69   STORAGE_CLASS_STATIC = 1 << 3,
70   STORAGE_CLASS_AUTO = 1 << 4,
71   STORAGE_CLASS_REGISTER = 1 << 5
72 } StorageClassSpecifier;
73
74 typedef enum
75 {
76   TYPE_QUALIFIER_NONE = 0,
77   TYPE_QUALIFIER_CONST = 1 << 1,
78   TYPE_QUALIFIER_RESTRICT = 1 << 2,
79   TYPE_QUALIFIER_VOLATILE = 1 << 3,
80   TYPE_QUALIFIER_EXTENSION = 1 << 4
81 } TypeQualifier;
82
83 typedef enum
84 {
85   FUNCTION_NONE = 0,
86   FUNCTION_INLINE = 1 << 1
87 } FunctionSpecifier;
88
89 typedef enum
90 {
91   UNARY_ADDRESS_OF,
92   UNARY_POINTER_INDIRECTION,
93   UNARY_PLUS,
94   UNARY_MINUS,
95   UNARY_BITWISE_COMPLEMENT,
96   UNARY_LOGICAL_NEGATION
97 } UnaryOperator;
98
99 struct _GISourceComment
100 {
101   char *comment;
102   char *filename;
103   int line;
104 };
105
106 struct _GISourceScanner
107 {
108   char *current_filename;
109   gboolean macro_scan;
110   gboolean private; /* set by gtk-doc comment <private>/<public> */
111   gboolean flags; /* set by gtk-doc comment <flags> */
112   GSList *symbols;
113   GList *filenames;
114   GSList *comments; /* _GIComment */
115   GHashTable *typedef_table;
116   GHashTable *struct_or_union_or_enum_table;
117 };
118
119 struct _GISourceSymbol
120 {
121   int ref_count;
122   GISourceSymbolType type;
123   int id;
124   char *ident;
125   GISourceType *base_type;
126   gboolean const_int_set;
127   gboolean private;
128   gint64 const_int; /* 64-bit we can handle signed and unsigned 32-bit values */
129   char *const_string;
130   gboolean const_double_set;
131   double const_double;
132   char *source_filename;
133   int line;
134 };
135
136 struct _GISourceType
137 {
138   GISourceTypeType type;
139   StorageClassSpecifier storage_class_specifier;
140   TypeQualifier type_qualifier;
141   FunctionSpecifier function_specifier;
142   char *name;
143   GISourceType *base_type;
144   GList *child_list; /* list of GISourceSymbol */
145   gboolean is_bitfield;
146 };
147
148 GISourceScanner *   gi_source_scanner_new              (void);
149 gboolean            gi_source_scanner_lex_filename     (GISourceScanner  *igenerator,
150                                                         const gchar      *filename);
151 gboolean            gi_source_scanner_parse_file       (GISourceScanner  *igenerator,
152                                                         FILE             *file);
153 void                gi_source_scanner_parse_macros     (GISourceScanner  *scanner,
154                                                         GList            *filenames);
155 void                gi_source_scanner_set_macro_scan   (GISourceScanner  *scanner,
156                                                         gboolean          macro_scan);
157 GSList *            gi_source_scanner_get_symbols      (GISourceScanner  *scanner);
158 GSList *            gi_source_scanner_get_comments     (GISourceScanner  *scanner);
159 void                gi_source_scanner_free             (GISourceScanner  *scanner);
160
161 GISourceSymbol *    gi_source_symbol_new               (GISourceSymbolType  type, int line);
162 gboolean            gi_source_symbol_get_const_boolean (GISourceSymbol     *symbol);
163 GISourceSymbol *    gi_source_symbol_ref               (GISourceSymbol     *symbol);
164 void                gi_source_symbol_unref             (GISourceSymbol     *symbol);
165
166 /* Private */
167 void                gi_source_scanner_add_symbol       (GISourceScanner  *scanner,
168                                                         GISourceSymbol   *symbol);
169 gboolean            gi_source_scanner_is_typedef       (GISourceScanner  *scanner,
170                                                         const char       *name);
171 void                gi_source_symbol_merge_type        (GISourceSymbol   *symbol,
172                                                         GISourceType     *type);
173 GISourceType *      gi_source_type_new                 (GISourceTypeType  type);
174 GISourceType *      gi_source_type_copy                (GISourceType     *type);
175 GISourceType *      gi_source_basic_type_new           (const char       *name);
176 GISourceType *      gi_source_typedef_new              (const char       *name);
177 GISourceType *      gi_source_struct_new               (const char       *name);
178 GISourceType *      gi_source_union_new                (const char       *name);
179 GISourceType *      gi_source_enum_new                 (const char       *name);
180 GISourceType *      gi_source_pointer_new              (GISourceType     *base_type);
181 GISourceType *      gi_source_array_new                (GISourceSymbol   *size);
182 GISourceType *      gi_source_function_new             (void);
183
184 void ctype_free (GISourceType * type);
185
186 G_END_DECLS
187
188 #endif /* __SOURCE_SCANNER_H__ */