summaryrefslogtreecommitdiff
path: root/toke.c
diff options
context:
space:
mode:
authorClaes Jakobsson <claes@surfar.nu>2009-05-14 16:10:06 +0200
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2009-05-14 16:10:06 +0200
commitb1fc363696b1a308e6bce75eb292bacc8f2c9833 (patch)
tree1ac527627cc35c571b8d9719dab59e97907e1332 /toke.c
parent7fecd077a7bc92add80772966a8c824277223d09 (diff)
downloadperl-b1fc363696b1a308e6bce75eb292bacc8f2c9833.tar.gz
Amelioration of the error message "Unrecognized character %s in column %d"
Changes the error message to "Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d". This should make it a little simpler to spot and correct the suspicious character.
Diffstat (limited to 'toke.c')
-rw-r--r--toke.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/toke.c b/toke.c
index c803a80010..3fda3a546b 100644
--- a/toke.c
+++ b/toke.c
@@ -124,6 +124,9 @@ static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
# define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
#endif
+/* The maximum number of characters preceding the unrecognized one to display */
+#define UNRECOGNIZED_PRECEDE_COUNT 10
+
/* In variables named $^X, these are the legal values for X.
* 1999-02-27 mjd-perl-patch@plover.com */
#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
@@ -3652,8 +3655,17 @@ Perl_yylex(pTHX)
default:
if (isIDFIRST_lazy_if(s,UTF))
goto keylookup;
- len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
- Perl_croak(aTHX_ "Unrecognized character \\x%02X in column %d", *s & 255, (int) len + 1);
+ {
+ unsigned char c = *s;
+ len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
+ if (len > UNRECOGNIZED_PRECEDE_COUNT) {
+ d = UTF ? (char *) Perl_utf8_hop(aTHX_ (U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
+ } else {
+ d = PL_linestart;
+ }
+ *s = '\0';
+ Perl_croak(aTHX_ "Unrecognized character \\x%02X; marked by <-- HERE after %s<-- HERE near column %d", c, d, (int) len + 1);
+ }
case 4:
case 26:
goto fake_eof; /* emulate EOF on ^D or ^Z */