This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Change function signature of grok_bslash_o
authorKarl Williamson <khw@khw-desktop.(none)>
Sun, 25 Jul 2010 19:13:10 +0000 (13:13 -0600)
committerRafael Garcia-Suarez <rgs@consttype.org>
Tue, 27 Jul 2010 07:42:01 +0000 (09:42 +0200)
The previous return value where NULL meant OK is outside-the-norm.

embed.fnc
embed.h
proto.h
regcomp.c
t/lib/warnings/regcomp
toke.c
util.c

index 19e7697..289538f 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -641,7 +641,7 @@ p   |OP*    |localize       |NN OP *o|I32 lex
 ApdR   |I32    |looks_like_number|NN SV *const sv
 Apd    |UV     |grok_bin       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
 EXMpR  |char   |grok_bslash_c  |const char source|const bool output_warning
-EXMpR  |char*  |grok_bslash_o  |NN const char* s|NN UV* uv|NN STRLEN* len|const bool output_warning
+EXMpR  |bool   |grok_bslash_o  |NN const char* s|NN UV* uv|NN STRLEN* len|NN const char** error_msg|const bool output_warning
 Apd    |UV     |grok_hex       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
 Apd    |int    |grok_number    |NN const char *pv|STRLEN len|NULLOK UV *valuep
 ApdR   |bool   |grok_numeric_radix|NN const char **sp|NN const char *send
diff --git a/embed.h b/embed.h
index 5312d22..6f5e151 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define grok_bin(a,b,c,d)      Perl_grok_bin(aTHX_ a,b,c,d)
 #if defined(PERL_CORE) || defined(PERL_EXT)
 #define grok_bslash_c(a,b)     Perl_grok_bslash_c(aTHX_ a,b)
-#define grok_bslash_o(a,b,c,d) Perl_grok_bslash_o(aTHX_ a,b,c,d)
+#define grok_bslash_o(a,b,c,d,e)       Perl_grok_bslash_o(aTHX_ a,b,c,d,e)
 #endif
 #define grok_hex(a,b,c,d)      Perl_grok_hex(aTHX_ a,b,c,d)
 #define grok_number(a,b,c)     Perl_grok_number(aTHX_ a,b,c)
