blob: d84b55f55c3932b6529229ce885e3a785bd3fafe [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 Warsawf5256011996-12-09 18:35:56 +0000171 PyObject *seq, *item, *res;
Barry Warsaw04d2d151997-01-03 23:46:51 +0000172 char *p, *sep = NULL;
173 int seqlen, reslen, itemlen, i, seplen = 0;
174 int ownrefs = 0;
175 PyObject* (*getitemfunc) Py_PROTO((PyObject*, int));
Guido van Rossumc89705d1992-11-26 08:54:07 +0000176
Barry Warsawf5256011996-12-09 18:35:56 +0000177 if (!PyArg_ParseTuple(args, "O|s#", &seq, &sep, &seplen))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000178 return NULL;
Guido van Rossum009e79b1995-05-03 17:40:23 +0000179 if (sep == NULL) {
180 sep = " ";
181 seplen = 1;
182 }
Barry Warsaw04d2d151997-01-03 23:46:51 +0000183 /* do it this way to optimize for the common cases, but also
184 * support the more general sequence protocol
185 */
186 if (PyList_Check(seq)) {
187 getitemfunc = PyList_GetItem;
188 seqlen = PyList_Size(seq);
189 }
190 else if (PyTuple_Check(seq)) {
191 getitemfunc = PyTuple_GetItem;
192 seqlen = PyTuple_Size(seq);
193 }
194 else if (PySequence_Check(seq)) {
195 getitemfunc = PySequence_GetItem;
196 seqlen = PySequence_Length(seq);
197 ownrefs = 1;
198 }
199 else {
Barry Warsawf5256011996-12-09 18:35:56 +0000200 PyErr_SetString(PyExc_TypeError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000201 "first argument must be a sequence");
Guido van Rossumc89705d1992-11-26 08:54:07 +0000202 return NULL;
203 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000204 if (seqlen < 0 && PyErr_Occurred())
205 return NULL;
206
Guido van Rossumc89705d1992-11-26 08:54:07 +0000207 reslen = 0;
208 for (i = 0; i < seqlen; i++) {
Barry Warsaw04d2d151997-01-03 23:46:51 +0000209 if (!(item = getitemfunc(seq, i)))
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000210 return NULL;
211
Barry Warsawf5256011996-12-09 18:35:56 +0000212 if (!PyString_Check(item)) {
213 PyErr_SetString(PyExc_TypeError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000214 "first argument must be sequence of strings");
Barry Warsaw04d2d151997-01-03 23:46:51 +0000215 if (ownrefs)
216 Py_DECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000217 return NULL;
218 }
219 if (i > 0)
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000220 reslen += seplen;
221 reslen += PyString_Size(item);
Barry Warsaw04d2d151997-01-03 23:46:51 +0000222 if (ownrefs)
223 Py_DECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000224 }
Barry Warsaw04d2d151997-01-03 23:46:51 +0000225 if (seqlen == 1) {
Guido van Rossumc89705d1992-11-26 08:54:07 +0000226 /* Optimization if there's only one item */
Barry Warsaw04d2d151997-01-03 23:46:51 +0000227 item = getitemfunc(seq, 0);
228 if (!ownrefs)
229 Py_XINCREF(item);
230 return item;
231 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000232
Barry Warsawf5256011996-12-09 18:35:56 +0000233 res = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000234 if (res == NULL)
235 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000236 p = PyString_AsString(res);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000237 for (i = 0; i < seqlen; i++) {
Barry Warsaw04d2d151997-01-03 23:46:51 +0000238 if (!(item = getitemfunc(seq, i))) {
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000239 Py_DECREF(res);
240 return NULL;
241 }
Guido van Rossumc89705d1992-11-26 08:54:07 +0000242 if (i > 0) {
243 memcpy(p, sep, seplen);
244 p += seplen;
245 }
Barry Warsawf5256011996-12-09 18:35:56 +0000246 itemlen = PyString_Size(item);
247 memcpy(p, PyString_AsString(item), itemlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000248 p += itemlen;
Barry Warsaw04d2d151997-01-03 23:46:51 +0000249 if (ownrefs)
250 Py_DECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000251 }
Barry Warsawf5256011996-12-09 18:35:56 +0000252 if (p != PyString_AsString(res) + reslen) {
253 PyErr_SetString(PyExc_SystemError,
254 "strop.joinfields: assertion failed");
Guido van Rossumc89705d1992-11-26 08:54:07 +0000255 return NULL;
256 }
257 return res;
258}
259
260
Barry Warsawf5256011996-12-09 18:35:56 +0000261static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000262strop_find(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000263 PyObject *self; /* Not used */
264 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000265{
266 char *s, *sub;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000267 int len, n, i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000268
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000269 if (!PyArg_ParseTuple(args, "s#s#|i", &s, &len, &sub, &n, &i))
270 return NULL;
271
272 if (i < 0)
273 i += len;
274 if (i < 0)
Guido van Rossume270b431992-09-03 20:21:07 +0000275 i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000276
277 if (n == 0)
Barry Warsawf5256011996-12-09 18:35:56 +0000278 return PyInt_FromLong((long)i);
Guido van Rossume270b431992-09-03 20:21:07 +0000279
280 len -= n;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000281 for (; i <= len; ++i)
282 if (s[i] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000283 (n == 1 || memcmp(&s[i+1], &sub[1], n-1) == 0))
Barry Warsawf5256011996-12-09 18:35:56 +0000284 return PyInt_FromLong((long)i);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000285
Barry Warsawf5256011996-12-09 18:35:56 +0000286 return PyInt_FromLong(-1L);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000287}
288
289
Barry Warsawf5256011996-12-09 18:35:56 +0000290static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000291strop_rfind(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000292 PyObject *self; /* Not used */
293 PyObject *args;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000294{
295 char *s, *sub;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000296 int len, n, j;
297 int i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000298
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000299 if (!PyArg_ParseTuple(args, "s#s#|i", &s, &len, &sub, &n, &i))
300 return NULL;
301
302 if (i < 0)
303 i += len;
304 if (i < 0)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000305 i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000306
307 if (n == 0)
Barry Warsawf5256011996-12-09 18:35:56 +0000308 return PyInt_FromLong((long)len);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000309
Guido van Rossumb6775db1994-08-01 11:34:53 +0000310 for (j = len-n; j >= i; --j)
311 if (s[j] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000312 (n == 1 || memcmp(&s[j+1], &sub[1], n-1) == 0))
Barry Warsawf5256011996-12-09 18:35:56 +0000313 return PyInt_FromLong((long)j);
Guido van Rossume270b431992-09-03 20:21:07 +0000314
Barry Warsawf5256011996-12-09 18:35:56 +0000315 return PyInt_FromLong(-1L);
Guido van Rossume270b431992-09-03 20:21:07 +0000316}
317
Barry Warsawf5256011996-12-09 18:35:56 +0000318static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000319do_strip(args, striptype)
Barry Warsawf5256011996-12-09 18:35:56 +0000320 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000321 int striptype;
322{
323 char *s;
324 int len, i, j;
325
326
Barry Warsawf5256011996-12-09 18:35:56 +0000327 if (!PyArg_Parse(args, "s#", &s, &len))
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000328 return NULL;
329
330 i = 0;
331 if (striptype != RIGHTSTRIP) {
332 while (i < len && isspace(Py_CHARMASK(s[i]))) {
333 i++;
334 }
335 }
336
337
338 j = len;
339 if (striptype != LEFTSTRIP) {
340 do {
341 j--;
342 } while (j >= i && isspace(Py_CHARMASK(s[j])));
343 j++;
344 }
345
346 if (i == 0 && j == len) {
Barry Warsawf5256011996-12-09 18:35:56 +0000347 Py_INCREF(args);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000348 return args;
349 }
350 else
Barry Warsawf5256011996-12-09 18:35:56 +0000351 return PyString_FromStringAndSize(s+i, j-i);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000352}
353
Guido van Rossume270b431992-09-03 20:21:07 +0000354
Barry Warsawf5256011996-12-09 18:35:56 +0000355static PyObject *
Guido van Rossume270b431992-09-03 20:21:07 +0000356strop_strip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000357 PyObject *self; /* Not used */
358 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000359{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000360 return do_strip(args, BOTHSTRIP);
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_lstrip(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, LEFTSTRIP);
369}
Guido van Rossume270b431992-09-03 20:21:07 +0000370
Barry Warsawf5256011996-12-09 18:35:56 +0000371static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000372strop_rstrip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000373 PyObject *self; /* Not used */
374 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000375{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000376 return do_strip(args, RIGHTSTRIP);
Guido van Rossume270b431992-09-03 20:21:07 +0000377}
378
379
Barry Warsawf5256011996-12-09 18:35:56 +0000380static PyObject *
Barry Warsaw04d2d151997-01-03 23:46:51 +0000381strop_lower(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000382 PyObject *self; /* Not used */
383 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000384{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000385 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000386 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000387 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000388 int changed;
389
Barry Warsawf5256011996-12-09 18:35:56 +0000390 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000391 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000392 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000393 if (new == NULL)
394 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000395 s_new = PyString_AsString(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000396 changed = 0;
397 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000398 int c = Py_CHARMASK(*s++);
Barry Warsaw04d2d151997-01-03 23:46:51 +0000399 if (isupper(c)) {
Guido van Rossum5c850621992-09-11 23:55:51 +0000400 changed = 1;
Barry Warsaw04d2d151997-01-03 23:46:51 +0000401 *s_new = tolower(c);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000402 } else
403 *s_new = c;
404 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000405 }
406 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000407 Py_DECREF(new);
408 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000409 return args;
410 }
411 return new;
412}
413
414
Barry Warsawf5256011996-12-09 18:35:56 +0000415static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000416strop_upper(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000417 PyObject *self; /* Not used */
418 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000419{
Barry Warsaw04d2d151997-01-03 23:46:51 +0000420 char *s, *s_new;
421 int i, n;
422 PyObject *new;
423 int changed;
424
425 if (!PyArg_Parse(args, "s#", &s, &n))
426 return NULL;
427 new = PyString_FromStringAndSize(NULL, n);
428 if (new == NULL)
429 return NULL;
430 s_new = PyString_AsString(new);
431 changed = 0;
432 for (i = 0; i < n; i++) {
433 int c = Py_CHARMASK(*s++);
434 if (islower(c)) {
435 changed = 1;
436 *s_new = toupper(c);
437 } else
438 *s_new = c;
439 s_new++;
440 }
441 if (!changed) {
442 Py_DECREF(new);
443 Py_INCREF(args);
444 return args;
445 }
446 return new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000447}
448
449
Barry Warsawf5256011996-12-09 18:35:56 +0000450static PyObject *
Guido van Rossum27457531996-06-12 04:24:52 +0000451strop_capitalize(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000452 PyObject *self; /* Not used */
453 PyObject *args;
Guido van Rossum27457531996-06-12 04:24:52 +0000454{
455 char *s, *s_new;
456 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000457 PyObject *new;
Guido van Rossum27457531996-06-12 04:24:52 +0000458 int changed;
459
Barry Warsawf5256011996-12-09 18:35:56 +0000460 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum27457531996-06-12 04:24:52 +0000461 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000462 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum27457531996-06-12 04:24:52 +0000463 if (new == NULL)
464 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000465 s_new = PyString_AsString(new);
Guido van Rossum27457531996-06-12 04:24:52 +0000466 changed = 0;
Guido van Rossum529c9631996-06-17 16:59:33 +0000467 if (0 < n) {
Guido van Rossum27457531996-06-12 04:24:52 +0000468 int c = Py_CHARMASK(*s++);
469 if (islower(c)) {
470 changed = 1;
471 *s_new = toupper(c);
472 } else
473 *s_new = c;
474 s_new++;
475 }
476 for (i = 1; i < n; i++) {
477 int c = Py_CHARMASK(*s++);
478 if (isupper(c)) {
479 changed = 1;
480 *s_new = tolower(c);
481 } else
482 *s_new = c;
483 s_new++;
484 }
485 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000486 Py_DECREF(new);
487 Py_INCREF(args);
Guido van Rossum27457531996-06-12 04:24:52 +0000488 return args;
489 }
490 return new;
491}
492
493
Barry Warsawf5256011996-12-09 18:35:56 +0000494static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000495strop_swapcase(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000496 PyObject *self; /* Not used */
497 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000498{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000499 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000500 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000501 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000502 int changed;
503
Barry Warsawf5256011996-12-09 18:35:56 +0000504 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000505 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000506 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000507 if (new == NULL)
508 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000509 s_new = PyString_AsString(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000510 changed = 0;
511 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000512 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000513 if (islower(c)) {
514 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000515 *s_new = toupper(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000516 }
517 else if (isupper(c)) {
518 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000519 *s_new = tolower(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000520 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000521 else
522 *s_new = c;
523 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000524 }
525 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000526 Py_DECREF(new);
527 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000528 return args;
529 }
530 return new;
531}
532
533
Barry Warsawf5256011996-12-09 18:35:56 +0000534static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000535strop_atoi(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000536 PyObject *self; /* Not used */
537 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000538{
Barry Warsawf5256011996-12-09 18:35:56 +0000539 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
540 extern unsigned long
541 PyOS_strtoul Py_PROTO((const char *, char **, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000542 char *s, *end;
543 int base = 10;
544 long x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000545 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000546
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000547 if (!PyArg_ParseTuple(args, "s|i", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000548 return NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000549
550 if ((base != 0 && base < 2) || base > 36) {
551 PyErr_SetString(PyExc_ValueError, "invalid base for atoi()");
552 return NULL;
553 }
554
Guido van Rossumc35f9331996-09-11 23:30:42 +0000555 while (*s && isspace(Py_CHARMASK(*s)))
556 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000557 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000558 PyErr_SetString(PyExc_ValueError, "empty string for atoi()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000559 return NULL;
560 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000561 errno = 0;
562 if (base == 0 && s[0] == '0')
Barry Warsawf5256011996-12-09 18:35:56 +0000563 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000564 else
Barry Warsawf5256011996-12-09 18:35:56 +0000565 x = PyOS_strtol(s, &end, base);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000566 while (*end && isspace(Py_CHARMASK(*end)))
567 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000568 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000569 sprintf(buffer, "invalid literal for atoi(): %.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 }
573 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000574 sprintf(buffer, "atoi() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000575 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000576 return NULL;
577 }
Barry Warsawf5256011996-12-09 18:35:56 +0000578 return PyInt_FromLong(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000579}
580
581
Barry Warsawf5256011996-12-09 18:35:56 +0000582static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000583strop_atol(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000584 PyObject *self; /* Not used */
585 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000586{
587 char *s, *end;
588 int base = 10;
Barry Warsawf5256011996-12-09 18:35:56 +0000589 PyObject *x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000590 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000591
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000592 if (!PyArg_ParseTuple(args, "s|i", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000593 return NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000594
595 if ((base != 0 && base < 2) || base > 36) {
596 PyErr_SetString(PyExc_ValueError, "invalid base for atol()");
597 return NULL;
598 }
599
Guido van Rossumc35f9331996-09-11 23:30:42 +0000600 while (*s && isspace(Py_CHARMASK(*s)))
601 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000602 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000603 PyErr_SetString(PyExc_ValueError, "empty string for atol()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000604 return NULL;
605 }
Barry Warsawf5256011996-12-09 18:35:56 +0000606 x = PyLong_FromString(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000607 if (x == NULL)
608 return NULL;
609 if (base == 0 && (*end == 'l' || *end == 'L'))
610 end++;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000611 while (*end && isspace(Py_CHARMASK(*end)))
612 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000613 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000614 sprintf(buffer, "invalid literal for atol(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000615 PyErr_SetString(PyExc_ValueError, buffer);
616 Py_DECREF(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000617 return NULL;
618 }
619 return x;
620}
621
622
Barry Warsawf5256011996-12-09 18:35:56 +0000623static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000624strop_atof(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000625 PyObject *self; /* Not used */
626 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627{
Barry Warsawf5256011996-12-09 18:35:56 +0000628 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000629 char *s, *end;
630 double x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000631 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000632
Barry Warsawf5256011996-12-09 18:35:56 +0000633 if (!PyArg_Parse(args, "s", &s))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000634 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000635 while (*s && isspace(Py_CHARMASK(*s)))
636 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000637 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000638 PyErr_SetString(PyExc_ValueError, "empty string for atof()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000639 return NULL;
640 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000641 errno = 0;
642 x = strtod(s, &end);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000643 while (*end && isspace(Py_CHARMASK(*end)))
644 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000645 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000646 sprintf(buffer, "invalid literal for atof(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000647 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000648 return NULL;
649 }
650 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000651 sprintf(buffer, "atof() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000652 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000653 return NULL;
654 }
Barry Warsawf5256011996-12-09 18:35:56 +0000655 return PyFloat_FromDouble(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000656}
657
658
Guido van Rossumed7253c1996-07-23 18:12:39 +0000659static PyObject *
660strop_maketrans(self, args)
661 PyObject *self; /* Not used */
662 PyObject *args;
663{
664 unsigned char c[256], *from=NULL, *to=NULL;
665 int i, fromlen=0, tolen=0;
666
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000667 if (!PyArg_ParseTuple(args, "s#s#", &from, &fromlen, &to, &tolen))
668 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000669
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000670 if (fromlen != tolen) {
Barry Warsawf5256011996-12-09 18:35:56 +0000671 PyErr_SetString(PyExc_ValueError,
Guido van Rossumed7253c1996-07-23 18:12:39 +0000672 "maketrans arguments must have same length");
673 return NULL;
674 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000675 for (i = 0; i < 256; i++)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000676 c[i]=(unsigned char)i;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000677 for (i = 0; i < fromlen; i++)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000678 c[from[i]]=to[i];
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000679
Guido van Rossumed7253c1996-07-23 18:12:39 +0000680 return PyString_FromStringAndSize((char *)c, 256);
681}
682
683
Barry Warsawf5256011996-12-09 18:35:56 +0000684static PyObject *
Guido van Rossuma3127e81995-09-13 17:39:06 +0000685strop_translate(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000686 PyObject *self;
687 PyObject *args;
Guido van Rossuma3127e81995-09-13 17:39:06 +0000688{
Guido van Rossumed7253c1996-07-23 18:12:39 +0000689 char *input, *table, *output, *output_start, *delete=NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000690 int inlen, tablen, dellen = 0;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000691 PyObject *result;
692 int i, trans_table[256];
Guido van Rossuma3127e81995-09-13 17:39:06 +0000693
Guido van Rossumed7253c1996-07-23 18:12:39 +0000694 if (!PyArg_ParseTuple(args, "s#s#|s#", &input, &inlen,
695 &table, &tablen, &delete, &dellen))
Guido van Rossuma3127e81995-09-13 17:39:06 +0000696 return NULL;
697 if (tablen != 256) {
Barry Warsawf5256011996-12-09 18:35:56 +0000698 PyErr_SetString(PyExc_ValueError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000699 "translation table must be 256 characters long");
Guido van Rossuma3127e81995-09-13 17:39:06 +0000700 return NULL;
701 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000702 for (i = 0; i < 256; i++)
703 trans_table[i] = Py_CHARMASK(table[i]);
704
705 if (delete != NULL) {
706 for (i = 0; i < dellen; i++)
707 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);
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000714
715 if (delete != NULL && dellen != 0) {
Guido van Rossumed7253c1996-07-23 18:12:39 +0000716 for (i = 0; i < inlen; i++) {
717 int c = Py_CHARMASK(*input++);
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000718 if (trans_table[c] != -1)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000719 *output++ = (char)trans_table[c];
720 }
721 /* Fix the size of the resulting string */
722 if (inlen > 0 &&_PyString_Resize(&result, output-output_start))
723 return NULL;
724 } else {
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000725 /* If no deletions are required, use a faster loop */
Guido van Rossumed7253c1996-07-23 18:12:39 +0000726 for (i = 0; i < inlen; i++) {
727 int c = Py_CHARMASK(*input++);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000728 *output++ = (char)trans_table[c];
729 }
Guido van Rossuma3127e81995-09-13 17:39:06 +0000730 }
731 return result;
732}
733
734
Guido van Rossume270b431992-09-03 20:21:07 +0000735/* List of functions defined in the module */
736
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000737static PyMethodDef
738strop_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000739 {"atof", strop_atof},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000740 {"atoi", strop_atoi, 1},
741 {"atol", strop_atol, 1},
Guido van Rossum27457531996-06-12 04:24:52 +0000742 {"capitalize", strop_capitalize},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000743 {"find", strop_find, 1},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000744 {"join", strop_joinfields, 1},
745 {"joinfields", strop_joinfields, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000746 {"lstrip", strop_lstrip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000747 {"lower", strop_lower},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000748 {"rfind", strop_rfind, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000749 {"rstrip", strop_rstrip},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000750 {"split", strop_splitfields, 1},
751 {"splitfields", strop_splitfields, 1},
Guido van Rossume270b431992-09-03 20:21:07 +0000752 {"strip", strop_strip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000753 {"swapcase", strop_swapcase},
Guido van Rossumed7253c1996-07-23 18:12:39 +0000754 {"maketrans", strop_maketrans, 1},
Guido van Rossuma3127e81995-09-13 17:39:06 +0000755 {"translate", strop_translate, 1},
Guido van Rossum5c850621992-09-11 23:55:51 +0000756 {"upper", strop_upper},
Guido van Rossume270b431992-09-03 20:21:07 +0000757 {NULL, NULL} /* sentinel */
758};
759
760
Guido van Rossume270b431992-09-03 20:21:07 +0000761void
762initstrop()
763{
Barry Warsawf5256011996-12-09 18:35:56 +0000764 PyObject *m, *d, *s;
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000765 char buf[256];
766 int c, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000767 m = Py_InitModule("strop", strop_methods);
768 d = PyModule_GetDict(m);
Guido van Rossume22e6441993-07-09 10:51:31 +0000769
770 /* Create 'whitespace' object */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000771 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000772 for (c = 0; c < 256; c++) {
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000773 if (isspace(c))
774 buf[n++] = c;
775 }
Barry Warsawf5256011996-12-09 18:35:56 +0000776 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000777 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000778 PyDict_SetItemString(d, "whitespace", s);
779 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000780 }
781 /* Create 'lowercase' object */
782 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000783 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000784 if (islower(c))
785 buf[n++] = c;
786 }
Barry Warsawf5256011996-12-09 18:35:56 +0000787 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000788 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000789 PyDict_SetItemString(d, "lowercase", s);
790 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000791 }
792
793 /* Create 'uppercase' object */
794 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000795 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000796 if (isupper(c))
797 buf[n++] = c;
798 }
Barry Warsawf5256011996-12-09 18:35:56 +0000799 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000800 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000801 PyDict_SetItemString(d, "uppercase", s);
802 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000803 }
804
Barry Warsawf5256011996-12-09 18:35:56 +0000805 if (PyErr_Occurred())
806 Py_FatalError("can't initialize module strop");
Guido van Rossume270b431992-09-03 20:21:07 +0000807}