blob: eecb0060b582ed76bfc5e3f2266f7203858c5e53 [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 Rossum71160aa1997-06-03 18:03:18 +000036#include "mymath.h"
Guido van Rossum013142a1994-08-30 08:19:36 +000037#include <ctype.h>
38
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000039#ifdef COUNT_ALLOCS
40int null_strings, one_strings;
41#endif
42
Guido van Rossum03093a21994-09-28 15:51:32 +000043#ifdef HAVE_LIMITS_H
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000044#include <limits.h>
45#else
46#ifndef UCHAR_MAX
47#define UCHAR_MAX 255
48#endif
49#endif
50
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051static PyStringObject *characters[UCHAR_MAX + 1];
Sjoerd Mullender615194a1993-11-01 13:46:50 +000052#ifndef DONT_SHARE_SHORT_STRINGS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000053static PyStringObject *nullstring;
Sjoerd Mullender615194a1993-11-01 13:46:50 +000054#endif
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000055
56/*
57 Newsizedstringobject() and newstringobject() try in certain cases
58 to share string objects. When the size of the string is zero,
59 these routines always return a pointer to the same string object;
60 when the size is one, they return a pointer to an already existing
61 object if the contents of the string is known. For
62 newstringobject() this is always the case, for
63 newsizedstringobject() this is the case when the first argument in
64 not NULL.
65 A common practice to allocate a string and then fill it in or
66 change it must be done carefully. It is only allowed to change the
67 contents of the string if the obect was gotten from
68 newsizedstringobject() with a NULL first argument, because in the
69 future these routines may try to do even more sharing of objects.
70*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000071PyObject *
72PyString_FromStringAndSize(str, size)
Guido van Rossum067998f1996-12-10 15:33:34 +000073 const char *str;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 int size;
75{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 register PyStringObject *op;
Sjoerd Mullender615194a1993-11-01 13:46:50 +000077#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000078 if (size == 0 && (op = nullstring) != NULL) {
79#ifdef COUNT_ALLOCS
80 null_strings++;
81#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 Py_INCREF(op);
83 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000084 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 if (size == 1 && str != NULL &&
86 (op = characters[*str & UCHAR_MAX]) != NULL)
87 {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000088#ifdef COUNT_ALLOCS
89 one_strings++;
90#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 Py_INCREF(op);
92 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000093 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +000094#endif /* DONT_SHARE_SHORT_STRINGS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 op = (PyStringObject *)
96 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +000097 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 return PyErr_NoMemory();
99 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000100 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000101#ifdef CACHE_HASH
102 op->ob_shash = -1;
103#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000104#ifdef INTERN_STRINGS
105 op->ob_sinterned = NULL;
106#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000108 if (str != NULL)
109 memcpy(op->ob_sval, str, size);
110 op->ob_sval[size] = '\0';
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000111#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000112 if (size == 0) {
113 nullstring = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000115 } else if (size == 1 && str != NULL) {
116 characters[*str & UCHAR_MAX] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000118 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000119#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123PyObject *
124PyString_FromString(str)
Guido van Rossum067998f1996-12-10 15:33:34 +0000125 const char *str;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126{
127 register unsigned int size = strlen(str);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 register PyStringObject *op;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000129#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000130 if (size == 0 && (op = nullstring) != NULL) {
131#ifdef COUNT_ALLOCS
132 null_strings++;
133#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 Py_INCREF(op);
135 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000136 }
137 if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
138#ifdef COUNT_ALLOCS
139 one_strings++;
140#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 Py_INCREF(op);
142 return (PyObject *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000143 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000144#endif /* DONT_SHARE_SHORT_STRINGS */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 op = (PyStringObject *)
146 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000147 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 return PyErr_NoMemory();
149 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000150 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000151#ifdef CACHE_HASH
152 op->ob_shash = -1;
153#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000154#ifdef INTERN_STRINGS
155 op->ob_sinterned = NULL;
156#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000158 strcpy(op->ob_sval, str);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000159#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000160 if (size == 0) {
161 nullstring = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000163 } else if (size == 1) {
164 characters[*str & UCHAR_MAX] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 Py_INCREF(op);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000166 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000167#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169}
170
Guido van Rossum234f9421993-06-17 12:35:49 +0000171static void
Guido van Rossume5372401993-03-16 12:15:04 +0000172string_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 PyObject *op;
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000174{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 PyMem_DEL(op);
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000176}
177
Guido van Rossumd7047b31995-01-02 19:07:15 +0000178int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179PyString_Size(op)
180 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 if (!PyString_Check(op)) {
183 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184 return -1;
185 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 return ((PyStringObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187}
188
189/*const*/ char *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190PyString_AsString(op)
191 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 if (!PyString_Check(op)) {
194 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 return NULL;
196 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 return ((PyStringObject *)op) -> ob_sval;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198}
199
200/* Methods */
201
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000202static int
Guido van Rossume5372401993-03-16 12:15:04 +0000203string_print(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyStringObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 FILE *fp;
206 int flags;
207{
208 int i;
209 char c;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000210 int quote;
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000211 /* XXX Ought to check for interrupts when writing long strings */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 if (flags & Py_PRINT_RAW) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213 fwrite(op->ob_sval, 1, (int) op->ob_size, fp);
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000214 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000216
217 /* figure out which quote to use; single is prefered */
218 quote = '\'';
219 if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
220 quote = '"';
221
222 fputc(quote, fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 for (i = 0; i < op->ob_size; i++) {
224 c = op->ob_sval[i];
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000225 if (c == quote || c == '\\')
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226 fprintf(fp, "\\%c", c);
227 else if (c < ' ' || c >= 0177)
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000228 fprintf(fp, "\\%03o", c & 0377);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 else
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000230 fputc(c, fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000232 fputc(quote, fp);
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000233 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234}
235
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000237string_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 register PyStringObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239{
240 /* XXX overflow? */
241 int newsize = 2 + 4 * op->ob_size * sizeof(char);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 PyObject *v = PyString_FromStringAndSize((char *)NULL, newsize);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 if (v == NULL) {
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000244 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 }
246 else {
247 register int i;
248 register char c;
249 register char *p;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000250 int quote;
251
252 /* figure out which quote to use; single is prefered */
253 quote = '\'';
254 if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
255 quote = '"';
256
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 p = ((PyStringObject *)v)->ob_sval;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000258 *p++ = quote;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259 for (i = 0; i < op->ob_size; i++) {
260 c = op->ob_sval[i];
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000261 if (c == quote || c == '\\')
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262 *p++ = '\\', *p++ = c;
263 else if (c < ' ' || c >= 0177) {
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000264 sprintf(p, "\\%03o", c & 0377);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265 while (*p != '\0')
266 p++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267 }
268 else
269 *p++ = c;
270 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000271 *p++ = quote;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 *p = '\0';
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 _PyString_Resize(
274 &v, (int) (p - ((PyStringObject *)v)->ob_sval));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000275 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277}
278
279static int
Guido van Rossume5372401993-03-16 12:15:04 +0000280string_length(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282{
283 return a->ob_size;
284}
285
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000287string_concat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 register PyStringObject *a;
289 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290{
291 register unsigned int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 register PyStringObject *op;
293 if (!PyString_Check(bb)) {
294 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 return NULL;
296 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297#define b ((PyStringObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298 /* Optimize cases with empty left or right operand */
299 if (a->ob_size == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 Py_INCREF(bb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301 return bb;
302 }
303 if (b->ob_size == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 Py_INCREF(a);
305 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306 }
307 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 op = (PyStringObject *)
309 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000310 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 return PyErr_NoMemory();
312 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000313 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000314#ifdef CACHE_HASH
315 op->ob_shash = -1;
316#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000317#ifdef INTERN_STRINGS
318 op->ob_sinterned = NULL;
319#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000321 memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size);
322 memcpy(op->ob_sval + a->ob_size, b->ob_sval, (int) b->ob_size);
323 op->ob_sval[size] = '\0';
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325#undef b
326}
327
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000329string_repeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 register PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 register int n;
332{
333 register int i;
Guido van Rossum2095d241997-04-09 19:41:24 +0000334 register int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 register PyStringObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 if (n < 0)
337 n = 0;
338 size = a->ob_size * n;
339 if (size == a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 Py_INCREF(a);
341 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 op = (PyStringObject *)
344 malloc(sizeof(PyStringObject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000345 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 return PyErr_NoMemory();
347 op->ob_type = &PyString_Type;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000348 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000349#ifdef CACHE_HASH
350 op->ob_shash = -1;
351#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000352#ifdef INTERN_STRINGS
353 op->ob_sinterned = NULL;
354#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 _Py_NewReference(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000356 for (i = 0; i < size; i += a->ob_size)
357 memcpy(op->ob_sval+i, a->ob_sval, (int) a->ob_size);
358 op->ob_sval[size] = '\0';
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360}
361
362/* String slice a[i:j] consists of characters a[i] ... a[j-1] */
363
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000365string_slice(a, i, j)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 register PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367 register int i, j; /* May be negative! */
368{
369 if (i < 0)
370 i = 0;
371 if (j < 0)
372 j = 0; /* Avoid signed/unsigned bug in next line */
373 if (j > a->ob_size)
374 j = a->ob_size;
375 if (i == 0 && j == a->ob_size) { /* It's the same as a */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 Py_INCREF(a);
377 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378 }
379 if (j < i)
380 j = i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 return PyString_FromStringAndSize(a->ob_sval + i, (int) (j-i));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382}
383
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000385string_item(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 PyStringObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 register int i;
388{
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000389 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyErr_SetString(PyExc_IndexError, "string index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 return NULL;
394 }
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000395 c = a->ob_sval[i] & UCHAR_MAX;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 v = (PyObject *) characters[c];
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000397#ifdef COUNT_ALLOCS
398 if (v != NULL)
399 one_strings++;
400#endif
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000401 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 v = PyString_FromStringAndSize((char *)NULL, 1);
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000403 if (v == NULL)
404 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 characters[c] = (PyStringObject *) v;
406 ((PyStringObject *)v)->ob_sval[0] = c;
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000407 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408 Py_INCREF(v);
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000409 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410}
411
412static int
Guido van Rossume5372401993-03-16 12:15:04 +0000413string_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 PyStringObject *a, *b;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415{
Guido van Rossum253919f1991-02-13 23:18:39 +0000416 int len_a = a->ob_size, len_b = b->ob_size;
417 int min_len = (len_a < len_b) ? len_a : len_b;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000418 int cmp;
419 if (min_len > 0) {
Guido van Rossumfde7a751996-10-23 14:19:40 +0000420 cmp = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000421 if (cmp == 0)
422 cmp = memcmp(a->ob_sval, b->ob_sval, min_len);
423 if (cmp != 0)
424 return cmp;
425 }
Guido van Rossum253919f1991-02-13 23:18:39 +0000426 return (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427}
428
Guido van Rossum9bfef441993-03-29 10:43:31 +0000429static long
430string_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 PyStringObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000432{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000433 register int len;
434 register unsigned char *p;
435 register long x;
436
437#ifdef CACHE_HASH
438 if (a->ob_shash != -1)
439 return a->ob_shash;
Guido van Rossum36b9f791997-02-14 16:29:22 +0000440#ifdef INTERN_STRINGS
441 if (a->ob_sinterned != NULL)
442 return (a->ob_shash =
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 ((PyStringObject *)(a->ob_sinterned))->ob_shash);
Guido van Rossum36b9f791997-02-14 16:29:22 +0000444#endif
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000445#endif
446 len = a->ob_size;
447 p = (unsigned char *) a->ob_sval;
448 x = *p << 7;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000449 while (--len >= 0)
Guido van Rossumeddcb3b1996-09-11 20:22:48 +0000450 x = (1000003*x) ^ *p++;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000451 x ^= a->ob_size;
452 if (x == -1)
453 x = -2;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000454#ifdef CACHE_HASH
455 a->ob_shash = x;
456#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +0000457 return x;
458}
459
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000460static int
461string_buffer_getreadbuf(self, index, ptr)
462 PyStringObject *self;
463 int index;
464 const void **ptr;
465{
466 if ( index != 0 ) {
Guido van Rossum045e6881997-09-08 18:30:11 +0000467 PyErr_SetString(PyExc_SystemError,
Guido van Rossum1db70701998-10-08 02:18:52 +0000468 "accessing non-existent string segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000469 return -1;
470 }
471 *ptr = (void *)self->ob_sval;
472 return self->ob_size;
473}
474
475static int
476string_buffer_getwritebuf(self, index, ptr)
477 PyStringObject *self;
478 int index;
479 const void **ptr;
480{
Guido van Rossum045e6881997-09-08 18:30:11 +0000481 PyErr_SetString(PyExc_TypeError,
Guido van Rossum07d78001998-10-01 15:59:48 +0000482 "Cannot use string as modifiable buffer");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000483 return -1;
484}
485
486static int
487string_buffer_getsegcount(self, lenp)
488 PyStringObject *self;
489 int *lenp;
490{
491 if ( lenp )
492 *lenp = self->ob_size;
493 return 1;
494}
495
Guido van Rossum1db70701998-10-08 02:18:52 +0000496static int
497string_buffer_getcharbuf(self, index, ptr)
498 PyStringObject *self;
499 int index;
500 const char **ptr;
501{
502 if ( index != 0 ) {
503 PyErr_SetString(PyExc_SystemError,
504 "accessing non-existent string segment");
505 return -1;
506 }
507 *ptr = self->ob_sval;
508 return self->ob_size;
509}
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PySequenceMethods string_as_sequence = {
Guido van Rossum013142a1994-08-30 08:19:36 +0000512 (inquiry)string_length, /*sq_length*/
513 (binaryfunc)string_concat, /*sq_concat*/
514 (intargfunc)string_repeat, /*sq_repeat*/
515 (intargfunc)string_item, /*sq_item*/
516 (intintargfunc)string_slice, /*sq_slice*/
Guido van Rossumf380e661991-06-04 19:36:32 +0000517 0, /*sq_ass_item*/
518 0, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519};
520
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000521static PyBufferProcs string_as_buffer = {
522 (getreadbufferproc)string_buffer_getreadbuf,
523 (getwritebufferproc)string_buffer_getwritebuf,
524 (getsegcountproc)string_buffer_getsegcount,
Guido van Rossum1db70701998-10-08 02:18:52 +0000525 (getcharbufferproc)string_buffer_getcharbuf,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000526};
527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528PyTypeObject PyString_Type = {
529 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530 0,
531 "string",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 sizeof(PyStringObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533 sizeof(char),
Guido van Rossum013142a1994-08-30 08:19:36 +0000534 (destructor)string_dealloc, /*tp_dealloc*/
535 (printfunc)string_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000536 0, /*tp_getattr*/
537 0, /*tp_setattr*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000538 (cmpfunc)string_compare, /*tp_compare*/
539 (reprfunc)string_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540 0, /*tp_as_number*/
541 &string_as_sequence, /*tp_as_sequence*/
542 0, /*tp_as_mapping*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000543 (hashfunc)string_hash, /*tp_hash*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000544 0, /*tp_call*/
545 0, /*tp_str*/
546 0, /*tp_getattro*/
547 0, /*tp_setattro*/
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000548 &string_as_buffer, /*tp_as_buffer*/
Guido van Rossum1db70701998-10-08 02:18:52 +0000549 Py_TPFLAGS_DEFAULT, /*tp_flags*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000550 0, /*tp_doc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551};
552
553void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554PyString_Concat(pv, w)
555 register PyObject **pv;
556 register PyObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 register PyObject *v;
Guido van Rossum013142a1994-08-30 08:19:36 +0000559 if (*pv == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560 return;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 if (w == NULL || !PyString_Check(*pv)) {
562 Py_DECREF(*pv);
Guido van Rossum013142a1994-08-30 08:19:36 +0000563 *pv = NULL;
564 return;
565 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 v = string_concat((PyStringObject *) *pv, w);
567 Py_DECREF(*pv);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568 *pv = v;
569}
570
Guido van Rossum013142a1994-08-30 08:19:36 +0000571void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572PyString_ConcatAndDel(pv, w)
573 register PyObject **pv;
574 register PyObject *w;
Guido van Rossum013142a1994-08-30 08:19:36 +0000575{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000576 PyString_Concat(pv, w);
577 Py_XDECREF(w);
Guido van Rossum013142a1994-08-30 08:19:36 +0000578}
579
580
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581/* The following function breaks the notion that strings are immutable:
582 it changes the size of a string. We get away with this only if there
583 is only one module referencing the object. You can also think of it
584 as creating a new string object and destroying the old one, only
585 more efficiently. In any case, don't use this if the string may
586 already be known to some other part of the code... */
587
588int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589_PyString_Resize(pv, newsize)
590 PyObject **pv;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000591 int newsize;
592{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 register PyObject *v;
594 register PyStringObject *sv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000595 v = *pv;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 if (!PyString_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 Py_DECREF(v);
599 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000600 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601 }
Guido van Rossum921842f1990-11-18 17:30:23 +0000602 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000603#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000604 --_Py_RefTotal;
Guido van Rossum921842f1990-11-18 17:30:23 +0000605#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 _Py_ForgetReference(v);
607 *pv = (PyObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000608 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 sizeof(PyStringObject) + newsize * sizeof(char));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000610 if (*pv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 PyMem_DEL(v);
612 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000613 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 _Py_NewReference(*pv);
616 sv = (PyStringObject *) *pv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000617 sv->ob_size = newsize;
618 sv->ob_sval[newsize] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619 return 0;
620}
Guido van Rossume5372401993-03-16 12:15:04 +0000621
622/* Helpers for formatstring */
623
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000625getnextarg(args, arglen, p_argidx)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000627 int arglen;
628 int *p_argidx;
629{
630 int argidx = *p_argidx;
631 if (argidx < arglen) {
632 (*p_argidx)++;
633 if (arglen < 0)
634 return args;
635 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 return PyTuple_GetItem(args, argidx);
Guido van Rossume5372401993-03-16 12:15:04 +0000637 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 PyErr_SetString(PyExc_TypeError,
639 "not enough arguments for format string");
Guido van Rossume5372401993-03-16 12:15:04 +0000640 return NULL;
641}
642
643#define F_LJUST (1<<0)
644#define F_SIGN (1<<1)
645#define F_BLANK (1<<2)
646#define F_ALT (1<<3)
647#define F_ZERO (1<<4)
648
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000649static int
650formatfloat(buf, flags, prec, type, v)
651 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000652 int flags;
653 int prec;
654 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000656{
657 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000658 double x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 if (!PyArg_Parse(v, "d;float argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000660 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000661 if (prec < 0)
662 prec = 6;
663 if (prec > 50)
664 prec = 50; /* Arbitrary limitation */
665 if (type == 'f' && fabs(x)/1e25 >= 1e25)
666 type = 'g';
667 sprintf(fmt, "%%%s.%d%c", (flags&F_ALT) ? "#" : "", prec, type);
668 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000669 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000670}
671
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000672static int
673formatint(buf, flags, prec, type, v)
674 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000675 int flags;
676 int prec;
677 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000679{
680 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000681 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682 if (!PyArg_Parse(v, "l;int argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000683 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000684 if (prec < 0)
685 prec = 1;
686 sprintf(fmt, "%%%s.%dl%c", (flags&F_ALT) ? "#" : "", prec, type);
687 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000688 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000689}
690
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000691static int
692formatchar(buf, v)
693 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000694 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000695{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 if (PyString_Check(v)) {
697 if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000698 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000699 }
700 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000702 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000703 }
704 buf[1] = '\0';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000705 return 1;
Guido van Rossume5372401993-03-16 12:15:04 +0000706}
707
Guido van Rossum013142a1994-08-30 08:19:36 +0000708
Guido van Rossume5372401993-03-16 12:15:04 +0000709/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
710
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711PyObject *
712PyString_Format(format, args)
713 PyObject *format;
714 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000715{
716 char *fmt, *res;
717 int fmtcnt, rescnt, reslen, arglen, argidx;
Guido van Rossum993952b1996-05-21 22:44:20 +0000718 int args_owned = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 PyObject *result;
720 PyObject *dict = NULL;
721 if (format == NULL || !PyString_Check(format) || args == NULL) {
722 PyErr_BadInternalCall();
Guido van Rossume5372401993-03-16 12:15:04 +0000723 return NULL;
724 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 fmt = PyString_AsString(format);
726 fmtcnt = PyString_Size(format);
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000727 reslen = rescnt = fmtcnt + 100;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 result = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossume5372401993-03-16 12:15:04 +0000729 if (result == NULL)
730 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 res = PyString_AsString(result);
732 if (PyTuple_Check(args)) {
733 arglen = PyTuple_Size(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000734 argidx = 0;
735 }
736 else {
737 arglen = -1;
738 argidx = -2;
739 }
Guido van Rossum013142a1994-08-30 08:19:36 +0000740 if (args->ob_type->tp_as_mapping)
741 dict = args;
Guido van Rossume5372401993-03-16 12:15:04 +0000742 while (--fmtcnt >= 0) {
743 if (*fmt != '%') {
744 if (--rescnt < 0) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000745 rescnt = fmtcnt + 100;
746 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000748 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 res = PyString_AsString(result)
750 + reslen - rescnt;
Guido van Rossum013142a1994-08-30 08:19:36 +0000751 --rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000752 }
753 *res++ = *fmt++;
754 }
755 else {
756 /* Got a format specifier */
757 int flags = 0;
Guido van Rossume5372401993-03-16 12:15:04 +0000758 int width = -1;
759 int prec = -1;
760 int size = 0;
Guido van Rossum6938a291993-11-11 14:51:57 +0000761 int c = '\0';
Guido van Rossume5372401993-03-16 12:15:04 +0000762 int fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000763 PyObject *v = NULL;
764 PyObject *temp = NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000765 char *buf;
766 int sign;
767 int len;
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000768 char tmpbuf[120]; /* For format{float,int,char}() */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000769 fmt++;
Guido van Rossum013142a1994-08-30 08:19:36 +0000770 if (*fmt == '(') {
771 char *keystart;
772 int keylen;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773 PyObject *key;
Guido van Rossum045e6881997-09-08 18:30:11 +0000774 int pcount = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000775
776 if (dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000778 "format requires a mapping");
779 goto error;
780 }
781 ++fmt;
782 --fmtcnt;
783 keystart = fmt;
Guido van Rossum045e6881997-09-08 18:30:11 +0000784 /* Skip over balanced parentheses */
785 while (pcount > 0 && --fmtcnt >= 0) {
786 if (*fmt == ')')
787 --pcount;
788 else if (*fmt == '(')
789 ++pcount;
Guido van Rossum013142a1994-08-30 08:19:36 +0000790 fmt++;
Guido van Rossum045e6881997-09-08 18:30:11 +0000791 }
792 keylen = fmt - keystart - 1;
793 if (fmtcnt < 0 || pcount > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000794 PyErr_SetString(PyExc_ValueError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000795 "incomplete format key");
796 goto error;
797 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 key = PyString_FromStringAndSize(keystart,
799 keylen);
Guido van Rossum013142a1994-08-30 08:19:36 +0000800 if (key == NULL)
801 goto error;
Guido van Rossum993952b1996-05-21 22:44:20 +0000802 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 Py_DECREF(args);
Guido van Rossum993952b1996-05-21 22:44:20 +0000804 args_owned = 0;
805 }
806 args = PyObject_GetItem(dict, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807 Py_DECREF(key);
Guido van Rossum013142a1994-08-30 08:19:36 +0000808 if (args == NULL) {
809 goto error;
810 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000811 args_owned = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000812 arglen = -1;
813 argidx = -2;
814 }
Guido van Rossume5372401993-03-16 12:15:04 +0000815 while (--fmtcnt >= 0) {
816 switch (c = *fmt++) {
817 case '-': flags |= F_LJUST; continue;
818 case '+': flags |= F_SIGN; continue;
819 case ' ': flags |= F_BLANK; continue;
820 case '#': flags |= F_ALT; continue;
821 case '0': flags |= F_ZERO; continue;
822 }
823 break;
824 }
825 if (c == '*') {
826 v = getnextarg(args, arglen, &argidx);
827 if (v == NULL)
828 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 if (!PyInt_Check(v)) {
830 PyErr_SetString(PyExc_TypeError,
831 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000832 goto error;
833 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000834 width = PyInt_AsLong(v);
Guido van Rossum98c9eba1999-06-07 15:12:32 +0000835 if (width < 0) {
836 flags |= F_LJUST;
837 width = -width;
838 }
Guido van Rossume5372401993-03-16 12:15:04 +0000839 if (--fmtcnt >= 0)
840 c = *fmt++;
841 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000842 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000843 width = c - '0';
844 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000845 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000846 if (!isdigit(c))
847 break;
848 if ((width*10) / 10 != width) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 PyErr_SetString(
850 PyExc_ValueError,
851 "width too big");
Guido van Rossume5372401993-03-16 12:15:04 +0000852 goto error;
853 }
854 width = width*10 + (c - '0');
855 }
856 }
857 if (c == '.') {
858 prec = 0;
859 if (--fmtcnt >= 0)
860 c = *fmt++;
861 if (c == '*') {
862 v = getnextarg(args, arglen, &argidx);
863 if (v == NULL)
864 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 if (!PyInt_Check(v)) {
866 PyErr_SetString(
867 PyExc_TypeError,
868 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000869 goto error;
870 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000871 prec = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000872 if (prec < 0)
873 prec = 0;
874 if (--fmtcnt >= 0)
875 c = *fmt++;
876 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000877 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000878 prec = c - '0';
879 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000880 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000881 if (!isdigit(c))
882 break;
883 if ((prec*10) / 10 != prec) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000884 PyErr_SetString(
885 PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000886 "prec too big");
887 goto error;
888 }
889 prec = prec*10 + (c - '0');
890 }
891 }
892 } /* prec */
893 if (fmtcnt >= 0) {
894 if (c == 'h' || c == 'l' || c == 'L') {
895 size = c;
896 if (--fmtcnt >= 0)
897 c = *fmt++;
898 }
899 }
900 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000901 PyErr_SetString(PyExc_ValueError,
902 "incomplete format");
Guido van Rossume5372401993-03-16 12:15:04 +0000903 goto error;
904 }
905 if (c != '%') {
906 v = getnextarg(args, arglen, &argidx);
907 if (v == NULL)
908 goto error;
909 }
910 sign = 0;
911 fill = ' ';
912 switch (c) {
913 case '%':
914 buf = "%";
915 len = 1;
916 break;
917 case 's':
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 temp = PyObject_Str(v);
Guido van Rossum013142a1994-08-30 08:19:36 +0000919 if (temp == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +0000920 goto error;
Guido van Rossum4a0144c1998-06-09 15:08:41 +0000921 if (!PyString_Check(temp)) {
922 PyErr_SetString(PyExc_TypeError,
923 "%s argument has non-string str()");
924 goto error;
925 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 buf = PyString_AsString(temp);
927 len = PyString_Size(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000928 if (prec >= 0 && len > prec)
929 len = prec;
930 break;
931 case 'i':
932 case 'd':
933 case 'u':
934 case 'o':
935 case 'x':
936 case 'X':
937 if (c == 'i')
938 c = 'd';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000939 buf = tmpbuf;
940 len = formatint(buf, flags, prec, c, v);
941 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000942 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000943 sign = (c == 'd');
Guido van Rossum4acdc231997-01-29 06:00:24 +0000944 if (flags&F_ZERO) {
Guido van Rossume5372401993-03-16 12:15:04 +0000945 fill = '0';
Guido van Rossum4acdc231997-01-29 06:00:24 +0000946 if ((flags&F_ALT) &&
947 (c == 'x' || c == 'X') &&
948 buf[0] == '0' && buf[1] == c) {
949 *res++ = *buf++;
950 *res++ = *buf++;
951 rescnt -= 2;
952 len -= 2;
953 width -= 2;
954 if (width < 0)
955 width = 0;
956 }
957 }
Guido van Rossume5372401993-03-16 12:15:04 +0000958 break;
959 case 'e':
960 case 'E':
961 case 'f':
962 case 'g':
963 case 'G':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000964 buf = tmpbuf;
965 len = formatfloat(buf, flags, prec, c, v);
966 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000967 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000968 sign = 1;
969 if (flags&F_ZERO)
970 fill = '0';
971 break;
972 case 'c':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000973 buf = tmpbuf;
974 len = formatchar(buf, v);
975 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000976 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000977 break;
978 default:
Guido van Rossum045e6881997-09-08 18:30:11 +0000979 PyErr_Format(PyExc_ValueError,
980 "unsupported format character '%c' (0x%x)",
981 c, c);
Guido van Rossume5372401993-03-16 12:15:04 +0000982 goto error;
983 }
984 if (sign) {
985 if (*buf == '-' || *buf == '+') {
986 sign = *buf++;
987 len--;
988 }
989 else if (flags & F_SIGN)
990 sign = '+';
991 else if (flags & F_BLANK)
992 sign = ' ';
993 else
994 sign = '\0';
995 }
996 if (width < len)
997 width = len;
998 if (rescnt < width + (sign != '\0')) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000999 reslen -= rescnt;
1000 rescnt = width + fmtcnt + 100;
1001 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +00001003 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001004 res = PyString_AsString(result)
1005 + reslen - rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +00001006 }
1007 if (sign) {
Guido van Rossum71e57d01993-11-11 15:03:51 +00001008 if (fill != ' ')
1009 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +00001010 rescnt--;
1011 if (width > len)
1012 width--;
1013 }
1014 if (width > len && !(flags&F_LJUST)) {
1015 do {
1016 --rescnt;
1017 *res++ = fill;
1018 } while (--width > len);
1019 }
Guido van Rossum71e57d01993-11-11 15:03:51 +00001020 if (sign && fill == ' ')
Guido van Rossum6938a291993-11-11 14:51:57 +00001021 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +00001022 memcpy(res, buf, len);
1023 res += len;
1024 rescnt -= len;
1025 while (--width >= len) {
1026 --rescnt;
1027 *res++ = ' ';
1028 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001029 if (dict && (argidx < arglen) && c != '%') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +00001031 "not all arguments converted");
1032 goto error;
1033 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034 Py_XDECREF(temp);
Guido van Rossume5372401993-03-16 12:15:04 +00001035 } /* '%' */
1036 } /* until end */
Guido van Rossumcaeaafc1995-02-27 10:13:23 +00001037 if (argidx < arglen && !dict) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038 PyErr_SetString(PyExc_TypeError,
1039 "not all arguments converted");
Guido van Rossume5372401993-03-16 12:15:04 +00001040 goto error;
1041 }
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001042 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 Py_DECREF(args);
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001044 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045 _PyString_Resize(&result, reslen - rescnt);
Guido van Rossume5372401993-03-16 12:15:04 +00001046 return result;
1047 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001048 Py_DECREF(result);
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001049 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 Py_DECREF(args);
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001051 }
Guido van Rossume5372401993-03-16 12:15:04 +00001052 return NULL;
1053}
Guido van Rossum2a61e741997-01-18 07:55:05 +00001054
1055
1056#ifdef INTERN_STRINGS
1057
1058static PyObject *interned;
1059
1060void
1061PyString_InternInPlace(p)
1062 PyObject **p;
1063{
1064 register PyStringObject *s = (PyStringObject *)(*p);
1065 PyObject *t;
1066 if (s == NULL || !PyString_Check(s))
1067 Py_FatalError("PyString_InternInPlace: strings only please!");
1068 if ((t = s->ob_sinterned) != NULL) {
1069 if (t == (PyObject *)s)
1070 return;
1071 Py_INCREF(t);
1072 *p = t;
1073 Py_DECREF(s);
1074 return;
1075 }
1076 if (interned == NULL) {
1077 interned = PyDict_New();
1078 if (interned == NULL)
1079 return;
Guido van Rossum2a61e741997-01-18 07:55:05 +00001080 }
1081 if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
1082 Py_INCREF(t);
1083 *p = s->ob_sinterned = t;
1084 Py_DECREF(s);
1085 return;
1086 }
1087 t = (PyObject *)s;
1088 if (PyDict_SetItem(interned, t, t) == 0) {
1089 s->ob_sinterned = t;
1090 return;
1091 }
1092 PyErr_Clear();
1093}
1094
1095
1096PyObject *
1097PyString_InternFromString(cp)
1098 const char *cp;
1099{
1100 PyObject *s = PyString_FromString(cp);
1101 if (s == NULL)
1102 return NULL;
1103 PyString_InternInPlace(&s);
1104 return s;
1105}
1106
1107#endif
Guido van Rossum8cf04761997-08-02 02:57:45 +00001108
1109void
1110PyString_Fini()
1111{
1112 int i;
Guido van Rossum8cf04761997-08-02 02:57:45 +00001113 for (i = 0; i < UCHAR_MAX + 1; i++) {
1114 Py_XDECREF(characters[i]);
1115 characters[i] = NULL;
1116 }
1117#ifndef DONT_SHARE_SHORT_STRINGS
1118 Py_XDECREF(nullstring);
1119 nullstring = NULL;
1120#endif
Guido van Rossum971a7aa1997-08-05 02:15:12 +00001121#ifdef INTERN_STRINGS
1122 if (interned) {
1123 int pos, changed;
1124 PyObject *key, *value;
1125 do {
1126 changed = 0;
1127 pos = 0;
1128 while (PyDict_Next(interned, &pos, &key, &value)) {
1129 if (key->ob_refcnt == 2 && key == value) {
1130 PyDict_DelItem(interned, key);
1131 changed = 1;
1132 }
1133 }
1134 } while (changed);
1135 }
1136#endif
Guido van Rossum8cf04761997-08-02 02:57:45 +00001137}