diff --git a/proto.h b/proto.h
index 274509a..6c5fc52 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -1634,13 +1634,14 @@ PERL_CALLCONV UV        Perl_grok_bin(pTHX_ const char* start, STRLEN* len_p, I32* flag
 PERL_CALLCONV char     Perl_grok_bslash_c(pTHX_ const char source, const bool output_warning)
                        __attribute__warn_unused_result__;
 
-PERL_CALLCONV char*    Perl_grok_bslash_o(pTHX_ const char* s, UV* uv, STRLEN* len, const bool output_warning)
+PERL_CALLCONV bool     Perl_grok_bslash_o(pTHX_ const char* s, UV* uv, STRLEN* len, const char** error_msg, const bool output_warning)
                        __attribute__warn_unused_result__
                        __attribute__nonnull__(pTHX_1)
                        __attribute__nonnull__(pTHX_2)
-                       __attribute__nonnull__(pTHX_3);
+                       __attribute__nonnull__(pTHX_3)
+                       __attribute__nonnull__(pTHX_4);
 #define PERL_ARGS_ASSERT_GROK_BSLASH_O \
-       assert(s); assert(uv); assert(len)
+       assert(s); assert(uv); assert(len); assert(error_msg)
 
 PERL_CALLCONV UV       Perl_grok_hex(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result)
                        __attribute__nonnull__(pTHX_1)
index 1cc2e10..43b881d 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -7360,7 +7360,6 @@ tryagain:
            register UV ender;
            register char *p;
            char *s;
-           char *error_msg;
            STRLEN foldlen;
            U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
 
@@ -7465,19 +7464,23 @@ tryagain:
                        {
                            STRLEN brace_len = len;
                            UV result;
-                           if ((error_msg = grok_bslash_o(p,
-                                                          &result,
-                                                          &brace_len,
-                                                          SIZE_ONLY))
-                               != NULL)
-                           {
+                           const char* error_msg;
+
+                           bool valid = grok_bslash_o(p,
+                                                      &result,
+                                                      &brace_len,
+                                                      &error_msg,
+                                                      1);
+                           p += brace_len;
+                           if (! valid) {
+                               RExC_parse = p; /* going to die anyway; point
+                                                  to exact spot of failure */
                                vFAIL(error_msg);
                            }
                            else
                            {
                                ender = result;
                            }
-                           p += brace_len;
                            if (PL_encoding && ender < 0x100) {
                                goto recode_encoding;
                            }
@@ -7995,7 +7998,6 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, U32 depth)
 
 parseit:
     while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != ']') {
-       char* error_msg;
 
     charclassloop:
 
@@ -8104,15 +8106,18 @@ parseit:
            case 'a':   value = ASCII_TO_NATIVE('\007');break;
            case 'o':
                RExC_parse--;   /* function expects to be pointed at the 'o' */
-               if ((error_msg = grok_bslash_o(RExC_parse,
+               {
+                   const char* error_msg;
+                   bool valid = grok_bslash_o(RExC_parse,
                                               &value,
                                               &numlen,
-                                              SIZE_ONLY))
-                   != NULL)
-               {
-                   vFAIL(error_msg);
+                                              &error_msg,
+                                              SIZE_ONLY);
+                   RExC_parse += numlen;
+                   if (! valid) {
+                       vFAIL(error_msg);
+                   }
                }
-               RExC_parse += numlen;
                if (PL_encoding && value < 0x100) {
                    goto recode_encoding;
                }
index 3f80ccc..6bc6845 100644 (file)
@@ -211,29 +211,29 @@ Useless (?c) - use /gc modifier in regex; marked by <-- HERE in m/(?ogc <-- HERE
 # regcomp.c [S_regatom]
 $a = qr/\o{/;
 EXPECT
-Missing right brace on \o{ in regex; marked by <-- HERE in m/\ <-- HERE o{/ at - line 2.
+Missing right brace on \o{ in regex; marked by <-- HERE in m/\o{ <-- HERE / at - line 2.
 ########
 # regcomp.c [S_regatom]
 $a = qr/\o/;
 EXPECT
-Missing braces on \o{} in regex; marked by <-- HERE in m/\ <-- HERE o/ at - line 2.
+Missing braces on \o{} in regex; marked by <-- HERE in m/\o <-- HERE / at - line 2.
 ########
 # regcomp.c [S_regatom]
 $a = qr/\o{}/;
 EXPECT
-Number with no digits in regex; marked by <-- HERE in m/\ <-- HERE o{}/ at - line 2.
+Number with no digits in regex; marked by <-- HERE in m/\o{} <-- HERE / at - line 2.
 ########
 # regcomp.c [S_regclass]
 $a = qr/[\o{]/;
 EXPECT
-Missing right brace on \o{ in regex; marked by <-- HERE in m/[\ <-- HERE o{]/ at - line 2.
+Missing right brace on \o{ in regex; marked by <-- HERE in m/[\o{ <-- HERE ]/ at - line 2.
 ########
 # regcomp.c [S_regclass]
 $a = qr/[\o]/;
 EXPECT
-Missing braces on \o{} in regex; marked by <-- HERE in m/[\ <-- HERE o]/ at - line 2.
+Missing braces on \o{} in regex; marked by <-- HERE in m/[\o <-- HERE ]/ at - line 2.
 ########
 # regcomp.c [S_regclass]
 $a = qr/[\o{}]/;
 EXPECT
-Number with no digits in regex; marked by <-- HERE in m/[\ <-- HERE o{}]/ at - line 2.
+Number with no digits in regex; marked by <-- HERE in m/[\o{} <-- HERE ]/ at - line 2.
diff --git a/toke.c b/toke.c
index 3ef1d3b..455f977 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2883,10 +2883,11 @@ S_scan_const(pTHX_ char *start)
            case 'o':
                {
                    STRLEN len;
+                   const char* error;
 
-                   char* error = grok_bslash_o(s, &uv, &len, 1);
+                   bool valid = grok_bslash_o(s, &uv, &len, &error, 1);
                    s += len;
-                   if (error) {
+                   if (! valid) {
                        yyerror(error);
                        continue;
                    }
diff --git a/util.c b/util.c
index 5bfe354..9e1e2c8 100644 (file)
--- a/util.c
+++ b/util.c
@@ -3935,18 +3935,28 @@ Perl_grok_bslash_c(pTHX_ const char source, const bool output_warning)
     return result;
 }
 
-char *
-Perl_grok_bslash_o(pTHX_ const char *s, UV *uv, STRLEN *len, const bool output_warning)
+bool
+Perl_grok_bslash_o(pTHX_ const char *s,
+                        UV *uv,
+                        STRLEN *len,
+                        const char** error_msg,
+                        const bool output_warning)
 {
 
 /*  Documentation to be supplied when interface nailed down finally
- *  This returns NULL on success, otherwise a pointer to an internal constant
- *  error message.  On input:
- *     s   points to a string that begins with o, and the previous character was
- *         a backslash.
- *     uv  points to a UV that will hold the output value
- *     len will point to the next character in the string past the end of this
- *         construct
+ *  This returns FALSE if there is an error which the caller need not recover
+ *  from; , otherwise TRUE.  In either case the caller should look at *len
+ *  On input:
+ *     s   points to a string that begins with 'o', and the previous character
+ *         was a backslash.
+ *     uv  points to a UV that will hold the output value, valid only if the
+ *         return from the function is TRUE
+ *     len on success will point to the next character in the string past the
+ *                    end of this construct.
+ *         on failure, it will point to the failure
+ *      error_msg is a pointer that will be set to an internal buffer giving an
+ *         error message upon failure (the return is FALSE).  Untouched if
+ *         function succeeds
  *     output_warning says whether to output any warning messages, or suppress
  *         them
  */
@@ -3966,13 +3976,15 @@ Perl_grok_bslash_o(pTHX_ const char *s, UV *uv, STRLEN *len, const bool output_w
 
     if (*s != '{') {
        *len = 1;       /* Move past the o */
-       return "Missing braces on \\o{}";
+       *error_msg = "Missing braces on \\o{}";
+       return FALSE;
     }
 
     e = strchr(s, '}');
     if (!e) {
        *len = 2;       /* Move past the o{ */
-       return "Missing right brace on \\o{";
+       *error_msg = "Missing right brace on \\o{";
+       return FALSE;
     }
 
     /* Return past the '}' no matter what is inside the braces */
@@ -3982,7 +3994,8 @@ Perl_grok_bslash_o(pTHX_ const char *s, UV *uv, STRLEN *len, const bool output_w
 
     numbers_len = e - s;
     if (numbers_len == 0) {
-       return "Number with no digits";
+       *error_msg = "Number with no digits";
+       return FALSE;
     }
 
     *uv = NATIVE_TO_UNI(grok_oct(s, &numbers_len, &flags, NULL));
@@ -3998,7 +4011,7 @@ Perl_grok_bslash_o(pTHX_ const char *s, UV *uv, STRLEN *len, const bool output_w
                       s);
     }
 
-    return NULL;
+    return TRUE;
 }
 
 /* To workaround core dumps from the uninitialised tm_zone we get the