annotate Objects/stringlib/string_format.h @ 66978:aed2bbafa550 3.1

Blocked revisions 87324 via svnmerge ........ r87324 | r.david.murray | 2010-12-16 14:08:51 -0500 (Thu, 16 Dec 2010) | 9 lines #10719: restore messages generated on invalid compileall args Before the introduction of filename arguments to compileall it gave semi useful messages about not being able to 'list' names that weren't valid directories. This fix restores that behavior. In addition to the test for this case, the patch also adds a test for the default behavior of compileall when no arguments are provided, and fixes a bug in one of the previously added tests. ........
author R. David Murray <rdmurray@bitdance.com>
date Thu, 16 Dec 2010 19:10:16 +0000
parents b5af5c93135b
children 0991b40e895d fd044cda97d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);
62185
b5af5c93135b Merged revisions 81823,81835 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 61467
diff changeset
376 if (*name_idx == -1 && PyErr_Occurred())
b5af5c93135b Merged revisions 81823,81835 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 61467
diff changeset
377 return 0;
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
378 break;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
379 default:
54269
2bcac08cfc6d Merged revisions 72848 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 53639
diff changeset
380 /* Invalid character follows ']' */
2bcac08cfc6d Merged revisions 72848 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 53639
diff changeset
381 PyErr_SetString(PyExc_ValueError, "Only '.' or '[' may "
2bcac08cfc6d Merged revisions 72848 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 53639
diff changeset
382 "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
383 return 0;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
384 }
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
385
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
386 /* 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
387 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
388 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
389 return 0;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
390 }
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
391
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
392 return 2;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
393 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
394
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
395
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
396 /* 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
397 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
398 '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
399 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
400 '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
401 */
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
402 static int
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
403 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
404 Py_ssize_t *first_idx, FieldNameIterator *rest,
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
405 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
406 {
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 c;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
408 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
409 STRINGLIB_CHAR *end = ptr + len;
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
410 int field_name_is_empty;
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
411 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
412
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
413 /* 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
414 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
415 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
416 case '[':
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
417 case '.':
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
418 /* 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
419 "rest" iterator */
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
420 p--;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
421 break;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
422 default:
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
423 continue;
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 break;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
426 }
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
427
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
428 /* 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
429 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
430 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
431
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
432 /* 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
433 *first_idx = get_integer(first);
62185
b5af5c93135b Merged revisions 81823,81835 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 61467
diff changeset
434 if (*first_idx == -1 && PyErr_Occurred())
b5af5c93135b Merged revisions 81823,81835 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 61467
diff changeset
435 return 0;
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
436
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
437 field_name_is_empty = first->ptr >= first->end;
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 /* 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
440 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
441 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
442
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
443 /* 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
444 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
445 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
446 numbering if the field name is omitted. */
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
447
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
448 /* 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
449 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
450 in that class by itself. */
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
451 if (auto_number) {
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
452 /* 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
453 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
454 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
455 auto_number->an_state = field_name_is_empty ?
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
456 ANS_AUTO : ANS_MANUAL;
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
457
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
458 /* 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
459 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
460 index. */
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
461 if (using_numeric_index)
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
462 if (autonumber_state_error(auto_number->an_state,
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
463 field_name_is_empty))
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
464 return 0;
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
465 /* 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
466 fields. */
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
467 if (field_name_is_empty)
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
468 *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
469 }
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
470
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
471 return 1;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
472 }
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
473
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
474
42817
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 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
477 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
478 the entire input string.
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
479 */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
480 static PyObject *
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
481 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
482 AutoNumber *auto_number)
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
483 {
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
484 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
485 int ok;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
486 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
487 SubString name;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
488 SubString first;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
489 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
490 FieldNameIterator rest;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
491
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
492 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
493 &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
494 goto error;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
495 }
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
496
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
497 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
498 /* 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
499 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
500 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
501 goto error;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
502 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
503 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
504 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
505 goto error;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
506 }
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
507 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
508 Py_INCREF(obj);
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
509 }
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
510 else {
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
511 /* 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
512 obj = PySequence_GetItem(args, index);
43241
e946073dee38 Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents: 43206
diff changeset
513 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
514 goto error;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
515 }
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
516
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
517 /* 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
518 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
519 &name)) == 2) {
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
520 PyObject *tmp;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
521
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
522 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
523 /* getattr lookup "." */
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
524 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
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 /* getitem lookup "[]" */
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
527 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
528 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
529 else
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
530 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
531 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
532 else
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
533 /* 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
534 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
535 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
536 goto error;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
537
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
538 /* 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
539 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
540 obj = tmp;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
541 }
42875
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
542 /* 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
543 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
544 return obj;
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
545 error:
5fd65e250843 PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents: 42834
diff changeset
546 Py_XDECREF(obj);
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
547 return NULL;
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 /***************** Field rendering functions **************************/
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
552 /************************************************************************/
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
553
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() 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
556 field object and field specification string generated by
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
557 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
558
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
559 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
560 appends to the output.
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
561 */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
562 static int
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
563 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
564 {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
565 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
566 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
567 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
568 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
569 STRINGLIB_CHAR* format_spec_start = format_spec->ptr ?
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
570 format_spec->ptr : NULL;
47401
c04aa4aabe17 Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents: 47301
diff changeset
571 Py_ssize_t format_spec_len = format_spec->ptr ?
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
572 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
573
47401
c04aa4aabe17 Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents: 47301
diff changeset
574 /* 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
575 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
576 if (PyUnicode_CheckExact(fieldobj))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
577 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
578 else if (PyLong_CheckExact(fieldobj))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
579 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
580 else if (PyFloat_CheckExact(fieldobj))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
581 formatter = _PyFloat_FormatAdvanced;
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
582
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 /* 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
584 (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
585
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 if (formatter) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
587 /* we know exactly which formatter will be called when __format__ is
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
588 looked up, so call it directly, instead. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
589 result = formatter(fieldobj, format_spec_start, format_spec_len);
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
590 }
47401
c04aa4aabe17 Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents: 47301
diff changeset
591 else {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
592 /* We need to create an object out of the pointers we have, because
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
593 __format__ takes a string/unicode object for format_spec. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
594 format_spec_object = STRINGLIB_NEW(format_spec_start,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
595 format_spec_len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
596 if (format_spec_object == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
597 goto done;
47401
c04aa4aabe17 Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents: 47301
diff changeset
598
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
599 result = PyObject_Format(fieldobj, format_spec_object);
47401
c04aa4aabe17 Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents: 47301
diff changeset
600 }
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
601 if (result == NULL)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
602 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
603
45392
8ece5ca4a785 Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents: 45382
diff changeset
604 #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
605 assert(PyUnicode_Check(result));
45392
8ece5ca4a785 Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents: 45382
diff changeset
606 #else
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 46335
diff changeset
607 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
608
8ece5ca4a785 Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents: 45382
diff changeset
609 /* 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
610 be unicode */
8ece5ca4a785 Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents: 45382
diff changeset
611 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
612 PyObject *tmp = STRINGLIB_TOSTR(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
613 if (tmp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
614 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
615 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
616 result = tmp;
45392
8ece5ca4a785 Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents: 45382
diff changeset
617 }
8ece5ca4a785 Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents: 45382
diff changeset
618 #endif
8ece5ca4a785 Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents: 45382
diff changeset
619
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
620 ok = output_data(output,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
621 STRINGLIB_STR(result), STRINGLIB_LEN(result));
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
622 done:
47401
c04aa4aabe17 Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents: 47301
diff changeset
623 Py_XDECREF(format_spec_object);
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
624 Py_XDECREF(result);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
625 return ok;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
626 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
627
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
628 static int
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
629 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
630 STRINGLIB_CHAR *conversion)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
631 {
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
632 /* 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
633 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
634 field_name_split. */
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
635
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
636 STRINGLIB_CHAR c = 0;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
637
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
638 /* initialize these, as they may be empty */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
639 *conversion = '\0';
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
640 SubString_init(format_spec, NULL, 0);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
641
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
642 /* 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
643 the string, or a ':' or '!' */
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
644 field_name->ptr = str->ptr;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
645 while (str->ptr < str->end) {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
646 switch (c = *(str->ptr++)) {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
647 case ':':
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
648 case '!':
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 default:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
651 continue;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
652 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
653 break;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
654 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
655
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
656 if (c == '!' || c == ':') {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
657 /* 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
658 /* don't include the last character */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
659 field_name->end = str->ptr-1;
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 /* 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
662 format_spec->ptr = str->ptr;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
663 format_spec->end = str->end;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
664
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
665 /* see if there's a conversion specifier */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
666 if (c == '!') {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
667 /* there must be another character present */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
668 if (format_spec->ptr >= format_spec->end) {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
669 PyErr_SetString(PyExc_ValueError,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
670 "end of format while looking for conversion "
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
671 "specifier");
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
672 return 0;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
673 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
674 *conversion = *(format_spec->ptr++);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
675
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
676 /* 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
677 if (format_spec->ptr < format_spec->end) {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
678 c = *(format_spec->ptr++);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
679 if (c != ':') {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
680 PyErr_SetString(PyExc_ValueError,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
681 "expected ':' after format specifier");
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
682 return 0;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
683 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
684 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
685 }
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
686 }
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
687 else
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
688 /* 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
689 field_name->end = str->ptr;
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
690
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
691 return 1;
42817
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 /************************************************************************/
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
695 /******* Output string allocation and escape-to-markup processing ******/
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
696 /************************************************************************/
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
697
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
698 /* 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
699 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
700 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
701 use with the Formatter class */
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 typedef struct {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
704 SubString str;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
705 } MarkupIterator;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
706
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
707 static int
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
708 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
709 {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
710 SubString_init(&self->str, ptr, len);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
711 return 1;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
712 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
713
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
714 /* 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
715 string (or something to be expanded) */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
716 static int
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
717 MarkupIterator_next(MarkupIterator *self, SubString *literal,
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
718 int *field_present, SubString *field_name,
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
719 SubString *format_spec, STRINGLIB_CHAR *conversion,
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
720 int *format_spec_needs_expanding)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
721 {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
722 int at_end;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
723 STRINGLIB_CHAR c = 0;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
724 STRINGLIB_CHAR *start;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
725 int count;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
726 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
727 int markup_follows = 0;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
728
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
729 /* 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
730 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
731 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
732 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
733 *conversion = '\0';
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
734 *format_spec_needs_expanding = 0;
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
735 *field_present = 0;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
736
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
737 /* 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
738 path. */
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
739 if (self->str.ptr >= self->str.end)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
740 return 1;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
741
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
742 start = self->str.ptr;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
743
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
744 /* 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
745 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
746 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
747 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
748 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
749 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
750 the second consecutive brace. */
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
751 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
752 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
753 case '{':
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
754 case '}':
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
755 markup_follows = 1;
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 default:
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
758 continue;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
759 }
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
760 break;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
761 }
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
762
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
763 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
764 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
765
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
766 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
767 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
768 "in format string");
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
769 return 0;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
770 }
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
771 if (at_end && c == '{') {
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
772 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
773 "in format string");
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
774 return 0;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
775 }
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
776 if (!at_end) {
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
777 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
778 /* 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
779 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
780 self->str.ptr++;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
781 markup_follows = 0;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
782 }
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
783 else
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
784 len--;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
785 }
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
786
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
787 /* record the literal text */
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
788 literal->ptr = start;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
789 literal->end = start + len;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
790
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
791 if (!markup_follows)
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
792 return 2;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
793
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
794 /* 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
795 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
796 format_specs cannot have braces in them. */
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
797 *field_present = 1;
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
798 count = 1;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
799
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
800 start = self->str.ptr;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
801
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
802 /* 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
803 about that case */
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
804 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
805 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
806 case '{':
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
807 /* 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
808 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
809 *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
810 count++;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
811 break;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
812 case '}':
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
813 count--;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
814 if (count <= 0) {
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
815 /* 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
816 SubString s;
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 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
819 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
820 return 0;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
821
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
822 /* success */
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
823 return 2;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
824 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
825 break;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
826 }
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
827 }
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
828
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
829 /* 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
830 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
831 return 0;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
832 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
833
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 /* do the !r or !s conversion on obj */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
836 static PyObject *
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
837 do_conversion(PyObject *obj, STRINGLIB_CHAR conversion)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
838 {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
839 /* 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
840 might have returned a string? */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
841 switch (conversion) {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
842 case 'r':
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
843 return PyObject_Repr(obj);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
844 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
845 return STRINGLIB_TOSTR(obj);
47611
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47447
diff changeset
846 #if PY_VERSION_HEX >= 0x03000000
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47447
diff changeset
847 case 'a':
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47447
diff changeset
848 return STRINGLIB_TOASCII(obj);
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47447
diff changeset
849 #endif
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
850 default:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
851 if (conversion > 32 && conversion < 127) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
852 /* It's the ASCII subrange; casting to char is safe
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
853 (assuming the execution character set is an ASCII
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
854 superset). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
855 PyErr_Format(PyExc_ValueError,
46335
3d9ad27d930b Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45509
diff changeset
856 "Unknown conversion specifier %c",
3d9ad27d930b Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45509
diff changeset
857 (char)conversion);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
858 } else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
859 PyErr_Format(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
860 "Unknown conversion specifier \\x%x",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
861 (unsigned int)conversion);
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
862 return NULL;
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 }
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 /* given:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
867
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
868 {field_name!conversion:format_spec}
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
869
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
870 compute the result and write it to output.
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
871 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
872 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
873 format_spec string.
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
874
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
875 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
876 are doing auto field numbering.
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
877 */
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
878
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
879 static int
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
880 output_markup(SubString *field_name, SubString *format_spec,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
881 int format_spec_needs_expanding, STRINGLIB_CHAR conversion,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
882 OutputString *output, PyObject *args, PyObject *kwargs,
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
883 int recursion_depth, AutoNumber *auto_number)
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
884 {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
885 PyObject *tmp = NULL;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
886 PyObject *fieldobj = NULL;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
887 SubString expanded_format_spec;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
888 SubString *actual_format_spec;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
889 int result = 0;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
890
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
891 /* convert field_name to an object */
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
892 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
893 if (fieldobj == NULL)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
894 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
895
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
896 if (conversion != '\0') {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
897 tmp = do_conversion(fieldobj, conversion);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
898 if (tmp == NULL)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
899 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
900
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
901 /* do the assignment, transferring ownership: fieldobj = tmp */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
902 Py_DECREF(fieldobj);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
903 fieldobj = tmp;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
904 tmp = NULL;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
905 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
906
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
907 /* if needed, recurively compute the format_spec */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
908 if (format_spec_needs_expanding) {
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
909 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
910 auto_number);
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
911 if (tmp == NULL)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
912 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
913
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
914 /* 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
915 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
916 render_field. */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
917 SubString_init(&expanded_format_spec,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
918 STRINGLIB_STR(tmp), STRINGLIB_LEN(tmp));
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
919 actual_format_spec = &expanded_format_spec;
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
920 }
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
921 else
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
922 actual_format_spec = format_spec;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
923
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
924 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
925 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
926
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
927 result = 1;
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 done:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
930 Py_XDECREF(fieldobj);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
931 Py_XDECREF(tmp);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
932
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
933 return result;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
934 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
935
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
936 /*
45382
7af955843929 Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents: 44351
diff changeset
937 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
938 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
939 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
940 and to perform the markup to the output.
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 static int
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
943 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
944 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
945 {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
946 MarkupIterator iter;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
947 int format_spec_needs_expanding;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
948 int result;
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
949 int field_present;
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
950 SubString literal;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
951 SubString field_name;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
952 SubString format_spec;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
953 STRINGLIB_CHAR conversion;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
954
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
955 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
956 while ((result = MarkupIterator_next(&iter, &literal, &field_present,
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
957 &field_name, &format_spec,
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
958 &conversion,
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
959 &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
960 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
961 return 0;
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
962 if (field_present)
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
963 if (!output_markup(&field_name, &format_spec,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
964 format_spec_needs_expanding, conversion, output,
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
965 args, kwargs, recursion_depth, auto_number))
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
966 return 0;
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 return result;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
969 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
970
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 /*
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
973 build_string allocates the output string and then
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
974 calls do_markup to do the heavy lifting.
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 static PyObject *
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
977 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
978 int recursion_depth, AutoNumber *auto_number)
42817
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 OutputString output;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
981 PyObject *result = NULL;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
982 Py_ssize_t count;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
983
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
984 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
985
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
986 /* 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
987 if (recursion_depth <= 0) {
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
988 PyErr_SetString(PyExc_ValueError,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
989 "Max string recursion exceeded");
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
990 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
991 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
992
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
993 /* 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
994 increment. seems like a reasonable default */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
995 if (!output_initialize(&output,
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
996 input->end - input->ptr +
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
997 INITIAL_SIZE_INCREMENT))
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
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1000 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
1001 auto_number)) {
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1002 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1003 }
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 count = output.ptr - STRINGLIB_STR(output.obj);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1006 if (STRINGLIB_RESIZE(&output.obj, count) < 0) {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1007 goto done;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1008 }
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 /* transfer ownership to result */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1011 result = output.obj;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1012 output.obj = NULL;
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 done:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1015 Py_XDECREF(output.obj);
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1016 return result;
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 /************************************************************************/
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1020 /*********** main routine ***********************************************/
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1021 /************************************************************************/
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 /* this is the main entry point */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1024 static PyObject *
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1025 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
1026 {
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1027 SubString input;
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1028
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1029 /* PEP 3101 says only 2 levels, so that
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1030 "{0:{1}}".format('abc', 's') # works
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1031 "{0:{1:{2}}}".format('abc', 's', '') # fails
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1032 */
43244
79080c4889bc Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents: 43241
diff changeset
1033 int recursion_depth = 2;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1034
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1035 AutoNumber auto_number;
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1036
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1037 AutoNumber_Init(&auto_number);
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff changeset
1038 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
1039 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
1040 }
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
1041
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /************************************************************************/
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /*********** 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
1046 /************************************************************************/
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1049 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
1050 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
1051 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
1052
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1054 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
1055
45382
7af955843929 Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents: 44351
diff changeset
1056 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
1057
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1059 } 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
1060
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1062 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
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 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
1065 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
1066 }
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents: 42922
diff changeset
1067
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents: 42922
diff changeset
1068 /* returns a tuple:
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1069 (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
1070
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1071 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
1072 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
1073 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
1074 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
1075 */
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1077 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
1078 {
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1080 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
1081 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
1082 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
1083 int format_spec_needs_expanding;
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1084 int field_present;
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1085 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
1086 &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
1087 &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
1088
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1090 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
1091 assert(0 <= result && result <= 2);
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
1092 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
1093 /* 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
1094 return NULL;
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
1095 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
1096 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
1097 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
1098 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
1099 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
1100 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
1101
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1102 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
1103 if (literal_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 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
1107 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
1108 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
1109
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1110 /* 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
1111 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
1112 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
1113 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
1114 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
1115 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
1116 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
1117
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1118 /* 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
1119 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
1120 character */
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1121 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
1122 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
1123 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
1124 }
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1125 else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1126 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
1127 if (conversion_str == NULL)
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1128 goto done;
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1129
42948
4ecbae07481f Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents: 42929
diff changeset
1130 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
1131 conversion_str);
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1132 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
1133 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
1134 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
1135 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
1136 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
1137 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
1138 }
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents: 42922
diff changeset
1141 static PyMethodDef formatteriter_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1142 {NULL, NULL} /* sentinel */
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
1143 };
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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
45382
7af955843929 Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents: 44351
diff changeset
1145 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
1146 PyVarObject_HEAD_INIT(&PyType_Type, 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1147 "formatteriterator", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1148 sizeof(formatteriterobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1149 0, /* tp_itemsize */
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
1150 /* methods */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1151 (destructor)formatteriter_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1152 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1153 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1154 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1155 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1156 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1157 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1158 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1159 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1160 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1161 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1162 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1163 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1164 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1165 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1166 Py_TPFLAGS_DEFAULT, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1167 0, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1168 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1169 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1170 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1171 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1172 PyObject_SelfIter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1173 (iternextfunc)formatteriter_next, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1174 formatteriter_methods, /* tp_methods */
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
1175 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
1176 };
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1179 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
1180 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
1181 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
1182 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
1183 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
1184 {
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
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 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
1188 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
1189 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
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 /* 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
1192 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
1193 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
1194
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1196 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
1197 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
1198 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
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 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
1201 }
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /*********** 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
1206 /************************************************************************/
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1210 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
1211 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
1212
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1214 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
1215
45382
7af955843929 Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents: 44351
diff changeset
1216 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
1217
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1219 } 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
1220
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1222 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
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 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
1225 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
1226 }
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1229 (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
1230 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
1231 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
1232 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
1233 */
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1235 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
1236 {
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1238 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
1239 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
1240 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
1241
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1243 &idx, &name);
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
1244 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
1245 /* 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
1246 return NULL;
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
1247 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
1248 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
1249 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
1250 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
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 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
1253 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
1254 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
1255
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1257 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
1258 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
1259 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
1260 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
1261 if (obj == NULL)
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1262 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
1263
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1265 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
1266
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1267 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
1268 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
1269 Py_XDECREF(obj);
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1270 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
1271 }
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 PyMethodDef fieldnameiter_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1275 {NULL, NULL} /* sentinel */
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
1276 };
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1279 PyVarObject_HEAD_INIT(&PyType_Type, 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1280 "fieldnameiterator", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1281 sizeof(fieldnameiterobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1282 0, /* tp_itemsize */
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
1283 /* methods */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1284 (destructor)fieldnameiter_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1285 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1286 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1287 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1288 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1289 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1290 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1291 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1292 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1293 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1294 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1295 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1296 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1297 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1298 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1299 Py_TPFLAGS_DEFAULT, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1300 0, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1301 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1302 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1303 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1304 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1305 PyObject_SelfIter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1306 (iternextfunc)fieldnameiter_next, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54269
diff changeset
1307 fieldnameiter_methods, /* tp_methods */
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
1308 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
1309
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1311 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
1312 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
1313 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
1314 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
1315 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
1316 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
1317 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
1318 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
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 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
1321 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
1322 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
1323
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 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
1325 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
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 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
1328 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
1329 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
1330
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1332 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
1333 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
1334 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
1335
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1336 /* 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
1337 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
1338 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
1339 STRINGLIB_LEN(self),
52159
1c0a0f7b4f76 Merged revisions 70364 via svnmerge from
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
1340 &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
1341 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
1342
42929
11ec4097fafe Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents: 42926
diff changeset
1343 /* 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
1344 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
1345 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
1346 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
1347 /* 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
1348 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
1349 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
1350 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
1351
fd1fcba5e16b Moved fieldnameiterator and formatteriterator to 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 /* 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
1353 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
1354
42969
0e510aff5e9a Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents: 42948
diff changeset
1355 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
1356 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
1357 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
1358 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
1359 }