Don't warn on use of CCFLAGS
[p5sagit/p5-mst-13.2.git] / sv.c
diff --git a/sv.c b/sv.c
index 5adbe8a..8f6bbe9 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -1195,9 +1195,11 @@ SV *sv;
     char tmpbuf[64];
     char *d = tmpbuf;
     char *s;
-    int i;
+    char *limit = tmpbuf + sizeof(tmpbuf) - 8;
+                  /* each *s can expand to 4 chars + "...\0",
+                     i.e. need room for 8 chars */
 
-    for (s = SvPVX(sv), i = 50; *s && i; s++,i--) {
+    for (s = SvPVX(sv); *s && d < limit; s++) {
        int ch = *s & 0xFF;
        if (ch & 128 && !isPRINT_LC(ch)) {
            *d++ = 'M';
@@ -1502,7 +1504,7 @@ SV *sv;
     register char *s;
     register char *send;
     register char *sbegin;
-    I32 numtype = 1;
+    I32 numtype;
     STRLEN len;
 
     if (SvPOK(sv)) {
@@ -1518,31 +1520,53 @@ SV *sv;
     s = sbegin;
     while (isSPACE(*s))
        s++;
-    if (s >= send)
-       return 0;
     if (*s == '+' || *s == '-')
        s++;
-    while (isDIGIT(*s))
-       s++;
-    if (s == send)
-       return numtype;
-    if (*s == '.') {
-       numtype = 1;
-       s++;
+
+    /* next must be digit or '.' */
+    if (isDIGIT(*s)) {
+        do {
+           s++;
+        } while (isDIGIT(*s));
+        if (*s == '.') {
+           s++;
+            while (isDIGIT(*s))  /* optional digits after "." */
+                s++;
+        }
     }
-    else if (s == SvPVX(sv))
-       return 0;
-    while (isDIGIT(*s))
-       s++;
-    if (s == send)
-       return numtype;
+    else if (*s == '.') {
+        s++;
+        /* no digits before '.' means we need digits after it */
+        if (isDIGIT(*s)) {
+           do {
+               s++;
+            } while (isDIGIT(*s));
+        }
+        else
+           return 0;
+    }
+    else
+        return 0;
+
+    /*
+     * we return 1 if the number can be converted to _integer_ with atol()
+     * and 2 if you need (int)atof().
+     */
+    numtype = 1;
+
+    /* we can have an optional exponent part */
     if (*s == 'e' || *s == 'E') {
        numtype = 2;
        s++;
        if (*s == '+' || *s == '-')
            s++;
-       while (isDIGIT(*s))
-           s++;
+        if (isDIGIT(*s)) {
+            do {
+                s++;
+            } while (isDIGIT(*s));
+        }
+        else
+            return 0;
     }
     while (isSPACE(*s))
        s++;
@@ -2600,6 +2624,9 @@ register SV *sv;
                sv_upgrade(&ref, SVt_RV);
                SvRV(&ref) = SvREFCNT_inc(sv);
                SvROK_on(&ref);
+               SvREFCNT(&ref) = 1;     /* Fake, but otherwise
+                                          creating+destructing a ref
+                                          leads to disaster. */
 
                EXTEND(SP, 2);
                PUSHMARK(SP);
@@ -2927,6 +2954,11 @@ sv_collxfrm(sv, nxp)
            Safefree(mg->mg_ptr);
        s = SvPV(sv, len);
        if ((xf = mem_collxfrm(s, len, &xlen))) {
+           if (SvREADONLY(sv)) {
+               SAVEFREEPV(xf);
+               *nxp = xlen;
+               return xf;
+           }
            if (! mg) {
                sv_magic(sv, 0, 'o', 0, 0);
                mg = mg_find(sv, 'o');
@@ -2936,8 +2968,10 @@ sv_collxfrm(sv, nxp)
            mg->mg_len = xlen;
        }
        else {
-           mg->mg_ptr = NULL;
-           mg->mg_len = -1;
+           if (mg) {
+               mg->mg_ptr = NULL;
+               mg->mg_len = -1;
+           }
        }
     }
     if (mg && mg->mg_ptr) {