1 #ifndef Py_STRUCTMEMBER_H 2 #define Py_STRUCTMEMBER_H 3 #ifdef __cplusplus 4 extern "C" { 5 #endif 6 7 8 /* Interface to map C struct members to Python object attributes */ 9 10 #include <stddef.h> /* For offsetof */ 11 12 /* The offsetof() macro calculates the offset of a structure member 13 in its structure. Unfortunately this cannot be written down 14 portably, hence it is provided by a Standard C header file. 15 For pre-Standard C compilers, here is a version that usually works 16 (but watch out!): */ 17 18 #ifndef offsetof 19 #define offsetof(type, member) ( (int) & ((type*)0) -> member ) 20 #endif 21 22 /* An array of memberlist structures defines the name, type and offset 23 of selected members of a C structure. These can be read by 24 PyMember_Get() and set by PyMember_Set() (except if their READONLY flag 25 is set). The array must be terminated with an entry whose name 26 pointer is NULL. */ 27 28 struct memberlist { 29 /* Obsolete version, for binary backwards compatibility */ 30 char *name; 31 int type; 32 int offset; 33 int flags; 34 }; 35 36 typedef struct PyMemberDef { 37 /* Current version, use this */ 38 char *name; 39 int type; 40 Py_ssize_t offset; 41 int flags; 42 char *doc; 43 } PyMemberDef; 44 45 /* Types */ 46 #define T_SHORT 0 47 #define T_INT 1 48 #define T_LONG 2 49 #define T_FLOAT 3 50 #define T_DOUBLE 4 51 #define T_STRING 5 52 #define T_OBJECT 6 53 /* XXX the ordering here is weird for binary compatibility */ 54 #define T_CHAR 7 /* 1-character string */ 55 #define T_BYTE 8 /* 8-bit signed int */ 56 /* unsigned variants: */ 57 #define T_UBYTE 9 58 #define T_USHORT 10 59 #define T_UINT 11 60 #define T_ULONG 12 61 62 /* Added by Jack: strings contained in the structure */ 63 #define T_STRING_INPLACE 13 64 65 /* Added by Lillo: bools contained in the structure (assumed char) */ 66 #define T_BOOL 14 67 68 #define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError 69 when the value is NULL, instead of 70 converting to None. */ 71 #ifdef HAVE_LONG_LONG 72 #define T_LONGLONG 17 73 #define T_ULONGLONG 18 74 #endif /* HAVE_LONG_LONG */ 75 76 #define T_PYSSIZET 19 /* Py_ssize_t */ 77 78 79 /* Flags */ 80 #define READONLY 1 81 #define RO READONLY /* Shorthand */ 82 #define READ_RESTRICTED 2 83 #define PY_WRITE_RESTRICTED 4 84 #define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED) 85 86 87 /* Obsolete API, for binary backwards compatibility */ 88 PyAPI_FUNC(PyObject *) PyMember_Get(const char *, struct memberlist *, const char *); 89 PyAPI_FUNC(int) PyMember_Set(char *, struct memberlist *, const char *, PyObject *); 90 91 /* Current API, use this */ 92 PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); 93 PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); 94 95 96 #ifdef __cplusplus 97 } 98 #endif 99 #endif /* !Py_STRUCTMEMBER_H */ 100