1 /*
2 ** C declaration parser.
3 ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4 */
5 
6 #ifndef _LJ_CPARSE_H
7 #define _LJ_CPARSE_H
8 
9 #include "lj_obj.h"
10 #include "lj_ctype.h"
11 
12 #if LJ_HASFFI
13 
14 /* C parser limits. */
15 #define CPARSE_MAX_BUF		32768	/* Max. token buffer size. */
16 #define CPARSE_MAX_DECLSTACK	100	/* Max. declaration stack depth. */
17 #define CPARSE_MAX_DECLDEPTH	20	/* Max. recursive declaration depth. */
18 #define CPARSE_MAX_PACKSTACK	7	/* Max. pack pragma stack depth. */
19 
20 /* Flags for C parser mode. */
21 #define CPARSE_MODE_MULTI	1	/* Process multiple declarations. */
22 #define CPARSE_MODE_ABSTRACT	2	/* Accept abstract declarators. */
23 #define CPARSE_MODE_DIRECT	4	/* Accept direct declarators. */
24 #define CPARSE_MODE_FIELD	8	/* Accept field width in bits, too. */
25 #define CPARSE_MODE_NOIMPLICIT	16	/* Reject implicit declarations. */
26 #define CPARSE_MODE_SKIP	32	/* Skip definitions, ignore errors. */
27 
28 typedef int CPChar;	/* C parser character. Unsigned ext. from char. */
29 typedef int CPToken;	/* C parser token. */
30 
31 /* C parser internal value representation. */
32 typedef struct CPValue {
33   union {
34     int32_t i32;	/* Value for CTID_INT32. */
35     uint32_t u32;	/* Value for CTID_UINT32. */
36   };
37   CTypeID id;		/* C Type ID of the value. */
38 } CPValue;
39 
40 /* C parser state. */
41 typedef struct CPState {
42   CPChar c;		/* Current character. */
43   CPToken tok;		/* Current token. */
44   CPValue val;		/* Token value. */
45   GCstr *str;		/* Interned string of identifier/keyword. */
46   CType *ct;		/* C type table entry. */
47   const char *p;	/* Current position in input buffer. */
48   SBuf sb;		/* String buffer for tokens. */
49   lua_State *L;		/* Lua state. */
50   CTState *cts;		/* C type state. */
51   TValue *param;	/* C type parameters. */
52   const char *srcname;	/* Current source name. */
53   BCLine linenumber;	/* Input line counter. */
54   int depth;		/* Recursive declaration depth. */
55   uint32_t tmask;	/* Type mask for next identifier. */
56   uint32_t mode;	/* C parser mode. */
57   uint8_t packstack[CPARSE_MAX_PACKSTACK];  /* Stack for pack pragmas. */
58   uint8_t curpack;	/* Current position in pack pragma stack. */
59 } CPState;
60 
61 LJ_FUNC int lj_cparse(CPState *cp);
62 
63 #endif
64 
65 #endif
66