summaryrefslogtreecommitdiffstats
path: root/Modules/stropmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-11-26 08:54:07 (GMT)
committerGuido van Rossum <guido@python.org>1992-11-26 08:54:07 (GMT)
commitc89705d6975ffb1e4a3764f4f36bab339f969e8f (patch)
treeb4e565a58d410ad3a60ffbe11f94c2567b14365d /Modules/stropmodule.c
parentdf9320f8bcad10431fa103459fcebd4b5430599a (diff)
downloadcpython-c89705d6975ffb1e4a3764f4f36bab339f969e8f.zip
cpython-c89705d6975ffb1e4a3764f4f36bab339f969e8f.tar.gz
cpython-c89705d6975ffb1e4a3764f4f36bab339f969e8f.tar.bz2
* config.c: Added audioop to lists.
* Makefile: change default source directory * socketmodule.c: added getsockname and getpeername * bltinmodule.c: corrected typo in type() error message * Added new built-in functions str() and repr(): repr(x) == `x`; str(x) == x if x is a string, otherwise str(x) == repr(x). * Added joinfields to stropmodule.c (string.join calls joinfields now)
Diffstat (limited to 'Modules/stropmodule.c')
-rw-r--r--Modules/stropmodule.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c
index 835c7db..f00cfc7 100644
--- a/Modules/stropmodule.c
+++ b/Modules/stropmodule.c
@@ -113,6 +113,70 @@ strop_splitfields(self, args)
static object *
+strop_joinfields(self, args)
+ object *self; /* Not used */
+ object *args;
+{
+ object *seq, *item, *res;
+ object * (*getitem) FPROTO((object *, int));
+ char *sep, *p;
+ int seplen, seqlen, reslen, itemlen, i;
+
+ if (!getargs(args, "(Os#)", &seq, &sep, &seplen))
+ return NULL;
+ if (is_listobject(seq)) {
+ getitem = getlistitem;
+ seqlen = getlistsize(seq);
+ }
+ else if (is_tupleobject(seq)) {
+ getitem = gettupleitem;
+ seqlen = gettuplesize(seq);
+ }
+ else {
+ err_setstr(TypeError, "first argument must be list/tuple");
+ return NULL;
+ }
+ reslen = 0;
+ for (i = 0; i < seqlen; i++) {
+ item = getitem(seq, i);
+ if (!is_stringobject(item)) {
+ err_setstr(TypeError,
+ "first argument must be list/tuple of strings");
+ return NULL;
+ }
+ if (i > 0)
+ reslen = reslen + seplen;
+ reslen = reslen + getstringsize(item);
+ }
+ if (seqlen == 1) {
+ /* Optimization if there's only one item */
+ item = getitem(seq, 0);
+ INCREF(item);
+ return item;
+ }
+ res = newsizedstringobject((char *)NULL, reslen);
+ if (res == NULL)
+ return NULL;
+ p = getstringvalue(res);
+ for (i = 0; i < seqlen; i++) {
+ item = getitem(seq, i);
+ if (i > 0) {
+ memcpy(p, sep, seplen);
+ p += seplen;
+ }
+ itemlen = getstringsize(item);
+ memcpy(p, getstringvalue(item), itemlen);
+ p += itemlen;
+ }
+ if (p != getstringvalue(res) + reslen) {
+ err_setstr(SystemError, "strop.joinfields: assertion failed");
+ return NULL;
+ }
+ return res;
+}
+
+
+static object *
strop_index(self, args)
object *self; /* Not used */
object *args;
@@ -290,6 +354,7 @@ strop_swapcase(self, args)
static struct methodlist strop_methods[] = {
{"index", strop_index},
+ {"joinfields", strop_joinfields},
{"lower", strop_lower},
{"split", strop_split},
{"splitfields", strop_splitfields},