1#ifndef Py_STRUCTMEMBER_H 2#define Py_STRUCTMEMBER_H 3#ifdef __cplusplus 4extern "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 28struct memberlist { 29 /* Obsolete version, for binary backwards compatibility */ 30 char *name; 31 int type; 32 int offset; 33 int flags; 34}; 35 36typedef 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 */ 88PyAPI_FUNC(PyObject *) PyMember_Get(const char *, struct memberlist *, const char *); 89PyAPI_FUNC(int) PyMember_Set(char *, struct memberlist *, const char *, PyObject *); 90 91/* Current API, use this */ 92PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); 93PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); 94 95 96#ifdef __cplusplus 97} 98#endif 99#endif /* !Py_STRUCTMEMBER_H */ 100