blob: 3f44e961e4268b46d938f9c91268289d0bc87b29 [file] [log] [blame]
Eric Smith8c663262007-08-25 02:26:07 +00001/*
2 string_format.h -- implementation of string.format().
3
4 It uses the Objects/stringlib conventions, so that it can be
5 compiled for both unicode and string objects.
6*/
7
8
Eric Smith8fd3eba2008-02-17 19:48:00 +00009/* Defines for Python 2.6 compatability */
10#if PY_VERSION_HEX < 0x03000000
11#define PyLong_FromSsize_t _PyLong_FromSsize_t
12#endif
13
Eric Smith8c663262007-08-25 02:26:07 +000014/* Defines for more efficiently reallocating the string buffer */
15#define INITIAL_SIZE_INCREMENT 100
16#define SIZE_MULTIPLIER 2
17#define MAX_SIZE_INCREMENT 3200
18
19
20/************************************************************************/
21/*********** Global data structures and forward declarations *********/
22/************************************************************************/
23
24/*
25 A SubString consists of the characters between two string or
26 unicode pointers.
27*/
28typedef struct {
29 STRINGLIB_CHAR *ptr;
30 STRINGLIB_CHAR *end;
31} SubString;
32
33
34/* forward declaration for recursion */
35static PyObject *
36build_string(SubString *input, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +000037 int recursion_depth);
Eric Smith8c663262007-08-25 02:26:07 +000038
39
40
41/************************************************************************/
42/************************** Utility functions ************************/
43/************************************************************************/
44
45/* fill in a SubString from a pointer and length */
46Py_LOCAL_INLINE(void)
47SubString_init(SubString *str, STRINGLIB_CHAR *p, Py_ssize_t len)
48{
49 str->ptr = p;
50 if (p == NULL)
51 str->end = NULL;
52 else
53 str->end = str->ptr + len;
54}
55
Eric Smith625cbf22007-08-29 03:22:59 +000056/* return a new string. if str->ptr is NULL, return None */
Eric Smith8c663262007-08-25 02:26:07 +000057Py_LOCAL_INLINE(PyObject *)
58SubString_new_object(SubString *str)
59{
Eric Smith625cbf22007-08-29 03:22:59 +000060 if (str->ptr == NULL) {
61 Py_INCREF(Py_None);
62 return Py_None;
63 }
64 return STRINGLIB_NEW(str->ptr, str->end - str->ptr);
65}
66
67/* return a new string. if str->ptr is NULL, return None */
68Py_LOCAL_INLINE(PyObject *)
69SubString_new_object_or_empty(SubString *str)
70{
71 if (str->ptr == NULL) {
72 return STRINGLIB_NEW(NULL, 0);
73 }
Eric Smith8c663262007-08-25 02:26:07 +000074 return STRINGLIB_NEW(str->ptr, str->end - str->ptr);
75}
76
77/************************************************************************/
Eric Smith8c663262007-08-25 02:26:07 +000078/*********** Output string management functions ****************/
79/************************************************************************/
80
81typedef struct {
82 STRINGLIB_CHAR *ptr;
83 STRINGLIB_CHAR *end;
84 PyObject *obj;
85 Py_ssize_t size_increment;
86} OutputString;
87
88/* initialize an OutputString object, reserving size characters */
89static int
90output_initialize(OutputString *output, Py_ssize_t size)
91{
92 output->obj = STRINGLIB_NEW(NULL, size);
93 if (output->obj == NULL)
94 return 0;
95
96 output->ptr = STRINGLIB_STR(output->obj);
97 output->end = STRINGLIB_LEN(output->obj) + output->ptr;
98 output->size_increment = INITIAL_SIZE_INCREMENT;
99
100 return 1;
101}
102
103/*
104 output_extend reallocates the output string buffer.
105 It returns a status: 0 for a failed reallocation,
106 1 for success.
107*/
108
109static int
110output_extend(OutputString *output, Py_ssize_t count)
111{
112 STRINGLIB_CHAR *startptr = STRINGLIB_STR(output->obj);
113 Py_ssize_t curlen = output->ptr - startptr;
114 Py_ssize_t maxlen = curlen + count + output->size_increment;
115
116 if (STRINGLIB_RESIZE(&output->obj, maxlen) < 0)
117 return 0;
118 startptr = STRINGLIB_STR(output->obj);
119 output->ptr = startptr + curlen;
120 output->end = startptr + maxlen;
121 if (output->size_increment < MAX_SIZE_INCREMENT)
122 output->size_increment *= SIZE_MULTIPLIER;
123 return 1;
124}
125
126/*
127 output_data dumps characters into our output string
128 buffer.
129
130 In some cases, it has to reallocate the string.
131
132 It returns a status: 0 for a failed reallocation,
133 1 for success.
134*/
135static int
136output_data(OutputString *output, const STRINGLIB_CHAR *s, Py_ssize_t count)
137{
138 if ((count > output->end - output->ptr) && !output_extend(output, count))
139 return 0;
140 memcpy(output->ptr, s, count * sizeof(STRINGLIB_CHAR));
141 output->ptr += count;
142 return 1;
143}
144
145/************************************************************************/
146/*********** Format string parsing -- integers and identifiers *********/
147/************************************************************************/
148
Eric Smith7ade6482007-08-26 22:27:13 +0000149static Py_ssize_t
150get_integer(const SubString *str)
Eric Smith8c663262007-08-25 02:26:07 +0000151{
Eric Smith7ade6482007-08-26 22:27:13 +0000152 Py_ssize_t accumulator = 0;
153 Py_ssize_t digitval;
154 Py_ssize_t oldaccumulator;
155 STRINGLIB_CHAR *p;
Eric Smith8c663262007-08-25 02:26:07 +0000156
Eric Smith7ade6482007-08-26 22:27:13 +0000157 /* empty string is an error */
158 if (str->ptr >= str->end)
159 return -1;
Eric Smith8c663262007-08-25 02:26:07 +0000160
Eric Smith7ade6482007-08-26 22:27:13 +0000161 for (p = str->ptr; p < str->end; p++) {
162 digitval = STRINGLIB_TODECIMAL(*p);
Eric Smith8c663262007-08-25 02:26:07 +0000163 if (digitval < 0)
Eric Smith7ade6482007-08-26 22:27:13 +0000164 return -1;
Eric Smith8c663262007-08-25 02:26:07 +0000165 /*
166 This trick was copied from old Unicode format code. It's cute,
167 but would really suck on an old machine with a slow divide
168 implementation. Fortunately, in the normal case we do not
169 expect too many digits.
170 */
171 oldaccumulator = accumulator;
172 accumulator *= 10;
173 if ((accumulator+10)/10 != oldaccumulator+1) {
174 PyErr_Format(PyExc_ValueError,
175 "Too many decimal digits in format string");
176 return -1;
177 }
178 accumulator += digitval;
179 }
Eric Smith7ade6482007-08-26 22:27:13 +0000180 return accumulator;
Eric Smith8c663262007-08-25 02:26:07 +0000181}
182
183/************************************************************************/
184/******** Functions to get field objects and specification strings ******/
185/************************************************************************/
186
Eric Smith7ade6482007-08-26 22:27:13 +0000187/* do the equivalent of obj.name */
Eric Smith8c663262007-08-25 02:26:07 +0000188static PyObject *
Eric Smith7ade6482007-08-26 22:27:13 +0000189getattr(PyObject *obj, SubString *name)
Eric Smith8c663262007-08-25 02:26:07 +0000190{
Eric Smith7ade6482007-08-26 22:27:13 +0000191 PyObject *newobj;
Eric Smith7a6dd292007-08-27 23:30:47 +0000192 PyObject *str = SubString_new_object(name);
Eric Smith7ade6482007-08-26 22:27:13 +0000193 if (str == NULL)
194 return NULL;
195 newobj = PyObject_GetAttr(obj, str);
196 Py_DECREF(str);
197 return newobj;
Eric Smith8c663262007-08-25 02:26:07 +0000198}
199
Eric Smith7ade6482007-08-26 22:27:13 +0000200/* do the equivalent of obj[idx], where obj is a sequence */
201static PyObject *
202getitem_sequence(PyObject *obj, Py_ssize_t idx)
203{
204 return PySequence_GetItem(obj, idx);
205}
206
207/* do the equivalent of obj[idx], where obj is not a sequence */
208static PyObject *
209getitem_idx(PyObject *obj, Py_ssize_t idx)
210{
211 PyObject *newobj;
Christian Heimes217cfd12007-12-02 14:31:20 +0000212 PyObject *idx_obj = PyLong_FromSsize_t(idx);
Eric Smith7ade6482007-08-26 22:27:13 +0000213 if (idx_obj == NULL)
214 return NULL;
215 newobj = PyObject_GetItem(obj, idx_obj);
216 Py_DECREF(idx_obj);
217 return newobj;
218}
219
220/* do the equivalent of obj[name] */
221static PyObject *
222getitem_str(PyObject *obj, SubString *name)
223{
224 PyObject *newobj;
Eric Smith7a6dd292007-08-27 23:30:47 +0000225 PyObject *str = SubString_new_object(name);
Eric Smith7ade6482007-08-26 22:27:13 +0000226 if (str == NULL)
227 return NULL;
228 newobj = PyObject_GetItem(obj, str);
229 Py_DECREF(str);
230 return newobj;
231}
232
233typedef struct {
234 /* the entire string we're parsing. we assume that someone else
235 is managing its lifetime, and that it will exist for the
236 lifetime of the iterator. can be empty */
237 SubString str;
238
239 /* pointer to where we are inside field_name */
240 STRINGLIB_CHAR *ptr;
241} FieldNameIterator;
242
243
244static int
245FieldNameIterator_init(FieldNameIterator *self, STRINGLIB_CHAR *ptr,
246 Py_ssize_t len)
247{
248 SubString_init(&self->str, ptr, len);
249 self->ptr = self->str.ptr;
250 return 1;
251}
252
253static int
254_FieldNameIterator_attr(FieldNameIterator *self, SubString *name)
255{
256 STRINGLIB_CHAR c;
257
258 name->ptr = self->ptr;
259
260 /* return everything until '.' or '[' */
261 while (self->ptr < self->str.end) {
262 switch (c = *self->ptr++) {
263 case '[':
264 case '.':
265 /* backup so that we this character will be seen next time */
266 self->ptr--;
267 break;
268 default:
269 continue;
270 }
271 break;
272 }
273 /* end of string is okay */
274 name->end = self->ptr;
275 return 1;
276}
277
278static int
279_FieldNameIterator_item(FieldNameIterator *self, SubString *name)
280{
Eric Smith4cb4e4e2007-09-03 08:40:29 +0000281 int bracket_seen = 0;
Eric Smith7ade6482007-08-26 22:27:13 +0000282 STRINGLIB_CHAR c;
283
284 name->ptr = self->ptr;
285
286 /* return everything until ']' */
287 while (self->ptr < self->str.end) {
288 switch (c = *self->ptr++) {
289 case ']':
Eric Smith4cb4e4e2007-09-03 08:40:29 +0000290 bracket_seen = 1;
Eric Smith7ade6482007-08-26 22:27:13 +0000291 break;
292 default:
293 continue;
294 }
295 break;
296 }
Eric Smith4cb4e4e2007-09-03 08:40:29 +0000297 /* make sure we ended with a ']' */
298 if (!bracket_seen) {
299 PyErr_SetString(PyExc_ValueError, "Missing ']' in format string");
300 return 0;
301 }
302
Eric Smith7ade6482007-08-26 22:27:13 +0000303 /* end of string is okay */
304 /* don't include the ']' */
305 name->end = self->ptr-1;
306 return 1;
307}
308
309/* returns 0 on error, 1 on non-error termination, and 2 if it returns a value */
310static int
311FieldNameIterator_next(FieldNameIterator *self, int *is_attribute,
312 Py_ssize_t *name_idx, SubString *name)
313{
314 /* check at end of input */
315 if (self->ptr >= self->str.end)
316 return 1;
317
318 switch (*self->ptr++) {
319 case '.':
320 *is_attribute = 1;
Eric Smith4cb4e4e2007-09-03 08:40:29 +0000321 if (_FieldNameIterator_attr(self, name) == 0)
Eric Smith7ade6482007-08-26 22:27:13 +0000322 return 0;
Eric Smith7ade6482007-08-26 22:27:13 +0000323 *name_idx = -1;
324 break;
325 case '[':
326 *is_attribute = 0;
Eric Smith4cb4e4e2007-09-03 08:40:29 +0000327 if (_FieldNameIterator_item(self, name) == 0)
Eric Smith7ade6482007-08-26 22:27:13 +0000328 return 0;
Eric Smith7ade6482007-08-26 22:27:13 +0000329 *name_idx = get_integer(name);
330 break;
331 default:
332 /* interal error, can't get here */
333 assert(0);
334 return 0;
335 }
336
337 /* empty string is an error */
338 if (name->ptr == name->end) {
339 PyErr_SetString(PyExc_ValueError, "Empty attribute in format string");
340 return 0;
341 }
342
343 return 2;
344}
345
346
347/* input: field_name
348 output: 'first' points to the part before the first '[' or '.'
349 'first_idx' is -1 if 'first' is not an integer, otherwise
350 it's the value of first converted to an integer
351 'rest' is an iterator to return the rest
352*/
353static int
354field_name_split(STRINGLIB_CHAR *ptr, Py_ssize_t len, SubString *first,
355 Py_ssize_t *first_idx, FieldNameIterator *rest)
356{
357 STRINGLIB_CHAR c;
358 STRINGLIB_CHAR *p = ptr;
359 STRINGLIB_CHAR *end = ptr + len;
360
361 /* find the part up until the first '.' or '[' */
362 while (p < end) {
363 switch (c = *p++) {
364 case '[':
365 case '.':
366 /* backup so that we this character is available to the
367 "rest" iterator */
368 p--;
369 break;
370 default:
371 continue;
372 }
373 break;
374 }
375
376 /* set up the return values */
377 SubString_init(first, ptr, p - ptr);
378 FieldNameIterator_init(rest, p, end - p);
379
380 /* see if "first" is an integer, in which case it's used as an index */
381 *first_idx = get_integer(first);
382
383 /* zero length string is an error */
384 if (first->ptr >= first->end) {
385 PyErr_SetString(PyExc_ValueError, "empty field name");
386 goto error;
387 }
388
389 return 1;
390error:
391 return 0;
392}
393
394
Eric Smith8c663262007-08-25 02:26:07 +0000395/*
396 get_field_object returns the object inside {}, before the
397 format_spec. It handles getindex and getattr lookups and consumes
398 the entire input string.
399*/
400static PyObject *
401get_field_object(SubString *input, PyObject *args, PyObject *kwargs)
402{
Eric Smith7ade6482007-08-26 22:27:13 +0000403 PyObject *obj = NULL;
404 int ok;
405 int is_attribute;
406 SubString name;
407 SubString first;
Eric Smith8c663262007-08-25 02:26:07 +0000408 Py_ssize_t index;
Eric Smith7ade6482007-08-26 22:27:13 +0000409 FieldNameIterator rest;
Eric Smith8c663262007-08-25 02:26:07 +0000410
Eric Smith7ade6482007-08-26 22:27:13 +0000411 if (!field_name_split(input->ptr, input->end - input->ptr, &first,
412 &index, &rest)) {
413 goto error;
414 }
Eric Smith8c663262007-08-25 02:26:07 +0000415
Eric Smith7ade6482007-08-26 22:27:13 +0000416 if (index == -1) {
417 /* look up in kwargs */
Eric Smith7a6dd292007-08-27 23:30:47 +0000418 PyObject *key = SubString_new_object(&first);
Eric Smith7ade6482007-08-26 22:27:13 +0000419 if (key == NULL)
420 goto error;
421 if ((kwargs == NULL) || (obj = PyDict_GetItem(kwargs, key)) == NULL) {
Eric Smith11529192007-09-04 23:04:22 +0000422 PyErr_SetObject(PyExc_KeyError, key);
Eric Smith7ade6482007-08-26 22:27:13 +0000423 Py_DECREF(key);
424 goto error;
Eric Smith8c663262007-08-25 02:26:07 +0000425 }
Neal Norwitz8a4eb292007-08-27 07:24:17 +0000426 Py_DECREF(key);
Neal Norwitz247b5152007-08-27 03:22:50 +0000427 Py_INCREF(obj);
Eric Smith0cb431c2007-08-28 01:07:27 +0000428 }
429 else {
Eric Smith7ade6482007-08-26 22:27:13 +0000430 /* look up in args */
431 obj = PySequence_GetItem(args, index);
Eric Smith11529192007-09-04 23:04:22 +0000432 if (obj == NULL)
Eric Smith7ade6482007-08-26 22:27:13 +0000433 goto error;
Eric Smith8c663262007-08-25 02:26:07 +0000434 }
Eric Smith7ade6482007-08-26 22:27:13 +0000435
436 /* iterate over the rest of the field_name */
437 while ((ok = FieldNameIterator_next(&rest, &is_attribute, &index,
438 &name)) == 2) {
439 PyObject *tmp;
440
441 if (is_attribute)
442 /* getattr lookup "." */
443 tmp = getattr(obj, &name);
444 else
445 /* getitem lookup "[]" */
446 if (index == -1)
447 tmp = getitem_str(obj, &name);
448 else
449 if (PySequence_Check(obj))
450 tmp = getitem_sequence(obj, index);
451 else
452 /* not a sequence */
453 tmp = getitem_idx(obj, index);
454 if (tmp == NULL)
455 goto error;
456
457 /* assign to obj */
458 Py_DECREF(obj);
459 obj = tmp;
Eric Smith8c663262007-08-25 02:26:07 +0000460 }
Eric Smith7ade6482007-08-26 22:27:13 +0000461 /* end of iterator, this is the non-error case */
462 if (ok == 1)
463 return obj;
464error:
465 Py_XDECREF(obj);
Eric Smith8c663262007-08-25 02:26:07 +0000466 return NULL;
467}
468
469/************************************************************************/
470/***************** Field rendering functions **************************/
471/************************************************************************/
472
473/*
474 render_field() is the main function in this section. It takes the
475 field object and field specification string generated by
476 get_field_and_spec, and renders the field into the output string.
477
Eric Smith8c663262007-08-25 02:26:07 +0000478 render_field calls fieldobj.__format__(format_spec) method, and
479 appends to the output.
480*/
481static int
482render_field(PyObject *fieldobj, SubString *format_spec, OutputString *output)
483{
484 int ok = 0;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000485 PyObject *result = NULL;
Eric Smith1d138f12008-05-31 01:40:08 +0000486 PyObject *format_spec_object = NULL;
Eric Smithba8c0282008-06-02 14:57:32 +0000487 PyObject *(*formatter)(PyObject *, STRINGLIB_CHAR *, Py_ssize_t) = NULL;
Eric Smith1d138f12008-05-31 01:40:08 +0000488 STRINGLIB_CHAR* format_spec_start = format_spec->ptr ?
489 format_spec->ptr : NULL;
490 Py_ssize_t format_spec_len = format_spec->ptr ?
491 format_spec->end - format_spec->ptr : 0;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000492
Eric Smith1d138f12008-05-31 01:40:08 +0000493 /* If we know the type exactly, skip the lookup of __format__ and just
494 call the formatter directly. */
495 if (PyUnicode_CheckExact(fieldobj))
Eric Smithba8c0282008-06-02 14:57:32 +0000496 formatter = _PyUnicode_FormatAdvanced;
Eric Smith1d138f12008-05-31 01:40:08 +0000497 else if (PyLong_CheckExact(fieldobj))
Eric Smithba8c0282008-06-02 14:57:32 +0000498 formatter =_PyLong_FormatAdvanced;
Eric Smith1d138f12008-05-31 01:40:08 +0000499 else if (PyFloat_CheckExact(fieldobj))
Eric Smithba8c0282008-06-02 14:57:32 +0000500 formatter = _PyFloat_FormatAdvanced;
501
502 /* XXX: for 2.6, convert format_spec to the appropriate type
503 (unicode, str) */
504
505 if (formatter) {
506 /* we know exactly which formatter will be called when __format__ is
507 looked up, so call it directly, instead. */
508 result = formatter(fieldobj, format_spec_start, format_spec_len);
509 }
Eric Smith1d138f12008-05-31 01:40:08 +0000510 else {
511 /* We need to create an object out of the pointers we have, because
512 __format__ takes a string/unicode object for format_spec. */
513 format_spec_object = STRINGLIB_NEW(format_spec_start,
514 format_spec_len);
515 if (format_spec_object == NULL)
516 goto done;
517
518 result = PyObject_Format(fieldobj, format_spec_object);
519 }
Eric Smith8c663262007-08-25 02:26:07 +0000520 if (result == NULL)
521 goto done;
522
Eric Smith8a0217c2008-02-18 18:07:47 +0000523#if PY_VERSION_HEX >= 0x03000000
Eric Smithecbac8f2008-02-24 21:44:34 +0000524 assert(PyUnicode_Check(result));
Eric Smith8a0217c2008-02-18 18:07:47 +0000525#else
Christian Heimes72b710a2008-05-26 13:28:38 +0000526 assert(PyBytes_Check(result) || PyUnicode_Check(result));
Eric Smith8a0217c2008-02-18 18:07:47 +0000527
528 /* Convert result to our type. We could be str, and result could
529 be unicode */
530 {
531 PyObject *tmp = STRINGLIB_TOSTR(result);
532 if (tmp == NULL)
533 goto done;
534 Py_DECREF(result);
535 result = tmp;
536 }
537#endif
538
Eric Smith8c663262007-08-25 02:26:07 +0000539 ok = output_data(output,
540 STRINGLIB_STR(result), STRINGLIB_LEN(result));
541done:
Eric Smith1d138f12008-05-31 01:40:08 +0000542 Py_XDECREF(format_spec_object);
Eric Smith8c663262007-08-25 02:26:07 +0000543 Py_XDECREF(result);
544 return ok;
545}
546
547static int
548parse_field(SubString *str, SubString *field_name, SubString *format_spec,
549 STRINGLIB_CHAR *conversion)
550{
551 STRINGLIB_CHAR c = 0;
552
553 /* initialize these, as they may be empty */
554 *conversion = '\0';
555 SubString_init(format_spec, NULL, 0);
556
557 /* search for the field name. it's terminated by the end of the
558 string, or a ':' or '!' */
559 field_name->ptr = str->ptr;
560 while (str->ptr < str->end) {
561 switch (c = *(str->ptr++)) {
562 case ':':
563 case '!':
564 break;
565 default:
566 continue;
567 }
568 break;
569 }
570
571 if (c == '!' || c == ':') {
572 /* we have a format specifier and/or a conversion */
573 /* don't include the last character */
574 field_name->end = str->ptr-1;
575
576 /* the format specifier is the rest of the string */
577 format_spec->ptr = str->ptr;
578 format_spec->end = str->end;
579
580 /* see if there's a conversion specifier */
581 if (c == '!') {
582 /* there must be another character present */
583 if (format_spec->ptr >= format_spec->end) {
584 PyErr_SetString(PyExc_ValueError,
585 "end of format while looking for conversion "
586 "specifier");
587 return 0;
588 }
589 *conversion = *(format_spec->ptr++);
590
591 /* if there is another character, it must be a colon */
592 if (format_spec->ptr < format_spec->end) {
593 c = *(format_spec->ptr++);
594 if (c != ':') {
595 PyErr_SetString(PyExc_ValueError,
596 "expected ':' after format specifier");
597 return 0;
598 }
599 }
600 }
601
602 return 1;
603
Eric Smith0cb431c2007-08-28 01:07:27 +0000604 }
605 else {
Eric Smith8c663262007-08-25 02:26:07 +0000606 /* end of string, there's no format_spec or conversion */
607 field_name->end = str->ptr;
608 return 1;
609 }
610}
611
612/************************************************************************/
613/******* Output string allocation and escape-to-markup processing ******/
614/************************************************************************/
615
616/* MarkupIterator breaks the string into pieces of either literal
617 text, or things inside {} that need to be marked up. it is
618 designed to make it easy to wrap a Python iterator around it, for
619 use with the Formatter class */
620
621typedef struct {
622 SubString str;
Eric Smith8c663262007-08-25 02:26:07 +0000623} MarkupIterator;
624
625static int
626MarkupIterator_init(MarkupIterator *self, STRINGLIB_CHAR *ptr, Py_ssize_t len)
627{
628 SubString_init(&self->str, ptr, len);
Eric Smith8c663262007-08-25 02:26:07 +0000629 return 1;
630}
631
632/* returns 0 on error, 1 on non-error termination, and 2 if it got a
633 string (or something to be expanded) */
634static int
Eric Smith625cbf22007-08-29 03:22:59 +0000635MarkupIterator_next(MarkupIterator *self, SubString *literal,
Eric Smith8c663262007-08-25 02:26:07 +0000636 SubString *field_name, SubString *format_spec,
637 STRINGLIB_CHAR *conversion,
638 int *format_spec_needs_expanding)
639{
640 int at_end;
641 STRINGLIB_CHAR c = 0;
642 STRINGLIB_CHAR *start;
643 int count;
644 Py_ssize_t len;
Eric Smith625cbf22007-08-29 03:22:59 +0000645 int markup_follows = 0;
Eric Smith8c663262007-08-25 02:26:07 +0000646
Eric Smith625cbf22007-08-29 03:22:59 +0000647 /* initialize all of the output variables */
648 SubString_init(literal, NULL, 0);
649 SubString_init(field_name, NULL, 0);
650 SubString_init(format_spec, NULL, 0);
651 *conversion = '\0';
Eric Smith8c663262007-08-25 02:26:07 +0000652 *format_spec_needs_expanding = 0;
653
Eric Smith625cbf22007-08-29 03:22:59 +0000654 /* No more input, end of iterator. This is the normal exit
655 path. */
Eric Smith8c663262007-08-25 02:26:07 +0000656 if (self->str.ptr >= self->str.end)
657 return 1;
658
Eric Smith8c663262007-08-25 02:26:07 +0000659 start = self->str.ptr;
660
Eric Smith625cbf22007-08-29 03:22:59 +0000661 /* First read any literal text. Read until the end of string, an
662 escaped '{' or '}', or an unescaped '{'. In order to never
663 allocate memory and so I can just pass pointers around, if
664 there's an escaped '{' or '}' then we'll return the literal
665 including the brace, but no format object. The next time
666 through, we'll return the rest of the literal, skipping past
667 the second consecutive brace. */
668 while (self->str.ptr < self->str.end) {
669 switch (c = *(self->str.ptr++)) {
670 case '{':
671 case '}':
672 markup_follows = 1;
673 break;
674 default:
675 continue;
Eric Smith8c663262007-08-25 02:26:07 +0000676 }
Eric Smith625cbf22007-08-29 03:22:59 +0000677 break;
Eric Smith0cb431c2007-08-28 01:07:27 +0000678 }
Eric Smith625cbf22007-08-29 03:22:59 +0000679
680 at_end = self->str.ptr >= self->str.end;
681 len = self->str.ptr - start;
682
683 if ((c == '}') && (at_end || (c != *self->str.ptr))) {
684 PyErr_SetString(PyExc_ValueError, "Single '}' encountered "
685 "in format string");
686 return 0;
687 }
688 if (at_end && c == '{') {
689 PyErr_SetString(PyExc_ValueError, "Single '{' encountered "
690 "in format string");
691 return 0;
692 }
693 if (!at_end) {
694 if (c == *self->str.ptr) {
695 /* escaped } or {, skip it in the input. there is no
696 markup object following us, just this literal text */
697 self->str.ptr++;
698 markup_follows = 0;
699 }
700 else
701 len--;
702 }
703
704 /* record the literal text */
705 literal->ptr = start;
706 literal->end = start + len;
707
708 if (!markup_follows)
709 return 2;
710
711 /* this is markup, find the end of the string by counting nested
712 braces. note that this prohibits escaped braces, so that
713 format_specs cannot have braces in them. */
714 count = 1;
715
716 start = self->str.ptr;
717
718 /* we know we can't have a zero length string, so don't worry
719 about that case */
720 while (self->str.ptr < self->str.end) {
721 switch (c = *(self->str.ptr++)) {
722 case '{':
723 /* the format spec needs to be recursively expanded.
724 this is an optimization, and not strictly needed */
725 *format_spec_needs_expanding = 1;
726 count++;
727 break;
728 case '}':
729 count--;
730 if (count <= 0) {
731 /* we're done. parse and get out */
732 SubString s;
733
734 SubString_init(&s, start, self->str.ptr - 1 - start);
735 if (parse_field(&s, field_name, format_spec, conversion) == 0)
736 return 0;
737
738 /* a zero length field_name is an error */
739 if (field_name->ptr == field_name->end) {
740 PyErr_SetString(PyExc_ValueError, "zero length field name "
741 "in format");
742 return 0;
743 }
744
745 /* success */
746 return 2;
Eric Smith8c663262007-08-25 02:26:07 +0000747 }
748 break;
749 }
Eric Smith8c663262007-08-25 02:26:07 +0000750 }
Eric Smith625cbf22007-08-29 03:22:59 +0000751
752 /* end of string while searching for matching '}' */
753 PyErr_SetString(PyExc_ValueError, "unmatched '{' in format");
754 return 0;
Eric Smith8c663262007-08-25 02:26:07 +0000755}
756
757
758/* do the !r or !s conversion on obj */
759static PyObject *
760do_conversion(PyObject *obj, STRINGLIB_CHAR conversion)
761{
762 /* XXX in pre-3.0, do we need to convert this to unicode, since it
763 might have returned a string? */
764 switch (conversion) {
765 case 'r':
766 return PyObject_Repr(obj);
767 case 's':
Eric Smith8fd3eba2008-02-17 19:48:00 +0000768 return STRINGLIB_TOSTR(obj);
Georg Brandl559e5d72008-06-11 18:37:52 +0000769#if PY_VERSION_HEX >= 0x03000000
770 case 'a':
771 return STRINGLIB_TOASCII(obj);
772#endif
Eric Smith8c663262007-08-25 02:26:07 +0000773 default:
Martin v. Löwis5a6f4582008-04-07 03:22:07 +0000774 if (conversion > 32 && conversion < 127) {
775 /* It's the ASCII subrange; casting to char is safe
776 (assuming the execution character set is an ASCII
777 superset). */
778 PyErr_Format(PyExc_ValueError,
779 "Unknown conversion specifier %c",
780 (char)conversion);
781 } else
782 PyErr_Format(PyExc_ValueError,
783 "Unknown conversion specifier \\x%x",
784 (unsigned int)conversion);
Eric Smith8c663262007-08-25 02:26:07 +0000785 return NULL;
786 }
787}
788
789/* given:
790
791 {field_name!conversion:format_spec}
792
793 compute the result and write it to output.
794 format_spec_needs_expanding is an optimization. if it's false,
795 just output the string directly, otherwise recursively expand the
796 format_spec string. */
797
798static int
799output_markup(SubString *field_name, SubString *format_spec,
800 int format_spec_needs_expanding, STRINGLIB_CHAR conversion,
801 OutputString *output, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000802 int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000803{
804 PyObject *tmp = NULL;
805 PyObject *fieldobj = NULL;
806 SubString expanded_format_spec;
807 SubString *actual_format_spec;
808 int result = 0;
809
810 /* convert field_name to an object */
811 fieldobj = get_field_object(field_name, args, kwargs);
812 if (fieldobj == NULL)
813 goto done;
814
815 if (conversion != '\0') {
816 tmp = do_conversion(fieldobj, conversion);
817 if (tmp == NULL)
818 goto done;
819
820 /* do the assignment, transferring ownership: fieldobj = tmp */
821 Py_DECREF(fieldobj);
822 fieldobj = tmp;
823 tmp = NULL;
824 }
825
826 /* if needed, recurively compute the format_spec */
827 if (format_spec_needs_expanding) {
Eric Smith45c07872007-09-05 02:02:43 +0000828 tmp = build_string(format_spec, args, kwargs, recursion_depth-1);
Eric Smith8c663262007-08-25 02:26:07 +0000829 if (tmp == NULL)
830 goto done;
831
832 /* note that in the case we're expanding the format string,
833 tmp must be kept around until after the call to
834 render_field. */
835 SubString_init(&expanded_format_spec,
836 STRINGLIB_STR(tmp), STRINGLIB_LEN(tmp));
837 actual_format_spec = &expanded_format_spec;
Eric Smith0cb431c2007-08-28 01:07:27 +0000838 }
839 else
Eric Smith8c663262007-08-25 02:26:07 +0000840 actual_format_spec = format_spec;
841
842 if (render_field(fieldobj, actual_format_spec, output) == 0)
843 goto done;
844
845 result = 1;
846
847done:
848 Py_XDECREF(fieldobj);
849 Py_XDECREF(tmp);
850
851 return result;
852}
853
854/*
Eric Smith8fd3eba2008-02-17 19:48:00 +0000855 do_markup is the top-level loop for the format() method. It
Eric Smith8c663262007-08-25 02:26:07 +0000856 searches through the format string for escapes to markup codes, and
857 calls other functions to move non-markup text to the output,
858 and to perform the markup to the output.
859*/
860static int
861do_markup(SubString *input, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000862 OutputString *output, int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000863{
864 MarkupIterator iter;
Eric Smith8c663262007-08-25 02:26:07 +0000865 int format_spec_needs_expanding;
866 int result;
Eric Smith625cbf22007-08-29 03:22:59 +0000867 SubString literal;
Eric Smith8c663262007-08-25 02:26:07 +0000868 SubString field_name;
869 SubString format_spec;
870 STRINGLIB_CHAR conversion;
871
872 MarkupIterator_init(&iter, input->ptr, input->end - input->ptr);
Eric Smith625cbf22007-08-29 03:22:59 +0000873 while ((result = MarkupIterator_next(&iter, &literal, &field_name,
Eric Smith8c663262007-08-25 02:26:07 +0000874 &format_spec, &conversion,
875 &format_spec_needs_expanding)) == 2) {
Eric Smith625cbf22007-08-29 03:22:59 +0000876 if (!output_data(output, literal.ptr, literal.end - literal.ptr))
877 return 0;
878 if (field_name.ptr != field_name.end)
Eric Smith8c663262007-08-25 02:26:07 +0000879 if (!output_markup(&field_name, &format_spec,
880 format_spec_needs_expanding, conversion, output,
Eric Smith45c07872007-09-05 02:02:43 +0000881 args, kwargs, recursion_depth))
Eric Smith8c663262007-08-25 02:26:07 +0000882 return 0;
Eric Smith8c663262007-08-25 02:26:07 +0000883 }
884 return result;
885}
886
887
888/*
889 build_string allocates the output string and then
890 calls do_markup to do the heavy lifting.
891*/
892static PyObject *
893build_string(SubString *input, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000894 int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000895{
896 OutputString output;
897 PyObject *result = NULL;
898 Py_ssize_t count;
899
900 output.obj = NULL; /* needed so cleanup code always works */
901
902 /* check the recursion level */
Eric Smith45c07872007-09-05 02:02:43 +0000903 if (recursion_depth <= 0) {
Eric Smith8c663262007-08-25 02:26:07 +0000904 PyErr_SetString(PyExc_ValueError,
905 "Max string recursion exceeded");
906 goto done;
907 }
908
909 /* initial size is the length of the format string, plus the size
910 increment. seems like a reasonable default */
911 if (!output_initialize(&output,
912 input->end - input->ptr +
913 INITIAL_SIZE_INCREMENT))
914 goto done;
915
Eric Smith45c07872007-09-05 02:02:43 +0000916 if (!do_markup(input, args, kwargs, &output, recursion_depth)) {
Eric Smith8c663262007-08-25 02:26:07 +0000917 goto done;
918 }
919
920 count = output.ptr - STRINGLIB_STR(output.obj);
921 if (STRINGLIB_RESIZE(&output.obj, count) < 0) {
922 goto done;
923 }
924
925 /* transfer ownership to result */
926 result = output.obj;
927 output.obj = NULL;
928
929done:
Eric Smith8c663262007-08-25 02:26:07 +0000930 Py_XDECREF(output.obj);
931 return result;
932}
933
934/************************************************************************/
935/*********** main routine ***********************************************/
936/************************************************************************/
937
938/* this is the main entry point */
939static PyObject *
940do_string_format(PyObject *self, PyObject *args, PyObject *kwargs)
941{
942 SubString input;
943
944 /* PEP 3101 says only 2 levels, so that
945 "{0:{1}}".format('abc', 's') # works
946 "{0:{1:{2}}}".format('abc', 's', '') # fails
947 */
Eric Smith45c07872007-09-05 02:02:43 +0000948 int recursion_depth = 2;
Eric Smith8c663262007-08-25 02:26:07 +0000949
950 SubString_init(&input, STRINGLIB_STR(self), STRINGLIB_LEN(self));
Eric Smith45c07872007-09-05 02:02:43 +0000951 return build_string(&input, args, kwargs, recursion_depth);
Eric Smith8c663262007-08-25 02:26:07 +0000952}
Eric Smithf6db4092007-08-27 23:52:26 +0000953
954
955
956/************************************************************************/
957/*********** formatteriterator ******************************************/
958/************************************************************************/
959
960/* This is used to implement string.Formatter.vparse(). It exists so
961 Formatter can share code with the built in unicode.format() method.
962 It's really just a wrapper around MarkupIterator that is callable
963 from Python. */
964
965typedef struct {
966 PyObject_HEAD
967
Eric Smith8fd3eba2008-02-17 19:48:00 +0000968 STRINGLIB_OBJECT *str;
Eric Smithf6db4092007-08-27 23:52:26 +0000969
970 MarkupIterator it_markup;
971} formatteriterobject;
972
973static void
974formatteriter_dealloc(formatteriterobject *it)
975{
976 Py_XDECREF(it->str);
977 PyObject_FREE(it);
978}
979
980/* returns a tuple:
Eric Smith625cbf22007-08-29 03:22:59 +0000981 (literal, field_name, format_spec, conversion)
982
983 literal is any literal text to output. might be zero length
984 field_name is the string before the ':'. might be None
985 format_spec is the string after the ':'. mibht be None
986 conversion is either None, or the string after the '!'
Eric Smithf6db4092007-08-27 23:52:26 +0000987*/
988static PyObject *
989formatteriter_next(formatteriterobject *it)
990{
991 SubString literal;
992 SubString field_name;
993 SubString format_spec;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000994 STRINGLIB_CHAR conversion;
Eric Smithf6db4092007-08-27 23:52:26 +0000995 int format_spec_needs_expanding;
Eric Smith625cbf22007-08-29 03:22:59 +0000996 int result = MarkupIterator_next(&it->it_markup, &literal, &field_name,
997 &format_spec, &conversion,
Eric Smithf6db4092007-08-27 23:52:26 +0000998 &format_spec_needs_expanding);
999
1000 /* all of the SubString objects point into it->str, so no
1001 memory management needs to be done on them */
1002 assert(0 <= result && result <= 2);
Eric Smith0cb431c2007-08-28 01:07:27 +00001003 if (result == 0 || result == 1)
Eric Smithf6db4092007-08-27 23:52:26 +00001004 /* if 0, error has already been set, if 1, iterator is empty */
1005 return NULL;
Eric Smith0cb431c2007-08-28 01:07:27 +00001006 else {
Eric Smithf6db4092007-08-27 23:52:26 +00001007 PyObject *literal_str = NULL;
1008 PyObject *field_name_str = NULL;
1009 PyObject *format_spec_str = NULL;
1010 PyObject *conversion_str = NULL;
1011 PyObject *tuple = NULL;
Eric Smith625cbf22007-08-29 03:22:59 +00001012 int has_field = field_name.ptr != field_name.end;
Eric Smithf6db4092007-08-27 23:52:26 +00001013
Eric Smith625cbf22007-08-29 03:22:59 +00001014 literal_str = SubString_new_object(&literal);
1015 if (literal_str == NULL)
1016 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001017
Eric Smith625cbf22007-08-29 03:22:59 +00001018 field_name_str = SubString_new_object(&field_name);
1019 if (field_name_str == NULL)
1020 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001021
Eric Smith625cbf22007-08-29 03:22:59 +00001022 /* if field_name is non-zero length, return a string for
1023 format_spec (even if zero length), else return None */
1024 format_spec_str = (has_field ?
1025 SubString_new_object_or_empty :
1026 SubString_new_object)(&format_spec);
1027 if (format_spec_str == NULL)
1028 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001029
Eric Smith625cbf22007-08-29 03:22:59 +00001030 /* if the conversion is not specified, return a None,
1031 otherwise create a one length string with the conversion
1032 character */
1033 if (conversion == '\0') {
Eric Smithf6db4092007-08-27 23:52:26 +00001034 conversion_str = Py_None;
Eric Smithf6db4092007-08-27 23:52:26 +00001035 Py_INCREF(conversion_str);
1036 }
Eric Smith625cbf22007-08-29 03:22:59 +00001037 else
Eric Smith8fd3eba2008-02-17 19:48:00 +00001038 conversion_str = STRINGLIB_NEW(&conversion, 1);
Eric Smith625cbf22007-08-29 03:22:59 +00001039 if (conversion_str == NULL)
1040 goto done;
1041
Eric Smith9e7c8da2007-08-28 11:15:20 +00001042 tuple = PyTuple_Pack(4, literal_str, field_name_str, format_spec_str,
Eric Smithf6db4092007-08-27 23:52:26 +00001043 conversion_str);
Eric Smith625cbf22007-08-29 03:22:59 +00001044 done:
Eric Smithf6db4092007-08-27 23:52:26 +00001045 Py_XDECREF(literal_str);
1046 Py_XDECREF(field_name_str);
1047 Py_XDECREF(format_spec_str);
1048 Py_XDECREF(conversion_str);
1049 return tuple;
1050 }
1051}
1052
1053static PyMethodDef formatteriter_methods[] = {
1054 {NULL, NULL} /* sentinel */
1055};
1056
Eric Smith8fd3eba2008-02-17 19:48:00 +00001057static PyTypeObject PyFormatterIter_Type = {
Eric Smithf6db4092007-08-27 23:52:26 +00001058 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1059 "formatteriterator", /* tp_name */
1060 sizeof(formatteriterobject), /* tp_basicsize */
1061 0, /* tp_itemsize */
1062 /* methods */
1063 (destructor)formatteriter_dealloc, /* tp_dealloc */
1064 0, /* tp_print */
1065 0, /* tp_getattr */
1066 0, /* tp_setattr */
1067 0, /* tp_compare */
1068 0, /* tp_repr */
1069 0, /* tp_as_number */
1070 0, /* tp_as_sequence */
1071 0, /* tp_as_mapping */
1072 0, /* tp_hash */
1073 0, /* tp_call */
1074 0, /* tp_str */
1075 PyObject_GenericGetAttr, /* tp_getattro */
1076 0, /* tp_setattro */
1077 0, /* tp_as_buffer */
1078 Py_TPFLAGS_DEFAULT, /* tp_flags */
1079 0, /* tp_doc */
1080 0, /* tp_traverse */
1081 0, /* tp_clear */
1082 0, /* tp_richcompare */
1083 0, /* tp_weaklistoffset */
1084 PyObject_SelfIter, /* tp_iter */
1085 (iternextfunc)formatteriter_next, /* tp_iternext */
1086 formatteriter_methods, /* tp_methods */
1087 0,
1088};
1089
1090/* unicode_formatter_parser is used to implement
1091 string.Formatter.vformat. it parses a string and returns tuples
1092 describing the parsed elements. It's a wrapper around
1093 stringlib/string_format.h's MarkupIterator */
1094static PyObject *
Eric Smith8fd3eba2008-02-17 19:48:00 +00001095formatter_parser(STRINGLIB_OBJECT *self)
Eric Smithf6db4092007-08-27 23:52:26 +00001096{
1097 formatteriterobject *it;
1098
1099 it = PyObject_New(formatteriterobject, &PyFormatterIter_Type);
1100 if (it == NULL)
1101 return NULL;
1102
1103 /* take ownership, give the object to the iterator */
1104 Py_INCREF(self);
1105 it->str = self;
1106
1107 /* initialize the contained MarkupIterator */
1108 MarkupIterator_init(&it->it_markup,
Eric Smith8fd3eba2008-02-17 19:48:00 +00001109 STRINGLIB_STR(self),
1110 STRINGLIB_LEN(self));
Eric Smithf6db4092007-08-27 23:52:26 +00001111
1112 return (PyObject *)it;
1113}
1114
1115
1116/************************************************************************/
1117/*********** fieldnameiterator ******************************************/
1118/************************************************************************/
1119
1120
1121/* This is used to implement string.Formatter.vparse(). It parses the
1122 field name into attribute and item values. It's a Python-callable
1123 wrapper around FieldNameIterator */
1124
1125typedef struct {
1126 PyObject_HEAD
1127
Eric Smith8fd3eba2008-02-17 19:48:00 +00001128 STRINGLIB_OBJECT *str;
Eric Smithf6db4092007-08-27 23:52:26 +00001129
1130 FieldNameIterator it_field;
1131} fieldnameiterobject;
1132
1133static void
1134fieldnameiter_dealloc(fieldnameiterobject *it)
1135{
1136 Py_XDECREF(it->str);
1137 PyObject_FREE(it);
1138}
1139
1140/* returns a tuple:
1141 (is_attr, value)
1142 is_attr is true if we used attribute syntax (e.g., '.foo')
1143 false if we used index syntax (e.g., '[foo]')
1144 value is an integer or string
1145*/
1146static PyObject *
1147fieldnameiter_next(fieldnameiterobject *it)
1148{
1149 int result;
1150 int is_attr;
1151 Py_ssize_t idx;
1152 SubString name;
1153
1154 result = FieldNameIterator_next(&it->it_field, &is_attr,
1155 &idx, &name);
Eric Smith0cb431c2007-08-28 01:07:27 +00001156 if (result == 0 || result == 1)
Eric Smithf6db4092007-08-27 23:52:26 +00001157 /* if 0, error has already been set, if 1, iterator is empty */
1158 return NULL;
Eric Smith0cb431c2007-08-28 01:07:27 +00001159 else {
Eric Smithf6db4092007-08-27 23:52:26 +00001160 PyObject* result = NULL;
1161 PyObject* is_attr_obj = NULL;
1162 PyObject* obj = NULL;
1163
1164 is_attr_obj = PyBool_FromLong(is_attr);
1165 if (is_attr_obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001166 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001167
1168 /* either an integer or a string */
1169 if (idx != -1)
Christian Heimes217cfd12007-12-02 14:31:20 +00001170 obj = PyLong_FromSsize_t(idx);
Eric Smithf6db4092007-08-27 23:52:26 +00001171 else
1172 obj = SubString_new_object(&name);
1173 if (obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001174 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001175
1176 /* return a tuple of values */
1177 result = PyTuple_Pack(2, is_attr_obj, obj);
Eric Smithf6db4092007-08-27 23:52:26 +00001178
Eric Smith625cbf22007-08-29 03:22:59 +00001179 done:
Eric Smithf6db4092007-08-27 23:52:26 +00001180 Py_XDECREF(is_attr_obj);
1181 Py_XDECREF(obj);
Eric Smith625cbf22007-08-29 03:22:59 +00001182 return result;
Eric Smithf6db4092007-08-27 23:52:26 +00001183 }
Eric Smithf6db4092007-08-27 23:52:26 +00001184}
1185
1186static PyMethodDef fieldnameiter_methods[] = {
1187 {NULL, NULL} /* sentinel */
1188};
1189
1190static PyTypeObject PyFieldNameIter_Type = {
1191 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1192 "fieldnameiterator", /* tp_name */
1193 sizeof(fieldnameiterobject), /* tp_basicsize */
1194 0, /* tp_itemsize */
1195 /* methods */
1196 (destructor)fieldnameiter_dealloc, /* tp_dealloc */
1197 0, /* tp_print */
1198 0, /* tp_getattr */
1199 0, /* tp_setattr */
1200 0, /* tp_compare */
1201 0, /* tp_repr */
1202 0, /* tp_as_number */
1203 0, /* tp_as_sequence */
1204 0, /* tp_as_mapping */
1205 0, /* tp_hash */
1206 0, /* tp_call */
1207 0, /* tp_str */
1208 PyObject_GenericGetAttr, /* tp_getattro */
1209 0, /* tp_setattro */
1210 0, /* tp_as_buffer */
1211 Py_TPFLAGS_DEFAULT, /* tp_flags */
1212 0, /* tp_doc */
1213 0, /* tp_traverse */
1214 0, /* tp_clear */
1215 0, /* tp_richcompare */
1216 0, /* tp_weaklistoffset */
1217 PyObject_SelfIter, /* tp_iter */
1218 (iternextfunc)fieldnameiter_next, /* tp_iternext */
1219 fieldnameiter_methods, /* tp_methods */
1220 0};
1221
1222/* unicode_formatter_field_name_split is used to implement
1223 string.Formatter.vformat. it takes an PEP 3101 "field name", and
1224 returns a tuple of (first, rest): "first", the part before the
1225 first '.' or '['; and "rest", an iterator for the rest of the field
1226 name. it's a wrapper around stringlib/string_format.h's
1227 field_name_split. The iterator it returns is a
1228 FieldNameIterator */
1229static PyObject *
Eric Smith8fd3eba2008-02-17 19:48:00 +00001230formatter_field_name_split(STRINGLIB_OBJECT *self)
Eric Smithf6db4092007-08-27 23:52:26 +00001231{
1232 SubString first;
1233 Py_ssize_t first_idx;
1234 fieldnameiterobject *it;
1235
1236 PyObject *first_obj = NULL;
1237 PyObject *result = NULL;
1238
1239 it = PyObject_New(fieldnameiterobject, &PyFieldNameIter_Type);
1240 if (it == NULL)
1241 return NULL;
1242
1243 /* take ownership, give the object to the iterator. this is
1244 just to keep the field_name alive */
1245 Py_INCREF(self);
1246 it->str = self;
1247
1248 if (!field_name_split(STRINGLIB_STR(self),
1249 STRINGLIB_LEN(self),
1250 &first, &first_idx, &it->it_field))
Eric Smith625cbf22007-08-29 03:22:59 +00001251 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001252
Eric Smith0cb431c2007-08-28 01:07:27 +00001253 /* first becomes an integer, if possible; else a string */
Eric Smithf6db4092007-08-27 23:52:26 +00001254 if (first_idx != -1)
Christian Heimes217cfd12007-12-02 14:31:20 +00001255 first_obj = PyLong_FromSsize_t(first_idx);
Eric Smithf6db4092007-08-27 23:52:26 +00001256 else
1257 /* convert "first" into a string object */
1258 first_obj = SubString_new_object(&first);
1259 if (first_obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001260 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001261
1262 /* return a tuple of values */
1263 result = PyTuple_Pack(2, first_obj, it);
1264
Eric Smith625cbf22007-08-29 03:22:59 +00001265done:
Eric Smithf6db4092007-08-27 23:52:26 +00001266 Py_XDECREF(it);
1267 Py_XDECREF(first_obj);
1268 return result;
1269}