blob: 8ddf37d2fcb3907b6887e1c372a9b31052b67d23 [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
Barry Warsawf5256011996-12-09 18:35:56 +000034#include "Python.h"
Guido van Rossume270b431992-09-03 20:21:07 +000035
Guido van Rossumd05eb8b1993-07-08 11:12:36 +000036#include <ctype.h>
Guido van Rossume22e6441993-07-09 10:51:31 +000037/* XXX This file assumes that the <ctype.h> is*() functions
38 XXX are defined for all 8-bit characters! */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +000039
Guido van Rossum7999a5c1996-08-08 19:16:15 +000040/* The lstrip(), rstrip() and strip() functions are implemented
41 in do_strip(), which uses an additional parameter to indicate what
42 type of strip should occur. */
43
44#define LEFTSTRIP 0
45#define RIGHTSTRIP 1
46#define BOTHSTRIP 2
47
Guido van Rossume270b431992-09-03 20:21:07 +000048
Barry Warsawf5256011996-12-09 18:35:56 +000049static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +000050split_whitespace(s, len, maxsplit)
Guido van Rossume270b431992-09-03 20:21:07 +000051 char *s;
Guido van Rossum009e79b1995-05-03 17:40:23 +000052 int len;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000053 int maxsplit;
Guido van Rossum009e79b1995-05-03 17:40:23 +000054{
Barry Warsawe8fc29c1997-01-03 22:45:34 +000055 int i = 0, j, err;
56 int countsplit = 0;
57 PyObject* item;
58 PyObject *list = PyList_New(0);
Guido van Rossume270b431992-09-03 20:21:07 +000059
Guido van Rossume270b431992-09-03 20:21:07 +000060 if (list == NULL)
61 return NULL;
62
Guido van Rossume270b431992-09-03 20:21:07 +000063 while (i < len) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +000064 while (i < len && isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000065 i = i+1;
66 }
67 j = i;
Guido van Rossumee1813d1995-02-14 00:58:59 +000068 while (i < len && !isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000069 i = i+1;
70 }
71 if (j < i) {
Barry Warsawf5256011996-12-09 18:35:56 +000072 item = PyString_FromStringAndSize(s+j, (int)(i-j));
Barry Warsawe8fc29c1997-01-03 22:45:34 +000073 if (item == NULL)
74 goto finally;
75
Barry Warsawf5256011996-12-09 18:35:56 +000076 err = PyList_Append(list, item);
77 Py_DECREF(item);
Barry Warsawe8fc29c1997-01-03 22:45:34 +000078 if (err < 0)
79 goto finally;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000080
81 countsplit++;
82 if (maxsplit && (countsplit >= maxsplit)) {
Barry Warsawf5256011996-12-09 18:35:56 +000083 item = PyString_FromStringAndSize(
84 s+i, (int)(len - i));
Barry Warsawe8fc29c1997-01-03 22:45:34 +000085 if (item == NULL)
86 goto finally;
87
Barry Warsawf5256011996-12-09 18:35:56 +000088 err = PyList_Append(list, item);
89 Py_DECREF(item);
Barry Warsawe8fc29c1997-01-03 22:45:34 +000090 if (err < 0)
91 goto finally;
92
Guido van Rossum7999a5c1996-08-08 19:16:15 +000093 i = len;
94 }
95
Guido van Rossume270b431992-09-03 20:21:07 +000096 }
97 }
Guido van Rossume270b431992-09-03 20:21:07 +000098 return list;
Barry Warsawe8fc29c1997-01-03 22:45:34 +000099 finally:
100 Py_DECREF(list);
101 return NULL;
Guido van Rossume270b431992-09-03 20:21:07 +0000102}
103
104
Barry Warsawf5256011996-12-09 18:35:56 +0000105static PyObject *
Guido van Rossume270b431992-09-03 20:21:07 +0000106strop_splitfields(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000107 PyObject *self; /* Not used */
108 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000109{
Guido van Rossum572d2d91993-11-05 10:14:49 +0000110 int len, n, i, j, err;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000111 int splitcount, maxsplit;
Guido van Rossume270b431992-09-03 20:21:07 +0000112 char *s, *sub;
Barry Warsawf5256011996-12-09 18:35:56 +0000113 PyObject *list, *item;
Guido van Rossume270b431992-09-03 20:21:07 +0000114
Guido van Rossum009e79b1995-05-03 17:40:23 +0000115 sub = NULL;
116 n = 0;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000117 splitcount = 0;
118 maxsplit = 0;
Barry Warsawf5256011996-12-09 18:35:56 +0000119 if (!PyArg_ParseTuple(args, "s#|z#i", &s, &len, &sub, &n, &maxsplit))
Guido van Rossume270b431992-09-03 20:21:07 +0000120 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000121 if (sub == NULL)
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000122 return split_whitespace(s, len, maxsplit);
Guido van Rossume270b431992-09-03 20:21:07 +0000123 if (n == 0) {
Barry Warsawf5256011996-12-09 18:35:56 +0000124 PyErr_SetString(PyExc_ValueError, "empty separator");
Guido van Rossume270b431992-09-03 20:21:07 +0000125 return NULL;
126 }
127
Barry Warsawf5256011996-12-09 18:35:56 +0000128 list = PyList_New(0);
Guido van Rossume270b431992-09-03 20:21:07 +0000129 if (list == NULL)
130 return NULL;
131
132 i = j = 0;
133 while (i+n <= len) {
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000134 if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) {
Barry Warsawf5256011996-12-09 18:35:56 +0000135 item = PyString_FromStringAndSize(s+j, (int)(i-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000136 if (item == NULL)
137 goto fail;
Barry Warsawf5256011996-12-09 18:35:56 +0000138 err = PyList_Append(list, item);
139 Py_DECREF(item);
Guido van Rossum572d2d91993-11-05 10:14:49 +0000140 if (err < 0)
141 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000142 i = j = i + n;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000143 splitcount++;
144 if (maxsplit && (splitcount >= maxsplit))
145 break;
Guido van Rossume270b431992-09-03 20:21:07 +0000146 }
147 else
148 i++;
149 }
Barry Warsawf5256011996-12-09 18:35:56 +0000150 item = PyString_FromStringAndSize(s+j, (int)(len-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000151 if (item == NULL)
152 goto fail;
Barry Warsawf5256011996-12-09 18:35:56 +0000153 err = PyList_Append(list, item);
154 Py_DECREF(item);
Guido van Rossum572d2d91993-11-05 10:14:49 +0000155 if (err < 0)
156 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000157
158 return list;
Guido van Rossum572d2d91993-11-05 10:14:49 +0000159
160 fail:
Barry Warsawf5256011996-12-09 18:35:56 +0000161 Py_DECREF(list);
Guido van Rossum572d2d91993-11-05 10:14:49 +0000162 return NULL;
Guido van Rossume270b431992-09-03 20:21:07 +0000163}
164
165
Barry Warsawf5256011996-12-09 18:35:56 +0000166static PyObject *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000167strop_joinfields(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000168 PyObject *self; /* Not used */
169 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +0000170{
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000171 PyObject *seq;
172 char *sep = NULL;
173 int seqlen, seplen = 0;
174 int i, reslen = 0, slen = 0, sz = 100;
175 PyObject *res = NULL;
176 char* p = NULL;
177 intargfunc getitemfunc;
Guido van Rossumc89705d1992-11-26 08:54:07 +0000178
Barry Warsawf5256011996-12-09 18:35:56 +0000179 if (!PyArg_ParseTuple(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 }
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000185
186 seqlen = PySequence_Length(seq);
187 if (seqlen < 0 && PyErr_Occurred())
188 return NULL;
189
190 if (seqlen == 1) {
191 /* Optimization if there's only one item */
192 PyObject *item = PySequence_GetItem(seq, 0);
193 if (item && !PyString_Check(item))
194 PyErr_SetString(PyExc_TypeError,
195 "first argument must be sequence of strings");
196 return item;
197 }
198
199 if (!(res = PyString_FromStringAndSize((char*)NULL, sz)))
200 return NULL;
201 p = PyString_AsString(res);
202
203 /* optimize for lists, since it's the most common case. all others
204 * (tuples and arbitrary sequences) just use the sequence abstract
205 * interface.
Barry Warsaw04d2d151997-01-03 23:46:51 +0000206 */
207 if (PyList_Check(seq)) {
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000208 for (i = 0; i < seqlen; i++) {
209 PyObject *item = PyList_GET_ITEM(seq, i);
210 if (!PyString_Check(item)) {
211 PyErr_SetString(PyExc_TypeError,
212 "first argument must be sequence of strings");
213 Py_DECREF(res);
214 return NULL;
215 }
216 slen = PyString_GET_SIZE(item);
217 while (reslen + slen + seplen >= sz) {
218 if (_PyString_Resize(&res, sz * 2)) {
219 Py_DECREF(res);
220 return NULL;
221 }
222 sz *= 2;
223 p = PyString_AsString(res) + reslen;
224 }
225 if (i > 0) {
226 memcpy(p, sep, seplen);
227 p += seplen;
228 reslen += seplen;
229 }
230 memcpy(p, PyString_AS_STRING(item), slen);
231 p += slen;
232 reslen += slen;
233 }
234 if (_PyString_Resize(&res, reslen)) {
235 Py_DECREF(res);
236 res = NULL;
237 }
238 return res;
Barry Warsaw04d2d151997-01-03 23:46:51 +0000239 }
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000240 else if (!PySequence_Check(seq)) {
Barry Warsawf5256011996-12-09 18:35:56 +0000241 PyErr_SetString(PyExc_TypeError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000242 "first argument must be a sequence");
Guido van Rossumc89705d1992-11-26 08:54:07 +0000243 return NULL;
244 }
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000245 /* type safe */
246 getitemfunc = seq->ob_type->tp_as_sequence->sq_item;
Guido van Rossumc89705d1992-11-26 08:54:07 +0000247 for (i = 0; i < seqlen; i++) {
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000248 PyObject *item = getitemfunc(seq, i);
249 if (!item || !PyString_Check(item)) {
Barry Warsawf5256011996-12-09 18:35:56 +0000250 PyErr_SetString(PyExc_TypeError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000251 "first argument must be sequence of strings");
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000252 Py_DECREF(res);
253 Py_XDECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000254 return NULL;
255 }
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000256 slen = PyString_GET_SIZE(item);
257 while (reslen + slen + seplen >= sz) {
258 if (_PyString_Resize(&res, sz * 2)) {
259 Py_DECREF(res);
260 Py_DECREF(item);
261 return NULL;
262 }
263 sz *= 2;
264 p = PyString_AsString(res) + reslen;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000265 }
Guido van Rossumc89705d1992-11-26 08:54:07 +0000266 if (i > 0) {
267 memcpy(p, sep, seplen);
268 p += seplen;
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000269 reslen += seplen;
Guido van Rossumc89705d1992-11-26 08:54:07 +0000270 }
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000271 memcpy(p, PyString_AS_STRING(item), slen);
272 p += slen;
273 reslen += slen;
274 Py_DECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000275 }
Barry Warsawd4ff1b91997-01-06 22:48:32 +0000276 if (_PyString_Resize(&res, reslen)) {
277 Py_DECREF(res);
278 res = NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +0000279 }
280 return res;
281}
282
Barry Warsawf5256011996-12-09 18:35:56 +0000283static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000284strop_find(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000285 PyObject *self; /* Not used */
286 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000287{
288 char *s, *sub;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000289 int len, n, i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000290
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000291 if (!PyArg_ParseTuple(args, "s#s#|i", &s, &len, &sub, &n, &i))
292 return NULL;
293
294 if (i < 0)
295 i += len;
296 if (i < 0)
Guido van Rossume270b431992-09-03 20:21:07 +0000297 i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000298
299 if (n == 0)
Barry Warsawf5256011996-12-09 18:35:56 +0000300 return PyInt_FromLong((long)i);
Guido van Rossume270b431992-09-03 20:21:07 +0000301
302 len -= n;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000303 for (; i <= len; ++i)
304 if (s[i] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000305 (n == 1 || memcmp(&s[i+1], &sub[1], n-1) == 0))
Barry Warsawf5256011996-12-09 18:35:56 +0000306 return PyInt_FromLong((long)i);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000307
Barry Warsawf5256011996-12-09 18:35:56 +0000308 return PyInt_FromLong(-1L);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000309}
310
311
Barry Warsawf5256011996-12-09 18:35:56 +0000312static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000313strop_rfind(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000314 PyObject *self; /* Not used */
315 PyObject *args;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000316{
317 char *s, *sub;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000318 int len, n, j;
319 int i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000320
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000321 if (!PyArg_ParseTuple(args, "s#s#|i", &s, &len, &sub, &n, &i))
322 return NULL;
323
324 if (i < 0)
325 i += len;
326 if (i < 0)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000327 i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000328
329 if (n == 0)
Barry Warsawf5256011996-12-09 18:35:56 +0000330 return PyInt_FromLong((long)len);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000331
Guido van Rossumb6775db1994-08-01 11:34:53 +0000332 for (j = len-n; j >= i; --j)
333 if (s[j] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000334 (n == 1 || memcmp(&s[j+1], &sub[1], n-1) == 0))
Barry Warsawf5256011996-12-09 18:35:56 +0000335 return PyInt_FromLong((long)j);
Guido van Rossume270b431992-09-03 20:21:07 +0000336
Barry Warsawf5256011996-12-09 18:35:56 +0000337 return PyInt_FromLong(-1L);
Guido van Rossume270b431992-09-03 20:21:07 +0000338}
339
Barry Warsawf5256011996-12-09 18:35:56 +0000340static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000341do_strip(args, striptype)
Barry Warsawf5256011996-12-09 18:35:56 +0000342 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000343 int striptype;
344{
345 char *s;
346 int len, i, j;
347
348
Barry Warsawf5256011996-12-09 18:35:56 +0000349 if (!PyArg_Parse(args, "s#", &s, &len))
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000350 return NULL;
351
352 i = 0;
353 if (striptype != RIGHTSTRIP) {
354 while (i < len && isspace(Py_CHARMASK(s[i]))) {
355 i++;
356 }
357 }
358
359
360 j = len;
361 if (striptype != LEFTSTRIP) {
362 do {
363 j--;
364 } while (j >= i && isspace(Py_CHARMASK(s[j])));
365 j++;
366 }
367
368 if (i == 0 && j == len) {
Barry Warsawf5256011996-12-09 18:35:56 +0000369 Py_INCREF(args);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000370 return args;
371 }
372 else
Barry Warsawf5256011996-12-09 18:35:56 +0000373 return PyString_FromStringAndSize(s+i, j-i);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000374}
375
Guido van Rossume270b431992-09-03 20:21:07 +0000376
Barry Warsawf5256011996-12-09 18:35:56 +0000377static PyObject *
Guido van Rossume270b431992-09-03 20:21:07 +0000378strop_strip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000379 PyObject *self; /* Not used */
380 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000381{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000382 return do_strip(args, BOTHSTRIP);
383}
Guido van Rossume270b431992-09-03 20:21:07 +0000384
Barry Warsawf5256011996-12-09 18:35:56 +0000385static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000386strop_lstrip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000387 PyObject *self; /* Not used */
388 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000389{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000390 return do_strip(args, LEFTSTRIP);
391}
Guido van Rossume270b431992-09-03 20:21:07 +0000392
Barry Warsawf5256011996-12-09 18:35:56 +0000393static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000394strop_rstrip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000395 PyObject *self; /* Not used */
396 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000397{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000398 return do_strip(args, RIGHTSTRIP);
Guido van Rossume270b431992-09-03 20:21:07 +0000399}
400
401
Barry Warsawf5256011996-12-09 18:35:56 +0000402static PyObject *
Barry Warsaw04d2d151997-01-03 23:46:51 +0000403strop_lower(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000404 PyObject *self; /* Not used */
405 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000406{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000407 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000408 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000409 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000410 int changed;
411
Barry Warsawf5256011996-12-09 18:35:56 +0000412 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000413 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000414 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000415 if (new == NULL)
416 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000417 s_new = PyString_AsString(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000418 changed = 0;
419 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000420 int c = Py_CHARMASK(*s++);
Barry Warsaw04d2d151997-01-03 23:46:51 +0000421 if (isupper(c)) {
Guido van Rossum5c850621992-09-11 23:55:51 +0000422 changed = 1;
Barry Warsaw04d2d151997-01-03 23:46:51 +0000423 *s_new = tolower(c);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000424 } else
425 *s_new = c;
426 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000427 }
428 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000429 Py_DECREF(new);
430 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000431 return args;
432 }
433 return new;
434}
435
436
Barry Warsawf5256011996-12-09 18:35:56 +0000437static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000438strop_upper(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000439 PyObject *self; /* Not used */
440 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000441{
Barry Warsaw04d2d151997-01-03 23:46:51 +0000442 char *s, *s_new;
443 int i, n;
444 PyObject *new;
445 int changed;
446
447 if (!PyArg_Parse(args, "s#", &s, &n))
448 return NULL;
449 new = PyString_FromStringAndSize(NULL, n);
450 if (new == NULL)
451 return NULL;
452 s_new = PyString_AsString(new);
453 changed = 0;
454 for (i = 0; i < n; i++) {
455 int c = Py_CHARMASK(*s++);
456 if (islower(c)) {
457 changed = 1;
458 *s_new = toupper(c);
459 } else
460 *s_new = c;
461 s_new++;
462 }
463 if (!changed) {
464 Py_DECREF(new);
465 Py_INCREF(args);
466 return args;
467 }
468 return new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000469}
470
471
Barry Warsawf5256011996-12-09 18:35:56 +0000472static PyObject *
Guido van Rossum27457531996-06-12 04:24:52 +0000473strop_capitalize(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000474 PyObject *self; /* Not used */
475 PyObject *args;
Guido van Rossum27457531996-06-12 04:24:52 +0000476{
477 char *s, *s_new;
478 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000479 PyObject *new;
Guido van Rossum27457531996-06-12 04:24:52 +0000480 int changed;
481
Barry Warsawf5256011996-12-09 18:35:56 +0000482 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum27457531996-06-12 04:24:52 +0000483 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000484 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum27457531996-06-12 04:24:52 +0000485 if (new == NULL)
486 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000487 s_new = PyString_AsString(new);
Guido van Rossum27457531996-06-12 04:24:52 +0000488 changed = 0;
Guido van Rossum529c9631996-06-17 16:59:33 +0000489 if (0 < n) {
Guido van Rossum27457531996-06-12 04:24:52 +0000490 int c = Py_CHARMASK(*s++);
491 if (islower(c)) {
492 changed = 1;
493 *s_new = toupper(c);
494 } else
495 *s_new = c;
496 s_new++;
497 }
498 for (i = 1; i < n; i++) {
499 int c = Py_CHARMASK(*s++);
500 if (isupper(c)) {
501 changed = 1;
502 *s_new = tolower(c);
503 } else
504 *s_new = c;
505 s_new++;
506 }
507 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000508 Py_DECREF(new);
509 Py_INCREF(args);
Guido van Rossum27457531996-06-12 04:24:52 +0000510 return args;
511 }
512 return new;
513}
514
515
Barry Warsawf5256011996-12-09 18:35:56 +0000516static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000517strop_swapcase(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000518 PyObject *self; /* Not used */
519 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000520{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000521 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000522 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000523 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000524 int changed;
525
Barry Warsawf5256011996-12-09 18:35:56 +0000526 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000527 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000528 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000529 if (new == NULL)
530 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000531 s_new = PyString_AsString(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000532 changed = 0;
533 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000534 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000535 if (islower(c)) {
536 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000537 *s_new = toupper(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000538 }
539 else if (isupper(c)) {
540 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000541 *s_new = tolower(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000542 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000543 else
544 *s_new = c;
545 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000546 }
547 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000548 Py_DECREF(new);
549 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000550 return args;
551 }
552 return new;
553}
554
555
Barry Warsawf5256011996-12-09 18:35:56 +0000556static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000557strop_atoi(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000558 PyObject *self; /* Not used */
559 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000560{
Barry Warsawf5256011996-12-09 18:35:56 +0000561 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
562 extern unsigned long
563 PyOS_strtoul Py_PROTO((const char *, char **, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000564 char *s, *end;
565 int base = 10;
566 long x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000567 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000568
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000569 if (!PyArg_ParseTuple(args, "s|i", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000570 return NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000571
572 if ((base != 0 && base < 2) || base > 36) {
573 PyErr_SetString(PyExc_ValueError, "invalid base for atoi()");
574 return NULL;
575 }
576
Guido van Rossumc35f9331996-09-11 23:30:42 +0000577 while (*s && isspace(Py_CHARMASK(*s)))
578 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000579 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000580 PyErr_SetString(PyExc_ValueError, "empty string for atoi()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000581 return NULL;
582 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000583 errno = 0;
584 if (base == 0 && s[0] == '0')
Barry Warsawf5256011996-12-09 18:35:56 +0000585 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000586 else
Barry Warsawf5256011996-12-09 18:35:56 +0000587 x = PyOS_strtol(s, &end, base);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000588 while (*end && isspace(Py_CHARMASK(*end)))
589 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000590 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000591 sprintf(buffer, "invalid literal for atoi(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000592 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000593 return NULL;
594 }
595 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000596 sprintf(buffer, "atoi() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000597 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000598 return NULL;
599 }
Barry Warsawf5256011996-12-09 18:35:56 +0000600 return PyInt_FromLong(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000601}
602
603
Barry Warsawf5256011996-12-09 18:35:56 +0000604static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000605strop_atol(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000606 PyObject *self; /* Not used */
607 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000608{
609 char *s, *end;
610 int base = 10;
Barry Warsawf5256011996-12-09 18:35:56 +0000611 PyObject *x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000612 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000613
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000614 if (!PyArg_ParseTuple(args, "s|i", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000615 return NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000616
617 if ((base != 0 && base < 2) || base > 36) {
618 PyErr_SetString(PyExc_ValueError, "invalid base for atol()");
619 return NULL;
620 }
621
Guido van Rossumc35f9331996-09-11 23:30:42 +0000622 while (*s && isspace(Py_CHARMASK(*s)))
623 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000624 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000625 PyErr_SetString(PyExc_ValueError, "empty string for atol()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000626 return NULL;
627 }
Barry Warsawf5256011996-12-09 18:35:56 +0000628 x = PyLong_FromString(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000629 if (x == NULL)
630 return NULL;
631 if (base == 0 && (*end == 'l' || *end == 'L'))
632 end++;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000633 while (*end && isspace(Py_CHARMASK(*end)))
634 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000635 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000636 sprintf(buffer, "invalid literal for atol(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000637 PyErr_SetString(PyExc_ValueError, buffer);
638 Py_DECREF(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000639 return NULL;
640 }
641 return x;
642}
643
644
Barry Warsawf5256011996-12-09 18:35:56 +0000645static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000646strop_atof(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000647 PyObject *self; /* Not used */
648 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000649{
Barry Warsawf5256011996-12-09 18:35:56 +0000650 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000651 char *s, *end;
652 double x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000653 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000654
Barry Warsawf5256011996-12-09 18:35:56 +0000655 if (!PyArg_Parse(args, "s", &s))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000656 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000657 while (*s && isspace(Py_CHARMASK(*s)))
658 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000659 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000660 PyErr_SetString(PyExc_ValueError, "empty string for atof()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000661 return NULL;
662 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000663 errno = 0;
Guido van Rossum52fa3a61997-02-14 22:59:58 +0000664 PyFPE_START_PROTECT("strop_atof", return 0)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000665 x = strtod(s, &end);
Guido van Rossum52fa3a61997-02-14 22:59:58 +0000666 PyFPE_END_PROTECT
Guido van Rossumc35f9331996-09-11 23:30:42 +0000667 while (*end && isspace(Py_CHARMASK(*end)))
668 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000669 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000670 sprintf(buffer, "invalid literal for atof(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000671 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000672 return NULL;
673 }
674 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000675 sprintf(buffer, "atof() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000676 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000677 return NULL;
678 }
Barry Warsawf5256011996-12-09 18:35:56 +0000679 return PyFloat_FromDouble(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000680}
681
682
Guido van Rossumed7253c1996-07-23 18:12:39 +0000683static PyObject *
684strop_maketrans(self, args)
685 PyObject *self; /* Not used */
686 PyObject *args;
687{
Guido van Rossume0548b81997-01-06 16:50:09 +0000688 unsigned char *c, *from=NULL, *to=NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000689 int i, fromlen=0, tolen=0;
Guido van Rossume0548b81997-01-06 16:50:09 +0000690 PyObject *result;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000691
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000692 if (!PyArg_ParseTuple(args, "s#s#", &from, &fromlen, &to, &tolen))
693 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000694
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000695 if (fromlen != tolen) {
Barry Warsawf5256011996-12-09 18:35:56 +0000696 PyErr_SetString(PyExc_ValueError,
Guido van Rossumed7253c1996-07-23 18:12:39 +0000697 "maketrans arguments must have same length");
698 return NULL;
699 }
Guido van Rossume0548b81997-01-06 16:50:09 +0000700
701 result = PyString_FromStringAndSize((char *)NULL, 256);
702 if (result == NULL)
703 return NULL;
704 c = (unsigned char *) PyString_AS_STRING((PyStringObject *)result);
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000705 for (i = 0; i < 256; i++)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000706 c[i]=(unsigned char)i;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000707 for (i = 0; i < fromlen; i++)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000708 c[from[i]]=to[i];
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000709
Guido van Rossume0548b81997-01-06 16:50:09 +0000710 return result;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000711}
712
713
Barry Warsawf5256011996-12-09 18:35:56 +0000714static PyObject *
Guido van Rossuma3127e81995-09-13 17:39:06 +0000715strop_translate(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000716 PyObject *self;
717 PyObject *args;
Guido van Rossuma3127e81995-09-13 17:39:06 +0000718{
Guido van Rossume0548b81997-01-06 16:50:09 +0000719 register char *input, *table, *output;
720 register int i, c, changed = 0;
721 PyObject *input_obj;
722 char *table1, *output_start, *del_table=NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000723 int inlen, tablen, dellen = 0;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000724 PyObject *result;
Guido van Rossume0548b81997-01-06 16:50:09 +0000725 int trans_table[256];
Guido van Rossuma3127e81995-09-13 17:39:06 +0000726
Guido van Rossume0548b81997-01-06 16:50:09 +0000727 if (!PyArg_ParseTuple(args, "Ss#|s#", &input_obj,
728 &table1, &tablen, &del_table, &dellen))
Guido van Rossuma3127e81995-09-13 17:39:06 +0000729 return NULL;
730 if (tablen != 256) {
Barry Warsawf5256011996-12-09 18:35:56 +0000731 PyErr_SetString(PyExc_ValueError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000732 "translation table must be 256 characters long");
Guido van Rossuma3127e81995-09-13 17:39:06 +0000733 return NULL;
734 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000735
Guido van Rossume0548b81997-01-06 16:50:09 +0000736 table = table1;
737 inlen = PyString_Size(input_obj);
Guido van Rossumed7253c1996-07-23 18:12:39 +0000738 result = PyString_FromStringAndSize((char *)NULL, inlen);
Guido van Rossuma3127e81995-09-13 17:39:06 +0000739 if (result == NULL)
740 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000741 output_start = output = PyString_AsString(result);
Guido van Rossume0548b81997-01-06 16:50:09 +0000742 input = PyString_AsString(input_obj);
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000743
Guido van Rossume0548b81997-01-06 16:50:09 +0000744 if (dellen == 0) {
745 /* If no deletions are required, use faster code */
746 for (i = inlen; --i >= 0; ) {
747 c = Py_CHARMASK(*input++);
748 if (Py_CHARMASK((*output++ = table[c])) != c)
749 changed = 1;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000750 }
Guido van Rossume0548b81997-01-06 16:50:09 +0000751 if (changed)
752 return result;
753 Py_DECREF(result);
754 Py_INCREF(input_obj);
755 return input_obj;
Guido van Rossuma3127e81995-09-13 17:39:06 +0000756 }
Guido van Rossume0548b81997-01-06 16:50:09 +0000757
758 for (i = 0; i < 256; i++)
759 trans_table[i] = Py_CHARMASK(table[i]);
760
761 for (i = 0; i < dellen; i++)
762 trans_table[Py_CHARMASK(del_table[i])] = -1;
763
764 for (i = inlen; --i >= 0; ) {
765 c = Py_CHARMASK(*input++);
766 if (trans_table[c] != -1)
767 if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)
768 continue;
769 changed = 1;
770 }
771 if (!changed) {
772 Py_DECREF(result);
773 Py_INCREF(input_obj);
774 return input_obj;
775 }
776 /* Fix the size of the resulting string */
777 if (inlen > 0 &&_PyString_Resize(&result, output-output_start))
778 return NULL;
Guido van Rossuma3127e81995-09-13 17:39:06 +0000779 return result;
780}
781
782
Guido van Rossume270b431992-09-03 20:21:07 +0000783/* List of functions defined in the module */
784
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000785static PyMethodDef
786strop_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000787 {"atof", strop_atof},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000788 {"atoi", strop_atoi, 1},
789 {"atol", strop_atol, 1},
Guido van Rossum27457531996-06-12 04:24:52 +0000790 {"capitalize", strop_capitalize},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000791 {"find", strop_find, 1},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000792 {"join", strop_joinfields, 1},
793 {"joinfields", strop_joinfields, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000794 {"lstrip", strop_lstrip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000795 {"lower", strop_lower},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000796 {"rfind", strop_rfind, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000797 {"rstrip", strop_rstrip},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000798 {"split", strop_splitfields, 1},
799 {"splitfields", strop_splitfields, 1},
Guido van Rossume270b431992-09-03 20:21:07 +0000800 {"strip", strop_strip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000801 {"swapcase", strop_swapcase},
Guido van Rossumed7253c1996-07-23 18:12:39 +0000802 {"maketrans", strop_maketrans, 1},
Guido van Rossuma3127e81995-09-13 17:39:06 +0000803 {"translate", strop_translate, 1},
Guido van Rossum5c850621992-09-11 23:55:51 +0000804 {"upper", strop_upper},
Guido van Rossume270b431992-09-03 20:21:07 +0000805 {NULL, NULL} /* sentinel */
806};
807
808
Guido van Rossume270b431992-09-03 20:21:07 +0000809void
810initstrop()
811{
Barry Warsawf5256011996-12-09 18:35:56 +0000812 PyObject *m, *d, *s;
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000813 char buf[256];
814 int c, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000815 m = Py_InitModule("strop", strop_methods);
816 d = PyModule_GetDict(m);
Guido van Rossume22e6441993-07-09 10:51:31 +0000817
818 /* Create 'whitespace' object */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000819 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000820 for (c = 0; c < 256; c++) {
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000821 if (isspace(c))
822 buf[n++] = c;
823 }
Barry Warsawf5256011996-12-09 18:35:56 +0000824 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000825 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000826 PyDict_SetItemString(d, "whitespace", s);
827 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000828 }
829 /* Create 'lowercase' object */
830 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000831 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000832 if (islower(c))
833 buf[n++] = c;
834 }
Barry Warsawf5256011996-12-09 18:35:56 +0000835 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000836 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000837 PyDict_SetItemString(d, "lowercase", s);
838 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000839 }
840
841 /* Create 'uppercase' object */
842 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000843 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000844 if (isupper(c))
845 buf[n++] = c;
846 }
Barry Warsawf5256011996-12-09 18:35:56 +0000847 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000848 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000849 PyDict_SetItemString(d, "uppercase", s);
850 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000851 }
852
Barry Warsawf5256011996-12-09 18:35:56 +0000853 if (PyErr_Occurred())
854 Py_FatalError("can't initialize module strop");
Guido van Rossume270b431992-09-03 20:21:07 +0000855}