1 2 /* This part is from file 'cffi/parse_c_type.h'. It is copied at the 3 beginning of C sources generated by CFFI's ffi.set_source(). */ 4 5 typedef void *_cffi_opcode_t; 6 7 #define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8)) 8 #define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode) 9 #define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8) 10 11 #define _CFFI_OP_PRIMITIVE 1 12 #define _CFFI_OP_POINTER 3 13 #define _CFFI_OP_ARRAY 5 14 #define _CFFI_OP_OPEN_ARRAY 7 15 #define _CFFI_OP_STRUCT_UNION 9 16 #define _CFFI_OP_ENUM 11 17 #define _CFFI_OP_FUNCTION 13 18 #define _CFFI_OP_FUNCTION_END 15 19 #define _CFFI_OP_NOOP 17 20 #define _CFFI_OP_BITFIELD 19 21 #define _CFFI_OP_TYPENAME 21 22 #define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs 23 #define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs 24 #define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg) 25 #define _CFFI_OP_CONSTANT 29 26 #define _CFFI_OP_CONSTANT_INT 31 27 #define _CFFI_OP_GLOBAL_VAR 33 28 #define _CFFI_OP_DLOPEN_FUNC 35 29 #define _CFFI_OP_DLOPEN_CONST 37 30 #define _CFFI_OP_GLOBAL_VAR_F 39 31 #define _CFFI_OP_EXTERN_PYTHON 41 32 33 #define _CFFI_PRIM_VOID 0 34 #define _CFFI_PRIM_BOOL 1 35 #define _CFFI_PRIM_CHAR 2 36 #define _CFFI_PRIM_SCHAR 3 37 #define _CFFI_PRIM_UCHAR 4 38 #define _CFFI_PRIM_SHORT 5 39 #define _CFFI_PRIM_USHORT 6 40 #define _CFFI_PRIM_INT 7 41 #define _CFFI_PRIM_UINT 8 42 #define _CFFI_PRIM_LONG 9 43 #define _CFFI_PRIM_ULONG 10 44 #define _CFFI_PRIM_LONGLONG 11 45 #define _CFFI_PRIM_ULONGLONG 12 46 #define _CFFI_PRIM_FLOAT 13 47 #define _CFFI_PRIM_DOUBLE 14 48 #define _CFFI_PRIM_LONGDOUBLE 15 49 50 #define _CFFI_PRIM_WCHAR 16 51 #define _CFFI_PRIM_INT8 17 52 #define _CFFI_PRIM_UINT8 18 53 #define _CFFI_PRIM_INT16 19 54 #define _CFFI_PRIM_UINT16 20 55 #define _CFFI_PRIM_INT32 21 56 #define _CFFI_PRIM_UINT32 22 57 #define _CFFI_PRIM_INT64 23 58 #define _CFFI_PRIM_UINT64 24 59 #define _CFFI_PRIM_INTPTR 25 60 #define _CFFI_PRIM_UINTPTR 26 61 #define _CFFI_PRIM_PTRDIFF 27 62 #define _CFFI_PRIM_SIZE 28 63 #define _CFFI_PRIM_SSIZE 29 64 #define _CFFI_PRIM_INT_LEAST8 30 65 #define _CFFI_PRIM_UINT_LEAST8 31 66 #define _CFFI_PRIM_INT_LEAST16 32 67 #define _CFFI_PRIM_UINT_LEAST16 33 68 #define _CFFI_PRIM_INT_LEAST32 34 69 #define _CFFI_PRIM_UINT_LEAST32 35 70 #define _CFFI_PRIM_INT_LEAST64 36 71 #define _CFFI_PRIM_UINT_LEAST64 37 72 #define _CFFI_PRIM_INT_FAST8 38 73 #define _CFFI_PRIM_UINT_FAST8 39 74 #define _CFFI_PRIM_INT_FAST16 40 75 #define _CFFI_PRIM_UINT_FAST16 41 76 #define _CFFI_PRIM_INT_FAST32 42 77 #define _CFFI_PRIM_UINT_FAST32 43 78 #define _CFFI_PRIM_INT_FAST64 44 79 #define _CFFI_PRIM_UINT_FAST64 45 80 #define _CFFI_PRIM_INTMAX 46 81 #define _CFFI_PRIM_UINTMAX 47 82 #define _CFFI_PRIM_FLOATCOMPLEX 48 83 #define _CFFI_PRIM_DOUBLECOMPLEX 49 84 #define _CFFI_PRIM_CHAR16 50 85 #define _CFFI_PRIM_CHAR32 51 86 87 #define _CFFI__NUM_PRIM 52 88 #define _CFFI__UNKNOWN_PRIM (-1) 89 #define _CFFI__UNKNOWN_FLOAT_PRIM (-2) 90 #define _CFFI__UNKNOWN_LONG_DOUBLE (-3) 91 92 #define _CFFI__IO_FILE_STRUCT (-1) 93 94 95 struct _cffi_global_s { 96 const char *name; 97 void *address; 98 _cffi_opcode_t type_op; 99 void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown 100 // OP_CPYTHON_BLTN_*: addr of direct function 101 }; 102 103 struct _cffi_getconst_s { 104 unsigned long long value; 105 const struct _cffi_type_context_s *ctx; 106 int gindex; 107 }; 108 109 struct _cffi_struct_union_s { 110 const char *name; 111 int type_index; // -> _cffi_types, on a OP_STRUCT_UNION 112 int flags; // _CFFI_F_* flags below 113 size_t size; 114 int alignment; 115 int first_field_index; // -> _cffi_fields array 116 int num_fields; 117 }; 118 #define _CFFI_F_UNION 0x01 // is a union, not a struct 119 #define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the 120 // "standard layout" or if some are missing 121 #define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct 122 #define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include() 123 #define _CFFI_F_OPAQUE 0x10 // opaque 124 125 struct _cffi_field_s { 126 const char *name; 127 size_t field_offset; 128 size_t field_size; 129 _cffi_opcode_t field_type_op; 130 }; 131 132 struct _cffi_enum_s { 133 const char *name; 134 int type_index; // -> _cffi_types, on a OP_ENUM 135 int type_prim; // _CFFI_PRIM_xxx 136 const char *enumerators; // comma-delimited string 137 }; 138 139 struct _cffi_typename_s { 140 const char *name; 141 int type_index; /* if opaque, points to a possibly artificial 142 OP_STRUCT which is itself opaque */ 143 }; 144 145 struct _cffi_type_context_s { 146 _cffi_opcode_t *types; 147 const struct _cffi_global_s *globals; 148 const struct _cffi_field_s *fields; 149 const struct _cffi_struct_union_s *struct_unions; 150 const struct _cffi_enum_s *enums; 151 const struct _cffi_typename_s *typenames; 152 int num_globals; 153 int num_struct_unions; 154 int num_enums; 155 int num_typenames; 156 const char *const *includes; 157 int num_types; 158 int flags; /* future extension */ 159 }; 160 161 struct _cffi_parse_info_s { 162 const struct _cffi_type_context_s *ctx; 163 _cffi_opcode_t *output; 164 unsigned int output_size; 165 size_t error_location; 166 const char *error_message; 167 }; 168 169 struct _cffi_externpy_s { 170 const char *name; 171 size_t size_of_result; 172 void *reserved1, *reserved2; 173 }; 174 175 #ifdef _CFFI_INTERNAL 176 static int parse_c_type(struct _cffi_parse_info_s *info, const char *input); 177 static int search_in_globals(const struct _cffi_type_context_s *ctx, 178 const char *search, size_t search_len); 179 static int search_in_struct_unions(const struct _cffi_type_context_s *ctx, 180 const char *search, size_t search_len); 181 #endif 182