blob: 5e6a5a5938d70b8881b7a7a3a8f4ad2160844f95 [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,
468 "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,
482 "Cannot use string as modifyable 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 Rossumc0b618a1997-05-02 03:12:38 +0000496static PySequenceMethods string_as_sequence = {
Guido van Rossum013142a1994-08-30 08:19:36 +0000497 (inquiry)string_length, /*sq_length*/
498 (binaryfunc)string_concat, /*sq_concat*/
499 (intargfunc)string_repeat, /*sq_repeat*/
500 (intargfunc)string_item, /*sq_item*/
501 (intintargfunc)string_slice, /*sq_slice*/
Guido van Rossumf380e661991-06-04 19:36:32 +0000502 0, /*sq_ass_item*/
503 0, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000504};
505
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000506static PyBufferProcs string_as_buffer = {
507 (getreadbufferproc)string_buffer_getreadbuf,
508 (getwritebufferproc)string_buffer_getwritebuf,
509 (getsegcountproc)string_buffer_getsegcount,
510};
511
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512PyTypeObject PyString_Type = {
513 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000514 0,
515 "string",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 sizeof(PyStringObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000517 sizeof(char),
Guido van Rossum013142a1994-08-30 08:19:36 +0000518 (destructor)string_dealloc, /*tp_dealloc*/
519 (printfunc)string_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520 0, /*tp_getattr*/
521 0, /*tp_setattr*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000522 (cmpfunc)string_compare, /*tp_compare*/
523 (reprfunc)string_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000524 0, /*tp_as_number*/
525 &string_as_sequence, /*tp_as_sequence*/
526 0, /*tp_as_mapping*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000527 (hashfunc)string_hash, /*tp_hash*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000528 0, /*tp_call*/
529 0, /*tp_str*/
530 0, /*tp_getattro*/
531 0, /*tp_setattro*/
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000532 &string_as_buffer, /*tp_as_buffer*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000533 0, /*tp_xxx4*/
534 0, /*tp_doc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000535};
536
537void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538PyString_Concat(pv, w)
539 register PyObject **pv;
540 register PyObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 register PyObject *v;
Guido van Rossum013142a1994-08-30 08:19:36 +0000543 if (*pv == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544 return;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 if (w == NULL || !PyString_Check(*pv)) {
546 Py_DECREF(*pv);
Guido van Rossum013142a1994-08-30 08:19:36 +0000547 *pv = NULL;
548 return;
549 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 v = string_concat((PyStringObject *) *pv, w);
551 Py_DECREF(*pv);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552 *pv = v;
553}
554
Guido van Rossum013142a1994-08-30 08:19:36 +0000555void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556PyString_ConcatAndDel(pv, w)
557 register PyObject **pv;
558 register PyObject *w;
Guido van Rossum013142a1994-08-30 08:19:36 +0000559{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 PyString_Concat(pv, w);
561 Py_XDECREF(w);
Guido van Rossum013142a1994-08-30 08:19:36 +0000562}
563
564
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565/* The following function breaks the notion that strings are immutable:
566 it changes the size of a string. We get away with this only if there
567 is only one module referencing the object. You can also think of it
568 as creating a new string object and destroying the old one, only
569 more efficiently. In any case, don't use this if the string may
570 already be known to some other part of the code... */
571
572int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573_PyString_Resize(pv, newsize)
574 PyObject **pv;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000575 int newsize;
576{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 register PyObject *v;
578 register PyStringObject *sv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000579 v = *pv;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 if (!PyString_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 Py_DECREF(v);
583 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000584 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585 }
Guido van Rossum921842f1990-11-18 17:30:23 +0000586 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000587#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000588 --_Py_RefTotal;
Guido van Rossum921842f1990-11-18 17:30:23 +0000589#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 _Py_ForgetReference(v);
591 *pv = (PyObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 sizeof(PyStringObject) + newsize * sizeof(char));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000594 if (*pv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 PyMem_DEL(v);
596 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000597 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000598 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 _Py_NewReference(*pv);
600 sv = (PyStringObject *) *pv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000601 sv->ob_size = newsize;
602 sv->ob_sval[newsize] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000603 return 0;
604}
Guido van Rossume5372401993-03-16 12:15:04 +0000605
606/* Helpers for formatstring */
607
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000609getnextarg(args, arglen, p_argidx)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000611 int arglen;
612 int *p_argidx;
613{
614 int argidx = *p_argidx;
615 if (argidx < arglen) {
616 (*p_argidx)++;
617 if (arglen < 0)
618 return args;
619 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 return PyTuple_GetItem(args, argidx);
Guido van Rossume5372401993-03-16 12:15:04 +0000621 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyErr_SetString(PyExc_TypeError,
623 "not enough arguments for format string");
Guido van Rossume5372401993-03-16 12:15:04 +0000624 return NULL;
625}
626
627#define F_LJUST (1<<0)
628#define F_SIGN (1<<1)
629#define F_BLANK (1<<2)
630#define F_ALT (1<<3)
631#define F_ZERO (1<<4)
632
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000633static int
634formatfloat(buf, flags, prec, type, v)
635 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000636 int flags;
637 int prec;
638 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000640{
641 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000642 double x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 if (!PyArg_Parse(v, "d;float argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000644 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000645 if (prec < 0)
646 prec = 6;
647 if (prec > 50)
648 prec = 50; /* Arbitrary limitation */
649 if (type == 'f' && fabs(x)/1e25 >= 1e25)
650 type = 'g';
651 sprintf(fmt, "%%%s.%d%c", (flags&F_ALT) ? "#" : "", prec, type);
652 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000653 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000654}
655
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000656static int
657formatint(buf, flags, prec, type, v)
658 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000659 int flags;
660 int prec;
661 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000663{
664 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000665 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 if (!PyArg_Parse(v, "l;int argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000667 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000668 if (prec < 0)
669 prec = 1;
670 sprintf(fmt, "%%%s.%dl%c", (flags&F_ALT) ? "#" : "", prec, type);
671 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000672 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000673}
674
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000675static int
676formatchar(buf, v)
677 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000679{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000680 if (PyString_Check(v)) {
681 if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000682 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000683 }
684 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000686 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000687 }
688 buf[1] = '\0';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000689 return 1;
Guido van Rossume5372401993-03-16 12:15:04 +0000690}
691
Guido van Rossum013142a1994-08-30 08:19:36 +0000692
Guido van Rossume5372401993-03-16 12:15:04 +0000693/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
694
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695PyObject *
696PyString_Format(format, args)
697 PyObject *format;
698 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000699{
700 char *fmt, *res;
701 int fmtcnt, rescnt, reslen, arglen, argidx;
Guido van Rossum993952b1996-05-21 22:44:20 +0000702 int args_owned = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703 PyObject *result;
704 PyObject *dict = NULL;
705 if (format == NULL || !PyString_Check(format) || args == NULL) {
706 PyErr_BadInternalCall();
Guido van Rossume5372401993-03-16 12:15:04 +0000707 return NULL;
708 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 fmt = PyString_AsString(format);
710 fmtcnt = PyString_Size(format);
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000711 reslen = rescnt = fmtcnt + 100;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000712 result = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossume5372401993-03-16 12:15:04 +0000713 if (result == NULL)
714 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 res = PyString_AsString(result);
716 if (PyTuple_Check(args)) {
717 arglen = PyTuple_Size(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000718 argidx = 0;
719 }
720 else {
721 arglen = -1;
722 argidx = -2;
723 }
Guido van Rossum013142a1994-08-30 08:19:36 +0000724 if (args->ob_type->tp_as_mapping)
725 dict = args;
Guido van Rossume5372401993-03-16 12:15:04 +0000726 while (--fmtcnt >= 0) {
727 if (*fmt != '%') {
728 if (--rescnt < 0) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000729 rescnt = fmtcnt + 100;
730 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000732 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733 res = PyString_AsString(result)
734 + reslen - rescnt;
Guido van Rossum013142a1994-08-30 08:19:36 +0000735 --rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000736 }
737 *res++ = *fmt++;
738 }
739 else {
740 /* Got a format specifier */
741 int flags = 0;
Guido van Rossume5372401993-03-16 12:15:04 +0000742 int width = -1;
743 int prec = -1;
744 int size = 0;
Guido van Rossum6938a291993-11-11 14:51:57 +0000745 int c = '\0';
Guido van Rossume5372401993-03-16 12:15:04 +0000746 int fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000747 PyObject *v = NULL;
748 PyObject *temp = NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000749 char *buf;
750 int sign;
751 int len;
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000752 char tmpbuf[120]; /* For format{float,int,char}() */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000753 fmt++;
Guido van Rossum013142a1994-08-30 08:19:36 +0000754 if (*fmt == '(') {
755 char *keystart;
756 int keylen;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757 PyObject *key;
Guido van Rossum045e6881997-09-08 18:30:11 +0000758 int pcount = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000759
760 if (dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000762 "format requires a mapping");
763 goto error;
764 }
765 ++fmt;
766 --fmtcnt;
767 keystart = fmt;
Guido van Rossum045e6881997-09-08 18:30:11 +0000768 /* Skip over balanced parentheses */
769 while (pcount > 0 && --fmtcnt >= 0) {
770 if (*fmt == ')')
771 --pcount;
772 else if (*fmt == '(')
773 ++pcount;
Guido van Rossum013142a1994-08-30 08:19:36 +0000774 fmt++;
Guido van Rossum045e6881997-09-08 18:30:11 +0000775 }
776 keylen = fmt - keystart - 1;
777 if (fmtcnt < 0 || pcount > 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000778 PyErr_SetString(PyExc_ValueError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000779 "incomplete format key");
780 goto error;
781 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 key = PyString_FromStringAndSize(keystart,
783 keylen);
Guido van Rossum013142a1994-08-30 08:19:36 +0000784 if (key == NULL)
785 goto error;
Guido van Rossum993952b1996-05-21 22:44:20 +0000786 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 Py_DECREF(args);
Guido van Rossum993952b1996-05-21 22:44:20 +0000788 args_owned = 0;
789 }
790 args = PyObject_GetItem(dict, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000791 Py_DECREF(key);
Guido van Rossum013142a1994-08-30 08:19:36 +0000792 if (args == NULL) {
793 goto error;
794 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000795 args_owned = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000796 arglen = -1;
797 argidx = -2;
798 }
Guido van Rossume5372401993-03-16 12:15:04 +0000799 while (--fmtcnt >= 0) {
800 switch (c = *fmt++) {
801 case '-': flags |= F_LJUST; continue;
802 case '+': flags |= F_SIGN; continue;
803 case ' ': flags |= F_BLANK; continue;
804 case '#': flags |= F_ALT; continue;
805 case '0': flags |= F_ZERO; continue;
806 }
807 break;
808 }
809 if (c == '*') {
810 v = getnextarg(args, arglen, &argidx);
811 if (v == NULL)
812 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000813 if (!PyInt_Check(v)) {
814 PyErr_SetString(PyExc_TypeError,
815 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000816 goto error;
817 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 width = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000819 if (width < 0)
820 width = 0;
821 if (--fmtcnt >= 0)
822 c = *fmt++;
823 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000824 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000825 width = c - '0';
826 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000827 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000828 if (!isdigit(c))
829 break;
830 if ((width*10) / 10 != width) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000831 PyErr_SetString(
832 PyExc_ValueError,
833 "width too big");
Guido van Rossume5372401993-03-16 12:15:04 +0000834 goto error;
835 }
836 width = width*10 + (c - '0');
837 }
838 }
839 if (c == '.') {
840 prec = 0;
841 if (--fmtcnt >= 0)
842 c = *fmt++;
843 if (c == '*') {
844 v = getnextarg(args, arglen, &argidx);
845 if (v == NULL)
846 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000847 if (!PyInt_Check(v)) {
848 PyErr_SetString(
849 PyExc_TypeError,
850 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000851 goto error;
852 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 prec = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000854 if (prec < 0)
855 prec = 0;
856 if (--fmtcnt >= 0)
857 c = *fmt++;
858 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000859 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000860 prec = c - '0';
861 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000862 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000863 if (!isdigit(c))
864 break;
865 if ((prec*10) / 10 != prec) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000866 PyErr_SetString(
867 PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000868 "prec too big");
869 goto error;
870 }
871 prec = prec*10 + (c - '0');
872 }
873 }
874 } /* prec */
875 if (fmtcnt >= 0) {
876 if (c == 'h' || c == 'l' || c == 'L') {
877 size = c;
878 if (--fmtcnt >= 0)
879 c = *fmt++;
880 }
881 }
882 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 PyErr_SetString(PyExc_ValueError,
884 "incomplete format");
Guido van Rossume5372401993-03-16 12:15:04 +0000885 goto error;
886 }
887 if (c != '%') {
888 v = getnextarg(args, arglen, &argidx);
889 if (v == NULL)
890 goto error;
891 }
892 sign = 0;
893 fill = ' ';
894 switch (c) {
895 case '%':
896 buf = "%";
897 len = 1;
898 break;
899 case 's':
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000900 temp = PyObject_Str(v);
Guido van Rossum013142a1994-08-30 08:19:36 +0000901 if (temp == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +0000902 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000903 buf = PyString_AsString(temp);
904 len = PyString_Size(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000905 if (prec >= 0 && len > prec)
906 len = prec;
907 break;
908 case 'i':
909 case 'd':
910 case 'u':
911 case 'o':
912 case 'x':
913 case 'X':
914 if (c == 'i')
915 c = 'd';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000916 buf = tmpbuf;
917 len = formatint(buf, flags, prec, c, v);
918 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000919 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000920 sign = (c == 'd');
Guido van Rossum4acdc231997-01-29 06:00:24 +0000921 if (flags&F_ZERO) {
Guido van Rossume5372401993-03-16 12:15:04 +0000922 fill = '0';
Guido van Rossum4acdc231997-01-29 06:00:24 +0000923 if ((flags&F_ALT) &&
924 (c == 'x' || c == 'X') &&
925 buf[0] == '0' && buf[1] == c) {
926 *res++ = *buf++;
927 *res++ = *buf++;
928 rescnt -= 2;
929 len -= 2;
930 width -= 2;
931 if (width < 0)
932 width = 0;
933 }
934 }
Guido van Rossume5372401993-03-16 12:15:04 +0000935 break;
936 case 'e':
937 case 'E':
938 case 'f':
939 case 'g':
940 case 'G':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000941 buf = tmpbuf;
942 len = formatfloat(buf, flags, prec, c, v);
943 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000944 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000945 sign = 1;
946 if (flags&F_ZERO)
947 fill = '0';
948 break;
949 case 'c':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000950 buf = tmpbuf;
951 len = formatchar(buf, v);
952 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000953 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000954 break;
955 default:
Guido van Rossum045e6881997-09-08 18:30:11 +0000956 PyErr_Format(PyExc_ValueError,
957 "unsupported format character '%c' (0x%x)",
958 c, c);
Guido van Rossume5372401993-03-16 12:15:04 +0000959 goto error;
960 }
961 if (sign) {
962 if (*buf == '-' || *buf == '+') {
963 sign = *buf++;
964 len--;
965 }
966 else if (flags & F_SIGN)
967 sign = '+';
968 else if (flags & F_BLANK)
969 sign = ' ';
970 else
971 sign = '\0';
972 }
973 if (width < len)
974 width = len;
975 if (rescnt < width + (sign != '\0')) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000976 reslen -= rescnt;
977 rescnt = width + fmtcnt + 100;
978 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000980 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000981 res = PyString_AsString(result)
982 + reslen - rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000983 }
984 if (sign) {
Guido van Rossum71e57d01993-11-11 15:03:51 +0000985 if (fill != ' ')
986 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000987 rescnt--;
988 if (width > len)
989 width--;
990 }
991 if (width > len && !(flags&F_LJUST)) {
992 do {
993 --rescnt;
994 *res++ = fill;
995 } while (--width > len);
996 }
Guido van Rossum71e57d01993-11-11 15:03:51 +0000997 if (sign && fill == ' ')
Guido van Rossum6938a291993-11-11 14:51:57 +0000998 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000999 memcpy(res, buf, len);
1000 res += len;
1001 rescnt -= len;
1002 while (--width >= len) {
1003 --rescnt;
1004 *res++ = ' ';
1005 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001006 if (dict && (argidx < arglen) && c != '%') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +00001008 "not all arguments converted");
1009 goto error;
1010 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 Py_XDECREF(temp);
Guido van Rossume5372401993-03-16 12:15:04 +00001012 } /* '%' */
1013 } /* until end */
Guido van Rossumcaeaafc1995-02-27 10:13:23 +00001014 if (argidx < arglen && !dict) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 PyErr_SetString(PyExc_TypeError,
1016 "not all arguments converted");
Guido van Rossume5372401993-03-16 12:15:04 +00001017 goto error;
1018 }
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001019 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001020 Py_DECREF(args);
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001021 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001022 _PyString_Resize(&result, reslen - rescnt);
Guido van Rossume5372401993-03-16 12:15:04 +00001023 return result;
1024 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 Py_DECREF(result);
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001026 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027 Py_DECREF(args);
Guido van Rossum1109fbc1998-04-10 22:16:39 +00001028 }
Guido van Rossume5372401993-03-16 12:15:04 +00001029 return NULL;
1030}
Guido van Rossum2a61e741997-01-18 07:55:05 +00001031
1032
1033#ifdef INTERN_STRINGS
1034
1035static PyObject *interned;
1036
1037void
1038PyString_InternInPlace(p)
1039 PyObject **p;
1040{
1041 register PyStringObject *s = (PyStringObject *)(*p);
1042 PyObject *t;
1043 if (s == NULL || !PyString_Check(s))
1044 Py_FatalError("PyString_InternInPlace: strings only please!");
1045 if ((t = s->ob_sinterned) != NULL) {
1046 if (t == (PyObject *)s)
1047 return;
1048 Py_INCREF(t);
1049 *p = t;
1050 Py_DECREF(s);
1051 return;
1052 }
1053 if (interned == NULL) {
1054 interned = PyDict_New();
1055 if (interned == NULL)
1056 return;
Guido van Rossum2a61e741997-01-18 07:55:05 +00001057 }
1058 if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
1059 Py_INCREF(t);
1060 *p = s->ob_sinterned = t;
1061 Py_DECREF(s);
1062 return;
1063 }
1064 t = (PyObject *)s;
1065 if (PyDict_SetItem(interned, t, t) == 0) {
1066 s->ob_sinterned = t;
1067 return;
1068 }
1069 PyErr_Clear();
1070}
1071
1072
1073PyObject *
1074PyString_InternFromString(cp)
1075 const char *cp;
1076{
1077 PyObject *s = PyString_FromString(cp);
1078 if (s == NULL)
1079 return NULL;
1080 PyString_InternInPlace(&s);
1081 return s;
1082}
1083
1084#endif
Guido van Rossum8cf04761997-08-02 02:57:45 +00001085
1086void
1087PyString_Fini()
1088{
1089 int i;
Guido van Rossum8cf04761997-08-02 02:57:45 +00001090 for (i = 0; i < UCHAR_MAX + 1; i++) {
1091 Py_XDECREF(characters[i]);
1092 characters[i] = NULL;
1093 }
1094#ifndef DONT_SHARE_SHORT_STRINGS
1095 Py_XDECREF(nullstring);
1096 nullstring = NULL;
1097#endif
Guido van Rossum971a7aa1997-08-05 02:15:12 +00001098#ifdef INTERN_STRINGS
1099 if (interned) {
1100 int pos, changed;
1101 PyObject *key, *value;
1102 do {
1103 changed = 0;
1104 pos = 0;
1105 while (PyDict_Next(interned, &pos, &key, &value)) {
1106 if (key->ob_refcnt == 2 && key == value) {
1107 PyDict_DelItem(interned, key);
1108 changed = 1;
1109 }
1110 }
1111 } while (changed);
1112 }
1113#endif
Guido van Rossum8cf04761997-08-02 02:57:45 +00001114}