blob: 98eccc056e546978a075b3684b352b0075158fe0 [file] [log] [blame]
Guido van Rossuma3309961993-07-28 09:05:47 +00001#ifndef Py_STRUCTMEMBER_H
2#define Py_STRUCTMEMBER_H
3#ifdef __cplusplus
4extern "C" {
5#endif
6
Guido van Rossumf70e43a1991-02-19 12:39:46 +00007
Guido van Rossum3f5da241990-12-20 15:06:42 +00008/* Interface to map C struct members to Python object attributes */
9
Guido van Rossum5ebc0ca1994-10-20 22:03:08 +000010#ifdef HAVE_STDDEF_H
11#include <stddef.h> /* For offsetof */
12#endif
13
Guido van Rossum3f5da241990-12-20 15:06:42 +000014/* The offsetof() macro calculates the offset of a structure member
15 in its structure. Unfortunately this cannot be written down
16 portably, hence it is provided by a Standard C header file.
17 For pre-Standard C compilers, here is a version that usually works
18 (but watch out!): */
19
20#ifndef offsetof
21#define offsetof(type, member) ( (int) & ((type*)0) -> member )
22#endif
23
24/* An array of memberlist structures defines the name, type and offset
25 of selected members of a C structure. These can be read by
Guido van Rossumcaa63801995-01-12 11:45:45 +000026 PyMember_Get() and set by PyMember_Set() (except if their READONLY flag
Guido van Rossum3f5da241990-12-20 15:06:42 +000027 is set). The array must be terminated with an entry whose name
28 pointer is NULL. */
29
30struct memberlist {
Guido van Rossum6f799372001-09-20 20:46:19 +000031 /* Obsolete version, for binary backwards compatibility */
Guido van Rossum3f5da241990-12-20 15:06:42 +000032 char *name;
33 int type;
34 int offset;
Guido van Rossumc299fc12001-09-17 19:28:08 +000035 int flags;
Guido van Rossum3f5da241990-12-20 15:06:42 +000036};
37
Guido van Rossum6f799372001-09-20 20:46:19 +000038typedef struct PyMemberDef {
39 /* Current version, use this */
40 char *name;
41 int type;
42 int offset;
43 int flags;
44 char *doc;
45} PyMemberDef;
46
Guido van Rossum3f5da241990-12-20 15:06:42 +000047/* Types */
48#define T_SHORT 0
49#define T_INT 1
50#define T_LONG 2
51#define T_FLOAT 3
52#define T_DOUBLE 4
53#define T_STRING 5
54#define T_OBJECT 6
Guido van Rossum00023951992-06-03 17:07:40 +000055/* XXX the ordering here is weird for binary compatibility */
56#define T_CHAR 7 /* 1-character string */
57#define T_BYTE 8 /* 8-bit signed int */
58/* unsigned variants: */
59#define T_UBYTE 9
60#define T_USHORT 10
61#define T_UINT 11
62#define T_ULONG 12
Guido van Rossum3f5da241990-12-20 15:06:42 +000063
Jack Jansen599f0d11994-12-14 13:04:05 +000064/* Added by Jack: strings contained in the structure */
65#define T_STRING_INPLACE 13
66#ifdef macintosh
67#define T_PSTRING 14 /* macintosh pascal-style counted string */
68#define T_PSTRING_INPLACE 15
69#endif /* macintosh */
70
Guido van Rossum6b705992001-12-04 16:23:42 +000071#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError
72 when the value is NULL, instead of
73 converting to None. */
74
Guido van Rossumc299fc12001-09-17 19:28:08 +000075/* Flags */
Guido van Rossum3f5da241990-12-20 15:06:42 +000076#define READONLY 1
77#define RO READONLY /* Shorthand */
Guido van Rossumc299fc12001-09-17 19:28:08 +000078#define READ_RESTRICTED 2
79#define WRITE_RESTRICTED 4
80#define RESTRICTED (READ_RESTRICTED | WRITE_RESTRICTED)
81
Guido van Rossum3f5da241990-12-20 15:06:42 +000082
Guido van Rossum6f799372001-09-20 20:46:19 +000083/* Obsolete API, for binary backwards compatibility */
Fred Drake5eb6d4e2000-07-08 23:37:28 +000084DL_IMPORT(PyObject *) PyMember_Get(char *, struct memberlist *, char *);
85DL_IMPORT(int) PyMember_Set(char *, struct memberlist *, char *, PyObject *);
Guido van Rossuma3309961993-07-28 09:05:47 +000086
Guido van Rossum6f799372001-09-20 20:46:19 +000087/* Current API, use this */
88DL_IMPORT(PyObject *) PyMember_GetOne(char *, struct PyMemberDef *);
89DL_IMPORT(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *);
90
91
Guido van Rossuma3309961993-07-28 09:05:47 +000092#ifdef __cplusplus
93}
94#endif
95#endif /* !Py_STRUCTMEMBER_H */