This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldelta entry for the [perl #87664] fix
[perl5.git] / dquote_static.c
index dd58c6b..e23ec46 100644 (file)
@@ -1,6 +1,6 @@
 /*    dquote_static.c
  *
- * This file contains static inline functions that are related to
+ * This file contains static functions that are related to
  * parsing double-quotish expressions, but are used in more than
  * one file.
  *
@@ -36,6 +36,55 @@ S_regcurly(pTHX_ register const char *s)
     return TRUE;
 }
 
+/* XXX Add documentation after final interface and behavior is decided */
+/* May want to show context for error, so would pass Perl_bslash_c(pTHX_ const char* current, const char* start, const bool output_warning)
+    U8 source = *current;
+*/
+
+STATIC char
+S_grok_bslash_c(pTHX_ const char source, const bool utf8, const bool output_warning)
+{
+
+    U8 result;
+
+    if (utf8) {
+       /* Trying to deprecate non-ASCII usages.  This construct has never
+        * worked for a utf8 variant.  So, even though are accepting non-ASCII
+        * Latin1 in 5.14, no need to make them work under utf8 */
+       if (! isASCII(source)) {
+           Perl_croak(aTHX_ "Character following \"\\c\" must be ASCII");
+       }
+    }
+
+    result = toCTRL(source);
+    if (! isASCII(source)) {
+           Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
+                           "Character following \"\\c\" must be ASCII");
+    }
+    else if (! isCNTRL(result) && output_warning) {
+       if (source == '{') {
+           Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
+                           "\"\\c{\" is deprecated and is more clearly written as \";\"");
+       }
+       else {
+           U8 clearer[3];
+           U8 i = 0;
+           if (! isALNUM(result)) {
+               clearer[i++] = '\\';
+           }
+           clearer[i++] = result;
+           clearer[i++] = '\0';
+
+           Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
+                           "\"\\c%c\" is more clearly written simply as \"%s\"",
+                           source,
+                           clearer);
+       }
+    }
+
+    return result;
+}
+
 STATIC bool
 S_grok_bslash_o(pTHX_ const char *s,
                         UV *uv,