| |
| /* This part is from file 'cffi/parse_c_type.h'. It is copied at the |
| beginning of C sources generated by CFFI's ffi.set_source(). */ |
| |
| typedef void *_cffi_opcode_t; |
| |
| #define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8)) |
| #define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode) |
| #define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8) |
| |
| #define _CFFI_OP_PRIMITIVE 1 |
| #define _CFFI_OP_POINTER 3 |
| #define _CFFI_OP_ARRAY 5 |
| #define _CFFI_OP_OPEN_ARRAY 7 |
| #define _CFFI_OP_STRUCT_UNION 9 |
| #define _CFFI_OP_ENUM 11 |
| #define _CFFI_OP_FUNCTION 13 |
| #define _CFFI_OP_FUNCTION_END 15 |
| #define _CFFI_OP_NOOP 17 |
| #define _CFFI_OP_BITFIELD 19 |
| #define _CFFI_OP_TYPENAME 21 |
| #define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs |
| #define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs |
| #define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg) |
| #define _CFFI_OP_CONSTANT 29 |
| #define _CFFI_OP_CONSTANT_INT 31 |
| #define _CFFI_OP_GLOBAL_VAR 33 |
| #define _CFFI_OP_DLOPEN_FUNC 35 |
| #define _CFFI_OP_DLOPEN_CONST 37 |
| #define _CFFI_OP_GLOBAL_VAR_F 39 |
| #define _CFFI_OP_EXTERN_PYTHON 41 |
| |
| #define _CFFI_PRIM_VOID 0 |
| #define _CFFI_PRIM_BOOL 1 |
| #define _CFFI_PRIM_CHAR 2 |
| #define _CFFI_PRIM_SCHAR 3 |
| #define _CFFI_PRIM_UCHAR 4 |
| #define _CFFI_PRIM_SHORT 5 |
| #define _CFFI_PRIM_USHORT 6 |
| #define _CFFI_PRIM_INT 7 |
| #define _CFFI_PRIM_UINT 8 |
| #define _CFFI_PRIM_LONG 9 |
| #define _CFFI_PRIM_ULONG 10 |
| #define _CFFI_PRIM_LONGLONG 11 |
| #define _CFFI_PRIM_ULONGLONG 12 |
| #define _CFFI_PRIM_FLOAT 13 |
| #define _CFFI_PRIM_DOUBLE 14 |
| #define _CFFI_PRIM_LONGDOUBLE 15 |
| |
| #define _CFFI_PRIM_WCHAR 16 |
| #define _CFFI_PRIM_INT8 17 |
| #define _CFFI_PRIM_UINT8 18 |
| #define _CFFI_PRIM_INT16 19 |
| #define _CFFI_PRIM_UINT16 20 |
| #define _CFFI_PRIM_INT32 21 |
| #define _CFFI_PRIM_UINT32 22 |
| #define _CFFI_PRIM_INT64 23 |
| #define _CFFI_PRIM_UINT64 24 |
| #define _CFFI_PRIM_INTPTR 25 |
| #define _CFFI_PRIM_UINTPTR 26 |
| #define _CFFI_PRIM_PTRDIFF 27 |
| #define _CFFI_PRIM_SIZE 28 |
| #define _CFFI_PRIM_SSIZE 29 |
| #define _CFFI_PRIM_INT_LEAST8 30 |
| #define _CFFI_PRIM_UINT_LEAST8 31 |
| #define _CFFI_PRIM_INT_LEAST16 32 |
| #define _CFFI_PRIM_UINT_LEAST16 33 |
| #define _CFFI_PRIM_INT_LEAST32 34 |
| #define _CFFI_PRIM_UINT_LEAST32 35 |
| #define _CFFI_PRIM_INT_LEAST64 36 |
| #define _CFFI_PRIM_UINT_LEAST64 37 |
| #define _CFFI_PRIM_INT_FAST8 38 |
| #define _CFFI_PRIM_UINT_FAST8 39 |
| #define _CFFI_PRIM_INT_FAST16 40 |
| #define _CFFI_PRIM_UINT_FAST16 41 |
| #define _CFFI_PRIM_INT_FAST32 42 |
| #define _CFFI_PRIM_UINT_FAST32 43 |
| #define _CFFI_PRIM_INT_FAST64 44 |
| #define _CFFI_PRIM_UINT_FAST64 45 |
| #define _CFFI_PRIM_INTMAX 46 |
| #define _CFFI_PRIM_UINTMAX 47 |
| #define _CFFI_PRIM_FLOATCOMPLEX 48 |
| #define _CFFI_PRIM_DOUBLECOMPLEX 49 |
| #define _CFFI_PRIM_CHAR16 50 |
| #define _CFFI_PRIM_CHAR32 51 |
| |
| #define _CFFI__NUM_PRIM 52 |
| #define _CFFI__UNKNOWN_PRIM (-1) |
| #define _CFFI__UNKNOWN_FLOAT_PRIM (-2) |
| #define _CFFI__UNKNOWN_LONG_DOUBLE (-3) |
| |
| #define _CFFI__IO_FILE_STRUCT (-1) |
| |
| |
| struct _cffi_global_s { |
| const char *name; |
| void *address; |
| _cffi_opcode_t type_op; |
| void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown |
| // OP_CPYTHON_BLTN_*: addr of direct function |
| }; |
| |
| struct _cffi_getconst_s { |
| unsigned long long value; |
| const struct _cffi_type_context_s *ctx; |
| int gindex; |
| }; |
| |
| struct _cffi_struct_union_s { |
| const char *name; |
| int type_index; // -> _cffi_types, on a OP_STRUCT_UNION |
| int flags; // _CFFI_F_* flags below |
| size_t size; |
| int alignment; |
| int first_field_index; // -> _cffi_fields array |
| int num_fields; |
| }; |
| #define _CFFI_F_UNION 0x01 // is a union, not a struct |
| #define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the |
| // "standard layout" or if some are missing |
| #define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct |
| #define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include() |
| #define _CFFI_F_OPAQUE 0x10 // opaque |
| |
| struct _cffi_field_s { |
| const char *name; |
| size_t field_offset; |
| size_t field_size; |
| _cffi_opcode_t field_type_op; |
| }; |
| |
| struct _cffi_enum_s { |
| const char *name; |
| int type_index; // -> _cffi_types, on a OP_ENUM |
| int type_prim; // _CFFI_PRIM_xxx |
| const char *enumerators; // comma-delimited string |
| }; |
| |
| struct _cffi_typename_s { |
| const char *name; |
| int type_index; /* if opaque, points to a possibly artificial |
| OP_STRUCT which is itself opaque */ |
| }; |
| |
| struct _cffi_type_context_s { |
| _cffi_opcode_t *types; |
| const struct _cffi_global_s *globals; |
| const struct _cffi_field_s *fields; |
| const struct _cffi_struct_union_s *struct_unions; |
| const struct _cffi_enum_s *enums; |
| const struct _cffi_typename_s *typenames; |
| int num_globals; |
| int num_struct_unions; |
| int num_enums; |
| int num_typenames; |
| const char *const *includes; |
| int num_types; |
| int flags; /* future extension */ |
| }; |
| |
| struct _cffi_parse_info_s { |
| const struct _cffi_type_context_s *ctx; |
| _cffi_opcode_t *output; |
| unsigned int output_size; |
| size_t error_location; |
| const char *error_message; |
| }; |
| |
| struct _cffi_externpy_s { |
| const char *name; |
| size_t size_of_result; |
| void *reserved1, *reserved2; |
| }; |
| |
| #ifdef _CFFI_INTERNAL |
| static int parse_c_type(struct _cffi_parse_info_s *info, const char *input); |
| static int search_in_globals(const struct _cffi_type_context_s *ctx, |
| const char *search, size_t search_len); |
| static int search_in_struct_unions(const struct _cffi_type_context_s *ctx, |
| const char *search, size_t search_len); |
| #endif |