add step to update RT version numbers in release_managers_guide
[p5sagit/p5-mst-13.2.git] / toke.c
1 /*    toke.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  *  'It all comes from here, the stench and the peril.'    --Frodo
13  *
14  *     [p.719 of _The Lord of the Rings_, IV/ix: "Shelob's Lair"]
15  */
16
17 /*
18  * This file is the lexer for Perl.  It's closely linked to the
19  * parser, perly.y.
20  *
21  * The main routine is yylex(), which returns the next token.
22  */
23
24 /*
25 =head1 Lexer interface
26
27 This is the lower layer of the Perl parser, managing characters and tokens.
28
29 =for apidoc AmU|yy_parser *|PL_parser
30
31 Pointer to a structure encapsulating the state of the parsing operation
32 currently in progress.  The pointer can be locally changed to perform
33 a nested parse without interfering with the state of an outer parse.
34 Individual members of C<PL_parser> have their own documentation.
35
36 =cut
37 */
38
39 #include "EXTERN.h"
40 #define PERL_IN_TOKE_C
41 #include "perl.h"
42
43 #define new_constant(a,b,c,d,e,f,g)     \
44         S_new_constant(aTHX_ a,b,STR_WITH_LEN(c),d,e,f, g)
45
46 #define pl_yylval       (PL_parser->yylval)
47
48 /* YYINITDEPTH -- initial size of the parser's stacks.  */
49 #define YYINITDEPTH 200
50
51 /* XXX temporary backwards compatibility */
52 #define PL_lex_brackets         (PL_parser->lex_brackets)
53 #define PL_lex_brackstack       (PL_parser->lex_brackstack)
54 #define PL_lex_casemods         (PL_parser->lex_casemods)
55 #define PL_lex_casestack        (PL_parser->lex_casestack)
56 #define PL_lex_defer            (PL_parser->lex_defer)
57 #define PL_lex_dojoin           (PL_parser->lex_dojoin)
58 #define PL_lex_expect           (PL_parser->lex_expect)
59 #define PL_lex_formbrack        (PL_parser->lex_formbrack)
60 #define PL_lex_inpat            (PL_parser->lex_inpat)
61 #define PL_lex_inwhat           (PL_parser->lex_inwhat)
62 #define PL_lex_op               (PL_parser->lex_op)
63 #define PL_lex_repl             (PL_parser->lex_repl)
64 #define PL_lex_starts           (PL_parser->lex_starts)
65 #define PL_lex_stuff            (PL_parser->lex_stuff)
66 #define PL_multi_start          (PL_parser->multi_start)
67 #define PL_multi_open           (PL_parser->multi_open)
68 #define PL_multi_close          (PL_parser->multi_close)
69 #define PL_pending_ident        (PL_parser->pending_ident)
70 #define PL_preambled            (PL_parser->preambled)
71 #define PL_sublex_info          (PL_parser->sublex_info)
72 #define PL_linestr              (PL_parser->linestr)
73 #define PL_expect               (PL_parser->expect)
74 #define PL_copline              (PL_parser->copline)
75 #define PL_bufptr               (PL_parser->bufptr)
76 #define PL_oldbufptr            (PL_parser->oldbufptr)
77 #define PL_oldoldbufptr         (PL_parser->oldoldbufptr)
78 #define PL_linestart            (PL_parser->linestart)
79 #define PL_bufend               (PL_parser->bufend)
80 #define PL_last_uni             (PL_parser->last_uni)
81 #define PL_last_lop             (PL_parser->last_lop)
82 #define PL_last_lop_op          (PL_parser->last_lop_op)
83 #define PL_lex_state            (PL_parser->lex_state)
84 #define PL_rsfp                 (PL_parser->rsfp)
85 #define PL_rsfp_filters         (PL_parser->rsfp_filters)
86 #define PL_in_my                (PL_parser->in_my)
87 #define PL_in_my_stash          (PL_parser->in_my_stash)
88 #define PL_tokenbuf             (PL_parser->tokenbuf)
89 #define PL_multi_end            (PL_parser->multi_end)
90 #define PL_error_count          (PL_parser->error_count)
91
92 #ifdef PERL_MAD
93 #  define PL_endwhite           (PL_parser->endwhite)
94 #  define PL_faketokens         (PL_parser->faketokens)
95 #  define PL_lasttoke           (PL_parser->lasttoke)
96 #  define PL_nextwhite          (PL_parser->nextwhite)
97 #  define PL_realtokenstart     (PL_parser->realtokenstart)
98 #  define PL_skipwhite          (PL_parser->skipwhite)
99 #  define PL_thisclose          (PL_parser->thisclose)
100 #  define PL_thismad            (PL_parser->thismad)
101 #  define PL_thisopen           (PL_parser->thisopen)
102 #  define PL_thisstuff          (PL_parser->thisstuff)
103 #  define PL_thistoken          (PL_parser->thistoken)
104 #  define PL_thiswhite          (PL_parser->thiswhite)
105 #  define PL_thiswhite          (PL_parser->thiswhite)
106 #  define PL_nexttoke           (PL_parser->nexttoke)
107 #  define PL_curforce           (PL_parser->curforce)
108 #else
109 #  define PL_nexttoke           (PL_parser->nexttoke)
110 #  define PL_nexttype           (PL_parser->nexttype)
111 #  define PL_nextval            (PL_parser->nextval)
112 #endif
113
114 /* This can't be done with embed.fnc, because struct yy_parser contains a
115    member named pending_ident, which clashes with the generated #define  */
116 static int
117 S_pending_ident(pTHX);
118
119 static const char ident_too_long[] = "Identifier too long";
120
121 #ifdef PERL_MAD
122 #  define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
123 #  define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
124 #else
125 #  define CURMAD(slot,sv)
126 #  define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
127 #endif
128
129 #define XFAKEBRACK 128
130 #define XENUMMASK 127
131
132 #ifdef USE_UTF8_SCRIPTS
133 #   define UTF (!IN_BYTES)
134 #else
135 #   define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
136 #endif
137
138 /* The maximum number of characters preceding the unrecognized one to display */
139 #define UNRECOGNIZED_PRECEDE_COUNT 10
140
141 /* In variables named $^X, these are the legal values for X.
142  * 1999-02-27 mjd-perl-patch@plover.com */
143 #define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
144
145 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
146
147 /* LEX_* are values for PL_lex_state, the state of the lexer.
148  * They are arranged oddly so that the guard on the switch statement
149  * can get by with a single comparison (if the compiler is smart enough).
150  */
151
152 /* #define LEX_NOTPARSING               11 is done in perl.h. */
153
154 #define LEX_NORMAL              10 /* normal code (ie not within "...")     */
155 #define LEX_INTERPNORMAL         9 /* code within a string, eg "$foo[$x+1]" */
156 #define LEX_INTERPCASEMOD        8 /* expecting a \U, \Q or \E etc          */
157 #define LEX_INTERPPUSH           7 /* starting a new sublex parse level     */
158 #define LEX_INTERPSTART          6 /* expecting the start of a $var         */
159
160                                    /* at end of code, eg "$x" followed by:  */
161 #define LEX_INTERPEND            5 /* ... eg not one of [, { or ->          */
162 #define LEX_INTERPENDMAYBE       4 /* ... eg one of [, { or ->              */
163
164 #define LEX_INTERPCONCAT         3 /* expecting anything, eg at start of
165                                         string or after \E, $foo, etc       */
166 #define LEX_INTERPCONST          2 /* NOT USED */
167 #define LEX_FORMLINE             1 /* expecting a format line               */
168 #define LEX_KNOWNEXT             0 /* next token known; just return it      */
169
170
171 #ifdef DEBUGGING
172 static const char* const lex_state_names[] = {
173     "KNOWNEXT",
174     "FORMLINE",
175     "INTERPCONST",
176     "INTERPCONCAT",
177     "INTERPENDMAYBE",
178     "INTERPEND",
179     "INTERPSTART",
180     "INTERPPUSH",
181     "INTERPCASEMOD",
182     "INTERPNORMAL",
183     "NORMAL"
184 };
185 #endif
186
187 #ifdef ff_next
188 #undef ff_next
189 #endif
190
191 #include "keywords.h"
192
193 /* CLINE is a macro that ensures PL_copline has a sane value */
194
195 #ifdef CLINE
196 #undef CLINE
197 #endif
198 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
199
200 #ifdef PERL_MAD
201 #  define SKIPSPACE0(s) skipspace0(s)
202 #  define SKIPSPACE1(s) skipspace1(s)
203 #  define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
204 #  define PEEKSPACE(s) skipspace2(s,0)
205 #else
206 #  define SKIPSPACE0(s) skipspace(s)
207 #  define SKIPSPACE1(s) skipspace(s)
208 #  define SKIPSPACE2(s,tsv) skipspace(s)
209 #  define PEEKSPACE(s) skipspace(s)
210 #endif
211
212 /*
213  * Convenience functions to return different tokens and prime the
214  * lexer for the next token.  They all take an argument.
215  *
216  * TOKEN        : generic token (used for '(', DOLSHARP, etc)
217  * OPERATOR     : generic operator
218  * AOPERATOR    : assignment operator
219  * PREBLOCK     : beginning the block after an if, while, foreach, ...
220  * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
221  * PREREF       : *EXPR where EXPR is not a simple identifier
222  * TERM         : expression term
223  * LOOPX        : loop exiting command (goto, last, dump, etc)
224  * FTST         : file test operator
225  * FUN0         : zero-argument function
226  * FUN1         : not used, except for not, which isn't a UNIOP
227  * BOop         : bitwise or or xor
228  * BAop         : bitwise and
229  * SHop         : shift operator
230  * PWop         : power operator
231  * PMop         : pattern-matching operator
232  * Aop          : addition-level operator
233  * Mop          : multiplication-level operator
234  * Eop          : equality-testing operator
235  * Rop          : relational operator <= != gt
236  *
237  * Also see LOP and lop() below.
238  */
239
240 #ifdef DEBUGGING /* Serve -DT. */
241 #   define REPORT(retval) tokereport((I32)retval, &pl_yylval)
242 #else
243 #   define REPORT(retval) (retval)
244 #endif
245
246 #define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
247 #define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
248 #define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
249 #define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
250 #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
251 #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
252 #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
253 #define LOOPX(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
254 #define FTST(f)  return (pl_yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
255 #define FUN0(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
256 #define FUN1(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
257 #define BOop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
258 #define BAop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
259 #define SHop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
260 #define PWop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
261 #define PMop(f)  return(pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
262 #define Aop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
263 #define Mop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
264 #define Eop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
265 #define Rop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
266
267 /* This bit of chicanery makes a unary function followed by
268  * a parenthesis into a function with one argument, highest precedence.
269  * The UNIDOR macro is for unary functions that can be followed by the //
270  * operator (such as C<shift // 0>).
271  */
272 #define UNI2(f,x) { \
273         pl_yylval.ival = f; \
274         PL_expect = x; \
275         PL_bufptr = s; \
276         PL_last_uni = PL_oldbufptr; \
277         PL_last_lop_op = f; \
278         if (*s == '(') \
279             return REPORT( (int)FUNC1 ); \
280         s = PEEKSPACE(s); \
281         return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
282         }
283 #define UNI(f)    UNI2(f,XTERM)
284 #define UNIDOR(f) UNI2(f,XTERMORDORDOR)
285
286 #define UNIBRACK(f) { \
287         pl_yylval.ival = f; \
288         PL_bufptr = s; \
289         PL_last_uni = PL_oldbufptr; \
290         if (*s == '(') \
291             return REPORT( (int)FUNC1 ); \
292         s = PEEKSPACE(s); \
293         return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
294         }
295
296 /* grandfather return to old style */
297 #define OLDLOP(f) return(pl_yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
298
299 #ifdef DEBUGGING
300
301 /* how to interpret the pl_yylval associated with the token */
302 enum token_type {
303     TOKENTYPE_NONE,
304     TOKENTYPE_IVAL,
305     TOKENTYPE_OPNUM, /* pl_yylval.ival contains an opcode number */
306     TOKENTYPE_PVAL,
307     TOKENTYPE_OPVAL,
308     TOKENTYPE_GVVAL
309 };
310
311 static struct debug_tokens {
312     const int token;
313     enum token_type type;
314     const char *name;
315 } const debug_tokens[] =
316 {
317     { ADDOP,            TOKENTYPE_OPNUM,        "ADDOP" },
318     { ANDAND,           TOKENTYPE_NONE,         "ANDAND" },
319     { ANDOP,            TOKENTYPE_NONE,         "ANDOP" },
320     { ANONSUB,          TOKENTYPE_IVAL,         "ANONSUB" },
321     { ARROW,            TOKENTYPE_NONE,         "ARROW" },
322     { ASSIGNOP,         TOKENTYPE_OPNUM,        "ASSIGNOP" },
323     { BITANDOP,         TOKENTYPE_OPNUM,        "BITANDOP" },
324     { BITOROP,          TOKENTYPE_OPNUM,        "BITOROP" },
325     { COLONATTR,        TOKENTYPE_NONE,         "COLONATTR" },
326     { CONTINUE,         TOKENTYPE_NONE,         "CONTINUE" },
327     { DEFAULT,          TOKENTYPE_NONE,         "DEFAULT" },
328     { DO,               TOKENTYPE_NONE,         "DO" },
329     { DOLSHARP,         TOKENTYPE_NONE,         "DOLSHARP" },
330     { DORDOR,           TOKENTYPE_NONE,         "DORDOR" },
331     { DOROP,            TOKENTYPE_OPNUM,        "DOROP" },
332     { DOTDOT,           TOKENTYPE_IVAL,         "DOTDOT" },
333     { ELSE,             TOKENTYPE_NONE,         "ELSE" },
334     { ELSIF,            TOKENTYPE_IVAL,         "ELSIF" },
335     { EQOP,             TOKENTYPE_OPNUM,        "EQOP" },
336     { FOR,              TOKENTYPE_IVAL,         "FOR" },
337     { FORMAT,           TOKENTYPE_NONE,         "FORMAT" },
338     { FUNC,             TOKENTYPE_OPNUM,        "FUNC" },
339     { FUNC0,            TOKENTYPE_OPNUM,        "FUNC0" },
340     { FUNC0SUB,         TOKENTYPE_OPVAL,        "FUNC0SUB" },
341     { FUNC1,            TOKENTYPE_OPNUM,        "FUNC1" },
342     { FUNCMETH,         TOKENTYPE_OPVAL,        "FUNCMETH" },
343     { GIVEN,            TOKENTYPE_IVAL,         "GIVEN" },
344     { HASHBRACK,        TOKENTYPE_NONE,         "HASHBRACK" },
345     { IF,               TOKENTYPE_IVAL,         "IF" },
346     { LABEL,            TOKENTYPE_PVAL,         "LABEL" },
347     { LOCAL,            TOKENTYPE_IVAL,         "LOCAL" },
348     { LOOPEX,           TOKENTYPE_OPNUM,        "LOOPEX" },
349     { LSTOP,            TOKENTYPE_OPNUM,        "LSTOP" },
350     { LSTOPSUB,         TOKENTYPE_OPVAL,        "LSTOPSUB" },
351     { MATCHOP,          TOKENTYPE_OPNUM,        "MATCHOP" },
352     { METHOD,           TOKENTYPE_OPVAL,        "METHOD" },
353     { MULOP,            TOKENTYPE_OPNUM,        "MULOP" },
354     { MY,               TOKENTYPE_IVAL,         "MY" },
355     { MYSUB,            TOKENTYPE_NONE,         "MYSUB" },
356     { NOAMP,            TOKENTYPE_NONE,         "NOAMP" },
357     { NOTOP,            TOKENTYPE_NONE,         "NOTOP" },
358     { OROP,             TOKENTYPE_IVAL,         "OROP" },
359     { OROR,             TOKENTYPE_NONE,         "OROR" },
360     { PACKAGE,          TOKENTYPE_NONE,         "PACKAGE" },
361     { PLUGEXPR,         TOKENTYPE_OPVAL,        "PLUGEXPR" },
362     { PLUGSTMT,         TOKENTYPE_OPVAL,        "PLUGSTMT" },
363     { PMFUNC,           TOKENTYPE_OPVAL,        "PMFUNC" },
364     { POSTDEC,          TOKENTYPE_NONE,         "POSTDEC" },
365     { POSTINC,          TOKENTYPE_NONE,         "POSTINC" },
366     { POWOP,            TOKENTYPE_OPNUM,        "POWOP" },
367     { PREDEC,           TOKENTYPE_NONE,         "PREDEC" },
368     { PREINC,           TOKENTYPE_NONE,         "PREINC" },
369     { PRIVATEREF,       TOKENTYPE_OPVAL,        "PRIVATEREF" },
370     { REFGEN,           TOKENTYPE_NONE,         "REFGEN" },
371     { RELOP,            TOKENTYPE_OPNUM,        "RELOP" },
372     { SHIFTOP,          TOKENTYPE_OPNUM,        "SHIFTOP" },
373     { SUB,              TOKENTYPE_NONE,         "SUB" },
374     { THING,            TOKENTYPE_OPVAL,        "THING" },
375     { UMINUS,           TOKENTYPE_NONE,         "UMINUS" },
376     { UNIOP,            TOKENTYPE_OPNUM,        "UNIOP" },
377     { UNIOPSUB,         TOKENTYPE_OPVAL,        "UNIOPSUB" },
378     { UNLESS,           TOKENTYPE_IVAL,         "UNLESS" },
379     { UNTIL,            TOKENTYPE_IVAL,         "UNTIL" },
380     { USE,              TOKENTYPE_IVAL,         "USE" },
381     { WHEN,             TOKENTYPE_IVAL,         "WHEN" },
382     { WHILE,            TOKENTYPE_IVAL,         "WHILE" },
383     { WORD,             TOKENTYPE_OPVAL,        "WORD" },
384     { YADAYADA,         TOKENTYPE_IVAL,         "YADAYADA" },
385     { 0,                TOKENTYPE_NONE,         NULL }
386 };
387
388 /* dump the returned token in rv, plus any optional arg in pl_yylval */
389
390 STATIC int
391 S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
392 {
393     dVAR;
394
395     PERL_ARGS_ASSERT_TOKEREPORT;
396
397     if (DEBUG_T_TEST) {
398         const char *name = NULL;
399         enum token_type type = TOKENTYPE_NONE;
400         const struct debug_tokens *p;
401         SV* const report = newSVpvs("<== ");
402
403         for (p = debug_tokens; p->token; p++) {
404             if (p->token == (int)rv) {
405                 name = p->name;
406                 type = p->type;
407                 break;
408             }
409         }
410         if (name)
411             Perl_sv_catpv(aTHX_ report, name);
412         else if ((char)rv > ' ' && (char)rv < '~')
413             Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
414         else if (!rv)
415             sv_catpvs(report, "EOF");
416         else
417             Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
418         switch (type) {
419         case TOKENTYPE_NONE:
420         case TOKENTYPE_GVVAL: /* doesn't appear to be used */
421             break;
422         case TOKENTYPE_IVAL:
423             Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)lvalp->ival);
424             break;
425         case TOKENTYPE_OPNUM:
426             Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
427                                     PL_op_name[lvalp->ival]);
428             break;
429         case TOKENTYPE_PVAL:
430             Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval);
431             break;
432         case TOKENTYPE_OPVAL:
433             if (lvalp->opval) {
434                 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
435                                     PL_op_name[lvalp->opval->op_type]);
436                 if (lvalp->opval->op_type == OP_CONST) {
437                     Perl_sv_catpvf(aTHX_ report, " %s",
438                         SvPEEK(cSVOPx_sv(lvalp->opval)));
439                 }
440
441             }
442             else
443                 sv_catpvs(report, "(opval=null)");
444             break;
445         }
446         PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
447     };
448     return (int)rv;
449 }
450
451
452 /* print the buffer with suitable escapes */
453
454 STATIC void
455 S_printbuf(pTHX_ const char *const fmt, const char *const s)
456 {
457     SV* const tmp = newSVpvs("");
458
459     PERL_ARGS_ASSERT_PRINTBUF;
460
461     PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
462     SvREFCNT_dec(tmp);
463 }
464
465 #endif
466
467 static int
468 S_deprecate_commaless_var_list(pTHX) {
469     PL_expect = XTERM;
470     deprecate("comma-less variable list");
471     return REPORT(','); /* grandfather non-comma-format format */
472 }
473
474 /*
475  * S_ao
476  *
477  * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
478  * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
479  */
480
481 STATIC int
482 S_ao(pTHX_ int toketype)
483 {
484     dVAR;
485     if (*PL_bufptr == '=') {
486         PL_bufptr++;
487         if (toketype == ANDAND)
488             pl_yylval.ival = OP_ANDASSIGN;
489         else if (toketype == OROR)
490             pl_yylval.ival = OP_ORASSIGN;
491         else if (toketype == DORDOR)
492             pl_yylval.ival = OP_DORASSIGN;
493         toketype = ASSIGNOP;
494     }
495     return toketype;
496 }
497
498 /*
499  * S_no_op
500  * When Perl expects an operator and finds something else, no_op
501  * prints the warning.  It always prints "<something> found where
502  * operator expected.  It prints "Missing semicolon on previous line?"
503  * if the surprise occurs at the start of the line.  "do you need to
504  * predeclare ..." is printed out for code like "sub bar; foo bar $x"
505  * where the compiler doesn't know if foo is a method call or a function.
506  * It prints "Missing operator before end of line" if there's nothing
507  * after the missing operator, or "... before <...>" if there is something
508  * after the missing operator.
509  */
510
511 STATIC void
512 S_no_op(pTHX_ const char *const what, char *s)
513 {
514     dVAR;
515     char * const oldbp = PL_bufptr;
516     const bool is_first = (PL_oldbufptr == PL_linestart);
517
518     PERL_ARGS_ASSERT_NO_OP;
519
520     if (!s)
521         s = oldbp;
522     else
523         PL_bufptr = s;
524     yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
525     if (ckWARN_d(WARN_SYNTAX)) {
526         if (is_first)
527             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
528                     "\t(Missing semicolon on previous line?)\n");
529         else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
530             const char *t;
531             for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
532                 NOOP;
533             if (t < PL_bufptr && isSPACE(*t))
534                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
535                         "\t(Do you need to predeclare %.*s?)\n",
536                     (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
537         }
538         else {
539             assert(s >= oldbp);
540             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
541                     "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
542         }
543     }
544     PL_bufptr = oldbp;
545 }
546
547 /*
548  * S_missingterm
549  * Complain about missing quote/regexp/heredoc terminator.
550  * If it's called with NULL then it cauterizes the line buffer.
551  * If we're in a delimited string and the delimiter is a control
552  * character, it's reformatted into a two-char sequence like ^C.
553  * This is fatal.
554  */
555
556 STATIC void
557 S_missingterm(pTHX_ char *s)
558 {
559     dVAR;
560     char tmpbuf[3];
561     char q;
562     if (s) {
563         char * const nl = strrchr(s,'\n');
564         if (nl)
565             *nl = '\0';
566     }
567     else if (isCNTRL(PL_multi_close)) {
568         *tmpbuf = '^';
569         tmpbuf[1] = (char)toCTRL(PL_multi_close);
570         tmpbuf[2] = '\0';
571         s = tmpbuf;
572     }
573     else {
574         *tmpbuf = (char)PL_multi_close;
575         tmpbuf[1] = '\0';
576         s = tmpbuf;
577     }
578     q = strchr(s,'"') ? '\'' : '"';
579     Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
580 }
581
582 #define FEATURE_IS_ENABLED(name)                                        \
583         ((0 != (PL_hints & HINT_LOCALIZE_HH))                           \
584             && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
585 /* The longest string we pass in.  */
586 #define MAX_FEATURE_LEN (sizeof("unicode_strings")-1)
587
588 /*
589  * S_feature_is_enabled
590  * Check whether the named feature is enabled.
591  */
592 STATIC bool
593 S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
594 {
595     dVAR;
596     HV * const hinthv = GvHV(PL_hintgv);
597     char he_name[8 + MAX_FEATURE_LEN] = "feature_";
598
599     PERL_ARGS_ASSERT_FEATURE_IS_ENABLED;
600
601     assert(namelen <= MAX_FEATURE_LEN);
602     memcpy(&he_name[8], name, namelen);
603
604     return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
605 }
606
607 /*
608  * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
609  * utf16-to-utf8-reversed.
610  */
611
612 #ifdef PERL_CR_FILTER
613 static void
614 strip_return(SV *sv)
615 {
616     register const char *s = SvPVX_const(sv);
617     register const char * const e = s + SvCUR(sv);
618
619     PERL_ARGS_ASSERT_STRIP_RETURN;
620
621     /* outer loop optimized to do nothing if there are no CR-LFs */
622     while (s < e) {
623         if (*s++ == '\r' && *s == '\n') {
624             /* hit a CR-LF, need to copy the rest */
625             register char *d = s - 1;
626             *d++ = *s++;
627             while (s < e) {
628                 if (*s == '\r' && s[1] == '\n')
629                     s++;
630                 *d++ = *s++;
631             }
632             SvCUR(sv) -= s - d;
633             return;
634         }
635     }
636 }
637
638 STATIC I32
639 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
640 {
641     const I32 count = FILTER_READ(idx+1, sv, maxlen);
642     if (count > 0 && !maxlen)
643         strip_return(sv);
644     return count;
645 }
646 #endif
647
648
649
650 /*
651  * Perl_lex_start
652  *
653  * Create a parser object and initialise its parser and lexer fields
654  *
655  * rsfp       is the opened file handle to read from (if any),
656  *
657  * line       holds any initial content already read from the file (or in
658  *            the case of no file, such as an eval, the whole contents);
659  *
660  * new_filter indicates that this is a new file and it shouldn't inherit
661  *            the filters from the current parser (ie require).
662  */
663
664 void
665 Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, bool new_filter)
666 {
667     dVAR;
668     const char *s = NULL;
669     STRLEN len;
670     yy_parser *parser, *oparser;
671
672     /* create and initialise a parser */
673
674     Newxz(parser, 1, yy_parser);
675     parser->old_parser = oparser = PL_parser;
676     PL_parser = parser;
677
678     Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
679     parser->ps = parser->stack;
680     parser->stack_size = YYINITDEPTH;
681
682     parser->stack->state = 0;
683     parser->yyerrstatus = 0;
684     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
685
686     /* on scope exit, free this parser and restore any outer one */
687     SAVEPARSER(parser);
688     parser->saved_curcop = PL_curcop;
689
690     /* initialise lexer state */
691
692 #ifdef PERL_MAD
693     parser->curforce = -1;
694 #else
695     parser->nexttoke = 0;
696 #endif
697     parser->error_count = oparser ? oparser->error_count : 0;
698     parser->copline = NOLINE;
699     parser->lex_state = LEX_NORMAL;
700     parser->expect = XSTATE;
701     parser->rsfp = rsfp;
702     parser->rsfp_filters = (new_filter || !oparser) ? newAV()
703                 : MUTABLE_AV(SvREFCNT_inc(oparser->rsfp_filters));
704
705     Newx(parser->lex_brackstack, 120, char);
706     Newx(parser->lex_casestack, 12, char);
707     *parser->lex_casestack = '\0';
708
709     if (line) {
710         s = SvPV_const(line, len);
711     } else {
712         len = 0;
713     }
714
715     if (!len) {
716         parser->linestr = newSVpvs("\n;");
717     } else if (SvREADONLY(line) || s[len-1] != ';') {
718         parser->linestr = newSVsv(line);
719         if (s[len-1] != ';')
720             sv_catpvs(parser->linestr, "\n;");
721     } else {
722         SvTEMP_off(line);
723         SvREFCNT_inc_simple_void_NN(line);
724         parser->linestr = line;
725     }
726     parser->oldoldbufptr =
727         parser->oldbufptr =
728         parser->bufptr =
729         parser->linestart = SvPVX(parser->linestr);
730     parser->bufend = parser->bufptr + SvCUR(parser->linestr);
731     parser->last_lop = parser->last_uni = NULL;
732 }
733
734
735 /* delete a parser object */
736
737 void
738 Perl_parser_free(pTHX_  const yy_parser *parser)
739 {
740     PERL_ARGS_ASSERT_PARSER_FREE;
741
742     PL_curcop = parser->saved_curcop;
743     SvREFCNT_dec(parser->linestr);
744
745     if (parser->rsfp == PerlIO_stdin())
746         PerlIO_clearerr(parser->rsfp);
747     else if (parser->rsfp && (!parser->old_parser ||
748                 (parser->old_parser && parser->rsfp != parser->old_parser->rsfp)))
749         PerlIO_close(parser->rsfp);
750     SvREFCNT_dec(parser->rsfp_filters);
751
752     Safefree(parser->stack);
753     Safefree(parser->lex_brackstack);
754     Safefree(parser->lex_casestack);
755     PL_parser = parser->old_parser;
756     Safefree(parser);
757 }
758
759
760 /*
761  * Perl_lex_end
762  * Finalizer for lexing operations.  Must be called when the parser is
763  * done with the lexer.
764  */
765
766 void
767 Perl_lex_end(pTHX)
768 {
769     dVAR;
770     PL_doextract = FALSE;
771 }
772
773 /*
774 =for apidoc AmxU|SV *|PL_parser-E<gt>linestr
775
776 Buffer scalar containing the chunk currently under consideration of the
777 text currently being lexed.  This is always a plain string scalar (for
778 which C<SvPOK> is true).  It is not intended to be used as a scalar by
779 normal scalar means; instead refer to the buffer directly by the pointer
780 variables described below.
781
782 The lexer maintains various C<char*> pointers to things in the
783 C<PL_parser-E<gt>linestr> buffer.  If C<PL_parser-E<gt>linestr> is ever
784 reallocated, all of these pointers must be updated.  Don't attempt to
785 do this manually, but rather use L</lex_grow_linestr> if you need to
786 reallocate the buffer.
787
788 The content of the text chunk in the buffer is commonly exactly one
789 complete line of input, up to and including a newline terminator,
790 but there are situations where it is otherwise.  The octets of the
791 buffer may be intended to be interpreted as either UTF-8 or Latin-1.
792 The function L</lex_bufutf8> tells you which.  Do not use the C<SvUTF8>
793 flag on this scalar, which may disagree with it.
794
795 For direct examination of the buffer, the variable
796 L</PL_parser-E<gt>bufend> points to the end of the buffer.  The current
797 lexing position is pointed to by L</PL_parser-E<gt>bufptr>.  Direct use
798 of these pointers is usually preferable to examination of the scalar
799 through normal scalar means.
800
801 =for apidoc AmxU|char *|PL_parser-E<gt>bufend
802
803 Direct pointer to the end of the chunk of text currently being lexed, the
804 end of the lexer buffer.  This is equal to C<SvPVX(PL_parser-E<gt>linestr)
805 + SvCUR(PL_parser-E<gt>linestr)>.  A NUL character (zero octet) is
806 always located at the end of the buffer, and does not count as part of
807 the buffer's contents.
808
809 =for apidoc AmxU|char *|PL_parser-E<gt>bufptr
810
811 Points to the current position of lexing inside the lexer buffer.
812 Characters around this point may be freely examined, within
813 the range delimited by C<SvPVX(L</PL_parser-E<gt>linestr>)> and
814 L</PL_parser-E<gt>bufend>.  The octets of the buffer may be intended to be
815 interpreted as either UTF-8 or Latin-1, as indicated by L</lex_bufutf8>.
816
817 Lexing code (whether in the Perl core or not) moves this pointer past
818 the characters that it consumes.  It is also expected to perform some
819 bookkeeping whenever a newline character is consumed.  This movement
820 can be more conveniently performed by the function L</lex_read_to>,
821 which handles newlines appropriately.
822
823 Interpretation of the buffer's octets can be abstracted out by
824 using the slightly higher-level functions L</lex_peek_unichar> and
825 L</lex_read_unichar>.
826
827 =for apidoc AmxU|char *|PL_parser-E<gt>linestart
828
829 Points to the start of the current line inside the lexer buffer.
830 This is useful for indicating at which column an error occurred, and
831 not much else.  This must be updated by any lexing code that consumes
832 a newline; the function L</lex_read_to> handles this detail.
833
834 =cut
835 */
836
837 /*
838 =for apidoc Amx|bool|lex_bufutf8
839
840 Indicates whether the octets in the lexer buffer
841 (L</PL_parser-E<gt>linestr>) should be interpreted as the UTF-8 encoding
842 of Unicode characters.  If not, they should be interpreted as Latin-1
843 characters.  This is analogous to the C<SvUTF8> flag for scalars.
844
845 In UTF-8 mode, it is not guaranteed that the lexer buffer actually
846 contains valid UTF-8.  Lexing code must be robust in the face of invalid
847 encoding.
848
849 The actual C<SvUTF8> flag of the L</PL_parser-E<gt>linestr> scalar
850 is significant, but not the whole story regarding the input character
851 encoding.  Normally, when a file is being read, the scalar contains octets
852 and its C<SvUTF8> flag is off, but the octets should be interpreted as
853 UTF-8 if the C<use utf8> pragma is in effect.  During a string eval,
854 however, the scalar may have the C<SvUTF8> flag on, and in this case its
855 octets should be interpreted as UTF-8 unless the C<use bytes> pragma
856 is in effect.  This logic may change in the future; use this function
857 instead of implementing the logic yourself.
858
859 =cut
860 */
861
862 bool
863 Perl_lex_bufutf8(pTHX)
864 {
865     return UTF;
866 }
867
868 /*
869 =for apidoc Amx|char *|lex_grow_linestr|STRLEN len
870
871 Reallocates the lexer buffer (L</PL_parser-E<gt>linestr>) to accommodate
872 at least I<len> octets (including terminating NUL).  Returns a
873 pointer to the reallocated buffer.  This is necessary before making
874 any direct modification of the buffer that would increase its length.
875 L</lex_stuff_pvn> provides a more convenient way to insert text into
876 the buffer.
877
878 Do not use C<SvGROW> or C<sv_grow> directly on C<PL_parser-E<gt>linestr>;
879 this function updates all of the lexer's variables that point directly
880 into the buffer.
881
882 =cut
883 */
884
885 char *
886 Perl_lex_grow_linestr(pTHX_ STRLEN len)
887 {
888     SV *linestr;
889     char *buf;
890     STRLEN bufend_pos, bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
891     STRLEN linestart_pos, last_uni_pos, last_lop_pos;
892     linestr = PL_parser->linestr;
893     buf = SvPVX(linestr);
894     if (len <= SvLEN(linestr))
895         return buf;
896     bufend_pos = PL_parser->bufend - buf;
897     bufptr_pos = PL_parser->bufptr - buf;
898     oldbufptr_pos = PL_parser->oldbufptr - buf;
899     oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
900     linestart_pos = PL_parser->linestart - buf;
901     last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
902     last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
903     buf = sv_grow(linestr, len);
904     PL_parser->bufend = buf + bufend_pos;
905     PL_parser->bufptr = buf + bufptr_pos;
906     PL_parser->oldbufptr = buf + oldbufptr_pos;
907     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
908     PL_parser->linestart = buf + linestart_pos;
909     if (PL_parser->last_uni)
910         PL_parser->last_uni = buf + last_uni_pos;
911     if (PL_parser->last_lop)
912         PL_parser->last_lop = buf + last_lop_pos;
913     return buf;
914 }
915
916 /*
917 =for apidoc Amx|void|lex_stuff_pvn|char *pv|STRLEN len|U32 flags
918
919 Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
920 immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
921 reallocating the buffer if necessary.  This means that lexing code that
922 runs later will see the characters as if they had appeared in the input.
923 It is not recommended to do this as part of normal parsing, and most
924 uses of this facility run the risk of the inserted characters being
925 interpreted in an unintended manner.
926
927 The string to be inserted is represented by I<len> octets starting
928 at I<pv>.  These octets are interpreted as either UTF-8 or Latin-1,
929 according to whether the C<LEX_STUFF_UTF8> flag is set in I<flags>.
930 The characters are recoded for the lexer buffer, according to how the
931 buffer is currently being interpreted (L</lex_bufutf8>).  If a string
932 to be interpreted is available as a Perl scalar, the L</lex_stuff_sv>
933 function is more convenient.
934
935 =cut
936 */
937
938 void
939 Perl_lex_stuff_pvn(pTHX_ char *pv, STRLEN len, U32 flags)
940 {
941     dVAR;
942     char *bufptr;
943     PERL_ARGS_ASSERT_LEX_STUFF_PVN;
944     if (flags & ~(LEX_STUFF_UTF8))
945         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_pvn");
946     if (UTF) {
947         if (flags & LEX_STUFF_UTF8) {
948             goto plain_copy;
949         } else {
950             STRLEN highhalf = 0;
951             char *p, *e = pv+len;
952             for (p = pv; p != e; p++)
953                 highhalf += !!(((U8)*p) & 0x80);
954             if (!highhalf)
955                 goto plain_copy;
956             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len+highhalf);
957             bufptr = PL_parser->bufptr;
958             Move(bufptr, bufptr+len+highhalf, PL_parser->bufend+1-bufptr, char);
959             SvCUR_set(PL_parser->linestr,
960                 SvCUR(PL_parser->linestr) + len+highhalf);
961             PL_parser->bufend += len+highhalf;
962             for (p = pv; p != e; p++) {
963                 U8 c = (U8)*p;
964                 if (c & 0x80) {
965                     *bufptr++ = (char)(0xc0 | (c >> 6));
966                     *bufptr++ = (char)(0x80 | (c & 0x3f));
967                 } else {
968                     *bufptr++ = (char)c;
969                 }
970             }
971         }
972     } else {
973         if (flags & LEX_STUFF_UTF8) {
974             STRLEN highhalf = 0;
975             char *p, *e = pv+len;
976             for (p = pv; p != e; p++) {
977                 U8 c = (U8)*p;
978                 if (c >= 0xc4) {
979                     Perl_croak(aTHX_ "Lexing code attempted to stuff "
980                                 "non-Latin-1 character into Latin-1 input");
981                 } else if (c >= 0xc2 && p+1 != e &&
982                             (((U8)p[1]) & 0xc0) == 0x80) {
983                     p++;
984                     highhalf++;
985                 } else if (c >= 0x80) {
986                     /* malformed UTF-8 */
987                     ENTER;
988                     SAVESPTR(PL_warnhook);
989                     PL_warnhook = PERL_WARNHOOK_FATAL;
990                     utf8n_to_uvuni((U8*)p, e-p, NULL, 0);
991                     LEAVE;
992                 }
993             }
994             if (!highhalf)
995                 goto plain_copy;
996             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len-highhalf);
997             bufptr = PL_parser->bufptr;
998             Move(bufptr, bufptr+len-highhalf, PL_parser->bufend+1-bufptr, char);
999             SvCUR_set(PL_parser->linestr,
1000                 SvCUR(PL_parser->linestr) + len-highhalf);
1001             PL_parser->bufend += len-highhalf;
1002             for (p = pv; p != e; p++) {
1003                 U8 c = (U8)*p;
1004                 if (c & 0x80) {
1005                     *bufptr++ = (char)(((c & 0x3) << 6) | (p[1] & 0x3f));
1006                     p++;
1007                 } else {
1008                     *bufptr++ = (char)c;
1009                 }
1010             }
1011         } else {
1012             plain_copy:
1013             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len);
1014             bufptr = PL_parser->bufptr;
1015             Move(bufptr, bufptr+len, PL_parser->bufend+1-bufptr, char);
1016             SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) + len);
1017             PL_parser->bufend += len;
1018             Copy(pv, bufptr, len, char);
1019         }
1020     }
1021 }
1022
1023 /*
1024 =for apidoc Amx|void|lex_stuff_sv|SV *sv|U32 flags
1025
1026 Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
1027 immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
1028 reallocating the buffer if necessary.  This means that lexing code that
1029 runs later will see the characters as if they had appeared in the input.
1030 It is not recommended to do this as part of normal parsing, and most
1031 uses of this facility run the risk of the inserted characters being
1032 interpreted in an unintended manner.
1033
1034 The string to be inserted is the string value of I<sv>.  The characters
1035 are recoded for the lexer buffer, according to how the buffer is currently
1036 being interpreted (L</lex_bufutf8>).  If a string to be interpreted is
1037 not already a Perl scalar, the L</lex_stuff_pvn> function avoids the
1038 need to construct a scalar.
1039
1040 =cut
1041 */
1042
1043 void
1044 Perl_lex_stuff_sv(pTHX_ SV *sv, U32 flags)
1045 {
1046     char *pv;
1047     STRLEN len;
1048     PERL_ARGS_ASSERT_LEX_STUFF_SV;
1049     if (flags)
1050         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_sv");
1051     pv = SvPV(sv, len);
1052     lex_stuff_pvn(pv, len, flags | (SvUTF8(sv) ? LEX_STUFF_UTF8 : 0));
1053 }
1054
1055 /*
1056 =for apidoc Amx|void|lex_unstuff|char *ptr
1057
1058 Discards text about to be lexed, from L</PL_parser-E<gt>bufptr> up to
1059 I<ptr>.  Text following I<ptr> will be moved, and the buffer shortened.
1060 This hides the discarded text from any lexing code that runs later,
1061 as if the text had never appeared.
1062
1063 This is not the normal way to consume lexed text.  For that, use
1064 L</lex_read_to>.
1065
1066 =cut
1067 */
1068
1069 void
1070 Perl_lex_unstuff(pTHX_ char *ptr)
1071 {
1072     char *buf, *bufend;
1073     STRLEN unstuff_len;
1074     PERL_ARGS_ASSERT_LEX_UNSTUFF;
1075     buf = PL_parser->bufptr;
1076     if (ptr < buf)
1077         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1078     if (ptr == buf)
1079         return;
1080     bufend = PL_parser->bufend;
1081     if (ptr > bufend)
1082         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1083     unstuff_len = ptr - buf;
1084     Move(ptr, buf, bufend+1-ptr, char);
1085     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - unstuff_len);
1086     PL_parser->bufend = bufend - unstuff_len;
1087 }
1088
1089 /*
1090 =for apidoc Amx|void|lex_read_to|char *ptr
1091
1092 Consume text in the lexer buffer, from L</PL_parser-E<gt>bufptr> up
1093 to I<ptr>.  This advances L</PL_parser-E<gt>bufptr> to match I<ptr>,
1094 performing the correct bookkeeping whenever a newline character is passed.
1095 This is the normal way to consume lexed text.
1096
1097 Interpretation of the buffer's octets can be abstracted out by
1098 using the slightly higher-level functions L</lex_peek_unichar> and
1099 L</lex_read_unichar>.
1100
1101 =cut
1102 */
1103
1104 void
1105 Perl_lex_read_to(pTHX_ char *ptr)
1106 {
1107     char *s;
1108     PERL_ARGS_ASSERT_LEX_READ_TO;
1109     s = PL_parser->bufptr;
1110     if (ptr < s || ptr > PL_parser->bufend)
1111         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_to");
1112     for (; s != ptr; s++)
1113         if (*s == '\n') {
1114             CopLINE_inc(PL_curcop);
1115             PL_parser->linestart = s+1;
1116         }
1117     PL_parser->bufptr = ptr;
1118 }
1119
1120 /*
1121 =for apidoc Amx|void|lex_discard_to|char *ptr
1122
1123 Discards the first part of the L</PL_parser-E<gt>linestr> buffer,
1124 up to I<ptr>.  The remaining content of the buffer will be moved, and
1125 all pointers into the buffer updated appropriately.  I<ptr> must not
1126 be later in the buffer than the position of L</PL_parser-E<gt>bufptr>:
1127 it is not permitted to discard text that has yet to be lexed.
1128
1129 Normally it is not necessarily to do this directly, because it suffices to
1130 use the implicit discarding behaviour of L</lex_next_chunk> and things
1131 based on it.  However, if a token stretches across multiple lines,
1132 and the lexing code has kept multiple lines of text in the buffer for
1133 that purpose, then after completion of the token it would be wise to
1134 explicitly discard the now-unneeded earlier lines, to avoid future
1135 multi-line tokens growing the buffer without bound.
1136
1137 =cut
1138 */
1139
1140 void
1141 Perl_lex_discard_to(pTHX_ char *ptr)
1142 {
1143     char *buf;
1144     STRLEN discard_len;
1145     PERL_ARGS_ASSERT_LEX_DISCARD_TO;
1146     buf = SvPVX(PL_parser->linestr);
1147     if (ptr < buf)
1148         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1149     if (ptr == buf)
1150         return;
1151     if (ptr > PL_parser->bufptr)
1152         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1153     discard_len = ptr - buf;
1154     if (PL_parser->oldbufptr < ptr)
1155         PL_parser->oldbufptr = ptr;
1156     if (PL_parser->oldoldbufptr < ptr)
1157         PL_parser->oldoldbufptr = ptr;
1158     if (PL_parser->last_uni && PL_parser->last_uni < ptr)
1159         PL_parser->last_uni = NULL;
1160     if (PL_parser->last_lop && PL_parser->last_lop < ptr)
1161         PL_parser->last_lop = NULL;
1162     Move(ptr, buf, PL_parser->bufend+1-ptr, char);
1163     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - discard_len);
1164     PL_parser->bufend -= discard_len;
1165     PL_parser->bufptr -= discard_len;
1166     PL_parser->oldbufptr -= discard_len;
1167     PL_parser->oldoldbufptr -= discard_len;
1168     if (PL_parser->last_uni)
1169         PL_parser->last_uni -= discard_len;
1170     if (PL_parser->last_lop)
1171         PL_parser->last_lop -= discard_len;
1172 }
1173
1174 /*
1175 =for apidoc Amx|bool|lex_next_chunk|U32 flags
1176
1177 Reads in the next chunk of text to be lexed, appending it to
1178 L</PL_parser-E<gt>linestr>.  This should be called when lexing code has
1179 looked to the end of the current chunk and wants to know more.  It is
1180 usual, but not necessary, for lexing to have consumed the entirety of
1181 the current chunk at this time.
1182
1183 If L</PL_parser-E<gt>bufptr> is pointing to the very end of the current
1184 chunk (i.e., the current chunk has been entirely consumed), normally the
1185 current chunk will be discarded at the same time that the new chunk is
1186 read in.  If I<flags> includes C<LEX_KEEP_PREVIOUS>, the current chunk
1187 will not be discarded.  If the current chunk has not been entirely
1188 consumed, then it will not be discarded regardless of the flag.
1189
1190 Returns true if some new text was added to the buffer, or false if the
1191 buffer has reached the end of the input text.
1192
1193 =cut
1194 */
1195
1196 #define LEX_FAKE_EOF 0x80000000
1197
1198 bool
1199 Perl_lex_next_chunk(pTHX_ U32 flags)
1200 {
1201     SV *linestr;
1202     char *buf;
1203     STRLEN old_bufend_pos, new_bufend_pos;
1204     STRLEN bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
1205     STRLEN linestart_pos, last_uni_pos, last_lop_pos;
1206     bool got_some_for_debugger = 0;
1207     bool got_some;
1208     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_FAKE_EOF))
1209         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_next_chunk");
1210     linestr = PL_parser->linestr;
1211     buf = SvPVX(linestr);
1212     if (!(flags & LEX_KEEP_PREVIOUS) &&
1213             PL_parser->bufptr == PL_parser->bufend) {
1214         old_bufend_pos = bufptr_pos = oldbufptr_pos = oldoldbufptr_pos = 0;
1215         linestart_pos = 0;
1216         if (PL_parser->last_uni != PL_parser->bufend)
1217             PL_parser->last_uni = NULL;
1218         if (PL_parser->last_lop != PL_parser->bufend)
1219             PL_parser->last_lop = NULL;
1220         last_uni_pos = last_lop_pos = 0;
1221         *buf = 0;
1222         SvCUR(linestr) = 0;
1223     } else {
1224         old_bufend_pos = PL_parser->bufend - buf;
1225         bufptr_pos = PL_parser->bufptr - buf;
1226         oldbufptr_pos = PL_parser->oldbufptr - buf;
1227         oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
1228         linestart_pos = PL_parser->linestart - buf;
1229         last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
1230         last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
1231     }
1232     if (flags & LEX_FAKE_EOF) {
1233         goto eof;
1234     } else if (!PL_parser->rsfp) {
1235         got_some = 0;
1236     } else if (filter_gets(linestr, old_bufend_pos)) {
1237         got_some = 1;
1238         got_some_for_debugger = 1;
1239     } else {
1240         if (!SvPOK(linestr))   /* can get undefined by filter_gets */
1241             sv_setpvs(linestr, "");
1242         eof:
1243         /* End of real input.  Close filehandle (unless it was STDIN),
1244          * then add implicit termination.
1245          */
1246         if ((PerlIO*)PL_parser->rsfp == PerlIO_stdin())
1247             PerlIO_clearerr(PL_parser->rsfp);
1248         else if (PL_parser->rsfp)
1249             (void)PerlIO_close(PL_parser->rsfp);
1250         PL_parser->rsfp = NULL;
1251         PL_doextract = FALSE;
1252 #ifdef PERL_MAD
1253         if (PL_madskills && !PL_in_eval && (PL_minus_p || PL_minus_n))
1254             PL_faketokens = 1;
1255 #endif
1256         if (!PL_in_eval && PL_minus_p) {
1257             sv_catpvs(linestr,
1258                 /*{*/";}continue{print or die qq(-p destination: $!\\n);}");
1259             PL_minus_n = PL_minus_p = 0;
1260         } else if (!PL_in_eval && PL_minus_n) {
1261             sv_catpvs(linestr, /*{*/";}");
1262             PL_minus_n = 0;
1263         } else
1264             sv_catpvs(linestr, ";");
1265         got_some = 1;
1266     }
1267     buf = SvPVX(linestr);
1268     new_bufend_pos = SvCUR(linestr);
1269     PL_parser->bufend = buf + new_bufend_pos;
1270     PL_parser->bufptr = buf + bufptr_pos;
1271     PL_parser->oldbufptr = buf + oldbufptr_pos;
1272     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
1273     PL_parser->linestart = buf + linestart_pos;
1274     if (PL_parser->last_uni)
1275         PL_parser->last_uni = buf + last_uni_pos;
1276     if (PL_parser->last_lop)
1277         PL_parser->last_lop = buf + last_lop_pos;
1278     if (got_some_for_debugger && (PERLDB_LINE || PERLDB_SAVESRC) &&
1279             PL_curstash != PL_debstash) {
1280         /* debugger active and we're not compiling the debugger code,
1281          * so store the line into the debugger's array of lines
1282          */
1283         update_debugger_info(NULL, buf+old_bufend_pos,
1284             new_bufend_pos-old_bufend_pos);
1285     }
1286     return got_some;
1287 }
1288
1289 /*
1290 =for apidoc Amx|I32|lex_peek_unichar|U32 flags
1291
1292 Looks ahead one (Unicode) character in the text currently being lexed.
1293 Returns the codepoint (unsigned integer value) of the next character,
1294 or -1 if lexing has reached the end of the input text.  To consume the
1295 peeked character, use L</lex_read_unichar>.
1296
1297 If the next character is in (or extends into) the next chunk of input
1298 text, the next chunk will be read in.  Normally the current chunk will be
1299 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1300 then the current chunk will not be discarded.
1301
1302 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1303 is encountered, an exception is generated.
1304
1305 =cut
1306 */
1307
1308 I32
1309 Perl_lex_peek_unichar(pTHX_ U32 flags)
1310 {
1311     dVAR;
1312     char *s, *bufend;
1313     if (flags & ~(LEX_KEEP_PREVIOUS))
1314         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_peek_unichar");
1315     s = PL_parser->bufptr;
1316     bufend = PL_parser->bufend;
1317     if (UTF) {
1318         U8 head;
1319         I32 unichar;
1320         STRLEN len, retlen;
1321         if (s == bufend) {
1322             if (!lex_next_chunk(flags))
1323                 return -1;
1324             s = PL_parser->bufptr;
1325             bufend = PL_parser->bufend;
1326         }
1327         head = (U8)*s;
1328         if (!(head & 0x80))
1329             return head;
1330         if (head & 0x40) {
1331             len = PL_utf8skip[head];
1332             while ((STRLEN)(bufend-s) < len) {
1333                 if (!lex_next_chunk(flags | LEX_KEEP_PREVIOUS))
1334                     break;
1335                 s = PL_parser->bufptr;
1336                 bufend = PL_parser->bufend;
1337             }
1338         }
1339         unichar = utf8n_to_uvuni((U8*)s, bufend-s, &retlen, UTF8_CHECK_ONLY);
1340         if (retlen == (STRLEN)-1) {
1341             /* malformed UTF-8 */
1342             ENTER;
1343             SAVESPTR(PL_warnhook);
1344             PL_warnhook = PERL_WARNHOOK_FATAL;
1345             utf8n_to_uvuni((U8*)s, bufend-s, NULL, 0);
1346             LEAVE;
1347         }
1348         return unichar;
1349     } else {
1350         if (s == bufend) {
1351             if (!lex_next_chunk(flags))
1352                 return -1;
1353             s = PL_parser->bufptr;
1354         }
1355         return (U8)*s;
1356     }
1357 }
1358
1359 /*
1360 =for apidoc Amx|I32|lex_read_unichar|U32 flags
1361
1362 Reads the next (Unicode) character in the text currently being lexed.
1363 Returns the codepoint (unsigned integer value) of the character read,
1364 and moves L</PL_parser-E<gt>bufptr> past the character, or returns -1
1365 if lexing has reached the end of the input text.  To non-destructively
1366 examine the next character, use L</lex_peek_unichar> instead.
1367
1368 If the next character is in (or extends into) the next chunk of input
1369 text, the next chunk will be read in.  Normally the current chunk will be
1370 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1371 then the current chunk will not be discarded.
1372
1373 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1374 is encountered, an exception is generated.
1375
1376 =cut
1377 */
1378
1379 I32
1380 Perl_lex_read_unichar(pTHX_ U32 flags)
1381 {
1382     I32 c;
1383     if (flags & ~(LEX_KEEP_PREVIOUS))
1384         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_unichar");
1385     c = lex_peek_unichar(flags);
1386     if (c != -1) {
1387         if (c == '\n')
1388             CopLINE_inc(PL_curcop);
1389         PL_parser->bufptr += UTF8SKIP(PL_parser->bufptr);
1390     }
1391     return c;
1392 }
1393
1394 /*
1395 =for apidoc Amx|void|lex_read_space|U32 flags
1396
1397 Reads optional spaces, in Perl style, in the text currently being
1398 lexed.  The spaces may include ordinary whitespace characters and
1399 Perl-style comments.  C<#line> directives are processed if encountered.
1400 L</PL_parser-E<gt>bufptr> is moved past the spaces, so that it points
1401 at a non-space character (or the end of the input text).
1402
1403 If spaces extend into the next chunk of input text, the next chunk will
1404 be read in.  Normally the current chunk will be discarded at the same
1405 time, but if I<flags> includes C<LEX_KEEP_PREVIOUS> then the current
1406 chunk will not be discarded.
1407
1408 =cut
1409 */
1410
1411 #define LEX_NO_NEXT_CHUNK 0x80000000
1412
1413 void
1414 Perl_lex_read_space(pTHX_ U32 flags)
1415 {
1416     char *s, *bufend;
1417     bool need_incline = 0;
1418     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK))
1419         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space");
1420 #ifdef PERL_MAD
1421     if (PL_skipwhite) {
1422         sv_free(PL_skipwhite);
1423         PL_skipwhite = NULL;
1424     }
1425     if (PL_madskills)
1426         PL_skipwhite = newSVpvs("");
1427 #endif /* PERL_MAD */
1428     s = PL_parser->bufptr;
1429     bufend = PL_parser->bufend;
1430     while (1) {
1431         char c = *s;
1432         if (c == '#') {
1433             do {
1434                 c = *++s;
1435             } while (!(c == '\n' || (c == 0 && s == bufend)));
1436         } else if (c == '\n') {
1437             s++;
1438             PL_parser->linestart = s;
1439             if (s == bufend)
1440                 need_incline = 1;
1441             else
1442                 incline(s);
1443         } else if (isSPACE(c)) {
1444             s++;
1445         } else if (c == 0 && s == bufend) {
1446             bool got_more;
1447 #ifdef PERL_MAD
1448             if (PL_madskills)
1449                 sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1450 #endif /* PERL_MAD */
1451             if (flags & LEX_NO_NEXT_CHUNK)
1452                 break;
1453             PL_parser->bufptr = s;
1454             CopLINE_inc(PL_curcop);
1455             got_more = lex_next_chunk(flags);
1456             CopLINE_dec(PL_curcop);
1457             s = PL_parser->bufptr;
1458             bufend = PL_parser->bufend;
1459             if (!got_more)
1460                 break;
1461             if (need_incline && PL_parser->rsfp) {
1462                 incline(s);
1463                 need_incline = 0;
1464             }
1465         } else {
1466             break;
1467         }
1468     }
1469 #ifdef PERL_MAD
1470     if (PL_madskills)
1471         sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1472 #endif /* PERL_MAD */
1473     PL_parser->bufptr = s;
1474 }
1475
1476 /*
1477  * S_incline
1478  * This subroutine has nothing to do with tilting, whether at windmills
1479  * or pinball tables.  Its name is short for "increment line".  It
1480  * increments the current line number in CopLINE(PL_curcop) and checks
1481  * to see whether the line starts with a comment of the form
1482  *    # line 500 "foo.pm"
1483  * If so, it sets the current line number and file to the values in the comment.
1484  */
1485
1486 STATIC void
1487 S_incline(pTHX_ const char *s)
1488 {
1489     dVAR;
1490     const char *t;
1491     const char *n;
1492     const char *e;
1493
1494     PERL_ARGS_ASSERT_INCLINE;
1495
1496     CopLINE_inc(PL_curcop);
1497     if (*s++ != '#')
1498         return;
1499     while (SPACE_OR_TAB(*s))
1500         s++;
1501     if (strnEQ(s, "line", 4))
1502         s += 4;
1503     else
1504         return;
1505     if (SPACE_OR_TAB(*s))
1506         s++;
1507     else
1508         return;
1509     while (SPACE_OR_TAB(*s))
1510         s++;
1511     if (!isDIGIT(*s))
1512         return;
1513
1514     n = s;
1515     while (isDIGIT(*s))
1516         s++;
1517     if (!SPACE_OR_TAB(*s) && *s != '\r' && *s != '\n' && *s != '\0')
1518         return;
1519     while (SPACE_OR_TAB(*s))
1520         s++;
1521     if (*s == '"' && (t = strchr(s+1, '"'))) {
1522         s++;
1523         e = t + 1;
1524     }
1525     else {
1526         t = s;
1527         while (!isSPACE(*t))
1528             t++;
1529         e = t;
1530     }
1531     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
1532         e++;
1533     if (*e != '\n' && *e != '\0')
1534         return;         /* false alarm */
1535
1536     if (t - s > 0) {
1537         const STRLEN len = t - s;
1538 #ifndef USE_ITHREADS
1539         SV *const temp_sv = CopFILESV(PL_curcop);
1540         const char *cf;
1541         STRLEN tmplen;
1542
1543         if (temp_sv) {
1544             cf = SvPVX(temp_sv);
1545             tmplen = SvCUR(temp_sv);
1546         } else {
1547             cf = NULL;
1548             tmplen = 0;
1549         }
1550
1551         if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
1552             /* must copy *{"::_<(eval N)[oldfilename:L]"}
1553              * to *{"::_<newfilename"} */
1554             /* However, the long form of evals is only turned on by the
1555                debugger - usually they're "(eval %lu)" */
1556             char smallbuf[128];
1557             char *tmpbuf;
1558             GV **gvp;
1559             STRLEN tmplen2 = len;
1560             if (tmplen + 2 <= sizeof smallbuf)
1561                 tmpbuf = smallbuf;
1562             else
1563                 Newx(tmpbuf, tmplen + 2, char);
1564             tmpbuf[0] = '_';
1565             tmpbuf[1] = '<';
1566             memcpy(tmpbuf + 2, cf, tmplen);
1567             tmplen += 2;
1568             gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
1569             if (gvp) {
1570                 char *tmpbuf2;
1571                 GV *gv2;
1572
1573                 if (tmplen2 + 2 <= sizeof smallbuf)
1574                     tmpbuf2 = smallbuf;
1575                 else
1576                     Newx(tmpbuf2, tmplen2 + 2, char);
1577
1578                 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
1579                     /* Either they malloc'd it, or we malloc'd it,
1580                        so no prefix is present in ours.  */
1581                     tmpbuf2[0] = '_';
1582                     tmpbuf2[1] = '<';
1583                 }
1584
1585                 memcpy(tmpbuf2 + 2, s, tmplen2);
1586                 tmplen2 += 2;
1587
1588                 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
1589                 if (!isGV(gv2)) {
1590                     gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
1591                     /* adjust ${"::_<newfilename"} to store the new file name */
1592                     GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
1593                     GvHV(gv2) = MUTABLE_HV(SvREFCNT_inc(GvHV(*gvp)));
1594                     GvAV(gv2) = MUTABLE_AV(SvREFCNT_inc(GvAV(*gvp)));
1595                 }
1596
1597                 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
1598             }
1599             if (tmpbuf != smallbuf) Safefree(tmpbuf);
1600         }
1601 #endif
1602         CopFILE_free(PL_curcop);
1603         CopFILE_setn(PL_curcop, s, len);
1604     }
1605     CopLINE_set(PL_curcop, atoi(n)-1);
1606 }
1607
1608 #ifdef PERL_MAD
1609 /* skip space before PL_thistoken */
1610
1611 STATIC char *
1612 S_skipspace0(pTHX_ register char *s)
1613 {
1614     PERL_ARGS_ASSERT_SKIPSPACE0;
1615
1616     s = skipspace(s);
1617     if (!PL_madskills)
1618         return s;
1619     if (PL_skipwhite) {
1620         if (!PL_thiswhite)
1621             PL_thiswhite = newSVpvs("");
1622         sv_catsv(PL_thiswhite, PL_skipwhite);
1623         sv_free(PL_skipwhite);
1624         PL_skipwhite = 0;
1625     }
1626     PL_realtokenstart = s - SvPVX(PL_linestr);
1627     return s;
1628 }
1629
1630 /* skip space after PL_thistoken */
1631
1632 STATIC char *
1633 S_skipspace1(pTHX_ register char *s)
1634 {
1635     const char *start = s;
1636     I32 startoff = start - SvPVX(PL_linestr);
1637
1638     PERL_ARGS_ASSERT_SKIPSPACE1;
1639
1640     s = skipspace(s);
1641     if (!PL_madskills)
1642         return s;
1643     start = SvPVX(PL_linestr) + startoff;
1644     if (!PL_thistoken && PL_realtokenstart >= 0) {
1645         const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1646         PL_thistoken = newSVpvn(tstart, start - tstart);
1647     }
1648     PL_realtokenstart = -1;
1649     if (PL_skipwhite) {
1650         if (!PL_nextwhite)
1651             PL_nextwhite = newSVpvs("");
1652         sv_catsv(PL_nextwhite, PL_skipwhite);
1653         sv_free(PL_skipwhite);
1654         PL_skipwhite = 0;
1655     }
1656     return s;
1657 }
1658
1659 STATIC char *
1660 S_skipspace2(pTHX_ register char *s, SV **svp)
1661 {
1662     char *start;
1663     const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
1664     const I32 startoff = s - SvPVX(PL_linestr);
1665
1666     PERL_ARGS_ASSERT_SKIPSPACE2;
1667
1668     s = skipspace(s);
1669     PL_bufptr = SvPVX(PL_linestr) + bufptroff;
1670     if (!PL_madskills || !svp)
1671         return s;
1672     start = SvPVX(PL_linestr) + startoff;
1673     if (!PL_thistoken && PL_realtokenstart >= 0) {
1674         char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1675         PL_thistoken = newSVpvn(tstart, start - tstart);
1676         PL_realtokenstart = -1;
1677     }
1678     if (PL_skipwhite) {
1679         if (!*svp)
1680             *svp = newSVpvs("");
1681         sv_setsv(*svp, PL_skipwhite);
1682         sv_free(PL_skipwhite);
1683         PL_skipwhite = 0;
1684     }
1685     
1686     return s;
1687 }
1688 #endif
1689
1690 STATIC void
1691 S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
1692 {
1693     AV *av = CopFILEAVx(PL_curcop);
1694     if (av) {
1695         SV * const sv = newSV_type(SVt_PVMG);
1696         if (orig_sv)
1697             sv_setsv(sv, orig_sv);
1698         else
1699             sv_setpvn(sv, buf, len);
1700         (void)SvIOK_on(sv);
1701         SvIV_set(sv, 0);
1702         av_store(av, (I32)CopLINE(PL_curcop), sv);
1703     }
1704 }
1705
1706 /*
1707  * S_skipspace
1708  * Called to gobble the appropriate amount and type of whitespace.
1709  * Skips comments as well.
1710  */
1711
1712 STATIC char *
1713 S_skipspace(pTHX_ register char *s)
1714 {
1715 #ifdef PERL_MAD
1716     char *start = s;
1717 #endif /* PERL_MAD */
1718     PERL_ARGS_ASSERT_SKIPSPACE;
1719 #ifdef PERL_MAD
1720     if (PL_skipwhite) {
1721         sv_free(PL_skipwhite);
1722         PL_skipwhite = NULL;
1723     }
1724 #endif /* PERL_MAD */
1725     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
1726         while (s < PL_bufend && SPACE_OR_TAB(*s))
1727             s++;
1728     } else {
1729         STRLEN bufptr_pos = PL_bufptr - SvPVX(PL_linestr);
1730         PL_bufptr = s;
1731         lex_read_space(LEX_KEEP_PREVIOUS |
1732                 (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE ?
1733                     LEX_NO_NEXT_CHUNK : 0));
1734         s = PL_bufptr;
1735         PL_bufptr = SvPVX(PL_linestr) + bufptr_pos;
1736         if (PL_linestart > PL_bufptr)
1737             PL_bufptr = PL_linestart;
1738         return s;
1739     }
1740 #ifdef PERL_MAD
1741     if (PL_madskills)
1742         PL_skipwhite = newSVpvn(start, s-start);
1743 #endif /* PERL_MAD */
1744     return s;
1745 }
1746
1747 /*
1748  * S_check_uni
1749  * Check the unary operators to ensure there's no ambiguity in how they're
1750  * used.  An ambiguous piece of code would be:
1751  *     rand + 5
1752  * This doesn't mean rand() + 5.  Because rand() is a unary operator,
1753  * the +5 is its argument.
1754  */
1755
1756 STATIC void
1757 S_check_uni(pTHX)
1758 {
1759     dVAR;
1760     const char *s;
1761     const char *t;
1762
1763     if (PL_oldoldbufptr != PL_last_uni)
1764         return;
1765     while (isSPACE(*PL_last_uni))
1766         PL_last_uni++;
1767     s = PL_last_uni;
1768     while (isALNUM_lazy_if(s,UTF) || *s == '-')
1769         s++;
1770     if ((t = strchr(s, '(')) && t < PL_bufptr)
1771         return;
1772
1773     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
1774                      "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1775                      (int)(s - PL_last_uni), PL_last_uni);
1776 }
1777
1778 /*
1779  * LOP : macro to build a list operator.  Its behaviour has been replaced
1780  * with a subroutine, S_lop() for which LOP is just another name.
1781  */
1782
1783 #define LOP(f,x) return lop(f,x,s)
1784
1785 /*
1786  * S_lop
1787  * Build a list operator (or something that might be one).  The rules:
1788  *  - if we have a next token, then it's a list operator [why?]
1789  *  - if the next thing is an opening paren, then it's a function
1790  *  - else it's a list operator
1791  */
1792
1793 STATIC I32
1794 S_lop(pTHX_ I32 f, int x, char *s)
1795 {
1796     dVAR;
1797
1798     PERL_ARGS_ASSERT_LOP;
1799
1800     pl_yylval.ival = f;
1801     CLINE;
1802     PL_expect = x;
1803     PL_bufptr = s;
1804     PL_last_lop = PL_oldbufptr;
1805     PL_last_lop_op = (OPCODE)f;
1806 #ifdef PERL_MAD
1807     if (PL_lasttoke)
1808         return REPORT(LSTOP);
1809 #else
1810     if (PL_nexttoke)
1811         return REPORT(LSTOP);
1812 #endif
1813     if (*s == '(')
1814         return REPORT(FUNC);
1815     s = PEEKSPACE(s);
1816     if (*s == '(')
1817         return REPORT(FUNC);
1818     else
1819         return REPORT(LSTOP);
1820 }
1821
1822 #ifdef PERL_MAD
1823  /*
1824  * S_start_force
1825  * Sets up for an eventual force_next().  start_force(0) basically does
1826  * an unshift, while start_force(-1) does a push.  yylex removes items
1827  * on the "pop" end.
1828  */
1829
1830 STATIC void
1831 S_start_force(pTHX_ int where)
1832 {
1833     int i;
1834
1835     if (where < 0)      /* so people can duplicate start_force(PL_curforce) */
1836         where = PL_lasttoke;
1837     assert(PL_curforce < 0 || PL_curforce == where);
1838     if (PL_curforce != where) {
1839         for (i = PL_lasttoke; i > where; --i) {
1840             PL_nexttoke[i] = PL_nexttoke[i-1];
1841         }
1842         PL_lasttoke++;
1843     }
1844     if (PL_curforce < 0)        /* in case of duplicate start_force() */
1845         Zero(&PL_nexttoke[where], 1, NEXTTOKE);
1846     PL_curforce = where;
1847     if (PL_nextwhite) {
1848         if (PL_madskills)
1849             curmad('^', newSVpvs(""));
1850         CURMAD('_', PL_nextwhite);
1851     }
1852 }
1853
1854 STATIC void
1855 S_curmad(pTHX_ char slot, SV *sv)
1856 {
1857     MADPROP **where;
1858
1859     if (!sv)
1860         return;
1861     if (PL_curforce < 0)
1862         where = &PL_thismad;
1863     else
1864         where = &PL_nexttoke[PL_curforce].next_mad;
1865
1866     if (PL_faketokens)
1867         sv_setpvs(sv, "");
1868     else {
1869         if (!IN_BYTES) {
1870             if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1871                 SvUTF8_on(sv);
1872             else if (PL_encoding) {
1873                 sv_recode_to_utf8(sv, PL_encoding);
1874             }
1875         }
1876     }
1877
1878     /* keep a slot open for the head of the list? */
1879     if (slot != '_' && *where && (*where)->mad_key == '^') {
1880         (*where)->mad_key = slot;
1881         sv_free(MUTABLE_SV(((*where)->mad_val)));
1882         (*where)->mad_val = (void*)sv;
1883     }
1884     else
1885         addmad(newMADsv(slot, sv), where, 0);
1886 }
1887 #else
1888 #  define start_force(where)    NOOP
1889 #  define curmad(slot, sv)      NOOP
1890 #endif
1891
1892 /*
1893  * S_force_next
1894  * When the lexer realizes it knows the next token (for instance,
1895  * it is reordering tokens for the parser) then it can call S_force_next
1896  * to know what token to return the next time the lexer is called.  Caller
1897  * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1898  * and possibly PL_expect to ensure the lexer handles the token correctly.
1899  */
1900
1901 STATIC void
1902 S_force_next(pTHX_ I32 type)
1903 {
1904     dVAR;
1905 #ifdef DEBUGGING
1906     if (DEBUG_T_TEST) {
1907         PerlIO_printf(Perl_debug_log, "### forced token:\n");
1908         tokereport(type, &NEXTVAL_NEXTTOKE);
1909     }
1910 #endif
1911 #ifdef PERL_MAD
1912     if (PL_curforce < 0)
1913         start_force(PL_lasttoke);
1914     PL_nexttoke[PL_curforce].next_type = type;
1915     if (PL_lex_state != LEX_KNOWNEXT)
1916         PL_lex_defer = PL_lex_state;
1917     PL_lex_state = LEX_KNOWNEXT;
1918     PL_lex_expect = PL_expect;
1919     PL_curforce = -1;
1920 #else
1921     PL_nexttype[PL_nexttoke] = type;
1922     PL_nexttoke++;
1923     if (PL_lex_state != LEX_KNOWNEXT) {
1924         PL_lex_defer = PL_lex_state;
1925         PL_lex_expect = PL_expect;
1926         PL_lex_state = LEX_KNOWNEXT;
1927     }
1928 #endif
1929 }
1930
1931 STATIC SV *
1932 S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
1933 {
1934     dVAR;
1935     SV * const sv = newSVpvn_utf8(start, len,
1936                                   !IN_BYTES
1937                                   && UTF
1938                                   && !is_ascii_string((const U8*)start, len)
1939                                   && is_utf8_string((const U8*)start, len));
1940     return sv;
1941 }
1942
1943 /*
1944  * S_force_word
1945  * When the lexer knows the next thing is a word (for instance, it has
1946  * just seen -> and it knows that the next char is a word char, then
1947  * it calls S_force_word to stick the next word into the PL_nexttoke/val
1948  * lookahead.
1949  *
1950  * Arguments:
1951  *   char *start : buffer position (must be within PL_linestr)
1952  *   int token   : PL_next* will be this type of bare word (e.g., METHOD,WORD)
1953  *   int check_keyword : if true, Perl checks to make sure the word isn't
1954  *       a keyword (do this if the word is a label, e.g. goto FOO)
1955  *   int allow_pack : if true, : characters will also be allowed (require,
1956  *       use, etc. do this)
1957  *   int allow_initial_tick : used by the "sub" lexer only.
1958  */
1959
1960 STATIC char *
1961 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
1962 {
1963     dVAR;
1964     register char *s;
1965     STRLEN len;
1966
1967     PERL_ARGS_ASSERT_FORCE_WORD;
1968
1969     start = SKIPSPACE1(start);
1970     s = start;
1971     if (isIDFIRST_lazy_if(s,UTF) ||
1972         (allow_pack && *s == ':') ||
1973         (allow_initial_tick && *s == '\'') )
1974     {
1975         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
1976         if (check_keyword && keyword(PL_tokenbuf, len, 0))
1977             return start;
1978         start_force(PL_curforce);
1979         if (PL_madskills)
1980             curmad('X', newSVpvn(start,s-start));
1981         if (token == METHOD) {
1982             s = SKIPSPACE1(s);
1983             if (*s == '(')
1984                 PL_expect = XTERM;
1985             else {
1986                 PL_expect = XOPERATOR;
1987             }
1988         }
1989         if (PL_madskills)
1990             curmad('g', newSVpvs( "forced" ));
1991         NEXTVAL_NEXTTOKE.opval
1992             = (OP*)newSVOP(OP_CONST,0,
1993                            S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
1994         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
1995         force_next(token);
1996     }
1997     return s;
1998 }
1999
2000 /*
2001  * S_force_ident
2002  * Called when the lexer wants $foo *foo &foo etc, but the program
2003  * text only contains the "foo" portion.  The first argument is a pointer
2004  * to the "foo", and the second argument is the type symbol to prefix.
2005  * Forces the next token to be a "WORD".
2006  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
2007  */
2008
2009 STATIC void
2010 S_force_ident(pTHX_ register const char *s, int kind)
2011 {
2012     dVAR;
2013
2014     PERL_ARGS_ASSERT_FORCE_IDENT;
2015
2016     if (*s) {
2017         const STRLEN len = strlen(s);
2018         OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
2019         start_force(PL_curforce);
2020         NEXTVAL_NEXTTOKE.opval = o;
2021         force_next(WORD);
2022         if (kind) {
2023             o->op_private = OPpCONST_ENTERED;
2024             /* XXX see note in pp_entereval() for why we forgo typo
2025                warnings if the symbol must be introduced in an eval.
2026                GSAR 96-10-12 */
2027             gv_fetchpvn_flags(s, len,
2028                               PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
2029                               : GV_ADD,
2030                               kind == '$' ? SVt_PV :
2031                               kind == '@' ? SVt_PVAV :
2032                               kind == '%' ? SVt_PVHV :
2033                               SVt_PVGV
2034                               );
2035         }
2036     }
2037 }
2038
2039 NV
2040 Perl_str_to_version(pTHX_ SV *sv)
2041 {
2042     NV retval = 0.0;
2043     NV nshift = 1.0;
2044     STRLEN len;
2045     const char *start = SvPV_const(sv,len);
2046     const char * const end = start + len;
2047     const bool utf = SvUTF8(sv) ? TRUE : FALSE;
2048
2049     PERL_ARGS_ASSERT_STR_TO_VERSION;
2050
2051     while (start < end) {
2052         STRLEN skip;
2053         UV n;
2054         if (utf)
2055             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
2056         else {
2057             n = *(U8*)start;
2058             skip = 1;
2059         }
2060         retval += ((NV)n)/nshift;
2061         start += skip;
2062         nshift *= 1000;
2063     }
2064     return retval;
2065 }
2066
2067 /*
2068  * S_force_version
2069  * Forces the next token to be a version number.
2070  * If the next token appears to be an invalid version number, (e.g. "v2b"),
2071  * and if "guessing" is TRUE, then no new token is created (and the caller
2072  * must use an alternative parsing method).
2073  */
2074
2075 STATIC char *
2076 S_force_version(pTHX_ char *s, int guessing)
2077 {
2078     dVAR;
2079     OP *version = NULL;
2080     char *d;
2081 #ifdef PERL_MAD
2082     I32 startoff = s - SvPVX(PL_linestr);
2083 #endif
2084
2085     PERL_ARGS_ASSERT_FORCE_VERSION;
2086
2087     s = SKIPSPACE1(s);
2088
2089     d = s;
2090     if (*d == 'v')
2091         d++;
2092     if (isDIGIT(*d)) {
2093         while (isDIGIT(*d) || *d == '_' || *d == '.')
2094             d++;
2095 #ifdef PERL_MAD
2096         if (PL_madskills) {
2097             start_force(PL_curforce);
2098             curmad('X', newSVpvn(s,d-s));
2099         }
2100 #endif
2101         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
2102             SV *ver;
2103 #ifdef USE_LOCALE_NUMERIC
2104             char *loc = setlocale(LC_NUMERIC, "C");
2105 #endif
2106             s = scan_num(s, &pl_yylval);
2107 #ifdef USE_LOCALE_NUMERIC
2108             setlocale(LC_NUMERIC, loc);
2109 #endif
2110             version = pl_yylval.opval;
2111             ver = cSVOPx(version)->op_sv;
2112             if (SvPOK(ver) && !SvNIOK(ver)) {
2113                 SvUPGRADE(ver, SVt_PVNV);
2114                 SvNV_set(ver, str_to_version(ver));
2115                 SvNOK_on(ver);          /* hint that it is a version */
2116             }
2117         }
2118         else if (guessing) {
2119 #ifdef PERL_MAD
2120             if (PL_madskills) {
2121                 sv_free(PL_nextwhite);  /* let next token collect whitespace */
2122                 PL_nextwhite = 0;
2123                 s = SvPVX(PL_linestr) + startoff;
2124             }
2125 #endif
2126             return s;
2127         }
2128     }
2129
2130 #ifdef PERL_MAD
2131     if (PL_madskills && !version) {
2132         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2133         PL_nextwhite = 0;
2134         s = SvPVX(PL_linestr) + startoff;
2135     }
2136 #endif
2137     /* NOTE: The parser sees the package name and the VERSION swapped */
2138     start_force(PL_curforce);
2139     NEXTVAL_NEXTTOKE.opval = version;
2140     force_next(WORD);
2141
2142     return s;
2143 }
2144
2145 /*
2146  * S_force_strict_version
2147  * Forces the next token to be a version number using strict syntax rules.
2148  */
2149
2150 STATIC char *
2151 S_force_strict_version(pTHX_ char *s)
2152 {
2153     dVAR;
2154     OP *version = NULL;
2155 #ifdef PERL_MAD
2156     I32 startoff = s - SvPVX(PL_linestr);
2157 #endif
2158     const char *errstr = NULL;
2159
2160     PERL_ARGS_ASSERT_FORCE_STRICT_VERSION;
2161
2162     while (isSPACE(*s)) /* leading whitespace */
2163         s++;
2164
2165     if (is_STRICT_VERSION(s,&errstr)) {
2166         SV *ver = newSV(0);
2167         s = (char *)scan_version(s, ver, 0);
2168         version = newSVOP(OP_CONST, 0, ver);
2169     }
2170     else if ( (*s != ';' && *s != '}' ) && (s = SKIPSPACE1(s), (*s != ';' && *s !='}' ))) {
2171         PL_bufptr = s;
2172         if (errstr)
2173             yyerror(errstr); /* version required */
2174         return s;
2175     }
2176
2177 #ifdef PERL_MAD
2178     if (PL_madskills && !version) {
2179         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2180         PL_nextwhite = 0;
2181         s = SvPVX(PL_linestr) + startoff;
2182     }
2183 #endif
2184     /* NOTE: The parser sees the package name and the VERSION swapped */
2185     start_force(PL_curforce);
2186     NEXTVAL_NEXTTOKE.opval = version;
2187     force_next(WORD);
2188
2189     return s;
2190 }
2191
2192 /*
2193  * S_tokeq
2194  * Tokenize a quoted string passed in as an SV.  It finds the next
2195  * chunk, up to end of string or a backslash.  It may make a new
2196  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
2197  * turns \\ into \.
2198  */
2199
2200 STATIC SV *
2201 S_tokeq(pTHX_ SV *sv)
2202 {
2203     dVAR;
2204     register char *s;
2205     register char *send;
2206     register char *d;
2207     STRLEN len = 0;
2208     SV *pv = sv;
2209
2210     PERL_ARGS_ASSERT_TOKEQ;
2211
2212     if (!SvLEN(sv))
2213         goto finish;
2214
2215     s = SvPV_force(sv, len);
2216     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
2217         goto finish;
2218     send = s + len;
2219     while (s < send && *s != '\\')
2220         s++;
2221     if (s == send)
2222         goto finish;
2223     d = s;
2224     if ( PL_hints & HINT_NEW_STRING ) {
2225         pv = newSVpvn_flags(SvPVX_const(pv), len, SVs_TEMP | SvUTF8(sv));
2226     }
2227     while (s < send) {
2228         if (*s == '\\') {
2229             if (s + 1 < send && (s[1] == '\\'))
2230                 s++;            /* all that, just for this */
2231         }
2232         *d++ = *s++;
2233     }
2234     *d = '\0';
2235     SvCUR_set(sv, d - SvPVX_const(sv));
2236   finish:
2237     if ( PL_hints & HINT_NEW_STRING )
2238        return new_constant(NULL, 0, "q", sv, pv, "q", 1);
2239     return sv;
2240 }
2241
2242 /*
2243  * Now come three functions related to double-quote context,
2244  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
2245  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
2246  * interact with PL_lex_state, and create fake ( ... ) argument lists
2247  * to handle functions and concatenation.
2248  * They assume that whoever calls them will be setting up a fake
2249  * join call, because each subthing puts a ',' after it.  This lets
2250  *   "lower \luPpEr"
2251  * become
2252  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
2253  *
2254  * (I'm not sure whether the spurious commas at the end of lcfirst's
2255  * arguments and join's arguments are created or not).
2256  */
2257
2258 /*
2259  * S_sublex_start
2260  * Assumes that pl_yylval.ival is the op we're creating (e.g. OP_LCFIRST).
2261  *
2262  * Pattern matching will set PL_lex_op to the pattern-matching op to
2263  * make (we return THING if pl_yylval.ival is OP_NULL, PMFUNC otherwise).
2264  *
2265  * OP_CONST and OP_READLINE are easy--just make the new op and return.
2266  *
2267  * Everything else becomes a FUNC.
2268  *
2269  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
2270  * had an OP_CONST or OP_READLINE).  This just sets us up for a
2271  * call to S_sublex_push().
2272  */
2273
2274 STATIC I32
2275 S_sublex_start(pTHX)
2276 {
2277     dVAR;
2278     register const I32 op_type = pl_yylval.ival;
2279
2280     if (op_type == OP_NULL) {
2281         pl_yylval.opval = PL_lex_op;
2282         PL_lex_op = NULL;
2283         return THING;
2284     }
2285     if (op_type == OP_CONST || op_type == OP_READLINE) {
2286         SV *sv = tokeq(PL_lex_stuff);
2287
2288         if (SvTYPE(sv) == SVt_PVIV) {
2289             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
2290             STRLEN len;
2291             const char * const p = SvPV_const(sv, len);
2292             SV * const nsv = newSVpvn_flags(p, len, SvUTF8(sv));
2293             SvREFCNT_dec(sv);
2294             sv = nsv;
2295         }
2296         pl_yylval.opval = (OP*)newSVOP(op_type, 0, sv);
2297         PL_lex_stuff = NULL;
2298         /* Allow <FH> // "foo" */
2299         if (op_type == OP_READLINE)
2300             PL_expect = XTERMORDORDOR;
2301         return THING;
2302     }
2303     else if (op_type == OP_BACKTICK && PL_lex_op) {
2304         /* readpipe() vas overriden */
2305         cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
2306         pl_yylval.opval = PL_lex_op;
2307         PL_lex_op = NULL;
2308         PL_lex_stuff = NULL;
2309         return THING;
2310     }
2311
2312     PL_sublex_info.super_state = PL_lex_state;
2313     PL_sublex_info.sub_inwhat = (U16)op_type;
2314     PL_sublex_info.sub_op = PL_lex_op;
2315     PL_lex_state = LEX_INTERPPUSH;
2316
2317     PL_expect = XTERM;
2318     if (PL_lex_op) {
2319         pl_yylval.opval = PL_lex_op;
2320         PL_lex_op = NULL;
2321         return PMFUNC;
2322     }
2323     else
2324         return FUNC;
2325 }
2326
2327 /*
2328  * S_sublex_push
2329  * Create a new scope to save the lexing state.  The scope will be
2330  * ended in S_sublex_done.  Returns a '(', starting the function arguments
2331  * to the uc, lc, etc. found before.
2332  * Sets PL_lex_state to LEX_INTERPCONCAT.
2333  */
2334
2335 STATIC I32
2336 S_sublex_push(pTHX)
2337 {
2338     dVAR;
2339     ENTER;
2340
2341     PL_lex_state = PL_sublex_info.super_state;
2342     SAVEBOOL(PL_lex_dojoin);
2343     SAVEI32(PL_lex_brackets);
2344     SAVEI32(PL_lex_casemods);
2345     SAVEI32(PL_lex_starts);
2346     SAVEI8(PL_lex_state);
2347     SAVEVPTR(PL_lex_inpat);
2348     SAVEI16(PL_lex_inwhat);
2349     SAVECOPLINE(PL_curcop);
2350     SAVEPPTR(PL_bufptr);
2351     SAVEPPTR(PL_bufend);
2352     SAVEPPTR(PL_oldbufptr);
2353     SAVEPPTR(PL_oldoldbufptr);
2354     SAVEPPTR(PL_last_lop);
2355     SAVEPPTR(PL_last_uni);
2356     SAVEPPTR(PL_linestart);
2357     SAVESPTR(PL_linestr);
2358     SAVEGENERICPV(PL_lex_brackstack);
2359     SAVEGENERICPV(PL_lex_casestack);
2360
2361     PL_linestr = PL_lex_stuff;
2362     PL_lex_stuff = NULL;
2363
2364     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
2365         = SvPVX(PL_linestr);
2366     PL_bufend += SvCUR(PL_linestr);
2367     PL_last_lop = PL_last_uni = NULL;
2368     SAVEFREESV(PL_linestr);
2369
2370     PL_lex_dojoin = FALSE;
2371     PL_lex_brackets = 0;
2372     Newx(PL_lex_brackstack, 120, char);
2373     Newx(PL_lex_casestack, 12, char);
2374     PL_lex_casemods = 0;
2375     *PL_lex_casestack = '\0';
2376     PL_lex_starts = 0;
2377     PL_lex_state = LEX_INTERPCONCAT;
2378     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
2379
2380     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
2381     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
2382         PL_lex_inpat = PL_sublex_info.sub_op;
2383     else
2384         PL_lex_inpat = NULL;
2385
2386     return '(';
2387 }
2388
2389 /*
2390  * S_sublex_done
2391  * Restores lexer state after a S_sublex_push.
2392  */
2393
2394 STATIC I32
2395 S_sublex_done(pTHX)
2396 {
2397     dVAR;
2398     if (!PL_lex_starts++) {
2399         SV * const sv = newSVpvs("");
2400         if (SvUTF8(PL_linestr))
2401             SvUTF8_on(sv);
2402         PL_expect = XOPERATOR;
2403         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2404         return THING;
2405     }
2406
2407     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
2408         PL_lex_state = LEX_INTERPCASEMOD;
2409         return yylex();
2410     }
2411
2412     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
2413     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
2414         PL_linestr = PL_lex_repl;
2415         PL_lex_inpat = 0;
2416         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
2417         PL_bufend += SvCUR(PL_linestr);
2418         PL_last_lop = PL_last_uni = NULL;
2419         SAVEFREESV(PL_linestr);
2420         PL_lex_dojoin = FALSE;
2421         PL_lex_brackets = 0;
2422         PL_lex_casemods = 0;
2423         *PL_lex_casestack = '\0';
2424         PL_lex_starts = 0;
2425         if (SvEVALED(PL_lex_repl)) {
2426             PL_lex_state = LEX_INTERPNORMAL;
2427             PL_lex_starts++;
2428             /*  we don't clear PL_lex_repl here, so that we can check later
2429                 whether this is an evalled subst; that means we rely on the
2430                 logic to ensure sublex_done() is called again only via the
2431                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
2432         }
2433         else {
2434             PL_lex_state = LEX_INTERPCONCAT;
2435             PL_lex_repl = NULL;
2436         }
2437         return ',';
2438     }
2439     else {
2440 #ifdef PERL_MAD
2441         if (PL_madskills) {
2442             if (PL_thiswhite) {
2443                 if (!PL_endwhite)
2444                     PL_endwhite = newSVpvs("");
2445                 sv_catsv(PL_endwhite, PL_thiswhite);
2446                 PL_thiswhite = 0;
2447             }
2448             if (PL_thistoken)
2449                 sv_setpvs(PL_thistoken,"");
2450             else
2451                 PL_realtokenstart = -1;
2452         }
2453 #endif
2454         LEAVE;
2455         PL_bufend = SvPVX(PL_linestr);
2456         PL_bufend += SvCUR(PL_linestr);
2457         PL_expect = XOPERATOR;
2458         PL_sublex_info.sub_inwhat = 0;
2459         return ')';
2460     }
2461 }
2462
2463 /*
2464   scan_const
2465
2466   Extracts a pattern, double-quoted string, or transliteration.  This
2467   is terrifying code.
2468
2469   It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
2470   processing a pattern (PL_lex_inpat is true), a transliteration
2471   (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
2472
2473   Returns a pointer to the character scanned up to. If this is
2474   advanced from the start pointer supplied (i.e. if anything was
2475   successfully parsed), will leave an OP for the substring scanned
2476   in pl_yylval. Caller must intuit reason for not parsing further
2477   by looking at the next characters herself.
2478
2479   In patterns:
2480     backslashes:
2481       constants: \N{NAME} only
2482       case and quoting: \U \Q \E
2483     stops on @ and $, but not for $ as tail anchor
2484
2485   In transliterations:
2486     characters are VERY literal, except for - not at the start or end
2487     of the string, which indicates a range. If the range is in bytes,
2488     scan_const expands the range to the full set of intermediate
2489     characters. If the range is in utf8, the hyphen is replaced with
2490     a certain range mark which will be handled by pmtrans() in op.c.
2491
2492   In double-quoted strings:
2493     backslashes:
2494       double-quoted style: \r and \n
2495       constants: \x31, etc.
2496       deprecated backrefs: \1 (in substitution replacements)
2497       case and quoting: \U \Q \E
2498     stops on @ and $
2499
2500   scan_const does *not* construct ops to handle interpolated strings.
2501   It stops processing as soon as it finds an embedded $ or @ variable
2502   and leaves it to the caller to work out what's going on.
2503
2504   embedded arrays (whether in pattern or not) could be:
2505       @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
2506
2507   $ in double-quoted strings must be the symbol of an embedded scalar.
2508
2509   $ in pattern could be $foo or could be tail anchor.  Assumption:
2510   it's a tail anchor if $ is the last thing in the string, or if it's
2511   followed by one of "()| \r\n\t"
2512
2513   \1 (backreferences) are turned into $1
2514
2515   The structure of the code is
2516       while (there's a character to process) {
2517           handle transliteration ranges
2518           skip regexp comments /(?#comment)/ and codes /(?{code})/
2519           skip #-initiated comments in //x patterns
2520           check for embedded arrays
2521           check for embedded scalars
2522           if (backslash) {
2523               deprecate \1 in substitution replacements
2524               handle string-changing backslashes \l \U \Q \E, etc.
2525               switch (what was escaped) {
2526                   handle \- in a transliteration (becomes a literal -)
2527                   if a pattern and not \N{, go treat as regular character
2528                   handle \132 (octal characters)
2529                   handle \x15 and \x{1234} (hex characters)
2530                   handle \N{name} (named characters, also \N{3,5} in a pattern)
2531                   handle \cV (control characters)
2532                   handle printf-style backslashes (\f, \r, \n, etc)
2533               } (end switch)
2534               continue
2535           } (end if backslash)
2536           handle regular character
2537     } (end while character to read)
2538                 
2539 */
2540
2541 STATIC char *
2542 S_scan_const(pTHX_ char *start)
2543 {
2544     dVAR;
2545     register char *send = PL_bufend;            /* end of the constant */
2546     SV *sv = newSV(send - start);               /* sv for the constant.  See
2547                                                    note below on sizing. */
2548     register char *s = start;                   /* start of the constant */
2549     register char *d = SvPVX(sv);               /* destination for copies */
2550     bool dorange = FALSE;                       /* are we in a translit range? */
2551     bool didrange = FALSE;                      /* did we just finish a range? */
2552     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
2553     I32  this_utf8 = UTF;                       /* Is the source string assumed
2554                                                    to be UTF8?  But, this can
2555                                                    show as true when the source
2556                                                    isn't utf8, as for example
2557                                                    when it is entirely composed
2558                                                    of hex constants */
2559
2560     /* Note on sizing:  The scanned constant is placed into sv, which is
2561      * initialized by newSV() assuming one byte of output for every byte of
2562      * input.  This routine expects newSV() to allocate an extra byte for a
2563      * trailing NUL, which this routine will append if it gets to the end of
2564      * the input.  There may be more bytes of input than output (eg., \N{LATIN
2565      * CAPITAL LETTER A}), or more output than input if the constant ends up
2566      * recoded to utf8, but each time a construct is found that might increase
2567      * the needed size, SvGROW() is called.  Its size parameter each time is
2568      * based on the best guess estimate at the time, namely the length used so
2569      * far, plus the length the current construct will occupy, plus room for
2570      * the trailing NUL, plus one byte for every input byte still unscanned */ 
2571
2572     UV uv;
2573 #ifdef EBCDIC
2574     UV literal_endpoint = 0;
2575     bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
2576 #endif
2577
2578     PERL_ARGS_ASSERT_SCAN_CONST;
2579
2580     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
2581         /* If we are doing a trans and we know we want UTF8 set expectation */
2582         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
2583         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2584     }
2585
2586
2587     while (s < send || dorange) {
2588
2589         /* get transliterations out of the way (they're most literal) */
2590         if (PL_lex_inwhat == OP_TRANS) {
2591             /* expand a range A-Z to the full set of characters.  AIE! */
2592             if (dorange) {
2593                 I32 i;                          /* current expanded character */
2594                 I32 min;                        /* first character in range */
2595                 I32 max;                        /* last character in range */
2596
2597 #ifdef EBCDIC
2598                 UV uvmax = 0;
2599 #endif
2600
2601                 if (has_utf8
2602 #ifdef EBCDIC
2603                     && !native_range
2604 #endif
2605                     ) {
2606                     char * const c = (char*)utf8_hop((U8*)d, -1);
2607                     char *e = d++;
2608                     while (e-- > c)
2609                         *(e + 1) = *e;
2610                     *c = (char)UTF_TO_NATIVE(0xff);
2611                     /* mark the range as done, and continue */
2612                     dorange = FALSE;
2613                     didrange = TRUE;
2614                     continue;
2615                 }
2616
2617                 i = d - SvPVX_const(sv);                /* remember current offset */
2618 #ifdef EBCDIC
2619                 SvGROW(sv,
2620                        SvLEN(sv) + (has_utf8 ?
2621                                     (512 - UTF_CONTINUATION_MARK +
2622                                      UNISKIP(0x100))
2623                                     : 256));
2624                 /* How many two-byte within 0..255: 128 in UTF-8,
2625                  * 96 in UTF-8-mod. */
2626 #else
2627                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
2628 #endif
2629                 d = SvPVX(sv) + i;              /* refresh d after realloc */
2630 #ifdef EBCDIC
2631                 if (has_utf8) {
2632                     int j;
2633                     for (j = 0; j <= 1; j++) {
2634                         char * const c = (char*)utf8_hop((U8*)d, -1);
2635                         const UV uv    = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
2636                         if (j)
2637                             min = (U8)uv;
2638                         else if (uv < 256)
2639                             max = (U8)uv;
2640                         else {
2641                             max = (U8)0xff; /* only to \xff */
2642                             uvmax = uv; /* \x{100} to uvmax */
2643                         }
2644                         d = c; /* eat endpoint chars */
2645                      }
2646                 }
2647                else {
2648 #endif
2649                    d -= 2;              /* eat the first char and the - */
2650                    min = (U8)*d;        /* first char in range */
2651                    max = (U8)d[1];      /* last char in range  */
2652 #ifdef EBCDIC
2653                }
2654 #endif
2655
2656                 if (min > max) {
2657                     Perl_croak(aTHX_
2658                                "Invalid range \"%c-%c\" in transliteration operator",
2659                                (char)min, (char)max);
2660                 }
2661
2662 #ifdef EBCDIC
2663                 if (literal_endpoint == 2 &&
2664                     ((isLOWER(min) && isLOWER(max)) ||
2665                      (isUPPER(min) && isUPPER(max)))) {
2666                     if (isLOWER(min)) {
2667                         for (i = min; i <= max; i++)
2668                             if (isLOWER(i))
2669                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2670                     } else {
2671                         for (i = min; i <= max; i++)
2672                             if (isUPPER(i))
2673                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2674                     }
2675                 }
2676                 else
2677 #endif
2678                     for (i = min; i <= max; i++)
2679 #ifdef EBCDIC
2680                         if (has_utf8) {
2681                             const U8 ch = (U8)NATIVE_TO_UTF(i);
2682                             if (UNI_IS_INVARIANT(ch))
2683                                 *d++ = (U8)i;
2684                             else {
2685                                 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2686                                 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2687                             }
2688                         }
2689                         else
2690 #endif
2691                             *d++ = (char)i;
2692  
2693 #ifdef EBCDIC
2694                 if (uvmax) {
2695                     d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2696                     if (uvmax > 0x101)
2697                         *d++ = (char)UTF_TO_NATIVE(0xff);
2698                     if (uvmax > 0x100)
2699                         d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2700                 }
2701 #endif
2702
2703                 /* mark the range as done, and continue */
2704                 dorange = FALSE;
2705                 didrange = TRUE;
2706 #ifdef EBCDIC
2707                 literal_endpoint = 0;
2708 #endif
2709                 continue;
2710             }
2711
2712             /* range begins (ignore - as first or last char) */
2713             else if (*s == '-' && s+1 < send  && s != start) {
2714                 if (didrange) {
2715                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
2716                 }
2717                 if (has_utf8
2718 #ifdef EBCDIC
2719                     && !native_range
2720 #endif
2721                     ) {
2722                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
2723                     s++;
2724                     continue;
2725                 }
2726                 dorange = TRUE;
2727                 s++;
2728             }
2729             else {
2730                 didrange = FALSE;
2731 #ifdef EBCDIC
2732                 literal_endpoint = 0;
2733                 native_range = TRUE;
2734 #endif
2735             }
2736         }
2737
2738         /* if we get here, we're not doing a transliteration */
2739
2740         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2741            except for the last char, which will be done separately. */
2742         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
2743             if (s[2] == '#') {
2744                 while (s+1 < send && *s != ')')
2745                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2746             }
2747             else if (s[2] == '{' /* This should match regcomp.c */
2748                     || (s[2] == '?' && s[3] == '{'))
2749             {
2750                 I32 count = 1;
2751                 char *regparse = s + (s[2] == '{' ? 3 : 4);
2752                 char c;
2753
2754                 while (count && (c = *regparse)) {
2755                     if (c == '\\' && regparse[1])
2756                         regparse++;
2757                     else if (c == '{')
2758                         count++;
2759                     else if (c == '}')
2760                         count--;
2761                     regparse++;
2762                 }
2763                 if (*regparse != ')')
2764                     regparse--;         /* Leave one char for continuation. */
2765                 while (s < regparse)
2766                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2767             }
2768         }
2769
2770         /* likewise skip #-initiated comments in //x patterns */
2771         else if (*s == '#' && PL_lex_inpat &&
2772           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
2773             while (s+1 < send && *s != '\n')
2774                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2775         }
2776
2777         /* check for embedded arrays
2778            (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
2779            */
2780         else if (*s == '@' && s[1]) {
2781             if (isALNUM_lazy_if(s+1,UTF))
2782                 break;
2783             if (strchr(":'{$", s[1]))
2784                 break;
2785             if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2786                 break; /* in regexp, neither @+ nor @- are interpolated */
2787         }
2788
2789         /* check for embedded scalars.  only stop if we're sure it's a
2790            variable.
2791         */
2792         else if (*s == '$') {
2793             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
2794                 break;
2795             if (s + 1 < send && !strchr("()| \r\n\t", s[1])) {
2796                 if (s[1] == '\\') {
2797                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2798                                    "Possible unintended interpolation of $\\ in regex");
2799                 }
2800                 break;          /* in regexp, $ might be tail anchor */
2801             }
2802         }
2803
2804         /* End of else if chain - OP_TRANS rejoin rest */
2805
2806         /* backslashes */
2807         if (*s == '\\' && s+1 < send) {
2808             char* e;    /* Can be used for ending '}', etc. */
2809
2810             s++;
2811
2812             /* deprecate \1 in strings and substitution replacements */
2813             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
2814                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
2815             {
2816                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
2817                 *--s = '$';
2818                 break;
2819             }
2820
2821             /* string-change backslash escapes */
2822             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
2823                 --s;
2824                 break;
2825             }
2826             /* In a pattern, process \N, but skip any other backslash escapes.
2827              * This is because we don't want to translate an escape sequence
2828              * into a meta symbol and have the regex compiler use the meta
2829              * symbol meaning, e.g. \x{2E} would be confused with a dot.  But
2830              * in spite of this, we do have to process \N here while the proper
2831              * charnames handler is in scope.  See bugs #56444 and #62056.
2832              * There is a complication because \N in a pattern may also stand
2833              * for 'match a non-nl', and not mean a charname, in which case its
2834              * processing should be deferred to the regex compiler.  To be a
2835              * charname it must be followed immediately by a '{', and not look
2836              * like \N followed by a curly quantifier, i.e., not something like
2837              * \N{3,}.  regcurly returns a boolean indicating if it is a legal
2838              * quantifier */
2839             else if (PL_lex_inpat
2840                     && (*s != 'N'
2841                         || s[1] != '{'
2842                         || regcurly(s + 1)))
2843             {
2844                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2845                 goto default_action;
2846             }
2847
2848             switch (*s) {
2849
2850             /* quoted - in transliterations */
2851             case '-':
2852                 if (PL_lex_inwhat == OP_TRANS) {
2853                     *d++ = *s++;
2854                     continue;
2855                 }
2856                 /* FALL THROUGH */
2857             default:
2858                 {
2859                     if ((isALPHA(*s) || isDIGIT(*s)))
2860                         Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2861                                        "Unrecognized escape \\%c passed through",
2862                                        *s);
2863                     /* default action is to copy the quoted character */
2864                     goto default_action;
2865                 }
2866
2867             /* eg. \132 indicates the octal constant 0x132 */
2868             case '0': case '1': case '2': case '3':
2869             case '4': case '5': case '6': case '7':
2870                 {
2871                     I32 flags = 0;
2872                     STRLEN len = 3;
2873                     uv = NATIVE_TO_UNI(grok_oct(s, &len, &flags, NULL));
2874                     s += len;
2875                 }
2876                 goto NUM_ESCAPE_INSERT;
2877
2878             /* eg. \x24 indicates the hex constant 0x24 */
2879             case 'x':
2880                 ++s;
2881                 if (*s == '{') {
2882                     char* const e = strchr(s, '}');
2883                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2884                       PERL_SCAN_DISALLOW_PREFIX;
2885                     STRLEN len;
2886
2887                     ++s;
2888                     if (!e) {
2889                         yyerror("Missing right brace on \\x{}");
2890                         continue;
2891                     }
2892                     len = e - s;
2893                     uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2894                     s = e + 1;
2895                 }
2896                 else {
2897                     {
2898                         STRLEN len = 2;
2899                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
2900                         uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2901                         s += len;
2902                     }
2903                 }
2904
2905               NUM_ESCAPE_INSERT:
2906                 /* Insert oct or hex escaped character.  There will always be
2907                  * enough room in sv since such escapes will be longer than any
2908                  * UTF-8 sequence they can end up as, except if they force us
2909                  * to recode the rest of the string into utf8 */
2910                 
2911                 /* Here uv is the ordinal of the next character being added in
2912                  * unicode (converted from native). */
2913                 if (!UNI_IS_INVARIANT(uv)) {
2914                     if (!has_utf8 && uv > 255) {
2915                         /* Might need to recode whatever we have accumulated so
2916                          * far if it contains any chars variant in utf8 or
2917                          * utf-ebcdic. */
2918                           
2919                         SvCUR_set(sv, d - SvPVX_const(sv));
2920                         SvPOK_on(sv);
2921                         *d = '\0';
2922                         /* See Note on sizing above.  */
2923                         sv_utf8_upgrade_flags_grow(sv,
2924                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2925                                         UNISKIP(uv) + (STRLEN)(send - s) + 1);
2926                         d = SvPVX(sv) + SvCUR(sv);
2927                         has_utf8 = TRUE;
2928                     }
2929
2930                     if (has_utf8) {
2931                         d = (char*)uvuni_to_utf8((U8*)d, uv);
2932                         if (PL_lex_inwhat == OP_TRANS &&
2933                             PL_sublex_info.sub_op) {
2934                             PL_sublex_info.sub_op->op_private |=
2935                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
2936                                              : OPpTRANS_TO_UTF);
2937                         }
2938 #ifdef EBCDIC
2939                         if (uv > 255 && !dorange)
2940                             native_range = FALSE;
2941 #endif
2942                     }
2943                     else {
2944                         *d++ = (char)uv;
2945                     }
2946                 }
2947                 else {
2948                     *d++ = (char) uv;
2949                 }
2950                 continue;
2951
2952             case 'N':
2953                 /* In a non-pattern \N must be a named character, like \N{LATIN
2954                  * SMALL LETTER A} or \N{U+0041}.  For patterns, it also can
2955                  * mean to match a non-newline.  For non-patterns, named
2956                  * characters are converted to their string equivalents. In
2957                  * patterns, named characters are not converted to their
2958                  * ultimate forms for the same reasons that other escapes
2959                  * aren't.  Instead, they are converted to the \N{U+...} form
2960                  * to get the value from the charnames that is in effect right
2961                  * now, while preserving the fact that it was a named character
2962                  * so that the regex compiler knows this */
2963
2964                 /* This section of code doesn't generally use the
2965                  * NATIVE_TO_NEED() macro to transform the input.  I (khw) did
2966                  * a close examination of this macro and determined it is a
2967                  * no-op except on utfebcdic variant characters.  Every
2968                  * character generated by this that would normally need to be
2969                  * enclosed by this macro is invariant, so the macro is not
2970                  * needed, and would complicate use of copy(). There are other
2971                  * parts of this file where the macro is used inconsistently,
2972                  * but are saved by it being a no-op */
2973
2974                 /* The structure of this section of code (besides checking for
2975                  * errors and upgrading to utf8) is:
2976                  *  Further disambiguate between the two meanings of \N, and if
2977                  *      not a charname, go process it elsewhere
2978                  *  If of form \N{U+...}, pass it through if a pattern;
2979                  *      otherwise convert to utf8
2980                  *  Otherwise must be \N{NAME}: convert to \N{U+c1.c2...} if a
2981                  *  pattern; otherwise convert to utf8 */
2982
2983                 /* Here, s points to the 'N'; the test below is guaranteed to
2984                  * succeed if we are being called on a pattern as we already
2985                  * know from a test above that the next character is a '{'.
2986                  * On a non-pattern \N must mean 'named sequence, which
2987                  * requires braces */
2988                 s++;
2989                 if (*s != '{') {
2990                     yyerror("Missing braces on \\N{}"); 
2991                     continue;
2992                 }
2993                 s++;
2994
2995                 /* If there is no matching '}', it is an error. */
2996                 if (! (e = strchr(s, '}'))) {
2997                     if (! PL_lex_inpat) {
2998                         yyerror("Missing right brace on \\N{}");
2999                     } else {
3000                         yyerror("Missing right brace on \\N{} or unescaped left brace after \\N.");
3001                     }
3002                     continue;
3003                 }
3004
3005                 /* Here it looks like a named character */
3006
3007                 if (PL_lex_inpat) {
3008
3009                     /* XXX This block is temporary code.  \N{} implies that the
3010                      * pattern is to have Unicode semantics, and therefore
3011                      * currently has to be encoded in utf8.  By putting it in
3012                      * utf8 now, we save a whole pass in the regular expression
3013                      * compiler.  Once that code is changed so Unicode
3014                      * semantics doesn't necessarily have to be in utf8, this
3015                      * block should be removed */
3016                     if (!has_utf8) {
3017                         SvCUR_set(sv, d - SvPVX_const(sv));
3018                         SvPOK_on(sv);
3019                         *d = '\0';
3020                         /* See Note on sizing above.  */
3021                         sv_utf8_upgrade_flags_grow(sv,
3022                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3023                                         /* 5 = '\N{' + cur char + NUL */
3024                                         (STRLEN)(send - s) + 5);
3025                         d = SvPVX(sv) + SvCUR(sv);
3026                         has_utf8 = TRUE;
3027                     }
3028                 }
3029
3030                 if (*s == 'U' && s[1] == '+') { /* \N{U+...} */
3031                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
3032                                 | PERL_SCAN_DISALLOW_PREFIX;
3033                     STRLEN len;
3034
3035                     /* For \N{U+...}, the '...' is a unicode value even on
3036                      * EBCDIC machines */
3037                     s += 2;         /* Skip to next char after the 'U+' */
3038                     len = e - s;
3039                     uv = grok_hex(s, &len, &flags, NULL);
3040                     if (len == 0 || len != (STRLEN)(e - s)) {
3041                         yyerror("Invalid hexadecimal number in \\N{U+...}");
3042                         s = e + 1;
3043                         continue;
3044                     }
3045
3046                     if (PL_lex_inpat) {
3047
3048                         /* Pass through to the regex compiler unchanged.  The
3049                          * reason we evaluated the number above is to make sure
3050                          * there wasn't a syntax error. */
3051                         s -= 5;     /* Include the '\N{U+' */
3052                         Copy(s, d, e - s + 1, char);    /* 1 = include the } */
3053                         d += e - s + 1;
3054                     }
3055                     else {  /* Not a pattern: convert the hex to string */
3056
3057                          /* If destination is not in utf8, unconditionally
3058                           * recode it to be so.  This is because \N{} implies
3059                           * Unicode semantics, and scalars have to be in utf8
3060                           * to guarantee those semantics */
3061                         if (! has_utf8) {
3062                             SvCUR_set(sv, d - SvPVX_const(sv));
3063                             SvPOK_on(sv);
3064                             *d = '\0';
3065                             /* See Note on sizing above.  */
3066                             sv_utf8_upgrade_flags_grow(
3067                                         sv,
3068                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3069                                         UNISKIP(uv) + (STRLEN)(send - e) + 1);
3070                             d = SvPVX(sv) + SvCUR(sv);
3071                             has_utf8 = TRUE;
3072                         }
3073
3074                         /* Add the string to the output */
3075                         if (UNI_IS_INVARIANT(uv)) {
3076                             *d++ = (char) uv;
3077                         }
3078                         else d = (char*)uvuni_to_utf8((U8*)d, uv);
3079                     }
3080                 }
3081                 else { /* Here is \N{NAME} but not \N{U+...}. */
3082
3083                     SV *res;            /* result from charnames */
3084                     const char *str;    /* the string in 'res' */
3085                     STRLEN len;         /* its length */
3086
3087                     /* Get the value for NAME */
3088                     res = newSVpvn(s, e - s);
3089                     res = new_constant( NULL, 0, "charnames",
3090                                         /* includes all of: \N{...} */
3091                                         res, NULL, s - 3, e - s + 4 );
3092
3093                     /* Most likely res will be in utf8 already since the
3094                      * standard charnames uses pack U, but a custom translator
3095                      * can leave it otherwise, so make sure.  XXX This can be
3096                      * revisited to not have charnames use utf8 for characters
3097                      * that don't need it when regexes don't have to be in utf8
3098                      * for Unicode semantics.  If doing so, remember EBCDIC */
3099                     sv_utf8_upgrade(res);
3100                     str = SvPV_const(res, len);
3101
3102                     /* Don't accept malformed input */
3103                     if (! is_utf8_string((U8 *) str, len)) {
3104                         yyerror("Malformed UTF-8 returned by \\N");
3105                     }
3106                     else if (PL_lex_inpat) {
3107
3108                         if (! len) { /* The name resolved to an empty string */
3109                             Copy("\\N{}", d, 4, char);
3110                             d += 4;
3111                         }
3112                         else {
3113                             /* In order to not lose information for the regex
3114                             * compiler, pass the result in the specially made
3115                             * syntax: \N{U+c1.c2.c3...}, where c1 etc. are
3116                             * the code points in hex of each character
3117                             * returned by charnames */
3118
3119                             const char *str_end = str + len;
3120                             STRLEN char_length;     /* cur char's byte length */
3121                             STRLEN output_length;   /* and the number of bytes
3122                                                        after this is translated
3123                                                        into hex digits */
3124                             const STRLEN off = d - SvPVX_const(sv);
3125
3126                             /* 2 hex per byte; 2 chars for '\N'; 2 chars for
3127                              * max('U+', '.'); and 1 for NUL */
3128                             char hex_string[2 * UTF8_MAXBYTES + 5];
3129
3130                             /* Get the first character of the result. */
3131                             U32 uv = utf8n_to_uvuni((U8 *) str,
3132                                                     len,
3133                                                     &char_length,
3134                                                     UTF8_ALLOW_ANYUV);
3135
3136                             /* The call to is_utf8_string() above hopefully
3137                              * guarantees that there won't be an error.  But
3138                              * it's easy here to make sure.  The function just
3139                              * above warns and returns 0 if invalid utf8, but
3140                              * it can also return 0 if the input is validly a
3141                              * NUL. Disambiguate */
3142                             if (uv == 0 && NATIVE_TO_ASCII(*str) != '\0') {
3143                                 uv = UNICODE_REPLACEMENT;
3144                             }
3145
3146                             /* Convert first code point to hex, including the
3147                              * boiler plate before it */
3148                             sprintf(hex_string, "\\N{U+%X", (unsigned int) uv);
3149                             output_length = strlen(hex_string);
3150
3151                             /* Make sure there is enough space to hold it */
3152                             d = off + SvGROW(sv, off
3153                                                  + output_length
3154                                                  + (STRLEN)(send - e)
3155                                                  + 2);  /* '}' + NUL */
3156                             /* And output it */
3157                             Copy(hex_string, d, output_length, char);
3158                             d += output_length;
3159
3160                             /* For each subsequent character, append dot and
3161                              * its ordinal in hex */
3162                             while ((str += char_length) < str_end) {
3163                                 const STRLEN off = d - SvPVX_const(sv);
3164                                 U32 uv = utf8n_to_uvuni((U8 *) str,
3165                                                         str_end - str,
3166                                                         &char_length,
3167                                                         UTF8_ALLOW_ANYUV);
3168                                 if (uv == 0 && NATIVE_TO_ASCII(*str) != '\0') {
3169                                     uv = UNICODE_REPLACEMENT;
3170                                 }
3171
3172                                 sprintf(hex_string, ".%X", (unsigned int) uv);
3173                                 output_length = strlen(hex_string);
3174
3175                                 d = off + SvGROW(sv, off
3176                                                      + output_length
3177                                                      + (STRLEN)(send - e)
3178                                                      + 2);      /* '}' +  NUL */
3179                                 Copy(hex_string, d, output_length, char);
3180                                 d += output_length;
3181                             }
3182
3183                             *d++ = '}'; /* Done.  Add the trailing brace */
3184                         }
3185                     }
3186                     else { /* Here, not in a pattern.  Convert the name to a
3187                             * string. */
3188
3189                          /* If destination is not in utf8, unconditionally
3190                           * recode it to be so.  This is because \N{} implies
3191                           * Unicode semantics, and scalars have to be in utf8
3192                           * to guarantee those semantics */
3193                         if (! has_utf8) {
3194                             SvCUR_set(sv, d - SvPVX_const(sv));
3195                             SvPOK_on(sv);
3196                             *d = '\0';
3197                             /* See Note on sizing above.  */
3198                             sv_utf8_upgrade_flags_grow(sv,
3199                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3200                                                 len + (STRLEN)(send - s) + 1);
3201                             d = SvPVX(sv) + SvCUR(sv);
3202                             has_utf8 = TRUE;
3203                         } else if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
3204
3205                             /* See Note on sizing above.  (NOTE: SvCUR() is not
3206                              * set correctly here). */
3207                             const STRLEN off = d - SvPVX_const(sv);
3208                             d = off + SvGROW(sv, off + len + (STRLEN)(send - s) + 1);
3209                         }
3210                         Copy(str, d, len, char);
3211                         d += len;
3212                     }
3213                     SvREFCNT_dec(res);
3214
3215                     /* Deprecate non-approved name syntax */
3216                     if (ckWARN_d(WARN_DEPRECATED)) {
3217                         bool problematic = FALSE;
3218                         char* i = s;
3219
3220                         /* For non-ut8 input, look to see that the first
3221                          * character is an alpha, then loop through the rest
3222                          * checking that each is a continuation */
3223                         if (! this_utf8) {
3224                             if (! isALPHAU(*i)) problematic = TRUE;
3225                             else for (i = s + 1; i < e; i++) {
3226                                 if (isCHARNAME_CONT(*i)) continue;
3227                                 problematic = TRUE;
3228                                 break;
3229                             }
3230                         }
3231                         else {
3232                             /* Similarly for utf8.  For invariants can check
3233                              * directly.  We accept anything above the latin1
3234                              * range because it is immaterial to Perl if it is
3235                              * correct or not, and is expensive to check.  But
3236                              * it is fairly easy in the latin1 range to convert
3237                              * the variants into a single character and check
3238                              * those */
3239                             if (UTF8_IS_INVARIANT(*i)) {
3240                                 if (! isALPHAU(*i)) problematic = TRUE;
3241                             } else if (UTF8_IS_DOWNGRADEABLE_START(*i)) {
3242                                 if (! isALPHAU(UNI_TO_NATIVE(UTF8_ACCUMULATE(*i,
3243                                                                             *(i+1)))))
3244                                 {
3245                                     problematic = TRUE;
3246                                 }
3247                             }
3248                             if (! problematic) for (i = s + UTF8SKIP(s);
3249                                                     i < e;
3250                                                     i+= UTF8SKIP(i))
3251                             {
3252                                 if (UTF8_IS_INVARIANT(*i)) {
3253                                     if (isCHARNAME_CONT(*i)) continue;
3254                                 } else if (! UTF8_IS_DOWNGRADEABLE_START(*i)) {
3255                                     continue;
3256                                 } else if (isCHARNAME_CONT(
3257                                             UNI_TO_NATIVE(
3258                                             UTF8_ACCUMULATE(*i, *(i+1)))))
3259                                 {
3260                                     continue;
3261                                 }
3262                                 problematic = TRUE;
3263                                 break;
3264                             }
3265                         }
3266                         if (problematic) {
3267                             char *string;
3268                             Newx(string, e - i + 1, char);
3269                             Copy(i, string, e - i, char);
3270                             string[e - i] = '\0';
3271                             Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
3272                                 "Deprecated character(s) in \\N{...} starting at '%s'",
3273                                 string);
3274                             Safefree(string);
3275                         }
3276                     }
3277                 } /* End \N{NAME} */
3278 #ifdef EBCDIC
3279                 if (!dorange) 
3280                     native_range = FALSE; /* \N{} is defined to be Unicode */
3281 #endif
3282                 s = e + 1;  /* Point to just after the '}' */
3283                 continue;
3284
3285             /* \c is a control character */
3286             case 'c':
3287                 s++;
3288                 if (s < send) {
3289                     U8 c = *s++;
3290 #ifdef EBCDIC
3291                     if (isLOWER(c))
3292                         c = toUPPER(c);
3293 #endif
3294                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
3295                 }
3296                 else {
3297                     yyerror("Missing control char name in \\c");
3298                 }
3299                 continue;
3300
3301             /* printf-style backslashes, formfeeds, newlines, etc */
3302             case 'b':
3303                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
3304                 break;
3305             case 'n':
3306                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
3307                 break;
3308             case 'r':
3309                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
3310                 break;
3311             case 'f':
3312                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
3313                 break;
3314             case 't':
3315                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
3316                 break;
3317             case 'e':
3318                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
3319                 break;
3320             case 'a':
3321                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
3322                 break;
3323             } /* end switch */
3324
3325             s++;
3326             continue;
3327         } /* end if (backslash) */
3328 #ifdef EBCDIC
3329         else
3330             literal_endpoint++;
3331 #endif
3332
3333     default_action:
3334         /* If we started with encoded form, or already know we want it,
3335            then encode the next character */
3336         if (! NATIVE_IS_INVARIANT((U8)(*s)) && (this_utf8 || has_utf8)) {
3337             STRLEN len  = 1;
3338
3339
3340             /* One might think that it is wasted effort in the case of the
3341              * source being utf8 (this_utf8 == TRUE) to take the next character
3342              * in the source, convert it to an unsigned value, and then convert
3343              * it back again.  But the source has not been validated here.  The
3344              * routine that does the conversion checks for errors like
3345              * malformed utf8 */
3346
3347             const UV nextuv   = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
3348             const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
3349             if (!has_utf8) {
3350                 SvCUR_set(sv, d - SvPVX_const(sv));
3351                 SvPOK_on(sv);
3352                 *d = '\0';
3353                 /* See Note on sizing above.  */
3354                 sv_utf8_upgrade_flags_grow(sv,
3355                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3356                                         need + (STRLEN)(send - s) + 1);
3357                 d = SvPVX(sv) + SvCUR(sv);
3358                 has_utf8 = TRUE;
3359             } else if (need > len) {
3360                 /* encoded value larger than old, may need extra space (NOTE:
3361                  * SvCUR() is not set correctly here).   See Note on sizing
3362                  * above.  */
3363                 const STRLEN off = d - SvPVX_const(sv);
3364                 d = SvGROW(sv, off + need + (STRLEN)(send - s) + 1) + off;
3365             }
3366             s += len;
3367
3368             d = (char*)uvchr_to_utf8((U8*)d, nextuv);
3369 #ifdef EBCDIC
3370             if (uv > 255 && !dorange)
3371                 native_range = FALSE;
3372 #endif
3373         }
3374         else {
3375             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
3376         }
3377     } /* while loop to process each character */
3378
3379     /* terminate the string and set up the sv */
3380     *d = '\0';
3381     SvCUR_set(sv, d - SvPVX_const(sv));
3382     if (SvCUR(sv) >= SvLEN(sv))
3383         Perl_croak(aTHX_ "panic: constant overflowed allocated space");
3384
3385     SvPOK_on(sv);
3386     if (PL_encoding && !has_utf8) {
3387         sv_recode_to_utf8(sv, PL_encoding);
3388         if (SvUTF8(sv))
3389             has_utf8 = TRUE;
3390     }
3391     if (has_utf8) {
3392         SvUTF8_on(sv);
3393         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
3394             PL_sublex_info.sub_op->op_private |=
3395                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
3396         }
3397     }
3398
3399     /* shrink the sv if we allocated more than we used */
3400     if (SvCUR(sv) + 5 < SvLEN(sv)) {
3401         SvPV_shrink_to_cur(sv);
3402     }
3403
3404     /* return the substring (via pl_yylval) only if we parsed anything */
3405     if (s > PL_bufptr) {
3406         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) ) {
3407             const char *const key = PL_lex_inpat ? "qr" : "q";
3408             const STRLEN keylen = PL_lex_inpat ? 2 : 1;
3409             const char *type;
3410             STRLEN typelen;
3411
3412             if (PL_lex_inwhat == OP_TRANS) {
3413                 type = "tr";
3414                 typelen = 2;
3415             } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
3416                 type = "s";
3417                 typelen = 1;
3418             } else  {
3419                 type = "qq";
3420                 typelen = 2;
3421             }
3422
3423             sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
3424                                 type, typelen);
3425         }
3426         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3427     } else
3428         SvREFCNT_dec(sv);
3429     return s;
3430 }
3431
3432 /* S_intuit_more
3433  * Returns TRUE if there's more to the expression (e.g., a subscript),
3434  * FALSE otherwise.
3435  *
3436  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
3437  *
3438  * ->[ and ->{ return TRUE
3439  * { and [ outside a pattern are always subscripts, so return TRUE
3440  * if we're outside a pattern and it's not { or [, then return FALSE
3441  * if we're in a pattern and the first char is a {
3442  *   {4,5} (any digits around the comma) returns FALSE
3443  * if we're in a pattern and the first char is a [
3444  *   [] returns FALSE
3445  *   [SOMETHING] has a funky algorithm to decide whether it's a
3446  *      character class or not.  It has to deal with things like
3447  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
3448  * anything else returns TRUE
3449  */
3450
3451 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
3452
3453 STATIC int
3454 S_intuit_more(pTHX_ register char *s)
3455 {
3456     dVAR;
3457
3458     PERL_ARGS_ASSERT_INTUIT_MORE;
3459
3460     if (PL_lex_brackets)
3461         return TRUE;
3462     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
3463         return TRUE;
3464     if (*s != '{' && *s != '[')
3465         return FALSE;
3466     if (!PL_lex_inpat)
3467         return TRUE;
3468
3469     /* In a pattern, so maybe we have {n,m}. */
3470     if (*s == '{') {
3471         s++;
3472         if (!isDIGIT(*s))
3473             return TRUE;
3474         while (isDIGIT(*s))
3475             s++;
3476         if (*s == ',')
3477             s++;
3478         while (isDIGIT(*s))
3479             s++;
3480         if (*s == '}')
3481             return FALSE;
3482         return TRUE;
3483         
3484     }
3485
3486     /* On the other hand, maybe we have a character class */
3487
3488     s++;
3489     if (*s == ']' || *s == '^')
3490         return FALSE;
3491     else {
3492         /* this is terrifying, and it works */
3493         int weight = 2;         /* let's weigh the evidence */
3494         char seen[256];
3495         unsigned char un_char = 255, last_un_char;
3496         const char * const send = strchr(s,']');
3497         char tmpbuf[sizeof PL_tokenbuf * 4];
3498
3499         if (!send)              /* has to be an expression */
3500             return TRUE;
3501
3502         Zero(seen,256,char);
3503         if (*s == '$')
3504             weight -= 3;
3505         else if (isDIGIT(*s)) {
3506             if (s[1] != ']') {
3507                 if (isDIGIT(s[1]) && s[2] == ']')
3508                     weight -= 10;
3509             }
3510             else
3511                 weight -= 100;
3512         }
3513         for (; s < send; s++) {
3514             last_un_char = un_char;
3515             un_char = (unsigned char)*s;
3516             switch (*s) {
3517             case '@':
3518             case '&':
3519             case '$':
3520                 weight -= seen[un_char] * 10;
3521                 if (isALNUM_lazy_if(s+1,UTF)) {
3522                     int len;
3523                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
3524                     len = (int)strlen(tmpbuf);
3525                     if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
3526                         weight -= 100;
3527                     else
3528                         weight -= 10;
3529                 }
3530                 else if (*s == '$' && s[1] &&
3531                   strchr("[#!%*<>()-=",s[1])) {
3532                     if (/*{*/ strchr("])} =",s[2]))
3533                         weight -= 10;
3534                     else
3535                         weight -= 1;
3536                 }
3537                 break;
3538             case '\\':
3539                 un_char = 254;
3540                 if (s[1]) {
3541                     if (strchr("wds]",s[1]))
3542                         weight += 100;
3543                     else if (seen[(U8)'\''] || seen[(U8)'"'])
3544                         weight += 1;
3545                     else if (strchr("rnftbxcav",s[1]))
3546                         weight += 40;
3547                     else if (isDIGIT(s[1])) {
3548                         weight += 40;
3549                         while (s[1] && isDIGIT(s[1]))
3550                             s++;
3551                     }
3552                 }
3553                 else
3554                     weight += 100;
3555                 break;
3556             case '-':
3557                 if (s[1] == '\\')
3558                     weight += 50;
3559                 if (strchr("aA01! ",last_un_char))
3560                     weight += 30;
3561                 if (strchr("zZ79~",s[1]))
3562                     weight += 30;
3563                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
3564                     weight -= 5;        /* cope with negative subscript */
3565                 break;
3566             default:
3567                 if (!isALNUM(last_un_char)
3568                     && !(last_un_char == '$' || last_un_char == '@'
3569                          || last_un_char == '&')
3570                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
3571                     char *d = tmpbuf;
3572                     while (isALPHA(*s))
3573                         *d++ = *s++;
3574                     *d = '\0';
3575                     if (keyword(tmpbuf, d - tmpbuf, 0))
3576                         weight -= 150;
3577                 }
3578                 if (un_char == last_un_char + 1)
3579                     weight += 5;
3580                 weight -= seen[un_char];
3581                 break;
3582             }
3583             seen[un_char]++;
3584         }
3585         if (weight >= 0)        /* probably a character class */
3586             return FALSE;
3587     }
3588
3589     return TRUE;
3590 }
3591
3592 /*
3593  * S_intuit_method
3594  *
3595  * Does all the checking to disambiguate
3596  *   foo bar
3597  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
3598  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
3599  *
3600  * First argument is the stuff after the first token, e.g. "bar".
3601  *
3602  * Not a method if bar is a filehandle.
3603  * Not a method if foo is a subroutine prototyped to take a filehandle.
3604  * Not a method if it's really "Foo $bar"
3605  * Method if it's "foo $bar"
3606  * Not a method if it's really "print foo $bar"
3607  * Method if it's really "foo package::" (interpreted as package->foo)
3608  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3609  * Not a method if bar is a filehandle or package, but is quoted with
3610  *   =>
3611  */
3612
3613 STATIC int
3614 S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
3615 {
3616     dVAR;
3617     char *s = start + (*start == '$');
3618     char tmpbuf[sizeof PL_tokenbuf];
3619     STRLEN len;
3620     GV* indirgv;
3621 #ifdef PERL_MAD
3622     int soff;
3623 #endif
3624
3625     PERL_ARGS_ASSERT_INTUIT_METHOD;
3626
3627     if (gv) {
3628         if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
3629             return 0;
3630         if (cv) {
3631             if (SvPOK(cv)) {
3632                 const char *proto = SvPVX_const(cv);
3633                 if (proto) {
3634                     if (*proto == ';')
3635                         proto++;
3636                     if (*proto == '*')
3637                         return 0;
3638                 }
3639             }
3640         } else
3641             gv = NULL;
3642     }
3643     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3644     /* start is the beginning of the possible filehandle/object,
3645      * and s is the end of it
3646      * tmpbuf is a copy of it
3647      */
3648
3649     if (*start == '$') {
3650         if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
3651                 isUPPER(*PL_tokenbuf))
3652             return 0;
3653 #ifdef PERL_MAD
3654         len = start - SvPVX(PL_linestr);
3655 #endif
3656         s = PEEKSPACE(s);
3657 #ifdef PERL_MAD
3658         start = SvPVX(PL_linestr) + len;
3659 #endif
3660         PL_bufptr = start;
3661         PL_expect = XREF;
3662         return *s == '(' ? FUNCMETH : METHOD;
3663     }
3664     if (!keyword(tmpbuf, len, 0)) {
3665         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
3666             len -= 2;
3667             tmpbuf[len] = '\0';
3668 #ifdef PERL_MAD
3669             soff = s - SvPVX(PL_linestr);
3670 #endif
3671             goto bare_package;
3672         }
3673         indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
3674         if (indirgv && GvCVu(indirgv))
3675             return 0;
3676         /* filehandle or package name makes it a method */
3677         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
3678 #ifdef PERL_MAD
3679             soff = s - SvPVX(PL_linestr);
3680 #endif
3681             s = PEEKSPACE(s);
3682             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
3683                 return 0;       /* no assumptions -- "=>" quotes bearword */
3684       bare_package:
3685             start_force(PL_curforce);
3686             NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
3687                                                   S_newSV_maybe_utf8(aTHX_ tmpbuf, len));
3688             NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
3689             if (PL_madskills)
3690                 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3691             PL_expect = XTERM;
3692             force_next(WORD);
3693             PL_bufptr = s;
3694 #ifdef PERL_MAD
3695             PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
3696 #endif
3697             return *s == '(' ? FUNCMETH : METHOD;
3698         }
3699     }
3700     return 0;
3701 }
3702
3703 /* Encoded script support. filter_add() effectively inserts a
3704  * 'pre-processing' function into the current source input stream.
3705  * Note that the filter function only applies to the current source file
3706  * (e.g., it will not affect files 'require'd or 'use'd by this one).
3707  *
3708  * The datasv parameter (which may be NULL) can be used to pass
3709  * private data to this instance of the filter. The filter function
3710  * can recover the SV using the FILTER_DATA macro and use it to
3711  * store private buffers and state information.
3712  *
3713  * The supplied datasv parameter is upgraded to a PVIO type
3714  * and the IoDIRP/IoANY field is used to store the function pointer,
3715  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
3716  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
3717  * private use must be set using malloc'd pointers.
3718  */
3719
3720 SV *
3721 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
3722 {
3723     dVAR;
3724     if (!funcp)
3725         return NULL;
3726
3727     if (!PL_parser)
3728         return NULL;
3729
3730     if (!PL_rsfp_filters)
3731         PL_rsfp_filters = newAV();
3732     if (!datasv)
3733         datasv = newSV(0);
3734     SvUPGRADE(datasv, SVt_PVIO);
3735     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
3736     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
3737     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
3738                           FPTR2DPTR(void *, IoANY(datasv)),
3739                           SvPV_nolen(datasv)));
3740     av_unshift(PL_rsfp_filters, 1);
3741     av_store(PL_rsfp_filters, 0, datasv) ;
3742     return(datasv);
3743 }
3744
3745
3746 /* Delete most recently added instance of this filter function. */
3747 void
3748 Perl_filter_del(pTHX_ filter_t funcp)
3749 {
3750     dVAR;
3751     SV *datasv;
3752
3753     PERL_ARGS_ASSERT_FILTER_DEL;
3754
3755 #ifdef DEBUGGING
3756     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
3757                           FPTR2DPTR(void*, funcp)));
3758 #endif
3759     if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
3760         return;
3761     /* if filter is on top of stack (usual case) just pop it off */
3762     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
3763     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
3764         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
3765         IoANY(datasv) = (void *)NULL;
3766         sv_free(av_pop(PL_rsfp_filters));
3767
3768         return;
3769     }
3770     /* we need to search for the correct entry and clear it     */
3771     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
3772 }
3773
3774
3775 /* Invoke the idxth filter function for the current rsfp.        */
3776 /* maxlen 0 = read one text line */
3777 I32
3778 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
3779 {
3780     dVAR;
3781     filter_t funcp;
3782     SV *datasv = NULL;
3783     /* This API is bad. It should have been using unsigned int for maxlen.
3784        Not sure if we want to change the API, but if not we should sanity
3785        check the value here.  */
3786     const unsigned int correct_length
3787         = maxlen < 0 ?
3788 #ifdef PERL_MICRO
3789         0x7FFFFFFF
3790 #else
3791         INT_MAX
3792 #endif
3793         : maxlen;
3794
3795     PERL_ARGS_ASSERT_FILTER_READ;
3796
3797     if (!PL_parser || !PL_rsfp_filters)
3798         return -1;
3799     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
3800         /* Provide a default input filter to make life easy.    */
3801         /* Note that we append to the line. This is handy.      */
3802         DEBUG_P(PerlIO_printf(Perl_debug_log,
3803                               "filter_read %d: from rsfp\n", idx));
3804         if (correct_length) {
3805             /* Want a block */
3806             int len ;
3807             const int old_len = SvCUR(buf_sv);
3808
3809             /* ensure buf_sv is large enough */
3810             SvGROW(buf_sv, (STRLEN)(old_len + correct_length + 1)) ;
3811             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
3812                                    correct_length)) <= 0) {
3813                 if (PerlIO_error(PL_rsfp))
3814                     return -1;          /* error */
3815                 else
3816                     return 0 ;          /* end of file */
3817             }
3818             SvCUR_set(buf_sv, old_len + len) ;
3819             SvPVX(buf_sv)[old_len + len] = '\0';
3820         } else {
3821             /* Want a line */
3822             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
3823                 if (PerlIO_error(PL_rsfp))
3824                     return -1;          /* error */
3825                 else
3826                     return 0 ;          /* end of file */
3827             }
3828         }
3829         return SvCUR(buf_sv);
3830     }
3831     /* Skip this filter slot if filter has been deleted */
3832     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
3833         DEBUG_P(PerlIO_printf(Perl_debug_log,
3834                               "filter_read %d: skipped (filter deleted)\n",
3835                               idx));
3836         return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
3837     }
3838     /* Get function pointer hidden within datasv        */
3839     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
3840     DEBUG_P(PerlIO_printf(Perl_debug_log,
3841                           "filter_read %d: via function %p (%s)\n",
3842                           idx, (void*)datasv, SvPV_nolen_const(datasv)));
3843     /* Call function. The function is expected to       */
3844     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
3845     /* Return: <0:error, =0:eof, >0:not eof             */
3846     return (*funcp)(aTHX_ idx, buf_sv, correct_length);
3847 }
3848
3849 STATIC char *
3850 S_filter_gets(pTHX_ register SV *sv, STRLEN append)
3851 {
3852     dVAR;
3853
3854     PERL_ARGS_ASSERT_FILTER_GETS;
3855
3856 #ifdef PERL_CR_FILTER
3857     if (!PL_rsfp_filters) {
3858         filter_add(S_cr_textfilter,NULL);
3859     }
3860 #endif
3861     if (PL_rsfp_filters) {
3862         if (!append)
3863             SvCUR_set(sv, 0);   /* start with empty line        */
3864         if (FILTER_READ(0, sv, 0) > 0)
3865             return ( SvPVX(sv) ) ;
3866         else
3867             return NULL ;
3868     }
3869     else
3870         return (sv_gets(sv, PL_rsfp, append));
3871 }
3872
3873 STATIC HV *
3874 S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
3875 {
3876     dVAR;
3877     GV *gv;
3878
3879     PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
3880
3881     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
3882         return PL_curstash;
3883
3884     if (len > 2 &&
3885         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
3886         (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
3887     {
3888         return GvHV(gv);                        /* Foo:: */
3889     }
3890
3891     /* use constant CLASS => 'MyClass' */
3892     gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
3893     if (gv && GvCV(gv)) {
3894         SV * const sv = cv_const_sv(GvCV(gv));
3895         if (sv)
3896             pkgname = SvPV_const(sv, len);
3897     }
3898
3899     return gv_stashpvn(pkgname, len, 0);
3900 }
3901
3902 /*
3903  * S_readpipe_override
3904  * Check whether readpipe() is overriden, and generates the appropriate
3905  * optree, provided sublex_start() is called afterwards.
3906  */
3907 STATIC void
3908 S_readpipe_override(pTHX)
3909 {
3910     GV **gvp;
3911     GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
3912     pl_yylval.ival = OP_BACKTICK;
3913     if ((gv_readpipe
3914                 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
3915             ||
3916             ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
3917              && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
3918              && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
3919     {
3920         PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
3921             append_elem(OP_LIST,
3922                 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
3923                 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
3924     }
3925 }
3926
3927 #ifdef PERL_MAD 
3928  /*
3929  * Perl_madlex
3930  * The intent of this yylex wrapper is to minimize the changes to the
3931  * tokener when we aren't interested in collecting madprops.  It remains
3932  * to be seen how successful this strategy will be...
3933  */
3934
3935 int
3936 Perl_madlex(pTHX)
3937 {
3938     int optype;
3939     char *s = PL_bufptr;
3940
3941     /* make sure PL_thiswhite is initialized */
3942     PL_thiswhite = 0;
3943     PL_thismad = 0;
3944
3945     /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
3946     if (PL_pending_ident)
3947         return S_pending_ident(aTHX);
3948
3949     /* previous token ate up our whitespace? */
3950     if (!PL_lasttoke && PL_nextwhite) {
3951         PL_thiswhite = PL_nextwhite;
3952         PL_nextwhite = 0;
3953     }
3954
3955     /* isolate the token, and figure out where it is without whitespace */
3956     PL_realtokenstart = -1;
3957     PL_thistoken = 0;
3958     optype = yylex();
3959     s = PL_bufptr;
3960     assert(PL_curforce < 0);
3961
3962     if (!PL_thismad || PL_thismad->mad_key == '^') {    /* not forced already? */
3963         if (!PL_thistoken) {
3964             if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
3965                 PL_thistoken = newSVpvs("");
3966             else {
3967                 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
3968                 PL_thistoken = newSVpvn(tstart, s - tstart);
3969             }
3970         }
3971         if (PL_thismad) /* install head */
3972             CURMAD('X', PL_thistoken);
3973     }
3974
3975     /* last whitespace of a sublex? */
3976     if (optype == ')' && PL_endwhite) {
3977         CURMAD('X', PL_endwhite);
3978     }
3979
3980     if (!PL_thismad) {
3981
3982         /* if no whitespace and we're at EOF, bail.  Otherwise fake EOF below. */
3983         if (!PL_thiswhite && !PL_endwhite && !optype) {
3984             sv_free(PL_thistoken);
3985             PL_thistoken = 0;
3986             return 0;
3987         }
3988
3989         /* put off final whitespace till peg */
3990         if (optype == ';' && !PL_rsfp) {
3991             PL_nextwhite = PL_thiswhite;
3992             PL_thiswhite = 0;
3993         }
3994         else if (PL_thisopen) {
3995             CURMAD('q', PL_thisopen);
3996             if (PL_thistoken)
3997                 sv_free(PL_thistoken);
3998             PL_thistoken = 0;
3999         }
4000         else {
4001             /* Store actual token text as madprop X */
4002             CURMAD('X', PL_thistoken);
4003         }
4004
4005         if (PL_thiswhite) {
4006             /* add preceding whitespace as madprop _ */
4007             CURMAD('_', PL_thiswhite);
4008         }
4009
4010         if (PL_thisstuff) {
4011             /* add quoted material as madprop = */
4012             CURMAD('=', PL_thisstuff);
4013         }
4014
4015         if (PL_thisclose) {
4016             /* add terminating quote as madprop Q */
4017             CURMAD('Q', PL_thisclose);
4018         }
4019     }
4020
4021     /* special processing based on optype */
4022
4023     switch (optype) {
4024
4025     /* opval doesn't need a TOKEN since it can already store mp */
4026     case WORD:
4027     case METHOD:
4028     case FUNCMETH:
4029     case THING:
4030     case PMFUNC:
4031     case PRIVATEREF:
4032     case FUNC0SUB:
4033     case UNIOPSUB:
4034     case LSTOPSUB:
4035         if (pl_yylval.opval)
4036             append_madprops(PL_thismad, pl_yylval.opval, 0);
4037         PL_thismad = 0;
4038         return optype;
4039
4040     /* fake EOF */
4041     case 0:
4042         optype = PEG;
4043         if (PL_endwhite) {
4044             addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
4045             PL_endwhite = 0;
4046         }
4047         break;
4048
4049     case ']':
4050     case '}':
4051         if (PL_faketokens)
4052             break;
4053         /* remember any fake bracket that lexer is about to discard */ 
4054         if (PL_lex_brackets == 1 &&
4055             ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
4056         {
4057             s = PL_bufptr;
4058             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
4059                 s++;
4060             if (*s == '}') {
4061                 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
4062                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
4063                 PL_thiswhite = 0;
4064                 PL_bufptr = s - 1;
4065                 break;  /* don't bother looking for trailing comment */
4066             }
4067             else
4068                 s = PL_bufptr;
4069         }
4070         if (optype == ']')
4071             break;
4072         /* FALLTHROUGH */
4073
4074     /* attach a trailing comment to its statement instead of next token */
4075     case ';':
4076         if (PL_faketokens)
4077             break;
4078         if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
4079             s = PL_bufptr;
4080             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
4081                 s++;
4082             if (*s == '\n' || *s == '#') {
4083                 while (s < PL_bufend && *s != '\n')
4084                     s++;
4085                 if (s < PL_bufend)
4086                     s++;
4087                 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
4088                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
4089                 PL_thiswhite = 0;
4090                 PL_bufptr = s;
4091             }
4092         }
4093         break;
4094
4095     /* pval */
4096     case LABEL:
4097         break;
4098
4099     /* ival */
4100     default:
4101         break;
4102
4103     }
4104
4105     /* Create new token struct.  Note: opvals return early above. */
4106     pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
4107     PL_thismad = 0;
4108     return optype;
4109 }
4110 #endif
4111
4112 STATIC char *
4113 S_tokenize_use(pTHX_ int is_use, char *s) {
4114     dVAR;
4115
4116     PERL_ARGS_ASSERT_TOKENIZE_USE;
4117
4118     if (PL_expect != XSTATE)
4119         yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
4120                     is_use ? "use" : "no"));
4121     s = SKIPSPACE1(s);
4122     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
4123         s = force_version(s, TRUE);
4124         if (*s == ';' || *s == '}'
4125                 || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) {
4126             start_force(PL_curforce);
4127             NEXTVAL_NEXTTOKE.opval = NULL;
4128             force_next(WORD);
4129         }
4130         else if (*s == 'v') {
4131             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4132             s = force_version(s, FALSE);
4133         }
4134     }
4135     else {
4136         s = force_word(s,WORD,FALSE,TRUE,FALSE);
4137         s = force_version(s, FALSE);
4138     }
4139     pl_yylval.ival = is_use;
4140     return s;
4141 }
4142 #ifdef DEBUGGING
4143     static const char* const exp_name[] =
4144         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
4145           "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
4146         };
4147 #endif
4148
4149 /*
4150   yylex
4151
4152   Works out what to call the token just pulled out of the input
4153   stream.  The yacc parser takes care of taking the ops we return and
4154   stitching them into a tree.
4155
4156   Returns:
4157     PRIVATEREF
4158
4159   Structure:
4160       if read an identifier
4161           if we're in a my declaration
4162               croak if they tried to say my($foo::bar)
4163               build the ops for a my() declaration
4164           if it's an access to a my() variable
4165               are we in a sort block?
4166                   croak if my($a); $a <=> $b
4167               build ops for access to a my() variable
4168           if in a dq string, and they've said @foo and we can't find @foo
4169               croak
4170           build ops for a bareword
4171       if we already built the token before, use it.
4172 */
4173
4174
4175 #ifdef __SC__
4176 #pragma segment Perl_yylex
4177 #endif
4178 int
4179 Perl_yylex(pTHX)
4180 {
4181     dVAR;
4182     register char *s = PL_bufptr;
4183     register char *d;
4184     STRLEN len;
4185     bool bof = FALSE;
4186     U32 fake_eof = 0;
4187
4188     /* orig_keyword, gvp, and gv are initialized here because
4189      * jump to the label just_a_word_zero can bypass their
4190      * initialization later. */
4191     I32 orig_keyword = 0;
4192     GV *gv = NULL;
4193     GV **gvp = NULL;
4194
4195     DEBUG_T( {
4196         SV* tmp = newSVpvs("");
4197         PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
4198             (IV)CopLINE(PL_curcop),
4199             lex_state_names[PL_lex_state],
4200             exp_name[PL_expect],
4201             pv_display(tmp, s, strlen(s), 0, 60));
4202         SvREFCNT_dec(tmp);
4203     } );
4204     /* check if there's an identifier for us to look at */
4205     if (PL_pending_ident)
4206         return REPORT(S_pending_ident(aTHX));
4207
4208     /* no identifier pending identification */
4209
4210     switch (PL_lex_state) {
4211 #ifdef COMMENTARY
4212     case LEX_NORMAL:            /* Some compilers will produce faster */
4213     case LEX_INTERPNORMAL:      /* code if we comment these out. */
4214         break;
4215 #endif
4216
4217     /* when we've already built the next token, just pull it out of the queue */
4218     case LEX_KNOWNEXT:
4219 #ifdef PERL_MAD
4220         PL_lasttoke--;
4221         pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
4222         if (PL_madskills) {
4223             PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
4224             PL_nexttoke[PL_lasttoke].next_mad = 0;
4225             if (PL_thismad && PL_thismad->mad_key == '_') {
4226                 PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
4227                 PL_thismad->mad_val = 0;
4228                 mad_free(PL_thismad);
4229                 PL_thismad = 0;
4230             }
4231         }
4232         if (!PL_lasttoke) {
4233             PL_lex_state = PL_lex_defer;
4234             PL_expect = PL_lex_expect;
4235             PL_lex_defer = LEX_NORMAL;
4236             if (!PL_nexttoke[PL_lasttoke].next_type)
4237                 return yylex();
4238         }
4239 #else
4240         PL_nexttoke--;
4241         pl_yylval = PL_nextval[PL_nexttoke];
4242         if (!PL_nexttoke) {
4243             PL_lex_state = PL_lex_defer;
4244             PL_expect = PL_lex_expect;
4245             PL_lex_defer = LEX_NORMAL;
4246         }
4247 #endif
4248 #ifdef PERL_MAD
4249         /* FIXME - can these be merged?  */
4250         return(PL_nexttoke[PL_lasttoke].next_type);
4251 #else
4252         return REPORT(PL_nexttype[PL_nexttoke]);
4253 #endif
4254
4255     /* interpolated case modifiers like \L \U, including \Q and \E.
4256        when we get here, PL_bufptr is at the \
4257     */
4258     case LEX_INTERPCASEMOD:
4259 #ifdef DEBUGGING
4260         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
4261             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
4262 #endif
4263         /* handle \E or end of string */
4264         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
4265             /* if at a \E */
4266             if (PL_lex_casemods) {
4267                 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
4268                 PL_lex_casestack[PL_lex_casemods] = '\0';
4269
4270                 if (PL_bufptr != PL_bufend
4271                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
4272                     PL_bufptr += 2;
4273                     PL_lex_state = LEX_INTERPCONCAT;
4274 #ifdef PERL_MAD
4275                     if (PL_madskills)
4276                         PL_thistoken = newSVpvs("\\E");
4277 #endif
4278                 }
4279                 return REPORT(')');
4280             }
4281 #ifdef PERL_MAD
4282             while (PL_bufptr != PL_bufend &&
4283               PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
4284                 if (!PL_thiswhite)
4285                     PL_thiswhite = newSVpvs("");
4286                 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
4287                 PL_bufptr += 2;
4288             }
4289 #else
4290             if (PL_bufptr != PL_bufend)
4291                 PL_bufptr += 2;
4292 #endif
4293             PL_lex_state = LEX_INTERPCONCAT;
4294             return yylex();
4295         }
4296         else {
4297             DEBUG_T({ PerlIO_printf(Perl_debug_log,
4298               "### Saw case modifier\n"); });
4299             s = PL_bufptr + 1;
4300             if (s[1] == '\\' && s[2] == 'E') {
4301 #ifdef PERL_MAD
4302                 if (!PL_thiswhite)
4303                     PL_thiswhite = newSVpvs("");
4304                 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
4305 #endif
4306                 PL_bufptr = s + 3;
4307                 PL_lex_state = LEX_INTERPCONCAT;
4308                 return yylex();
4309             }
4310             else {
4311                 I32 tmp;
4312                 if (!PL_madskills) /* when just compiling don't need correct */
4313                     if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
4314                         tmp = *s, *s = s[2], s[2] = (char)tmp;  /* misordered... */
4315                 if ((*s == 'L' || *s == 'U') &&
4316                     (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
4317                     PL_lex_casestack[--PL_lex_casemods] = '\0';
4318                     return REPORT(')');
4319                 }
4320                 if (PL_lex_casemods > 10)
4321                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
4322                 PL_lex_casestack[PL_lex_casemods++] = *s;
4323                 PL_lex_casestack[PL_lex_casemods] = '\0';
4324                 PL_lex_state = LEX_INTERPCONCAT;
4325                 start_force(PL_curforce);
4326                 NEXTVAL_NEXTTOKE.ival = 0;
4327                 force_next('(');
4328                 start_force(PL_curforce);
4329                 if (*s == 'l')
4330                     NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
4331                 else if (*s == 'u')
4332                     NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
4333                 else if (*s == 'L')
4334                     NEXTVAL_NEXTTOKE.ival = OP_LC;
4335                 else if (*s == 'U')
4336                     NEXTVAL_NEXTTOKE.ival = OP_UC;
4337                 else if (*s == 'Q')
4338                     NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
4339                 else
4340                     Perl_croak(aTHX_ "panic: yylex");
4341                 if (PL_madskills) {
4342                     SV* const tmpsv = newSVpvs("\\ ");
4343                     /* replace the space with the character we want to escape
4344                      */
4345                     SvPVX(tmpsv)[1] = *s;
4346                     curmad('_', tmpsv);
4347                 }
4348                 PL_bufptr = s + 1;
4349             }
4350             force_next(FUNC);
4351             if (PL_lex_starts) {
4352                 s = PL_bufptr;
4353                 PL_lex_starts = 0;
4354 #ifdef PERL_MAD
4355                 if (PL_madskills) {
4356                     if (PL_thistoken)
4357                         sv_free(PL_thistoken);
4358                     PL_thistoken = newSVpvs("");
4359                 }
4360 #endif
4361                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4362                 if (PL_lex_casemods == 1 && PL_lex_inpat)
4363                     OPERATOR(',');
4364                 else
4365                     Aop(OP_CONCAT);
4366             }
4367             else
4368                 return yylex();
4369         }
4370
4371     case LEX_INTERPPUSH:
4372         return REPORT(sublex_push());
4373
4374     case LEX_INTERPSTART:
4375         if (PL_bufptr == PL_bufend)
4376             return REPORT(sublex_done());
4377         DEBUG_T({ PerlIO_printf(Perl_debug_log,
4378               "### Interpolated variable\n"); });
4379         PL_expect = XTERM;
4380         PL_lex_dojoin = (*PL_bufptr == '@');
4381         PL_lex_state = LEX_INTERPNORMAL;
4382         if (PL_lex_dojoin) {
4383             start_force(PL_curforce);
4384             NEXTVAL_NEXTTOKE.ival = 0;
4385             force_next(',');
4386             start_force(PL_curforce);
4387             force_ident("\"", '$');
4388             start_force(PL_curforce);
4389             NEXTVAL_NEXTTOKE.ival = 0;
4390             force_next('$');
4391             start_force(PL_curforce);
4392             NEXTVAL_NEXTTOKE.ival = 0;
4393             force_next('(');
4394             start_force(PL_curforce);
4395             NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
4396             force_next(FUNC);
4397         }
4398         if (PL_lex_starts++) {
4399             s = PL_bufptr;
4400 #ifdef PERL_MAD
4401             if (PL_madskills) {
4402                 if (PL_thistoken)
4403                     sv_free(PL_thistoken);
4404                 PL_thistoken = newSVpvs("");
4405             }
4406 #endif
4407             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4408             if (!PL_lex_casemods && PL_lex_inpat)
4409                 OPERATOR(',');
4410             else
4411                 Aop(OP_CONCAT);
4412         }
4413         return yylex();
4414
4415     case LEX_INTERPENDMAYBE:
4416         if (intuit_more(PL_bufptr)) {
4417             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
4418             break;
4419         }
4420         /* FALL THROUGH */
4421
4422     case LEX_INTERPEND:
4423         if (PL_lex_dojoin) {
4424             PL_lex_dojoin = FALSE;
4425             PL_lex_state = LEX_INTERPCONCAT;
4426 #ifdef PERL_MAD
4427             if (PL_madskills) {
4428                 if (PL_thistoken)
4429                     sv_free(PL_thistoken);
4430                 PL_thistoken = newSVpvs("");
4431             }
4432 #endif
4433             return REPORT(')');
4434         }
4435         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
4436             && SvEVALED(PL_lex_repl))
4437         {
4438             if (PL_bufptr != PL_bufend)
4439                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
4440             PL_lex_repl = NULL;
4441         }
4442         /* FALLTHROUGH */
4443     case LEX_INTERPCONCAT:
4444 #ifdef DEBUGGING
4445         if (PL_lex_brackets)
4446             Perl_croak(aTHX_ "panic: INTERPCONCAT");
4447 #endif
4448         if (PL_bufptr == PL_bufend)
4449             return REPORT(sublex_done());
4450
4451         if (SvIVX(PL_linestr) == '\'') {
4452             SV *sv = newSVsv(PL_linestr);
4453             if (!PL_lex_inpat)
4454                 sv = tokeq(sv);
4455             else if ( PL_hints & HINT_NEW_RE )
4456                 sv = new_constant(NULL, 0, "qr", sv, sv, "q", 1);
4457             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
4458             s = PL_bufend;
4459         }
4460         else {
4461             s = scan_const(PL_bufptr);
4462             if (*s == '\\')
4463                 PL_lex_state = LEX_INTERPCASEMOD;
4464             else
4465                 PL_lex_state = LEX_INTERPSTART;
4466         }
4467
4468         if (s != PL_bufptr) {
4469             start_force(PL_curforce);
4470             if (PL_madskills) {
4471                 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
4472             }
4473             NEXTVAL_NEXTTOKE = pl_yylval;
4474             PL_expect = XTERM;
4475             force_next(THING);
4476             if (PL_lex_starts++) {
4477 #ifdef PERL_MAD
4478                 if (PL_madskills) {
4479                     if (PL_thistoken)
4480                         sv_free(PL_thistoken);
4481                     PL_thistoken = newSVpvs("");
4482                 }
4483 #endif
4484                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4485                 if (!PL_lex_casemods && PL_lex_inpat)
4486                     OPERATOR(',');
4487                 else
4488                     Aop(OP_CONCAT);
4489             }
4490             else {
4491                 PL_bufptr = s;
4492                 return yylex();
4493             }
4494         }
4495
4496         return yylex();
4497     case LEX_FORMLINE:
4498         PL_lex_state = LEX_NORMAL;
4499         s = scan_formline(PL_bufptr);
4500         if (!PL_lex_formbrack)
4501             goto rightbracket;
4502         OPERATOR(';');
4503     }
4504
4505     s = PL_bufptr;
4506     PL_oldoldbufptr = PL_oldbufptr;
4507     PL_oldbufptr = s;
4508
4509   retry:
4510 #ifdef PERL_MAD
4511     if (PL_thistoken) {
4512         sv_free(PL_thistoken);
4513         PL_thistoken = 0;
4514     }
4515     PL_realtokenstart = s - SvPVX(PL_linestr);  /* assume but undo on ws */
4516 #endif
4517     switch (*s) {
4518     default:
4519         if (isIDFIRST_lazy_if(s,UTF))
4520             goto keylookup;
4521         {
4522         unsigned char c = *s;
4523         len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
4524         if (len > UNRECOGNIZED_PRECEDE_COUNT) {
4525             d = UTF ? (char *) Perl_utf8_hop(aTHX_ (U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
4526         } else {
4527             d = PL_linestart;
4528         }       
4529         *s = '\0';
4530         Perl_croak(aTHX_ "Unrecognized character \\x%02X; marked by <-- HERE after %s<-- HERE near column %d", c, d, (int) len + 1);
4531     }
4532     case 4:
4533     case 26:
4534         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
4535     case 0:
4536 #ifdef PERL_MAD
4537         if (PL_madskills)
4538             PL_faketokens = 0;
4539 #endif
4540         if (!PL_rsfp) {
4541             PL_last_uni = 0;
4542             PL_last_lop = 0;
4543             if (PL_lex_brackets) {
4544                 yyerror((const char *)
4545                         (PL_lex_formbrack
4546                          ? "Format not terminated"
4547                          : "Missing right curly or square bracket"));
4548             }
4549             DEBUG_T( { PerlIO_printf(Perl_debug_log,
4550                         "### Tokener got EOF\n");
4551             } );
4552             TOKEN(0);
4553         }
4554         if (s++ < PL_bufend)
4555             goto retry;                 /* ignore stray nulls */
4556         PL_last_uni = 0;
4557         PL_last_lop = 0;
4558         if (!PL_in_eval && !PL_preambled) {
4559             PL_preambled = TRUE;
4560 #ifdef PERL_MAD
4561             if (PL_madskills)
4562                 PL_faketokens = 1;
4563 #endif
4564             if (PL_perldb) {
4565                 /* Generate a string of Perl code to load the debugger.
4566                  * If PERL5DB is set, it will return the contents of that,
4567                  * otherwise a compile-time require of perl5db.pl.  */
4568
4569                 const char * const pdb = PerlEnv_getenv("PERL5DB");
4570
4571                 if (pdb) {
4572                     sv_setpv(PL_linestr, pdb);
4573                     sv_catpvs(PL_linestr,";");
4574                 } else {
4575                     SETERRNO(0,SS_NORMAL);
4576                     sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
4577                 }
4578             } else
4579                 sv_setpvs(PL_linestr,"");
4580             if (PL_preambleav) {
4581                 SV **svp = AvARRAY(PL_preambleav);
4582                 SV **const end = svp + AvFILLp(PL_preambleav);
4583                 while(svp <= end) {
4584                     sv_catsv(PL_linestr, *svp);
4585                     ++svp;
4586                     sv_catpvs(PL_linestr, ";");
4587                 }
4588                 sv_free(MUTABLE_SV(PL_preambleav));
4589                 PL_preambleav = NULL;
4590             }
4591             if (PL_minus_E)
4592                 sv_catpvs(PL_linestr,
4593                           "use feature ':5." STRINGIFY(PERL_VERSION) "';");
4594             if (PL_minus_n || PL_minus_p) {
4595                 sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
4596                 if (PL_minus_l)
4597                     sv_catpvs(PL_linestr,"chomp;");
4598                 if (PL_minus_a) {
4599                     if (PL_minus_F) {
4600                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
4601                              || *PL_splitstr == '"')
4602                               && strchr(PL_splitstr + 1, *PL_splitstr))
4603                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
4604                         else {
4605                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
4606                                bytes can be used as quoting characters.  :-) */
4607                             const char *splits = PL_splitstr;
4608                             sv_catpvs(PL_linestr, "our @F=split(q\0");
4609                             do {
4610                                 /* Need to \ \s  */
4611                                 if (*splits == '\\')
4612                                     sv_catpvn(PL_linestr, splits, 1);
4613                                 sv_catpvn(PL_linestr, splits, 1);
4614                             } while (*splits++);
4615                             /* This loop will embed the trailing NUL of
4616                                PL_linestr as the last thing it does before
4617                                terminating.  */
4618                             sv_catpvs(PL_linestr, ");");
4619                         }
4620                     }
4621                     else
4622                         sv_catpvs(PL_linestr,"our @F=split(' ');");
4623                 }
4624             }
4625             sv_catpvs(PL_linestr, "\n");
4626             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4627             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4628             PL_last_lop = PL_last_uni = NULL;
4629             if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
4630                 update_debugger_info(PL_linestr, NULL, 0);
4631             goto retry;
4632         }
4633         do {
4634             fake_eof = 0;
4635             bof = PL_rsfp ? TRUE : FALSE;
4636             if (0) {
4637               fake_eof:
4638                 fake_eof = LEX_FAKE_EOF;
4639             }
4640             PL_bufptr = PL_bufend;
4641             CopLINE_inc(PL_curcop);
4642             if (!lex_next_chunk(fake_eof)) {
4643                 CopLINE_dec(PL_curcop);
4644                 s = PL_bufptr;
4645                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
4646             }
4647             CopLINE_dec(PL_curcop);
4648 #ifdef PERL_MAD
4649             if (!PL_rsfp)
4650                 PL_realtokenstart = -1;
4651 #endif
4652             s = PL_bufptr;
4653             /* If it looks like the start of a BOM or raw UTF-16,
4654              * check if it in fact is. */
4655             if (bof && PL_rsfp &&
4656                      (*s == 0 ||
4657                       *(U8*)s == 0xEF ||
4658                       *(U8*)s >= 0xFE ||
4659                       s[1] == 0)) {
4660                 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
4661                 if (bof) {
4662                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4663                     s = swallow_bom((U8*)s);
4664                 }
4665             }
4666             if (PL_doextract) {
4667                 /* Incest with pod. */
4668 #ifdef PERL_MAD
4669                 if (PL_madskills)
4670                     sv_catsv(PL_thiswhite, PL_linestr);
4671 #endif
4672                 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
4673                     sv_setpvs(PL_linestr, "");
4674                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4675                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4676                     PL_last_lop = PL_last_uni = NULL;
4677                     PL_doextract = FALSE;
4678                 }
4679             }
4680             if (PL_rsfp)
4681                 incline(s);
4682         } while (PL_doextract);
4683         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
4684         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4685         PL_last_lop = PL_last_uni = NULL;
4686         if (CopLINE(PL_curcop) == 1) {
4687             while (s < PL_bufend && isSPACE(*s))
4688                 s++;
4689             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
4690                 s++;
4691 #ifdef PERL_MAD
4692             if (PL_madskills)
4693                 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
4694 #endif
4695             d = NULL;
4696             if (!PL_in_eval) {
4697                 if (*s == '#' && *(s+1) == '!')
4698                     d = s + 2;
4699 #ifdef ALTERNATE_SHEBANG
4700                 else {
4701                     static char const as[] = ALTERNATE_SHEBANG;
4702                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
4703                         d = s + (sizeof(as) - 1);
4704                 }
4705 #endif /* ALTERNATE_SHEBANG */
4706             }
4707             if (d) {
4708                 char *ipath;
4709                 char *ipathend;
4710
4711                 while (isSPACE(*d))
4712                     d++;
4713                 ipath = d;
4714                 while (*d && !isSPACE(*d))
4715                     d++;
4716                 ipathend = d;
4717
4718 #ifdef ARG_ZERO_IS_SCRIPT
4719                 if (ipathend > ipath) {
4720                     /*
4721                      * HP-UX (at least) sets argv[0] to the script name,
4722                      * which makes $^X incorrect.  And Digital UNIX and Linux,
4723                      * at least, set argv[0] to the basename of the Perl
4724                      * interpreter. So, having found "#!", we'll set it right.
4725                      */
4726                     SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
4727                                                     SVt_PV)); /* $^X */
4728                     assert(SvPOK(x) || SvGMAGICAL(x));
4729                     if (sv_eq(x, CopFILESV(PL_curcop))) {
4730                         sv_setpvn(x, ipath, ipathend - ipath);
4731                         SvSETMAGIC(x);
4732                     }
4733                     else {
4734                         STRLEN blen;
4735                         STRLEN llen;
4736                         const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
4737                         const char * const lstart = SvPV_const(x,llen);
4738                         if (llen < blen) {
4739                             bstart += blen - llen;
4740                             if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
4741                                 sv_setpvn(x, ipath, ipathend - ipath);
4742                                 SvSETMAGIC(x);
4743                             }
4744                         }
4745                     }
4746                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
4747                 }
4748 #endif /* ARG_ZERO_IS_SCRIPT */
4749
4750                 /*
4751                  * Look for options.
4752                  */
4753                 d = instr(s,"perl -");
4754                 if (!d) {
4755                     d = instr(s,"perl");
4756 #if defined(DOSISH)
4757                     /* avoid getting into infinite loops when shebang
4758                      * line contains "Perl" rather than "perl" */
4759                     if (!d) {
4760                         for (d = ipathend-4; d >= ipath; --d) {
4761                             if ((*d == 'p' || *d == 'P')
4762                                 && !ibcmp(d, "perl", 4))
4763                             {
4764                                 break;
4765                             }
4766                         }
4767                         if (d < ipath)
4768                             d = NULL;
4769                     }
4770 #endif
4771                 }
4772 #ifdef ALTERNATE_SHEBANG
4773                 /*
4774                  * If the ALTERNATE_SHEBANG on this system starts with a
4775                  * character that can be part of a Perl expression, then if
4776                  * we see it but not "perl", we're probably looking at the
4777                  * start of Perl code, not a request to hand off to some
4778                  * other interpreter.  Similarly, if "perl" is there, but
4779                  * not in the first 'word' of the line, we assume the line
4780                  * contains the start of the Perl program.
4781                  */
4782                 if (d && *s != '#') {
4783                     const char *c = ipath;
4784                     while (*c && !strchr("; \t\r\n\f\v#", *c))
4785                         c++;
4786                     if (c < d)
4787                         d = NULL;       /* "perl" not in first word; ignore */
4788                     else
4789                         *s = '#';       /* Don't try to parse shebang line */
4790                 }
4791 #endif /* ALTERNATE_SHEBANG */
4792                 if (!d &&
4793                     *s == '#' &&
4794                     ipathend > ipath &&
4795                     !PL_minus_c &&
4796                     !instr(s,"indir") &&
4797                     instr(PL_origargv[0],"perl"))
4798                 {
4799                     dVAR;
4800                     char **newargv;
4801
4802                     *ipathend = '\0';
4803                     s = ipathend + 1;
4804                     while (s < PL_bufend && isSPACE(*s))
4805                         s++;
4806                     if (s < PL_bufend) {
4807                         Newx(newargv,PL_origargc+3,char*);
4808                         newargv[1] = s;
4809                         while (s < PL_bufend && !isSPACE(*s))
4810                             s++;
4811                         *s = '\0';
4812                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
4813                     }
4814                     else
4815                         newargv = PL_origargv;
4816                     newargv[0] = ipath;
4817                     PERL_FPU_PRE_EXEC
4818                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
4819                     PERL_FPU_POST_EXEC
4820                     Perl_croak(aTHX_ "Can't exec %s", ipath);
4821                 }
4822                 if (d) {
4823                     while (*d && !isSPACE(*d))
4824                         d++;
4825                     while (SPACE_OR_TAB(*d))
4826                         d++;
4827
4828                     if (*d++ == '-') {
4829                         const bool switches_done = PL_doswitches;
4830                         const U32 oldpdb = PL_perldb;
4831                         const bool oldn = PL_minus_n;
4832                         const bool oldp = PL_minus_p;
4833                         const char *d1 = d;
4834
4835                         do {
4836                             bool baduni = FALSE;
4837                             if (*d1 == 'C') {
4838                                 const char *d2 = d1 + 1;
4839                                 if (parse_unicode_opts((const char **)&d2)
4840                                     != PL_unicode)
4841                                     baduni = TRUE;
4842                             }
4843                             if (baduni || *d1 == 'M' || *d1 == 'm') {
4844                                 const char * const m = d1;
4845                                 while (*d1 && !isSPACE(*d1))
4846                                     d1++;
4847                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
4848                                       (int)(d1 - m), m);
4849                             }
4850                             d1 = moreswitches(d1);
4851                         } while (d1);
4852                         if (PL_doswitches && !switches_done) {
4853                             int argc = PL_origargc;
4854                             char **argv = PL_origargv;
4855                             do {
4856                                 argc--,argv++;
4857                             } while (argc && argv[0][0] == '-' && argv[0][1]);
4858                             init_argv_symbols(argc,argv);
4859                         }
4860                         if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
4861                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
4862                               /* if we have already added "LINE: while (<>) {",
4863                                  we must not do it again */
4864                         {
4865                             sv_setpvs(PL_linestr, "");
4866                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4867                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4868                             PL_last_lop = PL_last_uni = NULL;
4869                             PL_preambled = FALSE;
4870                             if (PERLDB_LINE || PERLDB_SAVESRC)
4871                                 (void)gv_fetchfile(PL_origfilename);
4872                             goto retry;
4873                         }
4874                     }
4875                 }
4876             }
4877         }
4878         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4879             PL_bufptr = s;
4880             PL_lex_state = LEX_FORMLINE;
4881             return yylex();
4882         }
4883         goto retry;
4884     case '\r':
4885 #ifdef PERL_STRICT_CR
4886         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4887         Perl_croak(aTHX_
4888       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
4889 #endif
4890     case ' ': case '\t': case '\f': case 013:
4891 #ifdef PERL_MAD
4892         PL_realtokenstart = -1;
4893         if (!PL_thiswhite)
4894             PL_thiswhite = newSVpvs("");
4895         sv_catpvn(PL_thiswhite, s, 1);
4896 #endif
4897         s++;
4898         goto retry;
4899     case '#':
4900     case '\n':
4901 #ifdef PERL_MAD
4902         PL_realtokenstart = -1;
4903         if (PL_madskills)
4904             PL_faketokens = 0;
4905 #endif
4906         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
4907             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
4908                 /* handle eval qq[#line 1 "foo"\n ...] */
4909                 CopLINE_dec(PL_curcop);
4910                 incline(s);
4911             }
4912             if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
4913                 s = SKIPSPACE0(s);
4914                 if (!PL_in_eval || PL_rsfp)
4915                     incline(s);
4916             }
4917             else {
4918                 d = s;
4919                 while (d < PL_bufend && *d != '\n')
4920                     d++;
4921                 if (d < PL_bufend)
4922                     d++;
4923                 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4924                   Perl_croak(aTHX_ "panic: input overflow");
4925 #ifdef PERL_MAD
4926                 if (PL_madskills)
4927                     PL_thiswhite = newSVpvn(s, d - s);
4928 #endif
4929                 s = d;
4930                 incline(s);
4931             }
4932             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4933                 PL_bufptr = s;
4934                 PL_lex_state = LEX_FORMLINE;
4935                 return yylex();
4936             }
4937         }
4938         else {
4939 #ifdef PERL_MAD
4940             if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
4941                 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
4942                     PL_faketokens = 0;
4943                     s = SKIPSPACE0(s);
4944                     TOKEN(PEG); /* make sure any #! line is accessible */
4945                 }
4946                 s = SKIPSPACE0(s);
4947             }
4948             else {
4949 /*              if (PL_madskills && PL_lex_formbrack) { */
4950                     d = s;
4951                     while (d < PL_bufend && *d != '\n')
4952                         d++;
4953                     if (d < PL_bufend)
4954                         d++;
4955                     else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4956                       Perl_croak(aTHX_ "panic: input overflow");
4957                     if (PL_madskills && CopLINE(PL_curcop) >= 1) {
4958                         if (!PL_thiswhite)
4959                             PL_thiswhite = newSVpvs("");
4960                         if (CopLINE(PL_curcop) == 1) {
4961                             sv_setpvs(PL_thiswhite, "");
4962                             PL_faketokens = 0;
4963                         }
4964                         sv_catpvn(PL_thiswhite, s, d - s);
4965                     }
4966                     s = d;
4967 /*              }
4968                 *s = '\0';
4969                 PL_bufend = s; */
4970             }
4971 #else
4972             *s = '\0';
4973             PL_bufend = s;
4974 #endif
4975         }
4976         goto retry;
4977     case '-':
4978         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
4979             I32 ftst = 0;
4980             char tmp;
4981
4982             s++;
4983             PL_bufptr = s;
4984             tmp = *s++;
4985
4986             while (s < PL_bufend && SPACE_OR_TAB(*s))
4987                 s++;
4988
4989             if (strnEQ(s,"=>",2)) {
4990                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
4991                 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
4992                 OPERATOR('-');          /* unary minus */
4993             }
4994             PL_last_uni = PL_oldbufptr;
4995             switch (tmp) {
4996             case 'r': ftst = OP_FTEREAD;        break;
4997             case 'w': ftst = OP_FTEWRITE;       break;
4998             case 'x': ftst = OP_FTEEXEC;        break;
4999             case 'o': ftst = OP_FTEOWNED;       break;
5000             case 'R': ftst = OP_FTRREAD;        break;
5001             case 'W': ftst = OP_FTRWRITE;       break;
5002             case 'X': ftst = OP_FTREXEC;        break;
5003             case 'O': ftst = OP_FTROWNED;       break;
5004             case 'e': ftst = OP_FTIS;           break;
5005             case 'z': ftst = OP_FTZERO;         break;
5006             case 's': ftst = OP_FTSIZE;         break;
5007             case 'f': ftst = OP_FTFILE;         break;
5008             case 'd': ftst = OP_FTDIR;          break;
5009             case 'l': ftst = OP_FTLINK;         break;
5010             case 'p': ftst = OP_FTPIPE;         break;
5011             case 'S': ftst = OP_FTSOCK;         break;
5012             case 'u': ftst = OP_FTSUID;         break;
5013             case 'g': ftst = OP_FTSGID;         break;
5014             case 'k': ftst = OP_FTSVTX;         break;
5015             case 'b': ftst = OP_FTBLK;          break;
5016             case 'c': ftst = OP_FTCHR;          break;
5017             case 't': ftst = OP_FTTTY;          break;
5018             case 'T': ftst = OP_FTTEXT;         break;
5019             case 'B': ftst = OP_FTBINARY;       break;
5020             case 'M': case 'A': case 'C':
5021                 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
5022                 switch (tmp) {
5023                 case 'M': ftst = OP_FTMTIME;    break;
5024                 case 'A': ftst = OP_FTATIME;    break;
5025                 case 'C': ftst = OP_FTCTIME;    break;
5026                 default:                        break;
5027                 }
5028                 break;
5029             default:
5030                 break;
5031             }
5032             if (ftst) {
5033                 PL_last_lop_op = (OPCODE)ftst;
5034                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
5035                         "### Saw file test %c\n", (int)tmp);
5036                 } );
5037                 FTST(ftst);
5038             }
5039             else {
5040                 /* Assume it was a minus followed by a one-letter named
5041                  * subroutine call (or a -bareword), then. */
5042                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
5043                         "### '-%c' looked like a file test but was not\n",
5044                         (int) tmp);
5045                 } );
5046                 s = --PL_bufptr;
5047             }
5048         }
5049         {
5050             const char tmp = *s++;
5051             if (*s == tmp) {
5052                 s++;
5053                 if (PL_expect == XOPERATOR)
5054                     TERM(POSTDEC);
5055                 else
5056                     OPERATOR(PREDEC);
5057             }
5058             else if (*s == '>') {
5059                 s++;
5060                 s = SKIPSPACE1(s);
5061                 if (isIDFIRST_lazy_if(s,UTF)) {
5062                     s = force_word(s,METHOD,FALSE,TRUE,FALSE);
5063                     TOKEN(ARROW);
5064                 }
5065                 else if (*s == '$')
5066                     OPERATOR(ARROW);
5067                 else
5068                     TERM(ARROW);
5069             }
5070             if (PL_expect == XOPERATOR)
5071                 Aop(OP_SUBTRACT);
5072             else {
5073                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5074                     check_uni();
5075                 OPERATOR('-');          /* unary minus */
5076             }
5077         }
5078
5079     case '+':
5080         {
5081             const char tmp = *s++;
5082             if (*s == tmp) {
5083                 s++;
5084                 if (PL_expect == XOPERATOR)
5085                     TERM(POSTINC);
5086                 else
5087                     OPERATOR(PREINC);
5088             }
5089             if (PL_expect == XOPERATOR)
5090                 Aop(OP_ADD);
5091             else {
5092                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5093                     check_uni();
5094                 OPERATOR('+');
5095             }
5096         }
5097
5098     case '*':
5099         if (PL_expect != XOPERATOR) {
5100             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5101             PL_expect = XOPERATOR;
5102             force_ident(PL_tokenbuf, '*');
5103             if (!*PL_tokenbuf)
5104                 PREREF('*');
5105             TERM('*');
5106         }
5107         s++;
5108         if (*s == '*') {
5109             s++;
5110             PWop(OP_POW);
5111         }
5112         Mop(OP_MULTIPLY);
5113
5114     case '%':
5115         if (PL_expect == XOPERATOR) {
5116             ++s;
5117             Mop(OP_MODULO);
5118         }
5119         PL_tokenbuf[0] = '%';
5120         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5121                 sizeof PL_tokenbuf - 1, FALSE);
5122         if (!PL_tokenbuf[1]) {
5123             PREREF('%');
5124         }
5125         PL_pending_ident = '%';
5126         TERM('%');
5127
5128     case '^':
5129         s++;
5130         BOop(OP_BIT_XOR);
5131     case '[':
5132         PL_lex_brackets++;
5133         {
5134             const char tmp = *s++;
5135             OPERATOR(tmp);
5136         }
5137     case '~':
5138         if (s[1] == '~'
5139             && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
5140         {
5141             s += 2;
5142             Eop(OP_SMARTMATCH);
5143         }
5144     case ',':
5145         {
5146             const char tmp = *s++;
5147             OPERATOR(tmp);
5148         }
5149     case ':':
5150         if (s[1] == ':') {
5151             len = 0;
5152             goto just_a_word_zero_gv;
5153         }
5154         s++;
5155         switch (PL_expect) {
5156             OP *attrs;
5157 #ifdef PERL_MAD
5158             I32 stuffstart;
5159 #endif
5160         case XOPERATOR:
5161             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
5162                 break;
5163             PL_bufptr = s;      /* update in case we back off */
5164             if (*s == '=') {
5165                 deprecate(":= for an empty attribute list");
5166             }
5167             goto grabattrs;
5168         case XATTRBLOCK:
5169             PL_expect = XBLOCK;
5170             goto grabattrs;
5171         case XATTRTERM:
5172             PL_expect = XTERMBLOCK;
5173          grabattrs:
5174 #ifdef PERL_MAD
5175             stuffstart = s - SvPVX(PL_linestr) - 1;
5176 #endif
5177             s = PEEKSPACE(s);
5178             attrs = NULL;
5179             while (isIDFIRST_lazy_if(s,UTF)) {
5180                 I32 tmp;
5181                 SV *sv;
5182                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5183                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
5184                     if (tmp < 0) tmp = -tmp;
5185                     switch (tmp) {
5186                     case KEY_or:
5187                     case KEY_and:
5188                     case KEY_for:
5189                     case KEY_foreach:
5190                     case KEY_unless:
5191                     case KEY_if:
5192                     case KEY_while:
5193                     case KEY_until:
5194                         goto got_attrs;
5195                     default:
5196                         break;
5197                     }
5198                 }
5199                 sv = newSVpvn(s, len);
5200                 if (*d == '(') {
5201                     d = scan_str(d,TRUE,TRUE);
5202                     if (!d) {
5203                         /* MUST advance bufptr here to avoid bogus
5204                            "at end of line" context messages from yyerror().
5205                          */
5206                         PL_bufptr = s + len;
5207                         yyerror("Unterminated attribute parameter in attribute list");
5208                         if (attrs)
5209                             op_free(attrs);
5210                         sv_free(sv);
5211                         return REPORT(0);       /* EOF indicator */
5212                     }
5213                 }
5214                 if (PL_lex_stuff) {
5215                     sv_catsv(sv, PL_lex_stuff);
5216                     attrs = append_elem(OP_LIST, attrs,
5217                                         newSVOP(OP_CONST, 0, sv));
5218                     SvREFCNT_dec(PL_lex_stuff);
5219                     PL_lex_stuff = NULL;
5220                 }
5221                 else {
5222                     if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
5223                         sv_free(sv);
5224                         if (PL_in_my == KEY_our) {
5225                             deprecate(":unique");
5226                         }
5227                         else
5228                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
5229                     }
5230
5231                     /* NOTE: any CV attrs applied here need to be part of
5232                        the CVf_BUILTIN_ATTRS define in cv.h! */
5233                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
5234                         sv_free(sv);
5235                         CvLVALUE_on(PL_compcv);
5236                     }
5237                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
5238                         sv_free(sv);
5239                         deprecate(":locked");
5240                     }
5241                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
5242                         sv_free(sv);
5243                         CvMETHOD_on(PL_compcv);
5244                     }
5245                     /* After we've set the flags, it could be argued that
5246                        we don't need to do the attributes.pm-based setting
5247                        process, and shouldn't bother appending recognized
5248                        flags.  To experiment with that, uncomment the
5249                        following "else".  (Note that's already been
5250                        uncommented.  That keeps the above-applied built-in
5251                        attributes from being intercepted (and possibly
5252                        rejected) by a package's attribute routines, but is
5253                        justified by the performance win for the common case
5254                        of applying only built-in attributes.) */
5255                     else
5256                         attrs = append_elem(OP_LIST, attrs,
5257                                             newSVOP(OP_CONST, 0,
5258                                                     sv));
5259                 }
5260                 s = PEEKSPACE(d);
5261                 if (*s == ':' && s[1] != ':')
5262                     s = PEEKSPACE(s+1);
5263                 else if (s == d)
5264                     break;      /* require real whitespace or :'s */
5265                 /* XXX losing whitespace on sequential attributes here */
5266             }
5267             {
5268                 const char tmp
5269                     = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
5270                 if (*s != ';' && *s != '}' && *s != tmp
5271                     && (tmp != '=' || *s != ')')) {
5272                     const char q = ((*s == '\'') ? '"' : '\'');
5273                     /* If here for an expression, and parsed no attrs, back
5274                        off. */
5275                     if (tmp == '=' && !attrs) {
5276                         s = PL_bufptr;
5277                         break;
5278                     }
5279                     /* MUST advance bufptr here to avoid bogus "at end of line"
5280                        context messages from yyerror().
5281                     */
5282                     PL_bufptr = s;
5283                     yyerror( (const char *)
5284                              (*s
5285                               ? Perl_form(aTHX_ "Invalid separator character "
5286                                           "%c%c%c in attribute list", q, *s, q)
5287                               : "Unterminated attribute list" ) );
5288                     if (attrs)
5289                         op_free(attrs);
5290                     OPERATOR(':');
5291                 }
5292             }
5293         got_attrs:
5294             if (attrs) {
5295                 start_force(PL_curforce);
5296                 NEXTVAL_NEXTTOKE.opval = attrs;
5297                 CURMAD('_', PL_nextwhite);
5298                 force_next(THING);
5299             }
5300 #ifdef PERL_MAD
5301             if (PL_madskills) {
5302                 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5303                                      (s - SvPVX(PL_linestr)) - stuffstart);
5304             }
5305 #endif
5306             TOKEN(COLONATTR);
5307         }
5308         OPERATOR(':');
5309     case '(':
5310         s++;
5311         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
5312             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
5313         else
5314             PL_expect = XTERM;
5315         s = SKIPSPACE1(s);
5316         TOKEN('(');
5317     case ';':
5318         CLINE;
5319         {
5320             const char tmp = *s++;
5321             OPERATOR(tmp);
5322         }
5323     case ')':
5324         {
5325             const char tmp = *s++;
5326             s = SKIPSPACE1(s);
5327             if (*s == '{')
5328                 PREBLOCK(tmp);
5329             TERM(tmp);
5330         }
5331     case ']':
5332         s++;
5333         if (PL_lex_brackets <= 0)
5334             yyerror("Unmatched right square bracket");
5335         else
5336             --PL_lex_brackets;
5337         if (PL_lex_state == LEX_INTERPNORMAL) {
5338             if (PL_lex_brackets == 0) {
5339                 if (*s == '-' && s[1] == '>')
5340                     PL_lex_state = LEX_INTERPENDMAYBE;
5341                 else if (*s != '[' && *s != '{')
5342                     PL_lex_state = LEX_INTERPEND;
5343             }
5344         }
5345         TERM(']');
5346     case '{':
5347       leftbracket:
5348         s++;
5349         if (PL_lex_brackets > 100) {
5350             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
5351         }
5352         switch (PL_expect) {
5353         case XTERM:
5354             if (PL_lex_formbrack) {
5355                 s--;
5356                 PRETERMBLOCK(DO);
5357             }
5358             if (PL_oldoldbufptr == PL_last_lop)
5359                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5360             else
5361                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5362             OPERATOR(HASHBRACK);
5363         case XOPERATOR:
5364             while (s < PL_bufend && SPACE_OR_TAB(*s))
5365                 s++;
5366             d = s;
5367             PL_tokenbuf[0] = '\0';
5368             if (d < PL_bufend && *d == '-') {
5369                 PL_tokenbuf[0] = '-';
5370                 d++;
5371                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5372                     d++;
5373             }
5374             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
5375                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
5376                               FALSE, &len);
5377                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5378                     d++;
5379                 if (*d == '}') {
5380                     const char minus = (PL_tokenbuf[0] == '-');
5381                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
5382                     if (minus)
5383                         force_next('-');
5384                 }
5385             }
5386             /* FALL THROUGH */
5387         case XATTRBLOCK:
5388         case XBLOCK:
5389             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
5390             PL_expect = XSTATE;
5391             break;
5392         case XATTRTERM:
5393         case XTERMBLOCK:
5394             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5395             PL_expect = XSTATE;
5396             break;
5397         default: {
5398                 const char *t;
5399                 if (PL_oldoldbufptr == PL_last_lop)
5400                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5401                 else
5402                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5403                 s = SKIPSPACE1(s);
5404                 if (*s == '}') {
5405                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
5406                         PL_expect = XTERM;
5407                         /* This hack is to get the ${} in the message. */
5408                         PL_bufptr = s+1;
5409                         yyerror("syntax error");
5410                         break;
5411                     }
5412                     OPERATOR(HASHBRACK);
5413                 }
5414                 /* This hack serves to disambiguate a pair of curlies
5415                  * as being a block or an anon hash.  Normally, expectation
5416                  * determines that, but in cases where we're not in a
5417                  * position to expect anything in particular (like inside
5418                  * eval"") we have to resolve the ambiguity.  This code
5419                  * covers the case where the first term in the curlies is a
5420                  * quoted string.  Most other cases need to be explicitly
5421                  * disambiguated by prepending a "+" before the opening
5422                  * curly in order to force resolution as an anon hash.
5423                  *
5424                  * XXX should probably propagate the outer expectation
5425                  * into eval"" to rely less on this hack, but that could
5426                  * potentially break current behavior of eval"".
5427                  * GSAR 97-07-21
5428                  */
5429                 t = s;
5430                 if (*s == '\'' || *s == '"' || *s == '`') {
5431                     /* common case: get past first string, handling escapes */
5432                     for (t++; t < PL_bufend && *t != *s;)
5433                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
5434                             t++;
5435                     t++;
5436                 }
5437                 else if (*s == 'q') {
5438                     if (++t < PL_bufend
5439                         && (!isALNUM(*t)
5440                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
5441                                 && !isALNUM(*t))))
5442                     {
5443                         /* skip q//-like construct */
5444                         const char *tmps;
5445                         char open, close, term;
5446                         I32 brackets = 1;
5447
5448                         while (t < PL_bufend && isSPACE(*t))
5449                             t++;
5450                         /* check for q => */
5451                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
5452                             OPERATOR(HASHBRACK);
5453                         }
5454                         term = *t;
5455                         open = term;
5456                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5457                             term = tmps[5];
5458                         close = term;
5459                         if (open == close)
5460                             for (t++; t < PL_bufend; t++) {
5461                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
5462                                     t++;
5463                                 else if (*t == open)
5464                                     break;
5465                             }
5466                         else {
5467                             for (t++; t < PL_bufend; t++) {
5468                                 if (*t == '\\' && t+1 < PL_bufend)
5469                                     t++;
5470                                 else if (*t == close && --brackets <= 0)
5471                                     break;
5472                                 else if (*t == open)
5473                                     brackets++;
5474                             }
5475                         }
5476                         t++;
5477                     }
5478                     else
5479                         /* skip plain q word */
5480                         while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5481                              t += UTF8SKIP(t);
5482                 }
5483                 else if (isALNUM_lazy_if(t,UTF)) {
5484                     t += UTF8SKIP(t);
5485                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5486                          t += UTF8SKIP(t);
5487                 }
5488                 while (t < PL_bufend && isSPACE(*t))
5489                     t++;
5490                 /* if comma follows first term, call it an anon hash */
5491                 /* XXX it could be a comma expression with loop modifiers */
5492                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
5493                                    || (*t == '=' && t[1] == '>')))
5494                     OPERATOR(HASHBRACK);
5495                 if (PL_expect == XREF)
5496                     PL_expect = XTERM;
5497                 else {
5498                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
5499                     PL_expect = XSTATE;
5500                 }
5501             }
5502             break;
5503         }
5504         pl_yylval.ival = CopLINE(PL_curcop);
5505         if (isSPACE(*s) || *s == '#')
5506             PL_copline = NOLINE;   /* invalidate current command line number */
5507         TOKEN('{');
5508     case '}':
5509       rightbracket:
5510         s++;
5511         if (PL_lex_brackets <= 0)
5512             yyerror("Unmatched right curly bracket");
5513         else
5514             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
5515         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
5516             PL_lex_formbrack = 0;
5517         if (PL_lex_state == LEX_INTERPNORMAL) {
5518             if (PL_lex_brackets == 0) {
5519                 if (PL_expect & XFAKEBRACK) {
5520                     PL_expect &= XENUMMASK;
5521                     PL_lex_state = LEX_INTERPEND;
5522                     PL_bufptr = s;
5523 #if 0
5524                     if (PL_madskills) {
5525                         if (!PL_thiswhite)
5526                             PL_thiswhite = newSVpvs("");
5527                         sv_catpvs(PL_thiswhite,"}");
5528                     }
5529 #endif
5530                     return yylex();     /* ignore fake brackets */
5531                 }
5532                 if (*s == '-' && s[1] == '>')
5533                     PL_lex_state = LEX_INTERPENDMAYBE;
5534                 else if (*s != '[' && *s != '{')
5535                     PL_lex_state = LEX_INTERPEND;
5536             }
5537         }
5538         if (PL_expect & XFAKEBRACK) {
5539             PL_expect &= XENUMMASK;
5540             PL_bufptr = s;
5541             return yylex();             /* ignore fake brackets */
5542         }
5543         start_force(PL_curforce);
5544         if (PL_madskills) {
5545             curmad('X', newSVpvn(s-1,1));
5546             CURMAD('_', PL_thiswhite);
5547         }
5548         force_next('}');
5549 #ifdef PERL_MAD
5550         if (!PL_thistoken)
5551             PL_thistoken = newSVpvs("");
5552 #endif
5553         TOKEN(';');
5554     case '&':
5555         s++;
5556         if (*s++ == '&')
5557             AOPERATOR(ANDAND);
5558         s--;
5559         if (PL_expect == XOPERATOR) {
5560             if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
5561                 && isIDFIRST_lazy_if(s,UTF))
5562             {
5563                 CopLINE_dec(PL_curcop);
5564                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
5565                 CopLINE_inc(PL_curcop);
5566             }
5567             BAop(OP_BIT_AND);
5568         }
5569
5570         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5571         if (*PL_tokenbuf) {
5572             PL_expect = XOPERATOR;
5573             force_ident(PL_tokenbuf, '&');
5574         }
5575         else
5576             PREREF('&');
5577         pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
5578         TERM('&');
5579
5580     case '|':
5581         s++;
5582         if (*s++ == '|')
5583             AOPERATOR(OROR);
5584         s--;
5585         BOop(OP_BIT_OR);
5586     case '=':
5587         s++;
5588         {
5589             const char tmp = *s++;
5590             if (tmp == '=')
5591                 Eop(OP_EQ);
5592             if (tmp == '>')
5593                 OPERATOR(',');
5594             if (tmp == '~')
5595                 PMop(OP_MATCH);
5596             if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
5597                 && strchr("+-*/%.^&|<",tmp))
5598                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5599                             "Reversed %c= operator",(int)tmp);
5600             s--;
5601             if (PL_expect == XSTATE && isALPHA(tmp) &&
5602                 (s == PL_linestart+1 || s[-2] == '\n') )
5603                 {
5604                     if (PL_in_eval && !PL_rsfp) {
5605                         d = PL_bufend;
5606                         while (s < d) {
5607                             if (*s++ == '\n') {
5608                                 incline(s);
5609                                 if (strnEQ(s,"=cut",4)) {
5610                                     s = strchr(s,'\n');
5611                                     if (s)
5612                                         s++;
5613                                     else
5614                                         s = d;
5615                                     incline(s);
5616                                     goto retry;
5617                                 }
5618                             }
5619                         }
5620                         goto retry;
5621                     }
5622 #ifdef PERL_MAD
5623                     if (PL_madskills) {
5624                         if (!PL_thiswhite)
5625                             PL_thiswhite = newSVpvs("");
5626                         sv_catpvn(PL_thiswhite, PL_linestart,
5627                                   PL_bufend - PL_linestart);
5628                     }
5629 #endif
5630                     s = PL_bufend;
5631                     PL_doextract = TRUE;
5632                     goto retry;
5633                 }
5634         }
5635         if (PL_lex_brackets < PL_lex_formbrack) {
5636             const char *t = s;
5637 #ifdef PERL_STRICT_CR
5638             while (SPACE_OR_TAB(*t))
5639 #else
5640             while (SPACE_OR_TAB(*t) || *t == '\r')
5641 #endif
5642                 t++;
5643             if (*t == '\n' || *t == '#') {
5644                 s--;
5645                 PL_expect = XBLOCK;
5646                 goto leftbracket;
5647             }
5648         }
5649         pl_yylval.ival = 0;
5650         OPERATOR(ASSIGNOP);
5651     case '!':
5652         s++;
5653         {
5654             const char tmp = *s++;
5655             if (tmp == '=') {
5656                 /* was this !=~ where !~ was meant?
5657                  * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
5658
5659                 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
5660                     const char *t = s+1;
5661
5662                     while (t < PL_bufend && isSPACE(*t))
5663                         ++t;
5664
5665                     if (*t == '/' || *t == '?' ||
5666                         ((*t == 'm' || *t == 's' || *t == 'y')
5667                          && !isALNUM(t[1])) ||
5668                         (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
5669                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5670                                     "!=~ should be !~");
5671                 }
5672                 Eop(OP_NE);
5673             }
5674             if (tmp == '~')
5675                 PMop(OP_NOT);
5676         }
5677         s--;
5678         OPERATOR('!');
5679     case '<':
5680         if (PL_expect != XOPERATOR) {
5681             if (s[1] != '<' && !strchr(s,'>'))
5682                 check_uni();
5683             if (s[1] == '<')
5684                 s = scan_heredoc(s);
5685             else
5686                 s = scan_inputsymbol(s);
5687             TERM(sublex_start());
5688         }
5689         s++;
5690         {
5691             char tmp = *s++;
5692             if (tmp == '<')
5693                 SHop(OP_LEFT_SHIFT);
5694             if (tmp == '=') {
5695                 tmp = *s++;
5696                 if (tmp == '>')
5697                     Eop(OP_NCMP);
5698                 s--;
5699                 Rop(OP_LE);
5700             }
5701         }
5702         s--;
5703         Rop(OP_LT);
5704     case '>':
5705         s++;
5706         {
5707             const char tmp = *s++;
5708             if (tmp == '>')
5709                 SHop(OP_RIGHT_SHIFT);
5710             else if (tmp == '=')
5711                 Rop(OP_GE);
5712         }
5713         s--;
5714         Rop(OP_GT);
5715
5716     case '$':
5717         CLINE;
5718
5719         if (PL_expect == XOPERATOR) {
5720             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5721                 return deprecate_commaless_var_list();
5722             }
5723         }
5724
5725         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
5726             PL_tokenbuf[0] = '@';
5727             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
5728                            sizeof PL_tokenbuf - 1, FALSE);
5729             if (PL_expect == XOPERATOR)
5730                 no_op("Array length", s);
5731             if (!PL_tokenbuf[1])
5732                 PREREF(DOLSHARP);
5733             PL_expect = XOPERATOR;
5734             PL_pending_ident = '#';
5735             TOKEN(DOLSHARP);
5736         }
5737
5738         PL_tokenbuf[0] = '$';
5739         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5740                        sizeof PL_tokenbuf - 1, FALSE);
5741         if (PL_expect == XOPERATOR)
5742             no_op("Scalar", s);
5743         if (!PL_tokenbuf[1]) {
5744             if (s == PL_bufend)
5745                 yyerror("Final $ should be \\$ or $name");
5746             PREREF('$');
5747         }
5748
5749         /* This kludge not intended to be bulletproof. */
5750         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
5751             pl_yylval.opval = newSVOP(OP_CONST, 0,
5752                                    newSViv(CopARYBASE_get(&PL_compiling)));
5753             pl_yylval.opval->op_private = OPpCONST_ARYBASE;
5754             TERM(THING);
5755         }
5756
5757         d = s;
5758         {
5759             const char tmp = *s;
5760             if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
5761                 s = SKIPSPACE1(s);
5762
5763             if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
5764                 && intuit_more(s)) {
5765                 if (*s == '[') {
5766                     PL_tokenbuf[0] = '@';
5767                     if (ckWARN(WARN_SYNTAX)) {
5768                         char *t = s+1;
5769
5770                         while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
5771                             t++;
5772                         if (*t++ == ',') {
5773                             PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5774                             while (t < PL_bufend && *t != ']')
5775                                 t++;
5776                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5777                                         "Multidimensional syntax %.*s not supported",
5778                                     (int)((t - PL_bufptr) + 1), PL_bufptr);
5779                         }
5780                     }
5781                 }
5782                 else if (*s == '{') {
5783                     char *t;
5784                     PL_tokenbuf[0] = '%';
5785                     if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
5786                         && (t = strchr(s, '}')) && (t = strchr(t, '=')))
5787                         {
5788                             char tmpbuf[sizeof PL_tokenbuf];
5789                             do {
5790                                 t++;
5791                             } while (isSPACE(*t));
5792                             if (isIDFIRST_lazy_if(t,UTF)) {
5793                                 STRLEN len;
5794                                 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
5795                                               &len);
5796                                 while (isSPACE(*t))
5797                                     t++;
5798                                 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
5799                                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5800                                                 "You need to quote \"%s\"",
5801                                                 tmpbuf);
5802                             }
5803                         }
5804                 }
5805             }
5806
5807             PL_expect = XOPERATOR;
5808             if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
5809                 const bool islop = (PL_last_lop == PL_oldoldbufptr);
5810                 if (!islop || PL_last_lop_op == OP_GREPSTART)
5811                     PL_expect = XOPERATOR;
5812                 else if (strchr("$@\"'`q", *s))
5813                     PL_expect = XTERM;          /* e.g. print $fh "foo" */
5814                 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
5815                     PL_expect = XTERM;          /* e.g. print $fh &sub */
5816                 else if (isIDFIRST_lazy_if(s,UTF)) {
5817                     char tmpbuf[sizeof PL_tokenbuf];
5818                     int t2;
5819                     scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5820                     if ((t2 = keyword(tmpbuf, len, 0))) {
5821                         /* binary operators exclude handle interpretations */
5822                         switch (t2) {
5823                         case -KEY_x:
5824                         case -KEY_eq:
5825                         case -KEY_ne:
5826                         case -KEY_gt:
5827                         case -KEY_lt:
5828                         case -KEY_ge:
5829                         case -KEY_le:
5830                         case -KEY_cmp:
5831                             break;
5832                         default:
5833                             PL_expect = XTERM;  /* e.g. print $fh length() */
5834                             break;
5835                         }
5836                     }
5837                     else {
5838                         PL_expect = XTERM;      /* e.g. print $fh subr() */
5839                     }
5840                 }
5841                 else if (isDIGIT(*s))
5842                     PL_expect = XTERM;          /* e.g. print $fh 3 */
5843                 else if (*s == '.' && isDIGIT(s[1]))
5844                     PL_expect = XTERM;          /* e.g. print $fh .3 */
5845                 else if ((*s == '?' || *s == '-' || *s == '+')
5846                          && !isSPACE(s[1]) && s[1] != '=')
5847                     PL_expect = XTERM;          /* e.g. print $fh -1 */
5848                 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
5849                          && s[1] != '/')
5850                     PL_expect = XTERM;          /* e.g. print $fh /.../
5851                                                    XXX except DORDOR operator
5852                                                 */
5853                 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
5854                          && s[2] != '=')
5855                     PL_expect = XTERM;          /* print $fh <<"EOF" */
5856             }
5857         }
5858         PL_pending_ident = '$';
5859         TOKEN('$');
5860
5861     case '@':
5862         if (PL_expect == XOPERATOR)
5863             no_op("Array", s);
5864         PL_tokenbuf[0] = '@';
5865         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
5866         if (!PL_tokenbuf[1]) {
5867             PREREF('@');
5868         }
5869         if (PL_lex_state == LEX_NORMAL)
5870             s = SKIPSPACE1(s);
5871         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
5872             if (*s == '{')
5873                 PL_tokenbuf[0] = '%';
5874
5875             /* Warn about @ where they meant $. */
5876             if (*s == '[' || *s == '{') {
5877                 if (ckWARN(WARN_SYNTAX)) {
5878                     const char *t = s + 1;
5879                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
5880                         t++;
5881                     if (*t == '}' || *t == ']') {
5882                         t++;
5883                         PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5884                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5885                             "Scalar value %.*s better written as $%.*s",
5886                             (int)(t-PL_bufptr), PL_bufptr,
5887                             (int)(t-PL_bufptr-1), PL_bufptr+1);
5888                     }
5889                 }
5890             }
5891         }
5892         PL_pending_ident = '@';
5893         TERM('@');
5894
5895      case '/':                  /* may be division, defined-or, or pattern */
5896         if (PL_expect == XTERMORDORDOR && s[1] == '/') {
5897             s += 2;
5898             AOPERATOR(DORDOR);
5899         }
5900      case '?':                  /* may either be conditional or pattern */
5901         if (PL_expect == XOPERATOR) {
5902              char tmp = *s++;
5903              if(tmp == '?') {
5904                 OPERATOR('?');
5905              }
5906              else {
5907                  tmp = *s++;
5908                  if(tmp == '/') {
5909                      /* A // operator. */
5910                     AOPERATOR(DORDOR);
5911                  }
5912                  else {
5913                      s--;
5914                      Mop(OP_DIVIDE);
5915                  }
5916              }
5917          }
5918          else {
5919              /* Disable warning on "study /blah/" */
5920              if (PL_oldoldbufptr == PL_last_uni
5921               && (*PL_last_uni != 's' || s - PL_last_uni < 5
5922                   || memNE(PL_last_uni, "study", 5)
5923                   || isALNUM_lazy_if(PL_last_uni+5,UTF)
5924               ))
5925                  check_uni();
5926              s = scan_pat(s,OP_MATCH);
5927              TERM(sublex_start());
5928          }
5929
5930     case '.':
5931         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
5932 #ifdef PERL_STRICT_CR
5933             && s[1] == '\n'
5934 #else
5935             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
5936 #endif
5937             && (s == PL_linestart || s[-1] == '\n') )
5938         {
5939             PL_lex_formbrack = 0;
5940             PL_expect = XSTATE;
5941             goto rightbracket;
5942         }
5943         if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
5944             s += 3;
5945             OPERATOR(YADAYADA);
5946         }
5947         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
5948             char tmp = *s++;
5949             if (*s == tmp) {
5950                 s++;
5951                 if (*s == tmp) {
5952                     s++;
5953                     pl_yylval.ival = OPf_SPECIAL;
5954                 }
5955                 else
5956                     pl_yylval.ival = 0;
5957                 OPERATOR(DOTDOT);
5958             }
5959             Aop(OP_CONCAT);
5960         }
5961         /* FALL THROUGH */
5962     case '0': case '1': case '2': case '3': case '4':
5963     case '5': case '6': case '7': case '8': case '9':
5964         s = scan_num(s, &pl_yylval);
5965         DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
5966         if (PL_expect == XOPERATOR)
5967             no_op("Number",s);
5968         TERM(THING);
5969
5970     case '\'':
5971         s = scan_str(s,!!PL_madskills,FALSE);
5972         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5973         if (PL_expect == XOPERATOR) {
5974             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5975                 return deprecate_commaless_var_list();
5976             }
5977             else
5978                 no_op("String",s);
5979         }
5980         if (!s)
5981             missingterm(NULL);
5982         pl_yylval.ival = OP_CONST;
5983         TERM(sublex_start());
5984
5985     case '"':
5986         s = scan_str(s,!!PL_madskills,FALSE);
5987         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5988         if (PL_expect == XOPERATOR) {
5989             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5990                 return deprecate_commaless_var_list();
5991             }
5992             else
5993                 no_op("String",s);
5994         }
5995         if (!s)
5996             missingterm(NULL);
5997         pl_yylval.ival = OP_CONST;
5998         /* FIXME. I think that this can be const if char *d is replaced by
5999            more localised variables.  */
6000         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
6001             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
6002                 pl_yylval.ival = OP_STRINGIFY;
6003                 break;
6004             }
6005         }
6006         TERM(sublex_start());
6007
6008     case '`':
6009         s = scan_str(s,!!PL_madskills,FALSE);
6010         DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
6011         if (PL_expect == XOPERATOR)
6012             no_op("Backticks",s);
6013         if (!s)
6014             missingterm(NULL);
6015         readpipe_override();
6016         TERM(sublex_start());
6017
6018     case '\\':
6019         s++;
6020         if (PL_lex_inwhat && isDIGIT(*s))
6021             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
6022                            *s, *s);
6023         if (PL_expect == XOPERATOR)
6024             no_op("Backslash",s);
6025         OPERATOR(REFGEN);
6026
6027     case 'v':
6028         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
6029             char *start = s + 2;
6030             while (isDIGIT(*start) || *start == '_')
6031                 start++;
6032             if (*start == '.' && isDIGIT(start[1])) {
6033                 s = scan_num(s, &pl_yylval);
6034                 TERM(THING);
6035             }
6036             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6037             else if (!isALPHA(*start) && (PL_expect == XTERM
6038                         || PL_expect == XREF || PL_expect == XSTATE
6039                         || PL_expect == XTERMORDORDOR)) {
6040                 GV *const gv = gv_fetchpvn_flags(s, start - s, 0, SVt_PVCV);
6041                 if (!gv) {
6042                     s = scan_num(s, &pl_yylval);
6043                     TERM(THING);
6044                 }
6045             }
6046         }
6047         goto keylookup;
6048     case 'x':
6049         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
6050             s++;
6051             Mop(OP_REPEAT);
6052         }
6053         goto keylookup;
6054
6055     case '_':
6056     case 'a': case 'A':
6057     case 'b': case 'B':
6058     case 'c': case 'C':
6059     case 'd': case 'D':
6060     case 'e': case 'E':
6061     case 'f': case 'F':
6062     case 'g': case 'G':
6063     case 'h': case 'H':
6064     case 'i': case 'I':
6065     case 'j': case 'J':
6066     case 'k': case 'K':
6067     case 'l': case 'L':
6068     case 'm': case 'M':
6069     case 'n': case 'N':
6070     case 'o': case 'O':
6071     case 'p': case 'P':
6072     case 'q': case 'Q':
6073     case 'r': case 'R':
6074     case 's': case 'S':
6075     case 't': case 'T':
6076     case 'u': case 'U':
6077               case 'V':
6078     case 'w': case 'W':
6079               case 'X':
6080     case 'y': case 'Y':
6081     case 'z': case 'Z':
6082
6083       keylookup: {
6084         bool anydelim;
6085         I32 tmp;
6086
6087         orig_keyword = 0;
6088         gv = NULL;
6089         gvp = NULL;
6090
6091         PL_bufptr = s;
6092         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6093
6094         /* Some keywords can be followed by any delimiter, including ':' */
6095         anydelim = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
6096                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
6097                              (PL_tokenbuf[0] == 'q' &&
6098                               strchr("qwxr", PL_tokenbuf[1])))));
6099
6100         /* x::* is just a word, unless x is "CORE" */
6101         if (!anydelim && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
6102             goto just_a_word;
6103
6104         d = s;
6105         while (d < PL_bufend && isSPACE(*d))
6106                 d++;    /* no comments skipped here, or s### is misparsed */
6107
6108         /* Is this a word before a => operator? */
6109         if (*d == '=' && d[1] == '>') {
6110             CLINE;
6111             pl_yylval.opval
6112                 = (OP*)newSVOP(OP_CONST, 0,
6113                                S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
6114             pl_yylval.opval->op_private = OPpCONST_BARE;
6115             TERM(WORD);
6116         }
6117
6118         /* Check for plugged-in keyword */
6119         {
6120             OP *o;
6121             int result;
6122             char *saved_bufptr = PL_bufptr;
6123             PL_bufptr = s;
6124             result = CALL_FPTR(PL_keyword_plugin)(aTHX_ PL_tokenbuf, len, &o);
6125             s = PL_bufptr;
6126             if (result == KEYWORD_PLUGIN_DECLINE) {
6127                 /* not a plugged-in keyword */
6128                 PL_bufptr = saved_bufptr;
6129             } else if (result == KEYWORD_PLUGIN_STMT) {
6130                 pl_yylval.opval = o;
6131                 CLINE;
6132                 PL_expect = XSTATE;
6133                 return REPORT(PLUGSTMT);
6134             } else if (result == KEYWORD_PLUGIN_EXPR) {
6135                 pl_yylval.opval = o;
6136                 CLINE;
6137                 PL_expect = XOPERATOR;
6138                 return REPORT(PLUGEXPR);
6139             } else {
6140                 Perl_croak(aTHX_ "Bad plugin affecting keyword '%s'",
6141                                         PL_tokenbuf);
6142             }
6143         }
6144
6145         /* Check for built-in keyword */
6146         tmp = keyword(PL_tokenbuf, len, 0);
6147
6148         /* Is this a label? */
6149         if (!anydelim && PL_expect == XSTATE
6150               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
6151             s = d + 1;
6152             pl_yylval.pval = CopLABEL_alloc(PL_tokenbuf);
6153             CLINE;
6154             TOKEN(LABEL);
6155         }
6156
6157         if (tmp < 0) {                  /* second-class keyword? */
6158             GV *ogv = NULL;     /* override (winner) */
6159             GV *hgv = NULL;     /* hidden (loser) */
6160             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
6161                 CV *cv;
6162                 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
6163                     (cv = GvCVu(gv)))
6164                 {
6165                     if (GvIMPORTED_CV(gv))
6166                         ogv = gv;
6167                     else if (! CvMETHOD(cv))
6168                         hgv = gv;
6169                 }
6170                 if (!ogv &&
6171                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
6172                     (gv = *gvp) && isGV_with_GP(gv) &&
6173                     GvCVu(gv) && GvIMPORTED_CV(gv))
6174                 {
6175                     ogv = gv;
6176                 }
6177             }
6178             if (ogv) {
6179                 orig_keyword = tmp;
6180                 tmp = 0;                /* overridden by import or by GLOBAL */
6181             }
6182             else if (gv && !gvp
6183                      && -tmp==KEY_lock  /* XXX generalizable kludge */
6184                      && GvCVu(gv))
6185             {
6186                 tmp = 0;                /* any sub overrides "weak" keyword */
6187             }
6188             else {                      /* no override */
6189                 tmp = -tmp;
6190                 if (tmp == KEY_dump) {
6191                     Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
6192                                    "dump() better written as CORE::dump()");
6193                 }
6194                 gv = NULL;
6195                 gvp = 0;
6196                 if (hgv && tmp != KEY_x && tmp != KEY_CORE)     /* never ambiguous */
6197                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6198                                    "Ambiguous call resolved as CORE::%s(), %s",
6199                                    GvENAME(hgv), "qualify as such or use &");
6200             }
6201         }
6202
6203       reserved_word:
6204         switch (tmp) {
6205
6206         default:                        /* not a keyword */
6207             /* Trade off - by using this evil construction we can pull the
6208                variable gv into the block labelled keylookup. If not, then
6209                we have to give it function scope so that the goto from the
6210                earlier ':' case doesn't bypass the initialisation.  */
6211             if (0) {
6212             just_a_word_zero_gv:
6213                 gv = NULL;
6214                 gvp = NULL;
6215                 orig_keyword = 0;
6216             }
6217           just_a_word: {
6218                 SV *sv;
6219                 int pkgname = 0;
6220                 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
6221                 OP *rv2cv_op;
6222                 CV *cv;
6223 #ifdef PERL_MAD
6224                 SV *nextPL_nextwhite = 0;
6225 #endif
6226
6227
6228                 /* Get the rest if it looks like a package qualifier */
6229
6230                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
6231                     STRLEN morelen;
6232                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
6233                                   TRUE, &morelen);
6234                     if (!morelen)
6235                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
6236                                 *s == '\'' ? "'" : "::");
6237                     len += morelen;
6238                     pkgname = 1;
6239                 }
6240
6241                 if (PL_expect == XOPERATOR) {
6242                     if (PL_bufptr == PL_linestart) {
6243                         CopLINE_dec(PL_curcop);
6244                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
6245                         CopLINE_inc(PL_curcop);
6246                     }
6247                     else
6248                         no_op("Bareword",s);
6249                 }
6250
6251                 /* Look for a subroutine with this name in current package,
6252                    unless name is "Foo::", in which case Foo is a bearword
6253                    (and a package name). */
6254
6255                 if (len > 2 && !PL_madskills &&
6256                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
6257                 {
6258                     if (ckWARN(WARN_BAREWORD)
6259                         && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
6260                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
6261                             "Bareword \"%s\" refers to nonexistent package",
6262                              PL_tokenbuf);
6263                     len -= 2;
6264                     PL_tokenbuf[len] = '\0';
6265                     gv = NULL;
6266                     gvp = 0;
6267                 }
6268                 else {
6269                     if (!gv) {
6270                         /* Mustn't actually add anything to a symbol table.
6271                            But also don't want to "initialise" any placeholder
6272                            constants that might already be there into full
6273                            blown PVGVs with attached PVCV.  */
6274                         gv = gv_fetchpvn_flags(PL_tokenbuf, len,
6275                                                GV_NOADD_NOINIT, SVt_PVCV);
6276                     }
6277                     len = 0;
6278                 }
6279
6280                 /* if we saw a global override before, get the right name */
6281
6282                 if (gvp) {
6283                     sv = newSVpvs("CORE::GLOBAL::");
6284                     sv_catpv(sv,PL_tokenbuf);
6285                 }
6286                 else {
6287                     /* If len is 0, newSVpv does strlen(), which is correct.
6288                        If len is non-zero, then it will be the true length,
6289                        and so the scalar will be created correctly.  */
6290                     sv = newSVpv(PL_tokenbuf,len);
6291                 }
6292 #ifdef PERL_MAD
6293                 if (PL_madskills && !PL_thistoken) {
6294                     char *start = SvPVX(PL_linestr) + PL_realtokenstart;
6295                     PL_thistoken = newSVpvn(start,s - start);
6296                     PL_realtokenstart = s - SvPVX(PL_linestr);
6297                 }
6298 #endif
6299
6300                 /* Presume this is going to be a bareword of some sort. */
6301
6302                 CLINE;
6303                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
6304                 pl_yylval.opval->op_private = OPpCONST_BARE;
6305                 /* UTF-8 package name? */
6306                 if (UTF && !IN_BYTES &&
6307                     is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
6308                     SvUTF8_on(sv);
6309
6310                 /* And if "Foo::", then that's what it certainly is. */
6311
6312                 if (len)
6313                     goto safe_bareword;
6314
6315                 cv = NULL;
6316                 {
6317                     OP *const_op = newSVOP(OP_CONST, 0, SvREFCNT_inc(sv));
6318                     const_op->op_private = OPpCONST_BARE;
6319                     rv2cv_op = newCVREF(0, const_op);
6320                 }
6321                 if (rv2cv_op->op_type == OP_RV2CV &&
6322                         (rv2cv_op->op_flags & OPf_KIDS)) {
6323                     OP *rv_op = cUNOPx(rv2cv_op)->op_first;
6324                     switch (rv_op->op_type) {
6325                         case OP_CONST: {
6326                             SV *sv = cSVOPx_sv(rv_op);
6327                             if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)
6328                                 cv = (CV*)SvRV(sv);
6329                         } break;
6330                         case OP_GV: {
6331                             GV *gv = cGVOPx_gv(rv_op);
6332                             CV *maybe_cv = GvCVu(gv);
6333                             if (maybe_cv && SvTYPE((SV*)maybe_cv) == SVt_PVCV)
6334                                 cv = maybe_cv;
6335                         } break;
6336                     }
6337                 }
6338
6339                 /* See if it's the indirect object for a list operator. */
6340
6341                 if (PL_oldoldbufptr &&
6342                     PL_oldoldbufptr < PL_bufptr &&
6343                     (PL_oldoldbufptr == PL_last_lop
6344                      || PL_oldoldbufptr == PL_last_uni) &&
6345                     /* NO SKIPSPACE BEFORE HERE! */
6346                     (PL_expect == XREF ||
6347                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
6348                 {
6349                     bool immediate_paren = *s == '(';
6350
6351                     /* (Now we can afford to cross potential line boundary.) */
6352                     s = SKIPSPACE2(s,nextPL_nextwhite);
6353 #ifdef PERL_MAD
6354                     PL_nextwhite = nextPL_nextwhite;    /* assume no & deception */
6355 #endif
6356
6357                     /* Two barewords in a row may indicate method call. */
6358
6359                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
6360                         (tmp = intuit_method(s, gv, cv))) {
6361                         op_free(rv2cv_op);
6362                         return REPORT(tmp);
6363                     }
6364
6365                     /* If not a declared subroutine, it's an indirect object. */
6366                     /* (But it's an indir obj regardless for sort.) */
6367                     /* Also, if "_" follows a filetest operator, it's a bareword */
6368
6369                     if (
6370                         ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
6371                          (!cv &&
6372                         (PL_last_lop_op != OP_MAPSTART &&
6373                          PL_last_lop_op != OP_GREPSTART))))
6374                        || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
6375                             && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
6376                        )
6377                     {
6378                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
6379                         goto bareword;
6380                     }
6381                 }
6382
6383                 PL_expect = XOPERATOR;
6384 #ifdef PERL_MAD
6385                 if (isSPACE(*s))
6386                     s = SKIPSPACE2(s,nextPL_nextwhite);
6387                 PL_nextwhite = nextPL_nextwhite;
6388 #else
6389                 s = skipspace(s);
6390 #endif
6391
6392                 /* Is this a word before a => operator? */
6393                 if (*s == '=' && s[1] == '>' && !pkgname) {
6394                     op_free(rv2cv_op);
6395                     CLINE;
6396                     sv_setpv(((SVOP*)pl_yylval.opval)->op_sv, PL_tokenbuf);
6397                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
6398                       SvUTF8_on(((SVOP*)pl_yylval.opval)->op_sv);
6399                     TERM(WORD);
6400                 }
6401
6402                 /* If followed by a paren, it's certainly a subroutine. */
6403                 if (*s == '(') {
6404                     CLINE;
6405                     if (cv) {
6406                         d = s + 1;
6407                         while (SPACE_OR_TAB(*d))
6408                             d++;
6409                         if (*d == ')' && (sv = cv_const_sv(cv))) {
6410                             s = d + 1;
6411                             goto its_constant;
6412                         }
6413                     }
6414 #ifdef PERL_MAD
6415                     if (PL_madskills) {
6416                         PL_nextwhite = PL_thiswhite;
6417                         PL_thiswhite = 0;
6418                     }
6419                     start_force(PL_curforce);
6420 #endif
6421                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6422                     PL_expect = XOPERATOR;
6423 #ifdef PERL_MAD
6424                     if (PL_madskills) {
6425                         PL_nextwhite = nextPL_nextwhite;
6426                         curmad('X', PL_thistoken);
6427                         PL_thistoken = newSVpvs("");
6428                     }
6429 #endif
6430                     op_free(rv2cv_op);
6431                     force_next(WORD);
6432                     pl_yylval.ival = 0;
6433                     TOKEN('&');
6434                 }
6435
6436                 /* If followed by var or block, call it a method (unless sub) */
6437
6438                 if ((*s == '$' || *s == '{') && !cv) {
6439                     op_free(rv2cv_op);
6440                     PL_last_lop = PL_oldbufptr;
6441                     PL_last_lop_op = OP_METHOD;
6442                     PREBLOCK(METHOD);
6443                 }
6444
6445                 /* If followed by a bareword, see if it looks like indir obj. */
6446
6447                 if (!orig_keyword
6448                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
6449                         && (tmp = intuit_method(s, gv, cv))) {
6450                     op_free(rv2cv_op);
6451                     return REPORT(tmp);
6452                 }
6453
6454                 /* Not a method, so call it a subroutine (if defined) */
6455
6456                 if (cv) {
6457                     if (lastchar == '-')
6458                         Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6459                                          "Ambiguous use of -%s resolved as -&%s()",
6460                                          PL_tokenbuf, PL_tokenbuf);
6461                     /* Check for a constant sub */
6462                     if ((sv = cv_const_sv(cv))) {
6463                   its_constant:
6464                         op_free(rv2cv_op);
6465                         SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
6466                         ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
6467                         pl_yylval.opval->op_private = 0;
6468                         TOKEN(WORD);
6469                     }
6470
6471                     op_free(pl_yylval.opval);
6472                     pl_yylval.opval = rv2cv_op;
6473                     pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6474                     PL_last_lop = PL_oldbufptr;
6475                     PL_last_lop_op = OP_ENTERSUB;
6476                     /* Is there a prototype? */
6477                     if (
6478 #ifdef PERL_MAD
6479                         cv &&
6480 #endif
6481                         SvPOK(cv))
6482                     {
6483                         STRLEN protolen;
6484                         const char *proto = SvPV_const(MUTABLE_SV(cv), protolen);
6485                         if (!protolen)
6486                             TERM(FUNC0SUB);
6487                         if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
6488                             OPERATOR(UNIOPSUB);
6489                         while (*proto == ';')
6490                             proto++;
6491                         if (*proto == '&' && *s == '{') {
6492                             if (PL_curstash)
6493                                 sv_setpvs(PL_subname, "__ANON__");
6494                             else
6495                                 sv_setpvs(PL_subname, "__ANON__::__ANON__");
6496                             PREBLOCK(LSTOPSUB);
6497                         }
6498                     }
6499 #ifdef PERL_MAD
6500                     {
6501                         if (PL_madskills) {
6502                             PL_nextwhite = PL_thiswhite;
6503                             PL_thiswhite = 0;
6504                         }
6505                         start_force(PL_curforce);
6506                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6507                         PL_expect = XTERM;
6508                         if (PL_madskills) {
6509                             PL_nextwhite = nextPL_nextwhite;
6510                             curmad('X', PL_thistoken);
6511                             PL_thistoken = newSVpvs("");
6512                         }
6513                         force_next(WORD);
6514                         TOKEN(NOAMP);
6515                     }
6516                 }
6517
6518                 /* Guess harder when madskills require "best effort". */
6519                 if (PL_madskills && (!gv || !GvCVu(gv))) {
6520                     int probable_sub = 0;
6521                     if (strchr("\"'`$@%0123456789!*+{[<", *s))
6522                         probable_sub = 1;
6523                     else if (isALPHA(*s)) {
6524                         char tmpbuf[1024];
6525                         STRLEN tmplen;
6526                         d = s;
6527                         d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
6528                         if (!keyword(tmpbuf, tmplen, 0))
6529                             probable_sub = 1;
6530                         else {
6531                             while (d < PL_bufend && isSPACE(*d))
6532                                 d++;
6533                             if (*d == '=' && d[1] == '>')
6534                                 probable_sub = 1;
6535                         }
6536                     }
6537                     if (probable_sub) {
6538                         gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
6539                         op_free(pl_yylval.opval);
6540                         pl_yylval.opval = rv2cv_op;
6541                         pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6542                         PL_last_lop = PL_oldbufptr;
6543                         PL_last_lop_op = OP_ENTERSUB;
6544                         PL_nextwhite = PL_thiswhite;
6545                         PL_thiswhite = 0;
6546                         start_force(PL_curforce);
6547                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6548                         PL_expect = XTERM;
6549                         PL_nextwhite = nextPL_nextwhite;
6550                         curmad('X', PL_thistoken);
6551                         PL_thistoken = newSVpvs("");
6552                         force_next(WORD);
6553                         TOKEN(NOAMP);
6554                     }
6555 #else
6556                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6557                     PL_expect = XTERM;
6558                     force_next(WORD);
6559                     TOKEN(NOAMP);
6560 #endif
6561                 }
6562
6563                 /* Call it a bare word */
6564
6565                 if (PL_hints & HINT_STRICT_SUBS)
6566                     pl_yylval.opval->op_private |= OPpCONST_STRICT;
6567                 else {
6568                 bareword:
6569                     /* after "print" and similar functions (corresponding to
6570                      * "F? L" in opcode.pl), whatever wasn't already parsed as
6571                      * a filehandle should be subject to "strict subs".
6572                      * Likewise for the optional indirect-object argument to system
6573                      * or exec, which can't be a bareword */
6574                     if ((PL_last_lop_op == OP_PRINT
6575                             || PL_last_lop_op == OP_PRTF
6576                             || PL_last_lop_op == OP_SAY
6577                             || PL_last_lop_op == OP_SYSTEM
6578                             || PL_last_lop_op == OP_EXEC)
6579                             && (PL_hints & HINT_STRICT_SUBS))
6580                         pl_yylval.opval->op_private |= OPpCONST_STRICT;
6581                     if (lastchar != '-') {
6582                         if (ckWARN(WARN_RESERVED)) {
6583                             d = PL_tokenbuf;
6584                             while (isLOWER(*d))
6585                                 d++;
6586                             if (!*d && !gv_stashpv(PL_tokenbuf, 0))
6587                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
6588                                        PL_tokenbuf);
6589                         }
6590                     }
6591                 }
6592                 op_free(rv2cv_op);
6593
6594             safe_bareword:
6595                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')) {
6596                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6597                                      "Operator or semicolon missing before %c%s",
6598                                      lastchar, PL_tokenbuf);
6599                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6600                                      "Ambiguous use of %c resolved as operator %c",
6601                                      lastchar, lastchar);
6602                 }
6603                 TOKEN(WORD);
6604             }
6605
6606         case KEY___FILE__:
6607             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6608                                         newSVpv(CopFILE(PL_curcop),0));
6609             TERM(THING);
6610
6611         case KEY___LINE__:
6612             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6613                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
6614             TERM(THING);
6615
6616         case KEY___PACKAGE__:
6617             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6618                                         (PL_curstash
6619                                          ? newSVhek(HvNAME_HEK(PL_curstash))
6620                                          : &PL_sv_undef));
6621             TERM(THING);
6622
6623         case KEY___DATA__:
6624         case KEY___END__: {
6625             GV *gv;
6626             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
6627                 const char *pname = "main";
6628                 if (PL_tokenbuf[2] == 'D')
6629                     pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
6630                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
6631                                 SVt_PVIO);
6632                 GvMULTI_on(gv);
6633                 if (!GvIO(gv))
6634                     GvIOp(gv) = newIO();
6635                 IoIFP(GvIOp(gv)) = PL_rsfp;
6636 #if defined(HAS_FCNTL) && defined(F_SETFD)
6637                 {
6638                     const int fd = PerlIO_fileno(PL_rsfp);
6639                     fcntl(fd,F_SETFD,fd >= 3);
6640                 }
6641 #endif
6642                 /* Mark this internal pseudo-handle as clean */
6643                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
6644                 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
6645                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
6646                 else
6647                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
6648 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
6649                 /* if the script was opened in binmode, we need to revert
6650                  * it to text mode for compatibility; but only iff it has CRs
6651                  * XXX this is a questionable hack at best. */
6652                 if (PL_bufend-PL_bufptr > 2
6653                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
6654                 {
6655                     Off_t loc = 0;
6656                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
6657                         loc = PerlIO_tell(PL_rsfp);
6658                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
6659                     }
6660 #ifdef NETWARE
6661                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
6662 #else
6663                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
6664 #endif  /* NETWARE */
6665 #ifdef PERLIO_IS_STDIO /* really? */
6666 #  if defined(__BORLANDC__)
6667                         /* XXX see note in do_binmode() */
6668                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
6669 #  endif
6670 #endif
6671                         if (loc > 0)
6672                             PerlIO_seek(PL_rsfp, loc, 0);
6673                     }
6674                 }
6675 #endif
6676 #ifdef PERLIO_LAYERS
6677                 if (!IN_BYTES) {
6678                     if (UTF)
6679                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
6680                     else if (PL_encoding) {
6681                         SV *name;
6682                         dSP;
6683                         ENTER;
6684                         SAVETMPS;
6685                         PUSHMARK(sp);
6686                         EXTEND(SP, 1);
6687                         XPUSHs(PL_encoding);
6688                         PUTBACK;
6689                         call_method("name", G_SCALAR);
6690                         SPAGAIN;
6691                         name = POPs;
6692                         PUTBACK;
6693                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
6694                                             Perl_form(aTHX_ ":encoding(%"SVf")",
6695                                                       SVfARG(name)));
6696                         FREETMPS;
6697                         LEAVE;
6698                     }
6699                 }
6700 #endif
6701 #ifdef PERL_MAD
6702                 if (PL_madskills) {
6703                     if (PL_realtokenstart >= 0) {
6704                         char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
6705                         if (!PL_endwhite)
6706                             PL_endwhite = newSVpvs("");
6707                         sv_catsv(PL_endwhite, PL_thiswhite);
6708                         PL_thiswhite = 0;
6709                         sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
6710                         PL_realtokenstart = -1;
6711                     }
6712                     while ((s = filter_gets(PL_endwhite, SvCUR(PL_endwhite)))
6713                            != NULL) ;
6714                 }
6715 #endif
6716                 PL_rsfp = NULL;
6717             }
6718             goto fake_eof;
6719         }
6720
6721         case KEY_AUTOLOAD:
6722         case KEY_DESTROY:
6723         case KEY_BEGIN:
6724         case KEY_UNITCHECK:
6725         case KEY_CHECK:
6726         case KEY_INIT:
6727         case KEY_END:
6728             if (PL_expect == XSTATE) {
6729                 s = PL_bufptr;
6730                 goto really_sub;
6731             }
6732             goto just_a_word;
6733
6734         case KEY_CORE:
6735             if (*s == ':' && s[1] == ':') {
6736                 s += 2;
6737                 d = s;
6738                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6739                 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6740                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
6741                 if (tmp < 0)
6742                     tmp = -tmp;
6743                 else if (tmp == KEY_require || tmp == KEY_do)
6744                     /* that's a way to remember we saw "CORE::" */
6745                     orig_keyword = tmp;
6746                 goto reserved_word;
6747             }
6748             goto just_a_word;
6749
6750         case KEY_abs:
6751             UNI(OP_ABS);
6752
6753         case KEY_alarm:
6754             UNI(OP_ALARM);
6755
6756         case KEY_accept:
6757             LOP(OP_ACCEPT,XTERM);
6758
6759         case KEY_and:
6760             OPERATOR(ANDOP);
6761
6762         case KEY_atan2:
6763             LOP(OP_ATAN2,XTERM);
6764
6765         case KEY_bind:
6766             LOP(OP_BIND,XTERM);
6767
6768         case KEY_binmode:
6769             LOP(OP_BINMODE,XTERM);
6770
6771         case KEY_bless:
6772             LOP(OP_BLESS,XTERM);
6773
6774         case KEY_break:
6775             FUN0(OP_BREAK);
6776
6777         case KEY_chop:
6778             UNI(OP_CHOP);
6779
6780         case KEY_continue:
6781             /* When 'use switch' is in effect, continue has a dual
6782                life as a control operator. */
6783             {
6784                 if (!FEATURE_IS_ENABLED("switch"))
6785                     PREBLOCK(CONTINUE);
6786                 else {
6787                     /* We have to disambiguate the two senses of
6788                       "continue". If the next token is a '{' then
6789                       treat it as the start of a continue block;
6790                       otherwise treat it as a control operator.
6791                      */
6792                     s = skipspace(s);
6793                     if (*s == '{')
6794             PREBLOCK(CONTINUE);
6795                     else
6796                         FUN0(OP_CONTINUE);
6797                 }
6798             }
6799
6800         case KEY_chdir:
6801             /* may use HOME */
6802             (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
6803             UNI(OP_CHDIR);
6804
6805         case KEY_close:
6806             UNI(OP_CLOSE);
6807
6808         case KEY_closedir:
6809             UNI(OP_CLOSEDIR);
6810
6811         case KEY_cmp:
6812             Eop(OP_SCMP);
6813
6814         case KEY_caller:
6815             UNI(OP_CALLER);
6816
6817         case KEY_crypt:
6818 #ifdef FCRYPT
6819             if (!PL_cryptseen) {
6820                 PL_cryptseen = TRUE;
6821                 init_des();
6822             }
6823 #endif
6824             LOP(OP_CRYPT,XTERM);
6825
6826         case KEY_chmod:
6827             LOP(OP_CHMOD,XTERM);
6828
6829         case KEY_chown:
6830             LOP(OP_CHOWN,XTERM);
6831
6832         case KEY_connect:
6833             LOP(OP_CONNECT,XTERM);
6834
6835         case KEY_chr:
6836             UNI(OP_CHR);
6837
6838         case KEY_cos:
6839             UNI(OP_COS);
6840
6841         case KEY_chroot:
6842             UNI(OP_CHROOT);
6843
6844         case KEY_default:
6845             PREBLOCK(DEFAULT);
6846
6847         case KEY_do:
6848             s = SKIPSPACE1(s);
6849             if (*s == '{')
6850                 PRETERMBLOCK(DO);
6851             if (*s != '\'')
6852                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
6853             if (orig_keyword == KEY_do) {
6854                 orig_keyword = 0;
6855                 pl_yylval.ival = 1;
6856             }
6857             else
6858                 pl_yylval.ival = 0;
6859             OPERATOR(DO);
6860
6861         case KEY_die:
6862             PL_hints |= HINT_BLOCK_SCOPE;
6863             LOP(OP_DIE,XTERM);
6864
6865         case KEY_defined:
6866             UNI(OP_DEFINED);
6867
6868         case KEY_delete:
6869             UNI(OP_DELETE);
6870
6871         case KEY_dbmopen:
6872             gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
6873             LOP(OP_DBMOPEN,XTERM);
6874
6875         case KEY_dbmclose:
6876             UNI(OP_DBMCLOSE);
6877
6878         case KEY_dump:
6879             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6880             LOOPX(OP_DUMP);
6881
6882         case KEY_else:
6883             PREBLOCK(ELSE);
6884
6885         case KEY_elsif:
6886             pl_yylval.ival = CopLINE(PL_curcop);
6887             OPERATOR(ELSIF);
6888
6889         case KEY_eq:
6890             Eop(OP_SEQ);
6891
6892         case KEY_exists:
6893             UNI(OP_EXISTS);
6894         
6895         case KEY_exit:
6896             if (PL_madskills)
6897                 UNI(OP_INT);
6898             UNI(OP_EXIT);
6899
6900         case KEY_eval:
6901             s = SKIPSPACE1(s);
6902             if (*s == '{') { /* block eval */
6903                 PL_expect = XTERMBLOCK;
6904                 UNIBRACK(OP_ENTERTRY);
6905             }
6906             else { /* string eval */
6907                 PL_expect = XTERM;
6908                 UNIBRACK(OP_ENTEREVAL);
6909             }
6910
6911         case KEY_eof:
6912             UNI(OP_EOF);
6913
6914         case KEY_exp:
6915             UNI(OP_EXP);
6916
6917         case KEY_each:
6918             UNI(OP_EACH);
6919
6920         case KEY_exec:
6921             LOP(OP_EXEC,XREF);
6922
6923         case KEY_endhostent:
6924             FUN0(OP_EHOSTENT);
6925
6926         case KEY_endnetent:
6927             FUN0(OP_ENETENT);
6928
6929         case KEY_endservent:
6930             FUN0(OP_ESERVENT);
6931
6932         case KEY_endprotoent:
6933             FUN0(OP_EPROTOENT);
6934
6935         case KEY_endpwent:
6936             FUN0(OP_EPWENT);
6937
6938         case KEY_endgrent:
6939             FUN0(OP_EGRENT);
6940
6941         case KEY_for:
6942         case KEY_foreach:
6943             pl_yylval.ival = CopLINE(PL_curcop);
6944             s = SKIPSPACE1(s);
6945             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
6946                 char *p = s;
6947 #ifdef PERL_MAD
6948                 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
6949 #endif
6950
6951                 if ((PL_bufend - p) >= 3 &&
6952                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
6953                     p += 2;
6954                 else if ((PL_bufend - p) >= 4 &&
6955                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
6956                     p += 3;
6957                 p = PEEKSPACE(p);
6958                 if (isIDFIRST_lazy_if(p,UTF)) {
6959                     p = scan_ident(p, PL_bufend,
6960                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
6961                     p = PEEKSPACE(p);
6962                 }
6963                 if (*p != '$')
6964                     Perl_croak(aTHX_ "Missing $ on loop variable");
6965 #ifdef PERL_MAD
6966                 s = SvPVX(PL_linestr) + soff;
6967 #endif
6968             }
6969             OPERATOR(FOR);
6970
6971         case KEY_formline:
6972             LOP(OP_FORMLINE,XTERM);
6973
6974         case KEY_fork:
6975             FUN0(OP_FORK);
6976
6977         case KEY_fcntl:
6978             LOP(OP_FCNTL,XTERM);
6979
6980         case KEY_fileno:
6981             UNI(OP_FILENO);
6982
6983         case KEY_flock:
6984             LOP(OP_FLOCK,XTERM);
6985
6986         case KEY_gt:
6987             Rop(OP_SGT);
6988
6989         case KEY_ge:
6990             Rop(OP_SGE);
6991
6992         case KEY_grep:
6993             LOP(OP_GREPSTART, XREF);
6994
6995         case KEY_goto:
6996             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6997             LOOPX(OP_GOTO);
6998
6999         case KEY_gmtime:
7000             UNI(OP_GMTIME);
7001
7002         case KEY_getc:
7003             UNIDOR(OP_GETC);
7004
7005         case KEY_getppid:
7006             FUN0(OP_GETPPID);
7007
7008         case KEY_getpgrp:
7009             UNI(OP_GETPGRP);
7010
7011         case KEY_getpriority:
7012             LOP(OP_GETPRIORITY,XTERM);
7013
7014         case KEY_getprotobyname:
7015             UNI(OP_GPBYNAME);
7016
7017         case KEY_getprotobynumber:
7018             LOP(OP_GPBYNUMBER,XTERM);
7019
7020         case KEY_getprotoent:
7021             FUN0(OP_GPROTOENT);
7022
7023         case KEY_getpwent:
7024             FUN0(OP_GPWENT);
7025
7026         case KEY_getpwnam:
7027             UNI(OP_GPWNAM);
7028
7029         case KEY_getpwuid:
7030             UNI(OP_GPWUID);
7031
7032         case KEY_getpeername:
7033             UNI(OP_GETPEERNAME);
7034
7035         case KEY_gethostbyname:
7036             UNI(OP_GHBYNAME);
7037
7038         case KEY_gethostbyaddr:
7039             LOP(OP_GHBYADDR,XTERM);
7040
7041         case KEY_gethostent:
7042             FUN0(OP_GHOSTENT);
7043
7044         case KEY_getnetbyname:
7045             UNI(OP_GNBYNAME);
7046
7047         case KEY_getnetbyaddr:
7048             LOP(OP_GNBYADDR,XTERM);
7049
7050         case KEY_getnetent:
7051             FUN0(OP_GNETENT);
7052
7053         case KEY_getservbyname:
7054             LOP(OP_GSBYNAME,XTERM);
7055
7056         case KEY_getservbyport:
7057             LOP(OP_GSBYPORT,XTERM);
7058
7059         case KEY_getservent:
7060             FUN0(OP_GSERVENT);
7061
7062         case KEY_getsockname:
7063             UNI(OP_GETSOCKNAME);
7064
7065         case KEY_getsockopt:
7066             LOP(OP_GSOCKOPT,XTERM);
7067
7068         case KEY_getgrent:
7069             FUN0(OP_GGRENT);
7070
7071         case KEY_getgrnam:
7072             UNI(OP_GGRNAM);
7073
7074         case KEY_getgrgid:
7075             UNI(OP_GGRGID);
7076
7077         case KEY_getlogin:
7078             FUN0(OP_GETLOGIN);
7079
7080         case KEY_given:
7081             pl_yylval.ival = CopLINE(PL_curcop);
7082             OPERATOR(GIVEN);
7083
7084         case KEY_glob:
7085             LOP(OP_GLOB,XTERM);
7086
7087         case KEY_hex:
7088             UNI(OP_HEX);
7089
7090         case KEY_if:
7091             pl_yylval.ival = CopLINE(PL_curcop);
7092             OPERATOR(IF);
7093
7094         case KEY_index:
7095             LOP(OP_INDEX,XTERM);
7096
7097         case KEY_int:
7098             UNI(OP_INT);
7099
7100         case KEY_ioctl:
7101             LOP(OP_IOCTL,XTERM);
7102
7103         case KEY_join:
7104             LOP(OP_JOIN,XTERM);
7105
7106         case KEY_keys:
7107             UNI(OP_KEYS);
7108
7109         case KEY_kill:
7110             LOP(OP_KILL,XTERM);
7111
7112         case KEY_last:
7113             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7114             LOOPX(OP_LAST);
7115         
7116         case KEY_lc:
7117             UNI(OP_LC);
7118
7119         case KEY_lcfirst:
7120             UNI(OP_LCFIRST);
7121
7122         case KEY_local:
7123             pl_yylval.ival = 0;
7124             OPERATOR(LOCAL);
7125
7126         case KEY_length:
7127             UNI(OP_LENGTH);
7128
7129         case KEY_lt:
7130             Rop(OP_SLT);
7131
7132         case KEY_le:
7133             Rop(OP_SLE);
7134
7135         case KEY_localtime:
7136             UNI(OP_LOCALTIME);
7137
7138         case KEY_log:
7139             UNI(OP_LOG);
7140
7141         case KEY_link:
7142             LOP(OP_LINK,XTERM);
7143
7144         case KEY_listen:
7145             LOP(OP_LISTEN,XTERM);
7146
7147         case KEY_lock:
7148             UNI(OP_LOCK);
7149
7150         case KEY_lstat:
7151             UNI(OP_LSTAT);
7152
7153         case KEY_m:
7154             s = scan_pat(s,OP_MATCH);
7155             TERM(sublex_start());
7156
7157         case KEY_map:
7158             LOP(OP_MAPSTART, XREF);
7159
7160         case KEY_mkdir:
7161             LOP(OP_MKDIR,XTERM);
7162
7163         case KEY_msgctl:
7164             LOP(OP_MSGCTL,XTERM);
7165
7166         case KEY_msgget:
7167             LOP(OP_MSGGET,XTERM);
7168
7169         case KEY_msgrcv:
7170             LOP(OP_MSGRCV,XTERM);
7171
7172         case KEY_msgsnd:
7173             LOP(OP_MSGSND,XTERM);
7174
7175         case KEY_our:
7176         case KEY_my:
7177         case KEY_state:
7178             PL_in_my = (U16)tmp;
7179             s = SKIPSPACE1(s);
7180             if (isIDFIRST_lazy_if(s,UTF)) {
7181 #ifdef PERL_MAD
7182                 char* start = s;
7183 #endif
7184                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
7185                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
7186                     goto really_sub;
7187                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
7188                 if (!PL_in_my_stash) {
7189                     char tmpbuf[1024];
7190                     PL_bufptr = s;
7191                     my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
7192                     yyerror(tmpbuf);
7193                 }
7194 #ifdef PERL_MAD
7195                 if (PL_madskills) {     /* just add type to declarator token */
7196                     sv_catsv(PL_thistoken, PL_nextwhite);
7197                     PL_nextwhite = 0;
7198                     sv_catpvn(PL_thistoken, start, s - start);
7199                 }
7200 #endif
7201             }
7202             pl_yylval.ival = 1;
7203             OPERATOR(MY);
7204
7205         case KEY_next:
7206             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7207             LOOPX(OP_NEXT);
7208
7209         case KEY_ne:
7210             Eop(OP_SNE);
7211
7212         case KEY_no:
7213             s = tokenize_use(0, s);
7214             OPERATOR(USE);
7215
7216         case KEY_not:
7217             if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
7218                 FUN1(OP_NOT);
7219             else
7220                 OPERATOR(NOTOP);
7221
7222         case KEY_open:
7223             s = SKIPSPACE1(s);
7224             if (isIDFIRST_lazy_if(s,UTF)) {
7225                 const char *t;
7226                 for (d = s; isALNUM_lazy_if(d,UTF);)
7227                     d++;
7228                 for (t=d; isSPACE(*t);)
7229                     t++;
7230                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
7231                     /* [perl #16184] */
7232                     && !(t[0] == '=' && t[1] == '>')
7233                 ) {
7234                     int parms_len = (int)(d-s);
7235                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
7236                            "Precedence problem: open %.*s should be open(%.*s)",
7237                             parms_len, s, parms_len, s);
7238                 }
7239             }
7240             LOP(OP_OPEN,XTERM);
7241
7242         case KEY_or:
7243             pl_yylval.ival = OP_OR;
7244             OPERATOR(OROP);
7245
7246         case KEY_ord:
7247             UNI(OP_ORD);
7248
7249         case KEY_oct:
7250             UNI(OP_OCT);
7251
7252         case KEY_opendir:
7253             LOP(OP_OPEN_DIR,XTERM);
7254
7255         case KEY_print:
7256             checkcomma(s,PL_tokenbuf,"filehandle");
7257             LOP(OP_PRINT,XREF);
7258
7259         case KEY_printf:
7260             checkcomma(s,PL_tokenbuf,"filehandle");
7261             LOP(OP_PRTF,XREF);
7262
7263         case KEY_prototype:
7264             UNI(OP_PROTOTYPE);
7265
7266         case KEY_push:
7267             LOP(OP_PUSH,XTERM);
7268
7269         case KEY_pop:
7270             UNIDOR(OP_POP);
7271
7272         case KEY_pos:
7273             UNIDOR(OP_POS);
7274         
7275         case KEY_pack:
7276             LOP(OP_PACK,XTERM);
7277
7278         case KEY_package:
7279             s = force_word(s,WORD,FALSE,TRUE,FALSE);
7280             s = SKIPSPACE1(s);
7281             s = force_strict_version(s);
7282             OPERATOR(PACKAGE);
7283
7284         case KEY_pipe:
7285             LOP(OP_PIPE_OP,XTERM);
7286
7287         case KEY_q:
7288             s = scan_str(s,!!PL_madskills,FALSE);
7289             if (!s)
7290                 missingterm(NULL);
7291             pl_yylval.ival = OP_CONST;
7292             TERM(sublex_start());
7293
7294         case KEY_quotemeta:
7295             UNI(OP_QUOTEMETA);
7296
7297         case KEY_qw:
7298             s = scan_str(s,!!PL_madskills,FALSE);
7299             if (!s)
7300                 missingterm(NULL);
7301             PL_expect = XOPERATOR;
7302             force_next(')');
7303             if (SvCUR(PL_lex_stuff)) {
7304                 OP *words = NULL;
7305                 int warned = 0;
7306                 d = SvPV_force(PL_lex_stuff, len);
7307                 while (len) {
7308                     for (; isSPACE(*d) && len; --len, ++d)
7309                         /**/;
7310                     if (len) {
7311                         SV *sv;
7312                         const char *b = d;
7313                         if (!warned && ckWARN(WARN_QW)) {
7314                             for (; !isSPACE(*d) && len; --len, ++d) {
7315                                 if (*d == ',') {
7316                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7317                                         "Possible attempt to separate words with commas");
7318                                     ++warned;
7319                                 }
7320                                 else if (*d == '#') {
7321                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7322                                         "Possible attempt to put comments in qw() list");
7323                                     ++warned;
7324                                 }
7325                             }
7326                         }
7327                         else {
7328                             for (; !isSPACE(*d) && len; --len, ++d)
7329                                 /**/;
7330                         }
7331                         sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
7332                         words = append_elem(OP_LIST, words,
7333                                             newSVOP(OP_CONST, 0, tokeq(sv)));
7334                     }
7335                 }
7336                 if (words) {
7337                     start_force(PL_curforce);
7338                     NEXTVAL_NEXTTOKE.opval = words;
7339                     force_next(THING);
7340                 }
7341             }
7342             if (PL_lex_stuff) {
7343                 SvREFCNT_dec(PL_lex_stuff);
7344                 PL_lex_stuff = NULL;
7345             }
7346             PL_expect = XTERM;
7347             TOKEN('(');
7348
7349         case KEY_qq:
7350             s = scan_str(s,!!PL_madskills,FALSE);
7351             if (!s)
7352                 missingterm(NULL);
7353             pl_yylval.ival = OP_STRINGIFY;
7354             if (SvIVX(PL_lex_stuff) == '\'')
7355                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
7356             TERM(sublex_start());
7357
7358         case KEY_qr:
7359             s = scan_pat(s,OP_QR);
7360             TERM(sublex_start());
7361
7362         case KEY_qx:
7363             s = scan_str(s,!!PL_madskills,FALSE);
7364             if (!s)
7365                 missingterm(NULL);
7366             readpipe_override();
7367             TERM(sublex_start());
7368
7369         case KEY_return:
7370             OLDLOP(OP_RETURN);
7371
7372         case KEY_require:
7373             s = SKIPSPACE1(s);
7374             if (isDIGIT(*s)) {
7375                 s = force_version(s, FALSE);
7376             }
7377             else if (*s != 'v' || !isDIGIT(s[1])
7378                     || (s = force_version(s, TRUE), *s == 'v'))
7379             {
7380                 *PL_tokenbuf = '\0';
7381                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7382                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
7383                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
7384                 else if (*s == '<')
7385                     yyerror("<> should be quotes");
7386             }
7387             if (orig_keyword == KEY_require) {
7388                 orig_keyword = 0;
7389                 pl_yylval.ival = 1;
7390             }
7391             else 
7392                 pl_yylval.ival = 0;
7393             PL_expect = XTERM;
7394             PL_bufptr = s;
7395             PL_last_uni = PL_oldbufptr;
7396             PL_last_lop_op = OP_REQUIRE;
7397             s = skipspace(s);
7398             return REPORT( (int)REQUIRE );
7399
7400         case KEY_reset:
7401             UNI(OP_RESET);
7402
7403         case KEY_redo:
7404             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7405             LOOPX(OP_REDO);
7406
7407         case KEY_rename:
7408             LOP(OP_RENAME,XTERM);
7409
7410         case KEY_rand:
7411             UNI(OP_RAND);
7412
7413         case KEY_rmdir:
7414             UNI(OP_RMDIR);
7415
7416         case KEY_rindex:
7417             LOP(OP_RINDEX,XTERM);
7418
7419         case KEY_read:
7420             LOP(OP_READ,XTERM);
7421
7422         case KEY_readdir:
7423             UNI(OP_READDIR);
7424
7425         case KEY_readline:
7426             UNIDOR(OP_READLINE);
7427
7428         case KEY_readpipe:
7429             UNIDOR(OP_BACKTICK);
7430
7431         case KEY_rewinddir:
7432             UNI(OP_REWINDDIR);
7433
7434         case KEY_recv:
7435             LOP(OP_RECV,XTERM);
7436
7437         case KEY_reverse:
7438             LOP(OP_REVERSE,XTERM);
7439
7440         case KEY_readlink:
7441             UNIDOR(OP_READLINK);
7442
7443         case KEY_ref:
7444             UNI(OP_REF);
7445
7446         case KEY_s:
7447             s = scan_subst(s);
7448             if (pl_yylval.opval)
7449                 TERM(sublex_start());
7450             else
7451                 TOKEN(1);       /* force error */
7452
7453         case KEY_say:
7454             checkcomma(s,PL_tokenbuf,"filehandle");
7455             LOP(OP_SAY,XREF);
7456
7457         case KEY_chomp:
7458             UNI(OP_CHOMP);
7459         
7460         case KEY_scalar:
7461             UNI(OP_SCALAR);
7462
7463         case KEY_select:
7464             LOP(OP_SELECT,XTERM);
7465
7466         case KEY_seek:
7467             LOP(OP_SEEK,XTERM);
7468
7469         case KEY_semctl:
7470             LOP(OP_SEMCTL,XTERM);
7471
7472         case KEY_semget:
7473             LOP(OP_SEMGET,XTERM);
7474
7475         case KEY_semop:
7476             LOP(OP_SEMOP,XTERM);
7477
7478         case KEY_send:
7479             LOP(OP_SEND,XTERM);
7480
7481         case KEY_setpgrp:
7482             LOP(OP_SETPGRP,XTERM);
7483
7484         case KEY_setpriority:
7485             LOP(OP_SETPRIORITY,XTERM);
7486
7487         case KEY_sethostent:
7488             UNI(OP_SHOSTENT);
7489
7490         case KEY_setnetent:
7491             UNI(OP_SNETENT);
7492
7493         case KEY_setservent:
7494             UNI(OP_SSERVENT);
7495
7496         case KEY_setprotoent:
7497             UNI(OP_SPROTOENT);
7498
7499         case KEY_setpwent:
7500             FUN0(OP_SPWENT);
7501
7502         case KEY_setgrent:
7503             FUN0(OP_SGRENT);
7504
7505         case KEY_seekdir:
7506             LOP(OP_SEEKDIR,XTERM);
7507
7508         case KEY_setsockopt:
7509             LOP(OP_SSOCKOPT,XTERM);
7510
7511         case KEY_shift:
7512             UNIDOR(OP_SHIFT);
7513
7514         case KEY_shmctl:
7515             LOP(OP_SHMCTL,XTERM);
7516
7517         case KEY_shmget:
7518             LOP(OP_SHMGET,XTERM);
7519
7520         case KEY_shmread:
7521             LOP(OP_SHMREAD,XTERM);
7522
7523         case KEY_shmwrite:
7524             LOP(OP_SHMWRITE,XTERM);
7525
7526         case KEY_shutdown:
7527             LOP(OP_SHUTDOWN,XTERM);
7528
7529         case KEY_sin:
7530             UNI(OP_SIN);
7531
7532         case KEY_sleep:
7533             UNI(OP_SLEEP);
7534
7535         case KEY_socket:
7536             LOP(OP_SOCKET,XTERM);
7537
7538         case KEY_socketpair:
7539             LOP(OP_SOCKPAIR,XTERM);
7540
7541         case KEY_sort:
7542             checkcomma(s,PL_tokenbuf,"subroutine name");
7543             s = SKIPSPACE1(s);
7544             if (*s == ';' || *s == ')')         /* probably a close */
7545                 Perl_croak(aTHX_ "sort is now a reserved word");
7546             PL_expect = XTERM;
7547             s = force_word(s,WORD,TRUE,TRUE,FALSE);
7548             LOP(OP_SORT,XREF);
7549
7550         case KEY_split:
7551             LOP(OP_SPLIT,XTERM);
7552
7553         case KEY_sprintf:
7554             LOP(OP_SPRINTF,XTERM);
7555
7556         case KEY_splice:
7557             LOP(OP_SPLICE,XTERM);
7558
7559         case KEY_sqrt:
7560             UNI(OP_SQRT);
7561
7562         case KEY_srand:
7563             UNI(OP_SRAND);
7564
7565         case KEY_stat:
7566             UNI(OP_STAT);
7567
7568         case KEY_study:
7569             UNI(OP_STUDY);
7570
7571         case KEY_substr:
7572             LOP(OP_SUBSTR,XTERM);
7573
7574         case KEY_format:
7575         case KEY_sub:
7576           really_sub:
7577             {
7578                 char tmpbuf[sizeof PL_tokenbuf];
7579                 SSize_t tboffset = 0;
7580                 expectation attrful;
7581                 bool have_name, have_proto;
7582                 const int key = tmp;
7583
7584 #ifdef PERL_MAD
7585                 SV *tmpwhite = 0;
7586
7587                 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
7588                 SV *subtoken = newSVpvn(tstart, s - tstart);
7589                 PL_thistoken = 0;
7590
7591                 d = s;
7592                 s = SKIPSPACE2(s,tmpwhite);
7593 #else
7594                 s = skipspace(s);
7595 #endif
7596
7597                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
7598                     (*s == ':' && s[1] == ':'))
7599                 {
7600 #ifdef PERL_MAD
7601                     SV *nametoke = NULL;
7602 #endif
7603
7604                     PL_expect = XBLOCK;
7605                     attrful = XATTRBLOCK;
7606                     /* remember buffer pos'n for later force_word */
7607                     tboffset = s - PL_oldbufptr;
7608                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
7609 #ifdef PERL_MAD
7610                     if (PL_madskills)
7611                         nametoke = newSVpvn(s, d - s);
7612 #endif
7613                     if (memchr(tmpbuf, ':', len))
7614                         sv_setpvn(PL_subname, tmpbuf, len);
7615                     else {
7616                         sv_setsv(PL_subname,PL_curstname);
7617                         sv_catpvs(PL_subname,"::");
7618                         sv_catpvn(PL_subname,tmpbuf,len);
7619                     }
7620                     have_name = TRUE;
7621
7622 #ifdef PERL_MAD
7623
7624                     start_force(0);
7625                     CURMAD('X', nametoke);
7626                     CURMAD('_', tmpwhite);
7627                     (void) force_word(PL_oldbufptr + tboffset, WORD,
7628                                       FALSE, TRUE, TRUE);
7629
7630                     s = SKIPSPACE2(d,tmpwhite);
7631 #else
7632                     s = skipspace(d);
7633 #endif
7634                 }
7635                 else {
7636                     if (key == KEY_my)
7637                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
7638                     PL_expect = XTERMBLOCK;
7639                     attrful = XATTRTERM;
7640                     sv_setpvs(PL_subname,"?");
7641                     have_name = FALSE;
7642                 }
7643
7644                 if (key == KEY_format) {
7645                     if (*s == '=')
7646                         PL_lex_formbrack = PL_lex_brackets + 1;
7647 #ifdef PERL_MAD
7648                     PL_thistoken = subtoken;
7649                     s = d;
7650 #else
7651                     if (have_name)
7652                         (void) force_word(PL_oldbufptr + tboffset, WORD,
7653                                           FALSE, TRUE, TRUE);
7654 #endif
7655                     OPERATOR(FORMAT);
7656                 }
7657
7658                 /* Look for a prototype */
7659                 if (*s == '(') {
7660                     char *p;
7661                     bool bad_proto = FALSE;
7662                     bool in_brackets = FALSE;
7663                     char greedy_proto = ' ';
7664                     bool proto_after_greedy_proto = FALSE;
7665                     bool must_be_last = FALSE;
7666                     bool underscore = FALSE;
7667                     bool seen_underscore = FALSE;
7668                     const bool warnillegalproto = ckWARN(WARN_ILLEGALPROTO);
7669
7670                     s = scan_str(s,!!PL_madskills,FALSE);
7671                     if (!s)
7672                         Perl_croak(aTHX_ "Prototype not terminated");
7673                     /* strip spaces and check for bad characters */
7674                     d = SvPVX(PL_lex_stuff);
7675                     tmp = 0;
7676                     for (p = d; *p; ++p) {
7677                         if (!isSPACE(*p)) {
7678                             d[tmp++] = *p;
7679
7680                             if (warnillegalproto) {
7681                                 if (must_be_last)
7682                                     proto_after_greedy_proto = TRUE;
7683                                 if (!strchr("$@%*;[]&\\_", *p)) {
7684                                     bad_proto = TRUE;
7685                                 }
7686                                 else {
7687                                     if ( underscore ) {
7688                                         if ( *p != ';' )
7689                                             bad_proto = TRUE;
7690                                         underscore = FALSE;
7691                                     }
7692                                     if ( *p == '[' ) {
7693                                         in_brackets = TRUE;
7694                                     }
7695                                     else if ( *p == ']' ) {
7696                                         in_brackets = FALSE;
7697                                     }
7698                                     else if ( (*p == '@' || *p == '%') &&
7699                                          ( tmp < 2 || d[tmp-2] != '\\' ) &&
7700                                          !in_brackets ) {
7701                                         must_be_last = TRUE;
7702                                         greedy_proto = *p;
7703                                     }
7704                                     else if ( *p == '_' ) {
7705                                         underscore = seen_underscore = TRUE;
7706                                     }
7707                                 }
7708                             }
7709                         }
7710                     }
7711                     d[tmp] = '\0';
7712                     if (proto_after_greedy_proto)
7713                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7714                                     "Prototype after '%c' for %"SVf" : %s",
7715                                     greedy_proto, SVfARG(PL_subname), d);
7716                     if (bad_proto)
7717                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7718                                     "Illegal character %sin prototype for %"SVf" : %s",
7719                                     seen_underscore ? "after '_' " : "",
7720                                     SVfARG(PL_subname), d);
7721                     SvCUR_set(PL_lex_stuff, tmp);
7722                     have_proto = TRUE;
7723
7724 #ifdef PERL_MAD
7725                     start_force(0);
7726                     CURMAD('q', PL_thisopen);
7727                     CURMAD('_', tmpwhite);
7728                     CURMAD('=', PL_thisstuff);
7729                     CURMAD('Q', PL_thisclose);
7730                     NEXTVAL_NEXTTOKE.opval =
7731                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7732                     PL_lex_stuff = NULL;
7733                     force_next(THING);
7734
7735                     s = SKIPSPACE2(s,tmpwhite);
7736 #else
7737                     s = skipspace(s);
7738 #endif
7739                 }
7740                 else
7741                     have_proto = FALSE;
7742
7743                 if (*s == ':' && s[1] != ':')
7744                     PL_expect = attrful;
7745                 else if (*s != '{' && key == KEY_sub) {
7746                     if (!have_name)
7747                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
7748                     else if (*s != ';' && *s != '}')
7749                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
7750                 }
7751
7752 #ifdef PERL_MAD
7753                 start_force(0);
7754                 if (tmpwhite) {
7755                     if (PL_madskills)
7756                         curmad('^', newSVpvs(""));
7757                     CURMAD('_', tmpwhite);
7758                 }
7759                 force_next(0);
7760
7761                 PL_thistoken = subtoken;
7762 #else
7763                 if (have_proto) {
7764                     NEXTVAL_NEXTTOKE.opval =
7765                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7766                     PL_lex_stuff = NULL;
7767                     force_next(THING);
7768                 }
7769 #endif
7770                 if (!have_name) {
7771                     if (PL_curstash)
7772                         sv_setpvs(PL_subname, "__ANON__");
7773                     else
7774                         sv_setpvs(PL_subname, "__ANON__::__ANON__");
7775                     TOKEN(ANONSUB);
7776                 }
7777 #ifndef PERL_MAD
7778                 (void) force_word(PL_oldbufptr + tboffset, WORD,
7779                                   FALSE, TRUE, TRUE);
7780 #endif
7781                 if (key == KEY_my)
7782                     TOKEN(MYSUB);
7783                 TOKEN(SUB);
7784             }
7785
7786         case KEY_system:
7787             LOP(OP_SYSTEM,XREF);
7788
7789         case KEY_symlink:
7790             LOP(OP_SYMLINK,XTERM);
7791
7792         case KEY_syscall:
7793             LOP(OP_SYSCALL,XTERM);
7794
7795         case KEY_sysopen:
7796             LOP(OP_SYSOPEN,XTERM);
7797
7798         case KEY_sysseek:
7799             LOP(OP_SYSSEEK,XTERM);
7800
7801         case KEY_sysread:
7802             LOP(OP_SYSREAD,XTERM);
7803
7804         case KEY_syswrite:
7805             LOP(OP_SYSWRITE,XTERM);
7806
7807         case KEY_tr:
7808             s = scan_trans(s);
7809             TERM(sublex_start());
7810
7811         case KEY_tell:
7812             UNI(OP_TELL);
7813
7814         case KEY_telldir:
7815             UNI(OP_TELLDIR);
7816
7817         case KEY_tie:
7818             LOP(OP_TIE,XTERM);
7819
7820         case KEY_tied:
7821             UNI(OP_TIED);
7822
7823         case KEY_time:
7824             FUN0(OP_TIME);
7825
7826         case KEY_times:
7827             FUN0(OP_TMS);
7828
7829         case KEY_truncate:
7830             LOP(OP_TRUNCATE,XTERM);
7831
7832         case KEY_uc:
7833             UNI(OP_UC);
7834
7835         case KEY_ucfirst:
7836             UNI(OP_UCFIRST);
7837
7838         case KEY_untie:
7839             UNI(OP_UNTIE);
7840
7841         case KEY_until:
7842             pl_yylval.ival = CopLINE(PL_curcop);
7843             OPERATOR(UNTIL);
7844
7845         case KEY_unless:
7846             pl_yylval.ival = CopLINE(PL_curcop);
7847             OPERATOR(UNLESS);
7848
7849         case KEY_unlink:
7850             LOP(OP_UNLINK,XTERM);
7851
7852         case KEY_undef:
7853             UNIDOR(OP_UNDEF);
7854
7855         case KEY_unpack:
7856             LOP(OP_UNPACK,XTERM);
7857
7858         case KEY_utime:
7859             LOP(OP_UTIME,XTERM);
7860
7861         case KEY_umask:
7862             UNIDOR(OP_UMASK);
7863
7864         case KEY_unshift:
7865             LOP(OP_UNSHIFT,XTERM);
7866
7867         case KEY_use:
7868             s = tokenize_use(1, s);
7869             OPERATOR(USE);
7870
7871         case KEY_values:
7872             UNI(OP_VALUES);
7873
7874         case KEY_vec:
7875             LOP(OP_VEC,XTERM);
7876
7877         case KEY_when:
7878             pl_yylval.ival = CopLINE(PL_curcop);
7879             OPERATOR(WHEN);
7880
7881         case KEY_while:
7882             pl_yylval.ival = CopLINE(PL_curcop);
7883             OPERATOR(WHILE);
7884
7885         case KEY_warn:
7886             PL_hints |= HINT_BLOCK_SCOPE;
7887             LOP(OP_WARN,XTERM);
7888
7889         case KEY_wait:
7890             FUN0(OP_WAIT);
7891
7892         case KEY_waitpid:
7893             LOP(OP_WAITPID,XTERM);
7894
7895         case KEY_wantarray:
7896             FUN0(OP_WANTARRAY);
7897
7898         case KEY_write:
7899 #ifdef EBCDIC
7900         {
7901             char ctl_l[2];
7902             ctl_l[0] = toCTRL('L');
7903             ctl_l[1] = '\0';
7904             gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
7905         }
7906 #else
7907             /* Make sure $^L is defined */
7908             gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
7909 #endif
7910             UNI(OP_ENTERWRITE);
7911
7912         case KEY_x:
7913             if (PL_expect == XOPERATOR)
7914                 Mop(OP_REPEAT);
7915             check_uni();
7916             goto just_a_word;
7917
7918         case KEY_xor:
7919             pl_yylval.ival = OP_XOR;
7920             OPERATOR(OROP);
7921
7922         case KEY_y:
7923             s = scan_trans(s);
7924             TERM(sublex_start());
7925         }
7926     }}
7927 }
7928 #ifdef __SC__
7929 #pragma segment Main
7930 #endif
7931
7932 static int
7933 S_pending_ident(pTHX)
7934 {
7935     dVAR;
7936     register char *d;
7937     PADOFFSET tmp = 0;
7938     /* pit holds the identifier we read and pending_ident is reset */
7939     char pit = PL_pending_ident;
7940     const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
7941     /* All routes through this function want to know if there is a colon.  */
7942     const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
7943     PL_pending_ident = 0;
7944
7945     /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
7946     DEBUG_T({ PerlIO_printf(Perl_debug_log,
7947           "### Pending identifier '%s'\n", PL_tokenbuf); });
7948
7949     /* if we're in a my(), we can't allow dynamics here.
7950        $foo'bar has already been turned into $foo::bar, so
7951        just check for colons.
7952
7953        if it's a legal name, the OP is a PADANY.
7954     */
7955     if (PL_in_my) {
7956         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
7957             if (has_colon)
7958                 yyerror(Perl_form(aTHX_ "No package name allowed for "
7959                                   "variable %s in \"our\"",
7960                                   PL_tokenbuf));
7961             tmp = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7962         }
7963         else {
7964             if (has_colon)
7965                 yyerror(Perl_form(aTHX_ PL_no_myglob,
7966                             PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
7967
7968             pl_yylval.opval = newOP(OP_PADANY, 0);
7969             pl_yylval.opval->op_targ = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7970             return PRIVATEREF;
7971         }
7972     }
7973
7974     /*
7975        build the ops for accesses to a my() variable.
7976
7977        Deny my($a) or my($b) in a sort block, *if* $a or $b is
7978        then used in a comparison.  This catches most, but not
7979        all cases.  For instance, it catches
7980            sort { my($a); $a <=> $b }
7981        but not
7982            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
7983        (although why you'd do that is anyone's guess).
7984     */
7985
7986     if (!has_colon) {
7987         if (!PL_in_my)
7988             tmp = pad_findmy(PL_tokenbuf, tokenbuf_len, 0);
7989         if (tmp != NOT_IN_PAD) {
7990             /* might be an "our" variable" */
7991             if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
7992                 /* build ops for a bareword */
7993                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
7994                 HEK * const stashname = HvNAME_HEK(stash);
7995                 SV *  const sym = newSVhek(stashname);
7996                 sv_catpvs(sym, "::");
7997                 sv_catpvn(sym, PL_tokenbuf+1, tokenbuf_len - 1);
7998                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
7999                 pl_yylval.opval->op_private = OPpCONST_ENTERED;
8000                 gv_fetchsv(sym,
8001                     (PL_in_eval
8002                         ? (GV_ADDMULTI | GV_ADDINEVAL)
8003                         : GV_ADDMULTI
8004                     ),
8005                     ((PL_tokenbuf[0] == '$') ? SVt_PV
8006                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8007                      : SVt_PVHV));
8008                 return WORD;
8009             }
8010
8011             /* if it's a sort block and they're naming $a or $b */
8012             if (PL_last_lop_op == OP_SORT &&
8013                 PL_tokenbuf[0] == '$' &&
8014                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
8015                 && !PL_tokenbuf[2])
8016             {
8017                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
8018                      d < PL_bufend && *d != '\n';
8019                      d++)
8020                 {
8021                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
8022                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
8023                               PL_tokenbuf);
8024                     }
8025                 }
8026             }
8027
8028             pl_yylval.opval = newOP(OP_PADANY, 0);
8029             pl_yylval.opval->op_targ = tmp;
8030             return PRIVATEREF;
8031         }
8032     }
8033
8034     /*
8035        Whine if they've said @foo in a doublequoted string,
8036        and @foo isn't a variable we can find in the symbol
8037        table.
8038     */
8039     if (ckWARN(WARN_AMBIGUOUS) &&
8040         pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
8041         GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1, 0,
8042                                          SVt_PVAV);
8043         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
8044                 /* DO NOT warn for @- and @+ */
8045                 && !( PL_tokenbuf[2] == '\0' &&
8046                     ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
8047            )
8048         {
8049             /* Downgraded from fatal to warning 20000522 mjd */
8050             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8051                         "Possible unintended interpolation of %s in string",
8052                         PL_tokenbuf);
8053         }
8054     }
8055
8056     /* build ops for a bareword */
8057     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
8058                                                       tokenbuf_len - 1));
8059     pl_yylval.opval->op_private = OPpCONST_ENTERED;
8060     gv_fetchpvn_flags(
8061             PL_tokenbuf + 1, tokenbuf_len - 1,
8062             /* If the identifier refers to a stash, don't autovivify it.
8063              * Change 24660 had the side effect of causing symbol table
8064              * hashes to always be defined, even if they were freshly
8065              * created and the only reference in the entire program was
8066              * the single statement with the defined %foo::bar:: test.
8067              * It appears that all code in the wild doing this actually
8068              * wants to know whether sub-packages have been loaded, so
8069              * by avoiding auto-vivifying symbol tables, we ensure that
8070              * defined %foo::bar:: continues to be false, and the existing
8071              * tests still give the expected answers, even though what
8072              * they're actually testing has now changed subtly.
8073              */
8074             (*PL_tokenbuf == '%'
8075              && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
8076              && d[-1] == ':'
8077              ? 0
8078              : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
8079             ((PL_tokenbuf[0] == '$') ? SVt_PV
8080              : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8081              : SVt_PVHV));
8082     return WORD;
8083 }
8084
8085 /*
8086  *  The following code was generated by perl_keyword.pl.
8087  */
8088
8089 I32
8090 Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
8091 {
8092     dVAR;
8093
8094     PERL_ARGS_ASSERT_KEYWORD;
8095
8096   switch (len)
8097   {
8098     case 1: /* 5 tokens of length 1 */
8099       switch (name[0])
8100       {
8101         case 'm':
8102           {                                       /* m          */
8103             return KEY_m;
8104           }
8105
8106         case 'q':
8107           {                                       /* q          */
8108             return KEY_q;
8109           }
8110
8111         case 's':
8112           {                                       /* s          */
8113             return KEY_s;
8114           }
8115
8116         case 'x':
8117           {                                       /* x          */
8118             return -KEY_x;
8119           }
8120
8121         case 'y':
8122           {                                       /* y          */
8123             return KEY_y;
8124           }
8125
8126         default:
8127           goto unknown;
8128       }
8129
8130     case 2: /* 18 tokens of length 2 */
8131       switch (name[0])
8132       {
8133         case 'd':
8134           if (name[1] == 'o')
8135           {                                       /* do         */
8136             return KEY_do;
8137           }
8138
8139           goto unknown;
8140
8141         case 'e':
8142           if (name[1] == 'q')
8143           {                                       /* eq         */
8144             return -KEY_eq;
8145           }
8146
8147           goto unknown;
8148
8149         case 'g':
8150           switch (name[1])
8151           {
8152             case 'e':
8153               {                                   /* ge         */
8154                 return -KEY_ge;
8155               }
8156
8157             case 't':
8158               {                                   /* gt         */
8159                 return -KEY_gt;
8160               }
8161
8162             default:
8163               goto unknown;
8164           }
8165
8166         case 'i':
8167           if (name[1] == 'f')
8168           {                                       /* if         */
8169             return KEY_if;
8170           }
8171
8172           goto unknown;
8173
8174         case 'l':
8175           switch (name[1])
8176           {
8177             case 'c':
8178               {                                   /* lc         */
8179                 return -KEY_lc;
8180               }
8181
8182             case 'e':
8183               {                                   /* le         */
8184                 return -KEY_le;
8185               }
8186
8187             case 't':
8188               {                                   /* lt         */
8189                 return -KEY_lt;
8190               }
8191
8192             default:
8193               goto unknown;
8194           }
8195
8196         case 'm':
8197           if (name[1] == 'y')
8198           {                                       /* my         */
8199             return KEY_my;
8200           }
8201
8202           goto unknown;
8203
8204         case 'n':
8205           switch (name[1])
8206           {
8207             case 'e':
8208               {                                   /* ne         */
8209                 return -KEY_ne;
8210               }
8211
8212             case 'o':
8213               {                                   /* no         */
8214                 return KEY_no;
8215               }
8216
8217             default:
8218               goto unknown;
8219           }
8220
8221         case 'o':
8222           if (name[1] == 'r')
8223           {                                       /* or         */
8224             return -KEY_or;
8225           }
8226
8227           goto unknown;
8228
8229         case 'q':
8230           switch (name[1])
8231           {
8232             case 'q':
8233               {                                   /* qq         */
8234                 return KEY_qq;
8235               }
8236
8237             case 'r':
8238               {                                   /* qr         */
8239                 return KEY_qr;
8240               }
8241
8242             case 'w':
8243               {                                   /* qw         */
8244                 return KEY_qw;
8245               }
8246
8247             case 'x':
8248               {                                   /* qx         */
8249                 return KEY_qx;
8250               }
8251
8252             default:
8253               goto unknown;
8254           }
8255
8256         case 't':
8257           if (name[1] == 'r')
8258           {                                       /* tr         */
8259             return KEY_tr;
8260           }
8261
8262           goto unknown;
8263
8264         case 'u':
8265           if (name[1] == 'c')
8266           {                                       /* uc         */
8267             return -KEY_uc;
8268           }
8269
8270           goto unknown;
8271
8272         default:
8273           goto unknown;
8274       }
8275
8276     case 3: /* 29 tokens of length 3 */
8277       switch (name[0])
8278       {
8279         case 'E':
8280           if (name[1] == 'N' &&
8281               name[2] == 'D')
8282           {                                       /* END        */
8283             return KEY_END;
8284           }
8285
8286           goto unknown;
8287
8288         case 'a':
8289           switch (name[1])
8290           {
8291             case 'b':
8292               if (name[2] == 's')
8293               {                                   /* abs        */
8294                 return -KEY_abs;
8295               }
8296
8297               goto unknown;
8298
8299             case 'n':
8300               if (name[2] == 'd')
8301               {                                   /* and        */
8302                 return -KEY_and;
8303               }
8304
8305               goto unknown;
8306
8307             default:
8308               goto unknown;
8309           }
8310
8311         case 'c':
8312           switch (name[1])
8313           {
8314             case 'h':
8315               if (name[2] == 'r')
8316               {                                   /* chr        */
8317                 return -KEY_chr;
8318               }
8319
8320               goto unknown;
8321
8322             case 'm':
8323               if (name[2] == 'p')
8324               {                                   /* cmp        */
8325                 return -KEY_cmp;
8326               }
8327
8328               goto unknown;
8329
8330             case 'o':
8331               if (name[2] == 's')
8332               {                                   /* cos        */
8333                 return -KEY_cos;
8334               }
8335
8336               goto unknown;
8337
8338             default:
8339               goto unknown;
8340           }
8341
8342         case 'd':
8343           if (name[1] == 'i' &&
8344               name[2] == 'e')
8345           {                                       /* die        */
8346             return -KEY_die;
8347           }
8348
8349           goto unknown;
8350
8351         case 'e':
8352           switch (name[1])
8353           {
8354             case 'o':
8355               if (name[2] == 'f')
8356               {                                   /* eof        */
8357                 return -KEY_eof;
8358               }
8359
8360               goto unknown;
8361
8362             case 'x':
8363               if (name[2] == 'p')
8364               {                                   /* exp        */
8365                 return -KEY_exp;
8366               }
8367
8368               goto unknown;
8369
8370             default:
8371               goto unknown;
8372           }
8373
8374         case 'f':
8375           if (name[1] == 'o' &&
8376               name[2] == 'r')
8377           {                                       /* for        */
8378             return KEY_for;
8379           }
8380
8381           goto unknown;
8382
8383         case 'h':
8384           if (name[1] == 'e' &&
8385               name[2] == 'x')
8386           {                                       /* hex        */
8387             return -KEY_hex;
8388           }
8389
8390           goto unknown;
8391
8392         case 'i':
8393           if (name[1] == 'n' &&
8394               name[2] == 't')
8395           {                                       /* int        */
8396             return -KEY_int;
8397           }
8398
8399           goto unknown;
8400
8401         case 'l':
8402           if (name[1] == 'o' &&
8403               name[2] == 'g')
8404           {                                       /* log        */
8405             return -KEY_log;
8406           }
8407
8408           goto unknown;
8409
8410         case 'm':
8411           if (name[1] == 'a' &&
8412               name[2] == 'p')
8413           {                                       /* map        */
8414             return KEY_map;
8415           }
8416
8417           goto unknown;
8418
8419         case 'n':
8420           if (name[1] == 'o' &&
8421               name[2] == 't')
8422           {                                       /* not        */
8423             return -KEY_not;
8424           }
8425
8426           goto unknown;
8427
8428         case 'o':
8429           switch (name[1])
8430           {
8431             case 'c':
8432               if (name[2] == 't')
8433               {                                   /* oct        */
8434                 return -KEY_oct;
8435               }
8436
8437               goto unknown;
8438
8439             case 'r':
8440               if (name[2] == 'd')
8441               {                                   /* ord        */
8442                 return -KEY_ord;
8443               }
8444
8445               goto unknown;
8446
8447             case 'u':
8448               if (name[2] == 'r')
8449               {                                   /* our        */
8450                 return KEY_our;
8451               }
8452
8453               goto unknown;
8454
8455             default:
8456               goto unknown;
8457           }
8458
8459         case 'p':
8460           if (name[1] == 'o')
8461           {
8462             switch (name[2])
8463             {
8464               case 'p':
8465                 {                                 /* pop        */
8466                   return -KEY_pop;
8467                 }
8468
8469               case 's':
8470                 {                                 /* pos        */
8471                   return KEY_pos;
8472                 }
8473
8474               default:
8475                 goto unknown;
8476             }
8477           }
8478
8479           goto unknown;
8480
8481         case 'r':
8482           if (name[1] == 'e' &&
8483               name[2] == 'f')
8484           {                                       /* ref        */
8485             return -KEY_ref;
8486           }
8487
8488           goto unknown;
8489
8490         case 's':
8491           switch (name[1])
8492           {
8493             case 'a':
8494               if (name[2] == 'y')
8495               {                                   /* say        */
8496                 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
8497               }
8498
8499               goto unknown;
8500
8501             case 'i':
8502               if (name[2] == 'n')
8503               {                                   /* sin        */
8504                 return -KEY_sin;
8505               }
8506
8507               goto unknown;
8508
8509             case 'u':
8510               if (name[2] == 'b')
8511               {                                   /* sub        */
8512                 return KEY_sub;
8513               }
8514
8515               goto unknown;
8516
8517             default:
8518               goto unknown;
8519           }
8520
8521         case 't':
8522           if (name[1] == 'i' &&
8523               name[2] == 'e')
8524           {                                       /* tie        */
8525             return KEY_tie;
8526           }
8527
8528           goto unknown;
8529
8530         case 'u':
8531           if (name[1] == 's' &&
8532               name[2] == 'e')
8533           {                                       /* use        */
8534             return KEY_use;
8535           }
8536
8537           goto unknown;
8538
8539         case 'v':
8540           if (name[1] == 'e' &&
8541               name[2] == 'c')
8542           {                                       /* vec        */
8543             return -KEY_vec;
8544           }
8545
8546           goto unknown;
8547
8548         case 'x':
8549           if (name[1] == 'o' &&
8550               name[2] == 'r')
8551           {                                       /* xor        */
8552             return -KEY_xor;
8553           }
8554
8555           goto unknown;
8556
8557         default:
8558           goto unknown;
8559       }
8560
8561     case 4: /* 41 tokens of length 4 */
8562       switch (name[0])
8563       {
8564         case 'C':
8565           if (name[1] == 'O' &&
8566               name[2] == 'R' &&
8567               name[3] == 'E')
8568           {                                       /* CORE       */
8569             return -KEY_CORE;
8570           }
8571
8572           goto unknown;
8573
8574         case 'I':
8575           if (name[1] == 'N' &&
8576               name[2] == 'I' &&
8577               name[3] == 'T')
8578           {                                       /* INIT       */
8579             return KEY_INIT;
8580           }
8581
8582           goto unknown;
8583
8584         case 'b':
8585           if (name[1] == 'i' &&
8586               name[2] == 'n' &&
8587               name[3] == 'd')
8588           {                                       /* bind       */
8589             return -KEY_bind;
8590           }
8591
8592           goto unknown;
8593
8594         case 'c':
8595           if (name[1] == 'h' &&
8596               name[2] == 'o' &&
8597               name[3] == 'p')
8598           {                                       /* chop       */
8599             return -KEY_chop;
8600           }
8601
8602           goto unknown;
8603
8604         case 'd':
8605           if (name[1] == 'u' &&
8606               name[2] == 'm' &&
8607               name[3] == 'p')
8608           {                                       /* dump       */
8609             return -KEY_dump;
8610           }
8611
8612           goto unknown;
8613
8614         case 'e':
8615           switch (name[1])
8616           {
8617             case 'a':
8618               if (name[2] == 'c' &&
8619                   name[3] == 'h')
8620               {                                   /* each       */
8621                 return -KEY_each;
8622               }
8623
8624               goto unknown;
8625
8626             case 'l':
8627               if (name[2] == 's' &&
8628                   name[3] == 'e')
8629               {                                   /* else       */
8630                 return KEY_else;
8631               }
8632
8633               goto unknown;
8634
8635             case 'v':
8636               if (name[2] == 'a' &&
8637                   name[3] == 'l')
8638               {                                   /* eval       */
8639                 return KEY_eval;
8640               }
8641
8642               goto unknown;
8643
8644             case 'x':
8645               switch (name[2])
8646               {
8647                 case 'e':
8648                   if (name[3] == 'c')
8649                   {                               /* exec       */
8650                     return -KEY_exec;
8651                   }
8652
8653                   goto unknown;
8654
8655                 case 'i':
8656                   if (name[3] == 't')
8657                   {                               /* exit       */
8658                     return -KEY_exit;
8659                   }
8660
8661                   goto unknown;
8662
8663                 default:
8664                   goto unknown;
8665               }
8666
8667             default:
8668               goto unknown;
8669           }
8670
8671         case 'f':
8672           if (name[1] == 'o' &&
8673               name[2] == 'r' &&
8674               name[3] == 'k')
8675           {                                       /* fork       */
8676             return -KEY_fork;
8677           }
8678
8679           goto unknown;
8680
8681         case 'g':
8682           switch (name[1])
8683           {
8684             case 'e':
8685               if (name[2] == 't' &&
8686                   name[3] == 'c')
8687               {                                   /* getc       */
8688                 return -KEY_getc;
8689               }
8690
8691               goto unknown;
8692
8693             case 'l':
8694               if (name[2] == 'o' &&
8695                   name[3] == 'b')
8696               {                                   /* glob       */
8697                 return KEY_glob;
8698               }
8699
8700               goto unknown;
8701
8702             case 'o':
8703               if (name[2] == 't' &&
8704                   name[3] == 'o')
8705               {                                   /* goto       */
8706                 return KEY_goto;
8707               }
8708
8709               goto unknown;
8710
8711             case 'r':
8712               if (name[2] == 'e' &&
8713                   name[3] == 'p')
8714               {                                   /* grep       */
8715                 return KEY_grep;
8716               }
8717
8718               goto unknown;
8719
8720             default:
8721               goto unknown;
8722           }
8723
8724         case 'j':
8725           if (name[1] == 'o' &&
8726               name[2] == 'i' &&
8727               name[3] == 'n')
8728           {                                       /* join       */
8729             return -KEY_join;
8730           }
8731
8732           goto unknown;
8733
8734         case 'k':
8735           switch (name[1])
8736           {
8737             case 'e':
8738               if (name[2] == 'y' &&
8739                   name[3] == 's')
8740               {                                   /* keys       */
8741                 return -KEY_keys;
8742               }
8743
8744               goto unknown;
8745
8746             case 'i':
8747               if (name[2] == 'l' &&
8748                   name[3] == 'l')
8749               {                                   /* kill       */
8750                 return -KEY_kill;
8751               }
8752
8753               goto unknown;
8754
8755             default:
8756               goto unknown;
8757           }
8758
8759         case 'l':
8760           switch (name[1])
8761           {
8762             case 'a':
8763               if (name[2] == 's' &&
8764                   name[3] == 't')
8765               {                                   /* last       */
8766                 return KEY_last;
8767               }
8768
8769               goto unknown;
8770
8771             case 'i':
8772               if (name[2] == 'n' &&
8773                   name[3] == 'k')
8774               {                                   /* link       */
8775                 return -KEY_link;
8776               }
8777
8778               goto unknown;
8779
8780             case 'o':
8781               if (name[2] == 'c' &&
8782                   name[3] == 'k')
8783               {                                   /* lock       */
8784                 return -KEY_lock;
8785               }
8786
8787               goto unknown;
8788
8789             default:
8790               goto unknown;
8791           }
8792
8793         case 'n':
8794           if (name[1] == 'e' &&
8795               name[2] == 'x' &&
8796               name[3] == 't')
8797           {                                       /* next       */
8798             return KEY_next;
8799           }
8800
8801           goto unknown;
8802
8803         case 'o':
8804           if (name[1] == 'p' &&
8805               name[2] == 'e' &&
8806               name[3] == 'n')
8807           {                                       /* open       */
8808             return -KEY_open;
8809           }
8810
8811           goto unknown;
8812
8813         case 'p':
8814           switch (name[1])
8815           {
8816             case 'a':
8817               if (name[2] == 'c' &&
8818                   name[3] == 'k')
8819               {                                   /* pack       */
8820                 return -KEY_pack;
8821               }
8822
8823               goto unknown;
8824
8825             case 'i':
8826               if (name[2] == 'p' &&
8827                   name[3] == 'e')
8828               {                                   /* pipe       */
8829                 return -KEY_pipe;
8830               }
8831
8832               goto unknown;
8833
8834             case 'u':
8835               if (name[2] == 's' &&
8836                   name[3] == 'h')
8837               {                                   /* push       */
8838                 return -KEY_push;
8839               }
8840
8841               goto unknown;
8842
8843             default:
8844               goto unknown;
8845           }
8846
8847         case 'r':
8848           switch (name[1])
8849           {
8850             case 'a':
8851               if (name[2] == 'n' &&
8852                   name[3] == 'd')
8853               {                                   /* rand       */
8854                 return -KEY_rand;
8855               }
8856
8857               goto unknown;
8858
8859             case 'e':
8860               switch (name[2])
8861               {
8862                 case 'a':
8863                   if (name[3] == 'd')
8864                   {                               /* read       */
8865                     return -KEY_read;
8866                   }
8867
8868                   goto unknown;
8869
8870                 case 'c':
8871                   if (name[3] == 'v')
8872                   {                               /* recv       */
8873                     return -KEY_recv;
8874                   }
8875
8876                   goto unknown;
8877
8878                 case 'd':
8879                   if (name[3] == 'o')
8880                   {                               /* redo       */
8881                     return KEY_redo;
8882                   }
8883
8884                   goto unknown;
8885
8886                 default:
8887                   goto unknown;
8888               }
8889
8890             default:
8891               goto unknown;
8892           }
8893
8894         case 's':
8895           switch (name[1])
8896           {
8897             case 'e':
8898               switch (name[2])
8899               {
8900                 case 'e':
8901                   if (name[3] == 'k')
8902                   {                               /* seek       */
8903                     return -KEY_seek;
8904                   }
8905
8906                   goto unknown;
8907
8908                 case 'n':
8909                   if (name[3] == 'd')
8910                   {                               /* send       */
8911                     return -KEY_send;
8912                   }
8913
8914                   goto unknown;
8915
8916                 default:
8917                   goto unknown;
8918               }
8919
8920             case 'o':
8921               if (name[2] == 'r' &&
8922                   name[3] == 't')
8923               {                                   /* sort       */
8924                 return KEY_sort;
8925               }
8926
8927               goto unknown;
8928
8929             case 'q':
8930               if (name[2] == 'r' &&
8931                   name[3] == 't')
8932               {                                   /* sqrt       */
8933                 return -KEY_sqrt;
8934               }
8935
8936               goto unknown;
8937
8938             case 't':
8939               if (name[2] == 'a' &&
8940                   name[3] == 't')
8941               {                                   /* stat       */
8942                 return -KEY_stat;
8943               }
8944
8945               goto unknown;
8946
8947             default:
8948               goto unknown;
8949           }
8950
8951         case 't':
8952           switch (name[1])
8953           {
8954             case 'e':
8955               if (name[2] == 'l' &&
8956                   name[3] == 'l')
8957               {                                   /* tell       */
8958                 return -KEY_tell;
8959               }
8960
8961               goto unknown;
8962
8963             case 'i':
8964               switch (name[2])
8965               {
8966                 case 'e':
8967                   if (name[3] == 'd')
8968                   {                               /* tied       */
8969                     return KEY_tied;
8970                   }
8971
8972                   goto unknown;
8973
8974                 case 'm':
8975                   if (name[3] == 'e')
8976                   {                               /* time       */
8977                     return -KEY_time;
8978                   }
8979
8980                   goto unknown;
8981
8982                 default:
8983                   goto unknown;
8984               }
8985
8986             default:
8987               goto unknown;
8988           }
8989
8990         case 'w':
8991           switch (name[1])
8992           {
8993             case 'a':
8994               switch (name[2])
8995               {
8996                 case 'i':
8997                   if (name[3] == 't')
8998                   {                               /* wait       */
8999                     return -KEY_wait;
9000                   }
9001
9002                   goto unknown;
9003
9004                 case 'r':
9005                   if (name[3] == 'n')
9006                   {                               /* warn       */
9007                     return -KEY_warn;
9008                   }
9009
9010                   goto unknown;
9011
9012                 default:
9013                   goto unknown;
9014               }
9015
9016             case 'h':
9017               if (name[2] == 'e' &&
9018                   name[3] == 'n')
9019               {                                   /* when       */
9020                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
9021               }
9022
9023               goto unknown;
9024
9025             default:
9026               goto unknown;
9027           }
9028
9029         default:
9030           goto unknown;
9031       }
9032
9033     case 5: /* 39 tokens of length 5 */
9034       switch (name[0])
9035       {
9036         case 'B':
9037           if (name[1] == 'E' &&
9038               name[2] == 'G' &&
9039               name[3] == 'I' &&
9040               name[4] == 'N')
9041           {                                       /* BEGIN      */
9042             return KEY_BEGIN;
9043           }
9044
9045           goto unknown;
9046
9047         case 'C':
9048           if (name[1] == 'H' &&
9049               name[2] == 'E' &&
9050               name[3] == 'C' &&
9051               name[4] == 'K')
9052           {                                       /* CHECK      */
9053             return KEY_CHECK;
9054           }
9055
9056           goto unknown;
9057
9058         case 'a':
9059           switch (name[1])
9060           {
9061             case 'l':
9062               if (name[2] == 'a' &&
9063                   name[3] == 'r' &&
9064                   name[4] == 'm')
9065               {                                   /* alarm      */
9066                 return -KEY_alarm;
9067               }
9068
9069               goto unknown;
9070
9071             case 't':
9072               if (name[2] == 'a' &&
9073                   name[3] == 'n' &&
9074                   name[4] == '2')
9075               {                                   /* atan2      */
9076                 return -KEY_atan2;
9077               }
9078
9079               goto unknown;
9080
9081             default:
9082               goto unknown;
9083           }
9084
9085         case 'b':
9086           switch (name[1])
9087           {
9088             case 'l':
9089               if (name[2] == 'e' &&
9090                   name[3] == 's' &&
9091                   name[4] == 's')
9092               {                                   /* bless      */
9093                 return -KEY_bless;
9094               }
9095
9096               goto unknown;
9097
9098             case 'r':
9099               if (name[2] == 'e' &&
9100                   name[3] == 'a' &&
9101                   name[4] == 'k')
9102               {                                   /* break      */
9103                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
9104               }
9105
9106               goto unknown;
9107
9108             default:
9109               goto unknown;
9110           }
9111
9112         case 'c':
9113           switch (name[1])
9114           {
9115             case 'h':
9116               switch (name[2])
9117               {
9118                 case 'd':
9119                   if (name[3] == 'i' &&
9120                       name[4] == 'r')
9121                   {                               /* chdir      */
9122                     return -KEY_chdir;
9123                   }
9124
9125                   goto unknown;
9126
9127                 case 'm':
9128                   if (name[3] == 'o' &&
9129                       name[4] == 'd')
9130                   {                               /* chmod      */
9131                     return -KEY_chmod;
9132                   }
9133
9134                   goto unknown;
9135
9136                 case 'o':
9137                   switch (name[3])
9138                   {
9139                     case 'm':
9140                       if (name[4] == 'p')
9141                       {                           /* chomp      */
9142                         return -KEY_chomp;
9143                       }
9144
9145                       goto unknown;
9146
9147                     case 'w':
9148                       if (name[4] == 'n')
9149                       {                           /* chown      */
9150                         return -KEY_chown;
9151                       }
9152
9153                       goto unknown;
9154
9155                     default:
9156                       goto unknown;
9157                   }
9158
9159                 default:
9160                   goto unknown;
9161               }
9162
9163             case 'l':
9164               if (name[2] == 'o' &&
9165                   name[3] == 's' &&
9166                   name[4] == 'e')
9167               {                                   /* close      */
9168                 return -KEY_close;
9169               }
9170
9171               goto unknown;
9172
9173             case 'r':
9174               if (name[2] == 'y' &&
9175                   name[3] == 'p' &&
9176                   name[4] == 't')
9177               {                                   /* crypt      */
9178                 return -KEY_crypt;
9179               }
9180
9181               goto unknown;
9182
9183             default:
9184               goto unknown;
9185           }
9186
9187         case 'e':
9188           if (name[1] == 'l' &&
9189               name[2] == 's' &&
9190               name[3] == 'i' &&
9191               name[4] == 'f')
9192           {                                       /* elsif      */
9193             return KEY_elsif;
9194           }
9195
9196           goto unknown;
9197
9198         case 'f':
9199           switch (name[1])
9200           {
9201             case 'c':
9202               if (name[2] == 'n' &&
9203                   name[3] == 't' &&
9204                   name[4] == 'l')
9205               {                                   /* fcntl      */
9206                 return -KEY_fcntl;
9207               }
9208
9209               goto unknown;
9210
9211             case 'l':
9212               if (name[2] == 'o' &&
9213                   name[3] == 'c' &&
9214                   name[4] == 'k')
9215               {                                   /* flock      */
9216                 return -KEY_flock;
9217               }
9218
9219               goto unknown;
9220
9221             default:
9222               goto unknown;
9223           }
9224
9225         case 'g':
9226           if (name[1] == 'i' &&
9227               name[2] == 'v' &&
9228               name[3] == 'e' &&
9229               name[4] == 'n')
9230           {                                       /* given      */
9231             return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
9232           }
9233
9234           goto unknown;
9235
9236         case 'i':
9237           switch (name[1])
9238           {
9239             case 'n':
9240               if (name[2] == 'd' &&
9241                   name[3] == 'e' &&
9242                   name[4] == 'x')
9243               {                                   /* index      */
9244                 return -KEY_index;
9245               }
9246
9247               goto unknown;
9248
9249             case 'o':
9250               if (name[2] == 'c' &&
9251                   name[3] == 't' &&
9252                   name[4] == 'l')
9253               {                                   /* ioctl      */
9254                 return -KEY_ioctl;
9255               }
9256
9257               goto unknown;
9258
9259             default:
9260               goto unknown;
9261           }
9262
9263         case 'l':
9264           switch (name[1])
9265           {
9266             case 'o':
9267               if (name[2] == 'c' &&
9268                   name[3] == 'a' &&
9269                   name[4] == 'l')
9270               {                                   /* local      */
9271                 return KEY_local;
9272               }
9273
9274               goto unknown;
9275
9276             case 's':
9277               if (name[2] == 't' &&
9278                   name[3] == 'a' &&
9279                   name[4] == 't')
9280               {                                   /* lstat      */
9281                 return -KEY_lstat;
9282               }
9283
9284               goto unknown;
9285
9286             default:
9287               goto unknown;
9288           }
9289
9290         case 'm':
9291           if (name[1] == 'k' &&
9292               name[2] == 'd' &&
9293               name[3] == 'i' &&
9294               name[4] == 'r')
9295           {                                       /* mkdir      */
9296             return -KEY_mkdir;
9297           }
9298
9299           goto unknown;
9300
9301         case 'p':
9302           if (name[1] == 'r' &&
9303               name[2] == 'i' &&
9304               name[3] == 'n' &&
9305               name[4] == 't')
9306           {                                       /* print      */
9307             return KEY_print;
9308           }
9309
9310           goto unknown;
9311
9312         case 'r':
9313           switch (name[1])
9314           {
9315             case 'e':
9316               if (name[2] == 's' &&
9317                   name[3] == 'e' &&
9318                   name[4] == 't')
9319               {                                   /* reset      */
9320                 return -KEY_reset;
9321               }
9322
9323               goto unknown;
9324
9325             case 'm':
9326               if (name[2] == 'd' &&
9327                   name[3] == 'i' &&
9328                   name[4] == 'r')
9329               {                                   /* rmdir      */
9330                 return -KEY_rmdir;
9331               }
9332
9333               goto unknown;
9334
9335             default:
9336               goto unknown;
9337           }
9338
9339         case 's':
9340           switch (name[1])
9341           {
9342             case 'e':
9343               if (name[2] == 'm' &&
9344                   name[3] == 'o' &&
9345                   name[4] == 'p')
9346               {                                   /* semop      */
9347                 return -KEY_semop;
9348               }
9349
9350               goto unknown;
9351
9352             case 'h':
9353               if (name[2] == 'i' &&
9354                   name[3] == 'f' &&
9355                   name[4] == 't')
9356               {                                   /* shift      */
9357                 return -KEY_shift;
9358               }
9359
9360               goto unknown;
9361
9362             case 'l':
9363               if (name[2] == 'e' &&
9364                   name[3] == 'e' &&
9365                   name[4] == 'p')
9366               {                                   /* sleep      */
9367                 return -KEY_sleep;
9368               }
9369
9370               goto unknown;
9371
9372             case 'p':
9373               if (name[2] == 'l' &&
9374                   name[3] == 'i' &&
9375                   name[4] == 't')
9376               {                                   /* split      */
9377                 return KEY_split;
9378               }
9379
9380               goto unknown;
9381
9382             case 'r':
9383               if (name[2] == 'a' &&
9384                   name[3] == 'n' &&
9385                   name[4] == 'd')
9386               {                                   /* srand      */
9387                 return -KEY_srand;
9388               }
9389
9390               goto unknown;
9391
9392             case 't':
9393               switch (name[2])
9394               {
9395                 case 'a':
9396                   if (name[3] == 't' &&
9397                       name[4] == 'e')
9398                   {                               /* state      */
9399                     return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
9400                   }
9401
9402                   goto unknown;
9403
9404                 case 'u':
9405                   if (name[3] == 'd' &&
9406                       name[4] == 'y')
9407                   {                               /* study      */
9408                     return KEY_study;
9409                   }
9410
9411                   goto unknown;
9412
9413                 default:
9414                   goto unknown;
9415               }
9416
9417             default:
9418               goto unknown;
9419           }
9420
9421         case 't':
9422           if (name[1] == 'i' &&
9423               name[2] == 'm' &&
9424               name[3] == 'e' &&
9425               name[4] == 's')
9426           {                                       /* times      */
9427             return -KEY_times;
9428           }
9429
9430           goto unknown;
9431
9432         case 'u':
9433           switch (name[1])
9434           {
9435             case 'm':
9436               if (name[2] == 'a' &&
9437                   name[3] == 's' &&
9438                   name[4] == 'k')
9439               {                                   /* umask      */
9440                 return -KEY_umask;
9441               }
9442
9443               goto unknown;
9444
9445             case 'n':
9446               switch (name[2])
9447               {
9448                 case 'd':
9449                   if (name[3] == 'e' &&
9450                       name[4] == 'f')
9451                   {                               /* undef      */
9452                     return KEY_undef;
9453                   }
9454
9455                   goto unknown;
9456
9457                 case 't':
9458                   if (name[3] == 'i')
9459                   {
9460                     switch (name[4])
9461                     {
9462                       case 'e':
9463                         {                         /* untie      */
9464                           return KEY_untie;
9465                         }
9466
9467                       case 'l':
9468                         {                         /* until      */
9469                           return KEY_until;
9470                         }
9471
9472                       default:
9473                         goto unknown;
9474                     }
9475                   }
9476
9477                   goto unknown;
9478
9479                 default:
9480                   goto unknown;
9481               }
9482
9483             case 't':
9484               if (name[2] == 'i' &&
9485                   name[3] == 'm' &&
9486                   name[4] == 'e')
9487               {                                   /* utime      */
9488                 return -KEY_utime;
9489               }
9490
9491               goto unknown;
9492
9493             default:
9494               goto unknown;
9495           }
9496
9497         case 'w':
9498           switch (name[1])
9499           {
9500             case 'h':
9501               if (name[2] == 'i' &&
9502                   name[3] == 'l' &&
9503                   name[4] == 'e')
9504               {                                   /* while      */
9505                 return KEY_while;
9506               }
9507
9508               goto unknown;
9509
9510             case 'r':
9511               if (name[2] == 'i' &&
9512                   name[3] == 't' &&
9513                   name[4] == 'e')
9514               {                                   /* write      */
9515                 return -KEY_write;
9516               }
9517
9518               goto unknown;
9519
9520             default:
9521               goto unknown;
9522           }
9523
9524         default:
9525           goto unknown;
9526       }
9527
9528     case 6: /* 33 tokens of length 6 */
9529       switch (name[0])
9530       {
9531         case 'a':
9532           if (name[1] == 'c' &&
9533               name[2] == 'c' &&
9534               name[3] == 'e' &&
9535               name[4] == 'p' &&
9536               name[5] == 't')
9537           {                                       /* accept     */
9538             return -KEY_accept;
9539           }
9540
9541           goto unknown;
9542
9543         case 'c':
9544           switch (name[1])
9545           {
9546             case 'a':
9547               if (name[2] == 'l' &&
9548                   name[3] == 'l' &&
9549                   name[4] == 'e' &&
9550                   name[5] == 'r')
9551               {                                   /* caller     */
9552                 return -KEY_caller;
9553               }
9554
9555               goto unknown;
9556
9557             case 'h':
9558               if (name[2] == 'r' &&
9559                   name[3] == 'o' &&
9560                   name[4] == 'o' &&
9561                   name[5] == 't')
9562               {                                   /* chroot     */
9563                 return -KEY_chroot;
9564               }
9565
9566               goto unknown;
9567
9568             default:
9569               goto unknown;
9570           }
9571
9572         case 'd':
9573           if (name[1] == 'e' &&
9574               name[2] == 'l' &&
9575               name[3] == 'e' &&
9576               name[4] == 't' &&
9577               name[5] == 'e')
9578           {                                       /* delete     */
9579             return KEY_delete;
9580           }
9581
9582           goto unknown;
9583
9584         case 'e':
9585           switch (name[1])
9586           {
9587             case 'l':
9588               if (name[2] == 's' &&
9589                   name[3] == 'e' &&
9590                   name[4] == 'i' &&
9591                   name[5] == 'f')
9592               {                                   /* elseif     */
9593                   Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
9594               }
9595
9596               goto unknown;
9597
9598             case 'x':
9599               if (name[2] == 'i' &&
9600                   name[3] == 's' &&
9601                   name[4] == 't' &&
9602                   name[5] == 's')
9603               {                                   /* exists     */
9604                 return KEY_exists;
9605               }
9606
9607               goto unknown;
9608
9609             default:
9610               goto unknown;
9611           }
9612
9613         case 'f':
9614           switch (name[1])
9615           {
9616             case 'i':
9617               if (name[2] == 'l' &&
9618                   name[3] == 'e' &&
9619                   name[4] == 'n' &&
9620                   name[5] == 'o')
9621               {                                   /* fileno     */
9622                 return -KEY_fileno;
9623               }
9624
9625               goto unknown;
9626
9627             case 'o':
9628               if (name[2] == 'r' &&
9629                   name[3] == 'm' &&
9630                   name[4] == 'a' &&
9631                   name[5] == 't')
9632               {                                   /* format     */
9633                 return KEY_format;
9634               }
9635
9636               goto unknown;
9637
9638             default:
9639               goto unknown;
9640           }
9641
9642         case 'g':
9643           if (name[1] == 'm' &&
9644               name[2] == 't' &&
9645               name[3] == 'i' &&
9646               name[4] == 'm' &&
9647               name[5] == 'e')
9648           {                                       /* gmtime     */
9649             return -KEY_gmtime;
9650           }
9651
9652           goto unknown;
9653
9654         case 'l':
9655           switch (name[1])
9656           {
9657             case 'e':
9658               if (name[2] == 'n' &&
9659                   name[3] == 'g' &&
9660                   name[4] == 't' &&
9661                   name[5] == 'h')
9662               {                                   /* length     */
9663                 return -KEY_length;
9664               }
9665
9666               goto unknown;
9667
9668             case 'i':
9669               if (name[2] == 's' &&
9670                   name[3] == 't' &&
9671                   name[4] == 'e' &&
9672                   name[5] == 'n')
9673               {                                   /* listen     */
9674                 return -KEY_listen;
9675               }
9676
9677               goto unknown;
9678
9679             default:
9680               goto unknown;
9681           }
9682
9683         case 'm':
9684           if (name[1] == 's' &&
9685               name[2] == 'g')
9686           {
9687             switch (name[3])
9688             {
9689               case 'c':
9690                 if (name[4] == 't' &&
9691                     name[5] == 'l')
9692                 {                                 /* msgctl     */
9693                   return -KEY_msgctl;
9694                 }
9695
9696                 goto unknown;
9697
9698               case 'g':
9699                 if (name[4] == 'e' &&
9700                     name[5] == 't')
9701                 {                                 /* msgget     */
9702                   return -KEY_msgget;
9703                 }
9704
9705                 goto unknown;
9706
9707               case 'r':
9708                 if (name[4] == 'c' &&
9709                     name[5] == 'v')
9710                 {                                 /* msgrcv     */
9711                   return -KEY_msgrcv;
9712                 }
9713
9714                 goto unknown;
9715
9716               case 's':
9717                 if (name[4] == 'n' &&
9718                     name[5] == 'd')
9719                 {                                 /* msgsnd     */
9720                   return -KEY_msgsnd;
9721                 }
9722
9723                 goto unknown;
9724
9725               default:
9726                 goto unknown;
9727             }
9728           }
9729
9730           goto unknown;
9731
9732         case 'p':
9733           if (name[1] == 'r' &&
9734               name[2] == 'i' &&
9735               name[3] == 'n' &&
9736               name[4] == 't' &&
9737               name[5] == 'f')
9738           {                                       /* printf     */
9739             return KEY_printf;
9740           }
9741
9742           goto unknown;
9743
9744         case 'r':
9745           switch (name[1])
9746           {
9747             case 'e':
9748               switch (name[2])
9749               {
9750                 case 'n':
9751                   if (name[3] == 'a' &&
9752                       name[4] == 'm' &&
9753                       name[5] == 'e')
9754                   {                               /* rename     */
9755                     return -KEY_rename;
9756                   }
9757
9758                   goto unknown;
9759
9760                 case 't':
9761                   if (name[3] == 'u' &&
9762                       name[4] == 'r' &&
9763                       name[5] == 'n')
9764                   {                               /* return     */
9765                     return KEY_return;
9766                   }
9767
9768                   goto unknown;
9769
9770                 default:
9771                   goto unknown;
9772               }
9773
9774             case 'i':
9775               if (name[2] == 'n' &&
9776                   name[3] == 'd' &&
9777                   name[4] == 'e' &&
9778                   name[5] == 'x')
9779               {                                   /* rindex     */
9780                 return -KEY_rindex;
9781               }
9782
9783               goto unknown;
9784
9785             default:
9786               goto unknown;
9787           }
9788
9789         case 's':
9790           switch (name[1])
9791           {
9792             case 'c':
9793               if (name[2] == 'a' &&
9794                   name[3] == 'l' &&
9795                   name[4] == 'a' &&
9796                   name[5] == 'r')
9797               {                                   /* scalar     */
9798                 return KEY_scalar;
9799               }
9800
9801               goto unknown;
9802
9803             case 'e':
9804               switch (name[2])
9805               {
9806                 case 'l':
9807                   if (name[3] == 'e' &&
9808                       name[4] == 'c' &&
9809                       name[5] == 't')
9810                   {                               /* select     */
9811                     return -KEY_select;
9812                   }
9813
9814                   goto unknown;
9815
9816                 case 'm':
9817                   switch (name[3])
9818                   {
9819                     case 'c':
9820                       if (name[4] == 't' &&
9821                           name[5] == 'l')
9822                       {                           /* semctl     */
9823                         return -KEY_semctl;
9824                       }
9825
9826                       goto unknown;
9827
9828                     case 'g':
9829                       if (name[4] == 'e' &&
9830                           name[5] == 't')
9831                       {                           /* semget     */
9832                         return -KEY_semget;
9833                       }
9834
9835                       goto unknown;
9836
9837                     default:
9838                       goto unknown;
9839                   }
9840
9841                 default:
9842                   goto unknown;
9843               }
9844
9845             case 'h':
9846               if (name[2] == 'm')
9847               {
9848                 switch (name[3])
9849                 {
9850                   case 'c':
9851                     if (name[4] == 't' &&
9852                         name[5] == 'l')
9853                     {                             /* shmctl     */
9854                       return -KEY_shmctl;
9855                     }
9856
9857                     goto unknown;
9858
9859                   case 'g':
9860                     if (name[4] == 'e' &&
9861                         name[5] == 't')
9862                     {                             /* shmget     */
9863                       return -KEY_shmget;
9864                     }
9865
9866                     goto unknown;
9867
9868                   default:
9869                     goto unknown;
9870                 }
9871               }
9872
9873               goto unknown;
9874
9875             case 'o':
9876               if (name[2] == 'c' &&
9877                   name[3] == 'k' &&
9878                   name[4] == 'e' &&
9879                   name[5] == 't')
9880               {                                   /* socket     */
9881                 return -KEY_socket;
9882               }
9883
9884               goto unknown;
9885
9886             case 'p':
9887               if (name[2] == 'l' &&
9888                   name[3] == 'i' &&
9889                   name[4] == 'c' &&
9890                   name[5] == 'e')
9891               {                                   /* splice     */
9892                 return -KEY_splice;
9893               }
9894
9895               goto unknown;
9896
9897             case 'u':
9898               if (name[2] == 'b' &&
9899                   name[3] == 's' &&
9900                   name[4] == 't' &&
9901                   name[5] == 'r')
9902               {                                   /* substr     */
9903                 return -KEY_substr;
9904               }
9905
9906               goto unknown;
9907
9908             case 'y':
9909               if (name[2] == 's' &&
9910                   name[3] == 't' &&
9911                   name[4] == 'e' &&
9912                   name[5] == 'm')
9913               {                                   /* system     */
9914                 return -KEY_system;
9915               }
9916
9917               goto unknown;
9918
9919             default:
9920               goto unknown;
9921           }
9922
9923         case 'u':
9924           if (name[1] == 'n')
9925           {
9926             switch (name[2])
9927             {
9928               case 'l':
9929                 switch (name[3])
9930                 {
9931                   case 'e':
9932                     if (name[4] == 's' &&
9933                         name[5] == 's')
9934                     {                             /* unless     */
9935                       return KEY_unless;
9936                     }
9937
9938                     goto unknown;
9939
9940                   case 'i':
9941                     if (name[4] == 'n' &&
9942                         name[5] == 'k')
9943                     {                             /* unlink     */
9944                       return -KEY_unlink;
9945                     }
9946
9947                     goto unknown;
9948
9949                   default:
9950                     goto unknown;
9951                 }
9952
9953               case 'p':
9954                 if (name[3] == 'a' &&
9955                     name[4] == 'c' &&
9956                     name[5] == 'k')
9957                 {                                 /* unpack     */
9958                   return -KEY_unpack;
9959                 }
9960
9961                 goto unknown;
9962
9963               default:
9964                 goto unknown;
9965             }
9966           }
9967
9968           goto unknown;
9969
9970         case 'v':
9971           if (name[1] == 'a' &&
9972               name[2] == 'l' &&
9973               name[3] == 'u' &&
9974               name[4] == 'e' &&
9975               name[5] == 's')
9976           {                                       /* values     */
9977             return -KEY_values;
9978           }
9979
9980           goto unknown;
9981
9982         default:
9983           goto unknown;
9984       }
9985
9986     case 7: /* 29 tokens of length 7 */
9987       switch (name[0])
9988       {
9989         case 'D':
9990           if (name[1] == 'E' &&
9991               name[2] == 'S' &&
9992               name[3] == 'T' &&
9993               name[4] == 'R' &&
9994               name[5] == 'O' &&
9995               name[6] == 'Y')
9996           {                                       /* DESTROY    */
9997             return KEY_DESTROY;
9998           }
9999
10000           goto unknown;
10001
10002         case '_':
10003           if (name[1] == '_' &&
10004               name[2] == 'E' &&
10005               name[3] == 'N' &&
10006               name[4] == 'D' &&
10007               name[5] == '_' &&
10008               name[6] == '_')
10009           {                                       /* __END__    */
10010             return KEY___END__;
10011           }
10012
10013           goto unknown;
10014
10015         case 'b':
10016           if (name[1] == 'i' &&
10017               name[2] == 'n' &&
10018               name[3] == 'm' &&
10019               name[4] == 'o' &&
10020               name[5] == 'd' &&
10021               name[6] == 'e')
10022           {                                       /* binmode    */
10023             return -KEY_binmode;
10024           }
10025
10026           goto unknown;
10027
10028         case 'c':
10029           if (name[1] == 'o' &&
10030               name[2] == 'n' &&
10031               name[3] == 'n' &&
10032               name[4] == 'e' &&
10033               name[5] == 'c' &&
10034               name[6] == 't')
10035           {                                       /* connect    */
10036             return -KEY_connect;
10037           }
10038
10039           goto unknown;
10040
10041         case 'd':
10042           switch (name[1])
10043           {
10044             case 'b':
10045               if (name[2] == 'm' &&
10046                   name[3] == 'o' &&
10047                   name[4] == 'p' &&
10048                   name[5] == 'e' &&
10049                   name[6] == 'n')
10050               {                                   /* dbmopen    */
10051                 return -KEY_dbmopen;
10052               }
10053
10054               goto unknown;
10055
10056             case 'e':
10057               if (name[2] == 'f')
10058               {
10059                 switch (name[3])
10060                 {
10061                   case 'a':
10062                     if (name[4] == 'u' &&
10063                         name[5] == 'l' &&
10064                         name[6] == 't')
10065                     {                             /* default    */
10066                       return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
10067                     }
10068
10069                     goto unknown;
10070
10071                   case 'i':
10072                     if (name[4] == 'n' &&
10073                         name[5] == 'e' &&
10074                         name[6] == 'd')
10075                     {                             /* defined    */
10076                       return KEY_defined;
10077                     }
10078
10079                     goto unknown;
10080
10081                   default:
10082                     goto unknown;
10083                 }
10084               }
10085
10086               goto unknown;
10087
10088             default:
10089               goto unknown;
10090           }
10091
10092         case 'f':
10093           if (name[1] == 'o' &&
10094               name[2] == 'r' &&
10095               name[3] == 'e' &&
10096               name[4] == 'a' &&
10097               name[5] == 'c' &&
10098               name[6] == 'h')
10099           {                                       /* foreach    */
10100             return KEY_foreach;
10101           }
10102
10103           goto unknown;
10104
10105         case 'g':
10106           if (name[1] == 'e' &&
10107               name[2] == 't' &&
10108               name[3] == 'p')
10109           {
10110             switch (name[4])
10111             {
10112               case 'g':
10113                 if (name[5] == 'r' &&
10114                     name[6] == 'p')
10115                 {                                 /* getpgrp    */
10116                   return -KEY_getpgrp;
10117                 }
10118
10119                 goto unknown;
10120
10121               case 'p':
10122                 if (name[5] == 'i' &&
10123                     name[6] == 'd')
10124                 {                                 /* getppid    */
10125                   return -KEY_getppid;
10126                 }
10127
10128                 goto unknown;
10129
10130               default:
10131                 goto unknown;
10132             }
10133           }
10134
10135           goto unknown;
10136
10137         case 'l':
10138           if (name[1] == 'c' &&
10139               name[2] == 'f' &&
10140               name[3] == 'i' &&
10141               name[4] == 'r' &&
10142               name[5] == 's' &&
10143               name[6] == 't')
10144           {                                       /* lcfirst    */
10145             return -KEY_lcfirst;
10146           }
10147
10148           goto unknown;
10149
10150         case 'o':
10151           if (name[1] == 'p' &&
10152               name[2] == 'e' &&
10153               name[3] == 'n' &&
10154               name[4] == 'd' &&
10155               name[5] == 'i' &&
10156               name[6] == 'r')
10157           {                                       /* opendir    */
10158             return -KEY_opendir;
10159           }
10160
10161           goto unknown;
10162
10163         case 'p':
10164           if (name[1] == 'a' &&
10165               name[2] == 'c' &&
10166               name[3] == 'k' &&
10167               name[4] == 'a' &&
10168               name[5] == 'g' &&
10169               name[6] == 'e')
10170           {                                       /* package    */
10171             return KEY_package;
10172           }
10173
10174           goto unknown;
10175
10176         case 'r':
10177           if (name[1] == 'e')
10178           {
10179             switch (name[2])
10180             {
10181               case 'a':
10182                 if (name[3] == 'd' &&
10183                     name[4] == 'd' &&
10184                     name[5] == 'i' &&
10185                     name[6] == 'r')
10186                 {                                 /* readdir    */
10187                   return -KEY_readdir;
10188                 }
10189
10190                 goto unknown;
10191
10192               case 'q':
10193                 if (name[3] == 'u' &&
10194                     name[4] == 'i' &&
10195                     name[5] == 'r' &&
10196                     name[6] == 'e')
10197                 {                                 /* require    */
10198                   return KEY_require;
10199                 }
10200
10201                 goto unknown;
10202
10203               case 'v':
10204                 if (name[3] == 'e' &&
10205                     name[4] == 'r' &&
10206                     name[5] == 's' &&
10207                     name[6] == 'e')
10208                 {                                 /* reverse    */
10209                   return -KEY_reverse;
10210                 }
10211
10212                 goto unknown;
10213
10214               default:
10215                 goto unknown;
10216             }
10217           }
10218
10219           goto unknown;
10220
10221         case 's':
10222           switch (name[1])
10223           {
10224             case 'e':
10225               switch (name[2])
10226               {
10227                 case 'e':
10228                   if (name[3] == 'k' &&
10229                       name[4] == 'd' &&
10230                       name[5] == 'i' &&
10231                       name[6] == 'r')
10232                   {                               /* seekdir    */
10233                     return -KEY_seekdir;
10234                   }
10235
10236                   goto unknown;
10237
10238                 case 't':
10239                   if (name[3] == 'p' &&
10240                       name[4] == 'g' &&
10241                       name[5] == 'r' &&
10242                       name[6] == 'p')
10243                   {                               /* setpgrp    */
10244                     return -KEY_setpgrp;
10245                   }
10246
10247                   goto unknown;
10248
10249                 default:
10250                   goto unknown;
10251               }
10252
10253             case 'h':
10254               if (name[2] == 'm' &&
10255                   name[3] == 'r' &&
10256                   name[4] == 'e' &&
10257                   name[5] == 'a' &&
10258                   name[6] == 'd')
10259               {                                   /* shmread    */
10260                 return -KEY_shmread;
10261               }
10262
10263               goto unknown;
10264
10265             case 'p':
10266               if (name[2] == 'r' &&
10267                   name[3] == 'i' &&
10268                   name[4] == 'n' &&
10269                   name[5] == 't' &&
10270                   name[6] == 'f')
10271               {                                   /* sprintf    */
10272                 return -KEY_sprintf;
10273               }
10274
10275               goto unknown;
10276
10277             case 'y':
10278               switch (name[2])
10279               {
10280                 case 'm':
10281                   if (name[3] == 'l' &&
10282                       name[4] == 'i' &&
10283                       name[5] == 'n' &&
10284                       name[6] == 'k')
10285                   {                               /* symlink    */
10286                     return -KEY_symlink;
10287                   }
10288
10289                   goto unknown;
10290
10291                 case 's':
10292                   switch (name[3])
10293                   {
10294                     case 'c':
10295                       if (name[4] == 'a' &&
10296                           name[5] == 'l' &&
10297                           name[6] == 'l')
10298                       {                           /* syscall    */
10299                         return -KEY_syscall;
10300                       }
10301
10302                       goto unknown;
10303
10304                     case 'o':
10305                       if (name[4] == 'p' &&
10306                           name[5] == 'e' &&
10307                           name[6] == 'n')
10308                       {                           /* sysopen    */
10309                         return -KEY_sysopen;
10310                       }
10311
10312                       goto unknown;
10313
10314                     case 'r':
10315                       if (name[4] == 'e' &&
10316                           name[5] == 'a' &&
10317                           name[6] == 'd')
10318                       {                           /* sysread    */
10319                         return -KEY_sysread;
10320                       }
10321
10322                       goto unknown;
10323
10324                     case 's':
10325                       if (name[4] == 'e' &&
10326                           name[5] == 'e' &&
10327                           name[6] == 'k')
10328                       {                           /* sysseek    */
10329                         return -KEY_sysseek;
10330                       }
10331
10332                       goto unknown;
10333
10334                     default:
10335                       goto unknown;
10336                   }
10337
10338                 default:
10339                   goto unknown;
10340               }
10341
10342             default:
10343               goto unknown;
10344           }
10345
10346         case 't':
10347           if (name[1] == 'e' &&
10348               name[2] == 'l' &&
10349               name[3] == 'l' &&
10350               name[4] == 'd' &&
10351               name[5] == 'i' &&
10352               name[6] == 'r')
10353           {                                       /* telldir    */
10354             return -KEY_telldir;
10355           }
10356
10357           goto unknown;
10358
10359         case 'u':
10360           switch (name[1])
10361           {
10362             case 'c':
10363               if (name[2] == 'f' &&
10364                   name[3] == 'i' &&
10365                   name[4] == 'r' &&
10366                   name[5] == 's' &&
10367                   name[6] == 't')
10368               {                                   /* ucfirst    */
10369                 return -KEY_ucfirst;
10370               }
10371
10372               goto unknown;
10373
10374             case 'n':
10375               if (name[2] == 's' &&
10376                   name[3] == 'h' &&
10377                   name[4] == 'i' &&
10378                   name[5] == 'f' &&
10379                   name[6] == 't')
10380               {                                   /* unshift    */
10381                 return -KEY_unshift;
10382               }
10383
10384               goto unknown;
10385
10386             default:
10387               goto unknown;
10388           }
10389
10390         case 'w':
10391           if (name[1] == 'a' &&
10392               name[2] == 'i' &&
10393               name[3] == 't' &&
10394               name[4] == 'p' &&
10395               name[5] == 'i' &&
10396               name[6] == 'd')
10397           {                                       /* waitpid    */
10398             return -KEY_waitpid;
10399           }
10400
10401           goto unknown;
10402
10403         default:
10404           goto unknown;
10405       }
10406
10407     case 8: /* 26 tokens of length 8 */
10408       switch (name[0])
10409       {
10410         case 'A':
10411           if (name[1] == 'U' &&
10412               name[2] == 'T' &&
10413               name[3] == 'O' &&
10414               name[4] == 'L' &&
10415               name[5] == 'O' &&
10416               name[6] == 'A' &&
10417               name[7] == 'D')
10418           {                                       /* AUTOLOAD   */
10419             return KEY_AUTOLOAD;
10420           }
10421
10422           goto unknown;
10423
10424         case '_':
10425           if (name[1] == '_')
10426           {
10427             switch (name[2])
10428             {
10429               case 'D':
10430                 if (name[3] == 'A' &&
10431                     name[4] == 'T' &&
10432                     name[5] == 'A' &&
10433                     name[6] == '_' &&
10434                     name[7] == '_')
10435                 {                                 /* __DATA__   */
10436                   return KEY___DATA__;
10437                 }
10438
10439                 goto unknown;
10440
10441               case 'F':
10442                 if (name[3] == 'I' &&
10443                     name[4] == 'L' &&
10444                     name[5] == 'E' &&
10445                     name[6] == '_' &&
10446                     name[7] == '_')
10447                 {                                 /* __FILE__   */
10448                   return -KEY___FILE__;
10449                 }
10450
10451                 goto unknown;
10452
10453               case 'L':
10454                 if (name[3] == 'I' &&
10455                     name[4] == 'N' &&
10456                     name[5] == 'E' &&
10457                     name[6] == '_' &&
10458                     name[7] == '_')
10459                 {                                 /* __LINE__   */
10460                   return -KEY___LINE__;
10461                 }
10462
10463                 goto unknown;
10464
10465               default:
10466                 goto unknown;
10467             }
10468           }
10469
10470           goto unknown;
10471
10472         case 'c':
10473           switch (name[1])
10474           {
10475             case 'l':
10476               if (name[2] == 'o' &&
10477                   name[3] == 's' &&
10478                   name[4] == 'e' &&
10479                   name[5] == 'd' &&
10480                   name[6] == 'i' &&
10481                   name[7] == 'r')
10482               {                                   /* closedir   */
10483                 return -KEY_closedir;
10484               }
10485
10486               goto unknown;
10487
10488             case 'o':
10489               if (name[2] == 'n' &&
10490                   name[3] == 't' &&
10491                   name[4] == 'i' &&
10492                   name[5] == 'n' &&
10493                   name[6] == 'u' &&
10494                   name[7] == 'e')
10495               {                                   /* continue   */
10496                 return -KEY_continue;
10497               }
10498
10499               goto unknown;
10500
10501             default:
10502               goto unknown;
10503           }
10504
10505         case 'd':
10506           if (name[1] == 'b' &&
10507               name[2] == 'm' &&
10508               name[3] == 'c' &&
10509               name[4] == 'l' &&
10510               name[5] == 'o' &&
10511               name[6] == 's' &&
10512               name[7] == 'e')
10513           {                                       /* dbmclose   */
10514             return -KEY_dbmclose;
10515           }
10516
10517           goto unknown;
10518
10519         case 'e':
10520           if (name[1] == 'n' &&
10521               name[2] == 'd')
10522           {
10523             switch (name[3])
10524             {
10525               case 'g':
10526                 if (name[4] == 'r' &&
10527                     name[5] == 'e' &&
10528                     name[6] == 'n' &&
10529                     name[7] == 't')
10530                 {                                 /* endgrent   */
10531                   return -KEY_endgrent;
10532                 }
10533
10534                 goto unknown;
10535
10536               case 'p':
10537                 if (name[4] == 'w' &&
10538                     name[5] == 'e' &&
10539                     name[6] == 'n' &&
10540                     name[7] == 't')
10541                 {                                 /* endpwent   */
10542                   return -KEY_endpwent;
10543                 }
10544
10545                 goto unknown;
10546
10547               default:
10548                 goto unknown;
10549             }
10550           }
10551
10552           goto unknown;
10553
10554         case 'f':
10555           if (name[1] == 'o' &&
10556               name[2] == 'r' &&
10557               name[3] == 'm' &&
10558               name[4] == 'l' &&
10559               name[5] == 'i' &&
10560               name[6] == 'n' &&
10561               name[7] == 'e')
10562           {                                       /* formline   */
10563             return -KEY_formline;
10564           }
10565
10566           goto unknown;
10567
10568         case 'g':
10569           if (name[1] == 'e' &&
10570               name[2] == 't')
10571           {
10572             switch (name[3])
10573             {
10574               case 'g':
10575                 if (name[4] == 'r')
10576                 {
10577                   switch (name[5])
10578                   {
10579                     case 'e':
10580                       if (name[6] == 'n' &&
10581                           name[7] == 't')
10582                       {                           /* getgrent   */
10583                         return -KEY_getgrent;
10584                       }
10585
10586                       goto unknown;
10587
10588                     case 'g':
10589                       if (name[6] == 'i' &&
10590                           name[7] == 'd')
10591                       {                           /* getgrgid   */
10592                         return -KEY_getgrgid;
10593                       }
10594
10595                       goto unknown;
10596
10597                     case 'n':
10598                       if (name[6] == 'a' &&
10599                           name[7] == 'm')
10600                       {                           /* getgrnam   */
10601                         return -KEY_getgrnam;
10602                       }
10603
10604                       goto unknown;
10605
10606                     default:
10607                       goto unknown;
10608                   }
10609                 }
10610
10611                 goto unknown;
10612
10613               case 'l':
10614                 if (name[4] == 'o' &&
10615                     name[5] == 'g' &&
10616                     name[6] == 'i' &&
10617                     name[7] == 'n')
10618                 {                                 /* getlogin   */
10619                   return -KEY_getlogin;
10620                 }
10621
10622                 goto unknown;
10623
10624               case 'p':
10625                 if (name[4] == 'w')
10626                 {
10627                   switch (name[5])
10628                   {
10629                     case 'e':
10630                       if (name[6] == 'n' &&
10631                           name[7] == 't')
10632                       {                           /* getpwent   */
10633                         return -KEY_getpwent;
10634                       }
10635
10636                       goto unknown;
10637
10638                     case 'n':
10639                       if (name[6] == 'a' &&
10640                           name[7] == 'm')
10641                       {                           /* getpwnam   */
10642                         return -KEY_getpwnam;
10643                       }
10644
10645                       goto unknown;
10646
10647                     case 'u':
10648                       if (name[6] == 'i' &&
10649                           name[7] == 'd')
10650                       {                           /* getpwuid   */
10651                         return -KEY_getpwuid;
10652                       }
10653
10654                       goto unknown;
10655
10656                     default:
10657                       goto unknown;
10658                   }
10659                 }
10660
10661                 goto unknown;
10662
10663               default:
10664                 goto unknown;
10665             }
10666           }
10667
10668           goto unknown;
10669
10670         case 'r':
10671           if (name[1] == 'e' &&
10672               name[2] == 'a' &&
10673               name[3] == 'd')
10674           {
10675             switch (name[4])
10676             {
10677               case 'l':
10678                 if (name[5] == 'i' &&
10679                     name[6] == 'n')
10680                 {
10681                   switch (name[7])
10682                   {
10683                     case 'e':
10684                       {                           /* readline   */
10685                         return -KEY_readline;
10686                       }
10687
10688                     case 'k':
10689                       {                           /* readlink   */
10690                         return -KEY_readlink;
10691                       }
10692
10693                     default:
10694                       goto unknown;
10695                   }
10696                 }
10697
10698                 goto unknown;
10699
10700               case 'p':
10701                 if (name[5] == 'i' &&
10702                     name[6] == 'p' &&
10703                     name[7] == 'e')
10704                 {                                 /* readpipe   */
10705                   return -KEY_readpipe;
10706                 }
10707
10708                 goto unknown;
10709
10710               default:
10711                 goto unknown;
10712             }
10713           }
10714
10715           goto unknown;
10716
10717         case 's':
10718           switch (name[1])
10719           {
10720             case 'e':
10721               if (name[2] == 't')
10722               {
10723                 switch (name[3])
10724                 {
10725                   case 'g':
10726                     if (name[4] == 'r' &&
10727                         name[5] == 'e' &&
10728                         name[6] == 'n' &&
10729                         name[7] == 't')
10730                     {                             /* setgrent   */
10731                       return -KEY_setgrent;
10732                     }
10733
10734                     goto unknown;
10735
10736                   case 'p':
10737                     if (name[4] == 'w' &&
10738                         name[5] == 'e' &&
10739                         name[6] == 'n' &&
10740                         name[7] == 't')
10741                     {                             /* setpwent   */
10742                       return -KEY_setpwent;
10743                     }
10744
10745                     goto unknown;
10746
10747                   default:
10748                     goto unknown;
10749                 }
10750               }
10751
10752               goto unknown;
10753
10754             case 'h':
10755               switch (name[2])
10756               {
10757                 case 'm':
10758                   if (name[3] == 'w' &&
10759                       name[4] == 'r' &&
10760                       name[5] == 'i' &&
10761                       name[6] == 't' &&
10762                       name[7] == 'e')
10763                   {                               /* shmwrite   */
10764                     return -KEY_shmwrite;
10765                   }
10766
10767                   goto unknown;
10768
10769                 case 'u':
10770                   if (name[3] == 't' &&
10771                       name[4] == 'd' &&
10772                       name[5] == 'o' &&
10773                       name[6] == 'w' &&
10774                       name[7] == 'n')
10775                   {                               /* shutdown   */
10776                     return -KEY_shutdown;
10777                   }
10778
10779                   goto unknown;
10780
10781                 default:
10782                   goto unknown;
10783               }
10784
10785             case 'y':
10786               if (name[2] == 's' &&
10787                   name[3] == 'w' &&
10788                   name[4] == 'r' &&
10789                   name[5] == 'i' &&
10790                   name[6] == 't' &&
10791                   name[7] == 'e')
10792               {                                   /* syswrite   */
10793                 return -KEY_syswrite;
10794               }
10795
10796               goto unknown;
10797
10798             default:
10799               goto unknown;
10800           }
10801
10802         case 't':
10803           if (name[1] == 'r' &&
10804               name[2] == 'u' &&
10805               name[3] == 'n' &&
10806               name[4] == 'c' &&
10807               name[5] == 'a' &&
10808               name[6] == 't' &&
10809               name[7] == 'e')
10810           {                                       /* truncate   */
10811             return -KEY_truncate;
10812           }
10813
10814           goto unknown;
10815
10816         default:
10817           goto unknown;
10818       }
10819
10820     case 9: /* 9 tokens of length 9 */
10821       switch (name[0])
10822       {
10823         case 'U':
10824           if (name[1] == 'N' &&
10825               name[2] == 'I' &&
10826               name[3] == 'T' &&
10827               name[4] == 'C' &&
10828               name[5] == 'H' &&
10829               name[6] == 'E' &&
10830               name[7] == 'C' &&
10831               name[8] == 'K')
10832           {                                       /* UNITCHECK  */
10833             return KEY_UNITCHECK;
10834           }
10835
10836           goto unknown;
10837
10838         case 'e':
10839           if (name[1] == 'n' &&
10840               name[2] == 'd' &&
10841               name[3] == 'n' &&
10842               name[4] == 'e' &&
10843               name[5] == 't' &&
10844               name[6] == 'e' &&
10845               name[7] == 'n' &&
10846               name[8] == 't')
10847           {                                       /* endnetent  */
10848             return -KEY_endnetent;
10849           }
10850
10851           goto unknown;
10852
10853         case 'g':
10854           if (name[1] == 'e' &&
10855               name[2] == 't' &&
10856               name[3] == 'n' &&
10857               name[4] == 'e' &&
10858               name[5] == 't' &&
10859               name[6] == 'e' &&
10860               name[7] == 'n' &&
10861               name[8] == 't')
10862           {                                       /* getnetent  */
10863             return -KEY_getnetent;
10864           }
10865
10866           goto unknown;
10867
10868         case 'l':
10869           if (name[1] == 'o' &&
10870               name[2] == 'c' &&
10871               name[3] == 'a' &&
10872               name[4] == 'l' &&
10873               name[5] == 't' &&
10874               name[6] == 'i' &&
10875               name[7] == 'm' &&
10876               name[8] == 'e')
10877           {                                       /* localtime  */
10878             return -KEY_localtime;
10879           }
10880
10881           goto unknown;
10882
10883         case 'p':
10884           if (name[1] == 'r' &&
10885               name[2] == 'o' &&
10886               name[3] == 't' &&
10887               name[4] == 'o' &&
10888               name[5] == 't' &&
10889               name[6] == 'y' &&
10890               name[7] == 'p' &&
10891               name[8] == 'e')
10892           {                                       /* prototype  */
10893             return KEY_prototype;
10894           }
10895
10896           goto unknown;
10897
10898         case 'q':
10899           if (name[1] == 'u' &&
10900               name[2] == 'o' &&
10901               name[3] == 't' &&
10902               name[4] == 'e' &&
10903               name[5] == 'm' &&
10904               name[6] == 'e' &&
10905               name[7] == 't' &&
10906               name[8] == 'a')
10907           {                                       /* quotemeta  */
10908             return -KEY_quotemeta;
10909           }
10910
10911           goto unknown;
10912
10913         case 'r':
10914           if (name[1] == 'e' &&
10915               name[2] == 'w' &&
10916               name[3] == 'i' &&
10917               name[4] == 'n' &&
10918               name[5] == 'd' &&
10919               name[6] == 'd' &&
10920               name[7] == 'i' &&
10921               name[8] == 'r')
10922           {                                       /* rewinddir  */
10923             return -KEY_rewinddir;
10924           }
10925
10926           goto unknown;
10927
10928         case 's':
10929           if (name[1] == 'e' &&
10930               name[2] == 't' &&
10931               name[3] == 'n' &&
10932               name[4] == 'e' &&
10933               name[5] == 't' &&
10934               name[6] == 'e' &&
10935               name[7] == 'n' &&
10936               name[8] == 't')
10937           {                                       /* setnetent  */
10938             return -KEY_setnetent;
10939           }
10940
10941           goto unknown;
10942
10943         case 'w':
10944           if (name[1] == 'a' &&
10945               name[2] == 'n' &&
10946               name[3] == 't' &&
10947               name[4] == 'a' &&
10948               name[5] == 'r' &&
10949               name[6] == 'r' &&
10950               name[7] == 'a' &&
10951               name[8] == 'y')
10952           {                                       /* wantarray  */
10953             return -KEY_wantarray;
10954           }
10955
10956           goto unknown;
10957
10958         default:
10959           goto unknown;
10960       }
10961
10962     case 10: /* 9 tokens of length 10 */
10963       switch (name[0])
10964       {
10965         case 'e':
10966           if (name[1] == 'n' &&
10967               name[2] == 'd')
10968           {
10969             switch (name[3])
10970             {
10971               case 'h':
10972                 if (name[4] == 'o' &&
10973                     name[5] == 's' &&
10974                     name[6] == 't' &&
10975                     name[7] == 'e' &&
10976                     name[8] == 'n' &&
10977                     name[9] == 't')
10978                 {                                 /* endhostent */
10979                   return -KEY_endhostent;
10980                 }
10981
10982                 goto unknown;
10983
10984               case 's':
10985                 if (name[4] == 'e' &&
10986                     name[5] == 'r' &&
10987                     name[6] == 'v' &&
10988                     name[7] == 'e' &&
10989                     name[8] == 'n' &&
10990                     name[9] == 't')
10991                 {                                 /* endservent */
10992                   return -KEY_endservent;
10993                 }
10994
10995                 goto unknown;
10996
10997               default:
10998                 goto unknown;
10999             }
11000           }
11001
11002           goto unknown;
11003
11004         case 'g':
11005           if (name[1] == 'e' &&
11006               name[2] == 't')
11007           {
11008             switch (name[3])
11009             {
11010               case 'h':
11011                 if (name[4] == 'o' &&
11012                     name[5] == 's' &&
11013                     name[6] == 't' &&
11014                     name[7] == 'e' &&
11015                     name[8] == 'n' &&
11016                     name[9] == 't')
11017                 {                                 /* gethostent */
11018                   return -KEY_gethostent;
11019                 }
11020
11021                 goto unknown;
11022
11023               case 's':
11024                 switch (name[4])
11025                 {
11026                   case 'e':
11027                     if (name[5] == 'r' &&
11028                         name[6] == 'v' &&
11029                         name[7] == 'e' &&
11030                         name[8] == 'n' &&
11031                         name[9] == 't')
11032                     {                             /* getservent */
11033                       return -KEY_getservent;
11034                     }
11035
11036                     goto unknown;
11037
11038                   case 'o':
11039                     if (name[5] == 'c' &&
11040                         name[6] == 'k' &&
11041                         name[7] == 'o' &&
11042                         name[8] == 'p' &&
11043                         name[9] == 't')
11044                     {                             /* getsockopt */
11045                       return -KEY_getsockopt;
11046                     }
11047
11048                     goto unknown;
11049
11050                   default:
11051                     goto unknown;
11052                 }
11053
11054               default:
11055                 goto unknown;
11056             }
11057           }
11058
11059           goto unknown;
11060
11061         case 's':
11062           switch (name[1])
11063           {
11064             case 'e':
11065               if (name[2] == 't')
11066               {
11067                 switch (name[3])
11068                 {
11069                   case 'h':
11070                     if (name[4] == 'o' &&
11071                         name[5] == 's' &&
11072                         name[6] == 't' &&
11073                         name[7] == 'e' &&
11074                         name[8] == 'n' &&
11075                         name[9] == 't')
11076                     {                             /* sethostent */
11077                       return -KEY_sethostent;
11078                     }
11079
11080                     goto unknown;
11081
11082                   case 's':
11083                     switch (name[4])
11084                     {
11085                       case 'e':
11086                         if (name[5] == 'r' &&
11087                             name[6] == 'v' &&
11088                             name[7] == 'e' &&
11089                             name[8] == 'n' &&
11090                             name[9] == 't')
11091                         {                         /* setservent */
11092                           return -KEY_setservent;
11093                         }
11094
11095                         goto unknown;
11096
11097                       case 'o':
11098                         if (name[5] == 'c' &&
11099                             name[6] == 'k' &&
11100                             name[7] == 'o' &&
11101                             name[8] == 'p' &&
11102                             name[9] == 't')
11103                         {                         /* setsockopt */
11104                           return -KEY_setsockopt;
11105                         }
11106
11107                         goto unknown;
11108
11109                       default:
11110                         goto unknown;
11111                     }
11112
11113                   default:
11114                     goto unknown;
11115                 }
11116               }
11117
11118               goto unknown;
11119
11120             case 'o':
11121               if (name[2] == 'c' &&
11122                   name[3] == 'k' &&
11123                   name[4] == 'e' &&
11124                   name[5] == 't' &&
11125                   name[6] == 'p' &&
11126                   name[7] == 'a' &&
11127                   name[8] == 'i' &&
11128                   name[9] == 'r')
11129               {                                   /* socketpair */
11130                 return -KEY_socketpair;
11131               }
11132
11133               goto unknown;
11134
11135             default:
11136               goto unknown;
11137           }
11138
11139         default:
11140           goto unknown;
11141       }
11142
11143     case 11: /* 8 tokens of length 11 */
11144       switch (name[0])
11145       {
11146         case '_':
11147           if (name[1] == '_' &&
11148               name[2] == 'P' &&
11149               name[3] == 'A' &&
11150               name[4] == 'C' &&
11151               name[5] == 'K' &&
11152               name[6] == 'A' &&
11153               name[7] == 'G' &&
11154               name[8] == 'E' &&
11155               name[9] == '_' &&
11156               name[10] == '_')
11157           {                                       /* __PACKAGE__ */
11158             return -KEY___PACKAGE__;
11159           }
11160
11161           goto unknown;
11162
11163         case 'e':
11164           if (name[1] == 'n' &&
11165               name[2] == 'd' &&
11166               name[3] == 'p' &&
11167               name[4] == 'r' &&
11168               name[5] == 'o' &&
11169               name[6] == 't' &&
11170               name[7] == 'o' &&
11171               name[8] == 'e' &&
11172               name[9] == 'n' &&
11173               name[10] == 't')
11174           {                                       /* endprotoent */
11175             return -KEY_endprotoent;
11176           }
11177
11178           goto unknown;
11179
11180         case 'g':
11181           if (name[1] == 'e' &&
11182               name[2] == 't')
11183           {
11184             switch (name[3])
11185             {
11186               case 'p':
11187                 switch (name[4])
11188                 {
11189                   case 'e':
11190                     if (name[5] == 'e' &&
11191                         name[6] == 'r' &&
11192                         name[7] == 'n' &&
11193                         name[8] == 'a' &&
11194                         name[9] == 'm' &&
11195                         name[10] == 'e')
11196                     {                             /* getpeername */
11197                       return -KEY_getpeername;
11198                     }
11199
11200                     goto unknown;
11201
11202                   case 'r':
11203                     switch (name[5])
11204                     {
11205                       case 'i':
11206                         if (name[6] == 'o' &&
11207                             name[7] == 'r' &&
11208                             name[8] == 'i' &&
11209                             name[9] == 't' &&
11210                             name[10] == 'y')
11211                         {                         /* getpriority */
11212                           return -KEY_getpriority;
11213                         }
11214
11215                         goto unknown;
11216
11217                       case 'o':
11218                         if (name[6] == 't' &&
11219                             name[7] == 'o' &&
11220                             name[8] == 'e' &&
11221                             name[9] == 'n' &&
11222                             name[10] == 't')
11223                         {                         /* getprotoent */
11224                           return -KEY_getprotoent;
11225                         }
11226
11227                         goto unknown;
11228
11229                       default:
11230                         goto unknown;
11231                     }
11232
11233                   default:
11234                     goto unknown;
11235                 }
11236
11237               case 's':
11238                 if (name[4] == 'o' &&
11239                     name[5] == 'c' &&
11240                     name[6] == 'k' &&
11241                     name[7] == 'n' &&
11242                     name[8] == 'a' &&
11243                     name[9] == 'm' &&
11244                     name[10] == 'e')
11245                 {                                 /* getsockname */
11246                   return -KEY_getsockname;
11247                 }
11248
11249                 goto unknown;
11250
11251               default:
11252                 goto unknown;
11253             }
11254           }
11255
11256           goto unknown;
11257
11258         case 's':
11259           if (name[1] == 'e' &&
11260               name[2] == 't' &&
11261               name[3] == 'p' &&
11262               name[4] == 'r')
11263           {
11264             switch (name[5])
11265             {
11266               case 'i':
11267                 if (name[6] == 'o' &&
11268                     name[7] == 'r' &&
11269                     name[8] == 'i' &&
11270                     name[9] == 't' &&
11271                     name[10] == 'y')
11272                 {                                 /* setpriority */
11273                   return -KEY_setpriority;
11274                 }
11275
11276                 goto unknown;
11277
11278               case 'o':
11279                 if (name[6] == 't' &&
11280                     name[7] == 'o' &&
11281                     name[8] == 'e' &&
11282                     name[9] == 'n' &&
11283                     name[10] == 't')
11284                 {                                 /* setprotoent */
11285                   return -KEY_setprotoent;
11286                 }
11287
11288                 goto unknown;
11289
11290               default:
11291                 goto unknown;
11292             }
11293           }
11294
11295           goto unknown;
11296
11297         default:
11298           goto unknown;
11299       }
11300
11301     case 12: /* 2 tokens of length 12 */
11302       if (name[0] == 'g' &&
11303           name[1] == 'e' &&
11304           name[2] == 't' &&
11305           name[3] == 'n' &&
11306           name[4] == 'e' &&
11307           name[5] == 't' &&
11308           name[6] == 'b' &&
11309           name[7] == 'y')
11310       {
11311         switch (name[8])
11312         {
11313           case 'a':
11314             if (name[9] == 'd' &&
11315                 name[10] == 'd' &&
11316                 name[11] == 'r')
11317             {                                     /* getnetbyaddr */
11318               return -KEY_getnetbyaddr;
11319             }
11320
11321             goto unknown;
11322
11323           case 'n':
11324             if (name[9] == 'a' &&
11325                 name[10] == 'm' &&
11326                 name[11] == 'e')
11327             {                                     /* getnetbyname */
11328               return -KEY_getnetbyname;
11329             }
11330
11331             goto unknown;
11332
11333           default:
11334             goto unknown;
11335         }
11336       }
11337
11338       goto unknown;
11339
11340     case 13: /* 4 tokens of length 13 */
11341       if (name[0] == 'g' &&
11342           name[1] == 'e' &&
11343           name[2] == 't')
11344       {
11345         switch (name[3])
11346         {
11347           case 'h':
11348             if (name[4] == 'o' &&
11349                 name[5] == 's' &&
11350                 name[6] == 't' &&
11351                 name[7] == 'b' &&
11352                 name[8] == 'y')
11353             {
11354               switch (name[9])
11355               {
11356                 case 'a':
11357                   if (name[10] == 'd' &&
11358                       name[11] == 'd' &&
11359                       name[12] == 'r')
11360                   {                               /* gethostbyaddr */
11361                     return -KEY_gethostbyaddr;
11362                   }
11363
11364                   goto unknown;
11365
11366                 case 'n':
11367                   if (name[10] == 'a' &&
11368                       name[11] == 'm' &&
11369                       name[12] == 'e')
11370                   {                               /* gethostbyname */
11371                     return -KEY_gethostbyname;
11372                   }
11373
11374                   goto unknown;
11375
11376                 default:
11377                   goto unknown;
11378               }
11379             }
11380
11381             goto unknown;
11382
11383           case 's':
11384             if (name[4] == 'e' &&
11385                 name[5] == 'r' &&
11386                 name[6] == 'v' &&
11387                 name[7] == 'b' &&
11388                 name[8] == 'y')
11389             {
11390               switch (name[9])
11391               {
11392                 case 'n':
11393                   if (name[10] == 'a' &&
11394                       name[11] == 'm' &&
11395                       name[12] == 'e')
11396                   {                               /* getservbyname */
11397                     return -KEY_getservbyname;
11398                   }
11399
11400                   goto unknown;
11401
11402                 case 'p':
11403                   if (name[10] == 'o' &&
11404                       name[11] == 'r' &&
11405                       name[12] == 't')
11406                   {                               /* getservbyport */
11407                     return -KEY_getservbyport;
11408                   }
11409
11410                   goto unknown;
11411
11412                 default:
11413                   goto unknown;
11414               }
11415             }
11416
11417             goto unknown;
11418
11419           default:
11420             goto unknown;
11421         }
11422       }
11423
11424       goto unknown;
11425
11426     case 14: /* 1 tokens of length 14 */
11427       if (name[0] == 'g' &&
11428           name[1] == 'e' &&
11429           name[2] == 't' &&
11430           name[3] == 'p' &&
11431           name[4] == 'r' &&
11432           name[5] == 'o' &&
11433           name[6] == 't' &&
11434           name[7] == 'o' &&
11435           name[8] == 'b' &&
11436           name[9] == 'y' &&
11437           name[10] == 'n' &&
11438           name[11] == 'a' &&
11439           name[12] == 'm' &&
11440           name[13] == 'e')
11441       {                                           /* getprotobyname */
11442         return -KEY_getprotobyname;
11443       }
11444
11445       goto unknown;
11446
11447     case 16: /* 1 tokens of length 16 */
11448       if (name[0] == 'g' &&
11449           name[1] == 'e' &&
11450           name[2] == 't' &&
11451           name[3] == 'p' &&
11452           name[4] == 'r' &&
11453           name[5] == 'o' &&
11454           name[6] == 't' &&
11455           name[7] == 'o' &&
11456           name[8] == 'b' &&
11457           name[9] == 'y' &&
11458           name[10] == 'n' &&
11459           name[11] == 'u' &&
11460           name[12] == 'm' &&
11461           name[13] == 'b' &&
11462           name[14] == 'e' &&
11463           name[15] == 'r')
11464       {                                           /* getprotobynumber */
11465         return -KEY_getprotobynumber;
11466       }
11467
11468       goto unknown;
11469
11470     default:
11471       goto unknown;
11472   }
11473
11474 unknown:
11475   return 0;
11476 }
11477
11478 STATIC void
11479 S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
11480 {
11481     dVAR;
11482
11483     PERL_ARGS_ASSERT_CHECKCOMMA;
11484
11485     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
11486         if (ckWARN(WARN_SYNTAX)) {
11487             int level = 1;
11488             const char *w;
11489             for (w = s+2; *w && level; w++) {
11490                 if (*w == '(')
11491                     ++level;
11492                 else if (*w == ')')
11493                     --level;
11494             }
11495             while (isSPACE(*w))
11496                 ++w;
11497             /* the list of chars below is for end of statements or
11498              * block / parens, boolean operators (&&, ||, //) and branch
11499              * constructs (or, and, if, until, unless, while, err, for).
11500              * Not a very solid hack... */
11501             if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
11502                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
11503                             "%s (...) interpreted as function",name);
11504         }
11505     }
11506     while (s < PL_bufend && isSPACE(*s))
11507         s++;
11508     if (*s == '(')
11509         s++;
11510     while (s < PL_bufend && isSPACE(*s))
11511         s++;
11512     if (isIDFIRST_lazy_if(s,UTF)) {
11513         const char * const w = s++;
11514         while (isALNUM_lazy_if(s,UTF))
11515             s++;
11516         while (s < PL_bufend && isSPACE(*s))
11517             s++;
11518         if (*s == ',') {
11519             GV* gv;
11520             if (keyword(w, s - w, 0))
11521                 return;
11522
11523             gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
11524             if (gv && GvCVu(gv))
11525                 return;
11526             Perl_croak(aTHX_ "No comma allowed after %s", what);
11527         }
11528     }
11529 }
11530
11531 /* Either returns sv, or mortalizes sv and returns a new SV*.
11532    Best used as sv=new_constant(..., sv, ...).
11533    If s, pv are NULL, calls subroutine with one argument,
11534    and type is used with error messages only. */
11535
11536 STATIC SV *
11537 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
11538                SV *sv, SV *pv, const char *type, STRLEN typelen)
11539 {
11540     dVAR; dSP;
11541     HV * const table = GvHV(PL_hintgv);          /* ^H */
11542     SV *res;
11543     SV **cvp;
11544     SV *cv, *typesv;
11545     const char *why1 = "", *why2 = "", *why3 = "";
11546
11547     PERL_ARGS_ASSERT_NEW_CONSTANT;
11548
11549     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
11550         SV *msg;
11551         
11552         why2 = (const char *)
11553             (strEQ(key,"charnames")
11554              ? "(possibly a missing \"use charnames ...\")"
11555              : "");
11556         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
11557                             (type ? type: "undef"), why2);
11558
11559         /* This is convoluted and evil ("goto considered harmful")
11560          * but I do not understand the intricacies of all the different
11561          * failure modes of %^H in here.  The goal here is to make
11562          * the most probable error message user-friendly. --jhi */
11563
11564         goto msgdone;
11565
11566     report:
11567         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
11568                             (type ? type: "undef"), why1, why2, why3);
11569     msgdone:
11570         yyerror(SvPVX_const(msg));
11571         SvREFCNT_dec(msg);
11572         return sv;
11573     }
11574
11575     /* charnames doesn't work well if there have been errors found */
11576     if (PL_error_count > 0 && strEQ(key,"charnames"))
11577         return &PL_sv_undef;
11578
11579     cvp = hv_fetch(table, key, keylen, FALSE);
11580     if (!cvp || !SvOK(*cvp)) {
11581         why1 = "$^H{";
11582         why2 = key;
11583         why3 = "} is not defined";
11584         goto report;
11585     }
11586     sv_2mortal(sv);                     /* Parent created it permanently */
11587     cv = *cvp;
11588     if (!pv && s)
11589         pv = newSVpvn_flags(s, len, SVs_TEMP);
11590     if (type && pv)
11591         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
11592     else
11593         typesv = &PL_sv_undef;
11594
11595     PUSHSTACKi(PERLSI_OVERLOAD);
11596     ENTER ;
11597     SAVETMPS;
11598
11599     PUSHMARK(SP) ;
11600     EXTEND(sp, 3);
11601     if (pv)
11602         PUSHs(pv);
11603     PUSHs(sv);
11604     if (pv)
11605         PUSHs(typesv);
11606     PUTBACK;
11607     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
11608
11609     SPAGAIN ;
11610
11611     /* Check the eval first */
11612     if (!PL_in_eval && SvTRUE(ERRSV)) {
11613         sv_catpvs(ERRSV, "Propagated");
11614         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
11615         (void)POPs;
11616         res = SvREFCNT_inc_simple(sv);
11617     }
11618     else {
11619         res = POPs;
11620         SvREFCNT_inc_simple_void(res);
11621     }
11622
11623     PUTBACK ;
11624     FREETMPS ;
11625     LEAVE ;
11626     POPSTACK;
11627
11628     if (!SvOK(res)) {
11629         why1 = "Call to &{$^H{";
11630         why2 = key;
11631         why3 = "}} did not return a defined value";
11632         sv = res;
11633         goto report;
11634     }
11635
11636     return res;
11637 }
11638
11639 /* Returns a NUL terminated string, with the length of the string written to
11640    *slp
11641    */
11642 STATIC char *
11643 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
11644 {
11645     dVAR;
11646     register char *d = dest;
11647     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
11648
11649     PERL_ARGS_ASSERT_SCAN_WORD;
11650
11651     for (;;) {
11652         if (d >= e)
11653             Perl_croak(aTHX_ ident_too_long);
11654         if (isALNUM(*s))        /* UTF handled below */
11655             *d++ = *s++;
11656         else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
11657             *d++ = ':';
11658             *d++ = ':';
11659             s++;
11660         }
11661         else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
11662             *d++ = *s++;
11663             *d++ = *s++;
11664         }
11665         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11666             char *t = s + UTF8SKIP(s);
11667             size_t len;
11668             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11669                 t += UTF8SKIP(t);
11670             len = t - s;
11671             if (d + len > e)
11672                 Perl_croak(aTHX_ ident_too_long);
11673             Copy(s, d, len, char);
11674             d += len;
11675             s = t;
11676         }
11677         else {
11678             *d = '\0';
11679             *slp = d - dest;
11680             return s;
11681         }
11682     }
11683 }
11684
11685 STATIC char *
11686 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
11687 {
11688     dVAR;
11689     char *bracket = NULL;
11690     char funny = *s++;
11691     register char *d = dest;
11692     register char * const e = d + destlen - 3;    /* two-character token, ending NUL */
11693
11694     PERL_ARGS_ASSERT_SCAN_IDENT;
11695
11696     if (isSPACE(*s))
11697         s = PEEKSPACE(s);
11698     if (isDIGIT(*s)) {
11699         while (isDIGIT(*s)) {
11700             if (d >= e)
11701                 Perl_croak(aTHX_ ident_too_long);
11702             *d++ = *s++;
11703         }
11704     }
11705     else {
11706         for (;;) {
11707             if (d >= e)
11708                 Perl_croak(aTHX_ ident_too_long);
11709             if (isALNUM(*s))    /* UTF handled below */
11710                 *d++ = *s++;
11711             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
11712                 *d++ = ':';
11713                 *d++ = ':';
11714                 s++;
11715             }
11716             else if (*s == ':' && s[1] == ':') {
11717                 *d++ = *s++;
11718                 *d++ = *s++;
11719             }
11720             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11721                 char *t = s + UTF8SKIP(s);
11722                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11723                     t += UTF8SKIP(t);
11724                 if (d + (t - s) > e)
11725                     Perl_croak(aTHX_ ident_too_long);
11726                 Copy(s, d, t - s, char);
11727                 d += t - s;
11728                 s = t;
11729             }
11730             else
11731                 break;
11732         }
11733     }
11734     *d = '\0';
11735     d = dest;
11736     if (*d) {
11737         if (PL_lex_state != LEX_NORMAL)
11738             PL_lex_state = LEX_INTERPENDMAYBE;
11739         return s;
11740     }
11741     if (*s == '$' && s[1] &&
11742         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
11743     {
11744         return s;
11745     }
11746     if (*s == '{') {
11747         bracket = s;
11748         s++;
11749     }
11750     else if (ck_uni)
11751         check_uni();
11752     if (s < send)
11753         *d = *s++;
11754     d[1] = '\0';
11755     if (*d == '^' && *s && isCONTROLVAR(*s)) {
11756         *d = toCTRL(*s);
11757         s++;
11758     }
11759     if (bracket) {
11760         if (isSPACE(s[-1])) {
11761             while (s < send) {
11762                 const char ch = *s++;
11763                 if (!SPACE_OR_TAB(ch)) {
11764                     *d = ch;
11765                     break;
11766                 }
11767             }
11768         }
11769         if (isIDFIRST_lazy_if(d,UTF)) {
11770             d++;
11771             if (UTF) {
11772                 char *end = s;
11773                 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
11774                     end += UTF8SKIP(end);
11775                     while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
11776                         end += UTF8SKIP(end);
11777                 }
11778                 Copy(s, d, end - s, char);
11779                 d += end - s;
11780                 s = end;
11781             }
11782             else {
11783                 while ((isALNUM(*s) || *s == ':') && d < e)
11784                     *d++ = *s++;
11785                 if (d >= e)
11786                     Perl_croak(aTHX_ ident_too_long);
11787             }
11788             *d = '\0';
11789             while (s < send && SPACE_OR_TAB(*s))
11790                 s++;
11791             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
11792                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
11793                     const char * const brack =
11794                         (const char *)
11795                         ((*s == '[') ? "[...]" : "{...}");
11796                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11797                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
11798                         funny, dest, brack, funny, dest, brack);
11799                 }
11800                 bracket++;
11801                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
11802                 return s;
11803             }
11804         }
11805         /* Handle extended ${^Foo} variables
11806          * 1999-02-27 mjd-perl-patch@plover.com */
11807         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
11808                  && isALNUM(*s))
11809         {
11810             d++;
11811             while (isALNUM(*s) && d < e) {
11812                 *d++ = *s++;
11813             }
11814             if (d >= e)
11815                 Perl_croak(aTHX_ ident_too_long);
11816             *d = '\0';
11817         }
11818         if (*s == '}') {
11819             s++;
11820             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
11821                 PL_lex_state = LEX_INTERPEND;
11822                 PL_expect = XREF;
11823             }
11824             if (PL_lex_state == LEX_NORMAL) {
11825                 if (ckWARN(WARN_AMBIGUOUS) &&
11826                     (keyword(dest, d - dest, 0)
11827                      || get_cvn_flags(dest, d - dest, 0)))
11828                 {
11829                     if (funny == '#')
11830                         funny = '@';
11831                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11832                         "Ambiguous use of %c{%s} resolved to %c%s",
11833                         funny, dest, funny, dest);
11834                 }
11835             }
11836         }
11837         else {
11838             s = bracket;                /* let the parser handle it */
11839             *dest = '\0';
11840         }
11841     }
11842     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
11843         PL_lex_state = LEX_INTERPEND;
11844     return s;
11845 }
11846
11847 static U32
11848 S_pmflag(U32 pmfl, const char ch) {
11849     switch (ch) {
11850         CASE_STD_PMMOD_FLAGS_PARSE_SET(&pmfl);
11851     case GLOBAL_PAT_MOD:    pmfl |= PMf_GLOBAL; break;
11852     case CONTINUE_PAT_MOD:  pmfl |= PMf_CONTINUE; break;
11853     case ONCE_PAT_MOD:      pmfl |= PMf_KEEP; break;
11854     case KEEPCOPY_PAT_MOD:  pmfl |= PMf_KEEPCOPY; break;
11855     }
11856     return pmfl;
11857 }
11858
11859 void
11860 Perl_pmflag(pTHX_ U32* pmfl, int ch)
11861 {
11862     PERL_ARGS_ASSERT_PMFLAG;
11863
11864     Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
11865                      "Perl_pmflag() is deprecated, and will be removed from the XS API");
11866
11867     if (ch<256) {
11868         *pmfl = S_pmflag(*pmfl, (char)ch);
11869     }
11870 }
11871
11872 STATIC char *
11873 S_scan_pat(pTHX_ char *start, I32 type)
11874 {
11875     dVAR;
11876     PMOP *pm;
11877     char *s = scan_str(start,!!PL_madskills,FALSE);
11878     const char * const valid_flags =
11879         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
11880 #ifdef PERL_MAD
11881     char *modstart;
11882 #endif
11883
11884     PERL_ARGS_ASSERT_SCAN_PAT;
11885
11886     if (!s) {
11887         const char * const delimiter = skipspace(start);
11888         Perl_croak(aTHX_
11889                    (const char *)
11890                    (*delimiter == '?'
11891                     ? "Search pattern not terminated or ternary operator parsed as search pattern"
11892                     : "Search pattern not terminated" ));
11893     }
11894
11895     pm = (PMOP*)newPMOP(type, 0);
11896     if (PL_multi_open == '?') {
11897         /* This is the only point in the code that sets PMf_ONCE:  */
11898         pm->op_pmflags |= PMf_ONCE;
11899
11900         /* Hence it's safe to do this bit of PMOP book-keeping here, which
11901            allows us to restrict the list needed by reset to just the ??
11902            matches.  */
11903         assert(type != OP_TRANS);
11904         if (PL_curstash) {
11905             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
11906             U32 elements;
11907             if (!mg) {
11908                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
11909                                  0);
11910             }
11911             elements = mg->mg_len / sizeof(PMOP**);
11912             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
11913             ((PMOP**)mg->mg_ptr) [elements++] = pm;
11914             mg->mg_len = elements * sizeof(PMOP**);
11915             PmopSTASH_set(pm,PL_curstash);
11916         }
11917     }
11918 #ifdef PERL_MAD
11919     modstart = s;
11920 #endif
11921     while (*s && strchr(valid_flags, *s))
11922         pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
11923 #ifdef PERL_MAD
11924     if (PL_madskills && modstart != s) {
11925         SV* tmptoken = newSVpvn(modstart, s - modstart);
11926         append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
11927     }
11928 #endif
11929     /* issue a warning if /c is specified,but /g is not */
11930     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
11931     {
11932         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), 
11933                        "Use of /c modifier is meaningless without /g" );
11934     }
11935
11936     PL_lex_op = (OP*)pm;
11937     pl_yylval.ival = OP_MATCH;
11938     return s;
11939 }
11940
11941 STATIC char *
11942 S_scan_subst(pTHX_ char *start)
11943 {
11944     dVAR;
11945     register char *s;
11946     register PMOP *pm;
11947     I32 first_start;
11948     I32 es = 0;
11949 #ifdef PERL_MAD
11950     char *modstart;
11951 #endif
11952
11953     PERL_ARGS_ASSERT_SCAN_SUBST;
11954
11955     pl_yylval.ival = OP_NULL;
11956
11957     s = scan_str(start,!!PL_madskills,FALSE);
11958
11959     if (!s)
11960         Perl_croak(aTHX_ "Substitution pattern not terminated");
11961
11962     if (s[-1] == PL_multi_open)
11963         s--;
11964 #ifdef PERL_MAD
11965     if (PL_madskills) {
11966         CURMAD('q', PL_thisopen);
11967         CURMAD('_', PL_thiswhite);
11968         CURMAD('E', PL_thisstuff);
11969         CURMAD('Q', PL_thisclose);
11970         PL_realtokenstart = s - SvPVX(PL_linestr);
11971     }
11972 #endif
11973
11974     first_start = PL_multi_start;
11975     s = scan_str(s,!!PL_madskills,FALSE);
11976     if (!s) {
11977         if (PL_lex_stuff) {
11978             SvREFCNT_dec(PL_lex_stuff);
11979             PL_lex_stuff = NULL;
11980         }
11981         Perl_croak(aTHX_ "Substitution replacement not terminated");
11982     }
11983     PL_multi_start = first_start;       /* so whole substitution is taken together */
11984
11985     pm = (PMOP*)newPMOP(OP_SUBST, 0);
11986
11987 #ifdef PERL_MAD
11988     if (PL_madskills) {
11989         CURMAD('z', PL_thisopen);
11990         CURMAD('R', PL_thisstuff);
11991         CURMAD('Z', PL_thisclose);
11992     }
11993     modstart = s;
11994 #endif
11995
11996     while (*s) {
11997         if (*s == EXEC_PAT_MOD) {
11998             s++;
11999             es++;
12000         }
12001         else if (strchr(S_PAT_MODS, *s))
12002             pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
12003         else
12004             break;
12005     }
12006
12007 #ifdef PERL_MAD
12008     if (PL_madskills) {
12009         if (modstart != s)
12010             curmad('m', newSVpvn(modstart, s - modstart));
12011         append_madprops(PL_thismad, (OP*)pm, 0);
12012         PL_thismad = 0;
12013     }
12014 #endif
12015     if ((pm->op_pmflags & PMf_CONTINUE)) {
12016         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
12017     }
12018
12019     if (es) {
12020         SV * const repl = newSVpvs("");
12021
12022         PL_sublex_info.super_bufptr = s;
12023         PL_sublex_info.super_bufend = PL_bufend;
12024         PL_multi_end = 0;
12025         pm->op_pmflags |= PMf_EVAL;
12026         while (es-- > 0) {
12027             if (es)
12028                 sv_catpvs(repl, "eval ");
12029             else
12030                 sv_catpvs(repl, "do ");
12031         }
12032         sv_catpvs(repl, "{");
12033         sv_catsv(repl, PL_lex_repl);
12034         if (strchr(SvPVX(PL_lex_repl), '#'))
12035             sv_catpvs(repl, "\n");
12036         sv_catpvs(repl, "}");
12037         SvEVALED_on(repl);
12038         SvREFCNT_dec(PL_lex_repl);
12039         PL_lex_repl = repl;
12040     }
12041
12042     PL_lex_op = (OP*)pm;
12043     pl_yylval.ival = OP_SUBST;
12044     return s;
12045 }
12046
12047 STATIC char *
12048 S_scan_trans(pTHX_ char *start)
12049 {
12050     dVAR;
12051     register char* s;
12052     OP *o;
12053     short *tbl;
12054     U8 squash;
12055     U8 del;
12056     U8 complement;
12057 #ifdef PERL_MAD
12058     char *modstart;
12059 #endif
12060
12061     PERL_ARGS_ASSERT_SCAN_TRANS;
12062
12063     pl_yylval.ival = OP_NULL;
12064
12065     s = scan_str(start,!!PL_madskills,FALSE);
12066     if (!s)
12067         Perl_croak(aTHX_ "Transliteration pattern not terminated");
12068
12069     if (s[-1] == PL_multi_open)
12070         s--;
12071 #ifdef PERL_MAD
12072     if (PL_madskills) {
12073         CURMAD('q', PL_thisopen);
12074         CURMAD('_', PL_thiswhite);
12075         CURMAD('E', PL_thisstuff);
12076         CURMAD('Q', PL_thisclose);
12077         PL_realtokenstart = s - SvPVX(PL_linestr);
12078     }
12079 #endif
12080
12081     s = scan_str(s,!!PL_madskills,FALSE);
12082     if (!s) {
12083         if (PL_lex_stuff) {
12084             SvREFCNT_dec(PL_lex_stuff);
12085             PL_lex_stuff = NULL;
12086         }
12087         Perl_croak(aTHX_ "Transliteration replacement not terminated");
12088     }
12089     if (PL_madskills) {
12090         CURMAD('z', PL_thisopen);
12091         CURMAD('R', PL_thisstuff);
12092         CURMAD('Z', PL_thisclose);
12093     }
12094
12095     complement = del = squash = 0;
12096 #ifdef PERL_MAD
12097     modstart = s;
12098 #endif
12099     while (1) {
12100         switch (*s) {
12101         case 'c':
12102             complement = OPpTRANS_COMPLEMENT;
12103             break;
12104         case 'd':
12105             del = OPpTRANS_DELETE;
12106             break;
12107         case 's':
12108             squash = OPpTRANS_SQUASH;
12109             break;
12110         default:
12111             goto no_more;
12112         }
12113         s++;
12114     }
12115   no_more:
12116
12117     tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
12118     o = newPVOP(OP_TRANS, 0, (char*)tbl);
12119     o->op_private &= ~OPpTRANS_ALL;
12120     o->op_private |= del|squash|complement|
12121       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
12122       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
12123
12124     PL_lex_op = o;
12125     pl_yylval.ival = OP_TRANS;
12126
12127 #ifdef PERL_MAD
12128     if (PL_madskills) {
12129         if (modstart != s)
12130             curmad('m', newSVpvn(modstart, s - modstart));
12131         append_madprops(PL_thismad, o, 0);
12132         PL_thismad = 0;
12133     }
12134 #endif
12135
12136     return s;
12137 }
12138
12139 STATIC char *
12140 S_scan_heredoc(pTHX_ register char *s)
12141 {
12142     dVAR;
12143     SV *herewas;
12144     I32 op_type = OP_SCALAR;
12145     I32 len;
12146     SV *tmpstr;
12147     char term;
12148     const char *found_newline;
12149     register char *d;
12150     register char *e;
12151     char *peek;
12152     const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
12153 #ifdef PERL_MAD
12154     I32 stuffstart = s - SvPVX(PL_linestr);
12155     char *tstart;
12156  
12157     PL_realtokenstart = -1;
12158 #endif
12159
12160     PERL_ARGS_ASSERT_SCAN_HEREDOC;
12161
12162     s += 2;
12163     d = PL_tokenbuf;
12164     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
12165     if (!outer)
12166         *d++ = '\n';
12167     peek = s;
12168     while (SPACE_OR_TAB(*peek))
12169         peek++;
12170     if (*peek == '`' || *peek == '\'' || *peek =='"') {
12171         s = peek;
12172         term = *s++;
12173         s = delimcpy(d, e, s, PL_bufend, term, &len);
12174         d += len;
12175         if (s < PL_bufend)
12176             s++;
12177     }
12178     else {
12179         if (*s == '\\')
12180             s++, term = '\'';
12181         else
12182             term = '"';
12183         if (!isALNUM_lazy_if(s,UTF))
12184             deprecate("bare << to mean <<\"\"");
12185         for (; isALNUM_lazy_if(s,UTF); s++) {
12186             if (d < e)
12187                 *d++ = *s;
12188         }
12189     }
12190     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
12191         Perl_croak(aTHX_ "Delimiter for here document is too long");
12192     *d++ = '\n';
12193     *d = '\0';
12194     len = d - PL_tokenbuf;
12195
12196 #ifdef PERL_MAD
12197     if (PL_madskills) {
12198         tstart = PL_tokenbuf + !outer;
12199         PL_thisclose = newSVpvn(tstart, len - !outer);
12200         tstart = SvPVX(PL_linestr) + stuffstart;
12201         PL_thisopen = newSVpvn(tstart, s - tstart);
12202         stuffstart = s - SvPVX(PL_linestr);
12203     }
12204 #endif
12205 #ifndef PERL_STRICT_CR
12206     d = strchr(s, '\r');
12207     if (d) {
12208         char * const olds = s;
12209         s = d;
12210         while (s < PL_bufend) {
12211             if (*s == '\r') {
12212                 *d++ = '\n';
12213                 if (*++s == '\n')
12214                     s++;
12215             }
12216             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
12217                 *d++ = *s++;
12218                 s++;
12219             }
12220             else
12221                 *d++ = *s++;
12222         }
12223         *d = '\0';
12224         PL_bufend = d;
12225         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
12226         s = olds;
12227     }
12228 #endif
12229 #ifdef PERL_MAD
12230     found_newline = 0;
12231 #endif
12232     if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
12233         herewas = newSVpvn(s,PL_bufend-s);
12234     }
12235     else {
12236 #ifdef PERL_MAD
12237         herewas = newSVpvn(s-1,found_newline-s+1);
12238 #else
12239         s--;
12240         herewas = newSVpvn(s,found_newline-s);
12241 #endif
12242     }
12243 #ifdef PERL_MAD
12244     if (PL_madskills) {
12245         tstart = SvPVX(PL_linestr) + stuffstart;
12246         if (PL_thisstuff)
12247             sv_catpvn(PL_thisstuff, tstart, s - tstart);
12248         else
12249             PL_thisstuff = newSVpvn(tstart, s - tstart);
12250     }
12251 #endif
12252     s += SvCUR(herewas);
12253
12254 #ifdef PERL_MAD
12255     stuffstart = s - SvPVX(PL_linestr);
12256
12257     if (found_newline)
12258         s--;
12259 #endif
12260
12261     tmpstr = newSV_type(SVt_PVIV);
12262     SvGROW(tmpstr, 80);
12263     if (term == '\'') {
12264         op_type = OP_CONST;
12265         SvIV_set(tmpstr, -1);
12266     }
12267     else if (term == '`') {
12268         op_type = OP_BACKTICK;
12269         SvIV_set(tmpstr, '\\');
12270     }
12271
12272     CLINE;
12273     PL_multi_start = CopLINE(PL_curcop);
12274     PL_multi_open = PL_multi_close = '<';
12275     term = *PL_tokenbuf;
12276     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
12277         char * const bufptr = PL_sublex_info.super_bufptr;
12278         char * const bufend = PL_sublex_info.super_bufend;
12279         char * const olds = s - SvCUR(herewas);
12280         s = strchr(bufptr, '\n');
12281         if (!s)
12282             s = bufend;
12283         d = s;
12284         while (s < bufend &&
12285           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12286             if (*s++ == '\n')
12287                 CopLINE_inc(PL_curcop);
12288         }
12289         if (s >= bufend) {
12290             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12291             missingterm(PL_tokenbuf);
12292         }
12293         sv_setpvn(herewas,bufptr,d-bufptr+1);
12294         sv_setpvn(tmpstr,d+1,s-d);
12295         s += len - 1;
12296         sv_catpvn(herewas,s,bufend-s);
12297         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
12298
12299         s = olds;
12300         goto retval;
12301     }
12302     else if (!outer) {
12303         d = s;
12304         while (s < PL_bufend &&
12305           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12306             if (*s++ == '\n')
12307                 CopLINE_inc(PL_curcop);
12308         }
12309         if (s >= PL_bufend) {
12310             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12311             missingterm(PL_tokenbuf);
12312         }
12313         sv_setpvn(tmpstr,d+1,s-d);
12314 #ifdef PERL_MAD
12315         if (PL_madskills) {
12316             if (PL_thisstuff)
12317                 sv_catpvn(PL_thisstuff, d + 1, s - d);
12318             else
12319                 PL_thisstuff = newSVpvn(d + 1, s - d);
12320             stuffstart = s - SvPVX(PL_linestr);
12321         }
12322 #endif
12323         s += len - 1;
12324         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
12325
12326         sv_catpvn(herewas,s,PL_bufend-s);
12327         sv_setsv(PL_linestr,herewas);
12328         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
12329         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12330         PL_last_lop = PL_last_uni = NULL;
12331     }
12332     else
12333         sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
12334     while (s >= PL_bufend) {    /* multiple line string? */
12335 #ifdef PERL_MAD
12336         if (PL_madskills) {
12337             tstart = SvPVX(PL_linestr) + stuffstart;
12338             if (PL_thisstuff)
12339                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12340             else
12341                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12342         }
12343 #endif
12344         PL_bufptr = s;
12345         CopLINE_inc(PL_curcop);
12346         if (!outer || !lex_next_chunk(0)) {
12347             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12348             missingterm(PL_tokenbuf);
12349         }
12350         CopLINE_dec(PL_curcop);
12351         s = PL_bufptr;
12352 #ifdef PERL_MAD
12353         stuffstart = s - SvPVX(PL_linestr);
12354 #endif
12355         CopLINE_inc(PL_curcop);
12356         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12357         PL_last_lop = PL_last_uni = NULL;
12358 #ifndef PERL_STRICT_CR
12359         if (PL_bufend - PL_linestart >= 2) {
12360             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
12361                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
12362             {
12363                 PL_bufend[-2] = '\n';
12364                 PL_bufend--;
12365                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
12366             }
12367             else if (PL_bufend[-1] == '\r')
12368                 PL_bufend[-1] = '\n';
12369         }
12370         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
12371             PL_bufend[-1] = '\n';
12372 #endif
12373         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
12374             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
12375             *(SvPVX(PL_linestr) + off ) = ' ';
12376             sv_catsv(PL_linestr,herewas);
12377             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12378             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
12379         }
12380         else {
12381             s = PL_bufend;
12382             sv_catsv(tmpstr,PL_linestr);
12383         }
12384     }
12385     s++;
12386 retval:
12387     PL_multi_end = CopLINE(PL_curcop);
12388     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
12389         SvPV_shrink_to_cur(tmpstr);
12390     }
12391     SvREFCNT_dec(herewas);
12392     if (!IN_BYTES) {
12393         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
12394             SvUTF8_on(tmpstr);
12395         else if (PL_encoding)
12396             sv_recode_to_utf8(tmpstr, PL_encoding);
12397     }
12398     PL_lex_stuff = tmpstr;
12399     pl_yylval.ival = op_type;
12400     return s;
12401 }
12402
12403 /* scan_inputsymbol
12404    takes: current position in input buffer
12405    returns: new position in input buffer
12406    side-effects: pl_yylval and lex_op are set.
12407
12408    This code handles:
12409
12410    <>           read from ARGV
12411    <FH>         read from filehandle
12412    <pkg::FH>    read from package qualified filehandle
12413    <pkg'FH>     read from package qualified filehandle
12414    <$fh>        read from filehandle in $fh
12415    <*.h>        filename glob
12416
12417 */
12418
12419 STATIC char *
12420 S_scan_inputsymbol(pTHX_ char *start)
12421 {
12422     dVAR;
12423     register char *s = start;           /* current position in buffer */
12424     char *end;
12425     I32 len;
12426     char *d = PL_tokenbuf;                                      /* start of temp holding space */
12427     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
12428
12429     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
12430
12431     end = strchr(s, '\n');
12432     if (!end)
12433         end = PL_bufend;
12434     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
12435
12436     /* die if we didn't have space for the contents of the <>,
12437        or if it didn't end, or if we see a newline
12438     */
12439
12440     if (len >= (I32)sizeof PL_tokenbuf)
12441         Perl_croak(aTHX_ "Excessively long <> operator");
12442     if (s >= end)
12443         Perl_croak(aTHX_ "Unterminated <> operator");
12444
12445     s++;
12446
12447     /* check for <$fh>
12448        Remember, only scalar variables are interpreted as filehandles by
12449        this code.  Anything more complex (e.g., <$fh{$num}>) will be
12450        treated as a glob() call.
12451        This code makes use of the fact that except for the $ at the front,
12452        a scalar variable and a filehandle look the same.
12453     */
12454     if (*d == '$' && d[1]) d++;
12455
12456     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
12457     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
12458         d++;
12459
12460     /* If we've tried to read what we allow filehandles to look like, and
12461        there's still text left, then it must be a glob() and not a getline.
12462        Use scan_str to pull out the stuff between the <> and treat it
12463        as nothing more than a string.
12464     */
12465
12466     if (d - PL_tokenbuf != len) {
12467         pl_yylval.ival = OP_GLOB;
12468         s = scan_str(start,!!PL_madskills,FALSE);
12469         if (!s)
12470            Perl_croak(aTHX_ "Glob not terminated");
12471         return s;
12472     }
12473     else {
12474         bool readline_overriden = FALSE;
12475         GV *gv_readline;
12476         GV **gvp;
12477         /* we're in a filehandle read situation */
12478         d = PL_tokenbuf;
12479
12480         /* turn <> into <ARGV> */
12481         if (!len)
12482             Copy("ARGV",d,5,char);
12483
12484         /* Check whether readline() is overriden */
12485         gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
12486         if ((gv_readline
12487                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
12488                 ||
12489                 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
12490                  && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
12491                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
12492             readline_overriden = TRUE;
12493
12494         /* if <$fh>, create the ops to turn the variable into a
12495            filehandle
12496         */
12497         if (*d == '$') {
12498             /* try to find it in the pad for this block, otherwise find
12499                add symbol table ops
12500             */
12501             const PADOFFSET tmp = pad_findmy(d, len, 0);
12502             if (tmp != NOT_IN_PAD) {
12503                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
12504                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
12505                     HEK * const stashname = HvNAME_HEK(stash);
12506                     SV * const sym = sv_2mortal(newSVhek(stashname));
12507                     sv_catpvs(sym, "::");
12508                     sv_catpv(sym, d+1);
12509                     d = SvPVX(sym);
12510                     goto intro_sym;
12511                 }
12512                 else {
12513                     OP * const o = newOP(OP_PADSV, 0);
12514                     o->op_targ = tmp;
12515                     PL_lex_op = readline_overriden
12516                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12517                                 append_elem(OP_LIST, o,
12518                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
12519                         : (OP*)newUNOP(OP_READLINE, 0, o);
12520                 }
12521             }
12522             else {
12523                 GV *gv;
12524                 ++d;
12525 intro_sym:
12526                 gv = gv_fetchpv(d,
12527                                 (PL_in_eval
12528                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
12529                                  : GV_ADDMULTI),
12530                                 SVt_PV);
12531                 PL_lex_op = readline_overriden
12532                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12533                             append_elem(OP_LIST,
12534                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
12535                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12536                     : (OP*)newUNOP(OP_READLINE, 0,
12537                             newUNOP(OP_RV2SV, 0,
12538                                 newGVOP(OP_GV, 0, gv)));
12539             }
12540             if (!readline_overriden)
12541                 PL_lex_op->op_flags |= OPf_SPECIAL;
12542             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
12543             pl_yylval.ival = OP_NULL;
12544         }
12545
12546         /* If it's none of the above, it must be a literal filehandle
12547            (<Foo::BAR> or <FOO>) so build a simple readline OP */
12548         else {
12549             GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
12550             PL_lex_op = readline_overriden
12551                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12552                         append_elem(OP_LIST,
12553                             newGVOP(OP_GV, 0, gv),
12554                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12555                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
12556             pl_yylval.ival = OP_NULL;
12557         }
12558     }
12559
12560     return s;
12561 }
12562
12563
12564 /* scan_str
12565    takes: start position in buffer
12566           keep_quoted preserve \ on the embedded delimiter(s)
12567           keep_delims preserve the delimiters around the string
12568    returns: position to continue reading from buffer
12569    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
12570         updates the read buffer.
12571
12572    This subroutine pulls a string out of the input.  It is called for:
12573         q               single quotes           q(literal text)
12574         '               single quotes           'literal text'
12575         qq              double quotes           qq(interpolate $here please)
12576         "               double quotes           "interpolate $here please"
12577         qx              backticks               qx(/bin/ls -l)
12578         `               backticks               `/bin/ls -l`
12579         qw              quote words             @EXPORT_OK = qw( func() $spam )
12580         m//             regexp match            m/this/
12581         s///            regexp substitute       s/this/that/
12582         tr///           string transliterate    tr/this/that/
12583         y///            string transliterate    y/this/that/
12584         ($*@)           sub prototypes          sub foo ($)
12585         (stuff)         sub attr parameters     sub foo : attr(stuff)
12586         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
12587         
12588    In most of these cases (all but <>, patterns and transliterate)
12589    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
12590    calls scan_str().  s/// makes yylex() call scan_subst() which calls
12591    scan_str().  tr/// and y/// make yylex() call scan_trans() which
12592    calls scan_str().
12593
12594    It skips whitespace before the string starts, and treats the first
12595    character as the delimiter.  If the delimiter is one of ([{< then
12596    the corresponding "close" character )]}> is used as the closing
12597    delimiter.  It allows quoting of delimiters, and if the string has
12598    balanced delimiters ([{<>}]) it allows nesting.
12599
12600    On success, the SV with the resulting string is put into lex_stuff or,
12601    if that is already non-NULL, into lex_repl. The second case occurs only
12602    when parsing the RHS of the special constructs s/// and tr/// (y///).
12603    For convenience, the terminating delimiter character is stuffed into
12604    SvIVX of the SV.
12605 */
12606
12607 STATIC char *
12608 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
12609 {
12610     dVAR;
12611     SV *sv;                             /* scalar value: string */
12612     const char *tmps;                   /* temp string, used for delimiter matching */
12613     register char *s = start;           /* current position in the buffer */
12614     register char term;                 /* terminating character */
12615     register char *to;                  /* current position in the sv's data */
12616     I32 brackets = 1;                   /* bracket nesting level */
12617     bool has_utf8 = FALSE;              /* is there any utf8 content? */
12618     I32 termcode;                       /* terminating char. code */
12619     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
12620     STRLEN termlen;                     /* length of terminating string */
12621     int last_off = 0;                   /* last position for nesting bracket */
12622 #ifdef PERL_MAD
12623     int stuffstart;
12624     char *tstart;
12625 #endif
12626
12627     PERL_ARGS_ASSERT_SCAN_STR;
12628
12629     /* skip space before the delimiter */
12630     if (isSPACE(*s)) {
12631         s = PEEKSPACE(s);
12632     }
12633
12634 #ifdef PERL_MAD
12635     if (PL_realtokenstart >= 0) {
12636         stuffstart = PL_realtokenstart;
12637         PL_realtokenstart = -1;
12638     }
12639     else
12640         stuffstart = start - SvPVX(PL_linestr);
12641 #endif
12642     /* mark where we are, in case we need to report errors */
12643     CLINE;
12644
12645     /* after skipping whitespace, the next character is the terminator */
12646     term = *s;
12647     if (!UTF) {
12648         termcode = termstr[0] = term;
12649         termlen = 1;
12650     }
12651     else {
12652         termcode = utf8_to_uvchr((U8*)s, &termlen);
12653         Copy(s, termstr, termlen, U8);
12654         if (!UTF8_IS_INVARIANT(term))
12655             has_utf8 = TRUE;
12656     }
12657
12658     /* mark where we are */
12659     PL_multi_start = CopLINE(PL_curcop);
12660     PL_multi_open = term;
12661
12662     /* find corresponding closing delimiter */
12663     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
12664         termcode = termstr[0] = term = tmps[5];
12665
12666     PL_multi_close = term;
12667
12668     /* create a new SV to hold the contents.  79 is the SV's initial length.
12669        What a random number. */
12670     sv = newSV_type(SVt_PVIV);
12671     SvGROW(sv, 80);
12672     SvIV_set(sv, termcode);
12673     (void)SvPOK_only(sv);               /* validate pointer */
12674
12675     /* move past delimiter and try to read a complete string */
12676     if (keep_delims)
12677         sv_catpvn(sv, s, termlen);
12678     s += termlen;
12679 #ifdef PERL_MAD
12680     tstart = SvPVX(PL_linestr) + stuffstart;
12681     if (!PL_thisopen && !keep_delims) {
12682         PL_thisopen = newSVpvn(tstart, s - tstart);
12683         stuffstart = s - SvPVX(PL_linestr);
12684     }
12685 #endif
12686     for (;;) {
12687         if (PL_encoding && !UTF) {
12688             bool cont = TRUE;
12689
12690             while (cont) {
12691                 int offset = s - SvPVX_const(PL_linestr);
12692                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
12693                                            &offset, (char*)termstr, termlen);
12694                 const char * const ns = SvPVX_const(PL_linestr) + offset;
12695                 char * const svlast = SvEND(sv) - 1;
12696
12697                 for (; s < ns; s++) {
12698                     if (*s == '\n' && !PL_rsfp)
12699                         CopLINE_inc(PL_curcop);
12700                 }
12701                 if (!found)
12702                     goto read_more_line;
12703                 else {
12704                     /* handle quoted delimiters */
12705                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
12706                         const char *t;
12707                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
12708                             t--;
12709                         if ((svlast-1 - t) % 2) {
12710                             if (!keep_quoted) {
12711                                 *(svlast-1) = term;
12712                                 *svlast = '\0';
12713                                 SvCUR_set(sv, SvCUR(sv) - 1);
12714                             }
12715                             continue;
12716                         }
12717                     }
12718                     if (PL_multi_open == PL_multi_close) {
12719                         cont = FALSE;
12720                     }
12721                     else {
12722                         const char *t;
12723                         char *w;
12724                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
12725                             /* At here, all closes are "was quoted" one,
12726                                so we don't check PL_multi_close. */
12727                             if (*t == '\\') {
12728                                 if (!keep_quoted && *(t+1) == PL_multi_open)
12729                                     t++;
12730                                 else
12731                                     *w++ = *t++;
12732                             }
12733                             else if (*t == PL_multi_open)
12734                                 brackets++;
12735
12736                             *w = *t;
12737                         }
12738                         if (w < t) {
12739                             *w++ = term;
12740                             *w = '\0';
12741                             SvCUR_set(sv, w - SvPVX_const(sv));
12742                         }
12743                         last_off = w - SvPVX(sv);
12744                         if (--brackets <= 0)
12745                             cont = FALSE;
12746                     }
12747                 }
12748             }
12749             if (!keep_delims) {
12750                 SvCUR_set(sv, SvCUR(sv) - 1);
12751                 *SvEND(sv) = '\0';
12752             }
12753             break;
12754         }
12755
12756         /* extend sv if need be */
12757         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
12758         /* set 'to' to the next character in the sv's string */
12759         to = SvPVX(sv)+SvCUR(sv);
12760
12761         /* if open delimiter is the close delimiter read unbridle */
12762         if (PL_multi_open == PL_multi_close) {
12763             for (; s < PL_bufend; s++,to++) {
12764                 /* embedded newlines increment the current line number */
12765                 if (*s == '\n' && !PL_rsfp)
12766                     CopLINE_inc(PL_curcop);
12767                 /* handle quoted delimiters */
12768                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
12769                     if (!keep_quoted && s[1] == term)
12770                         s++;
12771                 /* any other quotes are simply copied straight through */
12772                     else
12773                         *to++ = *s++;
12774                 }
12775                 /* terminate when run out of buffer (the for() condition), or
12776                    have found the terminator */
12777                 else if (*s == term) {
12778                     if (termlen == 1)
12779                         break;
12780                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
12781                         break;
12782                 }
12783                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12784                     has_utf8 = TRUE;
12785                 *to = *s;
12786             }
12787         }
12788         
12789         /* if the terminator isn't the same as the start character (e.g.,
12790            matched brackets), we have to allow more in the quoting, and
12791            be prepared for nested brackets.
12792         */
12793         else {
12794             /* read until we run out of string, or we find the terminator */
12795             for (; s < PL_bufend; s++,to++) {
12796                 /* embedded newlines increment the line count */
12797                 if (*s == '\n' && !PL_rsfp)
12798                     CopLINE_inc(PL_curcop);
12799                 /* backslashes can escape the open or closing characters */
12800                 if (*s == '\\' && s+1 < PL_bufend) {
12801                     if (!keep_quoted &&
12802                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
12803                         s++;
12804                     else
12805                         *to++ = *s++;
12806                 }
12807                 /* allow nested opens and closes */
12808                 else if (*s == PL_multi_close && --brackets <= 0)
12809                     break;
12810                 else if (*s == PL_multi_open)
12811                     brackets++;
12812                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12813                     has_utf8 = TRUE;
12814                 *to = *s;
12815             }
12816         }
12817         /* terminate the copied string and update the sv's end-of-string */
12818         *to = '\0';
12819         SvCUR_set(sv, to - SvPVX_const(sv));
12820
12821         /*
12822          * this next chunk reads more into the buffer if we're not done yet
12823          */
12824
12825         if (s < PL_bufend)
12826             break;              /* handle case where we are done yet :-) */
12827
12828 #ifndef PERL_STRICT_CR
12829         if (to - SvPVX_const(sv) >= 2) {
12830             if ((to[-2] == '\r' && to[-1] == '\n') ||
12831                 (to[-2] == '\n' && to[-1] == '\r'))
12832             {
12833                 to[-2] = '\n';
12834                 to--;
12835                 SvCUR_set(sv, to - SvPVX_const(sv));
12836             }
12837             else if (to[-1] == '\r')
12838                 to[-1] = '\n';
12839         }
12840         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
12841             to[-1] = '\n';
12842 #endif
12843         
12844      read_more_line:
12845         /* if we're out of file, or a read fails, bail and reset the current
12846            line marker so we can report where the unterminated string began
12847         */
12848 #ifdef PERL_MAD
12849         if (PL_madskills) {
12850             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12851             if (PL_thisstuff)
12852                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12853             else
12854                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12855         }
12856 #endif
12857         CopLINE_inc(PL_curcop);
12858         PL_bufptr = PL_bufend;
12859         if (!lex_next_chunk(0)) {
12860             sv_free(sv);
12861             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12862             return NULL;
12863         }
12864         s = PL_bufptr;
12865 #ifdef PERL_MAD
12866         stuffstart = 0;
12867 #endif
12868     }
12869
12870     /* at this point, we have successfully read the delimited string */
12871
12872     if (!PL_encoding || UTF) {
12873 #ifdef PERL_MAD
12874         if (PL_madskills) {
12875             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12876             const int len = s - tstart;
12877             if (PL_thisstuff)
12878                 sv_catpvn(PL_thisstuff, tstart, len);
12879             else
12880                 PL_thisstuff = newSVpvn(tstart, len);
12881             if (!PL_thisclose && !keep_delims)
12882                 PL_thisclose = newSVpvn(s,termlen);
12883         }
12884 #endif
12885
12886         if (keep_delims)
12887             sv_catpvn(sv, s, termlen);
12888         s += termlen;
12889     }
12890 #ifdef PERL_MAD
12891     else {
12892         if (PL_madskills) {
12893             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12894             const int len = s - tstart - termlen;
12895             if (PL_thisstuff)
12896                 sv_catpvn(PL_thisstuff, tstart, len);
12897             else
12898                 PL_thisstuff = newSVpvn(tstart, len);
12899             if (!PL_thisclose && !keep_delims)
12900                 PL_thisclose = newSVpvn(s - termlen,termlen);
12901         }
12902     }
12903 #endif
12904     if (has_utf8 || PL_encoding)
12905         SvUTF8_on(sv);
12906
12907     PL_multi_end = CopLINE(PL_curcop);
12908
12909     /* if we allocated too much space, give some back */
12910     if (SvCUR(sv) + 5 < SvLEN(sv)) {
12911         SvLEN_set(sv, SvCUR(sv) + 1);
12912         SvPV_renew(sv, SvLEN(sv));
12913     }
12914
12915     /* decide whether this is the first or second quoted string we've read
12916        for this op
12917     */
12918
12919     if (PL_lex_stuff)
12920         PL_lex_repl = sv;
12921     else
12922         PL_lex_stuff = sv;
12923     return s;
12924 }
12925
12926 /*
12927   scan_num
12928   takes: pointer to position in buffer
12929   returns: pointer to new position in buffer
12930   side-effects: builds ops for the constant in pl_yylval.op
12931
12932   Read a number in any of the formats that Perl accepts:
12933
12934   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
12935   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
12936   0b[01](_?[01])*
12937   0[0-7](_?[0-7])*
12938   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
12939
12940   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
12941   thing it reads.
12942
12943   If it reads a number without a decimal point or an exponent, it will
12944   try converting the number to an integer and see if it can do so
12945   without loss of precision.
12946 */
12947
12948 char *
12949 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
12950 {
12951     dVAR;
12952     register const char *s = start;     /* current position in buffer */
12953     register char *d;                   /* destination in temp buffer */
12954     register char *e;                   /* end of temp buffer */
12955     NV nv;                              /* number read, as a double */
12956     SV *sv = NULL;                      /* place to put the converted number */
12957     bool floatit;                       /* boolean: int or float? */
12958     const char *lastub = NULL;          /* position of last underbar */
12959     static char const number_too_long[] = "Number too long";
12960
12961     PERL_ARGS_ASSERT_SCAN_NUM;
12962
12963     /* We use the first character to decide what type of number this is */
12964
12965     switch (*s) {
12966     default:
12967       Perl_croak(aTHX_ "panic: scan_num");
12968
12969     /* if it starts with a 0, it could be an octal number, a decimal in
12970        0.13 disguise, or a hexadecimal number, or a binary number. */
12971     case '0':
12972         {
12973           /* variables:
12974              u          holds the "number so far"
12975              shift      the power of 2 of the base
12976                         (hex == 4, octal == 3, binary == 1)
12977              overflowed was the number more than we can hold?
12978
12979              Shift is used when we add a digit.  It also serves as an "are
12980              we in octal/hex/binary?" indicator to disallow hex characters
12981              when in octal mode.
12982            */
12983             NV n = 0.0;
12984             UV u = 0;
12985             I32 shift;
12986             bool overflowed = FALSE;
12987             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
12988             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
12989             static const char* const bases[5] =
12990               { "", "binary", "", "octal", "hexadecimal" };
12991             static const char* const Bases[5] =
12992               { "", "Binary", "", "Octal", "Hexadecimal" };
12993             static const char* const maxima[5] =
12994               { "",
12995                 "0b11111111111111111111111111111111",
12996                 "",
12997                 "037777777777",
12998                 "0xffffffff" };
12999             const char *base, *Base, *max;
13000
13001             /* check for hex */
13002             if (s[1] == 'x') {
13003                 shift = 4;
13004                 s += 2;
13005                 just_zero = FALSE;
13006             } else if (s[1] == 'b') {
13007                 shift = 1;
13008                 s += 2;
13009                 just_zero = FALSE;
13010             }
13011             /* check for a decimal in disguise */
13012             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
13013                 goto decimal;
13014             /* so it must be octal */
13015             else {
13016                 shift = 3;
13017                 s++;
13018             }
13019
13020             if (*s == '_') {
13021                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13022                                "Misplaced _ in number");
13023                lastub = s++;
13024             }
13025
13026             base = bases[shift];
13027             Base = Bases[shift];
13028             max  = maxima[shift];
13029
13030             /* read the rest of the number */
13031             for (;;) {
13032                 /* x is used in the overflow test,
13033                    b is the digit we're adding on. */
13034                 UV x, b;
13035
13036                 switch (*s) {
13037
13038                 /* if we don't mention it, we're done */
13039                 default:
13040                     goto out;
13041
13042                 /* _ are ignored -- but warned about if consecutive */
13043                 case '_':
13044                     if (lastub && s == lastub + 1)
13045                         Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13046                                        "Misplaced _ in number");
13047                     lastub = s++;
13048                     break;
13049
13050                 /* 8 and 9 are not octal */
13051                 case '8': case '9':
13052                     if (shift == 3)
13053                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
13054                     /* FALL THROUGH */
13055
13056                 /* octal digits */
13057                 case '2': case '3': case '4':
13058                 case '5': case '6': case '7':
13059                     if (shift == 1)
13060                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
13061                     /* FALL THROUGH */
13062
13063                 case '0': case '1':
13064                     b = *s++ & 15;              /* ASCII digit -> value of digit */
13065                     goto digit;
13066
13067                 /* hex digits */
13068                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
13069                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
13070                     /* make sure they said 0x */
13071                     if (shift != 4)
13072                         goto out;
13073                     b = (*s++ & 7) + 9;
13074
13075                     /* Prepare to put the digit we have onto the end
13076                        of the number so far.  We check for overflows.
13077                     */
13078
13079                   digit:
13080                     just_zero = FALSE;
13081                     if (!overflowed) {
13082                         x = u << shift; /* make room for the digit */
13083
13084                         if ((x >> shift) != u
13085                             && !(PL_hints & HINT_NEW_BINARY)) {
13086                             overflowed = TRUE;
13087                             n = (NV) u;
13088                             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13089                                              "Integer overflow in %s number",
13090                                              base);
13091                         } else
13092                             u = x | b;          /* add the digit to the end */
13093                     }
13094                     if (overflowed) {
13095                         n *= nvshift[shift];
13096                         /* If an NV has not enough bits in its
13097                          * mantissa to represent an UV this summing of
13098                          * small low-order numbers is a waste of time
13099                          * (because the NV cannot preserve the
13100                          * low-order bits anyway): we could just
13101                          * remember when did we overflow and in the
13102                          * end just multiply n by the right
13103                          * amount. */
13104                         n += (NV) b;
13105                     }
13106                     break;
13107                 }
13108             }
13109
13110           /* if we get here, we had success: make a scalar value from
13111              the number.
13112           */
13113           out:
13114
13115             /* final misplaced underbar check */
13116             if (s[-1] == '_') {
13117                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
13118             }
13119
13120             sv = newSV(0);
13121             if (overflowed) {
13122                 if (n > 4294967295.0)
13123                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
13124                                    "%s number > %s non-portable",
13125                                    Base, max);
13126                 sv_setnv(sv, n);
13127             }
13128             else {
13129 #if UVSIZE > 4
13130                 if (u > 0xffffffff)
13131                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
13132                                    "%s number > %s non-portable",
13133                                    Base, max);
13134 #endif
13135                 sv_setuv(sv, u);
13136             }
13137             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
13138                 sv = new_constant(start, s - start, "integer",
13139                                   sv, NULL, NULL, 0);
13140             else if (PL_hints & HINT_NEW_BINARY)
13141                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
13142         }
13143         break;
13144
13145     /*
13146       handle decimal numbers.
13147       we're also sent here when we read a 0 as the first digit
13148     */
13149     case '1': case '2': case '3': case '4': case '5':
13150     case '6': case '7': case '8': case '9': case '.':
13151       decimal:
13152         d = PL_tokenbuf;
13153         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
13154         floatit = FALSE;
13155
13156         /* read next group of digits and _ and copy into d */
13157         while (isDIGIT(*s) || *s == '_') {
13158             /* skip underscores, checking for misplaced ones
13159                if -w is on
13160             */
13161             if (*s == '_') {
13162                 if (lastub && s == lastub + 1)
13163                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13164                                    "Misplaced _ in number");
13165                 lastub = s++;
13166             }
13167             else {
13168                 /* check for end of fixed-length buffer */
13169                 if (d >= e)
13170                     Perl_croak(aTHX_ number_too_long);
13171                 /* if we're ok, copy the character */
13172                 *d++ = *s++;
13173             }
13174         }
13175
13176         /* final misplaced underbar check */
13177         if (lastub && s == lastub + 1) {
13178             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
13179         }
13180
13181         /* read a decimal portion if there is one.  avoid
13182            3..5 being interpreted as the number 3. followed
13183            by .5
13184         */
13185         if (*s == '.' && s[1] != '.') {
13186             floatit = TRUE;
13187             *d++ = *s++;
13188
13189             if (*s == '_') {
13190                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13191                                "Misplaced _ in number");
13192                 lastub = s;
13193             }
13194
13195             /* copy, ignoring underbars, until we run out of digits.
13196             */
13197             for (; isDIGIT(*s) || *s == '_'; s++) {
13198                 /* fixed length buffer check */
13199                 if (d >= e)
13200                     Perl_croak(aTHX_ number_too_long);
13201                 if (*s == '_') {
13202                    if (lastub && s == lastub + 1)
13203                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13204                                       "Misplaced _ in number");
13205                    lastub = s;
13206                 }
13207                 else
13208                     *d++ = *s;
13209             }
13210             /* fractional part ending in underbar? */
13211             if (s[-1] == '_') {
13212                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13213                                "Misplaced _ in number");
13214             }
13215             if (*s == '.' && isDIGIT(s[1])) {
13216                 /* oops, it's really a v-string, but without the "v" */
13217                 s = start;
13218                 goto vstring;
13219             }
13220         }
13221
13222         /* read exponent part, if present */
13223         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
13224             floatit = TRUE;
13225             s++;
13226
13227             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
13228             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
13229
13230             /* stray preinitial _ */
13231             if (*s == '_') {
13232                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13233                                "Misplaced _ in number");
13234                 lastub = s++;
13235             }
13236
13237             /* allow positive or negative exponent */
13238             if (*s == '+' || *s == '-')
13239                 *d++ = *s++;
13240
13241             /* stray initial _ */
13242             if (*s == '_') {
13243                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13244                                "Misplaced _ in number");
13245                 lastub = s++;
13246             }
13247
13248             /* read digits of exponent */
13249             while (isDIGIT(*s) || *s == '_') {
13250                 if (isDIGIT(*s)) {
13251                     if (d >= e)
13252                         Perl_croak(aTHX_ number_too_long);
13253                     *d++ = *s++;
13254                 }
13255                 else {
13256                    if (((lastub && s == lastub + 1) ||
13257                         (!isDIGIT(s[1]) && s[1] != '_')))
13258                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13259                                       "Misplaced _ in number");
13260                    lastub = s++;
13261                 }
13262             }
13263         }
13264
13265
13266         /* make an sv from the string */
13267         sv = newSV(0);
13268
13269         /*
13270            We try to do an integer conversion first if no characters
13271            indicating "float" have been found.
13272          */
13273
13274         if (!floatit) {
13275             UV uv;
13276             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
13277
13278             if (flags == IS_NUMBER_IN_UV) {
13279               if (uv <= IV_MAX)
13280                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
13281               else
13282                 sv_setuv(sv, uv);
13283             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
13284               if (uv <= (UV) IV_MIN)
13285                 sv_setiv(sv, -(IV)uv);
13286               else
13287                 floatit = TRUE;
13288             } else
13289               floatit = TRUE;
13290         }
13291         if (floatit) {
13292             /* terminate the string */
13293             *d = '\0';
13294             nv = Atof(PL_tokenbuf);
13295             sv_setnv(sv, nv);
13296         }
13297
13298         if ( floatit
13299              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
13300             const char *const key = floatit ? "float" : "integer";
13301             const STRLEN keylen = floatit ? 5 : 7;
13302             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
13303                                 key, keylen, sv, NULL, NULL, 0);
13304         }
13305         break;
13306
13307     /* if it starts with a v, it could be a v-string */
13308     case 'v':
13309 vstring:
13310                 sv = newSV(5); /* preallocate storage space */
13311                 s = scan_vstring(s, PL_bufend, sv);
13312         break;
13313     }
13314
13315     /* make the op for the constant and return */
13316
13317     if (sv)
13318         lvalp->opval = newSVOP(OP_CONST, 0, sv);
13319     else
13320         lvalp->opval = NULL;
13321
13322     return (char *)s;
13323 }
13324
13325 STATIC char *
13326 S_scan_formline(pTHX_ register char *s)
13327 {
13328     dVAR;
13329     register char *eol;
13330     register char *t;
13331     SV * const stuff = newSVpvs("");
13332     bool needargs = FALSE;
13333     bool eofmt = FALSE;
13334 #ifdef PERL_MAD
13335     char *tokenstart = s;
13336     SV* savewhite = NULL;
13337
13338     if (PL_madskills) {
13339         savewhite = PL_thiswhite;
13340         PL_thiswhite = 0;
13341     }
13342 #endif
13343
13344     PERL_ARGS_ASSERT_SCAN_FORMLINE;
13345
13346     while (!needargs) {
13347         if (*s == '.') {
13348             t = s+1;
13349 #ifdef PERL_STRICT_CR
13350             while (SPACE_OR_TAB(*t))
13351                 t++;
13352 #else
13353             while (SPACE_OR_TAB(*t) || *t == '\r')
13354                 t++;
13355 #endif
13356             if (*t == '\n' || t == PL_bufend) {
13357                 eofmt = TRUE;
13358                 break;
13359             }
13360         }
13361         if (PL_in_eval && !PL_rsfp) {
13362             eol = (char *) memchr(s,'\n',PL_bufend-s);
13363             if (!eol++)
13364                 eol = PL_bufend;
13365         }
13366         else
13367             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
13368         if (*s != '#') {
13369             for (t = s; t < eol; t++) {
13370                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
13371                     needargs = FALSE;
13372                     goto enough;        /* ~~ must be first line in formline */
13373                 }
13374                 if (*t == '@' || *t == '^')
13375                     needargs = TRUE;
13376             }
13377             if (eol > s) {
13378                 sv_catpvn(stuff, s, eol-s);
13379 #ifndef PERL_STRICT_CR
13380                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
13381                     char *end = SvPVX(stuff) + SvCUR(stuff);
13382                     end[-2] = '\n';
13383                     end[-1] = '\0';
13384                     SvCUR_set(stuff, SvCUR(stuff) - 1);
13385                 }
13386 #endif
13387             }
13388             else
13389               break;
13390         }
13391         s = (char*)eol;
13392         if (PL_rsfp) {
13393             bool got_some;
13394 #ifdef PERL_MAD
13395             if (PL_madskills) {
13396                 if (PL_thistoken)
13397                     sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
13398                 else
13399                     PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
13400             }
13401 #endif
13402             PL_bufptr = PL_bufend;
13403             CopLINE_inc(PL_curcop);
13404             got_some = lex_next_chunk(0);
13405             CopLINE_dec(PL_curcop);
13406             s = PL_bufptr;
13407 #ifdef PERL_MAD
13408             tokenstart = PL_bufptr;
13409 #endif
13410             if (!got_some)
13411                 break;
13412         }
13413         incline(s);
13414     }
13415   enough:
13416     if (SvCUR(stuff)) {
13417         PL_expect = XTERM;
13418         if (needargs) {
13419             PL_lex_state = LEX_NORMAL;
13420             start_force(PL_curforce);
13421             NEXTVAL_NEXTTOKE.ival = 0;
13422             force_next(',');
13423         }
13424         else
13425             PL_lex_state = LEX_FORMLINE;
13426         if (!IN_BYTES) {
13427             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
13428                 SvUTF8_on(stuff);
13429             else if (PL_encoding)
13430                 sv_recode_to_utf8(stuff, PL_encoding);
13431         }
13432         start_force(PL_curforce);
13433         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
13434         force_next(THING);
13435         start_force(PL_curforce);
13436         NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
13437         force_next(LSTOP);
13438     }
13439     else {
13440         SvREFCNT_dec(stuff);
13441         if (eofmt)
13442             PL_lex_formbrack = 0;
13443         PL_bufptr = s;
13444     }
13445 #ifdef PERL_MAD
13446     if (PL_madskills) {
13447         if (PL_thistoken)
13448             sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
13449         else
13450             PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
13451         PL_thiswhite = savewhite;
13452     }
13453 #endif
13454     return s;
13455 }
13456
13457 I32
13458 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
13459 {
13460     dVAR;
13461     const I32 oldsavestack_ix = PL_savestack_ix;
13462     CV* const outsidecv = PL_compcv;
13463
13464     if (PL_compcv) {
13465         assert(SvTYPE(PL_compcv) == SVt_PVCV);
13466     }
13467     SAVEI32(PL_subline);
13468     save_item(PL_subname);
13469     SAVESPTR(PL_compcv);
13470
13471     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
13472     CvFLAGS(PL_compcv) |= flags;
13473
13474     PL_subline = CopLINE(PL_curcop);
13475     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
13476     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
13477     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
13478
13479     return oldsavestack_ix;
13480 }
13481
13482 #ifdef __SC__
13483 #pragma segment Perl_yylex
13484 #endif
13485 static int
13486 S_yywarn(pTHX_ const char *const s)
13487 {
13488     dVAR;
13489
13490     PERL_ARGS_ASSERT_YYWARN;
13491
13492     PL_in_eval |= EVAL_WARNONLY;
13493     yyerror(s);
13494     PL_in_eval &= ~EVAL_WARNONLY;
13495     return 0;
13496 }
13497
13498 int
13499 Perl_yyerror(pTHX_ const char *const s)
13500 {
13501     dVAR;
13502     const char *where = NULL;
13503     const char *context = NULL;
13504     int contlen = -1;
13505     SV *msg;
13506     int yychar  = PL_parser->yychar;
13507
13508     PERL_ARGS_ASSERT_YYERROR;
13509
13510     if (!yychar || (yychar == ';' && !PL_rsfp))
13511         where = "at EOF";
13512     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
13513       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
13514       PL_oldbufptr != PL_bufptr) {
13515         /*
13516                 Only for NetWare:
13517                 The code below is removed for NetWare because it abends/crashes on NetWare
13518                 when the script has error such as not having the closing quotes like:
13519                     if ($var eq "value)
13520                 Checking of white spaces is anyway done in NetWare code.
13521         */
13522 #ifndef NETWARE
13523         while (isSPACE(*PL_oldoldbufptr))
13524             PL_oldoldbufptr++;
13525 #endif
13526         context = PL_oldoldbufptr;
13527         contlen = PL_bufptr - PL_oldoldbufptr;
13528     }
13529     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
13530       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
13531         /*
13532                 Only for NetWare:
13533                 The code below is removed for NetWare because it abends/crashes on NetWare
13534                 when the script has error such as not having the closing quotes like:
13535                     if ($var eq "value)
13536                 Checking of white spaces is anyway done in NetWare code.
13537         */
13538 #ifndef NETWARE
13539         while (isSPACE(*PL_oldbufptr))
13540             PL_oldbufptr++;
13541 #endif
13542         context = PL_oldbufptr;
13543         contlen = PL_bufptr - PL_oldbufptr;
13544     }
13545     else if (yychar > 255)
13546         where = "next token ???";
13547     else if (yychar == -2) { /* YYEMPTY */
13548         if (PL_lex_state == LEX_NORMAL ||
13549            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
13550             where = "at end of line";
13551         else if (PL_lex_inpat)
13552             where = "within pattern";
13553         else
13554             where = "within string";
13555     }
13556     else {
13557         SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
13558         if (yychar < 32)
13559             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
13560         else if (isPRINT_LC(yychar)) {
13561             const char string = yychar;
13562             sv_catpvn(where_sv, &string, 1);
13563         }
13564         else
13565             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
13566         where = SvPVX_const(where_sv);
13567     }
13568     msg = sv_2mortal(newSVpv(s, 0));
13569     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
13570         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
13571     if (context)
13572         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
13573     else
13574         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
13575     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
13576         Perl_sv_catpvf(aTHX_ msg,
13577         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
13578                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
13579         PL_multi_end = 0;
13580     }
13581     if (PL_in_eval & EVAL_WARNONLY) {
13582         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
13583     }
13584     else
13585         qerror(msg);
13586     if (PL_error_count >= 10) {
13587         if (PL_in_eval && SvCUR(ERRSV))
13588             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
13589                        SVfARG(ERRSV), OutCopFILE(PL_curcop));
13590         else
13591             Perl_croak(aTHX_ "%s has too many errors.\n",
13592             OutCopFILE(PL_curcop));
13593     }
13594     PL_in_my = 0;
13595     PL_in_my_stash = NULL;
13596     return 0;
13597 }
13598 #ifdef __SC__
13599 #pragma segment Main
13600 #endif
13601
13602 STATIC char*
13603 S_swallow_bom(pTHX_ U8 *s)
13604 {
13605     dVAR;
13606     const STRLEN slen = SvCUR(PL_linestr);
13607
13608     PERL_ARGS_ASSERT_SWALLOW_BOM;
13609
13610     switch (s[0]) {
13611     case 0xFF:
13612         if (s[1] == 0xFE) {
13613             /* UTF-16 little-endian? (or UTF-32LE?) */
13614             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
13615                 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
13616 #ifndef PERL_NO_UTF16_FILTER
13617             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
13618             s += 2;
13619             if (PL_bufend > (char*)s) {
13620                 s = add_utf16_textfilter(s, TRUE);
13621             }
13622 #else
13623             Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13624 #endif
13625         }
13626         break;
13627     case 0xFE:
13628         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
13629 #ifndef PERL_NO_UTF16_FILTER
13630             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
13631             s += 2;
13632             if (PL_bufend > (char *)s) {
13633                 s = add_utf16_textfilter(s, FALSE);
13634             }
13635 #else
13636             Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13637 #endif
13638         }
13639         break;
13640     case 0xEF:
13641         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
13642             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13643             s += 3;                      /* UTF-8 */
13644         }
13645         break;
13646     case 0:
13647         if (slen > 3) {
13648              if (s[1] == 0) {
13649                   if (s[2] == 0xFE && s[3] == 0xFF) {
13650                        /* UTF-32 big-endian */
13651                        Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
13652                   }
13653              }
13654              else if (s[2] == 0 && s[3] != 0) {
13655                   /* Leading bytes
13656                    * 00 xx 00 xx
13657                    * are a good indicator of UTF-16BE. */
13658 #ifndef PERL_NO_UTF16_FILTER
13659                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
13660                   s = add_utf16_textfilter(s, FALSE);
13661 #else
13662                   Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13663 #endif
13664              }
13665         }
13666 #ifdef EBCDIC
13667     case 0xDD:
13668         if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
13669             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13670             s += 4;                      /* UTF-8 */
13671         }
13672         break;
13673 #endif
13674
13675     default:
13676          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
13677                   /* Leading bytes
13678                    * xx 00 xx 00
13679                    * are a good indicator of UTF-16LE. */
13680 #ifndef PERL_NO_UTF16_FILTER
13681               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
13682               s = add_utf16_textfilter(s, TRUE);
13683 #else
13684               Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13685 #endif
13686          }
13687     }
13688     return (char*)s;
13689 }
13690
13691
13692 #ifndef PERL_NO_UTF16_FILTER
13693 static I32
13694 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
13695 {
13696     dVAR;
13697     SV *const filter = FILTER_DATA(idx);
13698     /* We re-use this each time round, throwing the contents away before we
13699        return.  */
13700     SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
13701     SV *const utf8_buffer = filter;
13702     IV status = IoPAGE(filter);
13703     const bool reverse = (bool) IoLINES(filter);
13704     I32 retval;
13705
13706     /* As we're automatically added, at the lowest level, and hence only called
13707        from this file, we can be sure that we're not called in block mode. Hence
13708        don't bother writing code to deal with block mode.  */
13709     if (maxlen) {
13710         Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
13711     }
13712     if (status < 0) {
13713         Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
13714     }
13715     DEBUG_P(PerlIO_printf(Perl_debug_log,
13716                           "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13717                           FPTR2DPTR(void *, S_utf16_textfilter),
13718                           reverse ? 'l' : 'b', idx, maxlen, status,
13719                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13720
13721     while (1) {
13722         STRLEN chars;
13723         STRLEN have;
13724         I32 newlen;
13725         U8 *end;
13726         /* First, look in our buffer of existing UTF-8 data:  */
13727         char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
13728
13729         if (nl) {
13730             ++nl;
13731         } else if (status == 0) {
13732             /* EOF */
13733             IoPAGE(filter) = 0;
13734             nl = SvEND(utf8_buffer);
13735         }
13736         if (nl) {
13737             STRLEN got = nl - SvPVX(utf8_buffer);
13738             /* Did we have anything to append?  */
13739             retval = got != 0;
13740             sv_catpvn(sv, SvPVX(utf8_buffer), got);
13741             /* Everything else in this code works just fine if SVp_POK isn't
13742                set.  This, however, needs it, and we need it to work, else
13743                we loop infinitely because the buffer is never consumed.  */
13744             sv_chop(utf8_buffer, nl);
13745             break;
13746         }
13747
13748         /* OK, not a complete line there, so need to read some more UTF-16.
13749            Read an extra octect if the buffer currently has an odd number. */
13750         while (1) {
13751             if (status <= 0)
13752                 break;
13753             if (SvCUR(utf16_buffer) >= 2) {
13754                 /* Location of the high octet of the last complete code point.
13755                    Gosh, UTF-16 is a pain. All the benefits of variable length,
13756                    *coupled* with all the benefits of partial reads and
13757                    endianness.  */
13758                 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
13759                     + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
13760
13761                 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
13762                     break;
13763                 }
13764
13765                 /* We have the first half of a surrogate. Read more.  */
13766                 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
13767             }
13768
13769             status = FILTER_READ(idx + 1, utf16_buffer,
13770                                  160 + (SvCUR(utf16_buffer) & 1));
13771             DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
13772             DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
13773             if (status < 0) {
13774                 /* Error */
13775                 IoPAGE(filter) = status;
13776                 return status;
13777             }
13778         }
13779
13780         chars = SvCUR(utf16_buffer) >> 1;
13781         have = SvCUR(utf8_buffer);
13782         SvGROW(utf8_buffer, have + chars * 3 + 1);
13783
13784         if (reverse) {
13785             end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
13786                                          (U8*)SvPVX_const(utf8_buffer) + have,
13787                                          chars * 2, &newlen);
13788         } else {
13789             end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
13790                                 (U8*)SvPVX_const(utf8_buffer) + have,
13791                                 chars * 2, &newlen);
13792         }
13793         SvCUR_set(utf8_buffer, have + newlen);
13794         *end = '\0';
13795
13796         /* No need to keep this SV "well-formed" with a '\0' after the end, as
13797            it's private to us, and utf16_to_utf8{,reversed} take a
13798            (pointer,length) pair, rather than a NUL-terminated string.  */
13799         if(SvCUR(utf16_buffer) & 1) {
13800             *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
13801             SvCUR_set(utf16_buffer, 1);
13802         } else {
13803             SvCUR_set(utf16_buffer, 0);
13804         }
13805     }
13806     DEBUG_P(PerlIO_printf(Perl_debug_log,
13807                           "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13808                           status,
13809                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13810     DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
13811     return retval;
13812 }
13813
13814 static U8 *
13815 S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
13816 {
13817     SV *filter = filter_add(S_utf16_textfilter, NULL);
13818
13819     IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
13820     sv_setpvs(filter, "");
13821     IoLINES(filter) = reversed;
13822     IoPAGE(filter) = 1; /* Not EOF */
13823
13824     /* Sadly, we have to return a valid pointer, come what may, so we have to
13825        ignore any error return from this.  */
13826     SvCUR_set(PL_linestr, 0);
13827     if (FILTER_READ(0, PL_linestr, 0)) {
13828         SvUTF8_on(PL_linestr);
13829     } else {
13830         SvUTF8_on(PL_linestr);
13831     }
13832     PL_bufend = SvEND(PL_linestr);
13833     return (U8*)SvPVX(PL_linestr);
13834 }
13835 #endif
13836
13837 /*
13838 Returns a pointer to the next character after the parsed
13839 vstring, as well as updating the passed in sv.
13840
13841 Function must be called like
13842
13843         sv = newSV(5);
13844         s = scan_vstring(s,e,sv);
13845
13846 where s and e are the start and end of the string.
13847 The sv should already be large enough to store the vstring
13848 passed in, for performance reasons.
13849
13850 */
13851
13852 char *
13853 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
13854 {
13855     dVAR;
13856     const char *pos = s;
13857     const char *start = s;
13858
13859     PERL_ARGS_ASSERT_SCAN_VSTRING;
13860
13861     if (*pos == 'v') pos++;  /* get past 'v' */
13862     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13863         pos++;
13864     if ( *pos != '.') {
13865         /* this may not be a v-string if followed by => */
13866         const char *next = pos;
13867         while (next < e && isSPACE(*next))
13868             ++next;
13869         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
13870             /* return string not v-string */
13871             sv_setpvn(sv,(char *)s,pos-s);
13872             return (char *)pos;
13873         }
13874     }
13875
13876     if (!isALPHA(*pos)) {
13877         U8 tmpbuf[UTF8_MAXBYTES+1];
13878
13879         if (*s == 'v')
13880             s++;  /* get past 'v' */
13881
13882         sv_setpvs(sv, "");
13883
13884         for (;;) {
13885             /* this is atoi() that tolerates underscores */
13886             U8 *tmpend;
13887             UV rev = 0;
13888             const char *end = pos;
13889             UV mult = 1;
13890             while (--end >= s) {
13891                 if (*end != '_') {
13892                     const UV orev = rev;
13893                     rev += (*end - '0') * mult;
13894                     mult *= 10;
13895                     if (orev > rev)
13896                         Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13897                                          "Integer overflow in decimal number");
13898                 }
13899             }
13900 #ifdef EBCDIC
13901             if (rev > 0x7FFFFFFF)
13902                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
13903 #endif
13904             /* Append native character for the rev point */
13905             tmpend = uvchr_to_utf8(tmpbuf, rev);
13906             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
13907             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
13908                  SvUTF8_on(sv);
13909             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
13910                  s = ++pos;
13911             else {
13912                  s = pos;
13913                  break;
13914             }
13915             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13916                  pos++;
13917         }
13918         SvPOK_on(sv);
13919         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
13920         SvRMAGICAL_on(sv);
13921     }
13922     return (char *)s;
13923 }
13924
13925 int
13926 Perl_keyword_plugin_standard(pTHX_
13927         char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
13928 {
13929     PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
13930     PERL_UNUSED_CONTEXT;
13931     PERL_UNUSED_ARG(keyword_ptr);
13932     PERL_UNUSED_ARG(keyword_len);
13933     PERL_UNUSED_ARG(op_ptr);
13934     return KEYWORD_PLUGIN_DECLINE;
13935 }
13936
13937 /*
13938  * Local variables:
13939  * c-indentation-style: bsd
13940  * c-basic-offset: 4
13941  * indent-tabs-mode: t
13942  * End:
13943  *
13944  * ex: set ts=8 sts=4 sw=4 noet:
13945  */