*** Objects/listobject.c Sat Aug 10 05:51:27 1996 --- Objects/listobject.c Thu Sep 19 16:35:36 1996 *************** *** 543,548 **** --- 543,593 ---- return ins(self, (int) self->ob_size, v); } + static object * + listconcat(self, args) + listobject *self; + object *args; + { + int i, size; + object* v; + object* bb; + object** items; + + if (!getargs(args, "O", &bb)) + return NULL; + if (!is_listobject(bb)) { + err_badarg(); + return NULL; + } + + #define b ((listobject *)bb) + items = self->ob_item; + size = self->ob_size; + + NRESIZE(items, object *, size + b->ob_size); + if (items == NULL) { + err_nomem(); + return NULL; + } + + /* b might be equal to self, so make items available as ob_item */ + /* and don't change ob_size until we're done concatenating. */ + + self->ob_item = items; + + for (i = 0; i < b->ob_size; i++) { + v = b->ob_item[i]; + items[size ++] = v; + INCREF(v); + } + + self->ob_size = size; + #undef b + + INCREF(None); + return None; + } + static object *comparefunc; static int *************** *** 762,767 **** --- 807,813 ---- {"sort", (method)listsort, 0}, {"remove", (method)listremove}, {"reverse", (method)listreverse}, + {"concat", (method)listconcat}, {NULL, NULL} /* sentinel */ };