]> granicus.if.org Git - python/commitdiff
Heh. I need a break. After this: stropmodule & stringobject were more
authorTim Peters <tim.peters@gmail.com>
Thu, 10 May 2001 00:32:57 +0000 (00:32 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 10 May 2001 00:32:57 +0000 (00:32 +0000)
out of synch than I realized, and I managed to break replace's "count"
argument when it was 0.  All is well again.  Maybe.
Bugfix candidate.

Modules/stropmodule.c
Objects/stringobject.c

index 253c4ecdb684aaa73e071d0c46e61a7dd162b10e..c2457949a29e18d6432ea35da14ae3c6272509e6 100644 (file)
@@ -1058,8 +1058,10 @@ mymemreplace(const char *str, int len,           /* input string */
 
        /* find length of output string */
        nfound = mymemcnt(str, len, pat, pat_len);
-       if (count > 0)
-               nfound = nfound > count ? count : nfound;
+       if (count < 0)
+               count = INT_MAX;
+       else if (nfound > count)
+               nfound = count;
        if (nfound == 0)
                goto return_same;
 
@@ -1067,7 +1069,7 @@ mymemreplace(const char *str, int len,            /* input string */
        if (new_len == 0) {
                /* Have to allocate something for the caller to free(). */
                out_s = (char *)PyMem_MALLOC(1);
-               if (out_s = NULL)
+               if (out_s == NULL)
                        return NULL;
                out_s[0] = '\0';
        }
@@ -1078,7 +1080,7 @@ mymemreplace(const char *str, int len,            /* input string */
                        return NULL;
                out_s = new_s;
 
-               while (len > 0) {
+               for (; count > 0 && len > 0; --count) {
                        /* find index of next instance of pattern */
                        offset = mymemfind(str, len, pat, pat_len);
                        if (offset == -1)
@@ -1093,10 +1095,6 @@ mymemreplace(const char *str, int len,           /* input string */
                        new_s += offset;
                        memcpy(new_s, sub, sub_len);
                        new_s += sub_len;
-
-                       /* note count==0 is effectively infinity */
-                       if (--count == 0)
-                               break;
                }
                /* copy any remaining values into output string */
                if (len > 0)
index ec909db49b292d9d0dce164938bc34f233c0d738..7600c0378be0153eb06e1cb61bb2f36cd5d1ba65 100644 (file)
@@ -1557,8 +1557,10 @@ mymemreplace(const char *str, int len,           /* input string */
 
        /* find length of output string */
        nfound = mymemcnt(str, len, pat, pat_len);
-       if (count > 0)
-               nfound = nfound > count ? count : nfound;
+       if (count < 0)
+               count = INT_MAX;
+       else if (nfound > count)
+               nfound = count;
        if (nfound == 0)
                goto return_same;
 
@@ -1566,7 +1568,7 @@ mymemreplace(const char *str, int len,            /* input string */
        if (new_len == 0) {
                /* Have to allocate something for the caller to free(). */
                out_s = (char *)PyMem_MALLOC(1);
-               if (out_s = NULL)
+               if (out_s == NULL)
                        return NULL;
                out_s[0] = '\0';
        }
@@ -1577,7 +1579,7 @@ mymemreplace(const char *str, int len,            /* input string */
                        return NULL;
                out_s = new_s;
 
-               while (len > 0) {
+               for (; count > 0 && len > 0; --count) {
                        /* find index of next instance of pattern */
                        offset = mymemfind(str, len, pat, pat_len);
                        if (offset == -1)
@@ -1592,10 +1594,6 @@ mymemreplace(const char *str, int len,           /* input string */
                        new_s += offset;
                        memcpy(new_s, sub, sub_len);
                        new_s += sub_len;
-
-                       /* note count==0 is effectively infinity */
-                       if (--count == 0)
-                               break;
                }
                /* copy any remaining values into output string */
                if (len > 0)