Mercurial > cpython-lru_cache-weakref
annotate Objects/unicodeobject.c @ 19780:1cc84dfcd6bd legacy-trunk
Bump version number.
| author | Fred Drake <fdrake@acm.org> |
|---|---|
| date | Thu, 06 Sep 2001 19:02:57 +0000 |
| parents | a80b4b006eb7 |
| children | 8af74f0358ac |
| rev | line source |
|---|---|
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 /* |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 Unicode implementation based on original code by Fredrik Lundh, |
|
12646
17d1a3f1f085
Minimal change so I can add the rest of MAL's checkin message:
Fred Drake <fdrake@acm.org>
parents:
12645
diff
changeset
|
4 modified by Marc-Andre Lemburg <mal@lemburg.com> according to the |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 Unicode Integration Proposal (see file Misc/unicode.txt). |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 |
|
13828
254f8b7c4a83
Changing the CNRI copyright notice according to CNRI's instructions.
Guido van Rossum <guido@python.org>
parents:
13761
diff
changeset
|
7 Copyright (c) Corporation for National Research Initiatives. |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 |
|
16029
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
9 -------------------------------------------------------------------- |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
10 The original string type implementation is: |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
11 |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
12 Copyright (c) 1999 by Secret Labs AB |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
13 Copyright (c) 1999 by Fredrik Lundh |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
14 |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
15 By obtaining, using, and/or copying this software and/or its |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
16 associated documentation, you agree that you have read, understood, |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
17 and will comply with the following terms and conditions: |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
18 |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
19 Permission to use, copy, modify, and distribute this software and its |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
20 associated documentation for any purpose and without fee is hereby |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
21 granted, provided that the above copyright notice appears in all |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
22 copies, and that both that copyright notice and this permission notice |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
23 appear in supporting documentation, and that the name of Secret Labs |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
24 AB or the author not be used in advertising or publicity pertaining to |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
25 distribution of the software without specific, written prior |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
26 permission. |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
27 |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
28 SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
29 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
30 FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
31 ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
32 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
33 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
34 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
35 -------------------------------------------------------------------- |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
36 |
|
55d89a8fe963
refactored the unicodeobject/ucnhash interface, to hide the
Fredrik Lundh <fredrik@pythonware.com>
parents:
15952
diff
changeset
|
37 */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 #include "Python.h" |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
40 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 #include "unicodeobject.h" |
|
13209
b11e0a898de0
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13196
diff
changeset
|
42 #include "ucnhash.h" |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
44 #ifdef MS_WIN32 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
45 #include <windows.h> |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
46 #endif |
| 12329 | 47 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 /* Limit for the Unicode object free list */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 #define MAX_UNICODE_FREELIST_SIZE 1024 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 /* Limit for the Unicode object free list stay alive optimization. |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 The implementation will keep allocated Unicode memory intact for |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 all objects on the free list having a size less than this |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 limit. This reduces malloc() overhead for small Unicode objects. |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 |
|
12025
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
58 At worst this will result in MAX_UNICODE_FREELIST_SIZE * |
| 12329 | 59 (sizeof(PyUnicodeObject) + KEEPALIVE_SIZE_LIMIT + |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 malloc()-overhead) bytes of unused garbage. |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
62 Setting the limit to 0 effectively turns the feature off. |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
63 |
| 12329 | 64 Note: This is an experimental feature ! If you get core dumps when |
| 65 using Unicode objects, turn this feature off. | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
66 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
67 */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
68 |
| 12329 | 69 #define KEEPALIVE_SIZE_LIMIT 9 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
70 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 /* Endianness switches; defaults to little endian */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 #ifdef WORDS_BIGENDIAN |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 # define BYTEORDER_IS_BIG_ENDIAN |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 #else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 # define BYTEORDER_IS_LITTLE_ENDIAN |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
78 |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
79 /* --- Globals ------------------------------------------------------------ |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
80 |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
81 The globals are initialized by the _PyUnicode_Init() API and should |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
82 not be used before calling that API. |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
83 |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
84 */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 /* Free list for Unicode objects */ |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
87 static PyUnicodeObject *unicode_freelist; |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
88 static int unicode_freelist_size; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
90 /* The empty Unicode object is shared to improve performance. */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
91 static PyUnicodeObject *unicode_empty; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
92 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
93 /* Single character Unicode strings in the Latin-1 range are being |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
94 shared as well. */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
95 static PyUnicodeObject *unicode_latin1[256]; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
96 |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
97 /* Default encoding to use and assume when NULL is passed as encoding |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
98 parameter; it is initialized by _PyUnicode_Init(). |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
99 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
100 Always use the PyUnicode_SetDefaultEncoding() and |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
101 PyUnicode_GetDefaultEncoding() APIs to access this global. |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
102 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
103 */ |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
104 static char unicode_default_encoding[100]; |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
105 |
|
18298
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
106 Py_UNICODE |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
107 PyUnicode_GetMax(void) |
|
18298
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
108 { |
|
18324
3ba7a358ce02
use Py_UNICODE_WIDE instead of USE_UCS4_STORAGE and Py_UNICODE_SIZE
Fredrik Lundh <fredrik@pythonware.com>
parents:
18298
diff
changeset
|
109 #ifdef Py_UNICODE_WIDE |
|
18298
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
110 return 0x10FFFF; |
|
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
111 #else |
|
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
112 /* This is actually an illegal character, so it should |
|
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
113 not be passed to unichr. */ |
|
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
114 return 0xFFFF; |
|
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
115 #endif |
|
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
116 } |
|
982163c4e9d2
Encode surrogates in UTF-8 even for a wide Py_UNICODE.
Martin v. Löwis <martin@v.loewis.de>
parents:
18295
diff
changeset
|
117 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 /* --- Unicode Object ----------------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 static |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
121 int unicode_resize(register PyUnicodeObject *unicode, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 int length) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 void *oldstr; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
125 |
| 12329 | 126 /* Shortcut if there's nothing much to do. */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 if (unicode->length == length) |
| 12329 | 128 goto reset; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
130 /* Resizing shared object (unicode_empty or single character |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
131 objects) in-place is not allowed. Use PyUnicode_Resize() |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
132 instead ! */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
133 if (unicode == unicode_empty || |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
134 (unicode->length == 1 && |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
135 unicode->str[0] < 256 && |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
136 unicode_latin1[unicode->str[0]] == unicode)) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
137 PyErr_SetString(PyExc_SystemError, |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
138 "can't resize shared unicode objects"); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
139 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
140 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
141 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
142 /* We allocate one more byte to make sure the string is |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
143 Ux0000 terminated -- XXX is this needed ? */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
144 oldstr = unicode->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
145 PyMem_RESIZE(unicode->str, Py_UNICODE, length + 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
146 if (!unicode->str) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
147 unicode->str = oldstr; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
148 PyErr_NoMemory(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
150 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 unicode->str[length] = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
152 unicode->length = length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
153 |
| 12329 | 154 reset: |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 /* Reset the object caches */ |
|
13837
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
156 if (unicode->defenc) { |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
157 Py_DECREF(unicode->defenc); |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
158 unicode->defenc = NULL; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
159 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 unicode->hash = -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 /* We allocate one more byte to make sure the string is |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
166 Ux0000 terminated -- XXX is this needed ? |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
168 XXX This allocator could further be enhanced by assuring that the |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 free list never reduces its size below 1. |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
170 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
173 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
174 PyUnicodeObject *_PyUnicode_New(int length) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
176 register PyUnicodeObject *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
177 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
178 /* Optimization for empty strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
179 if (length == 0 && unicode_empty != NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
180 Py_INCREF(unicode_empty); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
181 return unicode_empty; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
182 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
183 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
184 /* Unicode freelist & memory allocation */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 if (unicode_freelist) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
186 unicode = unicode_freelist; |
|
12939
88004f25dc25
Vladimir MARANGOZOV <Vladimir.Marangozov@inrialpes.fr>:
Marc-André Lemburg <mal@egenix.com>
parents:
12924
diff
changeset
|
187 unicode_freelist = *(PyUnicodeObject **)unicode; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
188 unicode_freelist_size--; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
189 if (unicode->str) { |
| 12329 | 190 /* Keep-Alive optimization: we only upsize the buffer, |
| 191 never downsize it. */ | |
| 192 if ((unicode->length < length) && | |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
193 unicode_resize(unicode, length)) { |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12568
diff
changeset
|
194 PyMem_DEL(unicode->str); |
| 12511 | 195 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 } |
|
18120
c29f3135a20c
Fix a mis-indentation in _PyUnicode_New() that caused me to stare at
Guido van Rossum <guido@python.org>
parents:
18051
diff
changeset
|
198 else { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
199 unicode->str = PyMem_NEW(Py_UNICODE, length + 1); |
|
18120
c29f3135a20c
Fix a mis-indentation in _PyUnicode_New() that caused me to stare at
Guido van Rossum <guido@python.org>
parents:
18051
diff
changeset
|
200 } |
|
c29f3135a20c
Fix a mis-indentation in _PyUnicode_New() that caused me to stare at
Guido van Rossum <guido@python.org>
parents:
18051
diff
changeset
|
201 PyObject_INIT(unicode, &PyUnicode_Type); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
202 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
203 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
204 unicode = PyObject_NEW(PyUnicodeObject, &PyUnicode_Type); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
205 if (unicode == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
206 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
207 unicode->str = PyMem_NEW(Py_UNICODE, length + 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
208 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
209 |
| 12511 | 210 if (!unicode->str) { |
| 211 PyErr_NoMemory(); | |
|
12025
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
212 goto onError; |
| 12511 | 213 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
214 unicode->str[length] = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 unicode->length = length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
216 unicode->hash = -1; |
|
13837
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
217 unicode->defenc = NULL; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
218 return unicode; |
|
12025
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
219 |
|
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
220 onError: |
|
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
221 _Py_ForgetReference((PyObject *)unicode); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12568
diff
changeset
|
222 PyObject_DEL(unicode); |
|
12025
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
223 return NULL; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
225 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 void _PyUnicode_Free(register PyUnicodeObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 if (unicode_freelist_size < MAX_UNICODE_FREELIST_SIZE) { |
| 12329 | 230 /* Keep-Alive optimization */ |
| 231 if (unicode->length >= KEEPALIVE_SIZE_LIMIT) { | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12568
diff
changeset
|
232 PyMem_DEL(unicode->str); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
233 unicode->str = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 unicode->length = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
235 } |
|
13837
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
236 if (unicode->defenc) { |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
237 Py_DECREF(unicode->defenc); |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
238 unicode->defenc = NULL; |
| 12329 | 239 } |
| 240 /* Add to free list */ | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
241 *(PyUnicodeObject **)unicode = unicode_freelist; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
242 unicode_freelist = unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
243 unicode_freelist_size++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
244 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
245 else { |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12568
diff
changeset
|
246 PyMem_DEL(unicode->str); |
|
13837
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
247 Py_XDECREF(unicode->defenc); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12568
diff
changeset
|
248 PyObject_DEL(unicode); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
249 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
250 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
251 |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
252 int PyUnicode_Resize(PyObject **unicode, |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
253 int length) |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
254 { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
255 register PyUnicodeObject *v; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
256 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
257 /* Argument checks */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
258 if (unicode == NULL) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
259 PyErr_BadInternalCall(); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
260 return -1; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
261 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
262 v = (PyUnicodeObject *)*unicode; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
263 if (v == NULL || !PyUnicode_Check(v) || v->ob_refcnt != 1) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
264 PyErr_BadInternalCall(); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
265 return -1; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
266 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
267 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
268 /* Resizing unicode_empty and single character objects is not |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
269 possible since these are being shared. We simply return a fresh |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
270 copy with the same Unicode content. */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
271 if (v->length != length && |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
272 (v == unicode_empty || v->length == 1)) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
273 PyUnicodeObject *w = _PyUnicode_New(length); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
274 if (w == NULL) |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
275 return -1; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
276 Py_UNICODE_COPY(w->str, v->str, |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
277 length < v->length ? length : v->length); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
278 *unicode = (PyObject *)w; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
279 return 0; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
280 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
281 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
282 /* Note that we don't have to modify *unicode for unshared Unicode |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
283 objects, since we can modify them in-place. */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
284 return unicode_resize(v, length); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
285 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
286 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
287 /* Internal API for use in unicodeobject.c only ! */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
288 #define _PyUnicode_Resize(unicodevar, length) \ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
289 PyUnicode_Resize(((PyObject **)(unicodevar)), length) |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
290 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 PyObject *PyUnicode_FromUnicode(const Py_UNICODE *u, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
292 int size) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
293 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
294 PyUnicodeObject *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
296 /* If the Unicode data is known at construction time, we can apply |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
297 some optimizations which share commonly used objects. */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
298 if (u != NULL) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
299 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
300 /* Optimization for empty strings */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
301 if (size == 0 && unicode_empty != NULL) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
302 Py_INCREF(unicode_empty); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
303 return (PyObject *)unicode_empty; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
304 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
305 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
306 /* Single character Unicode objects in the Latin-1 range are |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
307 shared when using this constructor */ |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
308 if (size == 1 && *u < 256) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
309 unicode = unicode_latin1[*u]; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
310 if (!unicode) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
311 unicode = _PyUnicode_New(1); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
312 if (!unicode) |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
313 return NULL; |
|
18051
e897550b4748
Fixes [ #430986 ] Buglet in PyUnicode_FromUnicode.
Marc-André Lemburg <mal@egenix.com>
parents:
17995
diff
changeset
|
314 unicode->str[0] = *u; |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
315 unicode_latin1[*u] = unicode; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
316 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
317 Py_INCREF(unicode); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
318 return (PyObject *)unicode; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
319 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
320 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
321 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 unicode = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 if (!unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 /* Copy the Unicode data into the new object */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 if (u != NULL) |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
328 Py_UNICODE_COPY(unicode->str, u, size); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 return (PyObject *)unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
332 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
333 #ifdef HAVE_WCHAR_H |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 PyObject *PyUnicode_FromWideChar(register const wchar_t *w, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 int size) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
337 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
338 PyUnicodeObject *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
339 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
340 if (w == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
341 PyErr_BadInternalCall(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
342 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 unicode = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 if (!unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 /* Copy the wchar_t data into the new object */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
350 #ifdef HAVE_USABLE_WCHAR_T |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 memcpy(unicode->str, w, size * sizeof(wchar_t)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 #else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
354 register Py_UNICODE *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
355 register int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 u = PyUnicode_AS_UNICODE(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 for (i = size; i >= 0; i--) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
358 *u++ = *w++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
361 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 return (PyObject *)unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
364 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
365 int PyUnicode_AsWideChar(PyUnicodeObject *unicode, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
366 register wchar_t *w, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 int size) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
369 if (unicode == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
370 PyErr_BadInternalCall(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
371 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
372 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
373 if (size > PyUnicode_GET_SIZE(unicode)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 size = PyUnicode_GET_SIZE(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 #ifdef HAVE_USABLE_WCHAR_T |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
376 memcpy(w, unicode->str, size * sizeof(wchar_t)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
377 #else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
378 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 register Py_UNICODE *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 register int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
381 u = PyUnicode_AS_UNICODE(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
382 for (i = size; i >= 0; i--) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
383 *w++ = *u++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
384 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
385 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 return size; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
389 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 PyObject *PyUnicode_FromObject(register PyObject *obj) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 { |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
394 return PyUnicode_FromEncodedObject(obj, NULL, "strict"); |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
395 } |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
396 |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
397 PyObject *PyUnicode_FromEncodedObject(register PyObject *obj, |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
398 const char *encoding, |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
399 const char *errors) |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
400 { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 const char *s; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 int len; |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
403 int owned = 0; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
404 PyObject *v; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 if (obj == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 PyErr_BadInternalCall(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
408 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 } |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
410 |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
411 /* Coerce object */ |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
412 if (PyInstance_Check(obj)) { |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
413 PyObject *func; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
414 func = PyObject_GetAttrString(obj, "__str__"); |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
415 if (func == NULL) { |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
416 PyErr_SetString(PyExc_TypeError, |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
417 "coercing to Unicode: instance doesn't define __str__"); |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
418 return NULL; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
419 } |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
420 obj = PyEval_CallObject(func, NULL); |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
421 Py_DECREF(func); |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
422 if (obj == NULL) |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
423 return NULL; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
424 owned = 1; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
425 } |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
426 if (PyUnicode_Check(obj)) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
427 Py_INCREF(obj); |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
428 v = obj; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
429 if (encoding) { |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
430 PyErr_SetString(PyExc_TypeError, |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
431 "decoding Unicode is not supported"); |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
432 return NULL; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
433 } |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
434 goto done; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
436 else if (PyString_Check(obj)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
437 s = PyString_AS_STRING(obj); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
438 len = PyString_GET_SIZE(obj); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 } |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
440 else if (PyObject_AsCharBuffer(obj, &s, &len)) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
441 /* Overwrite the error message with something more useful in |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
442 case of a TypeError. */ |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
443 if (PyErr_ExceptionMatches(PyExc_TypeError)) |
| 13529 | 444 PyErr_Format(PyExc_TypeError, |
| 445 "coercing to Unicode: need string or buffer, " | |
| 446 "%.80s found", | |
| 447 obj->ob_type->tp_name); | |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
448 goto onError; |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
449 } |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
450 |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
451 /* Convert to Unicode */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 if (len == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
453 Py_INCREF(unicode_empty); |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
454 v = (PyObject *)unicode_empty; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
455 } |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
456 else |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
457 v = PyUnicode_Decode(s, len, encoding, errors); |
|
15952
1f92d63b20f0
This patch adds a new builtin unistr() which behaves like str()
Marc-André Lemburg <mal@egenix.com>
parents:
15910
diff
changeset
|
458 |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
459 done: |
|
13633
e1469b7a2e68
gcc is being stupid with if/else constructs
Greg Stein <gstein@lyra.org>
parents:
13628
diff
changeset
|
460 if (owned) { |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
461 Py_DECREF(obj); |
|
13633
e1469b7a2e68
gcc is being stupid with if/else constructs
Greg Stein <gstein@lyra.org>
parents:
13628
diff
changeset
|
462 } |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
463 return v; |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
464 |
|
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
465 onError: |
|
13633
e1469b7a2e68
gcc is being stupid with if/else constructs
Greg Stein <gstein@lyra.org>
parents:
13628
diff
changeset
|
466 if (owned) { |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
467 Py_DECREF(obj); |
|
13633
e1469b7a2e68
gcc is being stupid with if/else constructs
Greg Stein <gstein@lyra.org>
parents:
13628
diff
changeset
|
468 } |
|
13401
8f1a2deeb9b0
Added new API PyUnicode_FromEncodedObject() which supports decoding
Marc-André Lemburg <mal@egenix.com>
parents:
13396
diff
changeset
|
469 return NULL; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
470 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 PyObject *PyUnicode_Decode(const char *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 const char *encoding, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 PyObject *buffer = NULL, *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
479 if (encoding == NULL) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
480 encoding = PyUnicode_GetDefaultEncoding(); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
481 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
482 /* Shortcuts for common default encodings */ |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
483 if (strcmp(encoding, "utf-8") == 0) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 return PyUnicode_DecodeUTF8(s, size, errors); |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
485 else if (strcmp(encoding, "latin-1") == 0) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
486 return PyUnicode_DecodeLatin1(s, size, errors); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
487 else if (strcmp(encoding, "ascii") == 0) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
488 return PyUnicode_DecodeASCII(s, size, errors); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
489 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 /* Decode via the codec registry */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
491 buffer = PyBuffer_FromMemory((void *)s, size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 if (buffer == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
493 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 unicode = PyCodec_Decode(buffer, encoding, errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 if (unicode == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 PyErr_Format(PyExc_TypeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
499 "decoder did not return an unicode object (type=%.400s)", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
500 unicode->ob_type->tp_name); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 Py_DECREF(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
503 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
504 Py_DECREF(buffer); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 return unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
508 Py_XDECREF(buffer); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
509 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
511 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 PyObject *PyUnicode_Encode(const Py_UNICODE *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 const char *encoding, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 PyObject *v, *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
518 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 unicode = PyUnicode_FromUnicode(s, size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 if (unicode == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 v = PyUnicode_AsEncodedString(unicode, encoding, errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 Py_DECREF(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 return v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
525 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
526 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
527 PyObject *PyUnicode_AsEncodedString(PyObject *unicode, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
528 const char *encoding, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
529 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
530 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
531 PyObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
532 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
534 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
535 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
536 } |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
537 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
538 if (encoding == NULL) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
539 encoding = PyUnicode_GetDefaultEncoding(); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
540 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
541 /* Shortcuts for common default encodings */ |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
542 if (errors == NULL) { |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
543 if (strcmp(encoding, "utf-8") == 0) |
|
17995
837825a779c1
fix bogus indentation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17887
diff
changeset
|
544 return PyUnicode_AsUTF8String(unicode); |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
545 else if (strcmp(encoding, "latin-1") == 0) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
546 return PyUnicode_AsLatin1String(unicode); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
547 else if (strcmp(encoding, "ascii") == 0) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
548 return PyUnicode_AsASCIIString(unicode); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
549 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
550 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
551 /* Encode via the codec registry */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
552 v = PyCodec_Encode(unicode, encoding, errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
553 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
554 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
555 /* XXX Should we really enforce this ? */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
556 if (!PyString_Check(v)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
557 PyErr_Format(PyExc_TypeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
558 "encoder did not return a string object (type=%.400s)", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
559 v->ob_type->tp_name); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
560 Py_DECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
561 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
562 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
563 return v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
564 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
565 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
566 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
567 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
568 |
|
13837
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
569 PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode, |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
570 const char *errors) |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
571 { |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
572 PyObject *v = ((PyUnicodeObject *)unicode)->defenc; |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
573 |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
574 if (v) |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
575 return v; |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
576 v = PyUnicode_AsEncodedString(unicode, NULL, errors); |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
577 if (v && errors == NULL) |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
578 ((PyUnicodeObject *)unicode)->defenc = v; |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
579 return v; |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
580 } |
|
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
581 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
582 Py_UNICODE *PyUnicode_AsUnicode(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
583 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
584 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
585 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
586 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
587 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
588 return PyUnicode_AS_UNICODE(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
589 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
590 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
591 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
592 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
593 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
594 int PyUnicode_GetSize(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
595 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
596 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
597 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
598 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
599 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
600 return PyUnicode_GET_SIZE(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
601 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
602 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
603 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
604 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
605 |
|
13660
a1ce07218781
Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents:
13635
diff
changeset
|
606 const char *PyUnicode_GetDefaultEncoding(void) |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
607 { |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
608 return unicode_default_encoding; |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
609 } |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
610 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
611 int PyUnicode_SetDefaultEncoding(const char *encoding) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
612 { |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
613 PyObject *v; |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
614 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
615 /* Make sure the encoding is valid. As side effect, this also |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
616 loads the encoding into the codec registry cache. */ |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
617 v = _PyCodec_Lookup(encoding); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
618 if (v == NULL) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
619 goto onError; |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
620 Py_DECREF(v); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
621 strncpy(unicode_default_encoding, |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
622 encoding, |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
623 sizeof(unicode_default_encoding)); |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
624 return 0; |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
625 |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
626 onError: |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
627 return -1; |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
628 } |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
629 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
630 /* --- UTF-8 Codec -------------------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
631 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
632 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
633 char utf8_code_length[256] = { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
634 /* Map UTF-8 encoded prefix byte to sequence length. zero means |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
635 illegal prefix. see RFC 2279 for details */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
636 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
637 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
638 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
639 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
640 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
642 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
643 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
645 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
647 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
648 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
649 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
650 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
651 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 0, 0 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
652 }; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
653 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
654 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
655 int utf8_decoding_error(const char **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
656 Py_UNICODE **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
657 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
658 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
659 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
660 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
661 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
662 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
663 "UTF-8 decoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
664 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
665 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
666 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
667 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
668 (*source)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
669 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
670 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
671 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
672 (*source)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
673 **dest = Py_UNICODE_REPLACEMENT_CHARACTER; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
674 (*dest)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
675 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
676 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
677 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
678 PyErr_Format(PyExc_ValueError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
679 "UTF-8 decoding error; unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
680 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
681 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
682 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
683 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
684 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
685 PyObject *PyUnicode_DecodeUTF8(const char *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
686 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
687 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
688 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
689 int n; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
690 const char *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
691 PyUnicodeObject *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
692 Py_UNICODE *p; |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
693 const char *errmsg = ""; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
694 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
695 /* Note: size will always be longer than the resulting Unicode |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
696 character count */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
697 unicode = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
698 if (!unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
699 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
700 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
701 return (PyObject *)unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
702 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
703 /* Unpack UTF-8 encoded data */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
704 p = unicode->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
705 e = s + size; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
706 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
707 while (s < e) { |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
708 Py_UCS4 ch = (unsigned char)*s; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
709 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
710 if (ch < 0x80) { |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
711 *p++ = (Py_UNICODE)ch; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
712 s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
713 continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
714 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
715 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
716 n = utf8_code_length[ch]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
717 |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
718 if (s + n > e) { |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
719 errmsg = "unexpected end of data"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
720 goto utf8Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
721 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
722 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
723 switch (n) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
724 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
725 case 0: |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
726 errmsg = "unexpected code byte"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
727 goto utf8Error; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
728 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
729 case 1: |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
730 errmsg = "internal error"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
731 goto utf8Error; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
732 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
733 case 2: |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
734 if ((s[1] & 0xc0) != 0x80) { |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
735 errmsg = "invalid data"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
736 goto utf8Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
737 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
738 ch = ((s[0] & 0x1f) << 6) + (s[1] & 0x3f); |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
739 if (ch < 0x80) { |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
740 errmsg = "illegal encoding"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
741 goto utf8Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
742 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
743 else |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
744 *p++ = (Py_UNICODE)ch; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
745 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
746 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
747 case 3: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
748 if ((s[1] & 0xc0) != 0x80 || |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
749 (s[2] & 0xc0) != 0x80) { |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
750 errmsg = "invalid data"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
751 goto utf8Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
752 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
753 ch = ((s[0] & 0x0f) << 12) + ((s[1] & 0x3f) << 6) + (s[2] & 0x3f); |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
754 if (ch < 0x800 || (ch >= 0xd800 && ch < 0xe000)) { |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
755 errmsg = "illegal encoding"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
756 goto utf8Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
757 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
758 else |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
759 *p++ = (Py_UNICODE)ch; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
760 break; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
761 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
762 case 4: |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
763 if ((s[1] & 0xc0) != 0x80 || |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
764 (s[2] & 0xc0) != 0x80 || |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
765 (s[3] & 0xc0) != 0x80) { |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
766 errmsg = "invalid data"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
767 goto utf8Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
768 } |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
769 ch = ((s[0] & 0x7) << 18) + ((s[1] & 0x3f) << 12) + |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
770 ((s[2] & 0x3f) << 6) + (s[3] & 0x3f); |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
771 /* validate and convert to UTF-16 */ |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
772 if ((ch < 0x10000) /* minimum value allowed for 4 |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
773 byte encoding */ |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
774 || (ch > 0x10ffff)) /* maximum value allowed for |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
775 UTF-16 */ |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
776 { |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
777 errmsg = "illegal encoding"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
778 goto utf8Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
779 } |
|
18324
3ba7a358ce02
use Py_UNICODE_WIDE instead of USE_UCS4_STORAGE and Py_UNICODE_SIZE
Fredrik Lundh <fredrik@pythonware.com>
parents:
18298
diff
changeset
|
780 #ifdef Py_UNICODE_WIDE |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
781 *p++ = (Py_UNICODE)ch; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
782 #else |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
783 /* compute and append the two surrogates: */ |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
784 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
785 /* translate from 10000..10FFFF to 0..FFFF */ |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
786 ch -= 0x10000; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
787 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
788 /* high surrogate = top 10 bits added to D800 */ |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
789 *p++ = (Py_UNICODE)(0xD800 + (ch >> 10)); |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
790 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
791 /* low surrogate = bottom 10 bits added to DC00 */ |
|
18279
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
792 *p++ = (Py_UNICODE)(0xDC00 + (ch & 0x03FF)); |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
793 #endif |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
794 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
795 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
796 default: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
797 /* Other sizes are only needed for UCS-4 */ |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
798 errmsg = "unsupported Unicode code range"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
799 goto utf8Error; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
800 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
801 s += n; |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
802 continue; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
803 |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
804 utf8Error: |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
805 if (utf8_decoding_error(&s, &p, errors, errmsg)) |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
806 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
807 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
808 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
809 /* Adjust length */ |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
810 if (_PyUnicode_Resize(&unicode, p - unicode->str)) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
811 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
812 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
813 return (PyObject *)unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
814 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
815 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
816 Py_DECREF(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
817 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
818 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
819 |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
820 /* Not used anymore, now that the encoder supports UTF-16 |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
821 surrogates. */ |
|
13633
e1469b7a2e68
gcc is being stupid with if/else constructs
Greg Stein <gstein@lyra.org>
parents:
13628
diff
changeset
|
822 #if 0 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
823 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
824 int utf8_encoding_error(const Py_UNICODE **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
825 char **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
826 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
827 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
828 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
829 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
830 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
831 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
832 "UTF-8 encoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
833 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
834 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
835 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
836 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
837 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
838 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
839 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
840 **dest = '?'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
841 (*dest)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
842 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
843 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
844 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
845 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
846 "UTF-8 encoding error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
847 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
848 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
849 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
850 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
851 } |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
852 #endif |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
853 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
854 PyObject *PyUnicode_EncodeUTF8(const Py_UNICODE *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
855 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
856 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
857 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
858 PyObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
859 char *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
860 char *q; |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
861 Py_UCS4 ch2; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
862 unsigned int cbAllocated = 3 * size; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
863 unsigned int cbWritten = 0; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
864 int i = 0; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
865 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
866 v = PyString_FromStringAndSize(NULL, cbAllocated); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
867 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
868 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
869 if (size == 0) |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
870 return v; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
871 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
872 p = q = PyString_AS_STRING(v); |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
873 while (i < size) { |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
874 Py_UCS4 ch = s[i++]; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
875 if (ch < 0x80) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
876 *p++ = (char) ch; |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
877 cbWritten++; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
878 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
879 else if (ch < 0x0800) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
880 *p++ = 0xc0 | (ch >> 6); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
881 *p++ = 0x80 | (ch & 0x3f); |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
882 cbWritten += 2; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
883 } |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
884 else if (ch < 0x10000) { |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
885 /* Check for high surrogate */ |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
886 if (0xD800 <= ch && ch <= 0xDBFF) { |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
887 if (i != size) { |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
888 ch2 = s[i]; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
889 if (0xDC00 <= ch2 && ch2 <= 0xDFFF) { |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
890 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
891 if (cbWritten >= (cbAllocated - 4)) { |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
892 /* Provide enough room for some more |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
893 surrogates */ |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
894 cbAllocated += 4*10; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
895 if (_PyString_Resize(&v, cbAllocated)) |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
896 goto onError; |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
897 } |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
898 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
899 /* combine the two values */ |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
900 ch = ((ch - 0xD800)<<10 | (ch2-0xDC00))+0x10000; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
901 |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
902 *p++ = (char)((ch >> 18) | 0xf0); |
|
13633
e1469b7a2e68
gcc is being stupid with if/else constructs
Greg Stein <gstein@lyra.org>
parents:
13628
diff
changeset
|
903 *p++ = (char)(0x80 | ((ch >> 12) & 0x3f)); |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
904 i++; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
905 cbWritten += 4; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
906 } |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
907 } |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
908 } |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
909 else { |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
910 *p++ = (char)(0xe0 | (ch >> 12)); |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
911 cbWritten += 3; |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
912 } |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
913 *p++ = (char)(0x80 | ((ch >> 6) & 0x3f)); |
|
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
914 *p++ = (char)(0x80 | (ch & 0x3f)); |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
915 } else { |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
916 *p++ = 0xf0 | (ch>>18); |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
917 *p++ = 0x80 | ((ch>>12) & 0x3f); |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
918 *p++ = 0x80 | ((ch>>6) & 0x3f); |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
919 *p++ = 0x80 | (ch & 0x3f); |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
920 cbWritten += 4; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
921 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
922 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
923 *p = '\0'; |
| 12329 | 924 if (_PyString_Resize(&v, p - q)) |
| 925 goto onError; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
926 return v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
927 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
928 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
929 Py_DECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
930 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
931 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
932 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
933 PyObject *PyUnicode_AsUTF8String(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
934 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
935 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
936 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
937 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
938 } |
|
14059
d0348a26b093
PyUnicode_AsUTF8String(): Don't need to explicitly incref str since
Barry Warsaw <barry@python.org>
parents:
13966
diff
changeset
|
939 return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), |
|
d0348a26b093
PyUnicode_AsUTF8String(): Don't need to explicitly incref str since
Barry Warsaw <barry@python.org>
parents:
13966
diff
changeset
|
940 PyUnicode_GET_SIZE(unicode), |
|
d0348a26b093
PyUnicode_AsUTF8String(): Don't need to explicitly incref str since
Barry Warsaw <barry@python.org>
parents:
13966
diff
changeset
|
941 NULL); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
942 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
943 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
944 /* --- UTF-16 Codec ------------------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
945 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
946 static |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
947 int utf16_decoding_error(Py_UNICODE **dest, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
948 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
949 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
950 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
951 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
952 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
953 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
954 "UTF-16 decoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
955 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
956 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
957 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
958 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
959 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
960 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
961 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
962 if (dest) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
963 **dest = Py_UNICODE_REPLACEMENT_CHARACTER; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
964 (*dest)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
965 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
966 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
967 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
968 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
969 PyErr_Format(PyExc_ValueError, |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
970 "UTF-16 decoding error; " |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
971 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
972 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
973 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
974 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
975 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
976 |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
977 PyObject * |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
978 PyUnicode_DecodeUTF16(const char *s, |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
979 int size, |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
980 const char *errors, |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
981 int *byteorder) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
982 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
983 PyUnicodeObject *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
984 Py_UNICODE *p; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
985 const unsigned char *q, *e; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
986 int bo = 0; /* assume native ordering by default */ |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
987 const char *errmsg = ""; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
988 /* Offsets from q for retrieving byte pairs in the right order. */ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
989 #ifdef BYTEORDER_IS_LITTLE_ENDIAN |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
990 int ihi = 1, ilo = 0; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
991 #else |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
992 int ihi = 0, ilo = 1; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
993 #endif |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
994 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
995 /* size should be an even number */ |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
996 if (size & 1) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
997 if (utf16_decoding_error(NULL, errors, "truncated data")) |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
998 return NULL; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
999 --size; /* else ignore the oddball byte */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1000 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1001 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1002 /* Note: size will always be longer than the resulting Unicode |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1003 character count */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1004 unicode = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1005 if (!unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1006 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1007 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1008 return (PyObject *)unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1009 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1010 /* Unpack UTF-16 encoded data */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1011 p = unicode->str; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1012 q = (unsigned char *)s; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1013 e = q + size; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1014 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1015 if (byteorder) |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1016 bo = *byteorder; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1017 |
|
17887
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1018 /* Check for BOM marks (U+FEFF) in the input and adjust current |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1019 byte order setting accordingly. In native mode, the leading BOM |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1020 mark is skipped, in all other modes, it is copied to the output |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1021 stream as-is (giving a ZWNBSP character). */ |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1022 if (bo == 0) { |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1023 const Py_UNICODE bom = (q[ihi] << 8) | q[ilo]; |
|
17887
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1024 #ifdef BYTEORDER_IS_LITTLE_ENDIAN |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1025 if (bom == 0xFEFF) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1026 q += 2; |
|
17887
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1027 bo = -1; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1028 } |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1029 else if (bom == 0xFFFE) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1030 q += 2; |
|
17887
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1031 bo = 1; |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1032 } |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1033 #else |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1034 if (bom == 0xFEFF) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1035 q += 2; |
|
17887
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1036 bo = 1; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1037 } |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1038 else if (bom == 0xFFFE) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1039 q += 2; |
|
17887
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1040 bo = -1; |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1041 } |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1042 #endif |
|
fd5f83188778
This patch changes the behaviour of the UTF-16 codec family. Only the
Marc-André Lemburg <mal@egenix.com>
parents:
17700
diff
changeset
|
1043 } |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1044 |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1045 if (bo == -1) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1046 /* force LE */ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1047 ihi = 1; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1048 ilo = 0; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1049 } |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1050 else if (bo == 1) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1051 /* force BE */ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1052 ihi = 0; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1053 ilo = 1; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1054 } |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1055 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1056 while (q < e) { |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1057 Py_UNICODE ch = (q[ihi] << 8) | q[ilo]; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1058 q += 2; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1059 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1060 if (ch < 0xD800 || ch > 0xDFFF) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1061 *p++ = ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1062 continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1063 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1064 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1065 /* UTF-16 code pair: */ |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1066 if (q >= e) { |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1067 errmsg = "unexpected end of data"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1068 goto utf16Error; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1069 } |
|
18295
20e3a6e10c24
When decoding UTF-16, don't assume that the buffer is in native endianness
Martin v. Löwis <martin@v.loewis.de>
parents:
18292
diff
changeset
|
1070 if (0xD800 <= ch && ch <= 0xDBFF) { |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1071 Py_UNICODE ch2 = (q[ihi] << 8) | q[ilo]; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1072 q += 2; |
|
18295
20e3a6e10c24
When decoding UTF-16, don't assume that the buffer is in native endianness
Martin v. Löwis <martin@v.loewis.de>
parents:
18292
diff
changeset
|
1073 if (0xDC00 <= ch2 && ch2 <= 0xDFFF) { |
|
18324
3ba7a358ce02
use Py_UNICODE_WIDE instead of USE_UCS4_STORAGE and Py_UNICODE_SIZE
Fredrik Lundh <fredrik@pythonware.com>
parents:
18298
diff
changeset
|
1074 #ifndef Py_UNICODE_WIDE |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1075 *p++ = ch; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1076 *p++ = ch2; |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1077 #else |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1078 *p++ = (((ch & 0x3FF)<<10) | (ch2 & 0x3FF)) + 0x10000; |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1079 #endif |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1080 continue; |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1081 } |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1082 else { |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1083 errmsg = "illegal UTF-16 surrogate"; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1084 goto utf16Error; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1085 } |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1086 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1087 } |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1088 errmsg = "illegal encoding"; |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1089 /* Fall through to report the error */ |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1090 |
|
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1091 utf16Error: |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1092 if (utf16_decoding_error(&p, errors, errmsg)) |
|
13635
dfb7ecfffe3d
Fixed problems with UTF error reporting macros and some formatting bugs.
Marc-André Lemburg <mal@egenix.com>
parents:
13633
diff
changeset
|
1093 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1094 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1095 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1096 if (byteorder) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1097 *byteorder = bo; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1098 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1099 /* Adjust length */ |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1100 if (_PyUnicode_Resize(&unicode, p - unicode->str)) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1101 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1102 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1103 return (PyObject *)unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1104 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1105 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1106 Py_DECREF(unicode); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1107 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1108 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1109 |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1110 PyObject * |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1111 PyUnicode_EncodeUTF16(const Py_UNICODE *s, |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1112 int size, |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1113 const char *errors, |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1114 int byteorder) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1115 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1116 PyObject *v; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1117 unsigned char *p; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1118 int i, pairs; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1119 /* Offsets from p for storing byte pairs in the right order. */ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1120 #ifdef BYTEORDER_IS_LITTLE_ENDIAN |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1121 int ihi = 1, ilo = 0; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1122 #else |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1123 int ihi = 0, ilo = 1; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1124 #endif |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1125 |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1126 #define STORECHAR(CH) \ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1127 do { \ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1128 p[ihi] = ((CH) >> 8) & 0xff; \ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1129 p[ilo] = (CH) & 0xff; \ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1130 p += 2; \ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1131 } while(0) |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1132 |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1133 for (i = pairs = 0; i < size; i++) |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1134 if (s[i] >= 0x10000) |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1135 pairs++; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1136 v = PyString_FromStringAndSize(NULL, |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1137 2 * (size + pairs + (byteorder == 0))); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1138 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1139 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1140 |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1141 p = (unsigned char *)PyString_AS_STRING(v); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1142 if (byteorder == 0) |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1143 STORECHAR(0xFEFF); |
|
13396
759f698740cc
Fix to bug #393 (UTF16 codec didn't like empty strings) and
Marc-André Lemburg <mal@egenix.com>
parents:
13394
diff
changeset
|
1144 if (size == 0) |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1145 return v; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1146 |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1147 if (byteorder == -1) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1148 /* force LE */ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1149 ihi = 1; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1150 ilo = 0; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1151 } |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1152 else if (byteorder == 1) { |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1153 /* force BE */ |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1154 ihi = 0; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1155 ilo = 1; |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1156 } |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1157 |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1158 while (size-- > 0) { |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1159 Py_UNICODE ch = *s++; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1160 Py_UNICODE ch2 = 0; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1161 if (ch >= 0x10000) { |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1162 ch2 = 0xDC00 | ((ch-0x10000) & 0x3FF); |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1163 ch = 0xD800 | ((ch-0x10000) >> 10); |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1164 } |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1165 STORECHAR(ch); |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1166 if (ch2) |
|
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1167 STORECHAR(ch2); |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1168 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1169 return v; |
|
19121
77e405f3a942
SF patch #438013 Remove 2-byte Py_UCS2 assumptions
Tim Peters <tim.peters@gmail.com>
parents:
18933
diff
changeset
|
1170 #undef STORECHAR |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1171 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1172 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1173 PyObject *PyUnicode_AsUTF16String(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1174 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1175 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1176 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1177 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1178 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1179 return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1180 PyUnicode_GET_SIZE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1181 NULL, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1182 0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1183 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1184 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1185 /* --- Unicode Escape Codec ----------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1186 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1187 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1188 int unicodeescape_decoding_error(const char **source, |
|
13396
759f698740cc
Fix to bug #393 (UTF16 codec didn't like empty strings) and
Marc-André Lemburg <mal@egenix.com>
parents:
13394
diff
changeset
|
1189 Py_UNICODE *x, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1190 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1191 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1192 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1193 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1194 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1195 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1196 "Unicode-Escape decoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1197 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1198 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1199 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1200 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1201 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1202 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1203 else if (strcmp(errors,"replace") == 0) { |
|
13396
759f698740cc
Fix to bug #393 (UTF16 codec didn't like empty strings) and
Marc-André Lemburg <mal@egenix.com>
parents:
13394
diff
changeset
|
1204 *x = Py_UNICODE_REPLACEMENT_CHARACTER; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1205 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1206 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1207 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1208 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1209 "Unicode-Escape decoding error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1210 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1211 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1212 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1213 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1214 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1215 |
|
16200
3484670c37f2
Move uchhash functionality into unicodedata (after the recent
Fredrik Lundh <fredrik@pythonware.com>
parents:
16064
diff
changeset
|
1216 static _PyUnicode_Name_CAPI *ucnhash_CAPI = NULL; |
|
13063
eb243443b884
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13049
diff
changeset
|
1217 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1218 PyObject *PyUnicode_DecodeUnicodeEscape(const char *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1219 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1220 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1221 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1222 PyUnicodeObject *v; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1223 Py_UNICODE *p, *buf; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1224 const char *end; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1225 char* message; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1226 Py_UCS4 chr = 0xffffffff; /* in case 'getcode' messes up */ |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1227 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1228 /* Escaped strings will always be longer than the resulting |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1229 Unicode string, so we start with size here and then reduce the |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1230 length after conversion to the true value. */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1231 v = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1232 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1233 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1234 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1235 return (PyObject *)v; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1236 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1237 p = buf = PyUnicode_AS_UNICODE(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1238 end = s + size; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1239 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1240 while (s < end) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1241 unsigned char c; |
|
13396
759f698740cc
Fix to bug #393 (UTF16 codec didn't like empty strings) and
Marc-André Lemburg <mal@egenix.com>
parents:
13394
diff
changeset
|
1242 Py_UNICODE x; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1243 int i, digits; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1244 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1245 /* Non-escape characters are interpreted as Unicode ordinals */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1246 if (*s != '\\') { |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1247 *p++ = (unsigned char) *s++; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1248 continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1249 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1250 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1251 /* \ - Escapes */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1252 s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1253 switch (*s++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1254 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1255 /* \x escapes */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1256 case '\n': break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1257 case '\\': *p++ = '\\'; break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1258 case '\'': *p++ = '\''; break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1259 case '\"': *p++ = '\"'; break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1260 case 'b': *p++ = '\b'; break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1261 case 'f': *p++ = '\014'; break; /* FF */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1262 case 't': *p++ = '\t'; break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1263 case 'n': *p++ = '\n'; break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1264 case 'r': *p++ = '\r'; break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1265 case 'v': *p++ = '\013'; break; /* VT */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1266 case 'a': *p++ = '\007'; break; /* BEL, not classic C */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1267 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1268 /* \OOO (octal) escapes */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1269 case '0': case '1': case '2': case '3': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1270 case '4': case '5': case '6': case '7': |
| 12544 | 1271 x = s[-1] - '0'; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1272 if ('0' <= *s && *s <= '7') { |
| 12544 | 1273 x = (x<<3) + *s++ - '0'; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1274 if ('0' <= *s && *s <= '7') |
| 12544 | 1275 x = (x<<3) + *s++ - '0'; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1276 } |
| 12544 | 1277 *p++ = x; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1278 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1279 |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1280 /* hex escapes */ |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1281 /* \xXX */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1282 case 'x': |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1283 digits = 2; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1284 message = "truncated \\xXX escape"; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1285 goto hexescape; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1286 |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1287 /* \uXXXX */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1288 case 'u': |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1289 digits = 4; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1290 message = "truncated \\uXXXX escape"; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1291 goto hexescape; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1292 |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1293 /* \UXXXXXXXX */ |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1294 case 'U': |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1295 digits = 8; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1296 message = "truncated \\UXXXXXXXX escape"; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1297 hexescape: |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1298 chr = 0; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1299 for (i = 0; i < digits; i++) { |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1300 c = (unsigned char) s[i]; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1301 if (!isxdigit(c)) { |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1302 if (unicodeescape_decoding_error(&s, &x, errors, message)) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1303 goto onError; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1304 chr = x; |
|
14388
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1305 i++; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1306 break; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1307 } |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1308 chr = (chr<<4) & ~0xF; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1309 if (c >= '0' && c <= '9') |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1310 chr += c - '0'; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1311 else if (c >= 'a' && c <= 'f') |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1312 chr += 10 + c - 'a'; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1313 else |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1314 chr += 10 + c - 'A'; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1315 } |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1316 s += i; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1317 store: |
|
14388
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1318 /* when we get here, chr is a 32-bit unicode character */ |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1319 if (chr <= 0xffff) |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1320 /* UCS-2 character */ |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1321 *p++ = (Py_UNICODE) chr; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1322 else if (chr <= 0x10ffff) { |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1323 /* UCS-4 character. Either store directly, or as |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1324 surrogate pair. */ |
|
18324
3ba7a358ce02
use Py_UNICODE_WIDE instead of USE_UCS4_STORAGE and Py_UNICODE_SIZE
Fredrik Lundh <fredrik@pythonware.com>
parents:
18298
diff
changeset
|
1325 #ifdef Py_UNICODE_WIDE |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1326 *p++ = chr; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1327 #else |
|
14388
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1328 chr -= 0x10000L; |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1329 *p++ = 0xD800 + (Py_UNICODE) (chr >> 10); |
|
18279
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
1330 *p++ = 0xDC00 + (Py_UNICODE) (chr & 0x03FF); |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1331 #endif |
|
14388
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1332 } else { |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1333 if (unicodeescape_decoding_error( |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1334 &s, &x, errors, |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1335 "illegal Unicode character") |
|
14388
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1336 ) |
|
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1337 goto onError; |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1338 *p++ = x; /* store replacement character */ |
|
14388
ef2714bb0730
changed \x to consume exactly two hex digits, also for unicode
Fredrik Lundh <fredrik@pythonware.com>
parents:
14067
diff
changeset
|
1339 } |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1340 break; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1341 |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1342 /* \N{name} */ |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1343 case 'N': |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1344 message = "malformed \\N character escape"; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1345 if (ucnhash_CAPI == NULL) { |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1346 /* load the unicode data module */ |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1347 PyObject *m, *v; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1348 m = PyImport_ImportModule("unicodedata"); |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1349 if (m == NULL) |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1350 goto ucnhashError; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1351 v = PyObject_GetAttrString(m, "ucnhash_CAPI"); |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1352 Py_DECREF(m); |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1353 if (v == NULL) |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1354 goto ucnhashError; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1355 ucnhash_CAPI = PyCObject_AsVoidPtr(v); |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1356 Py_DECREF(v); |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1357 if (ucnhash_CAPI == NULL) |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1358 goto ucnhashError; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1359 } |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1360 if (*s == '{') { |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1361 const char *start = s+1; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1362 /* look for the closing brace */ |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1363 while (*s != '}' && s < end) |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1364 s++; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1365 if (s > start && s < end && *s == '}') { |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1366 /* found a name. look it up in the unicode database */ |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1367 message = "unknown Unicode character name"; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1368 s++; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1369 if (ucnhash_CAPI->getcode(start, s-start-1, &chr)) |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1370 goto store; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1371 } |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1372 } |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1373 if (unicodeescape_decoding_error(&s, &x, errors, message)) |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1374 goto onError; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1375 *p++ = x; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1376 break; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1377 |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1378 default: |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1379 *p++ = '\\'; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1380 *p++ = (unsigned char)s[-1]; |
|
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1381 break; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1382 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1383 } |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1384 if (_PyUnicode_Resize(&v, (int)(p - buf))) |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
1385 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1386 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1387 |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1388 ucnhashError: |
|
16200
3484670c37f2
Move uchhash functionality into unicodedata (after the recent
Fredrik Lundh <fredrik@pythonware.com>
parents:
16064
diff
changeset
|
1389 PyErr_SetString( |
|
3484670c37f2
Move uchhash functionality into unicodedata (after the recent
Fredrik Lundh <fredrik@pythonware.com>
parents:
16064
diff
changeset
|
1390 PyExc_UnicodeError, |
|
3484670c37f2
Move uchhash functionality into unicodedata (after the recent
Fredrik Lundh <fredrik@pythonware.com>
parents:
16064
diff
changeset
|
1391 "\\N escapes not supported (can't load unicodedata module)" |
|
3484670c37f2
Move uchhash functionality into unicodedata (after the recent
Fredrik Lundh <fredrik@pythonware.com>
parents:
16064
diff
changeset
|
1392 ); |
|
16064
a97aa9238771
Better error message if ucnhash cannot be found (obscure attribute
Fredrik Lundh <fredrik@pythonware.com>
parents:
16029
diff
changeset
|
1393 return NULL; |
|
a97aa9238771
Better error message if ucnhash cannot be found (obscure attribute
Fredrik Lundh <fredrik@pythonware.com>
parents:
16029
diff
changeset
|
1394 |
|
16667
725238293869
reorganized PyUnicode_DecodeUnicodeEscape a bit (in order to make it
Fredrik Lundh <fredrik@pythonware.com>
parents:
16332
diff
changeset
|
1395 onError: |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1396 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1397 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1398 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1399 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1400 /* Return a Unicode-Escape string version of the Unicode object. |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1401 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1402 If quotes is true, the string is enclosed in u"" or u'' quotes as |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1403 appropriate. |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1404 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1405 */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1406 |
|
12025
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
1407 static const Py_UNICODE *findchar(const Py_UNICODE *s, |
|
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
1408 int size, |
|
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
1409 Py_UNICODE ch); |
|
7994d9db7f4d
On 17-Mar-2000, Marc-Andre Lemburg said:
Barry Warsaw <barry@python.org>
parents:
11997
diff
changeset
|
1410 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1411 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1412 PyObject *unicodeescape_string(const Py_UNICODE *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1413 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1414 int quotes) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1415 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1416 PyObject *repr; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1417 char *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1418 |
|
16226
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1419 static const char *hexdigit = "0123456789abcdef"; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1420 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1421 repr = PyString_FromStringAndSize(NULL, 2 + 6*size + 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1422 if (repr == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1423 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1424 |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1425 p = PyString_AS_STRING(repr); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1426 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1427 if (quotes) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1428 *p++ = 'u'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1429 *p++ = (findchar(s, size, '\'') && |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1430 !findchar(s, size, '"')) ? '"' : '\''; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1431 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1432 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1433 Py_UNICODE ch = *s++; |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1434 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1435 /* Escape quotes */ |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1436 if (quotes && |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1437 (ch == (Py_UNICODE) PyString_AS_STRING(repr)[1] || ch == '\\')) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1438 *p++ = '\\'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1439 *p++ = (char) ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1440 } |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1441 |
|
18773
743f8e1d953c
#ifdef out generation of \U escapes unless Py_UNICODE_WIDE. This
Guido van Rossum <guido@python.org>
parents:
18324
diff
changeset
|
1442 #ifdef Py_UNICODE_WIDE |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1443 /* Map 21-bit characters to '\U00xxxxxx' */ |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1444 else if (ch >= 0x10000) { |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1445 int offset = p - PyString_AS_STRING(repr); |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1446 |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1447 /* Resize the string if necessary */ |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1448 if (offset + 12 > PyString_GET_SIZE(repr)) { |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1449 if (_PyString_Resize(&repr, PyString_GET_SIZE(repr) + 100)) |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1450 goto onError; |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1451 p = PyString_AS_STRING(repr) + offset; |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1452 } |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1453 |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1454 *p++ = '\\'; |
|
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1455 *p++ = 'U'; |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1456 *p++ = hexdigit[(ch >> 28) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1457 *p++ = hexdigit[(ch >> 24) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1458 *p++ = hexdigit[(ch >> 20) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1459 *p++ = hexdigit[(ch >> 16) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1460 *p++ = hexdigit[(ch >> 12) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1461 *p++ = hexdigit[(ch >> 8) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1462 *p++ = hexdigit[(ch >> 4) & 0x0000000F]; |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1463 *p++ = hexdigit[ch & 0x0000000F]; |
|
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1464 continue; |
|
18292
ffbb9c918ac0
Support using UCS-4 as the Py_UNICODE type:
Martin v. Löwis <martin@v.loewis.de>
parents:
18280
diff
changeset
|
1465 } |
|
18773
743f8e1d953c
#ifdef out generation of \U escapes unless Py_UNICODE_WIDE. This
Guido van Rossum <guido@python.org>
parents:
18324
diff
changeset
|
1466 #endif |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1467 /* Map UTF-16 surrogate pairs to Unicode \UXXXXXXXX escapes */ |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1468 else if (ch >= 0xD800 && ch < 0xDC00) { |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1469 Py_UNICODE ch2; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1470 Py_UCS4 ucs; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1471 |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1472 ch2 = *s++; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1473 size--; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1474 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1475 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1476 *p++ = '\\'; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1477 *p++ = 'U'; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1478 *p++ = hexdigit[(ucs >> 28) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1479 *p++ = hexdigit[(ucs >> 24) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1480 *p++ = hexdigit[(ucs >> 20) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1481 *p++ = hexdigit[(ucs >> 16) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1482 *p++ = hexdigit[(ucs >> 12) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1483 *p++ = hexdigit[(ucs >> 8) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1484 *p++ = hexdigit[(ucs >> 4) & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1485 *p++ = hexdigit[ucs & 0x0000000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1486 continue; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1487 } |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1488 /* Fall through: isolated surrogates are copied as-is */ |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1489 s--; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1490 size++; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1491 } |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1492 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1493 /* Map 16-bit characters to '\uxxxx' */ |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1494 if (ch >= 256) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1495 *p++ = '\\'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1496 *p++ = 'u'; |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1497 *p++ = hexdigit[(ch >> 12) & 0x000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1498 *p++ = hexdigit[(ch >> 8) & 0x000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1499 *p++ = hexdigit[(ch >> 4) & 0x000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1500 *p++ = hexdigit[ch & 0x000F]; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1501 } |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1502 |
|
16226
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1503 /* Map special whitespace to '\t', \n', '\r' */ |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1504 else if (ch == '\t') { |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1505 *p++ = '\\'; |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1506 *p++ = 't'; |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1507 } |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1508 else if (ch == '\n') { |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1509 *p++ = '\\'; |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1510 *p++ = 'n'; |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1511 } |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1512 else if (ch == '\r') { |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1513 *p++ = '\\'; |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1514 *p++ = 'r'; |
|
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1515 } |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1516 |
|
16226
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1517 /* Map non-printable US ASCII to '\xhh' */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1518 else if (ch < ' ' || ch >= 128) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1519 *p++ = '\\'; |
|
16226
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1520 *p++ = 'x'; |
|
18774
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1521 *p++ = hexdigit[(ch >> 4) & 0x000F]; |
|
57684d3cefce
Make the unicode-escape and the UTF-16 codecs handle surrogates
Marc-André Lemburg <mal@egenix.com>
parents:
18773
diff
changeset
|
1522 *p++ = hexdigit[ch & 0x000F]; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1523 } |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1524 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1525 /* Copy everything else as-is */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1526 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1527 *p++ = (char) ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1528 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1529 if (quotes) |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1530 *p++ = PyString_AS_STRING(repr)[1]; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1531 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1532 *p = '\0'; |
|
18828
081d96fbcf43
Fix for bug #444493: u'\U00010001' segfaults with current CVS on
Marc-André Lemburg <mal@egenix.com>
parents:
18774
diff
changeset
|
1533 if (_PyString_Resize(&repr, p - PyString_AS_STRING(repr))) |
| 12329 | 1534 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1535 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1536 return repr; |
| 12329 | 1537 |
| 1538 onError: | |
| 1539 Py_DECREF(repr); | |
| 1540 return NULL; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1541 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1542 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1543 PyObject *PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1544 int size) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1545 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1546 return unicodeescape_string(s, size, 0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1547 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1548 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1549 PyObject *PyUnicode_AsUnicodeEscapeString(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1550 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1551 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1552 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1553 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1554 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1555 return PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1556 PyUnicode_GET_SIZE(unicode)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1557 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1558 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1559 /* --- Raw Unicode Escape Codec ------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1560 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1561 PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1562 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1563 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1564 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1565 PyUnicodeObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1566 Py_UNICODE *p, *buf; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1567 const char *end; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1568 const char *bs; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1569 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1570 /* Escaped strings will always be longer than the resulting |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1571 Unicode string, so we start with size here and then reduce the |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1572 length after conversion to the true value. */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1573 v = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1574 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1575 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1576 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1577 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1578 p = buf = PyUnicode_AS_UNICODE(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1579 end = s + size; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1580 while (s < end) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1581 unsigned char c; |
|
13396
759f698740cc
Fix to bug #393 (UTF16 codec didn't like empty strings) and
Marc-André Lemburg <mal@egenix.com>
parents:
13394
diff
changeset
|
1582 Py_UNICODE x; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1583 int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1584 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1585 /* Non-escape characters are interpreted as Unicode ordinals */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1586 if (*s != '\\') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1587 *p++ = (unsigned char)*s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1588 continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1589 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1590 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1591 /* \u-escapes are only interpreted iff the number of leading |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1592 backslashes if odd */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1593 bs = s; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1594 for (;s < end;) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1595 if (*s != '\\') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1596 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1597 *p++ = (unsigned char)*s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1598 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1599 if (((s - bs) & 1) == 0 || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1600 s >= end || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1601 *s != 'u') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1602 continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1603 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1604 p--; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1605 s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1606 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1607 /* \uXXXX with 4 hex digits */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1608 for (x = 0, i = 0; i < 4; i++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1609 c = (unsigned char)s[i]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1610 if (!isxdigit(c)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1611 if (unicodeescape_decoding_error(&s, &x, errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1612 "truncated \\uXXXX")) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1613 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1614 i++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1615 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1616 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1617 x = (x<<4) & ~0xF; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1618 if (c >= '0' && c <= '9') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1619 x += c - '0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1620 else if (c >= 'a' && c <= 'f') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1621 x += 10 + c - 'a'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1622 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1623 x += 10 + c - 'A'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1624 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1625 s += i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1626 *p++ = x; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1627 } |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1628 if (_PyUnicode_Resize(&v, (int)(p - buf))) |
| 12329 | 1629 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1630 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1631 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1632 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1633 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1634 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1635 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1636 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1637 PyObject *PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1638 int size) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1639 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1640 PyObject *repr; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1641 char *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1642 char *q; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1643 |
|
16226
c7c404b35f33
Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
Ka-Ping Yee <ping@zesty.ca>
parents:
16200
diff
changeset
|
1644 static const char *hexdigit = "0123456789abcdef"; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1645 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1646 repr = PyString_FromStringAndSize(NULL, 6 * size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1647 if (repr == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1648 return NULL; |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1649 if (size == 0) |
|
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1650 return repr; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1651 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1652 p = q = PyString_AS_STRING(repr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1653 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1654 Py_UNICODE ch = *s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1655 /* Map 16-bit characters to '\uxxxx' */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1656 if (ch >= 256) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1657 *p++ = '\\'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1658 *p++ = 'u'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1659 *p++ = hexdigit[(ch >> 12) & 0xf]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1660 *p++ = hexdigit[(ch >> 8) & 0xf]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1661 *p++ = hexdigit[(ch >> 4) & 0xf]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1662 *p++ = hexdigit[ch & 15]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1663 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1664 /* Copy everything else as-is */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1665 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1666 *p++ = (char) ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1667 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1668 *p = '\0'; |
| 12329 | 1669 if (_PyString_Resize(&repr, p - q)) |
| 1670 goto onError; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1671 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1672 return repr; |
| 12329 | 1673 |
| 1674 onError: | |
| 1675 Py_DECREF(repr); | |
| 1676 return NULL; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1677 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1678 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1679 PyObject *PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1680 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1681 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1682 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1683 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1684 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1685 return PyUnicode_EncodeRawUnicodeEscape(PyUnicode_AS_UNICODE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1686 PyUnicode_GET_SIZE(unicode)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1687 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1688 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1689 /* --- Latin-1 Codec ------------------------------------------------------ */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1690 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1691 PyObject *PyUnicode_DecodeLatin1(const char *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1692 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1693 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1694 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1695 PyUnicodeObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1696 Py_UNICODE *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1697 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1698 /* Latin-1 is equivalent to the first 256 ordinals in Unicode. */ |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1699 if (size == 1 && *(unsigned char*)s < 256) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1700 Py_UNICODE r = *(unsigned char*)s; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1701 return PyUnicode_FromUnicode(&r, 1); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1702 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1703 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1704 v = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1705 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1706 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1707 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1708 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1709 p = PyUnicode_AS_UNICODE(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1710 while (size-- > 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1711 *p++ = (unsigned char)*s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1712 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1713 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1714 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1715 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1716 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1717 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1718 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1719 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1720 int latin1_encoding_error(const Py_UNICODE **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1721 char **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1722 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1723 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1724 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1725 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1726 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1727 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1728 "Latin-1 encoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1729 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1730 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1731 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1732 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1733 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1734 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1735 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1736 **dest = '?'; |
| 12329 | 1737 (*dest)++; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1738 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1739 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1740 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1741 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1742 "Latin-1 encoding error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1743 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1744 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1745 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1746 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1747 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1748 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1749 PyObject *PyUnicode_EncodeLatin1(const Py_UNICODE *p, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1750 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1751 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1752 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1753 PyObject *repr; |
| 12329 | 1754 char *s, *start; |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1755 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1756 repr = PyString_FromStringAndSize(NULL, size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1757 if (repr == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1758 return NULL; |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1759 if (size == 0) |
|
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1760 return repr; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1761 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1762 s = PyString_AS_STRING(repr); |
| 12329 | 1763 start = s; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1764 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1765 Py_UNICODE ch = *p++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1766 if (ch >= 256) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1767 if (latin1_encoding_error(&p, &s, errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1768 "ordinal not in range(256)")) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1769 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1770 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1771 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1772 *s++ = (char)ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1773 } |
| 12329 | 1774 /* Resize if error handling skipped some characters */ |
| 1775 if (s - start < PyString_GET_SIZE(repr)) | |
| 1776 if (_PyString_Resize(&repr, s - start)) | |
| 1777 goto onError; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1778 return repr; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1779 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1780 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1781 Py_DECREF(repr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1782 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1783 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1784 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1785 PyObject *PyUnicode_AsLatin1String(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1786 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1787 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1788 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1789 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1790 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1791 return PyUnicode_EncodeLatin1(PyUnicode_AS_UNICODE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1792 PyUnicode_GET_SIZE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1793 NULL); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1794 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1795 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1796 /* --- 7-bit ASCII Codec -------------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1797 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1798 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1799 int ascii_decoding_error(const char **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1800 Py_UNICODE **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1801 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1802 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1803 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1804 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1805 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1806 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1807 "ASCII decoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1808 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1809 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1810 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1811 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1812 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1813 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1814 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1815 **dest = Py_UNICODE_REPLACEMENT_CHARACTER; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1816 (*dest)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1817 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1818 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1819 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1820 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1821 "ASCII decoding error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1822 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1823 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1824 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1825 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1826 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1827 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1828 PyObject *PyUnicode_DecodeASCII(const char *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1829 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1830 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1831 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1832 PyUnicodeObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1833 Py_UNICODE *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1834 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1835 /* ASCII is equivalent to the first 128 ordinals in Unicode. */ |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1836 if (size == 1 && *(unsigned char*)s < 128) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1837 Py_UNICODE r = *(unsigned char*)s; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1838 return PyUnicode_FromUnicode(&r, 1); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1839 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1840 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1841 v = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1842 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1843 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1844 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1845 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1846 p = PyUnicode_AS_UNICODE(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1847 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1848 register unsigned char c; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1849 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1850 c = (unsigned char)*s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1851 if (c < 128) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1852 *p++ = c; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1853 else if (ascii_decoding_error(&s, &p, errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1854 "ordinal not in range(128)")) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1855 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1856 } |
| 12329 | 1857 if (p - PyUnicode_AS_UNICODE(v) < PyString_GET_SIZE(v)) |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
1858 if (_PyUnicode_Resize(&v, (int)(p - PyUnicode_AS_UNICODE(v)))) |
| 12329 | 1859 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1860 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1861 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1862 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1863 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1864 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1865 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1866 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1867 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1868 int ascii_encoding_error(const Py_UNICODE **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1869 char **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1870 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1871 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1872 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1873 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1874 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1875 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1876 "ASCII encoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1877 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1878 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1879 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1880 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1881 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1882 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1883 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1884 **dest = '?'; |
| 12329 | 1885 (*dest)++; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1886 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1887 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1888 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1889 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1890 "ASCII encoding error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
1891 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1892 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1893 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1894 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1895 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1896 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1897 PyObject *PyUnicode_EncodeASCII(const Py_UNICODE *p, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1898 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1899 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1900 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1901 PyObject *repr; |
| 12329 | 1902 char *s, *start; |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1903 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1904 repr = PyString_FromStringAndSize(NULL, size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1905 if (repr == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1906 return NULL; |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1907 if (size == 0) |
|
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1908 return repr; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1909 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1910 s = PyString_AS_STRING(repr); |
| 12329 | 1911 start = s; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1912 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1913 Py_UNICODE ch = *p++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1914 if (ch >= 128) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1915 if (ascii_encoding_error(&p, &s, errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1916 "ordinal not in range(128)")) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1917 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1918 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1919 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1920 *s++ = (char)ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1921 } |
| 12329 | 1922 /* Resize if error handling skipped some characters */ |
| 1923 if (s - start < PyString_GET_SIZE(repr)) | |
| 1924 if (_PyString_Resize(&repr, s - start)) | |
| 1925 goto onError; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1926 return repr; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1927 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1928 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1929 Py_DECREF(repr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1930 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1931 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1932 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1933 PyObject *PyUnicode_AsASCIIString(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1934 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1935 if (!PyUnicode_Check(unicode)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1936 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1937 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1938 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1939 return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1940 PyUnicode_GET_SIZE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1941 NULL); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1942 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1943 |
|
18278
b5658a230e1a
experimental UCS-4 support: don't assume that MS_WIN32 implies
Fredrik Lundh <fredrik@pythonware.com>
parents:
18120
diff
changeset
|
1944 #if defined(MS_WIN32) && defined(HAVE_USABLE_WCHAR_T) |
| 12193 | 1945 |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1946 /* --- MBCS codecs for Windows -------------------------------------------- */ |
| 12193 | 1947 |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1948 PyObject *PyUnicode_DecodeMBCS(const char *s, |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1949 int size, |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1950 const char *errors) |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1951 { |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1952 PyUnicodeObject *v; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1953 Py_UNICODE *p; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1954 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1955 /* First get the size of the result */ |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1956 DWORD usize = MultiByteToWideChar(CP_ACP, 0, s, size, NULL, 0); |
|
12582
0bab1e36a3a6
Mark Hammond should get his act into gear (his words :-). Zero length
Guido van Rossum <guido@python.org>
parents:
12577
diff
changeset
|
1957 if (size > 0 && usize==0) |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1958 return PyErr_SetFromWindowsErrWithFilename(0, NULL); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1959 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1960 v = _PyUnicode_New(usize); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1961 if (v == NULL) |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1962 return NULL; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1963 if (usize == 0) |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1964 return (PyObject *)v; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1965 p = PyUnicode_AS_UNICODE(v); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1966 if (0 == MultiByteToWideChar(CP_ACP, 0, s, size, p, usize)) { |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1967 Py_DECREF(v); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1968 return PyErr_SetFromWindowsErrWithFilename(0, NULL); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1969 } |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1970 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1971 return (PyObject *)v; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1972 } |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1973 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1974 PyObject *PyUnicode_EncodeMBCS(const Py_UNICODE *p, |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1975 int size, |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1976 const char *errors) |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1977 { |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1978 PyObject *repr; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1979 char *s; |
|
12582
0bab1e36a3a6
Mark Hammond should get his act into gear (his words :-). Zero length
Guido van Rossum <guido@python.org>
parents:
12577
diff
changeset
|
1980 DWORD mbcssize; |
|
0bab1e36a3a6
Mark Hammond should get his act into gear (his words :-). Zero length
Guido van Rossum <guido@python.org>
parents:
12577
diff
changeset
|
1981 |
|
0bab1e36a3a6
Mark Hammond should get his act into gear (his words :-). Zero length
Guido van Rossum <guido@python.org>
parents:
12577
diff
changeset
|
1982 /* If there are no characters, bail now! */ |
|
0bab1e36a3a6
Mark Hammond should get his act into gear (his words :-). Zero length
Guido van Rossum <guido@python.org>
parents:
12577
diff
changeset
|
1983 if (size==0) |
|
0bab1e36a3a6
Mark Hammond should get his act into gear (his words :-). Zero length
Guido van Rossum <guido@python.org>
parents:
12577
diff
changeset
|
1984 return PyString_FromString(""); |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1985 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1986 /* First get the size of the result */ |
|
12582
0bab1e36a3a6
Mark Hammond should get his act into gear (his words :-). Zero length
Guido van Rossum <guido@python.org>
parents:
12577
diff
changeset
|
1987 mbcssize = WideCharToMultiByte(CP_ACP, 0, p, size, NULL, 0, NULL, NULL); |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1988 if (mbcssize==0) |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1989 return PyErr_SetFromWindowsErrWithFilename(0, NULL); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1990 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1991 repr = PyString_FromStringAndSize(NULL, mbcssize); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1992 if (repr == NULL) |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1993 return NULL; |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
1994 if (mbcssize == 0) |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1995 return repr; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1996 |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1997 /* Do the conversion */ |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1998 s = PyString_AS_STRING(repr); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
1999 if (0 == WideCharToMultiByte(CP_ACP, 0, p, size, s, mbcssize, NULL, NULL)) { |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
2000 Py_DECREF(repr); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
2001 return PyErr_SetFromWindowsErrWithFilename(0, NULL); |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
2002 } |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
2003 return repr; |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
2004 } |
| 12193 | 2005 |
|
12067
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
2006 #endif /* MS_WIN32 */ |
|
bcab189ddf86
MBCS codecs. (Win32 only.) By Mark Hammond.
Guido van Rossum <guido@python.org>
parents:
12025
diff
changeset
|
2007 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2008 /* --- Character Mapping Codec -------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2009 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2010 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2011 int charmap_decoding_error(const char **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2012 Py_UNICODE **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2013 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2014 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2015 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2016 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2017 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2018 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
2019 "charmap decoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2020 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2021 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2022 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2023 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2024 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2025 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2026 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2027 **dest = Py_UNICODE_REPLACEMENT_CHARACTER; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2028 (*dest)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2029 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2030 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2031 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2032 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2033 "charmap decoding error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
2034 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2035 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2036 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2037 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2038 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2039 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2040 PyObject *PyUnicode_DecodeCharmap(const char *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2041 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2042 PyObject *mapping, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2043 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2044 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2045 PyUnicodeObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2046 Py_UNICODE *p; |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2047 int extrachars = 0; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2048 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2049 /* Default to Latin-1 */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2050 if (mapping == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2051 return PyUnicode_DecodeLatin1(s, size, errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2052 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2053 v = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2054 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2055 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2056 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2057 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2058 p = PyUnicode_AS_UNICODE(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2059 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2060 unsigned char ch = *s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2061 PyObject *w, *x; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2062 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2063 /* Get mapping (char ordinal -> integer, Unicode char or None) */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2064 w = PyInt_FromLong((long)ch); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2065 if (w == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2066 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2067 x = PyObject_GetItem(mapping, w); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2068 Py_DECREF(w); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2069 if (x == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2070 if (PyErr_ExceptionMatches(PyExc_LookupError)) { |
|
15706
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2071 /* No mapping found means: mapping is undefined. */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2072 PyErr_Clear(); |
|
15706
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2073 x = Py_None; |
|
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2074 Py_INCREF(x); |
|
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2075 } else |
|
15910
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2076 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2077 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2078 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2079 /* Apply mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2080 if (PyInt_Check(x)) { |
|
13390
62754b9ec7df
Fixed a couple of places where 'int' was used where 'long'
Marc-André Lemburg <mal@egenix.com>
parents:
13356
diff
changeset
|
2081 long value = PyInt_AS_LONG(x); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2082 if (value < 0 || value > 65535) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2083 PyErr_SetString(PyExc_TypeError, |
|
12909
be36f103a953
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12902
diff
changeset
|
2084 "character mapping must be in range(65536)"); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2085 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2086 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2087 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2088 *p++ = (Py_UNICODE)value; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2089 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2090 else if (x == Py_None) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2091 /* undefined mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2092 if (charmap_decoding_error(&s, &p, errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2093 "character maps to <undefined>")) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2094 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2095 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2096 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2097 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2098 else if (PyUnicode_Check(x)) { |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2099 int targetsize = PyUnicode_GET_SIZE(x); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2100 |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2101 if (targetsize == 1) |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2102 /* 1-1 mapping */ |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2103 *p++ = *PyUnicode_AS_UNICODE(x); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2104 |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2105 else if (targetsize > 1) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2106 /* 1-n mapping */ |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2107 if (targetsize > extrachars) { |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2108 /* resize first */ |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2109 int oldpos = (int)(p - PyUnicode_AS_UNICODE(v)); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2110 int needed = (targetsize - extrachars) + \ |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2111 (targetsize << 2); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2112 extrachars += needed; |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2113 if (_PyUnicode_Resize(&v, |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2114 PyUnicode_GET_SIZE(v) + needed)) { |
|
15910
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2115 Py_DECREF(x); |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2116 goto onError; |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2117 } |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2118 p = PyUnicode_AS_UNICODE(v) + oldpos; |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2119 } |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2120 Py_UNICODE_COPY(p, |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2121 PyUnicode_AS_UNICODE(x), |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2122 targetsize); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2123 p += targetsize; |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2124 extrachars -= targetsize; |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2125 } |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2126 /* 1-0 mapping: skip the character */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2127 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2128 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2129 /* wrong return value */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2130 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2131 "character mapping must return integer, None or unicode"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2132 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2133 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2134 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2135 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2136 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2137 if (p - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v)) |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2138 if (_PyUnicode_Resize(&v, (int)(p - PyUnicode_AS_UNICODE(v)))) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2139 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2140 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2141 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2142 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2143 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2144 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2145 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2146 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2147 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2148 int charmap_encoding_error(const Py_UNICODE **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2149 char **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2150 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2151 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2152 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2153 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2154 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2155 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
2156 "charmap encoding error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2157 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2158 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2159 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2160 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2161 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2162 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2163 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2164 **dest = '?'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2165 (*dest)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2166 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2167 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2168 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2169 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2170 "charmap encoding error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
2171 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2172 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2173 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2174 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2175 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2176 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2177 PyObject *PyUnicode_EncodeCharmap(const Py_UNICODE *p, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2178 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2179 PyObject *mapping, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2180 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2181 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2182 PyObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2183 char *s; |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2184 int extrachars = 0; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2185 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2186 /* Default to Latin-1 */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2187 if (mapping == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2188 return PyUnicode_EncodeLatin1(p, size, errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2189 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2190 v = PyString_FromStringAndSize(NULL, size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2191 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2192 return NULL; |
|
13966
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
2193 if (size == 0) |
|
91ddeed12fa7
Fixed a couple of instances where a 0-length string was being
Marc-André Lemburg <mal@egenix.com>
parents:
13946
diff
changeset
|
2194 return v; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2195 s = PyString_AS_STRING(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2196 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2197 Py_UNICODE ch = *p++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2198 PyObject *w, *x; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2199 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2200 /* Get mapping (Unicode ordinal -> string char, integer or None) */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2201 w = PyInt_FromLong((long)ch); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2202 if (w == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2203 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2204 x = PyObject_GetItem(mapping, w); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2205 Py_DECREF(w); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2206 if (x == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2207 if (PyErr_ExceptionMatches(PyExc_LookupError)) { |
|
15706
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2208 /* No mapping found means: mapping is undefined. */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2209 PyErr_Clear(); |
|
15706
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2210 x = Py_None; |
|
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2211 Py_INCREF(x); |
|
bf9bb0e3dd34
This patch changes the default behaviour of the builtin charmap
Marc-André Lemburg <mal@egenix.com>
parents:
15631
diff
changeset
|
2212 } else |
|
15910
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2213 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2214 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2215 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2216 /* Apply mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2217 if (PyInt_Check(x)) { |
|
13390
62754b9ec7df
Fixed a couple of places where 'int' was used where 'long'
Marc-André Lemburg <mal@egenix.com>
parents:
13356
diff
changeset
|
2218 long value = PyInt_AS_LONG(x); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2219 if (value < 0 || value > 255) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2220 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2221 "character mapping must be in range(256)"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2222 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2223 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2224 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2225 *s++ = (char)value; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2226 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2227 else if (x == Py_None) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2228 /* undefined mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2229 if (charmap_encoding_error(&p, &s, errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2230 "character maps to <undefined>")) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2231 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2232 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2233 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2234 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2235 else if (PyString_Check(x)) { |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2236 int targetsize = PyString_GET_SIZE(x); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2237 |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2238 if (targetsize == 1) |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2239 /* 1-1 mapping */ |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2240 *s++ = *PyString_AS_STRING(x); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2241 |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2242 else if (targetsize > 1) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2243 /* 1-n mapping */ |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2244 if (targetsize > extrachars) { |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2245 /* resize first */ |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2246 int oldpos = (int)(s - PyString_AS_STRING(v)); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2247 int needed = (targetsize - extrachars) + \ |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2248 (targetsize << 2); |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2249 extrachars += needed; |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2250 if (_PyString_Resize(&v, PyString_GET_SIZE(v) + needed)) { |
|
15910
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2251 Py_DECREF(x); |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2252 goto onError; |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2253 } |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2254 s = PyString_AS_STRING(v) + oldpos; |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2255 } |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2256 memcpy(s, PyString_AS_STRING(x), targetsize); |
|
15749
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2257 s += targetsize; |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2258 extrachars -= targetsize; |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2259 } |
|
77c761cd1272
This patch adds a new feature to the builtin charmap codec:
Marc-André Lemburg <mal@egenix.com>
parents:
15706
diff
changeset
|
2260 /* 1-0 mapping: skip the character */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2261 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2262 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2263 /* wrong return value */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2264 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2265 "character mapping must return integer, None or unicode"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2266 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2267 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2268 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2269 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2270 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2271 if (s - PyString_AS_STRING(v) < PyString_GET_SIZE(v)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2272 if (_PyString_Resize(&v, (int)(s - PyString_AS_STRING(v)))) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2273 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2274 return v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2275 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2276 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2277 Py_DECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2278 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2279 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2280 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2281 PyObject *PyUnicode_AsCharmapString(PyObject *unicode, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2282 PyObject *mapping) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2283 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2284 if (!PyUnicode_Check(unicode) || mapping == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2285 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2286 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2287 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2288 return PyUnicode_EncodeCharmap(PyUnicode_AS_UNICODE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2289 PyUnicode_GET_SIZE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2290 mapping, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2291 NULL); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2292 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2293 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2294 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2295 int translate_error(const Py_UNICODE **source, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2296 Py_UNICODE **dest, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2297 const char *errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2298 const char *details) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2299 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2300 if ((errors == NULL) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2301 (strcmp(errors,"strict") == 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2302 PyErr_Format(PyExc_UnicodeError, |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
2303 "translate error: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2304 details); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2305 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2306 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2307 else if (strcmp(errors,"ignore") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2308 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2309 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2310 else if (strcmp(errors,"replace") == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2311 **dest = '?'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2312 (*dest)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2313 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2314 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2315 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2316 PyErr_Format(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2317 "translate error; " |
|
12320
5de0b939fe61
Skip Montanaro: add string precisions to calls to PyErr_Format
Guido van Rossum <guido@python.org>
parents:
12275
diff
changeset
|
2318 "unknown error handling code: %.400s", |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2319 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2320 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2321 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2322 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2323 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2324 PyObject *PyUnicode_TranslateCharmap(const Py_UNICODE *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2325 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2326 PyObject *mapping, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2327 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2328 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2329 PyUnicodeObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2330 Py_UNICODE *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2331 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2332 if (mapping == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2333 PyErr_BadArgument(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2334 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2335 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2336 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2337 /* Output will never be longer than input */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2338 v = _PyUnicode_New(size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2339 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2340 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2341 if (size == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2342 goto done; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2343 p = PyUnicode_AS_UNICODE(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2344 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2345 Py_UNICODE ch = *s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2346 PyObject *w, *x; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2347 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2348 /* Get mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2349 w = PyInt_FromLong(ch); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2350 if (w == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2351 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2352 x = PyObject_GetItem(mapping, w); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2353 Py_DECREF(w); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2354 if (x == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2355 if (PyErr_ExceptionMatches(PyExc_LookupError)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2356 /* No mapping found: default to 1-1 mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2357 PyErr_Clear(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2358 *p++ = ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2359 continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2360 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2361 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2362 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2363 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2364 /* Apply mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2365 if (PyInt_Check(x)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2366 *p++ = (Py_UNICODE)PyInt_AS_LONG(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2367 else if (x == Py_None) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2368 /* undefined mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2369 if (translate_error(&s, &p, errors, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2370 "character maps to <undefined>")) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2371 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2372 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2373 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2374 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2375 else if (PyUnicode_Check(x)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2376 if (PyUnicode_GET_SIZE(x) != 1) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2377 /* 1-n mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2378 PyErr_SetString(PyExc_NotImplementedError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2379 "1-n mappings are currently not implemented"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2380 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2381 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2382 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2383 *p++ = *PyUnicode_AS_UNICODE(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2384 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2385 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2386 /* wrong return value */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2387 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2388 "translate mapping must return integer, None or unicode"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2389 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2390 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2391 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2392 Py_DECREF(x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2393 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2394 if (p - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v)) |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2395 if (_PyUnicode_Resize(&v, (int)(p - PyUnicode_AS_UNICODE(v)))) |
| 12329 | 2396 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2397 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2398 done: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2399 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2400 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2401 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2402 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2403 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2404 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2405 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2406 PyObject *PyUnicode_Translate(PyObject *str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2407 PyObject *mapping, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2408 const char *errors) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2409 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2410 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2411 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2412 str = PyUnicode_FromObject(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2413 if (str == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2414 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2415 result = PyUnicode_TranslateCharmap(PyUnicode_AS_UNICODE(str), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2416 PyUnicode_GET_SIZE(str), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2417 mapping, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2418 errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2419 Py_DECREF(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2420 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2421 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2422 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2423 Py_XDECREF(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2424 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2425 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2426 |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2427 /* --- Decimal Encoder ---------------------------------------------------- */ |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2428 |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2429 int PyUnicode_EncodeDecimal(Py_UNICODE *s, |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2430 int length, |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2431 char *output, |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2432 const char *errors) |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2433 { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2434 Py_UNICODE *p, *end; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2435 |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2436 if (output == NULL) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2437 PyErr_BadArgument(); |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2438 return -1; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2439 } |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2440 |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2441 p = s; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2442 end = s + length; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2443 while (p < end) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2444 register Py_UNICODE ch = *p++; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2445 int decimal; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2446 |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2447 if (Py_UNICODE_ISSPACE(ch)) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2448 *output++ = ' '; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2449 continue; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2450 } |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2451 decimal = Py_UNICODE_TODECIMAL(ch); |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2452 if (decimal >= 0) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2453 *output++ = '0' + decimal; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2454 continue; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2455 } |
|
12275
cbfa95a6a03e
Conrad Huang points out that "if (0 < ch < 256)", while legal C,
Guido van Rossum <guido@python.org>
parents:
12249
diff
changeset
|
2456 if (0 < ch && ch < 256) { |
|
12577
85f00f8cd674
Fix warning detected by VC++ on assignment of Py_UNICODE to char.
Guido van Rossum <guido@python.org>
parents:
12576
diff
changeset
|
2457 *output++ = (char)ch; |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2458 continue; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2459 } |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2460 /* All other characters are considered invalid */ |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2461 if (errors == NULL || strcmp(errors, "strict") == 0) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2462 PyErr_SetString(PyExc_ValueError, |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2463 "invalid decimal Unicode string"); |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2464 goto onError; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2465 } |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2466 else if (strcmp(errors, "ignore") == 0) |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2467 continue; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2468 else if (strcmp(errors, "replace") == 0) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2469 *output++ = '?'; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2470 continue; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2471 } |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2472 } |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2473 /* 0-terminate the output string */ |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2474 *output++ = '\0'; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2475 return 0; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2476 |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2477 onError: |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2478 return -1; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2479 } |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
2480 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2481 /* --- Helpers ------------------------------------------------------------ */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2482 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2483 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2484 int count(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2485 int start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2486 int end, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2487 PyUnicodeObject *substring) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2488 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2489 int count = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2490 |
|
15910
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2491 if (start < 0) |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2492 start += self->length; |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2493 if (start < 0) |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2494 start = 0; |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2495 if (end > self->length) |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2496 end = self->length; |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2497 if (end < 0) |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2498 end += self->length; |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2499 if (end < 0) |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2500 end = 0; |
|
f7f3be3d00b9
Added checks to prevent PyUnicode_Count() from dumping core
Marc-André Lemburg <mal@egenix.com>
parents:
15749
diff
changeset
|
2501 |
|
12957
97dd6dc33503
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12939
diff
changeset
|
2502 if (substring->length == 0) |
|
97dd6dc33503
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12939
diff
changeset
|
2503 return (end - start + 1); |
|
97dd6dc33503
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12939
diff
changeset
|
2504 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2505 end -= substring->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2506 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2507 while (start <= end) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2508 if (Py_UNICODE_MATCH(self, start, substring)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2509 count++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2510 start += substring->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2511 } else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2512 start++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2513 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2514 return count; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2515 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2516 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2517 int PyUnicode_Count(PyObject *str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2518 PyObject *substr, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2519 int start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2520 int end) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2521 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2522 int result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2523 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2524 str = PyUnicode_FromObject(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2525 if (str == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2526 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2527 substr = PyUnicode_FromObject(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2528 if (substr == NULL) { |
|
12957
97dd6dc33503
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12939
diff
changeset
|
2529 Py_DECREF(str); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2530 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2531 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2532 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2533 result = count((PyUnicodeObject *)str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2534 start, end, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2535 (PyUnicodeObject *)substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2536 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2537 Py_DECREF(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2538 Py_DECREF(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2539 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2540 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2541 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2542 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2543 int findstring(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2544 PyUnicodeObject *substring, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2545 int start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2546 int end, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2547 int direction) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2548 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2549 if (start < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2550 start += self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2551 if (start < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2552 start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2553 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2554 if (substring->length == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2555 return start; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2556 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2557 if (end > self->length) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2558 end = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2559 if (end < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2560 end += self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2561 if (end < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2562 end = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2563 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2564 end -= substring->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2565 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2566 if (direction < 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2567 for (; end >= start; end--) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2568 if (Py_UNICODE_MATCH(self, end, substring)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2569 return end; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2570 } else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2571 for (; start <= end; start++) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2572 if (Py_UNICODE_MATCH(self, start, substring)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2573 return start; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2574 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2575 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2576 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2577 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2578 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2579 int PyUnicode_Find(PyObject *str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2580 PyObject *substr, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2581 int start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2582 int end, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2583 int direction) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2584 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2585 int result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2586 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2587 str = PyUnicode_FromObject(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2588 if (str == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2589 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2590 substr = PyUnicode_FromObject(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2591 if (substr == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2592 Py_DECREF(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2593 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2594 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2595 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2596 result = findstring((PyUnicodeObject *)str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2597 (PyUnicodeObject *)substr, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2598 start, end, direction); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2599 Py_DECREF(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2600 Py_DECREF(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2601 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2602 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2603 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2604 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2605 int tailmatch(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2606 PyUnicodeObject *substring, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2607 int start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2608 int end, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2609 int direction) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2610 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2611 if (start < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2612 start += self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2613 if (start < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2614 start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2615 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2616 if (substring->length == 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2617 return 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2618 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2619 if (end > self->length) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2620 end = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2621 if (end < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2622 end += self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2623 if (end < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2624 end = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2625 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2626 end -= substring->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2627 if (end < start) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2628 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2629 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2630 if (direction > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2631 if (Py_UNICODE_MATCH(self, end, substring)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2632 return 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2633 } else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2634 if (Py_UNICODE_MATCH(self, start, substring)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2635 return 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2636 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2637 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2638 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2639 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2640 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2641 int PyUnicode_Tailmatch(PyObject *str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2642 PyObject *substr, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2643 int start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2644 int end, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2645 int direction) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2646 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2647 int result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2648 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2649 str = PyUnicode_FromObject(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2650 if (str == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2651 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2652 substr = PyUnicode_FromObject(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2653 if (substr == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2654 Py_DECREF(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2655 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2656 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2657 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2658 result = tailmatch((PyUnicodeObject *)str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2659 (PyUnicodeObject *)substr, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2660 start, end, direction); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2661 Py_DECREF(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2662 Py_DECREF(substr); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2663 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2664 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2665 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2666 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2667 const Py_UNICODE *findchar(const Py_UNICODE *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2668 int size, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2669 Py_UNICODE ch) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2670 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2671 /* like wcschr, but doesn't stop at NULL characters */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2672 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2673 while (size-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2674 if (*s == ch) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2675 return s; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2676 s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2677 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2678 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2679 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2680 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2681 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2682 /* Apply fixfct filter to the Unicode object self and return a |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2683 reference to the modified object */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2684 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2685 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2686 PyObject *fixup(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2687 int (*fixfct)(PyUnicodeObject *s)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2688 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2689 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2690 PyUnicodeObject *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2691 |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2692 u = (PyUnicodeObject*) PyUnicode_FromUnicode(NULL, self->length); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2693 if (u == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2694 return NULL; |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2695 |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2696 Py_UNICODE_COPY(u->str, self->str, self->length); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2697 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2698 if (!fixfct(u)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2699 /* fixfct should return TRUE if it modified the buffer. If |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2700 FALSE, return a reference to the original buffer instead |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2701 (to save space, not time) */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2702 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2703 Py_DECREF(u); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2704 return (PyObject*) self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2705 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2706 return (PyObject*) u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2707 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2708 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2709 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2710 int fixupper(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2711 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2712 int len = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2713 Py_UNICODE *s = self->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2714 int status = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2715 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2716 while (len-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2717 register Py_UNICODE ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2718 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2719 ch = Py_UNICODE_TOUPPER(*s); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2720 if (ch != *s) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2721 status = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2722 *s = ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2723 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2724 s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2725 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2726 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2727 return status; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2728 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2729 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2730 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2731 int fixlower(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2732 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2733 int len = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2734 Py_UNICODE *s = self->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2735 int status = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2736 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2737 while (len-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2738 register Py_UNICODE ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2739 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2740 ch = Py_UNICODE_TOLOWER(*s); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2741 if (ch != *s) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2742 status = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2743 *s = ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2744 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2745 s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2746 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2747 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2748 return status; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2749 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2750 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2751 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2752 int fixswapcase(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2753 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2754 int len = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2755 Py_UNICODE *s = self->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2756 int status = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2757 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2758 while (len-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2759 if (Py_UNICODE_ISUPPER(*s)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2760 *s = Py_UNICODE_TOLOWER(*s); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2761 status = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2762 } else if (Py_UNICODE_ISLOWER(*s)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2763 *s = Py_UNICODE_TOUPPER(*s); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2764 status = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2765 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2766 s++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2767 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2768 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2769 return status; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2770 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2771 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2772 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2773 int fixcapitalize(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2774 { |
|
16332
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2775 int len = self->length; |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2776 Py_UNICODE *s = self->str; |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2777 int status = 0; |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2778 |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2779 if (len == 0) |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2780 return 0; |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2781 if (Py_UNICODE_ISLOWER(*s)) { |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2782 *s = Py_UNICODE_TOUPPER(*s); |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2783 status = 1; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2784 } |
|
16332
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2785 s++; |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2786 while (--len > 0) { |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2787 if (Py_UNICODE_ISUPPER(*s)) { |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2788 *s = Py_UNICODE_TOLOWER(*s); |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2789 status = 1; |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2790 } |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2791 s++; |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2792 } |
|
bacbb45fe844
Fixed .capitalize() method of Unicode objects to work like the
Marc-André Lemburg <mal@egenix.com>
parents:
16226
diff
changeset
|
2793 return status; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2794 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2795 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2796 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2797 int fixtitle(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2798 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2799 register Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2800 register Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2801 int previous_is_cased; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2802 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2803 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2804 if (PyUnicode_GET_SIZE(self) == 1) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2805 Py_UNICODE ch = Py_UNICODE_TOTITLE(*p); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2806 if (*p != ch) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2807 *p = ch; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2808 return 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2809 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2810 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2811 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2812 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2813 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2814 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2815 previous_is_cased = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2816 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2817 register const Py_UNICODE ch = *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2818 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2819 if (previous_is_cased) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2820 *p = Py_UNICODE_TOLOWER(ch); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2821 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2822 *p = Py_UNICODE_TOTITLE(ch); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2823 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2824 if (Py_UNICODE_ISLOWER(ch) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2825 Py_UNICODE_ISUPPER(ch) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2826 Py_UNICODE_ISTITLE(ch)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2827 previous_is_cased = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2828 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2829 previous_is_cased = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2830 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2831 return 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2832 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2833 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2834 PyObject *PyUnicode_Join(PyObject *separator, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2835 PyObject *seq) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2836 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2837 Py_UNICODE *sep; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2838 int seplen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2839 PyUnicodeObject *res = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2840 int reslen = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2841 Py_UNICODE *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2842 int sz = 100; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2843 int i; |
|
17687
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2844 PyObject *it; |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2845 |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2846 it = PyObject_GetIter(seq); |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2847 if (it == NULL) |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2848 return NULL; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2849 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2850 if (separator == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2851 Py_UNICODE blank = ' '; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2852 sep = ␣ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2853 seplen = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2854 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2855 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2856 separator = PyUnicode_FromObject(separator); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2857 if (separator == NULL) |
|
17687
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2858 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2859 sep = PyUnicode_AS_UNICODE(separator); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2860 seplen = PyUnicode_GET_SIZE(separator); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2861 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2862 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2863 res = _PyUnicode_New(sz); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2864 if (res == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2865 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2866 p = PyUnicode_AS_UNICODE(res); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2867 reslen = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2868 |
|
17687
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2869 for (i = 0; ; ++i) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2870 int itemlen; |
|
17687
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2871 PyObject *item = PyIter_Next(it); |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2872 if (item == NULL) { |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2873 if (PyErr_Occurred()) |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2874 goto onError; |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2875 break; |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2876 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2877 if (!PyUnicode_Check(item)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2878 PyObject *v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2879 v = PyUnicode_FromObject(item); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2880 Py_DECREF(item); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2881 item = v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2882 if (item == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2883 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2884 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2885 itemlen = PyUnicode_GET_SIZE(item); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2886 while (reslen + itemlen + seplen >= sz) { |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2887 if (_PyUnicode_Resize(&res, sz*2)) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2888 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2889 sz *= 2; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2890 p = PyUnicode_AS_UNICODE(res) + reslen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2891 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2892 if (i > 0) { |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2893 Py_UNICODE_COPY(p, sep, seplen); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2894 p += seplen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2895 reslen += seplen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2896 } |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2897 Py_UNICODE_COPY(p, PyUnicode_AS_UNICODE(item), itemlen); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2898 p += itemlen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2899 reslen += itemlen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2900 Py_DECREF(item); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2901 } |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
2902 if (_PyUnicode_Resize(&res, reslen)) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2903 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2904 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2905 Py_XDECREF(separator); |
|
17687
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2906 Py_DECREF(it); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2907 return (PyObject *)res; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2908 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2909 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2910 Py_XDECREF(separator); |
|
17687
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2911 Py_XDECREF(res); |
|
9e093bf8f6a9
Make unicode.join() work nice with iterators. This also required a change
Tim Peters <tim.peters@gmail.com>
parents:
17640
diff
changeset
|
2912 Py_DECREF(it); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2913 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2914 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2915 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2916 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2917 PyUnicodeObject *pad(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2918 int left, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2919 int right, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2920 Py_UNICODE fill) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2921 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2922 PyUnicodeObject *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2923 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2924 if (left < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2925 left = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2926 if (right < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2927 right = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2928 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2929 if (left == 0 && right == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2930 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2931 return self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2932 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2933 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2934 u = _PyUnicode_New(left + self->length + right); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2935 if (u) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2936 if (left) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2937 Py_UNICODE_FILL(u->str, fill, left); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2938 Py_UNICODE_COPY(u->str + left, self->str, self->length); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2939 if (right) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2940 Py_UNICODE_FILL(u->str + left + self->length, fill, right); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2941 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2942 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2943 return u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2944 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2945 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2946 #define SPLIT_APPEND(data, left, right) \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2947 str = PyUnicode_FromUnicode(data + left, right - left); \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2948 if (!str) \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2949 goto onError; \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2950 if (PyList_Append(list, str)) { \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2951 Py_DECREF(str); \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2952 goto onError; \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2953 } \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2954 else \ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2955 Py_DECREF(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2956 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2957 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2958 PyObject *split_whitespace(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2959 PyObject *list, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2960 int maxcount) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2961 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2962 register int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2963 register int j; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2964 int len = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2965 PyObject *str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2966 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2967 for (i = j = 0; i < len; ) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2968 /* find a token */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2969 while (i < len && Py_UNICODE_ISSPACE(self->str[i])) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2970 i++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2971 j = i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2972 while (i < len && !Py_UNICODE_ISSPACE(self->str[i])) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2973 i++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2974 if (j < i) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2975 if (maxcount-- <= 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2976 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2977 SPLIT_APPEND(self->str, j, i); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2978 while (i < len && Py_UNICODE_ISSPACE(self->str[i])) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2979 i++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2980 j = i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2981 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2982 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2983 if (j < len) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2984 SPLIT_APPEND(self->str, j, len); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2985 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2986 return list; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2987 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2988 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2989 Py_DECREF(list); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2990 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2991 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2992 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2993 PyObject *PyUnicode_Splitlines(PyObject *string, |
| 12369 | 2994 int keepends) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2995 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2996 register int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2997 register int j; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2998 int len; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2999 PyObject *list; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3000 PyObject *str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3001 Py_UNICODE *data; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3002 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3003 string = PyUnicode_FromObject(string); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3004 if (string == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3005 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3006 data = PyUnicode_AS_UNICODE(string); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3007 len = PyUnicode_GET_SIZE(string); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3008 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3009 list = PyList_New(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3010 if (!list) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3011 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3012 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3013 for (i = j = 0; i < len; ) { |
| 12369 | 3014 int eol; |
| 3015 | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3016 /* Find a line and append it */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3017 while (i < len && !Py_UNICODE_ISLINEBREAK(data[i])) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3018 i++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3019 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3020 /* Skip the line break reading CRLF as one line break */ |
| 12369 | 3021 eol = i; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3022 if (i < len) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3023 if (data[i] == '\r' && i + 1 < len && |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3024 data[i+1] == '\n') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3025 i += 2; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3026 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3027 i++; |
| 12369 | 3028 if (keepends) |
| 3029 eol = i; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3030 } |
| 12369 | 3031 SPLIT_APPEND(data, j, eol); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3032 j = i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3033 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3034 if (j < len) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3035 SPLIT_APPEND(data, j, len); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3036 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3037 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3038 Py_DECREF(string); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3039 return list; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3040 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3041 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3042 Py_DECREF(list); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3043 Py_DECREF(string); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3044 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3045 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3046 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3047 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3048 PyObject *split_char(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3049 PyObject *list, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3050 Py_UNICODE ch, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3051 int maxcount) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3052 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3053 register int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3054 register int j; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3055 int len = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3056 PyObject *str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3057 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3058 for (i = j = 0; i < len; ) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3059 if (self->str[i] == ch) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3060 if (maxcount-- <= 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3061 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3062 SPLIT_APPEND(self->str, j, i); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3063 i = j = i + 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3064 } else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3065 i++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3066 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3067 if (j <= len) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3068 SPLIT_APPEND(self->str, j, len); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3069 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3070 return list; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3071 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3072 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3073 Py_DECREF(list); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3074 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3075 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3076 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3077 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3078 PyObject *split_substring(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3079 PyObject *list, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3080 PyUnicodeObject *substring, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3081 int maxcount) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3082 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3083 register int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3084 register int j; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3085 int len = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3086 int sublen = substring->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3087 PyObject *str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3088 |
|
15609
0906c8e2c961
Fix off-by-one error in split_substring(). Fixes SF bug #122162.
Guido van Rossum <guido@python.org>
parents:
15579
diff
changeset
|
3089 for (i = j = 0; i <= len - sublen; ) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3090 if (Py_UNICODE_MATCH(self, i, substring)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3091 if (maxcount-- <= 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3092 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3093 SPLIT_APPEND(self->str, j, i); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3094 i = j = i + sublen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3095 } else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3096 i++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3097 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3098 if (j <= len) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3099 SPLIT_APPEND(self->str, j, len); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3100 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3101 return list; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3102 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3103 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3104 Py_DECREF(list); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3105 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3106 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3107 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3108 #undef SPLIT_APPEND |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3109 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3110 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3111 PyObject *split(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3112 PyUnicodeObject *substring, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3113 int maxcount) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3114 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3115 PyObject *list; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3116 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3117 if (maxcount < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3118 maxcount = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3119 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3120 list = PyList_New(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3121 if (!list) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3122 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3123 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3124 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3125 return split_whitespace(self,list,maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3126 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3127 else if (substring->length == 1) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3128 return split_char(self,list,substring->str[0],maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3129 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3130 else if (substring->length == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3131 Py_DECREF(list); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3132 PyErr_SetString(PyExc_ValueError, "empty separator"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3133 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3134 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3135 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3136 return split_substring(self,list,substring,maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3137 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3138 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3139 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3140 PyObject *strip(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3141 int left, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3142 int right) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3143 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3144 Py_UNICODE *p = self->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3145 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3146 int end = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3147 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3148 if (left) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3149 while (start < end && Py_UNICODE_ISSPACE(p[start])) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3150 start++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3151 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3152 if (right) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3153 while (end > start && Py_UNICODE_ISSPACE(p[end-1])) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3154 end--; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3155 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3156 if (start == 0 && end == self->length) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3157 /* couldn't strip anything off, return original string */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3158 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3159 return (PyObject*) self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3160 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3161 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3162 return (PyObject*) PyUnicode_FromUnicode( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3163 self->str + start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3164 end - start |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3165 ); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3166 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3167 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3168 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3169 PyObject *replace(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3170 PyUnicodeObject *str1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3171 PyUnicodeObject *str2, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3172 int maxcount) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3173 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3174 PyUnicodeObject *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3175 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3176 if (maxcount < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3177 maxcount = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3178 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3179 if (str1->length == 1 && str2->length == 1) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3180 int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3181 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3182 /* replace characters */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3183 if (!findchar(self->str, self->length, str1->str[0])) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3184 /* nothing to replace, return original string */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3185 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3186 u = self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3187 } else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3188 Py_UNICODE u1 = str1->str[0]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3189 Py_UNICODE u2 = str2->str[0]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3190 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3191 u = (PyUnicodeObject*) PyUnicode_FromUnicode( |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
3192 NULL, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3193 self->length |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3194 ); |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
3195 if (u != NULL) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
3196 Py_UNICODE_COPY(u->str, self->str, |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
3197 self->length); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3198 for (i = 0; i < u->length; i++) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3199 if (u->str[i] == u1) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3200 if (--maxcount < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3201 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3202 u->str[i] = u2; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3203 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3204 } |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
3205 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3206 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3207 } else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3208 int n, i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3209 Py_UNICODE *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3210 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3211 /* replace strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3212 n = count(self, 0, self->length, str1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3213 if (n > maxcount) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3214 n = maxcount; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3215 if (n == 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3216 /* nothing to replace, return original string */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3217 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3218 u = self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3219 } else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3220 u = _PyUnicode_New( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3221 self->length + n * (str2->length - str1->length)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3222 if (u) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3223 i = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3224 p = u->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3225 while (i <= self->length - str1->length) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3226 if (Py_UNICODE_MATCH(self, i, str1)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3227 /* replace string segment */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3228 Py_UNICODE_COPY(p, str2->str, str2->length); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3229 p += str2->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3230 i += str1->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3231 if (--n <= 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3232 /* copy remaining part */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3233 Py_UNICODE_COPY(p, self->str+i, self->length-i); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3234 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3235 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3236 } else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3237 *p++ = self->str[i++]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3238 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3239 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3240 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3241 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3242 return (PyObject *) u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3243 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3244 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3245 /* --- Unicode Object Methods --------------------------------------------- */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3246 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3247 static char title__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3248 "S.title() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3249 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3250 Return a titlecased version of S, i.e. words start with title case\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3251 characters, all remaining cased characters have lower case."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3252 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3253 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3254 unicode_title(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3255 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3256 return fixup(self, fixtitle); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3257 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3258 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3259 static char capitalize__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3260 "S.capitalize() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3261 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3262 Return a capitalized version of S, i.e. make the first character\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3263 have upper case."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3264 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3265 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3266 unicode_capitalize(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3267 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3268 return fixup(self, fixcapitalize); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3269 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3270 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3271 #if 0 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3272 static char capwords__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3273 "S.capwords() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3274 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3275 Apply .capitalize() to all words in S and return the result with\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3276 normalized whitespace (all whitespace strings are replaced by ' ')."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3277 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3278 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3279 unicode_capwords(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3280 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3281 PyObject *list; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3282 PyObject *item; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3283 int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3284 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3285 /* Split into words */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3286 list = split(self, NULL, -1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3287 if (!list) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3288 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3289 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3290 /* Capitalize each word */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3291 for (i = 0; i < PyList_GET_SIZE(list); i++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3292 item = fixup((PyUnicodeObject *)PyList_GET_ITEM(list, i), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3293 fixcapitalize); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3294 if (item == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3295 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3296 Py_DECREF(PyList_GET_ITEM(list, i)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3297 PyList_SET_ITEM(list, i, item); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3298 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3299 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3300 /* Join the words to form a new string */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3301 item = PyUnicode_Join(NULL, list); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3302 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3303 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3304 Py_DECREF(list); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3305 return (PyObject *)item; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3306 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3307 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3308 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3309 static char center__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3310 "S.center(width) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3311 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3312 Return S centered in a Unicode string of length width. Padding is done\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3313 using spaces."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3314 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3315 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3316 unicode_center(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3317 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3318 int marg, left; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3319 int width; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3320 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3321 if (!PyArg_ParseTuple(args, "i:center", &width)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3322 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3323 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3324 if (self->length >= width) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3325 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3326 return (PyObject*) self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3327 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3328 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3329 marg = width - self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3330 left = marg / 2 + (marg & width & 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3331 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3332 return (PyObject*) pad(self, left, marg - left, ' '); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3333 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3334 |
|
13890
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3335 #if 0 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3336 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3337 /* This code should go into some future Unicode collation support |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3338 module. The basic comparison should compare ordinals on a naive |
|
13946
7a99450da2d6
Clean up warning from Monterey compiler.
Trent Mick <trentm@activestate.com>
parents:
13890
diff
changeset
|
3339 basis (this is what Java does and thus JPython too). */ |
|
13890
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3340 |
| 13337 | 3341 /* speedy UTF-16 code point order comparison */ |
| 3342 /* gleaned from: */ | |
| 3343 /* http://www-4.ibm.com/software/developer/library/utf16.html?dwzone=unicode */ | |
| 3344 | |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
3345 static short utf16Fixup[32] = |
| 13337 | 3346 { |
| 3347 0, 0, 0, 0, 0, 0, 0, 0, | |
| 3348 0, 0, 0, 0, 0, 0, 0, 0, | |
| 3349 0, 0, 0, 0, 0, 0, 0, 0, | |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
3350 0, 0, 0, 0x2000, -0x800, -0x800, -0x800, -0x800 |
| 13337 | 3351 }; |
| 3352 | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3353 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3354 unicode_compare(PyUnicodeObject *str1, PyUnicodeObject *str2) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3355 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3356 int len1, len2; |
| 13337 | 3357 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3358 Py_UNICODE *s1 = str1->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3359 Py_UNICODE *s2 = str2->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3360 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3361 len1 = str1->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3362 len2 = str2->length; |
| 13337 | 3363 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3364 while (len1 > 0 && len2 > 0) { |
|
13411
9a8391054840
New surrogate support in the UTF-8 codec. By Bill Tutt.
Marc-André Lemburg <mal@egenix.com>
parents:
13401
diff
changeset
|
3365 Py_UNICODE c1, c2; |
| 13337 | 3366 |
| 3367 c1 = *s1++; | |
| 3368 c2 = *s2++; | |
|
18279
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3369 |
| 13337 | 3370 if (c1 > (1<<11) * 26) |
| 3371 c1 += utf16Fixup[c1>>11]; | |
| 3372 if (c2 > (1<<11) * 26) | |
| 3373 c2 += utf16Fixup[c2>>11]; | |
|
18279
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3374 /* now c1 and c2 are in UTF-32-compatible order */ |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3375 |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3376 if (c1 != c2) |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3377 return (c1 < c2) ? -1 : 1; |
| 13337 | 3378 |
| 3379 len1--; len2--; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3380 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3381 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3382 return (len1 < len2) ? -1 : (len1 != len2); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3383 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3384 |
|
13890
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3385 #else |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3386 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3387 static int |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3388 unicode_compare(PyUnicodeObject *str1, PyUnicodeObject *str2) |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3389 { |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3390 register int len1, len2; |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3391 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3392 Py_UNICODE *s1 = str1->str; |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3393 Py_UNICODE *s2 = str2->str; |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3394 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3395 len1 = str1->length; |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3396 len2 = str2->length; |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3397 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3398 while (len1 > 0 && len2 > 0) { |
|
18279
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3399 Py_UNICODE c1, c2; |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3400 |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3401 c1 = *s1++; |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3402 c2 = *s2++; |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3403 |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3404 if (c1 != c2) |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3405 return (c1 < c2) ? -1 : 1; |
|
8b7ff44b4669
experimental UCS-4 support: made compare a bit more robust, in case
Fredrik Lundh <fredrik@pythonware.com>
parents:
18278
diff
changeset
|
3406 |
|
13890
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3407 len1--; len2--; |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3408 } |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3409 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3410 return (len1 < len2) ? -1 : (len1 != len2); |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3411 } |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3412 |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3413 #endif |
|
8f0fc0b5f784
Removing UTF-16 aware Unicode comparison code. This kind of compare
Marc-André Lemburg <mal@egenix.com>
parents:
13837
diff
changeset
|
3414 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3415 int PyUnicode_Compare(PyObject *left, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3416 PyObject *right) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3417 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3418 PyUnicodeObject *u = NULL, *v = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3419 int result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3420 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3421 /* Coerce the two arguments */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3422 u = (PyUnicodeObject *)PyUnicode_FromObject(left); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3423 if (u == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3424 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3425 v = (PyUnicodeObject *)PyUnicode_FromObject(right); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3426 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3427 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3428 |
|
13620
5b727ab37092
Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents:
13576
diff
changeset
|
3429 /* Shortcut for empty or interned objects */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3430 if (v == u) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3431 Py_DECREF(u); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3432 Py_DECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3433 return 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3434 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3435 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3436 result = unicode_compare(u, v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3437 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3438 Py_DECREF(u); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3439 Py_DECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3440 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3441 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3442 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3443 Py_XDECREF(u); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3444 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3445 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3446 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3447 |
|
11997
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3448 int PyUnicode_Contains(PyObject *container, |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3449 PyObject *element) |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3450 { |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3451 PyUnicodeObject *u = NULL, *v = NULL; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3452 int result; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3453 register const Py_UNICODE *p, *e; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3454 register Py_UNICODE ch; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3455 |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3456 /* Coerce the two arguments */ |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3457 v = (PyUnicodeObject *)PyUnicode_FromObject(element); |
|
13049
0be4b7b650e3
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12957
diff
changeset
|
3458 if (v == NULL) { |
|
0be4b7b650e3
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12957
diff
changeset
|
3459 PyErr_SetString(PyExc_TypeError, |
|
0be4b7b650e3
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12957
diff
changeset
|
3460 "'in <string>' requires character as left operand"); |
|
11997
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3461 goto onError; |
|
13049
0be4b7b650e3
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12957
diff
changeset
|
3462 } |
|
12248
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
3463 u = (PyUnicodeObject *)PyUnicode_FromObject(container); |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
3464 if (u == NULL) { |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
3465 Py_DECREF(v); |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
3466 goto onError; |
|
70154e2e9c89
Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents:
12193
diff
changeset
|
3467 } |
|
11997
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3468 |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3469 /* Check v in u */ |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3470 if (PyUnicode_GET_SIZE(v) != 1) { |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3471 PyErr_SetString(PyExc_TypeError, |
|
12902
98eb3059ae76
Patch from Michael Hudson: improve unclear error message
Andrew M. Kuchling <amk@amk.ca>
parents:
12899
diff
changeset
|
3472 "'in <string>' requires character as left operand"); |
|
11997
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3473 goto onError; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3474 } |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3475 ch = *PyUnicode_AS_UNICODE(v); |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3476 p = PyUnicode_AS_UNICODE(u); |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3477 e = p + PyUnicode_GET_SIZE(u); |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3478 result = 0; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3479 while (p < e) { |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3480 if (*p++ == ch) { |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3481 result = 1; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3482 break; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3483 } |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3484 } |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3485 |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3486 Py_DECREF(u); |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3487 Py_DECREF(v); |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3488 return result; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3489 |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3490 onError: |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3491 Py_XDECREF(u); |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3492 Py_XDECREF(v); |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3493 return -1; |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3494 } |
|
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
3495 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3496 /* Concat to string or Unicode object giving a new Unicode object. */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3497 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3498 PyObject *PyUnicode_Concat(PyObject *left, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3499 PyObject *right) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3500 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3501 PyUnicodeObject *u = NULL, *v = NULL, *w; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3502 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3503 /* Coerce the two arguments */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3504 u = (PyUnicodeObject *)PyUnicode_FromObject(left); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3505 if (u == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3506 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3507 v = (PyUnicodeObject *)PyUnicode_FromObject(right); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3508 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3509 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3510 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3511 /* Shortcuts */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3512 if (v == unicode_empty) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3513 Py_DECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3514 return (PyObject *)u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3515 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3516 if (u == unicode_empty) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3517 Py_DECREF(u); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3518 return (PyObject *)v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3519 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3520 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3521 /* Concat the two Unicode strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3522 w = _PyUnicode_New(u->length + v->length); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3523 if (w == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3524 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3525 Py_UNICODE_COPY(w->str, u->str, u->length); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3526 Py_UNICODE_COPY(w->str + u->length, v->str, v->length); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3527 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3528 Py_DECREF(u); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3529 Py_DECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3530 return (PyObject *)w; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3531 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3532 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3533 Py_XDECREF(u); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3534 Py_XDECREF(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3535 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3536 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3537 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3538 static char count__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3539 "S.count(sub[, start[, end]]) -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3540 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3541 Return the number of occurrences of substring sub in Unicode string\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3542 S[start:end]. Optional arguments start and end are\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3543 interpreted as in slice notation."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3544 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3545 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3546 unicode_count(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3547 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3548 PyUnicodeObject *substring; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3549 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3550 int end = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3551 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3552 |
| 12629 | 3553 if (!PyArg_ParseTuple(args, "O|O&O&:count", &substring, |
| 3554 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3555 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3556 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3557 substring = (PyUnicodeObject *)PyUnicode_FromObject( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3558 (PyObject *)substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3559 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3560 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3561 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3562 if (start < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3563 start += self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3564 if (start < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3565 start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3566 if (end > self->length) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3567 end = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3568 if (end < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3569 end += self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3570 if (end < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3571 end = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3572 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3573 result = PyInt_FromLong((long) count(self, start, end, substring)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3574 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3575 Py_DECREF(substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3576 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3577 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3578 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3579 static char encode__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3580 "S.encode([encoding[,errors]]) -> string\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3581 \n\ |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
3582 Return an encoded string version of S. Default encoding is the current\n\ |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
3583 default string encoding. errors may be given to set a different error\n\ |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
3584 handling scheme. Default is 'strict' meaning that encoding errors raise\n\ |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
3585 a ValueError. Other possible values are 'ignore' and 'replace'."; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3586 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3587 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3588 unicode_encode(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3589 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3590 char *encoding = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3591 char *errors = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3592 if (!PyArg_ParseTuple(args, "|ss:encode", &encoding, &errors)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3593 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3594 return PyUnicode_AsEncodedString((PyObject *)self, encoding, errors); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3595 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3596 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3597 static char expandtabs__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3598 "S.expandtabs([tabsize]) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3599 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3600 Return a copy of S where all tab characters are expanded using spaces.\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3601 If tabsize is not given, a tab size of 8 characters is assumed."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3602 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3603 static PyObject* |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3604 unicode_expandtabs(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3605 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3606 Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3607 Py_UNICODE *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3608 Py_UNICODE *q; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3609 int i, j; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3610 PyUnicodeObject *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3611 int tabsize = 8; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3612 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3613 if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3614 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3615 |
|
13620
5b727ab37092
Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents:
13576
diff
changeset
|
3616 /* First pass: determine size of output string */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3617 i = j = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3618 e = self->str + self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3619 for (p = self->str; p < e; p++) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3620 if (*p == '\t') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3621 if (tabsize > 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3622 j += tabsize - (j % tabsize); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3623 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3624 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3625 j++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3626 if (*p == '\n' || *p == '\r') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3627 i += j; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3628 j = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3629 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3630 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3631 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3632 /* Second pass: create output string and fill it */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3633 u = _PyUnicode_New(i + j); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3634 if (!u) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3635 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3636 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3637 j = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3638 q = u->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3639 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3640 for (p = self->str; p < e; p++) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3641 if (*p == '\t') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3642 if (tabsize > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3643 i = tabsize - (j % tabsize); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3644 j += i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3645 while (i--) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3646 *q++ = ' '; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3647 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3648 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3649 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3650 j++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3651 *q++ = *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3652 if (*p == '\n' || *p == '\r') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3653 j = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3654 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3655 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3656 return (PyObject*) u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3657 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3658 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3659 static char find__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3660 "S.find(sub [,start [,end]]) -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3661 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3662 Return the lowest index in S where substring sub is found,\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3663 such that sub is contained within s[start,end]. Optional\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3664 arguments start and end are interpreted as in slice notation.\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3665 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3666 Return -1 on failure."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3667 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3668 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3669 unicode_find(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3670 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3671 PyUnicodeObject *substring; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3672 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3673 int end = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3674 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3675 |
| 12629 | 3676 if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring, |
| 3677 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3678 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3679 substring = (PyUnicodeObject *)PyUnicode_FromObject( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3680 (PyObject *)substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3681 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3682 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3683 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3684 result = PyInt_FromLong(findstring(self, substring, start, end, 1)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3685 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3686 Py_DECREF(substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3687 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3688 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3689 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3690 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3691 unicode_getitem(PyUnicodeObject *self, int index) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3692 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3693 if (index < 0 || index >= self->length) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3694 PyErr_SetString(PyExc_IndexError, "string index out of range"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3695 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3696 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3697 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3698 return (PyObject*) PyUnicode_FromUnicode(&self->str[index], 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3699 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3700 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3701 static long |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3702 unicode_hash(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3703 { |
|
13522
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3704 /* Since Unicode objects compare equal to their ASCII string |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3705 counterparts, they should use the individual character values |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3706 as basis for their hash value. This is needed to assure that |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3707 strings and Unicode objects behave in the same way as |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3708 dictionary keys. */ |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3709 |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3710 register int len; |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3711 register Py_UNICODE *p; |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3712 register long x; |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3713 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3714 if (self->hash != -1) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3715 return self->hash; |
|
13522
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3716 len = PyUnicode_GET_SIZE(self); |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3717 p = PyUnicode_AS_UNICODE(self); |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3718 x = *p << 7; |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3719 while (--len >= 0) |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3720 x = (1000003*x) ^ *p++; |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3721 x ^= PyUnicode_GET_SIZE(self); |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3722 if (x == -1) |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3723 x = -2; |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3724 self->hash = x; |
|
acc4638f37d5
- changed hash calculation for unicode strings. the new
Fredrik Lundh <fredrik@pythonware.com>
parents:
13411
diff
changeset
|
3725 return x; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3726 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3727 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3728 static char index__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3729 "S.index(sub [,start [,end]]) -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3730 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3731 Like S.find() but raise ValueError when the substring is not found."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3732 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3733 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3734 unicode_index(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3735 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3736 int result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3737 PyUnicodeObject *substring; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3738 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3739 int end = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3740 |
| 12629 | 3741 if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring, |
| 3742 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3743 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3744 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3745 substring = (PyUnicodeObject *)PyUnicode_FromObject( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3746 (PyObject *)substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3747 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3748 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3749 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3750 result = findstring(self, substring, start, end, 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3751 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3752 Py_DECREF(substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3753 if (result < 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3754 PyErr_SetString(PyExc_ValueError, "substring not found"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3755 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3756 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3757 return PyInt_FromLong(result); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3758 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3759 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3760 static char islower__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3761 "S.islower() -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3762 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3763 Return 1 if all cased characters in S are lowercase and there is\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3764 at least one cased character in S, 0 otherwise."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3765 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3766 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3767 unicode_islower(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3768 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3769 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3770 register const Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3771 int cased; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3772 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3773 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3774 if (PyUnicode_GET_SIZE(self) == 1) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3775 return PyInt_FromLong(Py_UNICODE_ISLOWER(*p) != 0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3776 |
|
12924
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3777 /* Special case for empty strings */ |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3778 if (PyString_GET_SIZE(self) == 0) |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3779 return PyInt_FromLong(0); |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3780 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3781 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3782 cased = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3783 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3784 register const Py_UNICODE ch = *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3785 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3786 if (Py_UNICODE_ISUPPER(ch) || Py_UNICODE_ISTITLE(ch)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3787 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3788 else if (!cased && Py_UNICODE_ISLOWER(ch)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3789 cased = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3790 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3791 return PyInt_FromLong(cased); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3792 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3793 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3794 static char isupper__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3795 "S.isupper() -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3796 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3797 Return 1 if all cased characters in S are uppercase and there is\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3798 at least one cased character in S, 0 otherwise."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3799 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3800 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3801 unicode_isupper(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3802 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3803 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3804 register const Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3805 int cased; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3806 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3807 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3808 if (PyUnicode_GET_SIZE(self) == 1) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3809 return PyInt_FromLong(Py_UNICODE_ISUPPER(*p) != 0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3810 |
|
12924
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3811 /* Special case for empty strings */ |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3812 if (PyString_GET_SIZE(self) == 0) |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3813 return PyInt_FromLong(0); |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3814 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3815 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3816 cased = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3817 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3818 register const Py_UNICODE ch = *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3819 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3820 if (Py_UNICODE_ISLOWER(ch) || Py_UNICODE_ISTITLE(ch)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3821 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3822 else if (!cased && Py_UNICODE_ISUPPER(ch)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3823 cased = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3824 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3825 return PyInt_FromLong(cased); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3826 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3827 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3828 static char istitle__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3829 "S.istitle() -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3830 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3831 Return 1 if S is a titlecased string, i.e. upper- and titlecase characters\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3832 may only follow uncased characters and lowercase characters only cased\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3833 ones. Return 0 otherwise."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3834 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3835 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3836 unicode_istitle(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3837 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3838 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3839 register const Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3840 int cased, previous_is_cased; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3841 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3842 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3843 if (PyUnicode_GET_SIZE(self) == 1) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3844 return PyInt_FromLong((Py_UNICODE_ISTITLE(*p) != 0) || |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3845 (Py_UNICODE_ISUPPER(*p) != 0)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3846 |
|
12924
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3847 /* Special case for empty strings */ |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3848 if (PyString_GET_SIZE(self) == 0) |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3849 return PyInt_FromLong(0); |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3850 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3851 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3852 cased = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3853 previous_is_cased = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3854 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3855 register const Py_UNICODE ch = *p; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3856 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3857 if (Py_UNICODE_ISUPPER(ch) || Py_UNICODE_ISTITLE(ch)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3858 if (previous_is_cased) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3859 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3860 previous_is_cased = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3861 cased = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3862 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3863 else if (Py_UNICODE_ISLOWER(ch)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3864 if (!previous_is_cased) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3865 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3866 previous_is_cased = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3867 cased = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3868 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3869 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3870 previous_is_cased = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3871 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3872 return PyInt_FromLong(cased); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3873 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3874 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3875 static char isspace__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3876 "S.isspace() -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3877 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3878 Return 1 if there are only whitespace characters in S,\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3879 0 otherwise."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3880 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3881 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3882 unicode_isspace(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3883 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3884 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3885 register const Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3886 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3887 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3888 if (PyUnicode_GET_SIZE(self) == 1 && |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3889 Py_UNICODE_ISSPACE(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3890 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3891 |
|
12924
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3892 /* Special case for empty strings */ |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3893 if (PyString_GET_SIZE(self) == 0) |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3894 return PyInt_FromLong(0); |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3895 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3896 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3897 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3898 if (!Py_UNICODE_ISSPACE(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3899 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3900 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3901 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3902 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3903 |
|
13356
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3904 static char isalpha__doc__[] = |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3905 "S.isalpha() -> int\n\ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3906 \n\ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3907 Return 1 if all characters in S are alphabetic\n\ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3908 and there is at least one character in S, 0 otherwise."; |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3909 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3910 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3911 unicode_isalpha(PyUnicodeObject *self) |
|
13356
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3912 { |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3913 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3914 register const Py_UNICODE *e; |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3915 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3916 /* Shortcut for single character strings */ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3917 if (PyUnicode_GET_SIZE(self) == 1 && |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3918 Py_UNICODE_ISALPHA(*p)) |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3919 return PyInt_FromLong(1); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3920 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3921 /* Special case for empty strings */ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3922 if (PyString_GET_SIZE(self) == 0) |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3923 return PyInt_FromLong(0); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3924 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3925 e = p + PyUnicode_GET_SIZE(self); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3926 for (; p < e; p++) { |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3927 if (!Py_UNICODE_ISALPHA(*p)) |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3928 return PyInt_FromLong(0); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3929 } |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3930 return PyInt_FromLong(1); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3931 } |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3932 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3933 static char isalnum__doc__[] = |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3934 "S.isalnum() -> int\n\ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3935 \n\ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3936 Return 1 if all characters in S are alphanumeric\n\ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3937 and there is at least one character in S, 0 otherwise."; |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3938 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3939 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3940 unicode_isalnum(PyUnicodeObject *self) |
|
13356
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3941 { |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3942 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3943 register const Py_UNICODE *e; |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3944 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3945 /* Shortcut for single character strings */ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3946 if (PyUnicode_GET_SIZE(self) == 1 && |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3947 Py_UNICODE_ISALNUM(*p)) |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3948 return PyInt_FromLong(1); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3949 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3950 /* Special case for empty strings */ |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3951 if (PyString_GET_SIZE(self) == 0) |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3952 return PyInt_FromLong(0); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3953 |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3954 e = p + PyUnicode_GET_SIZE(self); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3955 for (; p < e; p++) { |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3956 if (!Py_UNICODE_ISALNUM(*p)) |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3957 return PyInt_FromLong(0); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3958 } |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3959 return PyInt_FromLong(1); |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3960 } |
|
9a1b961e0c3a
Added new .isalpha() and .isalnum() methods which provide interfaces
Marc-André Lemburg <mal@egenix.com>
parents:
13337
diff
changeset
|
3961 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3962 static char isdecimal__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3963 "S.isdecimal() -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3964 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3965 Return 1 if there are only decimal characters in S,\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3966 0 otherwise."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3967 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3968 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3969 unicode_isdecimal(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3970 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3971 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3972 register const Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3973 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3974 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3975 if (PyUnicode_GET_SIZE(self) == 1 && |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3976 Py_UNICODE_ISDECIMAL(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3977 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3978 |
|
12924
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3979 /* Special case for empty strings */ |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3980 if (PyString_GET_SIZE(self) == 0) |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3981 return PyInt_FromLong(0); |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
3982 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3983 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3984 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3985 if (!Py_UNICODE_ISDECIMAL(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3986 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3987 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3988 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3989 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3990 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3991 static char isdigit__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3992 "S.isdigit() -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3993 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3994 Return 1 if there are only digit characters in S,\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3995 0 otherwise."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3996 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3997 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
3998 unicode_isdigit(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3999 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4000 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4001 register const Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4002 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4003 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4004 if (PyUnicode_GET_SIZE(self) == 1 && |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4005 Py_UNICODE_ISDIGIT(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4006 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4007 |
|
12924
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4008 /* Special case for empty strings */ |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4009 if (PyString_GET_SIZE(self) == 0) |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4010 return PyInt_FromLong(0); |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4011 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4012 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4013 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4014 if (!Py_UNICODE_ISDIGIT(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4015 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4016 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4017 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4018 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4019 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4020 static char isnumeric__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4021 "S.isnumeric() -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4022 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4023 Return 1 if there are only numeric characters in S,\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4024 0 otherwise."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4025 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4026 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4027 unicode_isnumeric(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4028 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4029 register const Py_UNICODE *p = PyUnicode_AS_UNICODE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4030 register const Py_UNICODE *e; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4031 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4032 /* Shortcut for single character strings */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4033 if (PyUnicode_GET_SIZE(self) == 1 && |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4034 Py_UNICODE_ISNUMERIC(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4035 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4036 |
|
12924
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4037 /* Special case for empty strings */ |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4038 if (PyString_GET_SIZE(self) == 0) |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4039 return PyInt_FromLong(0); |
|
2d0b99778edf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12909
diff
changeset
|
4040 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4041 e = p + PyUnicode_GET_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4042 for (; p < e; p++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4043 if (!Py_UNICODE_ISNUMERIC(*p)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4044 return PyInt_FromLong(0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4045 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4046 return PyInt_FromLong(1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4047 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4048 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4049 static char join__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4050 "S.join(sequence) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4051 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4052 Return a string which is the concatenation of the strings in the\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4053 sequence. The separator between elements is S."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4054 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4055 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4056 unicode_join(PyObject *self, PyObject *data) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4057 { |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4058 return PyUnicode_Join(self, data); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4059 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4060 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4061 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4062 unicode_length(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4063 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4064 return self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4065 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4066 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4067 static char ljust__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4068 "S.ljust(width) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4069 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4070 Return S left justified in a Unicode string of length width. Padding is\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4071 done using spaces."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4072 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4073 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4074 unicode_ljust(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4075 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4076 int width; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4077 if (!PyArg_ParseTuple(args, "i:ljust", &width)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4078 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4079 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4080 if (self->length >= width) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4081 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4082 return (PyObject*) self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4083 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4084 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4085 return (PyObject*) pad(self, 0, width - self->length, ' '); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4086 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4087 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4088 static char lower__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4089 "S.lower() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4090 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4091 Return a copy of the string S converted to lowercase."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4092 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4093 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4094 unicode_lower(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4095 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4096 return fixup(self, fixlower); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4097 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4098 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4099 static char lstrip__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4100 "S.lstrip() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4101 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4102 Return a copy of the string S with leading whitespace removed."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4103 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4104 static PyObject * |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4105 unicode_lstrip(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4106 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4107 return strip(self, 1, 0); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4108 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4109 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4110 static PyObject* |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4111 unicode_repeat(PyUnicodeObject *str, int len) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4112 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4113 PyUnicodeObject *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4114 Py_UNICODE *p; |
|
14492
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4115 int nchars; |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4116 size_t nbytes; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4117 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4118 if (len < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4119 len = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4120 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4121 if (len == 1) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4122 /* no repeat, return original string */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4123 Py_INCREF(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4124 return (PyObject*) str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4125 } |
|
14492
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4126 |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4127 /* ensure # of chars needed doesn't overflow int and # of bytes |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4128 * needed doesn't overflow size_t |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4129 */ |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4130 nchars = len * str->length; |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4131 if (len && nchars / len != str->length) { |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4132 PyErr_SetString(PyExc_OverflowError, |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4133 "repeated string is too long"); |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4134 return NULL; |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4135 } |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4136 nbytes = (nchars + 1) * sizeof(Py_UNICODE); |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4137 if (nbytes / sizeof(Py_UNICODE) != (size_t)(nchars + 1)) { |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4138 PyErr_SetString(PyExc_OverflowError, |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4139 "repeated string is too long"); |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4140 return NULL; |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4141 } |
|
7728b0ea9344
Fix for bug 113934. string*n and unicode*n did no overflow checking at
Tim Peters <tim.peters@gmail.com>
parents:
14388
diff
changeset
|
4142 u = _PyUnicode_New(nchars); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4143 if (!u) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4144 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4145 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4146 p = u->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4147 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4148 while (len-- > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4149 Py_UNICODE_COPY(p, str->str, str->length); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4150 p += str->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4151 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4152 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4153 return (PyObject*) u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4154 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4155 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4156 PyObject *PyUnicode_Replace(PyObject *obj, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4157 PyObject *subobj, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4158 PyObject *replobj, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4159 int maxcount) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4160 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4161 PyObject *self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4162 PyObject *str1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4163 PyObject *str2; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4164 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4165 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4166 self = PyUnicode_FromObject(obj); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4167 if (self == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4168 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4169 str1 = PyUnicode_FromObject(subobj); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4170 if (str1 == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4171 Py_DECREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4172 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4173 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4174 str2 = PyUnicode_FromObject(replobj); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4175 if (str2 == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4176 Py_DECREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4177 Py_DECREF(str1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4178 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4179 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4180 result = replace((PyUnicodeObject *)self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4181 (PyUnicodeObject *)str1, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4182 (PyUnicodeObject *)str2, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4183 maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4184 Py_DECREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4185 Py_DECREF(str1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4186 Py_DECREF(str2); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4187 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4188 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4189 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4190 static char replace__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4191 "S.replace (old, new[, maxsplit]) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4192 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4193 Return a copy of S with all occurrences of substring\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4194 old replaced by new. If the optional argument maxsplit is\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4195 given, only the first maxsplit occurrences are replaced."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4196 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4197 static PyObject* |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4198 unicode_replace(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4199 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4200 PyUnicodeObject *str1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4201 PyUnicodeObject *str2; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4202 int maxcount = -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4203 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4204 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4205 if (!PyArg_ParseTuple(args, "OO|i:replace", &str1, &str2, &maxcount)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4206 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4207 str1 = (PyUnicodeObject *)PyUnicode_FromObject((PyObject *)str1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4208 if (str1 == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4209 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4210 str2 = (PyUnicodeObject *)PyUnicode_FromObject((PyObject *)str2); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4211 if (str2 == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4212 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4213 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4214 result = replace(self, str1, str2, maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4215 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4216 Py_DECREF(str1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4217 Py_DECREF(str2); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4218 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4219 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4220 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4221 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4222 PyObject *unicode_repr(PyObject *unicode) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4223 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4224 return unicodeescape_string(PyUnicode_AS_UNICODE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4225 PyUnicode_GET_SIZE(unicode), |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4226 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4227 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4228 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4229 static char rfind__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4230 "S.rfind(sub [,start [,end]]) -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4231 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4232 Return the highest index in S where substring sub is found,\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4233 such that sub is contained within s[start,end]. Optional\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4234 arguments start and end are interpreted as in slice notation.\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4235 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4236 Return -1 on failure."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4237 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4238 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4239 unicode_rfind(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4240 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4241 PyUnicodeObject *substring; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4242 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4243 int end = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4244 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4245 |
| 12629 | 4246 if (!PyArg_ParseTuple(args, "O|O&O&:rfind", &substring, |
| 4247 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4248 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4249 substring = (PyUnicodeObject *)PyUnicode_FromObject( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4250 (PyObject *)substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4251 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4252 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4253 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4254 result = PyInt_FromLong(findstring(self, substring, start, end, -1)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4255 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4256 Py_DECREF(substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4257 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4258 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4259 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4260 static char rindex__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4261 "S.rindex(sub [,start [,end]]) -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4262 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4263 Like S.rfind() but raise ValueError when the substring is not found."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4264 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4265 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4266 unicode_rindex(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4267 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4268 int result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4269 PyUnicodeObject *substring; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4270 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4271 int end = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4272 |
| 12629 | 4273 if (!PyArg_ParseTuple(args, "O|O&O&:rindex", &substring, |
| 4274 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4275 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4276 substring = (PyUnicodeObject *)PyUnicode_FromObject( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4277 (PyObject *)substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4278 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4279 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4280 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4281 result = findstring(self, substring, start, end, -1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4282 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4283 Py_DECREF(substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4284 if (result < 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4285 PyErr_SetString(PyExc_ValueError, "substring not found"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4286 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4287 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4288 return PyInt_FromLong(result); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4289 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4290 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4291 static char rjust__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4292 "S.rjust(width) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4293 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4294 Return S right justified in a Unicode string of length width. Padding is\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4295 done using spaces."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4296 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4297 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4298 unicode_rjust(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4299 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4300 int width; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4301 if (!PyArg_ParseTuple(args, "i:rjust", &width)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4302 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4303 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4304 if (self->length >= width) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4305 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4306 return (PyObject*) self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4307 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4308 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4309 return (PyObject*) pad(self, width - self->length, 0, ' '); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4310 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4311 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4312 static char rstrip__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4313 "S.rstrip() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4314 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4315 Return a copy of the string S with trailing whitespace removed."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4316 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4317 static PyObject * |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4318 unicode_rstrip(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4319 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4320 return strip(self, 0, 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4321 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4322 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4323 static PyObject* |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4324 unicode_slice(PyUnicodeObject *self, int start, int end) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4325 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4326 /* standard clamping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4327 if (start < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4328 start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4329 if (end < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4330 end = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4331 if (end > self->length) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4332 end = self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4333 if (start == 0 && end == self->length) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4334 /* full slice, return original string */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4335 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4336 return (PyObject*) self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4337 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4338 if (start > end) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4339 start = end; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4340 /* copy slice */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4341 return (PyObject*) PyUnicode_FromUnicode(self->str + start, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4342 end - start); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4343 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4344 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4345 PyObject *PyUnicode_Split(PyObject *s, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4346 PyObject *sep, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4347 int maxsplit) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4348 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4349 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4350 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4351 s = PyUnicode_FromObject(s); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4352 if (s == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4353 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4354 if (sep != NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4355 sep = PyUnicode_FromObject(sep); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4356 if (sep == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4357 Py_DECREF(s); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4358 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4359 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4360 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4361 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4362 result = split((PyUnicodeObject *)s, (PyUnicodeObject *)sep, maxsplit); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4363 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4364 Py_DECREF(s); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4365 Py_XDECREF(sep); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4366 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4367 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4368 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4369 static char split__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4370 "S.split([sep [,maxsplit]]) -> list of strings\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4371 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4372 Return a list of the words in S, using sep as the\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4373 delimiter string. If maxsplit is given, at most maxsplit\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4374 splits are done. If sep is not specified, any whitespace string\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4375 is a separator."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4376 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4377 static PyObject* |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4378 unicode_split(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4379 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4380 PyObject *substring = Py_None; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4381 int maxcount = -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4382 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4383 if (!PyArg_ParseTuple(args, "|Oi:split", &substring, &maxcount)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4384 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4385 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4386 if (substring == Py_None) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4387 return split(self, NULL, maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4388 else if (PyUnicode_Check(substring)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4389 return split(self, (PyUnicodeObject *)substring, maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4390 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4391 return PyUnicode_Split((PyObject *)self, substring, maxcount); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4392 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4393 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4394 static char splitlines__doc__[] = |
| 12369 | 4395 "S.splitlines([keepends]]) -> list of strings\n\ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4396 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4397 Return a list of the lines in S, breaking at line boundaries.\n\ |
| 12369 | 4398 Line breaks are not included in the resulting list unless keepends\n\ |
| 4399 is given and true."; | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4400 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4401 static PyObject* |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4402 unicode_splitlines(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4403 { |
| 12369 | 4404 int keepends = 0; |
| 4405 | |
| 4406 if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4407 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4408 |
| 12369 | 4409 return PyUnicode_Splitlines((PyObject *)self, keepends); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4410 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4411 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4412 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4413 PyObject *unicode_str(PyUnicodeObject *self) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4414 { |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
4415 return PyUnicode_AsEncodedString((PyObject *)self, NULL, NULL); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4416 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4417 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4418 static char strip__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4419 "S.strip() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4420 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4421 Return a copy of S with leading and trailing whitespace removed."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4422 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4423 static PyObject * |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4424 unicode_strip(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4425 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4426 return strip(self, 1, 1); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4427 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4428 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4429 static char swapcase__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4430 "S.swapcase() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4431 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4432 Return a copy of S with uppercase characters converted to lowercase\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4433 and vice versa."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4434 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4435 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4436 unicode_swapcase(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4437 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4438 return fixup(self, fixswapcase); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4439 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4440 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4441 static char translate__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4442 "S.translate(table) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4443 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4444 Return a copy of the string S, where all characters have been mapped\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4445 through the given translation table, which must be a mapping of\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4446 Unicode ordinals to Unicode ordinals or None. Unmapped characters\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4447 are left untouched. Characters mapped to None are deleted."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4448 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4449 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4450 unicode_translate(PyUnicodeObject *self, PyObject *table) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4451 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4452 return PyUnicode_TranslateCharmap(self->str, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4453 self->length, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4454 table, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4455 "ignore"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4456 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4457 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4458 static char upper__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4459 "S.upper() -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4460 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4461 Return a copy of S converted to uppercase."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4462 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4463 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4464 unicode_upper(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4465 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4466 return fixup(self, fixupper); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4467 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4468 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4469 #if 0 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4470 static char zfill__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4471 "S.zfill(width) -> unicode\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4472 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4473 Pad a numeric string x with zeros on the left, to fill a field\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4474 of the specified width. The string x is never truncated."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4475 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4476 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4477 unicode_zfill(PyUnicodeObject *self, PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4478 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4479 int fill; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4480 PyUnicodeObject *u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4481 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4482 int width; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4483 if (!PyArg_ParseTuple(args, "i:zfill", &width)) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4484 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4485 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4486 if (self->length >= width) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4487 Py_INCREF(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4488 return (PyObject*) self; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4489 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4490 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4491 fill = width - self->length; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4492 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4493 u = pad(self, fill, 0, '0'); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4494 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4495 if (u->str[fill] == '+' || u->str[fill] == '-') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4496 /* move sign to beginning of string */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4497 u->str[0] = u->str[fill]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4498 u->str[fill] = '0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4499 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4500 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4501 return (PyObject*) u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4502 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4503 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4504 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4505 #if 0 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4506 static PyObject* |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4507 unicode_freelistsize(PyUnicodeObject *self) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4508 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4509 return PyInt_FromLong(unicode_freelist_size); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4510 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4511 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4512 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4513 static char startswith__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4514 "S.startswith(prefix[, start[, end]]) -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4515 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4516 Return 1 if S starts with the specified prefix, otherwise return 0. With\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4517 optional start, test S beginning at that position. With optional end, stop\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4518 comparing S at that position."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4519 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4520 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4521 unicode_startswith(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4522 PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4523 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4524 PyUnicodeObject *substring; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4525 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4526 int end = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4527 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4528 |
| 12629 | 4529 if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &substring, |
| 4530 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4531 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4532 substring = (PyUnicodeObject *)PyUnicode_FromObject( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4533 (PyObject *)substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4534 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4535 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4536 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4537 result = PyInt_FromLong(tailmatch(self, substring, start, end, -1)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4538 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4539 Py_DECREF(substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4540 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4541 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4542 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4543 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4544 static char endswith__doc__[] = |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4545 "S.endswith(suffix[, start[, end]]) -> int\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4546 \n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4547 Return 1 if S ends with the specified suffix, otherwise return 0. With\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4548 optional start, test S beginning at that position. With optional end, stop\n\ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4549 comparing S at that position."; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4550 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4551 static PyObject * |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4552 unicode_endswith(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4553 PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4554 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4555 PyUnicodeObject *substring; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4556 int start = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4557 int end = INT_MAX; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4558 PyObject *result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4559 |
| 12629 | 4560 if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &substring, |
| 4561 _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) | |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4562 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4563 substring = (PyUnicodeObject *)PyUnicode_FromObject( |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4564 (PyObject *)substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4565 if (substring == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4566 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4567 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4568 result = PyInt_FromLong(tailmatch(self, substring, start, end, +1)); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4569 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4570 Py_DECREF(substring); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4571 return result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4572 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4573 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4574 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4575 static PyMethodDef unicode_methods[] = { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4576 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4577 /* Order is according to common usage: often used methods should |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4578 appear first, since lookup is done sequentially. */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4579 |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4580 {"encode", (PyCFunction) unicode_encode, METH_VARARGS, encode__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4581 {"replace", (PyCFunction) unicode_replace, METH_VARARGS, replace__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4582 {"split", (PyCFunction) unicode_split, METH_VARARGS, split__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4583 {"join", (PyCFunction) unicode_join, METH_O, join__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4584 {"capitalize", (PyCFunction) unicode_capitalize, METH_NOARGS, capitalize__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4585 {"title", (PyCFunction) unicode_title, METH_NOARGS, title__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4586 {"center", (PyCFunction) unicode_center, METH_VARARGS, center__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4587 {"count", (PyCFunction) unicode_count, METH_VARARGS, count__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4588 {"expandtabs", (PyCFunction) unicode_expandtabs, METH_VARARGS, expandtabs__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4589 {"find", (PyCFunction) unicode_find, METH_VARARGS, find__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4590 {"index", (PyCFunction) unicode_index, METH_VARARGS, index__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4591 {"ljust", (PyCFunction) unicode_ljust, METH_VARARGS, ljust__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4592 {"lower", (PyCFunction) unicode_lower, METH_NOARGS, lower__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4593 {"lstrip", (PyCFunction) unicode_lstrip, METH_NOARGS, lstrip__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4594 /* {"maketrans", (PyCFunction) unicode_maketrans, METH_VARARGS, maketrans__doc__}, */ |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4595 {"rfind", (PyCFunction) unicode_rfind, METH_VARARGS, rfind__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4596 {"rindex", (PyCFunction) unicode_rindex, METH_VARARGS, rindex__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4597 {"rjust", (PyCFunction) unicode_rjust, METH_VARARGS, rjust__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4598 {"rstrip", (PyCFunction) unicode_rstrip, METH_NOARGS, rstrip__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4599 {"splitlines", (PyCFunction) unicode_splitlines, METH_VARARGS, splitlines__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4600 {"strip", (PyCFunction) unicode_strip, METH_NOARGS, strip__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4601 {"swapcase", (PyCFunction) unicode_swapcase, METH_NOARGS, swapcase__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4602 {"translate", (PyCFunction) unicode_translate, METH_O, translate__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4603 {"upper", (PyCFunction) unicode_upper, METH_NOARGS, upper__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4604 {"startswith", (PyCFunction) unicode_startswith, METH_VARARGS, startswith__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4605 {"endswith", (PyCFunction) unicode_endswith, METH_VARARGS, endswith__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4606 {"islower", (PyCFunction) unicode_islower, METH_NOARGS, islower__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4607 {"isupper", (PyCFunction) unicode_isupper, METH_NOARGS, isupper__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4608 {"istitle", (PyCFunction) unicode_istitle, METH_NOARGS, istitle__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4609 {"isspace", (PyCFunction) unicode_isspace, METH_NOARGS, isspace__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4610 {"isdecimal", (PyCFunction) unicode_isdecimal, METH_NOARGS, isdecimal__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4611 {"isdigit", (PyCFunction) unicode_isdigit, METH_NOARGS, isdigit__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4612 {"isnumeric", (PyCFunction) unicode_isnumeric, METH_NOARGS, isnumeric__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4613 {"isalpha", (PyCFunction) unicode_isalpha, METH_NOARGS, isalpha__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4614 {"isalnum", (PyCFunction) unicode_isalnum, METH_NOARGS, isalnum__doc__}, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4615 #if 0 |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4616 {"zfill", (PyCFunction) unicode_zfill, METH_VARARGS, zfill__doc__}, |
|
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4617 {"capwords", (PyCFunction) unicode_capwords, METH_NOARGS, capwords__doc__}, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4618 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4619 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4620 #if 0 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4621 /* This one is just used for debugging the implementation. */ |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19121
diff
changeset
|
4622 {"freelistsize", (PyCFunction) unicode_freelistsize, METH_NOARGS}, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4623 #endif |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4624 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4625 {NULL, NULL} |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4626 }; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4627 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4628 static PySequenceMethods unicode_as_sequence = { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4629 (inquiry) unicode_length, /* sq_length */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4630 (binaryfunc) PyUnicode_Concat, /* sq_concat */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4631 (intargfunc) unicode_repeat, /* sq_repeat */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4632 (intargfunc) unicode_getitem, /* sq_item */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4633 (intintargfunc) unicode_slice, /* sq_slice */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4634 0, /* sq_ass_item */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4635 0, /* sq_ass_slice */ |
|
11997
38310eb0659e
Add sq_contains implementation.
Guido van Rossum <guido@python.org>
parents:
11968
diff
changeset
|
4636 (objobjproc)PyUnicode_Contains, /*sq_contains*/ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4637 }; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4638 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4639 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4640 unicode_buffer_getreadbuf(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4641 int index, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4642 const void **ptr) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4643 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4644 if (index != 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4645 PyErr_SetString(PyExc_SystemError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4646 "accessing non-existent unicode segment"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4647 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4648 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4649 *ptr = (void *) self->str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4650 return PyUnicode_GET_DATA_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4651 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4652 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4653 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4654 unicode_buffer_getwritebuf(PyUnicodeObject *self, int index, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4655 const void **ptr) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4656 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4657 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4658 "cannot use unicode as modifyable buffer"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4659 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4660 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4661 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4662 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4663 unicode_buffer_getsegcount(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4664 int *lenp) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4665 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4666 if (lenp) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4667 *lenp = PyUnicode_GET_DATA_SIZE(self); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4668 return 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4669 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4670 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4671 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4672 unicode_buffer_getcharbuf(PyUnicodeObject *self, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4673 int index, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4674 const void **ptr) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4675 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4676 PyObject *str; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4677 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4678 if (index != 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4679 PyErr_SetString(PyExc_SystemError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4680 "accessing non-existent unicode segment"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4681 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4682 } |
|
13837
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
4683 str = _PyUnicode_AsDefaultEncodedString((PyObject *)self, NULL); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4684 if (str == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4685 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4686 *ptr = (void *) PyString_AS_STRING(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4687 return PyString_GET_SIZE(str); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4688 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4689 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4690 /* Helpers for PyUnicode_Format() */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4691 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4692 static PyObject * |
|
13660
a1ce07218781
Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents:
13635
diff
changeset
|
4693 getnextarg(PyObject *args, int arglen, int *p_argidx) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4694 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4695 int argidx = *p_argidx; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4696 if (argidx < arglen) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4697 (*p_argidx)++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4698 if (arglen < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4699 return args; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4700 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4701 return PyTuple_GetItem(args, argidx); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4702 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4703 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4704 "not enough arguments for format string"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4705 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4706 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4707 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4708 #define F_LJUST (1<<0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4709 #define F_SIGN (1<<1) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4710 #define F_BLANK (1<<2) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4711 #define F_ALT (1<<3) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4712 #define F_ZERO (1<<4) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4713 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4714 static |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4715 int usprintf(register Py_UNICODE *buffer, char *format, ...) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4716 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4717 register int i; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4718 int len; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4719 va_list va; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4720 char *charbuffer; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4721 va_start(va, format); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4722 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4723 /* First, format the string as char array, then expand to Py_UNICODE |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4724 array. */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4725 charbuffer = (char *)buffer; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4726 len = vsprintf(charbuffer, format, va); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4727 for (i = len - 1; i >= 0; i--) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4728 buffer[i] = (Py_UNICODE) charbuffer[i]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4729 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4730 va_end(va); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4731 return len; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4732 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4733 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4734 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4735 formatfloat(Py_UNICODE *buf, |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4736 size_t buflen, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4737 int flags, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4738 int prec, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4739 int type, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4740 PyObject *v) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4741 { |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4742 /* fmt = '%#.' + `prec` + `type` |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4743 worst case length = 3 + 10 (len of INT_MAX) + 1 = 14 (use 20)*/ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4744 char fmt[20]; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4745 double x; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4746 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4747 x = PyFloat_AsDouble(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4748 if (x == -1.0 && PyErr_Occurred()) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4749 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4750 if (prec < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4751 prec = 6; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4752 if (type == 'f' && (fabs(x) / 1e25) >= 1e25) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4753 type = 'g'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4754 sprintf(fmt, "%%%s.%d%c", (flags & F_ALT) ? "#" : "", prec, type); |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4755 /* worst case length calc to ensure no buffer overrun: |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4756 fmt = %#.<prec>g |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4757 buf = '-' + [0-9]*prec + '.' + 'e+' + (longest exp |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4758 for any double rep.) |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4759 len = 1 + prec + 1 + 2 + 5 = 9 + prec |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4760 If prec=0 the effective precision is 1 (the leading digit is |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4761 always given), therefore increase by one to 10+prec. */ |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4762 if (buflen <= (size_t)10 + (size_t)prec) { |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4763 PyErr_SetString(PyExc_OverflowError, |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4764 "formatted float is too long (precision too long?)"); |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4765 return -1; |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4766 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4767 return usprintf(buf, fmt, x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4768 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4769 |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4770 static PyObject* |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4771 formatlong(PyObject *val, int flags, int prec, int type) |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4772 { |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4773 char *buf; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4774 int i, len; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4775 PyObject *str; /* temporary string object. */ |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4776 PyUnicodeObject *result; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4777 |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4778 str = _PyString_FormatLong(val, flags, prec, type, &buf, &len); |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4779 if (!str) |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4780 return NULL; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4781 result = _PyUnicode_New(len); |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4782 for (i = 0; i < len; i++) |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4783 result->str[i] = buf[i]; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4784 result->str[len] = 0; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4785 Py_DECREF(str); |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4786 return (PyObject*)result; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4787 } |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4788 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4789 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4790 formatint(Py_UNICODE *buf, |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4791 size_t buflen, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4792 int flags, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4793 int prec, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4794 int type, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4795 PyObject *v) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4796 { |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4797 /* fmt = '%#.' + `prec` + 'l' + `type` |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4798 worst case length = 3 + 19 (worst len of INT_MAX on 64-bit machine) |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4799 + 1 + 1 = 24*/ |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
4800 char fmt[64]; /* plenty big enough! */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4801 long x; |
|
17640
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4802 int use_native_c_format = 1; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4803 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4804 x = PyInt_AsLong(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4805 if (x == -1 && PyErr_Occurred()) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4806 return -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4807 if (prec < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4808 prec = 1; |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4809 /* buf = '+'/'-'/'0'/'0x' + '[0-9]'*max(prec,len(x in octal)) |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4810 worst case buf = '0x' + [0-9]*prec, where prec >= 11 */ |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4811 if (buflen <= 13 || buflen <= (size_t)2+(size_t)prec) { |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4812 PyErr_SetString(PyExc_OverflowError, |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4813 "formatted integer is too long (precision too long?)"); |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4814 return -1; |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4815 } |
|
17450
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
4816 /* When converting 0 under %#x or %#X, C leaves off the base marker, |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
4817 * but we want it (for consistency with other %#x conversions, and |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
4818 * for consistency with Python's hex() function). |
|
17640
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4819 * BUG 28-Apr-2001 tim: At least two platform Cs (Metrowerks & |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4820 * Compaq Tru64) violate the std by converting 0 w/ leading 0x anyway. |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4821 * So add it only if the platform doesn't already. |
|
17450
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
4822 */ |
|
17640
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4823 if (x == 0 && (flags & F_ALT) && (type == 'x' || type == 'X')) { |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4824 /* Only way to know what the platform does is to try it. */ |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4825 sprintf(fmt, type == 'x' ? "%#x" : "%#X", 0); |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4826 if (fmt[1] != (char)type) { |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4827 /* Supply our own leading 0x/0X -- needed under std C */ |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4828 use_native_c_format = 0; |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4829 sprintf(fmt, "0%c%%#.%dl%c", type, prec, type); |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4830 } |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4831 } |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4832 if (use_native_c_format) |
|
9934225fe297
A different approach to the problem reported in
Tim Peters <tim.peters@gmail.com>
parents:
17618
diff
changeset
|
4833 sprintf(fmt, "%%%s.%dl%c", (flags & F_ALT) ? "#" : "", prec, type); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4834 return usprintf(buf, fmt, x); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4835 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4836 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4837 static int |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4838 formatchar(Py_UNICODE *buf, |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4839 size_t buflen, |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4840 PyObject *v) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4841 { |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4842 /* presume that the buffer is at least 2 characters long */ |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4843 if (PyUnicode_Check(v)) { |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4844 if (PyUnicode_GET_SIZE(v) != 1) |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4845 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4846 buf[0] = PyUnicode_AS_UNICODE(v)[0]; |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4847 } |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4848 |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4849 else if (PyString_Check(v)) { |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4850 if (PyString_GET_SIZE(v) != 1) |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4851 goto onError; |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4852 buf[0] = (Py_UNICODE)PyString_AS_STRING(v)[0]; |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4853 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4854 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4855 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4856 /* Integer input truncated to a character */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4857 long x; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4858 x = PyInt_AsLong(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4859 if (x == -1 && PyErr_Occurred()) |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4860 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4861 buf[0] = (char) x; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4862 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4863 buf[1] = '\0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4864 return 1; |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4865 |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4866 onError: |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4867 PyErr_SetString(PyExc_TypeError, |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4868 "%c requires int or char"); |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
4869 return -1; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4870 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4871 |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4872 /* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4873 |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4874 FORMATBUFLEN is the length of the buffer in which the floats, ints, & |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4875 chars are formatted. XXX This is a magic number. Each formatting |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4876 routine does bounds checking to ensure no overflow, but a better |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4877 solution may be to malloc a buffer of appropriate size for each |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4878 format. For now, the current solution is sufficient. |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4879 */ |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4880 #define FORMATBUFLEN (size_t)120 |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4881 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4882 PyObject *PyUnicode_Format(PyObject *format, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4883 PyObject *args) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4884 { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4885 Py_UNICODE *fmt, *res; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4886 int fmtcnt, rescnt, reslen, arglen, argidx; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4887 int args_owned = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4888 PyUnicodeObject *result = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4889 PyObject *dict = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4890 PyObject *uformat; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4891 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4892 if (format == NULL || args == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4893 PyErr_BadInternalCall(); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4894 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4895 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4896 uformat = PyUnicode_FromObject(format); |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
4897 if (uformat == NULL) |
|
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
4898 return NULL; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4899 fmt = PyUnicode_AS_UNICODE(uformat); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4900 fmtcnt = PyUnicode_GET_SIZE(uformat); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4901 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4902 reslen = rescnt = fmtcnt + 100; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4903 result = _PyUnicode_New(reslen); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4904 if (result == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4905 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4906 res = PyUnicode_AS_UNICODE(result); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4907 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4908 if (PyTuple_Check(args)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4909 arglen = PyTuple_Size(args); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4910 argidx = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4911 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4912 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4913 arglen = -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4914 argidx = -2; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4915 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4916 if (args->ob_type->tp_as_mapping) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4917 dict = args; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4918 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4919 while (--fmtcnt >= 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4920 if (*fmt != '%') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4921 if (--rescnt < 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4922 rescnt = fmtcnt + 100; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4923 reslen += rescnt; |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
4924 if (_PyUnicode_Resize(&result, reslen) < 0) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4925 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4926 res = PyUnicode_AS_UNICODE(result) + reslen - rescnt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4927 --rescnt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4928 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4929 *res++ = *fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4930 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4931 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4932 /* Got a format specifier */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4933 int flags = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4934 int width = -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4935 int prec = -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4936 Py_UNICODE c = '\0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4937 Py_UNICODE fill; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4938 PyObject *v = NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4939 PyObject *temp = NULL; |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4940 Py_UNICODE *pbuf; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4941 Py_UNICODE sign; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4942 int len; |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
4943 Py_UNICODE formatbuf[FORMATBUFLEN]; /* For format{float,int,char}() */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4944 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4945 fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4946 if (*fmt == '(') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4947 Py_UNICODE *keystart; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4948 int keylen; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4949 PyObject *key; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4950 int pcount = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4951 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4952 if (dict == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4953 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4954 "format requires a mapping"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4955 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4956 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4957 ++fmt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4958 --fmtcnt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4959 keystart = fmt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4960 /* Skip over balanced parentheses */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4961 while (pcount > 0 && --fmtcnt >= 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4962 if (*fmt == ')') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4963 --pcount; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4964 else if (*fmt == '(') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4965 ++pcount; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4966 fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4967 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4968 keylen = fmt - keystart - 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4969 if (fmtcnt < 0 || pcount > 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4970 PyErr_SetString(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4971 "incomplete format key"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4972 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4973 } |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
4974 /* keys are converted to strings using UTF-8 and |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4975 then looked up since Python uses strings to hold |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4976 variables names etc. in its namespaces and we |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
4977 wouldn't want to break common idioms. */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4978 key = PyUnicode_EncodeUTF8(keystart, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4979 keylen, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4980 NULL); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4981 if (key == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4982 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4983 if (args_owned) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4984 Py_DECREF(args); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4985 args_owned = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4986 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4987 args = PyObject_GetItem(dict, key); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4988 Py_DECREF(key); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4989 if (args == NULL) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4990 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4991 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4992 args_owned = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4993 arglen = -1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4994 argidx = -2; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4995 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4996 while (--fmtcnt >= 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4997 switch (c = *fmt++) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4998 case '-': flags |= F_LJUST; continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4999 case '+': flags |= F_SIGN; continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5000 case ' ': flags |= F_BLANK; continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5001 case '#': flags |= F_ALT; continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5002 case '0': flags |= F_ZERO; continue; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5003 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5004 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5005 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5006 if (c == '*') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5007 v = getnextarg(args, arglen, &argidx); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5008 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5009 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5010 if (!PyInt_Check(v)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5011 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5012 "* wants int"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5013 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5014 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5015 width = PyInt_AsLong(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5016 if (width < 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5017 flags |= F_LJUST; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5018 width = -width; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5019 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5020 if (--fmtcnt >= 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5021 c = *fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5022 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5023 else if (c >= '0' && c <= '9') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5024 width = c - '0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5025 while (--fmtcnt >= 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5026 c = *fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5027 if (c < '0' || c > '9') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5028 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5029 if ((width*10) / 10 != width) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5030 PyErr_SetString(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5031 "width too big"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5032 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5033 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5034 width = width*10 + (c - '0'); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5035 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5036 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5037 if (c == '.') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5038 prec = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5039 if (--fmtcnt >= 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5040 c = *fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5041 if (c == '*') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5042 v = getnextarg(args, arglen, &argidx); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5043 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5044 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5045 if (!PyInt_Check(v)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5046 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5047 "* wants int"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5048 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5049 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5050 prec = PyInt_AsLong(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5051 if (prec < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5052 prec = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5053 if (--fmtcnt >= 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5054 c = *fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5055 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5056 else if (c >= '0' && c <= '9') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5057 prec = c - '0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5058 while (--fmtcnt >= 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5059 c = Py_CHARMASK(*fmt++); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5060 if (c < '0' || c > '9') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5061 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5062 if ((prec*10) / 10 != prec) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5063 PyErr_SetString(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5064 "prec too big"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5065 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5066 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5067 prec = prec*10 + (c - '0'); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5068 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5069 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5070 } /* prec */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5071 if (fmtcnt >= 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5072 if (c == 'h' || c == 'l' || c == 'L') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5073 if (--fmtcnt >= 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5074 c = *fmt++; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5075 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5076 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5077 if (fmtcnt < 0) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5078 PyErr_SetString(PyExc_ValueError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5079 "incomplete format"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5080 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5081 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5082 if (c != '%') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5083 v = getnextarg(args, arglen, &argidx); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5084 if (v == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5085 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5086 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5087 sign = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5088 fill = ' '; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5089 switch (c) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5090 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5091 case '%': |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5092 pbuf = formatbuf; |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5093 /* presume that buffer length is at least 1 */ |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5094 pbuf[0] = '%'; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5095 len = 1; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5096 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5097 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5098 case 's': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5099 case 'r': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5100 if (PyUnicode_Check(v) && c == 's') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5101 temp = v; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5102 Py_INCREF(temp); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5103 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5104 else { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5105 PyObject *unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5106 if (c == 's') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5107 temp = PyObject_Str(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5108 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5109 temp = PyObject_Repr(v); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5110 if (temp == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5111 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5112 if (!PyString_Check(temp)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5113 /* XXX Note: this should never happen, since |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5114 PyObject_Repr() and PyObject_Str() assure |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5115 this */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5116 Py_DECREF(temp); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5117 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5118 "%s argument has non-string str()"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5119 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5120 } |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
5121 unicode = PyUnicode_Decode(PyString_AS_STRING(temp), |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5122 PyString_GET_SIZE(temp), |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
5123 NULL, |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5124 "strict"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5125 Py_DECREF(temp); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5126 temp = unicode; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5127 if (temp == NULL) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5128 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5129 } |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5130 pbuf = PyUnicode_AS_UNICODE(temp); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5131 len = PyUnicode_GET_SIZE(temp); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5132 if (prec >= 0 && len > prec) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5133 len = prec; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5134 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5135 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5136 case 'i': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5137 case 'd': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5138 case 'u': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5139 case 'o': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5140 case 'x': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5141 case 'X': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5142 if (c == 'i') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5143 c = 'd'; |
|
15455
d0146d128897
Fox for SF bug #123859: %[duxXo] long formats inconsistent.
Tim Peters <tim.peters@gmail.com>
parents:
15001
diff
changeset
|
5144 if (PyLong_Check(v)) { |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5145 temp = formatlong(v, flags, prec, c); |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5146 if (!temp) |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5147 goto onError; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5148 pbuf = PyUnicode_AS_UNICODE(temp); |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5149 len = PyUnicode_GET_SIZE(temp); |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5150 /* unbounded ints can always produce |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5151 a sign character! */ |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5152 sign = 1; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5153 } |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5154 else { |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5155 pbuf = formatbuf; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5156 len = formatint(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5157 flags, prec, c, v); |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5158 if (len < 0) |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5159 goto onError; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5160 /* only d conversion is signed */ |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5161 sign = c == 'd'; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5162 } |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5163 if (flags & F_ZERO) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5164 fill = '0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5165 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5166 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5167 case 'e': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5168 case 'E': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5169 case 'f': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5170 case 'g': |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5171 case 'G': |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5172 pbuf = formatbuf; |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5173 len = formatfloat(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5174 flags, prec, c, v); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5175 if (len < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5176 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5177 sign = 1; |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5178 if (flags & F_ZERO) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5179 fill = '0'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5180 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5181 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5182 case 'c': |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5183 pbuf = formatbuf; |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5184 len = formatchar(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), v); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5185 if (len < 0) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5186 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5187 break; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5188 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5189 default: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5190 PyErr_Format(PyExc_ValueError, |
|
15579
31d78f361530
[ Patch #102852 ] Make % error a bit more informative by indicates the
Andrew M. Kuchling <amk@amk.ca>
parents:
15455
diff
changeset
|
5191 "unsupported format character '%c' (0x%x) " |
|
31d78f361530
[ Patch #102852 ] Make % error a bit more informative by indicates the
Andrew M. Kuchling <amk@amk.ca>
parents:
15455
diff
changeset
|
5192 "at index %i", |
|
15631
552db8d83acd
Patch #102940: use only printable Unicode chars in reporting
Andrew M. Kuchling <amk@amk.ca>
parents:
15609
diff
changeset
|
5193 (31<=c && c<=126) ? c : '?', |
|
552db8d83acd
Patch #102940: use only printable Unicode chars in reporting
Andrew M. Kuchling <amk@amk.ca>
parents:
15609
diff
changeset
|
5194 c, fmt -1 - PyUnicode_AS_UNICODE(uformat)); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5195 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5196 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5197 if (sign) { |
|
13196
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5198 if (*pbuf == '-' || *pbuf == '+') { |
|
18920eaa1226
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
13110
diff
changeset
|
5199 sign = *pbuf++; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5200 len--; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5201 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5202 else if (flags & F_SIGN) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5203 sign = '+'; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5204 else if (flags & F_BLANK) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5205 sign = ' '; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5206 else |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5207 sign = 0; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5208 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5209 if (width < len) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5210 width = len; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5211 if (rescnt < width + (sign != 0)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5212 reslen -= rescnt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5213 rescnt = width + fmtcnt + 100; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5214 reslen += rescnt; |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5215 if (_PyUnicode_Resize(&result, reslen) < 0) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5216 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5217 res = PyUnicode_AS_UNICODE(result) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5218 + reslen - rescnt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5219 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5220 if (sign) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5221 if (fill != ' ') |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5222 *res++ = sign; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5223 rescnt--; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5224 if (width > len) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5225 width--; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5226 } |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5227 if ((flags & F_ALT) && (c == 'x' || c == 'X')) { |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5228 assert(pbuf[0] == '0'); |
|
17450
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5229 assert(pbuf[1] == c); |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5230 if (fill != ' ') { |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5231 *res++ = *pbuf++; |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5232 *res++ = *pbuf++; |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5233 } |
|
17450
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5234 rescnt -= 2; |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5235 width -= 2; |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5236 if (width < 0) |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5237 width = 0; |
|
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5238 len -= 2; |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5239 } |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5240 if (width > len && !(flags & F_LJUST)) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5241 do { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5242 --rescnt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5243 *res++ = fill; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5244 } while (--width > len); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5245 } |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5246 if (fill == ' ') { |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5247 if (sign) |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5248 *res++ = sign; |
|
17450
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5249 if ((flags & F_ALT) && (c == 'x' || c == 'X')) { |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5250 assert(pbuf[0] == '0'); |
|
17450
f74f5aafdc7e
Bug 415514 reported that e.g.
Tim Peters <tim.peters@gmail.com>
parents:
17425
diff
changeset
|
5251 assert(pbuf[1] == c); |
|
14713
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5252 *res++ = *pbuf++; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5253 *res++ = *pbuf++; |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5254 } |
|
58b832b8745e
Derived from Martin's SF patch 110609: support unbounded ints in %d,i,u,x,X,o formats.
Tim Peters <tim.peters@gmail.com>
parents:
14492
diff
changeset
|
5255 } |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5256 Py_UNICODE_COPY(res, pbuf, len); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5257 res += len; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5258 rescnt -= len; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5259 while (--width >= len) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5260 --rescnt; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5261 *res++ = ' '; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5262 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5263 if (dict && (argidx < arglen) && c != '%') { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5264 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5265 "not all arguments converted"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5266 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5267 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5268 Py_XDECREF(temp); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5269 } /* '%' */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5270 } /* until end */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5271 if (argidx < arglen && !dict) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5272 PyErr_SetString(PyExc_TypeError, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5273 "not all arguments converted"); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5274 goto onError; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5275 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5276 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5277 if (args_owned) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5278 Py_DECREF(args); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5279 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5280 Py_DECREF(uformat); |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5281 if (_PyUnicode_Resize(&result, reslen - rescnt)) |
| 12329 | 5282 goto onError; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5283 return (PyObject *)result; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5284 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5285 onError: |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5286 Py_XDECREF(result); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5287 Py_DECREF(uformat); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5288 if (args_owned) { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5289 Py_DECREF(args); |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5290 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5291 return NULL; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5292 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5293 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5294 static PyBufferProcs unicode_as_buffer = { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5295 (getreadbufferproc) unicode_buffer_getreadbuf, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5296 (getwritebufferproc) unicode_buffer_getwritebuf, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5297 (getsegcountproc) unicode_buffer_getsegcount, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5298 (getcharbufferproc) unicode_buffer_getcharbuf, |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5299 }; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5300 |
|
19593
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5301 staticforward PyObject * |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5302 unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5303 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5304 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5305 unicode_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5306 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5307 PyObject *x = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5308 static char *kwlist[] = {"string", "encoding", "errors", 0}; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5309 char *encoding = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5310 char *errors = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5311 |
|
19593
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5312 if (type != &PyUnicode_Type) |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5313 return unicode_subtype_new(type, args, kwds); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5314 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:unicode", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5315 kwlist, &x, &encoding, &errors)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5316 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5317 if (x == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5318 return (PyObject *)_PyUnicode_New(0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5319 return PyUnicode_FromEncodedObject(x, encoding, errors); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5320 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5321 |
|
19593
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5322 static PyObject * |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5323 unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5324 { |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5325 PyUnicodeObject *tmp, *new; |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5326 int n; |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5327 |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5328 assert(PyType_IsSubtype(type, &PyUnicode_Type)); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5329 tmp = (PyUnicodeObject *)unicode_new(&PyUnicode_Type, args, kwds); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5330 if (tmp == NULL) |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5331 return NULL; |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5332 assert(PyUnicode_Check(tmp)); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5333 new = (PyUnicodeObject *) type->tp_alloc(type, n = tmp->length); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5334 if (new == NULL) |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5335 return NULL; |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5336 new->str = PyMem_NEW(Py_UNICODE, n+1); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5337 if (new->str == NULL) { |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5338 _Py_ForgetReference((PyObject *)new); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5339 PyObject_DEL(new); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5340 return NULL; |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5341 } |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5342 Py_UNICODE_COPY(new->str, tmp->str, n+1); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5343 new->length = n; |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5344 Py_DECREF(tmp); |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5345 return (PyObject *)new; |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5346 } |
|
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5347 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5348 static char unicode_doc[] = |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5349 "unicode(string [, encoding[, errors]]) -> object\n\ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5350 \n\ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5351 Create a new Unicode object from the given encoded string.\n\ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5352 encoding defaults to the current default string encoding and \n\ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5353 errors, defining the error handling, to 'strict'."; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5354 |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5355 PyTypeObject PyUnicode_Type = { |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5356 PyObject_HEAD_INIT(&PyType_Type) |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5357 0, /* ob_size */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5358 "unicode", /* tp_name */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5359 sizeof(PyUnicodeObject), /* tp_size */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5360 0, /* tp_itemsize */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5361 /* Slots */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5362 (destructor)_PyUnicode_Free, /* tp_dealloc */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5363 0, /* tp_print */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5364 0, /* tp_getattr */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5365 0, /* tp_setattr */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5366 (cmpfunc) unicode_compare, /* tp_compare */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5367 (reprfunc) unicode_repr, /* tp_repr */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5368 0, /* tp_as_number */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5369 &unicode_as_sequence, /* tp_as_sequence */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5370 0, /* tp_as_mapping */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5371 (hashfunc) unicode_hash, /* tp_hash*/ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5372 0, /* tp_call*/ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5373 (reprfunc) unicode_str, /* tp_str */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5374 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5375 0, /* tp_setattro */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5376 &unicode_as_buffer, /* tp_as_buffer */ |
|
19593
a80b4b006eb7
Make unicode subclassable.
Guido van Rossum <guido@python.org>
parents:
19301
diff
changeset
|
5377 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5378 unicode_doc, /* tp_doc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5379 0, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5380 0, /* tp_clear */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5381 0, /* tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5382 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5383 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5384 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5385 unicode_methods, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5386 0, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5387 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5388 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5389 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5390 0, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5391 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5392 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5393 0, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5394 0, /* tp_alloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
5395 unicode_new, /* tp_new */ |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5396 }; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5397 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5398 /* Initialize the Unicode implementation */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5399 |
|
13660
a1ce07218781
Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents:
13635
diff
changeset
|
5400 void _PyUnicode_Init(void) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5401 { |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5402 int i; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5403 |
|
12645
c4eb70d24a87
M.-A. Lemburg <mal@lemburg.com>:
Fred Drake <fdrake@acm.org>
parents:
12629
diff
changeset
|
5404 /* Init the implementation */ |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
5405 unicode_freelist = NULL; |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
5406 unicode_freelist_size = 0; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5407 unicode_empty = _PyUnicode_New(0); |
|
12876
243593f11fcf
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12646
diff
changeset
|
5408 strcpy(unicode_default_encoding, "ascii"); |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5409 for (i = 0; i < 256; i++) |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5410 unicode_latin1[i] = NULL; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5411 } |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5412 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5413 /* Finalize the Unicode implementation */ |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5414 |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5415 void |
|
13660
a1ce07218781
Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents:
13635
diff
changeset
|
5416 _PyUnicode_Fini(void) |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5417 { |
|
15001
a349b89bf10e
_PyUnicode_Fini(): Initialize the local freelist walking variable `u'
Barry Warsaw <barry@python.org>
parents:
14998
diff
changeset
|
5418 PyUnicodeObject *u; |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5419 int i; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5420 |
|
14998
c16bdf555c79
In _PyUnicode_Fini(), decref unicode_empty before tearng down the free
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
5421 Py_XDECREF(unicode_empty); |
|
c16bdf555c79
In _PyUnicode_Fini(), decref unicode_empty before tearng down the free
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
5422 unicode_empty = NULL; |
|
15001
a349b89bf10e
_PyUnicode_Fini(): Initialize the local freelist walking variable `u'
Barry Warsaw <barry@python.org>
parents:
14998
diff
changeset
|
5423 |
|
17618
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5424 for (i = 0; i < 256; i++) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5425 if (unicode_latin1[i]) { |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5426 Py_DECREF(unicode_latin1[i]); |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5427 unicode_latin1[i] = NULL; |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5428 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5429 } |
|
b44ba7c01217
This patch originated from an idea by Martin v. Loewis who submitted a
Marc-André Lemburg <mal@egenix.com>
parents:
17600
diff
changeset
|
5430 |
|
15001
a349b89bf10e
_PyUnicode_Fini(): Initialize the local freelist walking variable `u'
Barry Warsaw <barry@python.org>
parents:
14998
diff
changeset
|
5431 for (u = unicode_freelist; u != NULL;) { |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5432 PyUnicodeObject *v = u; |
|
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5433 u = *(PyUnicodeObject **)u; |
| 12329 | 5434 if (v->str) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12568
diff
changeset
|
5435 PyMem_DEL(v->str); |
|
13837
2badb322355f
This patch finalizes the move from UTF-8 to a default encoding in
Marc-André Lemburg <mal@egenix.com>
parents:
13828
diff
changeset
|
5436 Py_XDECREF(v->defenc); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12568
diff
changeset
|
5437 PyObject_DEL(v); |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5438 } |
|
12899
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
5439 unicode_freelist = NULL; |
|
9df91f91e5cc
Marc-Andre Lemburg <mal@lemburg.com>:
Marc-André Lemburg <mal@egenix.com>
parents:
12876
diff
changeset
|
5440 unicode_freelist_size = 0; |
|
11968
13bc68faeb65
Unicode implementation by Marc-Andre Lemburg based on original code by
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5441 } |
