blob: de4fc04d2ba1bc798fe738cb1b0e3d20fd68347a [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{
55 int i, j, err;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000056 int countsplit;
Barry Warsawf5256011996-12-09 18:35:56 +000057 PyObject *list, *item;
Guido van Rossume270b431992-09-03 20:21:07 +000058
Barry Warsawf5256011996-12-09 18:35:56 +000059 list = PyList_New(0);
Guido van Rossume270b431992-09-03 20:21:07 +000060 if (list == NULL)
61 return NULL;
62
63 i = 0;
Guido van Rossum7999a5c1996-08-08 19:16:15 +000064 countsplit = 0;
65
Guido van Rossume270b431992-09-03 20:21:07 +000066 while (i < len) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +000067 while (i < len && isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000068 i = i+1;
69 }
70 j = i;
Guido van Rossumee1813d1995-02-14 00:58:59 +000071 while (i < len && !isspace(Py_CHARMASK(s[i]))) {
Guido van Rossume270b431992-09-03 20:21:07 +000072 i = i+1;
73 }
74 if (j < i) {
Barry Warsawf5256011996-12-09 18:35:56 +000075 item = PyString_FromStringAndSize(s+j, (int)(i-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +000076 if (item == NULL) {
Barry Warsawf5256011996-12-09 18:35:56 +000077 Py_DECREF(list);
Guido van Rossum572d2d91993-11-05 10:14:49 +000078 return NULL;
79 }
Barry Warsawf5256011996-12-09 18:35:56 +000080 err = PyList_Append(list, item);
81 Py_DECREF(item);
Guido van Rossum572d2d91993-11-05 10:14:49 +000082 if (err < 0) {
Barry Warsawf5256011996-12-09 18:35:56 +000083 Py_DECREF(list);
Guido van Rossume270b431992-09-03 20:21:07 +000084 return NULL;
85 }
Guido van Rossum7999a5c1996-08-08 19:16:15 +000086
87 countsplit++;
88 if (maxsplit && (countsplit >= maxsplit)) {
Barry Warsawf5256011996-12-09 18:35:56 +000089 item = PyString_FromStringAndSize(
90 s+i, (int)(len - i));
Guido van Rossum7999a5c1996-08-08 19:16:15 +000091 if (item == NULL) {
Barry Warsawf5256011996-12-09 18:35:56 +000092 Py_DECREF(list);
Guido van Rossum7999a5c1996-08-08 19:16:15 +000093 return NULL;
94 }
Barry Warsawf5256011996-12-09 18:35:56 +000095 err = PyList_Append(list, item);
96 Py_DECREF(item);
Guido van Rossum7999a5c1996-08-08 19:16:15 +000097 if (err < 0) {
Barry Warsawf5256011996-12-09 18:35:56 +000098 Py_DECREF(list);
Guido van Rossum7999a5c1996-08-08 19:16:15 +000099 return NULL;
100 }
101 i = len;
102 }
103
Guido van Rossume270b431992-09-03 20:21:07 +0000104 }
105 }
106
107 return list;
108}
109
110
Barry Warsawf5256011996-12-09 18:35:56 +0000111static PyObject *
Guido van Rossume270b431992-09-03 20:21:07 +0000112strop_splitfields(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000113 PyObject *self; /* Not used */
114 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000115{
Guido van Rossum572d2d91993-11-05 10:14:49 +0000116 int len, n, i, j, err;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000117 int splitcount, maxsplit;
Guido van Rossume270b431992-09-03 20:21:07 +0000118 char *s, *sub;
Barry Warsawf5256011996-12-09 18:35:56 +0000119 PyObject *list, *item;
Guido van Rossume270b431992-09-03 20:21:07 +0000120
Guido van Rossum009e79b1995-05-03 17:40:23 +0000121 sub = NULL;
122 n = 0;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000123 splitcount = 0;
124 maxsplit = 0;
Barry Warsawf5256011996-12-09 18:35:56 +0000125 if (!PyArg_ParseTuple(args, "s#|z#i", &s, &len, &sub, &n, &maxsplit))
Guido van Rossume270b431992-09-03 20:21:07 +0000126 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000127 if (sub == NULL)
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000128 return split_whitespace(s, len, maxsplit);
Guido van Rossume270b431992-09-03 20:21:07 +0000129 if (n == 0) {
Barry Warsawf5256011996-12-09 18:35:56 +0000130 PyErr_SetString(PyExc_ValueError, "empty separator");
Guido van Rossume270b431992-09-03 20:21:07 +0000131 return NULL;
132 }
133
Barry Warsawf5256011996-12-09 18:35:56 +0000134 list = PyList_New(0);
Guido van Rossume270b431992-09-03 20:21:07 +0000135 if (list == NULL)
136 return NULL;
137
138 i = j = 0;
139 while (i+n <= len) {
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000140 if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) {
Barry Warsawf5256011996-12-09 18:35:56 +0000141 item = PyString_FromStringAndSize(s+j, (int)(i-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000142 if (item == NULL)
143 goto fail;
Barry Warsawf5256011996-12-09 18:35:56 +0000144 err = PyList_Append(list, item);
145 Py_DECREF(item);
Guido van Rossum572d2d91993-11-05 10:14:49 +0000146 if (err < 0)
147 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000148 i = j = i + n;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000149 splitcount++;
150 if (maxsplit && (splitcount >= maxsplit))
151 break;
Guido van Rossume270b431992-09-03 20:21:07 +0000152 }
153 else
154 i++;
155 }
Barry Warsawf5256011996-12-09 18:35:56 +0000156 item = PyString_FromStringAndSize(s+j, (int)(len-j));
Guido van Rossum572d2d91993-11-05 10:14:49 +0000157 if (item == NULL)
158 goto fail;
Barry Warsawf5256011996-12-09 18:35:56 +0000159 err = PyList_Append(list, item);
160 Py_DECREF(item);
Guido van Rossum572d2d91993-11-05 10:14:49 +0000161 if (err < 0)
162 goto fail;
Guido van Rossume270b431992-09-03 20:21:07 +0000163
164 return list;
Guido van Rossum572d2d91993-11-05 10:14:49 +0000165
166 fail:
Barry Warsawf5256011996-12-09 18:35:56 +0000167 Py_DECREF(list);
Guido van Rossum572d2d91993-11-05 10:14:49 +0000168 return NULL;
Guido van Rossume270b431992-09-03 20:21:07 +0000169}
170
171
Barry Warsawf5256011996-12-09 18:35:56 +0000172static PyObject *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000173strop_joinfields(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000174 PyObject *self; /* Not used */
175 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +0000176{
Barry Warsawf5256011996-12-09 18:35:56 +0000177 PyObject *seq, *item, *res;
178 PyObject * (*getitem) Py_FPROTO((PyObject *, int));
Guido van Rossumc89705d1992-11-26 08:54:07 +0000179 char *sep, *p;
180 int seplen, seqlen, reslen, itemlen, i;
181
Guido van Rossum009e79b1995-05-03 17:40:23 +0000182 sep = NULL;
183 seplen = 0;
Barry Warsawf5256011996-12-09 18:35:56 +0000184 if (!PyArg_ParseTuple(args, "O|s#", &seq, &sep, &seplen))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000185 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000186 if (sep == NULL) {
187 sep = " ";
188 seplen = 1;
189 }
Barry Warsawf5256011996-12-09 18:35:56 +0000190 if (PyList_Check(seq)) {
191 getitem = PyList_GetItem;
192 seqlen = PyList_Size(seq);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000193 }
Barry Warsawf5256011996-12-09 18:35:56 +0000194 else if (PyTuple_Check(seq)) {
195 getitem = PyTuple_GetItem;
196 seqlen = PyTuple_Size(seq);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000197 }
198 else {
Barry Warsawf5256011996-12-09 18:35:56 +0000199 PyErr_SetString(PyExc_TypeError,
200 "first argument must be list/tuple");
Guido van Rossumc89705d1992-11-26 08:54:07 +0000201 return NULL;
202 }
203 reslen = 0;
204 for (i = 0; i < seqlen; i++) {
205 item = getitem(seq, i);
Barry Warsawf5256011996-12-09 18:35:56 +0000206 if (!PyString_Check(item)) {
207 PyErr_SetString(PyExc_TypeError,
Guido van Rossumc89705d1992-11-26 08:54:07 +0000208 "first argument must be list/tuple of strings");
209 return NULL;
210 }
211 if (i > 0)
212 reslen = reslen + seplen;
Barry Warsawf5256011996-12-09 18:35:56 +0000213 reslen = reslen + PyString_Size(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000214 }
215 if (seqlen == 1) {
216 /* Optimization if there's only one item */
217 item = getitem(seq, 0);
Barry Warsawf5256011996-12-09 18:35:56 +0000218 Py_INCREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000219 return item;
220 }
Barry Warsawf5256011996-12-09 18:35:56 +0000221 res = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000222 if (res == NULL)
223 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000224 p = PyString_AsString(res);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000225 for (i = 0; i < seqlen; i++) {
226 item = getitem(seq, i);
227 if (i > 0) {
228 memcpy(p, sep, seplen);
229 p += seplen;
230 }
Barry Warsawf5256011996-12-09 18:35:56 +0000231 itemlen = PyString_Size(item);
232 memcpy(p, PyString_AsString(item), itemlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000233 p += itemlen;
234 }
Barry Warsawf5256011996-12-09 18:35:56 +0000235 if (p != PyString_AsString(res) + reslen) {
236 PyErr_SetString(PyExc_SystemError,
237 "strop.joinfields: assertion failed");
Guido van Rossumc89705d1992-11-26 08:54:07 +0000238 return NULL;
239 }
240 return res;
241}
242
243
Barry Warsawf5256011996-12-09 18:35:56 +0000244static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000245strop_find(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000246 PyObject *self; /* Not used */
247 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000248{
249 char *s, *sub;
250 int len, n, i;
251
Barry Warsawf5256011996-12-09 18:35:56 +0000252 if (PyArg_Parse(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 {
Barry Warsawf5256011996-12-09 18:35:56 +0000259 PyErr_Clear();
260 if (!PyArg_Parse(args, "(s#s#)", &s, &len, &sub, &n))
Guido van Rossume270b431992-09-03 20:21:07 +0000261 return NULL;
262 i = 0;
263 }
264
265 if (n == 0)
Barry Warsawf5256011996-12-09 18:35:56 +0000266 return PyInt_FromLong((long)i);
Guido van Rossume270b431992-09-03 20:21:07 +0000267
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))
Barry Warsawf5256011996-12-09 18:35:56 +0000272 return PyInt_FromLong((long)i);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000273
Barry Warsawf5256011996-12-09 18:35:56 +0000274 return PyInt_FromLong(-1L);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000275}
276
277
Barry Warsawf5256011996-12-09 18:35:56 +0000278static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000279strop_rfind(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000280 PyObject *self; /* Not used */
281 PyObject *args;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000282{
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
Barry Warsawf5256011996-12-09 18:35:56 +0000286 if (PyArg_Parse(args, "(s#s#i)", &s, &len, &sub, &n, &i)) {
Guido van Rossumee9012f1993-10-26 15:23:55 +0000287 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 {
Barry Warsawf5256011996-12-09 18:35:56 +0000293 PyErr_Clear();
294 if (!PyArg_Parse(args, "(s#s#)", &s, &len, &sub, &n))
Guido van Rossumee9012f1993-10-26 15:23:55 +0000295 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)
Barry Warsawf5256011996-12-09 18:35:56 +0000300 return PyInt_FromLong((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))
Barry Warsawf5256011996-12-09 18:35:56 +0000305 return PyInt_FromLong((long)j);
Guido van Rossume270b431992-09-03 20:21:07 +0000306
Barry Warsawf5256011996-12-09 18:35:56 +0000307 return PyInt_FromLong(-1L);
Guido van Rossume270b431992-09-03 20:21:07 +0000308}
309
Barry Warsawf5256011996-12-09 18:35:56 +0000310static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000311do_strip(args, striptype)
Barry Warsawf5256011996-12-09 18:35:56 +0000312 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000313 int striptype;
314{
315 char *s;
316 int len, i, j;
317
318
Barry Warsawf5256011996-12-09 18:35:56 +0000319 if (!PyArg_Parse(args, "s#", &s, &len))
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000320 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) {
Barry Warsawf5256011996-12-09 18:35:56 +0000339 Py_INCREF(args);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000340 return args;
341 }
342 else
Barry Warsawf5256011996-12-09 18:35:56 +0000343 return PyString_FromStringAndSize(s+i, j-i);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000344}
345
Guido van Rossume270b431992-09-03 20:21:07 +0000346
Barry Warsawf5256011996-12-09 18:35:56 +0000347static PyObject *
Guido van Rossume270b431992-09-03 20:21:07 +0000348strop_strip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000349 PyObject *self; /* Not used */
350 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000351{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000352 return do_strip(args, BOTHSTRIP);
353}
Guido van Rossume270b431992-09-03 20:21:07 +0000354
Barry Warsawf5256011996-12-09 18:35:56 +0000355static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000356strop_lstrip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000357 PyObject *self; /* Not used */
358 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000359{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000360 return do_strip(args, LEFTSTRIP);
361}
Guido van Rossume270b431992-09-03 20:21:07 +0000362
Barry Warsawf5256011996-12-09 18:35:56 +0000363static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000364strop_rstrip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000365 PyObject *self; /* Not used */
366 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000367{
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
Barry Warsawf5256011996-12-09 18:35:56 +0000372static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000373strop_lower(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000374 PyObject *self; /* Not used */
375 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000376{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000377 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000378 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000379 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000380 int changed;
381
Barry Warsawf5256011996-12-09 18:35:56 +0000382 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000383 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000384 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000385 if (new == NULL)
386 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000387 s_new = PyString_AsString(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) {
Barry Warsawf5256011996-12-09 18:35:56 +0000399 Py_DECREF(new);
400 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000401 return args;
402 }
403 return new;
404}
405
406
Barry Warsawf5256011996-12-09 18:35:56 +0000407static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000408strop_upper(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000409 PyObject *self; /* Not used */
410 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000411{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000412 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000413 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000414 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000415 int changed;
416
Barry Warsawf5256011996-12-09 18:35:56 +0000417 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000418 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000419 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000420 if (new == NULL)
421 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000422 s_new = PyString_AsString(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) {
Barry Warsawf5256011996-12-09 18:35:56 +0000434 Py_DECREF(new);
435 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000436 return args;
437 }
438 return new;
439}
440
441
Barry Warsawf5256011996-12-09 18:35:56 +0000442static PyObject *
Guido van Rossum27457531996-06-12 04:24:52 +0000443strop_capitalize(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000444 PyObject *self; /* Not used */
445 PyObject *args;
Guido van Rossum27457531996-06-12 04:24:52 +0000446{
447 char *s, *s_new;
448 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000449 PyObject *new;
Guido van Rossum27457531996-06-12 04:24:52 +0000450 int changed;
451
Barry Warsawf5256011996-12-09 18:35:56 +0000452 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum27457531996-06-12 04:24:52 +0000453 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000454 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum27457531996-06-12 04:24:52 +0000455 if (new == NULL)
456 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000457 s_new = PyString_AsString(new);
Guido van Rossum27457531996-06-12 04:24:52 +0000458 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) {
Barry Warsawf5256011996-12-09 18:35:56 +0000478 Py_DECREF(new);
479 Py_INCREF(args);
Guido van Rossum27457531996-06-12 04:24:52 +0000480 return args;
481 }
482 return new;
483}
484
485
Barry Warsawf5256011996-12-09 18:35:56 +0000486static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000487strop_swapcase(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000488 PyObject *self; /* Not used */
489 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000490{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000491 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000492 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000493 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000494 int changed;
495
Barry Warsawf5256011996-12-09 18:35:56 +0000496 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000497 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000498 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000499 if (new == NULL)
500 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000501 s_new = PyString_AsString(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) {
Barry Warsawf5256011996-12-09 18:35:56 +0000518 Py_DECREF(new);
519 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000520 return args;
521 }
522 return new;
523}
524
525
Barry Warsawf5256011996-12-09 18:35:56 +0000526static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000527strop_atoi(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000528 PyObject *self; /* Not used */
529 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000530{
Barry Warsawf5256011996-12-09 18:35:56 +0000531 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
532 extern unsigned long
533 PyOS_strtoul Py_PROTO((const char *, char **, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000534 char *s, *end;
535 int base = 10;
536 long x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000537 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000538
Barry Warsawf5256011996-12-09 18:35:56 +0000539 if (args != NULL && PyTuple_Check(args)) {
540 if (!PyArg_Parse(args, "(si)", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000541 return NULL;
Guido van Rossuma376cc51996-12-05 23:43:35 +0000542 if ((base != 0 && base < 2) || base > 36) {
Barry Warsawf5256011996-12-09 18:35:56 +0000543 PyErr_SetString(PyExc_ValueError,
544 "invalid base for atoi()");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000545 return NULL;
546 }
547 }
Barry Warsawf5256011996-12-09 18:35:56 +0000548 else if (!PyArg_Parse(args, "s", &s))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000549 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000550 while (*s && isspace(Py_CHARMASK(*s)))
551 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000552 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000553 PyErr_SetString(PyExc_ValueError, "empty string for atoi()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000554 return NULL;
555 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000556 errno = 0;
557 if (base == 0 && s[0] == '0')
Barry Warsawf5256011996-12-09 18:35:56 +0000558 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000559 else
Barry Warsawf5256011996-12-09 18:35:56 +0000560 x = PyOS_strtol(s, &end, base);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000561 while (*end && isspace(Py_CHARMASK(*end)))
562 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000563 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000564 sprintf(buffer, "invalid literal for atoi(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000565 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000566 return NULL;
567 }
568 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000569 sprintf(buffer, "atoi() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000570 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000571 return NULL;
572 }
Barry Warsawf5256011996-12-09 18:35:56 +0000573 return PyInt_FromLong(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000574}
575
576
Barry Warsawf5256011996-12-09 18:35:56 +0000577static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000578strop_atol(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000579 PyObject *self; /* Not used */
580 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000581{
582 char *s, *end;
583 int base = 10;
Barry Warsawf5256011996-12-09 18:35:56 +0000584 PyObject *x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000585 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000586
Barry Warsawf5256011996-12-09 18:35:56 +0000587 if (args != NULL && PyTuple_Check(args)) {
588 if (!PyArg_Parse(args, "(si)", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000589 return NULL;
Guido van Rossuma376cc51996-12-05 23:43:35 +0000590 if ((base != 0 && base < 2) || base > 36) {
Barry Warsawf5256011996-12-09 18:35:56 +0000591 PyErr_SetString(PyExc_ValueError,
592 "invalid base for atol()");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000593 return NULL;
594 }
595 }
Barry Warsawf5256011996-12-09 18:35:56 +0000596 else if (!PyArg_Parse(args, "s", &s))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000597 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000598 while (*s && isspace(Py_CHARMASK(*s)))
599 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000600 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000601 PyErr_SetString(PyExc_ValueError, "empty string for atol()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000602 return NULL;
603 }
Barry Warsawf5256011996-12-09 18:35:56 +0000604 x = PyLong_FromString(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000605 if (x == NULL)
606 return NULL;
607 if (base == 0 && (*end == 'l' || *end == 'L'))
608 end++;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000609 while (*end && isspace(Py_CHARMASK(*end)))
610 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000611 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000612 sprintf(buffer, "invalid literal for atol(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000613 PyErr_SetString(PyExc_ValueError, buffer);
614 Py_DECREF(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000615 return NULL;
616 }
617 return x;
618}
619
620
Barry Warsawf5256011996-12-09 18:35:56 +0000621static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000622strop_atof(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000623 PyObject *self; /* Not used */
624 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000625{
Barry Warsawf5256011996-12-09 18:35:56 +0000626 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627 char *s, *end;
628 double x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000629 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000630
Barry Warsawf5256011996-12-09 18:35:56 +0000631 if (!PyArg_Parse(args, "s", &s))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000632 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000633 while (*s && isspace(Py_CHARMASK(*s)))
634 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000635 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000636 PyErr_SetString(PyExc_ValueError, "empty string for atof()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000637 return NULL;
638 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000639 errno = 0;
640 x = strtod(s, &end);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000641 while (*end && isspace(Py_CHARMASK(*end)))
642 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000643 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000644 sprintf(buffer, "invalid literal for atof(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000645 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000646 return NULL;
647 }
648 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000649 sprintf(buffer, "atof() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000650 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000651 return NULL;
652 }
Barry Warsawf5256011996-12-09 18:35:56 +0000653 return PyFloat_FromDouble(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000654}
655
656
Guido van Rossumed7253c1996-07-23 18:12:39 +0000657static PyObject *
658strop_maketrans(self, args)
659 PyObject *self; /* Not used */
660 PyObject *args;
661{
662 unsigned char c[256], *from=NULL, *to=NULL;
663 int i, fromlen=0, tolen=0;
664
665 if (PyTuple_Size(args)!=0) {
666 if (!PyArg_ParseTuple(args, "s#s#", &from, &fromlen,
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000667 &to, &tolen))
Guido van Rossumed7253c1996-07-23 18:12:39 +0000668 return NULL;
669 }
670
671 if (fromlen!=tolen) {
Barry Warsawf5256011996-12-09 18:35:56 +0000672 PyErr_SetString(PyExc_ValueError,
Guido van Rossumed7253c1996-07-23 18:12:39 +0000673 "maketrans arguments must have same length");
674 return NULL;
675 }
676 for(i=0; i<256; i++)
677 c[i]=(unsigned char)i;
678 for(i=0; i<fromlen; i++) {
679 c[from[i]]=to[i];
680 }
681 return PyString_FromStringAndSize((char *)c, 256);
682}
683
684
Barry Warsawf5256011996-12-09 18:35:56 +0000685static PyObject *
Guido van Rossuma3127e81995-09-13 17:39:06 +0000686strop_translate(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000687 PyObject *self;
688 PyObject *args;
Guido van Rossuma3127e81995-09-13 17:39:06 +0000689{
Guido van Rossumed7253c1996-07-23 18:12:39 +0000690 char *input, *table, *output, *output_start, *delete=NULL;
691 int inlen, tablen, dellen;
692 PyObject *result;
693 int i, trans_table[256];
Guido van Rossuma3127e81995-09-13 17:39:06 +0000694
Guido van Rossumed7253c1996-07-23 18:12:39 +0000695 if (!PyArg_ParseTuple(args, "s#s#|s#", &input, &inlen,
696 &table, &tablen, &delete, &dellen))
Guido van Rossuma3127e81995-09-13 17:39:06 +0000697 return NULL;
698 if (tablen != 256) {
Barry Warsawf5256011996-12-09 18:35:56 +0000699 PyErr_SetString(PyExc_ValueError,
Guido van Rossuma3127e81995-09-13 17:39:06 +0000700 "translation table must be 256 characters long");
701 return NULL;
702 }
Guido van Rossumed7253c1996-07-23 18:12:39 +0000703 for(i=0; i<256; i++)
704 trans_table[i]=Py_CHARMASK(table[i]);
705 if (delete!=NULL) {
706 for(i=0; i<dellen; i++)
Guido van Rossuma376cc51996-12-05 23:43:35 +0000707 trans_table[(int)delete[i]]=-1;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000708 }
709
710 result = PyString_FromStringAndSize((char *)NULL, inlen);
Guido van Rossuma3127e81995-09-13 17:39:06 +0000711 if (result == NULL)
712 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000713 output_start = output = PyString_AsString(result);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000714 if (delete!=NULL && dellen!=0) {
Guido van Rossumed7253c1996-07-23 18:12:39 +0000715 for (i = 0; i < inlen; i++) {
716 int c = Py_CHARMASK(*input++);
717 if (trans_table[c]!=-1)
718 *output++ = (char)trans_table[c];
719 }
720 /* Fix the size of the resulting string */
721 if (inlen > 0 &&_PyString_Resize(&result, output-output_start))
722 return NULL;
723 } else {
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000724 /* If no deletions are required, use a faster loop */
Guido van Rossumed7253c1996-07-23 18:12:39 +0000725 for (i = 0; i < inlen; i++) {
726 int c = Py_CHARMASK(*input++);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000727 *output++ = (char)trans_table[c];
728 }
Guido van Rossuma3127e81995-09-13 17:39:06 +0000729 }
730 return result;
731}
732
733
Guido van Rossume270b431992-09-03 20:21:07 +0000734/* List of functions defined in the module */
735
Barry Warsawf5256011996-12-09 18:35:56 +0000736static PyMethodDef strop_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000737 {"atof", strop_atof},
738 {"atoi", strop_atoi},
739 {"atol", strop_atol},
Guido van Rossum27457531996-06-12 04:24:52 +0000740 {"capitalize", strop_capitalize},
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000741 {"find", strop_find},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000742 {"join", strop_joinfields, 1},
743 {"joinfields", strop_joinfields, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000744 {"lstrip", strop_lstrip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000745 {"lower", strop_lower},
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000746 {"rfind", strop_rfind},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000747 {"rstrip", strop_rstrip},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000748 {"split", strop_splitfields, 1},
749 {"splitfields", strop_splitfields, 1},
Guido van Rossume270b431992-09-03 20:21:07 +0000750 {"strip", strop_strip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000751 {"swapcase", strop_swapcase},
Guido van Rossumed7253c1996-07-23 18:12:39 +0000752 {"maketrans", strop_maketrans, 1},
Guido van Rossuma3127e81995-09-13 17:39:06 +0000753 {"translate", strop_translate, 1},
Guido van Rossum5c850621992-09-11 23:55:51 +0000754 {"upper", strop_upper},
Guido van Rossume270b431992-09-03 20:21:07 +0000755 {NULL, NULL} /* sentinel */
756};
757
758
Guido van Rossume270b431992-09-03 20:21:07 +0000759void
760initstrop()
761{
Barry Warsawf5256011996-12-09 18:35:56 +0000762 PyObject *m, *d, *s;
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000763 char buf[256];
764 int c, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000765 m = Py_InitModule("strop", strop_methods);
766 d = PyModule_GetDict(m);
Guido van Rossume22e6441993-07-09 10:51:31 +0000767
768 /* Create 'whitespace' object */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000769 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000770 for (c = 0; c < 256; c++) {
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000771 if (isspace(c))
772 buf[n++] = c;
773 }
Barry Warsawf5256011996-12-09 18:35:56 +0000774 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000775 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000776 PyDict_SetItemString(d, "whitespace", s);
777 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000778 }
779 /* Create 'lowercase' object */
780 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000781 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000782 if (islower(c))
783 buf[n++] = c;
784 }
Barry Warsawf5256011996-12-09 18:35:56 +0000785 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000786 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000787 PyDict_SetItemString(d, "lowercase", s);
788 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000789 }
790
791 /* Create 'uppercase' object */
792 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000793 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000794 if (isupper(c))
795 buf[n++] = c;
796 }
Barry Warsawf5256011996-12-09 18:35:56 +0000797 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000798 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000799 PyDict_SetItemString(d, "uppercase", s);
800 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000801 }
802
Barry Warsawf5256011996-12-09 18:35:56 +0000803 if (PyErr_Occurred())
804 Py_FatalError("can't initialize module strop");
Guido van Rossume270b431992-09-03 20:21:07 +0000805}