blob: 7012a4f4440e4582f4caf420a62a653639cae7c5 [file] [log] [blame]
Guido van Rossume270b431992-09-03 20:21:07 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossume270b431992-09-03 20:21:07 +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 Rossume270b431992-09-03 20:21:07 +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 Rossume270b431992-09-03 20:21:07 +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 Rossume270b431992-09-03 20:21:07 +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 Rossume270b431992-09-03 20:21:07 +000029
30******************************************************************/
31
32/* strop module */
33
34#include "allobjects.h"
35#include "modsupport.h"
36
Guido van Rossumd05eb8b1993-07-08 11:12:36 +000037#include <ctype.h>
Guido van Rossume22e6441993-07-09 10:51:31 +000038/* XXX This file assumes that the <ctype.h> is*() functions
39 XXX are defined for all 8-bit characters! */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +000040
Guido van Rossumb6775db1994-08-01 11:34:53 +000041#include <errno.h>
42
Guido van Rossum7999a5c1996-08-08 19:16:15 +000043/* The lstrip(), rstrip() and strip() functions are implemented
44 in do_strip(), which uses an additional parameter to indicate what
45 type of strip should occur. */
46
47#define LEFTSTRIP 0
48#define RIGHTSTRIP 1
49#define BOTHSTRIP 2
50
Guido van Rossume270b431992-09-03 20:21:07 +000051
52static object *
Guido van Rossum7999a5c1996-08-08 19:16:15 +000053split_whitespace(s, len, maxsplit)
Guido van Rossume270b431992-09-03 20:21:07 +000054 char *s;
Guido van Rossum009e79b1995-05-03 17:40:23 +000055 int len;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000056 int maxsplit;
Guido van Rossum009e79b1995-05-03 17:40:23 +000057{
58 int i, j, err;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000059 int countsplit;
Guido van Rossume270b431992-09-03 20:21:07 +000060 object *list, *item;
61
Guido van Rossume270b431992-09-03 20:21:07 +000062 list = newlistobject(0);
63 if (list == NULL)
64 return NULL;
65
66 i = 0;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000067 countsplit = 0;
68
Guido van Rossume270b431992-09-03 20:21:07 +000069 while (i < len) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +000070 while (i < len && isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000071 i = i+1;
72 }
73 j = i;
Guido van Rossumee1813d1995-02-14 00:58:59 +000074 while (i < len && !isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000075 i = i+1;
76 }
77 if (j < i) {
78 item = newsizedstringobject(s+j, (int)(i-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +000079 if (item == NULL) {
80 DECREF(list);
81 return NULL;
82 }
83 err = addlistitem(list, item);
84 DECREF(item);
85 if (err < 0) {
Guido van Rossume270b431992-09-03 20:21:07 +000086 DECREF(list);
87 return NULL;
88 }
Guido van Rossum7999a5c1996-08-08 19:16:15 +000089
90 countsplit++;
91 if (maxsplit && (countsplit >= maxsplit)) {
92 item = newsizedstringobject(s+i, (int)(len - i));
93 if (item == NULL) {
94 DECREF(list);
95 return NULL;
96 }
97 err = addlistitem(list, item);
98 DECREF(item);
99 if (err < 0) {
100 DECREF(list);
101 return NULL;
102 }
103 i = len;
104 }
105
Guido van Rossume270b431992-09-03 20:21:07 +0000106 }
107 }
108
109 return list;
110}
111
112
113static object *
114strop_splitfields(self, args)
115 object *self; /* Not used */
116 object *args;
117{
Guido van Rossum572d2d91993-11-05 10:14:49 +0000118 int len, n, i, j, err;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000119 int splitcount, maxsplit;
Guido van Rossume270b431992-09-03 20:21:07 +0000120 char *s, *sub;
Guido van Rossume270b431992-09-03 20:21:07 +0000121 object *list, *item;
122
Guido van Rossum009e79b1995-05-03 17:40:23 +0000123 sub = NULL;
124 n = 0;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000125 splitcount = 0;
126 maxsplit = 0;
127 if (!newgetargs(args, "s#|z#i", &s, &len, &sub, &n, &maxsplit))
Guido van Rossume270b431992-09-03 20:21:07 +0000128 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000129 if (sub == NULL)
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000130 return split_whitespace(s, len, maxsplit);
Guido van Rossume270b431992-09-03 20:21:07 +0000131 if (n == 0) {
132 err_setstr(ValueError, "empty separator");
133 return NULL;
134 }
135
136 list = newlistobject(0);
137 if (list == NULL)
138 return NULL;
139
140 i = j = 0;
141 while (i+n <= len) {
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000142 if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) {
Guido van Rossume270b431992-09-03 20:21:07 +0000143 item = newsizedstringobject(s+j, (int)(i-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000144 if (item == NULL)
145 goto fail;
146 err = addlistitem(list, item);
147 DECREF(item);
148 if (err < 0)
149 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000150 i = j = i + n;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000151 splitcount++;
152 if (maxsplit && (splitcount >= maxsplit))
153 break;
Guido van Rossume270b431992-09-03 20:21:07 +0000154 }
155 else
156 i++;
157 }
158 item = newsizedstringobject(s+j, (int)(len-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000159 if (item == NULL)
160 goto fail;
161 err = addlistitem(list, item);
162 DECREF(item);
163 if (err < 0)
164 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000165
166 return list;
Guido van Rossum572d2d91993-11-05 10:14:49 +0000167
168 fail:
169 DECREF(list);
170 return NULL;
Guido van Rossume270b431992-09-03 20:21:07 +0000171}
172
173
174static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000175strop_joinfields(self, args)
176 object *self; /* Not used */
177 object *args;
178{
179 object *seq, *item, *res;
180 object * (*getitem) FPROTO((object *, int));
181 char *sep, *p;
182 int seplen, seqlen, reslen, itemlen, i;
183
Guido van Rossum009e79b1995-05-03 17:40:23 +0000184 sep = NULL;
185 seplen = 0;
186 if (!newgetargs(args, "O|s#", &seq, &sep, &seplen))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000187 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000188 if (sep == NULL) {
189 sep = " ";
190 seplen = 1;
191 }
Guido van Rossumc89705d1992-11-26 08:54:07 +0000192 if (is_listobject(seq)) {
193 getitem = getlistitem;
194 seqlen = getlistsize(seq);
195 }
196 else if (is_tupleobject(seq)) {
197 getitem = gettupleitem;
198 seqlen = gettuplesize(seq);
199 }
200 else {
201 err_setstr(TypeError, "first argument must be list/tuple");
202 return NULL;
203 }
204 reslen = 0;
205 for (i = 0; i < seqlen; i++) {
206 item = getitem(seq, i);
207 if (!is_stringobject(item)) {
208 err_setstr(TypeError,
209 "first argument must be list/tuple of strings");
210 return NULL;
211 }
212 if (i > 0)
213 reslen = reslen + seplen;
214 reslen = reslen + getstringsize(item);
215 }
216 if (seqlen == 1) {
217 /* Optimization if there's only one item */
218 item = getitem(seq, 0);
219 INCREF(item);
220 return item;
221 }
222 res = newsizedstringobject((char *)NULL, reslen);
223 if (res == NULL)
224 return NULL;
225 p = getstringvalue(res);
226 for (i = 0; i < seqlen; i++) {
227 item = getitem(seq, i);
228 if (i > 0) {
229 memcpy(p, sep, seplen);
230 p += seplen;
231 }
232 itemlen = getstringsize(item);
233 memcpy(p, getstringvalue(item), itemlen);
234 p += itemlen;
235 }
236 if (p != getstringvalue(res) + reslen) {
237 err_setstr(SystemError, "strop.joinfields: assertion failed");
238 return NULL;
239 }
240 return res;
241}
242
243
244static object *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000245strop_find(self, args)
Guido van Rossume270b431992-09-03 20:21:07 +0000246 object *self; /* Not used */
247 object *args;
248{
249 char *s, *sub;
250 int len, n, i;
251
252 if (getargs(args, "(s#s#i)", &s, &len, &sub, &n, &i)) {
Guido van Rossumee9012f1993-10-26 15:23:55 +0000253 if (i < 0)
254 i += len;
Guido van Rossum602099a1994-09-14 13:32:22 +0000255 if (i < 0)
256 i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000257 }
258 else {
259 err_clear();
260 if (!getargs(args, "(s#s#)", &s, &len, &sub, &n))
261 return NULL;
262 i = 0;
263 }
264
265 if (n == 0)
266 return newintobject((long)i);
267
268 len -= n;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000269 for (; i <= len; ++i)
270 if (s[i] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000271 (n == 1 || memcmp(&s[i+1], &sub[1], n-1) == 0))
Guido van Rossumee9012f1993-10-26 15:23:55 +0000272 return newintobject((long)i);
273
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000274 return newintobject(-1L);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000275}
276
277
278static object *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000279strop_rfind(self, args)
Guido van Rossumee9012f1993-10-26 15:23:55 +0000280 object *self; /* Not used */
281 object *args;
282{
283 char *s, *sub;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000284 int len, n, i, j;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000285
286 if (getargs(args, "(s#s#i)", &s, &len, &sub, &n, &i)) {
287 if (i < 0)
288 i += len;
Guido van Rossum602099a1994-09-14 13:32:22 +0000289 if (i < 0)
290 i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000291 }
Guido van Rossumee9012f1993-10-26 15:23:55 +0000292 else {
293 err_clear();
294 if (!getargs(args, "(s#s#)", &s, &len, &sub, &n))
295 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000296 i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000297 }
298
299 if (n == 0)
Guido van Rossumc65a5251994-08-05 13:44:50 +0000300 return newintobject((long)len);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000301
Guido van Rossumb6775db1994-08-01 11:34:53 +0000302 for (j = len-n; j >= i; --j)
303 if (s[j] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000304 (n == 1 || memcmp(&s[j+1], &sub[1], n-1) == 0))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000305 return newintobject((long)j);
Guido van Rossume270b431992-09-03 20:21:07 +0000306
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000307 return newintobject(-1L);
Guido van Rossume270b431992-09-03 20:21:07 +0000308}
309
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000310static object *
311do_strip(args, striptype)
312 object *args;
313 int striptype;
314{
315 char *s;
316 int len, i, j;
317
318
319 if (!getargs(args, "s#", &s, &len))
320 return NULL;
321
322 i = 0;
323 if (striptype != RIGHTSTRIP) {
324 while (i < len && isspace(Py_CHARMASK(s[i]))) {
325 i++;
326 }
327 }
328
329
330 j = len;
331 if (striptype != LEFTSTRIP) {
332 do {
333 j--;
334 } while (j >= i && isspace(Py_CHARMASK(s[j])));
335 j++;
336 }
337
338 if (i == 0 && j == len) {
339 INCREF(args);
340 return args;
341 }
342 else
343 return newsizedstringobject(s+i, j-i);
344}
345
Guido van Rossume270b431992-09-03 20:21:07 +0000346
347static object *
348strop_strip(self, args)
349 object *self; /* Not used */
350 object *args;
351{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000352 return do_strip(args, BOTHSTRIP);
353}
Guido van Rossume270b431992-09-03 20:21:07 +0000354
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000355static object *
356strop_lstrip(self, args)
357 object *self; /* Not used */
358 object *args;
359{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000360 return do_strip(args, LEFTSTRIP);
361}
Guido van Rossume270b431992-09-03 20:21:07 +0000362
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000363static object *
364strop_rstrip(self, args)
365 object *self; /* Not used */
366 object *args;
367{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000368 return do_strip(args, RIGHTSTRIP);
Guido van Rossume270b431992-09-03 20:21:07 +0000369}
370
371
Guido van Rossum5c850621992-09-11 23:55:51 +0000372static object *
373strop_lower(self, args)
374 object *self; /* Not used */
375 object *args;
376{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000377 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000378 int i, n;
379 object *new;
380 int changed;
381
382 if (!getargs(args, "s#", &s, &n))
383 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000384 new = newsizedstringobject(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000385 if (new == NULL)
386 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000387 s_new = getstringvalue(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000388 changed = 0;
389 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000390 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000391 if (isupper(c)) {
392 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000393 *s_new = tolower(c);
394 } else
395 *s_new = c;
396 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000397 }
398 if (!changed) {
399 DECREF(new);
400 INCREF(args);
401 return args;
402 }
403 return new;
404}
405
406
407static object *
408strop_upper(self, args)
409 object *self; /* Not used */
410 object *args;
411{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000412 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000413 int i, n;
414 object *new;
415 int changed;
416
417 if (!getargs(args, "s#", &s, &n))
418 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000419 new = newsizedstringobject(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000420 if (new == NULL)
421 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000422 s_new = getstringvalue(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000423 changed = 0;
424 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000425 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000426 if (islower(c)) {
427 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000428 *s_new = toupper(c);
429 } else
430 *s_new = c;
431 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000432 }
433 if (!changed) {
434 DECREF(new);
435 INCREF(args);
436 return args;
437 }
438 return new;
439}
440
441
442static object *
Guido van Rossum27457531996-06-12 04:24:52 +0000443strop_capitalize(self, args)
444 object *self; /* Not used */
445 object *args;
446{
447 char *s, *s_new;
448 int i, n;
449 object *new;
450 int changed;
451
452 if (!getargs(args, "s#", &s, &n))
453 return NULL;
454 new = newsizedstringobject(NULL, n);
455 if (new == NULL)
456 return NULL;
457 s_new = getstringvalue(new);
458 changed = 0;
Guido van Rossum529c9631996-06-17 16:59:33 +0000459 if (0 < n) {
Guido van Rossum27457531996-06-12 04:24:52 +0000460 int c = Py_CHARMASK(*s++);
461 if (islower(c)) {
462 changed = 1;
463 *s_new = toupper(c);
464 } else
465 *s_new = c;
466 s_new++;
467 }
468 for (i = 1; i < n; i++) {
469 int c = Py_CHARMASK(*s++);
470 if (isupper(c)) {
471 changed = 1;
472 *s_new = tolower(c);
473 } else
474 *s_new = c;
475 s_new++;
476 }
477 if (!changed) {
478 DECREF(new);
479 INCREF(args);
480 return args;
481 }
482 return new;
483}
484
485
486static object *
Guido van Rossum5c850621992-09-11 23:55:51 +0000487strop_swapcase(self, args)
488 object *self; /* Not used */
489 object *args;
490{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000491 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000492 int i, n;
493 object *new;
494 int changed;
495
496 if (!getargs(args, "s#", &s, &n))
497 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000498 new = newsizedstringobject(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000499 if (new == NULL)
500 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000501 s_new = getstringvalue(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000502 changed = 0;
503 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000504 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000505 if (islower(c)) {
506 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000507 *s_new = toupper(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000508 }
509 else if (isupper(c)) {
510 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000511 *s_new = tolower(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000512 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000513 else
514 *s_new = c;
515 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000516 }
517 if (!changed) {
518 DECREF(new);
519 INCREF(args);
520 return args;
521 }
522 return new;
523}
524
525
Guido van Rossumb6775db1994-08-01 11:34:53 +0000526static object *
527strop_atoi(self, args)
528 object *self; /* Not used */
529 object *args;
530{
531 extern long mystrtol PROTO((const char *, char **, int));
532 extern unsigned long mystrtoul PROTO((const char *, char **, int));
533 char *s, *end;
534 int base = 10;
535 long x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000536 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000537
538 if (args != NULL && is_tupleobject(args)) {
539 if (!getargs(args, "(si)", &s, &base))
540 return NULL;
541 if (base != 0 && base < 2 || base > 36) {
542 err_setstr(ValueError, "invalid base for atoi()");
543 return NULL;
544 }
545 }
546 else if (!getargs(args, "s", &s))
547 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000548 while (*s && isspace(Py_CHARMASK(*s)))
549 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000550 if (s[0] == '\0') {
551 err_setstr(ValueError, "empty string for atoi()");
552 return NULL;
553 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000554 errno = 0;
555 if (base == 0 && s[0] == '0')
556 x = (long) mystrtoul(s, &end, base);
557 else
558 x = mystrtol(s, &end, base);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000559 while (*end && isspace(Py_CHARMASK(*end)))
560 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000561 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000562 sprintf(buffer, "invalid literal for atoi(): %.200s", s);
563 err_setstr(ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000564 return NULL;
565 }
566 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000567 sprintf(buffer, "atoi() literal too large: %.200s", s);
568 err_setstr(ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000569 return NULL;
570 }
571 return newintobject(x);
572}
573
574
575static object *
576strop_atol(self, args)
577 object *self; /* Not used */
578 object *args;
579{
580 char *s, *end;
581 int base = 10;
582 object *x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000583 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000584
585 if (args != NULL && is_tupleobject(args)) {
586 if (!getargs(args, "(si)", &s, &base))
587 return NULL;
588 if (base != 0 && base < 2 || base > 36) {
589 err_setstr(ValueError, "invalid base for atol()");
590 return NULL;
591 }
592 }
593 else if (!getargs(args, "s", &s))
594 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000595 while (*s && isspace(Py_CHARMASK(*s)))
596 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000597 if (s[0] == '\0') {
598 err_setstr(ValueError, "empty string for atol()");
599 return NULL;
600 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000601 x = long_escan(s, &end, base);
602 if (x == NULL)
603 return NULL;
604 if (base == 0 && (*end == 'l' || *end == 'L'))
605 end++;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000606 while (*end && isspace(Py_CHARMASK(*end)))
607 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000608 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000609 sprintf(buffer, "invalid literal for atol(): %.200s", s);
610 err_setstr(ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000611 DECREF(x);
612 return NULL;
613 }
614 return x;
615}
616
617
618static object *
619strop_atof(self, args)
620 object *self; /* Not used */
621 object *args;
622{
623 extern double strtod PROTO((const char *, char **));
624 char *s, *end;
625 double x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000626 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627
628 if (!getargs(args, "s", &s))
629 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000630 while (*s && isspace(Py_CHARMASK(*s)))
631 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000632 if (s[0] == '\0') {
633 err_setstr(ValueError, "empty string for atof()");
634 return NULL;
635 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000636 errno = 0;
637 x = strtod(s, &end);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000638 while (*end && isspace(Py_CHARMASK(*end)))
639 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000641 sprintf(buffer, "invalid literal for atof(): %.200s", s);
642 err_setstr(ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000643 return NULL;
644 }
645 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000646 sprintf(buffer, "atof() literal too large: %.200s", s);
647 err_setstr(ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000648 return NULL;
649 }
650 return newfloatobject(x);
651}
652
653
Guido van Rossumed7253c1996-07-23 18:12:39 +0000654static PyObject *
655strop_maketrans(self, args)
656 PyObject *self; /* Not used */
657 PyObject *args;
658{
659 unsigned char c[256], *from=NULL, *to=NULL;
660 int i, fromlen=0, tolen=0;
661
662 if (PyTuple_Size(args)!=0) {
663 if (!PyArg_ParseTuple(args, "s#s#", &from, &fromlen,
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000664 &to, &tolen))
Guido van Rossumed7253c1996-07-23 18:12:39 +0000665 return NULL;
666 }
667
668 if (fromlen!=tolen) {
669 PyErr_SetString(ValueError,
670 "maketrans arguments must have same length");
671 return NULL;
672 }
673 for(i=0; i<256; i++)
674 c[i]=(unsigned char)i;
675 for(i=0; i<fromlen; i++) {
676 c[from[i]]=to[i];
677 }
678 return PyString_FromStringAndSize((char *)c, 256);
679}
680
681
Guido van Rossuma3127e81995-09-13 17:39:06 +0000682static object *
683strop_translate(self, args)
684 object *self;
685 object *args;
686{
Guido van Rossumed7253c1996-07-23 18:12:39 +0000687 char *input, *table, *output, *output_start, *delete=NULL;
688 int inlen, tablen, dellen;
689 PyObject *result;
690 int i, trans_table[256];
Guido van Rossuma3127e81995-09-13 17:39:06 +0000691
Guido van Rossumed7253c1996-07-23 18:12:39 +0000692 if (!PyArg_ParseTuple(args, "s#s#|s#", &input, &inlen,
693 &table, &tablen, &delete, &dellen))
Guido van Rossuma3127e81995-09-13 17:39:06 +0000694 return NULL;
695 if (tablen != 256) {
Guido van Rossumed7253c1996-07-23 18:12:39 +0000696 PyErr_SetString(ValueError,
Guido van Rossuma3127e81995-09-13 17:39:06 +0000697 "translation table must be 256 characters long");
698 return NULL;
699 }
Guido van Rossumed7253c1996-07-23 18:12:39 +0000700 for(i=0; i<256; i++)
701 trans_table[i]=Py_CHARMASK(table[i]);
702 if (delete!=NULL) {
703 for(i=0; i<dellen; i++)
704 trans_table[delete[i]]=-1;
705 }
706
707 result = PyString_FromStringAndSize((char *)NULL, inlen);
Guido van Rossuma3127e81995-09-13 17:39:06 +0000708 if (result == NULL)
709 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000710 output_start = output = PyString_AsString(result);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000711 if (delete!=NULL && dellen!=0) {
Guido van Rossumed7253c1996-07-23 18:12:39 +0000712 for (i = 0; i < inlen; i++) {
713 int c = Py_CHARMASK(*input++);
714 if (trans_table[c]!=-1)
715 *output++ = (char)trans_table[c];
716 }
717 /* Fix the size of the resulting string */
718 if (inlen > 0 &&_PyString_Resize(&result, output-output_start))
719 return NULL;
720 } else {
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000721 /* If no deletions are required, use a faster loop */
Guido van Rossumed7253c1996-07-23 18:12:39 +0000722 for (i = 0; i < inlen; i++) {
723 int c = Py_CHARMASK(*input++);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000724 *output++ = (char)trans_table[c];
725 }
Guido van Rossuma3127e81995-09-13 17:39:06 +0000726 }
727 return result;
728}
729
730
Guido van Rossume270b431992-09-03 20:21:07 +0000731/* List of functions defined in the module */
732
733static struct methodlist strop_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000734 {"atof", strop_atof},
735 {"atoi", strop_atoi},
736 {"atol", strop_atol},
Guido van Rossum27457531996-06-12 04:24:52 +0000737 {"capitalize", strop_capitalize},
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000738 {"find", strop_find},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000739 {"join", strop_joinfields, 1},
740 {"joinfields", strop_joinfields, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000741 {"lstrip", strop_lstrip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000742 {"lower", strop_lower},
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000743 {"rfind", strop_rfind},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000744 {"rstrip", strop_rstrip},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000745 {"split", strop_splitfields, 1},
746 {"splitfields", strop_splitfields, 1},
Guido van Rossume270b431992-09-03 20:21:07 +0000747 {"strip", strop_strip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000748 {"swapcase", strop_swapcase},
Guido van Rossumed7253c1996-07-23 18:12:39 +0000749 {"maketrans", strop_maketrans, 1},
Guido van Rossuma3127e81995-09-13 17:39:06 +0000750 {"translate", strop_translate, 1},
Guido van Rossum5c850621992-09-11 23:55:51 +0000751 {"upper", strop_upper},
Guido van Rossume270b431992-09-03 20:21:07 +0000752 {NULL, NULL} /* sentinel */
753};
754
755
Guido van Rossume270b431992-09-03 20:21:07 +0000756void
757initstrop()
758{
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000759 object *m, *d, *s;
760 char buf[256];
761 int c, n;
762 m = initmodule("strop", strop_methods);
763 d = getmoduledict(m);
Guido van Rossume22e6441993-07-09 10:51:31 +0000764
765 /* Create 'whitespace' object */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000766 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000767 for (c = 0; c < 256; c++) {
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000768 if (isspace(c))
769 buf[n++] = c;
770 }
Sjoerd Mullenderd96ec441993-09-14 08:37:39 +0000771 s = newsizedstringobject(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000772 if (s) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000773 dictinsert(d, "whitespace", s);
774 DECREF(s);
775 }
776 /* Create 'lowercase' object */
777 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000778 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000779 if (islower(c))
780 buf[n++] = c;
781 }
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000782 s = newsizedstringobject(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000783 if (s) {
784 dictinsert(d, "lowercase", s);
785 DECREF(s);
786 }
787
788 /* Create 'uppercase' object */
789 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000790 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000791 if (isupper(c))
792 buf[n++] = c;
793 }
794 s = newsizedstringobject(buf, n);
795 if (s) {
796 dictinsert(d, "uppercase", s);
797 DECREF(s);
798 }
799
800 if (err_occurred())
801 fatal("can't initialize module strop");
Guido van Rossume270b431992-09-03 20:21:07 +0000802}