structmember.h 2.5 KB
Newer Older
1 2 3 4 5 6
#ifndef Py_STRUCTMEMBER_H
#define Py_STRUCTMEMBER_H
#ifdef __cplusplus
extern "C" {
#endif

7

Guido van Rossum's avatar
Guido van Rossum committed
8 9
/* Interface to map C struct members to Python object attributes */

Guido van Rossum's avatar
Guido van Rossum committed
10 11 12 13
#ifdef HAVE_STDDEF_H
#include <stddef.h> /* For offsetof */
#endif

Guido van Rossum's avatar
Guido van Rossum committed
14 15 16 17 18 19 20 21 22 23 24 25
/* The offsetof() macro calculates the offset of a structure member
   in its structure.  Unfortunately this cannot be written down
   portably, hence it is provided by a Standard C header file.
   For pre-Standard C compilers, here is a version that usually works
   (but watch out!): */

#ifndef offsetof
#define offsetof(type, member) ( (int) & ((type*)0) -> member )
#endif

/* An array of memberlist structures defines the name, type and offset
   of selected members of a C structure.  These can be read by
26
   PyMember_Get() and set by PyMember_Set() (except if their READONLY flag
Guido van Rossum's avatar
Guido van Rossum committed
27 28 29 30
   is set).  The array must be terminated with an entry whose name
   pointer is NULL. */

struct memberlist {
31
	/* Obsolete version, for binary backwards compatibility */
Guido van Rossum's avatar
Guido van Rossum committed
32 33 34
	char *name;
	int type;
	int offset;
35
	int flags;
Guido van Rossum's avatar
Guido van Rossum committed
36 37
};

38 39 40 41 42 43 44 45 46
typedef struct PyMemberDef {
	/* Current version, use this */
	char *name;
	int type;
	int offset;
	int flags;
	char *doc;
} PyMemberDef;

Guido van Rossum's avatar
Guido van Rossum committed
47 48 49 50 51 52 53 54
/* Types */
#define T_SHORT		0
#define T_INT		1
#define T_LONG		2
#define T_FLOAT		3
#define T_DOUBLE	4
#define T_STRING	5
#define T_OBJECT	6
55 56 57 58 59 60 61 62
/* XXX the ordering here is weird for binary compatibility */
#define T_CHAR		7	/* 1-character string */
#define T_BYTE		8	/* 8-bit signed int */
/* unsigned variants: */
#define T_UBYTE		9
#define T_USHORT	10
#define T_UINT		11
#define T_ULONG		12
Guido van Rossum's avatar
Guido van Rossum committed
63

64 65 66 67 68 69 70
/* Added by Jack: strings contained in the structure */
#define T_STRING_INPLACE	13
#ifdef macintosh
#define T_PSTRING	14	/* macintosh pascal-style counted string */
#define T_PSTRING_INPLACE	15
#endif /* macintosh */

71 72 73 74
#define T_OBJECT_EX	16	/* Like T_OBJECT, but raises AttributeError
				   when the value is NULL, instead of
				   converting to None. */

75
/* Flags */
Guido van Rossum's avatar
Guido van Rossum committed
76 77
#define READONLY	1
#define RO		READONLY		/* Shorthand */
78 79 80 81
#define READ_RESTRICTED	2
#define WRITE_RESTRICTED 4
#define RESTRICTED	(READ_RESTRICTED | WRITE_RESTRICTED)

Guido van Rossum's avatar
Guido van Rossum committed
82

83
/* Obsolete API, for binary backwards compatibility */
84 85
PyAPI_FUNC(PyObject *) PyMember_Get(char *, struct memberlist *, char *);
PyAPI_FUNC(int) PyMember_Set(char *, struct memberlist *, char *, PyObject *);
86

87
/* Current API, use this */
88 89
PyAPI_FUNC(PyObject *) PyMember_GetOne(char *, struct PyMemberDef *);
PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *);
90 91


92 93 94 95
#ifdef __cplusplus
}
#endif
#endif /* !Py_STRUCTMEMBER_H */