blob: e7762429a772ecf9f557af8928161bedaa703ece [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 Smith8c663262007-08-25 02:26:07 +0000486
Eric Smith8fd3eba2008-02-17 19:48:00 +0000487 /* we need to create an object out of the pointers we have */
488 PyObject *format_spec_object = SubString_new_object_or_empty(format_spec);
489 if (format_spec_object == NULL)
490 goto done;
491
492 result = PyObject_Format(fieldobj, format_spec_object);
Eric Smith8c663262007-08-25 02:26:07 +0000493 if (result == NULL)
494 goto done;
495
Eric Smith8a0217c2008-02-18 18:07:47 +0000496#if PY_VERSION_HEX >= 0x03000000
497 assert(PyString_Check(result));
498#else
499 assert(PyString_Check(result) || PyUnicode_Check(result));
500
501 /* Convert result to our type. We could be str, and result could
502 be unicode */
503 {
504 PyObject *tmp = STRINGLIB_TOSTR(result);
505 if (tmp == NULL)
506 goto done;
507 Py_DECREF(result);
508 result = tmp;
509 }
510#endif
511
Eric Smith8c663262007-08-25 02:26:07 +0000512 ok = output_data(output,
513 STRINGLIB_STR(result), STRINGLIB_LEN(result));
514done:
Eric Smith8fd3eba2008-02-17 19:48:00 +0000515 Py_DECREF(format_spec_object);
Eric Smith8c663262007-08-25 02:26:07 +0000516 Py_XDECREF(result);
517 return ok;
518}
519
520static int
521parse_field(SubString *str, SubString *field_name, SubString *format_spec,
522 STRINGLIB_CHAR *conversion)
523{
524 STRINGLIB_CHAR c = 0;
525
526 /* initialize these, as they may be empty */
527 *conversion = '\0';
528 SubString_init(format_spec, NULL, 0);
529
530 /* search for the field name. it's terminated by the end of the
531 string, or a ':' or '!' */
532 field_name->ptr = str->ptr;
533 while (str->ptr < str->end) {
534 switch (c = *(str->ptr++)) {
535 case ':':
536 case '!':
537 break;
538 default:
539 continue;
540 }
541 break;
542 }
543
544 if (c == '!' || c == ':') {
545 /* we have a format specifier and/or a conversion */
546 /* don't include the last character */
547 field_name->end = str->ptr-1;
548
549 /* the format specifier is the rest of the string */
550 format_spec->ptr = str->ptr;
551 format_spec->end = str->end;
552
553 /* see if there's a conversion specifier */
554 if (c == '!') {
555 /* there must be another character present */
556 if (format_spec->ptr >= format_spec->end) {
557 PyErr_SetString(PyExc_ValueError,
558 "end of format while looking for conversion "
559 "specifier");
560 return 0;
561 }
562 *conversion = *(format_spec->ptr++);
563
564 /* if there is another character, it must be a colon */
565 if (format_spec->ptr < format_spec->end) {
566 c = *(format_spec->ptr++);
567 if (c != ':') {
568 PyErr_SetString(PyExc_ValueError,
569 "expected ':' after format specifier");
570 return 0;
571 }
572 }
573 }
574
575 return 1;
576
Eric Smith0cb431c2007-08-28 01:07:27 +0000577 }
578 else {
Eric Smith8c663262007-08-25 02:26:07 +0000579 /* end of string, there's no format_spec or conversion */
580 field_name->end = str->ptr;
581 return 1;
582 }
583}
584
585/************************************************************************/
586/******* Output string allocation and escape-to-markup processing ******/
587/************************************************************************/
588
589/* MarkupIterator breaks the string into pieces of either literal
590 text, or things inside {} that need to be marked up. it is
591 designed to make it easy to wrap a Python iterator around it, for
592 use with the Formatter class */
593
594typedef struct {
595 SubString str;
Eric Smith8c663262007-08-25 02:26:07 +0000596} MarkupIterator;
597
598static int
599MarkupIterator_init(MarkupIterator *self, STRINGLIB_CHAR *ptr, Py_ssize_t len)
600{
601 SubString_init(&self->str, ptr, len);
Eric Smith8c663262007-08-25 02:26:07 +0000602 return 1;
603}
604
605/* returns 0 on error, 1 on non-error termination, and 2 if it got a
606 string (or something to be expanded) */
607static int
Eric Smith625cbf22007-08-29 03:22:59 +0000608MarkupIterator_next(MarkupIterator *self, SubString *literal,
Eric Smith8c663262007-08-25 02:26:07 +0000609 SubString *field_name, SubString *format_spec,
610 STRINGLIB_CHAR *conversion,
611 int *format_spec_needs_expanding)
612{
613 int at_end;
614 STRINGLIB_CHAR c = 0;
615 STRINGLIB_CHAR *start;
616 int count;
617 Py_ssize_t len;
Eric Smith625cbf22007-08-29 03:22:59 +0000618 int markup_follows = 0;
Eric Smith8c663262007-08-25 02:26:07 +0000619
Eric Smith625cbf22007-08-29 03:22:59 +0000620 /* initialize all of the output variables */
621 SubString_init(literal, NULL, 0);
622 SubString_init(field_name, NULL, 0);
623 SubString_init(format_spec, NULL, 0);
624 *conversion = '\0';
Eric Smith8c663262007-08-25 02:26:07 +0000625 *format_spec_needs_expanding = 0;
626
Eric Smith625cbf22007-08-29 03:22:59 +0000627 /* No more input, end of iterator. This is the normal exit
628 path. */
Eric Smith8c663262007-08-25 02:26:07 +0000629 if (self->str.ptr >= self->str.end)
630 return 1;
631
Eric Smith8c663262007-08-25 02:26:07 +0000632 start = self->str.ptr;
633
Eric Smith625cbf22007-08-29 03:22:59 +0000634 /* First read any literal text. Read until the end of string, an
635 escaped '{' or '}', or an unescaped '{'. In order to never
636 allocate memory and so I can just pass pointers around, if
637 there's an escaped '{' or '}' then we'll return the literal
638 including the brace, but no format object. The next time
639 through, we'll return the rest of the literal, skipping past
640 the second consecutive brace. */
641 while (self->str.ptr < self->str.end) {
642 switch (c = *(self->str.ptr++)) {
643 case '{':
644 case '}':
645 markup_follows = 1;
646 break;
647 default:
648 continue;
Eric Smith8c663262007-08-25 02:26:07 +0000649 }
Eric Smith625cbf22007-08-29 03:22:59 +0000650 break;
Eric Smith0cb431c2007-08-28 01:07:27 +0000651 }
Eric Smith625cbf22007-08-29 03:22:59 +0000652
653 at_end = self->str.ptr >= self->str.end;
654 len = self->str.ptr - start;
655
656 if ((c == '}') && (at_end || (c != *self->str.ptr))) {
657 PyErr_SetString(PyExc_ValueError, "Single '}' encountered "
658 "in format string");
659 return 0;
660 }
661 if (at_end && c == '{') {
662 PyErr_SetString(PyExc_ValueError, "Single '{' encountered "
663 "in format string");
664 return 0;
665 }
666 if (!at_end) {
667 if (c == *self->str.ptr) {
668 /* escaped } or {, skip it in the input. there is no
669 markup object following us, just this literal text */
670 self->str.ptr++;
671 markup_follows = 0;
672 }
673 else
674 len--;
675 }
676
677 /* record the literal text */
678 literal->ptr = start;
679 literal->end = start + len;
680
681 if (!markup_follows)
682 return 2;
683
684 /* this is markup, find the end of the string by counting nested
685 braces. note that this prohibits escaped braces, so that
686 format_specs cannot have braces in them. */
687 count = 1;
688
689 start = self->str.ptr;
690
691 /* we know we can't have a zero length string, so don't worry
692 about that case */
693 while (self->str.ptr < self->str.end) {
694 switch (c = *(self->str.ptr++)) {
695 case '{':
696 /* the format spec needs to be recursively expanded.
697 this is an optimization, and not strictly needed */
698 *format_spec_needs_expanding = 1;
699 count++;
700 break;
701 case '}':
702 count--;
703 if (count <= 0) {
704 /* we're done. parse and get out */
705 SubString s;
706
707 SubString_init(&s, start, self->str.ptr - 1 - start);
708 if (parse_field(&s, field_name, format_spec, conversion) == 0)
709 return 0;
710
711 /* a zero length field_name is an error */
712 if (field_name->ptr == field_name->end) {
713 PyErr_SetString(PyExc_ValueError, "zero length field name "
714 "in format");
715 return 0;
716 }
717
718 /* success */
719 return 2;
Eric Smith8c663262007-08-25 02:26:07 +0000720 }
721 break;
722 }
Eric Smith8c663262007-08-25 02:26:07 +0000723 }
Eric Smith625cbf22007-08-29 03:22:59 +0000724
725 /* end of string while searching for matching '}' */
726 PyErr_SetString(PyExc_ValueError, "unmatched '{' in format");
727 return 0;
Eric Smith8c663262007-08-25 02:26:07 +0000728}
729
730
731/* do the !r or !s conversion on obj */
732static PyObject *
733do_conversion(PyObject *obj, STRINGLIB_CHAR conversion)
734{
735 /* XXX in pre-3.0, do we need to convert this to unicode, since it
736 might have returned a string? */
737 switch (conversion) {
738 case 'r':
739 return PyObject_Repr(obj);
740 case 's':
Eric Smith8fd3eba2008-02-17 19:48:00 +0000741 return STRINGLIB_TOSTR(obj);
Eric Smith8c663262007-08-25 02:26:07 +0000742 default:
743 PyErr_Format(PyExc_ValueError,
744 "Unknown converion specifier %c",
745 conversion);
746 return NULL;
747 }
748}
749
750/* given:
751
752 {field_name!conversion:format_spec}
753
754 compute the result and write it to output.
755 format_spec_needs_expanding is an optimization. if it's false,
756 just output the string directly, otherwise recursively expand the
757 format_spec string. */
758
759static int
760output_markup(SubString *field_name, SubString *format_spec,
761 int format_spec_needs_expanding, STRINGLIB_CHAR conversion,
762 OutputString *output, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000763 int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000764{
765 PyObject *tmp = NULL;
766 PyObject *fieldobj = NULL;
767 SubString expanded_format_spec;
768 SubString *actual_format_spec;
769 int result = 0;
770
771 /* convert field_name to an object */
772 fieldobj = get_field_object(field_name, args, kwargs);
773 if (fieldobj == NULL)
774 goto done;
775
776 if (conversion != '\0') {
777 tmp = do_conversion(fieldobj, conversion);
778 if (tmp == NULL)
779 goto done;
780
781 /* do the assignment, transferring ownership: fieldobj = tmp */
782 Py_DECREF(fieldobj);
783 fieldobj = tmp;
784 tmp = NULL;
785 }
786
787 /* if needed, recurively compute the format_spec */
788 if (format_spec_needs_expanding) {
Eric Smith45c07872007-09-05 02:02:43 +0000789 tmp = build_string(format_spec, args, kwargs, recursion_depth-1);
Eric Smith8c663262007-08-25 02:26:07 +0000790 if (tmp == NULL)
791 goto done;
792
793 /* note that in the case we're expanding the format string,
794 tmp must be kept around until after the call to
795 render_field. */
796 SubString_init(&expanded_format_spec,
797 STRINGLIB_STR(tmp), STRINGLIB_LEN(tmp));
798 actual_format_spec = &expanded_format_spec;
Eric Smith0cb431c2007-08-28 01:07:27 +0000799 }
800 else
Eric Smith8c663262007-08-25 02:26:07 +0000801 actual_format_spec = format_spec;
802
803 if (render_field(fieldobj, actual_format_spec, output) == 0)
804 goto done;
805
806 result = 1;
807
808done:
809 Py_XDECREF(fieldobj);
810 Py_XDECREF(tmp);
811
812 return result;
813}
814
815/*
Eric Smith8fd3eba2008-02-17 19:48:00 +0000816 do_markup is the top-level loop for the format() method. It
Eric Smith8c663262007-08-25 02:26:07 +0000817 searches through the format string for escapes to markup codes, and
818 calls other functions to move non-markup text to the output,
819 and to perform the markup to the output.
820*/
821static int
822do_markup(SubString *input, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000823 OutputString *output, int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000824{
825 MarkupIterator iter;
Eric Smith8c663262007-08-25 02:26:07 +0000826 int format_spec_needs_expanding;
827 int result;
Eric Smith625cbf22007-08-29 03:22:59 +0000828 SubString literal;
Eric Smith8c663262007-08-25 02:26:07 +0000829 SubString field_name;
830 SubString format_spec;
831 STRINGLIB_CHAR conversion;
832
833 MarkupIterator_init(&iter, input->ptr, input->end - input->ptr);
Eric Smith625cbf22007-08-29 03:22:59 +0000834 while ((result = MarkupIterator_next(&iter, &literal, &field_name,
Eric Smith8c663262007-08-25 02:26:07 +0000835 &format_spec, &conversion,
836 &format_spec_needs_expanding)) == 2) {
Eric Smith625cbf22007-08-29 03:22:59 +0000837 if (!output_data(output, literal.ptr, literal.end - literal.ptr))
838 return 0;
839 if (field_name.ptr != field_name.end)
Eric Smith8c663262007-08-25 02:26:07 +0000840 if (!output_markup(&field_name, &format_spec,
841 format_spec_needs_expanding, conversion, output,
Eric Smith45c07872007-09-05 02:02:43 +0000842 args, kwargs, recursion_depth))
Eric Smith8c663262007-08-25 02:26:07 +0000843 return 0;
Eric Smith8c663262007-08-25 02:26:07 +0000844 }
845 return result;
846}
847
848
849/*
850 build_string allocates the output string and then
851 calls do_markup to do the heavy lifting.
852*/
853static PyObject *
854build_string(SubString *input, PyObject *args, PyObject *kwargs,
Eric Smith45c07872007-09-05 02:02:43 +0000855 int recursion_depth)
Eric Smith8c663262007-08-25 02:26:07 +0000856{
857 OutputString output;
858 PyObject *result = NULL;
859 Py_ssize_t count;
860
861 output.obj = NULL; /* needed so cleanup code always works */
862
863 /* check the recursion level */
Eric Smith45c07872007-09-05 02:02:43 +0000864 if (recursion_depth <= 0) {
Eric Smith8c663262007-08-25 02:26:07 +0000865 PyErr_SetString(PyExc_ValueError,
866 "Max string recursion exceeded");
867 goto done;
868 }
869
870 /* initial size is the length of the format string, plus the size
871 increment. seems like a reasonable default */
872 if (!output_initialize(&output,
873 input->end - input->ptr +
874 INITIAL_SIZE_INCREMENT))
875 goto done;
876
Eric Smith45c07872007-09-05 02:02:43 +0000877 if (!do_markup(input, args, kwargs, &output, recursion_depth)) {
Eric Smith8c663262007-08-25 02:26:07 +0000878 goto done;
879 }
880
881 count = output.ptr - STRINGLIB_STR(output.obj);
882 if (STRINGLIB_RESIZE(&output.obj, count) < 0) {
883 goto done;
884 }
885
886 /* transfer ownership to result */
887 result = output.obj;
888 output.obj = NULL;
889
890done:
Eric Smith8c663262007-08-25 02:26:07 +0000891 Py_XDECREF(output.obj);
892 return result;
893}
894
895/************************************************************************/
896/*********** main routine ***********************************************/
897/************************************************************************/
898
899/* this is the main entry point */
900static PyObject *
901do_string_format(PyObject *self, PyObject *args, PyObject *kwargs)
902{
903 SubString input;
904
905 /* PEP 3101 says only 2 levels, so that
906 "{0:{1}}".format('abc', 's') # works
907 "{0:{1:{2}}}".format('abc', 's', '') # fails
908 */
Eric Smith45c07872007-09-05 02:02:43 +0000909 int recursion_depth = 2;
Eric Smith8c663262007-08-25 02:26:07 +0000910
911 SubString_init(&input, STRINGLIB_STR(self), STRINGLIB_LEN(self));
Eric Smith45c07872007-09-05 02:02:43 +0000912 return build_string(&input, args, kwargs, recursion_depth);
Eric Smith8c663262007-08-25 02:26:07 +0000913}
Eric Smithf6db4092007-08-27 23:52:26 +0000914
915
916
917/************************************************************************/
918/*********** formatteriterator ******************************************/
919/************************************************************************/
920
921/* This is used to implement string.Formatter.vparse(). It exists so
922 Formatter can share code with the built in unicode.format() method.
923 It's really just a wrapper around MarkupIterator that is callable
924 from Python. */
925
926typedef struct {
927 PyObject_HEAD
928
Eric Smith8fd3eba2008-02-17 19:48:00 +0000929 STRINGLIB_OBJECT *str;
Eric Smithf6db4092007-08-27 23:52:26 +0000930
931 MarkupIterator it_markup;
932} formatteriterobject;
933
934static void
935formatteriter_dealloc(formatteriterobject *it)
936{
937 Py_XDECREF(it->str);
938 PyObject_FREE(it);
939}
940
941/* returns a tuple:
Eric Smith625cbf22007-08-29 03:22:59 +0000942 (literal, field_name, format_spec, conversion)
943
944 literal is any literal text to output. might be zero length
945 field_name is the string before the ':'. might be None
946 format_spec is the string after the ':'. mibht be None
947 conversion is either None, or the string after the '!'
Eric Smithf6db4092007-08-27 23:52:26 +0000948*/
949static PyObject *
950formatteriter_next(formatteriterobject *it)
951{
952 SubString literal;
953 SubString field_name;
954 SubString format_spec;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000955 STRINGLIB_CHAR conversion;
Eric Smithf6db4092007-08-27 23:52:26 +0000956 int format_spec_needs_expanding;
Eric Smith625cbf22007-08-29 03:22:59 +0000957 int result = MarkupIterator_next(&it->it_markup, &literal, &field_name,
958 &format_spec, &conversion,
Eric Smithf6db4092007-08-27 23:52:26 +0000959 &format_spec_needs_expanding);
960
961 /* all of the SubString objects point into it->str, so no
962 memory management needs to be done on them */
963 assert(0 <= result && result <= 2);
Eric Smith0cb431c2007-08-28 01:07:27 +0000964 if (result == 0 || result == 1)
Eric Smithf6db4092007-08-27 23:52:26 +0000965 /* if 0, error has already been set, if 1, iterator is empty */
966 return NULL;
Eric Smith0cb431c2007-08-28 01:07:27 +0000967 else {
Eric Smithf6db4092007-08-27 23:52:26 +0000968 PyObject *literal_str = NULL;
969 PyObject *field_name_str = NULL;
970 PyObject *format_spec_str = NULL;
971 PyObject *conversion_str = NULL;
972 PyObject *tuple = NULL;
Eric Smith625cbf22007-08-29 03:22:59 +0000973 int has_field = field_name.ptr != field_name.end;
Eric Smithf6db4092007-08-27 23:52:26 +0000974
Eric Smith625cbf22007-08-29 03:22:59 +0000975 literal_str = SubString_new_object(&literal);
976 if (literal_str == NULL)
977 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +0000978
Eric Smith625cbf22007-08-29 03:22:59 +0000979 field_name_str = SubString_new_object(&field_name);
980 if (field_name_str == NULL)
981 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +0000982
Eric Smith625cbf22007-08-29 03:22:59 +0000983 /* if field_name is non-zero length, return a string for
984 format_spec (even if zero length), else return None */
985 format_spec_str = (has_field ?
986 SubString_new_object_or_empty :
987 SubString_new_object)(&format_spec);
988 if (format_spec_str == NULL)
989 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +0000990
Eric Smith625cbf22007-08-29 03:22:59 +0000991 /* if the conversion is not specified, return a None,
992 otherwise create a one length string with the conversion
993 character */
994 if (conversion == '\0') {
Eric Smithf6db4092007-08-27 23:52:26 +0000995 conversion_str = Py_None;
Eric Smithf6db4092007-08-27 23:52:26 +0000996 Py_INCREF(conversion_str);
997 }
Eric Smith625cbf22007-08-29 03:22:59 +0000998 else
Eric Smith8fd3eba2008-02-17 19:48:00 +0000999 conversion_str = STRINGLIB_NEW(&conversion, 1);
Eric Smith625cbf22007-08-29 03:22:59 +00001000 if (conversion_str == NULL)
1001 goto done;
1002
Eric Smith9e7c8da2007-08-28 11:15:20 +00001003 tuple = PyTuple_Pack(4, literal_str, field_name_str, format_spec_str,
Eric Smithf6db4092007-08-27 23:52:26 +00001004 conversion_str);
Eric Smith625cbf22007-08-29 03:22:59 +00001005 done:
Eric Smithf6db4092007-08-27 23:52:26 +00001006 Py_XDECREF(literal_str);
1007 Py_XDECREF(field_name_str);
1008 Py_XDECREF(format_spec_str);
1009 Py_XDECREF(conversion_str);
1010 return tuple;
1011 }
1012}
1013
1014static PyMethodDef formatteriter_methods[] = {
1015 {NULL, NULL} /* sentinel */
1016};
1017
Eric Smith8fd3eba2008-02-17 19:48:00 +00001018static PyTypeObject PyFormatterIter_Type = {
Eric Smithf6db4092007-08-27 23:52:26 +00001019 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1020 "formatteriterator", /* tp_name */
1021 sizeof(formatteriterobject), /* tp_basicsize */
1022 0, /* tp_itemsize */
1023 /* methods */
1024 (destructor)formatteriter_dealloc, /* tp_dealloc */
1025 0, /* tp_print */
1026 0, /* tp_getattr */
1027 0, /* tp_setattr */
1028 0, /* tp_compare */
1029 0, /* tp_repr */
1030 0, /* tp_as_number */
1031 0, /* tp_as_sequence */
1032 0, /* tp_as_mapping */
1033 0, /* tp_hash */
1034 0, /* tp_call */
1035 0, /* tp_str */
1036 PyObject_GenericGetAttr, /* tp_getattro */
1037 0, /* tp_setattro */
1038 0, /* tp_as_buffer */
1039 Py_TPFLAGS_DEFAULT, /* tp_flags */
1040 0, /* tp_doc */
1041 0, /* tp_traverse */
1042 0, /* tp_clear */
1043 0, /* tp_richcompare */
1044 0, /* tp_weaklistoffset */
1045 PyObject_SelfIter, /* tp_iter */
1046 (iternextfunc)formatteriter_next, /* tp_iternext */
1047 formatteriter_methods, /* tp_methods */
1048 0,
1049};
1050
1051/* unicode_formatter_parser is used to implement
1052 string.Formatter.vformat. it parses a string and returns tuples
1053 describing the parsed elements. It's a wrapper around
1054 stringlib/string_format.h's MarkupIterator */
1055static PyObject *
Eric Smith8fd3eba2008-02-17 19:48:00 +00001056formatter_parser(STRINGLIB_OBJECT *self)
Eric Smithf6db4092007-08-27 23:52:26 +00001057{
1058 formatteriterobject *it;
1059
1060 it = PyObject_New(formatteriterobject, &PyFormatterIter_Type);
1061 if (it == NULL)
1062 return NULL;
1063
1064 /* take ownership, give the object to the iterator */
1065 Py_INCREF(self);
1066 it->str = self;
1067
1068 /* initialize the contained MarkupIterator */
1069 MarkupIterator_init(&it->it_markup,
Eric Smith8fd3eba2008-02-17 19:48:00 +00001070 STRINGLIB_STR(self),
1071 STRINGLIB_LEN(self));
Eric Smithf6db4092007-08-27 23:52:26 +00001072
1073 return (PyObject *)it;
1074}
1075
1076
1077/************************************************************************/
1078/*********** fieldnameiterator ******************************************/
1079/************************************************************************/
1080
1081
1082/* This is used to implement string.Formatter.vparse(). It parses the
1083 field name into attribute and item values. It's a Python-callable
1084 wrapper around FieldNameIterator */
1085
1086typedef struct {
1087 PyObject_HEAD
1088
Eric Smith8fd3eba2008-02-17 19:48:00 +00001089 STRINGLIB_OBJECT *str;
Eric Smithf6db4092007-08-27 23:52:26 +00001090
1091 FieldNameIterator it_field;
1092} fieldnameiterobject;
1093
1094static void
1095fieldnameiter_dealloc(fieldnameiterobject *it)
1096{
1097 Py_XDECREF(it->str);
1098 PyObject_FREE(it);
1099}
1100
1101/* returns a tuple:
1102 (is_attr, value)
1103 is_attr is true if we used attribute syntax (e.g., '.foo')
1104 false if we used index syntax (e.g., '[foo]')
1105 value is an integer or string
1106*/
1107static PyObject *
1108fieldnameiter_next(fieldnameiterobject *it)
1109{
1110 int result;
1111 int is_attr;
1112 Py_ssize_t idx;
1113 SubString name;
1114
1115 result = FieldNameIterator_next(&it->it_field, &is_attr,
1116 &idx, &name);
Eric Smith0cb431c2007-08-28 01:07:27 +00001117 if (result == 0 || result == 1)
Eric Smithf6db4092007-08-27 23:52:26 +00001118 /* if 0, error has already been set, if 1, iterator is empty */
1119 return NULL;
Eric Smith0cb431c2007-08-28 01:07:27 +00001120 else {
Eric Smithf6db4092007-08-27 23:52:26 +00001121 PyObject* result = NULL;
1122 PyObject* is_attr_obj = NULL;
1123 PyObject* obj = NULL;
1124
1125 is_attr_obj = PyBool_FromLong(is_attr);
1126 if (is_attr_obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001127 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001128
1129 /* either an integer or a string */
1130 if (idx != -1)
Christian Heimes217cfd12007-12-02 14:31:20 +00001131 obj = PyLong_FromSsize_t(idx);
Eric Smithf6db4092007-08-27 23:52:26 +00001132 else
1133 obj = SubString_new_object(&name);
1134 if (obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001135 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001136
1137 /* return a tuple of values */
1138 result = PyTuple_Pack(2, is_attr_obj, obj);
Eric Smithf6db4092007-08-27 23:52:26 +00001139
Eric Smith625cbf22007-08-29 03:22:59 +00001140 done:
Eric Smithf6db4092007-08-27 23:52:26 +00001141 Py_XDECREF(is_attr_obj);
1142 Py_XDECREF(obj);
Eric Smith625cbf22007-08-29 03:22:59 +00001143 return result;
Eric Smithf6db4092007-08-27 23:52:26 +00001144 }
Eric Smithf6db4092007-08-27 23:52:26 +00001145}
1146
1147static PyMethodDef fieldnameiter_methods[] = {
1148 {NULL, NULL} /* sentinel */
1149};
1150
1151static PyTypeObject PyFieldNameIter_Type = {
1152 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1153 "fieldnameiterator", /* tp_name */
1154 sizeof(fieldnameiterobject), /* tp_basicsize */
1155 0, /* tp_itemsize */
1156 /* methods */
1157 (destructor)fieldnameiter_dealloc, /* tp_dealloc */
1158 0, /* tp_print */
1159 0, /* tp_getattr */
1160 0, /* tp_setattr */
1161 0, /* tp_compare */
1162 0, /* tp_repr */
1163 0, /* tp_as_number */
1164 0, /* tp_as_sequence */
1165 0, /* tp_as_mapping */
1166 0, /* tp_hash */
1167 0, /* tp_call */
1168 0, /* tp_str */
1169 PyObject_GenericGetAttr, /* tp_getattro */
1170 0, /* tp_setattro */
1171 0, /* tp_as_buffer */
1172 Py_TPFLAGS_DEFAULT, /* tp_flags */
1173 0, /* tp_doc */
1174 0, /* tp_traverse */
1175 0, /* tp_clear */
1176 0, /* tp_richcompare */
1177 0, /* tp_weaklistoffset */
1178 PyObject_SelfIter, /* tp_iter */
1179 (iternextfunc)fieldnameiter_next, /* tp_iternext */
1180 fieldnameiter_methods, /* tp_methods */
1181 0};
1182
1183/* unicode_formatter_field_name_split is used to implement
1184 string.Formatter.vformat. it takes an PEP 3101 "field name", and
1185 returns a tuple of (first, rest): "first", the part before the
1186 first '.' or '['; and "rest", an iterator for the rest of the field
1187 name. it's a wrapper around stringlib/string_format.h's
1188 field_name_split. The iterator it returns is a
1189 FieldNameIterator */
1190static PyObject *
Eric Smith8fd3eba2008-02-17 19:48:00 +00001191formatter_field_name_split(STRINGLIB_OBJECT *self)
Eric Smithf6db4092007-08-27 23:52:26 +00001192{
1193 SubString first;
1194 Py_ssize_t first_idx;
1195 fieldnameiterobject *it;
1196
1197 PyObject *first_obj = NULL;
1198 PyObject *result = NULL;
1199
1200 it = PyObject_New(fieldnameiterobject, &PyFieldNameIter_Type);
1201 if (it == NULL)
1202 return NULL;
1203
1204 /* take ownership, give the object to the iterator. this is
1205 just to keep the field_name alive */
1206 Py_INCREF(self);
1207 it->str = self;
1208
1209 if (!field_name_split(STRINGLIB_STR(self),
1210 STRINGLIB_LEN(self),
1211 &first, &first_idx, &it->it_field))
Eric Smith625cbf22007-08-29 03:22:59 +00001212 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001213
Eric Smith0cb431c2007-08-28 01:07:27 +00001214 /* first becomes an integer, if possible; else a string */
Eric Smithf6db4092007-08-27 23:52:26 +00001215 if (first_idx != -1)
Christian Heimes217cfd12007-12-02 14:31:20 +00001216 first_obj = PyLong_FromSsize_t(first_idx);
Eric Smithf6db4092007-08-27 23:52:26 +00001217 else
1218 /* convert "first" into a string object */
1219 first_obj = SubString_new_object(&first);
1220 if (first_obj == NULL)
Eric Smith625cbf22007-08-29 03:22:59 +00001221 goto done;
Eric Smithf6db4092007-08-27 23:52:26 +00001222
1223 /* return a tuple of values */
1224 result = PyTuple_Pack(2, first_obj, it);
1225
Eric Smith625cbf22007-08-29 03:22:59 +00001226done:
Eric Smithf6db4092007-08-27 23:52:26 +00001227 Py_XDECREF(it);
1228 Py_XDECREF(first_obj);
1229 return result;
1230}