Mercurial > cpython-lru_cache-weakref
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 |
| 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>
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 } |
