]> git.draconx.ca Git - cdecl99.git/blob - src/cdecl.h
Add an initial declaration parser.
[cdecl99.git] / src / cdecl.h
1 #ifndef CDECL_H_
2 #define CEDCL_H_
3
4 /* Declaration specifier kinds. */
5 enum {
6         CDECL_SPEC_TYPE = 0,
7         CDECL_SPEC_STOR = 256,
8         CDECL_SPEC_QUAL = 512,
9         CDECL_SPEC_FUNC = 1024,
10 };
11
12 enum {
13         CDECL_TYPE_VOID = CDECL_SPEC_TYPE,
14         CDECL_TYPE_CHAR,
15         CDECL_TYPE_SHORT,
16         CDECL_TYPE_INT,
17         CDECL_TYPE_LONG,
18         CDECL_TYPE_FLOAT,
19         CDECL_TYPE_DOUBLE,
20         CDECL_TYPE_SIGNED,
21         CDECL_TYPE_UNSIGNED,
22         CDECL_TYPE_BOOL,
23         CDECL_TYPE_COMPLEX,
24         CDECL_TYPE_STRUCT,
25         CDECL_TYPE_UNION,
26         CDECL_TYPE_ENUM,
27         CDECL_TYPE_IDENT,
28         CDECL_STOR_TYPEDEF = CDECL_SPEC_STOR,
29         CDECL_STOR_EXTERN,
30         CDECL_STOR_STATIC,
31         CDECL_STOR_AUTO,
32         CDECL_STOR_REGISTER,
33         CDECL_QUAL_RESTRICT = CDECL_SPEC_QUAL,
34         CDECL_QUAL_VOLATILE,
35         CDECL_QUAL_CONST,
36         CDECL_FUNC_INLINE = CDECL_SPEC_FUNC,
37 };
38
39 /* Declarator types. */
40 enum {
41         CDECL_DECL_IDENT,
42 };
43
44 struct cdecl {
45         struct cdecl_declspec {
46                 struct cdecl_declspec *next;
47                 unsigned type;
48                 char *ident;
49         } *specifiers;
50
51         struct cdecl_declarator {
52                 struct cdecl_declarator *next;
53                 unsigned type;
54                 char *ident;
55         } *declarators;
56 };
57
58 struct cdecl *cdecl_parse_decl(const char *declstr);
59 void cdecl_free(struct cdecl *decl);
60
61 static inline int cdecl_spec_kind(struct cdecl_declspec *spec)
62 {
63         return spec->type & ~0xffu;
64 }
65
66 #endif