blob: 171b712184bd64c08217d778de4f2fe899e70896 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* strop module */
26
27#include "allobjects.h"
28#include "modsupport.h"
29
Guido van Rossumd05eb8b1993-07-08 11:12:36 +000030#include <ctype.h>
Guido van Rossume22e6441993-07-09 10:51:31 +000031/* XXX This file assumes that the <ctype.h> is*() functions
32 XXX are defined for all 8-bit characters! */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +000033
Guido van Rossumb6775db1994-08-01 11:34:53 +000034#include <errno.h>
35
Guido van Rossum7999a5c1996-08-08 19:16:15 +000036/* The lstrip(), rstrip() and strip() functions are implemented
37 in do_strip(), which uses an additional parameter to indicate what
38 type of strip should occur. */
39
40#define LEFTSTRIP 0
41#define RIGHTSTRIP 1
42#define BOTHSTRIP 2
43
Guido van Rossume270b431992-09-03 20:21:07 +000044
45static object *
Guido van Rossum7999a5c1996-08-08 19:16:15 +000046split_whitespace(s, len, maxsplit)
Guido van Rossume270b431992-09-03 20:21:07 +000047 char *s;
Guido van Rossum009e79b1995-05-03 17:40:23 +000048 int len;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000049 int maxsplit;
Guido van Rossum009e79b1995-05-03 17:40:23 +000050{
51 int i, j, err;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000052 int countsplit;
Guido van Rossume270b431992-09-03 20:21:07 +000053 object *list, *item;
54
Guido van Rossume270b431992-09-03 20:21:07 +000055 list = newlistobject(0);
56 if (list == NULL)
57 return NULL;
58
59 i = 0;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000060 countsplit = 0;
61
Guido van Rossume270b431992-09-03 20:21:07 +000062 while (i < len) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +000063 while (i < len && isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000064 i = i+1;
65 }
66 j = i;
Guido van Rossumee1813d1995-02-14 00:58:59 +000067 while (i < len && !isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000068 i = i+1;
69 }
70 if (j < i) {
71 item = newsizedstringobject(s+j, (int)(i-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +000072 if (item == NULL) {
73 DECREF(list);
74 return NULL;
75 }
76 err = addlistitem(list, item);
77 DECREF(item);
78 if (err < 0) {
Guido van Rossume270b431992-09-03 20:21:07 +000079 DECREF(list);
80 return NULL;
81 }
Guido van Rossum7999a5c1996-08-08 19:16:15 +000082
83 countsplit++;
84 if (maxsplit && (countsplit >= maxsplit)) {
85 item = newsizedstringobject(s+i, (int)(len - i));
86 if (item == NULL) {
87 DECREF(list);
88 return NULL;
89 }
90 err = addlistitem(list, item);
91 DECREF(item);
92 if (err < 0) {
93 DECREF(list);
94 return NULL;
95 }
96 i = len;
97 }
98
Guido van Rossume270b431992-09-03 20:21:07 +000099 }
100 }
101
102 return list;
103}
104
105
106static object *
107strop_splitfields(self, args)
108 object *self; /* Not used */
109 object *args;
110{
Guido van Rossum572d2d91993-11-05 10:14:49 +0000111 int len, n, i, j, err;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000112 int splitcount, maxsplit;
Guido van Rossume270b431992-09-03 20:21:07 +0000113 char *s, *sub;
Guido van Rossume270b431992-09-03 20:21:07 +0000114 object *list, *item;
115
Guido van Rossum009e79b1995-05-03 17:40:23 +0000116 sub = NULL;
117 n = 0;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000118 splitcount = 0;
119 maxsplit = 0;
120 if (!newgetargs(args, "s#|z#i", &s, &len, &sub, &n, &maxsplit))
Guido van Rossume270b431992-09-03 20:21:07 +0000121 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000122 if (sub == NULL)
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000123 return split_whitespace(s, len, maxsplit);
Guido van Rossume270b431992-09-03 20:21:07 +0000124 if (n == 0) {
125 err_setstr(ValueError, "empty separator");
126 return NULL;
127 }
128
129 list = newlistobject(0);
130 if (list == NULL)
131 return NULL;
132
133 i = j = 0;
134 while (i+n <= len) {
135 if (s[i] == sub[0] && (n == 1 || strncmp(s+i, sub, n) == 0)) {
136 item = newsizedstringobject(s+j, (int)(i-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000137 if (item == NULL)
138 goto fail;
139 err = addlistitem(list, item);
140 DECREF(item);
141 if (err < 0)
142 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000143 i = j = i + n;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000144 splitcount++;
145 if (maxsplit && (splitcount >= maxsplit))
146 break;
Guido van Rossume270b431992-09-03 20:21:07 +0000147 }
148 else
149 i++;
150 }
151 item = newsizedstringobject(s+j, (int)(len-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000152 if (item == NULL)
153 goto fail;
154 err = addlistitem(list, item);
155 DECREF(item);
156 if (err < 0)
157 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000158
159 return list;
Guido van Rossum572d2d91993-11-05 10:14:49 +0000160
161 fail:
162 DECREF(list);
163 return NULL;
Guido van Rossume270b431992-09-03 20:21:07 +0000164}
165
166
167static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000168strop_joinfields(self, args)
169 object *self; /* Not used */
170 object *args;
171{
172 object *seq, *item, *res;
173 object * (*getitem) FPROTO((object *, int));
174 char *sep, *p;
175 int seplen, seqlen, reslen, itemlen, i;
176
Guido van Rossum009e79b1995-05-03 17:40:23 +0000177 sep = NULL;
178 seplen = 0;
179 if (!newgetargs(args, "O|s#", &seq, &sep, &seplen))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000180 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000181 if (sep == NULL) {
182 sep = " ";
183 seplen = 1;
184 }
Guido van Rossumc89705d1992-11-26 08:54:07 +0000185 if (is_listobject(seq)) {
186 getitem = getlistitem;
187 seqlen = getlistsize(seq);
188 }
189 else if (is_tupleobject(seq)) {
190 getitem = gettupleitem;
191 seqlen = gettuplesize(seq);
192 }
193 else {
194 err_setstr(TypeError, "first argument must be list/tuple");
195 return NULL;
196 }
197 reslen = 0;
198 for (i = 0; i < seqlen; i++) {
199 item = getitem(seq, i);
200 if (!is_stringobject(item)) {
201 err_setstr(TypeError,
202 "first argument must be list/tuple of strings");
203 return NULL;
204 }
205 if (i > 0)
206 reslen = reslen + seplen;
207 reslen = reslen + getstringsize(item);
208 }
209 if (seqlen == 1) {
210 /* Optimization if there's only one item */
211 item = getitem(seq, 0);
212 INCREF(item);
213 return item;
214 }
215 res = newsizedstringobject((char *)NULL, reslen);
216 if (res == NULL)
217 return NULL;
218 p = getstringvalue(res);
219 for (i = 0; i < seqlen; i++) {
220 item = getitem(seq, i);
221 if (i > 0) {
222 memcpy(p, sep, seplen);
223 p += seplen;
224 }
225 itemlen = getstringsize(item);
226 memcpy(p, getstringvalue(item), itemlen);
227 p += itemlen;
228 }
229 if (p != getstringvalue(res) + reslen) {
230 err_setstr(SystemError, "strop.joinfields: assertion failed");
231 return NULL;
232 }
233 return res;
234}
235
236
237static object *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000238strop_find(self, args)
Guido van Rossume270b431992-09-03 20:21:07 +0000239 object *self; /* Not used */
240 object *args;
241{
242 char *s, *sub;
243 int len, n, i;
244
245 if (getargs(args, "(s#s#i)", &s, &len, &sub, &n, &i)) {
Guido van Rossumee9012f1993-10-26 15:23:55 +0000246 if (i < 0)
247 i += len;
Guido van Rossum602099a1994-09-14 13:32:22 +0000248 if (i < 0)
249 i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000250 }
251 else {
252 err_clear();
253 if (!getargs(args, "(s#s#)", &s, &len, &sub, &n))
254 return NULL;
255 i = 0;
256 }
257
258 if (n == 0)
259 return newintobject((long)i);
260
261 len -= n;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000262 for (; i <= len; ++i)
263 if (s[i] == sub[0] &&
264 (n == 1 || strncmp(&s[i+1], &sub[1], n-1) == 0))
265 return newintobject((long)i);
266
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000267 return newintobject(-1L);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000268}
269
270
271static object *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000272strop_rfind(self, args)
Guido van Rossumee9012f1993-10-26 15:23:55 +0000273 object *self; /* Not used */
274 object *args;
275{
276 char *s, *sub;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000277 int len, n, i, j;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000278
279 if (getargs(args, "(s#s#i)", &s, &len, &sub, &n, &i)) {
280 if (i < 0)
281 i += len;
Guido van Rossum602099a1994-09-14 13:32:22 +0000282 if (i < 0)
283 i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000284 }
Guido van Rossumee9012f1993-10-26 15:23:55 +0000285 else {
286 err_clear();
287 if (!getargs(args, "(s#s#)", &s, &len, &sub, &n))
288 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000289 i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000290 }
291
292 if (n == 0)
Guido van Rossumc65a5251994-08-05 13:44:50 +0000293 return newintobject((long)len);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000294
Guido van Rossumb6775db1994-08-01 11:34:53 +0000295 for (j = len-n; j >= i; --j)
296 if (s[j] == sub[0] &&
297 (n == 1 || strncmp(&s[j+1], &sub[1], n-1) == 0))
298 return newintobject((long)j);
Guido van Rossume270b431992-09-03 20:21:07 +0000299
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000300 return newintobject(-1L);
Guido van Rossume270b431992-09-03 20:21:07 +0000301}
302
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000303static object *
304do_strip(args, striptype)
305 object *args;
306 int striptype;
307{
308 char *s;
309 int len, i, j;
310
311
312 if (!getargs(args, "s#", &s, &len))
313 return NULL;
314
315 i = 0;
316 if (striptype != RIGHTSTRIP) {
317 while (i < len && isspace(Py_CHARMASK(s[i]))) {
318 i++;
319 }
320 }
321
322
323 j = len;
324 if (striptype != LEFTSTRIP) {
325 do {
326 j--;
327 } while (j >= i && isspace(Py_CHARMASK(s[j])));
328 j++;
329 }
330
331 if (i == 0 && j == len) {
332 INCREF(args);
333 return args;
334 }
335 else
336 return newsizedstringobject(s+i, j-i);
337}
338
Guido van Rossume270b431992-09-03 20:21:07 +0000339
340static object *
341strop_strip(self, args)
342 object *self; /* Not used */
343 object *args;
344{
345 char *s;
346 int len, i, j;
Guido van Rossume270b431992-09-03 20:21:07 +0000347
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000348 return do_strip(args, BOTHSTRIP);
349}
Guido van Rossume270b431992-09-03 20:21:07 +0000350
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000351static object *
352strop_lstrip(self, args)
353 object *self; /* Not used */
354 object *args;
355{
356 char *s;
357 int len, i, j;
Guido van Rossume270b431992-09-03 20:21:07 +0000358
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000359 return do_strip(args, LEFTSTRIP);
360}
Guido van Rossume270b431992-09-03 20:21:07 +0000361
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000362static object *
363strop_rstrip(self, args)
364 object *self; /* Not used */
365 object *args;
366{
367 char *s;
368 int len, i, j;
369
370 return do_strip(args, RIGHTSTRIP);
Guido van Rossume270b431992-09-03 20:21:07 +0000371}
372
373
Guido van Rossum5c850621992-09-11 23:55:51 +0000374static object *
375strop_lower(self, args)
376 object *self; /* Not used */
377 object *args;
378{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000379 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000380 int i, n;
381 object *new;
382 int changed;
383
384 if (!getargs(args, "s#", &s, &n))
385 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000386 new = newsizedstringobject(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000387 if (new == NULL)
388 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000389 s_new = getstringvalue(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000390 changed = 0;
391 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000392 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000393 if (isupper(c)) {
394 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000395 *s_new = tolower(c);
396 } else
397 *s_new = c;
398 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000399 }
400 if (!changed) {
401 DECREF(new);
402 INCREF(args);
403 return args;
404 }
405 return new;
406}
407
408
409static object *
410strop_upper(self, args)
411 object *self; /* Not used */
412 object *args;
413{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000414 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000415 int i, n;
416 object *new;
417 int changed;
418
419 if (!getargs(args, "s#", &s, &n))
420 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000421 new = newsizedstringobject(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000422 if (new == NULL)
423 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000424 s_new = getstringvalue(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000425 changed = 0;
426 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000427 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000428 if (islower(c)) {
429 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000430 *s_new = toupper(c);
431 } else
432 *s_new = c;
433 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000434 }
435 if (!changed) {
436 DECREF(new);
437 INCREF(args);
438 return args;
439 }
440 return new;
441}
442
443
444static object *
Guido van Rossum27457531996-06-12 04:24:52 +0000445strop_capitalize(self, args)
446 object *self; /* Not used */
447 object *args;
448{
449 char *s, *s_new;
450 int i, n;
451 object *new;
452 int changed;
453
454 if (!getargs(args, "s#", &s, &n))
455 return NULL;
456 new = newsizedstringobject(NULL, n);
457 if (new == NULL)
458 return NULL;
459 s_new = getstringvalue(new);
460 changed = 0;
Guido van Rossum529c9631996-06-17 16:59:33 +0000461 if (0 < n) {
Guido van Rossum27457531996-06-12 04:24:52 +0000462 int c = Py_CHARMASK(*s++);
463 if (islower(c)) {
464 changed = 1;
465 *s_new = toupper(c);
466 } else
467 *s_new = c;
468 s_new++;
469 }
470 for (i = 1; i < n; i++) {
471 int c = Py_CHARMASK(*s++);
472 if (isupper(c)) {
473 changed = 1;
474 *s_new = tolower(c);
475 } else
476 *s_new = c;
477 s_new++;
478 }
479 if (!changed) {
480 DECREF(new);
481 INCREF(args);
482 return args;
483 }
484 return new;
485}
486
487
488static object *
Guido van Rossum5c850621992-09-11 23:55:51 +0000489strop_swapcase(self, args)
490 object *self; /* Not used */
491 object *args;
492{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000493 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000494 int i, n;
495 object *new;
496 int changed;
497
498 if (!getargs(args, "s#", &s, &n))
499 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000500 new = newsizedstringobject(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000501 if (new == NULL)
502 return NULL;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000503 s_new = getstringvalue(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000504 changed = 0;
505 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000506 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000507 if (islower(c)) {
508 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000509 *s_new = toupper(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000510 }
511 else if (isupper(c)) {
512 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000513 *s_new = tolower(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000514 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000515 else
516 *s_new = c;
517 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000518 }
519 if (!changed) {
520 DECREF(new);
521 INCREF(args);
522 return args;
523 }
524 return new;
525}
526
527
Guido van Rossumb6775db1994-08-01 11:34:53 +0000528static object *
529strop_atoi(self, args)
530 object *self; /* Not used */
531 object *args;
532{
533 extern long mystrtol PROTO((const char *, char **, int));
534 extern unsigned long mystrtoul PROTO((const char *, char **, int));
535 char *s, *end;
536 int base = 10;
537 long x;
538
539 if (args != NULL && is_tupleobject(args)) {
540 if (!getargs(args, "(si)", &s, &base))
541 return NULL;
542 if (base != 0 && base < 2 || base > 36) {
543 err_setstr(ValueError, "invalid base for atoi()");
544 return NULL;
545 }
546 }
547 else if (!getargs(args, "s", &s))
548 return NULL;
549 errno = 0;
550 if (base == 0 && s[0] == '0')
551 x = (long) mystrtoul(s, &end, base);
552 else
553 x = mystrtol(s, &end, base);
554 if (*end != '\0') {
555 err_setstr(ValueError, "invalid literal for atoi()");
556 return NULL;
557 }
558 else if (errno != 0) {
559 err_setstr(OverflowError, "atoi() literal too large");
560 return NULL;
561 }
562 return newintobject(x);
563}
564
565
566static object *
567strop_atol(self, args)
568 object *self; /* Not used */
569 object *args;
570{
571 char *s, *end;
572 int base = 10;
573 object *x;
574
575 if (args != NULL && is_tupleobject(args)) {
576 if (!getargs(args, "(si)", &s, &base))
577 return NULL;
578 if (base != 0 && base < 2 || base > 36) {
579 err_setstr(ValueError, "invalid base for atol()");
580 return NULL;
581 }
582 }
583 else if (!getargs(args, "s", &s))
584 return NULL;
585 x = long_escan(s, &end, base);
586 if (x == NULL)
587 return NULL;
588 if (base == 0 && (*end == 'l' || *end == 'L'))
589 end++;
590 if (*end != '\0') {
591 err_setstr(ValueError, "invalid literal for atol()");
592 DECREF(x);
593 return NULL;
594 }
595 return x;
596}
597
598
599static object *
600strop_atof(self, args)
601 object *self; /* Not used */
602 object *args;
603{
604 extern double strtod PROTO((const char *, char **));
605 char *s, *end;
606 double x;
607
608 if (!getargs(args, "s", &s))
609 return NULL;
610 errno = 0;
611 x = strtod(s, &end);
612 if (*end != '\0') {
613 err_setstr(ValueError, "invalid literal for atof()");
614 return NULL;
615 }
616 else if (errno != 0) {
617 err_setstr(OverflowError, "atof() literal too large");
618 return NULL;
619 }
620 return newfloatobject(x);
621}
622
623
Guido van Rossumed7253c1996-07-23 18:12:39 +0000624static PyObject *
625strop_maketrans(self, args)
626 PyObject *self; /* Not used */
627 PyObject *args;
628{
629 unsigned char c[256], *from=NULL, *to=NULL;
630 int i, fromlen=0, tolen=0;
631
632 if (PyTuple_Size(args)!=0) {
633 if (!PyArg_ParseTuple(args, "s#s#", &from, &fromlen,
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000634 &to, &tolen))
Guido van Rossumed7253c1996-07-23 18:12:39 +0000635 return NULL;
636 }
637
638 if (fromlen!=tolen) {
639 PyErr_SetString(ValueError,
640 "maketrans arguments must have same length");
641 return NULL;
642 }
643 for(i=0; i<256; i++)
644 c[i]=(unsigned char)i;
645 for(i=0; i<fromlen; i++) {
646 c[from[i]]=to[i];
647 }
648 return PyString_FromStringAndSize((char *)c, 256);
649}
650
651
Guido van Rossuma3127e81995-09-13 17:39:06 +0000652static object *
653strop_translate(self, args)
654 object *self;
655 object *args;
656{
Guido van Rossumed7253c1996-07-23 18:12:39 +0000657 char *input, *table, *output, *output_start, *delete=NULL;
658 int inlen, tablen, dellen;
659 PyObject *result;
660 int i, trans_table[256];
Guido van Rossuma3127e81995-09-13 17:39:06 +0000661
Guido van Rossumed7253c1996-07-23 18:12:39 +0000662 if (!PyArg_ParseTuple(args, "s#s#|s#", &input, &inlen,
663 &table, &tablen, &delete, &dellen))
Guido van Rossuma3127e81995-09-13 17:39:06 +0000664 return NULL;
665 if (tablen != 256) {
Guido van Rossumed7253c1996-07-23 18:12:39 +0000666 PyErr_SetString(ValueError,
Guido van Rossuma3127e81995-09-13 17:39:06 +0000667 "translation table must be 256 characters long");
668 return NULL;
669 }
Guido van Rossumed7253c1996-07-23 18:12:39 +0000670 for(i=0; i<256; i++)
671 trans_table[i]=Py_CHARMASK(table[i]);
672 if (delete!=NULL) {
673 for(i=0; i<dellen; i++)
674 trans_table[delete[i]]=-1;
675 }
676
677 result = PyString_FromStringAndSize((char *)NULL, inlen);
Guido van Rossuma3127e81995-09-13 17:39:06 +0000678 if (result == NULL)
679 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000680 output_start = output = PyString_AsString(result);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000681 if (delete!=NULL && dellen!=0) {
Guido van Rossumed7253c1996-07-23 18:12:39 +0000682 for (i = 0; i < inlen; i++) {
683 int c = Py_CHARMASK(*input++);
684 if (trans_table[c]!=-1)
685 *output++ = (char)trans_table[c];
686 }
687 /* Fix the size of the resulting string */
688 if (inlen > 0 &&_PyString_Resize(&result, output-output_start))
689 return NULL;
690 } else {
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000691 /* If no deletions are required, use a faster loop */
Guido van Rossumed7253c1996-07-23 18:12:39 +0000692 for (i = 0; i < inlen; i++) {
693 int c = Py_CHARMASK(*input++);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000694 *output++ = (char)trans_table[c];
695 }
Guido van Rossuma3127e81995-09-13 17:39:06 +0000696 }
697 return result;
698}
699
700
Guido van Rossume270b431992-09-03 20:21:07 +0000701/* List of functions defined in the module */
702
703static struct methodlist strop_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000704 {"atof", strop_atof},
705 {"atoi", strop_atoi},
706 {"atol", strop_atol},
Guido van Rossum27457531996-06-12 04:24:52 +0000707 {"capitalize", strop_capitalize},
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000708 {"find", strop_find},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000709 {"join", strop_joinfields, 1},
710 {"joinfields", strop_joinfields, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000711 {"lstrip", strop_lstrip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000712 {"lower", strop_lower},
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000713 {"rfind", strop_rfind},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000714 {"rstrip", strop_rstrip},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000715 {"split", strop_splitfields, 1},
716 {"splitfields", strop_splitfields, 1},
Guido van Rossume270b431992-09-03 20:21:07 +0000717 {"strip", strop_strip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000718 {"swapcase", strop_swapcase},
Guido van Rossumed7253c1996-07-23 18:12:39 +0000719 {"maketrans", strop_maketrans, 1},
Guido van Rossuma3127e81995-09-13 17:39:06 +0000720 {"translate", strop_translate, 1},
Guido van Rossum5c850621992-09-11 23:55:51 +0000721 {"upper", strop_upper},
Guido van Rossume270b431992-09-03 20:21:07 +0000722 {NULL, NULL} /* sentinel */
723};
724
725
Guido van Rossume270b431992-09-03 20:21:07 +0000726void
727initstrop()
728{
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000729 object *m, *d, *s;
730 char buf[256];
731 int c, n;
732 m = initmodule("strop", strop_methods);
733 d = getmoduledict(m);
Guido van Rossume22e6441993-07-09 10:51:31 +0000734
735 /* Create 'whitespace' object */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000736 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000737 for (c = 0; c < 256; c++) {
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000738 if (isspace(c))
739 buf[n++] = c;
740 }
Sjoerd Mullenderd96ec441993-09-14 08:37:39 +0000741 s = newsizedstringobject(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000742 if (s) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000743 dictinsert(d, "whitespace", s);
744 DECREF(s);
745 }
746 /* Create 'lowercase' object */
747 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000748 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000749 if (islower(c))
750 buf[n++] = c;
751 }
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000752 s = newsizedstringobject(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000753 if (s) {
754 dictinsert(d, "lowercase", s);
755 DECREF(s);
756 }
757
758 /* Create 'uppercase' object */
759 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000760 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000761 if (isupper(c))
762 buf[n++] = c;
763 }
764 s = newsizedstringobject(buf, n);
765 if (s) {
766 dictinsert(d, "uppercase", s);
767 DECREF(s);
768 }
769
770 if (err_occurred())
771 fatal("can't initialize module strop");
Guido van Rossume270b431992-09-03 20:21:07 +0000772}