2014-04-28 04:45:14 +02:00
|
|
|
/*
|
|
|
|
** C declaration parser.
|
2019-09-15 00:33:59 +02:00
|
|
|
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
2014-04-28 04:45:14 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _LJ_CPARSE_H
|
|
|
|
#define _LJ_CPARSE_H
|
|
|
|
|
|
|
|
#include "lj_obj.h"
|
|
|
|
#include "lj_ctype.h"
|
|
|
|
|
|
|
|
#if LJ_HASFFI
|
|
|
|
|
|
|
|
/* C parser limits. */
|
|
|
|
#define CPARSE_MAX_BUF 32768 /* Max. token buffer size. */
|
|
|
|
#define CPARSE_MAX_DECLSTACK 100 /* Max. declaration stack depth. */
|
|
|
|
#define CPARSE_MAX_DECLDEPTH 20 /* Max. recursive declaration depth. */
|
|
|
|
#define CPARSE_MAX_PACKSTACK 7 /* Max. pack pragma stack depth. */
|
|
|
|
|
|
|
|
/* Flags for C parser mode. */
|
|
|
|
#define CPARSE_MODE_MULTI 1 /* Process multiple declarations. */
|
|
|
|
#define CPARSE_MODE_ABSTRACT 2 /* Accept abstract declarators. */
|
|
|
|
#define CPARSE_MODE_DIRECT 4 /* Accept direct declarators. */
|
|
|
|
#define CPARSE_MODE_FIELD 8 /* Accept field width in bits, too. */
|
|
|
|
#define CPARSE_MODE_NOIMPLICIT 16 /* Reject implicit declarations. */
|
|
|
|
#define CPARSE_MODE_SKIP 32 /* Skip definitions, ignore errors. */
|
|
|
|
|
|
|
|
typedef int CPChar; /* C parser character. Unsigned ext. from char. */
|
|
|
|
typedef int CPToken; /* C parser token. */
|
|
|
|
|
|
|
|
/* C parser internal value representation. */
|
|
|
|
typedef struct CPValue {
|
|
|
|
union {
|
|
|
|
int32_t i32; /* Value for CTID_INT32. */
|
|
|
|
uint32_t u32; /* Value for CTID_UINT32. */
|
|
|
|
};
|
|
|
|
CTypeID id; /* C Type ID of the value. */
|
|
|
|
} CPValue;
|
|
|
|
|
|
|
|
/* C parser state. */
|
|
|
|
typedef struct CPState {
|
|
|
|
CPChar c; /* Current character. */
|
|
|
|
CPToken tok; /* Current token. */
|
|
|
|
CPValue val; /* Token value. */
|
|
|
|
GCstr *str; /* Interned string of identifier/keyword. */
|
|
|
|
CType *ct; /* C type table entry. */
|
|
|
|
const char *p; /* Current position in input buffer. */
|
|
|
|
SBuf sb; /* String buffer for tokens. */
|
|
|
|
lua_State *L; /* Lua state. */
|
|
|
|
CTState *cts; /* C type state. */
|
|
|
|
TValue *param; /* C type parameters. */
|
|
|
|
const char *srcname; /* Current source name. */
|
|
|
|
BCLine linenumber; /* Input line counter. */
|
|
|
|
int depth; /* Recursive declaration depth. */
|
|
|
|
uint32_t tmask; /* Type mask for next identifier. */
|
|
|
|
uint32_t mode; /* C parser mode. */
|
|
|
|
uint8_t packstack[CPARSE_MAX_PACKSTACK]; /* Stack for pack pragmas. */
|
|
|
|
uint8_t curpack; /* Current position in pack pragma stack. */
|
|
|
|
} CPState;
|
|
|
|
|
|
|
|
LJ_FUNC int lj_cparse(CPState *cp);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|