blob: dbcb1a9969bdbc93f51d39a3fbdb0a6741de5d82 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* String object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum013142a1994-08-30 08:19:36 +000036#include <ctype.h>
37
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000038#ifdef COUNT_ALLOCS
39int null_strings, one_strings;
40#endif
41
Guido van Rossum03093a21994-09-28 15:51:32 +000042#ifdef HAVE_LIMITS_H
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000043#include <limits.h>
44#else
45#ifndef UCHAR_MAX
46#define UCHAR_MAX 255
47#endif
48#endif
49
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050static PyStringObject *characters[UCHAR_MAX + 1];
Sjoerd Mullender615194a1993-11-01 13:46:50 +000051#ifndef DONT_SHARE_SHORT_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052static PyStringObject *nullstring;
Sjoerd Mullender615194a1993-11-01 13:46:50 +000053#endif
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000054
55/*
56 Newsizedstringobject() and newstringobject() try in certain cases
57 to share string objects. When the size of the string is zero,
58 these routines always return a pointer to the same string object;
59 when the size is one, they return a pointer to an already existing
60 object if the contents of the string is known. For
61 newstringobject() this is always the case, for
62 newsizedstringobject() this is the case when the first argument in
63 not NULL.
64 A common practice to allocate a string and then fill it in or
65 change it must be done carefully. It is only allowed to change the
66 contents of the string if the obect was gotten from
67 newsizedstringobject() with a NULL first argument, because in the
68 future these routines may try to do even more sharing of objects.
69*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070PyObject *
71PyString_FromStringAndSize(str, size)
Guido van Rossum067998f1996-12-10 15:33:34 +000072 const char *str;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 int size;
74{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 register PyStringObject *op;
Sjoerd Mullender615194a1993-11-01 13:46:50 +000076#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000077 if (size == 0 && (op = nullstring) != NULL) {
78#ifdef COUNT_ALLOCS
79 null_strings++;
80#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 Py_INCREF(op);
82 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000083 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 if (size == 1 && str != NULL &&
85 (op = characters[*str & UCHAR_MAX]) != NULL)
86 {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000087#ifdef COUNT_ALLOCS
88 one_strings++;
89#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 Py_INCREF(op);
91 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000092 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +000093#endif /* DONT_SHARE_SHORT_STRINGS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 op = (PyStringObject *)
95 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +000096 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return PyErr_NoMemory();
98 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +000099 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000100#ifdef CACHE_HASH
101 op->ob_shash = -1;
102#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000103#ifdef INTERN_STRINGS
104 op->ob_sinterned = NULL;
105#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000107 if (str != NULL)
108 memcpy(op->ob_sval, str, size);
109 op->ob_sval[size] = '\0';
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000110#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000111 if (size == 0) {
112 nullstring = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000114 } else if (size == 1 && str != NULL) {
115 characters[*str & UCHAR_MAX] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000117 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000118#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120}
121
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122PyObject *
123PyString_FromString(str)
Guido van Rossum067998f1996-12-10 15:33:34 +0000124 const char *str;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
126 register unsigned int size = strlen(str);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 register PyStringObject *op;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000128#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000129 if (size == 0 && (op = nullstring) != NULL) {
130#ifdef COUNT_ALLOCS
131 null_strings++;
132#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 Py_INCREF(op);
134 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000135 }
136 if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
137#ifdef COUNT_ALLOCS
138 one_strings++;
139#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 Py_INCREF(op);
141 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000142 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000143#endif /* DONT_SHARE_SHORT_STRINGS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 op = (PyStringObject *)
145 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000146 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 return PyErr_NoMemory();
148 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000149 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000150#ifdef CACHE_HASH
151 op->ob_shash = -1;
152#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000153#ifdef INTERN_STRINGS
154 op->ob_sinterned = NULL;
155#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000157 strcpy(op->ob_sval, str);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000158#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000159 if (size == 0) {
160 nullstring = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000162 } else if (size == 1) {
163 characters[*str & UCHAR_MAX] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000165 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000166#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168}
169
Guido van Rossum234f9421993-06-17 12:35:49 +0000170static void
Guido van Rossume5372401993-03-16 12:15:04 +0000171string_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000172 PyObject *op;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000173{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 PyMem_DEL(op);
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000175}
176
Guido van Rossumd7047b31995-01-02 19:07:15 +0000177int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178PyString_Size(op)
179 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 if (!PyString_Check(op)) {
182 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183 return -1;
184 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 return ((PyStringObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
188/*const*/ char *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189PyString_AsString(op)
190 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 if (!PyString_Check(op)) {
193 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 return NULL;
195 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 return ((PyStringObject *)op) -> ob_sval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
199/* Methods */
200
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000201static int
Guido van Rossume5372401993-03-16 12:15:04 +0000202string_print(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 PyStringObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 FILE *fp;
205 int flags;
206{
207 int i;
208 char c;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000209 int quote;
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000210 /* XXX Ought to check for interrupts when writing long strings */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 if (flags & Py_PRINT_RAW) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 fwrite(op->ob_sval, 1, (int) op->ob_size, fp);
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000213 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000215
216 /* figure out which quote to use; single is prefered */
217 quote = '\'';
218 if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
219 quote = '"';
220
221 fputc(quote, fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 for (i = 0; i < op->ob_size; i++) {
223 c = op->ob_sval[i];
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000224 if (c == quote || c == '\\')
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225 fprintf(fp, "\\%c", c);
226 else if (c < ' ' || c >= 0177)
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000227 fprintf(fp, "\\%03o", c & 0377);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 else
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000229 fputc(c, fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000231 fputc(quote, fp);
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000232 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233}
234
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000236string_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 register PyStringObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238{
239 /* XXX overflow? */
240 int newsize = 2 + 4 * op->ob_size * sizeof(char);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 PyObject *v = PyString_FromStringAndSize((char *)NULL, newsize);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 if (v == NULL) {
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000243 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244 }
245 else {
246 register int i;
247 register char c;
248 register char *p;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000249 int quote;
250
251 /* figure out which quote to use; single is prefered */
252 quote = '\'';
253 if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
254 quote = '"';
255
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 p = ((PyStringObject *)v)->ob_sval;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000257 *p++ = quote;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258 for (i = 0; i < op->ob_size; i++) {
259 c = op->ob_sval[i];
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000260 if (c == quote || c == '\\')
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261 *p++ = '\\', *p++ = c;
262 else if (c < ' ' || c >= 0177) {
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000263 sprintf(p, "\\%03o", c & 0377);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 while (*p != '\0')
265 p++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266 }
267 else
268 *p++ = c;
269 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000270 *p++ = quote;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271 *p = '\0';
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272 _PyString_Resize(
273 &v, (int) (p - ((PyStringObject *)v)->ob_sval));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000274 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276}
277
278static int
Guido van Rossume5372401993-03-16 12:15:04 +0000279string_length(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000280 PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281{
282 return a->ob_size;
283}
284
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000286string_concat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000287 register PyStringObject *a;
288 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289{
290 register unsigned int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 register PyStringObject *op;
292 if (!PyString_Check(bb)) {
293 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return NULL;
295 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296#define b ((PyStringObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 /* Optimize cases with empty left or right operand */
298 if (a->ob_size == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 Py_INCREF(bb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return bb;
301 }
302 if (b->ob_size == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303 Py_INCREF(a);
304 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 }
306 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 op = (PyStringObject *)
308 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000309 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 return PyErr_NoMemory();
311 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000312 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000313#ifdef CACHE_HASH
314 op->ob_shash = -1;
315#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000316#ifdef INTERN_STRINGS
317 op->ob_sinterned = NULL;
318#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000320 memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size);
321 memcpy(op->ob_sval + a->ob_size, b->ob_sval, (int) b->ob_size);
322 op->ob_sval[size] = '\0';
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324#undef b
325}
326
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000328string_repeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 register PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 register int n;
331{
332 register int i;
Guido van Rossum2095d241997-04-09 19:41:24 +0000333 register int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 register PyStringObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 if (n < 0)
336 n = 0;
337 size = a->ob_size * n;
338 if (size == a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 Py_INCREF(a);
340 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 op = (PyStringObject *)
343 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000344 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 return PyErr_NoMemory();
346 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000347 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000348#ifdef CACHE_HASH
349 op->ob_shash = -1;
350#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000351#ifdef INTERN_STRINGS
352 op->ob_sinterned = NULL;
353#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000355 for (i = 0; i < size; i += a->ob_size)
356 memcpy(op->ob_sval+i, a->ob_sval, (int) a->ob_size);
357 op->ob_sval[size] = '\0';
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359}
360
361/* String slice a[i:j] consists of characters a[i] ... a[j-1] */
362
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000364string_slice(a, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 register PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 register int i, j; /* May be negative! */
367{
368 if (i < 0)
369 i = 0;
370 if (j < 0)
371 j = 0; /* Avoid signed/unsigned bug in next line */
372 if (j > a->ob_size)
373 j = a->ob_size;
374 if (i == 0 && j == a->ob_size) { /* It's the same as a */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 Py_INCREF(a);
376 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377 }
378 if (j < i)
379 j = i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 return PyString_FromStringAndSize(a->ob_sval + i, (int) (j-i));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000381}
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000384string_item(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385 PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386 register int i;
387{
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000388 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 PyErr_SetString(PyExc_IndexError, "string index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 return NULL;
393 }
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000394 c = a->ob_sval[i] & UCHAR_MAX;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395 v = (PyObject *) characters[c];
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000396#ifdef COUNT_ALLOCS
397 if (v != NULL)
398 one_strings++;
399#endif
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000400 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 v = PyString_FromStringAndSize((char *)NULL, 1);
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000402 if (v == NULL)
403 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 characters[c] = (PyStringObject *) v;
405 ((PyStringObject *)v)->ob_sval[0] = c;
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000406 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 Py_INCREF(v);
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000408 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409}
410
411static int
Guido van Rossume5372401993-03-16 12:15:04 +0000412string_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 PyStringObject *a, *b;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414{
Guido van Rossum253919f1991-02-13 23:18:39 +0000415 int len_a = a->ob_size, len_b = b->ob_size;
416 int min_len = (len_a < len_b) ? len_a : len_b;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000417 int cmp;
418 if (min_len > 0) {
Guido van Rossumfde7a751996-10-23 14:19:40 +0000419 cmp = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000420 if (cmp == 0)
421 cmp = memcmp(a->ob_sval, b->ob_sval, min_len);
422 if (cmp != 0)
423 return cmp;
424 }
Guido van Rossum253919f1991-02-13 23:18:39 +0000425 return (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426}
427
Guido van Rossum9bfef441993-03-29 10:43:31 +0000428static long
429string_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 PyStringObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000431{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000432 register int len;
433 register unsigned char *p;
434 register long x;
435
436#ifdef CACHE_HASH
437 if (a->ob_shash != -1)
438 return a->ob_shash;
Guido van Rossum36b9f791997-02-14 16:29:22 +0000439#ifdef INTERN_STRINGS
440 if (a->ob_sinterned != NULL)
441 return (a->ob_shash =
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 ((PyStringObject *)(a->ob_sinterned))->ob_shash);
Guido van Rossum36b9f791997-02-14 16:29:22 +0000443#endif
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000444#endif
445 len = a->ob_size;
446 p = (unsigned char *) a->ob_sval;
447 x = *p << 7;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000448 while (--len >= 0)
Guido van Rossumeddcb3b1996-09-11 20:22:48 +0000449 x = (1000003*x) ^ *p++;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000450 x ^= a->ob_size;
451 if (x == -1)
452 x = -2;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000453#ifdef CACHE_HASH
454 a->ob_shash = x;
455#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +0000456 return x;
457}
458
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000459static int
460string_buffer_getreadbuf(self, index, ptr)
461 PyStringObject *self;
462 int index;
463 const void **ptr;
464{
465 if ( index != 0 ) {
466 PyErr_SetString(PyExc_SystemError, "Accessing non-existent string segment");
467 return -1;
468 }
469 *ptr = (void *)self->ob_sval;
470 return self->ob_size;
471}
472
473static int
474string_buffer_getwritebuf(self, index, ptr)
475 PyStringObject *self;
476 int index;
477 const void **ptr;
478{
479 PyErr_SetString(PyExc_TypeError, "Cannot use string as modifyable buffer");
480 return -1;
481}
482
483static int
484string_buffer_getsegcount(self, lenp)
485 PyStringObject *self;
486 int *lenp;
487{
488 if ( lenp )
489 *lenp = self->ob_size;
490 return 1;
491}
492
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493static PySequenceMethods string_as_sequence = {
Guido van Rossum013142a1994-08-30 08:19:36 +0000494 (inquiry)string_length, /*sq_length*/
495 (binaryfunc)string_concat, /*sq_concat*/
496 (intargfunc)string_repeat, /*sq_repeat*/
497 (intargfunc)string_item, /*sq_item*/
498 (intintargfunc)string_slice, /*sq_slice*/
Guido van Rossumf380e661991-06-04 19:36:32 +0000499 0, /*sq_ass_item*/
500 0, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501};
502
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000503static PyBufferProcs string_as_buffer = {
504 (getreadbufferproc)string_buffer_getreadbuf,
505 (getwritebufferproc)string_buffer_getwritebuf,
506 (getsegcountproc)string_buffer_getsegcount,
507};
508
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509PyTypeObject PyString_Type = {
510 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000511 0,
512 "string",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 sizeof(PyStringObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000514 sizeof(char),
Guido van Rossum013142a1994-08-30 08:19:36 +0000515 (destructor)string_dealloc, /*tp_dealloc*/
516 (printfunc)string_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000517 0, /*tp_getattr*/
518 0, /*tp_setattr*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000519 (cmpfunc)string_compare, /*tp_compare*/
520 (reprfunc)string_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000521 0, /*tp_as_number*/
522 &string_as_sequence, /*tp_as_sequence*/
523 0, /*tp_as_mapping*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000524 (hashfunc)string_hash, /*tp_hash*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000525 0, /*tp_call*/
526 0, /*tp_str*/
527 0, /*tp_getattro*/
528 0, /*tp_setattro*/
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000529 &string_as_buffer, /*tp_as_buffer*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000530 0, /*tp_xxx4*/
531 0, /*tp_doc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000532};
533
534void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535PyString_Concat(pv, w)
536 register PyObject **pv;
537 register PyObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 register PyObject *v;
Guido van Rossum013142a1994-08-30 08:19:36 +0000540 if (*pv == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541 return;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 if (w == NULL || !PyString_Check(*pv)) {
543 Py_DECREF(*pv);
Guido van Rossum013142a1994-08-30 08:19:36 +0000544 *pv = NULL;
545 return;
546 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 v = string_concat((PyStringObject *) *pv, w);
548 Py_DECREF(*pv);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549 *pv = v;
550}
551
Guido van Rossum013142a1994-08-30 08:19:36 +0000552void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553PyString_ConcatAndDel(pv, w)
554 register PyObject **pv;
555 register PyObject *w;
Guido van Rossum013142a1994-08-30 08:19:36 +0000556{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 PyString_Concat(pv, w);
558 Py_XDECREF(w);
Guido van Rossum013142a1994-08-30 08:19:36 +0000559}
560
561
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562/* The following function breaks the notion that strings are immutable:
563 it changes the size of a string. We get away with this only if there
564 is only one module referencing the object. You can also think of it
565 as creating a new string object and destroying the old one, only
566 more efficiently. In any case, don't use this if the string may
567 already be known to some other part of the code... */
568
569int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570_PyString_Resize(pv, newsize)
571 PyObject **pv;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572 int newsize;
573{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 register PyObject *v;
575 register PyStringObject *sv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000576 v = *pv;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 if (!PyString_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000578 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 Py_DECREF(v);
580 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000581 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000582 }
Guido van Rossum921842f1990-11-18 17:30:23 +0000583 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000584#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000585 --_Py_RefTotal;
Guido van Rossum921842f1990-11-18 17:30:23 +0000586#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 _Py_ForgetReference(v);
588 *pv = (PyObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 sizeof(PyStringObject) + newsize * sizeof(char));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000591 if (*pv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 PyMem_DEL(v);
593 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000594 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000595 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 _Py_NewReference(*pv);
597 sv = (PyStringObject *) *pv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000598 sv->ob_size = newsize;
599 sv->ob_sval[newsize] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600 return 0;
601}
Guido van Rossume5372401993-03-16 12:15:04 +0000602
603/* Helpers for formatstring */
604
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000606getnextarg(args, arglen, p_argidx)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000608 int arglen;
609 int *p_argidx;
610{
611 int argidx = *p_argidx;
612 if (argidx < arglen) {
613 (*p_argidx)++;
614 if (arglen < 0)
615 return args;
616 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 return PyTuple_GetItem(args, argidx);
Guido van Rossume5372401993-03-16 12:15:04 +0000618 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 PyErr_SetString(PyExc_TypeError,
620 "not enough arguments for format string");
Guido van Rossume5372401993-03-16 12:15:04 +0000621 return NULL;
622}
623
624#define F_LJUST (1<<0)
625#define F_SIGN (1<<1)
626#define F_BLANK (1<<2)
627#define F_ALT (1<<3)
628#define F_ZERO (1<<4)
629
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630extern double fabs Py_PROTO((double));
Guido van Rossume5372401993-03-16 12:15:04 +0000631
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000632static int
633formatfloat(buf, flags, prec, type, v)
634 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000635 int flags;
636 int prec;
637 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000639{
640 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000641 double x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642 if (!PyArg_Parse(v, "d;float argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000643 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000644 if (prec < 0)
645 prec = 6;
646 if (prec > 50)
647 prec = 50; /* Arbitrary limitation */
648 if (type == 'f' && fabs(x)/1e25 >= 1e25)
649 type = 'g';
650 sprintf(fmt, "%%%s.%d%c", (flags&F_ALT) ? "#" : "", prec, type);
651 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000652 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000653}
654
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000655static int
656formatint(buf, flags, prec, type, v)
657 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000658 int flags;
659 int prec;
660 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000661 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000662{
663 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000664 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 if (!PyArg_Parse(v, "l;int argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000666 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000667 if (prec < 0)
668 prec = 1;
669 sprintf(fmt, "%%%s.%dl%c", (flags&F_ALT) ? "#" : "", prec, type);
670 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000671 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000672}
673
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000674static int
675formatchar(buf, v)
676 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000678{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 if (PyString_Check(v)) {
680 if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000681 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000682 }
683 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000685 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000686 }
687 buf[1] = '\0';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000688 return 1;
Guido van Rossume5372401993-03-16 12:15:04 +0000689}
690
Guido van Rossum013142a1994-08-30 08:19:36 +0000691
Guido van Rossume5372401993-03-16 12:15:04 +0000692/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
693
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694PyObject *
695PyString_Format(format, args)
696 PyObject *format;
697 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000698{
699 char *fmt, *res;
700 int fmtcnt, rescnt, reslen, arglen, argidx;
Guido van Rossum993952b1996-05-21 22:44:20 +0000701 int args_owned = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702 PyObject *result;
703 PyObject *dict = NULL;
704 if (format == NULL || !PyString_Check(format) || args == NULL) {
705 PyErr_BadInternalCall();
Guido van Rossume5372401993-03-16 12:15:04 +0000706 return NULL;
707 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000708 fmt = PyString_AsString(format);
709 fmtcnt = PyString_Size(format);
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000710 reslen = rescnt = fmtcnt + 100;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 result = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossume5372401993-03-16 12:15:04 +0000712 if (result == NULL)
713 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 res = PyString_AsString(result);
715 if (PyTuple_Check(args)) {
716 arglen = PyTuple_Size(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000717 argidx = 0;
718 }
719 else {
720 arglen = -1;
721 argidx = -2;
722 }
Guido van Rossum013142a1994-08-30 08:19:36 +0000723 if (args->ob_type->tp_as_mapping)
724 dict = args;
Guido van Rossume5372401993-03-16 12:15:04 +0000725 while (--fmtcnt >= 0) {
726 if (*fmt != '%') {
727 if (--rescnt < 0) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000728 rescnt = fmtcnt + 100;
729 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000730 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000731 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 res = PyString_AsString(result)
733 + reslen - rescnt;
Guido van Rossum013142a1994-08-30 08:19:36 +0000734 --rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000735 }
736 *res++ = *fmt++;
737 }
738 else {
739 /* Got a format specifier */
740 int flags = 0;
Guido van Rossume5372401993-03-16 12:15:04 +0000741 int width = -1;
742 int prec = -1;
743 int size = 0;
Guido van Rossum6938a291993-11-11 14:51:57 +0000744 int c = '\0';
Guido van Rossume5372401993-03-16 12:15:04 +0000745 int fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746 PyObject *v = NULL;
747 PyObject *temp = NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000748 char *buf;
749 int sign;
750 int len;
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000751 char tmpbuf[120]; /* For format{float,int,char}() */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000752 fmt++;
Guido van Rossum013142a1994-08-30 08:19:36 +0000753 if (*fmt == '(') {
754 char *keystart;
755 int keylen;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000756 PyObject *key;
Guido van Rossum013142a1994-08-30 08:19:36 +0000757
758 if (dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000759 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000760 "format requires a mapping");
761 goto error;
762 }
763 ++fmt;
764 --fmtcnt;
765 keystart = fmt;
766 while (--fmtcnt >= 0 && *fmt != ')')
767 fmt++;
768 keylen = fmt - keystart;
769 ++fmt;
770 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 PyErr_SetString(PyExc_ValueError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000772 "incomplete format key");
773 goto error;
774 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000775 key = PyString_FromStringAndSize(keystart,
776 keylen);
Guido van Rossum013142a1994-08-30 08:19:36 +0000777 if (key == NULL)
778 goto error;
Guido van Rossum993952b1996-05-21 22:44:20 +0000779 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000780 Py_DECREF(args);
Guido van Rossum993952b1996-05-21 22:44:20 +0000781 args_owned = 0;
782 }
783 args = PyObject_GetItem(dict, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 Py_DECREF(key);
Guido van Rossum013142a1994-08-30 08:19:36 +0000785 if (args == NULL) {
786 goto error;
787 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000788 args_owned = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000789 arglen = -1;
790 argidx = -2;
791 }
Guido van Rossume5372401993-03-16 12:15:04 +0000792 while (--fmtcnt >= 0) {
793 switch (c = *fmt++) {
794 case '-': flags |= F_LJUST; continue;
795 case '+': flags |= F_SIGN; continue;
796 case ' ': flags |= F_BLANK; continue;
797 case '#': flags |= F_ALT; continue;
798 case '0': flags |= F_ZERO; continue;
799 }
800 break;
801 }
802 if (c == '*') {
803 v = getnextarg(args, arglen, &argidx);
804 if (v == NULL)
805 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 if (!PyInt_Check(v)) {
807 PyErr_SetString(PyExc_TypeError,
808 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000809 goto error;
810 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811 width = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000812 if (width < 0)
813 width = 0;
814 if (--fmtcnt >= 0)
815 c = *fmt++;
816 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000817 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000818 width = c - '0';
819 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000820 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000821 if (!isdigit(c))
822 break;
823 if ((width*10) / 10 != width) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000824 PyErr_SetString(
825 PyExc_ValueError,
826 "width too big");
Guido van Rossume5372401993-03-16 12:15:04 +0000827 goto error;
828 }
829 width = width*10 + (c - '0');
830 }
831 }
832 if (c == '.') {
833 prec = 0;
834 if (--fmtcnt >= 0)
835 c = *fmt++;
836 if (c == '*') {
837 v = getnextarg(args, arglen, &argidx);
838 if (v == NULL)
839 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840 if (!PyInt_Check(v)) {
841 PyErr_SetString(
842 PyExc_TypeError,
843 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000844 goto error;
845 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 prec = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000847 if (prec < 0)
848 prec = 0;
849 if (--fmtcnt >= 0)
850 c = *fmt++;
851 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000852 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000853 prec = c - '0';
854 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000855 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000856 if (!isdigit(c))
857 break;
858 if ((prec*10) / 10 != prec) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 PyErr_SetString(
860 PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000861 "prec too big");
862 goto error;
863 }
864 prec = prec*10 + (c - '0');
865 }
866 }
867 } /* prec */
868 if (fmtcnt >= 0) {
869 if (c == 'h' || c == 'l' || c == 'L') {
870 size = c;
871 if (--fmtcnt >= 0)
872 c = *fmt++;
873 }
874 }
875 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000876 PyErr_SetString(PyExc_ValueError,
877 "incomplete format");
Guido van Rossume5372401993-03-16 12:15:04 +0000878 goto error;
879 }
880 if (c != '%') {
881 v = getnextarg(args, arglen, &argidx);
882 if (v == NULL)
883 goto error;
884 }
885 sign = 0;
886 fill = ' ';
887 switch (c) {
888 case '%':
889 buf = "%";
890 len = 1;
891 break;
892 case 's':
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 temp = PyObject_Str(v);
Guido van Rossum013142a1994-08-30 08:19:36 +0000894 if (temp == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +0000895 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000896 buf = PyString_AsString(temp);
897 len = PyString_Size(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000898 if (prec >= 0 && len > prec)
899 len = prec;
900 break;
901 case 'i':
902 case 'd':
903 case 'u':
904 case 'o':
905 case 'x':
906 case 'X':
907 if (c == 'i')
908 c = 'd';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000909 buf = tmpbuf;
910 len = formatint(buf, flags, prec, c, v);
911 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000912 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000913 sign = (c == 'd');
Guido van Rossum4acdc231997-01-29 06:00:24 +0000914 if (flags&F_ZERO) {
Guido van Rossume5372401993-03-16 12:15:04 +0000915 fill = '0';
Guido van Rossum4acdc231997-01-29 06:00:24 +0000916 if ((flags&F_ALT) &&
917 (c == 'x' || c == 'X') &&
918 buf[0] == '0' && buf[1] == c) {
919 *res++ = *buf++;
920 *res++ = *buf++;
921 rescnt -= 2;
922 len -= 2;
923 width -= 2;
924 if (width < 0)
925 width = 0;
926 }
927 }
Guido van Rossume5372401993-03-16 12:15:04 +0000928 break;
929 case 'e':
930 case 'E':
931 case 'f':
932 case 'g':
933 case 'G':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000934 buf = tmpbuf;
935 len = formatfloat(buf, flags, prec, c, v);
936 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000937 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000938 sign = 1;
939 if (flags&F_ZERO)
940 fill = '0';
941 break;
942 case 'c':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000943 buf = tmpbuf;
944 len = formatchar(buf, v);
945 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000946 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000947 break;
948 default:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 PyErr_SetString(PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000950 "unsupported format character");
951 goto error;
952 }
953 if (sign) {
954 if (*buf == '-' || *buf == '+') {
955 sign = *buf++;
956 len--;
957 }
958 else if (flags & F_SIGN)
959 sign = '+';
960 else if (flags & F_BLANK)
961 sign = ' ';
962 else
963 sign = '\0';
964 }
965 if (width < len)
966 width = len;
967 if (rescnt < width + (sign != '\0')) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000968 reslen -= rescnt;
969 rescnt = width + fmtcnt + 100;
970 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000972 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 res = PyString_AsString(result)
974 + reslen - rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000975 }
976 if (sign) {
Guido van Rossum71e57d01993-11-11 15:03:51 +0000977 if (fill != ' ')
978 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000979 rescnt--;
980 if (width > len)
981 width--;
982 }
983 if (width > len && !(flags&F_LJUST)) {
984 do {
985 --rescnt;
986 *res++ = fill;
987 } while (--width > len);
988 }
Guido van Rossum71e57d01993-11-11 15:03:51 +0000989 if (sign && fill == ' ')
Guido van Rossum6938a291993-11-11 14:51:57 +0000990 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000991 memcpy(res, buf, len);
992 res += len;
993 rescnt -= len;
994 while (--width >= len) {
995 --rescnt;
996 *res++ = ' ';
997 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000998 if (dict && (argidx < arglen) && c != '%') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000999 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +00001000 "not all arguments converted");
1001 goto error;
1002 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 Py_XDECREF(temp);
Guido van Rossume5372401993-03-16 12:15:04 +00001004 } /* '%' */
1005 } /* until end */
Guido van Rossumcaeaafc1995-02-27 10:13:23 +00001006 if (argidx < arglen && !dict) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007 PyErr_SetString(PyExc_TypeError,
1008 "not all arguments converted");
Guido van Rossume5372401993-03-16 12:15:04 +00001009 goto error;
1010 }
Guido van Rossum993952b1996-05-21 22:44:20 +00001011 if (args_owned)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 Py_DECREF(args);
1013 _PyString_Resize(&result, reslen - rescnt);
Guido van Rossume5372401993-03-16 12:15:04 +00001014 return result;
1015 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001016 Py_DECREF(result);
Guido van Rossum993952b1996-05-21 22:44:20 +00001017 if (args_owned)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001018 Py_DECREF(args);
Guido van Rossume5372401993-03-16 12:15:04 +00001019 return NULL;
1020}
Guido van Rossum2a61e741997-01-18 07:55:05 +00001021
1022
1023#ifdef INTERN_STRINGS
1024
1025static PyObject *interned;
1026
1027void
1028PyString_InternInPlace(p)
1029 PyObject **p;
1030{
1031 register PyStringObject *s = (PyStringObject *)(*p);
1032 PyObject *t;
1033 if (s == NULL || !PyString_Check(s))
1034 Py_FatalError("PyString_InternInPlace: strings only please!");
1035 if ((t = s->ob_sinterned) != NULL) {
1036 if (t == (PyObject *)s)
1037 return;
1038 Py_INCREF(t);
1039 *p = t;
1040 Py_DECREF(s);
1041 return;
1042 }
1043 if (interned == NULL) {
1044 interned = PyDict_New();
1045 if (interned == NULL)
1046 return;
1047 /* Force slow lookups: */
1048 PyDict_SetItem(interned, Py_None, Py_None);
1049 }
1050 if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
1051 Py_INCREF(t);
1052 *p = s->ob_sinterned = t;
1053 Py_DECREF(s);
1054 return;
1055 }
1056 t = (PyObject *)s;
1057 if (PyDict_SetItem(interned, t, t) == 0) {
1058 s->ob_sinterned = t;
1059 return;
1060 }
1061 PyErr_Clear();
1062}
1063
1064
1065PyObject *
1066PyString_InternFromString(cp)
1067 const char *cp;
1068{
1069 PyObject *s = PyString_FromString(cp);
1070 if (s == NULL)
1071 return NULL;
1072 PyString_InternInPlace(&s);
1073 return s;
1074}
1075
1076#endif