perl/dquote_inline.h

68 lines
1.8 KiB
C

/* dquote_inline.h
*
* Copyright (C) 2015 by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*/
#ifndef PERL_DQUOTE_INLINE_H_ /* Guard against nested #inclusion */
#define PERL_DQUOTE_INLINE_H_
/*
- regcurly - a little FSA that accepts {\d+,?\d*}
Pulled from reg.c.
*/
PERL_STATIC_INLINE I32
S_regcurly(const char *s)
{
PERL_ARGS_ASSERT_REGCURLY;
if (*s++ != '{')
return FALSE;
if (!isDIGIT(*s))
return FALSE;
while (isDIGIT(*s))
s++;
if (*s == ',') {
s++;
while (isDIGIT(*s))
s++;
}
return *s == '}';
}
/* This is inline not for speed, but because it is so tiny */
PERL_STATIC_INLINE char*
S_form_short_octal_warning(pTHX_
const char * const s, /* Points to first non-octal */
const STRLEN len /* Length of octals string, so
(s-len) points to first
octal */
)
{
/* Return a character string consisting of a warning message for when a
* string constant in octal is weird, like "\078". */
const char * sans_leading_zeros = s - len;
PERL_ARGS_ASSERT_FORM_SHORT_OCTAL_WARNING;
assert(*s == '8' || *s == '9');
/* Remove the leading zeros, retaining one zero so won't be zero length */
while (*sans_leading_zeros == '0') sans_leading_zeros++;
if (sans_leading_zeros == s) {
sans_leading_zeros--;
}
return Perl_form(aTHX_
"'%.*s' resolved to '\\o{%.*s}%c'",
(int) (len + 2), s - len - 1,
(int) (s - sans_leading_zeros), sans_leading_zeros,
*s);
}
#endif /* PERL_DQUOTE_INLINE_H_ */