]> granicus.if.org Git - python/commitdiff
small updates to string_join:
authorJeremy Hylton <jeremy@alum.mit.edu>
Tue, 11 Jul 2000 20:55:38 +0000 (20:55 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Tue, 11 Jul 2000 20:55:38 +0000 (20:55 +0000)
    use PyString_AS_STRING macro on local string object
    when resizing string, make sure resized string will always be big enough
    split string containing error message across two lines
add test to string_tests that causes resizing

Lib/test/string_tests.py
Objects/stringobject.c

index e9168ef8077bb87c6522d3491314cd93f2bda6ab..d4041bec4af55c3a6a046b1240b07d9f1b5c86b8 100644 (file)
@@ -123,6 +123,9 @@ def run_method_tests(test):
     test('join', '.', u'a.b.c', ['a', u'b', 'c'])
     test('join', '.', u'a.b.c', ['a', 'b', u'c'])
     test('join', '.', TypeError, ['a', u'b', 3])
+    for i in [5, 25, 125]:
+        test('join', '-', ((('a' * i) + '-') * i)[:-1],
+             ['a' * i] * i)
 
     test('join', ' ', TypeError, BadSeq1())
     test('join', ' ', 'a b c', BadSeq2())
index dc41122c8a81dcfa9d4c8af381e5467cc9d49c1b..246e08061bf1ff7277e5db536420e848bf7fd2d4 100644 (file)
@@ -743,7 +743,7 @@ string_join(PyStringObject *self, PyObject *args)
        char *p;
        int seqlen = 0;
        int sz = 100;
-       int i, slen;
+       int i, slen, sz_incr;
        PyObject *orig, *seq, *item;
 
        if (!PyArg_ParseTuple(args, "O:join", &orig))
@@ -770,7 +770,7 @@ string_join(PyStringObject *self, PyObject *args)
        if (!(res = PyString_FromStringAndSize((char*)NULL, sz)))
                goto finally;
 
-       p = PyString_AsString(res);
+       p = PyString_AS_STRING(res);
 
        for (i = 0; i < seqlen; i++) {
                item = PySequence_Fast_GET_ITEM(seq, i);
@@ -781,17 +781,20 @@ string_join(PyStringObject *self, PyObject *args)
                                return PyUnicode_Join((PyObject *)self, seq);
                        }
                        PyErr_Format(PyExc_TypeError,
-                            "sequence item %i: expected string, %.80s found",
+                                    "sequence item %i: expected string,"
+                                    " %.80s found",
                                     i, item->ob_type->tp_name);
                        goto finally;
                }
                slen = PyString_GET_SIZE(item);
                while (reslen + slen + seplen >= sz) {
-                       if (_PyString_Resize(&res, sz*2)) {
+                       /* at least double the size of the string */
+                       sz_incr = slen + seplen > sz ? slen + seplen : sz;
+                       if (_PyString_Resize(&res, sz + sz_incr)) {
                                goto finally;
                        }
-                       sz *= 2;
-                       p = PyString_AsString(res) + reslen;
+                       sz += sz_incr;
+                       p = PyString_AS_STRING(res) + reslen;
                }
                if (i > 0) {
                        memcpy(p, sep, seplen);