blob: 37bd3706316a10d521b44adaaf02e67e8fa794bd [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);
Eric Smith8c663262007-08-25 02:26:07 +0000769 default:
Martin v. Löwis5a6f4582008-04-07 03:22:07 +0000770 if (conversion > 32 && conversion < 127) {
771 /* It's the ASCII subrange; casting to char is safe
772 (assuming the execution character set is an ASCII
773 superset). */
774 PyErr_Format(PyExc_ValueError,
775 "Unknown conversion specifier %c",
776 (char)conversion);
777 } else
778 PyErr_Format(PyExc_ValueError,
779 "Unknown conversion specifier \\x%x",
780 (unsigned int)conversion);
Eric Smith8c663262007-08-25 02:26:07 +0000781 return NULL;
782 }
783}
784
785/* given:
786
787 {field_name!conversion:format_spec}
788
789 compute the result and write it to output.
790 format_spec_needs_expanding is an optimization. if it's false,
791 just output the string directly, otherwise recursively expand the
792 format_spec string. */
793
794static int
795output_markup(SubString *field_name, SubString *format_spec,
796 int format_spec_needs_expanding, STRINGLIB_CHAR conversion,
797 OutputString *output, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000798 int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000799{
800 PyObject *tmp = NULL;
801 PyObject *fieldobj = NULL;
802 SubString expanded_format_spec;
803 SubString *actual_format_spec;
804 int result = 0;
805
806 /* convert field_name to an object */
807 fieldobj = get_field_object(field_name, args, kwargs);
808 if (fieldobj == NULL)
809 goto done;
810
811 if (conversion != '\0') {
812 tmp = do_conversion(fieldobj, conversion);
813 if (tmp == NULL)
814 goto done;
815
816 /* do the assignment, transferring ownership: fieldobj = tmp */
817 Py_DECREF(fieldobj);
818 fieldobj = tmp;
819 tmp = NULL;
820 }
821
822 /* if needed, recurively compute the format_spec */
823 if (format_spec_needs_expanding) {
Eric Smith45c07872007-09-05 02:02:43 +0000824 tmp = build_string(format_spec, args, kwargs, recursion_depth-1);
Eric Smith8c663262007-08-25 02:26:07 +0000825 if (tmp == NULL)
826 goto done;
827
828 /* note that in the case we're expanding the format string,
829 tmp must be kept around until after the call to
830 render_field. */
831 SubString_init(&expanded_format_spec,
832 STRINGLIB_STR(tmp), STRINGLIB_LEN(tmp));
833 actual_format_spec = &expanded_format_spec;
Eric Smith0cb431c2007-08-28 01:07:27 +0000834 }
835 else
Eric Smith8c663262007-08-25 02:26:07 +0000836 actual_format_spec = format_spec;
837
838 if (render_field(fieldobj, actual_format_spec, output) == 0)
839 goto done;
840
841 result = 1;
842
843done:
844 Py_XDECREF(fieldobj);
845 Py_XDECREF(tmp);
846
847 return result;
848}
849
850/*
Eric Smith8fd3eba2008-02-17 19:48:00 +0000851 do_markup is the top-level loop for the format() method. It
Eric Smith8c663262007-08-25 02:26:07 +0000852 searches through the format string for escapes to markup codes, and
853 calls other functions to move non-markup text to the output,
854 and to perform the markup to the output.
855*/
856static int
857do_markup(SubString *input, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000858 OutputString *output, int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000859{
860 MarkupIterator iter;
Eric Smith8c663262007-08-25 02:26:07 +0000861 int format_spec_needs_expanding;
862 int result;
Eric Smith625cbf22007-08-29 03:22:59 +0000863 SubString literal;
Eric Smith8c663262007-08-25 02:26:07 +0000864 SubString field_name;
865 SubString format_spec;
866 STRINGLIB_CHAR conversion;
867
868 MarkupIterator_init(&iter, input->ptr, input->end - input->ptr);
Eric Smith625cbf22007-08-29 03:22:59 +0000869 while ((result = MarkupIterator_next(&iter, &literal, &field_name,
Eric Smith8c663262007-08-25 02:26:07 +0000870 &format_spec, &conversion,
871 &format_spec_needs_expanding)) == 2) {
Eric Smith625cbf22007-08-29 03:22:59 +0000872 if (!output_data(output, literal.ptr, literal.end - literal.ptr))
873 return 0;
874 if (field_name.ptr != field_name.end)
Eric Smith8c663262007-08-25 02:26:07 +0000875 if (!output_markup(&field_name, &format_spec,
876 format_spec_needs_expanding, conversion, output,
Eric Smith45c07872007-09-05 02:02:43 +0000877 args, kwargs, recursion_depth))
Eric Smith8c663262007-08-25 02:26:07 +0000878 return 0;
Eric Smith8c663262007-08-25 02:26:07 +0000879 }
880 return result;
881}
882
883
884/*
885 build_string allocates the output string and then
886 calls do_markup to do the heavy lifting.
887*/
888static PyObject *
889build_string(SubString *input, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000890 int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000891{
892 OutputString output;
893 PyObject *result = NULL;
894 Py_ssize_t count;
895
896 output.obj = NULL; /* needed so cleanup code always works */
897
898 /* check the recursion level */
Eric Smith45c07872007-09-05 02:02:43 +0000899 if (recursion_depth <= 0) {
Eric Smith8c663262007-08-25 02:26:07 +0000900 PyErr_SetString(PyExc_ValueError,
901 "Max string recursion exceeded");
902 goto done;
903 }
904
905 /* initial size is the length of the format string, plus the size
906 increment. seems like a reasonable default */
907 if (!output_initialize(&output,
908 input->end - input->ptr +
909 INITIAL_SIZE_INCREMENT))
910 goto done;
911
Eric Smith45c07872007-09-05 02:02:43 +0000912 if (!do_markup(input, args, kwargs, &output, recursion_depth)) {
Eric Smith8c663262007-08-25 02:26:07 +0000913 goto done;
914 }
915
916 count = output.ptr - STRINGLIB_STR(output.obj);
917 if (STRINGLIB_RESIZE(&output.obj, count) < 0) {
918 goto done;
919 }
920
921 /* transfer ownership to result */
922 result = output.obj;
923 output.obj = NULL;
924
925done:
Eric Smith8c663262007-08-25 02:26:07 +0000926 Py_XDECREF(output.obj);
927 return result;
928}
929
930/************************************************************************/
931/*********** main routine ***********************************************/
932/************************************************************************/
933
934/* this is the main entry point */
935static PyObject *
936do_string_format(PyObject *self, PyObject *args, PyObject *kwargs)
937{
938 SubString input;
939
940 /* PEP 3101 says only 2 levels, so that
941 "{0:{1}}".format('abc', 's') # works
942 "{0:{1:{2}}}".format('abc', 's', '') # fails
943 */
Eric Smith45c07872007-09-05 02:02:43 +0000944 int recursion_depth = 2;
Eric Smith8c663262007-08-25 02:26:07 +0000945
946 SubString_init(&input, STRINGLIB_STR(self), STRINGLIB_LEN(self));
Eric Smith45c07872007-09-05 02:02:43 +0000947 return build_string(&input, args, kwargs, recursion_depth);
Eric Smith8c663262007-08-25 02:26:07 +0000948}
Eric Smithf6db4092007-08-27 23:52:26 +0000949
950
951
952/************************************************************************/
953/*********** formatteriterator ******************************************/
954/************************************************************************/
955
956/* This is used to implement string.Formatter.vparse(). It exists so
957 Formatter can share code with the built in unicode.format() method.
958 It's really just a wrapper around MarkupIterator that is callable
959 from Python. */
960
961typedef struct {
962 PyObject_HEAD
963
Eric Smith8fd3eba2008-02-17 19:48:00 +0000964 STRINGLIB_OBJECT *str;
Eric Smithf6db4092007-08-27 23:52:26 +0000965
966 MarkupIterator it_markup;
967} formatteriterobject;
968
969static void
970formatteriter_dealloc(formatteriterobject *it)
971{
972 Py_XDECREF(it->str);
973 PyObject_FREE(it);
974}
975
976/* returns a tuple:
Eric Smith625cbf22007-08-29 03:22:59 +0000977 (literal, field_name, format_spec, conversion)
978
979 literal is any literal text to output. might be zero length
980 field_name is the string before the ':'. might be None
981 format_spec is the string after the ':'. mibht be None
982 conversion is either None, or the string after the '!'
Eric Smithf6db4092007-08-27 23:52:26 +0000983*/
984static PyObject *
985formatteriter_next(formatteriterobject *it)
986{
987 SubString literal;
988 SubString field_name;
989 SubString format_spec;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000990 STRINGLIB_CHAR conversion;
Eric Smithf6db4092007-08-27 23:52:26 +0000991 int format_spec_needs_expanding;
Eric Smith625cbf22007-08-29 03:22:59 +0000992 int result = MarkupIterator_next(&it->it_markup, &literal, &field_name,
993 &format_spec, &conversion,
Eric Smithf6db4092007-08-27 23:52:26 +0000994 &format_spec_needs_expanding);
995
996 /* all of the SubString objects point into it->str, so no
997 memory management needs to be done on them */
998 assert(0 <= result && result <= 2);
Eric Smith0cb431c2007-08-28 01:07:27 +0000999 if (result == 0 || result == 1)
Eric Smithf6db4092007-08-27 23:52:26 +00001000 /* if 0, error has already been set, if 1, iterator is empty */
1001 return NULL;
Eric Smith0cb431c2007-08-28 01:07:27 +00001002 else {
Eric Smithf6db4092007-08-27 23:52:26 +00001003 PyObject *literal_str = NULL;
1004 PyObject *field_name_str = NULL;
1005 PyObject *format_spec_str = NULL;
1006 PyObject *conversion_str = NULL;
1007 PyObject *tuple = NULL;
Eric Smith625cbf22007-08-29 03:22:59 +00001008 int has_field = field_name.ptr != field_name.end;
Eric Smithf6db4092007-08-27 23:52:26 +00001009
Eric Smith625cbf22007-08-29 03:22:59 +00001010 literal_str = SubString_new_object(&literal);
1011 if (literal_str == NULL)
1012 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001013
Eric Smith625cbf22007-08-29 03:22:59 +00001014 field_name_str = SubString_new_object(&field_name);
1015 if (field_name_str == NULL)
1016 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001017
Eric Smith625cbf22007-08-29 03:22:59 +00001018 /* if field_name is non-zero length, return a string for
1019 format_spec (even if zero length), else return None */
1020 format_spec_str = (has_field ?
1021 SubString_new_object_or_empty :
1022 SubString_new_object)(&format_spec);
1023 if (format_spec_str == NULL)
1024 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001025
Eric Smith625cbf22007-08-29 03:22:59 +00001026 /* if the conversion is not specified, return a None,
1027 otherwise create a one length string with the conversion
1028 character */
1029 if (conversion == '\0') {
Eric Smithf6db4092007-08-27 23:52:26 +00001030 conversion_str = Py_None;
Eric Smithf6db4092007-08-27 23:52:26 +00001031 Py_INCREF(conversion_str);
1032 }
Eric Smith625cbf22007-08-29 03:22:59 +00001033 else
Eric Smith8fd3eba2008-02-17 19:48:00 +00001034 conversion_str = STRINGLIB_NEW(&conversion, 1);
Eric Smith625cbf22007-08-29 03:22:59 +00001035 if (conversion_str == NULL)
1036 goto done;
1037
Eric Smith9e7c8da2007-08-28 11:15:20 +00001038 tuple = PyTuple_Pack(4, literal_str, field_name_str, format_spec_str,
Eric Smithf6db4092007-08-27 23:52:26 +00001039 conversion_str);
Eric Smith625cbf22007-08-29 03:22:59 +00001040 done:
Eric Smithf6db4092007-08-27 23:52:26 +00001041 Py_XDECREF(literal_str);
1042 Py_XDECREF(field_name_str);
1043 Py_XDECREF(format_spec_str);
1044 Py_XDECREF(conversion_str);
1045 return tuple;
1046 }
1047}
1048
1049static PyMethodDef formatteriter_methods[] = {
1050 {NULL, NULL} /* sentinel */
1051};
1052
Eric Smith8fd3eba2008-02-17 19:48:00 +00001053static PyTypeObject PyFormatterIter_Type = {
Eric Smithf6db4092007-08-27 23:52:26 +00001054 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1055 "formatteriterator", /* tp_name */
1056 sizeof(formatteriterobject), /* tp_basicsize */
1057 0, /* tp_itemsize */
1058 /* methods */
1059 (destructor)formatteriter_dealloc, /* tp_dealloc */
1060 0, /* tp_print */
1061 0, /* tp_getattr */
1062 0, /* tp_setattr */
1063 0, /* tp_compare */
1064 0, /* tp_repr */
1065 0, /* tp_as_number */
1066 0, /* tp_as_sequence */
1067 0, /* tp_as_mapping */
1068 0, /* tp_hash */
1069 0, /* tp_call */
1070 0, /* tp_str */
1071 PyObject_GenericGetAttr, /* tp_getattro */
1072 0, /* tp_setattro */
1073 0, /* tp_as_buffer */
1074 Py_TPFLAGS_DEFAULT, /* tp_flags */
1075 0, /* tp_doc */
1076 0, /* tp_traverse */
1077 0, /* tp_clear */
1078 0, /* tp_richcompare */
1079 0, /* tp_weaklistoffset */
1080 PyObject_SelfIter, /* tp_iter */
1081 (iternextfunc)formatteriter_next, /* tp_iternext */
1082 formatteriter_methods, /* tp_methods */
1083 0,
1084};
1085
1086/* unicode_formatter_parser is used to implement
1087 string.Formatter.vformat. it parses a string and returns tuples
1088 describing the parsed elements. It's a wrapper around
1089 stringlib/string_format.h's MarkupIterator */
1090static PyObject *
Eric Smith8fd3eba2008-02-17 19:48:00 +00001091formatter_parser(STRINGLIB_OBJECT *self)
Eric Smithf6db4092007-08-27 23:52:26 +00001092{
1093 formatteriterobject *it;
1094
1095 it = PyObject_New(formatteriterobject, &PyFormatterIter_Type);
1096 if (it == NULL)
1097 return NULL;
1098
1099 /* take ownership, give the object to the iterator */
1100 Py_INCREF(self);
1101 it->str = self;
1102
1103 /* initialize the contained MarkupIterator */
1104 MarkupIterator_init(&it->it_markup,
Eric Smith8fd3eba2008-02-17 19:48:00 +00001105 STRINGLIB_STR(self),
1106 STRINGLIB_LEN(self));
Eric Smithf6db4092007-08-27 23:52:26 +00001107
1108 return (PyObject *)it;
1109}
1110
1111
1112/************************************************************************/
1113/*********** fieldnameiterator ******************************************/
1114/************************************************************************/
1115
1116
1117/* This is used to implement string.Formatter.vparse(). It parses the
1118 field name into attribute and item values. It's a Python-callable
1119 wrapper around FieldNameIterator */
1120
1121typedef struct {
1122 PyObject_HEAD
1123
Eric Smith8fd3eba2008-02-17 19:48:00 +00001124 STRINGLIB_OBJECT *str;
Eric Smithf6db4092007-08-27 23:52:26 +00001125
1126 FieldNameIterator it_field;
1127} fieldnameiterobject;
1128
1129static void
1130fieldnameiter_dealloc(fieldnameiterobject *it)
1131{
1132 Py_XDECREF(it->str);
1133 PyObject_FREE(it);
1134}
1135
1136/* returns a tuple:
1137 (is_attr, value)
1138 is_attr is true if we used attribute syntax (e.g., '.foo')
1139 false if we used index syntax (e.g., '[foo]')
1140 value is an integer or string
1141*/
1142static PyObject *
1143fieldnameiter_next(fieldnameiterobject *it)
1144{
1145 int result;
1146 int is_attr;
1147 Py_ssize_t idx;
1148 SubString name;
1149
1150 result = FieldNameIterator_next(&it->it_field, &is_attr,
1151 &idx, &name);
Eric Smith0cb431c2007-08-28 01:07:27 +00001152 if (result == 0 || result == 1)
Eric Smithf6db4092007-08-27 23:52:26 +00001153 /* if 0, error has already been set, if 1, iterator is empty */
1154 return NULL;
Eric Smith0cb431c2007-08-28 01:07:27 +00001155 else {
Eric Smithf6db4092007-08-27 23:52:26 +00001156 PyObject* result = NULL;
1157 PyObject* is_attr_obj = NULL;
1158 PyObject* obj = NULL;
1159
1160 is_attr_obj = PyBool_FromLong(is_attr);
1161 if (is_attr_obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001162 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001163
1164 /* either an integer or a string */
1165 if (idx != -1)
Christian Heimes217cfd12007-12-02 14:31:20 +00001166 obj = PyLong_FromSsize_t(idx);
Eric Smithf6db4092007-08-27 23:52:26 +00001167 else
1168 obj = SubString_new_object(&name);
1169 if (obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001170 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001171
1172 /* return a tuple of values */
1173 result = PyTuple_Pack(2, is_attr_obj, obj);
Eric Smithf6db4092007-08-27 23:52:26 +00001174
Eric Smith625cbf22007-08-29 03:22:59 +00001175 done:
Eric Smithf6db4092007-08-27 23:52:26 +00001176 Py_XDECREF(is_attr_obj);
1177 Py_XDECREF(obj);
Eric Smith625cbf22007-08-29 03:22:59 +00001178 return result;
Eric Smithf6db4092007-08-27 23:52:26 +00001179 }
Eric Smithf6db4092007-08-27 23:52:26 +00001180}
1181
1182static PyMethodDef fieldnameiter_methods[] = {
1183 {NULL, NULL} /* sentinel */
1184};
1185
1186static PyTypeObject PyFieldNameIter_Type = {
1187 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1188 "fieldnameiterator", /* tp_name */
1189 sizeof(fieldnameiterobject), /* tp_basicsize */
1190 0, /* tp_itemsize */
1191 /* methods */
1192 (destructor)fieldnameiter_dealloc, /* tp_dealloc */
1193 0, /* tp_print */
1194 0, /* tp_getattr */
1195 0, /* tp_setattr */
1196 0, /* tp_compare */
1197 0, /* tp_repr */
1198 0, /* tp_as_number */
1199 0, /* tp_as_sequence */
1200 0, /* tp_as_mapping */
1201 0, /* tp_hash */
1202 0, /* tp_call */
1203 0, /* tp_str */
1204 PyObject_GenericGetAttr, /* tp_getattro */
1205 0, /* tp_setattro */
1206 0, /* tp_as_buffer */
1207 Py_TPFLAGS_DEFAULT, /* tp_flags */
1208 0, /* tp_doc */
1209 0, /* tp_traverse */
1210 0, /* tp_clear */
1211 0, /* tp_richcompare */
1212 0, /* tp_weaklistoffset */
1213 PyObject_SelfIter, /* tp_iter */
1214 (iternextfunc)fieldnameiter_next, /* tp_iternext */
1215 fieldnameiter_methods, /* tp_methods */
1216 0};
1217
1218/* unicode_formatter_field_name_split is used to implement
1219 string.Formatter.vformat. it takes an PEP 3101 "field name", and
1220 returns a tuple of (first, rest): "first", the part before the
1221 first '.' or '['; and "rest", an iterator for the rest of the field
1222 name. it's a wrapper around stringlib/string_format.h's
1223 field_name_split. The iterator it returns is a
1224 FieldNameIterator */
1225static PyObject *
Eric Smith8fd3eba2008-02-17 19:48:00 +00001226formatter_field_name_split(STRINGLIB_OBJECT *self)
Eric Smithf6db4092007-08-27 23:52:26 +00001227{
1228 SubString first;
1229 Py_ssize_t first_idx;
1230 fieldnameiterobject *it;
1231
1232 PyObject *first_obj = NULL;
1233 PyObject *result = NULL;
1234
1235 it = PyObject_New(fieldnameiterobject, &PyFieldNameIter_Type);
1236 if (it == NULL)
1237 return NULL;
1238
1239 /* take ownership, give the object to the iterator. this is
1240 just to keep the field_name alive */
1241 Py_INCREF(self);
1242 it->str = self;
1243
1244 if (!field_name_split(STRINGLIB_STR(self),
1245 STRINGLIB_LEN(self),
1246 &first, &first_idx, &it->it_field))
Eric Smith625cbf22007-08-29 03:22:59 +00001247 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001248
Eric Smith0cb431c2007-08-28 01:07:27 +00001249 /* first becomes an integer, if possible; else a string */
Eric Smithf6db4092007-08-27 23:52:26 +00001250 if (first_idx != -1)
Christian Heimes217cfd12007-12-02 14:31:20 +00001251 first_obj = PyLong_FromSsize_t(first_idx);
Eric Smithf6db4092007-08-27 23:52:26 +00001252 else
1253 /* convert "first" into a string object */
1254 first_obj = SubString_new_object(&first);
1255 if (first_obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001256 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001257
1258 /* return a tuple of values */
1259 result = PyTuple_Pack(2, first_obj, it);
1260
Eric Smith625cbf22007-08-29 03:22:59 +00001261done:
Eric Smithf6db4092007-08-27 23:52:26 +00001262 Py_XDECREF(it);
1263 Py_XDECREF(first_obj);
1264 return result;
1265}