annotate Objects/stringlib/string_format.h @ 58664:993f703a61ba

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