diff options
author | Karl Williamson <public@khwilliamson.com> | 2011-02-08 20:39:48 -0700 |
---|---|---|
committer | Karl Williamson <public@khwilliamson.com> | 2011-02-09 22:46:02 -0700 |
commit | db30362b9b16c8b3b431a133169e91f19b1e38e7 (patch) | |
tree | c2566b1441e28f2af0661303ebad7774fc4a7bb4 /dquote_static.c | |
parent | f541799a78f3532741db76bd5caf8ce1862372cd (diff) | |
download | perl-db30362b9b16c8b3b431a133169e91f19b1e38e7.tar.gz |
Move grok_blsash_o and make static
This function is only used in the same places as dquote_static.c is
used, so move it there, and we won't have to worry about changing its
API will break something. No other changes made
Diffstat (limited to 'dquote_static.c')
-rw-r--r-- | dquote_static.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/dquote_static.c b/dquote_static.c index 4cc276fd4d..dd58c6bb60 100644 --- a/dquote_static.c +++ b/dquote_static.c @@ -35,6 +35,86 @@ S_regcurly(pTHX_ register const char *s) return FALSE; return TRUE; } + +STATIC bool +S_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 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 + */ + const char* e; + STRLEN numbers_len; + I32 flags = PERL_SCAN_ALLOW_UNDERSCORES + | PERL_SCAN_DISALLOW_PREFIX + /* XXX Until the message is improved in grok_oct, handle errors + * ourselves */ + | PERL_SCAN_SILENT_ILLDIGIT; + + PERL_ARGS_ASSERT_GROK_BSLASH_O; + + + assert(*s == 'o'); + s++; + + if (*s != '{') { + *len = 1; /* Move past the o */ + *error_msg = "Missing braces on \\o{}"; + return FALSE; + } + + e = strchr(s, '}'); + if (!e) { + *len = 2; /* Move past the o{ */ + *error_msg = "Missing right brace on \\o{"; + return FALSE; + } + + /* Return past the '}' no matter what is inside the braces */ + *len = e - s + 2; /* 2 = 1 for the o + 1 for the '}' */ + + s++; /* Point to first digit */ + + numbers_len = e - s; + if (numbers_len == 0) { + *error_msg = "Number with no digits"; + return FALSE; + } + + *uv = NATIVE_TO_UNI(grok_oct(s, &numbers_len, &flags, NULL)); + /* Note that if has non-octal, will ignore everything starting with that up + * to the '}' */ + + if (output_warning && numbers_len != (STRLEN) (e - s)) { + Perl_ck_warner(aTHX_ packWARN(WARN_DIGIT), + /* diag_listed_as: Non-octal character '%c'. Resolved as "%s" */ + "Non-octal character '%c'. Resolved as \"\\o{%.*s}\"", + *(s + numbers_len), + (int) numbers_len, + s); + } + + return TRUE; +} + /* * Local variables: * c-indentation-style: bsd |