Mercurial > cpython-lru_cache-weakref
annotate Objects/stringlib/string_format.h @ 51271:87fbbf22adf3 3.0
Merged revisions 69214 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r69214 | mark.dickinson | 2009-02-02 20:36:42 +0000 (Mon, 02 Feb 2009) | 4 lines
Issue #1717: rename tp_compare to tp_reserved. I'll change the
type of tp_compare in a separate commit, for ease of reversion
should things go wrong.
........
| author | Mark Dickinson <dickinsm@gmail.com> |
|---|---|
| date | Mon, 02 Feb 2009 20:41:29 +0000 |
| parents | da47e7e135ae |
| children | e96573e7c518 1c0a0f7b4f76 |
| 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 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
34 /* forward declaration for recursion */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
35 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
36 build_string(SubString *input, PyObject *args, PyObject *kwargs, |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
37 int recursion_depth); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
38 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
39 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
40 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
41 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
42 /************************** Utility functions ************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
43 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
44 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
45 /* 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
|
46 Py_LOCAL_INLINE(void) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
47 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
|
48 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
49 str->ptr = p; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
50 if (p == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
51 str->end = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
52 else |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
53 str->end = str->ptr + len; |
|
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 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
56 /* 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
|
57 Py_LOCAL_INLINE(PyObject *) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
58 SubString_new_object(SubString *str) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
59 { |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
60 if (str->ptr == NULL) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
61 Py_INCREF(Py_None); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
62 return Py_None; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
63 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
64 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
|
65 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
66 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
67 /* 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
|
68 Py_LOCAL_INLINE(PyObject *) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
69 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
|
70 { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
71 if (str->ptr == NULL) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
72 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
|
73 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
74 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
|
75 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
76 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
77 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
78 /*********** Output string management functions ****************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
79 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
80 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
81 typedef struct { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
82 STRINGLIB_CHAR *ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
83 STRINGLIB_CHAR *end; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
84 PyObject *obj; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
85 Py_ssize_t size_increment; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
86 } OutputString; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
87 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
88 /* initialize an OutputString object, reserving size characters */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
89 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
90 output_initialize(OutputString *output, Py_ssize_t size) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
91 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
92 output->obj = STRINGLIB_NEW(NULL, size); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
93 if (output->obj == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
94 return 0; |
|
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 output->ptr = STRINGLIB_STR(output->obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
97 output->end = STRINGLIB_LEN(output->obj) + output->ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
98 output->size_increment = INITIAL_SIZE_INCREMENT; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
99 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
100 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
101 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
102 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
103 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
104 output_extend reallocates the output string buffer. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
105 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
|
106 1 for success. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
107 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
108 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
109 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
110 output_extend(OutputString *output, Py_ssize_t count) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
111 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
112 STRINGLIB_CHAR *startptr = STRINGLIB_STR(output->obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
113 Py_ssize_t curlen = output->ptr - startptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
114 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
|
115 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
116 if (STRINGLIB_RESIZE(&output->obj, maxlen) < 0) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
117 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
118 startptr = STRINGLIB_STR(output->obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
119 output->ptr = startptr + curlen; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
120 output->end = startptr + maxlen; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
121 if (output->size_increment < MAX_SIZE_INCREMENT) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
122 output->size_increment *= SIZE_MULTIPLIER; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
123 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
124 } |
|
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 output_data dumps characters into our output string |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
128 buffer. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
129 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
130 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
|
131 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
132 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
|
133 1 for success. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
134 */ |
|
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_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
|
137 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
138 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
|
139 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
140 memcpy(output->ptr, s, count * sizeof(STRINGLIB_CHAR)); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
141 output->ptr += count; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
142 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
143 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
144 |
|
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 /*********** Format string parsing -- integers and identifiers *********/ |
|
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 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
149 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
|
150 get_integer(const SubString *str) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
151 { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
152 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
|
153 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
|
154 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
|
155 STRINGLIB_CHAR *p; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
156 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
157 /* 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
|
158 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
|
159 return -1; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
160 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
161 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
|
162 digitval = STRINGLIB_TODECIMAL(*p); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
163 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
|
164 return -1; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
165 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 expect too many digits. |
|
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 oldaccumulator = accumulator; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
172 accumulator *= 10; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
173 if ((accumulator+10)/10 != oldaccumulator+1) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
174 PyErr_Format(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
175 "Too many decimal digits in format string"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
176 return -1; |
|
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 accumulator += digitval; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
179 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
180 return accumulator; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
181 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
182 |
|
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 /******** Functions to get field objects and specification strings ******/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
185 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
186 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
187 /* 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
|
188 static PyObject * |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
189 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
|
190 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
191 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
|
192 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
|
193 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
|
194 return NULL; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
195 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
|
196 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
|
197 return newobj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
198 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
199 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
200 /* 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
|
201 static PyObject * |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
202 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
|
203 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
204 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
|
205 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
206 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
207 /* 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
|
208 static PyObject * |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
209 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
|
210 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
211 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
|
212 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
|
213 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
|
214 return NULL; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
215 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
|
216 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
|
217 return newobj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
218 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
219 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
220 /* do the equivalent of obj[name] */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
221 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
|
222 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
|
223 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
224 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
|
225 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
|
226 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
|
227 return NULL; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
228 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
|
229 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
|
230 return newobj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
231 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
232 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
233 typedef struct { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
234 /* 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
|
235 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
|
236 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
|
237 SubString str; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
238 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
239 /* 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
|
240 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
|
241 } FieldNameIterator; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
242 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
243 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
244 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
245 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
|
246 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
|
247 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
248 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
|
249 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
|
250 return 1; |
|
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 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
254 _FieldNameIterator_attr(FieldNameIterator *self, SubString *name) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
255 { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
256 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
|
257 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
258 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
|
259 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
260 /* 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
|
261 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
|
262 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
|
263 case '[': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
264 case '.': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
265 /* 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
|
266 self->ptr--; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
267 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
268 default: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
269 continue; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
270 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
271 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
272 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
273 /* 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
|
274 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
|
275 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
276 } |
|
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 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
279 _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
|
280 { |
|
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
|
281 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
|
282 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
|
283 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
284 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
|
285 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
286 /* 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
|
287 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
|
288 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
|
289 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
|
290 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
|
291 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
292 default: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
293 continue; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
294 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
295 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
296 } |
|
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
|
297 /* 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
|
298 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
|
299 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
|
300 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
|
301 } |
|
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
|
302 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
303 /* 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
|
304 /* 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
|
305 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
|
306 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
307 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
308 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
309 /* 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
|
310 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
311 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
|
312 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
|
313 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
314 /* 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
|
315 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
|
316 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
317 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
318 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
|
319 case '.': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
320 *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
|
321 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
|
322 return 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
323 *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
|
324 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
325 case '[': |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
326 *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
|
327 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
|
328 return 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
329 *name_idx = get_integer(name); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
330 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
331 default: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
332 /* interal error, can't get here */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
333 assert(0); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
334 return 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
335 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
336 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
337 /* 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
|
338 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
|
339 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
|
340 return 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
341 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
342 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
343 return 2; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
344 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
345 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
346 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
347 /* 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
|
348 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
|
349 '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
|
350 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
|
351 '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
|
352 */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
353 static int |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
354 field_name_split(STRINGLIB_CHAR *ptr, Py_ssize_t len, SubString *first, |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
355 Py_ssize_t *first_idx, FieldNameIterator *rest) |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
356 { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
357 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
|
358 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
|
359 STRINGLIB_CHAR *end = ptr + len; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
360 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
361 /* 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
|
362 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
|
363 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
|
364 case '[': |
|
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 /* 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
|
367 "rest" iterator */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
368 p--; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
369 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
370 default: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
371 continue; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
372 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
373 break; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
374 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
375 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
376 /* 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
|
377 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
|
378 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
|
379 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
380 /* 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
|
381 *first_idx = get_integer(first); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
382 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
383 /* zero length 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
|
384 if (first->ptr >= first->end) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
385 PyErr_SetString(PyExc_ValueError, "empty field name"); |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
386 goto error; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
387 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
388 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
389 return 1; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
390 error: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
391 return 0; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
392 } |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
393 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
394 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
395 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
396 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
|
397 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
|
398 the entire input string. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
399 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
400 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
401 get_field_object(SubString *input, PyObject *args, PyObject *kwargs) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
402 { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
403 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
|
404 int ok; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
405 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
|
406 SubString name; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
407 SubString first; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
408 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
|
409 FieldNameIterator rest; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
410 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
411 if (!field_name_split(input->ptr, input->end - input->ptr, &first, |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
412 &index, &rest)) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
413 goto error; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
414 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
415 |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
416 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
|
417 /* 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
|
418 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
|
419 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
|
420 goto error; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
421 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
|
422 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
|
423 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
|
424 goto error; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
425 } |
|
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
|
426 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
|
427 Py_INCREF(obj); |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
428 } |
|
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
429 else { |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
430 /* 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
|
431 obj = PySequence_GetItem(args, index); |
|
43241
e946073dee38
Changed some ValueError's to KeyError and IndexError.
Eric Smith <eric@trueblade.com>
parents:
43206
diff
changeset
|
432 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
|
433 goto error; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
434 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
435 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
436 /* 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
|
437 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
|
438 &name)) == 2) { |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
439 PyObject *tmp; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
440 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
441 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
|
442 /* getattr lookup "." */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
443 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
|
444 else |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
445 /* getitem lookup "[]" */ |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
446 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
|
447 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
|
448 else |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
449 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
|
450 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
|
451 else |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
452 /* 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
|
453 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
|
454 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
|
455 goto error; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
456 |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
457 /* 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
|
458 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
|
459 obj = tmp; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
460 } |
|
42875
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
461 /* 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
|
462 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
|
463 return obj; |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
464 error: |
|
5fd65e250843
PEP 3101: Completed string.Formatter class. Reimplemented field_name to object transformation.
Eric Smith <eric@trueblade.com>
parents:
42834
diff
changeset
|
465 Py_XDECREF(obj); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
466 return NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
467 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
468 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
469 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
470 /***************** Field rendering functions **************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
471 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
472 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
473 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
474 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
|
475 field object and field specification string generated by |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
476 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
|
477 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
478 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
|
479 appends to the output. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
480 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
481 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
482 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
|
483 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
484 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
|
485 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
|
486 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
|
487 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
|
488 STRINGLIB_CHAR* format_spec_start = format_spec->ptr ? |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
489 format_spec->ptr : NULL; |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
490 Py_ssize_t format_spec_len = format_spec->ptr ? |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
491 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
|
492 |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
493 /* 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
|
494 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
|
495 if (PyUnicode_CheckExact(fieldobj)) |
|
47447
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
496 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
|
497 else if (PyLong_CheckExact(fieldobj)) |
|
47447
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
498 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
|
499 else if (PyFloat_CheckExact(fieldobj)) |
|
47447
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
500 formatter = _PyFloat_FormatAdvanced; |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
501 |
|
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
|
502 /* 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
|
503 (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
|
504 |
|
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
|
505 if (formatter) { |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
506 /* we know exactly which formatter will be called when __format__ is |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
507 looked up, so call it directly, instead. */ |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
508 result = formatter(fieldobj, format_spec_start, format_spec_len); |
|
f9ebacace35d
Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
Eric Smith <eric@trueblade.com>
parents:
47401
diff
changeset
|
509 } |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
510 else { |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
511 /* We need to create an object out of the pointers we have, because |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
512 __format__ takes a string/unicode object for format_spec. */ |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
513 format_spec_object = STRINGLIB_NEW(format_spec_start, |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
514 format_spec_len); |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
515 if (format_spec_object == NULL) |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
516 goto done; |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
517 |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
518 result = PyObject_Format(fieldobj, format_spec_object); |
|
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
519 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
520 if (result == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
521 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
522 |
|
45392
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
523 #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
|
524 assert(PyUnicode_Check(result)); |
|
45392
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
525 #else |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46335
diff
changeset
|
526 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
|
527 |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
528 /* 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
|
529 be unicode */ |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
530 { |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
531 PyObject *tmp = STRINGLIB_TOSTR(result); |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
532 if (tmp == NULL) |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
533 goto done; |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
534 Py_DECREF(result); |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
535 result = tmp; |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
536 } |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
537 #endif |
|
8ece5ca4a785
Port 60893 to py3k, without unicode test.
Eric Smith <eric@trueblade.com>
parents:
45382
diff
changeset
|
538 |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
539 ok = output_data(output, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
540 STRINGLIB_STR(result), STRINGLIB_LEN(result)); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
541 done: |
|
47401
c04aa4aabe17
Optimization of str.format() for cases with unicode, long, and float
Eric Smith <eric@trueblade.com>
parents:
47301
diff
changeset
|
542 Py_XDECREF(format_spec_object); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
543 Py_XDECREF(result); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
544 return ok; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
545 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
546 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
547 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
548 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
|
549 STRINGLIB_CHAR *conversion) |
|
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 STRINGLIB_CHAR c = 0; |
|
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 /* initialize these, as they may be empty */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
554 *conversion = '\0'; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
555 SubString_init(format_spec, NULL, 0); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
556 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
557 /* search for the field name. it's terminated by the end of the |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
558 string, or a ':' or '!' */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
559 field_name->ptr = str->ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
560 while (str->ptr < str->end) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
561 switch (c = *(str->ptr++)) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
562 case ':': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
563 case '!': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
564 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
565 default: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
566 continue; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
567 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
568 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
569 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
570 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
571 if (c == '!' || c == ':') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
572 /* 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
|
573 /* don't include the last character */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
574 field_name->end = str->ptr-1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
575 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
576 /* 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
|
577 format_spec->ptr = str->ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
578 format_spec->end = str->end; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
579 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
580 /* see if there's a conversion specifier */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
581 if (c == '!') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
582 /* there must be another character present */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
583 if (format_spec->ptr >= format_spec->end) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
584 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
585 "end of format while looking for conversion " |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
586 "specifier"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
587 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
588 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
589 *conversion = *(format_spec->ptr++); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
590 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
591 /* 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
|
592 if (format_spec->ptr < format_spec->end) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
593 c = *(format_spec->ptr++); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
594 if (c != ':') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
595 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
596 "expected ':' after format specifier"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
597 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
598 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
599 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
600 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
601 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
602 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
603 |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
604 } |
|
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
605 else { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
606 /* 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
|
607 field_name->end = str->ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
608 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
609 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
610 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
611 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
612 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
613 /******* Output string allocation and escape-to-markup processing ******/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
614 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
615 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
616 /* 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
|
617 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
|
618 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
|
619 use with the Formatter class */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
620 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
621 typedef struct { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
622 SubString str; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
623 } MarkupIterator; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
624 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
625 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
626 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
|
627 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
628 SubString_init(&self->str, ptr, len); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
629 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
630 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
631 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
632 /* 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
|
633 string (or something to be expanded) */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
634 static int |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
635 MarkupIterator_next(MarkupIterator *self, SubString *literal, |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
636 SubString *field_name, SubString *format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
637 STRINGLIB_CHAR *conversion, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
638 int *format_spec_needs_expanding) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
639 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
640 int at_end; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
641 STRINGLIB_CHAR c = 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
642 STRINGLIB_CHAR *start; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
643 int count; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
644 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
|
645 int markup_follows = 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
646 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
647 /* 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
|
648 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
|
649 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
|
650 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
|
651 *conversion = '\0'; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
652 *format_spec_needs_expanding = 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
653 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
654 /* 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
|
655 path. */ |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
656 if (self->str.ptr >= self->str.end) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
657 return 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
658 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
659 start = self->str.ptr; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
660 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
661 /* 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
|
662 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
|
663 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
|
664 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
|
665 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
|
666 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
|
667 the second consecutive brace. */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
668 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
|
669 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
|
670 case '{': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
671 case '}': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
672 markup_follows = 1; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
673 break; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
674 default: |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
675 continue; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
676 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
677 break; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
678 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
679 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
680 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
|
681 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
|
682 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
683 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
|
684 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
|
685 "in format string"); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
686 return 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
687 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
688 if (at_end && c == '{') { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
689 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
|
690 "in format string"); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
691 return 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
692 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
693 if (!at_end) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
694 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
|
695 /* 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
|
696 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
|
697 self->str.ptr++; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
698 markup_follows = 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
699 } |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
700 else |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
701 len--; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
702 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
703 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
704 /* record the literal text */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
705 literal->ptr = start; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
706 literal->end = start + len; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
707 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
708 if (!markup_follows) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
709 return 2; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
710 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
711 /* 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
|
712 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
|
713 format_specs cannot have braces in them. */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
714 count = 1; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
715 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
716 start = self->str.ptr; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
717 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
718 /* 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
|
719 about that case */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
720 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
|
721 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
|
722 case '{': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
723 /* 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
|
724 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
|
725 *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
|
726 count++; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
727 break; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
728 case '}': |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
729 count--; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
730 if (count <= 0) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
731 /* 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
|
732 SubString s; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
733 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
734 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
|
735 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
|
736 return 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
737 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
738 /* a zero length field_name is an error */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
739 if (field_name->ptr == field_name->end) { |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
740 PyErr_SetString(PyExc_ValueError, "zero length field name " |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
741 "in format"); |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
742 return 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
743 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
744 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
745 /* success */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
746 return 2; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
747 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
748 break; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
749 } |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
750 } |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
751 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
752 /* 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
|
753 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
|
754 return 0; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
755 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
756 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
757 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
758 /* do the !r or !s conversion on obj */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
759 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
760 do_conversion(PyObject *obj, STRINGLIB_CHAR conversion) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
761 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
762 /* 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
|
763 might have returned a string? */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
764 switch (conversion) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
765 case 'r': |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
766 return PyObject_Repr(obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
767 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
|
768 return STRINGLIB_TOSTR(obj); |
|
47611
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
769 #if PY_VERSION_HEX >= 0x03000000 |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
770 case 'a': |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
771 return STRINGLIB_TOASCII(obj); |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47447
diff
changeset
|
772 #endif |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
773 default: |
|
46335
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
774 if (conversion > 32 && conversion < 127) { |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
775 /* It's the ASCII subrange; casting to char is safe |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
776 (assuming the execution character set is an ASCII |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
777 superset). */ |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
778 PyErr_Format(PyExc_ValueError, |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
779 "Unknown conversion specifier %c", |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
780 (char)conversion); |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
781 } else |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
782 PyErr_Format(PyExc_ValueError, |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
783 "Unknown conversion specifier \\x%x", |
|
3d9ad27d930b
Merged revisions 62199 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45509
diff
changeset
|
784 (unsigned int)conversion); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
785 return NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
786 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
787 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
788 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
789 /* given: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
790 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
791 {field_name!conversion:format_spec} |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
792 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
793 compute the result and write it to output. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
794 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
|
795 just output the string directly, otherwise recursively expand the |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
796 format_spec string. */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
797 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
798 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
799 output_markup(SubString *field_name, SubString *format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
800 int format_spec_needs_expanding, STRINGLIB_CHAR conversion, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
801 OutputString *output, PyObject *args, PyObject *kwargs, |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
802 int recursion_depth) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
803 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
804 PyObject *tmp = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
805 PyObject *fieldobj = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
806 SubString expanded_format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
807 SubString *actual_format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
808 int result = 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
809 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
810 /* convert field_name to an object */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
811 fieldobj = get_field_object(field_name, args, kwargs); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
812 if (fieldobj == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
813 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
814 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
815 if (conversion != '\0') { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
816 tmp = do_conversion(fieldobj, conversion); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
817 if (tmp == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
818 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
819 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
820 /* do the assignment, transferring ownership: fieldobj = tmp */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
821 Py_DECREF(fieldobj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
822 fieldobj = tmp; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
823 tmp = NULL; |
|
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 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
826 /* if needed, recurively compute the format_spec */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
827 if (format_spec_needs_expanding) { |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
828 tmp = build_string(format_spec, args, kwargs, recursion_depth-1); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
829 if (tmp == NULL) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
830 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
831 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
832 /* 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
|
833 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
|
834 render_field. */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
835 SubString_init(&expanded_format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
836 STRINGLIB_STR(tmp), STRINGLIB_LEN(tmp)); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
837 actual_format_spec = &expanded_format_spec; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
838 } |
|
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
839 else |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
840 actual_format_spec = format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
841 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
842 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
|
843 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
844 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
845 result = 1; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
846 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
847 done: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
848 Py_XDECREF(fieldobj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
849 Py_XDECREF(tmp); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
850 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
851 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
852 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
853 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
854 /* |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
855 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
|
856 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
|
857 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
|
858 and to perform the markup to the output. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
859 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
860 static int |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
861 do_markup(SubString *input, PyObject *args, PyObject *kwargs, |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
862 OutputString *output, int recursion_depth) |
|
42817
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 MarkupIterator iter; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
865 int format_spec_needs_expanding; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
866 int result; |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
867 SubString literal; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
868 SubString field_name; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
869 SubString format_spec; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
870 STRINGLIB_CHAR conversion; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
871 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
872 MarkupIterator_init(&iter, input->ptr, input->end - input->ptr); |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
873 while ((result = MarkupIterator_next(&iter, &literal, &field_name, |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
874 &format_spec, &conversion, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
875 &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
|
876 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
|
877 return 0; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
878 if (field_name.ptr != field_name.end) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
879 if (!output_markup(&field_name, &format_spec, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
880 format_spec_needs_expanding, conversion, output, |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
881 args, kwargs, recursion_depth)) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
882 return 0; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
883 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
884 return result; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
885 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
886 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
887 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
888 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
889 build_string allocates the output string and then |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
890 calls do_markup to do the heavy lifting. |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
891 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
892 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
893 build_string(SubString *input, PyObject *args, PyObject *kwargs, |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
894 int recursion_depth) |
|
42817
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 OutputString output; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
897 PyObject *result = NULL; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
898 Py_ssize_t count; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
899 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
900 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
|
901 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
902 /* 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
|
903 if (recursion_depth <= 0) { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
904 PyErr_SetString(PyExc_ValueError, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
905 "Max string recursion exceeded"); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
906 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
907 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
908 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
909 /* 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
|
910 increment. seems like a reasonable default */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
911 if (!output_initialize(&output, |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
912 input->end - input->ptr + |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
913 INITIAL_SIZE_INCREMENT)) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
914 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
915 |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
916 if (!do_markup(input, args, kwargs, &output, recursion_depth)) { |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
917 goto done; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
918 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
919 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
920 count = output.ptr - STRINGLIB_STR(output.obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
921 if (STRINGLIB_RESIZE(&output.obj, count) < 0) { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
922 goto done; |
|
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 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
925 /* transfer ownership to result */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
926 result = output.obj; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
927 output.obj = NULL; |
|
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(output.obj); |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
931 return result; |
|
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 |
|
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 /*********** main routine ***********************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
936 /************************************************************************/ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
937 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
938 /* this is the main entry point */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
939 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
940 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
|
941 { |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
942 SubString input; |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
943 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
944 /* PEP 3101 says only 2 levels, so that |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
945 "{0:{1}}".format('abc', 's') # works |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
946 "{0:{1:{2}}}".format('abc', 's', '') # fails |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
947 */ |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
948 int recursion_depth = 2; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
949 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
950 SubString_init(&input, STRINGLIB_STR(self), STRINGLIB_LEN(self)); |
|
43244
79080c4889bc
Simplified recursion logic. Modified variable name to match string.Formatter.
Eric Smith <eric@trueblade.com>
parents:
43241
diff
changeset
|
951 return build_string(&input, args, kwargs, recursion_depth); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
diff
changeset
|
952 } |
|
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
|
953 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
954 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
955 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
956 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
957 /*********** 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
|
958 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
959 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
960 /* 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
|
961 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
|
962 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
|
963 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
|
964 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
965 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
|
966 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
|
967 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
968 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
|
969 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
970 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
|
971 } 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
|
972 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
973 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
|
974 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
|
975 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
976 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
|
977 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
|
978 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
979 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
980 /* returns a tuple: |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
981 (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
|
982 |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
983 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
|
984 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
|
985 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
|
986 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
|
987 */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
988 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
|
989 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
|
990 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
991 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
|
992 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
|
993 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
|
994 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
|
995 int format_spec_needs_expanding; |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
996 int result = MarkupIterator_next(&it->it_markup, &literal, &field_name, |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
997 &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
|
998 &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
|
999 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1000 /* 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
|
1001 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
|
1002 assert(0 <= result && result <= 2); |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1003 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
|
1004 /* 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
|
1005 return NULL; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1006 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
|
1007 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
|
1008 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
|
1009 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
|
1010 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
|
1011 PyObject *tuple = NULL; |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1012 int has_field = field_name.ptr != field_name.end; |
|
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
|
1013 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1014 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
|
1015 if (literal_str == NULL) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1016 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
|
1017 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1018 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
|
1019 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
|
1020 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
|
1021 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1022 /* 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
|
1023 format_spec (even if zero length), else return None */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1024 format_spec_str = (has_field ? |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1025 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
|
1026 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
|
1027 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
|
1028 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
|
1029 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1030 /* 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
|
1031 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
|
1032 character */ |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1033 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
|
1034 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
|
1035 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
|
1036 } |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1037 else |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1038 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
|
1039 if (conversion_str == NULL) |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1040 goto done; |
|
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1041 |
|
42948
4ecbae07481f
Simplified tuple returned by string._formatter_parser to only have
Eric Smith <eric@trueblade.com>
parents:
42929
diff
changeset
|
1042 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
|
1043 conversion_str); |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1044 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
|
1045 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
|
1046 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
|
1047 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
|
1048 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
|
1049 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
|
1050 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 static PyMethodDef formatteriter_methods[] = { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1054 {NULL, NULL} /* sentinel */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1055 }; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1056 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1057 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
|
1058 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1059 "formatteriterator", /* tp_name */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1060 sizeof(formatteriterobject), /* tp_basicsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1061 0, /* tp_itemsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1062 /* methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1063 (destructor)formatteriter_dealloc, /* tp_dealloc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1064 0, /* tp_print */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1065 0, /* tp_getattr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1066 0, /* tp_setattr */ |
|
51271
87fbbf22adf3
Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47611
diff
changeset
|
1067 0, /* tp_reserved */ |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1068 0, /* tp_repr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1069 0, /* tp_as_number */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1070 0, /* tp_as_sequence */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1071 0, /* tp_as_mapping */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1072 0, /* tp_hash */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1073 0, /* tp_call */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1074 0, /* tp_str */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1075 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1076 0, /* tp_setattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1077 0, /* tp_as_buffer */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1078 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1079 0, /* tp_doc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1080 0, /* tp_traverse */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1081 0, /* tp_clear */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1082 0, /* tp_richcompare */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1083 0, /* tp_weaklistoffset */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1084 PyObject_SelfIter, /* tp_iter */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1085 (iternextfunc)formatteriter_next, /* tp_iternext */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1086 formatteriter_methods, /* tp_methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1087 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
|
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 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 /* 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
|
1091 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
|
1092 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
|
1093 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
|
1094 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
|
1095 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
|
1096 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1098 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1100 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
|
1101 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
|
1102 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1103 /* 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
|
1104 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
|
1105 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
|
1106 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1107 /* 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
|
1108 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
|
1109 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
|
1110 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
|
1111 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1112 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
|
1113 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1114 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1115 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1116 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 /*********** 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
|
1118 /************************************************************************/ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1119 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1120 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1121 /* 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
|
1122 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
|
1123 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
|
1124 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1125 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
|
1126 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
|
1127 |
|
45382
7af955843929
Fixes for shared 2.6 code that implements PEP 3101, advanced string
Eric Smith <eric@trueblade.com>
parents:
44351
diff
changeset
|
1128 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
|
1129 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1130 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
|
1131 } 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
|
1132 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1134 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
|
1135 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1136 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
|
1137 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
|
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 /* 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
|
1141 (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
|
1142 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
|
1143 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
|
1144 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
|
1145 */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1147 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
|
1148 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1149 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
|
1150 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
|
1151 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
|
1152 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
|
1153 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1154 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
|
1155 &idx, &name); |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1156 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
|
1157 /* 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
|
1158 return NULL; |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1159 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
|
1160 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
|
1161 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
|
1162 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
|
1163 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1164 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
|
1165 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
|
1166 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
|
1167 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1168 /* 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
|
1169 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
|
1170 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
|
1171 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
|
1172 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
|
1173 if (obj == NULL) |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1174 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
|
1175 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 /* 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
|
1177 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
|
1178 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1179 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
|
1180 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
|
1181 Py_XDECREF(obj); |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1182 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
|
1183 } |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 static PyMethodDef fieldnameiter_methods[] = { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1187 {NULL, NULL} /* sentinel */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1188 }; |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1191 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1192 "fieldnameiterator", /* tp_name */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1193 sizeof(fieldnameiterobject), /* tp_basicsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1194 0, /* tp_itemsize */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1195 /* methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1196 (destructor)fieldnameiter_dealloc, /* tp_dealloc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1197 0, /* tp_print */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1198 0, /* tp_getattr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1199 0, /* tp_setattr */ |
|
51271
87fbbf22adf3
Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47611
diff
changeset
|
1200 0, /* tp_reserved */ |
|
42926
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1201 0, /* tp_repr */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1202 0, /* tp_as_number */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1203 0, /* tp_as_sequence */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1204 0, /* tp_as_mapping */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1205 0, /* tp_hash */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1206 0, /* tp_call */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1207 0, /* tp_str */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1208 PyObject_GenericGetAttr, /* tp_getattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1209 0, /* tp_setattro */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1210 0, /* tp_as_buffer */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1211 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1212 0, /* tp_doc */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1213 0, /* tp_traverse */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1214 0, /* tp_clear */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1215 0, /* tp_richcompare */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1216 0, /* tp_weaklistoffset */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1217 PyObject_SelfIter, /* tp_iter */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1218 (iternextfunc)fieldnameiter_next, /* tp_iternext */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1219 fieldnameiter_methods, /* tp_methods */ |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1220 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
|
1221 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 /* 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
|
1223 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
|
1224 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
|
1225 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
|
1226 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
|
1227 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
|
1228 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
|
1229 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
|
1230 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
|
1231 { |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1233 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
|
1234 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
|
1235 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1237 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
|
1238 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 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
|
1240 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
|
1241 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
|
1242 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to 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 /* 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
|
1244 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
|
1245 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
|
1246 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
|
1247 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1248 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
|
1249 STRINGLIB_LEN(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
|
1250 &first, &first_idx, &it->it_field)) |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1251 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
|
1252 |
|
42929
11ec4097fafe
Code layout changes for PEP 7 compliance.
Eric Smith <eric@trueblade.com>
parents:
42926
diff
changeset
|
1253 /* 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
|
1254 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
|
1255 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
|
1256 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
|
1257 /* 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
|
1258 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
|
1259 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
|
1260 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
|
1261 |
|
fd1fcba5e16b
Moved fieldnameiterator and formatteriterator to stringlib/string_format.h, so that they can be used when backporting to 2.6.
Eric Smith <eric@trueblade.com>
parents:
42922
diff
changeset
|
1262 /* 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
|
1263 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
|
1264 |
|
42969
0e510aff5e9a
Modified parsing of format strings, so that we always return
Eric Smith <eric@trueblade.com>
parents:
42948
diff
changeset
|
1265 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
|
1266 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
|
1267 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
|
1268 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
|
1269 } |
