blob: 881cdaba89286cfdef3645a05ead5540dc193b1d [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 Rossum3f5da241990-12-20 15:06:42 +000034#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum013142a1994-08-30 08:19:36 +000036#include <ctype.h>
37
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000038#ifdef COUNT_ALLOCS
39int null_strings, one_strings;
40#endif
41
Guido van Rossum03093a21994-09-28 15:51:32 +000042#ifdef HAVE_LIMITS_H
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000043#include <limits.h>
44#else
45#ifndef UCHAR_MAX
46#define UCHAR_MAX 255
47#endif
48#endif
49
50static stringobject *characters[UCHAR_MAX + 1];
Sjoerd Mullender615194a1993-11-01 13:46:50 +000051#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000052static stringobject *nullstring;
Sjoerd Mullender615194a1993-11-01 13:46:50 +000053#endif
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000054
55/*
56 Newsizedstringobject() and newstringobject() try in certain cases
57 to share string objects. When the size of the string is zero,
58 these routines always return a pointer to the same string object;
59 when the size is one, they return a pointer to an already existing
60 object if the contents of the string is known. For
61 newstringobject() this is always the case, for
62 newsizedstringobject() this is the case when the first argument in
63 not NULL.
64 A common practice to allocate a string and then fill it in or
65 change it must be done carefully. It is only allowed to change the
66 contents of the string if the obect was gotten from
67 newsizedstringobject() with a NULL first argument, because in the
68 future these routines may try to do even more sharing of objects.
69*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070object *
71newsizedstringobject(str, size)
Guido van Rossum067998f1996-12-10 15:33:34 +000072 const char *str;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 int size;
74{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000075 register stringobject *op;
Sjoerd Mullender615194a1993-11-01 13:46:50 +000076#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000077 if (size == 0 && (op = nullstring) != NULL) {
78#ifdef COUNT_ALLOCS
79 null_strings++;
80#endif
81 INCREF(op);
Guido van Rossum444fc7c1993-10-26 15:25:16 +000082 return (object *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000083 }
84 if (size == 1 && str != NULL && (op = characters[*str & UCHAR_MAX]) != NULL) {
85#ifdef COUNT_ALLOCS
86 one_strings++;
87#endif
88 INCREF(op);
Guido van Rossum444fc7c1993-10-26 15:25:16 +000089 return (object *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000090 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +000091#endif /* DONT_SHARE_SHORT_STRINGS */
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000092 op = (stringobject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 malloc(sizeof(stringobject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +000094 if (op == NULL)
95 return err_nomem();
Guido van Rossum2a9096b1990-10-21 22:15:08 +000096 op->ob_type = &Stringtype;
97 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000098#ifdef CACHE_HASH
99 op->ob_shash = -1;
100#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000101#ifdef INTERN_STRINGS
102 op->ob_sinterned = NULL;
103#endif
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000104 NEWREF(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000105 if (str != NULL)
106 memcpy(op->ob_sval, str, size);
107 op->ob_sval[size] = '\0';
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000108#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000109 if (size == 0) {
110 nullstring = op;
111 INCREF(op);
112 } else if (size == 1 && str != NULL) {
113 characters[*str & UCHAR_MAX] = op;
114 INCREF(op);
115 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000116#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 return (object *) op;
118}
119
120object *
121newstringobject(str)
Guido van Rossum067998f1996-12-10 15:33:34 +0000122 const char *str;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
124 register unsigned int size = strlen(str);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000125 register stringobject *op;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000126#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000127 if (size == 0 && (op = nullstring) != NULL) {
128#ifdef COUNT_ALLOCS
129 null_strings++;
130#endif
131 INCREF(op);
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000132 return (object *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000133 }
134 if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
135#ifdef COUNT_ALLOCS
136 one_strings++;
137#endif
138 INCREF(op);
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000139 return (object *)op;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000140 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000141#endif /* DONT_SHARE_SHORT_STRINGS */
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000142 op = (stringobject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143 malloc(sizeof(stringobject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000144 if (op == NULL)
145 return err_nomem();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000146 op->ob_type = &Stringtype;
147 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000148#ifdef CACHE_HASH
149 op->ob_shash = -1;
150#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000151#ifdef INTERN_STRINGS
152 op->ob_sinterned = NULL;
153#endif
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000154 NEWREF(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000155 strcpy(op->ob_sval, str);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000156#ifndef DONT_SHARE_SHORT_STRINGS
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000157 if (size == 0) {
158 nullstring = op;
159 INCREF(op);
160 } else if (size == 1) {
161 characters[*str & UCHAR_MAX] = op;
162 INCREF(op);
163 }
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000164#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165 return (object *) op;
166}
167
Guido van Rossum234f9421993-06-17 12:35:49 +0000168static void
Guido van Rossume5372401993-03-16 12:15:04 +0000169string_dealloc(op)
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000170 object *op;
171{
172 DEL(op);
173}
174
Guido van Rossumd7047b31995-01-02 19:07:15 +0000175int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176getstringsize(op)
177 register object *op;
178{
179 if (!is_stringobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000180 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 return -1;
182 }
183 return ((stringobject *)op) -> ob_size;
184}
185
186/*const*/ char *
187getstringvalue(op)
188 register object *op;
189{
190 if (!is_stringobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000191 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192 return NULL;
193 }
194 return ((stringobject *)op) -> ob_sval;
195}
196
197/* Methods */
198
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000199static int
Guido van Rossume5372401993-03-16 12:15:04 +0000200string_print(op, fp, flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201 stringobject *op;
202 FILE *fp;
203 int flags;
204{
205 int i;
206 char c;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000207 int quote;
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000208 /* XXX Ought to check for interrupts when writing long strings */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 if (flags & PRINT_RAW) {
210 fwrite(op->ob_sval, 1, (int) op->ob_size, fp);
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000211 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000213
214 /* figure out which quote to use; single is prefered */
215 quote = '\'';
216 if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
217 quote = '"';
218
219 fputc(quote, fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 for (i = 0; i < op->ob_size; i++) {
221 c = op->ob_sval[i];
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000222 if (c == quote || c == '\\')
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 fprintf(fp, "\\%c", c);
224 else if (c < ' ' || c >= 0177)
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000225 fprintf(fp, "\\%03o", c & 0377);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226 else
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000227 fputc(c, fp);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000229 fputc(quote, fp);
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000230 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231}
232
233static object *
Guido van Rossume5372401993-03-16 12:15:04 +0000234string_repr(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 register stringobject *op;
236{
237 /* XXX overflow? */
238 int newsize = 2 + 4 * op->ob_size * sizeof(char);
239 object *v = newsizedstringobject((char *)NULL, newsize);
240 if (v == NULL) {
Guido van Rossumbcaa31c1991-06-07 22:58:57 +0000241 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 }
243 else {
244 register int i;
245 register char c;
246 register char *p;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000247 int quote;
248
249 /* figure out which quote to use; single is prefered */
250 quote = '\'';
251 if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
252 quote = '"';
253
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 p = ((stringobject *)v)->ob_sval;
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000255 *p++ = quote;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256 for (i = 0; i < op->ob_size; i++) {
257 c = op->ob_sval[i];
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000258 if (c == quote || c == '\\')
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259 *p++ = '\\', *p++ = c;
260 else if (c < ' ' || c >= 0177) {
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000261 sprintf(p, "\\%03o", c & 0377);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262 while (*p != '\0')
263 p++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 }
265 else
266 *p++ = c;
267 }
Guido van Rossum444fc7c1993-10-26 15:25:16 +0000268 *p++ = quote;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269 *p = '\0';
270 resizestring(&v, (int) (p - ((stringobject *)v)->ob_sval));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000271 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273}
274
275static int
Guido van Rossume5372401993-03-16 12:15:04 +0000276string_length(a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 stringobject *a;
278{
279 return a->ob_size;
280}
281
282static object *
Guido van Rossume5372401993-03-16 12:15:04 +0000283string_concat(a, bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 register stringobject *a;
285 register object *bb;
286{
287 register unsigned int size;
288 register stringobject *op;
289 if (!is_stringobject(bb)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000290 err_badarg();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
292 }
293#define b ((stringobject *)bb)
294 /* Optimize cases with empty left or right operand */
295 if (a->ob_size == 0) {
296 INCREF(bb);
297 return bb;
298 }
299 if (b->ob_size == 0) {
300 INCREF(a);
301 return (object *)a;
302 }
303 size = a->ob_size + b->ob_size;
304 op = (stringobject *)
305 malloc(sizeof(stringobject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000306 if (op == NULL)
307 return err_nomem();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000308 op->ob_type = &Stringtype;
309 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000310#ifdef CACHE_HASH
311 op->ob_shash = -1;
312#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000313#ifdef INTERN_STRINGS
314 op->ob_sinterned = NULL;
315#endif
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000316 NEWREF(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000317 memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size);
318 memcpy(op->ob_sval + a->ob_size, b->ob_sval, (int) b->ob_size);
319 op->ob_sval[size] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 return (object *) op;
321#undef b
322}
323
324static object *
Guido van Rossume5372401993-03-16 12:15:04 +0000325string_repeat(a, n)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326 register stringobject *a;
327 register int n;
328{
329 register int i;
Guido van Rossum2095d241997-04-09 19:41:24 +0000330 register int size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 register stringobject *op;
332 if (n < 0)
333 n = 0;
334 size = a->ob_size * n;
335 if (size == a->ob_size) {
336 INCREF(a);
337 return (object *)a;
338 }
339 op = (stringobject *)
340 malloc(sizeof(stringobject) + size * sizeof(char));
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000341 if (op == NULL)
342 return err_nomem();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000343 op->ob_type = &Stringtype;
344 op->ob_size = size;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000345#ifdef CACHE_HASH
346 op->ob_shash = -1;
347#endif
Guido van Rossum2a61e741997-01-18 07:55:05 +0000348#ifdef INTERN_STRINGS
349 op->ob_sinterned = NULL;
350#endif
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000351 NEWREF(op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000352 for (i = 0; i < size; i += a->ob_size)
353 memcpy(op->ob_sval+i, a->ob_sval, (int) a->ob_size);
354 op->ob_sval[size] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 return (object *) op;
356}
357
358/* String slice a[i:j] consists of characters a[i] ... a[j-1] */
359
360static object *
Guido van Rossume5372401993-03-16 12:15:04 +0000361string_slice(a, i, j)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 register stringobject *a;
363 register int i, j; /* May be negative! */
364{
365 if (i < 0)
366 i = 0;
367 if (j < 0)
368 j = 0; /* Avoid signed/unsigned bug in next line */
369 if (j > a->ob_size)
370 j = a->ob_size;
371 if (i == 0 && j == a->ob_size) { /* It's the same as a */
372 INCREF(a);
373 return (object *)a;
374 }
375 if (j < i)
376 j = i;
377 return newsizedstringobject(a->ob_sval + i, (int) (j-i));
378}
379
380static object *
Guido van Rossume5372401993-03-16 12:15:04 +0000381string_item(a, i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382 stringobject *a;
383 register int i;
384{
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000385 int c;
386 object *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 if (i < 0 || i >= a->ob_size) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000388 err_setstr(IndexError, "string index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389 return NULL;
390 }
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000391 c = a->ob_sval[i] & UCHAR_MAX;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000392 v = (object *) characters[c];
393#ifdef COUNT_ALLOCS
394 if (v != NULL)
395 one_strings++;
396#endif
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000397 if (v == NULL) {
398 v = newsizedstringobject((char *)NULL, 1);
399 if (v == NULL)
400 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000401 characters[c] = (stringobject *) v;
Guido van Rossumdaa8bb31991-04-04 10:48:33 +0000402 ((stringobject *)v)->ob_sval[0] = c;
403 }
404 INCREF(v);
405 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406}
407
408static int
Guido van Rossume5372401993-03-16 12:15:04 +0000409string_compare(a, b)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410 stringobject *a, *b;
411{
Guido van Rossum253919f1991-02-13 23:18:39 +0000412 int len_a = a->ob_size, len_b = b->ob_size;
413 int min_len = (len_a < len_b) ? len_a : len_b;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000414 int cmp;
415 if (min_len > 0) {
Guido van Rossumfde7a751996-10-23 14:19:40 +0000416 cmp = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000417 if (cmp == 0)
418 cmp = memcmp(a->ob_sval, b->ob_sval, min_len);
419 if (cmp != 0)
420 return cmp;
421 }
Guido van Rossum253919f1991-02-13 23:18:39 +0000422 return (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423}
424
Guido van Rossum9bfef441993-03-29 10:43:31 +0000425static long
426string_hash(a)
427 stringobject *a;
428{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000429 register int len;
430 register unsigned char *p;
431 register long x;
432
433#ifdef CACHE_HASH
434 if (a->ob_shash != -1)
435 return a->ob_shash;
Guido van Rossum36b9f791997-02-14 16:29:22 +0000436#ifdef INTERN_STRINGS
437 if (a->ob_sinterned != NULL)
438 return (a->ob_shash =
439 ((stringobject *)(a->ob_sinterned))->ob_shash);
440#endif
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000441#endif
442 len = a->ob_size;
443 p = (unsigned char *) a->ob_sval;
444 x = *p << 7;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000445 while (--len >= 0)
Guido van Rossumeddcb3b1996-09-11 20:22:48 +0000446 x = (1000003*x) ^ *p++;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000447 x ^= a->ob_size;
448 if (x == -1)
449 x = -2;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000450#ifdef CACHE_HASH
451 a->ob_shash = x;
452#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +0000453 return x;
454}
455
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456static sequence_methods string_as_sequence = {
Guido van Rossum013142a1994-08-30 08:19:36 +0000457 (inquiry)string_length, /*sq_length*/
458 (binaryfunc)string_concat, /*sq_concat*/
459 (intargfunc)string_repeat, /*sq_repeat*/
460 (intargfunc)string_item, /*sq_item*/
461 (intintargfunc)string_slice, /*sq_slice*/
Guido van Rossumf380e661991-06-04 19:36:32 +0000462 0, /*sq_ass_item*/
463 0, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464};
465
466typeobject Stringtype = {
467 OB_HEAD_INIT(&Typetype)
468 0,
469 "string",
470 sizeof(stringobject),
471 sizeof(char),
Guido van Rossum013142a1994-08-30 08:19:36 +0000472 (destructor)string_dealloc, /*tp_dealloc*/
473 (printfunc)string_print, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474 0, /*tp_getattr*/
475 0, /*tp_setattr*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000476 (cmpfunc)string_compare, /*tp_compare*/
477 (reprfunc)string_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478 0, /*tp_as_number*/
479 &string_as_sequence, /*tp_as_sequence*/
480 0, /*tp_as_mapping*/
Guido van Rossum013142a1994-08-30 08:19:36 +0000481 (hashfunc)string_hash, /*tp_hash*/
Guido van Rossum2a61e741997-01-18 07:55:05 +0000482 0, /*tp_call*/
483 0, /*tp_str*/
484 0, /*tp_getattro*/
485 0, /*tp_setattro*/
486 0, /*tp_xxx3*/
487 0, /*tp_xxx4*/
488 0, /*tp_doc*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489};
490
491void
492joinstring(pv, w)
493 register object **pv;
494 register object *w;
495{
496 register object *v;
Guido van Rossum013142a1994-08-30 08:19:36 +0000497 if (*pv == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 return;
Guido van Rossum013142a1994-08-30 08:19:36 +0000499 if (w == NULL || !is_stringobject(*pv)) {
500 DECREF(*pv);
501 *pv = NULL;
502 return;
503 }
Guido van Rossume5372401993-03-16 12:15:04 +0000504 v = string_concat((stringobject *) *pv, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000505 DECREF(*pv);
506 *pv = v;
507}
508
Guido van Rossum013142a1994-08-30 08:19:36 +0000509void
510joinstring_decref(pv, w)
511 register object **pv;
512 register object *w;
513{
514 joinstring(pv, w);
515 XDECREF(w);
516}
517
518
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519/* The following function breaks the notion that strings are immutable:
520 it changes the size of a string. We get away with this only if there
521 is only one module referencing the object. You can also think of it
522 as creating a new string object and destroying the old one, only
523 more efficiently. In any case, don't use this if the string may
524 already be known to some other part of the code... */
525
526int
527resizestring(pv, newsize)
528 object **pv;
529 int newsize;
530{
Guido van Rossum921842f1990-11-18 17:30:23 +0000531 register object *v;
532 register stringobject *sv;
533 v = *pv;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534 if (!is_stringobject(v) || v->ob_refcnt != 1) {
535 *pv = 0;
536 DECREF(v);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000537 err_badcall();
538 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000539 }
Guido van Rossum921842f1990-11-18 17:30:23 +0000540 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000541#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000542 --_Py_RefTotal;
Guido van Rossum921842f1990-11-18 17:30:23 +0000543#endif
544 UNREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545 *pv = (object *)
546 realloc((char *)v,
547 sizeof(stringobject) + newsize * sizeof(char));
548 if (*pv == NULL) {
Guido van Rossum921842f1990-11-18 17:30:23 +0000549 DEL(v);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000550 err_nomem();
551 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552 }
Guido van Rossum921842f1990-11-18 17:30:23 +0000553 NEWREF(*pv);
554 sv = (stringobject *) *pv;
555 sv->ob_size = newsize;
556 sv->ob_sval[newsize] = '\0';
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557 return 0;
558}
Guido van Rossume5372401993-03-16 12:15:04 +0000559
560/* Helpers for formatstring */
561
562static object *
563getnextarg(args, arglen, p_argidx)
564 object *args;
565 int arglen;
566 int *p_argidx;
567{
568 int argidx = *p_argidx;
569 if (argidx < arglen) {
570 (*p_argidx)++;
571 if (arglen < 0)
572 return args;
573 else
574 return gettupleitem(args, argidx);
575 }
576 err_setstr(TypeError, "not enough arguments for format string");
577 return NULL;
578}
579
580#define F_LJUST (1<<0)
581#define F_SIGN (1<<1)
582#define F_BLANK (1<<2)
583#define F_ALT (1<<3)
584#define F_ZERO (1<<4)
585
586extern double fabs PROTO((double));
587
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000588static int
589formatfloat(buf, flags, prec, type, v)
590 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000591 int flags;
592 int prec;
593 int type;
594 object *v;
595{
596 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000597 double x;
598 if (!getargs(v, "d;float argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000599 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000600 if (prec < 0)
601 prec = 6;
602 if (prec > 50)
603 prec = 50; /* Arbitrary limitation */
604 if (type == 'f' && fabs(x)/1e25 >= 1e25)
605 type = 'g';
606 sprintf(fmt, "%%%s.%d%c", (flags&F_ALT) ? "#" : "", prec, type);
607 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000608 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000609}
610
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000611static int
612formatint(buf, flags, prec, type, v)
613 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000614 int flags;
615 int prec;
616 int type;
617 object *v;
618{
619 char fmt[20];
Guido van Rossume5372401993-03-16 12:15:04 +0000620 long x;
621 if (!getargs(v, "l;int argument required", &x))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000622 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000623 if (prec < 0)
624 prec = 1;
625 sprintf(fmt, "%%%s.%dl%c", (flags&F_ALT) ? "#" : "", prec, type);
626 sprintf(buf, fmt, x);
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000627 return strlen(buf);
Guido van Rossume5372401993-03-16 12:15:04 +0000628}
629
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000630static int
631formatchar(buf, v)
632 char *buf;
Guido van Rossume5372401993-03-16 12:15:04 +0000633 object *v;
634{
Guido van Rossume5372401993-03-16 12:15:04 +0000635 if (is_stringobject(v)) {
636 if (!getargs(v, "c;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000637 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000638 }
639 else {
640 if (!getargs(v, "b;%c requires int or char", &buf[0]))
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000641 return -1;
Guido van Rossume5372401993-03-16 12:15:04 +0000642 }
643 buf[1] = '\0';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000644 return 1;
Guido van Rossume5372401993-03-16 12:15:04 +0000645}
646
Guido van Rossum013142a1994-08-30 08:19:36 +0000647
Guido van Rossume5372401993-03-16 12:15:04 +0000648/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
649
650object *
651formatstring(format, args)
652 object *format;
653 object *args;
654{
655 char *fmt, *res;
656 int fmtcnt, rescnt, reslen, arglen, argidx;
Guido van Rossum993952b1996-05-21 22:44:20 +0000657 int args_owned = 0;
Guido van Rossume5372401993-03-16 12:15:04 +0000658 object *result;
Guido van Rossum013142a1994-08-30 08:19:36 +0000659 object *dict = NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000660 if (format == NULL || !is_stringobject(format) || args == NULL) {
661 err_badcall();
662 return NULL;
663 }
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000664 fmt = getstringvalue(format);
665 fmtcnt = getstringsize(format);
666 reslen = rescnt = fmtcnt + 100;
Guido van Rossume5372401993-03-16 12:15:04 +0000667 result = newsizedstringobject((char *)NULL, reslen);
668 if (result == NULL)
669 return NULL;
670 res = getstringvalue(result);
Guido van Rossume5372401993-03-16 12:15:04 +0000671 if (is_tupleobject(args)) {
672 arglen = gettuplesize(args);
673 argidx = 0;
674 }
675 else {
676 arglen = -1;
677 argidx = -2;
678 }
Guido van Rossum013142a1994-08-30 08:19:36 +0000679 if (args->ob_type->tp_as_mapping)
680 dict = args;
Guido van Rossume5372401993-03-16 12:15:04 +0000681 while (--fmtcnt >= 0) {
682 if (*fmt != '%') {
683 if (--rescnt < 0) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000684 rescnt = fmtcnt + 100;
685 reslen += rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000686 if (resizestring(&result, reslen) < 0)
687 return NULL;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000688 res = getstringvalue(result) + reslen - rescnt;
Guido van Rossum013142a1994-08-30 08:19:36 +0000689 --rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000690 }
691 *res++ = *fmt++;
692 }
693 else {
694 /* Got a format specifier */
695 int flags = 0;
Guido van Rossume5372401993-03-16 12:15:04 +0000696 int width = -1;
697 int prec = -1;
698 int size = 0;
Guido van Rossum6938a291993-11-11 14:51:57 +0000699 int c = '\0';
Guido van Rossume5372401993-03-16 12:15:04 +0000700 int fill;
Guido van Rossumda9c2711996-12-05 21:58:58 +0000701 object *v = NULL;
Guido van Rossum013142a1994-08-30 08:19:36 +0000702 object *temp = NULL;
Guido van Rossume5372401993-03-16 12:15:04 +0000703 char *buf;
704 int sign;
705 int len;
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000706 char tmpbuf[120]; /* For format{float,int,char}() */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000707 fmt++;
Guido van Rossum013142a1994-08-30 08:19:36 +0000708 if (*fmt == '(') {
709 char *keystart;
710 int keylen;
711 object *key;
712
713 if (dict == NULL) {
714 err_setstr(TypeError,
715 "format requires a mapping");
716 goto error;
717 }
718 ++fmt;
719 --fmtcnt;
720 keystart = fmt;
721 while (--fmtcnt >= 0 && *fmt != ')')
722 fmt++;
723 keylen = fmt - keystart;
724 ++fmt;
725 if (fmtcnt < 0) {
726 err_setstr(ValueError,
727 "incomplete format key");
728 goto error;
729 }
730 key = newsizedstringobject(keystart, keylen);
731 if (key == NULL)
732 goto error;
Guido van Rossum993952b1996-05-21 22:44:20 +0000733 if (args_owned) {
734 DECREF(args);
735 args_owned = 0;
736 }
737 args = PyObject_GetItem(dict, key);
Guido van Rossum013142a1994-08-30 08:19:36 +0000738 DECREF(key);
739 if (args == NULL) {
740 goto error;
741 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000742 args_owned = 1;
Guido van Rossum013142a1994-08-30 08:19:36 +0000743 arglen = -1;
744 argidx = -2;
745 }
Guido van Rossume5372401993-03-16 12:15:04 +0000746 while (--fmtcnt >= 0) {
747 switch (c = *fmt++) {
748 case '-': flags |= F_LJUST; continue;
749 case '+': flags |= F_SIGN; continue;
750 case ' ': flags |= F_BLANK; continue;
751 case '#': flags |= F_ALT; continue;
752 case '0': flags |= F_ZERO; continue;
753 }
754 break;
755 }
756 if (c == '*') {
757 v = getnextarg(args, arglen, &argidx);
758 if (v == NULL)
759 goto error;
760 if (!is_intobject(v)) {
761 err_setstr(TypeError, "* wants int");
762 goto error;
763 }
764 width = getintvalue(v);
765 if (width < 0)
766 width = 0;
767 if (--fmtcnt >= 0)
768 c = *fmt++;
769 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000770 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000771 width = c - '0';
772 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000773 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000774 if (!isdigit(c))
775 break;
776 if ((width*10) / 10 != width) {
777 err_setstr(ValueError,
778 "width too big");
779 goto error;
780 }
781 width = width*10 + (c - '0');
782 }
783 }
784 if (c == '.') {
785 prec = 0;
786 if (--fmtcnt >= 0)
787 c = *fmt++;
788 if (c == '*') {
789 v = getnextarg(args, arglen, &argidx);
790 if (v == NULL)
791 goto error;
792 if (!is_intobject(v)) {
793 err_setstr(TypeError,
794 "* wants int");
795 goto error;
796 }
797 prec = getintvalue(v);
798 if (prec < 0)
799 prec = 0;
800 if (--fmtcnt >= 0)
801 c = *fmt++;
802 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000803 else if (c >= 0 && isdigit(c)) {
Guido van Rossume5372401993-03-16 12:15:04 +0000804 prec = c - '0';
805 while (--fmtcnt >= 0) {
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000806 c = Py_CHARMASK(*fmt++);
Guido van Rossume5372401993-03-16 12:15:04 +0000807 if (!isdigit(c))
808 break;
809 if ((prec*10) / 10 != prec) {
810 err_setstr(ValueError,
811 "prec too big");
812 goto error;
813 }
814 prec = prec*10 + (c - '0');
815 }
816 }
817 } /* prec */
818 if (fmtcnt >= 0) {
819 if (c == 'h' || c == 'l' || c == 'L') {
820 size = c;
821 if (--fmtcnt >= 0)
822 c = *fmt++;
823 }
824 }
825 if (fmtcnt < 0) {
826 err_setstr(ValueError, "incomplete format");
827 goto error;
828 }
829 if (c != '%') {
830 v = getnextarg(args, arglen, &argidx);
831 if (v == NULL)
832 goto error;
833 }
834 sign = 0;
835 fill = ' ';
836 switch (c) {
837 case '%':
838 buf = "%";
839 len = 1;
840 break;
841 case 's':
Guido van Rossum013142a1994-08-30 08:19:36 +0000842 temp = strobject(v);
843 if (temp == NULL)
Guido van Rossume5372401993-03-16 12:15:04 +0000844 goto error;
Guido van Rossum013142a1994-08-30 08:19:36 +0000845 buf = getstringvalue(temp);
846 len = getstringsize(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000847 if (prec >= 0 && len > prec)
848 len = prec;
849 break;
850 case 'i':
851 case 'd':
852 case 'u':
853 case 'o':
854 case 'x':
855 case 'X':
856 if (c == 'i')
857 c = 'd';
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000858 buf = tmpbuf;
859 len = formatint(buf, flags, prec, c, v);
860 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000861 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000862 sign = (c == 'd');
Guido van Rossum4acdc231997-01-29 06:00:24 +0000863 if (flags&F_ZERO) {
Guido van Rossume5372401993-03-16 12:15:04 +0000864 fill = '0';
Guido van Rossum4acdc231997-01-29 06:00:24 +0000865 if ((flags&F_ALT) &&
866 (c == 'x' || c == 'X') &&
867 buf[0] == '0' && buf[1] == c) {
868 *res++ = *buf++;
869 *res++ = *buf++;
870 rescnt -= 2;
871 len -= 2;
872 width -= 2;
873 if (width < 0)
874 width = 0;
875 }
876 }
Guido van Rossume5372401993-03-16 12:15:04 +0000877 break;
878 case 'e':
879 case 'E':
880 case 'f':
881 case 'g':
882 case 'G':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000883 buf = tmpbuf;
884 len = formatfloat(buf, flags, prec, c, v);
885 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000886 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000887 sign = 1;
888 if (flags&F_ZERO)
889 fill = '0';
890 break;
891 case 'c':
Guido van Rossuma04d47b1997-01-21 16:12:09 +0000892 buf = tmpbuf;
893 len = formatchar(buf, v);
894 if (len < 0)
Guido van Rossume5372401993-03-16 12:15:04 +0000895 goto error;
Guido van Rossume5372401993-03-16 12:15:04 +0000896 break;
897 default:
898 err_setstr(ValueError,
899 "unsupported format character");
900 goto error;
901 }
902 if (sign) {
903 if (*buf == '-' || *buf == '+') {
904 sign = *buf++;
905 len--;
906 }
907 else if (flags & F_SIGN)
908 sign = '+';
909 else if (flags & F_BLANK)
910 sign = ' ';
911 else
912 sign = '\0';
913 }
914 if (width < len)
915 width = len;
916 if (rescnt < width + (sign != '\0')) {
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000917 reslen -= rescnt;
918 rescnt = width + fmtcnt + 100;
919 reslen += rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000920 if (resizestring(&result, reslen) < 0)
921 return NULL;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000922 res = getstringvalue(result) + reslen - rescnt;
Guido van Rossume5372401993-03-16 12:15:04 +0000923 }
924 if (sign) {
Guido van Rossum71e57d01993-11-11 15:03:51 +0000925 if (fill != ' ')
926 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000927 rescnt--;
928 if (width > len)
929 width--;
930 }
931 if (width > len && !(flags&F_LJUST)) {
932 do {
933 --rescnt;
934 *res++ = fill;
935 } while (--width > len);
936 }
Guido van Rossum71e57d01993-11-11 15:03:51 +0000937 if (sign && fill == ' ')
Guido van Rossum6938a291993-11-11 14:51:57 +0000938 *res++ = sign;
Guido van Rossume5372401993-03-16 12:15:04 +0000939 memcpy(res, buf, len);
940 res += len;
941 rescnt -= len;
942 while (--width >= len) {
943 --rescnt;
944 *res++ = ' ';
945 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +0000946 if (dict && (argidx < arglen) && c != '%') {
Guido van Rossum013142a1994-08-30 08:19:36 +0000947 err_setstr(TypeError,
948 "not all arguments converted");
949 goto error;
950 }
951 XDECREF(temp);
Guido van Rossume5372401993-03-16 12:15:04 +0000952 } /* '%' */
953 } /* until end */
Guido van Rossumcaeaafc1995-02-27 10:13:23 +0000954 if (argidx < arglen && !dict) {
Guido van Rossume5372401993-03-16 12:15:04 +0000955 err_setstr(TypeError, "not all arguments converted");
956 goto error;
957 }
Guido van Rossum993952b1996-05-21 22:44:20 +0000958 if (args_owned)
959 DECREF(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000960 resizestring(&result, reslen - rescnt);
961 return result;
962 error:
963 DECREF(result);
Guido van Rossum993952b1996-05-21 22:44:20 +0000964 if (args_owned)
965 DECREF(args);
Guido van Rossume5372401993-03-16 12:15:04 +0000966 return NULL;
967}
Guido van Rossum2a61e741997-01-18 07:55:05 +0000968
969
970#ifdef INTERN_STRINGS
971
972static PyObject *interned;
973
974void
975PyString_InternInPlace(p)
976 PyObject **p;
977{
978 register PyStringObject *s = (PyStringObject *)(*p);
979 PyObject *t;
980 if (s == NULL || !PyString_Check(s))
981 Py_FatalError("PyString_InternInPlace: strings only please!");
982 if ((t = s->ob_sinterned) != NULL) {
983 if (t == (PyObject *)s)
984 return;
985 Py_INCREF(t);
986 *p = t;
987 Py_DECREF(s);
988 return;
989 }
990 if (interned == NULL) {
991 interned = PyDict_New();
992 if (interned == NULL)
993 return;
994 /* Force slow lookups: */
995 PyDict_SetItem(interned, Py_None, Py_None);
996 }
997 if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
998 Py_INCREF(t);
999 *p = s->ob_sinterned = t;
1000 Py_DECREF(s);
1001 return;
1002 }
1003 t = (PyObject *)s;
1004 if (PyDict_SetItem(interned, t, t) == 0) {
1005 s->ob_sinterned = t;
1006 return;
1007 }
1008 PyErr_Clear();
1009}
1010
1011
1012PyObject *
1013PyString_InternFromString(cp)
1014 const char *cp;
1015{
1016 PyObject *s = PyString_FromString(cp);
1017 if (s == NULL)
1018 return NULL;
1019 PyString_InternInPlace(&s);
1020 return s;
1021}
1022
1023#endif