Rename S_infnan_copy as S_infnan_2pv.
authorJarkko Hietaniemi <jhi@iki.fi>
Tue, 9 Sep 2014 13:51:44 +0000 (09:51 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Tue, 9 Sep 2014 13:51:44 +0000 (09:51 -0400)
sv.c

diff --git a/sv.c b/sv.c
index 8aa3985..748d3e6 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -2774,16 +2774,17 @@ S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const pe
 /* Helper for sv_2pv_flags and sv_vcatpvfn_flags.  If the NV is an
  * infinity or a not-a-number, writes the appropriate strings to the
  * buffer, including a zero byte.  On success returns the written length,
- * excluding the zero byte, on failure returns zero. */
+ * excluding the zero byte, on failure (not an infinity, not a nan, or the
+ * maxlen too small) returns zero. */
 STATIC size_t
-S_infnan_copy(NV nv, char* buffer, size_t maxlen) {
-    if (maxlen < 4)
+S_infnan_2pv(NV nv, char* buffer, size_t maxlen) {
+    if (maxlen < 4) /* "Inf\0", "NaN\0" */
         return 0;
     else {
         char* s = buffer;
         if (Perl_isinf(nv)) {
             if (nv < 0) {
-                if (maxlen < 5)
+                if (maxlen < 5) /* "-Inf\0"  */
                     return 0;
                 *s++ = '-';
             }
@@ -2795,12 +2796,17 @@ S_infnan_copy(NV nv, char* buffer, size_t maxlen) {
             *s++ = 'N';
             *s++ = 'a';
             *s++ = 'N';
-            /* XXX output the payload mantissa bits as "(hhh...)" */
+            /* XXX optionally output the payload mantissa bits as
+             * "(unsigned)" (to match the nan("...") C99 function,
+             * or maybe as "(0xhhh...)"  would make more sense...
+             * provide a format string so that the user can decide?
+             * NOTE: would affect the maxlen and assert() logic.*/
         }
         else
             return 0;
+        assert((s == buffer + 3) || (s == buffer + 4));
         *s++ = 0;
-        return s - buffer - 1;
+        return s - buffer - 1; /* -1: excluding the zero byte */
     }
 }
 
@@ -2987,11 +2993,12 @@ Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
            *s++ = '0';
            *s = '\0';
        } else {
-            STRLEN len;
            /* The +20 is pure guesswork.  Configure test needed. --jhi */
-           s = SvGROW_mutable(sv, NV_DIG + 20);
+            STRLEN size = NV_DIG + 20;
+            STRLEN len;
+           s = SvGROW_mutable(sv, size);
 
-            len = S_infnan_copy(SvNVX(sv), s, 5);
+            len = S_infnan_2pv(SvNVX(sv), s, size);
             if (len > 0)
                 s += len;
             else {
@@ -12076,7 +12083,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
                 }
             }
             else
-                elen = S_infnan_copy(nv, PL_efloatbuf, 5);
+                elen = S_infnan_2pv(nv, PL_efloatbuf, PL_efloatsize);
             if (elen == 0) {
                 char *ptr = ebuf + sizeof ebuf;
                 *--ptr = '\0';