X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/5e784d588d349d87bfd40523917f645aec267d2a..3e3bbb9b3cd1149bba698cb5d92fa3150db92d89:/dquote_static.c diff --git a/dquote_static.c b/dquote_static.c index 1f74ca5..885ba06 100644 --- a/dquote_static.c +++ b/dquote_static.c @@ -15,11 +15,7 @@ Pulled from regcomp.c. */ PERL_STATIC_INLINE I32 -S_regcurly(pTHX_ const char *s, - const bool rbrace_must_be_escaped /* Should the terminating '} be - preceded by a backslash? This - is an abnormal case */ - ) +S_regcurly(const char *s) { PERL_ARGS_ASSERT_REGCURLY; @@ -35,9 +31,7 @@ S_regcurly(pTHX_ const char *s, s++; } - return (rbrace_must_be_escaped) - ? *s == '\\' && *(s+1) == '}' - : *s == '}'; + return *s == '}'; } /* XXX Add documentation after final interface and behavior is decided */ @@ -56,10 +50,14 @@ S_grok_bslash_c(pTHX_ const char source, const bool output_warning) "Character following \"\\c\" must be printable ASCII"); } else if (source == '{') { - assert(isPRINT_A(toCTRL('{'))); - - /* diag_listed_as: Use "%s" instead of "%s" */ - Perl_croak(aTHX_ "Use \"%c\" instead of \"\\c{\"", toCTRL('{')); + const char control = toCTRL('{'); + if (isPRINT_A(control)) { + /* diag_listed_as: Use "%s" instead of "%s" */ + Perl_croak(aTHX_ "Use \"%c\" instead of \"\\c{\"", control); + } + else { + Perl_croak(aTHX_ "Sequence \"\\c{\" invalid"); + } } result = toCTRL(source); @@ -90,7 +88,9 @@ S_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg, /* 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 + * from; otherwise TRUE. In either case the caller should look at *len [???]. + * It guarantees that the returned codepoint, *uv, when expressed as + * utf8 bytes, would fit within the skipped "\o{...}" bytes. * On input: * s is the address of a pointer to a NULL terminated string that begins * with 'o', and the previous character was a backslash. At exit, *s @@ -120,6 +120,11 @@ S_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg, * ourselves */ | PERL_SCAN_SILENT_ILLDIGIT; +#ifdef DEBUGGING + char *start = *s - 1; + assert(*start == '\\'); +#endif + PERL_ARGS_ASSERT_GROK_BSLASH_O; @@ -178,6 +183,10 @@ S_grok_bslash_o(pTHX_ char **s, UV *uv, const char** error_msg, /* Return past the '}' */ *s = e + 1; + /* guarantee replacing "\o{...}" with utf8 bytes fits within + * existing space */ + assert(OFFUNISKIP(*uv) < *s - start); + return TRUE; } @@ -190,7 +199,10 @@ S_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, /* 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 + * from; otherwise TRUE. + * It guarantees that the returned codepoint, *uv, when expressed as + * utf8 bytes, would fit within the skipped "\x{...}" bytes. + * * On input: * s is the address of a pointer to a NULL terminated string that begins * with 'x', and the previous character was a backslash. At exit, *s @@ -217,15 +229,17 @@ S_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, char* e; STRLEN numbers_len; I32 flags = PERL_SCAN_DISALLOW_PREFIX; +#ifdef DEBUGGING + char *start = *s - 1; + assert(*start == '\\'); +#endif PERL_ARGS_ASSERT_GROK_BSLASH_X; - PERL_UNUSED_ARG(output_warning); - assert(**s == 'x'); (*s)++; - if (strict) { + if (strict || ! output_warning) { flags |= PERL_SCAN_SILENT_ILLDIGIT; } @@ -244,7 +258,7 @@ S_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, } return FALSE; } - return TRUE; + goto ok; } e = strchr(*s, '}'); @@ -269,7 +283,9 @@ S_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, *error_msg = "Number with no digits"; return FALSE; } - return TRUE; + *s = e + 1; + *uv = 0; + goto ok; } flags |= PERL_SCAN_ALLOW_UNDERSCORES; @@ -291,6 +307,10 @@ S_grok_bslash_x(pTHX_ char **s, UV *uv, const char** error_msg, /* Return past the '}' */ *s = e + 1; + ok: + /* guarantee replacing "\x{...}" with utf8 bytes fits within + * existing space */ + assert(OFFUNISKIP(*uv) < *s - start); return TRUE; } @@ -324,11 +344,5 @@ S_form_short_octal_warning(pTHX_ } /* - * Local variables: - * c-indentation-style: bsd - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - * * ex: set ts=8 sts=4 sw=4 et: */