blob: cb370386ef08f48886560a6cb3e003ec98002f77 [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 ) {
467 PyErr_SetString(PyExc_SystemError, "Accessing non-existent string segment");
468 return -1;
469 }
470 *ptr = (void *)self->ob_sval;
471 return self->ob_size;
472}
473
474static int
475string_buffer_getwritebuf(self, index, ptr)
476 PyStringObject *self;
477 int index;
478 const void **ptr;
479{
480 PyErr_SetString(PyExc_TypeError, "Cannot use string as modifyable buffer");
481 return -1;
482}
483
484static int
485string_buffer_getsegcount(self, lenp)
486 PyStringObject *self;
487 int *lenp;
488{
489 if ( lenp )
490 *lenp = self->ob_size;
491 return 1;
492}
493
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494static PySequenceMethods string_as_sequence = {
Guido van Rossum013142a1994-08-30 08:19:36 +0000495 (inquiry)string_length, /*sq_length*/
496 (binaryfunc)string_concat, /*sq_concat*/
497 (intargfunc)string_repeat, /*sq_repeat*/
498 (intargfunc)string_item, /*sq_item*/
499 (intintargfunc)string_slice, /*sq_slice*/
Guido van Rossumf380e661991-06-04 19:36:32 +0000500 0, /*sq_ass_item*/
501 0, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000502};
503
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000504static PyBufferProcs string_as_buffer = {
505 (getreadbufferproc)string_buffer_getreadbuf,
506 (getwritebufferproc)string_buffer_getwritebuf,
507 (getsegcountproc)string_buffer_getsegcount,
508};
509
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510PyTypeObject PyString_Type = {
511 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 0,
513 "string",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 sizeof(PyStringObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515 sizeof(char),
Guido van Rossum013142a1994-08-30 08:19:36 +0000516 (destructor)string_dealloc, /*tp_dealloc*/
517 (printfunc)string_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518 0, /*tp_getattr*/
519 0, /*tp_setattr*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000520 (cmpfunc)string_compare, /*tp_compare*/
521 (reprfunc)string_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522 0, /*tp_as_number*/
523 &string_as_sequence, /*tp_as_sequence*/
524 0, /*tp_as_mapping*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000525 (hashfunc)string_hash, /*tp_hash*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000526 0, /*tp_call*/
527 0, /*tp_str*/
528 0, /*tp_getattro*/
529 0, /*tp_setattro*/
Guido van Rossumfdf95dd1997-05-05 22:15:02 +0000530 &string_as_buffer, /*tp_as_buffer*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000531 0, /*tp_xxx4*/
532 0, /*tp_doc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533};
534
535void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536PyString_Concat(pv, w)
537 register PyObject **pv;
538 register PyObject *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000539{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540 register PyObject *v;
Guido van Rossum013142a1994-08-30 08:19:36 +0000541 if (*pv == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542 return;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 if (w == NULL || !PyString_Check(*pv)) {
544 Py_DECREF(*pv);
Guido van Rossum013142a1994-08-30 08:19:36 +0000545 *pv = NULL;
546 return;
547 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 v = string_concat((PyStringObject *) *pv, w);
549 Py_DECREF(*pv);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000550 *pv = v;
551}
552
Guido van Rossum013142a1994-08-30 08:19:36 +0000553void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554PyString_ConcatAndDel(pv, w)
555 register PyObject **pv;
556 register PyObject *w;
Guido van Rossum013142a1994-08-30 08:19:36 +0000557{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 PyString_Concat(pv, w);
559 Py_XDECREF(w);
Guido van Rossum013142a1994-08-30 08:19:36 +0000560}
561
562
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563/* The following function breaks the notion that strings are immutable:
564 it changes the size of a string. We get away with this only if there
565 is only one module referencing the object. You can also think of it
566 as creating a new string object and destroying the old one, only
567 more efficiently. In any case, don't use this if the string may
568 already be known to some other part of the code... */
569
570int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571_PyString_Resize(pv, newsize)
572 PyObject **pv;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573 int newsize;
574{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 register PyObject *v;
576 register PyStringObject *sv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000577 v = *pv;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578 if (!PyString_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000579 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 Py_DECREF(v);
581 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000582 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000583 }
Guido van Rossum921842f1990-11-18 17:30:23 +0000584 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000585#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000586 --_Py_RefTotal;
Guido van Rossum921842f1990-11-18 17:30:23 +0000587#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 _Py_ForgetReference(v);
589 *pv = (PyObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000590 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 sizeof(PyStringObject) + newsize * sizeof(char));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592 if (*pv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 PyMem_DEL(v);
594 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000595 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 _Py_NewReference(*pv);
598 sv = (PyStringObject *) *pv;
Guido van Rossum921842f1990-11-18 17:30:23 +0000599 sv->ob_size = newsize;
600 sv->ob_sval[newsize] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601 return 0;
602}
Guido van Rossume5372401993-03-16 12:15:04 +0000603
604/* Helpers for formatstring */
605
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606static PyObject *
Guido van Rossume5372401993-03-16 12:15:04 +0000607getnextarg(args, arglen, p_argidx)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000609 int arglen;
610 int *p_argidx;
611{
612 int argidx = *p_argidx;
613 if (argidx < arglen) {
614 (*p_argidx)++;
615 if (arglen < 0)
616 return args;
617 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000618 return PyTuple_GetItem(args, argidx);
Guido van Rossume5372401993-03-16 12:15:04 +0000619 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 PyErr_SetString(PyExc_TypeError,
621 "not enough arguments for format string");
Guido van Rossume5372401993-03-16 12:15:04 +0000622 return NULL;
623}
624
625#define F_LJUST (1<<0)
626#define F_SIGN (1<<1)
627#define F_BLANK (1<<2)
628#define F_ALT (1<<3)
629#define F_ZERO (1<<4)
630
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000631static int
632formatfloat(buf, flags, prec, type, v)
633 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000634 int flags;
635 int prec;
636 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000638{
639 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000640 double x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 if (!PyArg_Parse(v, "d;float argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000642 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000643 if (prec < 0)
644 prec = 6;
645 if (prec > 50)
646 prec = 50; /* Arbitrary limitation */
647 if (type == 'f' && fabs(x)/1e25 >= 1e25)
648 type = 'g';
649 sprintf(fmt, "%%%s.%d%c", (flags&F_ALT) ? "#" : "", prec, type);
650 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000651 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000652}
653
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000654static int
655formatint(buf, flags, prec, type, v)
656 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000657 int flags;
658 int prec;
659 int type;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000661{
662 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000663 long x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 if (!PyArg_Parse(v, "l;int argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000665 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000666 if (prec < 0)
667 prec = 1;
668 sprintf(fmt, "%%%s.%dl%c", (flags&F_ALT) ? "#" : "", prec, type);
669 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000670 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000671}
672
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000673static int
674formatchar(buf, v)
675 char *buf;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 PyObject *v;
Guido van Rossume5372401993-03-16 12:15:04 +0000677{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 if (PyString_Check(v)) {
679 if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000680 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000681 }
682 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000684 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000685 }
686 buf[1] = '\0';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000687 return 1;
Guido van Rossume5372401993-03-16 12:15:04 +0000688}
689
Guido van Rossum013142a1994-08-30 08:19:36 +0000690
Guido van Rossume5372401993-03-16 12:15:04 +0000691/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
692
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693PyObject *
694PyString_Format(format, args)
695 PyObject *format;
696 PyObject *args;
Guido van Rossume5372401993-03-16 12:15:04 +0000697{
698 char *fmt, *res;
699 int fmtcnt, rescnt, reslen, arglen, argidx;
Guido van Rossum993952b1996-05-21 22:44:20 +0000700 int args_owned = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701 PyObject *result;
702 PyObject *dict = NULL;
703 if (format == NULL || !PyString_Check(format) || args == NULL) {
704 PyErr_BadInternalCall();
Guido van Rossume5372401993-03-16 12:15:04 +0000705 return NULL;
706 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 fmt = PyString_AsString(format);
708 fmtcnt = PyString_Size(format);
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000709 reslen = rescnt = fmtcnt + 100;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 result = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossume5372401993-03-16 12:15:04 +0000711 if (result == NULL)
712 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 res = PyString_AsString(result);
714 if (PyTuple_Check(args)) {
715 arglen = PyTuple_Size(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000716 argidx = 0;
717 }
718 else {
719 arglen = -1;
720 argidx = -2;
721 }
Guido van Rossum013142a1994-08-30 08:19:36 +0000722 if (args->ob_type->tp_as_mapping)
723 dict = args;
Guido van Rossume5372401993-03-16 12:15:04 +0000724 while (--fmtcnt >= 0) {
725 if (*fmt != '%') {
726 if (--rescnt < 0) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000727 rescnt = fmtcnt + 100;
728 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000730 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 res = PyString_AsString(result)
732 + reslen - rescnt;
Guido van Rossum013142a1994-08-30 08:19:36 +0000733 --rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000734 }
735 *res++ = *fmt++;
736 }
737 else {
738 /* Got a format specifier */
739 int flags = 0;
Guido van Rossume5372401993-03-16 12:15:04 +0000740 int width = -1;
741 int prec = -1;
742 int size = 0;
Guido van Rossum6938a291993-11-11 14:51:57 +0000743 int c = '\0';
Guido van Rossume5372401993-03-16 12:15:04 +0000744 int fill;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000745 PyObject *v = NULL;
746 PyObject *temp = NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000747 char *buf;
748 int sign;
749 int len;
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000750 char tmpbuf[120]; /* For format{float,int,char}() */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000751 fmt++;
Guido van Rossum013142a1994-08-30 08:19:36 +0000752 if (*fmt == '(') {
753 char *keystart;
754 int keylen;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 PyObject *key;
Guido van Rossum013142a1994-08-30 08:19:36 +0000756
757 if (dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000758 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000759 "format requires a mapping");
760 goto error;
761 }
762 ++fmt;
763 --fmtcnt;
764 keystart = fmt;
765 while (--fmtcnt >= 0 && *fmt != ')')
766 fmt++;
767 keylen = fmt - keystart;
768 ++fmt;
769 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000770 PyErr_SetString(PyExc_ValueError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000771 "incomplete format key");
772 goto error;
773 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000774 key = PyString_FromStringAndSize(keystart,
775 keylen);
Guido van Rossum013142a1994-08-30 08:19:36 +0000776 if (key == NULL)
777 goto error;
Guido van Rossum993952b1996-05-21 22:44:20 +0000778 if (args_owned) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000779 Py_DECREF(args);
Guido van Rossum993952b1996-05-21 22:44:20 +0000780 args_owned = 0;
781 }
782 args = PyObject_GetItem(dict, key);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783 Py_DECREF(key);
Guido van Rossum013142a1994-08-30 08:19:36 +0000784 if (args == NULL) {
785 goto error;
786 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000787 args_owned = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000788 arglen = -1;
789 argidx = -2;
790 }
Guido van Rossume5372401993-03-16 12:15:04 +0000791 while (--fmtcnt >= 0) {
792 switch (c = *fmt++) {
793 case '-': flags |= F_LJUST; continue;
794 case '+': flags |= F_SIGN; continue;
795 case ' ': flags |= F_BLANK; continue;
796 case '#': flags |= F_ALT; continue;
797 case '0': flags |= F_ZERO; continue;
798 }
799 break;
800 }
801 if (c == '*') {
802 v = getnextarg(args, arglen, &argidx);
803 if (v == NULL)
804 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000805 if (!PyInt_Check(v)) {
806 PyErr_SetString(PyExc_TypeError,
807 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000808 goto error;
809 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 width = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000811 if (width < 0)
812 width = 0;
813 if (--fmtcnt >= 0)
814 c = *fmt++;
815 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000816 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000817 width = c - '0';
818 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000819 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000820 if (!isdigit(c))
821 break;
822 if ((width*10) / 10 != width) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 PyErr_SetString(
824 PyExc_ValueError,
825 "width too big");
Guido van Rossume5372401993-03-16 12:15:04 +0000826 goto error;
827 }
828 width = width*10 + (c - '0');
829 }
830 }
831 if (c == '.') {
832 prec = 0;
833 if (--fmtcnt >= 0)
834 c = *fmt++;
835 if (c == '*') {
836 v = getnextarg(args, arglen, &argidx);
837 if (v == NULL)
838 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 if (!PyInt_Check(v)) {
840 PyErr_SetString(
841 PyExc_TypeError,
842 "* wants int");
Guido van Rossume5372401993-03-16 12:15:04 +0000843 goto error;
844 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000845 prec = PyInt_AsLong(v);
Guido van Rossume5372401993-03-16 12:15:04 +0000846 if (prec < 0)
847 prec = 0;
848 if (--fmtcnt >= 0)
849 c = *fmt++;
850 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000851 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000852 prec = c - '0';
853 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000854 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000855 if (!isdigit(c))
856 break;
857 if ((prec*10) / 10 != prec) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 PyErr_SetString(
859 PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000860 "prec too big");
861 goto error;
862 }
863 prec = prec*10 + (c - '0');
864 }
865 }
866 } /* prec */
867 if (fmtcnt >= 0) {
868 if (c == 'h' || c == 'l' || c == 'L') {
869 size = c;
870 if (--fmtcnt >= 0)
871 c = *fmt++;
872 }
873 }
874 if (fmtcnt < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000875 PyErr_SetString(PyExc_ValueError,
876 "incomplete format");
Guido van Rossume5372401993-03-16 12:15:04 +0000877 goto error;
878 }
879 if (c != '%') {
880 v = getnextarg(args, arglen, &argidx);
881 if (v == NULL)
882 goto error;
883 }
884 sign = 0;
885 fill = ' ';
886 switch (c) {
887 case '%':
888 buf = "%";
889 len = 1;
890 break;
891 case 's':
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000892 temp = PyObject_Str(v);
Guido van Rossum013142a1994-08-30 08:19:36 +0000893 if (temp == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +0000894 goto error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 buf = PyString_AsString(temp);
896 len = PyString_Size(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000897 if (prec >= 0 && len > prec)
898 len = prec;
899 break;
900 case 'i':
901 case 'd':
902 case 'u':
903 case 'o':
904 case 'x':
905 case 'X':
906 if (c == 'i')
907 c = 'd';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000908 buf = tmpbuf;
909 len = formatint(buf, flags, prec, c, v);
910 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000911 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000912 sign = (c == 'd');
Guido van Rossum4acdc231997-01-29 06:00:24 +0000913 if (flags&F_ZERO) {
Guido van Rossume5372401993-03-16 12:15:04 +0000914 fill = '0';
Guido van Rossum4acdc231997-01-29 06:00:24 +0000915 if ((flags&F_ALT) &&
916 (c == 'x' || c == 'X') &&
917 buf[0] == '0' && buf[1] == c) {
918 *res++ = *buf++;
919 *res++ = *buf++;
920 rescnt -= 2;
921 len -= 2;
922 width -= 2;
923 if (width < 0)
924 width = 0;
925 }
926 }
Guido van Rossume5372401993-03-16 12:15:04 +0000927 break;
928 case 'e':
929 case 'E':
930 case 'f':
931 case 'g':
932 case 'G':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000933 buf = tmpbuf;
934 len = formatfloat(buf, flags, prec, c, v);
935 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000936 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000937 sign = 1;
938 if (flags&F_ZERO)
939 fill = '0';
940 break;
941 case 'c':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000942 buf = tmpbuf;
943 len = formatchar(buf, v);
944 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000945 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000946 break;
947 default:
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 PyErr_SetString(PyExc_ValueError,
Guido van Rossume5372401993-03-16 12:15:04 +0000949 "unsupported format character");
950 goto error;
951 }
952 if (sign) {
953 if (*buf == '-' || *buf == '+') {
954 sign = *buf++;
955 len--;
956 }
957 else if (flags & F_SIGN)
958 sign = '+';
959 else if (flags & F_BLANK)
960 sign = ' ';
961 else
962 sign = '\0';
963 }
964 if (width < len)
965 width = len;
966 if (rescnt < width + (sign != '\0')) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000967 reslen -= rescnt;
968 rescnt = width + fmtcnt + 100;
969 reslen += rescnt;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 if (_PyString_Resize(&result, reslen) < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000971 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000972 res = PyString_AsString(result)
973 + reslen - rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000974 }
975 if (sign) {
Guido van Rossum71e57d01993-11-11 15:03:51 +0000976 if (fill != ' ')
977 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000978 rescnt--;
979 if (width > len)
980 width--;
981 }
982 if (width > len && !(flags&F_LJUST)) {
983 do {
984 --rescnt;
985 *res++ = fill;
986 } while (--width > len);
987 }
Guido van Rossum71e57d01993-11-11 15:03:51 +0000988 if (sign && fill == ' ')
Guido van Rossum6938a291993-11-11 14:51:57 +0000989 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000990 memcpy(res, buf, len);
991 res += len;
992 rescnt -= len;
993 while (--width >= len) {
994 --rescnt;
995 *res++ = ' ';
996 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000997 if (dict && (argidx < arglen) && c != '%') {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 PyErr_SetString(PyExc_TypeError,
Guido van Rossum013142a1994-08-30 08:19:36 +0000999 "not all arguments converted");
1000 goto error;
1001 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 Py_XDECREF(temp);
Guido van Rossume5372401993-03-16 12:15:04 +00001003 } /* '%' */
1004 } /* until end */
Guido van Rossumcaeaafc1995-02-27 10:13:23 +00001005 if (argidx < arglen && !dict) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006 PyErr_SetString(PyExc_TypeError,
1007 "not all arguments converted");
Guido van Rossume5372401993-03-16 12:15:04 +00001008 goto error;
1009 }
Guido van Rossum993952b1996-05-21 22:44:20 +00001010 if (args_owned)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 Py_DECREF(args);
1012 _PyString_Resize(&result, reslen - rescnt);
Guido van Rossume5372401993-03-16 12:15:04 +00001013 return result;
1014 error:
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 Py_DECREF(result);
Guido van Rossum993952b1996-05-21 22:44:20 +00001016 if (args_owned)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 Py_DECREF(args);
Guido van Rossume5372401993-03-16 12:15:04 +00001018 return NULL;
1019}
Guido van Rossum2a61e741997-01-18 07:55:05 +00001020
1021
1022#ifdef INTERN_STRINGS
1023
1024static PyObject *interned;
1025
1026void
1027PyString_InternInPlace(p)
1028 PyObject **p;
1029{
1030 register PyStringObject *s = (PyStringObject *)(*p);
1031 PyObject *t;
1032 if (s == NULL || !PyString_Check(s))
1033 Py_FatalError("PyString_InternInPlace: strings only please!");
1034 if ((t = s->ob_sinterned) != NULL) {
1035 if (t == (PyObject *)s)
1036 return;
1037 Py_INCREF(t);
1038 *p = t;
1039 Py_DECREF(s);
1040 return;
1041 }
1042 if (interned == NULL) {
1043 interned = PyDict_New();
1044 if (interned == NULL)
1045 return;
Guido van Rossum2a61e741997-01-18 07:55:05 +00001046 }
1047 if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
1048 Py_INCREF(t);
1049 *p = s->ob_sinterned = t;
1050 Py_DECREF(s);
1051 return;
1052 }
1053 t = (PyObject *)s;
1054 if (PyDict_SetItem(interned, t, t) == 0) {
1055 s->ob_sinterned = t;
1056 return;
1057 }
1058 PyErr_Clear();
1059}
1060
1061
1062PyObject *
1063PyString_InternFromString(cp)
1064 const char *cp;
1065{
1066 PyObject *s = PyString_FromString(cp);
1067 if (s == NULL)
1068 return NULL;
1069 PyString_InternInPlace(&s);
1070 return s;
1071}
1072
1073#endif
Guido van Rossum8cf04761997-08-02 02:57:45 +00001074
1075void
1076PyString_Fini()
1077{
1078 int i;
Guido van Rossum8cf04761997-08-02 02:57:45 +00001079 for (i = 0; i < UCHAR_MAX + 1; i++) {
1080 Py_XDECREF(characters[i]);
1081 characters[i] = NULL;
1082 }
1083#ifndef DONT_SHARE_SHORT_STRINGS
1084 Py_XDECREF(nullstring);
1085 nullstring = NULL;
1086#endif
Guido van Rossum971a7aa1997-08-05 02:15:12 +00001087#ifdef INTERN_STRINGS
1088 if (interned) {
1089 int pos, changed;
1090 PyObject *key, *value;
1091 do {
1092 changed = 0;
1093 pos = 0;
1094 while (PyDict_Next(interned, &pos, &key, &value)) {
1095 if (key->ob_refcnt == 2 && key == value) {
1096 PyDict_DelItem(interned, key);
1097 changed = 1;
1098 }
1099 }
1100 } while (changed);
1101 }
1102#endif
Guido van Rossum8cf04761997-08-02 02:57:45 +00001103}