1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
34 static char strop_module__doc__
[] =
35 "Common string manipulations, optimized for speed.\n\
37 Always use \"import string\" rather than referencing\n\
38 this module directly.";
45 #define INT_MAX 2147483647
49 /* XXX This file assumes that the <ctype.h> is*() functions
50 XXX are defined for all 8-bit characters! */
52 /* The lstrip(), rstrip() and strip() functions are implemented
53 in do_strip(), which uses an additional parameter to indicate what
54 type of strip should occur. */
62 split_whitespace(s
, len
, maxsplit
)
70 PyObject
*list
= PyList_New(0);
76 while (i
< len
&& isspace(Py_CHARMASK(s
[i
]))) {
80 while (i
< len
&& !isspace(Py_CHARMASK(s
[i
]))) {
84 item
= PyString_FromStringAndSize(s
+j
, (int)(i
-j
));
88 err
= PyList_Append(list
, item
);
94 while (i
< len
&& isspace(Py_CHARMASK(s
[i
]))) {
97 if (maxsplit
&& (countsplit
>= maxsplit
) && i
< len
) {
98 item
= PyString_FromStringAndSize(
103 err
= PyList_Append(list
, item
);
119 static char splitfields__doc__
[] =
120 "split(s [,sep [,maxsplit]]) -> list of strings\n\
121 splitfields(s [,sep [,maxsplit]]) -> list of strings\n\
123 Return a list of the words in the string s, using sep as the\n\
124 delimiter string. If maxsplit is nonzero, splits into at most\n\
125 maxsplit words. If sep is not specified, any whitespace string\n\
126 is a separator. Maxsplit defaults to 0.\n\
128 (split and splitfields are synonymous)";
131 strop_splitfields(self
, args
)
132 PyObject
*self
; /* Not used */
135 int len
, n
, i
, j
, err
;
136 int splitcount
, maxsplit
;
138 PyObject
*list
, *item
;
144 if (!PyArg_ParseTuple(args
, "t#|z#i", &s
, &len
, &sub
, &n
, &maxsplit
))
147 return split_whitespace(s
, len
, maxsplit
);
149 PyErr_SetString(PyExc_ValueError
, "empty separator");
153 list
= PyList_New(0);
159 if (s
[i
] == sub
[0] && (n
== 1 || memcmp(s
+i
, sub
, n
) == 0)) {
160 item
= PyString_FromStringAndSize(s
+j
, (int)(i
-j
));
163 err
= PyList_Append(list
, item
);
169 if (maxsplit
&& (splitcount
>= maxsplit
))
175 item
= PyString_FromStringAndSize(s
+j
, (int)(len
-j
));
178 err
= PyList_Append(list
, item
);
191 static char joinfields__doc__
[] =
192 "join(list [,sep]) -> string\n\
193 joinfields(list [,sep]) -> string\n\
195 Return a string composed of the words in list, with\n\
196 intervening occurences of sep. Sep defaults to a single\n\
199 (join and joinfields are synonymous)";
202 strop_joinfields(self
, args
)
203 PyObject
*self
; /* Not used */
208 int seqlen
, seplen
= 0;
209 int i
, reslen
= 0, slen
= 0, sz
= 100;
210 PyObject
*res
= NULL
;
212 intargfunc getitemfunc
;
214 if (!PyArg_ParseTuple(args
, "O|t#", &seq
, &sep
, &seplen
))
221 seqlen
= PySequence_Length(seq
);
222 if (seqlen
< 0 && PyErr_Occurred())
226 /* Optimization if there's only one item */
227 PyObject
*item
= PySequence_GetItem(seq
, 0);
228 if (item
&& !PyString_Check(item
)) {
229 PyErr_SetString(PyExc_TypeError
,
230 "first argument must be sequence of strings");
237 if (!(res
= PyString_FromStringAndSize((char*)NULL
, sz
)))
239 p
= PyString_AsString(res
);
241 /* optimize for lists, since it's the most common case. all others
242 * (tuples and arbitrary sequences) just use the sequence abstract
245 if (PyList_Check(seq
)) {
246 for (i
= 0; i
< seqlen
; i
++) {
247 PyObject
*item
= PyList_GET_ITEM(seq
, i
);
248 if (!PyString_Check(item
)) {
249 PyErr_SetString(PyExc_TypeError
,
250 "first argument must be sequence of strings");
254 slen
= PyString_GET_SIZE(item
);
255 while (reslen
+ slen
+ seplen
>= sz
) {
256 if (_PyString_Resize(&res
, sz
* 2)) {
261 p
= PyString_AsString(res
) + reslen
;
264 memcpy(p
, sep
, seplen
);
268 memcpy(p
, PyString_AS_STRING(item
), slen
);
272 if (_PyString_Resize(&res
, reslen
)) {
279 if (seq
->ob_type
->tp_as_sequence
== NULL
||
280 (getitemfunc
= seq
->ob_type
->tp_as_sequence
->sq_item
) == NULL
)
282 PyErr_SetString(PyExc_TypeError
,
283 "first argument must be a sequence");
286 /* This is now type safe */
287 for (i
= 0; i
< seqlen
; i
++) {
288 PyObject
*item
= getitemfunc(seq
, i
);
289 if (!item
|| !PyString_Check(item
)) {
290 PyErr_SetString(PyExc_TypeError
,
291 "first argument must be sequence of strings");
296 slen
= PyString_GET_SIZE(item
);
297 while (reslen
+ slen
+ seplen
>= sz
) {
298 if (_PyString_Resize(&res
, sz
* 2)) {
304 p
= PyString_AsString(res
) + reslen
;
307 memcpy(p
, sep
, seplen
);
311 memcpy(p
, PyString_AS_STRING(item
), slen
);
316 if (_PyString_Resize(&res
, reslen
)) {
324 static char find__doc__
[] =
325 "find(s, sub [,start [,end]]) -> in\n\
327 Return the lowest index in s where substring sub is found,\n\
328 such that sub is contained within s[start,end]. Optional\n\
329 arguments start and end are interpreted as in slice notation.\n\
331 Return -1 on failure.";
334 strop_find(self
, args
)
335 PyObject
*self
; /* Not used */
339 int len
, n
, i
= 0, last
= INT_MAX
;
341 if (!PyArg_ParseTuple(args
, "t#t#|ii", &s
, &len
, &sub
, &n
, &i
, &last
))
355 if (n
== 0 && i
<= last
)
356 return PyInt_FromLong((long)i
);
359 for (; i
<= last
; ++i
)
360 if (s
[i
] == sub
[0] &&
361 (n
== 1 || memcmp(&s
[i
+1], &sub
[1], n
-1) == 0))
362 return PyInt_FromLong((long)i
);
364 return PyInt_FromLong(-1L);
368 static char rfind__doc__
[] =
369 "rfind(s, sub [,start [,end]]) -> int\n\
371 Return the highest index in s where substring sub is found,\n\
372 such that sub is contained within s[start,end]. Optional\n\
373 arguments start and end are interpreted as in slice notation.\n\
375 Return -1 on failure.";
378 strop_rfind(self
, args
)
379 PyObject
*self
; /* Not used */
384 int i
= 0, last
= INT_MAX
;
386 if (!PyArg_ParseTuple(args
, "t#t#|ii", &s
, &len
, &sub
, &n
, &i
, &last
))
400 if (n
== 0 && i
<= last
)
401 return PyInt_FromLong((long)last
);
403 for (j
= last
-n
; j
>= i
; --j
)
404 if (s
[j
] == sub
[0] &&
405 (n
== 1 || memcmp(&s
[j
+1], &sub
[1], n
-1) == 0))
406 return PyInt_FromLong((long)j
);
408 return PyInt_FromLong(-1L);
413 do_strip(args
, striptype
)
421 if (!PyArg_Parse(args
, "t#", &s
, &len
))
425 if (striptype
!= RIGHTSTRIP
) {
426 while (i
< len
&& isspace(Py_CHARMASK(s
[i
]))) {
432 if (striptype
!= LEFTSTRIP
) {
435 } while (j
>= i
&& isspace(Py_CHARMASK(s
[j
])));
439 if (i
== 0 && j
== len
) {
444 return PyString_FromStringAndSize(s
+i
, j
-i
);
448 static char strip__doc__
[] =
449 "strip(s) -> string\n\
451 Return a copy of the string s with leading and trailing\n\
452 whitespace removed.";
455 strop_strip(self
, args
)
456 PyObject
*self
; /* Not used */
459 return do_strip(args
, BOTHSTRIP
);
463 static char lstrip__doc__
[] =
464 "lstrip(s) -> string\n\
466 Return a copy of the string s with leading whitespace removed.";
469 strop_lstrip(self
, args
)
470 PyObject
*self
; /* Not used */
473 return do_strip(args
, LEFTSTRIP
);
477 static char rstrip__doc__
[] =
478 "rstrip(s) -> string\n\
480 Return a copy of the string s with trailing whitespace removed.";
483 strop_rstrip(self
, args
)
484 PyObject
*self
; /* Not used */
487 return do_strip(args
, RIGHTSTRIP
);
491 static char lower__doc__
[] =
492 "lower(s) -> string\n\
494 Return a copy of the string s converted to lowercase.";
497 strop_lower(self
, args
)
498 PyObject
*self
; /* Not used */
506 if (!PyArg_Parse(args
, "t#", &s
, &n
))
508 new = PyString_FromStringAndSize(NULL
, n
);
511 s_new
= PyString_AsString(new);
513 for (i
= 0; i
< n
; i
++) {
514 int c
= Py_CHARMASK(*s
++);
531 static char upper__doc__
[] =
532 "upper(s) -> string\n\
534 Return a copy of the string s converted to uppercase.";
537 strop_upper(self
, args
)
538 PyObject
*self
; /* Not used */
546 if (!PyArg_Parse(args
, "t#", &s
, &n
))
548 new = PyString_FromStringAndSize(NULL
, n
);
551 s_new
= PyString_AsString(new);
553 for (i
= 0; i
< n
; i
++) {
554 int c
= Py_CHARMASK(*s
++);
571 static char capitalize__doc__
[] =
572 "capitalize(s) -> string\n\
574 Return a copy of the string s with only its first character\n\
578 strop_capitalize(self
, args
)
579 PyObject
*self
; /* Not used */
587 if (!PyArg_Parse(args
, "t#", &s
, &n
))
589 new = PyString_FromStringAndSize(NULL
, n
);
592 s_new
= PyString_AsString(new);
595 int c
= Py_CHARMASK(*s
++);
603 for (i
= 1; i
< n
; i
++) {
604 int c
= Py_CHARMASK(*s
++);
621 static char expandtabs__doc__
[] =
622 "expandtabs(string, [tabsize]) -> string\n\
624 Expand tabs in a string, i.e. replace them by one or more spaces,\n\
625 depending on the current column and the given tab size (default 8).\n\
626 The column number is reset to zero after each newline occurring in the\n\
627 string. This doesn't understand other non-printing characters.";
630 strop_expandtabs(self
, args
)
634 /* Original by Fredrik Lundh */
645 if (!PyArg_ParseTuple(args
, "s#|i", &string
, &stringlen
, &tabsize
))
648 PyErr_SetString(PyExc_ValueError
,
649 "tabsize must be at least 1");
653 /* First pass: determine size of output string */
654 i
= j
= 0; /* j: current column; i: total of previous lines */
655 e
= string
+ stringlen
;
656 for (p
= string
; p
< e
; p
++) {
658 j
+= tabsize
- (j
%tabsize
);
668 /* Second pass: create output string and fill it */
669 out
= PyString_FromStringAndSize(NULL
, i
+j
);
674 q
= PyString_AS_STRING(out
);
676 for (p
= string
; p
< e
; p
++) {
678 j
= tabsize
- (i
%tabsize
);
694 static char count__doc__
[] =
695 "count(s, sub[, start[, end]]) -> int\n\
697 Return the number of occurrences of substring sub in string\n\
698 s[start:end]. Optional arguments start and end are\n\
699 interpreted as in slice notation.";
702 strop_count(self
, args
)
703 PyObject
*self
; /* Not used */
708 int i
= 0, last
= INT_MAX
;
711 if (!PyArg_ParseTuple(args
, "t#t#|ii", &s
, &len
, &sub
, &n
, &i
, &last
))
725 return PyInt_FromLong((long) (m
-i
));
729 if (!memcmp(s
+i
, sub
, n
)) {
736 return PyInt_FromLong((long) r
);
740 static char swapcase__doc__
[] =
741 "swapcase(s) -> string\n\
743 Return a copy of the string s with upper case characters\n\
744 converted to lowercase and vice versa.";
747 strop_swapcase(self
, args
)
748 PyObject
*self
; /* Not used */
756 if (!PyArg_Parse(args
, "t#", &s
, &n
))
758 new = PyString_FromStringAndSize(NULL
, n
);
761 s_new
= PyString_AsString(new);
763 for (i
= 0; i
< n
; i
++) {
764 int c
= Py_CHARMASK(*s
++);
769 else if (isupper(c
)) {
786 static char atoi__doc__
[] =
787 "atoi(s [,base]) -> int\n\
789 Return the integer represented by the string s in the given\n\
790 base, which defaults to 10. The string s must consist of one\n\
791 or more digits, possibly preceded by a sign. If base is 0, it\n\
792 is chosen from the leading characters of s, 0 for octal, 0x or\n\
793 0X for hexadecimal. If base is 16, a preceding 0x or 0X is\n\
797 strop_atoi(self
, args
)
798 PyObject
*self
; /* Not used */
804 char buffer
[256]; /* For errors */
806 if (!PyArg_ParseTuple(args
, "s|i", &s
, &base
))
809 if ((base
!= 0 && base
< 2) || base
> 36) {
810 PyErr_SetString(PyExc_ValueError
, "invalid base for atoi()");
814 while (*s
&& isspace(Py_CHARMASK(*s
)))
817 if (base
== 0 && s
[0] == '0')
818 x
= (long) PyOS_strtoul(s
, &end
, base
);
820 x
= PyOS_strtol(s
, &end
, base
);
821 if (end
== s
|| !isalnum(end
[-1]))
823 while (*end
&& isspace(Py_CHARMASK(*end
)))
827 sprintf(buffer
, "invalid literal for atoi(): %.200s", s
);
828 PyErr_SetString(PyExc_ValueError
, buffer
);
831 else if (errno
!= 0) {
832 sprintf(buffer
, "atoi() literal too large: %.200s", s
);
833 PyErr_SetString(PyExc_ValueError
, buffer
);
836 return PyInt_FromLong(x
);
840 static char atol__doc__
[] =
841 "atol(s [,base]) -> long\n\
843 Return the long integer represented by the string s in the\n\
844 given base, which defaults to 10. The string s must consist\n\
845 of one or more digits, possibly preceded by a sign. If base\n\
846 is 0, it is chosen from the leading characters of s, 0 for\n\
847 octal, 0x or 0X for hexadecimal. If base is 16, a preceding\n\
848 0x or 0X is accepted. A trailing L or l is not accepted,\n\
852 strop_atol(self
, args
)
853 PyObject
*self
; /* Not used */
859 char buffer
[256]; /* For errors */
861 if (!PyArg_ParseTuple(args
, "s|i", &s
, &base
))
864 if ((base
!= 0 && base
< 2) || base
> 36) {
865 PyErr_SetString(PyExc_ValueError
, "invalid base for atol()");
869 while (*s
&& isspace(Py_CHARMASK(*s
)))
872 PyErr_SetString(PyExc_ValueError
, "empty string for atol()");
875 x
= PyLong_FromString(s
, &end
, base
);
878 if (base
== 0 && (*end
== 'l' || *end
== 'L'))
880 while (*end
&& isspace(Py_CHARMASK(*end
)))
883 sprintf(buffer
, "invalid literal for atol(): %.200s", s
);
884 PyErr_SetString(PyExc_ValueError
, buffer
);
892 static char atof__doc__
[] =
895 Return the floating point number represented by the string s.";
898 strop_atof(self
, args
)
899 PyObject
*self
; /* Not used */
902 extern double strtod
Py_PROTO((const char *, char **));
905 char buffer
[256]; /* For errors */
907 if (!PyArg_ParseTuple(args
, "s", &s
))
909 while (*s
&& isspace(Py_CHARMASK(*s
)))
912 PyErr_SetString(PyExc_ValueError
, "empty string for atof()");
916 PyFPE_START_PROTECT("strop_atof", return 0)
919 while (*end
&& isspace(Py_CHARMASK(*end
)))
922 sprintf(buffer
, "invalid literal for atof(): %.200s", s
);
923 PyErr_SetString(PyExc_ValueError
, buffer
);
926 else if (errno
!= 0) {
927 sprintf(buffer
, "atof() literal too large: %.200s", s
);
928 PyErr_SetString(PyExc_ValueError
, buffer
);
931 return PyFloat_FromDouble(x
);
935 static char maketrans__doc__
[] =
936 "maketrans(frm, to) -> string\n\
938 Return a translation table (a string of 256 bytes long)\n\
939 suitable for use in string.translate. The strings frm and to\n\
940 must be of the same length.";
943 strop_maketrans(self
, args
)
944 PyObject
*self
; /* Not used */
947 unsigned char *c
, *from
=NULL
, *to
=NULL
;
948 int i
, fromlen
=0, tolen
=0;
951 if (!PyArg_ParseTuple(args
, "t#t#", &from
, &fromlen
, &to
, &tolen
))
954 if (fromlen
!= tolen
) {
955 PyErr_SetString(PyExc_ValueError
,
956 "maketrans arguments must have same length");
960 result
= PyString_FromStringAndSize((char *)NULL
, 256);
963 c
= (unsigned char *) PyString_AS_STRING((PyStringObject
*)result
);
964 for (i
= 0; i
< 256; i
++)
965 c
[i
]=(unsigned char)i
;
966 for (i
= 0; i
< fromlen
; i
++)
973 static char translate__doc__
[] =
974 "translate(s,table [,deletechars]) -> string\n\
976 Return a copy of the string s, where all characters occurring\n\
977 in the optional argument deletechars are removed, and the\n\
978 remaining characters have been mapped through the given\n\
979 translation table, which must be a string of length 256.";
982 strop_translate(self
, args
)
986 register char *input
, *table
, *output
;
987 register int i
, c
, changed
= 0;
989 char *table1
, *output_start
, *del_table
=NULL
;
990 int inlen
, tablen
, dellen
= 0;
992 int trans_table
[256];
994 if (!PyArg_ParseTuple(args
, "St#|t#", &input_obj
,
995 &table1
, &tablen
, &del_table
, &dellen
))
998 PyErr_SetString(PyExc_ValueError
,
999 "translation table must be 256 characters long");
1004 inlen
= PyString_Size(input_obj
);
1005 result
= PyString_FromStringAndSize((char *)NULL
, inlen
);
1008 output_start
= output
= PyString_AsString(result
);
1009 input
= PyString_AsString(input_obj
);
1012 /* If no deletions are required, use faster code */
1013 for (i
= inlen
; --i
>= 0; ) {
1014 c
= Py_CHARMASK(*input
++);
1015 if (Py_CHARMASK((*output
++ = table
[c
])) != c
)
1021 Py_INCREF(input_obj
);
1025 for (i
= 0; i
< 256; i
++)
1026 trans_table
[i
] = Py_CHARMASK(table
[i
]);
1028 for (i
= 0; i
< dellen
; i
++)
1029 trans_table
[(int) Py_CHARMASK(del_table
[i
])] = -1;
1031 for (i
= inlen
; --i
>= 0; ) {
1032 c
= Py_CHARMASK(*input
++);
1033 if (trans_table
[c
] != -1)
1034 if (Py_CHARMASK(*output
++ = (char)trans_table
[c
]) == c
)
1040 Py_INCREF(input_obj
);
1043 /* Fix the size of the resulting string */
1044 if (inlen
> 0 &&_PyString_Resize(&result
, output
-output_start
))
1050 /* What follows is used for implementing replace(). Perry Stoll. */
1055 strstr replacement for arbitrary blocks of memory.
1057 Locates the first occurance in the memory pointed to by MEM of the
1058 contents of memory pointed to by PAT. Returns the index into MEM if
1059 found, or -1 if not found. If len of PAT is greater than length of
1060 MEM, the function returns -1.
1062 static int mymemfind(mem
, len
, pat
, pat_len
)
1070 /* pattern can not occur in the last pat_len-1 chars */
1073 for (ii
= 0; ii
<= len
; ii
++) {
1074 if (mem
[ii
] == pat
[0] &&
1076 memcmp(&mem
[ii
+1], &pat
[1], pat_len
-1) == 0)) {
1086 Return the number of distinct times PAT is found in MEM.
1087 meaning mem=1111 and pat==11 returns 2.
1088 mem=11111 and pat==11 also return 2.
1090 static int mymemcnt(mem
, len
, pat
, pat_len
)
1096 register int offset
= 0;
1100 offset
= mymemfind(mem
, len
, pat
, pat_len
);
1103 mem
+= offset
+ pat_len
;
1104 len
-= offset
+ pat_len
;
1113 Return a string in which all occurences of PAT in memory STR are
1116 If length of PAT is less than length of STR or there are no occurences
1117 of PAT in STR, then the original string is returned. Otherwise, a new
1118 string is allocated here and returned.
1120 on return, out_len is:
1121 the length of output string, or
1122 -1 if the input string is returned, or
1123 unchanged if an error occurs (no memory).
1126 the new string allocated locally, or
1127 NULL if an error occurred.
1129 static char *mymemreplace(str
, len
, pat
, pat_len
, sub
, sub_len
, count
, out_len
)
1131 int len
; /* input string */
1133 int pat_len
; /* pattern string to find */
1135 int sub_len
; /* substitution string */
1136 int count
; /* number of replacements, 0 == all */
1142 int nfound
, offset
, new_len
;
1144 if (len
== 0 || pat_len
> len
)
1147 /* find length of output string */
1148 nfound
= mymemcnt(str
, len
, pat
, pat_len
);
1150 nfound
= nfound
> count
? count
: nfound
;
1153 new_len
= len
+ nfound
*(sub_len
- pat_len
);
1155 new_s
= (char *)malloc(new_len
);
1156 if (new_s
== NULL
) return NULL
;
1162 /* find index of next instance of pattern */
1163 offset
= mymemfind(str
, len
, pat
, pat_len
);
1164 /* if not found, break out of loop */
1165 if (offset
== -1) break;
1167 /* copy non matching part of input string */
1168 memcpy(new_s
, str
, offset
); /* copy part of str before pat */
1169 str
+= offset
+ pat_len
; /* move str past pattern */
1170 len
-= offset
+ pat_len
; /* reduce length of str remaining */
1172 /* copy substitute into the output string */
1173 new_s
+= offset
; /* move new_s to dest for sub string */
1174 memcpy(new_s
, sub
, sub_len
); /* copy substring into new_s */
1175 new_s
+= sub_len
; /* offset new_s past sub string */
1177 /* break when we've done count replacements */
1178 if (--count
== 0) break;
1180 /* copy any remaining values into output string */
1182 memcpy(new_s
, str
, len
);
1191 static char replace__doc__
[] =
1192 "replace (str, old, new[, maxsplit]) -> string\n\
1194 Return a copy of string str with all occurrences of substring\n\
1195 old replaced by new. If the optional argument maxsplit is\n\
1196 given, only the first maxsplit occurrences are replaced.";
1199 strop_replace(self
, args
)
1200 PyObject
*self
; /* Not used */
1203 char *str
, *pat
,*sub
,*new_s
;
1204 int len
,pat_len
,sub_len
,out_len
;
1208 if (!PyArg_ParseTuple(args
, "t#t#t#|i",
1209 &str
, &len
, &pat
, &pat_len
, &sub
, &sub_len
,
1213 PyErr_SetString(PyExc_ValueError
, "empty pattern string");
1216 new_s
= mymemreplace(str
,len
,pat
,pat_len
,sub
,sub_len
,count
,&out_len
);
1217 if (new_s
== NULL
) {
1221 if (out_len
== -1) {
1222 /* we're returning another reference to the input string */
1223 new = PyTuple_GetItem(args
, 0);
1227 new = PyString_FromStringAndSize(new_s
, out_len
);
1234 /* List of functions defined in the module */
1238 {"atof", strop_atof
, 1, atof__doc__
},
1239 {"atoi", strop_atoi
, 1, atoi__doc__
},
1240 {"atol", strop_atol
, 1, atol__doc__
},
1241 {"capitalize", strop_capitalize
, 0, capitalize__doc__
},
1242 {"count", strop_count
, 1, count__doc__
},
1243 {"expandtabs", strop_expandtabs
, 1, expandtabs__doc__
},
1244 {"find", strop_find
, 1, find__doc__
},
1245 {"join", strop_joinfields
, 1, joinfields__doc__
},
1246 {"joinfields", strop_joinfields
, 1, joinfields__doc__
},
1247 {"lstrip", strop_lstrip
, 0, lstrip__doc__
},
1248 {"lower", strop_lower
, 0, lower__doc__
},
1249 {"maketrans", strop_maketrans
, 1, maketrans__doc__
},
1250 {"replace", strop_replace
, 1, replace__doc__
},
1251 {"rfind", strop_rfind
, 1, rfind__doc__
},
1252 {"rstrip", strop_rstrip
, 0, rstrip__doc__
},
1253 {"split", strop_splitfields
, 1, splitfields__doc__
},
1254 {"splitfields", strop_splitfields
, 1, splitfields__doc__
},
1255 {"strip", strop_strip
, 0, strip__doc__
},
1256 {"swapcase", strop_swapcase
, 0, swapcase__doc__
},
1257 {"translate", strop_translate
, 1, translate__doc__
},
1258 {"upper", strop_upper
, 0, upper__doc__
},
1259 {NULL
, NULL
} /* sentinel */
1266 PyObject
*m
, *d
, *s
;
1269 m
= Py_InitModule4("strop", strop_methods
, strop_module__doc__
,
1270 (PyObject
*)NULL
, PYTHON_API_VERSION
);
1271 d
= PyModule_GetDict(m
);
1273 /* Create 'whitespace' object */
1275 for (c
= 0; c
< 256; c
++) {
1279 s
= PyString_FromStringAndSize(buf
, n
);
1281 PyDict_SetItemString(d
, "whitespace", s
);
1284 /* Create 'lowercase' object */
1286 for (c
= 0; c
< 256; c
++) {
1290 s
= PyString_FromStringAndSize(buf
, n
);
1292 PyDict_SetItemString(d
, "lowercase", s
);
1296 /* Create 'uppercase' object */
1298 for (c
= 0; c
< 256; c
++) {
1302 s
= PyString_FromStringAndSize(buf
, n
);
1304 PyDict_SetItemString(d
, "uppercase", s
);
1308 if (PyErr_Occurred())
1309 Py_FatalError("can't initialize module strop");