annotate Modules/_struct.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 37e4d14a8bad
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
48591
1de718a31004 update the struct documentation to refer to bytes
Benjamin Peterson <benjamin@python.org>
parents: 48321
diff changeset
1 /* struct module -- pack values into and (out of) bytes objects */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
3 /* New version supporting byte order, alignment and size options,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
4 character strings, and unsigned numbers */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
5
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
6 #define PY_SSIZE_T_CLEAN
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
7
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
8 #include "Python.h"
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
9 #include "structmember.h"
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
10 #include <ctype.h>
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
11
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
12 static PyTypeObject PyStructType;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
13
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
14 /* The translation function for each format character is table driven */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
15 typedef struct _formatdef {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
16 char format;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
17 Py_ssize_t size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
18 Py_ssize_t alignment;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
19 PyObject* (*unpack)(const char *,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
20 const struct _formatdef *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
21 int (*pack)(char *, PyObject *,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
22 const struct _formatdef *);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
23 } formatdef;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
24
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
25 typedef struct _formatcode {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
26 const struct _formatdef *fmtdef;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
27 Py_ssize_t offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
28 Py_ssize_t size;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
29 Py_ssize_t repeat;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
30 } formatcode;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
31
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
32 /* Struct object interface */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
33
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
34 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
35 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
36 Py_ssize_t s_size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
37 Py_ssize_t s_len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
38 formatcode *s_codes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
39 PyObject *s_format;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
40 PyObject *weakreflist; /* List of weak references */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
41 } PyStructObject;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
42
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
43
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
44 #define PyStruct_Check(op) PyObject_TypeCheck(op, &PyStructType)
44351
86a2679dca46 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
45 #define PyStruct_CheckExact(op) (Py_TYPE(op) == &PyStructType)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
46
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
47
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
48 /* Exception */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
49
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
50 static PyObject *StructError;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
51
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
52
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
53 /* Define various structs to figure out the alignments of types */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
54
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
55
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
56 typedef struct { char c; short x; } st_short;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
57 typedef struct { char c; int x; } st_int;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
58 typedef struct { char c; long x; } st_long;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
59 typedef struct { char c; float x; } st_float;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
60 typedef struct { char c; double x; } st_double;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
61 typedef struct { char c; void *x; } st_void_p;
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
62 typedef struct { char c; size_t x; } st_size_t;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
63
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
64 #define SHORT_ALIGN (sizeof(st_short) - sizeof(short))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
65 #define INT_ALIGN (sizeof(st_int) - sizeof(int))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
66 #define LONG_ALIGN (sizeof(st_long) - sizeof(long))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
67 #define FLOAT_ALIGN (sizeof(st_float) - sizeof(float))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
68 #define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
69 #define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *))
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
70 #define SIZE_T_ALIGN (sizeof(st_size_t) - sizeof(size_t))
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
71
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
72 /* We can't support q and Q in native mode unless the compiler does;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
73 in std mode, they're 8 bytes on all platforms. */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
74 #ifdef HAVE_LONG_LONG
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
75 typedef struct { char c; PY_LONG_LONG x; } s_long_long;
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
76 #define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(PY_LONG_LONG))
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
77 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
78
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
79 #ifdef HAVE_C99_BOOL
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
80 #define BOOL_TYPE _Bool
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
81 typedef struct { char c; _Bool x; } s_bool;
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
82 #define BOOL_ALIGN (sizeof(s_bool) - sizeof(BOOL_TYPE))
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
83 #else
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
84 #define BOOL_TYPE char
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
85 #define BOOL_ALIGN 0
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
86 #endif
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
87
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
88 #define STRINGIFY(x) #x
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
89
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
90 #ifdef __powerc
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
91 #pragma options align=reset
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
92 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
93
60252
9b24aa36c06f Internal refactoring in struct.pack: make all integer conversions go through get_pylong.
Mark Dickinson <dickinsm@gmail.com>
parents: 60240
diff changeset
94 /* Helper for integer format codes: converts an arbitrary Python object to a
9b24aa36c06f Internal refactoring in struct.pack: make all integer conversions go through get_pylong.
Mark Dickinson <dickinsm@gmail.com>
parents: 60240
diff changeset
95 PyLongObject if possible, otherwise fails. Caller should decref. */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
96
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
97 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
98 get_pylong(PyObject *v)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
99 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
100 assert(v != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
101 if (!PyLong_Check(v)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
102 /* Not an integer; try to use __index__ to convert. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
103 if (PyIndex_Check(v)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
104 v = PyNumber_Index(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
105 if (v == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
106 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
107 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
108 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
109 PyErr_SetString(StructError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
110 "required argument is not an integer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
111 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
112 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
113 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
114 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
115 Py_INCREF(v);
53271
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52414
diff changeset
116
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
117 assert(PyLong_Check(v));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
118 return v;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
119 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
120
53271
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52414
diff changeset
121 /* Helper routine to get a C long and raise the appropriate error if it isn't
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52414
diff changeset
122 one */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
123
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
124 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
125 get_long(PyObject *v, long *p)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
126 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
127 long x;
53271
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52414
diff changeset
128
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
129 v = get_pylong(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
130 if (v == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
131 return -1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
132 assert(PyLong_Check(v));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
133 x = PyLong_AsLong(v);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
134 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
135 if (x == (long)-1 && PyErr_Occurred()) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
136 if (PyErr_ExceptionMatches(PyExc_OverflowError))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
137 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
138 "argument out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
139 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
140 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
141 *p = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
142 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
143 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
144
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
145
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
146 /* Same, but handling unsigned long */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
147
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
148 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
149 get_ulong(PyObject *v, unsigned long *p)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
150 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
151 unsigned long x;
53271
4527c152daa9 Issue #5463: Remove deprecated float coercion from struct module, along
Mark Dickinson <dickinsm@gmail.com>
parents: 52414
diff changeset
152
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
153 v = get_pylong(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
154 if (v == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
155 return -1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
156 assert(PyLong_Check(v));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
157 x = PyLong_AsUnsignedLong(v);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
158 Py_DECREF(v);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
159 if (x == (unsigned long)-1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
160 if (PyErr_ExceptionMatches(PyExc_OverflowError))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
161 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
162 "argument out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
163 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
164 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
165 *p = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
166 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
167 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
168
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
169 #ifdef HAVE_LONG_LONG
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
170
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
171 /* Same, but handling native long long. */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
172
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
173 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
174 get_longlong(PyObject *v, PY_LONG_LONG *p)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
175 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
176 PY_LONG_LONG x;
60252
9b24aa36c06f Internal refactoring in struct.pack: make all integer conversions go through get_pylong.
Mark Dickinson <dickinsm@gmail.com>
parents: 60240
diff changeset
177
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
178 v = get_pylong(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
179 if (v == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
180 return -1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
181 assert(PyLong_Check(v));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
182 x = PyLong_AsLongLong(v);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
183 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
184 if (x == (PY_LONG_LONG)-1 && PyErr_Occurred()) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
185 if (PyErr_ExceptionMatches(PyExc_OverflowError))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
186 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
187 "argument out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
188 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
189 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
190 *p = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
191 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
192 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
193
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
194 /* Same, but handling native unsigned long long. */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
195
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
196 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
197 get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
198 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
199 unsigned PY_LONG_LONG x;
60252
9b24aa36c06f Internal refactoring in struct.pack: make all integer conversions go through get_pylong.
Mark Dickinson <dickinsm@gmail.com>
parents: 60240
diff changeset
200
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
201 v = get_pylong(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
202 if (v == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
203 return -1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
204 assert(PyLong_Check(v));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
205 x = PyLong_AsUnsignedLongLong(v);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
206 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
207 if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
208 if (PyErr_ExceptionMatches(PyExc_OverflowError))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
209 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
210 "argument out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
211 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
212 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
213 *p = x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
214 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
215 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
216
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
217 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
218
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
219 /* Same, but handling Py_ssize_t */
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
220
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
221 static int
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
222 get_ssize_t(PyObject *v, Py_ssize_t *p)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
223 {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
224 Py_ssize_t x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
225
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
226 v = get_pylong(v);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
227 if (v == NULL)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
228 return -1;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
229 assert(PyLong_Check(v));
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
230 x = PyLong_AsSsize_t(v);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
231 Py_DECREF(v);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
232 if (x == (Py_ssize_t)-1 && PyErr_Occurred()) {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
233 if (PyErr_ExceptionMatches(PyExc_OverflowError))
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
234 PyErr_SetString(StructError,
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
235 "argument out of range");
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
236 return -1;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
237 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
238 *p = x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
239 return 0;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
240 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
241
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
242 /* Same, but handling size_t */
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
243
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
244 static int
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
245 get_size_t(PyObject *v, size_t *p)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
246 {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
247 size_t x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
248
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
249 v = get_pylong(v);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
250 if (v == NULL)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
251 return -1;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
252 assert(PyLong_Check(v));
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
253 x = PyLong_AsSize_t(v);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
254 Py_DECREF(v);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
255 if (x == (size_t)-1 && PyErr_Occurred()) {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
256 if (PyErr_ExceptionMatches(PyExc_OverflowError))
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
257 PyErr_SetString(StructError,
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
258 "argument out of range");
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
259 return -1;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
260 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
261 *p = x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
262 return 0;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
263 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
264
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
265
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
266 #define RANGE_ERROR(x, f, flag, mask) return _range_error(f, flag)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
267
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
268
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
269 /* Floating point helpers */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
270
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
271 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
272 unpack_float(const char *p, /* start of 4-byte string */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
273 int le) /* true for little-endian, false for big-endian */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
274 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
275 double x;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
276
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
277 x = _PyFloat_Unpack4((unsigned char *)p, le);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
278 if (x == -1.0 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
279 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
280 return PyFloat_FromDouble(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
281 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
282
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
283 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
284 unpack_double(const char *p, /* start of 8-byte string */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
285 int le) /* true for little-endian, false for big-endian */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
286 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
287 double x;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
288
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
289 x = _PyFloat_Unpack8((unsigned char *)p, le);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
290 if (x == -1.0 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
291 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
292 return PyFloat_FromDouble(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
293 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
294
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
295 /* Helper to format the range error exceptions */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
296 static int
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
297 _range_error(const formatdef *f, int is_unsigned)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
298 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
299 /* ulargest is the largest unsigned value with f->size bytes.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
300 * Note that the simpler:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
301 * ((size_t)1 << (f->size * 8)) - 1
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
302 * doesn't work when f->size == sizeof(size_t) because C doesn't
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
303 * define what happens when a left shift count is >= the number of
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
304 * bits in the integer being shifted; e.g., on some boxes it doesn't
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
305 * shift at all when they're equal.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
306 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
307 const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
308 assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
309 if (is_unsigned)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
310 PyErr_Format(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
311 "'%c' format requires 0 <= number <= %zu",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
312 f->format,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
313 ulargest);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
314 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
315 const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
316 PyErr_Format(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
317 "'%c' format requires %zd <= number <= %zd",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
318 f->format,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
319 ~ largest,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
320 largest);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
321 }
52249
5cace75bcb05 - Issue #5463: In struct module, remove deprecated overflow wrapping
Mark Dickinson <dickinsm@gmail.com>
parents: 51596
diff changeset
322
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
323 return -1;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
324 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
325
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
326
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
327
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
328 /* A large number of small routines follow, with names of the form
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
329
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
330 [bln][up]_TYPE
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
331
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
332 [bln] distiguishes among big-endian, little-endian and native.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
333 [pu] distiguishes between pack (to struct) and unpack (from struct).
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
334 TYPE is one of char, byte, ubyte, etc.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
335 */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
336
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
337 /* Native mode routines. ****************************************************/
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
338 /* NOTE:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
339 In all n[up]_<type> routines handling types larger than 1 byte, there is
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
340 *no* guarantee that the p pointer is properly aligned for each type,
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
341 therefore memcpy is called. An intermediate variable is used to
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
342 compensate for big-endian architectures.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
343 Normally both the intermediate variable and the memcpy call will be
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
344 skipped by C optimisation in little-endian architectures (gcc >= 2.91
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
345 does this). */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
346
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
347 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
348 nu_char(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
349 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
350 return PyBytes_FromStringAndSize(p, 1);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
351 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
352
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
353 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
354 nu_byte(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
355 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
356 return PyLong_FromLong((long) *(signed char *)p);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
357 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
358
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
359 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
360 nu_ubyte(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
361 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
362 return PyLong_FromLong((long) *(unsigned char *)p);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
363 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
364
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
365 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
366 nu_short(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
367 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
368 short x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
369 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
370 return PyLong_FromLong((long)x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
371 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
372
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
373 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
374 nu_ushort(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
375 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
376 unsigned short x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
377 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
378 return PyLong_FromLong((long)x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
379 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
380
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
381 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
382 nu_int(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
383 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
384 int x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
385 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
386 return PyLong_FromLong((long)x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
387 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
388
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
389 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
390 nu_uint(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
391 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
392 unsigned int x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
393 memcpy((char *)&x, p, sizeof x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
394 #if (SIZEOF_LONG > SIZEOF_INT)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
395 return PyLong_FromLong((long)x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
396 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
397 if (x <= ((unsigned int)LONG_MAX))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
398 return PyLong_FromLong((long)x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
399 return PyLong_FromUnsignedLong((unsigned long)x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
400 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
401 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
402
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
403 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
404 nu_long(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
405 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
406 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
407 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
408 return PyLong_FromLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
409 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
410
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
411 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
412 nu_ulong(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
413 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
414 unsigned long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
415 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
416 if (x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
417 return PyLong_FromLong((long)x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
418 return PyLong_FromUnsignedLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
419 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
420
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
421 static PyObject *
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
422 nu_ssize_t(const char *p, const formatdef *f)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
423 {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
424 Py_ssize_t x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
425 memcpy((char *)&x, p, sizeof x);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
426 return PyLong_FromSsize_t(x);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
427 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
428
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
429 static PyObject *
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
430 nu_size_t(const char *p, const formatdef *f)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
431 {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
432 size_t x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
433 memcpy((char *)&x, p, sizeof x);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
434 return PyLong_FromSize_t(x);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
435 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
436
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
437
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
438 /* Native mode doesn't support q or Q unless the platform C supports
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
439 long long (or, on Windows, __int64). */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
440
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
441 #ifdef HAVE_LONG_LONG
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
442
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
443 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
444 nu_longlong(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
445 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
446 PY_LONG_LONG x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
447 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
448 if (x >= LONG_MIN && x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
449 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
450 return PyLong_FromLongLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
451 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
452
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
453 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
454 nu_ulonglong(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
455 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
456 unsigned PY_LONG_LONG x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
457 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
458 if (x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
459 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
460 return PyLong_FromUnsignedLongLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
461 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
462
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
463 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
464
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
465 static PyObject *
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
466 nu_bool(const char *p, const formatdef *f)
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
467 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
468 BOOL_TYPE x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
469 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
470 return PyBool_FromLong(x != 0);
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
471 }
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
472
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
473
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
474 static PyObject *
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
475 nu_float(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
476 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
477 float x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
478 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
479 return PyFloat_FromDouble((double)x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
480 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
481
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
482 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
483 nu_double(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
484 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
485 double x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
486 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
487 return PyFloat_FromDouble(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
488 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
489
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
490 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
491 nu_void_p(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
492 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
493 void *x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
494 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
495 return PyLong_FromVoidPtr(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
496 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
497
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
498 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
499 np_byte(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
500 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
501 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
502 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
503 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
504 if (x < -128 || x > 127){
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
505 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
506 "byte format requires -128 <= number <= 127");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
507 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
508 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
509 *p = (char)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
510 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
511 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
512
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
513 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
514 np_ubyte(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
515 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
516 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
517 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
518 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
519 if (x < 0 || x > 255){
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
520 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
521 "ubyte format requires 0 <= number <= 255");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
522 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
523 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
524 *p = (char)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
525 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
526 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
527
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
528 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
529 np_char(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
530 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
531 if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
532 PyErr_SetString(StructError,
67181
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66555
diff changeset
533 "char format requires a bytes object of length 1");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
534 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
535 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
536 *p = *PyBytes_AsString(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
537 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
538 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
539
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
540 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
541 np_short(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
542 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
543 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
544 short y;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
545 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
546 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
547 if (x < SHRT_MIN || x > SHRT_MAX){
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
548 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
549 "short format requires " STRINGIFY(SHRT_MIN)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
550 " <= number <= " STRINGIFY(SHRT_MAX));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
551 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
552 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
553 y = (short)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
554 memcpy(p, (char *)&y, sizeof y);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
555 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
556 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
557
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
558 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
559 np_ushort(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
560 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
561 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
562 unsigned short y;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
563 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
564 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
565 if (x < 0 || x > USHRT_MAX){
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
566 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
567 "ushort format requires 0 <= number <= " STRINGIFY(USHRT_MAX));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
568 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
569 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
570 y = (unsigned short)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
571 memcpy(p, (char *)&y, sizeof y);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
572 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
573 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
574
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
575 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
576 np_int(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
577 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
578 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
579 int y;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
580 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
581 return -1;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
582 #if (SIZEOF_LONG > SIZEOF_INT)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
583 if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
584 RANGE_ERROR(x, f, 0, -1);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
585 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
586 y = (int)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
587 memcpy(p, (char *)&y, sizeof y);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
588 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
589 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
590
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
591 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
592 np_uint(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
593 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
594 unsigned long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
595 unsigned int y;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
596 if (get_ulong(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
597 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
598 y = (unsigned int)x;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
599 #if (SIZEOF_LONG > SIZEOF_INT)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
600 if (x > ((unsigned long)UINT_MAX))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
601 RANGE_ERROR(y, f, 1, -1);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
602 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
603 memcpy(p, (char *)&y, sizeof y);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
604 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
605 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
606
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
607 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
608 np_long(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
609 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
610 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
611 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
612 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
613 memcpy(p, (char *)&x, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
614 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
615 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
616
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
617 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
618 np_ulong(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
619 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
620 unsigned long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
621 if (get_ulong(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
622 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
623 memcpy(p, (char *)&x, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
624 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
625 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
626
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
627 static int
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
628 np_ssize_t(char *p, PyObject *v, const formatdef *f)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
629 {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
630 Py_ssize_t x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
631 if (get_ssize_t(v, &x) < 0)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
632 return -1;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
633 memcpy(p, (char *)&x, sizeof x);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
634 return 0;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
635 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
636
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
637 static int
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
638 np_size_t(char *p, PyObject *v, const formatdef *f)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
639 {
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
640 size_t x;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
641 if (get_size_t(v, &x) < 0)
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
642 return -1;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
643 memcpy(p, (char *)&x, sizeof x);
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
644 return 0;
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
645 }
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
646
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
647 #ifdef HAVE_LONG_LONG
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
648
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
649 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
650 np_longlong(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
651 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
652 PY_LONG_LONG x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
653 if (get_longlong(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
654 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
655 memcpy(p, (char *)&x, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
656 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
657 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
658
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
659 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
660 np_ulonglong(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
661 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
662 unsigned PY_LONG_LONG x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
663 if (get_ulonglong(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
664 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
665 memcpy(p, (char *)&x, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
666 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
667 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
668 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
669
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
670
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
671 static int
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
672 np_bool(char *p, PyObject *v, const formatdef *f)
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
673 {
62855
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
674 int y;
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
675 BOOL_TYPE x;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
676 y = PyObject_IsTrue(v);
62855
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
677 if (y < 0)
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
678 return -1;
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
679 x = y;
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
680 memcpy(p, (char *)&x, sizeof x);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
681 return 0;
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
682 }
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
683
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
684 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
685 np_float(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
686 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
687 float x = (float)PyFloat_AsDouble(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
688 if (x == -1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
689 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
690 "required argument is not a float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
691 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
692 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
693 memcpy(p, (char *)&x, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
694 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
695 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
696
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
697 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
698 np_double(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
699 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
700 double x = PyFloat_AsDouble(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
701 if (x == -1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
702 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
703 "required argument is not a float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
704 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
705 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
706 memcpy(p, (char *)&x, sizeof(double));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
707 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
708 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
709
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
710 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
711 np_void_p(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
712 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
713 void *x;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
714
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
715 v = get_pylong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
716 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
717 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
718 assert(PyLong_Check(v));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
719 x = PyLong_AsVoidPtr(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
720 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
721 if (x == NULL && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
722 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
723 memcpy(p, (char *)&x, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
724 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
725 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
726
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
727 static formatdef native_table[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
728 {'x', sizeof(char), 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
729 {'b', sizeof(char), 0, nu_byte, np_byte},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
730 {'B', sizeof(char), 0, nu_ubyte, np_ubyte},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
731 {'c', sizeof(char), 0, nu_char, np_char},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
732 {'s', sizeof(char), 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
733 {'p', sizeof(char), 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
734 {'h', sizeof(short), SHORT_ALIGN, nu_short, np_short},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
735 {'H', sizeof(short), SHORT_ALIGN, nu_ushort, np_ushort},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
736 {'i', sizeof(int), INT_ALIGN, nu_int, np_int},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
737 {'I', sizeof(int), INT_ALIGN, nu_uint, np_uint},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
738 {'l', sizeof(long), LONG_ALIGN, nu_long, np_long},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
739 {'L', sizeof(long), LONG_ALIGN, nu_ulong, np_ulong},
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
740 {'n', sizeof(size_t), SIZE_T_ALIGN, nu_ssize_t, np_ssize_t},
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
741 {'N', sizeof(size_t), SIZE_T_ALIGN, nu_size_t, np_size_t},
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
742 #ifdef HAVE_LONG_LONG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
743 {'q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_longlong, np_longlong},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
744 {'Q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong},
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
745 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
746 {'?', sizeof(BOOL_TYPE), BOOL_ALIGN, nu_bool, np_bool},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
747 {'f', sizeof(float), FLOAT_ALIGN, nu_float, np_float},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
748 {'d', sizeof(double), DOUBLE_ALIGN, nu_double, np_double},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
749 {'P', sizeof(void *), VOID_P_ALIGN, nu_void_p, np_void_p},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
750 {0}
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
751 };
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
752
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
753 /* Big-endian routines. *****************************************************/
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
754
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
755 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
756 bu_int(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
757 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
758 long x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
759 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
760 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
761 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
762 x = (x<<8) | *bytes++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
763 } while (--i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
764 /* Extend the sign bit. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
765 if (SIZEOF_LONG > f->size)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
766 x |= -(x & (1L << ((8 * f->size) - 1)));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
767 return PyLong_FromLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
768 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
769
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
770 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
771 bu_uint(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
772 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
773 unsigned long x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
774 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
775 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
776 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
777 x = (x<<8) | *bytes++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
778 } while (--i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
779 if (x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
780 return PyLong_FromLong((long)x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
781 return PyLong_FromUnsignedLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
782 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
783
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
784 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
785 bu_longlong(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
786 {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
787 #ifdef HAVE_LONG_LONG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
788 PY_LONG_LONG x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
789 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
790 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
791 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
792 x = (x<<8) | *bytes++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
793 } while (--i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
794 /* Extend the sign bit. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
795 if (SIZEOF_LONG_LONG > f->size)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
796 x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1)));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
797 if (x >= LONG_MIN && x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
798 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
799 return PyLong_FromLongLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
800 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
801 return _PyLong_FromByteArray((const unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
802 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
803 0, /* little-endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
804 1 /* signed */);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
805 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
806 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
807
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
808 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
809 bu_ulonglong(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
810 {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
811 #ifdef HAVE_LONG_LONG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
812 unsigned PY_LONG_LONG x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
813 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
814 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
815 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
816 x = (x<<8) | *bytes++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
817 } while (--i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
818 if (x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
819 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
820 return PyLong_FromUnsignedLongLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
821 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
822 return _PyLong_FromByteArray((const unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
823 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
824 0, /* little-endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
825 0 /* signed */);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
826 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
827 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
828
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
829 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
830 bu_float(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
831 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
832 return unpack_float(p, 0);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
833 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
834
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
835 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
836 bu_double(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
837 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
838 return unpack_double(p, 0);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
839 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
840
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
841 static PyObject *
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
842 bu_bool(const char *p, const formatdef *f)
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
843 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
844 char x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
845 memcpy((char *)&x, p, sizeof x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
846 return PyBool_FromLong(x != 0);
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
847 }
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
848
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
849 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
850 bp_int(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
851 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
852 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
853 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
854 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
855 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
856 i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
857 if (i != SIZEOF_LONG) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
858 if ((i == 2) && (x < -32768 || x > 32767))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
859 RANGE_ERROR(x, f, 0, 0xffffL);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
860 #if (SIZEOF_LONG != 4)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
861 else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
862 RANGE_ERROR(x, f, 0, 0xffffffffL);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
863 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
864 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
865 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
866 p[--i] = (char)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
867 x >>= 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
868 } while (i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
869 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
870 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
871
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
872 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
873 bp_uint(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
874 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
875 unsigned long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
876 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
877 if (get_ulong(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
878 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
879 i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
880 if (i != SIZEOF_LONG) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
881 unsigned long maxint = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
882 maxint <<= (unsigned long)(i * 8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
883 if (x >= maxint)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
884 RANGE_ERROR(x, f, 1, maxint - 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
885 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
886 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
887 p[--i] = (char)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
888 x >>= 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
889 } while (i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
890 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
891 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
892
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
893 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
894 bp_longlong(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
895 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
896 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
897 v = get_pylong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
898 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
899 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
900 res = _PyLong_AsByteArray((PyLongObject *)v,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
901 (unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
902 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
903 0, /* little_endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
904 1 /* signed */);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
905 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
906 return res;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
907 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
908
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
909 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
910 bp_ulonglong(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
911 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
912 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
913 v = get_pylong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
914 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
915 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
916 res = _PyLong_AsByteArray((PyLongObject *)v,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
917 (unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
918 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
919 0, /* little_endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
920 0 /* signed */);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
921 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
922 return res;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
923 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
924
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
925 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
926 bp_float(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
927 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
928 double x = PyFloat_AsDouble(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
929 if (x == -1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
930 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
931 "required argument is not a float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
932 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
933 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
934 return _PyFloat_Pack4(x, (unsigned char *)p, 0);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
935 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
936
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
937 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
938 bp_double(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
939 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
940 double x = PyFloat_AsDouble(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
941 if (x == -1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
942 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
943 "required argument is not a float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
944 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
945 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
946 return _PyFloat_Pack8(x, (unsigned char *)p, 0);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
947 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
948
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
949 static int
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
950 bp_bool(char *p, PyObject *v, const formatdef *f)
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
951 {
63066
68036f2b5ac8 Merged revisions 82941 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62855
diff changeset
952 int y;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
953 y = PyObject_IsTrue(v);
62855
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
954 if (y < 0)
55a024f51524 Merged revisions 82628,82630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 62315
diff changeset
955 return -1;
63066
68036f2b5ac8 Merged revisions 82941 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62855
diff changeset
956 *p = (char)y;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
957 return 0;
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
958 }
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40626
diff changeset
959
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
960 static formatdef bigendian_table[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
961 {'x', 1, 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
962 {'b', 1, 0, nu_byte, np_byte},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
963 {'B', 1, 0, nu_ubyte, np_ubyte},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
964 {'c', 1, 0, nu_char, np_char},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
965 {'s', 1, 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
966 {'p', 1, 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
967 {'h', 2, 0, bu_int, bp_int},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
968 {'H', 2, 0, bu_uint, bp_uint},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
969 {'i', 4, 0, bu_int, bp_int},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
970 {'I', 4, 0, bu_uint, bp_uint},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
971 {'l', 4, 0, bu_int, bp_int},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
972 {'L', 4, 0, bu_uint, bp_uint},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
973 {'q', 8, 0, bu_longlong, bp_longlong},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
974 {'Q', 8, 0, bu_ulonglong, bp_ulonglong},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
975 {'?', 1, 0, bu_bool, bp_bool},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
976 {'f', 4, 0, bu_float, bp_float},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
977 {'d', 8, 0, bu_double, bp_double},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
978 {0}
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
979 };
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
980
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
981 /* Little-endian routines. *****************************************************/
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
982
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
983 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
984 lu_int(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
985 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
986 long x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
987 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
988 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
989 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
990 x = (x<<8) | bytes[--i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
991 } while (i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
992 /* Extend the sign bit. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
993 if (SIZEOF_LONG > f->size)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
994 x |= -(x & (1L << ((8 * f->size) - 1)));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
995 return PyLong_FromLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
996 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
997
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
998 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
999 lu_uint(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1000 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1001 unsigned long x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1002 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1003 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1004 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1005 x = (x<<8) | bytes[--i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1006 } while (i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1007 if (x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1008 return PyLong_FromLong((long)x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1009 return PyLong_FromUnsignedLong((long)x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1010 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1011
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1012 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1013 lu_longlong(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1014 {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1015 #ifdef HAVE_LONG_LONG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1016 PY_LONG_LONG x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1017 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1018 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1019 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1020 x = (x<<8) | bytes[--i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1021 } while (i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1022 /* Extend the sign bit. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1023 if (SIZEOF_LONG_LONG > f->size)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1024 x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1)));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1025 if (x >= LONG_MIN && x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1026 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1027 return PyLong_FromLongLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1028 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1029 return _PyLong_FromByteArray((const unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1030 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1031 1, /* little-endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1032 1 /* signed */);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1033 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1034 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1035
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1036 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1037 lu_ulonglong(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1038 {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1039 #ifdef HAVE_LONG_LONG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1040 unsigned PY_LONG_LONG x = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1041 Py_ssize_t i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1042 const unsigned char *bytes = (const unsigned char *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1043 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1044 x = (x<<8) | bytes[--i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1045 } while (i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1046 if (x <= LONG_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1047 return PyLong_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1048 return PyLong_FromUnsignedLongLong(x);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1049 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1050 return _PyLong_FromByteArray((const unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1051 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1052 1, /* little-endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1053 0 /* signed */);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1054 #endif
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1055 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1056
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1057 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1058 lu_float(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1059 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1060 return unpack_float(p, 1);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1061 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1062
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1063 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1064 lu_double(const char *p, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1065 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1066 return unpack_double(p, 1);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1067 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1068
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1069 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1070 lp_int(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1071 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1072 long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1073 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1074 if (get_long(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1075 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1076 i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1077 if (i != SIZEOF_LONG) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1078 if ((i == 2) && (x < -32768 || x > 32767))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1079 RANGE_ERROR(x, f, 0, 0xffffL);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1080 #if (SIZEOF_LONG != 4)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1081 else if ((i == 4) && (x < -2147483648L || x > 2147483647L))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1082 RANGE_ERROR(x, f, 0, 0xffffffffL);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1083 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1084 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1085 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1086 *p++ = (char)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1087 x >>= 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1088 } while (--i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1089 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1090 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1091
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1092 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1093 lp_uint(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1094 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1095 unsigned long x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1096 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1097 if (get_ulong(v, &x) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1098 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1099 i = f->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1100 if (i != SIZEOF_LONG) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1101 unsigned long maxint = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1102 maxint <<= (unsigned long)(i * 8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1103 if (x >= maxint)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1104 RANGE_ERROR(x, f, 1, maxint - 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1105 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1106 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1107 *p++ = (char)x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1108 x >>= 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1109 } while (--i > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1110 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1111 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1112
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1113 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1114 lp_longlong(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1115 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1116 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1117 v = get_pylong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1118 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1119 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1120 res = _PyLong_AsByteArray((PyLongObject*)v,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1121 (unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1122 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1123 1, /* little_endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1124 1 /* signed */);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1125 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1126 return res;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1127 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1128
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1129 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1130 lp_ulonglong(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1131 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1132 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1133 v = get_pylong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1134 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1135 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1136 res = _PyLong_AsByteArray((PyLongObject*)v,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1137 (unsigned char *)p,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1138 8,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1139 1, /* little_endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1140 0 /* signed */);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1141 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1142 return res;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1143 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1144
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1145 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1146 lp_float(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1147 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1148 double x = PyFloat_AsDouble(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1149 if (x == -1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1150 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1151 "required argument is not a float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1152 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1153 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1154 return _PyFloat_Pack4(x, (unsigned char *)p, 1);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1155 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1156
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1157 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1158 lp_double(char *p, PyObject *v, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1159 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1160 double x = PyFloat_AsDouble(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1161 if (x == -1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1162 PyErr_SetString(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1163 "required argument is not a float");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1164 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1165 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1166 return _PyFloat_Pack8(x, (unsigned char *)p, 1);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1167 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1168
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1169 static formatdef lilendian_table[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1170 {'x', 1, 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1171 {'b', 1, 0, nu_byte, np_byte},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1172 {'B', 1, 0, nu_ubyte, np_ubyte},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1173 {'c', 1, 0, nu_char, np_char},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1174 {'s', 1, 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1175 {'p', 1, 0, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1176 {'h', 2, 0, lu_int, lp_int},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1177 {'H', 2, 0, lu_uint, lp_uint},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1178 {'i', 4, 0, lu_int, lp_int},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1179 {'I', 4, 0, lu_uint, lp_uint},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1180 {'l', 4, 0, lu_int, lp_int},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1181 {'L', 4, 0, lu_uint, lp_uint},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1182 {'q', 8, 0, lu_longlong, lp_longlong},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1183 {'Q', 8, 0, lu_ulonglong, lp_ulonglong},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1184 {'?', 1, 0, bu_bool, bp_bool}, /* Std rep not endian dep,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1185 but potentially different from native rep -- reuse bx_bool funcs. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1186 {'f', 4, 0, lu_float, lp_float},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1187 {'d', 8, 0, lu_double, lp_double},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1188 {0}
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1189 };
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1190
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1191
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1192 static const formatdef *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1193 whichtable(char **pfmt)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1194 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1195 const char *fmt = (*pfmt)++; /* May be backed out of later */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1196 switch (*fmt) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1197 case '<':
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1198 return lilendian_table;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1199 case '>':
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1200 case '!': /* Network byte order is big-endian */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1201 return bigendian_table;
68488
0991b40e895d #11515: fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 63299
diff changeset
1202 case '=': { /* Host byte order -- different from native in alignment! */
79803
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
1203 #if PY_LITTLE_ENDIAN
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
1204 return lilendian_table;
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
1205 #else
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
1206 return bigendian_table;
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
1207 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1208 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1209 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1210 --*pfmt; /* Back out of pointer increment */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1211 /* Fall through */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1212 case '@':
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1213 return native_table;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1214 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1215 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1216
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1217
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1218 /* Get the table entry for a format code */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1219
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1220 static const formatdef *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1221 getentry(int c, const formatdef *f)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1222 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1223 for (; f->format != '\0'; f++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1224 if (f->format == c) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1225 return f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1226 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1227 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1228 PyErr_SetString(StructError, "bad char in struct format");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1229 return NULL;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1230 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1231
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1232
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1233 /* Align a size according to a format code. Return -1 on overflow. */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1234
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1235 static Py_ssize_t
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1236 align(Py_ssize_t size, char c, const formatdef *e)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1237 {
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1238 Py_ssize_t extra;
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1239
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1240 if (e->format == c) {
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1241 if (e->alignment && size > 0) {
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1242 extra = (e->alignment - 1) - (size - 1) % (e->alignment);
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1243 if (extra > PY_SSIZE_T_MAX - size)
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1244 return -1;
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1245 size += extra;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1246 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1247 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1248 return size;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1249 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1250
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1251 /*
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1252 * Struct object implementation.
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1253 */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1254
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1255 /* calculate the size of a format string */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1256
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1257 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1258 prepare_s(PyStructObject *self)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1259 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1260 const formatdef *f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1261 const formatdef *e;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1262 formatcode *codes;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1263
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1264 const char *s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1265 const char *fmt;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1266 char c;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1267 Py_ssize_t size, len, ncodes, num, itemsize;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1268
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1269 fmt = PyBytes_AS_STRING(self->s_format);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1270
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1271 f = whichtable((char **)&fmt);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1272
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1273 s = fmt;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1274 size = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1275 len = 0;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1276 ncodes = 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1277 while ((c = *s++) != '\0') {
82110
38830281d43b Issue #17173: Remove uses of locale-dependent C functions (isalpha() etc.) in the interpreter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80051
diff changeset
1278 if (Py_ISSPACE(Py_CHARMASK(c)))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1279 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1280 if ('0' <= c && c <= '9') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1281 num = c - '0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1282 while ('0' <= (c = *s++) && c <= '9') {
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1283 /* overflow-safe version of
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1284 if (num*10 + (c - '0') > PY_SSIZE_T_MAX) { ... } */
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1285 if (num >= PY_SSIZE_T_MAX / 10 && (
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1286 num > PY_SSIZE_T_MAX / 10 ||
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1287 (c - '0') > PY_SSIZE_T_MAX % 10))
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1288 goto overflow;
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1289 num = num*10 + (c - '0');
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1290 }
62243
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
1291 if (c == '\0') {
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
1292 PyErr_SetString(StructError,
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
1293 "repeat count given without format specifier");
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
1294 return -1;
3ba1b5b4c108 Issue #3129: Trailing digits in format string are no longer ignored.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
1295 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1296 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1297 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1298 num = 1;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1299
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1300 e = getentry(c, f);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1301 if (e == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1302 return -1;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1303
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1304 switch (c) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1305 case 's': /* fall through */
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1306 case 'p': len++; ncodes++; break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1307 case 'x': break;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1308 default: len += num; if (num) ncodes++; break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1309 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1310
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1311 itemsize = e->size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1312 size = align(size, c, e);
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1313 if (size == -1)
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1314 goto overflow;
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1315
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1316 /* if (size + num * itemsize > PY_SSIZE_T_MAX) { ... } */
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1317 if (num > (PY_SSIZE_T_MAX - size) / itemsize)
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1318 goto overflow;
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1319 size += num * itemsize;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1320 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1321
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1322 /* check for overflow */
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1323 if ((ncodes + 1) > (PY_SSIZE_T_MAX / sizeof(formatcode))) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1324 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1325 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1326 }
48321
f6726f32ef70 Merged revisions 64119,64147,64150,64165,64219-64221,64229-64230,64233,64235,64253,64278,64280,64301,64303,64320,64328,64338-64339 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
1327
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1328 self->s_size = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1329 self->s_len = len;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1330 codes = PyMem_MALLOC((ncodes + 1) * sizeof(formatcode));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1331 if (codes == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1332 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1333 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1334 }
63299
902131b31922 Merged revisions 83239 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 63066
diff changeset
1335 /* Free any s_codes value left over from a previous initialization. */
902131b31922 Merged revisions 83239 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 63066
diff changeset
1336 if (self->s_codes != NULL)
902131b31922 Merged revisions 83239 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 63066
diff changeset
1337 PyMem_FREE(self->s_codes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1338 self->s_codes = codes;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1339
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1340 s = fmt;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1341 size = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1342 while ((c = *s++) != '\0') {
82110
38830281d43b Issue #17173: Remove uses of locale-dependent C functions (isalpha() etc.) in the interpreter.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80051
diff changeset
1343 if (Py_ISSPACE(Py_CHARMASK(c)))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1344 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1345 if ('0' <= c && c <= '9') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1346 num = c - '0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1347 while ('0' <= (c = *s++) && c <= '9')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1348 num = num*10 + (c - '0');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1349 if (c == '\0')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1350 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1351 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1352 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1353 num = 1;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1354
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1355 e = getentry(c, f);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1356
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1357 size = align(size, c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1358 if (c == 's' || c == 'p') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1359 codes->offset = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1360 codes->size = num;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1361 codes->fmtdef = e;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1362 codes->repeat = 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1363 codes++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1364 size += num;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1365 } else if (c == 'x') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1366 size += num;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1367 } else if (num) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1368 codes->offset = size;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1369 codes->size = e->size;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1370 codes->fmtdef = e;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1371 codes->repeat = num;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1372 codes++;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1373 size += e->size * num;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1374 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1375 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1376 codes->fmtdef = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1377 codes->offset = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1378 codes->size = 0;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1379 codes->repeat = 0;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1380
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1381 return 0;
62251
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1382
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1383 overflow:
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1384 PyErr_SetString(StructError,
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1385 "total struct size too long");
50c239174976 Merged revisions 81897-81898,81902 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61467
diff changeset
1386 return -1;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1387 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1388
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1389 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1390 s_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1391 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1392 PyObject *self;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1393
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1394 assert(type != NULL && type->tp_alloc != NULL);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1395
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1396 self = type->tp_alloc(type, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1397 if (self != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1398 PyStructObject *s = (PyStructObject*)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1399 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1400 s->s_format = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1401 s->s_codes = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1402 s->s_size = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1403 s->s_len = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1404 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1405 return self;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1406 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1407
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1408 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1409 s_init(PyObject *self, PyObject *args, PyObject *kwds)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1410 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1411 PyStructObject *soself = (PyStructObject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1412 PyObject *o_format = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1413 int ret = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1414 static char *kwlist[] = {"format", 0};
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1415
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1416 assert(PyStruct_Check(self));
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1417
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1418 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:Struct", kwlist,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1419 &o_format))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1420 return -1;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1421
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1422 if (PyUnicode_Check(o_format)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1423 o_format = PyUnicode_AsASCIIString(o_format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1424 if (o_format == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1425 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1426 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1427 /* XXX support buffer interface, too */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1428 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1429 Py_INCREF(o_format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1430 }
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
1431
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1432 if (!PyBytes_Check(o_format)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1433 Py_DECREF(o_format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1434 PyErr_Format(PyExc_TypeError,
67181
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66555
diff changeset
1435 "Struct() argument 1 must be a bytes object, not %.200s",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1436 Py_TYPE(o_format)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1437 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1438 }
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
1439
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1440 Py_CLEAR(soself->s_format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1441 soself->s_format = o_format;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1442
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1443 ret = prepare_s(soself);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1444 return ret;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1445 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1446
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1447 static void
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1448 s_dealloc(PyStructObject *s)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1449 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1450 if (s->weakreflist != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1451 PyObject_ClearWeakRefs((PyObject *)s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1452 if (s->s_codes != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1453 PyMem_FREE(s->s_codes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1454 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1455 Py_XDECREF(s->s_format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1456 Py_TYPE(s)->tp_free((PyObject *)s);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1457 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1458
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1459 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1460 s_unpack_internal(PyStructObject *soself, char *startfrom) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1461 formatcode *code;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1462 Py_ssize_t i = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1463 PyObject *result = PyTuple_New(soself->s_len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1464 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1465 return NULL;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1466
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1467 for (code = soself->s_codes; code->fmtdef != NULL; code++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1468 const formatdef *e = code->fmtdef;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1469 const char *res = startfrom + code->offset;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1470 Py_ssize_t j = code->repeat;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1471 while (j--) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1472 PyObject *v;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1473 if (e->format == 's') {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1474 v = PyBytes_FromStringAndSize(res, code->size);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1475 } else if (e->format == 'p') {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1476 Py_ssize_t n = *(unsigned char*)res;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1477 if (n >= code->size)
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1478 n = code->size - 1;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1479 v = PyBytes_FromStringAndSize(res + 1, n);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1480 } else {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1481 v = e->unpack(res, e);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1482 }
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1483 if (v == NULL)
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1484 goto fail;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1485 PyTuple_SET_ITEM(result, i++, v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1486 res += code->size;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1487 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1488 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1489
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1490 return result;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1491 fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1492 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1493 return NULL;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1494 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1495
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1496
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1497 PyDoc_STRVAR(s_unpack__doc__,
41453
35f9ffc6b510 struct.unpack() allows a bytes string too (if it has the right size).
Guido van Rossum <guido@python.org>
parents: 40737
diff changeset
1498 "S.unpack(buffer) -> (v1, v2, ...)\n\
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1499 \n\
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1500 Return a tuple containing values unpacked according to the format\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1501 string S.format. Requires len(buffer) == S.size. See help(struct)\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1502 for more on format strings.");
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1503
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1504 static PyObject *
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
1505 s_unpack(PyObject *self, PyObject *input)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1506 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1507 Py_buffer vbuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1508 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1509 PyStructObject *soself = (PyStructObject *)self;
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
1510
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1511 assert(PyStruct_Check(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1512 assert(soself->s_codes != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1513 if (PyObject_GetBuffer(input, &vbuf, PyBUF_SIMPLE) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1514 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1515 if (vbuf.len != soself->s_size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1516 PyErr_Format(StructError,
67181
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66555
diff changeset
1517 "unpack requires a bytes object of length %zd",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1518 soself->s_size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1519 PyBuffer_Release(&vbuf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1520 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1521 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1522 result = s_unpack_internal(soself, vbuf.buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1523 PyBuffer_Release(&vbuf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1524 return result;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1525 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1526
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1527 PyDoc_STRVAR(s_unpack_from__doc__,
62315
4eac135a33af Merged revisions 81965 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62311
diff changeset
1528 "S.unpack_from(buffer, offset=0) -> (v1, v2, ...)\n\
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1529 \n\
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1530 Return a tuple containing values unpacked according to the format\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1531 string S.format. Requires len(buffer[offset:]) >= S.size. See\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1532 help(struct) for more on format strings.");
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1533
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1534 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1535 s_unpack_from(PyObject *self, PyObject *args, PyObject *kwds)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1536 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1537 static char *kwlist[] = {"buffer", "offset", 0};
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
1538
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1539 PyObject *input;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1540 Py_ssize_t offset = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1541 Py_buffer vbuf;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1542 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1543 PyStructObject *soself = (PyStructObject *)self;
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
1544
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1545 assert(PyStruct_Check(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1546 assert(soself->s_codes != NULL);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1547
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1548 if (!PyArg_ParseTupleAndKeywords(args, kwds,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1549 "O|n:unpack_from", kwlist,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1550 &input, &offset))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1551 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1552 if (PyObject_GetBuffer(input, &vbuf, PyBUF_SIMPLE) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1553 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1554 if (offset < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1555 offset += vbuf.len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1556 if (offset < 0 || vbuf.len - offset < soself->s_size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1557 PyErr_Format(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1558 "unpack_from requires a buffer of at least %zd bytes",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1559 soself->s_size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1560 PyBuffer_Release(&vbuf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1561 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1562 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1563 result = s_unpack_internal(soself, (char*)vbuf.buf + offset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1564 PyBuffer_Release(&vbuf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1565 return result;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1566 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1567
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1568
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1569 /* Unpack iterator type */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1570
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1571 typedef struct {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1572 PyObject_HEAD
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1573 PyStructObject *so;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1574 Py_buffer buf;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1575 Py_ssize_t index;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1576 } unpackiterobject;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1577
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1578 static void
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1579 unpackiter_dealloc(unpackiterobject *self)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1580 {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1581 Py_XDECREF(self->so);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1582 PyBuffer_Release(&self->buf);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1583 PyObject_GC_Del(self);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1584 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1585
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1586 static int
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1587 unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1588 {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1589 Py_VISIT(self->so);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1590 Py_VISIT(self->buf.obj);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1591 return 0;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1592 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1593
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1594 static PyObject *
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1595 unpackiter_len(unpackiterobject *self)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1596 {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1597 Py_ssize_t len;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1598 if (self->so == NULL)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1599 len = 0;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1600 else
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1601 len = (self->buf.len - self->index) / self->so->s_size;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1602 return PyLong_FromSsize_t(len);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1603 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1604
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1605 static PyMethodDef unpackiter_methods[] = {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1606 {"__length_hint__", (PyCFunction) unpackiter_len, METH_NOARGS, NULL},
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1607 {NULL, NULL} /* sentinel */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1608 };
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1609
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1610 static PyObject *
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1611 unpackiter_iternext(unpackiterobject *self)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1612 {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1613 PyObject *result;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1614 if (self->so == NULL)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1615 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1616 if (self->index >= self->buf.len) {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1617 /* Iterator exhausted */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1618 Py_CLEAR(self->so);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1619 PyBuffer_Release(&self->buf);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1620 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1621 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1622 assert(self->index + self->so->s_size <= self->buf.len);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1623 result = s_unpack_internal(self->so,
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1624 (char*) self->buf.buf + self->index);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1625 self->index += self->so->s_size;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1626 return result;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1627 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1628
87424
37e4d14a8bad - Modules/_struct.c (unpackiter_type): Define static.
doko@ubuntu.com
parents: 85419
diff changeset
1629 static PyTypeObject unpackiter_type = {
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1630 PyVarObject_HEAD_INIT(&PyType_Type, 0)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1631 "unpack_iterator", /* tp_name */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1632 sizeof(unpackiterobject), /* tp_basicsize */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1633 0, /* tp_itemsize */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1634 (destructor)unpackiter_dealloc, /* tp_dealloc */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1635 0, /* tp_print */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1636 0, /* tp_getattr */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1637 0, /* tp_setattr */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1638 0, /* tp_reserved */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1639 0, /* tp_repr */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1640 0, /* tp_as_number */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1641 0, /* tp_as_sequence */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1642 0, /* tp_as_mapping */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1643 0, /* tp_hash */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1644 0, /* tp_call */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1645 0, /* tp_str */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1646 PyObject_GenericGetAttr, /* tp_getattro */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1647 0, /* tp_setattro */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1648 0, /* tp_as_buffer */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1649 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1650 0, /* tp_doc */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1651 (traverseproc)unpackiter_traverse, /* tp_traverse */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1652 0, /* tp_clear */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1653 0, /* tp_richcompare */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1654 0, /* tp_weaklistoffset */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1655 PyObject_SelfIter, /* tp_iter */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1656 (iternextfunc)unpackiter_iternext, /* tp_iternext */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1657 unpackiter_methods /* tp_methods */
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1658 };
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1659
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1660 PyDoc_STRVAR(s_iter_unpack__doc__,
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1661 "S.iter_unpack(buffer) -> iterator(v1, v2, ...)\n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1662 \n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1663 Return an iterator yielding tuples unpacked from the given bytes\n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1664 source, like a repeated invocation of unpack_from(). Requires\n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1665 that the bytes length be a multiple of the struct size.");
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1666
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1667 static PyObject *
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1668 s_iter_unpack(PyObject *_so, PyObject *input)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1669 {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1670 PyStructObject *so = (PyStructObject *) _so;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1671 unpackiterobject *self;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1672
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1673 assert(PyStruct_Check(_so));
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1674 assert(so->s_codes != NULL);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1675
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1676 if (so->s_size == 0) {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1677 PyErr_Format(StructError,
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1678 "cannot iteratively unpack with a struct of length 0");
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1679 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1680 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1681
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1682 self = (unpackiterobject *) PyType_GenericAlloc(&unpackiter_type, 0);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1683 if (self == NULL)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1684 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1685
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1686 if (PyObject_GetBuffer(input, &self->buf, PyBUF_SIMPLE) < 0) {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1687 Py_DECREF(self);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1688 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1689 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1690 if (self->buf.len % so->s_size != 0) {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1691 PyErr_Format(StructError,
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1692 "iterative unpacking requires a bytes length "
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1693 "multiple of %zd",
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1694 so->s_size);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1695 Py_DECREF(self);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1696 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1697 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1698 Py_INCREF(so);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1699 self->so = so;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1700 self->index = 0;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1701 return (PyObject *) self;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1702 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1703
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1704
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1705 /*
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1706 * Guts of the pack function.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1707 *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1708 * Takes a struct object, a tuple of arguments, and offset in that tuple of
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1709 * argument for where to start processing the arguments for packing, and a
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1710 * character buffer for writing the packed string. The caller must insure
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1711 * that the buffer may contain the required length for packing the arguments.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1712 * 0 is returned on success, 1 is returned if there is an error.
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1713 *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1714 */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1715 static int
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1716 s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1717 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1718 formatcode *code;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1719 /* XXX(nnorwitz): why does i need to be a local? can we use
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1720 the offset parameter or do we need the wider width? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1721 Py_ssize_t i;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1722
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1723 memset(buf, '\0', soself->s_size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1724 i = offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1725 for (code = soself->s_codes; code->fmtdef != NULL; code++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1726 const formatdef *e = code->fmtdef;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1727 char *res = buf + code->offset;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1728 Py_ssize_t j = code->repeat;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1729 while (j--) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1730 PyObject *v = PyTuple_GET_ITEM(args, i++);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1731 if (e->format == 's') {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1732 Py_ssize_t n;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1733 int isstring;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1734 void *p;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1735 isstring = PyBytes_Check(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1736 if (!isstring && !PyByteArray_Check(v)) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1737 PyErr_SetString(StructError,
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1738 "argument for 's' must be a bytes object");
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1739 return -1;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1740 }
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1741 if (isstring) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1742 n = PyBytes_GET_SIZE(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1743 p = PyBytes_AS_STRING(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1744 }
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1745 else {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1746 n = PyByteArray_GET_SIZE(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1747 p = PyByteArray_AS_STRING(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1748 }
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1749 if (n > code->size)
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1750 n = code->size;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1751 if (n > 0)
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1752 memcpy(res, p, n);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1753 } else if (e->format == 'p') {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1754 Py_ssize_t n;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1755 int isstring;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1756 void *p;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1757 isstring = PyBytes_Check(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1758 if (!isstring && !PyByteArray_Check(v)) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1759 PyErr_SetString(StructError,
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1760 "argument for 'p' must be a bytes object");
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1761 return -1;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1762 }
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1763 if (isstring) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1764 n = PyBytes_GET_SIZE(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1765 p = PyBytes_AS_STRING(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1766 }
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1767 else {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1768 n = PyByteArray_GET_SIZE(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1769 p = PyByteArray_AS_STRING(v);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1770 }
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1771 if (n > (code->size - 1))
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1772 n = code->size - 1;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1773 if (n > 0)
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1774 memcpy(res + 1, p, n);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1775 if (n > 255)
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1776 n = 255;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1777 *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1778 } else {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1779 if (e->pack(res, v, e) < 0) {
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1780 if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError))
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1781 PyErr_SetString(StructError,
85419
0872257752c2 Issue #18783: Removed existing mentions of Python long type in docstrings,
Serhiy Storchaka <storchaka@gmail.com>
parents: 83807 85418
diff changeset
1782 "int too large to convert");
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1783 return -1;
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1784 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1785 }
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1786 res += code->size;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1787 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1788 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1789
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1790 /* Success */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1791 return 0;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1792 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1793
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1794
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1795 PyDoc_STRVAR(s_pack__doc__,
48591
1de718a31004 update the struct documentation to refer to bytes
Benjamin Peterson <benjamin@python.org>
parents: 48321
diff changeset
1796 "S.pack(v1, v2, ...) -> bytes\n\
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1797 \n\
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1798 Return a bytes object containing values v1, v2, ... packed according\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1799 to the format string S.format. See help(struct) for more on format\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1800 strings.");
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1801
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1802 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1803 s_pack(PyObject *self, PyObject *args)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1804 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1805 PyStructObject *soself;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1806 PyObject *result;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1807
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1808 /* Validate arguments. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1809 soself = (PyStructObject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1810 assert(PyStruct_Check(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1811 assert(soself->s_codes != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1812 if (PyTuple_GET_SIZE(args) != soself->s_len)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1813 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1814 PyErr_Format(StructError,
80051
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1815 "pack expected %zd items for packing (got %zd)", soself->s_len, PyTuple_GET_SIZE(args));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1816 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1817 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1818
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1819 /* Allocate a new string */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1820 result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1821 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1822 return NULL;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1823
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1824 /* Call the guts */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1825 if ( s_pack_internal(soself, args, 0, PyBytes_AS_STRING(result)) != 0 ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1826 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1827 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1828 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1829
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1830 return result;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1831 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1832
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1833 PyDoc_STRVAR(s_pack_into__doc__,
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1834 "S.pack_into(buffer, offset, v1, v2, ...)\n\
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1835 \n\
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1836 Pack the values v1, v2, ... according to the format string S.format\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1837 and write the packed bytes into the writable buffer buf starting at\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1838 offset. Note that the offset is a required argument. See\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
1839 help(struct) for more on format strings.");
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1840
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1841 static PyObject *
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1842 s_pack_into(PyObject *self, PyObject *args)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1843 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1844 PyStructObject *soself;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1845 char *buffer;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1846 Py_ssize_t buffer_len, offset;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1847
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1848 /* Validate arguments. +1 is for the first arg as buffer. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1849 soself = (PyStructObject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1850 assert(PyStruct_Check(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1851 assert(soself->s_codes != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1852 if (PyTuple_GET_SIZE(args) != (soself->s_len + 2))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1853 {
80051
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1854 if (PyTuple_GET_SIZE(args) == 0) {
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1855 PyErr_Format(StructError,
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1856 "pack_into expected buffer argument");
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1857 }
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1858 else if (PyTuple_GET_SIZE(args) == 1) {
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1859 PyErr_Format(StructError,
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1860 "pack_into expected offset argument");
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1861 }
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1862 else {
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1863 PyErr_Format(StructError,
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1864 "pack_into expected %zd items for packing (got %zd)",
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1865 soself->s_len, (PyTuple_GET_SIZE(args) - 2));
a555bd4026b0 #14897: Enhance error messages of struct.pack and struct.pack_into
Petri Lehtinen <petri@digip.org>
parents: 78312
diff changeset
1866 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1867 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1868 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1869
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1870 /* Extract a writable memory buffer from the first argument */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1871 if ( PyObject_AsWriteBuffer(PyTuple_GET_ITEM(args, 0),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1872 (void**)&buffer, &buffer_len) == -1 ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1873 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1874 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1875 assert( buffer_len >= 0 );
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1876
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1877 /* Extract the offset from the first argument */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1878 offset = PyNumber_AsSsize_t(PyTuple_GET_ITEM(args, 1), PyExc_IndexError);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1879 if (offset == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1880 return NULL;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1881
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1882 /* Support negative offsets. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1883 if (offset < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1884 offset += buffer_len;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1885
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1886 /* Check boundaries */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1887 if (offset < 0 || (buffer_len - offset) < soself->s_size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1888 PyErr_Format(StructError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1889 "pack_into requires a buffer of at least %zd bytes",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1890 soself->s_size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1891 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1892 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1893
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1894 /* Call the guts */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1895 if ( s_pack_internal(soself, args, 2, buffer + offset) != 0 ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1896 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1897 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1898
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1899 Py_RETURN_NONE;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1900 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1901
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1902 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1903 s_get_format(PyStructObject *self, void *unused)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1904 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1905 Py_INCREF(self->s_format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1906 return self->s_format;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1907 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1908
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1909 static PyObject *
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1910 s_get_size(PyStructObject *self, void *unused)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1911 {
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43777
diff changeset
1912 return PyLong_FromSsize_t(self->s_size);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1913 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1914
78256
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1915 PyDoc_STRVAR(s_sizeof__doc__,
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1916 "S.__sizeof__() -> size of S in memory, in bytes");
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1917
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1918 static PyObject *
78312
97dd2090a36c Issue #15402: Simplify Struct.__sizeof__ and make tests more precise.
Meador Inge <meadori@gmail.com>
parents: 78256
diff changeset
1919 s_sizeof(PyStructObject *self, void *unused)
78256
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1920 {
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1921 Py_ssize_t size;
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1922 formatcode *code;
78256
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1923
83807
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1924 size = sizeof(PyStructObject) + sizeof(formatcode);
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1925 for (code = self->s_codes; code->fmtdef != NULL; code++)
6707637f68ca Issue #14596: The struct.Struct() objects now use more compact implementation.
Serhiy Storchaka <storchaka@gmail.com>
parents: 83524
diff changeset
1926 size += sizeof(formatcode);
78256
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1927 return PyLong_FromSsize_t(size);
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1928 }
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1929
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1930 /* List of functions */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1931
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1932 static struct PyMethodDef s_methods[] = {
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
1933 {"iter_unpack", s_iter_unpack, METH_O, s_iter_unpack__doc__},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1934 {"pack", s_pack, METH_VARARGS, s_pack__doc__},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1935 {"pack_into", s_pack_into, METH_VARARGS, s_pack_into__doc__},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1936 {"unpack", s_unpack, METH_O, s_unpack__doc__},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1937 {"unpack_from", (PyCFunction)s_unpack_from, METH_VARARGS|METH_KEYWORDS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1938 s_unpack_from__doc__},
78256
3e7b517e1b68 Issue #15402: Add a __sizeof__ method to struct.Struct.
Meador Inge <meadori@gmail.com>
parents: 68489
diff changeset
1939 {"__sizeof__", (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1940 {NULL, NULL} /* sentinel */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1941 };
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1942
67181
b901da561cd1 Issue #10783: struct.pack() doesn't encode implicitly unicode to UTF-8
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66555
diff changeset
1943 PyDoc_STRVAR(s__doc__,
62311
5295b4dbf355 Merged revisions 81961 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62309
diff changeset
1944 "Struct(fmt) --> compiled struct object\n"
5295b4dbf355 Merged revisions 81961 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62309
diff changeset
1945 "\n"
5295b4dbf355 Merged revisions 81961 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62309
diff changeset
1946 "Return a new Struct object which writes and reads binary data according to\n"
5295b4dbf355 Merged revisions 81961 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62309
diff changeset
1947 "the format string fmt. See help(struct) for more on format strings.");
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1948
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1949 #define OFF(x) offsetof(PyStructObject, x)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1950
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1951 static PyGetSetDef s_getsetlist[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1952 {"format", (getter)s_get_format, (setter)NULL, "struct format string", NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1953 {"size", (getter)s_get_size, (setter)NULL, "struct size in bytes", NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1954 {NULL} /* sentinel */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1955 };
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1956
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1957 static
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1958 PyTypeObject PyStructType = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1959 PyVarObject_HEAD_INIT(NULL, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1960 "Struct",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1961 sizeof(PyStructObject),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1962 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1963 (destructor)s_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1964 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1965 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1966 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1967 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1968 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1969 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1970 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1971 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1972 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1973 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1974 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1975 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1976 PyObject_GenericSetAttr, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1977 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1978 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1979 s__doc__, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1980 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1981 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1982 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1983 offsetof(PyStructObject, weakreflist), /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1984 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1985 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1986 s_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1987 NULL, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1988 s_getsetlist, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1989 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1990 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1991 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1992 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1993 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1994 s_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1995 PyType_GenericAlloc,/* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1996 s_new, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
1997 PyObject_Del, /* tp_free */
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1998 };
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1999
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2000
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2001 /* ---- Standalone functions ---- */
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2002
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2003 #define MAXCACHE 100
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2004 static PyObject *cache = NULL;
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2005
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2006 static PyObject *
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2007 cache_struct(PyObject *fmt)
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2008 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2009 PyObject * s_object;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2010
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2011 if (cache == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2012 cache = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2013 if (cache == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2014 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2015 }
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2016
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2017 s_object = PyDict_GetItem(cache, fmt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2018 if (s_object != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2019 Py_INCREF(s_object);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2020 return s_object;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2021 }
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2022
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2023 s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2024 if (s_object != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2025 if (PyDict_Size(cache) >= MAXCACHE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2026 PyDict_Clear(cache);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2027 /* Attempt to cache the result */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2028 if (PyDict_SetItem(cache, fmt, s_object) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2029 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2030 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2031 return s_object;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2032 }
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2033
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2034 PyDoc_STRVAR(clearcache_doc,
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2035 "Clear the internal cache.");
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2036
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2037 static PyObject *
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2038 clearcache(PyObject *self)
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2039 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2040 Py_CLEAR(cache);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2041 Py_RETURN_NONE;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2042 }
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2043
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2044 PyDoc_STRVAR(calcsize_doc,
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2045 "calcsize(fmt) -> integer\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2046 \n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2047 Return size in bytes of the struct described by the format string fmt.");
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2048
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2049 static PyObject *
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2050 calcsize(PyObject *self, PyObject *fmt)
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2051 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2052 Py_ssize_t n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2053 PyObject *s_object = cache_struct(fmt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2054 if (s_object == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2055 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2056 n = ((PyStructObject *)s_object)->s_size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2057 Py_DECREF(s_object);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2058 return PyLong_FromSsize_t(n);
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2059 }
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2060
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2061 PyDoc_STRVAR(pack_doc,
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2062 "pack(fmt, v1, v2, ...) -> bytes\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2063 \n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2064 Return a bytes object containing the values v1, v2, ... packed according\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2065 to the format string fmt. See help(struct) for more on format strings.");
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2066
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2067 static PyObject *
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2068 pack(PyObject *self, PyObject *args)
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2069 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2070 PyObject *s_object, *fmt, *newargs, *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2071 Py_ssize_t n = PyTuple_GET_SIZE(args);
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2072
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2073 if (n == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2074 PyErr_SetString(PyExc_TypeError, "missing format argument");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2075 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2076 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2077 fmt = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2078 newargs = PyTuple_GetSlice(args, 1, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2079 if (newargs == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2080 return NULL;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2081
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2082 s_object = cache_struct(fmt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2083 if (s_object == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2084 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2085 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2086 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2087 result = s_pack(s_object, newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2088 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2089 Py_DECREF(s_object);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2090 return result;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2091 }
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2092
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2093 PyDoc_STRVAR(pack_into_doc,
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2094 "pack_into(fmt, buffer, offset, v1, v2, ...)\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2095 \n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2096 Pack the values v1, v2, ... according to the format string fmt and write\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2097 the packed bytes into the writable buffer buf starting at offset. Note\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2098 that the offset is a required argument. See help(struct) for more\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2099 on format strings.");
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2100
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2101 static PyObject *
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2102 pack_into(PyObject *self, PyObject *args)
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2103 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2104 PyObject *s_object, *fmt, *newargs, *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2105 Py_ssize_t n = PyTuple_GET_SIZE(args);
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2106
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2107 if (n == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2108 PyErr_SetString(PyExc_TypeError, "missing format argument");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2109 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2110 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2111 fmt = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2112 newargs = PyTuple_GetSlice(args, 1, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2113 if (newargs == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2114 return NULL;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2115
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2116 s_object = cache_struct(fmt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2117 if (s_object == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2118 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2119 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2120 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2121 result = s_pack_into(s_object, newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2122 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2123 Py_DECREF(s_object);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2124 return result;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2125 }
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2126
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2127 PyDoc_STRVAR(unpack_doc,
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2128 "unpack(fmt, buffer) -> (v1, v2, ...)\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2129 \n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2130 Return a tuple containing values unpacked according to the format string\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2131 fmt. Requires len(buffer) == calcsize(fmt). See help(struct) for more\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2132 on format strings.");
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2133
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2134 static PyObject *
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2135 unpack(PyObject *self, PyObject *args)
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2136 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2137 PyObject *s_object, *fmt, *inputstr, *result;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2138
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2139 if (!PyArg_UnpackTuple(args, "unpack", 2, 2, &fmt, &inputstr))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2140 return NULL;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2141
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2142 s_object = cache_struct(fmt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2143 if (s_object == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2144 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2145 result = s_unpack(s_object, inputstr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2146 Py_DECREF(s_object);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2147 return result;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2148 }
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2149
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2150 PyDoc_STRVAR(unpack_from_doc,
62315
4eac135a33af Merged revisions 81965 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62311
diff changeset
2151 "unpack_from(fmt, buffer, offset=0) -> (v1, v2, ...)\n\
62309
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2152 \n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2153 Return a tuple containing values unpacked according to the format string\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2154 fmt. Requires len(buffer[offset:]) >= calcsize(fmt). See help(struct)\n\
0f5d114eff01 Merged revisions 81947-81950,81955-81956 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62251
diff changeset
2155 for more on format strings.");
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2156
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2157 static PyObject *
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2158 unpack_from(PyObject *self, PyObject *args, PyObject *kwds)
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2159 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2160 PyObject *s_object, *fmt, *newargs, *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2161 Py_ssize_t n = PyTuple_GET_SIZE(args);
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2162
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2163 if (n == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2164 PyErr_SetString(PyExc_TypeError, "missing format argument");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2165 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2166 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2167 fmt = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2168 newargs = PyTuple_GetSlice(args, 1, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2169 if (newargs == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2170 return NULL;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2171
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2172 s_object = cache_struct(fmt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2173 if (s_object == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2174 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2175 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2176 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2177 result = s_unpack_from(s_object, newargs, kwds);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2178 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2179 Py_DECREF(s_object);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2180 return result;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2181 }
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2182
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2183 PyDoc_STRVAR(iter_unpack_doc,
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2184 "iter_unpack(fmt, buffer) -> iterator(v1, v2, ...)\n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2185 \n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2186 Return an iterator yielding tuples unpacked from the given bytes\n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2187 source according to the format string, like a repeated invocation of\n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2188 unpack_from(). Requires that the bytes length be a multiple of the\n\
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2189 format struct size.");
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2190
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2191 static PyObject *
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2192 iter_unpack(PyObject *self, PyObject *args)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2193 {
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2194 PyObject *s_object, *fmt, *input, *result;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2195
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2196 if (!PyArg_ParseTuple(args, "OO:iter_unpack", &fmt, &input))
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2197 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2198
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2199 s_object = cache_struct(fmt);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2200 if (s_object == NULL)
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2201 return NULL;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2202 result = s_iter_unpack(s_object, input);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2203 Py_DECREF(s_object);
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2204 return result;
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2205 }
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2206
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2207 static struct PyMethodDef module_functions[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2208 {"_clearcache", (PyCFunction)clearcache, METH_NOARGS, clearcache_doc},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
2209 {"calcsize", calcsize, METH_O, calcsize_doc},
83524
d232cff25bbd Issue #17804: New function ``struct.iter_unpack`` allows for streaming struct unpacking.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82112
diff changeset
2210 {"iter_unpack", iter_unpack, METH_VARARGS, iter_unpack_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2211 {"pack", pack, METH_VARARGS, pack_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2212 {"pack_into", pack_into, METH_VARARGS, pack_into_doc},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60312
diff changeset
2213 {"unpack", unpack, METH_VARARGS, unpack_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2214 {"unpack_from", (PyCFunction)unpack_from,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2215 METH_VARARGS|METH_KEYWORDS, unpack_from_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2216 {NULL, NULL} /* sentinel */
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2217 };
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2218
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2219
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2220 /* Module initialization */
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2221
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2222 PyDoc_STRVAR(module_doc,
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2223 "Functions to convert between Python values and C structs.\n\
48591
1de718a31004 update the struct documentation to refer to bytes
Benjamin Peterson <benjamin@python.org>
parents: 48321
diff changeset
2224 Python bytes objects are used to hold the data representing the C struct\n\
56418
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2225 and also as format strings (explained below) to describe the layout of data\n\
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2226 in the C struct.\n\
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2227 \n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2228 The optional first format char indicates byte order, size and alignment:\n\
56418
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2229 @: native order, size & alignment (default)\n\
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2230 =: native order, std. size & alignment\n\
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2231 <: little-endian, std. size & alignment\n\
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2232 >: big-endian, std. size & alignment\n\
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2233 !: same as >\n\
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2234 \n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2235 The remaining chars indicate types of args and must match exactly;\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2236 these can be preceded by a decimal repeat count:\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2237 x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\
56418
dd94f1d8c9a5 Merged revisions 75284 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 55145
diff changeset
2238 ?: _Bool (requires C99; if not available, char is used instead)\n\
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2239 h:short; H:unsigned short; i:int; I:unsigned int;\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2240 l:long; L:unsigned long; f:float; d:double.\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2241 Special cases (preceding decimal count indicates length):\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2242 s:string (array of char); p: pascal string (with count byte).\n\
72749
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
2243 Special cases (only available in native format):\n\
db3e15017172 Issue #3163: The struct module gets new format characters 'n' and 'N'
Antoine Pitrou <solipsis@pitrou.net>
parents: 68489
diff changeset
2244 n:ssize_t; N:size_t;\n\
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2245 P:an integer type that is wide enough to hold a pointer.\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2246 Special case (not in native mode unless 'long long' in platform C):\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2247 q:long long; Q:unsigned long long\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2248 Whitespace between formats is ignored.\n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2249 \n\
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2250 The variable struct.error is an exception raised on errors.\n");
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2251
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2252
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2253 static struct PyModuleDef _structmodule = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2254 PyModuleDef_HEAD_INIT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2255 "_struct",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2256 module_doc,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2257 -1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2258 module_functions,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2259 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2260 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2261 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2262 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2263 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2264
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2265 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
2266 PyInit__struct(void)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2267 {
62287
a490aa303d8a Remove unused variable.
Mark Dickinson <dickinsm@gmail.com>
parents: 62286
diff changeset
2268 PyObject *m;
44460
13aabc23cf2e Merged revisions 59680-59695 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
2269
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2270 m = PyModule_Create(&_structmodule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2271 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2272 return NULL;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2273
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2274 Py_TYPE(&PyStructType) = &PyType_Type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2275 if (PyType_Ready(&PyStructType) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2276 return NULL;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2277
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2278 /* Check endian and swap in faster functions */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2279 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2280 formatdef *native = native_table;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2281 formatdef *other, *ptr;
79803
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
2282 #if PY_LITTLE_ENDIAN
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
2283 other = lilendian_table;
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
2284 #else
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
2285 other = bigendian_table;
d2127cdec10e Issue #16166: Add PY_LITTLE_ENDIAN and PY_BIG_ENDIAN macros and unified
Christian Heimes <christian@cheimes.de>
parents: 78313
diff changeset
2286 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2287 /* Scan through the native table, find a matching
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2288 entry in the endian table and swap in the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2289 native implementations whenever possible
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2290 (64-bit platforms may not have "standard" sizes) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2291 while (native->format != '\0' && other->format != '\0') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2292 ptr = other;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2293 while (ptr->format != '\0') {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2294 if (ptr->format == native->format) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2295 /* Match faster when formats are
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2296 listed in the same order */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2297 if (ptr == other)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2298 other++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2299 /* Only use the trick if the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2300 size matches */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2301 if (ptr->size != native->size)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2302 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2303 /* Skip float and double, could be
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2304 "unknown" float format */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2305 if (ptr->format == 'd' || ptr->format == 'f')
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2306 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2307 ptr->pack = native->pack;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2308 ptr->unpack = native->unpack;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2309 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2310 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2311 ptr++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2312 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2313 native++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2314 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2315 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
2316
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2317 /* Add some symbolic constants to the module */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2318 if (StructError == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2319 StructError = PyErr_NewException("struct.error", NULL, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2320 if (StructError == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2321 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2322 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2323
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2324 Py_INCREF(StructError);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2325 PyModule_AddObject(m, "error", StructError);
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2326
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2327 Py_INCREF((PyObject*)&PyStructType);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2328 PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
2329
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56418
diff changeset
2330 return m;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2331 }