blob: 1f95aa1c98db2076811b0c0bd2e9d2d7e5001553 [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 Rossumc0b618a1997-05-02 03:12:38 +0000459static PySequenceMethods string_as_sequence = {
Guido van Rossum013142a1994-08-30 08:19:36 +0000460 (inquiry)string_length, /*sq_length*/
461 (binaryfunc)string_concat, /*sq_concat*/
462 (intargfunc)string_repeat, /*sq_repeat*/
463 (intargfunc)string_item, /*sq_item*/
464 (intintargfunc)string_slice, /*sq_slice*/
Guido van Rossumf380e661991-06-04 19:36:32 +0000465 0, /*sq_ass_item*/
466 0, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467};
468
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469PyTypeObject PyString_Type = {
470 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 0,
472 "string",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 sizeof(PyStringObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474 sizeof(char),
Guido van Rossum013142a1994-08-30 08:19:36 +0000475 (destructor)string_dealloc, /*tp_dealloc*/
476 (printfunc)string_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477 0, /*tp_getattr*/
478 0, /*tp_setattr*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000479 (cmpfunc)string_compare, /*tp_compare*/
480 (reprfunc)string_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481 0, /*tp_as_number*/
482 &string_as_sequence, /*tp_as_sequence*/
483 0, /*tp_as_mapping*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000484 (hashfunc)string_hash, /*tp_hash*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000485 0, /*tp_call*/
486 0, /*tp_str*/
487 0, /*tp_getattro*/
488 0, /*tp_setattro*/
489 0, /*tp_xxx3*/
490 0, /*tp_xxx4*/
491 0, /*tp_doc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492};
493
494void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495PyString_Concat(pv, w)
496 register PyObject **pv;
497 register PyObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 register PyObject *v;
Guido van Rossum013142a1994-08-30 08:19:36 +0000500 if (*pv == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501 return;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 if (w == NULL || !PyString_Check(*pv)) {
503 Py_DECREF(*pv);
Guido van Rossum013142a1994-08-30 08:19:36 +0000504 *pv = NULL;
505 return;
506 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 v = string_concat((PyStringObject *) *pv, w);
508 Py_DECREF(*pv);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509 *pv = v;
510}
511
Guido van Rossum013142a1994-08-30 08:19:36 +0000512void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513PyString_ConcatAndDel(pv, w)
514 register PyObject **pv;
515 register PyObject *w;
Guido van Rossum013142a1994-08-30 08:19:36 +0000516{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 PyString_Concat(pv, w);
518 Py_XDECREF(w);
Guido van Rossum013142a1994-08-30 08:19:36 +0000519}
520
521
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522/* The following function breaks the notion that strings are immutable:
523 it changes the size of a string. We get away with this only if there
524 is only one module referencing the object. You can also think of it
525 as creating a new string object and destroying the old one, only
526 more efficiently. In any case, don't use this if the string may
527 already be known to some other part of the code... */
528
529int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530_PyString_Resize(pv, newsize)
531 PyObject **pv;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000532 int newsize;
533{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 register PyObject *v;
535 register PyStringObject *sv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000536 v = *pv;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 if (!PyString_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 Py_DECREF(v);
540 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000541 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542 }
Guido van Rossum921842f1990-11-18 17:30:23 +0000543 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000544#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000545 --_Py_RefTotal;
Guido van Rossum921842f1990-11-18 17:30:23 +0000546#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 _Py_ForgetReference(v);
548 *pv = (PyObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 sizeof(PyStringObject) + newsize * sizeof(char));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551 if (*pv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 PyMem_DEL(v);
553 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000554 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 _Py_NewReference(*pv);
557 sv = (PyStringObject *) *pv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000558 sv->ob_size = newsize;
559 sv->ob_sval[newsize] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560 return 0;
561}
Guido van Rossume5372401993-03-16 12:15:04 +0000562
563/* Helpers for formatstring */
564
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000566getnextarg(args, arglen, p_argidx)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000568 int arglen;
569 int *p_argidx;
570{
571 int argidx = *p_argidx;
572 if (argidx < arglen) {
573 (*p_argidx)++;
574 if (arglen < 0)
575 return args;
576 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 return PyTuple_GetItem(args, argidx);
Guido van Rossume5372401993-03-16 12:15:04 +0000578 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000579 PyErr_SetString(PyExc_TypeError,
580 "not enough arguments for format string");
Guido van Rossume5372401993-03-16 12:15:04 +0000581 return NULL;
582}
583
584#define F_LJUST (1<<0)
585#define F_SIGN (1<<1)
586#define F_BLANK (1<<2)
587#define F_ALT (1<<3)
588#define F_ZERO (1<<4)
589
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590extern double fabs Py_PROTO((double));
Guido van Rossume5372401993-03-16 12:15:04 +0000591
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000592static int
593formatfloat(buf, flags, prec, type, v)
594 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000595 int flags;
596 int prec;
597 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000599{
600 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000601 double x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 if (!PyArg_Parse(v, "d;float argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000603 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000604 if (prec < 0)
605 prec = 6;
606 if (prec > 50)
607 prec = 50; /* Arbitrary limitation */
608 if (type == 'f' && fabs(x)/1e25 >= 1e25)
609 type = 'g';
610 sprintf(fmt, "%%%s.%d%c", (flags&F_ALT) ? "#" : "", prec, type);
611 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000612 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000613}
614
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000615static int
616formatint(buf, flags, prec, type, v)
617 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000618 int flags;
619 int prec;
620 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000622{
623 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000624 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 if (!PyArg_Parse(v, "l;int argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000626 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000627 if (prec < 0)
628 prec = 1;
629 sprintf(fmt, "%%%s.%dl%c", (flags&F_ALT) ? "#" : "", prec, type);
630 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000631 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000632}
633
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000634static int
635formatchar(buf, v)
636 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000638{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 if (PyString_Check(v)) {
640 if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000641 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000642 }
643 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000645 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000646 }
647 buf[1] = '\0';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000648 return 1;
Guido van Rossume5372401993-03-16 12:15:04 +0000649}
650
Guido van Rossum013142a1994-08-30 08:19:36 +0000651
Guido van Rossume5372401993-03-16 12:15:04 +0000652/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
653
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654PyObject *
655PyString_Format(format, args)
656 PyObject *format;
657 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000658{
659 char *fmt, *res;
660 int fmtcnt, rescnt, reslen, arglen, argidx;
Guido van Rossum993952b1996-05-21 22:44:20 +0000661 int args_owned = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 PyObject *result;
663 PyObject *dict = NULL;
664 if (format == NULL || !PyString_Check(format) || args == NULL) {
665 PyErr_BadInternalCall();
Guido van Rossume5372401993-03-16 12:15:04 +0000666 return NULL;
667 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 fmt = PyString_AsString(format);
669 fmtcnt = PyString_Size(format);
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000670 reslen = rescnt = fmtcnt + 100;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671 result = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossume5372401993-03-16 12:15:04 +0000672 if (result == NULL)
673 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 res = PyString_AsString(result);
675 if (PyTuple_Check(args)) {
676 arglen = PyTuple_Size(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000677 argidx = 0;
678 }
679 else {
680 arglen = -1;
681 argidx = -2;
682 }
Guido van Rossum013142a1994-08-30 08:19:36 +0000683 if (args->ob_type->tp_as_mapping)
684 dict = args;
Guido van Rossume5372401993-03-16 12:15:04 +0000685 while (--fmtcnt >= 0) {
686 if (*fmt != '%') {
687 if (--rescnt < 0) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000688 rescnt = fmtcnt + 100;
689 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000691 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000692 res = PyString_AsString(result)
693 + reslen - rescnt;
Guido van Rossum013142a1994-08-30 08:19:36 +0000694 --rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000695 }
696 *res++ = *fmt++;
697 }
698 else {
699 /* Got a format specifier */
700 int flags = 0;
Guido van Rossume5372401993-03-16 12:15:04 +0000701 int width = -1;
702 int prec = -1;
703 int size = 0;
Guido van Rossum6938a291993-11-11 14:51:57 +0000704 int c = '\0';
Guido van Rossume5372401993-03-16 12:15:04 +0000705 int fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000706 PyObject *v = NULL;
707 PyObject *temp = NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000708 char *buf;
709 int sign;
710 int len;
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000711 char tmpbuf[120]; /* For format{float,int,char}() */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000712 fmt++;
Guido van Rossum013142a1994-08-30 08:19:36 +0000713 if (*fmt == '(') {
714 char *keystart;
715 int keylen;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716 PyObject *key;
Guido van Rossum013142a1994-08-30 08:19:36 +0000717
718 if (dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000720 "format requires a mapping");
721 goto error;
722 }
723 ++fmt;
724 --fmtcnt;
725 keystart = fmt;
726 while (--fmtcnt >= 0 && *fmt != ')')
727 fmt++;
728 keylen = fmt - keystart;
729 ++fmt;
730 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 PyErr_SetString(PyExc_ValueError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000732 "incomplete format key");
733 goto error;
734 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 key = PyString_FromStringAndSize(keystart,
736 keylen);
Guido van Rossum013142a1994-08-30 08:19:36 +0000737 if (key == NULL)
738 goto error;
Guido van Rossum993952b1996-05-21 22:44:20 +0000739 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 Py_DECREF(args);
Guido van Rossum993952b1996-05-21 22:44:20 +0000741 args_owned = 0;
742 }
743 args = PyObject_GetItem(dict, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 Py_DECREF(key);
Guido van Rossum013142a1994-08-30 08:19:36 +0000745 if (args == NULL) {
746 goto error;
747 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000748 args_owned = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000749 arglen = -1;
750 argidx = -2;
751 }
Guido van Rossume5372401993-03-16 12:15:04 +0000752 while (--fmtcnt >= 0) {
753 switch (c = *fmt++) {
754 case '-': flags |= F_LJUST; continue;
755 case '+': flags |= F_SIGN; continue;
756 case ' ': flags |= F_BLANK; continue;
757 case '#': flags |= F_ALT; continue;
758 case '0': flags |= F_ZERO; continue;
759 }
760 break;
761 }
762 if (c == '*') {
763 v = getnextarg(args, arglen, &argidx);
764 if (v == NULL)
765 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766 if (!PyInt_Check(v)) {
767 PyErr_SetString(PyExc_TypeError,
768 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000769 goto error;
770 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771 width = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000772 if (width < 0)
773 width = 0;
774 if (--fmtcnt >= 0)
775 c = *fmt++;
776 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000777 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000778 width = c - '0';
779 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000780 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000781 if (!isdigit(c))
782 break;
783 if ((width*10) / 10 != width) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000784 PyErr_SetString(
785 PyExc_ValueError,
786 "width too big");
Guido van Rossume5372401993-03-16 12:15:04 +0000787 goto error;
788 }
789 width = width*10 + (c - '0');
790 }
791 }
792 if (c == '.') {
793 prec = 0;
794 if (--fmtcnt >= 0)
795 c = *fmt++;
796 if (c == '*') {
797 v = getnextarg(args, arglen, &argidx);
798 if (v == NULL)
799 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800 if (!PyInt_Check(v)) {
801 PyErr_SetString(
802 PyExc_TypeError,
803 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000804 goto error;
805 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 prec = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000807 if (prec < 0)
808 prec = 0;
809 if (--fmtcnt >= 0)
810 c = *fmt++;
811 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000812 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000813 prec = c - '0';
814 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000815 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000816 if (!isdigit(c))
817 break;
818 if ((prec*10) / 10 != prec) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 PyErr_SetString(
820 PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000821 "prec too big");
822 goto error;
823 }
824 prec = prec*10 + (c - '0');
825 }
826 }
827 } /* prec */
828 if (fmtcnt >= 0) {
829 if (c == 'h' || c == 'l' || c == 'L') {
830 size = c;
831 if (--fmtcnt >= 0)
832 c = *fmt++;
833 }
834 }
835 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 PyErr_SetString(PyExc_ValueError,
837 "incomplete format");
Guido van Rossume5372401993-03-16 12:15:04 +0000838 goto error;
839 }
840 if (c != '%') {
841 v = getnextarg(args, arglen, &argidx);
842 if (v == NULL)
843 goto error;
844 }
845 sign = 0;
846 fill = ' ';
847 switch (c) {
848 case '%':
849 buf = "%";
850 len = 1;
851 break;
852 case 's':
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 temp = PyObject_Str(v);
Guido van Rossum013142a1994-08-30 08:19:36 +0000854 if (temp == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +0000855 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 buf = PyString_AsString(temp);
857 len = PyString_Size(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000858 if (prec >= 0 && len > prec)
859 len = prec;
860 break;
861 case 'i':
862 case 'd':
863 case 'u':
864 case 'o':
865 case 'x':
866 case 'X':
867 if (c == 'i')
868 c = 'd';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000869 buf = tmpbuf;
870 len = formatint(buf, flags, prec, c, v);
871 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000872 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000873 sign = (c == 'd');
Guido van Rossum4acdc231997-01-29 06:00:24 +0000874 if (flags&F_ZERO) {
Guido van Rossume5372401993-03-16 12:15:04 +0000875 fill = '0';
Guido van Rossum4acdc231997-01-29 06:00:24 +0000876 if ((flags&F_ALT) &&
877 (c == 'x' || c == 'X') &&
878 buf[0] == '0' && buf[1] == c) {
879 *res++ = *buf++;
880 *res++ = *buf++;
881 rescnt -= 2;
882 len -= 2;
883 width -= 2;
884 if (width < 0)
885 width = 0;
886 }
887 }
Guido van Rossume5372401993-03-16 12:15:04 +0000888 break;
889 case 'e':
890 case 'E':
891 case 'f':
892 case 'g':
893 case 'G':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000894 buf = tmpbuf;
895 len = formatfloat(buf, flags, prec, c, v);
896 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000897 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000898 sign = 1;
899 if (flags&F_ZERO)
900 fill = '0';
901 break;
902 case 'c':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000903 buf = tmpbuf;
904 len = formatchar(buf, v);
905 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000906 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000907 break;
908 default:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000909 PyErr_SetString(PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000910 "unsupported format character");
911 goto error;
912 }
913 if (sign) {
914 if (*buf == '-' || *buf == '+') {
915 sign = *buf++;
916 len--;
917 }
918 else if (flags & F_SIGN)
919 sign = '+';
920 else if (flags & F_BLANK)
921 sign = ' ';
922 else
923 sign = '\0';
924 }
925 if (width < len)
926 width = len;
927 if (rescnt < width + (sign != '\0')) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000928 reslen -= rescnt;
929 rescnt = width + fmtcnt + 100;
930 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000932 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 res = PyString_AsString(result)
934 + reslen - rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000935 }
936 if (sign) {
Guido van Rossum71e57d01993-11-11 15:03:51 +0000937 if (fill != ' ')
938 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000939 rescnt--;
940 if (width > len)
941 width--;
942 }
943 if (width > len && !(flags&F_LJUST)) {
944 do {
945 --rescnt;
946 *res++ = fill;
947 } while (--width > len);
948 }
Guido van Rossum71e57d01993-11-11 15:03:51 +0000949 if (sign && fill == ' ')
Guido van Rossum6938a291993-11-11 14:51:57 +0000950 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000951 memcpy(res, buf, len);
952 res += len;
953 rescnt -= len;
954 while (--width >= len) {
955 --rescnt;
956 *res++ = ' ';
957 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000958 if (dict && (argidx < arglen) && c != '%') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000960 "not all arguments converted");
961 goto error;
962 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 Py_XDECREF(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000964 } /* '%' */
965 } /* until end */
Guido van Rossumcaeaafc1995-02-27 10:13:23 +0000966 if (argidx < arglen && !dict) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 PyErr_SetString(PyExc_TypeError,
968 "not all arguments converted");
Guido van Rossume5372401993-03-16 12:15:04 +0000969 goto error;
970 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000971 if (args_owned)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 Py_DECREF(args);
973 _PyString_Resize(&result, reslen - rescnt);
Guido van Rossume5372401993-03-16 12:15:04 +0000974 return result;
975 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 Py_DECREF(result);
Guido van Rossum993952b1996-05-21 22:44:20 +0000977 if (args_owned)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000978 Py_DECREF(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000979 return NULL;
980}
Guido van Rossum2a61e741997-01-18 07:55:05 +0000981
982
983#ifdef INTERN_STRINGS
984
985static PyObject *interned;
986
987void
988PyString_InternInPlace(p)
989 PyObject **p;
990{
991 register PyStringObject *s = (PyStringObject *)(*p);
992 PyObject *t;
993 if (s == NULL || !PyString_Check(s))
994 Py_FatalError("PyString_InternInPlace: strings only please!");
995 if ((t = s->ob_sinterned) != NULL) {
996 if (t == (PyObject *)s)
997 return;
998 Py_INCREF(t);
999 *p = t;
1000 Py_DECREF(s);
1001 return;
1002 }
1003 if (interned == NULL) {
1004 interned = PyDict_New();
1005 if (interned == NULL)
1006 return;
1007 /* Force slow lookups: */
1008 PyDict_SetItem(interned, Py_None, Py_None);
1009 }
1010 if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
1011 Py_INCREF(t);
1012 *p = s->ob_sinterned = t;
1013 Py_DECREF(s);
1014 return;
1015 }
1016 t = (PyObject *)s;
1017 if (PyDict_SetItem(interned, t, t) == 0) {
1018 s->ob_sinterned = t;
1019 return;
1020 }
1021 PyErr_Clear();
1022}
1023
1024
1025PyObject *
1026PyString_InternFromString(cp)
1027 const char *cp;
1028{
1029 PyObject *s = PyString_FromString(cp);
1030 if (s == NULL)
1031 return NULL;
1032 PyString_InternInPlace(&s);
1033 return s;
1034}
1035
1036#endif