blob: 193d9981031e73866eabe0241bfda2d0b72f2b74 [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;
Guido van Rossumc89705d1992-11-26 08:54:07 +0000172 char *sep, *p;
173 int seplen, seqlen, reslen, itemlen, i;
174
Guido van Rossum009e79b1995-05-03 17:40:23 +0000175 sep = NULL;
176 seplen = 0;
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 Warsawe8fc29c1997-01-03 22:45:34 +0000183 if (!PySequence_Check(seq)) {
Barry Warsawf5256011996-12-09 18:35:56 +0000184 PyErr_SetString(PyExc_TypeError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000185 "first argument must be a sequence");
Guido van Rossumc89705d1992-11-26 08:54:07 +0000186 return NULL;
187 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000188 seqlen = PySequence_Length(seq);
189 if (seqlen < 0 && PyErr_Occurred())
190 return NULL;
191
Guido van Rossumc89705d1992-11-26 08:54:07 +0000192 reslen = 0;
193 for (i = 0; i < seqlen; i++) {
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000194 if (!(item = PySequence_GetItem(seq, i)))
195 return NULL;
196
Barry Warsawf5256011996-12-09 18:35:56 +0000197 if (!PyString_Check(item)) {
198 PyErr_SetString(PyExc_TypeError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000199 "first argument must be sequence of strings");
200 Py_DECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000201 return NULL;
202 }
203 if (i > 0)
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000204 reslen += seplen;
205 reslen += PyString_Size(item);
206 Py_DECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000207 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000208 if (seqlen == 1)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000209 /* Optimization if there's only one item */
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000210 return PySequence_GetItem(seq, 0);
211
Barry Warsawf5256011996-12-09 18:35:56 +0000212 res = PyString_FromStringAndSize((char *)NULL, reslen);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000213 if (res == NULL)
214 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000215 p = PyString_AsString(res);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000216 for (i = 0; i < seqlen; i++) {
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000217 if (!(item = PySequence_GetItem(seq, i))) {
218 Py_DECREF(res);
219 return NULL;
220 }
Guido van Rossumc89705d1992-11-26 08:54:07 +0000221 if (i > 0) {
222 memcpy(p, sep, seplen);
223 p += seplen;
224 }
Barry Warsawf5256011996-12-09 18:35:56 +0000225 itemlen = PyString_Size(item);
226 memcpy(p, PyString_AsString(item), itemlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000227 p += itemlen;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000228 Py_DECREF(item);
Guido van Rossumc89705d1992-11-26 08:54:07 +0000229 }
Barry Warsawf5256011996-12-09 18:35:56 +0000230 if (p != PyString_AsString(res) + reslen) {
231 PyErr_SetString(PyExc_SystemError,
232 "strop.joinfields: assertion failed");
Guido van Rossumc89705d1992-11-26 08:54:07 +0000233 return NULL;
234 }
235 return res;
236}
237
238
Barry Warsawf5256011996-12-09 18:35:56 +0000239static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000240strop_find(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000241 PyObject *self; /* Not used */
242 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000243{
244 char *s, *sub;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000245 int len, n, i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000246
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000247 if (!PyArg_ParseTuple(args, "s#s#|i", &s, &len, &sub, &n, &i))
248 return NULL;
249
250 if (i < 0)
251 i += len;
252 if (i < 0)
Guido van Rossume270b431992-09-03 20:21:07 +0000253 i = 0;
Guido van Rossume270b431992-09-03 20:21:07 +0000254
255 if (n == 0)
Barry Warsawf5256011996-12-09 18:35:56 +0000256 return PyInt_FromLong((long)i);
Guido van Rossume270b431992-09-03 20:21:07 +0000257
258 len -= n;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000259 for (; i <= len; ++i)
260 if (s[i] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000261 (n == 1 || memcmp(&s[i+1], &sub[1], n-1) == 0))
Barry Warsawf5256011996-12-09 18:35:56 +0000262 return PyInt_FromLong((long)i);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000263
Barry Warsawf5256011996-12-09 18:35:56 +0000264 return PyInt_FromLong(-1L);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000265}
266
267
Barry Warsawf5256011996-12-09 18:35:56 +0000268static PyObject *
Guido van Rossum5806a4f1994-08-17 13:15:46 +0000269strop_rfind(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000270 PyObject *self; /* Not used */
271 PyObject *args;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000272{
273 char *s, *sub;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000274 int len, n, j;
275 int i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000276
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000277 if (!PyArg_ParseTuple(args, "s#s#|i", &s, &len, &sub, &n, &i))
278 return NULL;
279
280 if (i < 0)
281 i += len;
282 if (i < 0)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000283 i = 0;
Guido van Rossumee9012f1993-10-26 15:23:55 +0000284
285 if (n == 0)
Barry Warsawf5256011996-12-09 18:35:56 +0000286 return PyInt_FromLong((long)len);
Guido van Rossumee9012f1993-10-26 15:23:55 +0000287
Guido van Rossumb6775db1994-08-01 11:34:53 +0000288 for (j = len-n; j >= i; --j)
289 if (s[j] == sub[0] &&
Guido van Rossuma0ca4c41996-10-04 13:39:37 +0000290 (n == 1 || memcmp(&s[j+1], &sub[1], n-1) == 0))
Barry Warsawf5256011996-12-09 18:35:56 +0000291 return PyInt_FromLong((long)j);
Guido van Rossume270b431992-09-03 20:21:07 +0000292
Barry Warsawf5256011996-12-09 18:35:56 +0000293 return PyInt_FromLong(-1L);
Guido van Rossume270b431992-09-03 20:21:07 +0000294}
295
Barry Warsawf5256011996-12-09 18:35:56 +0000296static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000297do_strip(args, striptype)
Barry Warsawf5256011996-12-09 18:35:56 +0000298 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000299 int striptype;
300{
301 char *s;
302 int len, i, j;
303
304
Barry Warsawf5256011996-12-09 18:35:56 +0000305 if (!PyArg_Parse(args, "s#", &s, &len))
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000306 return NULL;
307
308 i = 0;
309 if (striptype != RIGHTSTRIP) {
310 while (i < len && isspace(Py_CHARMASK(s[i]))) {
311 i++;
312 }
313 }
314
315
316 j = len;
317 if (striptype != LEFTSTRIP) {
318 do {
319 j--;
320 } while (j >= i && isspace(Py_CHARMASK(s[j])));
321 j++;
322 }
323
324 if (i == 0 && j == len) {
Barry Warsawf5256011996-12-09 18:35:56 +0000325 Py_INCREF(args);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000326 return args;
327 }
328 else
Barry Warsawf5256011996-12-09 18:35:56 +0000329 return PyString_FromStringAndSize(s+i, j-i);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000330}
331
Guido van Rossume270b431992-09-03 20:21:07 +0000332
Barry Warsawf5256011996-12-09 18:35:56 +0000333static PyObject *
Guido van Rossume270b431992-09-03 20:21:07 +0000334strop_strip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000335 PyObject *self; /* Not used */
336 PyObject *args;
Guido van Rossume270b431992-09-03 20:21:07 +0000337{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000338 return do_strip(args, BOTHSTRIP);
339}
Guido van Rossume270b431992-09-03 20:21:07 +0000340
Barry Warsawf5256011996-12-09 18:35:56 +0000341static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000342strop_lstrip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000343 PyObject *self; /* Not used */
344 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000345{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000346 return do_strip(args, LEFTSTRIP);
347}
Guido van Rossume270b431992-09-03 20:21:07 +0000348
Barry Warsawf5256011996-12-09 18:35:56 +0000349static PyObject *
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000350strop_rstrip(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000351 PyObject *self; /* Not used */
352 PyObject *args;
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000353{
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000354 return do_strip(args, RIGHTSTRIP);
Guido van Rossume270b431992-09-03 20:21:07 +0000355}
356
357
Barry Warsawf5256011996-12-09 18:35:56 +0000358static PyObject *
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000359do_casechange(self, args, test, conv)
Barry Warsawf5256011996-12-09 18:35:56 +0000360 PyObject *self; /* Not used */
361 PyObject *args;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000362 int (*test) Py_PROTO((int));
363 int (*conv) Py_PROTO((int));
Guido van Rossum5c850621992-09-11 23:55:51 +0000364{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000365 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000366 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000367 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000368 int changed;
369
Barry Warsawf5256011996-12-09 18:35:56 +0000370 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000371 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000372 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000373 if (new == NULL)
374 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000375 s_new = PyString_AsString(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000376 changed = 0;
377 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000378 int c = Py_CHARMASK(*s++);
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000379 if (test(c)) {
Guido van Rossum5c850621992-09-11 23:55:51 +0000380 changed = 1;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000381 *s_new = conv(c);
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000382 } else
383 *s_new = c;
384 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000385 }
386 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000387 Py_DECREF(new);
388 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000389 return args;
390 }
391 return new;
392}
393
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000394static PyObject *
395strop_lower(self, args)
396 PyObject *self; /* Not used */
397 PyObject *args;
398{
399 return do_casechange(self, args, isupper, tolower);
400}
401
Guido van Rossum5c850621992-09-11 23:55:51 +0000402
Barry Warsawf5256011996-12-09 18:35:56 +0000403static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000404strop_upper(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000405 PyObject *self; /* Not used */
406 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000407{
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000408 return do_casechange(self, args, islower, toupper);
Guido van Rossum5c850621992-09-11 23:55:51 +0000409}
410
411
Barry Warsawf5256011996-12-09 18:35:56 +0000412static PyObject *
Guido van Rossum27457531996-06-12 04:24:52 +0000413strop_capitalize(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000414 PyObject *self; /* Not used */
415 PyObject *args;
Guido van Rossum27457531996-06-12 04:24:52 +0000416{
417 char *s, *s_new;
418 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000419 PyObject *new;
Guido van Rossum27457531996-06-12 04:24:52 +0000420 int changed;
421
Barry Warsawf5256011996-12-09 18:35:56 +0000422 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum27457531996-06-12 04:24:52 +0000423 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000424 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum27457531996-06-12 04:24:52 +0000425 if (new == NULL)
426 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000427 s_new = PyString_AsString(new);
Guido van Rossum27457531996-06-12 04:24:52 +0000428 changed = 0;
Guido van Rossum529c9631996-06-17 16:59:33 +0000429 if (0 < n) {
Guido van Rossum27457531996-06-12 04:24:52 +0000430 int c = Py_CHARMASK(*s++);
431 if (islower(c)) {
432 changed = 1;
433 *s_new = toupper(c);
434 } else
435 *s_new = c;
436 s_new++;
437 }
438 for (i = 1; i < n; i++) {
439 int c = Py_CHARMASK(*s++);
440 if (isupper(c)) {
441 changed = 1;
442 *s_new = tolower(c);
443 } else
444 *s_new = c;
445 s_new++;
446 }
447 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000448 Py_DECREF(new);
449 Py_INCREF(args);
Guido van Rossum27457531996-06-12 04:24:52 +0000450 return args;
451 }
452 return new;
453}
454
455
Barry Warsawf5256011996-12-09 18:35:56 +0000456static PyObject *
Guido van Rossum5c850621992-09-11 23:55:51 +0000457strop_swapcase(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000458 PyObject *self; /* Not used */
459 PyObject *args;
Guido van Rossum5c850621992-09-11 23:55:51 +0000460{
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000461 char *s, *s_new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000462 int i, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000463 PyObject *new;
Guido van Rossum5c850621992-09-11 23:55:51 +0000464 int changed;
465
Barry Warsawf5256011996-12-09 18:35:56 +0000466 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum5c850621992-09-11 23:55:51 +0000467 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000468 new = PyString_FromStringAndSize(NULL, n);
Guido van Rossum5c850621992-09-11 23:55:51 +0000469 if (new == NULL)
470 return NULL;
Barry Warsawf5256011996-12-09 18:35:56 +0000471 s_new = PyString_AsString(new);
Guido van Rossum5c850621992-09-11 23:55:51 +0000472 changed = 0;
473 for (i = 0; i < n; i++) {
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000474 int c = Py_CHARMASK(*s++);
Guido van Rossum5c850621992-09-11 23:55:51 +0000475 if (islower(c)) {
476 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000477 *s_new = toupper(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000478 }
479 else if (isupper(c)) {
480 changed = 1;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000481 *s_new = tolower(c);
Guido van Rossum5c850621992-09-11 23:55:51 +0000482 }
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000483 else
484 *s_new = c;
485 s_new++;
Guido van Rossum5c850621992-09-11 23:55:51 +0000486 }
487 if (!changed) {
Barry Warsawf5256011996-12-09 18:35:56 +0000488 Py_DECREF(new);
489 Py_INCREF(args);
Guido van Rossum5c850621992-09-11 23:55:51 +0000490 return args;
491 }
492 return new;
493}
494
495
Barry Warsawf5256011996-12-09 18:35:56 +0000496static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000497strop_atoi(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000498 PyObject *self; /* Not used */
499 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000500{
Barry Warsawf5256011996-12-09 18:35:56 +0000501 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
502 extern unsigned long
503 PyOS_strtoul Py_PROTO((const char *, char **, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000504 char *s, *end;
505 int base = 10;
506 long x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000507 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000508
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000509 if (!PyArg_ParseTuple(args, "s|i", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000510 return NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000511
512 if ((base != 0 && base < 2) || base > 36) {
513 PyErr_SetString(PyExc_ValueError, "invalid base for atoi()");
514 return NULL;
515 }
516
Guido van Rossumc35f9331996-09-11 23:30:42 +0000517 while (*s && isspace(Py_CHARMASK(*s)))
518 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000519 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000520 PyErr_SetString(PyExc_ValueError, "empty string for atoi()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000521 return NULL;
522 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000523 errno = 0;
524 if (base == 0 && s[0] == '0')
Barry Warsawf5256011996-12-09 18:35:56 +0000525 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000526 else
Barry Warsawf5256011996-12-09 18:35:56 +0000527 x = PyOS_strtol(s, &end, base);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000528 while (*end && isspace(Py_CHARMASK(*end)))
529 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000530 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000531 sprintf(buffer, "invalid literal for atoi(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000532 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000533 return NULL;
534 }
535 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000536 sprintf(buffer, "atoi() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000537 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000538 return NULL;
539 }
Barry Warsawf5256011996-12-09 18:35:56 +0000540 return PyInt_FromLong(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000541}
542
543
Barry Warsawf5256011996-12-09 18:35:56 +0000544static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000545strop_atol(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000546 PyObject *self; /* Not used */
547 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000548{
549 char *s, *end;
550 int base = 10;
Barry Warsawf5256011996-12-09 18:35:56 +0000551 PyObject *x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000552 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000553
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000554 if (!PyArg_ParseTuple(args, "s|i", &s, &base))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000555 return NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000556
557 if ((base != 0 && base < 2) || base > 36) {
558 PyErr_SetString(PyExc_ValueError, "invalid base for atol()");
559 return NULL;
560 }
561
Guido van Rossumc35f9331996-09-11 23:30:42 +0000562 while (*s && isspace(Py_CHARMASK(*s)))
563 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000564 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000565 PyErr_SetString(PyExc_ValueError, "empty string for atol()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000566 return NULL;
567 }
Barry Warsawf5256011996-12-09 18:35:56 +0000568 x = PyLong_FromString(s, &end, base);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000569 if (x == NULL)
570 return NULL;
571 if (base == 0 && (*end == 'l' || *end == 'L'))
572 end++;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000573 while (*end && isspace(Py_CHARMASK(*end)))
574 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000575 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000576 sprintf(buffer, "invalid literal for atol(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000577 PyErr_SetString(PyExc_ValueError, buffer);
578 Py_DECREF(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000579 return NULL;
580 }
581 return x;
582}
583
584
Barry Warsawf5256011996-12-09 18:35:56 +0000585static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000586strop_atof(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000587 PyObject *self; /* Not used */
588 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000589{
Barry Warsawf5256011996-12-09 18:35:56 +0000590 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000591 char *s, *end;
592 double x;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000593 char buffer[256]; /* For errors */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000594
Barry Warsawf5256011996-12-09 18:35:56 +0000595 if (!PyArg_Parse(args, "s", &s))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000596 return NULL;
Guido van Rossumc35f9331996-09-11 23:30:42 +0000597 while (*s && isspace(Py_CHARMASK(*s)))
598 s++;
Guido van Rossum171191e1996-08-21 20:02:25 +0000599 if (s[0] == '\0') {
Barry Warsawf5256011996-12-09 18:35:56 +0000600 PyErr_SetString(PyExc_ValueError, "empty string for atof()");
Guido van Rossum171191e1996-08-21 20:02:25 +0000601 return NULL;
602 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000603 errno = 0;
604 x = strtod(s, &end);
Guido van Rossumc35f9331996-09-11 23:30:42 +0000605 while (*end && isspace(Py_CHARMASK(*end)))
606 end++;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000607 if (*end != '\0') {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000608 sprintf(buffer, "invalid literal for atof(): %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000609 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000610 return NULL;
611 }
612 else if (errno != 0) {
Guido van Rossumc35f9331996-09-11 23:30:42 +0000613 sprintf(buffer, "atof() literal too large: %.200s", s);
Barry Warsawf5256011996-12-09 18:35:56 +0000614 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000615 return NULL;
616 }
Barry Warsawf5256011996-12-09 18:35:56 +0000617 return PyFloat_FromDouble(x);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000618}
619
620
Guido van Rossumed7253c1996-07-23 18:12:39 +0000621static PyObject *
622strop_maketrans(self, args)
623 PyObject *self; /* Not used */
624 PyObject *args;
625{
626 unsigned char c[256], *from=NULL, *to=NULL;
627 int i, fromlen=0, tolen=0;
628
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000629 if (!PyArg_ParseTuple(args, "s#s#", &from, &fromlen, &to, &tolen))
630 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000631
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000632 if (fromlen != tolen) {
Barry Warsawf5256011996-12-09 18:35:56 +0000633 PyErr_SetString(PyExc_ValueError,
Guido van Rossumed7253c1996-07-23 18:12:39 +0000634 "maketrans arguments must have same length");
635 return NULL;
636 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000637 for (i = 0; i < 256; i++)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000638 c[i]=(unsigned char)i;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000639 for (i = 0; i < fromlen; i++)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000640 c[from[i]]=to[i];
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000641
Guido van Rossumed7253c1996-07-23 18:12:39 +0000642 return PyString_FromStringAndSize((char *)c, 256);
643}
644
645
Barry Warsawf5256011996-12-09 18:35:56 +0000646static PyObject *
Guido van Rossuma3127e81995-09-13 17:39:06 +0000647strop_translate(self, args)
Barry Warsawf5256011996-12-09 18:35:56 +0000648 PyObject *self;
649 PyObject *args;
Guido van Rossuma3127e81995-09-13 17:39:06 +0000650{
Guido van Rossumed7253c1996-07-23 18:12:39 +0000651 char *input, *table, *output, *output_start, *delete=NULL;
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000652 int inlen, tablen, dellen = 0;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000653 PyObject *result;
654 int i, trans_table[256];
Guido van Rossuma3127e81995-09-13 17:39:06 +0000655
Guido van Rossumed7253c1996-07-23 18:12:39 +0000656 if (!PyArg_ParseTuple(args, "s#s#|s#", &input, &inlen,
657 &table, &tablen, &delete, &dellen))
Guido van Rossuma3127e81995-09-13 17:39:06 +0000658 return NULL;
659 if (tablen != 256) {
Barry Warsawf5256011996-12-09 18:35:56 +0000660 PyErr_SetString(PyExc_ValueError,
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000661 "translation table must be 256 characters long");
Guido van Rossuma3127e81995-09-13 17:39:06 +0000662 return NULL;
663 }
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000664 for (i = 0; i < 256; i++)
665 trans_table[i] = Py_CHARMASK(table[i]);
666
667 if (delete != NULL) {
668 for (i = 0; i < dellen; i++)
669 trans_table[(int)delete[i]] = -1;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000670 }
671
672 result = PyString_FromStringAndSize((char *)NULL, inlen);
Guido van Rossuma3127e81995-09-13 17:39:06 +0000673 if (result == NULL)
674 return NULL;
Guido van Rossumed7253c1996-07-23 18:12:39 +0000675 output_start = output = PyString_AsString(result);
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000676
677 if (delete != NULL && dellen != 0) {
Guido van Rossumed7253c1996-07-23 18:12:39 +0000678 for (i = 0; i < inlen; i++) {
679 int c = Py_CHARMASK(*input++);
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000680 if (trans_table[c] != -1)
Guido van Rossumed7253c1996-07-23 18:12:39 +0000681 *output++ = (char)trans_table[c];
682 }
683 /* Fix the size of the resulting string */
684 if (inlen > 0 &&_PyString_Resize(&result, output-output_start))
685 return NULL;
686 } else {
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000687 /* If no deletions are required, use a faster loop */
Guido van Rossumed7253c1996-07-23 18:12:39 +0000688 for (i = 0; i < inlen; i++) {
689 int c = Py_CHARMASK(*input++);
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000690 *output++ = (char)trans_table[c];
691 }
Guido van Rossuma3127e81995-09-13 17:39:06 +0000692 }
693 return result;
694}
695
696
Guido van Rossume270b431992-09-03 20:21:07 +0000697/* List of functions defined in the module */
698
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000699static PyMethodDef
700strop_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000701 {"atof", strop_atof},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000702 {"atoi", strop_atoi, 1},
703 {"atol", strop_atol, 1},
Guido van Rossum27457531996-06-12 04:24:52 +0000704 {"capitalize", strop_capitalize},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000705 {"find", strop_find, 1},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000706 {"join", strop_joinfields, 1},
707 {"joinfields", strop_joinfields, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000708 {"lstrip", strop_lstrip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000709 {"lower", strop_lower},
Barry Warsawe8fc29c1997-01-03 22:45:34 +0000710 {"rfind", strop_rfind, 1},
Guido van Rossum7999a5c1996-08-08 19:16:15 +0000711 {"rstrip", strop_rstrip},
Guido van Rossum009e79b1995-05-03 17:40:23 +0000712 {"split", strop_splitfields, 1},
713 {"splitfields", strop_splitfields, 1},
Guido van Rossume270b431992-09-03 20:21:07 +0000714 {"strip", strop_strip},
Guido van Rossum5c850621992-09-11 23:55:51 +0000715 {"swapcase", strop_swapcase},
Guido van Rossumed7253c1996-07-23 18:12:39 +0000716 {"maketrans", strop_maketrans, 1},
Guido van Rossuma3127e81995-09-13 17:39:06 +0000717 {"translate", strop_translate, 1},
Guido van Rossum5c850621992-09-11 23:55:51 +0000718 {"upper", strop_upper},
Guido van Rossume270b431992-09-03 20:21:07 +0000719 {NULL, NULL} /* sentinel */
720};
721
722
Guido van Rossume270b431992-09-03 20:21:07 +0000723void
724initstrop()
725{
Barry Warsawf5256011996-12-09 18:35:56 +0000726 PyObject *m, *d, *s;
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000727 char buf[256];
728 int c, n;
Barry Warsawf5256011996-12-09 18:35:56 +0000729 m = Py_InitModule("strop", strop_methods);
730 d = PyModule_GetDict(m);
Guido van Rossume22e6441993-07-09 10:51:31 +0000731
732 /* Create 'whitespace' object */
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000733 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000734 for (c = 0; c < 256; c++) {
Guido van Rossumd05eb8b1993-07-08 11:12:36 +0000735 if (isspace(c))
736 buf[n++] = c;
737 }
Barry Warsawf5256011996-12-09 18:35:56 +0000738 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000739 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000740 PyDict_SetItemString(d, "whitespace", s);
741 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000742 }
743 /* Create 'lowercase' object */
744 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000745 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000746 if (islower(c))
747 buf[n++] = c;
748 }
Barry Warsawf5256011996-12-09 18:35:56 +0000749 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000750 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000751 PyDict_SetItemString(d, "lowercase", s);
752 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000753 }
754
755 /* Create 'uppercase' object */
756 n = 0;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000757 for (c = 0; c < 256; c++) {
Guido van Rossume22e6441993-07-09 10:51:31 +0000758 if (isupper(c))
759 buf[n++] = c;
760 }
Barry Warsawf5256011996-12-09 18:35:56 +0000761 s = PyString_FromStringAndSize(buf, n);
Guido van Rossume22e6441993-07-09 10:51:31 +0000762 if (s) {
Barry Warsawf5256011996-12-09 18:35:56 +0000763 PyDict_SetItemString(d, "uppercase", s);
764 Py_DECREF(s);
Guido van Rossume22e6441993-07-09 10:51:31 +0000765 }
766
Barry Warsawf5256011996-12-09 18:35:56 +0000767 if (PyErr_Occurred())
768 Py_FatalError("can't initialize module strop");
Guido van Rossume270b431992-09-03 20:21:07 +0000769}