Mercurial > cpython-lru_cache-weakref
annotate Objects/stringlib/string_format.h @ 58664:993f703a61ba
Merged revisions 77484,77487,77561,77570,77593,77603,77608,77667,77702-77703,77739,77858,77887,77889 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77484 | skip.montanaro | 2010-01-13 19:12:34 -0600 (Wed, 13 Jan 2010) | 4 lines
Update PyEval_EvalFrame to PyEval_EvalFrameEx. This looks to have been done
partially before. Also add a comment describing how this might have to work
with different versions of the interpreter.
........
r77487 | ezio.melotti | 2010-01-14 05:34:10 -0600 (Thu, 14 Jan 2010) | 1 line
Fixed typo
........
r77561 | georg.brandl | 2010-01-17 02:42:30 -0600 (Sun, 17 Jan 2010) | 1 line
#7699: improve datetime docs: straightforward linking to strftime/strptime section, mark classmethods as such.
........
r77570 | georg.brandl | 2010-01-17 06:14:42 -0600 (Sun, 17 Jan 2010) | 1 line
Add note about usage of STRINGLIB_EMPTY.
........
r77593 | georg.brandl | 2010-01-17 17:33:53 -0600 (Sun, 17 Jan 2010) | 1 line
Fix internal reference.
........
r77603 | benjamin.peterson | 2010-01-18 17:07:56 -0600 (Mon, 18 Jan 2010) | 8 lines
data descriptors do not override the class dictionary if __get__ is not defined
Adjust documentation and add a test to verify this behavior.
See http://mail.python.org/pipermail/python-dev/2010-January/095637.html for
discussion.
........
r77608 | gregory.p.smith | 2010-01-19 02:19:03 -0600 (Tue, 19 Jan 2010) | 6 lines
Do not compile stubs for the sha2 series hashes in the openssl hashlib
module when the openssl version is too old to support them. That
leads both compiled code bloat and to unittests attempting to test
implementations that don't exist for comparison purposes on such
platforms.
........
r77667 | mark.dickinson | 2010-01-21 12:32:27 -0600 (Thu, 21 Jan 2010) | 1 line
Add two more test_strtod test values.
........
r77702 | georg.brandl | 2010-01-23 02:43:31 -0600 (Sat, 23 Jan 2010) | 1 line
#7762: fix refcount annotation of PyUnicode_Tailmatch().
........
r77703 | georg.brandl | 2010-01-23 02:47:54 -0600 (Sat, 23 Jan 2010) | 1 line
#7725: fix referencing issue.
........
r77739 | benjamin.peterson | 2010-01-24 21:52:52 -0600 (Sun, 24 Jan 2010) | 1 line
mention from_float() in error message
........
r77858 | georg.brandl | 2010-01-30 11:57:48 -0600 (Sat, 30 Jan 2010) | 1 line
#7802: fix invalid example (heh).
........
r77887 | georg.brandl | 2010-01-31 12:51:49 -0600 (Sun, 31 Jan 2010) | 5 lines
Fix-up ftplib documentation:
move exception descriptions to toplevel, not inside a class
remove attribution in "versionadded"
spell and grammar check docstring of FTP_TLS
........
r77889 | michael.foord | 2010-01-31 13:59:26 -0600 (Sun, 31 Jan 2010) | 1 line
Minor modification to unittest documentation.
........
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Wed, 03 Feb 2010 02:35:45 +0000 |
| parents | 2bcac08cfc6d |
| children | cab14be0ada1 |
| rev | line source |
|---|---|
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
2 string_format.h -- implementation of string.format(). |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
3 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
4 It uses the Objects/stringlib conventions, so that it can be |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
5 compiled for both unicode and string objects. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
6 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
7 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
8 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
9 /* Defines for Python 2.6 compatability */ |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
10 #if PY_VERSION_HEX < 0x03000000 |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
11 #define PyLong_FromSsize_t _PyLong_FromSsize_t |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
12 #endif |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
13 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
14 /* Defines for more efficiently reallocating the string buffer */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
15 #define INITIAL_SIZE_INCREMENT 100 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
16 #define SIZE_MULTIPLIER 2 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
17 #define MAX_SIZE_INCREMENT 3200 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
18 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
19 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
20 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
21 /*********** Global data structures and forward declarations *********/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
22 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
23 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
24 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
25 A SubString consists of the characters between two string or |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
26 unicode pointers. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
27 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
28 typedef struct { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
29 STRINGLIB_CHAR *ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
30 STRINGLIB_CHAR *end; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
31 } SubString; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
32 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
33 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
34 typedef enum { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
35 ANS_INIT, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
36 ANS_AUTO, |
|
53639
0935e24c81c0
Merged revisions 72159 via svnmerge from
Georg Brandl <georg@python.org>
parents:
52159
diff
changeset
|
37 ANS_MANUAL |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
38 } AutoNumberState; /* Keep track if we're auto-numbering fields */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
39 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
40 /* Keeps track of our auto-numbering state, and which number field we're on */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
41 typedef struct { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
42 AutoNumberState an_state; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
43 int an_field_number; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
44 } AutoNumber; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
45 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
46 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
47 /* forward declaration for recursion */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
48 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
49 build_string(SubString *input, PyObject *args, PyObject *kwargs, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
50 int recursion_depth, AutoNumber *auto_number); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
51 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
52 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
53 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
54 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
55 /************************** Utility functions ************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
56 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
57 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
58 static void |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
59 AutoNumber_Init(AutoNumber *auto_number) |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
60 { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
61 auto_number->an_state = ANS_INIT; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
62 auto_number->an_field_number = 0; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
63 } |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
64 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
65 /* fill in a SubString from a pointer and length */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
66 Py_LOCAL_INLINE(void) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
67 SubString_init(SubString *str, STRINGLIB_CHAR *p, Py_ssize_t len) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
68 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
69 str->ptr = p; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
70 if (p == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
71 str->end = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
72 else |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
73 str->end = str->ptr + len; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
74 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
75 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
76 /* return a new string. if str->ptr is NULL, return None */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
77 Py_LOCAL_INLINE(PyObject *) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
78 SubString_new_object(SubString *str) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
79 { |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
80 if (str->ptr == NULL) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
81 Py_INCREF(Py_None); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
82 return Py_None; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
83 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
84 return STRINGLIB_NEW(str->ptr, str->end - str->ptr); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
85 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
86 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
87 /* return a new string. if str->ptr is NULL, return None */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
88 Py_LOCAL_INLINE(PyObject *) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
89 SubString_new_object_or_empty(SubString *str) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
90 { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
91 if (str->ptr == NULL) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
92 return STRINGLIB_NEW(NULL, 0); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
93 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
94 return STRINGLIB_NEW(str->ptr, str->end - str->ptr); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
95 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
96 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
97 /* Return 1 if an error has been detected switching between automatic |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
98 field numbering and manual field specification, else return 0. Set |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
99 ValueError on error. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
100 static int |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
101 autonumber_state_error(AutoNumberState state, int field_name_is_empty) |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
102 { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
103 if (state == ANS_MANUAL) { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
104 if (field_name_is_empty) { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
105 PyErr_SetString(PyExc_ValueError, "cannot switch from " |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
106 "manual field specification to " |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
107 "automatic field numbering"); |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
108 return 1; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
109 } |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
110 } |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
111 else { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
112 if (!field_name_is_empty) { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
113 PyErr_SetString(PyExc_ValueError, "cannot switch from " |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
114 "automatic field numbering to " |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
115 "manual field specification"); |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
116 return 1; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
117 } |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
118 } |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
119 return 0; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
120 } |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
121 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
122 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
123 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
124 /*********** Output string management functions ****************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
125 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
126 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
127 typedef struct { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
128 STRINGLIB_CHAR *ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
129 STRINGLIB_CHAR *end; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
130 PyObject *obj; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
131 Py_ssize_t size_increment; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
132 } OutputString; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
133 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
134 /* initialize an OutputString object, reserving size characters */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
135 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
136 output_initialize(OutputString *output, Py_ssize_t size) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
137 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
138 output->obj = STRINGLIB_NEW(NULL, size); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
139 if (output->obj == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
140 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
141 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
142 output->ptr = STRINGLIB_STR(output->obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
143 output->end = STRINGLIB_LEN(output->obj) + output->ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
144 output->size_increment = INITIAL_SIZE_INCREMENT; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
145 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
146 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
147 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
148 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
149 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
150 output_extend reallocates the output string buffer. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
151 It returns a status: 0 for a failed reallocation, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
152 1 for success. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
153 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
154 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
155 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
156 output_extend(OutputString *output, Py_ssize_t count) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
157 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
158 STRINGLIB_CHAR *startptr = STRINGLIB_STR(output->obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
159 Py_ssize_t curlen = output->ptr - startptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
160 Py_ssize_t maxlen = curlen + count + output->size_increment; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
161 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
162 if (STRINGLIB_RESIZE(&output->obj, maxlen) < 0) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
163 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
164 startptr = STRINGLIB_STR(output->obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
165 output->ptr = startptr + curlen; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
166 output->end = startptr + maxlen; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
167 if (output->size_increment < MAX_SIZE_INCREMENT) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
168 output->size_increment *= SIZE_MULTIPLIER; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
169 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
170 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
171 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
172 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
173 output_data dumps characters into our output string |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
174 buffer. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
175 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
176 In some cases, it has to reallocate the string. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
177 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
178 It returns a status: 0 for a failed reallocation, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
179 1 for success. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
180 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
181 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
182 output_data(OutputString *output, const STRINGLIB_CHAR *s, Py_ssize_t count) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
183 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
184 if ((count > output->end - output->ptr) && !output_extend(output, count)) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
185 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
186 memcpy(output->ptr, s, count * sizeof(STRINGLIB_CHAR)); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
187 output->ptr += count; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
188 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
189 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
190 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
191 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
192 /*********** Format string parsing -- integers and identifiers *********/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
193 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
194 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
195 static Py_ssize_t |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
196 get_integer(const SubString *str) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
197 { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
198 Py_ssize_t accumulator = 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
199 Py_ssize_t digitval; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
200 Py_ssize_t oldaccumulator; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
201 STRINGLIB_CHAR *p; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
202 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
203 /* empty string is an error */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
204 if (str->ptr >= str->end) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
205 return -1; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
206 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
207 for (p = str->ptr; p < str->end; p++) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
208 digitval = STRINGLIB_TODECIMAL(*p); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
209 if (digitval < 0) |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
210 return -1; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
211 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
212 This trick was copied from old Unicode format code. It's cute, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
213 but would really suck on an old machine with a slow divide |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
214 implementation. Fortunately, in the normal case we do not |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
215 expect too many digits. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
216 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
217 oldaccumulator = accumulator; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
218 accumulator *= 10; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
219 if ((accumulator+10)/10 != oldaccumulator+1) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
220 PyErr_Format(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
221 "Too many decimal digits in format string"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
222 return -1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
223 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
224 accumulator += digitval; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
225 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
226 return accumulator; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
227 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
228 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
229 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
230 /******** Functions to get field objects and specification strings ******/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
231 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
232 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
233 /* do the equivalent of obj.name */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
234 static PyObject * |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
235 getattr(PyObject *obj, SubString *name) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
236 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
237 PyObject *newobj; |
|
42922
b110bac9df40
Cleanup in anticipation of moving formatteriterator and fieldnameiterator into stringlib/string_format.h.
Eric Smith <eric@trueblade.com>
parents:
42894
diff
changeset
|
238 PyObject *str = SubString_new_object(name); |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
239 if (str == NULL) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
240 return NULL; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
241 newobj = PyObject_GetAttr(obj, str); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
242 Py_DECREF(str); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
243 return newobj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
244 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
245 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
246 /* do the equivalent of obj[idx], where obj is a sequence */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
247 static PyObject * |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
248 getitem_sequence(PyObject *obj, Py_ssize_t idx) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
249 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
250 return PySequence_GetItem(obj, idx); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
251 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
252 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
253 /* do the equivalent of obj[idx], where obj is not a sequence */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
254 static PyObject * |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
255 getitem_idx(PyObject *obj, Py_ssize_t idx) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
256 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
257 PyObject *newobj; |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43866
diff
changeset
|
258 PyObject *idx_obj = PyLong_FromSsize_t(idx); |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
259 if (idx_obj == NULL) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
260 return NULL; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
261 newobj = PyObject_GetItem(obj, idx_obj); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
262 Py_DECREF(idx_obj); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
263 return newobj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
264 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
265 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
266 /* do the equivalent of obj[name] */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
267 static PyObject * |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
268 getitem_str(PyObject *obj, SubString *name) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
269 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
270 PyObject *newobj; |
|
42922
b110bac9df40
Cleanup in anticipation of moving formatteriterator and fieldnameiterator into stringlib/string_format.h.
Eric Smith <eric@trueblade.com>
parents:
42894
diff
changeset
|
271 PyObject *str = SubString_new_object(name); |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
272 if (str == NULL) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
273 return NULL; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
274 newobj = PyObject_GetItem(obj, str); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
275 Py_DECREF(str); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
276 return newobj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
277 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
278 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
279 typedef struct { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
280 /* the entire string we're parsing. we assume that someone else |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
281 is managing its lifetime, and that it will exist for the |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
282 lifetime of the iterator. can be empty */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
283 SubString str; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
284 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
285 /* pointer to where we are inside field_name */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
286 STRINGLIB_CHAR *ptr; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
287 } FieldNameIterator; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
288 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
289 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
290 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
291 FieldNameIterator_init(FieldNameIterator *self, STRINGLIB_CHAR *ptr, |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
292 Py_ssize_t len) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
293 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
294 SubString_init(&self->str, ptr, len); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
295 self->ptr = self->str.ptr; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
296 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
297 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
298 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
299 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
300 _FieldNameIterator_attr(FieldNameIterator *self, SubString *name) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
301 { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
302 STRINGLIB_CHAR c; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
303 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
304 name->ptr = self->ptr; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
305 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
306 /* return everything until '.' or '[' */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
307 while (self->ptr < self->str.end) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
308 switch (c = *self->ptr++) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
309 case '[': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
310 case '.': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
311 /* backup so that we this character will be seen next time */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
312 self->ptr--; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
313 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
314 default: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
315 continue; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
316 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
317 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
318 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
319 /* end of string is okay */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
320 name->end = self->ptr; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
321 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
322 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
323 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
324 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
325 _FieldNameIterator_item(FieldNameIterator *self, SubString *name) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
326 { |
|
43206
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
327 int bracket_seen = 0; |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
328 STRINGLIB_CHAR c; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
329 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
330 name->ptr = self->ptr; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
331 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
332 /* return everything until ']' */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
333 while (self->ptr < self->str.end) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
334 switch (c = *self->ptr++) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
335 case ']': |
|
43206
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
336 bracket_seen = 1; |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
337 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
338 default: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
339 continue; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
340 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
341 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
342 } |
|
43206
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
343 /* make sure we ended with a ']' */ |
|
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
344 if (!bracket_seen) { |
|
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
345 PyErr_SetString(PyExc_ValueError, "Missing ']' in format string"); |
|
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
346 return 0; |
|
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
347 } |
|
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
348 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
349 /* end of string is okay */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
350 /* don't include the ']' */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
351 name->end = self->ptr-1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
352 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
353 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
354 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
355 /* returns 0 on error, 1 on non-error termination, and 2 if it returns a value */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
356 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
357 FieldNameIterator_next(FieldNameIterator *self, int *is_attribute, |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
358 Py_ssize_t *name_idx, SubString *name) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
359 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
360 /* check at end of input */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
361 if (self->ptr >= self->str.end) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
362 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
363 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
364 switch (*self->ptr++) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
365 case '.': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
366 *is_attribute = 1; |
|
43206
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
367 if (_FieldNameIterator_attr(self, name) == 0) |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
368 return 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
369 *name_idx = -1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
370 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
371 case '[': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
372 *is_attribute = 0; |
|
43206
f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
Eric Smith <eric@trueblade.com>
parents:
42969
diff
changeset
|
373 if (_FieldNameIterator_item(self, name) == 0) |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
374 return 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
375 *name_idx = get_integer(name); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
376 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
377 default: |
|
54269
2bcac08cfc6d
Merged revisions 72848 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
53639
diff
changeset
|
378 /* Invalid character follows ']' */ |
|
2bcac08cfc6d
Merged revisions 72848 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
53639
diff
changeset
|
379 PyErr_SetString(PyExc_ValueError, "Only '.' or '[' may " |
|
2bcac08cfc6d
Merged revisions 72848 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
53639
diff
changeset
|
380 "follow ']' in format field specifier"); |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
381 return 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
382 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
383 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
384 /* empty string is an error */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
385 if (name->ptr == name->end) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
386 PyErr_SetString(PyExc_ValueError, "Empty attribute in format string"); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
387 return 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
388 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
389 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
390 return 2; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
391 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
392 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
393 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
394 /* input: field_name |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
395 output: 'first' points to the part before the first '[' or '.' |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
396 'first_idx' is -1 if 'first' is not an integer, otherwise |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
397 it's the value of first converted to an integer |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
398 'rest' is an iterator to return the rest |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
399 */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
400 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
401 field_name_split(STRINGLIB_CHAR *ptr, Py_ssize_t len, SubString *first, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
402 Py_ssize_t *first_idx, FieldNameIterator *rest, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
403 AutoNumber *auto_number) |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
404 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
405 STRINGLIB_CHAR c; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
406 STRINGLIB_CHAR *p = ptr; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
407 STRINGLIB_CHAR *end = ptr + len; |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
408 int field_name_is_empty; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
409 int using_numeric_index; |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
410 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
411 /* find the part up until the first '.' or '[' */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
412 while (p < end) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
413 switch (c = *p++) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
414 case '[': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
415 case '.': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
416 /* backup so that we this character is available to the |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
417 "rest" iterator */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
418 p--; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
419 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
420 default: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
421 continue; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
422 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
423 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
424 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
425 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
426 /* set up the return values */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
427 SubString_init(first, ptr, p - ptr); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
428 FieldNameIterator_init(rest, p, end - p); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
429 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
430 /* see if "first" is an integer, in which case it's used as an index */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
431 *first_idx = get_integer(first); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
432 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
433 field_name_is_empty = first->ptr >= first->end; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
434 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
435 /* If the field name is omitted or if we have a numeric index |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
436 specified, then we're doing numeric indexing into args. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
437 using_numeric_index = field_name_is_empty || *first_idx != -1; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
438 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
439 /* We always get here exactly one time for each field we're |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
440 processing. And we get here in field order (counting by left |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
441 braces). So this is the perfect place to handle automatic field |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
442 numbering if the field name is omitted. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
443 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
444 /* Check if we need to do the auto-numbering. It's not needed if |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
445 we're called from string.Format routines, because it's handled |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
446 in that class by itself. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
447 if (auto_number) { |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
448 /* Initialize our auto numbering state if this is the first |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
449 time we're either auto-numbering or manually numbering. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
450 if (auto_number->an_state == ANS_INIT && using_numeric_index) |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
451 auto_number->an_state = field_name_is_empty ? |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
452 ANS_AUTO : ANS_MANUAL; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
453 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
454 /* Make sure our state is consistent with what we're doing |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
455 this time through. Only check if we're using a numeric |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
456 index. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
457 if (using_numeric_index) |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
458 if (autonumber_state_error(auto_number->an_state, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
459 field_name_is_empty)) |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
460 return 0; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
461 /* Zero length field means we want to do auto-numbering of the |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
462 fields. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
463 if (field_name_is_empty) |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
464 *first_idx = (auto_number->an_field_number)++; |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
465 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
466 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
467 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
468 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
469 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
470 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
471 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
472 get_field_object returns the object inside {}, before the |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
473 format_spec. It handles getindex and getattr lookups and consumes |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
474 the entire input string. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
475 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
476 static PyObject * |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
477 get_field_object(SubString *input, PyObject *args, PyObject *kwargs, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
478 AutoNumber *auto_number) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
479 { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
480 PyObject *obj = NULL; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
481 int ok; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
482 int is_attribute; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
483 SubString name; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
484 SubString first; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
485 Py_ssize_t index; |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
486 FieldNameIterator rest; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
487 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
488 if (!field_name_split(input->ptr, input->end - input->ptr, &first, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
489 &index, &rest, auto_number)) { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
490 goto error; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
491 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
492 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
493 if (index == -1) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
494 /* look up in kwargs */ |
|
42922
b110bac9df40
Cleanup in anticipation of moving formatteriterator and fieldnameiterator into stringlib/string_format.h.
Eric Smith <eric@trueblade.com>
parents:
42894
diff
changeset
|
495 PyObject *key = SubString_new_object(&first); |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
496 if (key == NULL) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
497 goto error; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
498 if ((kwargs == NULL) || (obj = PyDict_GetItem(kwargs, key)) == NULL) { |
|
43241
e946073dee38
Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents:
43206
diff
changeset
|
499 PyErr_SetObject(PyExc_KeyError, key); |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
500 Py_DECREF(key); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
501 goto error; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
502 } |
|
42894
6b4781dc81ff
Fix refleaks in test_unicode and test_string related to the new format code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42891
diff
changeset
|
503 Py_DECREF(key); |
|
42891
252a84280b73
This adds a leak, but fixes a crash. The leaking code is:
Neal Norwitz <nnorwitz@gmail.com>
parents:
42875
diff
changeset
|
504 Py_INCREF(obj); |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
505 } |
|
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
506 else { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
507 /* look up in args */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
508 obj = PySequence_GetItem(args, index); |
|
43241
e946073dee38
Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents:
43206
diff
changeset
|
509 if (obj == NULL) |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
510 goto error; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
511 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
512 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
513 /* iterate over the rest of the field_name */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
514 while ((ok = FieldNameIterator_next(&rest, &is_attribute, &index, |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
515 &name)) == 2) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
516 PyObject *tmp; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
517 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
518 if (is_attribute) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
519 /* getattr lookup "." */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
520 tmp = getattr(obj, &name); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
521 else |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
522 /* getitem lookup "[]" */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
523 if (index == -1) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
524 tmp = getitem_str(obj, &name); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
525 else |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
526 if (PySequence_Check(obj)) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
527 tmp = getitem_sequence(obj, index); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
528 else |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
529 /* not a sequence */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
530 tmp = getitem_idx(obj, index); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
531 if (tmp == NULL) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
532 goto error; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
533 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
534 /* assign to obj */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
535 Py_DECREF(obj); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
536 obj = tmp; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
537 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
538 /* end of iterator, this is the non-error case */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
539 if (ok == 1) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
540 return obj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
541 error: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
542 Py_XDECREF(obj); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
543 return NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
544 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
545 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
546 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
547 /***************** Field rendering functions **************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
548 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
549 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
550 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
551 render_field() is the main function in this section. It takes the |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
552 field object and field specification string generated by |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
553 get_field_and_spec, and renders the field into the output string. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
554 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
555 render_field calls fieldobj.__format__(format_spec) method, and |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
556 appends to the output. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
557 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
558 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
559 render_field(PyObject *fieldobj, SubString *format_spec, OutputString *output) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
560 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
561 int ok = 0; |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
562 PyObject *result = NULL; |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
563 PyObject *format_spec_object = NULL; |
|
47447
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
564 PyObject *(*formatter)(PyObject *, STRINGLIB_CHAR *, Py_ssize_t) = NULL; |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
565 STRINGLIB_CHAR* format_spec_start = format_spec->ptr ? |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
566 format_spec->ptr : NULL; |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
567 Py_ssize_t format_spec_len = format_spec->ptr ? |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
568 format_spec->end - format_spec->ptr : 0; |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
569 |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
570 /* If we know the type exactly, skip the lookup of __format__ and just |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
571 call the formatter directly. */ |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
572 if (PyUnicode_CheckExact(fieldobj)) |
|
47447
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
573 formatter = _PyUnicode_FormatAdvanced; |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
574 else if (PyLong_CheckExact(fieldobj)) |
|
47447
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
575 formatter =_PyLong_FormatAdvanced; |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
576 else if (PyFloat_CheckExact(fieldobj)) |
|
47447
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
577 formatter = _PyFloat_FormatAdvanced; |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
578 |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
579 /* XXX: for 2.6, convert format_spec to the appropriate type |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
580 (unicode, str) */ |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
581 |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
582 if (formatter) { |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
583 /* we know exactly which formatter will be called when __format__ is |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
584 looked up, so call it directly, instead. */ |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
585 result = formatter(fieldobj, format_spec_start, format_spec_len); |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
586 } |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
587 else { |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
588 /* We need to create an object out of the pointers we have, because |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
589 __format__ takes a string/unicode object for format_spec. */ |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
590 format_spec_object = STRINGLIB_NEW(format_spec_start, |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
591 format_spec_len); |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
592 if (format_spec_object == NULL) |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
593 goto done; |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
594 |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
595 result = PyObject_Format(fieldobj, format_spec_object); |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
596 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
597 if (result == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
598 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
599 |
|
45392
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
600 #if PY_VERSION_HEX >= 0x03000000 |
|
45509
09c9ceecdd56
Corrected assert to check for correct type in py3k.
Eric Smith <eric@trueblade.com>
parents:
45392
diff
changeset
|
601 assert(PyUnicode_Check(result)); |
|
45392
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
602 #else |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46335
diff
changeset
|
603 assert(PyBytes_Check(result) || PyUnicode_Check(result)); |
|
45392
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
604 |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
605 /* Convert result to our type. We could be str, and result could |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
606 be unicode */ |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
607 { |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
608 PyObject *tmp = STRINGLIB_TOSTR(result); |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
609 if (tmp == NULL) |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
610 goto done; |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
611 Py_DECREF(result); |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
612 result = tmp; |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
613 } |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
614 #endif |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
615 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
616 ok = output_data(output, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
617 STRINGLIB_STR(result), STRINGLIB_LEN(result)); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
618 done: |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
619 Py_XDECREF(format_spec_object); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
620 Py_XDECREF(result); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
621 return ok; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
622 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
623 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
624 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
625 parse_field(SubString *str, SubString *field_name, SubString *format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
626 STRINGLIB_CHAR *conversion) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
627 { |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
628 /* Note this function works if the field name is zero length, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
629 which is good. Zero length field names are handled later, in |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
630 field_name_split. */ |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
631 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
632 STRINGLIB_CHAR c = 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
633 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
634 /* initialize these, as they may be empty */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
635 *conversion = '\0'; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
636 SubString_init(format_spec, NULL, 0); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
637 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
638 /* Search for the field name. it's terminated by the end of |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
639 the string, or a ':' or '!' */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
640 field_name->ptr = str->ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
641 while (str->ptr < str->end) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
642 switch (c = *(str->ptr++)) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
643 case ':': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
644 case '!': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
645 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
646 default: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
647 continue; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
648 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
649 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
650 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
651 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
652 if (c == '!' || c == ':') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
653 /* we have a format specifier and/or a conversion */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
654 /* don't include the last character */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
655 field_name->end = str->ptr-1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
656 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
657 /* the format specifier is the rest of the string */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
658 format_spec->ptr = str->ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
659 format_spec->end = str->end; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
660 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
661 /* see if there's a conversion specifier */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
662 if (c == '!') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
663 /* there must be another character present */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
664 if (format_spec->ptr >= format_spec->end) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
665 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
666 "end of format while looking for conversion " |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
667 "specifier"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
668 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
669 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
670 *conversion = *(format_spec->ptr++); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
671 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
672 /* if there is another character, it must be a colon */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
673 if (format_spec->ptr < format_spec->end) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
674 c = *(format_spec->ptr++); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
675 if (c != ':') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
676 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
677 "expected ':' after format specifier"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
678 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
679 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
680 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
681 } |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
682 } |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
683 else |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
684 /* end of string, there's no format_spec or conversion */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
685 field_name->end = str->ptr; |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
686 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
687 return 1; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
688 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
689 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
690 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
691 /******* Output string allocation and escape-to-markup processing ******/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
692 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
693 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
694 /* MarkupIterator breaks the string into pieces of either literal |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
695 text, or things inside {} that need to be marked up. it is |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
696 designed to make it easy to wrap a Python iterator around it, for |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
697 use with the Formatter class */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
698 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
699 typedef struct { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
700 SubString str; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
701 } MarkupIterator; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
702 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
703 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
704 MarkupIterator_init(MarkupIterator *self, STRINGLIB_CHAR *ptr, Py_ssize_t len) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
705 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
706 SubString_init(&self->str, ptr, len); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
707 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
708 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
709 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
710 /* returns 0 on error, 1 on non-error termination, and 2 if it got a |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
711 string (or something to be expanded) */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
712 static int |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
713 MarkupIterator_next(MarkupIterator *self, SubString *literal, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
714 int *field_present, SubString *field_name, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
715 SubString *format_spec, STRINGLIB_CHAR *conversion, |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
716 int *format_spec_needs_expanding) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
717 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
718 int at_end; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
719 STRINGLIB_CHAR c = 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
720 STRINGLIB_CHAR *start; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
721 int count; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
722 Py_ssize_t len; |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
723 int markup_follows = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
724 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
725 /* initialize all of the output variables */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
726 SubString_init(literal, NULL, 0); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
727 SubString_init(field_name, NULL, 0); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
728 SubString_init(format_spec, NULL, 0); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
729 *conversion = '\0'; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
730 *format_spec_needs_expanding = 0; |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
731 *field_present = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
732 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
733 /* No more input, end of iterator. This is the normal exit |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
734 path. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
735 if (self->str.ptr >= self->str.end) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
736 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
737 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
738 start = self->str.ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
739 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
740 /* First read any literal text. Read until the end of string, an |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
741 escaped '{' or '}', or an unescaped '{'. In order to never |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
742 allocate memory and so I can just pass pointers around, if |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
743 there's an escaped '{' or '}' then we'll return the literal |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
744 including the brace, but no format object. The next time |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
745 through, we'll return the rest of the literal, skipping past |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
746 the second consecutive brace. */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
747 while (self->str.ptr < self->str.end) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
748 switch (c = *(self->str.ptr++)) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
749 case '{': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
750 case '}': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
751 markup_follows = 1; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
752 break; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
753 default: |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
754 continue; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
755 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
756 break; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
757 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
758 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
759 at_end = self->str.ptr >= self->str.end; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
760 len = self->str.ptr - start; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
761 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
762 if ((c == '}') && (at_end || (c != *self->str.ptr))) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
763 PyErr_SetString(PyExc_ValueError, "Single '}' encountered " |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
764 "in format string"); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
765 return 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
766 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
767 if (at_end && c == '{') { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
768 PyErr_SetString(PyExc_ValueError, "Single '{' encountered " |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
769 "in format string"); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
770 return 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
771 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
772 if (!at_end) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
773 if (c == *self->str.ptr) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
774 /* escaped } or {, skip it in the input. there is no |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
775 markup object following us, just this literal text */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
776 self->str.ptr++; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
777 markup_follows = 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
778 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
779 else |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
780 len--; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
781 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
782 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
783 /* record the literal text */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
784 literal->ptr = start; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
785 literal->end = start + len; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
786 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
787 if (!markup_follows) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
788 return 2; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
789 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
790 /* this is markup, find the end of the string by counting nested |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
791 braces. note that this prohibits escaped braces, so that |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
792 format_specs cannot have braces in them. */ |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
793 *field_present = 1; |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
794 count = 1; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
795 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
796 start = self->str.ptr; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
797 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
798 /* we know we can't have a zero length string, so don't worry |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
799 about that case */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
800 while (self->str.ptr < self->str.end) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
801 switch (c = *(self->str.ptr++)) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
802 case '{': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
803 /* the format spec needs to be recursively expanded. |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
804 this is an optimization, and not strictly needed */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
805 *format_spec_needs_expanding = 1; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
806 count++; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
807 break; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
808 case '}': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
809 count--; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
810 if (count <= 0) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
811 /* we're done. parse and get out */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
812 SubString s; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
813 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
814 SubString_init(&s, start, self->str.ptr - 1 - start); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
815 if (parse_field(&s, field_name, format_spec, conversion) == 0) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
816 return 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
817 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
818 /* success */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
819 return 2; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
820 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
821 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
822 } |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
823 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
824 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
825 /* end of string while searching for matching '}' */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
826 PyErr_SetString(PyExc_ValueError, "unmatched '{' in format"); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
827 return 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
828 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
829 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
830 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
831 /* do the !r or !s conversion on obj */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
832 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
833 do_conversion(PyObject *obj, STRINGLIB_CHAR conversion) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
834 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
835 /* XXX in pre-3.0, do we need to convert this to unicode, since it |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
836 might have returned a string? */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
837 switch (conversion) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
838 case 'r': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
839 return PyObject_Repr(obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
840 case 's': |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
841 return STRINGLIB_TOSTR(obj); |
|
47611
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
842 #if PY_VERSION_HEX >= 0x03000000 |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
843 case 'a': |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
844 return STRINGLIB_TOASCII(obj); |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
845 #endif |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
846 default: |
|
46335
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
847 if (conversion > 32 && conversion < 127) { |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
848 /* It's the ASCII subrange; casting to char is safe |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
849 (assuming the execution character set is an ASCII |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
850 superset). */ |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
851 PyErr_Format(PyExc_ValueError, |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
852 "Unknown conversion specifier %c", |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
853 (char)conversion); |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
854 } else |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
855 PyErr_Format(PyExc_ValueError, |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
856 "Unknown conversion specifier \\x%x", |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
857 (unsigned int)conversion); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
858 return NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
859 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
860 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
861 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
862 /* given: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
863 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
864 {field_name!conversion:format_spec} |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
865 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
866 compute the result and write it to output. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
867 format_spec_needs_expanding is an optimization. if it's false, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
868 just output the string directly, otherwise recursively expand the |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
869 format_spec string. |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
870 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
871 field_name is allowed to be zero length, in which case we |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
872 are doing auto field numbering. |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
873 */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
874 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
875 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
876 output_markup(SubString *field_name, SubString *format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
877 int format_spec_needs_expanding, STRINGLIB_CHAR conversion, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
878 OutputString *output, PyObject *args, PyObject *kwargs, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
879 int recursion_depth, AutoNumber *auto_number) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
880 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
881 PyObject *tmp = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
882 PyObject *fieldobj = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
883 SubString expanded_format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
884 SubString *actual_format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
885 int result = 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
886 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
887 /* convert field_name to an object */ |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
888 fieldobj = get_field_object(field_name, args, kwargs, auto_number); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
889 if (fieldobj == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
890 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
891 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
892 if (conversion != '\0') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
893 tmp = do_conversion(fieldobj, conversion); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
894 if (tmp == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
895 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
896 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
897 /* do the assignment, transferring ownership: fieldobj = tmp */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
898 Py_DECREF(fieldobj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
899 fieldobj = tmp; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
900 tmp = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
901 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
902 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
903 /* if needed, recurively compute the format_spec */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
904 if (format_spec_needs_expanding) { |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
905 tmp = build_string(format_spec, args, kwargs, recursion_depth-1, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
906 auto_number); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
907 if (tmp == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
908 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
909 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
910 /* note that in the case we're expanding the format string, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
911 tmp must be kept around until after the call to |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
912 render_field. */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
913 SubString_init(&expanded_format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
914 STRINGLIB_STR(tmp), STRINGLIB_LEN(tmp)); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
915 actual_format_spec = &expanded_format_spec; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
916 } |
|
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
917 else |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
918 actual_format_spec = format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
919 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
920 if (render_field(fieldobj, actual_format_spec, output) == 0) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
921 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
922 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
923 result = 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
924 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
925 done: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
926 Py_XDECREF(fieldobj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
927 Py_XDECREF(tmp); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
928 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
929 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
930 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
931 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
932 /* |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
933 do_markup is the top-level loop for the format() method. It |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
934 searches through the format string for escapes to markup codes, and |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
935 calls other functions to move non-markup text to the output, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
936 and to perform the markup to the output. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
937 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
938 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
939 do_markup(SubString *input, PyObject *args, PyObject *kwargs, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
940 OutputString *output, int recursion_depth, AutoNumber *auto_number) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
941 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
942 MarkupIterator iter; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
943 int format_spec_needs_expanding; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
944 int result; |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
945 int field_present; |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
946 SubString literal; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
947 SubString field_name; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
948 SubString format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
949 STRINGLIB_CHAR conversion; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
950 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
951 MarkupIterator_init(&iter, input->ptr, input->end - input->ptr); |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
952 while ((result = MarkupIterator_next(&iter, &literal, &field_present, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
953 &field_name, &format_spec, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
954 &conversion, |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
955 &format_spec_needs_expanding)) == 2) { |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
956 if (!output_data(output, literal.ptr, literal.end - literal.ptr)) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
957 return 0; |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
958 if (field_present) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
959 if (!output_markup(&field_name, &format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
960 format_spec_needs_expanding, conversion, output, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
961 args, kwargs, recursion_depth, auto_number)) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
962 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
963 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
964 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
965 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
966 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
967 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
968 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
969 build_string allocates the output string and then |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
970 calls do_markup to do the heavy lifting. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
971 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
972 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
973 build_string(SubString *input, PyObject *args, PyObject *kwargs, |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
974 int recursion_depth, AutoNumber *auto_number) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
975 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
976 OutputString output; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
977 PyObject *result = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
978 Py_ssize_t count; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
979 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
980 output.obj = NULL; /* needed so cleanup code always works */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
981 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
982 /* check the recursion level */ |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
983 if (recursion_depth <= 0) { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
984 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
985 "Max string recursion exceeded"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
986 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
987 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
988 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
989 /* initial size is the length of the format string, plus the size |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
990 increment. seems like a reasonable default */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
991 if (!output_initialize(&output, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
992 input->end - input->ptr + |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
993 INITIAL_SIZE_INCREMENT)) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
994 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
995 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
996 if (!do_markup(input, args, kwargs, &output, recursion_depth, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
997 auto_number)) { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
998 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
999 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1000 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1001 count = output.ptr - STRINGLIB_STR(output.obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1002 if (STRINGLIB_RESIZE(&output.obj, count) < 0) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1003 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1004 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1005 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1006 /* transfer ownership to result */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1007 result = output.obj; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1008 output.obj = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1009 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1010 done: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1011 Py_XDECREF(output.obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1012 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1013 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1014 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1015 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1016 /*********** main routine ***********************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1017 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1018 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1019 /* this is the main entry point */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1020 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1021 do_string_format(PyObject *self, PyObject *args, PyObject *kwargs) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1022 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1023 SubString input; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1024 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1025 /* PEP 3101 says only 2 levels, so that |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1026 "{0:{1}}".format('abc', 's') # works |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1027 "{0:{1:{2}}}".format('abc', 's', '') # fails |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1028 */ |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
1029 int recursion_depth = 2; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1030 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1031 AutoNumber auto_number; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1032 |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1033 AutoNumber_Init(&auto_number); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1034 SubString_init(&input, STRINGLIB_STR(self), STRINGLIB_LEN(self)); |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1035 return build_string(&input, args, kwargs, recursion_depth, &auto_number); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
1036 } |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1037 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1038 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1039 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1040 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1041 /*********** formatteriterator ******************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1042 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1043 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1044 /* This is used to implement string.Formatter.vparse(). It exists so |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1045 Formatter can share code with the built in unicode.format() method. |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1046 It's really just a wrapper around MarkupIterator that is callable |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1047 from Python. */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1048 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1049 typedef struct { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1050 PyObject_HEAD |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1051 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1052 STRINGLIB_OBJECT *str; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1053 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1054 MarkupIterator it_markup; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1055 } formatteriterobject; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1056 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1057 static void |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1058 formatteriter_dealloc(formatteriterobject *it) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1059 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1060 Py_XDECREF(it->str); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1061 PyObject_FREE(it); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1062 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1063 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1064 /* returns a tuple: |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1065 (literal, field_name, format_spec, conversion) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1066 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1067 literal is any literal text to output. might be zero length |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1068 field_name is the string before the ':'. might be None |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1069 format_spec is the string after the ':'. mibht be None |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1070 conversion is either None, or the string after the '!' |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1071 */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1072 static PyObject * |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1073 formatteriter_next(formatteriterobject *it) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1074 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1075 SubString literal; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1076 SubString field_name; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1077 SubString format_spec; |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1078 STRINGLIB_CHAR conversion; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1079 int format_spec_needs_expanding; |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1080 int field_present; |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1081 int result = MarkupIterator_next(&it->it_markup, &literal, &field_present, |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1082 &field_name, &format_spec, &conversion, |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1083 &format_spec_needs_expanding); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1084 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1085 /* all of the SubString objects point into it->str, so no |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1086 memory management needs to be done on them */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1087 assert(0 <= result && result <= 2); |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1088 if (result == 0 || result == 1) |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1089 /* if 0, error has already been set, if 1, iterator is empty */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1090 return NULL; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1091 else { |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1092 PyObject *literal_str = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1093 PyObject *field_name_str = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1094 PyObject *format_spec_str = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1095 PyObject *conversion_str = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1096 PyObject *tuple = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1097 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1098 literal_str = SubString_new_object(&literal); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1099 if (literal_str == NULL) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1100 goto done; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1101 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1102 field_name_str = SubString_new_object(&field_name); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1103 if (field_name_str == NULL) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1104 goto done; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1105 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1106 /* if field_name is non-zero length, return a string for |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1107 format_spec (even if zero length), else return None */ |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1108 format_spec_str = (field_present ? |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1109 SubString_new_object_or_empty : |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1110 SubString_new_object)(&format_spec); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1111 if (format_spec_str == NULL) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1112 goto done; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1113 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1114 /* if the conversion is not specified, return a None, |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1115 otherwise create a one length string with the conversion |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1116 character */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1117 if (conversion == '\0') { |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1118 conversion_str = Py_None; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1119 Py_INCREF(conversion_str); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1120 } |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1121 else |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1122 conversion_str = STRINGLIB_NEW(&conversion, 1); |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1123 if (conversion_str == NULL) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1124 goto done; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1125 |
|
42948
4ecbae07481f
Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents:
42929
diff
changeset
|
1126 tuple = PyTuple_Pack(4, literal_str, field_name_str, format_spec_str, |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1127 conversion_str); |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1128 done: |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1129 Py_XDECREF(literal_str); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1130 Py_XDECREF(field_name_str); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1131 Py_XDECREF(format_spec_str); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1132 Py_XDECREF(conversion_str); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1133 return tuple; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1134 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1135 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1136 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1137 static PyMethodDef formatteriter_methods[] = { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1138 {NULL, NULL} /* sentinel */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1139 }; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1140 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1141 static PyTypeObject PyFormatterIter_Type = { |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1142 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1143 "formatteriterator", /* tp_name */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1144 sizeof(formatteriterobject), /* tp_basicsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1145 0, /* tp_itemsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1146 /* methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1147 (destructor)formatteriter_dealloc, /* tp_dealloc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1148 0, /* tp_print */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1149 0, /* tp_getattr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1150 0, /* tp_setattr */ |
|
51271
87fbbf22adf3
Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47611
diff
changeset
|
1151 0, /* tp_reserved */ |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1152 0, /* tp_repr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1153 0, /* tp_as_number */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1154 0, /* tp_as_sequence */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1155 0, /* tp_as_mapping */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1156 0, /* tp_hash */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1157 0, /* tp_call */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1158 0, /* tp_str */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1159 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1160 0, /* tp_setattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1161 0, /* tp_as_buffer */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1162 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1163 0, /* tp_doc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1164 0, /* tp_traverse */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1165 0, /* tp_clear */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1166 0, /* tp_richcompare */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1167 0, /* tp_weaklistoffset */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1168 PyObject_SelfIter, /* tp_iter */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1169 (iternextfunc)formatteriter_next, /* tp_iternext */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1170 formatteriter_methods, /* tp_methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1171 0, |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1172 }; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1173 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1174 /* unicode_formatter_parser is used to implement |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1175 string.Formatter.vformat. it parses a string and returns tuples |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1176 describing the parsed elements. It's a wrapper around |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1177 stringlib/string_format.h's MarkupIterator */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1178 static PyObject * |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1179 formatter_parser(STRINGLIB_OBJECT *self) |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1180 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1181 formatteriterobject *it; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1182 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1183 it = PyObject_New(formatteriterobject, &PyFormatterIter_Type); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1184 if (it == NULL) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1185 return NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1186 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1187 /* take ownership, give the object to the iterator */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1188 Py_INCREF(self); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1189 it->str = self; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1190 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1191 /* initialize the contained MarkupIterator */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1192 MarkupIterator_init(&it->it_markup, |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1193 STRINGLIB_STR(self), |
|
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1194 STRINGLIB_LEN(self)); |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1195 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1196 return (PyObject *)it; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1197 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1198 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1199 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1200 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1201 /*********** fieldnameiterator ******************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1202 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1203 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1204 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1205 /* This is used to implement string.Formatter.vparse(). It parses the |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1206 field name into attribute and item values. It's a Python-callable |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1207 wrapper around FieldNameIterator */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1208 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1209 typedef struct { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1210 PyObject_HEAD |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1211 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1212 STRINGLIB_OBJECT *str; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1213 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1214 FieldNameIterator it_field; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1215 } fieldnameiterobject; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1216 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1217 static void |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1218 fieldnameiter_dealloc(fieldnameiterobject *it) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1219 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1220 Py_XDECREF(it->str); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1221 PyObject_FREE(it); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1222 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1223 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1224 /* returns a tuple: |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1225 (is_attr, value) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1226 is_attr is true if we used attribute syntax (e.g., '.foo') |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1227 false if we used index syntax (e.g., '[foo]') |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1228 value is an integer or string |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1229 */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1230 static PyObject * |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1231 fieldnameiter_next(fieldnameiterobject *it) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1232 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1233 int result; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1234 int is_attr; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1235 Py_ssize_t idx; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1236 SubString name; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1237 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1238 result = FieldNameIterator_next(&it->it_field, &is_attr, |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1239 &idx, &name); |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1240 if (result == 0 || result == 1) |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1241 /* if 0, error has already been set, if 1, iterator is empty */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1242 return NULL; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1243 else { |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1244 PyObject* result = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1245 PyObject* is_attr_obj = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1246 PyObject* obj = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1247 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1248 is_attr_obj = PyBool_FromLong(is_attr); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1249 if (is_attr_obj == NULL) |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1250 goto done; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1251 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1252 /* either an integer or a string */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1253 if (idx != -1) |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43866
diff
changeset
|
1254 obj = PyLong_FromSsize_t(idx); |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1255 else |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1256 obj = SubString_new_object(&name); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1257 if (obj == NULL) |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1258 goto done; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1259 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1260 /* return a tuple of values */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1261 result = PyTuple_Pack(2, is_attr_obj, obj); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1262 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1263 done: |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1264 Py_XDECREF(is_attr_obj); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1265 Py_XDECREF(obj); |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1266 return result; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1267 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1268 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1269 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1270 static PyMethodDef fieldnameiter_methods[] = { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1271 {NULL, NULL} /* sentinel */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1272 }; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1273 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1274 static PyTypeObject PyFieldNameIter_Type = { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1275 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1276 "fieldnameiterator", /* tp_name */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1277 sizeof(fieldnameiterobject), /* tp_basicsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1278 0, /* tp_itemsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1279 /* methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1280 (destructor)fieldnameiter_dealloc, /* tp_dealloc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1281 0, /* tp_print */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1282 0, /* tp_getattr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1283 0, /* tp_setattr */ |
|
51271
87fbbf22adf3
Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47611
diff
changeset
|
1284 0, /* tp_reserved */ |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1285 0, /* tp_repr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1286 0, /* tp_as_number */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1287 0, /* tp_as_sequence */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1288 0, /* tp_as_mapping */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1289 0, /* tp_hash */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1290 0, /* tp_call */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1291 0, /* tp_str */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1292 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1293 0, /* tp_setattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1294 0, /* tp_as_buffer */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1295 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1296 0, /* tp_doc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1297 0, /* tp_traverse */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1298 0, /* tp_clear */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1299 0, /* tp_richcompare */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1300 0, /* tp_weaklistoffset */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1301 PyObject_SelfIter, /* tp_iter */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1302 (iternextfunc)fieldnameiter_next, /* tp_iternext */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1303 fieldnameiter_methods, /* tp_methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1304 0}; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1305 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1306 /* unicode_formatter_field_name_split is used to implement |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1307 string.Formatter.vformat. it takes an PEP 3101 "field name", and |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1308 returns a tuple of (first, rest): "first", the part before the |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1309 first '.' or '['; and "rest", an iterator for the rest of the field |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1310 name. it's a wrapper around stringlib/string_format.h's |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1311 field_name_split. The iterator it returns is a |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1312 FieldNameIterator */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1313 static PyObject * |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1314 formatter_field_name_split(STRINGLIB_OBJECT *self) |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1315 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1316 SubString first; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1317 Py_ssize_t first_idx; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1318 fieldnameiterobject *it; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1319 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1320 PyObject *first_obj = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1321 PyObject *result = NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1322 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1323 it = PyObject_New(fieldnameiterobject, &PyFieldNameIter_Type); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1324 if (it == NULL) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1325 return NULL; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1326 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1327 /* take ownership, give the object to the iterator. this is |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1328 just to keep the field_name alive */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1329 Py_INCREF(self); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1330 it->str = self; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1331 |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1332 /* Pass in auto_number = NULL. We'll return an empty string for |
|
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1333 first_obj in that case. */ |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1334 if (!field_name_split(STRINGLIB_STR(self), |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1335 STRINGLIB_LEN(self), |
|
52159
1c0a0f7b4f76
Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
1336 &first, &first_idx, &it->it_field, NULL)) |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1337 goto done; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1338 |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1339 /* first becomes an integer, if possible; else a string */ |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1340 if (first_idx != -1) |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43866
diff
changeset
|
1341 first_obj = PyLong_FromSsize_t(first_idx); |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1342 else |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1343 /* convert "first" into a string object */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1344 first_obj = SubString_new_object(&first); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1345 if (first_obj == NULL) |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1346 goto done; |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1347 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1348 /* return a tuple of values */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1349 result = PyTuple_Pack(2, first_obj, it); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1350 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1351 done: |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1352 Py_XDECREF(it); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1353 Py_XDECREF(first_obj); |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1354 return result; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1355 } |
