PATCH: [perl #56444] delayed interpolation of \N{...}
[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     char *bufptr;
942     PERL_ARGS_ASSERT_LEX_STUFF_PVN;
943     if (flags & ~(LEX_STUFF_UTF8))
944         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_pvn");
945     if (UTF) {
946         if (flags & LEX_STUFF_UTF8) {
947             goto plain_copy;
948         } else {
949             STRLEN highhalf = 0;
950             char *p, *e = pv+len;
951             for (p = pv; p != e; p++)
952                 highhalf += !!(((U8)*p) & 0x80);
953             if (!highhalf)
954                 goto plain_copy;
955             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len+highhalf);
956             bufptr = PL_parser->bufptr;
957             Move(bufptr, bufptr+len+highhalf, PL_parser->bufend+1-bufptr, char);
958             PL_parser->bufend += len+highhalf;
959             for (p = pv; p != e; p++) {
960                 U8 c = (U8)*p;
961                 if (c & 0x80) {
962                     *bufptr++ = (char)(0xc0 | (c >> 6));
963                     *bufptr++ = (char)(0x80 | (c & 0x3f));
964                 } else {
965                     *bufptr++ = (char)c;
966                 }
967             }
968         }
969     } else {
970         if (flags & LEX_STUFF_UTF8) {
971             STRLEN highhalf = 0;
972             char *p, *e = pv+len;
973             for (p = pv; p != e; p++) {
974                 U8 c = (U8)*p;
975                 if (c >= 0xc4) {
976                     Perl_croak(aTHX_ "Lexing code attempted to stuff "
977                                 "non-Latin-1 character into Latin-1 input");
978                 } else if (c >= 0xc2 && p+1 != e &&
979                             (((U8)p[1]) & 0xc0) == 0x80) {
980                     p++;
981                     highhalf++;
982                 } else if (c >= 0x80) {
983                     /* malformed UTF-8 */
984                     ENTER;
985                     SAVESPTR(PL_warnhook);
986                     PL_warnhook = PERL_WARNHOOK_FATAL;
987                     utf8n_to_uvuni((U8*)p, e-p, NULL, 0);
988                     LEAVE;
989                 }
990             }
991             if (!highhalf)
992                 goto plain_copy;
993             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len-highhalf);
994             bufptr = PL_parser->bufptr;
995             Move(bufptr, bufptr+len-highhalf, PL_parser->bufend+1-bufptr, char);
996             PL_parser->bufend += len-highhalf;
997             for (p = pv; p != e; p++) {
998                 U8 c = (U8)*p;
999                 if (c & 0x80) {
1000                     *bufptr++ = (char)(((c & 0x3) << 6) | (p[1] & 0x3f));
1001                     p++;
1002                 } else {
1003                     *bufptr++ = (char)c;
1004                 }
1005             }
1006         } else {
1007             plain_copy:
1008             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len);
1009             bufptr = PL_parser->bufptr;
1010             Move(bufptr, bufptr+len, PL_parser->bufend+1-bufptr, char);
1011             PL_parser->bufend += len;
1012             Copy(pv, bufptr, len, char);
1013         }
1014     }
1015 }
1016
1017 /*
1018 =for apidoc Amx|void|lex_stuff_sv|SV *sv|U32 flags
1019
1020 Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
1021 immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
1022 reallocating the buffer if necessary.  This means that lexing code that
1023 runs later will see the characters as if they had appeared in the input.
1024 It is not recommended to do this as part of normal parsing, and most
1025 uses of this facility run the risk of the inserted characters being
1026 interpreted in an unintended manner.
1027
1028 The string to be inserted is the string value of I<sv>.  The characters
1029 are recoded for the lexer buffer, according to how the buffer is currently
1030 being interpreted (L</lex_bufutf8>).  If a string to be interpreted is
1031 not already a Perl scalar, the L</lex_stuff_pvn> function avoids the
1032 need to construct a scalar.
1033
1034 =cut
1035 */
1036
1037 void
1038 Perl_lex_stuff_sv(pTHX_ SV *sv, U32 flags)
1039 {
1040     char *pv;
1041     STRLEN len;
1042     PERL_ARGS_ASSERT_LEX_STUFF_SV;
1043     if (flags)
1044         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_sv");
1045     pv = SvPV(sv, len);
1046     lex_stuff_pvn(pv, len, flags | (SvUTF8(sv) ? LEX_STUFF_UTF8 : 0));
1047 }
1048
1049 /*
1050 =for apidoc Amx|void|lex_unstuff|char *ptr
1051
1052 Discards text about to be lexed, from L</PL_parser-E<gt>bufptr> up to
1053 I<ptr>.  Text following I<ptr> will be moved, and the buffer shortened.
1054 This hides the discarded text from any lexing code that runs later,
1055 as if the text had never appeared.
1056
1057 This is not the normal way to consume lexed text.  For that, use
1058 L</lex_read_to>.
1059
1060 =cut
1061 */
1062
1063 void
1064 Perl_lex_unstuff(pTHX_ char *ptr)
1065 {
1066     char *buf, *bufend;
1067     STRLEN unstuff_len;
1068     PERL_ARGS_ASSERT_LEX_UNSTUFF;
1069     buf = PL_parser->bufptr;
1070     if (ptr < buf)
1071         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1072     if (ptr == buf)
1073         return;
1074     bufend = PL_parser->bufend;
1075     if (ptr > bufend)
1076         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1077     unstuff_len = ptr - buf;
1078     Move(ptr, buf, bufend+1-ptr, char);
1079     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - unstuff_len);
1080     PL_parser->bufend = bufend - unstuff_len;
1081 }
1082
1083 /*
1084 =for apidoc Amx|void|lex_read_to|char *ptr
1085
1086 Consume text in the lexer buffer, from L</PL_parser-E<gt>bufptr> up
1087 to I<ptr>.  This advances L</PL_parser-E<gt>bufptr> to match I<ptr>,
1088 performing the correct bookkeeping whenever a newline character is passed.
1089 This is the normal way to consume lexed text.
1090
1091 Interpretation of the buffer's octets can be abstracted out by
1092 using the slightly higher-level functions L</lex_peek_unichar> and
1093 L</lex_read_unichar>.
1094
1095 =cut
1096 */
1097
1098 void
1099 Perl_lex_read_to(pTHX_ char *ptr)
1100 {
1101     char *s;
1102     PERL_ARGS_ASSERT_LEX_READ_TO;
1103     s = PL_parser->bufptr;
1104     if (ptr < s || ptr > PL_parser->bufend)
1105         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_to");
1106     for (; s != ptr; s++)
1107         if (*s == '\n') {
1108             CopLINE_inc(PL_curcop);
1109             PL_parser->linestart = s+1;
1110         }
1111     PL_parser->bufptr = ptr;
1112 }
1113
1114 /*
1115 =for apidoc Amx|void|lex_discard_to|char *ptr
1116
1117 Discards the first part of the L</PL_parser-E<gt>linestr> buffer,
1118 up to I<ptr>.  The remaining content of the buffer will be moved, and
1119 all pointers into the buffer updated appropriately.  I<ptr> must not
1120 be later in the buffer than the position of L</PL_parser-E<gt>bufptr>:
1121 it is not permitted to discard text that has yet to be lexed.
1122
1123 Normally it is not necessarily to do this directly, because it suffices to
1124 use the implicit discarding behaviour of L</lex_next_chunk> and things
1125 based on it.  However, if a token stretches across multiple lines,
1126 and the lexing code has kept multiple lines of text in the buffer fof
1127 that purpose, then after completion of the token it would be wise to
1128 explicitly discard the now-unneeded earlier lines, to avoid future
1129 multi-line tokens growing the buffer without bound.
1130
1131 =cut
1132 */
1133
1134 void
1135 Perl_lex_discard_to(pTHX_ char *ptr)
1136 {
1137     char *buf;
1138     STRLEN discard_len;
1139     PERL_ARGS_ASSERT_LEX_DISCARD_TO;
1140     buf = SvPVX(PL_parser->linestr);
1141     if (ptr < buf)
1142         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1143     if (ptr == buf)
1144         return;
1145     if (ptr > PL_parser->bufptr)
1146         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1147     discard_len = ptr - buf;
1148     if (PL_parser->oldbufptr < ptr)
1149         PL_parser->oldbufptr = ptr;
1150     if (PL_parser->oldoldbufptr < ptr)
1151         PL_parser->oldoldbufptr = ptr;
1152     if (PL_parser->last_uni && PL_parser->last_uni < ptr)
1153         PL_parser->last_uni = NULL;
1154     if (PL_parser->last_lop && PL_parser->last_lop < ptr)
1155         PL_parser->last_lop = NULL;
1156     Move(ptr, buf, PL_parser->bufend+1-ptr, char);
1157     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - discard_len);
1158     PL_parser->bufend -= discard_len;
1159     PL_parser->bufptr -= discard_len;
1160     PL_parser->oldbufptr -= discard_len;
1161     PL_parser->oldoldbufptr -= discard_len;
1162     if (PL_parser->last_uni)
1163         PL_parser->last_uni -= discard_len;
1164     if (PL_parser->last_lop)
1165         PL_parser->last_lop -= discard_len;
1166 }
1167
1168 /*
1169 =for apidoc Amx|bool|lex_next_chunk|U32 flags
1170
1171 Reads in the next chunk of text to be lexed, appending it to
1172 L</PL_parser-E<gt>linestr>.  This should be called when lexing code has
1173 looked to the end of the current chunk and wants to know more.  It is
1174 usual, but not necessary, for lexing to have consumed the entirety of
1175 the current chunk at this time.
1176
1177 If L</PL_parser-E<gt>bufptr> is pointing to the very end of the current
1178 chunk (i.e., the current chunk has been entirely consumed), normally the
1179 current chunk will be discarded at the same time that the new chunk is
1180 read in.  If I<flags> includes C<LEX_KEEP_PREVIOUS>, the current chunk
1181 will not be discarded.  If the current chunk has not been entirely
1182 consumed, then it will not be discarded regardless of the flag.
1183
1184 Returns true if some new text was added to the buffer, or false if the
1185 buffer has reached the end of the input text.
1186
1187 =cut
1188 */
1189
1190 #define LEX_FAKE_EOF 0x80000000
1191
1192 bool
1193 Perl_lex_next_chunk(pTHX_ U32 flags)
1194 {
1195     SV *linestr;
1196     char *buf;
1197     STRLEN old_bufend_pos, new_bufend_pos;
1198     STRLEN bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
1199     STRLEN linestart_pos, last_uni_pos, last_lop_pos;
1200     bool got_some_for_debugger = 0;
1201     bool got_some;
1202     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_FAKE_EOF))
1203         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_next_chunk");
1204     linestr = PL_parser->linestr;
1205     buf = SvPVX(linestr);
1206     if (!(flags & LEX_KEEP_PREVIOUS) &&
1207             PL_parser->bufptr == PL_parser->bufend) {
1208         old_bufend_pos = bufptr_pos = oldbufptr_pos = oldoldbufptr_pos = 0;
1209         linestart_pos = 0;
1210         if (PL_parser->last_uni != PL_parser->bufend)
1211             PL_parser->last_uni = NULL;
1212         if (PL_parser->last_lop != PL_parser->bufend)
1213             PL_parser->last_lop = NULL;
1214         last_uni_pos = last_lop_pos = 0;
1215         *buf = 0;
1216         SvCUR(linestr) = 0;
1217     } else {
1218         old_bufend_pos = PL_parser->bufend - buf;
1219         bufptr_pos = PL_parser->bufptr - buf;
1220         oldbufptr_pos = PL_parser->oldbufptr - buf;
1221         oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
1222         linestart_pos = PL_parser->linestart - buf;
1223         last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
1224         last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
1225     }
1226     if (flags & LEX_FAKE_EOF) {
1227         goto eof;
1228     } else if (!PL_parser->rsfp) {
1229         got_some = 0;
1230     } else if (filter_gets(linestr, old_bufend_pos)) {
1231         got_some = 1;
1232         got_some_for_debugger = 1;
1233     } else {
1234         if (!SvPOK(linestr))   /* can get undefined by filter_gets */
1235             sv_setpvs(linestr, "");
1236         eof:
1237         /* End of real input.  Close filehandle (unless it was STDIN),
1238          * then add implicit termination.
1239          */
1240         if ((PerlIO*)PL_parser->rsfp == PerlIO_stdin())
1241             PerlIO_clearerr(PL_parser->rsfp);
1242         else if (PL_parser->rsfp)
1243             (void)PerlIO_close(PL_parser->rsfp);
1244         PL_parser->rsfp = NULL;
1245         PL_doextract = FALSE;
1246 #ifdef PERL_MAD
1247         if (PL_madskills && !PL_in_eval && (PL_minus_p || PL_minus_n))
1248             PL_faketokens = 1;
1249 #endif
1250         if (!PL_in_eval && PL_minus_p) {
1251             sv_catpvs(linestr,
1252                 /*{*/";}continue{print or die qq(-p destination: $!\\n);}");
1253             PL_minus_n = PL_minus_p = 0;
1254         } else if (!PL_in_eval && PL_minus_n) {
1255             sv_catpvs(linestr, /*{*/";}");
1256             PL_minus_n = 0;
1257         } else
1258             sv_catpvs(linestr, ";");
1259         got_some = 1;
1260     }
1261     buf = SvPVX(linestr);
1262     new_bufend_pos = SvCUR(linestr);
1263     PL_parser->bufend = buf + new_bufend_pos;
1264     PL_parser->bufptr = buf + bufptr_pos;
1265     PL_parser->oldbufptr = buf + oldbufptr_pos;
1266     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
1267     PL_parser->linestart = buf + linestart_pos;
1268     if (PL_parser->last_uni)
1269         PL_parser->last_uni = buf + last_uni_pos;
1270     if (PL_parser->last_lop)
1271         PL_parser->last_lop = buf + last_lop_pos;
1272     if (got_some_for_debugger && (PERLDB_LINE || PERLDB_SAVESRC) &&
1273             PL_curstash != PL_debstash) {
1274         /* debugger active and we're not compiling the debugger code,
1275          * so store the line into the debugger's array of lines
1276          */
1277         update_debugger_info(NULL, buf+old_bufend_pos,
1278             new_bufend_pos-old_bufend_pos);
1279     }
1280     return got_some;
1281 }
1282
1283 /*
1284 =for apidoc Amx|I32|lex_peek_unichar|U32 flags
1285
1286 Looks ahead one (Unicode) character in the text currently being lexed.
1287 Returns the codepoint (unsigned integer value) of the next character,
1288 or -1 if lexing has reached the end of the input text.  To consume the
1289 peeked character, use L</lex_read_unichar>.
1290
1291 If the next character is in (or extends into) the next chunk of input
1292 text, the next chunk will be read in.  Normally the current chunk will be
1293 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1294 then the current chunk will not be discarded.
1295
1296 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1297 is encountered, an exception is generated.
1298
1299 =cut
1300 */
1301
1302 I32
1303 Perl_lex_peek_unichar(pTHX_ U32 flags)
1304 {
1305     char *s, *bufend;
1306     if (flags & ~(LEX_KEEP_PREVIOUS))
1307         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_peek_unichar");
1308     s = PL_parser->bufptr;
1309     bufend = PL_parser->bufend;
1310     if (UTF) {
1311         U8 head;
1312         I32 unichar;
1313         STRLEN len, retlen;
1314         if (s == bufend) {
1315             if (!lex_next_chunk(flags))
1316                 return -1;
1317             s = PL_parser->bufptr;
1318             bufend = PL_parser->bufend;
1319         }
1320         head = (U8)*s;
1321         if (!(head & 0x80))
1322             return head;
1323         if (head & 0x40) {
1324             len = PL_utf8skip[head];
1325             while ((STRLEN)(bufend-s) < len) {
1326                 if (!lex_next_chunk(flags | LEX_KEEP_PREVIOUS))
1327                     break;
1328                 s = PL_parser->bufptr;
1329                 bufend = PL_parser->bufend;
1330             }
1331         }
1332         unichar = utf8n_to_uvuni((U8*)s, bufend-s, &retlen, UTF8_CHECK_ONLY);
1333         if (retlen == (STRLEN)-1) {
1334             /* malformed UTF-8 */
1335             ENTER;
1336             SAVESPTR(PL_warnhook);
1337             PL_warnhook = PERL_WARNHOOK_FATAL;
1338             utf8n_to_uvuni((U8*)s, bufend-s, NULL, 0);
1339             LEAVE;
1340         }
1341         return unichar;
1342     } else {
1343         if (s == bufend) {
1344             if (!lex_next_chunk(flags))
1345                 return -1;
1346             s = PL_parser->bufptr;
1347         }
1348         return (U8)*s;
1349     }
1350 }
1351
1352 /*
1353 =for apidoc Amx|I32|lex_read_unichar|U32 flags
1354
1355 Reads the next (Unicode) character in the text currently being lexed.
1356 Returns the codepoint (unsigned integer value) of the character read,
1357 and moves L</PL_parser-E<gt>bufptr> past the character, or returns -1
1358 if lexing has reached the end of the input text.  To non-destructively
1359 examine the next character, use L</lex_peek_unichar> instead.
1360
1361 If the next character is in (or extends into) the next chunk of input
1362 text, the next chunk will be read in.  Normally the current chunk will be
1363 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1364 then the current chunk will not be discarded.
1365
1366 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1367 is encountered, an exception is generated.
1368
1369 =cut
1370 */
1371
1372 I32
1373 Perl_lex_read_unichar(pTHX_ U32 flags)
1374 {
1375     I32 c;
1376     if (flags & ~(LEX_KEEP_PREVIOUS))
1377         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_unichar");
1378     c = lex_peek_unichar(flags);
1379     if (c != -1) {
1380         if (c == '\n')
1381             CopLINE_inc(PL_curcop);
1382         PL_parser->bufptr += UTF8SKIP(PL_parser->bufptr);
1383     }
1384     return c;
1385 }
1386
1387 /*
1388 =for apidoc Amx|void|lex_read_space|U32 flags
1389
1390 Reads optional spaces, in Perl style, in the text currently being
1391 lexed.  The spaces may include ordinary whitespace characters and
1392 Perl-style comments.  C<#line> directives are processed if encountered.
1393 L</PL_parser-E<gt>bufptr> is moved past the spaces, so that it points
1394 at a non-space character (or the end of the input text).
1395
1396 If spaces extend into the next chunk of input text, the next chunk will
1397 be read in.  Normally the current chunk will be discarded at the same
1398 time, but if I<flags> includes C<LEX_KEEP_PREVIOUS> then the current
1399 chunk will not be discarded.
1400
1401 =cut
1402 */
1403
1404 #define LEX_NO_NEXT_CHUNK 0x80000000
1405
1406 void
1407 Perl_lex_read_space(pTHX_ U32 flags)
1408 {
1409     char *s, *bufend;
1410     bool need_incline = 0;
1411     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK))
1412         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space");
1413 #ifdef PERL_MAD
1414     if (PL_skipwhite) {
1415         sv_free(PL_skipwhite);
1416         PL_skipwhite = NULL;
1417     }
1418     if (PL_madskills)
1419         PL_skipwhite = newSVpvs("");
1420 #endif /* PERL_MAD */
1421     s = PL_parser->bufptr;
1422     bufend = PL_parser->bufend;
1423     while (1) {
1424         char c = *s;
1425         if (c == '#') {
1426             do {
1427                 c = *++s;
1428             } while (!(c == '\n' || (c == 0 && s == bufend)));
1429         } else if (c == '\n') {
1430             s++;
1431             PL_parser->linestart = s;
1432             if (s == bufend)
1433                 need_incline = 1;
1434             else
1435                 incline(s);
1436         } else if (isSPACE(c)) {
1437             s++;
1438         } else if (c == 0 && s == bufend) {
1439             bool got_more;
1440 #ifdef PERL_MAD
1441             if (PL_madskills)
1442                 sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1443 #endif /* PERL_MAD */
1444             if (flags & LEX_NO_NEXT_CHUNK)
1445                 break;
1446             PL_parser->bufptr = s;
1447             CopLINE_inc(PL_curcop);
1448             got_more = lex_next_chunk(flags);
1449             CopLINE_dec(PL_curcop);
1450             s = PL_parser->bufptr;
1451             bufend = PL_parser->bufend;
1452             if (!got_more)
1453                 break;
1454             if (need_incline && PL_parser->rsfp) {
1455                 incline(s);
1456                 need_incline = 0;
1457             }
1458         } else {
1459             break;
1460         }
1461     }
1462 #ifdef PERL_MAD
1463     if (PL_madskills)
1464         sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1465 #endif /* PERL_MAD */
1466     PL_parser->bufptr = s;
1467 }
1468
1469 /*
1470  * S_incline
1471  * This subroutine has nothing to do with tilting, whether at windmills
1472  * or pinball tables.  Its name is short for "increment line".  It
1473  * increments the current line number in CopLINE(PL_curcop) and checks
1474  * to see whether the line starts with a comment of the form
1475  *    # line 500 "foo.pm"
1476  * If so, it sets the current line number and file to the values in the comment.
1477  */
1478
1479 STATIC void
1480 S_incline(pTHX_ const char *s)
1481 {
1482     dVAR;
1483     const char *t;
1484     const char *n;
1485     const char *e;
1486
1487     PERL_ARGS_ASSERT_INCLINE;
1488
1489     CopLINE_inc(PL_curcop);
1490     if (*s++ != '#')
1491         return;
1492     while (SPACE_OR_TAB(*s))
1493         s++;
1494     if (strnEQ(s, "line", 4))
1495         s += 4;
1496     else
1497         return;
1498     if (SPACE_OR_TAB(*s))
1499         s++;
1500     else
1501         return;
1502     while (SPACE_OR_TAB(*s))
1503         s++;
1504     if (!isDIGIT(*s))
1505         return;
1506
1507     n = s;
1508     while (isDIGIT(*s))
1509         s++;
1510     if (!SPACE_OR_TAB(*s) && *s != '\r' && *s != '\n' && *s != '\0')
1511         return;
1512     while (SPACE_OR_TAB(*s))
1513         s++;
1514     if (*s == '"' && (t = strchr(s+1, '"'))) {
1515         s++;
1516         e = t + 1;
1517     }
1518     else {
1519         t = s;
1520         while (!isSPACE(*t))
1521             t++;
1522         e = t;
1523     }
1524     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
1525         e++;
1526     if (*e != '\n' && *e != '\0')
1527         return;         /* false alarm */
1528
1529     if (t - s > 0) {
1530         const STRLEN len = t - s;
1531 #ifndef USE_ITHREADS
1532         SV *const temp_sv = CopFILESV(PL_curcop);
1533         const char *cf;
1534         STRLEN tmplen;
1535
1536         if (temp_sv) {
1537             cf = SvPVX(temp_sv);
1538             tmplen = SvCUR(temp_sv);
1539         } else {
1540             cf = NULL;
1541             tmplen = 0;
1542         }
1543
1544         if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
1545             /* must copy *{"::_<(eval N)[oldfilename:L]"}
1546              * to *{"::_<newfilename"} */
1547             /* However, the long form of evals is only turned on by the
1548                debugger - usually they're "(eval %lu)" */
1549             char smallbuf[128];
1550             char *tmpbuf;
1551             GV **gvp;
1552             STRLEN tmplen2 = len;
1553             if (tmplen + 2 <= sizeof smallbuf)
1554                 tmpbuf = smallbuf;
1555             else
1556                 Newx(tmpbuf, tmplen + 2, char);
1557             tmpbuf[0] = '_';
1558             tmpbuf[1] = '<';
1559             memcpy(tmpbuf + 2, cf, tmplen);
1560             tmplen += 2;
1561             gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
1562             if (gvp) {
1563                 char *tmpbuf2;
1564                 GV *gv2;
1565
1566                 if (tmplen2 + 2 <= sizeof smallbuf)
1567                     tmpbuf2 = smallbuf;
1568                 else
1569                     Newx(tmpbuf2, tmplen2 + 2, char);
1570
1571                 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
1572                     /* Either they malloc'd it, or we malloc'd it,
1573                        so no prefix is present in ours.  */
1574                     tmpbuf2[0] = '_';
1575                     tmpbuf2[1] = '<';
1576                 }
1577
1578                 memcpy(tmpbuf2 + 2, s, tmplen2);
1579                 tmplen2 += 2;
1580
1581                 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
1582                 if (!isGV(gv2)) {
1583                     gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
1584                     /* adjust ${"::_<newfilename"} to store the new file name */
1585                     GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
1586                     GvHV(gv2) = MUTABLE_HV(SvREFCNT_inc(GvHV(*gvp)));
1587                     GvAV(gv2) = MUTABLE_AV(SvREFCNT_inc(GvAV(*gvp)));
1588                 }
1589
1590                 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
1591             }
1592             if (tmpbuf != smallbuf) Safefree(tmpbuf);
1593         }
1594 #endif
1595         CopFILE_free(PL_curcop);
1596         CopFILE_setn(PL_curcop, s, len);
1597     }
1598     CopLINE_set(PL_curcop, atoi(n)-1);
1599 }
1600
1601 #ifdef PERL_MAD
1602 /* skip space before PL_thistoken */
1603
1604 STATIC char *
1605 S_skipspace0(pTHX_ register char *s)
1606 {
1607     PERL_ARGS_ASSERT_SKIPSPACE0;
1608
1609     s = skipspace(s);
1610     if (!PL_madskills)
1611         return s;
1612     if (PL_skipwhite) {
1613         if (!PL_thiswhite)
1614             PL_thiswhite = newSVpvs("");
1615         sv_catsv(PL_thiswhite, PL_skipwhite);
1616         sv_free(PL_skipwhite);
1617         PL_skipwhite = 0;
1618     }
1619     PL_realtokenstart = s - SvPVX(PL_linestr);
1620     return s;
1621 }
1622
1623 /* skip space after PL_thistoken */
1624
1625 STATIC char *
1626 S_skipspace1(pTHX_ register char *s)
1627 {
1628     const char *start = s;
1629     I32 startoff = start - SvPVX(PL_linestr);
1630
1631     PERL_ARGS_ASSERT_SKIPSPACE1;
1632
1633     s = skipspace(s);
1634     if (!PL_madskills)
1635         return s;
1636     start = SvPVX(PL_linestr) + startoff;
1637     if (!PL_thistoken && PL_realtokenstart >= 0) {
1638         const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1639         PL_thistoken = newSVpvn(tstart, start - tstart);
1640     }
1641     PL_realtokenstart = -1;
1642     if (PL_skipwhite) {
1643         if (!PL_nextwhite)
1644             PL_nextwhite = newSVpvs("");
1645         sv_catsv(PL_nextwhite, PL_skipwhite);
1646         sv_free(PL_skipwhite);
1647         PL_skipwhite = 0;
1648     }
1649     return s;
1650 }
1651
1652 STATIC char *
1653 S_skipspace2(pTHX_ register char *s, SV **svp)
1654 {
1655     char *start;
1656     const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
1657     const I32 startoff = s - SvPVX(PL_linestr);
1658
1659     PERL_ARGS_ASSERT_SKIPSPACE2;
1660
1661     s = skipspace(s);
1662     PL_bufptr = SvPVX(PL_linestr) + bufptroff;
1663     if (!PL_madskills || !svp)
1664         return s;
1665     start = SvPVX(PL_linestr) + startoff;
1666     if (!PL_thistoken && PL_realtokenstart >= 0) {
1667         char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1668         PL_thistoken = newSVpvn(tstart, start - tstart);
1669         PL_realtokenstart = -1;
1670     }
1671     if (PL_skipwhite) {
1672         if (!*svp)
1673             *svp = newSVpvs("");
1674         sv_setsv(*svp, PL_skipwhite);
1675         sv_free(PL_skipwhite);
1676         PL_skipwhite = 0;
1677     }
1678     
1679     return s;
1680 }
1681 #endif
1682
1683 STATIC void
1684 S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
1685 {
1686     AV *av = CopFILEAVx(PL_curcop);
1687     if (av) {
1688         SV * const sv = newSV_type(SVt_PVMG);
1689         if (orig_sv)
1690             sv_setsv(sv, orig_sv);
1691         else
1692             sv_setpvn(sv, buf, len);
1693         (void)SvIOK_on(sv);
1694         SvIV_set(sv, 0);
1695         av_store(av, (I32)CopLINE(PL_curcop), sv);
1696     }
1697 }
1698
1699 /*
1700  * S_skipspace
1701  * Called to gobble the appropriate amount and type of whitespace.
1702  * Skips comments as well.
1703  */
1704
1705 STATIC char *
1706 S_skipspace(pTHX_ register char *s)
1707 {
1708 #ifdef PERL_MAD
1709     char *start = s;
1710 #endif /* PERL_MAD */
1711     PERL_ARGS_ASSERT_SKIPSPACE;
1712 #ifdef PERL_MAD
1713     if (PL_skipwhite) {
1714         sv_free(PL_skipwhite);
1715         PL_skipwhite = NULL;
1716     }
1717 #endif /* PERL_MAD */
1718     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
1719         while (s < PL_bufend && SPACE_OR_TAB(*s))
1720             s++;
1721     } else {
1722         STRLEN bufptr_pos = PL_bufptr - SvPVX(PL_linestr);
1723         PL_bufptr = s;
1724         lex_read_space(LEX_KEEP_PREVIOUS |
1725                 (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE ?
1726                     LEX_NO_NEXT_CHUNK : 0));
1727         s = PL_bufptr;
1728         PL_bufptr = SvPVX(PL_linestr) + bufptr_pos;
1729         if (PL_linestart > PL_bufptr)
1730             PL_bufptr = PL_linestart;
1731         return s;
1732     }
1733 #ifdef PERL_MAD
1734     if (PL_madskills)
1735         PL_skipwhite = newSVpvn(start, s-start);
1736 #endif /* PERL_MAD */
1737     return s;
1738 }
1739
1740 /*
1741  * S_check_uni
1742  * Check the unary operators to ensure there's no ambiguity in how they're
1743  * used.  An ambiguous piece of code would be:
1744  *     rand + 5
1745  * This doesn't mean rand() + 5.  Because rand() is a unary operator,
1746  * the +5 is its argument.
1747  */
1748
1749 STATIC void
1750 S_check_uni(pTHX)
1751 {
1752     dVAR;
1753     const char *s;
1754     const char *t;
1755
1756     if (PL_oldoldbufptr != PL_last_uni)
1757         return;
1758     while (isSPACE(*PL_last_uni))
1759         PL_last_uni++;
1760     s = PL_last_uni;
1761     while (isALNUM_lazy_if(s,UTF) || *s == '-')
1762         s++;
1763     if ((t = strchr(s, '(')) && t < PL_bufptr)
1764         return;
1765
1766     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
1767                      "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1768                      (int)(s - PL_last_uni), PL_last_uni);
1769 }
1770
1771 /*
1772  * LOP : macro to build a list operator.  Its behaviour has been replaced
1773  * with a subroutine, S_lop() for which LOP is just another name.
1774  */
1775
1776 #define LOP(f,x) return lop(f,x,s)
1777
1778 /*
1779  * S_lop
1780  * Build a list operator (or something that might be one).  The rules:
1781  *  - if we have a next token, then it's a list operator [why?]
1782  *  - if the next thing is an opening paren, then it's a function
1783  *  - else it's a list operator
1784  */
1785
1786 STATIC I32
1787 S_lop(pTHX_ I32 f, int x, char *s)
1788 {
1789     dVAR;
1790
1791     PERL_ARGS_ASSERT_LOP;
1792
1793     pl_yylval.ival = f;
1794     CLINE;
1795     PL_expect = x;
1796     PL_bufptr = s;
1797     PL_last_lop = PL_oldbufptr;
1798     PL_last_lop_op = (OPCODE)f;
1799 #ifdef PERL_MAD
1800     if (PL_lasttoke)
1801         return REPORT(LSTOP);
1802 #else
1803     if (PL_nexttoke)
1804         return REPORT(LSTOP);
1805 #endif
1806     if (*s == '(')
1807         return REPORT(FUNC);
1808     s = PEEKSPACE(s);
1809     if (*s == '(')
1810         return REPORT(FUNC);
1811     else
1812         return REPORT(LSTOP);
1813 }
1814
1815 #ifdef PERL_MAD
1816  /*
1817  * S_start_force
1818  * Sets up for an eventual force_next().  start_force(0) basically does
1819  * an unshift, while start_force(-1) does a push.  yylex removes items
1820  * on the "pop" end.
1821  */
1822
1823 STATIC void
1824 S_start_force(pTHX_ int where)
1825 {
1826     int i;
1827
1828     if (where < 0)      /* so people can duplicate start_force(PL_curforce) */
1829         where = PL_lasttoke;
1830     assert(PL_curforce < 0 || PL_curforce == where);
1831     if (PL_curforce != where) {
1832         for (i = PL_lasttoke; i > where; --i) {
1833             PL_nexttoke[i] = PL_nexttoke[i-1];
1834         }
1835         PL_lasttoke++;
1836     }
1837     if (PL_curforce < 0)        /* in case of duplicate start_force() */
1838         Zero(&PL_nexttoke[where], 1, NEXTTOKE);
1839     PL_curforce = where;
1840     if (PL_nextwhite) {
1841         if (PL_madskills)
1842             curmad('^', newSVpvs(""));
1843         CURMAD('_', PL_nextwhite);
1844     }
1845 }
1846
1847 STATIC void
1848 S_curmad(pTHX_ char slot, SV *sv)
1849 {
1850     MADPROP **where;
1851
1852     if (!sv)
1853         return;
1854     if (PL_curforce < 0)
1855         where = &PL_thismad;
1856     else
1857         where = &PL_nexttoke[PL_curforce].next_mad;
1858
1859     if (PL_faketokens)
1860         sv_setpvs(sv, "");
1861     else {
1862         if (!IN_BYTES) {
1863             if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1864                 SvUTF8_on(sv);
1865             else if (PL_encoding) {
1866                 sv_recode_to_utf8(sv, PL_encoding);
1867             }
1868         }
1869     }
1870
1871     /* keep a slot open for the head of the list? */
1872     if (slot != '_' && *where && (*where)->mad_key == '^') {
1873         (*where)->mad_key = slot;
1874         sv_free(MUTABLE_SV(((*where)->mad_val)));
1875         (*where)->mad_val = (void*)sv;
1876     }
1877     else
1878         addmad(newMADsv(slot, sv), where, 0);
1879 }
1880 #else
1881 #  define start_force(where)    NOOP
1882 #  define curmad(slot, sv)      NOOP
1883 #endif
1884
1885 /*
1886  * S_force_next
1887  * When the lexer realizes it knows the next token (for instance,
1888  * it is reordering tokens for the parser) then it can call S_force_next
1889  * to know what token to return the next time the lexer is called.  Caller
1890  * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1891  * and possibly PL_expect to ensure the lexer handles the token correctly.
1892  */
1893
1894 STATIC void
1895 S_force_next(pTHX_ I32 type)
1896 {
1897     dVAR;
1898 #ifdef DEBUGGING
1899     if (DEBUG_T_TEST) {
1900         PerlIO_printf(Perl_debug_log, "### forced token:\n");
1901         tokereport(type, &NEXTVAL_NEXTTOKE);
1902     }
1903 #endif
1904 #ifdef PERL_MAD
1905     if (PL_curforce < 0)
1906         start_force(PL_lasttoke);
1907     PL_nexttoke[PL_curforce].next_type = type;
1908     if (PL_lex_state != LEX_KNOWNEXT)
1909         PL_lex_defer = PL_lex_state;
1910     PL_lex_state = LEX_KNOWNEXT;
1911     PL_lex_expect = PL_expect;
1912     PL_curforce = -1;
1913 #else
1914     PL_nexttype[PL_nexttoke] = type;
1915     PL_nexttoke++;
1916     if (PL_lex_state != LEX_KNOWNEXT) {
1917         PL_lex_defer = PL_lex_state;
1918         PL_lex_expect = PL_expect;
1919         PL_lex_state = LEX_KNOWNEXT;
1920     }
1921 #endif
1922 }
1923
1924 STATIC SV *
1925 S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
1926 {
1927     dVAR;
1928     SV * const sv = newSVpvn_utf8(start, len,
1929                                   !IN_BYTES
1930                                   && UTF
1931                                   && !is_ascii_string((const U8*)start, len)
1932                                   && is_utf8_string((const U8*)start, len));
1933     return sv;
1934 }
1935
1936 /*
1937  * S_force_word
1938  * When the lexer knows the next thing is a word (for instance, it has
1939  * just seen -> and it knows that the next char is a word char, then
1940  * it calls S_force_word to stick the next word into the PL_nexttoke/val
1941  * lookahead.
1942  *
1943  * Arguments:
1944  *   char *start : buffer position (must be within PL_linestr)
1945  *   int token   : PL_next* will be this type of bare word (e.g., METHOD,WORD)
1946  *   int check_keyword : if true, Perl checks to make sure the word isn't
1947  *       a keyword (do this if the word is a label, e.g. goto FOO)
1948  *   int allow_pack : if true, : characters will also be allowed (require,
1949  *       use, etc. do this)
1950  *   int allow_initial_tick : used by the "sub" lexer only.
1951  */
1952
1953 STATIC char *
1954 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
1955 {
1956     dVAR;
1957     register char *s;
1958     STRLEN len;
1959
1960     PERL_ARGS_ASSERT_FORCE_WORD;
1961
1962     start = SKIPSPACE1(start);
1963     s = start;
1964     if (isIDFIRST_lazy_if(s,UTF) ||
1965         (allow_pack && *s == ':') ||
1966         (allow_initial_tick && *s == '\'') )
1967     {
1968         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
1969         if (check_keyword && keyword(PL_tokenbuf, len, 0))
1970             return start;
1971         start_force(PL_curforce);
1972         if (PL_madskills)
1973             curmad('X', newSVpvn(start,s-start));
1974         if (token == METHOD) {
1975             s = SKIPSPACE1(s);
1976             if (*s == '(')
1977                 PL_expect = XTERM;
1978             else {
1979                 PL_expect = XOPERATOR;
1980             }
1981         }
1982         if (PL_madskills)
1983             curmad('g', newSVpvs( "forced" ));
1984         NEXTVAL_NEXTTOKE.opval
1985             = (OP*)newSVOP(OP_CONST,0,
1986                            S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
1987         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
1988         force_next(token);
1989     }
1990     return s;
1991 }
1992
1993 /*
1994  * S_force_ident
1995  * Called when the lexer wants $foo *foo &foo etc, but the program
1996  * text only contains the "foo" portion.  The first argument is a pointer
1997  * to the "foo", and the second argument is the type symbol to prefix.
1998  * Forces the next token to be a "WORD".
1999  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
2000  */
2001
2002 STATIC void
2003 S_force_ident(pTHX_ register const char *s, int kind)
2004 {
2005     dVAR;
2006
2007     PERL_ARGS_ASSERT_FORCE_IDENT;
2008
2009     if (*s) {
2010         const STRLEN len = strlen(s);
2011         OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
2012         start_force(PL_curforce);
2013         NEXTVAL_NEXTTOKE.opval = o;
2014         force_next(WORD);
2015         if (kind) {
2016             o->op_private = OPpCONST_ENTERED;
2017             /* XXX see note in pp_entereval() for why we forgo typo
2018                warnings if the symbol must be introduced in an eval.
2019                GSAR 96-10-12 */
2020             gv_fetchpvn_flags(s, len,
2021                               PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
2022                               : GV_ADD,
2023                               kind == '$' ? SVt_PV :
2024                               kind == '@' ? SVt_PVAV :
2025                               kind == '%' ? SVt_PVHV :
2026                               SVt_PVGV
2027                               );
2028         }
2029     }
2030 }
2031
2032 NV
2033 Perl_str_to_version(pTHX_ SV *sv)
2034 {
2035     NV retval = 0.0;
2036     NV nshift = 1.0;
2037     STRLEN len;
2038     const char *start = SvPV_const(sv,len);
2039     const char * const end = start + len;
2040     const bool utf = SvUTF8(sv) ? TRUE : FALSE;
2041
2042     PERL_ARGS_ASSERT_STR_TO_VERSION;
2043
2044     while (start < end) {
2045         STRLEN skip;
2046         UV n;
2047         if (utf)
2048             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
2049         else {
2050             n = *(U8*)start;
2051             skip = 1;
2052         }
2053         retval += ((NV)n)/nshift;
2054         start += skip;
2055         nshift *= 1000;
2056     }
2057     return retval;
2058 }
2059
2060 /*
2061  * S_force_version
2062  * Forces the next token to be a version number.
2063  * If the next token appears to be an invalid version number, (e.g. "v2b"),
2064  * and if "guessing" is TRUE, then no new token is created (and the caller
2065  * must use an alternative parsing method).
2066  */
2067
2068 STATIC char *
2069 S_force_version(pTHX_ char *s, int guessing)
2070 {
2071     dVAR;
2072     OP *version = NULL;
2073     char *d;
2074 #ifdef PERL_MAD
2075     I32 startoff = s - SvPVX(PL_linestr);
2076 #endif
2077
2078     PERL_ARGS_ASSERT_FORCE_VERSION;
2079
2080     s = SKIPSPACE1(s);
2081
2082     d = s;
2083     if (*d == 'v')
2084         d++;
2085     if (isDIGIT(*d)) {
2086         while (isDIGIT(*d) || *d == '_' || *d == '.')
2087             d++;
2088 #ifdef PERL_MAD
2089         if (PL_madskills) {
2090             start_force(PL_curforce);
2091             curmad('X', newSVpvn(s,d-s));
2092         }
2093 #endif
2094         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
2095             SV *ver;
2096 #ifdef USE_LOCALE_NUMERIC
2097             char *loc = setlocale(LC_NUMERIC, "C");
2098 #endif
2099             s = scan_num(s, &pl_yylval);
2100 #ifdef USE_LOCALE_NUMERIC
2101             setlocale(LC_NUMERIC, loc);
2102 #endif
2103             version = pl_yylval.opval;
2104             ver = cSVOPx(version)->op_sv;
2105             if (SvPOK(ver) && !SvNIOK(ver)) {
2106                 SvUPGRADE(ver, SVt_PVNV);
2107                 SvNV_set(ver, str_to_version(ver));
2108                 SvNOK_on(ver);          /* hint that it is a version */
2109             }
2110         }
2111         else if (guessing) {
2112 #ifdef PERL_MAD
2113             if (PL_madskills) {
2114                 sv_free(PL_nextwhite);  /* let next token collect whitespace */
2115                 PL_nextwhite = 0;
2116                 s = SvPVX(PL_linestr) + startoff;
2117             }
2118 #endif
2119             return s;
2120         }
2121     }
2122
2123 #ifdef PERL_MAD
2124     if (PL_madskills && !version) {
2125         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2126         PL_nextwhite = 0;
2127         s = SvPVX(PL_linestr) + startoff;
2128     }
2129 #endif
2130     /* NOTE: The parser sees the package name and the VERSION swapped */
2131     start_force(PL_curforce);
2132     NEXTVAL_NEXTTOKE.opval = version;
2133     force_next(WORD);
2134
2135     return s;
2136 }
2137
2138 /*
2139  * S_force_strict_version
2140  * Forces the next token to be a version number using strict syntax rules.
2141  */
2142
2143 STATIC char *
2144 S_force_strict_version(pTHX_ char *s)
2145 {
2146     dVAR;
2147     OP *version = NULL;
2148 #ifdef PERL_MAD
2149     I32 startoff = s - SvPVX(PL_linestr);
2150 #endif
2151     const char *errstr = NULL;
2152
2153     PERL_ARGS_ASSERT_FORCE_STRICT_VERSION;
2154
2155     while (isSPACE(*s)) /* leading whitespace */
2156         s++;
2157
2158     if (is_STRICT_VERSION(s,&errstr)) {
2159         SV *ver = newSV(0);
2160         s = (char *)scan_version(s, ver, 0);
2161         version = newSVOP(OP_CONST, 0, ver);
2162     }
2163     else if ( (*s != ';' && *s != '}' ) && (s = SKIPSPACE1(s), (*s != ';' && *s !='}' ))) {
2164         PL_bufptr = s;
2165         if (errstr)
2166             yyerror(errstr); /* version required */
2167         return s;
2168     }
2169
2170 #ifdef PERL_MAD
2171     if (PL_madskills && !version) {
2172         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2173         PL_nextwhite = 0;
2174         s = SvPVX(PL_linestr) + startoff;
2175     }
2176 #endif
2177     /* NOTE: The parser sees the package name and the VERSION swapped */
2178     start_force(PL_curforce);
2179     NEXTVAL_NEXTTOKE.opval = version;
2180     force_next(WORD);
2181
2182     return s;
2183 }
2184
2185 /*
2186  * S_tokeq
2187  * Tokenize a quoted string passed in as an SV.  It finds the next
2188  * chunk, up to end of string or a backslash.  It may make a new
2189  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
2190  * turns \\ into \.
2191  */
2192
2193 STATIC SV *
2194 S_tokeq(pTHX_ SV *sv)
2195 {
2196     dVAR;
2197     register char *s;
2198     register char *send;
2199     register char *d;
2200     STRLEN len = 0;
2201     SV *pv = sv;
2202
2203     PERL_ARGS_ASSERT_TOKEQ;
2204
2205     if (!SvLEN(sv))
2206         goto finish;
2207
2208     s = SvPV_force(sv, len);
2209     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
2210         goto finish;
2211     send = s + len;
2212     while (s < send && *s != '\\')
2213         s++;
2214     if (s == send)
2215         goto finish;
2216     d = s;
2217     if ( PL_hints & HINT_NEW_STRING ) {
2218         pv = newSVpvn_flags(SvPVX_const(pv), len, SVs_TEMP | SvUTF8(sv));
2219     }
2220     while (s < send) {
2221         if (*s == '\\') {
2222             if (s + 1 < send && (s[1] == '\\'))
2223                 s++;            /* all that, just for this */
2224         }
2225         *d++ = *s++;
2226     }
2227     *d = '\0';
2228     SvCUR_set(sv, d - SvPVX_const(sv));
2229   finish:
2230     if ( PL_hints & HINT_NEW_STRING )
2231        return new_constant(NULL, 0, "q", sv, pv, "q", 1);
2232     return sv;
2233 }
2234
2235 /*
2236  * Now come three functions related to double-quote context,
2237  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
2238  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
2239  * interact with PL_lex_state, and create fake ( ... ) argument lists
2240  * to handle functions and concatenation.
2241  * They assume that whoever calls them will be setting up a fake
2242  * join call, because each subthing puts a ',' after it.  This lets
2243  *   "lower \luPpEr"
2244  * become
2245  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
2246  *
2247  * (I'm not sure whether the spurious commas at the end of lcfirst's
2248  * arguments and join's arguments are created or not).
2249  */
2250
2251 /*
2252  * S_sublex_start
2253  * Assumes that pl_yylval.ival is the op we're creating (e.g. OP_LCFIRST).
2254  *
2255  * Pattern matching will set PL_lex_op to the pattern-matching op to
2256  * make (we return THING if pl_yylval.ival is OP_NULL, PMFUNC otherwise).
2257  *
2258  * OP_CONST and OP_READLINE are easy--just make the new op and return.
2259  *
2260  * Everything else becomes a FUNC.
2261  *
2262  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
2263  * had an OP_CONST or OP_READLINE).  This just sets us up for a
2264  * call to S_sublex_push().
2265  */
2266
2267 STATIC I32
2268 S_sublex_start(pTHX)
2269 {
2270     dVAR;
2271     register const I32 op_type = pl_yylval.ival;
2272
2273     if (op_type == OP_NULL) {
2274         pl_yylval.opval = PL_lex_op;
2275         PL_lex_op = NULL;
2276         return THING;
2277     }
2278     if (op_type == OP_CONST || op_type == OP_READLINE) {
2279         SV *sv = tokeq(PL_lex_stuff);
2280
2281         if (SvTYPE(sv) == SVt_PVIV) {
2282             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
2283             STRLEN len;
2284             const char * const p = SvPV_const(sv, len);
2285             SV * const nsv = newSVpvn_flags(p, len, SvUTF8(sv));
2286             SvREFCNT_dec(sv);
2287             sv = nsv;
2288         }
2289         pl_yylval.opval = (OP*)newSVOP(op_type, 0, sv);
2290         PL_lex_stuff = NULL;
2291         /* Allow <FH> // "foo" */
2292         if (op_type == OP_READLINE)
2293             PL_expect = XTERMORDORDOR;
2294         return THING;
2295     }
2296     else if (op_type == OP_BACKTICK && PL_lex_op) {
2297         /* readpipe() vas overriden */
2298         cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
2299         pl_yylval.opval = PL_lex_op;
2300         PL_lex_op = NULL;
2301         PL_lex_stuff = NULL;
2302         return THING;
2303     }
2304
2305     PL_sublex_info.super_state = PL_lex_state;
2306     PL_sublex_info.sub_inwhat = (U16)op_type;
2307     PL_sublex_info.sub_op = PL_lex_op;
2308     PL_lex_state = LEX_INTERPPUSH;
2309
2310     PL_expect = XTERM;
2311     if (PL_lex_op) {
2312         pl_yylval.opval = PL_lex_op;
2313         PL_lex_op = NULL;
2314         return PMFUNC;
2315     }
2316     else
2317         return FUNC;
2318 }
2319
2320 /*
2321  * S_sublex_push
2322  * Create a new scope to save the lexing state.  The scope will be
2323  * ended in S_sublex_done.  Returns a '(', starting the function arguments
2324  * to the uc, lc, etc. found before.
2325  * Sets PL_lex_state to LEX_INTERPCONCAT.
2326  */
2327
2328 STATIC I32
2329 S_sublex_push(pTHX)
2330 {
2331     dVAR;
2332     ENTER;
2333
2334     PL_lex_state = PL_sublex_info.super_state;
2335     SAVEBOOL(PL_lex_dojoin);
2336     SAVEI32(PL_lex_brackets);
2337     SAVEI32(PL_lex_casemods);
2338     SAVEI32(PL_lex_starts);
2339     SAVEI8(PL_lex_state);
2340     SAVEVPTR(PL_lex_inpat);
2341     SAVEI16(PL_lex_inwhat);
2342     SAVECOPLINE(PL_curcop);
2343     SAVEPPTR(PL_bufptr);
2344     SAVEPPTR(PL_bufend);
2345     SAVEPPTR(PL_oldbufptr);
2346     SAVEPPTR(PL_oldoldbufptr);
2347     SAVEPPTR(PL_last_lop);
2348     SAVEPPTR(PL_last_uni);
2349     SAVEPPTR(PL_linestart);
2350     SAVESPTR(PL_linestr);
2351     SAVEGENERICPV(PL_lex_brackstack);
2352     SAVEGENERICPV(PL_lex_casestack);
2353
2354     PL_linestr = PL_lex_stuff;
2355     PL_lex_stuff = NULL;
2356
2357     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
2358         = SvPVX(PL_linestr);
2359     PL_bufend += SvCUR(PL_linestr);
2360     PL_last_lop = PL_last_uni = NULL;
2361     SAVEFREESV(PL_linestr);
2362
2363     PL_lex_dojoin = FALSE;
2364     PL_lex_brackets = 0;
2365     Newx(PL_lex_brackstack, 120, char);
2366     Newx(PL_lex_casestack, 12, char);
2367     PL_lex_casemods = 0;
2368     *PL_lex_casestack = '\0';
2369     PL_lex_starts = 0;
2370     PL_lex_state = LEX_INTERPCONCAT;
2371     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
2372
2373     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
2374     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
2375         PL_lex_inpat = PL_sublex_info.sub_op;
2376     else
2377         PL_lex_inpat = NULL;
2378
2379     return '(';
2380 }
2381
2382 /*
2383  * S_sublex_done
2384  * Restores lexer state after a S_sublex_push.
2385  */
2386
2387 STATIC I32
2388 S_sublex_done(pTHX)
2389 {
2390     dVAR;
2391     if (!PL_lex_starts++) {
2392         SV * const sv = newSVpvs("");
2393         if (SvUTF8(PL_linestr))
2394             SvUTF8_on(sv);
2395         PL_expect = XOPERATOR;
2396         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2397         return THING;
2398     }
2399
2400     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
2401         PL_lex_state = LEX_INTERPCASEMOD;
2402         return yylex();
2403     }
2404
2405     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
2406     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
2407         PL_linestr = PL_lex_repl;
2408         PL_lex_inpat = 0;
2409         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
2410         PL_bufend += SvCUR(PL_linestr);
2411         PL_last_lop = PL_last_uni = NULL;
2412         SAVEFREESV(PL_linestr);
2413         PL_lex_dojoin = FALSE;
2414         PL_lex_brackets = 0;
2415         PL_lex_casemods = 0;
2416         *PL_lex_casestack = '\0';
2417         PL_lex_starts = 0;
2418         if (SvEVALED(PL_lex_repl)) {
2419             PL_lex_state = LEX_INTERPNORMAL;
2420             PL_lex_starts++;
2421             /*  we don't clear PL_lex_repl here, so that we can check later
2422                 whether this is an evalled subst; that means we rely on the
2423                 logic to ensure sublex_done() is called again only via the
2424                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
2425         }
2426         else {
2427             PL_lex_state = LEX_INTERPCONCAT;
2428             PL_lex_repl = NULL;
2429         }
2430         return ',';
2431     }
2432     else {
2433 #ifdef PERL_MAD
2434         if (PL_madskills) {
2435             if (PL_thiswhite) {
2436                 if (!PL_endwhite)
2437                     PL_endwhite = newSVpvs("");
2438                 sv_catsv(PL_endwhite, PL_thiswhite);
2439                 PL_thiswhite = 0;
2440             }
2441             if (PL_thistoken)
2442                 sv_setpvs(PL_thistoken,"");
2443             else
2444                 PL_realtokenstart = -1;
2445         }
2446 #endif
2447         LEAVE;
2448         PL_bufend = SvPVX(PL_linestr);
2449         PL_bufend += SvCUR(PL_linestr);
2450         PL_expect = XOPERATOR;
2451         PL_sublex_info.sub_inwhat = 0;
2452         return ')';
2453     }
2454 }
2455
2456 /*
2457   scan_const
2458
2459   Extracts a pattern, double-quoted string, or transliteration.  This
2460   is terrifying code.
2461
2462   It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
2463   processing a pattern (PL_lex_inpat is true), a transliteration
2464   (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
2465
2466   Returns a pointer to the character scanned up to. If this is
2467   advanced from the start pointer supplied (i.e. if anything was
2468   successfully parsed), will leave an OP for the substring scanned
2469   in pl_yylval. Caller must intuit reason for not parsing further
2470   by looking at the next characters herself.
2471
2472   In patterns:
2473     backslashes:
2474       constants: \N{NAME} only
2475       case and quoting: \U \Q \E
2476     stops on @ and $, but not for $ as tail anchor
2477
2478   In transliterations:
2479     characters are VERY literal, except for - not at the start or end
2480     of the string, which indicates a range. If the range is in bytes,
2481     scan_const expands the range to the full set of intermediate
2482     characters. If the range is in utf8, the hyphen is replaced with
2483     a certain range mark which will be handled by pmtrans() in op.c.
2484
2485   In double-quoted strings:
2486     backslashes:
2487       double-quoted style: \r and \n
2488       constants: \x31, etc.
2489       deprecated backrefs: \1 (in substitution replacements)
2490       case and quoting: \U \Q \E
2491     stops on @ and $
2492
2493   scan_const does *not* construct ops to handle interpolated strings.
2494   It stops processing as soon as it finds an embedded $ or @ variable
2495   and leaves it to the caller to work out what's going on.
2496
2497   embedded arrays (whether in pattern or not) could be:
2498       @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
2499
2500   $ in double-quoted strings must be the symbol of an embedded scalar.
2501
2502   $ in pattern could be $foo or could be tail anchor.  Assumption:
2503   it's a tail anchor if $ is the last thing in the string, or if it's
2504   followed by one of "()| \r\n\t"
2505
2506   \1 (backreferences) are turned into $1
2507
2508   The structure of the code is
2509       while (there's a character to process) {
2510           handle transliteration ranges
2511           skip regexp comments /(?#comment)/ and codes /(?{code})/
2512           skip #-initiated comments in //x patterns
2513           check for embedded arrays
2514           check for embedded scalars
2515           if (backslash) {
2516               deprecate \1 in substitution replacements
2517               handle string-changing backslashes \l \U \Q \E, etc.
2518               switch (what was escaped) {
2519                   handle \- in a transliteration (becomes a literal -)
2520                   if a pattern and not \N{, go treat as regular character
2521                   handle \132 (octal characters)
2522                   handle \x15 and \x{1234} (hex characters)
2523                   handle \N{name} (named characters, also \N{3,5} in a pattern)
2524                   handle \cV (control characters)
2525                   handle printf-style backslashes (\f, \r, \n, etc)
2526               } (end switch)
2527               continue
2528           } (end if backslash)
2529           handle regular character
2530     } (end while character to read)
2531                 
2532 */
2533
2534 STATIC char *
2535 S_scan_const(pTHX_ char *start)
2536 {
2537     dVAR;
2538     register char *send = PL_bufend;            /* end of the constant */
2539     SV *sv = newSV(send - start);               /* sv for the constant.  See
2540                                                    note below on sizing. */
2541     register char *s = start;                   /* start of the constant */
2542     register char *d = SvPVX(sv);               /* destination for copies */
2543     bool dorange = FALSE;                       /* are we in a translit range? */
2544     bool didrange = FALSE;                      /* did we just finish a range? */
2545     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
2546     I32  this_utf8 = UTF;                       /* Is the source string assumed
2547                                                    to be UTF8?  But, this can
2548                                                    show as true when the source
2549                                                    isn't utf8, as for example
2550                                                    when it is entirely composed
2551                                                    of hex constants */
2552
2553     /* Note on sizing:  The scanned constant is placed into sv, which is
2554      * initialized by newSV() assuming one byte of output for every byte of
2555      * input.  This routine expects newSV() to allocate an extra byte for a
2556      * trailing NUL, which this routine will append if it gets to the end of
2557      * the input.  There may be more bytes of input than output (eg., \N{LATIN
2558      * CAPITAL LETTER A}), or more output than input if the constant ends up
2559      * recoded to utf8, but each time a construct is found that might increase
2560      * the needed size, SvGROW() is called.  Its size parameter each time is
2561      * based on the best guess estimate at the time, namely the length used so
2562      * far, plus the length the current construct will occupy, plus room for
2563      * the trailing NUL, plus one byte for every input byte still unscanned */ 
2564
2565     UV uv;
2566 #ifdef EBCDIC
2567     UV literal_endpoint = 0;
2568     bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
2569 #endif
2570
2571     PERL_ARGS_ASSERT_SCAN_CONST;
2572
2573     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
2574         /* If we are doing a trans and we know we want UTF8 set expectation */
2575         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
2576         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2577     }
2578
2579
2580     while (s < send || dorange) {
2581
2582         /* get transliterations out of the way (they're most literal) */
2583         if (PL_lex_inwhat == OP_TRANS) {
2584             /* expand a range A-Z to the full set of characters.  AIE! */
2585             if (dorange) {
2586                 I32 i;                          /* current expanded character */
2587                 I32 min;                        /* first character in range */
2588                 I32 max;                        /* last character in range */
2589
2590 #ifdef EBCDIC
2591                 UV uvmax = 0;
2592 #endif
2593
2594                 if (has_utf8
2595 #ifdef EBCDIC
2596                     && !native_range
2597 #endif
2598                     ) {
2599                     char * const c = (char*)utf8_hop((U8*)d, -1);
2600                     char *e = d++;
2601                     while (e-- > c)
2602                         *(e + 1) = *e;
2603                     *c = (char)UTF_TO_NATIVE(0xff);
2604                     /* mark the range as done, and continue */
2605                     dorange = FALSE;
2606                     didrange = TRUE;
2607                     continue;
2608                 }
2609
2610                 i = d - SvPVX_const(sv);                /* remember current offset */
2611 #ifdef EBCDIC
2612                 SvGROW(sv,
2613                        SvLEN(sv) + (has_utf8 ?
2614                                     (512 - UTF_CONTINUATION_MARK +
2615                                      UNISKIP(0x100))
2616                                     : 256));
2617                 /* How many two-byte within 0..255: 128 in UTF-8,
2618                  * 96 in UTF-8-mod. */
2619 #else
2620                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
2621 #endif
2622                 d = SvPVX(sv) + i;              /* refresh d after realloc */
2623 #ifdef EBCDIC
2624                 if (has_utf8) {
2625                     int j;
2626                     for (j = 0; j <= 1; j++) {
2627                         char * const c = (char*)utf8_hop((U8*)d, -1);
2628                         const UV uv    = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
2629                         if (j)
2630                             min = (U8)uv;
2631                         else if (uv < 256)
2632                             max = (U8)uv;
2633                         else {
2634                             max = (U8)0xff; /* only to \xff */
2635                             uvmax = uv; /* \x{100} to uvmax */
2636                         }
2637                         d = c; /* eat endpoint chars */
2638                      }
2639                 }
2640                else {
2641 #endif
2642                    d -= 2;              /* eat the first char and the - */
2643                    min = (U8)*d;        /* first char in range */
2644                    max = (U8)d[1];      /* last char in range  */
2645 #ifdef EBCDIC
2646                }
2647 #endif
2648
2649                 if (min > max) {
2650                     Perl_croak(aTHX_
2651                                "Invalid range \"%c-%c\" in transliteration operator",
2652                                (char)min, (char)max);
2653                 }
2654
2655 #ifdef EBCDIC
2656                 if (literal_endpoint == 2 &&
2657                     ((isLOWER(min) && isLOWER(max)) ||
2658                      (isUPPER(min) && isUPPER(max)))) {
2659                     if (isLOWER(min)) {
2660                         for (i = min; i <= max; i++)
2661                             if (isLOWER(i))
2662                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2663                     } else {
2664                         for (i = min; i <= max; i++)
2665                             if (isUPPER(i))
2666                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2667                     }
2668                 }
2669                 else
2670 #endif
2671                     for (i = min; i <= max; i++)
2672 #ifdef EBCDIC
2673                         if (has_utf8) {
2674                             const U8 ch = (U8)NATIVE_TO_UTF(i);
2675                             if (UNI_IS_INVARIANT(ch))
2676                                 *d++ = (U8)i;
2677                             else {
2678                                 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2679                                 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2680                             }
2681                         }
2682                         else
2683 #endif
2684                             *d++ = (char)i;
2685  
2686 #ifdef EBCDIC
2687                 if (uvmax) {
2688                     d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2689                     if (uvmax > 0x101)
2690                         *d++ = (char)UTF_TO_NATIVE(0xff);
2691                     if (uvmax > 0x100)
2692                         d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2693                 }
2694 #endif
2695
2696                 /* mark the range as done, and continue */
2697                 dorange = FALSE;
2698                 didrange = TRUE;
2699 #ifdef EBCDIC
2700                 literal_endpoint = 0;
2701 #endif
2702                 continue;
2703             }
2704
2705             /* range begins (ignore - as first or last char) */
2706             else if (*s == '-' && s+1 < send  && s != start) {
2707                 if (didrange) {
2708                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
2709                 }
2710                 if (has_utf8
2711 #ifdef EBCDIC
2712                     && !native_range
2713 #endif
2714                     ) {
2715                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
2716                     s++;
2717                     continue;
2718                 }
2719                 dorange = TRUE;
2720                 s++;
2721             }
2722             else {
2723                 didrange = FALSE;
2724 #ifdef EBCDIC
2725                 literal_endpoint = 0;
2726                 native_range = TRUE;
2727 #endif
2728             }
2729         }
2730
2731         /* if we get here, we're not doing a transliteration */
2732
2733         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2734            except for the last char, which will be done separately. */
2735         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
2736             if (s[2] == '#') {
2737                 while (s+1 < send && *s != ')')
2738                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2739             }
2740             else if (s[2] == '{' /* This should match regcomp.c */
2741                     || (s[2] == '?' && s[3] == '{'))
2742             {
2743                 I32 count = 1;
2744                 char *regparse = s + (s[2] == '{' ? 3 : 4);
2745                 char c;
2746
2747                 while (count && (c = *regparse)) {
2748                     if (c == '\\' && regparse[1])
2749                         regparse++;
2750                     else if (c == '{')
2751                         count++;
2752                     else if (c == '}')
2753                         count--;
2754                     regparse++;
2755                 }
2756                 if (*regparse != ')')
2757                     regparse--;         /* Leave one char for continuation. */
2758                 while (s < regparse)
2759                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2760             }
2761         }
2762
2763         /* likewise skip #-initiated comments in //x patterns */
2764         else if (*s == '#' && PL_lex_inpat &&
2765           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
2766             while (s+1 < send && *s != '\n')
2767                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2768         }
2769
2770         /* check for embedded arrays
2771            (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
2772            */
2773         else if (*s == '@' && s[1]) {
2774             if (isALNUM_lazy_if(s+1,UTF))
2775                 break;
2776             if (strchr(":'{$", s[1]))
2777                 break;
2778             if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2779                 break; /* in regexp, neither @+ nor @- are interpolated */
2780         }
2781
2782         /* check for embedded scalars.  only stop if we're sure it's a
2783            variable.
2784         */
2785         else if (*s == '$') {
2786             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
2787                 break;
2788             if (s + 1 < send && !strchr("()| \r\n\t", s[1])) {
2789                 if (s[1] == '\\') {
2790                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2791                                    "Possible unintended interpolation of $\\ in regex");
2792                 }
2793                 break;          /* in regexp, $ might be tail anchor */
2794             }
2795         }
2796
2797         /* End of else if chain - OP_TRANS rejoin rest */
2798
2799         /* backslashes */
2800         if (*s == '\\' && s+1 < send) {
2801             char* e;    /* Can be used for ending '}', etc. */
2802
2803             s++;
2804
2805             /* deprecate \1 in strings and substitution replacements */
2806             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
2807                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
2808             {
2809                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
2810                 *--s = '$';
2811                 break;
2812             }
2813
2814             /* string-change backslash escapes */
2815             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
2816                 --s;
2817                 break;
2818             }
2819             /* In a pattern, process \N, but skip any other backslash escapes.
2820              * This is because we don't want to translate an escape sequence
2821              * into a meta symbol and have the regex compiler use the meta
2822              * symbol meaning, e.g. \x{2E} would be confused with a dot.  But
2823              * in spite of this, we do have to process \N here while the proper
2824              * charnames handler is in scope.  See bugs #56444 and #62056.
2825              * There is a complication because \N in a pattern may also stand
2826              * for 'match a non-nl', and not mean a charname, in which case its
2827              * processing should be deferred to the regex compiler.  To be a
2828              * charname it must be followed immediately by a '{', and not look
2829              * like \N followed by a curly quantifier, i.e., not something like
2830              * \N{3,}.  regcurly returns a boolean indicating if it is a legal
2831              * quantifier */
2832             else if (PL_lex_inpat
2833                     && (*s != 'N'
2834                         || s[1] != '{'
2835                         || regcurly(s + 1)))
2836             {
2837                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2838                 goto default_action;
2839             }
2840
2841             switch (*s) {
2842
2843             /* quoted - in transliterations */
2844             case '-':
2845                 if (PL_lex_inwhat == OP_TRANS) {
2846                     *d++ = *s++;
2847                     continue;
2848                 }
2849                 /* FALL THROUGH */
2850             default:
2851                 {
2852                     if ((isALPHA(*s) || isDIGIT(*s)))
2853                         Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2854                                        "Unrecognized escape \\%c passed through",
2855                                        *s);
2856                     /* default action is to copy the quoted character */
2857                     goto default_action;
2858                 }
2859
2860             /* eg. \132 indicates the octal constant 0x132 */
2861             case '0': case '1': case '2': case '3':
2862             case '4': case '5': case '6': case '7':
2863                 {
2864                     I32 flags = 0;
2865                     STRLEN len = 3;
2866                     uv = NATIVE_TO_UNI(grok_oct(s, &len, &flags, NULL));
2867                     s += len;
2868                 }
2869                 goto NUM_ESCAPE_INSERT;
2870
2871             /* eg. \x24 indicates the hex constant 0x24 */
2872             case 'x':
2873                 ++s;
2874                 if (*s == '{') {
2875                     char* const e = strchr(s, '}');
2876                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2877                       PERL_SCAN_DISALLOW_PREFIX;
2878                     STRLEN len;
2879
2880                     ++s;
2881                     if (!e) {
2882                         yyerror("Missing right brace on \\x{}");
2883                         continue;
2884                     }
2885                     len = e - s;
2886                     uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2887                     s = e + 1;
2888                 }
2889                 else {
2890                     {
2891                         STRLEN len = 2;
2892                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
2893                         uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2894                         s += len;
2895                     }
2896                 }
2897
2898               NUM_ESCAPE_INSERT:
2899                 /* Insert oct or hex escaped character.  There will always be
2900                  * enough room in sv since such escapes will be longer than any
2901                  * UTF-8 sequence they can end up as, except if they force us
2902                  * to recode the rest of the string into utf8 */
2903                 
2904                 /* Here uv is the ordinal of the next character being added in
2905                  * unicode (converted from native). */
2906                 if (!UNI_IS_INVARIANT(uv)) {
2907                     if (!has_utf8 && uv > 255) {
2908                         /* Might need to recode whatever we have accumulated so
2909                          * far if it contains any chars variant in utf8 or
2910                          * utf-ebcdic. */
2911                           
2912                         SvCUR_set(sv, d - SvPVX_const(sv));
2913                         SvPOK_on(sv);
2914                         *d = '\0';
2915                         /* See Note on sizing above.  */
2916                         sv_utf8_upgrade_flags_grow(sv,
2917                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2918                                         UNISKIP(uv) + (STRLEN)(send - s) + 1);
2919                         d = SvPVX(sv) + SvCUR(sv);
2920                         has_utf8 = TRUE;
2921                     }
2922
2923                     if (has_utf8) {
2924                         d = (char*)uvuni_to_utf8((U8*)d, uv);
2925                         if (PL_lex_inwhat == OP_TRANS &&
2926                             PL_sublex_info.sub_op) {
2927                             PL_sublex_info.sub_op->op_private |=
2928                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
2929                                              : OPpTRANS_TO_UTF);
2930                         }
2931 #ifdef EBCDIC
2932                         if (uv > 255 && !dorange)
2933                             native_range = FALSE;
2934 #endif
2935                     }
2936                     else {
2937                         *d++ = (char)uv;
2938                     }
2939                 }
2940                 else {
2941                     *d++ = (char) uv;
2942                 }
2943                 continue;
2944
2945             case 'N':
2946                 /* In a non-pattern \N must be a named character, like \N{LATIN
2947                  * SMALL LETTER A} or \N{U+0041}.  For patterns, it also can
2948                  * mean to match a non-newline.  For non-patterns, named
2949                  * characters are converted to their string equivalents. In
2950                  * patterns, named characters are not converted to their
2951                  * ultimate forms for the same reasons that other escapes
2952                  * aren't.  Instead, they are converted to the \N{U+...} form
2953                  * to get the value from the charnames that is in effect right
2954                  * now, while preserving the fact that it was a named character
2955                  * so that the regex compiler knows this */
2956
2957                 /* This section of code doesn't generally use the
2958                  * NATIVE_TO_NEED() macro to transform the input.  I (khw) did
2959                  * a close examination of this macro and determined it is a
2960                  * no-op except on utfebcdic variant characters.  Every
2961                  * character generated by this that would normally need to be
2962                  * enclosed by this macro is invariant, so the macro is not
2963                  * needed, and would complicate use of copy(). There are other
2964                  * parts of this file where the macro is used inconsistently,
2965                  * but are saved by it being a no-op */
2966
2967                 /* The structure of this section of code (besides checking for
2968                  * errors and upgrading to utf8) is:
2969                  *  Further disambiguate between the two meanings of \N, and if
2970                  *      not a charname, go process it elsewhere
2971                  *  If of form \N{U+...}, pass it through if a pattern; otherwise
2972                  *      convert to utf8
2973                  *  Otherwise must be \N{NAME}: convert to \N{U+c1.c2...} if a pattern;
2974                  *      otherwise convert to utf8 */
2975
2976                 /* Here, s points to the 'N'; the test below is guaranteed to
2977                  * succeed if we are being called on a pattern as we already
2978                  * know from a test above that the next character is a '{'.
2979                  * On a non-pattern \N must mean 'named sequence, which
2980                  * requires braces */
2981                 s++;
2982                 if (*s != '{') {
2983                     yyerror("Missing braces on \\N{}"); 
2984                     continue;
2985                 }
2986                 s++;
2987
2988                 /* If there is no matching '}', it is an error outside of a
2989                  * pattern, or ambiguous inside. */
2990                 if (! (e = strchr(s, '}'))) {
2991                     if (! PL_lex_inpat) {
2992                         yyerror("Missing right brace on \\N{}");
2993                         continue;
2994                     }
2995                     else {
2996
2997                         /* A missing brace means it can't be a legal character
2998                          * name, and it could be a legal "match non-newline".
2999                          * But it's kind of weird without an unescaped left
3000                          * brace, so warn. */
3001                         if (ckWARN(WARN_SYNTAX)) {
3002                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3003                                     "Missing right brace on \\N{} or unescaped left brace after \\N.  Assuming the latter");
3004                         }
3005                         s -= 3; /* Backup over cur char, {, N, to the '\' */
3006                         *d++ = NATIVE_TO_NEED(has_utf8,'\\');
3007                         goto default_action;
3008                     }
3009                 }
3010
3011                 /* Here it looks like a named character */
3012
3013                 if (PL_lex_inpat) {
3014
3015                     /* XXX This block is temporary code.  \N{} implies that the
3016                      * pattern is to have Unicode semantics, and therefore
3017                      * currently has to be encoded in utf8.  By putting it in
3018                      * utf8 now, we save a whole pass in the regular expression
3019                      * compiler.  Once that code is changed so Unicode
3020                      * semantics doesn't necessarily have to be in utf8, this
3021                      * block should be removed */
3022                     if (!has_utf8) {
3023                         SvCUR_set(sv, d - SvPVX_const(sv));
3024                         SvPOK_on(sv);
3025                         *d = '\0';
3026                         /* See Note on sizing above.  */
3027                         sv_utf8_upgrade_flags_grow(sv,
3028                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3029                                         /* 5 = '\N{' + cur char + NUL */
3030                                         (STRLEN)(send - s) + 5);
3031                         d = SvPVX(sv) + SvCUR(sv);
3032                         has_utf8 = TRUE;
3033                     }
3034                 }
3035
3036                 if (*s == 'U' && s[1] == '+') { /* \N{U+...} */
3037                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
3038                                 | PERL_SCAN_DISALLOW_PREFIX;
3039                     STRLEN len;
3040
3041                     /* For \N{U+...}, the '...' is a unicode value even on
3042                      * EBCDIC machines */
3043                     s += 2;         /* Skip to next char after the 'U+' */
3044                     len = e - s;
3045                     uv = grok_hex(s, &len, &flags, NULL);
3046                     if (len == 0 || len != (STRLEN)(e - s)) {
3047                         yyerror("Invalid hexadecimal number in \\N{U+...}");
3048                         s = e + 1;
3049                         continue;
3050                     }
3051
3052                     if (PL_lex_inpat) {
3053
3054                         /* Pass through to the regex compiler unchanged.  The
3055                          * reason we evaluated the number above is to make sure
3056                          * there wasn't a syntax error.  It also makes sure
3057                          * that the syntax created below, \N{Uc1.c2...}, is
3058                          * internal-only */
3059                         s -= 5;     /* Include the '\N{U+' */
3060                         Copy(s, d, e - s + 1, char);    /* 1 = include the } */
3061                         d += e - s + 1;
3062                     }
3063                     else {  /* Not a pattern: convert the hex to string */
3064
3065                          /* If destination is not in utf8, unconditionally
3066                           * recode it to be so.  This is because \N{} implies
3067                           * Unicode semantics, and scalars have to be in utf8
3068                           * to guarantee those semantics */
3069                         if (! has_utf8) {
3070                             SvCUR_set(sv, d - SvPVX_const(sv));
3071                             SvPOK_on(sv);
3072                             *d = '\0';
3073                             /* See Note on sizing above.  */
3074                             sv_utf8_upgrade_flags_grow(
3075                                         sv,
3076                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3077                                         UNISKIP(uv) + (STRLEN)(send - e) + 1);
3078                             d = SvPVX(sv) + SvCUR(sv);
3079                             has_utf8 = TRUE;
3080                         }
3081
3082                         /* Add the string to the output */
3083                         if (UNI_IS_INVARIANT(uv)) {
3084                             *d++ = (char) uv;
3085                         }
3086                         else d = (char*)uvuni_to_utf8((U8*)d, uv);
3087                     }
3088                 }
3089                 else { /* Here is \N{NAME} but not \N{U+...}. */
3090
3091                     SV *res;            /* result from charnames */
3092                     const char *str;    /* the string in 'res' */
3093                     STRLEN len;         /* its length */
3094
3095                     /* Get the value for NAME */
3096                     res = newSVpvn(s, e - s);
3097                     res = new_constant( NULL, 0, "charnames",
3098                                         /* includes all of: \N{...} */
3099                                         res, NULL, s - 3, e - s + 4 );
3100
3101                     /* Most likely res will be in utf8 already since the
3102                      * standard charnames uses pack U, but a custom translator
3103                      * can leave it otherwise, so make sure.  XXX This can be
3104                      * revisited to not have charnames use utf8 for characters
3105                      * that don't need it when regexes don't have to be in utf8
3106                      * for Unicode semantics.  If doing so, remember EBCDIC */
3107                     sv_utf8_upgrade(res);
3108                     str = SvPV_const(res, len);
3109
3110                     /* Don't accept malformed input */
3111                     if (! is_utf8_string((U8 *) str, len)) {
3112                         yyerror("Malformed UTF-8 returned by \\N");
3113                     }
3114                     else if (PL_lex_inpat) {
3115
3116                         if (! len) { /* The name resolved to an empty string */
3117                             Copy("\\N{}", d, 4, char);
3118                             d += 4;
3119                         }
3120                         else {
3121                             /* In order to not lose information for the regex
3122                             * compiler, pass the result in the specially made
3123                             * syntax: \N{U+c1.c2.c3...}, where c1 etc. are
3124                             * the code points in hex of each character
3125                             * returned by charnames */
3126
3127                             const char *str_end = str + len;
3128                             STRLEN char_length;     /* cur char's byte length */
3129                             STRLEN output_length;   /* and the number of bytes
3130                                                        after this is translated
3131                                                        into hex digits */
3132                             const STRLEN off = d - SvPVX_const(sv);
3133
3134                             /* 2 hex per byte; 2 chars for '\N'; 2 chars for
3135                              * max('U+', '.'); and 1 for NUL */
3136                             char hex_string[2 * UTF8_MAXBYTES + 5];
3137
3138                             /* Get the first character of the result. */
3139                             U32 uv = utf8n_to_uvuni((U8 *) str,
3140                                                     len,
3141                                                     &char_length,
3142                                                     UTF8_ALLOW_ANYUV);
3143
3144                             /* The call to is_utf8_string() above hopefully
3145                              * guarantees that there won't be an error.  But
3146                              * it's easy here to make sure.  The function just
3147                              * above warns and returns 0 if invalid utf8, but
3148                              * it can also return 0 if the input is validly a
3149                              * NUL. Disambiguate */
3150                             if (uv == 0 && NATIVE_TO_ASCII(*str) != '\0') {
3151                                 uv = UNICODE_REPLACEMENT;
3152                             }
3153
3154                             /* Convert first code point to hex, including the
3155                              * boiler plate before it */
3156                             sprintf(hex_string, "\\N{U+%X", (unsigned int) uv);
3157                             output_length = strlen(hex_string);
3158
3159                             /* Make sure there is enough space to hold it */
3160                             d = off + SvGROW(sv, off
3161                                                  + output_length
3162                                                  + (STRLEN)(send - e)
3163                                                  + 2);  /* '}' + NUL */
3164                             /* And output it */
3165                             Copy(hex_string, d, output_length, char);
3166                             d += output_length;
3167
3168                             /* For each subsequent character, append dot and
3169                              * its ordinal in hex */
3170                             while ((str += char_length) < str_end) {
3171                                 const STRLEN off = d - SvPVX_const(sv);
3172                                 U32 uv = utf8n_to_uvuni((U8 *) str,
3173                                                         str_end - str,
3174                                                         &char_length,
3175                                                         UTF8_ALLOW_ANYUV);
3176                                 if (uv == 0 && NATIVE_TO_ASCII(*str) != '\0') {
3177                                     uv = UNICODE_REPLACEMENT;
3178                                 }
3179
3180                                 sprintf(hex_string, ".%X", (unsigned int) uv);
3181                                 output_length = strlen(hex_string);
3182
3183                                 d = off + SvGROW(sv, off
3184                                                      + output_length
3185                                                      + (STRLEN)(send - e)
3186                                                      + 2);      /* '}' +  NUL */
3187                                 Copy(hex_string, d, output_length, char);
3188                                 d += output_length;
3189                             }
3190
3191                             *d++ = '}'; /* Done.  Add the trailing brace */
3192                         }
3193                     }
3194                     else { /* Here, not in a pattern.  Convert the name to a
3195                             * string. */
3196
3197                          /* If destination is not in utf8, unconditionally
3198                           * recode it to be so.  This is because \N{} implies
3199                           * Unicode semantics, and scalars have to be in utf8
3200                           * to guarantee those semantics */
3201                         if (! has_utf8) {
3202                             SvCUR_set(sv, d - SvPVX_const(sv));
3203                             SvPOK_on(sv);
3204                             *d = '\0';
3205                             /* See Note on sizing above.  */
3206                             sv_utf8_upgrade_flags_grow(sv,
3207                                                 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3208                                                 len + (STRLEN)(send - s) + 1);
3209                             d = SvPVX(sv) + SvCUR(sv);
3210                             has_utf8 = TRUE;
3211                         } else if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
3212
3213                             /* See Note on sizing above.  (NOTE: SvCUR() is not
3214                              * set correctly here). */
3215                             const STRLEN off = d - SvPVX_const(sv);
3216                             d = off + SvGROW(sv, off + len + (STRLEN)(send - s) + 1);
3217                         }
3218                         Copy(str, d, len, char);
3219                         d += len;
3220                     }
3221                     SvREFCNT_dec(res);
3222                 }
3223 #ifdef EBCDIC
3224                 if (!dorange) 
3225                     native_range = FALSE; /* \N{} is defined to be Unicode */
3226 #endif
3227                 s = e + 1;  /* Point to just after the '}' */
3228                 continue;
3229
3230             /* \c is a control character */
3231             case 'c':
3232                 s++;
3233                 if (s < send) {
3234                     U8 c = *s++;
3235 #ifdef EBCDIC
3236                     if (isLOWER(c))
3237                         c = toUPPER(c);
3238 #endif
3239                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
3240                 }
3241                 else {
3242                     yyerror("Missing control char name in \\c");
3243                 }
3244                 continue;
3245
3246             /* printf-style backslashes, formfeeds, newlines, etc */
3247             case 'b':
3248                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
3249                 break;
3250             case 'n':
3251                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
3252                 break;
3253             case 'r':
3254                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
3255                 break;
3256             case 'f':
3257                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
3258                 break;
3259             case 't':
3260                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
3261                 break;
3262             case 'e':
3263                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
3264                 break;
3265             case 'a':
3266                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
3267                 break;
3268             } /* end switch */
3269
3270             s++;
3271             continue;
3272         } /* end if (backslash) */
3273 #ifdef EBCDIC
3274         else
3275             literal_endpoint++;
3276 #endif
3277
3278     default_action:
3279         /* If we started with encoded form, or already know we want it,
3280            then encode the next character */
3281         if (! NATIVE_IS_INVARIANT((U8)(*s)) && (this_utf8 || has_utf8)) {
3282             STRLEN len  = 1;
3283
3284
3285             /* One might think that it is wasted effort in the case of the
3286              * source being utf8 (this_utf8 == TRUE) to take the next character
3287              * in the source, convert it to an unsigned value, and then convert
3288              * it back again.  But the source has not been validated here.  The
3289              * routine that does the conversion checks for errors like
3290              * malformed utf8 */
3291
3292             const UV nextuv   = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
3293             const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
3294             if (!has_utf8) {
3295                 SvCUR_set(sv, d - SvPVX_const(sv));
3296                 SvPOK_on(sv);
3297                 *d = '\0';
3298                 /* See Note on sizing above.  */
3299                 sv_utf8_upgrade_flags_grow(sv,
3300                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3301                                         need + (STRLEN)(send - s) + 1);
3302                 d = SvPVX(sv) + SvCUR(sv);
3303                 has_utf8 = TRUE;
3304             } else if (need > len) {
3305                 /* encoded value larger than old, may need extra space (NOTE:
3306                  * SvCUR() is not set correctly here).   See Note on sizing
3307                  * above.  */
3308                 const STRLEN off = d - SvPVX_const(sv);
3309                 d = SvGROW(sv, off + need + (STRLEN)(send - s) + 1) + off;
3310             }
3311             s += len;
3312
3313             d = (char*)uvchr_to_utf8((U8*)d, nextuv);
3314 #ifdef EBCDIC
3315             if (uv > 255 && !dorange)
3316                 native_range = FALSE;
3317 #endif
3318         }
3319         else {
3320             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
3321         }
3322     } /* while loop to process each character */
3323
3324     /* terminate the string and set up the sv */
3325     *d = '\0';
3326     SvCUR_set(sv, d - SvPVX_const(sv));
3327     if (SvCUR(sv) >= SvLEN(sv))
3328         Perl_croak(aTHX_ "panic: constant overflowed allocated space");
3329
3330     SvPOK_on(sv);
3331     if (PL_encoding && !has_utf8) {
3332         sv_recode_to_utf8(sv, PL_encoding);
3333         if (SvUTF8(sv))
3334             has_utf8 = TRUE;
3335     }
3336     if (has_utf8) {
3337         SvUTF8_on(sv);
3338         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
3339             PL_sublex_info.sub_op->op_private |=
3340                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
3341         }
3342     }
3343
3344     /* shrink the sv if we allocated more than we used */
3345     if (SvCUR(sv) + 5 < SvLEN(sv)) {
3346         SvPV_shrink_to_cur(sv);
3347     }
3348
3349     /* return the substring (via pl_yylval) only if we parsed anything */
3350     if (s > PL_bufptr) {
3351         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) ) {
3352             const char *const key = PL_lex_inpat ? "qr" : "q";
3353             const STRLEN keylen = PL_lex_inpat ? 2 : 1;
3354             const char *type;
3355             STRLEN typelen;
3356
3357             if (PL_lex_inwhat == OP_TRANS) {
3358                 type = "tr";
3359                 typelen = 2;
3360             } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
3361                 type = "s";
3362                 typelen = 1;
3363             } else  {
3364                 type = "qq";
3365                 typelen = 2;
3366             }
3367
3368             sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
3369                                 type, typelen);
3370         }
3371         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3372     } else
3373         SvREFCNT_dec(sv);
3374     return s;
3375 }
3376
3377 /* S_intuit_more
3378  * Returns TRUE if there's more to the expression (e.g., a subscript),
3379  * FALSE otherwise.
3380  *
3381  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
3382  *
3383  * ->[ and ->{ return TRUE
3384  * { and [ outside a pattern are always subscripts, so return TRUE
3385  * if we're outside a pattern and it's not { or [, then return FALSE
3386  * if we're in a pattern and the first char is a {
3387  *   {4,5} (any digits around the comma) returns FALSE
3388  * if we're in a pattern and the first char is a [
3389  *   [] returns FALSE
3390  *   [SOMETHING] has a funky algorithm to decide whether it's a
3391  *      character class or not.  It has to deal with things like
3392  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
3393  * anything else returns TRUE
3394  */
3395
3396 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
3397
3398 STATIC int
3399 S_intuit_more(pTHX_ register char *s)
3400 {
3401     dVAR;
3402
3403     PERL_ARGS_ASSERT_INTUIT_MORE;
3404
3405     if (PL_lex_brackets)
3406         return TRUE;
3407     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
3408         return TRUE;
3409     if (*s != '{' && *s != '[')
3410         return FALSE;
3411     if (!PL_lex_inpat)
3412         return TRUE;
3413
3414     /* In a pattern, so maybe we have {n,m}. */
3415     if (*s == '{') {
3416         s++;
3417         if (!isDIGIT(*s))
3418             return TRUE;
3419         while (isDIGIT(*s))
3420             s++;
3421         if (*s == ',')
3422             s++;
3423         while (isDIGIT(*s))
3424             s++;
3425         if (*s == '}')
3426             return FALSE;
3427         return TRUE;
3428         
3429     }
3430
3431     /* On the other hand, maybe we have a character class */
3432
3433     s++;
3434     if (*s == ']' || *s == '^')
3435         return FALSE;
3436     else {
3437         /* this is terrifying, and it works */
3438         int weight = 2;         /* let's weigh the evidence */
3439         char seen[256];
3440         unsigned char un_char = 255, last_un_char;
3441         const char * const send = strchr(s,']');
3442         char tmpbuf[sizeof PL_tokenbuf * 4];
3443
3444         if (!send)              /* has to be an expression */
3445             return TRUE;
3446
3447         Zero(seen,256,char);
3448         if (*s == '$')
3449             weight -= 3;
3450         else if (isDIGIT(*s)) {
3451             if (s[1] != ']') {
3452                 if (isDIGIT(s[1]) && s[2] == ']')
3453                     weight -= 10;
3454             }
3455             else
3456                 weight -= 100;
3457         }
3458         for (; s < send; s++) {
3459             last_un_char = un_char;
3460             un_char = (unsigned char)*s;
3461             switch (*s) {
3462             case '@':
3463             case '&':
3464             case '$':
3465                 weight -= seen[un_char] * 10;
3466                 if (isALNUM_lazy_if(s+1,UTF)) {
3467                     int len;
3468                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
3469                     len = (int)strlen(tmpbuf);
3470                     if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
3471                         weight -= 100;
3472                     else
3473                         weight -= 10;
3474                 }
3475                 else if (*s == '$' && s[1] &&
3476                   strchr("[#!%*<>()-=",s[1])) {
3477                     if (/*{*/ strchr("])} =",s[2]))
3478                         weight -= 10;
3479                     else
3480                         weight -= 1;
3481                 }
3482                 break;
3483             case '\\':
3484                 un_char = 254;
3485                 if (s[1]) {
3486                     if (strchr("wds]",s[1]))
3487                         weight += 100;
3488                     else if (seen[(U8)'\''] || seen[(U8)'"'])
3489                         weight += 1;
3490                     else if (strchr("rnftbxcav",s[1]))
3491                         weight += 40;
3492                     else if (isDIGIT(s[1])) {
3493                         weight += 40;
3494                         while (s[1] && isDIGIT(s[1]))
3495                             s++;
3496                     }
3497                 }
3498                 else
3499                     weight += 100;
3500                 break;
3501             case '-':
3502                 if (s[1] == '\\')
3503                     weight += 50;
3504                 if (strchr("aA01! ",last_un_char))
3505                     weight += 30;
3506                 if (strchr("zZ79~",s[1]))
3507                     weight += 30;
3508                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
3509                     weight -= 5;        /* cope with negative subscript */
3510                 break;
3511             default:
3512                 if (!isALNUM(last_un_char)
3513                     && !(last_un_char == '$' || last_un_char == '@'
3514                          || last_un_char == '&')
3515                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
3516                     char *d = tmpbuf;
3517                     while (isALPHA(*s))
3518                         *d++ = *s++;
3519                     *d = '\0';
3520                     if (keyword(tmpbuf, d - tmpbuf, 0))
3521                         weight -= 150;
3522                 }
3523                 if (un_char == last_un_char + 1)
3524                     weight += 5;
3525                 weight -= seen[un_char];
3526                 break;
3527             }
3528             seen[un_char]++;
3529         }
3530         if (weight >= 0)        /* probably a character class */
3531             return FALSE;
3532     }
3533
3534     return TRUE;
3535 }
3536
3537 /*
3538  * S_intuit_method
3539  *
3540  * Does all the checking to disambiguate
3541  *   foo bar
3542  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
3543  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
3544  *
3545  * First argument is the stuff after the first token, e.g. "bar".
3546  *
3547  * Not a method if bar is a filehandle.
3548  * Not a method if foo is a subroutine prototyped to take a filehandle.
3549  * Not a method if it's really "Foo $bar"
3550  * Method if it's "foo $bar"
3551  * Not a method if it's really "print foo $bar"
3552  * Method if it's really "foo package::" (interpreted as package->foo)
3553  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3554  * Not a method if bar is a filehandle or package, but is quoted with
3555  *   =>
3556  */
3557
3558 STATIC int
3559 S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
3560 {
3561     dVAR;
3562     char *s = start + (*start == '$');
3563     char tmpbuf[sizeof PL_tokenbuf];
3564     STRLEN len;
3565     GV* indirgv;
3566 #ifdef PERL_MAD
3567     int soff;
3568 #endif
3569
3570     PERL_ARGS_ASSERT_INTUIT_METHOD;
3571
3572     if (gv) {
3573         if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
3574             return 0;
3575         if (cv) {
3576             if (SvPOK(cv)) {
3577                 const char *proto = SvPVX_const(cv);
3578                 if (proto) {
3579                     if (*proto == ';')
3580                         proto++;
3581                     if (*proto == '*')
3582                         return 0;
3583                 }
3584             }
3585         } else
3586             gv = NULL;
3587     }
3588     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3589     /* start is the beginning of the possible filehandle/object,
3590      * and s is the end of it
3591      * tmpbuf is a copy of it
3592      */
3593
3594     if (*start == '$') {
3595         if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
3596                 isUPPER(*PL_tokenbuf))
3597             return 0;
3598 #ifdef PERL_MAD
3599         len = start - SvPVX(PL_linestr);
3600 #endif
3601         s = PEEKSPACE(s);
3602 #ifdef PERL_MAD
3603         start = SvPVX(PL_linestr) + len;
3604 #endif
3605         PL_bufptr = start;
3606         PL_expect = XREF;
3607         return *s == '(' ? FUNCMETH : METHOD;
3608     }
3609     if (!keyword(tmpbuf, len, 0)) {
3610         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
3611             len -= 2;
3612             tmpbuf[len] = '\0';
3613 #ifdef PERL_MAD
3614             soff = s - SvPVX(PL_linestr);
3615 #endif
3616             goto bare_package;
3617         }
3618         indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
3619         if (indirgv && GvCVu(indirgv))
3620             return 0;
3621         /* filehandle or package name makes it a method */
3622         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
3623 #ifdef PERL_MAD
3624             soff = s - SvPVX(PL_linestr);
3625 #endif
3626             s = PEEKSPACE(s);
3627             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
3628                 return 0;       /* no assumptions -- "=>" quotes bearword */
3629       bare_package:
3630             start_force(PL_curforce);
3631             NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
3632                                                   S_newSV_maybe_utf8(aTHX_ tmpbuf, len));
3633             NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
3634             if (PL_madskills)
3635                 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3636             PL_expect = XTERM;
3637             force_next(WORD);
3638             PL_bufptr = s;
3639 #ifdef PERL_MAD
3640             PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
3641 #endif
3642             return *s == '(' ? FUNCMETH : METHOD;
3643         }
3644     }
3645     return 0;
3646 }
3647
3648 /* Encoded script support. filter_add() effectively inserts a
3649  * 'pre-processing' function into the current source input stream.
3650  * Note that the filter function only applies to the current source file
3651  * (e.g., it will not affect files 'require'd or 'use'd by this one).
3652  *
3653  * The datasv parameter (which may be NULL) can be used to pass
3654  * private data to this instance of the filter. The filter function
3655  * can recover the SV using the FILTER_DATA macro and use it to
3656  * store private buffers and state information.
3657  *
3658  * The supplied datasv parameter is upgraded to a PVIO type
3659  * and the IoDIRP/IoANY field is used to store the function pointer,
3660  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
3661  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
3662  * private use must be set using malloc'd pointers.
3663  */
3664
3665 SV *
3666 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
3667 {
3668     dVAR;
3669     if (!funcp)
3670         return NULL;
3671
3672     if (!PL_parser)
3673         return NULL;
3674
3675     if (!PL_rsfp_filters)
3676         PL_rsfp_filters = newAV();
3677     if (!datasv)
3678         datasv = newSV(0);
3679     SvUPGRADE(datasv, SVt_PVIO);
3680     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
3681     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
3682     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
3683                           FPTR2DPTR(void *, IoANY(datasv)),
3684                           SvPV_nolen(datasv)));
3685     av_unshift(PL_rsfp_filters, 1);
3686     av_store(PL_rsfp_filters, 0, datasv) ;
3687     return(datasv);
3688 }
3689
3690
3691 /* Delete most recently added instance of this filter function. */
3692 void
3693 Perl_filter_del(pTHX_ filter_t funcp)
3694 {
3695     dVAR;
3696     SV *datasv;
3697
3698     PERL_ARGS_ASSERT_FILTER_DEL;
3699
3700 #ifdef DEBUGGING
3701     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
3702                           FPTR2DPTR(void*, funcp)));
3703 #endif
3704     if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
3705         return;
3706     /* if filter is on top of stack (usual case) just pop it off */
3707     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
3708     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
3709         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
3710         IoANY(datasv) = (void *)NULL;
3711         sv_free(av_pop(PL_rsfp_filters));
3712
3713         return;
3714     }
3715     /* we need to search for the correct entry and clear it     */
3716     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
3717 }
3718
3719
3720 /* Invoke the idxth filter function for the current rsfp.        */
3721 /* maxlen 0 = read one text line */
3722 I32
3723 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
3724 {
3725     dVAR;
3726     filter_t funcp;
3727     SV *datasv = NULL;
3728     /* This API is bad. It should have been using unsigned int for maxlen.
3729        Not sure if we want to change the API, but if not we should sanity
3730        check the value here.  */
3731     const unsigned int correct_length
3732         = maxlen < 0 ?
3733 #ifdef PERL_MICRO
3734         0x7FFFFFFF
3735 #else
3736         INT_MAX
3737 #endif
3738         : maxlen;
3739
3740     PERL_ARGS_ASSERT_FILTER_READ;
3741
3742     if (!PL_parser || !PL_rsfp_filters)
3743         return -1;
3744     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
3745         /* Provide a default input filter to make life easy.    */
3746         /* Note that we append to the line. This is handy.      */
3747         DEBUG_P(PerlIO_printf(Perl_debug_log,
3748                               "filter_read %d: from rsfp\n", idx));
3749         if (correct_length) {
3750             /* Want a block */
3751             int len ;
3752             const int old_len = SvCUR(buf_sv);
3753
3754             /* ensure buf_sv is large enough */
3755             SvGROW(buf_sv, (STRLEN)(old_len + correct_length + 1)) ;
3756             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
3757                                    correct_length)) <= 0) {
3758                 if (PerlIO_error(PL_rsfp))
3759                     return -1;          /* error */
3760                 else
3761                     return 0 ;          /* end of file */
3762             }
3763             SvCUR_set(buf_sv, old_len + len) ;
3764             SvPVX(buf_sv)[old_len + len] = '\0';
3765         } else {
3766             /* Want a line */
3767             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
3768                 if (PerlIO_error(PL_rsfp))
3769                     return -1;          /* error */
3770                 else
3771                     return 0 ;          /* end of file */
3772             }
3773         }
3774         return SvCUR(buf_sv);
3775     }
3776     /* Skip this filter slot if filter has been deleted */
3777     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
3778         DEBUG_P(PerlIO_printf(Perl_debug_log,
3779                               "filter_read %d: skipped (filter deleted)\n",
3780                               idx));
3781         return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
3782     }
3783     /* Get function pointer hidden within datasv        */
3784     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
3785     DEBUG_P(PerlIO_printf(Perl_debug_log,
3786                           "filter_read %d: via function %p (%s)\n",
3787                           idx, (void*)datasv, SvPV_nolen_const(datasv)));
3788     /* Call function. The function is expected to       */
3789     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
3790     /* Return: <0:error, =0:eof, >0:not eof             */
3791     return (*funcp)(aTHX_ idx, buf_sv, correct_length);
3792 }
3793
3794 STATIC char *
3795 S_filter_gets(pTHX_ register SV *sv, STRLEN append)
3796 {
3797     dVAR;
3798
3799     PERL_ARGS_ASSERT_FILTER_GETS;
3800
3801 #ifdef PERL_CR_FILTER
3802     if (!PL_rsfp_filters) {
3803         filter_add(S_cr_textfilter,NULL);
3804     }
3805 #endif
3806     if (PL_rsfp_filters) {
3807         if (!append)
3808             SvCUR_set(sv, 0);   /* start with empty line        */
3809         if (FILTER_READ(0, sv, 0) > 0)
3810             return ( SvPVX(sv) ) ;
3811         else
3812             return NULL ;
3813     }
3814     else
3815         return (sv_gets(sv, PL_rsfp, append));
3816 }
3817
3818 STATIC HV *
3819 S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
3820 {
3821     dVAR;
3822     GV *gv;
3823
3824     PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
3825
3826     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
3827         return PL_curstash;
3828
3829     if (len > 2 &&
3830         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
3831         (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
3832     {
3833         return GvHV(gv);                        /* Foo:: */
3834     }
3835
3836     /* use constant CLASS => 'MyClass' */
3837     gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
3838     if (gv && GvCV(gv)) {
3839         SV * const sv = cv_const_sv(GvCV(gv));
3840         if (sv)
3841             pkgname = SvPV_const(sv, len);
3842     }
3843
3844     return gv_stashpvn(pkgname, len, 0);
3845 }
3846
3847 /*
3848  * S_readpipe_override
3849  * Check whether readpipe() is overriden, and generates the appropriate
3850  * optree, provided sublex_start() is called afterwards.
3851  */
3852 STATIC void
3853 S_readpipe_override(pTHX)
3854 {
3855     GV **gvp;
3856     GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
3857     pl_yylval.ival = OP_BACKTICK;
3858     if ((gv_readpipe
3859                 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
3860             ||
3861             ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
3862              && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
3863              && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
3864     {
3865         PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
3866             append_elem(OP_LIST,
3867                 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
3868                 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
3869     }
3870 }
3871
3872 #ifdef PERL_MAD 
3873  /*
3874  * Perl_madlex
3875  * The intent of this yylex wrapper is to minimize the changes to the
3876  * tokener when we aren't interested in collecting madprops.  It remains
3877  * to be seen how successful this strategy will be...
3878  */
3879
3880 int
3881 Perl_madlex(pTHX)
3882 {
3883     int optype;
3884     char *s = PL_bufptr;
3885
3886     /* make sure PL_thiswhite is initialized */
3887     PL_thiswhite = 0;
3888     PL_thismad = 0;
3889
3890     /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
3891     if (PL_pending_ident)
3892         return S_pending_ident(aTHX);
3893
3894     /* previous token ate up our whitespace? */
3895     if (!PL_lasttoke && PL_nextwhite) {
3896         PL_thiswhite = PL_nextwhite;
3897         PL_nextwhite = 0;
3898     }
3899
3900     /* isolate the token, and figure out where it is without whitespace */
3901     PL_realtokenstart = -1;
3902     PL_thistoken = 0;
3903     optype = yylex();
3904     s = PL_bufptr;
3905     assert(PL_curforce < 0);
3906
3907     if (!PL_thismad || PL_thismad->mad_key == '^') {    /* not forced already? */
3908         if (!PL_thistoken) {
3909             if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
3910                 PL_thistoken = newSVpvs("");
3911             else {
3912                 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
3913                 PL_thistoken = newSVpvn(tstart, s - tstart);
3914             }
3915         }
3916         if (PL_thismad) /* install head */
3917             CURMAD('X', PL_thistoken);
3918     }
3919
3920     /* last whitespace of a sublex? */
3921     if (optype == ')' && PL_endwhite) {
3922         CURMAD('X', PL_endwhite);
3923     }
3924
3925     if (!PL_thismad) {
3926
3927         /* if no whitespace and we're at EOF, bail.  Otherwise fake EOF below. */
3928         if (!PL_thiswhite && !PL_endwhite && !optype) {
3929             sv_free(PL_thistoken);
3930             PL_thistoken = 0;
3931             return 0;
3932         }
3933
3934         /* put off final whitespace till peg */
3935         if (optype == ';' && !PL_rsfp) {
3936             PL_nextwhite = PL_thiswhite;
3937             PL_thiswhite = 0;
3938         }
3939         else if (PL_thisopen) {
3940             CURMAD('q', PL_thisopen);
3941             if (PL_thistoken)
3942                 sv_free(PL_thistoken);
3943             PL_thistoken = 0;
3944         }
3945         else {
3946             /* Store actual token text as madprop X */
3947             CURMAD('X', PL_thistoken);
3948         }
3949
3950         if (PL_thiswhite) {
3951             /* add preceding whitespace as madprop _ */
3952             CURMAD('_', PL_thiswhite);
3953         }
3954
3955         if (PL_thisstuff) {
3956             /* add quoted material as madprop = */
3957             CURMAD('=', PL_thisstuff);
3958         }
3959
3960         if (PL_thisclose) {
3961             /* add terminating quote as madprop Q */
3962             CURMAD('Q', PL_thisclose);
3963         }
3964     }
3965
3966     /* special processing based on optype */
3967
3968     switch (optype) {
3969
3970     /* opval doesn't need a TOKEN since it can already store mp */
3971     case WORD:
3972     case METHOD:
3973     case FUNCMETH:
3974     case THING:
3975     case PMFUNC:
3976     case PRIVATEREF:
3977     case FUNC0SUB:
3978     case UNIOPSUB:
3979     case LSTOPSUB:
3980         if (pl_yylval.opval)
3981             append_madprops(PL_thismad, pl_yylval.opval, 0);
3982         PL_thismad = 0;
3983         return optype;
3984
3985     /* fake EOF */
3986     case 0:
3987         optype = PEG;
3988         if (PL_endwhite) {
3989             addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
3990             PL_endwhite = 0;
3991         }
3992         break;
3993
3994     case ']':
3995     case '}':
3996         if (PL_faketokens)
3997             break;
3998         /* remember any fake bracket that lexer is about to discard */ 
3999         if (PL_lex_brackets == 1 &&
4000             ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
4001         {
4002             s = PL_bufptr;
4003             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
4004                 s++;
4005             if (*s == '}') {
4006                 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
4007                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
4008                 PL_thiswhite = 0;
4009                 PL_bufptr = s - 1;
4010                 break;  /* don't bother looking for trailing comment */
4011             }
4012             else
4013                 s = PL_bufptr;
4014         }
4015         if (optype == ']')
4016             break;
4017         /* FALLTHROUGH */
4018
4019     /* attach a trailing comment to its statement instead of next token */
4020     case ';':
4021         if (PL_faketokens)
4022             break;
4023         if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
4024             s = PL_bufptr;
4025             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
4026                 s++;
4027             if (*s == '\n' || *s == '#') {
4028                 while (s < PL_bufend && *s != '\n')
4029                     s++;
4030                 if (s < PL_bufend)
4031                     s++;
4032                 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
4033                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
4034                 PL_thiswhite = 0;
4035                 PL_bufptr = s;
4036             }
4037         }
4038         break;
4039
4040     /* pval */
4041     case LABEL:
4042         break;
4043
4044     /* ival */
4045     default:
4046         break;
4047
4048     }
4049
4050     /* Create new token struct.  Note: opvals return early above. */
4051     pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
4052     PL_thismad = 0;
4053     return optype;
4054 }
4055 #endif
4056
4057 STATIC char *
4058 S_tokenize_use(pTHX_ int is_use, char *s) {
4059     dVAR;
4060
4061     PERL_ARGS_ASSERT_TOKENIZE_USE;
4062
4063     if (PL_expect != XSTATE)
4064         yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
4065                     is_use ? "use" : "no"));
4066     s = SKIPSPACE1(s);
4067     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
4068         s = force_version(s, TRUE);
4069         if (*s == ';' || *s == '}'
4070                 || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) {
4071             start_force(PL_curforce);
4072             NEXTVAL_NEXTTOKE.opval = NULL;
4073             force_next(WORD);
4074         }
4075         else if (*s == 'v') {
4076             s = force_word(s,WORD,FALSE,TRUE,FALSE);
4077             s = force_version(s, FALSE);
4078         }
4079     }
4080     else {
4081         s = force_word(s,WORD,FALSE,TRUE,FALSE);
4082         s = force_version(s, FALSE);
4083     }
4084     pl_yylval.ival = is_use;
4085     return s;
4086 }
4087 #ifdef DEBUGGING
4088     static const char* const exp_name[] =
4089         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
4090           "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
4091         };
4092 #endif
4093
4094 /*
4095   yylex
4096
4097   Works out what to call the token just pulled out of the input
4098   stream.  The yacc parser takes care of taking the ops we return and
4099   stitching them into a tree.
4100
4101   Returns:
4102     PRIVATEREF
4103
4104   Structure:
4105       if read an identifier
4106           if we're in a my declaration
4107               croak if they tried to say my($foo::bar)
4108               build the ops for a my() declaration
4109           if it's an access to a my() variable
4110               are we in a sort block?
4111                   croak if my($a); $a <=> $b
4112               build ops for access to a my() variable
4113           if in a dq string, and they've said @foo and we can't find @foo
4114               croak
4115           build ops for a bareword
4116       if we already built the token before, use it.
4117 */
4118
4119
4120 #ifdef __SC__
4121 #pragma segment Perl_yylex
4122 #endif
4123 int
4124 Perl_yylex(pTHX)
4125 {
4126     dVAR;
4127     register char *s = PL_bufptr;
4128     register char *d;
4129     STRLEN len;
4130     bool bof = FALSE;
4131     U32 fake_eof = 0;
4132
4133     /* orig_keyword, gvp, and gv are initialized here because
4134      * jump to the label just_a_word_zero can bypass their
4135      * initialization later. */
4136     I32 orig_keyword = 0;
4137     GV *gv = NULL;
4138     GV **gvp = NULL;
4139
4140     DEBUG_T( {
4141         SV* tmp = newSVpvs("");
4142         PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
4143             (IV)CopLINE(PL_curcop),
4144             lex_state_names[PL_lex_state],
4145             exp_name[PL_expect],
4146             pv_display(tmp, s, strlen(s), 0, 60));
4147         SvREFCNT_dec(tmp);
4148     } );
4149     /* check if there's an identifier for us to look at */
4150     if (PL_pending_ident)
4151         return REPORT(S_pending_ident(aTHX));
4152
4153     /* no identifier pending identification */
4154
4155     switch (PL_lex_state) {
4156 #ifdef COMMENTARY
4157     case LEX_NORMAL:            /* Some compilers will produce faster */
4158     case LEX_INTERPNORMAL:      /* code if we comment these out. */
4159         break;
4160 #endif
4161
4162     /* when we've already built the next token, just pull it out of the queue */
4163     case LEX_KNOWNEXT:
4164 #ifdef PERL_MAD
4165         PL_lasttoke--;
4166         pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
4167         if (PL_madskills) {
4168             PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
4169             PL_nexttoke[PL_lasttoke].next_mad = 0;
4170             if (PL_thismad && PL_thismad->mad_key == '_') {
4171                 PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
4172                 PL_thismad->mad_val = 0;
4173                 mad_free(PL_thismad);
4174                 PL_thismad = 0;
4175             }
4176         }
4177         if (!PL_lasttoke) {
4178             PL_lex_state = PL_lex_defer;
4179             PL_expect = PL_lex_expect;
4180             PL_lex_defer = LEX_NORMAL;
4181             if (!PL_nexttoke[PL_lasttoke].next_type)
4182                 return yylex();
4183         }
4184 #else
4185         PL_nexttoke--;
4186         pl_yylval = PL_nextval[PL_nexttoke];
4187         if (!PL_nexttoke) {
4188             PL_lex_state = PL_lex_defer;
4189             PL_expect = PL_lex_expect;
4190             PL_lex_defer = LEX_NORMAL;
4191         }
4192 #endif
4193 #ifdef PERL_MAD
4194         /* FIXME - can these be merged?  */
4195         return(PL_nexttoke[PL_lasttoke].next_type);
4196 #else
4197         return REPORT(PL_nexttype[PL_nexttoke]);
4198 #endif
4199
4200     /* interpolated case modifiers like \L \U, including \Q and \E.
4201        when we get here, PL_bufptr is at the \
4202     */
4203     case LEX_INTERPCASEMOD:
4204 #ifdef DEBUGGING
4205         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
4206             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
4207 #endif
4208         /* handle \E or end of string */
4209         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
4210             /* if at a \E */
4211             if (PL_lex_casemods) {
4212                 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
4213                 PL_lex_casestack[PL_lex_casemods] = '\0';
4214
4215                 if (PL_bufptr != PL_bufend
4216                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
4217                     PL_bufptr += 2;
4218                     PL_lex_state = LEX_INTERPCONCAT;
4219 #ifdef PERL_MAD
4220                     if (PL_madskills)
4221                         PL_thistoken = newSVpvs("\\E");
4222 #endif
4223                 }
4224                 return REPORT(')');
4225             }
4226 #ifdef PERL_MAD
4227             while (PL_bufptr != PL_bufend &&
4228               PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
4229                 if (!PL_thiswhite)
4230                     PL_thiswhite = newSVpvs("");
4231                 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
4232                 PL_bufptr += 2;
4233             }
4234 #else
4235             if (PL_bufptr != PL_bufend)
4236                 PL_bufptr += 2;
4237 #endif
4238             PL_lex_state = LEX_INTERPCONCAT;
4239             return yylex();
4240         }
4241         else {
4242             DEBUG_T({ PerlIO_printf(Perl_debug_log,
4243               "### Saw case modifier\n"); });
4244             s = PL_bufptr + 1;
4245             if (s[1] == '\\' && s[2] == 'E') {
4246 #ifdef PERL_MAD
4247                 if (!PL_thiswhite)
4248                     PL_thiswhite = newSVpvs("");
4249                 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
4250 #endif
4251                 PL_bufptr = s + 3;
4252                 PL_lex_state = LEX_INTERPCONCAT;
4253                 return yylex();
4254             }
4255             else {
4256                 I32 tmp;
4257                 if (!PL_madskills) /* when just compiling don't need correct */
4258                     if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
4259                         tmp = *s, *s = s[2], s[2] = (char)tmp;  /* misordered... */
4260                 if ((*s == 'L' || *s == 'U') &&
4261                     (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
4262                     PL_lex_casestack[--PL_lex_casemods] = '\0';
4263                     return REPORT(')');
4264                 }
4265                 if (PL_lex_casemods > 10)
4266                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
4267                 PL_lex_casestack[PL_lex_casemods++] = *s;
4268                 PL_lex_casestack[PL_lex_casemods] = '\0';
4269                 PL_lex_state = LEX_INTERPCONCAT;
4270                 start_force(PL_curforce);
4271                 NEXTVAL_NEXTTOKE.ival = 0;
4272                 force_next('(');
4273                 start_force(PL_curforce);
4274                 if (*s == 'l')
4275                     NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
4276                 else if (*s == 'u')
4277                     NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
4278                 else if (*s == 'L')
4279                     NEXTVAL_NEXTTOKE.ival = OP_LC;
4280                 else if (*s == 'U')
4281                     NEXTVAL_NEXTTOKE.ival = OP_UC;
4282                 else if (*s == 'Q')
4283                     NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
4284                 else
4285                     Perl_croak(aTHX_ "panic: yylex");
4286                 if (PL_madskills) {
4287                     SV* const tmpsv = newSVpvs("\\ ");
4288                     /* replace the space with the character we want to escape
4289                      */
4290                     SvPVX(tmpsv)[1] = *s;
4291                     curmad('_', tmpsv);
4292                 }
4293                 PL_bufptr = s + 1;
4294             }
4295             force_next(FUNC);
4296             if (PL_lex_starts) {
4297                 s = PL_bufptr;
4298                 PL_lex_starts = 0;
4299 #ifdef PERL_MAD
4300                 if (PL_madskills) {
4301                     if (PL_thistoken)
4302                         sv_free(PL_thistoken);
4303                     PL_thistoken = newSVpvs("");
4304                 }
4305 #endif
4306                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4307                 if (PL_lex_casemods == 1 && PL_lex_inpat)
4308                     OPERATOR(',');
4309                 else
4310                     Aop(OP_CONCAT);
4311             }
4312             else
4313                 return yylex();
4314         }
4315
4316     case LEX_INTERPPUSH:
4317         return REPORT(sublex_push());
4318
4319     case LEX_INTERPSTART:
4320         if (PL_bufptr == PL_bufend)
4321             return REPORT(sublex_done());
4322         DEBUG_T({ PerlIO_printf(Perl_debug_log,
4323               "### Interpolated variable\n"); });
4324         PL_expect = XTERM;
4325         PL_lex_dojoin = (*PL_bufptr == '@');
4326         PL_lex_state = LEX_INTERPNORMAL;
4327         if (PL_lex_dojoin) {
4328             start_force(PL_curforce);
4329             NEXTVAL_NEXTTOKE.ival = 0;
4330             force_next(',');
4331             start_force(PL_curforce);
4332             force_ident("\"", '$');
4333             start_force(PL_curforce);
4334             NEXTVAL_NEXTTOKE.ival = 0;
4335             force_next('$');
4336             start_force(PL_curforce);
4337             NEXTVAL_NEXTTOKE.ival = 0;
4338             force_next('(');
4339             start_force(PL_curforce);
4340             NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
4341             force_next(FUNC);
4342         }
4343         if (PL_lex_starts++) {
4344             s = PL_bufptr;
4345 #ifdef PERL_MAD
4346             if (PL_madskills) {
4347                 if (PL_thistoken)
4348                     sv_free(PL_thistoken);
4349                 PL_thistoken = newSVpvs("");
4350             }
4351 #endif
4352             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4353             if (!PL_lex_casemods && PL_lex_inpat)
4354                 OPERATOR(',');
4355             else
4356                 Aop(OP_CONCAT);
4357         }
4358         return yylex();
4359
4360     case LEX_INTERPENDMAYBE:
4361         if (intuit_more(PL_bufptr)) {
4362             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
4363             break;
4364         }
4365         /* FALL THROUGH */
4366
4367     case LEX_INTERPEND:
4368         if (PL_lex_dojoin) {
4369             PL_lex_dojoin = FALSE;
4370             PL_lex_state = LEX_INTERPCONCAT;
4371 #ifdef PERL_MAD
4372             if (PL_madskills) {
4373                 if (PL_thistoken)
4374                     sv_free(PL_thistoken);
4375                 PL_thistoken = newSVpvs("");
4376             }
4377 #endif
4378             return REPORT(')');
4379         }
4380         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
4381             && SvEVALED(PL_lex_repl))
4382         {
4383             if (PL_bufptr != PL_bufend)
4384                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
4385             PL_lex_repl = NULL;
4386         }
4387         /* FALLTHROUGH */
4388     case LEX_INTERPCONCAT:
4389 #ifdef DEBUGGING
4390         if (PL_lex_brackets)
4391             Perl_croak(aTHX_ "panic: INTERPCONCAT");
4392 #endif
4393         if (PL_bufptr == PL_bufend)
4394             return REPORT(sublex_done());
4395
4396         if (SvIVX(PL_linestr) == '\'') {
4397             SV *sv = newSVsv(PL_linestr);
4398             if (!PL_lex_inpat)
4399                 sv = tokeq(sv);
4400             else if ( PL_hints & HINT_NEW_RE )
4401                 sv = new_constant(NULL, 0, "qr", sv, sv, "q", 1);
4402             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
4403             s = PL_bufend;
4404         }
4405         else {
4406             s = scan_const(PL_bufptr);
4407             if (*s == '\\')
4408                 PL_lex_state = LEX_INTERPCASEMOD;
4409             else
4410                 PL_lex_state = LEX_INTERPSTART;
4411         }
4412
4413         if (s != PL_bufptr) {
4414             start_force(PL_curforce);
4415             if (PL_madskills) {
4416                 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
4417             }
4418             NEXTVAL_NEXTTOKE = pl_yylval;
4419             PL_expect = XTERM;
4420             force_next(THING);
4421             if (PL_lex_starts++) {
4422 #ifdef PERL_MAD
4423                 if (PL_madskills) {
4424                     if (PL_thistoken)
4425                         sv_free(PL_thistoken);
4426                     PL_thistoken = newSVpvs("");
4427                 }
4428 #endif
4429                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4430                 if (!PL_lex_casemods && PL_lex_inpat)
4431                     OPERATOR(',');
4432                 else
4433                     Aop(OP_CONCAT);
4434             }
4435             else {
4436                 PL_bufptr = s;
4437                 return yylex();
4438             }
4439         }
4440
4441         return yylex();
4442     case LEX_FORMLINE:
4443         PL_lex_state = LEX_NORMAL;
4444         s = scan_formline(PL_bufptr);
4445         if (!PL_lex_formbrack)
4446             goto rightbracket;
4447         OPERATOR(';');
4448     }
4449
4450     s = PL_bufptr;
4451     PL_oldoldbufptr = PL_oldbufptr;
4452     PL_oldbufptr = s;
4453
4454   retry:
4455 #ifdef PERL_MAD
4456     if (PL_thistoken) {
4457         sv_free(PL_thistoken);
4458         PL_thistoken = 0;
4459     }
4460     PL_realtokenstart = s - SvPVX(PL_linestr);  /* assume but undo on ws */
4461 #endif
4462     switch (*s) {
4463     default:
4464         if (isIDFIRST_lazy_if(s,UTF))
4465             goto keylookup;
4466         {
4467         unsigned char c = *s;
4468         len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
4469         if (len > UNRECOGNIZED_PRECEDE_COUNT) {
4470             d = UTF ? (char *) Perl_utf8_hop(aTHX_ (U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
4471         } else {
4472             d = PL_linestart;
4473         }       
4474         *s = '\0';
4475         Perl_croak(aTHX_ "Unrecognized character \\x%02X; marked by <-- HERE after %s<-- HERE near column %d", c, d, (int) len + 1);
4476     }
4477     case 4:
4478     case 26:
4479         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
4480     case 0:
4481 #ifdef PERL_MAD
4482         if (PL_madskills)
4483             PL_faketokens = 0;
4484 #endif
4485         if (!PL_rsfp) {
4486             PL_last_uni = 0;
4487             PL_last_lop = 0;
4488             if (PL_lex_brackets) {
4489                 yyerror((const char *)
4490                         (PL_lex_formbrack
4491                          ? "Format not terminated"
4492                          : "Missing right curly or square bracket"));
4493             }
4494             DEBUG_T( { PerlIO_printf(Perl_debug_log,
4495                         "### Tokener got EOF\n");
4496             } );
4497             TOKEN(0);
4498         }
4499         if (s++ < PL_bufend)
4500             goto retry;                 /* ignore stray nulls */
4501         PL_last_uni = 0;
4502         PL_last_lop = 0;
4503         if (!PL_in_eval && !PL_preambled) {
4504             PL_preambled = TRUE;
4505 #ifdef PERL_MAD
4506             if (PL_madskills)
4507                 PL_faketokens = 1;
4508 #endif
4509             if (PL_perldb) {
4510                 /* Generate a string of Perl code to load the debugger.
4511                  * If PERL5DB is set, it will return the contents of that,
4512                  * otherwise a compile-time require of perl5db.pl.  */
4513
4514                 const char * const pdb = PerlEnv_getenv("PERL5DB");
4515
4516                 if (pdb) {
4517                     sv_setpv(PL_linestr, pdb);
4518                     sv_catpvs(PL_linestr,";");
4519                 } else {
4520                     SETERRNO(0,SS_NORMAL);
4521                     sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
4522                 }
4523             } else
4524                 sv_setpvs(PL_linestr,"");
4525             if (PL_preambleav) {
4526                 SV **svp = AvARRAY(PL_preambleav);
4527                 SV **const end = svp + AvFILLp(PL_preambleav);
4528                 while(svp <= end) {
4529                     sv_catsv(PL_linestr, *svp);
4530                     ++svp;
4531                     sv_catpvs(PL_linestr, ";");
4532                 }
4533                 sv_free(MUTABLE_SV(PL_preambleav));
4534                 PL_preambleav = NULL;
4535             }
4536             if (PL_minus_E)
4537                 sv_catpvs(PL_linestr,
4538                           "use feature ':5." STRINGIFY(PERL_VERSION) "';");
4539             if (PL_minus_n || PL_minus_p) {
4540                 sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
4541                 if (PL_minus_l)
4542                     sv_catpvs(PL_linestr,"chomp;");
4543                 if (PL_minus_a) {
4544                     if (PL_minus_F) {
4545                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
4546                              || *PL_splitstr == '"')
4547                               && strchr(PL_splitstr + 1, *PL_splitstr))
4548                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
4549                         else {
4550                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
4551                                bytes can be used as quoting characters.  :-) */
4552                             const char *splits = PL_splitstr;
4553                             sv_catpvs(PL_linestr, "our @F=split(q\0");
4554                             do {
4555                                 /* Need to \ \s  */
4556                                 if (*splits == '\\')
4557                                     sv_catpvn(PL_linestr, splits, 1);
4558                                 sv_catpvn(PL_linestr, splits, 1);
4559                             } while (*splits++);
4560                             /* This loop will embed the trailing NUL of
4561                                PL_linestr as the last thing it does before
4562                                terminating.  */
4563                             sv_catpvs(PL_linestr, ");");
4564                         }
4565                     }
4566                     else
4567                         sv_catpvs(PL_linestr,"our @F=split(' ');");
4568                 }
4569             }
4570             sv_catpvs(PL_linestr, "\n");
4571             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4572             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4573             PL_last_lop = PL_last_uni = NULL;
4574             if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
4575                 update_debugger_info(PL_linestr, NULL, 0);
4576             goto retry;
4577         }
4578         do {
4579             fake_eof = 0;
4580             bof = PL_rsfp ? TRUE : FALSE;
4581             if (0) {
4582               fake_eof:
4583                 fake_eof = LEX_FAKE_EOF;
4584             }
4585             PL_bufptr = PL_bufend;
4586             CopLINE_inc(PL_curcop);
4587             if (!lex_next_chunk(fake_eof)) {
4588                 CopLINE_dec(PL_curcop);
4589                 s = PL_bufptr;
4590                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
4591             }
4592             CopLINE_dec(PL_curcop);
4593 #ifdef PERL_MAD
4594             if (!PL_rsfp)
4595                 PL_realtokenstart = -1;
4596 #endif
4597             s = PL_bufptr;
4598             /* If it looks like the start of a BOM or raw UTF-16,
4599              * check if it in fact is. */
4600             if (bof && PL_rsfp &&
4601                      (*s == 0 ||
4602                       *(U8*)s == 0xEF ||
4603                       *(U8*)s >= 0xFE ||
4604                       s[1] == 0)) {
4605                 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
4606                 if (bof) {
4607                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4608                     s = swallow_bom((U8*)s);
4609                 }
4610             }
4611             if (PL_doextract) {
4612                 /* Incest with pod. */
4613 #ifdef PERL_MAD
4614                 if (PL_madskills)
4615                     sv_catsv(PL_thiswhite, PL_linestr);
4616 #endif
4617                 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
4618                     sv_setpvs(PL_linestr, "");
4619                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4620                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4621                     PL_last_lop = PL_last_uni = NULL;
4622                     PL_doextract = FALSE;
4623                 }
4624             }
4625             if (PL_rsfp)
4626                 incline(s);
4627         } while (PL_doextract);
4628         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
4629         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4630         PL_last_lop = PL_last_uni = NULL;
4631         if (CopLINE(PL_curcop) == 1) {
4632             while (s < PL_bufend && isSPACE(*s))
4633                 s++;
4634             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
4635                 s++;
4636 #ifdef PERL_MAD
4637             if (PL_madskills)
4638                 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
4639 #endif
4640             d = NULL;
4641             if (!PL_in_eval) {
4642                 if (*s == '#' && *(s+1) == '!')
4643                     d = s + 2;
4644 #ifdef ALTERNATE_SHEBANG
4645                 else {
4646                     static char const as[] = ALTERNATE_SHEBANG;
4647                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
4648                         d = s + (sizeof(as) - 1);
4649                 }
4650 #endif /* ALTERNATE_SHEBANG */
4651             }
4652             if (d) {
4653                 char *ipath;
4654                 char *ipathend;
4655
4656                 while (isSPACE(*d))
4657                     d++;
4658                 ipath = d;
4659                 while (*d && !isSPACE(*d))
4660                     d++;
4661                 ipathend = d;
4662
4663 #ifdef ARG_ZERO_IS_SCRIPT
4664                 if (ipathend > ipath) {
4665                     /*
4666                      * HP-UX (at least) sets argv[0] to the script name,
4667                      * which makes $^X incorrect.  And Digital UNIX and Linux,
4668                      * at least, set argv[0] to the basename of the Perl
4669                      * interpreter. So, having found "#!", we'll set it right.
4670                      */
4671                     SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
4672                                                     SVt_PV)); /* $^X */
4673                     assert(SvPOK(x) || SvGMAGICAL(x));
4674                     if (sv_eq(x, CopFILESV(PL_curcop))) {
4675                         sv_setpvn(x, ipath, ipathend - ipath);
4676                         SvSETMAGIC(x);
4677                     }
4678                     else {
4679                         STRLEN blen;
4680                         STRLEN llen;
4681                         const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
4682                         const char * const lstart = SvPV_const(x,llen);
4683                         if (llen < blen) {
4684                             bstart += blen - llen;
4685                             if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
4686                                 sv_setpvn(x, ipath, ipathend - ipath);
4687                                 SvSETMAGIC(x);
4688                             }
4689                         }
4690                     }
4691                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
4692                 }
4693 #endif /* ARG_ZERO_IS_SCRIPT */
4694
4695                 /*
4696                  * Look for options.
4697                  */
4698                 d = instr(s,"perl -");
4699                 if (!d) {
4700                     d = instr(s,"perl");
4701 #if defined(DOSISH)
4702                     /* avoid getting into infinite loops when shebang
4703                      * line contains "Perl" rather than "perl" */
4704                     if (!d) {
4705                         for (d = ipathend-4; d >= ipath; --d) {
4706                             if ((*d == 'p' || *d == 'P')
4707                                 && !ibcmp(d, "perl", 4))
4708                             {
4709                                 break;
4710                             }
4711                         }
4712                         if (d < ipath)
4713                             d = NULL;
4714                     }
4715 #endif
4716                 }
4717 #ifdef ALTERNATE_SHEBANG
4718                 /*
4719                  * If the ALTERNATE_SHEBANG on this system starts with a
4720                  * character that can be part of a Perl expression, then if
4721                  * we see it but not "perl", we're probably looking at the
4722                  * start of Perl code, not a request to hand off to some
4723                  * other interpreter.  Similarly, if "perl" is there, but
4724                  * not in the first 'word' of the line, we assume the line
4725                  * contains the start of the Perl program.
4726                  */
4727                 if (d && *s != '#') {
4728                     const char *c = ipath;
4729                     while (*c && !strchr("; \t\r\n\f\v#", *c))
4730                         c++;
4731                     if (c < d)
4732                         d = NULL;       /* "perl" not in first word; ignore */
4733                     else
4734                         *s = '#';       /* Don't try to parse shebang line */
4735                 }
4736 #endif /* ALTERNATE_SHEBANG */
4737                 if (!d &&
4738                     *s == '#' &&
4739                     ipathend > ipath &&
4740                     !PL_minus_c &&
4741                     !instr(s,"indir") &&
4742                     instr(PL_origargv[0],"perl"))
4743                 {
4744                     dVAR;
4745                     char **newargv;
4746
4747                     *ipathend = '\0';
4748                     s = ipathend + 1;
4749                     while (s < PL_bufend && isSPACE(*s))
4750                         s++;
4751                     if (s < PL_bufend) {
4752                         Newx(newargv,PL_origargc+3,char*);
4753                         newargv[1] = s;
4754                         while (s < PL_bufend && !isSPACE(*s))
4755                             s++;
4756                         *s = '\0';
4757                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
4758                     }
4759                     else
4760                         newargv = PL_origargv;
4761                     newargv[0] = ipath;
4762                     PERL_FPU_PRE_EXEC
4763                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
4764                     PERL_FPU_POST_EXEC
4765                     Perl_croak(aTHX_ "Can't exec %s", ipath);
4766                 }
4767                 if (d) {
4768                     while (*d && !isSPACE(*d))
4769                         d++;
4770                     while (SPACE_OR_TAB(*d))
4771                         d++;
4772
4773                     if (*d++ == '-') {
4774                         const bool switches_done = PL_doswitches;
4775                         const U32 oldpdb = PL_perldb;
4776                         const bool oldn = PL_minus_n;
4777                         const bool oldp = PL_minus_p;
4778                         const char *d1 = d;
4779
4780                         do {
4781                             bool baduni = FALSE;
4782                             if (*d1 == 'C') {
4783                                 const char *d2 = d1 + 1;
4784                                 if (parse_unicode_opts((const char **)&d2)
4785                                     != PL_unicode)
4786                                     baduni = TRUE;
4787                             }
4788                             if (baduni || *d1 == 'M' || *d1 == 'm') {
4789                                 const char * const m = d1;
4790                                 while (*d1 && !isSPACE(*d1))
4791                                     d1++;
4792                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
4793                                       (int)(d1 - m), m);
4794                             }
4795                             d1 = moreswitches(d1);
4796                         } while (d1);
4797                         if (PL_doswitches && !switches_done) {
4798                             int argc = PL_origargc;
4799                             char **argv = PL_origargv;
4800                             do {
4801                                 argc--,argv++;
4802                             } while (argc && argv[0][0] == '-' && argv[0][1]);
4803                             init_argv_symbols(argc,argv);
4804                         }
4805                         if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
4806                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
4807                               /* if we have already added "LINE: while (<>) {",
4808                                  we must not do it again */
4809                         {
4810                             sv_setpvs(PL_linestr, "");
4811                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4812                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4813                             PL_last_lop = PL_last_uni = NULL;
4814                             PL_preambled = FALSE;
4815                             if (PERLDB_LINE || PERLDB_SAVESRC)
4816                                 (void)gv_fetchfile(PL_origfilename);
4817                             goto retry;
4818                         }
4819                     }
4820                 }
4821             }
4822         }
4823         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4824             PL_bufptr = s;
4825             PL_lex_state = LEX_FORMLINE;
4826             return yylex();
4827         }
4828         goto retry;
4829     case '\r':
4830 #ifdef PERL_STRICT_CR
4831         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4832         Perl_croak(aTHX_
4833       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
4834 #endif
4835     case ' ': case '\t': case '\f': case 013:
4836 #ifdef PERL_MAD
4837         PL_realtokenstart = -1;
4838         if (!PL_thiswhite)
4839             PL_thiswhite = newSVpvs("");
4840         sv_catpvn(PL_thiswhite, s, 1);
4841 #endif
4842         s++;
4843         goto retry;
4844     case '#':
4845     case '\n':
4846 #ifdef PERL_MAD
4847         PL_realtokenstart = -1;
4848         if (PL_madskills)
4849             PL_faketokens = 0;
4850 #endif
4851         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
4852             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
4853                 /* handle eval qq[#line 1 "foo"\n ...] */
4854                 CopLINE_dec(PL_curcop);
4855                 incline(s);
4856             }
4857             if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
4858                 s = SKIPSPACE0(s);
4859                 if (!PL_in_eval || PL_rsfp)
4860                     incline(s);
4861             }
4862             else {
4863                 d = s;
4864                 while (d < PL_bufend && *d != '\n')
4865                     d++;
4866                 if (d < PL_bufend)
4867                     d++;
4868                 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4869                   Perl_croak(aTHX_ "panic: input overflow");
4870 #ifdef PERL_MAD
4871                 if (PL_madskills)
4872                     PL_thiswhite = newSVpvn(s, d - s);
4873 #endif
4874                 s = d;
4875                 incline(s);
4876             }
4877             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4878                 PL_bufptr = s;
4879                 PL_lex_state = LEX_FORMLINE;
4880                 return yylex();
4881             }
4882         }
4883         else {
4884 #ifdef PERL_MAD
4885             if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
4886                 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
4887                     PL_faketokens = 0;
4888                     s = SKIPSPACE0(s);
4889                     TOKEN(PEG); /* make sure any #! line is accessible */
4890                 }
4891                 s = SKIPSPACE0(s);
4892             }
4893             else {
4894 /*              if (PL_madskills && PL_lex_formbrack) { */
4895                     d = s;
4896                     while (d < PL_bufend && *d != '\n')
4897                         d++;
4898                     if (d < PL_bufend)
4899                         d++;
4900                     else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4901                       Perl_croak(aTHX_ "panic: input overflow");
4902                     if (PL_madskills && CopLINE(PL_curcop) >= 1) {
4903                         if (!PL_thiswhite)
4904                             PL_thiswhite = newSVpvs("");
4905                         if (CopLINE(PL_curcop) == 1) {
4906                             sv_setpvs(PL_thiswhite, "");
4907                             PL_faketokens = 0;
4908                         }
4909                         sv_catpvn(PL_thiswhite, s, d - s);
4910                     }
4911                     s = d;
4912 /*              }
4913                 *s = '\0';
4914                 PL_bufend = s; */
4915             }
4916 #else
4917             *s = '\0';
4918             PL_bufend = s;
4919 #endif
4920         }
4921         goto retry;
4922     case '-':
4923         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
4924             I32 ftst = 0;
4925             char tmp;
4926
4927             s++;
4928             PL_bufptr = s;
4929             tmp = *s++;
4930
4931             while (s < PL_bufend && SPACE_OR_TAB(*s))
4932                 s++;
4933
4934             if (strnEQ(s,"=>",2)) {
4935                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
4936                 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
4937                 OPERATOR('-');          /* unary minus */
4938             }
4939             PL_last_uni = PL_oldbufptr;
4940             switch (tmp) {
4941             case 'r': ftst = OP_FTEREAD;        break;
4942             case 'w': ftst = OP_FTEWRITE;       break;
4943             case 'x': ftst = OP_FTEEXEC;        break;
4944             case 'o': ftst = OP_FTEOWNED;       break;
4945             case 'R': ftst = OP_FTRREAD;        break;
4946             case 'W': ftst = OP_FTRWRITE;       break;
4947             case 'X': ftst = OP_FTREXEC;        break;
4948             case 'O': ftst = OP_FTROWNED;       break;
4949             case 'e': ftst = OP_FTIS;           break;
4950             case 'z': ftst = OP_FTZERO;         break;
4951             case 's': ftst = OP_FTSIZE;         break;
4952             case 'f': ftst = OP_FTFILE;         break;
4953             case 'd': ftst = OP_FTDIR;          break;
4954             case 'l': ftst = OP_FTLINK;         break;
4955             case 'p': ftst = OP_FTPIPE;         break;
4956             case 'S': ftst = OP_FTSOCK;         break;
4957             case 'u': ftst = OP_FTSUID;         break;
4958             case 'g': ftst = OP_FTSGID;         break;
4959             case 'k': ftst = OP_FTSVTX;         break;
4960             case 'b': ftst = OP_FTBLK;          break;
4961             case 'c': ftst = OP_FTCHR;          break;
4962             case 't': ftst = OP_FTTTY;          break;
4963             case 'T': ftst = OP_FTTEXT;         break;
4964             case 'B': ftst = OP_FTBINARY;       break;
4965             case 'M': case 'A': case 'C':
4966                 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
4967                 switch (tmp) {
4968                 case 'M': ftst = OP_FTMTIME;    break;
4969                 case 'A': ftst = OP_FTATIME;    break;
4970                 case 'C': ftst = OP_FTCTIME;    break;
4971                 default:                        break;
4972                 }
4973                 break;
4974             default:
4975                 break;
4976             }
4977             if (ftst) {
4978                 PL_last_lop_op = (OPCODE)ftst;
4979                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
4980                         "### Saw file test %c\n", (int)tmp);
4981                 } );
4982                 FTST(ftst);
4983             }
4984             else {
4985                 /* Assume it was a minus followed by a one-letter named
4986                  * subroutine call (or a -bareword), then. */
4987                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
4988                         "### '-%c' looked like a file test but was not\n",
4989                         (int) tmp);
4990                 } );
4991                 s = --PL_bufptr;
4992             }
4993         }
4994         {
4995             const char tmp = *s++;
4996             if (*s == tmp) {
4997                 s++;
4998                 if (PL_expect == XOPERATOR)
4999                     TERM(POSTDEC);
5000                 else
5001                     OPERATOR(PREDEC);
5002             }
5003             else if (*s == '>') {
5004                 s++;
5005                 s = SKIPSPACE1(s);
5006                 if (isIDFIRST_lazy_if(s,UTF)) {
5007                     s = force_word(s,METHOD,FALSE,TRUE,FALSE);
5008                     TOKEN(ARROW);
5009                 }
5010                 else if (*s == '$')
5011                     OPERATOR(ARROW);
5012                 else
5013                     TERM(ARROW);
5014             }
5015             if (PL_expect == XOPERATOR)
5016                 Aop(OP_SUBTRACT);
5017             else {
5018                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5019                     check_uni();
5020                 OPERATOR('-');          /* unary minus */
5021             }
5022         }
5023
5024     case '+':
5025         {
5026             const char tmp = *s++;
5027             if (*s == tmp) {
5028                 s++;
5029                 if (PL_expect == XOPERATOR)
5030                     TERM(POSTINC);
5031                 else
5032                     OPERATOR(PREINC);
5033             }
5034             if (PL_expect == XOPERATOR)
5035                 Aop(OP_ADD);
5036             else {
5037                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
5038                     check_uni();
5039                 OPERATOR('+');
5040             }
5041         }
5042
5043     case '*':
5044         if (PL_expect != XOPERATOR) {
5045             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5046             PL_expect = XOPERATOR;
5047             force_ident(PL_tokenbuf, '*');
5048             if (!*PL_tokenbuf)
5049                 PREREF('*');
5050             TERM('*');
5051         }
5052         s++;
5053         if (*s == '*') {
5054             s++;
5055             PWop(OP_POW);
5056         }
5057         Mop(OP_MULTIPLY);
5058
5059     case '%':
5060         if (PL_expect == XOPERATOR) {
5061             ++s;
5062             Mop(OP_MODULO);
5063         }
5064         PL_tokenbuf[0] = '%';
5065         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5066                 sizeof PL_tokenbuf - 1, FALSE);
5067         if (!PL_tokenbuf[1]) {
5068             PREREF('%');
5069         }
5070         PL_pending_ident = '%';
5071         TERM('%');
5072
5073     case '^':
5074         s++;
5075         BOop(OP_BIT_XOR);
5076     case '[':
5077         PL_lex_brackets++;
5078         {
5079             const char tmp = *s++;
5080             OPERATOR(tmp);
5081         }
5082     case '~':
5083         if (s[1] == '~'
5084             && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
5085         {
5086             s += 2;
5087             Eop(OP_SMARTMATCH);
5088         }
5089     case ',':
5090         {
5091             const char tmp = *s++;
5092             OPERATOR(tmp);
5093         }
5094     case ':':
5095         if (s[1] == ':') {
5096             len = 0;
5097             goto just_a_word_zero_gv;
5098         }
5099         s++;
5100         switch (PL_expect) {
5101             OP *attrs;
5102 #ifdef PERL_MAD
5103             I32 stuffstart;
5104 #endif
5105         case XOPERATOR:
5106             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
5107                 break;
5108             PL_bufptr = s;      /* update in case we back off */
5109             if (*s == '=') {
5110                 deprecate(":= for an empty attribute list");
5111             }
5112             goto grabattrs;
5113         case XATTRBLOCK:
5114             PL_expect = XBLOCK;
5115             goto grabattrs;
5116         case XATTRTERM:
5117             PL_expect = XTERMBLOCK;
5118          grabattrs:
5119 #ifdef PERL_MAD
5120             stuffstart = s - SvPVX(PL_linestr) - 1;
5121 #endif
5122             s = PEEKSPACE(s);
5123             attrs = NULL;
5124             while (isIDFIRST_lazy_if(s,UTF)) {
5125                 I32 tmp;
5126                 SV *sv;
5127                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5128                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
5129                     if (tmp < 0) tmp = -tmp;
5130                     switch (tmp) {
5131                     case KEY_or:
5132                     case KEY_and:
5133                     case KEY_for:
5134                     case KEY_foreach:
5135                     case KEY_unless:
5136                     case KEY_if:
5137                     case KEY_while:
5138                     case KEY_until:
5139                         goto got_attrs;
5140                     default:
5141                         break;
5142                     }
5143                 }
5144                 sv = newSVpvn(s, len);
5145                 if (*d == '(') {
5146                     d = scan_str(d,TRUE,TRUE);
5147                     if (!d) {
5148                         /* MUST advance bufptr here to avoid bogus
5149                            "at end of line" context messages from yyerror().
5150                          */
5151                         PL_bufptr = s + len;
5152                         yyerror("Unterminated attribute parameter in attribute list");
5153                         if (attrs)
5154                             op_free(attrs);
5155                         sv_free(sv);
5156                         return REPORT(0);       /* EOF indicator */
5157                     }
5158                 }
5159                 if (PL_lex_stuff) {
5160                     sv_catsv(sv, PL_lex_stuff);
5161                     attrs = append_elem(OP_LIST, attrs,
5162                                         newSVOP(OP_CONST, 0, sv));
5163                     SvREFCNT_dec(PL_lex_stuff);
5164                     PL_lex_stuff = NULL;
5165                 }
5166                 else {
5167                     if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
5168                         sv_free(sv);
5169                         if (PL_in_my == KEY_our) {
5170                             deprecate(":unique");
5171                         }
5172                         else
5173                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
5174                     }
5175
5176                     /* NOTE: any CV attrs applied here need to be part of
5177                        the CVf_BUILTIN_ATTRS define in cv.h! */
5178                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
5179                         sv_free(sv);
5180                         CvLVALUE_on(PL_compcv);
5181                     }
5182                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
5183                         sv_free(sv);
5184                         deprecate(":locked");
5185                     }
5186                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
5187                         sv_free(sv);
5188                         CvMETHOD_on(PL_compcv);
5189                     }
5190                     /* After we've set the flags, it could be argued that
5191                        we don't need to do the attributes.pm-based setting
5192                        process, and shouldn't bother appending recognized
5193                        flags.  To experiment with that, uncomment the
5194                        following "else".  (Note that's already been
5195                        uncommented.  That keeps the above-applied built-in
5196                        attributes from being intercepted (and possibly
5197                        rejected) by a package's attribute routines, but is
5198                        justified by the performance win for the common case
5199                        of applying only built-in attributes.) */
5200                     else
5201                         attrs = append_elem(OP_LIST, attrs,
5202                                             newSVOP(OP_CONST, 0,
5203                                                     sv));
5204                 }
5205                 s = PEEKSPACE(d);
5206                 if (*s == ':' && s[1] != ':')
5207                     s = PEEKSPACE(s+1);
5208                 else if (s == d)
5209                     break;      /* require real whitespace or :'s */
5210                 /* XXX losing whitespace on sequential attributes here */
5211             }
5212             {
5213                 const char tmp
5214                     = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
5215                 if (*s != ';' && *s != '}' && *s != tmp
5216                     && (tmp != '=' || *s != ')')) {
5217                     const char q = ((*s == '\'') ? '"' : '\'');
5218                     /* If here for an expression, and parsed no attrs, back
5219                        off. */
5220                     if (tmp == '=' && !attrs) {
5221                         s = PL_bufptr;
5222                         break;
5223                     }
5224                     /* MUST advance bufptr here to avoid bogus "at end of line"
5225                        context messages from yyerror().
5226                     */
5227                     PL_bufptr = s;
5228                     yyerror( (const char *)
5229                              (*s
5230                               ? Perl_form(aTHX_ "Invalid separator character "
5231                                           "%c%c%c in attribute list", q, *s, q)
5232                               : "Unterminated attribute list" ) );
5233                     if (attrs)
5234                         op_free(attrs);
5235                     OPERATOR(':');
5236                 }
5237             }
5238         got_attrs:
5239             if (attrs) {
5240                 start_force(PL_curforce);
5241                 NEXTVAL_NEXTTOKE.opval = attrs;
5242                 CURMAD('_', PL_nextwhite);
5243                 force_next(THING);
5244             }
5245 #ifdef PERL_MAD
5246             if (PL_madskills) {
5247                 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5248                                      (s - SvPVX(PL_linestr)) - stuffstart);
5249             }
5250 #endif
5251             TOKEN(COLONATTR);
5252         }
5253         OPERATOR(':');
5254     case '(':
5255         s++;
5256         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
5257             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
5258         else
5259             PL_expect = XTERM;
5260         s = SKIPSPACE1(s);
5261         TOKEN('(');
5262     case ';':
5263         CLINE;
5264         {
5265             const char tmp = *s++;
5266             OPERATOR(tmp);
5267         }
5268     case ')':
5269         {
5270             const char tmp = *s++;
5271             s = SKIPSPACE1(s);
5272             if (*s == '{')
5273                 PREBLOCK(tmp);
5274             TERM(tmp);
5275         }
5276     case ']':
5277         s++;
5278         if (PL_lex_brackets <= 0)
5279             yyerror("Unmatched right square bracket");
5280         else
5281             --PL_lex_brackets;
5282         if (PL_lex_state == LEX_INTERPNORMAL) {
5283             if (PL_lex_brackets == 0) {
5284                 if (*s == '-' && s[1] == '>')
5285                     PL_lex_state = LEX_INTERPENDMAYBE;
5286                 else if (*s != '[' && *s != '{')
5287                     PL_lex_state = LEX_INTERPEND;
5288             }
5289         }
5290         TERM(']');
5291     case '{':
5292       leftbracket:
5293         s++;
5294         if (PL_lex_brackets > 100) {
5295             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
5296         }
5297         switch (PL_expect) {
5298         case XTERM:
5299             if (PL_lex_formbrack) {
5300                 s--;
5301                 PRETERMBLOCK(DO);
5302             }
5303             if (PL_oldoldbufptr == PL_last_lop)
5304                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5305             else
5306                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5307             OPERATOR(HASHBRACK);
5308         case XOPERATOR:
5309             while (s < PL_bufend && SPACE_OR_TAB(*s))
5310                 s++;
5311             d = s;
5312             PL_tokenbuf[0] = '\0';
5313             if (d < PL_bufend && *d == '-') {
5314                 PL_tokenbuf[0] = '-';
5315                 d++;
5316                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5317                     d++;
5318             }
5319             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
5320                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
5321                               FALSE, &len);
5322                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5323                     d++;
5324                 if (*d == '}') {
5325                     const char minus = (PL_tokenbuf[0] == '-');
5326                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
5327                     if (minus)
5328                         force_next('-');
5329                 }
5330             }
5331             /* FALL THROUGH */
5332         case XATTRBLOCK:
5333         case XBLOCK:
5334             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
5335             PL_expect = XSTATE;
5336             break;
5337         case XATTRTERM:
5338         case XTERMBLOCK:
5339             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5340             PL_expect = XSTATE;
5341             break;
5342         default: {
5343                 const char *t;
5344                 if (PL_oldoldbufptr == PL_last_lop)
5345                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5346                 else
5347                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5348                 s = SKIPSPACE1(s);
5349                 if (*s == '}') {
5350                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
5351                         PL_expect = XTERM;
5352                         /* This hack is to get the ${} in the message. */
5353                         PL_bufptr = s+1;
5354                         yyerror("syntax error");
5355                         break;
5356                     }
5357                     OPERATOR(HASHBRACK);
5358                 }
5359                 /* This hack serves to disambiguate a pair of curlies
5360                  * as being a block or an anon hash.  Normally, expectation
5361                  * determines that, but in cases where we're not in a
5362                  * position to expect anything in particular (like inside
5363                  * eval"") we have to resolve the ambiguity.  This code
5364                  * covers the case where the first term in the curlies is a
5365                  * quoted string.  Most other cases need to be explicitly
5366                  * disambiguated by prepending a "+" before the opening
5367                  * curly in order to force resolution as an anon hash.
5368                  *
5369                  * XXX should probably propagate the outer expectation
5370                  * into eval"" to rely less on this hack, but that could
5371                  * potentially break current behavior of eval"".
5372                  * GSAR 97-07-21
5373                  */
5374                 t = s;
5375                 if (*s == '\'' || *s == '"' || *s == '`') {
5376                     /* common case: get past first string, handling escapes */
5377                     for (t++; t < PL_bufend && *t != *s;)
5378                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
5379                             t++;
5380                     t++;
5381                 }
5382                 else if (*s == 'q') {
5383                     if (++t < PL_bufend
5384                         && (!isALNUM(*t)
5385                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
5386                                 && !isALNUM(*t))))
5387                     {
5388                         /* skip q//-like construct */
5389                         const char *tmps;
5390                         char open, close, term;
5391                         I32 brackets = 1;
5392
5393                         while (t < PL_bufend && isSPACE(*t))
5394                             t++;
5395                         /* check for q => */
5396                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
5397                             OPERATOR(HASHBRACK);
5398                         }
5399                         term = *t;
5400                         open = term;
5401                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5402                             term = tmps[5];
5403                         close = term;
5404                         if (open == close)
5405                             for (t++; t < PL_bufend; t++) {
5406                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
5407                                     t++;
5408                                 else if (*t == open)
5409                                     break;
5410                             }
5411                         else {
5412                             for (t++; t < PL_bufend; t++) {
5413                                 if (*t == '\\' && t+1 < PL_bufend)
5414                                     t++;
5415                                 else if (*t == close && --brackets <= 0)
5416                                     break;
5417                                 else if (*t == open)
5418                                     brackets++;
5419                             }
5420                         }
5421                         t++;
5422                     }
5423                     else
5424                         /* skip plain q word */
5425                         while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5426                              t += UTF8SKIP(t);
5427                 }
5428                 else if (isALNUM_lazy_if(t,UTF)) {
5429                     t += UTF8SKIP(t);
5430                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5431                          t += UTF8SKIP(t);
5432                 }
5433                 while (t < PL_bufend && isSPACE(*t))
5434                     t++;
5435                 /* if comma follows first term, call it an anon hash */
5436                 /* XXX it could be a comma expression with loop modifiers */
5437                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
5438                                    || (*t == '=' && t[1] == '>')))
5439                     OPERATOR(HASHBRACK);
5440                 if (PL_expect == XREF)
5441                     PL_expect = XTERM;
5442                 else {
5443                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
5444                     PL_expect = XSTATE;
5445                 }
5446             }
5447             break;
5448         }
5449         pl_yylval.ival = CopLINE(PL_curcop);
5450         if (isSPACE(*s) || *s == '#')
5451             PL_copline = NOLINE;   /* invalidate current command line number */
5452         TOKEN('{');
5453     case '}':
5454       rightbracket:
5455         s++;
5456         if (PL_lex_brackets <= 0)
5457             yyerror("Unmatched right curly bracket");
5458         else
5459             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
5460         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
5461             PL_lex_formbrack = 0;
5462         if (PL_lex_state == LEX_INTERPNORMAL) {
5463             if (PL_lex_brackets == 0) {
5464                 if (PL_expect & XFAKEBRACK) {
5465                     PL_expect &= XENUMMASK;
5466                     PL_lex_state = LEX_INTERPEND;
5467                     PL_bufptr = s;
5468 #if 0
5469                     if (PL_madskills) {
5470                         if (!PL_thiswhite)
5471                             PL_thiswhite = newSVpvs("");
5472                         sv_catpvs(PL_thiswhite,"}");
5473                     }
5474 #endif
5475                     return yylex();     /* ignore fake brackets */
5476                 }
5477                 if (*s == '-' && s[1] == '>')
5478                     PL_lex_state = LEX_INTERPENDMAYBE;
5479                 else if (*s != '[' && *s != '{')
5480                     PL_lex_state = LEX_INTERPEND;
5481             }
5482         }
5483         if (PL_expect & XFAKEBRACK) {
5484             PL_expect &= XENUMMASK;
5485             PL_bufptr = s;
5486             return yylex();             /* ignore fake brackets */
5487         }
5488         start_force(PL_curforce);
5489         if (PL_madskills) {
5490             curmad('X', newSVpvn(s-1,1));
5491             CURMAD('_', PL_thiswhite);
5492         }
5493         force_next('}');
5494 #ifdef PERL_MAD
5495         if (!PL_thistoken)
5496             PL_thistoken = newSVpvs("");
5497 #endif
5498         TOKEN(';');
5499     case '&':
5500         s++;
5501         if (*s++ == '&')
5502             AOPERATOR(ANDAND);
5503         s--;
5504         if (PL_expect == XOPERATOR) {
5505             if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
5506                 && isIDFIRST_lazy_if(s,UTF))
5507             {
5508                 CopLINE_dec(PL_curcop);
5509                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
5510                 CopLINE_inc(PL_curcop);
5511             }
5512             BAop(OP_BIT_AND);
5513         }
5514
5515         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5516         if (*PL_tokenbuf) {
5517             PL_expect = XOPERATOR;
5518             force_ident(PL_tokenbuf, '&');
5519         }
5520         else
5521             PREREF('&');
5522         pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
5523         TERM('&');
5524
5525     case '|':
5526         s++;
5527         if (*s++ == '|')
5528             AOPERATOR(OROR);
5529         s--;
5530         BOop(OP_BIT_OR);
5531     case '=':
5532         s++;
5533         {
5534             const char tmp = *s++;
5535             if (tmp == '=')
5536                 Eop(OP_EQ);
5537             if (tmp == '>')
5538                 OPERATOR(',');
5539             if (tmp == '~')
5540                 PMop(OP_MATCH);
5541             if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
5542                 && strchr("+-*/%.^&|<",tmp))
5543                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5544                             "Reversed %c= operator",(int)tmp);
5545             s--;
5546             if (PL_expect == XSTATE && isALPHA(tmp) &&
5547                 (s == PL_linestart+1 || s[-2] == '\n') )
5548                 {
5549                     if (PL_in_eval && !PL_rsfp) {
5550                         d = PL_bufend;
5551                         while (s < d) {
5552                             if (*s++ == '\n') {
5553                                 incline(s);
5554                                 if (strnEQ(s,"=cut",4)) {
5555                                     s = strchr(s,'\n');
5556                                     if (s)
5557                                         s++;
5558                                     else
5559                                         s = d;
5560                                     incline(s);
5561                                     goto retry;
5562                                 }
5563                             }
5564                         }
5565                         goto retry;
5566                     }
5567 #ifdef PERL_MAD
5568                     if (PL_madskills) {
5569                         if (!PL_thiswhite)
5570                             PL_thiswhite = newSVpvs("");
5571                         sv_catpvn(PL_thiswhite, PL_linestart,
5572                                   PL_bufend - PL_linestart);
5573                     }
5574 #endif
5575                     s = PL_bufend;
5576                     PL_doextract = TRUE;
5577                     goto retry;
5578                 }
5579         }
5580         if (PL_lex_brackets < PL_lex_formbrack) {
5581             const char *t = s;
5582 #ifdef PERL_STRICT_CR
5583             while (SPACE_OR_TAB(*t))
5584 #else
5585             while (SPACE_OR_TAB(*t) || *t == '\r')
5586 #endif
5587                 t++;
5588             if (*t == '\n' || *t == '#') {
5589                 s--;
5590                 PL_expect = XBLOCK;
5591                 goto leftbracket;
5592             }
5593         }
5594         pl_yylval.ival = 0;
5595         OPERATOR(ASSIGNOP);
5596     case '!':
5597         s++;
5598         {
5599             const char tmp = *s++;
5600             if (tmp == '=') {
5601                 /* was this !=~ where !~ was meant?
5602                  * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
5603
5604                 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
5605                     const char *t = s+1;
5606
5607                     while (t < PL_bufend && isSPACE(*t))
5608                         ++t;
5609
5610                     if (*t == '/' || *t == '?' ||
5611                         ((*t == 'm' || *t == 's' || *t == 'y')
5612                          && !isALNUM(t[1])) ||
5613                         (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
5614                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5615                                     "!=~ should be !~");
5616                 }
5617                 Eop(OP_NE);
5618             }
5619             if (tmp == '~')
5620                 PMop(OP_NOT);
5621         }
5622         s--;
5623         OPERATOR('!');
5624     case '<':
5625         if (PL_expect != XOPERATOR) {
5626             if (s[1] != '<' && !strchr(s,'>'))
5627                 check_uni();
5628             if (s[1] == '<')
5629                 s = scan_heredoc(s);
5630             else
5631                 s = scan_inputsymbol(s);
5632             TERM(sublex_start());
5633         }
5634         s++;
5635         {
5636             char tmp = *s++;
5637             if (tmp == '<')
5638                 SHop(OP_LEFT_SHIFT);
5639             if (tmp == '=') {
5640                 tmp = *s++;
5641                 if (tmp == '>')
5642                     Eop(OP_NCMP);
5643                 s--;
5644                 Rop(OP_LE);
5645             }
5646         }
5647         s--;
5648         Rop(OP_LT);
5649     case '>':
5650         s++;
5651         {
5652             const char tmp = *s++;
5653             if (tmp == '>')
5654                 SHop(OP_RIGHT_SHIFT);
5655             else if (tmp == '=')
5656                 Rop(OP_GE);
5657         }
5658         s--;
5659         Rop(OP_GT);
5660
5661     case '$':
5662         CLINE;
5663
5664         if (PL_expect == XOPERATOR) {
5665             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5666                 return deprecate_commaless_var_list();
5667             }
5668         }
5669
5670         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
5671             PL_tokenbuf[0] = '@';
5672             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
5673                            sizeof PL_tokenbuf - 1, FALSE);
5674             if (PL_expect == XOPERATOR)
5675                 no_op("Array length", s);
5676             if (!PL_tokenbuf[1])
5677                 PREREF(DOLSHARP);
5678             PL_expect = XOPERATOR;
5679             PL_pending_ident = '#';
5680             TOKEN(DOLSHARP);
5681         }
5682
5683         PL_tokenbuf[0] = '$';
5684         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5685                        sizeof PL_tokenbuf - 1, FALSE);
5686         if (PL_expect == XOPERATOR)
5687             no_op("Scalar", s);
5688         if (!PL_tokenbuf[1]) {
5689             if (s == PL_bufend)
5690                 yyerror("Final $ should be \\$ or $name");
5691             PREREF('$');
5692         }
5693
5694         /* This kludge not intended to be bulletproof. */
5695         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
5696             pl_yylval.opval = newSVOP(OP_CONST, 0,
5697                                    newSViv(CopARYBASE_get(&PL_compiling)));
5698             pl_yylval.opval->op_private = OPpCONST_ARYBASE;
5699             TERM(THING);
5700         }
5701
5702         d = s;
5703         {
5704             const char tmp = *s;
5705             if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
5706                 s = SKIPSPACE1(s);
5707
5708             if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
5709                 && intuit_more(s)) {
5710                 if (*s == '[') {
5711                     PL_tokenbuf[0] = '@';
5712                     if (ckWARN(WARN_SYNTAX)) {
5713                         char *t = s+1;
5714
5715                         while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
5716                             t++;
5717                         if (*t++ == ',') {
5718                             PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5719                             while (t < PL_bufend && *t != ']')
5720                                 t++;
5721                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5722                                         "Multidimensional syntax %.*s not supported",
5723                                     (int)((t - PL_bufptr) + 1), PL_bufptr);
5724                         }
5725                     }
5726                 }
5727                 else if (*s == '{') {
5728                     char *t;
5729                     PL_tokenbuf[0] = '%';
5730                     if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
5731                         && (t = strchr(s, '}')) && (t = strchr(t, '=')))
5732                         {
5733                             char tmpbuf[sizeof PL_tokenbuf];
5734                             do {
5735                                 t++;
5736                             } while (isSPACE(*t));
5737                             if (isIDFIRST_lazy_if(t,UTF)) {
5738                                 STRLEN len;
5739                                 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
5740                                               &len);
5741                                 while (isSPACE(*t))
5742                                     t++;
5743                                 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
5744                                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5745                                                 "You need to quote \"%s\"",
5746                                                 tmpbuf);
5747                             }
5748                         }
5749                 }
5750             }
5751
5752             PL_expect = XOPERATOR;
5753             if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
5754                 const bool islop = (PL_last_lop == PL_oldoldbufptr);
5755                 if (!islop || PL_last_lop_op == OP_GREPSTART)
5756                     PL_expect = XOPERATOR;
5757                 else if (strchr("$@\"'`q", *s))
5758                     PL_expect = XTERM;          /* e.g. print $fh "foo" */
5759                 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
5760                     PL_expect = XTERM;          /* e.g. print $fh &sub */
5761                 else if (isIDFIRST_lazy_if(s,UTF)) {
5762                     char tmpbuf[sizeof PL_tokenbuf];
5763                     int t2;
5764                     scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5765                     if ((t2 = keyword(tmpbuf, len, 0))) {
5766                         /* binary operators exclude handle interpretations */
5767                         switch (t2) {
5768                         case -KEY_x:
5769                         case -KEY_eq:
5770                         case -KEY_ne:
5771                         case -KEY_gt:
5772                         case -KEY_lt:
5773                         case -KEY_ge:
5774                         case -KEY_le:
5775                         case -KEY_cmp:
5776                             break;
5777                         default:
5778                             PL_expect = XTERM;  /* e.g. print $fh length() */
5779                             break;
5780                         }
5781                     }
5782                     else {
5783                         PL_expect = XTERM;      /* e.g. print $fh subr() */
5784                     }
5785                 }
5786                 else if (isDIGIT(*s))
5787                     PL_expect = XTERM;          /* e.g. print $fh 3 */
5788                 else if (*s == '.' && isDIGIT(s[1]))
5789                     PL_expect = XTERM;          /* e.g. print $fh .3 */
5790                 else if ((*s == '?' || *s == '-' || *s == '+')
5791                          && !isSPACE(s[1]) && s[1] != '=')
5792                     PL_expect = XTERM;          /* e.g. print $fh -1 */
5793                 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
5794                          && s[1] != '/')
5795                     PL_expect = XTERM;          /* e.g. print $fh /.../
5796                                                    XXX except DORDOR operator
5797                                                 */
5798                 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
5799                          && s[2] != '=')
5800                     PL_expect = XTERM;          /* print $fh <<"EOF" */
5801             }
5802         }
5803         PL_pending_ident = '$';
5804         TOKEN('$');
5805
5806     case '@':
5807         if (PL_expect == XOPERATOR)
5808             no_op("Array", s);
5809         PL_tokenbuf[0] = '@';
5810         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
5811         if (!PL_tokenbuf[1]) {
5812             PREREF('@');
5813         }
5814         if (PL_lex_state == LEX_NORMAL)
5815             s = SKIPSPACE1(s);
5816         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
5817             if (*s == '{')
5818                 PL_tokenbuf[0] = '%';
5819
5820             /* Warn about @ where they meant $. */
5821             if (*s == '[' || *s == '{') {
5822                 if (ckWARN(WARN_SYNTAX)) {
5823                     const char *t = s + 1;
5824                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
5825                         t++;
5826                     if (*t == '}' || *t == ']') {
5827                         t++;
5828                         PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5829                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5830                             "Scalar value %.*s better written as $%.*s",
5831                             (int)(t-PL_bufptr), PL_bufptr,
5832                             (int)(t-PL_bufptr-1), PL_bufptr+1);
5833                     }
5834                 }
5835             }
5836         }
5837         PL_pending_ident = '@';
5838         TERM('@');
5839
5840      case '/':                  /* may be division, defined-or, or pattern */
5841         if (PL_expect == XTERMORDORDOR && s[1] == '/') {
5842             s += 2;
5843             AOPERATOR(DORDOR);
5844         }
5845      case '?':                  /* may either be conditional or pattern */
5846         if (PL_expect == XOPERATOR) {
5847              char tmp = *s++;
5848              if(tmp == '?') {
5849                 OPERATOR('?');
5850              }
5851              else {
5852                  tmp = *s++;
5853                  if(tmp == '/') {
5854                      /* A // operator. */
5855                     AOPERATOR(DORDOR);
5856                  }
5857                  else {
5858                      s--;
5859                      Mop(OP_DIVIDE);
5860                  }
5861              }
5862          }
5863          else {
5864              /* Disable warning on "study /blah/" */
5865              if (PL_oldoldbufptr == PL_last_uni
5866               && (*PL_last_uni != 's' || s - PL_last_uni < 5
5867                   || memNE(PL_last_uni, "study", 5)
5868                   || isALNUM_lazy_if(PL_last_uni+5,UTF)
5869               ))
5870                  check_uni();
5871              s = scan_pat(s,OP_MATCH);
5872              TERM(sublex_start());
5873          }
5874
5875     case '.':
5876         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
5877 #ifdef PERL_STRICT_CR
5878             && s[1] == '\n'
5879 #else
5880             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
5881 #endif
5882             && (s == PL_linestart || s[-1] == '\n') )
5883         {
5884             PL_lex_formbrack = 0;
5885             PL_expect = XSTATE;
5886             goto rightbracket;
5887         }
5888         if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
5889             s += 3;
5890             OPERATOR(YADAYADA);
5891         }
5892         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
5893             char tmp = *s++;
5894             if (*s == tmp) {
5895                 s++;
5896                 if (*s == tmp) {
5897                     s++;
5898                     pl_yylval.ival = OPf_SPECIAL;
5899                 }
5900                 else
5901                     pl_yylval.ival = 0;
5902                 OPERATOR(DOTDOT);
5903             }
5904             Aop(OP_CONCAT);
5905         }
5906         /* FALL THROUGH */
5907     case '0': case '1': case '2': case '3': case '4':
5908     case '5': case '6': case '7': case '8': case '9':
5909         s = scan_num(s, &pl_yylval);
5910         DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
5911         if (PL_expect == XOPERATOR)
5912             no_op("Number",s);
5913         TERM(THING);
5914
5915     case '\'':
5916         s = scan_str(s,!!PL_madskills,FALSE);
5917         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5918         if (PL_expect == XOPERATOR) {
5919             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5920                 return deprecate_commaless_var_list();
5921             }
5922             else
5923                 no_op("String",s);
5924         }
5925         if (!s)
5926             missingterm(NULL);
5927         pl_yylval.ival = OP_CONST;
5928         TERM(sublex_start());
5929
5930     case '"':
5931         s = scan_str(s,!!PL_madskills,FALSE);
5932         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5933         if (PL_expect == XOPERATOR) {
5934             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5935                 return deprecate_commaless_var_list();
5936             }
5937             else
5938                 no_op("String",s);
5939         }
5940         if (!s)
5941             missingterm(NULL);
5942         pl_yylval.ival = OP_CONST;
5943         /* FIXME. I think that this can be const if char *d is replaced by
5944            more localised variables.  */
5945         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
5946             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
5947                 pl_yylval.ival = OP_STRINGIFY;
5948                 break;
5949             }
5950         }
5951         TERM(sublex_start());
5952
5953     case '`':
5954         s = scan_str(s,!!PL_madskills,FALSE);
5955         DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
5956         if (PL_expect == XOPERATOR)
5957             no_op("Backticks",s);
5958         if (!s)
5959             missingterm(NULL);
5960         readpipe_override();
5961         TERM(sublex_start());
5962
5963     case '\\':
5964         s++;
5965         if (PL_lex_inwhat && isDIGIT(*s))
5966             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
5967                            *s, *s);
5968         if (PL_expect == XOPERATOR)
5969             no_op("Backslash",s);
5970         OPERATOR(REFGEN);
5971
5972     case 'v':
5973         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
5974             char *start = s + 2;
5975             while (isDIGIT(*start) || *start == '_')
5976                 start++;
5977             if (*start == '.' && isDIGIT(start[1])) {
5978                 s = scan_num(s, &pl_yylval);
5979                 TERM(THING);
5980             }
5981             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
5982             else if (!isALPHA(*start) && (PL_expect == XTERM
5983                         || PL_expect == XREF || PL_expect == XSTATE
5984                         || PL_expect == XTERMORDORDOR)) {
5985                 GV *const gv = gv_fetchpvn_flags(s, start - s, 0, SVt_PVCV);
5986                 if (!gv) {
5987                     s = scan_num(s, &pl_yylval);
5988                     TERM(THING);
5989                 }
5990             }
5991         }
5992         goto keylookup;
5993     case 'x':
5994         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
5995             s++;
5996             Mop(OP_REPEAT);
5997         }
5998         goto keylookup;
5999
6000     case '_':
6001     case 'a': case 'A':
6002     case 'b': case 'B':
6003     case 'c': case 'C':
6004     case 'd': case 'D':
6005     case 'e': case 'E':
6006     case 'f': case 'F':
6007     case 'g': case 'G':
6008     case 'h': case 'H':
6009     case 'i': case 'I':
6010     case 'j': case 'J':
6011     case 'k': case 'K':
6012     case 'l': case 'L':
6013     case 'm': case 'M':
6014     case 'n': case 'N':
6015     case 'o': case 'O':
6016     case 'p': case 'P':
6017     case 'q': case 'Q':
6018     case 'r': case 'R':
6019     case 's': case 'S':
6020     case 't': case 'T':
6021     case 'u': case 'U':
6022               case 'V':
6023     case 'w': case 'W':
6024               case 'X':
6025     case 'y': case 'Y':
6026     case 'z': case 'Z':
6027
6028       keylookup: {
6029         bool anydelim;
6030         I32 tmp;
6031
6032         orig_keyword = 0;
6033         gv = NULL;
6034         gvp = NULL;
6035
6036         PL_bufptr = s;
6037         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6038
6039         /* Some keywords can be followed by any delimiter, including ':' */
6040         anydelim = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
6041                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
6042                              (PL_tokenbuf[0] == 'q' &&
6043                               strchr("qwxr", PL_tokenbuf[1])))));
6044
6045         /* x::* is just a word, unless x is "CORE" */
6046         if (!anydelim && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
6047             goto just_a_word;
6048
6049         d = s;
6050         while (d < PL_bufend && isSPACE(*d))
6051                 d++;    /* no comments skipped here, or s### is misparsed */
6052
6053         /* Is this a word before a => operator? */
6054         if (*d == '=' && d[1] == '>') {
6055             CLINE;
6056             pl_yylval.opval
6057                 = (OP*)newSVOP(OP_CONST, 0,
6058                                S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
6059             pl_yylval.opval->op_private = OPpCONST_BARE;
6060             TERM(WORD);
6061         }
6062
6063         /* Check for plugged-in keyword */
6064         {
6065             OP *o;
6066             int result;
6067             char *saved_bufptr = PL_bufptr;
6068             PL_bufptr = s;
6069             result = CALL_FPTR(PL_keyword_plugin)(aTHX_ PL_tokenbuf, len, &o);
6070             s = PL_bufptr;
6071             if (result == KEYWORD_PLUGIN_DECLINE) {
6072                 /* not a plugged-in keyword */
6073                 PL_bufptr = saved_bufptr;
6074             } else if (result == KEYWORD_PLUGIN_STMT) {
6075                 pl_yylval.opval = o;
6076                 CLINE;
6077                 PL_expect = XSTATE;
6078                 return REPORT(PLUGSTMT);
6079             } else if (result == KEYWORD_PLUGIN_EXPR) {
6080                 pl_yylval.opval = o;
6081                 CLINE;
6082                 PL_expect = XOPERATOR;
6083                 return REPORT(PLUGEXPR);
6084             } else {
6085                 Perl_croak(aTHX_ "Bad plugin affecting keyword '%s'",
6086                                         PL_tokenbuf);
6087             }
6088         }
6089
6090         /* Check for built-in keyword */
6091         tmp = keyword(PL_tokenbuf, len, 0);
6092
6093         /* Is this a label? */
6094         if (!anydelim && PL_expect == XSTATE
6095               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
6096             if (tmp)
6097                 Perl_croak(aTHX_ "Can't use keyword '%s' as a label", PL_tokenbuf);
6098             s = d + 1;
6099             pl_yylval.pval = CopLABEL_alloc(PL_tokenbuf);
6100             CLINE;
6101             TOKEN(LABEL);
6102         }
6103
6104         if (tmp < 0) {                  /* second-class keyword? */
6105             GV *ogv = NULL;     /* override (winner) */
6106             GV *hgv = NULL;     /* hidden (loser) */
6107             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
6108                 CV *cv;
6109                 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
6110                     (cv = GvCVu(gv)))
6111                 {
6112                     if (GvIMPORTED_CV(gv))
6113                         ogv = gv;
6114                     else if (! CvMETHOD(cv))
6115                         hgv = gv;
6116                 }
6117                 if (!ogv &&
6118                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
6119                     (gv = *gvp) && isGV_with_GP(gv) &&
6120                     GvCVu(gv) && GvIMPORTED_CV(gv))
6121                 {
6122                     ogv = gv;
6123                 }
6124             }
6125             if (ogv) {
6126                 orig_keyword = tmp;
6127                 tmp = 0;                /* overridden by import or by GLOBAL */
6128             }
6129             else if (gv && !gvp
6130                      && -tmp==KEY_lock  /* XXX generalizable kludge */
6131                      && GvCVu(gv))
6132             {
6133                 tmp = 0;                /* any sub overrides "weak" keyword */
6134             }
6135             else {                      /* no override */
6136                 tmp = -tmp;
6137                 if (tmp == KEY_dump) {
6138                     Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
6139                                    "dump() better written as CORE::dump()");
6140                 }
6141                 gv = NULL;
6142                 gvp = 0;
6143                 if (hgv && tmp != KEY_x && tmp != KEY_CORE)     /* never ambiguous */
6144                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
6145                                    "Ambiguous call resolved as CORE::%s(), %s",
6146                                    GvENAME(hgv), "qualify as such or use &");
6147             }
6148         }
6149
6150       reserved_word:
6151         switch (tmp) {
6152
6153         default:                        /* not a keyword */
6154             /* Trade off - by using this evil construction we can pull the
6155                variable gv into the block labelled keylookup. If not, then
6156                we have to give it function scope so that the goto from the
6157                earlier ':' case doesn't bypass the initialisation.  */
6158             if (0) {
6159             just_a_word_zero_gv:
6160                 gv = NULL;
6161                 gvp = NULL;
6162                 orig_keyword = 0;
6163             }
6164           just_a_word: {
6165                 SV *sv;
6166                 int pkgname = 0;
6167                 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
6168                 OP *rv2cv_op;
6169                 CV *cv;
6170 #ifdef PERL_MAD
6171                 SV *nextPL_nextwhite = 0;
6172 #endif
6173
6174
6175                 /* Get the rest if it looks like a package qualifier */
6176
6177                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
6178                     STRLEN morelen;
6179                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
6180                                   TRUE, &morelen);
6181                     if (!morelen)
6182                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
6183                                 *s == '\'' ? "'" : "::");
6184                     len += morelen;
6185                     pkgname = 1;
6186                 }
6187
6188                 if (PL_expect == XOPERATOR) {
6189                     if (PL_bufptr == PL_linestart) {
6190                         CopLINE_dec(PL_curcop);
6191                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
6192                         CopLINE_inc(PL_curcop);
6193                     }
6194                     else
6195                         no_op("Bareword",s);
6196                 }
6197
6198                 /* Look for a subroutine with this name in current package,
6199                    unless name is "Foo::", in which case Foo is a bearword
6200                    (and a package name). */
6201
6202                 if (len > 2 && !PL_madskills &&
6203                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
6204                 {
6205                     if (ckWARN(WARN_BAREWORD)
6206                         && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
6207                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
6208                             "Bareword \"%s\" refers to nonexistent package",
6209                              PL_tokenbuf);
6210                     len -= 2;
6211                     PL_tokenbuf[len] = '\0';
6212                     gv = NULL;
6213                     gvp = 0;
6214                 }
6215                 else {
6216                     if (!gv) {
6217                         /* Mustn't actually add anything to a symbol table.
6218                            But also don't want to "initialise" any placeholder
6219                            constants that might already be there into full
6220                            blown PVGVs with attached PVCV.  */
6221                         gv = gv_fetchpvn_flags(PL_tokenbuf, len,
6222                                                GV_NOADD_NOINIT, SVt_PVCV);
6223                     }
6224                     len = 0;
6225                 }
6226
6227                 /* if we saw a global override before, get the right name */
6228
6229                 if (gvp) {
6230                     sv = newSVpvs("CORE::GLOBAL::");
6231                     sv_catpv(sv,PL_tokenbuf);
6232                 }
6233                 else {
6234                     /* If len is 0, newSVpv does strlen(), which is correct.
6235                        If len is non-zero, then it will be the true length,
6236                        and so the scalar will be created correctly.  */
6237                     sv = newSVpv(PL_tokenbuf,len);
6238                 }
6239 #ifdef PERL_MAD
6240                 if (PL_madskills && !PL_thistoken) {
6241                     char *start = SvPVX(PL_linestr) + PL_realtokenstart;
6242                     PL_thistoken = newSVpvn(start,s - start);
6243                     PL_realtokenstart = s - SvPVX(PL_linestr);
6244                 }
6245 #endif
6246
6247                 /* Presume this is going to be a bareword of some sort. */
6248
6249                 CLINE;
6250                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
6251                 pl_yylval.opval->op_private = OPpCONST_BARE;
6252                 /* UTF-8 package name? */
6253                 if (UTF && !IN_BYTES &&
6254                     is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
6255                     SvUTF8_on(sv);
6256
6257                 /* And if "Foo::", then that's what it certainly is. */
6258
6259                 if (len)
6260                     goto safe_bareword;
6261
6262                 cv = NULL;
6263                 {
6264                     OP *const_op = newSVOP(OP_CONST, 0, SvREFCNT_inc(sv));
6265                     const_op->op_private = OPpCONST_BARE;
6266                     rv2cv_op = newCVREF(0, const_op);
6267                 }
6268                 if (rv2cv_op->op_type == OP_RV2CV &&
6269                         (rv2cv_op->op_flags & OPf_KIDS)) {
6270                     OP *rv_op = cUNOPx(rv2cv_op)->op_first;
6271                     switch (rv_op->op_type) {
6272                         case OP_CONST: {
6273                             SV *sv = cSVOPx_sv(rv_op);
6274                             if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)
6275                                 cv = (CV*)SvRV(sv);
6276                         } break;
6277                         case OP_GV: {
6278                             GV *gv = cGVOPx_gv(rv_op);
6279                             CV *maybe_cv = GvCVu(gv);
6280                             if (maybe_cv && SvTYPE((SV*)maybe_cv) == SVt_PVCV)
6281                                 cv = maybe_cv;
6282                         } break;
6283                     }
6284                 }
6285
6286                 /* See if it's the indirect object for a list operator. */
6287
6288                 if (PL_oldoldbufptr &&
6289                     PL_oldoldbufptr < PL_bufptr &&
6290                     (PL_oldoldbufptr == PL_last_lop
6291                      || PL_oldoldbufptr == PL_last_uni) &&
6292                     /* NO SKIPSPACE BEFORE HERE! */
6293                     (PL_expect == XREF ||
6294                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
6295                 {
6296                     bool immediate_paren = *s == '(';
6297
6298                     /* (Now we can afford to cross potential line boundary.) */
6299                     s = SKIPSPACE2(s,nextPL_nextwhite);
6300 #ifdef PERL_MAD
6301                     PL_nextwhite = nextPL_nextwhite;    /* assume no & deception */
6302 #endif
6303
6304                     /* Two barewords in a row may indicate method call. */
6305
6306                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
6307                         (tmp = intuit_method(s, gv, cv))) {
6308                         op_free(rv2cv_op);
6309                         return REPORT(tmp);
6310                     }
6311
6312                     /* If not a declared subroutine, it's an indirect object. */
6313                     /* (But it's an indir obj regardless for sort.) */
6314                     /* Also, if "_" follows a filetest operator, it's a bareword */
6315
6316                     if (
6317                         ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
6318                          (!cv &&
6319                         (PL_last_lop_op != OP_MAPSTART &&
6320                          PL_last_lop_op != OP_GREPSTART))))
6321                        || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
6322                             && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
6323                        )
6324                     {
6325                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
6326                         goto bareword;
6327                     }
6328                 }
6329
6330                 PL_expect = XOPERATOR;
6331 #ifdef PERL_MAD
6332                 if (isSPACE(*s))
6333                     s = SKIPSPACE2(s,nextPL_nextwhite);
6334                 PL_nextwhite = nextPL_nextwhite;
6335 #else
6336                 s = skipspace(s);
6337 #endif
6338
6339                 /* Is this a word before a => operator? */
6340                 if (*s == '=' && s[1] == '>' && !pkgname) {
6341                     op_free(rv2cv_op);
6342                     CLINE;
6343                     sv_setpv(((SVOP*)pl_yylval.opval)->op_sv, PL_tokenbuf);
6344                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
6345                       SvUTF8_on(((SVOP*)pl_yylval.opval)->op_sv);
6346                     TERM(WORD);
6347                 }
6348
6349                 /* If followed by a paren, it's certainly a subroutine. */
6350                 if (*s == '(') {
6351                     CLINE;
6352                     if (cv) {
6353                         d = s + 1;
6354                         while (SPACE_OR_TAB(*d))
6355                             d++;
6356                         if (*d == ')' && (sv = cv_const_sv(cv))) {
6357                             s = d + 1;
6358                             goto its_constant;
6359                         }
6360                     }
6361 #ifdef PERL_MAD
6362                     if (PL_madskills) {
6363                         PL_nextwhite = PL_thiswhite;
6364                         PL_thiswhite = 0;
6365                     }
6366                     start_force(PL_curforce);
6367 #endif
6368                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6369                     PL_expect = XOPERATOR;
6370 #ifdef PERL_MAD
6371                     if (PL_madskills) {
6372                         PL_nextwhite = nextPL_nextwhite;
6373                         curmad('X', PL_thistoken);
6374                         PL_thistoken = newSVpvs("");
6375                     }
6376 #endif
6377                     op_free(rv2cv_op);
6378                     force_next(WORD);
6379                     pl_yylval.ival = 0;
6380                     TOKEN('&');
6381                 }
6382
6383                 /* If followed by var or block, call it a method (unless sub) */
6384
6385                 if ((*s == '$' || *s == '{') && !cv) {
6386                     op_free(rv2cv_op);
6387                     PL_last_lop = PL_oldbufptr;
6388                     PL_last_lop_op = OP_METHOD;
6389                     PREBLOCK(METHOD);
6390                 }
6391
6392                 /* If followed by a bareword, see if it looks like indir obj. */
6393
6394                 if (!orig_keyword
6395                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
6396                         && (tmp = intuit_method(s, gv, cv))) {
6397                     op_free(rv2cv_op);
6398                     return REPORT(tmp);
6399                 }
6400
6401                 /* Not a method, so call it a subroutine (if defined) */
6402
6403                 if (cv) {
6404                     if (lastchar == '-')
6405                         Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6406                                          "Ambiguous use of -%s resolved as -&%s()",
6407                                          PL_tokenbuf, PL_tokenbuf);
6408                     /* Check for a constant sub */
6409                     if ((sv = cv_const_sv(cv))) {
6410                   its_constant:
6411                         op_free(rv2cv_op);
6412                         SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
6413                         ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
6414                         pl_yylval.opval->op_private = 0;
6415                         TOKEN(WORD);
6416                     }
6417
6418                     op_free(pl_yylval.opval);
6419                     pl_yylval.opval = rv2cv_op;
6420                     pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6421                     PL_last_lop = PL_oldbufptr;
6422                     PL_last_lop_op = OP_ENTERSUB;
6423                     /* Is there a prototype? */
6424                     if (
6425 #ifdef PERL_MAD
6426                         cv &&
6427 #endif
6428                         SvPOK(cv))
6429                     {
6430                         STRLEN protolen;
6431                         const char *proto = SvPV_const(MUTABLE_SV(cv), protolen);
6432                         if (!protolen)
6433                             TERM(FUNC0SUB);
6434                         if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
6435                             OPERATOR(UNIOPSUB);
6436                         while (*proto == ';')
6437                             proto++;
6438                         if (*proto == '&' && *s == '{') {
6439                             if (PL_curstash)
6440                                 sv_setpvs(PL_subname, "__ANON__");
6441                             else
6442                                 sv_setpvs(PL_subname, "__ANON__::__ANON__");
6443                             PREBLOCK(LSTOPSUB);
6444                         }
6445                     }
6446 #ifdef PERL_MAD
6447                     {
6448                         if (PL_madskills) {
6449                             PL_nextwhite = PL_thiswhite;
6450                             PL_thiswhite = 0;
6451                         }
6452                         start_force(PL_curforce);
6453                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6454                         PL_expect = XTERM;
6455                         if (PL_madskills) {
6456                             PL_nextwhite = nextPL_nextwhite;
6457                             curmad('X', PL_thistoken);
6458                             PL_thistoken = newSVpvs("");
6459                         }
6460                         force_next(WORD);
6461                         TOKEN(NOAMP);
6462                     }
6463                 }
6464
6465                 /* Guess harder when madskills require "best effort". */
6466                 if (PL_madskills && (!gv || !GvCVu(gv))) {
6467                     int probable_sub = 0;
6468                     if (strchr("\"'`$@%0123456789!*+{[<", *s))
6469                         probable_sub = 1;
6470                     else if (isALPHA(*s)) {
6471                         char tmpbuf[1024];
6472                         STRLEN tmplen;
6473                         d = s;
6474                         d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
6475                         if (!keyword(tmpbuf, tmplen, 0))
6476                             probable_sub = 1;
6477                         else {
6478                             while (d < PL_bufend && isSPACE(*d))
6479                                 d++;
6480                             if (*d == '=' && d[1] == '>')
6481                                 probable_sub = 1;
6482                         }
6483                     }
6484                     if (probable_sub) {
6485                         gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
6486                         op_free(pl_yylval.opval);
6487                         pl_yylval.opval = rv2cv_op;
6488                         pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6489                         PL_last_lop = PL_oldbufptr;
6490                         PL_last_lop_op = OP_ENTERSUB;
6491                         PL_nextwhite = PL_thiswhite;
6492                         PL_thiswhite = 0;
6493                         start_force(PL_curforce);
6494                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6495                         PL_expect = XTERM;
6496                         PL_nextwhite = nextPL_nextwhite;
6497                         curmad('X', PL_thistoken);
6498                         PL_thistoken = newSVpvs("");
6499                         force_next(WORD);
6500                         TOKEN(NOAMP);
6501                     }
6502 #else
6503                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6504                     PL_expect = XTERM;
6505                     force_next(WORD);
6506                     TOKEN(NOAMP);
6507 #endif
6508                 }
6509
6510                 /* Call it a bare word */
6511
6512                 if (PL_hints & HINT_STRICT_SUBS)
6513                     pl_yylval.opval->op_private |= OPpCONST_STRICT;
6514                 else {
6515                 bareword:
6516                     /* after "print" and similar functions (corresponding to
6517                      * "F? L" in opcode.pl), whatever wasn't already parsed as
6518                      * a filehandle should be subject to "strict subs".
6519                      * Likewise for the optional indirect-object argument to system
6520                      * or exec, which can't be a bareword */
6521                     if ((PL_last_lop_op == OP_PRINT
6522                             || PL_last_lop_op == OP_PRTF
6523                             || PL_last_lop_op == OP_SAY
6524                             || PL_last_lop_op == OP_SYSTEM
6525                             || PL_last_lop_op == OP_EXEC)
6526                             && (PL_hints & HINT_STRICT_SUBS))
6527                         pl_yylval.opval->op_private |= OPpCONST_STRICT;
6528                     if (lastchar != '-') {
6529                         if (ckWARN(WARN_RESERVED)) {
6530                             d = PL_tokenbuf;
6531                             while (isLOWER(*d))
6532                                 d++;
6533                             if (!*d && !gv_stashpv(PL_tokenbuf, 0))
6534                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
6535                                        PL_tokenbuf);
6536                         }
6537                     }
6538                 }
6539                 op_free(rv2cv_op);
6540
6541             safe_bareword:
6542                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')) {
6543                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6544                                      "Operator or semicolon missing before %c%s",
6545                                      lastchar, PL_tokenbuf);
6546                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6547                                      "Ambiguous use of %c resolved as operator %c",
6548                                      lastchar, lastchar);
6549                 }
6550                 TOKEN(WORD);
6551             }
6552
6553         case KEY___FILE__:
6554             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6555                                         newSVpv(CopFILE(PL_curcop),0));
6556             TERM(THING);
6557
6558         case KEY___LINE__:
6559             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6560                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
6561             TERM(THING);
6562
6563         case KEY___PACKAGE__:
6564             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6565                                         (PL_curstash
6566                                          ? newSVhek(HvNAME_HEK(PL_curstash))
6567                                          : &PL_sv_undef));
6568             TERM(THING);
6569
6570         case KEY___DATA__:
6571         case KEY___END__: {
6572             GV *gv;
6573             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
6574                 const char *pname = "main";
6575                 if (PL_tokenbuf[2] == 'D')
6576                     pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
6577                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
6578                                 SVt_PVIO);
6579                 GvMULTI_on(gv);
6580                 if (!GvIO(gv))
6581                     GvIOp(gv) = newIO();
6582                 IoIFP(GvIOp(gv)) = PL_rsfp;
6583 #if defined(HAS_FCNTL) && defined(F_SETFD)
6584                 {
6585                     const int fd = PerlIO_fileno(PL_rsfp);
6586                     fcntl(fd,F_SETFD,fd >= 3);
6587                 }
6588 #endif
6589                 /* Mark this internal pseudo-handle as clean */
6590                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
6591                 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
6592                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
6593                 else
6594                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
6595 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
6596                 /* if the script was opened in binmode, we need to revert
6597                  * it to text mode for compatibility; but only iff it has CRs
6598                  * XXX this is a questionable hack at best. */
6599                 if (PL_bufend-PL_bufptr > 2
6600                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
6601                 {
6602                     Off_t loc = 0;
6603                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
6604                         loc = PerlIO_tell(PL_rsfp);
6605                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
6606                     }
6607 #ifdef NETWARE
6608                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
6609 #else
6610                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
6611 #endif  /* NETWARE */
6612 #ifdef PERLIO_IS_STDIO /* really? */
6613 #  if defined(__BORLANDC__)
6614                         /* XXX see note in do_binmode() */
6615                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
6616 #  endif
6617 #endif
6618                         if (loc > 0)
6619                             PerlIO_seek(PL_rsfp, loc, 0);
6620                     }
6621                 }
6622 #endif
6623 #ifdef PERLIO_LAYERS
6624                 if (!IN_BYTES) {
6625                     if (UTF)
6626                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
6627                     else if (PL_encoding) {
6628                         SV *name;
6629                         dSP;
6630                         ENTER;
6631                         SAVETMPS;
6632                         PUSHMARK(sp);
6633                         EXTEND(SP, 1);
6634                         XPUSHs(PL_encoding);
6635                         PUTBACK;
6636                         call_method("name", G_SCALAR);
6637                         SPAGAIN;
6638                         name = POPs;
6639                         PUTBACK;
6640                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
6641                                             Perl_form(aTHX_ ":encoding(%"SVf")",
6642                                                       SVfARG(name)));
6643                         FREETMPS;
6644                         LEAVE;
6645                     }
6646                 }
6647 #endif
6648 #ifdef PERL_MAD
6649                 if (PL_madskills) {
6650                     if (PL_realtokenstart >= 0) {
6651                         char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
6652                         if (!PL_endwhite)
6653                             PL_endwhite = newSVpvs("");
6654                         sv_catsv(PL_endwhite, PL_thiswhite);
6655                         PL_thiswhite = 0;
6656                         sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
6657                         PL_realtokenstart = -1;
6658                     }
6659                     while ((s = filter_gets(PL_endwhite, SvCUR(PL_endwhite)))
6660                            != NULL) ;
6661                 }
6662 #endif
6663                 PL_rsfp = NULL;
6664             }
6665             goto fake_eof;
6666         }
6667
6668         case KEY_AUTOLOAD:
6669         case KEY_DESTROY:
6670         case KEY_BEGIN:
6671         case KEY_UNITCHECK:
6672         case KEY_CHECK:
6673         case KEY_INIT:
6674         case KEY_END:
6675             if (PL_expect == XSTATE) {
6676                 s = PL_bufptr;
6677                 goto really_sub;
6678             }
6679             goto just_a_word;
6680
6681         case KEY_CORE:
6682             if (*s == ':' && s[1] == ':') {
6683                 s += 2;
6684                 d = s;
6685                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6686                 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6687                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
6688                 if (tmp < 0)
6689                     tmp = -tmp;
6690                 else if (tmp == KEY_require || tmp == KEY_do)
6691                     /* that's a way to remember we saw "CORE::" */
6692                     orig_keyword = tmp;
6693                 goto reserved_word;
6694             }
6695             goto just_a_word;
6696
6697         case KEY_abs:
6698             UNI(OP_ABS);
6699
6700         case KEY_alarm:
6701             UNI(OP_ALARM);
6702
6703         case KEY_accept:
6704             LOP(OP_ACCEPT,XTERM);
6705
6706         case KEY_and:
6707             OPERATOR(ANDOP);
6708
6709         case KEY_atan2:
6710             LOP(OP_ATAN2,XTERM);
6711
6712         case KEY_bind:
6713             LOP(OP_BIND,XTERM);
6714
6715         case KEY_binmode:
6716             LOP(OP_BINMODE,XTERM);
6717
6718         case KEY_bless:
6719             LOP(OP_BLESS,XTERM);
6720
6721         case KEY_break:
6722             FUN0(OP_BREAK);
6723
6724         case KEY_chop:
6725             UNI(OP_CHOP);
6726
6727         case KEY_continue:
6728             /* When 'use switch' is in effect, continue has a dual
6729                life as a control operator. */
6730             {
6731                 if (!FEATURE_IS_ENABLED("switch"))
6732                     PREBLOCK(CONTINUE);
6733                 else {
6734                     /* We have to disambiguate the two senses of
6735                       "continue". If the next token is a '{' then
6736                       treat it as the start of a continue block;
6737                       otherwise treat it as a control operator.
6738                      */
6739                     s = skipspace(s);
6740                     if (*s == '{')
6741             PREBLOCK(CONTINUE);
6742                     else
6743                         FUN0(OP_CONTINUE);
6744                 }
6745             }
6746
6747         case KEY_chdir:
6748             /* may use HOME */
6749             (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
6750             UNI(OP_CHDIR);
6751
6752         case KEY_close:
6753             UNI(OP_CLOSE);
6754
6755         case KEY_closedir:
6756             UNI(OP_CLOSEDIR);
6757
6758         case KEY_cmp:
6759             Eop(OP_SCMP);
6760
6761         case KEY_caller:
6762             UNI(OP_CALLER);
6763
6764         case KEY_crypt:
6765 #ifdef FCRYPT
6766             if (!PL_cryptseen) {
6767                 PL_cryptseen = TRUE;
6768                 init_des();
6769             }
6770 #endif
6771             LOP(OP_CRYPT,XTERM);
6772
6773         case KEY_chmod:
6774             LOP(OP_CHMOD,XTERM);
6775
6776         case KEY_chown:
6777             LOP(OP_CHOWN,XTERM);
6778
6779         case KEY_connect:
6780             LOP(OP_CONNECT,XTERM);
6781
6782         case KEY_chr:
6783             UNI(OP_CHR);
6784
6785         case KEY_cos:
6786             UNI(OP_COS);
6787
6788         case KEY_chroot:
6789             UNI(OP_CHROOT);
6790
6791         case KEY_default:
6792             PREBLOCK(DEFAULT);
6793
6794         case KEY_do:
6795             s = SKIPSPACE1(s);
6796             if (*s == '{')
6797                 PRETERMBLOCK(DO);
6798             if (*s != '\'')
6799                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
6800             if (orig_keyword == KEY_do) {
6801                 orig_keyword = 0;
6802                 pl_yylval.ival = 1;
6803             }
6804             else
6805                 pl_yylval.ival = 0;
6806             OPERATOR(DO);
6807
6808         case KEY_die:
6809             PL_hints |= HINT_BLOCK_SCOPE;
6810             LOP(OP_DIE,XTERM);
6811
6812         case KEY_defined:
6813             UNI(OP_DEFINED);
6814
6815         case KEY_delete:
6816             UNI(OP_DELETE);
6817
6818         case KEY_dbmopen:
6819             gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
6820             LOP(OP_DBMOPEN,XTERM);
6821
6822         case KEY_dbmclose:
6823             UNI(OP_DBMCLOSE);
6824
6825         case KEY_dump:
6826             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6827             LOOPX(OP_DUMP);
6828
6829         case KEY_else:
6830             PREBLOCK(ELSE);
6831
6832         case KEY_elsif:
6833             pl_yylval.ival = CopLINE(PL_curcop);
6834             OPERATOR(ELSIF);
6835
6836         case KEY_eq:
6837             Eop(OP_SEQ);
6838
6839         case KEY_exists:
6840             UNI(OP_EXISTS);
6841         
6842         case KEY_exit:
6843             if (PL_madskills)
6844                 UNI(OP_INT);
6845             UNI(OP_EXIT);
6846
6847         case KEY_eval:
6848             s = SKIPSPACE1(s);
6849             if (*s == '{') { /* block eval */
6850                 PL_expect = XTERMBLOCK;
6851                 UNIBRACK(OP_ENTERTRY);
6852             }
6853             else { /* string eval */
6854                 PL_expect = XTERM;
6855                 UNIBRACK(OP_ENTEREVAL);
6856             }
6857
6858         case KEY_eof:
6859             UNI(OP_EOF);
6860
6861         case KEY_exp:
6862             UNI(OP_EXP);
6863
6864         case KEY_each:
6865             UNI(OP_EACH);
6866
6867         case KEY_exec:
6868             LOP(OP_EXEC,XREF);
6869
6870         case KEY_endhostent:
6871             FUN0(OP_EHOSTENT);
6872
6873         case KEY_endnetent:
6874             FUN0(OP_ENETENT);
6875
6876         case KEY_endservent:
6877             FUN0(OP_ESERVENT);
6878
6879         case KEY_endprotoent:
6880             FUN0(OP_EPROTOENT);
6881
6882         case KEY_endpwent:
6883             FUN0(OP_EPWENT);
6884
6885         case KEY_endgrent:
6886             FUN0(OP_EGRENT);
6887
6888         case KEY_for:
6889         case KEY_foreach:
6890             pl_yylval.ival = CopLINE(PL_curcop);
6891             s = SKIPSPACE1(s);
6892             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
6893                 char *p = s;
6894 #ifdef PERL_MAD
6895                 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
6896 #endif
6897
6898                 if ((PL_bufend - p) >= 3 &&
6899                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
6900                     p += 2;
6901                 else if ((PL_bufend - p) >= 4 &&
6902                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
6903                     p += 3;
6904                 p = PEEKSPACE(p);
6905                 if (isIDFIRST_lazy_if(p,UTF)) {
6906                     p = scan_ident(p, PL_bufend,
6907                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
6908                     p = PEEKSPACE(p);
6909                 }
6910                 if (*p != '$')
6911                     Perl_croak(aTHX_ "Missing $ on loop variable");
6912 #ifdef PERL_MAD
6913                 s = SvPVX(PL_linestr) + soff;
6914 #endif
6915             }
6916             OPERATOR(FOR);
6917
6918         case KEY_formline:
6919             LOP(OP_FORMLINE,XTERM);
6920
6921         case KEY_fork:
6922             FUN0(OP_FORK);
6923
6924         case KEY_fcntl:
6925             LOP(OP_FCNTL,XTERM);
6926
6927         case KEY_fileno:
6928             UNI(OP_FILENO);
6929
6930         case KEY_flock:
6931             LOP(OP_FLOCK,XTERM);
6932
6933         case KEY_gt:
6934             Rop(OP_SGT);
6935
6936         case KEY_ge:
6937             Rop(OP_SGE);
6938
6939         case KEY_grep:
6940             LOP(OP_GREPSTART, XREF);
6941
6942         case KEY_goto:
6943             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6944             LOOPX(OP_GOTO);
6945
6946         case KEY_gmtime:
6947             UNI(OP_GMTIME);
6948
6949         case KEY_getc:
6950             UNIDOR(OP_GETC);
6951
6952         case KEY_getppid:
6953             FUN0(OP_GETPPID);
6954
6955         case KEY_getpgrp:
6956             UNI(OP_GETPGRP);
6957
6958         case KEY_getpriority:
6959             LOP(OP_GETPRIORITY,XTERM);
6960
6961         case KEY_getprotobyname:
6962             UNI(OP_GPBYNAME);
6963
6964         case KEY_getprotobynumber:
6965             LOP(OP_GPBYNUMBER,XTERM);
6966
6967         case KEY_getprotoent:
6968             FUN0(OP_GPROTOENT);
6969
6970         case KEY_getpwent:
6971             FUN0(OP_GPWENT);
6972
6973         case KEY_getpwnam:
6974             UNI(OP_GPWNAM);
6975
6976         case KEY_getpwuid:
6977             UNI(OP_GPWUID);
6978
6979         case KEY_getpeername:
6980             UNI(OP_GETPEERNAME);
6981
6982         case KEY_gethostbyname:
6983             UNI(OP_GHBYNAME);
6984
6985         case KEY_gethostbyaddr:
6986             LOP(OP_GHBYADDR,XTERM);
6987
6988         case KEY_gethostent:
6989             FUN0(OP_GHOSTENT);
6990
6991         case KEY_getnetbyname:
6992             UNI(OP_GNBYNAME);
6993
6994         case KEY_getnetbyaddr:
6995             LOP(OP_GNBYADDR,XTERM);
6996
6997         case KEY_getnetent:
6998             FUN0(OP_GNETENT);
6999
7000         case KEY_getservbyname:
7001             LOP(OP_GSBYNAME,XTERM);
7002
7003         case KEY_getservbyport:
7004             LOP(OP_GSBYPORT,XTERM);
7005
7006         case KEY_getservent:
7007             FUN0(OP_GSERVENT);
7008
7009         case KEY_getsockname:
7010             UNI(OP_GETSOCKNAME);
7011
7012         case KEY_getsockopt:
7013             LOP(OP_GSOCKOPT,XTERM);
7014
7015         case KEY_getgrent:
7016             FUN0(OP_GGRENT);
7017
7018         case KEY_getgrnam:
7019             UNI(OP_GGRNAM);
7020
7021         case KEY_getgrgid:
7022             UNI(OP_GGRGID);
7023
7024         case KEY_getlogin:
7025             FUN0(OP_GETLOGIN);
7026
7027         case KEY_given:
7028             pl_yylval.ival = CopLINE(PL_curcop);
7029             OPERATOR(GIVEN);
7030
7031         case KEY_glob:
7032             LOP(OP_GLOB,XTERM);
7033
7034         case KEY_hex:
7035             UNI(OP_HEX);
7036
7037         case KEY_if:
7038             pl_yylval.ival = CopLINE(PL_curcop);
7039             OPERATOR(IF);
7040
7041         case KEY_index:
7042             LOP(OP_INDEX,XTERM);
7043
7044         case KEY_int:
7045             UNI(OP_INT);
7046
7047         case KEY_ioctl:
7048             LOP(OP_IOCTL,XTERM);
7049
7050         case KEY_join:
7051             LOP(OP_JOIN,XTERM);
7052
7053         case KEY_keys:
7054             UNI(OP_KEYS);
7055
7056         case KEY_kill:
7057             LOP(OP_KILL,XTERM);
7058
7059         case KEY_last:
7060             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7061             LOOPX(OP_LAST);
7062         
7063         case KEY_lc:
7064             UNI(OP_LC);
7065
7066         case KEY_lcfirst:
7067             UNI(OP_LCFIRST);
7068
7069         case KEY_local:
7070             pl_yylval.ival = 0;
7071             OPERATOR(LOCAL);
7072
7073         case KEY_length:
7074             UNI(OP_LENGTH);
7075
7076         case KEY_lt:
7077             Rop(OP_SLT);
7078
7079         case KEY_le:
7080             Rop(OP_SLE);
7081
7082         case KEY_localtime:
7083             UNI(OP_LOCALTIME);
7084
7085         case KEY_log:
7086             UNI(OP_LOG);
7087
7088         case KEY_link:
7089             LOP(OP_LINK,XTERM);
7090
7091         case KEY_listen:
7092             LOP(OP_LISTEN,XTERM);
7093
7094         case KEY_lock:
7095             UNI(OP_LOCK);
7096
7097         case KEY_lstat:
7098             UNI(OP_LSTAT);
7099
7100         case KEY_m:
7101             s = scan_pat(s,OP_MATCH);
7102             TERM(sublex_start());
7103
7104         case KEY_map:
7105             LOP(OP_MAPSTART, XREF);
7106
7107         case KEY_mkdir:
7108             LOP(OP_MKDIR,XTERM);
7109
7110         case KEY_msgctl:
7111             LOP(OP_MSGCTL,XTERM);
7112
7113         case KEY_msgget:
7114             LOP(OP_MSGGET,XTERM);
7115
7116         case KEY_msgrcv:
7117             LOP(OP_MSGRCV,XTERM);
7118
7119         case KEY_msgsnd:
7120             LOP(OP_MSGSND,XTERM);
7121
7122         case KEY_our:
7123         case KEY_my:
7124         case KEY_state:
7125             PL_in_my = (U16)tmp;
7126             s = SKIPSPACE1(s);
7127             if (isIDFIRST_lazy_if(s,UTF)) {
7128 #ifdef PERL_MAD
7129                 char* start = s;
7130 #endif
7131                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
7132                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
7133                     goto really_sub;
7134                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
7135                 if (!PL_in_my_stash) {
7136                     char tmpbuf[1024];
7137                     PL_bufptr = s;
7138                     my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
7139                     yyerror(tmpbuf);
7140                 }
7141 #ifdef PERL_MAD
7142                 if (PL_madskills) {     /* just add type to declarator token */
7143                     sv_catsv(PL_thistoken, PL_nextwhite);
7144                     PL_nextwhite = 0;
7145                     sv_catpvn(PL_thistoken, start, s - start);
7146                 }
7147 #endif
7148             }
7149             pl_yylval.ival = 1;
7150             OPERATOR(MY);
7151
7152         case KEY_next:
7153             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7154             LOOPX(OP_NEXT);
7155
7156         case KEY_ne:
7157             Eop(OP_SNE);
7158
7159         case KEY_no:
7160             s = tokenize_use(0, s);
7161             OPERATOR(USE);
7162
7163         case KEY_not:
7164             if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
7165                 FUN1(OP_NOT);
7166             else
7167                 OPERATOR(NOTOP);
7168
7169         case KEY_open:
7170             s = SKIPSPACE1(s);
7171             if (isIDFIRST_lazy_if(s,UTF)) {
7172                 const char *t;
7173                 for (d = s; isALNUM_lazy_if(d,UTF);)
7174                     d++;
7175                 for (t=d; isSPACE(*t);)
7176                     t++;
7177                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
7178                     /* [perl #16184] */
7179                     && !(t[0] == '=' && t[1] == '>')
7180                 ) {
7181                     int parms_len = (int)(d-s);
7182                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
7183                            "Precedence problem: open %.*s should be open(%.*s)",
7184                             parms_len, s, parms_len, s);
7185                 }
7186             }
7187             LOP(OP_OPEN,XTERM);
7188
7189         case KEY_or:
7190             pl_yylval.ival = OP_OR;
7191             OPERATOR(OROP);
7192
7193         case KEY_ord:
7194             UNI(OP_ORD);
7195
7196         case KEY_oct:
7197             UNI(OP_OCT);
7198
7199         case KEY_opendir:
7200             LOP(OP_OPEN_DIR,XTERM);
7201
7202         case KEY_print:
7203             checkcomma(s,PL_tokenbuf,"filehandle");
7204             LOP(OP_PRINT,XREF);
7205
7206         case KEY_printf:
7207             checkcomma(s,PL_tokenbuf,"filehandle");
7208             LOP(OP_PRTF,XREF);
7209
7210         case KEY_prototype:
7211             UNI(OP_PROTOTYPE);
7212
7213         case KEY_push:
7214             LOP(OP_PUSH,XTERM);
7215
7216         case KEY_pop:
7217             UNIDOR(OP_POP);
7218
7219         case KEY_pos:
7220             UNIDOR(OP_POS);
7221         
7222         case KEY_pack:
7223             LOP(OP_PACK,XTERM);
7224
7225         case KEY_package:
7226             s = force_word(s,WORD,FALSE,TRUE,FALSE);
7227             s = SKIPSPACE1(s);
7228             s = force_strict_version(s);
7229             OPERATOR(PACKAGE);
7230
7231         case KEY_pipe:
7232             LOP(OP_PIPE_OP,XTERM);
7233
7234         case KEY_q:
7235             s = scan_str(s,!!PL_madskills,FALSE);
7236             if (!s)
7237                 missingterm(NULL);
7238             pl_yylval.ival = OP_CONST;
7239             TERM(sublex_start());
7240
7241         case KEY_quotemeta:
7242             UNI(OP_QUOTEMETA);
7243
7244         case KEY_qw:
7245             s = scan_str(s,!!PL_madskills,FALSE);
7246             if (!s)
7247                 missingterm(NULL);
7248             PL_expect = XOPERATOR;
7249             force_next(')');
7250             if (SvCUR(PL_lex_stuff)) {
7251                 OP *words = NULL;
7252                 int warned = 0;
7253                 d = SvPV_force(PL_lex_stuff, len);
7254                 while (len) {
7255                     for (; isSPACE(*d) && len; --len, ++d)
7256                         /**/;
7257                     if (len) {
7258                         SV *sv;
7259                         const char *b = d;
7260                         if (!warned && ckWARN(WARN_QW)) {
7261                             for (; !isSPACE(*d) && len; --len, ++d) {
7262                                 if (*d == ',') {
7263                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7264                                         "Possible attempt to separate words with commas");
7265                                     ++warned;
7266                                 }
7267                                 else if (*d == '#') {
7268                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7269                                         "Possible attempt to put comments in qw() list");
7270                                     ++warned;
7271                                 }
7272                             }
7273                         }
7274                         else {
7275                             for (; !isSPACE(*d) && len; --len, ++d)
7276                                 /**/;
7277                         }
7278                         sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
7279                         words = append_elem(OP_LIST, words,
7280                                             newSVOP(OP_CONST, 0, tokeq(sv)));
7281                     }
7282                 }
7283                 if (words) {
7284                     start_force(PL_curforce);
7285                     NEXTVAL_NEXTTOKE.opval = words;
7286                     force_next(THING);
7287                 }
7288             }
7289             if (PL_lex_stuff) {
7290                 SvREFCNT_dec(PL_lex_stuff);
7291                 PL_lex_stuff = NULL;
7292             }
7293             PL_expect = XTERM;
7294             TOKEN('(');
7295
7296         case KEY_qq:
7297             s = scan_str(s,!!PL_madskills,FALSE);
7298             if (!s)
7299                 missingterm(NULL);
7300             pl_yylval.ival = OP_STRINGIFY;
7301             if (SvIVX(PL_lex_stuff) == '\'')
7302                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
7303             TERM(sublex_start());
7304
7305         case KEY_qr:
7306             s = scan_pat(s,OP_QR);
7307             TERM(sublex_start());
7308
7309         case KEY_qx:
7310             s = scan_str(s,!!PL_madskills,FALSE);
7311             if (!s)
7312                 missingterm(NULL);
7313             readpipe_override();
7314             TERM(sublex_start());
7315
7316         case KEY_return:
7317             OLDLOP(OP_RETURN);
7318
7319         case KEY_require:
7320             s = SKIPSPACE1(s);
7321             if (isDIGIT(*s)) {
7322                 s = force_version(s, FALSE);
7323             }
7324             else if (*s != 'v' || !isDIGIT(s[1])
7325                     || (s = force_version(s, TRUE), *s == 'v'))
7326             {
7327                 *PL_tokenbuf = '\0';
7328                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7329                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
7330                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
7331                 else if (*s == '<')
7332                     yyerror("<> should be quotes");
7333             }
7334             if (orig_keyword == KEY_require) {
7335                 orig_keyword = 0;
7336                 pl_yylval.ival = 1;
7337             }
7338             else 
7339                 pl_yylval.ival = 0;
7340             PL_expect = XTERM;
7341             PL_bufptr = s;
7342             PL_last_uni = PL_oldbufptr;
7343             PL_last_lop_op = OP_REQUIRE;
7344             s = skipspace(s);
7345             return REPORT( (int)REQUIRE );
7346
7347         case KEY_reset:
7348             UNI(OP_RESET);
7349
7350         case KEY_redo:
7351             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7352             LOOPX(OP_REDO);
7353
7354         case KEY_rename:
7355             LOP(OP_RENAME,XTERM);
7356
7357         case KEY_rand:
7358             UNI(OP_RAND);
7359
7360         case KEY_rmdir:
7361             UNI(OP_RMDIR);
7362
7363         case KEY_rindex:
7364             LOP(OP_RINDEX,XTERM);
7365
7366         case KEY_read:
7367             LOP(OP_READ,XTERM);
7368
7369         case KEY_readdir:
7370             UNI(OP_READDIR);
7371
7372         case KEY_readline:
7373             UNIDOR(OP_READLINE);
7374
7375         case KEY_readpipe:
7376             UNIDOR(OP_BACKTICK);
7377
7378         case KEY_rewinddir:
7379             UNI(OP_REWINDDIR);
7380
7381         case KEY_recv:
7382             LOP(OP_RECV,XTERM);
7383
7384         case KEY_reverse:
7385             LOP(OP_REVERSE,XTERM);
7386
7387         case KEY_readlink:
7388             UNIDOR(OP_READLINK);
7389
7390         case KEY_ref:
7391             UNI(OP_REF);
7392
7393         case KEY_s:
7394             s = scan_subst(s);
7395             if (pl_yylval.opval)
7396                 TERM(sublex_start());
7397             else
7398                 TOKEN(1);       /* force error */
7399
7400         case KEY_say:
7401             checkcomma(s,PL_tokenbuf,"filehandle");
7402             LOP(OP_SAY,XREF);
7403
7404         case KEY_chomp:
7405             UNI(OP_CHOMP);
7406         
7407         case KEY_scalar:
7408             UNI(OP_SCALAR);
7409
7410         case KEY_select:
7411             LOP(OP_SELECT,XTERM);
7412
7413         case KEY_seek:
7414             LOP(OP_SEEK,XTERM);
7415
7416         case KEY_semctl:
7417             LOP(OP_SEMCTL,XTERM);
7418
7419         case KEY_semget:
7420             LOP(OP_SEMGET,XTERM);
7421
7422         case KEY_semop:
7423             LOP(OP_SEMOP,XTERM);
7424
7425         case KEY_send:
7426             LOP(OP_SEND,XTERM);
7427
7428         case KEY_setpgrp:
7429             LOP(OP_SETPGRP,XTERM);
7430
7431         case KEY_setpriority:
7432             LOP(OP_SETPRIORITY,XTERM);
7433
7434         case KEY_sethostent:
7435             UNI(OP_SHOSTENT);
7436
7437         case KEY_setnetent:
7438             UNI(OP_SNETENT);
7439
7440         case KEY_setservent:
7441             UNI(OP_SSERVENT);
7442
7443         case KEY_setprotoent:
7444             UNI(OP_SPROTOENT);
7445
7446         case KEY_setpwent:
7447             FUN0(OP_SPWENT);
7448
7449         case KEY_setgrent:
7450             FUN0(OP_SGRENT);
7451
7452         case KEY_seekdir:
7453             LOP(OP_SEEKDIR,XTERM);
7454
7455         case KEY_setsockopt:
7456             LOP(OP_SSOCKOPT,XTERM);
7457
7458         case KEY_shift:
7459             UNIDOR(OP_SHIFT);
7460
7461         case KEY_shmctl:
7462             LOP(OP_SHMCTL,XTERM);
7463
7464         case KEY_shmget:
7465             LOP(OP_SHMGET,XTERM);
7466
7467         case KEY_shmread:
7468             LOP(OP_SHMREAD,XTERM);
7469
7470         case KEY_shmwrite:
7471             LOP(OP_SHMWRITE,XTERM);
7472
7473         case KEY_shutdown:
7474             LOP(OP_SHUTDOWN,XTERM);
7475
7476         case KEY_sin:
7477             UNI(OP_SIN);
7478
7479         case KEY_sleep:
7480             UNI(OP_SLEEP);
7481
7482         case KEY_socket:
7483             LOP(OP_SOCKET,XTERM);
7484
7485         case KEY_socketpair:
7486             LOP(OP_SOCKPAIR,XTERM);
7487
7488         case KEY_sort:
7489             checkcomma(s,PL_tokenbuf,"subroutine name");
7490             s = SKIPSPACE1(s);
7491             if (*s == ';' || *s == ')')         /* probably a close */
7492                 Perl_croak(aTHX_ "sort is now a reserved word");
7493             PL_expect = XTERM;
7494             s = force_word(s,WORD,TRUE,TRUE,FALSE);
7495             LOP(OP_SORT,XREF);
7496
7497         case KEY_split:
7498             LOP(OP_SPLIT,XTERM);
7499
7500         case KEY_sprintf:
7501             LOP(OP_SPRINTF,XTERM);
7502
7503         case KEY_splice:
7504             LOP(OP_SPLICE,XTERM);
7505
7506         case KEY_sqrt:
7507             UNI(OP_SQRT);
7508
7509         case KEY_srand:
7510             UNI(OP_SRAND);
7511
7512         case KEY_stat:
7513             UNI(OP_STAT);
7514
7515         case KEY_study:
7516             UNI(OP_STUDY);
7517
7518         case KEY_substr:
7519             LOP(OP_SUBSTR,XTERM);
7520
7521         case KEY_format:
7522         case KEY_sub:
7523           really_sub:
7524             {
7525                 char tmpbuf[sizeof PL_tokenbuf];
7526                 SSize_t tboffset = 0;
7527                 expectation attrful;
7528                 bool have_name, have_proto;
7529                 const int key = tmp;
7530
7531 #ifdef PERL_MAD
7532                 SV *tmpwhite = 0;
7533
7534                 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
7535                 SV *subtoken = newSVpvn(tstart, s - tstart);
7536                 PL_thistoken = 0;
7537
7538                 d = s;
7539                 s = SKIPSPACE2(s,tmpwhite);
7540 #else
7541                 s = skipspace(s);
7542 #endif
7543
7544                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
7545                     (*s == ':' && s[1] == ':'))
7546                 {
7547 #ifdef PERL_MAD
7548                     SV *nametoke = NULL;
7549 #endif
7550
7551                     PL_expect = XBLOCK;
7552                     attrful = XATTRBLOCK;
7553                     /* remember buffer pos'n for later force_word */
7554                     tboffset = s - PL_oldbufptr;
7555                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
7556 #ifdef PERL_MAD
7557                     if (PL_madskills)
7558                         nametoke = newSVpvn(s, d - s);
7559 #endif
7560                     if (memchr(tmpbuf, ':', len))
7561                         sv_setpvn(PL_subname, tmpbuf, len);
7562                     else {
7563                         sv_setsv(PL_subname,PL_curstname);
7564                         sv_catpvs(PL_subname,"::");
7565                         sv_catpvn(PL_subname,tmpbuf,len);
7566                     }
7567                     have_name = TRUE;
7568
7569 #ifdef PERL_MAD
7570
7571                     start_force(0);
7572                     CURMAD('X', nametoke);
7573                     CURMAD('_', tmpwhite);
7574                     (void) force_word(PL_oldbufptr + tboffset, WORD,
7575                                       FALSE, TRUE, TRUE);
7576
7577                     s = SKIPSPACE2(d,tmpwhite);
7578 #else
7579                     s = skipspace(d);
7580 #endif
7581                 }
7582                 else {
7583                     if (key == KEY_my)
7584                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
7585                     PL_expect = XTERMBLOCK;
7586                     attrful = XATTRTERM;
7587                     sv_setpvs(PL_subname,"?");
7588                     have_name = FALSE;
7589                 }
7590
7591                 if (key == KEY_format) {
7592                     if (*s == '=')
7593                         PL_lex_formbrack = PL_lex_brackets + 1;
7594 #ifdef PERL_MAD
7595                     PL_thistoken = subtoken;
7596                     s = d;
7597 #else
7598                     if (have_name)
7599                         (void) force_word(PL_oldbufptr + tboffset, WORD,
7600                                           FALSE, TRUE, TRUE);
7601 #endif
7602                     OPERATOR(FORMAT);
7603                 }
7604
7605                 /* Look for a prototype */
7606                 if (*s == '(') {
7607                     char *p;
7608                     bool bad_proto = FALSE;
7609                     bool in_brackets = FALSE;
7610                     char greedy_proto = ' ';
7611                     bool proto_after_greedy_proto = FALSE;
7612                     bool must_be_last = FALSE;
7613                     bool underscore = FALSE;
7614                     bool seen_underscore = FALSE;
7615                     const bool warnillegalproto = ckWARN(WARN_ILLEGALPROTO);
7616
7617                     s = scan_str(s,!!PL_madskills,FALSE);
7618                     if (!s)
7619                         Perl_croak(aTHX_ "Prototype not terminated");
7620                     /* strip spaces and check for bad characters */
7621                     d = SvPVX(PL_lex_stuff);
7622                     tmp = 0;
7623                     for (p = d; *p; ++p) {
7624                         if (!isSPACE(*p)) {
7625                             d[tmp++] = *p;
7626
7627                             if (warnillegalproto) {
7628                                 if (must_be_last)
7629                                     proto_after_greedy_proto = TRUE;
7630                                 if (!strchr("$@%*;[]&\\_", *p)) {
7631                                     bad_proto = TRUE;
7632                                 }
7633                                 else {
7634                                     if ( underscore ) {
7635                                         if ( *p != ';' )
7636                                             bad_proto = TRUE;
7637                                         underscore = FALSE;
7638                                     }
7639                                     if ( *p == '[' ) {
7640                                         in_brackets = TRUE;
7641                                     }
7642                                     else if ( *p == ']' ) {
7643                                         in_brackets = FALSE;
7644                                     }
7645                                     else if ( (*p == '@' || *p == '%') &&
7646                                          ( tmp < 2 || d[tmp-2] != '\\' ) &&
7647                                          !in_brackets ) {
7648                                         must_be_last = TRUE;
7649                                         greedy_proto = *p;
7650                                     }
7651                                     else if ( *p == '_' ) {
7652                                         underscore = seen_underscore = TRUE;
7653                                     }
7654                                 }
7655                             }
7656                         }
7657                     }
7658                     d[tmp] = '\0';
7659                     if (proto_after_greedy_proto)
7660                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7661                                     "Prototype after '%c' for %"SVf" : %s",
7662                                     greedy_proto, SVfARG(PL_subname), d);
7663                     if (bad_proto)
7664                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7665                                     "Illegal character %sin prototype for %"SVf" : %s",
7666                                     seen_underscore ? "after '_' " : "",
7667                                     SVfARG(PL_subname), d);
7668                     SvCUR_set(PL_lex_stuff, tmp);
7669                     have_proto = TRUE;
7670
7671 #ifdef PERL_MAD
7672                     start_force(0);
7673                     CURMAD('q', PL_thisopen);
7674                     CURMAD('_', tmpwhite);
7675                     CURMAD('=', PL_thisstuff);
7676                     CURMAD('Q', PL_thisclose);
7677                     NEXTVAL_NEXTTOKE.opval =
7678                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7679                     PL_lex_stuff = NULL;
7680                     force_next(THING);
7681
7682                     s = SKIPSPACE2(s,tmpwhite);
7683 #else
7684                     s = skipspace(s);
7685 #endif
7686                 }
7687                 else
7688                     have_proto = FALSE;
7689
7690                 if (*s == ':' && s[1] != ':')
7691                     PL_expect = attrful;
7692                 else if (*s != '{' && key == KEY_sub) {
7693                     if (!have_name)
7694                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
7695                     else if (*s != ';' && *s != '}')
7696                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
7697                 }
7698
7699 #ifdef PERL_MAD
7700                 start_force(0);
7701                 if (tmpwhite) {
7702                     if (PL_madskills)
7703                         curmad('^', newSVpvs(""));
7704                     CURMAD('_', tmpwhite);
7705                 }
7706                 force_next(0);
7707
7708                 PL_thistoken = subtoken;
7709 #else
7710                 if (have_proto) {
7711                     NEXTVAL_NEXTTOKE.opval =
7712                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7713                     PL_lex_stuff = NULL;
7714                     force_next(THING);
7715                 }
7716 #endif
7717                 if (!have_name) {
7718                     if (PL_curstash)
7719                         sv_setpvs(PL_subname, "__ANON__");
7720                     else
7721                         sv_setpvs(PL_subname, "__ANON__::__ANON__");
7722                     TOKEN(ANONSUB);
7723                 }
7724 #ifndef PERL_MAD
7725                 (void) force_word(PL_oldbufptr + tboffset, WORD,
7726                                   FALSE, TRUE, TRUE);
7727 #endif
7728                 if (key == KEY_my)
7729                     TOKEN(MYSUB);
7730                 TOKEN(SUB);
7731             }
7732
7733         case KEY_system:
7734             LOP(OP_SYSTEM,XREF);
7735
7736         case KEY_symlink:
7737             LOP(OP_SYMLINK,XTERM);
7738
7739         case KEY_syscall:
7740             LOP(OP_SYSCALL,XTERM);
7741
7742         case KEY_sysopen:
7743             LOP(OP_SYSOPEN,XTERM);
7744
7745         case KEY_sysseek:
7746             LOP(OP_SYSSEEK,XTERM);
7747
7748         case KEY_sysread:
7749             LOP(OP_SYSREAD,XTERM);
7750
7751         case KEY_syswrite:
7752             LOP(OP_SYSWRITE,XTERM);
7753
7754         case KEY_tr:
7755             s = scan_trans(s);
7756             TERM(sublex_start());
7757
7758         case KEY_tell:
7759             UNI(OP_TELL);
7760
7761         case KEY_telldir:
7762             UNI(OP_TELLDIR);
7763
7764         case KEY_tie:
7765             LOP(OP_TIE,XTERM);
7766
7767         case KEY_tied:
7768             UNI(OP_TIED);
7769
7770         case KEY_time:
7771             FUN0(OP_TIME);
7772
7773         case KEY_times:
7774             FUN0(OP_TMS);
7775
7776         case KEY_truncate:
7777             LOP(OP_TRUNCATE,XTERM);
7778
7779         case KEY_uc:
7780             UNI(OP_UC);
7781
7782         case KEY_ucfirst:
7783             UNI(OP_UCFIRST);
7784
7785         case KEY_untie:
7786             UNI(OP_UNTIE);
7787
7788         case KEY_until:
7789             pl_yylval.ival = CopLINE(PL_curcop);
7790             OPERATOR(UNTIL);
7791
7792         case KEY_unless:
7793             pl_yylval.ival = CopLINE(PL_curcop);
7794             OPERATOR(UNLESS);
7795
7796         case KEY_unlink:
7797             LOP(OP_UNLINK,XTERM);
7798
7799         case KEY_undef:
7800             UNIDOR(OP_UNDEF);
7801
7802         case KEY_unpack:
7803             LOP(OP_UNPACK,XTERM);
7804
7805         case KEY_utime:
7806             LOP(OP_UTIME,XTERM);
7807
7808         case KEY_umask:
7809             UNIDOR(OP_UMASK);
7810
7811         case KEY_unshift:
7812             LOP(OP_UNSHIFT,XTERM);
7813
7814         case KEY_use:
7815             s = tokenize_use(1, s);
7816             OPERATOR(USE);
7817
7818         case KEY_values:
7819             UNI(OP_VALUES);
7820
7821         case KEY_vec:
7822             LOP(OP_VEC,XTERM);
7823
7824         case KEY_when:
7825             pl_yylval.ival = CopLINE(PL_curcop);
7826             OPERATOR(WHEN);
7827
7828         case KEY_while:
7829             pl_yylval.ival = CopLINE(PL_curcop);
7830             OPERATOR(WHILE);
7831
7832         case KEY_warn:
7833             PL_hints |= HINT_BLOCK_SCOPE;
7834             LOP(OP_WARN,XTERM);
7835
7836         case KEY_wait:
7837             FUN0(OP_WAIT);
7838
7839         case KEY_waitpid:
7840             LOP(OP_WAITPID,XTERM);
7841
7842         case KEY_wantarray:
7843             FUN0(OP_WANTARRAY);
7844
7845         case KEY_write:
7846 #ifdef EBCDIC
7847         {
7848             char ctl_l[2];
7849             ctl_l[0] = toCTRL('L');
7850             ctl_l[1] = '\0';
7851             gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
7852         }
7853 #else
7854             /* Make sure $^L is defined */
7855             gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
7856 #endif
7857             UNI(OP_ENTERWRITE);
7858
7859         case KEY_x:
7860             if (PL_expect == XOPERATOR)
7861                 Mop(OP_REPEAT);
7862             check_uni();
7863             goto just_a_word;
7864
7865         case KEY_xor:
7866             pl_yylval.ival = OP_XOR;
7867             OPERATOR(OROP);
7868
7869         case KEY_y:
7870             s = scan_trans(s);
7871             TERM(sublex_start());
7872         }
7873     }}
7874 }
7875 #ifdef __SC__
7876 #pragma segment Main
7877 #endif
7878
7879 static int
7880 S_pending_ident(pTHX)
7881 {
7882     dVAR;
7883     register char *d;
7884     PADOFFSET tmp = 0;
7885     /* pit holds the identifier we read and pending_ident is reset */
7886     char pit = PL_pending_ident;
7887     const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
7888     /* All routes through this function want to know if there is a colon.  */
7889     const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
7890     PL_pending_ident = 0;
7891
7892     /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
7893     DEBUG_T({ PerlIO_printf(Perl_debug_log,
7894           "### Pending identifier '%s'\n", PL_tokenbuf); });
7895
7896     /* if we're in a my(), we can't allow dynamics here.
7897        $foo'bar has already been turned into $foo::bar, so
7898        just check for colons.
7899
7900        if it's a legal name, the OP is a PADANY.
7901     */
7902     if (PL_in_my) {
7903         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
7904             if (has_colon)
7905                 yyerror(Perl_form(aTHX_ "No package name allowed for "
7906                                   "variable %s in \"our\"",
7907                                   PL_tokenbuf));
7908             tmp = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7909         }
7910         else {
7911             if (has_colon)
7912                 yyerror(Perl_form(aTHX_ PL_no_myglob,
7913                             PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
7914
7915             pl_yylval.opval = newOP(OP_PADANY, 0);
7916             pl_yylval.opval->op_targ = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7917             return PRIVATEREF;
7918         }
7919     }
7920
7921     /*
7922        build the ops for accesses to a my() variable.
7923
7924        Deny my($a) or my($b) in a sort block, *if* $a or $b is
7925        then used in a comparison.  This catches most, but not
7926        all cases.  For instance, it catches
7927            sort { my($a); $a <=> $b }
7928        but not
7929            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
7930        (although why you'd do that is anyone's guess).
7931     */
7932
7933     if (!has_colon) {
7934         if (!PL_in_my)
7935             tmp = pad_findmy(PL_tokenbuf, tokenbuf_len, 0);
7936         if (tmp != NOT_IN_PAD) {
7937             /* might be an "our" variable" */
7938             if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
7939                 /* build ops for a bareword */
7940                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
7941                 HEK * const stashname = HvNAME_HEK(stash);
7942                 SV *  const sym = newSVhek(stashname);
7943                 sv_catpvs(sym, "::");
7944                 sv_catpvn(sym, PL_tokenbuf+1, tokenbuf_len - 1);
7945                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
7946                 pl_yylval.opval->op_private = OPpCONST_ENTERED;
7947                 gv_fetchsv(sym,
7948                     (PL_in_eval
7949                         ? (GV_ADDMULTI | GV_ADDINEVAL)
7950                         : GV_ADDMULTI
7951                     ),
7952                     ((PL_tokenbuf[0] == '$') ? SVt_PV
7953                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7954                      : SVt_PVHV));
7955                 return WORD;
7956             }
7957
7958             /* if it's a sort block and they're naming $a or $b */
7959             if (PL_last_lop_op == OP_SORT &&
7960                 PL_tokenbuf[0] == '$' &&
7961                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
7962                 && !PL_tokenbuf[2])
7963             {
7964                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
7965                      d < PL_bufend && *d != '\n';
7966                      d++)
7967                 {
7968                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
7969                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
7970                               PL_tokenbuf);
7971                     }
7972                 }
7973             }
7974
7975             pl_yylval.opval = newOP(OP_PADANY, 0);
7976             pl_yylval.opval->op_targ = tmp;
7977             return PRIVATEREF;
7978         }
7979     }
7980
7981     /*
7982        Whine if they've said @foo in a doublequoted string,
7983        and @foo isn't a variable we can find in the symbol
7984        table.
7985     */
7986     if (ckWARN(WARN_AMBIGUOUS) &&
7987         pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
7988         GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1, 0,
7989                                          SVt_PVAV);
7990         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
7991                 /* DO NOT warn for @- and @+ */
7992                 && !( PL_tokenbuf[2] == '\0' &&
7993                     ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7994            )
7995         {
7996             /* Downgraded from fatal to warning 20000522 mjd */
7997             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
7998                         "Possible unintended interpolation of %s in string",
7999                         PL_tokenbuf);
8000         }
8001     }
8002
8003     /* build ops for a bareword */
8004     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
8005                                                       tokenbuf_len - 1));
8006     pl_yylval.opval->op_private = OPpCONST_ENTERED;
8007     gv_fetchpvn_flags(
8008             PL_tokenbuf + 1, tokenbuf_len - 1,
8009             /* If the identifier refers to a stash, don't autovivify it.
8010              * Change 24660 had the side effect of causing symbol table
8011              * hashes to always be defined, even if they were freshly
8012              * created and the only reference in the entire program was
8013              * the single statement with the defined %foo::bar:: test.
8014              * It appears that all code in the wild doing this actually
8015              * wants to know whether sub-packages have been loaded, so
8016              * by avoiding auto-vivifying symbol tables, we ensure that
8017              * defined %foo::bar:: continues to be false, and the existing
8018              * tests still give the expected answers, even though what
8019              * they're actually testing has now changed subtly.
8020              */
8021             (*PL_tokenbuf == '%'
8022              && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
8023              && d[-1] == ':'
8024              ? 0
8025              : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
8026             ((PL_tokenbuf[0] == '$') ? SVt_PV
8027              : (PL_tokenbuf[0] == '@') ? SVt_PVAV
8028              : SVt_PVHV));
8029     return WORD;
8030 }
8031
8032 /*
8033  *  The following code was generated by perl_keyword.pl.
8034  */
8035
8036 I32
8037 Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
8038 {
8039     dVAR;
8040
8041     PERL_ARGS_ASSERT_KEYWORD;
8042
8043   switch (len)
8044   {
8045     case 1: /* 5 tokens of length 1 */
8046       switch (name[0])
8047       {
8048         case 'm':
8049           {                                       /* m          */
8050             return KEY_m;
8051           }
8052
8053         case 'q':
8054           {                                       /* q          */
8055             return KEY_q;
8056           }
8057
8058         case 's':
8059           {                                       /* s          */
8060             return KEY_s;
8061           }
8062
8063         case 'x':
8064           {                                       /* x          */
8065             return -KEY_x;
8066           }
8067
8068         case 'y':
8069           {                                       /* y          */
8070             return KEY_y;
8071           }
8072
8073         default:
8074           goto unknown;
8075       }
8076
8077     case 2: /* 18 tokens of length 2 */
8078       switch (name[0])
8079       {
8080         case 'd':
8081           if (name[1] == 'o')
8082           {                                       /* do         */
8083             return KEY_do;
8084           }
8085
8086           goto unknown;
8087
8088         case 'e':
8089           if (name[1] == 'q')
8090           {                                       /* eq         */
8091             return -KEY_eq;
8092           }
8093
8094           goto unknown;
8095
8096         case 'g':
8097           switch (name[1])
8098           {
8099             case 'e':
8100               {                                   /* ge         */
8101                 return -KEY_ge;
8102               }
8103
8104             case 't':
8105               {                                   /* gt         */
8106                 return -KEY_gt;
8107               }
8108
8109             default:
8110               goto unknown;
8111           }
8112
8113         case 'i':
8114           if (name[1] == 'f')
8115           {                                       /* if         */
8116             return KEY_if;
8117           }
8118
8119           goto unknown;
8120
8121         case 'l':
8122           switch (name[1])
8123           {
8124             case 'c':
8125               {                                   /* lc         */
8126                 return -KEY_lc;
8127               }
8128
8129             case 'e':
8130               {                                   /* le         */
8131                 return -KEY_le;
8132               }
8133
8134             case 't':
8135               {                                   /* lt         */
8136                 return -KEY_lt;
8137               }
8138
8139             default:
8140               goto unknown;
8141           }
8142
8143         case 'm':
8144           if (name[1] == 'y')
8145           {                                       /* my         */
8146             return KEY_my;
8147           }
8148
8149           goto unknown;
8150
8151         case 'n':
8152           switch (name[1])
8153           {
8154             case 'e':
8155               {                                   /* ne         */
8156                 return -KEY_ne;
8157               }
8158
8159             case 'o':
8160               {                                   /* no         */
8161                 return KEY_no;
8162               }
8163
8164             default:
8165               goto unknown;
8166           }
8167
8168         case 'o':
8169           if (name[1] == 'r')
8170           {                                       /* or         */
8171             return -KEY_or;
8172           }
8173
8174           goto unknown;
8175
8176         case 'q':
8177           switch (name[1])
8178           {
8179             case 'q':
8180               {                                   /* qq         */
8181                 return KEY_qq;
8182               }
8183
8184             case 'r':
8185               {                                   /* qr         */
8186                 return KEY_qr;
8187               }
8188
8189             case 'w':
8190               {                                   /* qw         */
8191                 return KEY_qw;
8192               }
8193
8194             case 'x':
8195               {                                   /* qx         */
8196                 return KEY_qx;
8197               }
8198
8199             default:
8200               goto unknown;
8201           }
8202
8203         case 't':
8204           if (name[1] == 'r')
8205           {                                       /* tr         */
8206             return KEY_tr;
8207           }
8208
8209           goto unknown;
8210
8211         case 'u':
8212           if (name[1] == 'c')
8213           {                                       /* uc         */
8214             return -KEY_uc;
8215           }
8216
8217           goto unknown;
8218
8219         default:
8220           goto unknown;
8221       }
8222
8223     case 3: /* 29 tokens of length 3 */
8224       switch (name[0])
8225       {
8226         case 'E':
8227           if (name[1] == 'N' &&
8228               name[2] == 'D')
8229           {                                       /* END        */
8230             return KEY_END;
8231           }
8232
8233           goto unknown;
8234
8235         case 'a':
8236           switch (name[1])
8237           {
8238             case 'b':
8239               if (name[2] == 's')
8240               {                                   /* abs        */
8241                 return -KEY_abs;
8242               }
8243
8244               goto unknown;
8245
8246             case 'n':
8247               if (name[2] == 'd')
8248               {                                   /* and        */
8249                 return -KEY_and;
8250               }
8251
8252               goto unknown;
8253
8254             default:
8255               goto unknown;
8256           }
8257
8258         case 'c':
8259           switch (name[1])
8260           {
8261             case 'h':
8262               if (name[2] == 'r')
8263               {                                   /* chr        */
8264                 return -KEY_chr;
8265               }
8266
8267               goto unknown;
8268
8269             case 'm':
8270               if (name[2] == 'p')
8271               {                                   /* cmp        */
8272                 return -KEY_cmp;
8273               }
8274
8275               goto unknown;
8276
8277             case 'o':
8278               if (name[2] == 's')
8279               {                                   /* cos        */
8280                 return -KEY_cos;
8281               }
8282
8283               goto unknown;
8284
8285             default:
8286               goto unknown;
8287           }
8288
8289         case 'd':
8290           if (name[1] == 'i' &&
8291               name[2] == 'e')
8292           {                                       /* die        */
8293             return -KEY_die;
8294           }
8295
8296           goto unknown;
8297
8298         case 'e':
8299           switch (name[1])
8300           {
8301             case 'o':
8302               if (name[2] == 'f')
8303               {                                   /* eof        */
8304                 return -KEY_eof;
8305               }
8306
8307               goto unknown;
8308
8309             case 'x':
8310               if (name[2] == 'p')
8311               {                                   /* exp        */
8312                 return -KEY_exp;
8313               }
8314
8315               goto unknown;
8316
8317             default:
8318               goto unknown;
8319           }
8320
8321         case 'f':
8322           if (name[1] == 'o' &&
8323               name[2] == 'r')
8324           {                                       /* for        */
8325             return KEY_for;
8326           }
8327
8328           goto unknown;
8329
8330         case 'h':
8331           if (name[1] == 'e' &&
8332               name[2] == 'x')
8333           {                                       /* hex        */
8334             return -KEY_hex;
8335           }
8336
8337           goto unknown;
8338
8339         case 'i':
8340           if (name[1] == 'n' &&
8341               name[2] == 't')
8342           {                                       /* int        */
8343             return -KEY_int;
8344           }
8345
8346           goto unknown;
8347
8348         case 'l':
8349           if (name[1] == 'o' &&
8350               name[2] == 'g')
8351           {                                       /* log        */
8352             return -KEY_log;
8353           }
8354
8355           goto unknown;
8356
8357         case 'm':
8358           if (name[1] == 'a' &&
8359               name[2] == 'p')
8360           {                                       /* map        */
8361             return KEY_map;
8362           }
8363
8364           goto unknown;
8365
8366         case 'n':
8367           if (name[1] == 'o' &&
8368               name[2] == 't')
8369           {                                       /* not        */
8370             return -KEY_not;
8371           }
8372
8373           goto unknown;
8374
8375         case 'o':
8376           switch (name[1])
8377           {
8378             case 'c':
8379               if (name[2] == 't')
8380               {                                   /* oct        */
8381                 return -KEY_oct;
8382               }
8383
8384               goto unknown;
8385
8386             case 'r':
8387               if (name[2] == 'd')
8388               {                                   /* ord        */
8389                 return -KEY_ord;
8390               }
8391
8392               goto unknown;
8393
8394             case 'u':
8395               if (name[2] == 'r')
8396               {                                   /* our        */
8397                 return KEY_our;
8398               }
8399
8400               goto unknown;
8401
8402             default:
8403               goto unknown;
8404           }
8405
8406         case 'p':
8407           if (name[1] == 'o')
8408           {
8409             switch (name[2])
8410             {
8411               case 'p':
8412                 {                                 /* pop        */
8413                   return -KEY_pop;
8414                 }
8415
8416               case 's':
8417                 {                                 /* pos        */
8418                   return KEY_pos;
8419                 }
8420
8421               default:
8422                 goto unknown;
8423             }
8424           }
8425
8426           goto unknown;
8427
8428         case 'r':
8429           if (name[1] == 'e' &&
8430               name[2] == 'f')
8431           {                                       /* ref        */
8432             return -KEY_ref;
8433           }
8434
8435           goto unknown;
8436
8437         case 's':
8438           switch (name[1])
8439           {
8440             case 'a':
8441               if (name[2] == 'y')
8442               {                                   /* say        */
8443                 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
8444               }
8445
8446               goto unknown;
8447
8448             case 'i':
8449               if (name[2] == 'n')
8450               {                                   /* sin        */
8451                 return -KEY_sin;
8452               }
8453
8454               goto unknown;
8455
8456             case 'u':
8457               if (name[2] == 'b')
8458               {                                   /* sub        */
8459                 return KEY_sub;
8460               }
8461
8462               goto unknown;
8463
8464             default:
8465               goto unknown;
8466           }
8467
8468         case 't':
8469           if (name[1] == 'i' &&
8470               name[2] == 'e')
8471           {                                       /* tie        */
8472             return KEY_tie;
8473           }
8474
8475           goto unknown;
8476
8477         case 'u':
8478           if (name[1] == 's' &&
8479               name[2] == 'e')
8480           {                                       /* use        */
8481             return KEY_use;
8482           }
8483
8484           goto unknown;
8485
8486         case 'v':
8487           if (name[1] == 'e' &&
8488               name[2] == 'c')
8489           {                                       /* vec        */
8490             return -KEY_vec;
8491           }
8492
8493           goto unknown;
8494
8495         case 'x':
8496           if (name[1] == 'o' &&
8497               name[2] == 'r')
8498           {                                       /* xor        */
8499             return -KEY_xor;
8500           }
8501
8502           goto unknown;
8503
8504         default:
8505           goto unknown;
8506       }
8507
8508     case 4: /* 41 tokens of length 4 */
8509       switch (name[0])
8510       {
8511         case 'C':
8512           if (name[1] == 'O' &&
8513               name[2] == 'R' &&
8514               name[3] == 'E')
8515           {                                       /* CORE       */
8516             return -KEY_CORE;
8517           }
8518
8519           goto unknown;
8520
8521         case 'I':
8522           if (name[1] == 'N' &&
8523               name[2] == 'I' &&
8524               name[3] == 'T')
8525           {                                       /* INIT       */
8526             return KEY_INIT;
8527           }
8528
8529           goto unknown;
8530
8531         case 'b':
8532           if (name[1] == 'i' &&
8533               name[2] == 'n' &&
8534               name[3] == 'd')
8535           {                                       /* bind       */
8536             return -KEY_bind;
8537           }
8538
8539           goto unknown;
8540
8541         case 'c':
8542           if (name[1] == 'h' &&
8543               name[2] == 'o' &&
8544               name[3] == 'p')
8545           {                                       /* chop       */
8546             return -KEY_chop;
8547           }
8548
8549           goto unknown;
8550
8551         case 'd':
8552           if (name[1] == 'u' &&
8553               name[2] == 'm' &&
8554               name[3] == 'p')
8555           {                                       /* dump       */
8556             return -KEY_dump;
8557           }
8558
8559           goto unknown;
8560
8561         case 'e':
8562           switch (name[1])
8563           {
8564             case 'a':
8565               if (name[2] == 'c' &&
8566                   name[3] == 'h')
8567               {                                   /* each       */
8568                 return -KEY_each;
8569               }
8570
8571               goto unknown;
8572
8573             case 'l':
8574               if (name[2] == 's' &&
8575                   name[3] == 'e')
8576               {                                   /* else       */
8577                 return KEY_else;
8578               }
8579
8580               goto unknown;
8581
8582             case 'v':
8583               if (name[2] == 'a' &&
8584                   name[3] == 'l')
8585               {                                   /* eval       */
8586                 return KEY_eval;
8587               }
8588
8589               goto unknown;
8590
8591             case 'x':
8592               switch (name[2])
8593               {
8594                 case 'e':
8595                   if (name[3] == 'c')
8596                   {                               /* exec       */
8597                     return -KEY_exec;
8598                   }
8599
8600                   goto unknown;
8601
8602                 case 'i':
8603                   if (name[3] == 't')
8604                   {                               /* exit       */
8605                     return -KEY_exit;
8606                   }
8607
8608                   goto unknown;
8609
8610                 default:
8611                   goto unknown;
8612               }
8613
8614             default:
8615               goto unknown;
8616           }
8617
8618         case 'f':
8619           if (name[1] == 'o' &&
8620               name[2] == 'r' &&
8621               name[3] == 'k')
8622           {                                       /* fork       */
8623             return -KEY_fork;
8624           }
8625
8626           goto unknown;
8627
8628         case 'g':
8629           switch (name[1])
8630           {
8631             case 'e':
8632               if (name[2] == 't' &&
8633                   name[3] == 'c')
8634               {                                   /* getc       */
8635                 return -KEY_getc;
8636               }
8637
8638               goto unknown;
8639
8640             case 'l':
8641               if (name[2] == 'o' &&
8642                   name[3] == 'b')
8643               {                                   /* glob       */
8644                 return KEY_glob;
8645               }
8646
8647               goto unknown;
8648
8649             case 'o':
8650               if (name[2] == 't' &&
8651                   name[3] == 'o')
8652               {                                   /* goto       */
8653                 return KEY_goto;
8654               }
8655
8656               goto unknown;
8657
8658             case 'r':
8659               if (name[2] == 'e' &&
8660                   name[3] == 'p')
8661               {                                   /* grep       */
8662                 return KEY_grep;
8663               }
8664
8665               goto unknown;
8666
8667             default:
8668               goto unknown;
8669           }
8670
8671         case 'j':
8672           if (name[1] == 'o' &&
8673               name[2] == 'i' &&
8674               name[3] == 'n')
8675           {                                       /* join       */
8676             return -KEY_join;
8677           }
8678
8679           goto unknown;
8680
8681         case 'k':
8682           switch (name[1])
8683           {
8684             case 'e':
8685               if (name[2] == 'y' &&
8686                   name[3] == 's')
8687               {                                   /* keys       */
8688                 return -KEY_keys;
8689               }
8690
8691               goto unknown;
8692
8693             case 'i':
8694               if (name[2] == 'l' &&
8695                   name[3] == 'l')
8696               {                                   /* kill       */
8697                 return -KEY_kill;
8698               }
8699
8700               goto unknown;
8701
8702             default:
8703               goto unknown;
8704           }
8705
8706         case 'l':
8707           switch (name[1])
8708           {
8709             case 'a':
8710               if (name[2] == 's' &&
8711                   name[3] == 't')
8712               {                                   /* last       */
8713                 return KEY_last;
8714               }
8715
8716               goto unknown;
8717
8718             case 'i':
8719               if (name[2] == 'n' &&
8720                   name[3] == 'k')
8721               {                                   /* link       */
8722                 return -KEY_link;
8723               }
8724
8725               goto unknown;
8726
8727             case 'o':
8728               if (name[2] == 'c' &&
8729                   name[3] == 'k')
8730               {                                   /* lock       */
8731                 return -KEY_lock;
8732               }
8733
8734               goto unknown;
8735
8736             default:
8737               goto unknown;
8738           }
8739
8740         case 'n':
8741           if (name[1] == 'e' &&
8742               name[2] == 'x' &&
8743               name[3] == 't')
8744           {                                       /* next       */
8745             return KEY_next;
8746           }
8747
8748           goto unknown;
8749
8750         case 'o':
8751           if (name[1] == 'p' &&
8752               name[2] == 'e' &&
8753               name[3] == 'n')
8754           {                                       /* open       */
8755             return -KEY_open;
8756           }
8757
8758           goto unknown;
8759
8760         case 'p':
8761           switch (name[1])
8762           {
8763             case 'a':
8764               if (name[2] == 'c' &&
8765                   name[3] == 'k')
8766               {                                   /* pack       */
8767                 return -KEY_pack;
8768               }
8769
8770               goto unknown;
8771
8772             case 'i':
8773               if (name[2] == 'p' &&
8774                   name[3] == 'e')
8775               {                                   /* pipe       */
8776                 return -KEY_pipe;
8777               }
8778
8779               goto unknown;
8780
8781             case 'u':
8782               if (name[2] == 's' &&
8783                   name[3] == 'h')
8784               {                                   /* push       */
8785                 return -KEY_push;
8786               }
8787
8788               goto unknown;
8789
8790             default:
8791               goto unknown;
8792           }
8793
8794         case 'r':
8795           switch (name[1])
8796           {
8797             case 'a':
8798               if (name[2] == 'n' &&
8799                   name[3] == 'd')
8800               {                                   /* rand       */
8801                 return -KEY_rand;
8802               }
8803
8804               goto unknown;
8805
8806             case 'e':
8807               switch (name[2])
8808               {
8809                 case 'a':
8810                   if (name[3] == 'd')
8811                   {                               /* read       */
8812                     return -KEY_read;
8813                   }
8814
8815                   goto unknown;
8816
8817                 case 'c':
8818                   if (name[3] == 'v')
8819                   {                               /* recv       */
8820                     return -KEY_recv;
8821                   }
8822
8823                   goto unknown;
8824
8825                 case 'd':
8826                   if (name[3] == 'o')
8827                   {                               /* redo       */
8828                     return KEY_redo;
8829                   }
8830
8831                   goto unknown;
8832
8833                 default:
8834                   goto unknown;
8835               }
8836
8837             default:
8838               goto unknown;
8839           }
8840
8841         case 's':
8842           switch (name[1])
8843           {
8844             case 'e':
8845               switch (name[2])
8846               {
8847                 case 'e':
8848                   if (name[3] == 'k')
8849                   {                               /* seek       */
8850                     return -KEY_seek;
8851                   }
8852
8853                   goto unknown;
8854
8855                 case 'n':
8856                   if (name[3] == 'd')
8857                   {                               /* send       */
8858                     return -KEY_send;
8859                   }
8860
8861                   goto unknown;
8862
8863                 default:
8864                   goto unknown;
8865               }
8866
8867             case 'o':
8868               if (name[2] == 'r' &&
8869                   name[3] == 't')
8870               {                                   /* sort       */
8871                 return KEY_sort;
8872               }
8873
8874               goto unknown;
8875
8876             case 'q':
8877               if (name[2] == 'r' &&
8878                   name[3] == 't')
8879               {                                   /* sqrt       */
8880                 return -KEY_sqrt;
8881               }
8882
8883               goto unknown;
8884
8885             case 't':
8886               if (name[2] == 'a' &&
8887                   name[3] == 't')
8888               {                                   /* stat       */
8889                 return -KEY_stat;
8890               }
8891
8892               goto unknown;
8893
8894             default:
8895               goto unknown;
8896           }
8897
8898         case 't':
8899           switch (name[1])
8900           {
8901             case 'e':
8902               if (name[2] == 'l' &&
8903                   name[3] == 'l')
8904               {                                   /* tell       */
8905                 return -KEY_tell;
8906               }
8907
8908               goto unknown;
8909
8910             case 'i':
8911               switch (name[2])
8912               {
8913                 case 'e':
8914                   if (name[3] == 'd')
8915                   {                               /* tied       */
8916                     return KEY_tied;
8917                   }
8918
8919                   goto unknown;
8920
8921                 case 'm':
8922                   if (name[3] == 'e')
8923                   {                               /* time       */
8924                     return -KEY_time;
8925                   }
8926
8927                   goto unknown;
8928
8929                 default:
8930                   goto unknown;
8931               }
8932
8933             default:
8934               goto unknown;
8935           }
8936
8937         case 'w':
8938           switch (name[1])
8939           {
8940             case 'a':
8941               switch (name[2])
8942               {
8943                 case 'i':
8944                   if (name[3] == 't')
8945                   {                               /* wait       */
8946                     return -KEY_wait;
8947                   }
8948
8949                   goto unknown;
8950
8951                 case 'r':
8952                   if (name[3] == 'n')
8953                   {                               /* warn       */
8954                     return -KEY_warn;
8955                   }
8956
8957                   goto unknown;
8958
8959                 default:
8960                   goto unknown;
8961               }
8962
8963             case 'h':
8964               if (name[2] == 'e' &&
8965                   name[3] == 'n')
8966               {                                   /* when       */
8967                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
8968               }
8969
8970               goto unknown;
8971
8972             default:
8973               goto unknown;
8974           }
8975
8976         default:
8977           goto unknown;
8978       }
8979
8980     case 5: /* 39 tokens of length 5 */
8981       switch (name[0])
8982       {
8983         case 'B':
8984           if (name[1] == 'E' &&
8985               name[2] == 'G' &&
8986               name[3] == 'I' &&
8987               name[4] == 'N')
8988           {                                       /* BEGIN      */
8989             return KEY_BEGIN;
8990           }
8991
8992           goto unknown;
8993
8994         case 'C':
8995           if (name[1] == 'H' &&
8996               name[2] == 'E' &&
8997               name[3] == 'C' &&
8998               name[4] == 'K')
8999           {                                       /* CHECK      */
9000             return KEY_CHECK;
9001           }
9002
9003           goto unknown;
9004
9005         case 'a':
9006           switch (name[1])
9007           {
9008             case 'l':
9009               if (name[2] == 'a' &&
9010                   name[3] == 'r' &&
9011                   name[4] == 'm')
9012               {                                   /* alarm      */
9013                 return -KEY_alarm;
9014               }
9015
9016               goto unknown;
9017
9018             case 't':
9019               if (name[2] == 'a' &&
9020                   name[3] == 'n' &&
9021                   name[4] == '2')
9022               {                                   /* atan2      */
9023                 return -KEY_atan2;
9024               }
9025
9026               goto unknown;
9027
9028             default:
9029               goto unknown;
9030           }
9031
9032         case 'b':
9033           switch (name[1])
9034           {
9035             case 'l':
9036               if (name[2] == 'e' &&
9037                   name[3] == 's' &&
9038                   name[4] == 's')
9039               {                                   /* bless      */
9040                 return -KEY_bless;
9041               }
9042
9043               goto unknown;
9044
9045             case 'r':
9046               if (name[2] == 'e' &&
9047                   name[3] == 'a' &&
9048                   name[4] == 'k')
9049               {                                   /* break      */
9050                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
9051               }
9052
9053               goto unknown;
9054
9055             default:
9056               goto unknown;
9057           }
9058
9059         case 'c':
9060           switch (name[1])
9061           {
9062             case 'h':
9063               switch (name[2])
9064               {
9065                 case 'd':
9066                   if (name[3] == 'i' &&
9067                       name[4] == 'r')
9068                   {                               /* chdir      */
9069                     return -KEY_chdir;
9070                   }
9071
9072                   goto unknown;
9073
9074                 case 'm':
9075                   if (name[3] == 'o' &&
9076                       name[4] == 'd')
9077                   {                               /* chmod      */
9078                     return -KEY_chmod;
9079                   }
9080
9081                   goto unknown;
9082
9083                 case 'o':
9084                   switch (name[3])
9085                   {
9086                     case 'm':
9087                       if (name[4] == 'p')
9088                       {                           /* chomp      */
9089                         return -KEY_chomp;
9090                       }
9091
9092                       goto unknown;
9093
9094                     case 'w':
9095                       if (name[4] == 'n')
9096                       {                           /* chown      */
9097                         return -KEY_chown;
9098                       }
9099
9100                       goto unknown;
9101
9102                     default:
9103                       goto unknown;
9104                   }
9105
9106                 default:
9107                   goto unknown;
9108               }
9109
9110             case 'l':
9111               if (name[2] == 'o' &&
9112                   name[3] == 's' &&
9113                   name[4] == 'e')
9114               {                                   /* close      */
9115                 return -KEY_close;
9116               }
9117
9118               goto unknown;
9119
9120             case 'r':
9121               if (name[2] == 'y' &&
9122                   name[3] == 'p' &&
9123                   name[4] == 't')
9124               {                                   /* crypt      */
9125                 return -KEY_crypt;
9126               }
9127
9128               goto unknown;
9129
9130             default:
9131               goto unknown;
9132           }
9133
9134         case 'e':
9135           if (name[1] == 'l' &&
9136               name[2] == 's' &&
9137               name[3] == 'i' &&
9138               name[4] == 'f')
9139           {                                       /* elsif      */
9140             return KEY_elsif;
9141           }
9142
9143           goto unknown;
9144
9145         case 'f':
9146           switch (name[1])
9147           {
9148             case 'c':
9149               if (name[2] == 'n' &&
9150                   name[3] == 't' &&
9151                   name[4] == 'l')
9152               {                                   /* fcntl      */
9153                 return -KEY_fcntl;
9154               }
9155
9156               goto unknown;
9157
9158             case 'l':
9159               if (name[2] == 'o' &&
9160                   name[3] == 'c' &&
9161                   name[4] == 'k')
9162               {                                   /* flock      */
9163                 return -KEY_flock;
9164               }
9165
9166               goto unknown;
9167
9168             default:
9169               goto unknown;
9170           }
9171
9172         case 'g':
9173           if (name[1] == 'i' &&
9174               name[2] == 'v' &&
9175               name[3] == 'e' &&
9176               name[4] == 'n')
9177           {                                       /* given      */
9178             return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
9179           }
9180
9181           goto unknown;
9182
9183         case 'i':
9184           switch (name[1])
9185           {
9186             case 'n':
9187               if (name[2] == 'd' &&
9188                   name[3] == 'e' &&
9189                   name[4] == 'x')
9190               {                                   /* index      */
9191                 return -KEY_index;
9192               }
9193
9194               goto unknown;
9195
9196             case 'o':
9197               if (name[2] == 'c' &&
9198                   name[3] == 't' &&
9199                   name[4] == 'l')
9200               {                                   /* ioctl      */
9201                 return -KEY_ioctl;
9202               }
9203
9204               goto unknown;
9205
9206             default:
9207               goto unknown;
9208           }
9209
9210         case 'l':
9211           switch (name[1])
9212           {
9213             case 'o':
9214               if (name[2] == 'c' &&
9215                   name[3] == 'a' &&
9216                   name[4] == 'l')
9217               {                                   /* local      */
9218                 return KEY_local;
9219               }
9220
9221               goto unknown;
9222
9223             case 's':
9224               if (name[2] == 't' &&
9225                   name[3] == 'a' &&
9226                   name[4] == 't')
9227               {                                   /* lstat      */
9228                 return -KEY_lstat;
9229               }
9230
9231               goto unknown;
9232
9233             default:
9234               goto unknown;
9235           }
9236
9237         case 'm':
9238           if (name[1] == 'k' &&
9239               name[2] == 'd' &&
9240               name[3] == 'i' &&
9241               name[4] == 'r')
9242           {                                       /* mkdir      */
9243             return -KEY_mkdir;
9244           }
9245
9246           goto unknown;
9247
9248         case 'p':
9249           if (name[1] == 'r' &&
9250               name[2] == 'i' &&
9251               name[3] == 'n' &&
9252               name[4] == 't')
9253           {                                       /* print      */
9254             return KEY_print;
9255           }
9256
9257           goto unknown;
9258
9259         case 'r':
9260           switch (name[1])
9261           {
9262             case 'e':
9263               if (name[2] == 's' &&
9264                   name[3] == 'e' &&
9265                   name[4] == 't')
9266               {                                   /* reset      */
9267                 return -KEY_reset;
9268               }
9269
9270               goto unknown;
9271
9272             case 'm':
9273               if (name[2] == 'd' &&
9274                   name[3] == 'i' &&
9275                   name[4] == 'r')
9276               {                                   /* rmdir      */
9277                 return -KEY_rmdir;
9278               }
9279
9280               goto unknown;
9281
9282             default:
9283               goto unknown;
9284           }
9285
9286         case 's':
9287           switch (name[1])
9288           {
9289             case 'e':
9290               if (name[2] == 'm' &&
9291                   name[3] == 'o' &&
9292                   name[4] == 'p')
9293               {                                   /* semop      */
9294                 return -KEY_semop;
9295               }
9296
9297               goto unknown;
9298
9299             case 'h':
9300               if (name[2] == 'i' &&
9301                   name[3] == 'f' &&
9302                   name[4] == 't')
9303               {                                   /* shift      */
9304                 return -KEY_shift;
9305               }
9306
9307               goto unknown;
9308
9309             case 'l':
9310               if (name[2] == 'e' &&
9311                   name[3] == 'e' &&
9312                   name[4] == 'p')
9313               {                                   /* sleep      */
9314                 return -KEY_sleep;
9315               }
9316
9317               goto unknown;
9318
9319             case 'p':
9320               if (name[2] == 'l' &&
9321                   name[3] == 'i' &&
9322                   name[4] == 't')
9323               {                                   /* split      */
9324                 return KEY_split;
9325               }
9326
9327               goto unknown;
9328
9329             case 'r':
9330               if (name[2] == 'a' &&
9331                   name[3] == 'n' &&
9332                   name[4] == 'd')
9333               {                                   /* srand      */
9334                 return -KEY_srand;
9335               }
9336
9337               goto unknown;
9338
9339             case 't':
9340               switch (name[2])
9341               {
9342                 case 'a':
9343                   if (name[3] == 't' &&
9344                       name[4] == 'e')
9345                   {                               /* state      */
9346                     return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
9347                   }
9348
9349                   goto unknown;
9350
9351                 case 'u':
9352                   if (name[3] == 'd' &&
9353                       name[4] == 'y')
9354                   {                               /* study      */
9355                     return KEY_study;
9356                   }
9357
9358                   goto unknown;
9359
9360                 default:
9361                   goto unknown;
9362               }
9363
9364             default:
9365               goto unknown;
9366           }
9367
9368         case 't':
9369           if (name[1] == 'i' &&
9370               name[2] == 'm' &&
9371               name[3] == 'e' &&
9372               name[4] == 's')
9373           {                                       /* times      */
9374             return -KEY_times;
9375           }
9376
9377           goto unknown;
9378
9379         case 'u':
9380           switch (name[1])
9381           {
9382             case 'm':
9383               if (name[2] == 'a' &&
9384                   name[3] == 's' &&
9385                   name[4] == 'k')
9386               {                                   /* umask      */
9387                 return -KEY_umask;
9388               }
9389
9390               goto unknown;
9391
9392             case 'n':
9393               switch (name[2])
9394               {
9395                 case 'd':
9396                   if (name[3] == 'e' &&
9397                       name[4] == 'f')
9398                   {                               /* undef      */
9399                     return KEY_undef;
9400                   }
9401
9402                   goto unknown;
9403
9404                 case 't':
9405                   if (name[3] == 'i')
9406                   {
9407                     switch (name[4])
9408                     {
9409                       case 'e':
9410                         {                         /* untie      */
9411                           return KEY_untie;
9412                         }
9413
9414                       case 'l':
9415                         {                         /* until      */
9416                           return KEY_until;
9417                         }
9418
9419                       default:
9420                         goto unknown;
9421                     }
9422                   }
9423
9424                   goto unknown;
9425
9426                 default:
9427                   goto unknown;
9428               }
9429
9430             case 't':
9431               if (name[2] == 'i' &&
9432                   name[3] == 'm' &&
9433                   name[4] == 'e')
9434               {                                   /* utime      */
9435                 return -KEY_utime;
9436               }
9437
9438               goto unknown;
9439
9440             default:
9441               goto unknown;
9442           }
9443
9444         case 'w':
9445           switch (name[1])
9446           {
9447             case 'h':
9448               if (name[2] == 'i' &&
9449                   name[3] == 'l' &&
9450                   name[4] == 'e')
9451               {                                   /* while      */
9452                 return KEY_while;
9453               }
9454
9455               goto unknown;
9456
9457             case 'r':
9458               if (name[2] == 'i' &&
9459                   name[3] == 't' &&
9460                   name[4] == 'e')
9461               {                                   /* write      */
9462                 return -KEY_write;
9463               }
9464
9465               goto unknown;
9466
9467             default:
9468               goto unknown;
9469           }
9470
9471         default:
9472           goto unknown;
9473       }
9474
9475     case 6: /* 33 tokens of length 6 */
9476       switch (name[0])
9477       {
9478         case 'a':
9479           if (name[1] == 'c' &&
9480               name[2] == 'c' &&
9481               name[3] == 'e' &&
9482               name[4] == 'p' &&
9483               name[5] == 't')
9484           {                                       /* accept     */
9485             return -KEY_accept;
9486           }
9487
9488           goto unknown;
9489
9490         case 'c':
9491           switch (name[1])
9492           {
9493             case 'a':
9494               if (name[2] == 'l' &&
9495                   name[3] == 'l' &&
9496                   name[4] == 'e' &&
9497                   name[5] == 'r')
9498               {                                   /* caller     */
9499                 return -KEY_caller;
9500               }
9501
9502               goto unknown;
9503
9504             case 'h':
9505               if (name[2] == 'r' &&
9506                   name[3] == 'o' &&
9507                   name[4] == 'o' &&
9508                   name[5] == 't')
9509               {                                   /* chroot     */
9510                 return -KEY_chroot;
9511               }
9512
9513               goto unknown;
9514
9515             default:
9516               goto unknown;
9517           }
9518
9519         case 'd':
9520           if (name[1] == 'e' &&
9521               name[2] == 'l' &&
9522               name[3] == 'e' &&
9523               name[4] == 't' &&
9524               name[5] == 'e')
9525           {                                       /* delete     */
9526             return KEY_delete;
9527           }
9528
9529           goto unknown;
9530
9531         case 'e':
9532           switch (name[1])
9533           {
9534             case 'l':
9535               if (name[2] == 's' &&
9536                   name[3] == 'e' &&
9537                   name[4] == 'i' &&
9538                   name[5] == 'f')
9539               {                                   /* elseif     */
9540                   Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
9541               }
9542
9543               goto unknown;
9544
9545             case 'x':
9546               if (name[2] == 'i' &&
9547                   name[3] == 's' &&
9548                   name[4] == 't' &&
9549                   name[5] == 's')
9550               {                                   /* exists     */
9551                 return KEY_exists;
9552               }
9553
9554               goto unknown;
9555
9556             default:
9557               goto unknown;
9558           }
9559
9560         case 'f':
9561           switch (name[1])
9562           {
9563             case 'i':
9564               if (name[2] == 'l' &&
9565                   name[3] == 'e' &&
9566                   name[4] == 'n' &&
9567                   name[5] == 'o')
9568               {                                   /* fileno     */
9569                 return -KEY_fileno;
9570               }
9571
9572               goto unknown;
9573
9574             case 'o':
9575               if (name[2] == 'r' &&
9576                   name[3] == 'm' &&
9577                   name[4] == 'a' &&
9578                   name[5] == 't')
9579               {                                   /* format     */
9580                 return KEY_format;
9581               }
9582
9583               goto unknown;
9584
9585             default:
9586               goto unknown;
9587           }
9588
9589         case 'g':
9590           if (name[1] == 'm' &&
9591               name[2] == 't' &&
9592               name[3] == 'i' &&
9593               name[4] == 'm' &&
9594               name[5] == 'e')
9595           {                                       /* gmtime     */
9596             return -KEY_gmtime;
9597           }
9598
9599           goto unknown;
9600
9601         case 'l':
9602           switch (name[1])
9603           {
9604             case 'e':
9605               if (name[2] == 'n' &&
9606                   name[3] == 'g' &&
9607                   name[4] == 't' &&
9608                   name[5] == 'h')
9609               {                                   /* length     */
9610                 return -KEY_length;
9611               }
9612
9613               goto unknown;
9614
9615             case 'i':
9616               if (name[2] == 's' &&
9617                   name[3] == 't' &&
9618                   name[4] == 'e' &&
9619                   name[5] == 'n')
9620               {                                   /* listen     */
9621                 return -KEY_listen;
9622               }
9623
9624               goto unknown;
9625
9626             default:
9627               goto unknown;
9628           }
9629
9630         case 'm':
9631           if (name[1] == 's' &&
9632               name[2] == 'g')
9633           {
9634             switch (name[3])
9635             {
9636               case 'c':
9637                 if (name[4] == 't' &&
9638                     name[5] == 'l')
9639                 {                                 /* msgctl     */
9640                   return -KEY_msgctl;
9641                 }
9642
9643                 goto unknown;
9644
9645               case 'g':
9646                 if (name[4] == 'e' &&
9647                     name[5] == 't')
9648                 {                                 /* msgget     */
9649                   return -KEY_msgget;
9650                 }
9651
9652                 goto unknown;
9653
9654               case 'r':
9655                 if (name[4] == 'c' &&
9656                     name[5] == 'v')
9657                 {                                 /* msgrcv     */
9658                   return -KEY_msgrcv;
9659                 }
9660
9661                 goto unknown;
9662
9663               case 's':
9664                 if (name[4] == 'n' &&
9665                     name[5] == 'd')
9666                 {                                 /* msgsnd     */
9667                   return -KEY_msgsnd;
9668                 }
9669
9670                 goto unknown;
9671
9672               default:
9673                 goto unknown;
9674             }
9675           }
9676
9677           goto unknown;
9678
9679         case 'p':
9680           if (name[1] == 'r' &&
9681               name[2] == 'i' &&
9682               name[3] == 'n' &&
9683               name[4] == 't' &&
9684               name[5] == 'f')
9685           {                                       /* printf     */
9686             return KEY_printf;
9687           }
9688
9689           goto unknown;
9690
9691         case 'r':
9692           switch (name[1])
9693           {
9694             case 'e':
9695               switch (name[2])
9696               {
9697                 case 'n':
9698                   if (name[3] == 'a' &&
9699                       name[4] == 'm' &&
9700                       name[5] == 'e')
9701                   {                               /* rename     */
9702                     return -KEY_rename;
9703                   }
9704
9705                   goto unknown;
9706
9707                 case 't':
9708                   if (name[3] == 'u' &&
9709                       name[4] == 'r' &&
9710                       name[5] == 'n')
9711                   {                               /* return     */
9712                     return KEY_return;
9713                   }
9714
9715                   goto unknown;
9716
9717                 default:
9718                   goto unknown;
9719               }
9720
9721             case 'i':
9722               if (name[2] == 'n' &&
9723                   name[3] == 'd' &&
9724                   name[4] == 'e' &&
9725                   name[5] == 'x')
9726               {                                   /* rindex     */
9727                 return -KEY_rindex;
9728               }
9729
9730               goto unknown;
9731
9732             default:
9733               goto unknown;
9734           }
9735
9736         case 's':
9737           switch (name[1])
9738           {
9739             case 'c':
9740               if (name[2] == 'a' &&
9741                   name[3] == 'l' &&
9742                   name[4] == 'a' &&
9743                   name[5] == 'r')
9744               {                                   /* scalar     */
9745                 return KEY_scalar;
9746               }
9747
9748               goto unknown;
9749
9750             case 'e':
9751               switch (name[2])
9752               {
9753                 case 'l':
9754                   if (name[3] == 'e' &&
9755                       name[4] == 'c' &&
9756                       name[5] == 't')
9757                   {                               /* select     */
9758                     return -KEY_select;
9759                   }
9760
9761                   goto unknown;
9762
9763                 case 'm':
9764                   switch (name[3])
9765                   {
9766                     case 'c':
9767                       if (name[4] == 't' &&
9768                           name[5] == 'l')
9769                       {                           /* semctl     */
9770                         return -KEY_semctl;
9771                       }
9772
9773                       goto unknown;
9774
9775                     case 'g':
9776                       if (name[4] == 'e' &&
9777                           name[5] == 't')
9778                       {                           /* semget     */
9779                         return -KEY_semget;
9780                       }
9781
9782                       goto unknown;
9783
9784                     default:
9785                       goto unknown;
9786                   }
9787
9788                 default:
9789                   goto unknown;
9790               }
9791
9792             case 'h':
9793               if (name[2] == 'm')
9794               {
9795                 switch (name[3])
9796                 {
9797                   case 'c':
9798                     if (name[4] == 't' &&
9799                         name[5] == 'l')
9800                     {                             /* shmctl     */
9801                       return -KEY_shmctl;
9802                     }
9803
9804                     goto unknown;
9805
9806                   case 'g':
9807                     if (name[4] == 'e' &&
9808                         name[5] == 't')
9809                     {                             /* shmget     */
9810                       return -KEY_shmget;
9811                     }
9812
9813                     goto unknown;
9814
9815                   default:
9816                     goto unknown;
9817                 }
9818               }
9819
9820               goto unknown;
9821
9822             case 'o':
9823               if (name[2] == 'c' &&
9824                   name[3] == 'k' &&
9825                   name[4] == 'e' &&
9826                   name[5] == 't')
9827               {                                   /* socket     */
9828                 return -KEY_socket;
9829               }
9830
9831               goto unknown;
9832
9833             case 'p':
9834               if (name[2] == 'l' &&
9835                   name[3] == 'i' &&
9836                   name[4] == 'c' &&
9837                   name[5] == 'e')
9838               {                                   /* splice     */
9839                 return -KEY_splice;
9840               }
9841
9842               goto unknown;
9843
9844             case 'u':
9845               if (name[2] == 'b' &&
9846                   name[3] == 's' &&
9847                   name[4] == 't' &&
9848                   name[5] == 'r')
9849               {                                   /* substr     */
9850                 return -KEY_substr;
9851               }
9852
9853               goto unknown;
9854
9855             case 'y':
9856               if (name[2] == 's' &&
9857                   name[3] == 't' &&
9858                   name[4] == 'e' &&
9859                   name[5] == 'm')
9860               {                                   /* system     */
9861                 return -KEY_system;
9862               }
9863
9864               goto unknown;
9865
9866             default:
9867               goto unknown;
9868           }
9869
9870         case 'u':
9871           if (name[1] == 'n')
9872           {
9873             switch (name[2])
9874             {
9875               case 'l':
9876                 switch (name[3])
9877                 {
9878                   case 'e':
9879                     if (name[4] == 's' &&
9880                         name[5] == 's')
9881                     {                             /* unless     */
9882                       return KEY_unless;
9883                     }
9884
9885                     goto unknown;
9886
9887                   case 'i':
9888                     if (name[4] == 'n' &&
9889                         name[5] == 'k')
9890                     {                             /* unlink     */
9891                       return -KEY_unlink;
9892                     }
9893
9894                     goto unknown;
9895
9896                   default:
9897                     goto unknown;
9898                 }
9899
9900               case 'p':
9901                 if (name[3] == 'a' &&
9902                     name[4] == 'c' &&
9903                     name[5] == 'k')
9904                 {                                 /* unpack     */
9905                   return -KEY_unpack;
9906                 }
9907
9908                 goto unknown;
9909
9910               default:
9911                 goto unknown;
9912             }
9913           }
9914
9915           goto unknown;
9916
9917         case 'v':
9918           if (name[1] == 'a' &&
9919               name[2] == 'l' &&
9920               name[3] == 'u' &&
9921               name[4] == 'e' &&
9922               name[5] == 's')
9923           {                                       /* values     */
9924             return -KEY_values;
9925           }
9926
9927           goto unknown;
9928
9929         default:
9930           goto unknown;
9931       }
9932
9933     case 7: /* 29 tokens of length 7 */
9934       switch (name[0])
9935       {
9936         case 'D':
9937           if (name[1] == 'E' &&
9938               name[2] == 'S' &&
9939               name[3] == 'T' &&
9940               name[4] == 'R' &&
9941               name[5] == 'O' &&
9942               name[6] == 'Y')
9943           {                                       /* DESTROY    */
9944             return KEY_DESTROY;
9945           }
9946
9947           goto unknown;
9948
9949         case '_':
9950           if (name[1] == '_' &&
9951               name[2] == 'E' &&
9952               name[3] == 'N' &&
9953               name[4] == 'D' &&
9954               name[5] == '_' &&
9955               name[6] == '_')
9956           {                                       /* __END__    */
9957             return KEY___END__;
9958           }
9959
9960           goto unknown;
9961
9962         case 'b':
9963           if (name[1] == 'i' &&
9964               name[2] == 'n' &&
9965               name[3] == 'm' &&
9966               name[4] == 'o' &&
9967               name[5] == 'd' &&
9968               name[6] == 'e')
9969           {                                       /* binmode    */
9970             return -KEY_binmode;
9971           }
9972
9973           goto unknown;
9974
9975         case 'c':
9976           if (name[1] == 'o' &&
9977               name[2] == 'n' &&
9978               name[3] == 'n' &&
9979               name[4] == 'e' &&
9980               name[5] == 'c' &&
9981               name[6] == 't')
9982           {                                       /* connect    */
9983             return -KEY_connect;
9984           }
9985
9986           goto unknown;
9987
9988         case 'd':
9989           switch (name[1])
9990           {
9991             case 'b':
9992               if (name[2] == 'm' &&
9993                   name[3] == 'o' &&
9994                   name[4] == 'p' &&
9995                   name[5] == 'e' &&
9996                   name[6] == 'n')
9997               {                                   /* dbmopen    */
9998                 return -KEY_dbmopen;
9999               }
10000
10001               goto unknown;
10002
10003             case 'e':
10004               if (name[2] == 'f')
10005               {
10006                 switch (name[3])
10007                 {
10008                   case 'a':
10009                     if (name[4] == 'u' &&
10010                         name[5] == 'l' &&
10011                         name[6] == 't')
10012                     {                             /* default    */
10013                       return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
10014                     }
10015
10016                     goto unknown;
10017
10018                   case 'i':
10019                     if (name[4] == 'n' &&
10020                         name[5] == 'e' &&
10021                         name[6] == 'd')
10022                     {                             /* defined    */
10023                       return KEY_defined;
10024                     }
10025
10026                     goto unknown;
10027
10028                   default:
10029                     goto unknown;
10030                 }
10031               }
10032
10033               goto unknown;
10034
10035             default:
10036               goto unknown;
10037           }
10038
10039         case 'f':
10040           if (name[1] == 'o' &&
10041               name[2] == 'r' &&
10042               name[3] == 'e' &&
10043               name[4] == 'a' &&
10044               name[5] == 'c' &&
10045               name[6] == 'h')
10046           {                                       /* foreach    */
10047             return KEY_foreach;
10048           }
10049
10050           goto unknown;
10051
10052         case 'g':
10053           if (name[1] == 'e' &&
10054               name[2] == 't' &&
10055               name[3] == 'p')
10056           {
10057             switch (name[4])
10058             {
10059               case 'g':
10060                 if (name[5] == 'r' &&
10061                     name[6] == 'p')
10062                 {                                 /* getpgrp    */
10063                   return -KEY_getpgrp;
10064                 }
10065
10066                 goto unknown;
10067
10068               case 'p':
10069                 if (name[5] == 'i' &&
10070                     name[6] == 'd')
10071                 {                                 /* getppid    */
10072                   return -KEY_getppid;
10073                 }
10074
10075                 goto unknown;
10076
10077               default:
10078                 goto unknown;
10079             }
10080           }
10081
10082           goto unknown;
10083
10084         case 'l':
10085           if (name[1] == 'c' &&
10086               name[2] == 'f' &&
10087               name[3] == 'i' &&
10088               name[4] == 'r' &&
10089               name[5] == 's' &&
10090               name[6] == 't')
10091           {                                       /* lcfirst    */
10092             return -KEY_lcfirst;
10093           }
10094
10095           goto unknown;
10096
10097         case 'o':
10098           if (name[1] == 'p' &&
10099               name[2] == 'e' &&
10100               name[3] == 'n' &&
10101               name[4] == 'd' &&
10102               name[5] == 'i' &&
10103               name[6] == 'r')
10104           {                                       /* opendir    */
10105             return -KEY_opendir;
10106           }
10107
10108           goto unknown;
10109
10110         case 'p':
10111           if (name[1] == 'a' &&
10112               name[2] == 'c' &&
10113               name[3] == 'k' &&
10114               name[4] == 'a' &&
10115               name[5] == 'g' &&
10116               name[6] == 'e')
10117           {                                       /* package    */
10118             return KEY_package;
10119           }
10120
10121           goto unknown;
10122
10123         case 'r':
10124           if (name[1] == 'e')
10125           {
10126             switch (name[2])
10127             {
10128               case 'a':
10129                 if (name[3] == 'd' &&
10130                     name[4] == 'd' &&
10131                     name[5] == 'i' &&
10132                     name[6] == 'r')
10133                 {                                 /* readdir    */
10134                   return -KEY_readdir;
10135                 }
10136
10137                 goto unknown;
10138
10139               case 'q':
10140                 if (name[3] == 'u' &&
10141                     name[4] == 'i' &&
10142                     name[5] == 'r' &&
10143                     name[6] == 'e')
10144                 {                                 /* require    */
10145                   return KEY_require;
10146                 }
10147
10148                 goto unknown;
10149
10150               case 'v':
10151                 if (name[3] == 'e' &&
10152                     name[4] == 'r' &&
10153                     name[5] == 's' &&
10154                     name[6] == 'e')
10155                 {                                 /* reverse    */
10156                   return -KEY_reverse;
10157                 }
10158
10159                 goto unknown;
10160
10161               default:
10162                 goto unknown;
10163             }
10164           }
10165
10166           goto unknown;
10167
10168         case 's':
10169           switch (name[1])
10170           {
10171             case 'e':
10172               switch (name[2])
10173               {
10174                 case 'e':
10175                   if (name[3] == 'k' &&
10176                       name[4] == 'd' &&
10177                       name[5] == 'i' &&
10178                       name[6] == 'r')
10179                   {                               /* seekdir    */
10180                     return -KEY_seekdir;
10181                   }
10182
10183                   goto unknown;
10184
10185                 case 't':
10186                   if (name[3] == 'p' &&
10187                       name[4] == 'g' &&
10188                       name[5] == 'r' &&
10189                       name[6] == 'p')
10190                   {                               /* setpgrp    */
10191                     return -KEY_setpgrp;
10192                   }
10193
10194                   goto unknown;
10195
10196                 default:
10197                   goto unknown;
10198               }
10199
10200             case 'h':
10201               if (name[2] == 'm' &&
10202                   name[3] == 'r' &&
10203                   name[4] == 'e' &&
10204                   name[5] == 'a' &&
10205                   name[6] == 'd')
10206               {                                   /* shmread    */
10207                 return -KEY_shmread;
10208               }
10209
10210               goto unknown;
10211
10212             case 'p':
10213               if (name[2] == 'r' &&
10214                   name[3] == 'i' &&
10215                   name[4] == 'n' &&
10216                   name[5] == 't' &&
10217                   name[6] == 'f')
10218               {                                   /* sprintf    */
10219                 return -KEY_sprintf;
10220               }
10221
10222               goto unknown;
10223
10224             case 'y':
10225               switch (name[2])
10226               {
10227                 case 'm':
10228                   if (name[3] == 'l' &&
10229                       name[4] == 'i' &&
10230                       name[5] == 'n' &&
10231                       name[6] == 'k')
10232                   {                               /* symlink    */
10233                     return -KEY_symlink;
10234                   }
10235
10236                   goto unknown;
10237
10238                 case 's':
10239                   switch (name[3])
10240                   {
10241                     case 'c':
10242                       if (name[4] == 'a' &&
10243                           name[5] == 'l' &&
10244                           name[6] == 'l')
10245                       {                           /* syscall    */
10246                         return -KEY_syscall;
10247                       }
10248
10249                       goto unknown;
10250
10251                     case 'o':
10252                       if (name[4] == 'p' &&
10253                           name[5] == 'e' &&
10254                           name[6] == 'n')
10255                       {                           /* sysopen    */
10256                         return -KEY_sysopen;
10257                       }
10258
10259                       goto unknown;
10260
10261                     case 'r':
10262                       if (name[4] == 'e' &&
10263                           name[5] == 'a' &&
10264                           name[6] == 'd')
10265                       {                           /* sysread    */
10266                         return -KEY_sysread;
10267                       }
10268
10269                       goto unknown;
10270
10271                     case 's':
10272                       if (name[4] == 'e' &&
10273                           name[5] == 'e' &&
10274                           name[6] == 'k')
10275                       {                           /* sysseek    */
10276                         return -KEY_sysseek;
10277                       }
10278
10279                       goto unknown;
10280
10281                     default:
10282                       goto unknown;
10283                   }
10284
10285                 default:
10286                   goto unknown;
10287               }
10288
10289             default:
10290               goto unknown;
10291           }
10292
10293         case 't':
10294           if (name[1] == 'e' &&
10295               name[2] == 'l' &&
10296               name[3] == 'l' &&
10297               name[4] == 'd' &&
10298               name[5] == 'i' &&
10299               name[6] == 'r')
10300           {                                       /* telldir    */
10301             return -KEY_telldir;
10302           }
10303
10304           goto unknown;
10305
10306         case 'u':
10307           switch (name[1])
10308           {
10309             case 'c':
10310               if (name[2] == 'f' &&
10311                   name[3] == 'i' &&
10312                   name[4] == 'r' &&
10313                   name[5] == 's' &&
10314                   name[6] == 't')
10315               {                                   /* ucfirst    */
10316                 return -KEY_ucfirst;
10317               }
10318
10319               goto unknown;
10320
10321             case 'n':
10322               if (name[2] == 's' &&
10323                   name[3] == 'h' &&
10324                   name[4] == 'i' &&
10325                   name[5] == 'f' &&
10326                   name[6] == 't')
10327               {                                   /* unshift    */
10328                 return -KEY_unshift;
10329               }
10330
10331               goto unknown;
10332
10333             default:
10334               goto unknown;
10335           }
10336
10337         case 'w':
10338           if (name[1] == 'a' &&
10339               name[2] == 'i' &&
10340               name[3] == 't' &&
10341               name[4] == 'p' &&
10342               name[5] == 'i' &&
10343               name[6] == 'd')
10344           {                                       /* waitpid    */
10345             return -KEY_waitpid;
10346           }
10347
10348           goto unknown;
10349
10350         default:
10351           goto unknown;
10352       }
10353
10354     case 8: /* 26 tokens of length 8 */
10355       switch (name[0])
10356       {
10357         case 'A':
10358           if (name[1] == 'U' &&
10359               name[2] == 'T' &&
10360               name[3] == 'O' &&
10361               name[4] == 'L' &&
10362               name[5] == 'O' &&
10363               name[6] == 'A' &&
10364               name[7] == 'D')
10365           {                                       /* AUTOLOAD   */
10366             return KEY_AUTOLOAD;
10367           }
10368
10369           goto unknown;
10370
10371         case '_':
10372           if (name[1] == '_')
10373           {
10374             switch (name[2])
10375             {
10376               case 'D':
10377                 if (name[3] == 'A' &&
10378                     name[4] == 'T' &&
10379                     name[5] == 'A' &&
10380                     name[6] == '_' &&
10381                     name[7] == '_')
10382                 {                                 /* __DATA__   */
10383                   return KEY___DATA__;
10384                 }
10385
10386                 goto unknown;
10387
10388               case 'F':
10389                 if (name[3] == 'I' &&
10390                     name[4] == 'L' &&
10391                     name[5] == 'E' &&
10392                     name[6] == '_' &&
10393                     name[7] == '_')
10394                 {                                 /* __FILE__   */
10395                   return -KEY___FILE__;
10396                 }
10397
10398                 goto unknown;
10399
10400               case 'L':
10401                 if (name[3] == 'I' &&
10402                     name[4] == 'N' &&
10403                     name[5] == 'E' &&
10404                     name[6] == '_' &&
10405                     name[7] == '_')
10406                 {                                 /* __LINE__   */
10407                   return -KEY___LINE__;
10408                 }
10409
10410                 goto unknown;
10411
10412               default:
10413                 goto unknown;
10414             }
10415           }
10416
10417           goto unknown;
10418
10419         case 'c':
10420           switch (name[1])
10421           {
10422             case 'l':
10423               if (name[2] == 'o' &&
10424                   name[3] == 's' &&
10425                   name[4] == 'e' &&
10426                   name[5] == 'd' &&
10427                   name[6] == 'i' &&
10428                   name[7] == 'r')
10429               {                                   /* closedir   */
10430                 return -KEY_closedir;
10431               }
10432
10433               goto unknown;
10434
10435             case 'o':
10436               if (name[2] == 'n' &&
10437                   name[3] == 't' &&
10438                   name[4] == 'i' &&
10439                   name[5] == 'n' &&
10440                   name[6] == 'u' &&
10441                   name[7] == 'e')
10442               {                                   /* continue   */
10443                 return -KEY_continue;
10444               }
10445
10446               goto unknown;
10447
10448             default:
10449               goto unknown;
10450           }
10451
10452         case 'd':
10453           if (name[1] == 'b' &&
10454               name[2] == 'm' &&
10455               name[3] == 'c' &&
10456               name[4] == 'l' &&
10457               name[5] == 'o' &&
10458               name[6] == 's' &&
10459               name[7] == 'e')
10460           {                                       /* dbmclose   */
10461             return -KEY_dbmclose;
10462           }
10463
10464           goto unknown;
10465
10466         case 'e':
10467           if (name[1] == 'n' &&
10468               name[2] == 'd')
10469           {
10470             switch (name[3])
10471             {
10472               case 'g':
10473                 if (name[4] == 'r' &&
10474                     name[5] == 'e' &&
10475                     name[6] == 'n' &&
10476                     name[7] == 't')
10477                 {                                 /* endgrent   */
10478                   return -KEY_endgrent;
10479                 }
10480
10481                 goto unknown;
10482
10483               case 'p':
10484                 if (name[4] == 'w' &&
10485                     name[5] == 'e' &&
10486                     name[6] == 'n' &&
10487                     name[7] == 't')
10488                 {                                 /* endpwent   */
10489                   return -KEY_endpwent;
10490                 }
10491
10492                 goto unknown;
10493
10494               default:
10495                 goto unknown;
10496             }
10497           }
10498
10499           goto unknown;
10500
10501         case 'f':
10502           if (name[1] == 'o' &&
10503               name[2] == 'r' &&
10504               name[3] == 'm' &&
10505               name[4] == 'l' &&
10506               name[5] == 'i' &&
10507               name[6] == 'n' &&
10508               name[7] == 'e')
10509           {                                       /* formline   */
10510             return -KEY_formline;
10511           }
10512
10513           goto unknown;
10514
10515         case 'g':
10516           if (name[1] == 'e' &&
10517               name[2] == 't')
10518           {
10519             switch (name[3])
10520             {
10521               case 'g':
10522                 if (name[4] == 'r')
10523                 {
10524                   switch (name[5])
10525                   {
10526                     case 'e':
10527                       if (name[6] == 'n' &&
10528                           name[7] == 't')
10529                       {                           /* getgrent   */
10530                         return -KEY_getgrent;
10531                       }
10532
10533                       goto unknown;
10534
10535                     case 'g':
10536                       if (name[6] == 'i' &&
10537                           name[7] == 'd')
10538                       {                           /* getgrgid   */
10539                         return -KEY_getgrgid;
10540                       }
10541
10542                       goto unknown;
10543
10544                     case 'n':
10545                       if (name[6] == 'a' &&
10546                           name[7] == 'm')
10547                       {                           /* getgrnam   */
10548                         return -KEY_getgrnam;
10549                       }
10550
10551                       goto unknown;
10552
10553                     default:
10554                       goto unknown;
10555                   }
10556                 }
10557
10558                 goto unknown;
10559
10560               case 'l':
10561                 if (name[4] == 'o' &&
10562                     name[5] == 'g' &&
10563                     name[6] == 'i' &&
10564                     name[7] == 'n')
10565                 {                                 /* getlogin   */
10566                   return -KEY_getlogin;
10567                 }
10568
10569                 goto unknown;
10570
10571               case 'p':
10572                 if (name[4] == 'w')
10573                 {
10574                   switch (name[5])
10575                   {
10576                     case 'e':
10577                       if (name[6] == 'n' &&
10578                           name[7] == 't')
10579                       {                           /* getpwent   */
10580                         return -KEY_getpwent;
10581                       }
10582
10583                       goto unknown;
10584
10585                     case 'n':
10586                       if (name[6] == 'a' &&
10587                           name[7] == 'm')
10588                       {                           /* getpwnam   */
10589                         return -KEY_getpwnam;
10590                       }
10591
10592                       goto unknown;
10593
10594                     case 'u':
10595                       if (name[6] == 'i' &&
10596                           name[7] == 'd')
10597                       {                           /* getpwuid   */
10598                         return -KEY_getpwuid;
10599                       }
10600
10601                       goto unknown;
10602
10603                     default:
10604                       goto unknown;
10605                   }
10606                 }
10607
10608                 goto unknown;
10609
10610               default:
10611                 goto unknown;
10612             }
10613           }
10614
10615           goto unknown;
10616
10617         case 'r':
10618           if (name[1] == 'e' &&
10619               name[2] == 'a' &&
10620               name[3] == 'd')
10621           {
10622             switch (name[4])
10623             {
10624               case 'l':
10625                 if (name[5] == 'i' &&
10626                     name[6] == 'n')
10627                 {
10628                   switch (name[7])
10629                   {
10630                     case 'e':
10631                       {                           /* readline   */
10632                         return -KEY_readline;
10633                       }
10634
10635                     case 'k':
10636                       {                           /* readlink   */
10637                         return -KEY_readlink;
10638                       }
10639
10640                     default:
10641                       goto unknown;
10642                   }
10643                 }
10644
10645                 goto unknown;
10646
10647               case 'p':
10648                 if (name[5] == 'i' &&
10649                     name[6] == 'p' &&
10650                     name[7] == 'e')
10651                 {                                 /* readpipe   */
10652                   return -KEY_readpipe;
10653                 }
10654
10655                 goto unknown;
10656
10657               default:
10658                 goto unknown;
10659             }
10660           }
10661
10662           goto unknown;
10663
10664         case 's':
10665           switch (name[1])
10666           {
10667             case 'e':
10668               if (name[2] == 't')
10669               {
10670                 switch (name[3])
10671                 {
10672                   case 'g':
10673                     if (name[4] == 'r' &&
10674                         name[5] == 'e' &&
10675                         name[6] == 'n' &&
10676                         name[7] == 't')
10677                     {                             /* setgrent   */
10678                       return -KEY_setgrent;
10679                     }
10680
10681                     goto unknown;
10682
10683                   case 'p':
10684                     if (name[4] == 'w' &&
10685                         name[5] == 'e' &&
10686                         name[6] == 'n' &&
10687                         name[7] == 't')
10688                     {                             /* setpwent   */
10689                       return -KEY_setpwent;
10690                     }
10691
10692                     goto unknown;
10693
10694                   default:
10695                     goto unknown;
10696                 }
10697               }
10698
10699               goto unknown;
10700
10701             case 'h':
10702               switch (name[2])
10703               {
10704                 case 'm':
10705                   if (name[3] == 'w' &&
10706                       name[4] == 'r' &&
10707                       name[5] == 'i' &&
10708                       name[6] == 't' &&
10709                       name[7] == 'e')
10710                   {                               /* shmwrite   */
10711                     return -KEY_shmwrite;
10712                   }
10713
10714                   goto unknown;
10715
10716                 case 'u':
10717                   if (name[3] == 't' &&
10718                       name[4] == 'd' &&
10719                       name[5] == 'o' &&
10720                       name[6] == 'w' &&
10721                       name[7] == 'n')
10722                   {                               /* shutdown   */
10723                     return -KEY_shutdown;
10724                   }
10725
10726                   goto unknown;
10727
10728                 default:
10729                   goto unknown;
10730               }
10731
10732             case 'y':
10733               if (name[2] == 's' &&
10734                   name[3] == 'w' &&
10735                   name[4] == 'r' &&
10736                   name[5] == 'i' &&
10737                   name[6] == 't' &&
10738                   name[7] == 'e')
10739               {                                   /* syswrite   */
10740                 return -KEY_syswrite;
10741               }
10742
10743               goto unknown;
10744
10745             default:
10746               goto unknown;
10747           }
10748
10749         case 't':
10750           if (name[1] == 'r' &&
10751               name[2] == 'u' &&
10752               name[3] == 'n' &&
10753               name[4] == 'c' &&
10754               name[5] == 'a' &&
10755               name[6] == 't' &&
10756               name[7] == 'e')
10757           {                                       /* truncate   */
10758             return -KEY_truncate;
10759           }
10760
10761           goto unknown;
10762
10763         default:
10764           goto unknown;
10765       }
10766
10767     case 9: /* 9 tokens of length 9 */
10768       switch (name[0])
10769       {
10770         case 'U':
10771           if (name[1] == 'N' &&
10772               name[2] == 'I' &&
10773               name[3] == 'T' &&
10774               name[4] == 'C' &&
10775               name[5] == 'H' &&
10776               name[6] == 'E' &&
10777               name[7] == 'C' &&
10778               name[8] == 'K')
10779           {                                       /* UNITCHECK  */
10780             return KEY_UNITCHECK;
10781           }
10782
10783           goto unknown;
10784
10785         case 'e':
10786           if (name[1] == 'n' &&
10787               name[2] == 'd' &&
10788               name[3] == 'n' &&
10789               name[4] == 'e' &&
10790               name[5] == 't' &&
10791               name[6] == 'e' &&
10792               name[7] == 'n' &&
10793               name[8] == 't')
10794           {                                       /* endnetent  */
10795             return -KEY_endnetent;
10796           }
10797
10798           goto unknown;
10799
10800         case 'g':
10801           if (name[1] == 'e' &&
10802               name[2] == 't' &&
10803               name[3] == 'n' &&
10804               name[4] == 'e' &&
10805               name[5] == 't' &&
10806               name[6] == 'e' &&
10807               name[7] == 'n' &&
10808               name[8] == 't')
10809           {                                       /* getnetent  */
10810             return -KEY_getnetent;
10811           }
10812
10813           goto unknown;
10814
10815         case 'l':
10816           if (name[1] == 'o' &&
10817               name[2] == 'c' &&
10818               name[3] == 'a' &&
10819               name[4] == 'l' &&
10820               name[5] == 't' &&
10821               name[6] == 'i' &&
10822               name[7] == 'm' &&
10823               name[8] == 'e')
10824           {                                       /* localtime  */
10825             return -KEY_localtime;
10826           }
10827
10828           goto unknown;
10829
10830         case 'p':
10831           if (name[1] == 'r' &&
10832               name[2] == 'o' &&
10833               name[3] == 't' &&
10834               name[4] == 'o' &&
10835               name[5] == 't' &&
10836               name[6] == 'y' &&
10837               name[7] == 'p' &&
10838               name[8] == 'e')
10839           {                                       /* prototype  */
10840             return KEY_prototype;
10841           }
10842
10843           goto unknown;
10844
10845         case 'q':
10846           if (name[1] == 'u' &&
10847               name[2] == 'o' &&
10848               name[3] == 't' &&
10849               name[4] == 'e' &&
10850               name[5] == 'm' &&
10851               name[6] == 'e' &&
10852               name[7] == 't' &&
10853               name[8] == 'a')
10854           {                                       /* quotemeta  */
10855             return -KEY_quotemeta;
10856           }
10857
10858           goto unknown;
10859
10860         case 'r':
10861           if (name[1] == 'e' &&
10862               name[2] == 'w' &&
10863               name[3] == 'i' &&
10864               name[4] == 'n' &&
10865               name[5] == 'd' &&
10866               name[6] == 'd' &&
10867               name[7] == 'i' &&
10868               name[8] == 'r')
10869           {                                       /* rewinddir  */
10870             return -KEY_rewinddir;
10871           }
10872
10873           goto unknown;
10874
10875         case 's':
10876           if (name[1] == 'e' &&
10877               name[2] == 't' &&
10878               name[3] == 'n' &&
10879               name[4] == 'e' &&
10880               name[5] == 't' &&
10881               name[6] == 'e' &&
10882               name[7] == 'n' &&
10883               name[8] == 't')
10884           {                                       /* setnetent  */
10885             return -KEY_setnetent;
10886           }
10887
10888           goto unknown;
10889
10890         case 'w':
10891           if (name[1] == 'a' &&
10892               name[2] == 'n' &&
10893               name[3] == 't' &&
10894               name[4] == 'a' &&
10895               name[5] == 'r' &&
10896               name[6] == 'r' &&
10897               name[7] == 'a' &&
10898               name[8] == 'y')
10899           {                                       /* wantarray  */
10900             return -KEY_wantarray;
10901           }
10902
10903           goto unknown;
10904
10905         default:
10906           goto unknown;
10907       }
10908
10909     case 10: /* 9 tokens of length 10 */
10910       switch (name[0])
10911       {
10912         case 'e':
10913           if (name[1] == 'n' &&
10914               name[2] == 'd')
10915           {
10916             switch (name[3])
10917             {
10918               case 'h':
10919                 if (name[4] == 'o' &&
10920                     name[5] == 's' &&
10921                     name[6] == 't' &&
10922                     name[7] == 'e' &&
10923                     name[8] == 'n' &&
10924                     name[9] == 't')
10925                 {                                 /* endhostent */
10926                   return -KEY_endhostent;
10927                 }
10928
10929                 goto unknown;
10930
10931               case 's':
10932                 if (name[4] == 'e' &&
10933                     name[5] == 'r' &&
10934                     name[6] == 'v' &&
10935                     name[7] == 'e' &&
10936                     name[8] == 'n' &&
10937                     name[9] == 't')
10938                 {                                 /* endservent */
10939                   return -KEY_endservent;
10940                 }
10941
10942                 goto unknown;
10943
10944               default:
10945                 goto unknown;
10946             }
10947           }
10948
10949           goto unknown;
10950
10951         case 'g':
10952           if (name[1] == 'e' &&
10953               name[2] == 't')
10954           {
10955             switch (name[3])
10956             {
10957               case 'h':
10958                 if (name[4] == 'o' &&
10959                     name[5] == 's' &&
10960                     name[6] == 't' &&
10961                     name[7] == 'e' &&
10962                     name[8] == 'n' &&
10963                     name[9] == 't')
10964                 {                                 /* gethostent */
10965                   return -KEY_gethostent;
10966                 }
10967
10968                 goto unknown;
10969
10970               case 's':
10971                 switch (name[4])
10972                 {
10973                   case 'e':
10974                     if (name[5] == 'r' &&
10975                         name[6] == 'v' &&
10976                         name[7] == 'e' &&
10977                         name[8] == 'n' &&
10978                         name[9] == 't')
10979                     {                             /* getservent */
10980                       return -KEY_getservent;
10981                     }
10982
10983                     goto unknown;
10984
10985                   case 'o':
10986                     if (name[5] == 'c' &&
10987                         name[6] == 'k' &&
10988                         name[7] == 'o' &&
10989                         name[8] == 'p' &&
10990                         name[9] == 't')
10991                     {                             /* getsockopt */
10992                       return -KEY_getsockopt;
10993                     }
10994
10995                     goto unknown;
10996
10997                   default:
10998                     goto unknown;
10999                 }
11000
11001               default:
11002                 goto unknown;
11003             }
11004           }
11005
11006           goto unknown;
11007
11008         case 's':
11009           switch (name[1])
11010           {
11011             case 'e':
11012               if (name[2] == 't')
11013               {
11014                 switch (name[3])
11015                 {
11016                   case 'h':
11017                     if (name[4] == 'o' &&
11018                         name[5] == 's' &&
11019                         name[6] == 't' &&
11020                         name[7] == 'e' &&
11021                         name[8] == 'n' &&
11022                         name[9] == 't')
11023                     {                             /* sethostent */
11024                       return -KEY_sethostent;
11025                     }
11026
11027                     goto unknown;
11028
11029                   case 's':
11030                     switch (name[4])
11031                     {
11032                       case 'e':
11033                         if (name[5] == 'r' &&
11034                             name[6] == 'v' &&
11035                             name[7] == 'e' &&
11036                             name[8] == 'n' &&
11037                             name[9] == 't')
11038                         {                         /* setservent */
11039                           return -KEY_setservent;
11040                         }
11041
11042                         goto unknown;
11043
11044                       case 'o':
11045                         if (name[5] == 'c' &&
11046                             name[6] == 'k' &&
11047                             name[7] == 'o' &&
11048                             name[8] == 'p' &&
11049                             name[9] == 't')
11050                         {                         /* setsockopt */
11051                           return -KEY_setsockopt;
11052                         }
11053
11054                         goto unknown;
11055
11056                       default:
11057                         goto unknown;
11058                     }
11059
11060                   default:
11061                     goto unknown;
11062                 }
11063               }
11064
11065               goto unknown;
11066
11067             case 'o':
11068               if (name[2] == 'c' &&
11069                   name[3] == 'k' &&
11070                   name[4] == 'e' &&
11071                   name[5] == 't' &&
11072                   name[6] == 'p' &&
11073                   name[7] == 'a' &&
11074                   name[8] == 'i' &&
11075                   name[9] == 'r')
11076               {                                   /* socketpair */
11077                 return -KEY_socketpair;
11078               }
11079
11080               goto unknown;
11081
11082             default:
11083               goto unknown;
11084           }
11085
11086         default:
11087           goto unknown;
11088       }
11089
11090     case 11: /* 8 tokens of length 11 */
11091       switch (name[0])
11092       {
11093         case '_':
11094           if (name[1] == '_' &&
11095               name[2] == 'P' &&
11096               name[3] == 'A' &&
11097               name[4] == 'C' &&
11098               name[5] == 'K' &&
11099               name[6] == 'A' &&
11100               name[7] == 'G' &&
11101               name[8] == 'E' &&
11102               name[9] == '_' &&
11103               name[10] == '_')
11104           {                                       /* __PACKAGE__ */
11105             return -KEY___PACKAGE__;
11106           }
11107
11108           goto unknown;
11109
11110         case 'e':
11111           if (name[1] == 'n' &&
11112               name[2] == 'd' &&
11113               name[3] == 'p' &&
11114               name[4] == 'r' &&
11115               name[5] == 'o' &&
11116               name[6] == 't' &&
11117               name[7] == 'o' &&
11118               name[8] == 'e' &&
11119               name[9] == 'n' &&
11120               name[10] == 't')
11121           {                                       /* endprotoent */
11122             return -KEY_endprotoent;
11123           }
11124
11125           goto unknown;
11126
11127         case 'g':
11128           if (name[1] == 'e' &&
11129               name[2] == 't')
11130           {
11131             switch (name[3])
11132             {
11133               case 'p':
11134                 switch (name[4])
11135                 {
11136                   case 'e':
11137                     if (name[5] == 'e' &&
11138                         name[6] == 'r' &&
11139                         name[7] == 'n' &&
11140                         name[8] == 'a' &&
11141                         name[9] == 'm' &&
11142                         name[10] == 'e')
11143                     {                             /* getpeername */
11144                       return -KEY_getpeername;
11145                     }
11146
11147                     goto unknown;
11148
11149                   case 'r':
11150                     switch (name[5])
11151                     {
11152                       case 'i':
11153                         if (name[6] == 'o' &&
11154                             name[7] == 'r' &&
11155                             name[8] == 'i' &&
11156                             name[9] == 't' &&
11157                             name[10] == 'y')
11158                         {                         /* getpriority */
11159                           return -KEY_getpriority;
11160                         }
11161
11162                         goto unknown;
11163
11164                       case 'o':
11165                         if (name[6] == 't' &&
11166                             name[7] == 'o' &&
11167                             name[8] == 'e' &&
11168                             name[9] == 'n' &&
11169                             name[10] == 't')
11170                         {                         /* getprotoent */
11171                           return -KEY_getprotoent;
11172                         }
11173
11174                         goto unknown;
11175
11176                       default:
11177                         goto unknown;
11178                     }
11179
11180                   default:
11181                     goto unknown;
11182                 }
11183
11184               case 's':
11185                 if (name[4] == 'o' &&
11186                     name[5] == 'c' &&
11187                     name[6] == 'k' &&
11188                     name[7] == 'n' &&
11189                     name[8] == 'a' &&
11190                     name[9] == 'm' &&
11191                     name[10] == 'e')
11192                 {                                 /* getsockname */
11193                   return -KEY_getsockname;
11194                 }
11195
11196                 goto unknown;
11197
11198               default:
11199                 goto unknown;
11200             }
11201           }
11202
11203           goto unknown;
11204
11205         case 's':
11206           if (name[1] == 'e' &&
11207               name[2] == 't' &&
11208               name[3] == 'p' &&
11209               name[4] == 'r')
11210           {
11211             switch (name[5])
11212             {
11213               case 'i':
11214                 if (name[6] == 'o' &&
11215                     name[7] == 'r' &&
11216                     name[8] == 'i' &&
11217                     name[9] == 't' &&
11218                     name[10] == 'y')
11219                 {                                 /* setpriority */
11220                   return -KEY_setpriority;
11221                 }
11222
11223                 goto unknown;
11224
11225               case 'o':
11226                 if (name[6] == 't' &&
11227                     name[7] == 'o' &&
11228                     name[8] == 'e' &&
11229                     name[9] == 'n' &&
11230                     name[10] == 't')
11231                 {                                 /* setprotoent */
11232                   return -KEY_setprotoent;
11233                 }
11234
11235                 goto unknown;
11236
11237               default:
11238                 goto unknown;
11239             }
11240           }
11241
11242           goto unknown;
11243
11244         default:
11245           goto unknown;
11246       }
11247
11248     case 12: /* 2 tokens of length 12 */
11249       if (name[0] == 'g' &&
11250           name[1] == 'e' &&
11251           name[2] == 't' &&
11252           name[3] == 'n' &&
11253           name[4] == 'e' &&
11254           name[5] == 't' &&
11255           name[6] == 'b' &&
11256           name[7] == 'y')
11257       {
11258         switch (name[8])
11259         {
11260           case 'a':
11261             if (name[9] == 'd' &&
11262                 name[10] == 'd' &&
11263                 name[11] == 'r')
11264             {                                     /* getnetbyaddr */
11265               return -KEY_getnetbyaddr;
11266             }
11267
11268             goto unknown;
11269
11270           case 'n':
11271             if (name[9] == 'a' &&
11272                 name[10] == 'm' &&
11273                 name[11] == 'e')
11274             {                                     /* getnetbyname */
11275               return -KEY_getnetbyname;
11276             }
11277
11278             goto unknown;
11279
11280           default:
11281             goto unknown;
11282         }
11283       }
11284
11285       goto unknown;
11286
11287     case 13: /* 4 tokens of length 13 */
11288       if (name[0] == 'g' &&
11289           name[1] == 'e' &&
11290           name[2] == 't')
11291       {
11292         switch (name[3])
11293         {
11294           case 'h':
11295             if (name[4] == 'o' &&
11296                 name[5] == 's' &&
11297                 name[6] == 't' &&
11298                 name[7] == 'b' &&
11299                 name[8] == 'y')
11300             {
11301               switch (name[9])
11302               {
11303                 case 'a':
11304                   if (name[10] == 'd' &&
11305                       name[11] == 'd' &&
11306                       name[12] == 'r')
11307                   {                               /* gethostbyaddr */
11308                     return -KEY_gethostbyaddr;
11309                   }
11310
11311                   goto unknown;
11312
11313                 case 'n':
11314                   if (name[10] == 'a' &&
11315                       name[11] == 'm' &&
11316                       name[12] == 'e')
11317                   {                               /* gethostbyname */
11318                     return -KEY_gethostbyname;
11319                   }
11320
11321                   goto unknown;
11322
11323                 default:
11324                   goto unknown;
11325               }
11326             }
11327
11328             goto unknown;
11329
11330           case 's':
11331             if (name[4] == 'e' &&
11332                 name[5] == 'r' &&
11333                 name[6] == 'v' &&
11334                 name[7] == 'b' &&
11335                 name[8] == 'y')
11336             {
11337               switch (name[9])
11338               {
11339                 case 'n':
11340                   if (name[10] == 'a' &&
11341                       name[11] == 'm' &&
11342                       name[12] == 'e')
11343                   {                               /* getservbyname */
11344                     return -KEY_getservbyname;
11345                   }
11346
11347                   goto unknown;
11348
11349                 case 'p':
11350                   if (name[10] == 'o' &&
11351                       name[11] == 'r' &&
11352                       name[12] == 't')
11353                   {                               /* getservbyport */
11354                     return -KEY_getservbyport;
11355                   }
11356
11357                   goto unknown;
11358
11359                 default:
11360                   goto unknown;
11361               }
11362             }
11363
11364             goto unknown;
11365
11366           default:
11367             goto unknown;
11368         }
11369       }
11370
11371       goto unknown;
11372
11373     case 14: /* 1 tokens of length 14 */
11374       if (name[0] == 'g' &&
11375           name[1] == 'e' &&
11376           name[2] == 't' &&
11377           name[3] == 'p' &&
11378           name[4] == 'r' &&
11379           name[5] == 'o' &&
11380           name[6] == 't' &&
11381           name[7] == 'o' &&
11382           name[8] == 'b' &&
11383           name[9] == 'y' &&
11384           name[10] == 'n' &&
11385           name[11] == 'a' &&
11386           name[12] == 'm' &&
11387           name[13] == 'e')
11388       {                                           /* getprotobyname */
11389         return -KEY_getprotobyname;
11390       }
11391
11392       goto unknown;
11393
11394     case 16: /* 1 tokens of length 16 */
11395       if (name[0] == 'g' &&
11396           name[1] == 'e' &&
11397           name[2] == 't' &&
11398           name[3] == 'p' &&
11399           name[4] == 'r' &&
11400           name[5] == 'o' &&
11401           name[6] == 't' &&
11402           name[7] == 'o' &&
11403           name[8] == 'b' &&
11404           name[9] == 'y' &&
11405           name[10] == 'n' &&
11406           name[11] == 'u' &&
11407           name[12] == 'm' &&
11408           name[13] == 'b' &&
11409           name[14] == 'e' &&
11410           name[15] == 'r')
11411       {                                           /* getprotobynumber */
11412         return -KEY_getprotobynumber;
11413       }
11414
11415       goto unknown;
11416
11417     default:
11418       goto unknown;
11419   }
11420
11421 unknown:
11422   return 0;
11423 }
11424
11425 STATIC void
11426 S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
11427 {
11428     dVAR;
11429
11430     PERL_ARGS_ASSERT_CHECKCOMMA;
11431
11432     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
11433         if (ckWARN(WARN_SYNTAX)) {
11434             int level = 1;
11435             const char *w;
11436             for (w = s+2; *w && level; w++) {
11437                 if (*w == '(')
11438                     ++level;
11439                 else if (*w == ')')
11440                     --level;
11441             }
11442             while (isSPACE(*w))
11443                 ++w;
11444             /* the list of chars below is for end of statements or
11445              * block / parens, boolean operators (&&, ||, //) and branch
11446              * constructs (or, and, if, until, unless, while, err, for).
11447              * Not a very solid hack... */
11448             if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
11449                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
11450                             "%s (...) interpreted as function",name);
11451         }
11452     }
11453     while (s < PL_bufend && isSPACE(*s))
11454         s++;
11455     if (*s == '(')
11456         s++;
11457     while (s < PL_bufend && isSPACE(*s))
11458         s++;
11459     if (isIDFIRST_lazy_if(s,UTF)) {
11460         const char * const w = s++;
11461         while (isALNUM_lazy_if(s,UTF))
11462             s++;
11463         while (s < PL_bufend && isSPACE(*s))
11464             s++;
11465         if (*s == ',') {
11466             GV* gv;
11467             if (keyword(w, s - w, 0))
11468                 return;
11469
11470             gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
11471             if (gv && GvCVu(gv))
11472                 return;
11473             Perl_croak(aTHX_ "No comma allowed after %s", what);
11474         }
11475     }
11476 }
11477
11478 /* Either returns sv, or mortalizes sv and returns a new SV*.
11479    Best used as sv=new_constant(..., sv, ...).
11480    If s, pv are NULL, calls subroutine with one argument,
11481    and type is used with error messages only. */
11482
11483 STATIC SV *
11484 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
11485                SV *sv, SV *pv, const char *type, STRLEN typelen)
11486 {
11487     dVAR; dSP;
11488     HV * const table = GvHV(PL_hintgv);          /* ^H */
11489     SV *res;
11490     SV **cvp;
11491     SV *cv, *typesv;
11492     const char *why1 = "", *why2 = "", *why3 = "";
11493
11494     PERL_ARGS_ASSERT_NEW_CONSTANT;
11495
11496     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
11497         SV *msg;
11498         
11499         why2 = (const char *)
11500             (strEQ(key,"charnames")
11501              ? "(possibly a missing \"use charnames ...\")"
11502              : "");
11503         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
11504                             (type ? type: "undef"), why2);
11505
11506         /* This is convoluted and evil ("goto considered harmful")
11507          * but I do not understand the intricacies of all the different
11508          * failure modes of %^H in here.  The goal here is to make
11509          * the most probable error message user-friendly. --jhi */
11510
11511         goto msgdone;
11512
11513     report:
11514         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
11515                             (type ? type: "undef"), why1, why2, why3);
11516     msgdone:
11517         yyerror(SvPVX_const(msg));
11518         SvREFCNT_dec(msg);
11519         return sv;
11520     }
11521
11522     /* charnames doesn't work well if there have been errors found */
11523     if (PL_error_count > 0 && strEQ(key,"charnames")) return res;
11524
11525     cvp = hv_fetch(table, key, keylen, FALSE);
11526     if (!cvp || !SvOK(*cvp)) {
11527         why1 = "$^H{";
11528         why2 = key;
11529         why3 = "} is not defined";
11530         goto report;
11531     }
11532     sv_2mortal(sv);                     /* Parent created it permanently */
11533     cv = *cvp;
11534     if (!pv && s)
11535         pv = newSVpvn_flags(s, len, SVs_TEMP);
11536     if (type && pv)
11537         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
11538     else
11539         typesv = &PL_sv_undef;
11540
11541     PUSHSTACKi(PERLSI_OVERLOAD);
11542     ENTER ;
11543     SAVETMPS;
11544
11545     PUSHMARK(SP) ;
11546     EXTEND(sp, 3);
11547     if (pv)
11548         PUSHs(pv);
11549     PUSHs(sv);
11550     if (pv)
11551         PUSHs(typesv);
11552     PUTBACK;
11553     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
11554
11555     SPAGAIN ;
11556
11557     /* Check the eval first */
11558     if (!PL_in_eval && SvTRUE(ERRSV)) {
11559         sv_catpvs(ERRSV, "Propagated");
11560         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
11561         (void)POPs;
11562         res = SvREFCNT_inc_simple(sv);
11563     }
11564     else {
11565         res = POPs;
11566         SvREFCNT_inc_simple_void(res);
11567     }
11568
11569     PUTBACK ;
11570     FREETMPS ;
11571     LEAVE ;
11572     POPSTACK;
11573
11574     if (!SvOK(res)) {
11575         why1 = "Call to &{$^H{";
11576         why2 = key;
11577         why3 = "}} did not return a defined value";
11578         sv = res;
11579         goto report;
11580     }
11581
11582     return res;
11583 }
11584
11585 /* Returns a NUL terminated string, with the length of the string written to
11586    *slp
11587    */
11588 STATIC char *
11589 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
11590 {
11591     dVAR;
11592     register char *d = dest;
11593     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
11594
11595     PERL_ARGS_ASSERT_SCAN_WORD;
11596
11597     for (;;) {
11598         if (d >= e)
11599             Perl_croak(aTHX_ ident_too_long);
11600         if (isALNUM(*s))        /* UTF handled below */
11601             *d++ = *s++;
11602         else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
11603             *d++ = ':';
11604             *d++ = ':';
11605             s++;
11606         }
11607         else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
11608             *d++ = *s++;
11609             *d++ = *s++;
11610         }
11611         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11612             char *t = s + UTF8SKIP(s);
11613             size_t len;
11614             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11615                 t += UTF8SKIP(t);
11616             len = t - s;
11617             if (d + len > e)
11618                 Perl_croak(aTHX_ ident_too_long);
11619             Copy(s, d, len, char);
11620             d += len;
11621             s = t;
11622         }
11623         else {
11624             *d = '\0';
11625             *slp = d - dest;
11626             return s;
11627         }
11628     }
11629 }
11630
11631 STATIC char *
11632 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
11633 {
11634     dVAR;
11635     char *bracket = NULL;
11636     char funny = *s++;
11637     register char *d = dest;
11638     register char * const e = d + destlen - 3;    /* two-character token, ending NUL */
11639
11640     PERL_ARGS_ASSERT_SCAN_IDENT;
11641
11642     if (isSPACE(*s))
11643         s = PEEKSPACE(s);
11644     if (isDIGIT(*s)) {
11645         while (isDIGIT(*s)) {
11646             if (d >= e)
11647                 Perl_croak(aTHX_ ident_too_long);
11648             *d++ = *s++;
11649         }
11650     }
11651     else {
11652         for (;;) {
11653             if (d >= e)
11654                 Perl_croak(aTHX_ ident_too_long);
11655             if (isALNUM(*s))    /* UTF handled below */
11656                 *d++ = *s++;
11657             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
11658                 *d++ = ':';
11659                 *d++ = ':';
11660                 s++;
11661             }
11662             else if (*s == ':' && s[1] == ':') {
11663                 *d++ = *s++;
11664                 *d++ = *s++;
11665             }
11666             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11667                 char *t = s + UTF8SKIP(s);
11668                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11669                     t += UTF8SKIP(t);
11670                 if (d + (t - s) > e)
11671                     Perl_croak(aTHX_ ident_too_long);
11672                 Copy(s, d, t - s, char);
11673                 d += t - s;
11674                 s = t;
11675             }
11676             else
11677                 break;
11678         }
11679     }
11680     *d = '\0';
11681     d = dest;
11682     if (*d) {
11683         if (PL_lex_state != LEX_NORMAL)
11684             PL_lex_state = LEX_INTERPENDMAYBE;
11685         return s;
11686     }
11687     if (*s == '$' && s[1] &&
11688         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
11689     {
11690         return s;
11691     }
11692     if (*s == '{') {
11693         bracket = s;
11694         s++;
11695     }
11696     else if (ck_uni)
11697         check_uni();
11698     if (s < send)
11699         *d = *s++;
11700     d[1] = '\0';
11701     if (*d == '^' && *s && isCONTROLVAR(*s)) {
11702         *d = toCTRL(*s);
11703         s++;
11704     }
11705     if (bracket) {
11706         if (isSPACE(s[-1])) {
11707             while (s < send) {
11708                 const char ch = *s++;
11709                 if (!SPACE_OR_TAB(ch)) {
11710                     *d = ch;
11711                     break;
11712                 }
11713             }
11714         }
11715         if (isIDFIRST_lazy_if(d,UTF)) {
11716             d++;
11717             if (UTF) {
11718                 char *end = s;
11719                 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
11720                     end += UTF8SKIP(end);
11721                     while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
11722                         end += UTF8SKIP(end);
11723                 }
11724                 Copy(s, d, end - s, char);
11725                 d += end - s;
11726                 s = end;
11727             }
11728             else {
11729                 while ((isALNUM(*s) || *s == ':') && d < e)
11730                     *d++ = *s++;
11731                 if (d >= e)
11732                     Perl_croak(aTHX_ ident_too_long);
11733             }
11734             *d = '\0';
11735             while (s < send && SPACE_OR_TAB(*s))
11736                 s++;
11737             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
11738                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
11739                     const char * const brack =
11740                         (const char *)
11741                         ((*s == '[') ? "[...]" : "{...}");
11742                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11743                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
11744                         funny, dest, brack, funny, dest, brack);
11745                 }
11746                 bracket++;
11747                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
11748                 return s;
11749             }
11750         }
11751         /* Handle extended ${^Foo} variables
11752          * 1999-02-27 mjd-perl-patch@plover.com */
11753         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
11754                  && isALNUM(*s))
11755         {
11756             d++;
11757             while (isALNUM(*s) && d < e) {
11758                 *d++ = *s++;
11759             }
11760             if (d >= e)
11761                 Perl_croak(aTHX_ ident_too_long);
11762             *d = '\0';
11763         }
11764         if (*s == '}') {
11765             s++;
11766             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
11767                 PL_lex_state = LEX_INTERPEND;
11768                 PL_expect = XREF;
11769             }
11770             if (PL_lex_state == LEX_NORMAL) {
11771                 if (ckWARN(WARN_AMBIGUOUS) &&
11772                     (keyword(dest, d - dest, 0)
11773                      || get_cvn_flags(dest, d - dest, 0)))
11774                 {
11775                     if (funny == '#')
11776                         funny = '@';
11777                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11778                         "Ambiguous use of %c{%s} resolved to %c%s",
11779                         funny, dest, funny, dest);
11780                 }
11781             }
11782         }
11783         else {
11784             s = bracket;                /* let the parser handle it */
11785             *dest = '\0';
11786         }
11787     }
11788     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
11789         PL_lex_state = LEX_INTERPEND;
11790     return s;
11791 }
11792
11793 static U32
11794 S_pmflag(U32 pmfl, const char ch) {
11795     switch (ch) {
11796         CASE_STD_PMMOD_FLAGS_PARSE_SET(&pmfl);
11797     case GLOBAL_PAT_MOD:    pmfl |= PMf_GLOBAL; break;
11798     case CONTINUE_PAT_MOD:  pmfl |= PMf_CONTINUE; break;
11799     case ONCE_PAT_MOD:      pmfl |= PMf_KEEP; break;
11800     case KEEPCOPY_PAT_MOD:  pmfl |= PMf_KEEPCOPY; break;
11801     }
11802     return pmfl;
11803 }
11804
11805 void
11806 Perl_pmflag(pTHX_ U32* pmfl, int ch)
11807 {
11808     PERL_ARGS_ASSERT_PMFLAG;
11809
11810     Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
11811                      "Perl_pmflag() is deprecated, and will be removed from the XS API");
11812
11813     if (ch<256) {
11814         *pmfl = S_pmflag(*pmfl, (char)ch);
11815     }
11816 }
11817
11818 STATIC char *
11819 S_scan_pat(pTHX_ char *start, I32 type)
11820 {
11821     dVAR;
11822     PMOP *pm;
11823     char *s = scan_str(start,!!PL_madskills,FALSE);
11824     const char * const valid_flags =
11825         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
11826 #ifdef PERL_MAD
11827     char *modstart;
11828 #endif
11829
11830     PERL_ARGS_ASSERT_SCAN_PAT;
11831
11832     if (!s) {
11833         const char * const delimiter = skipspace(start);
11834         Perl_croak(aTHX_
11835                    (const char *)
11836                    (*delimiter == '?'
11837                     ? "Search pattern not terminated or ternary operator parsed as search pattern"
11838                     : "Search pattern not terminated" ));
11839     }
11840
11841     pm = (PMOP*)newPMOP(type, 0);
11842     if (PL_multi_open == '?') {
11843         /* This is the only point in the code that sets PMf_ONCE:  */
11844         pm->op_pmflags |= PMf_ONCE;
11845
11846         /* Hence it's safe to do this bit of PMOP book-keeping here, which
11847            allows us to restrict the list needed by reset to just the ??
11848            matches.  */
11849         assert(type != OP_TRANS);
11850         if (PL_curstash) {
11851             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
11852             U32 elements;
11853             if (!mg) {
11854                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
11855                                  0);
11856             }
11857             elements = mg->mg_len / sizeof(PMOP**);
11858             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
11859             ((PMOP**)mg->mg_ptr) [elements++] = pm;
11860             mg->mg_len = elements * sizeof(PMOP**);
11861             PmopSTASH_set(pm,PL_curstash);
11862         }
11863     }
11864 #ifdef PERL_MAD
11865     modstart = s;
11866 #endif
11867     while (*s && strchr(valid_flags, *s))
11868         pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
11869 #ifdef PERL_MAD
11870     if (PL_madskills && modstart != s) {
11871         SV* tmptoken = newSVpvn(modstart, s - modstart);
11872         append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
11873     }
11874 #endif
11875     /* issue a warning if /c is specified,but /g is not */
11876     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
11877     {
11878         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), 
11879                        "Use of /c modifier is meaningless without /g" );
11880     }
11881
11882     PL_lex_op = (OP*)pm;
11883     pl_yylval.ival = OP_MATCH;
11884     return s;
11885 }
11886
11887 STATIC char *
11888 S_scan_subst(pTHX_ char *start)
11889 {
11890     dVAR;
11891     register char *s;
11892     register PMOP *pm;
11893     I32 first_start;
11894     I32 es = 0;
11895 #ifdef PERL_MAD
11896     char *modstart;
11897 #endif
11898
11899     PERL_ARGS_ASSERT_SCAN_SUBST;
11900
11901     pl_yylval.ival = OP_NULL;
11902
11903     s = scan_str(start,!!PL_madskills,FALSE);
11904
11905     if (!s)
11906         Perl_croak(aTHX_ "Substitution pattern not terminated");
11907
11908     if (s[-1] == PL_multi_open)
11909         s--;
11910 #ifdef PERL_MAD
11911     if (PL_madskills) {
11912         CURMAD('q', PL_thisopen);
11913         CURMAD('_', PL_thiswhite);
11914         CURMAD('E', PL_thisstuff);
11915         CURMAD('Q', PL_thisclose);
11916         PL_realtokenstart = s - SvPVX(PL_linestr);
11917     }
11918 #endif
11919
11920     first_start = PL_multi_start;
11921     s = scan_str(s,!!PL_madskills,FALSE);
11922     if (!s) {
11923         if (PL_lex_stuff) {
11924             SvREFCNT_dec(PL_lex_stuff);
11925             PL_lex_stuff = NULL;
11926         }
11927         Perl_croak(aTHX_ "Substitution replacement not terminated");
11928     }
11929     PL_multi_start = first_start;       /* so whole substitution is taken together */
11930
11931     pm = (PMOP*)newPMOP(OP_SUBST, 0);
11932
11933 #ifdef PERL_MAD
11934     if (PL_madskills) {
11935         CURMAD('z', PL_thisopen);
11936         CURMAD('R', PL_thisstuff);
11937         CURMAD('Z', PL_thisclose);
11938     }
11939     modstart = s;
11940 #endif
11941
11942     while (*s) {
11943         if (*s == EXEC_PAT_MOD) {
11944             s++;
11945             es++;
11946         }
11947         else if (strchr(S_PAT_MODS, *s))
11948             pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
11949         else
11950             break;
11951     }
11952
11953 #ifdef PERL_MAD
11954     if (PL_madskills) {
11955         if (modstart != s)
11956             curmad('m', newSVpvn(modstart, s - modstart));
11957         append_madprops(PL_thismad, (OP*)pm, 0);
11958         PL_thismad = 0;
11959     }
11960 #endif
11961     if ((pm->op_pmflags & PMf_CONTINUE)) {
11962         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
11963     }
11964
11965     if (es) {
11966         SV * const repl = newSVpvs("");
11967
11968         PL_sublex_info.super_bufptr = s;
11969         PL_sublex_info.super_bufend = PL_bufend;
11970         PL_multi_end = 0;
11971         pm->op_pmflags |= PMf_EVAL;
11972         while (es-- > 0) {
11973             if (es)
11974                 sv_catpvs(repl, "eval ");
11975             else
11976                 sv_catpvs(repl, "do ");
11977         }
11978         sv_catpvs(repl, "{");
11979         sv_catsv(repl, PL_lex_repl);
11980         if (strchr(SvPVX(PL_lex_repl), '#'))
11981             sv_catpvs(repl, "\n");
11982         sv_catpvs(repl, "}");
11983         SvEVALED_on(repl);
11984         SvREFCNT_dec(PL_lex_repl);
11985         PL_lex_repl = repl;
11986     }
11987
11988     PL_lex_op = (OP*)pm;
11989     pl_yylval.ival = OP_SUBST;
11990     return s;
11991 }
11992
11993 STATIC char *
11994 S_scan_trans(pTHX_ char *start)
11995 {
11996     dVAR;
11997     register char* s;
11998     OP *o;
11999     short *tbl;
12000     U8 squash;
12001     U8 del;
12002     U8 complement;
12003 #ifdef PERL_MAD
12004     char *modstart;
12005 #endif
12006
12007     PERL_ARGS_ASSERT_SCAN_TRANS;
12008
12009     pl_yylval.ival = OP_NULL;
12010
12011     s = scan_str(start,!!PL_madskills,FALSE);
12012     if (!s)
12013         Perl_croak(aTHX_ "Transliteration pattern not terminated");
12014
12015     if (s[-1] == PL_multi_open)
12016         s--;
12017 #ifdef PERL_MAD
12018     if (PL_madskills) {
12019         CURMAD('q', PL_thisopen);
12020         CURMAD('_', PL_thiswhite);
12021         CURMAD('E', PL_thisstuff);
12022         CURMAD('Q', PL_thisclose);
12023         PL_realtokenstart = s - SvPVX(PL_linestr);
12024     }
12025 #endif
12026
12027     s = scan_str(s,!!PL_madskills,FALSE);
12028     if (!s) {
12029         if (PL_lex_stuff) {
12030             SvREFCNT_dec(PL_lex_stuff);
12031             PL_lex_stuff = NULL;
12032         }
12033         Perl_croak(aTHX_ "Transliteration replacement not terminated");
12034     }
12035     if (PL_madskills) {
12036         CURMAD('z', PL_thisopen);
12037         CURMAD('R', PL_thisstuff);
12038         CURMAD('Z', PL_thisclose);
12039     }
12040
12041     complement = del = squash = 0;
12042 #ifdef PERL_MAD
12043     modstart = s;
12044 #endif
12045     while (1) {
12046         switch (*s) {
12047         case 'c':
12048             complement = OPpTRANS_COMPLEMENT;
12049             break;
12050         case 'd':
12051             del = OPpTRANS_DELETE;
12052             break;
12053         case 's':
12054             squash = OPpTRANS_SQUASH;
12055             break;
12056         default:
12057             goto no_more;
12058         }
12059         s++;
12060     }
12061   no_more:
12062
12063     tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
12064     o = newPVOP(OP_TRANS, 0, (char*)tbl);
12065     o->op_private &= ~OPpTRANS_ALL;
12066     o->op_private |= del|squash|complement|
12067       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
12068       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
12069
12070     PL_lex_op = o;
12071     pl_yylval.ival = OP_TRANS;
12072
12073 #ifdef PERL_MAD
12074     if (PL_madskills) {
12075         if (modstart != s)
12076             curmad('m', newSVpvn(modstart, s - modstart));
12077         append_madprops(PL_thismad, o, 0);
12078         PL_thismad = 0;
12079     }
12080 #endif
12081
12082     return s;
12083 }
12084
12085 STATIC char *
12086 S_scan_heredoc(pTHX_ register char *s)
12087 {
12088     dVAR;
12089     SV *herewas;
12090     I32 op_type = OP_SCALAR;
12091     I32 len;
12092     SV *tmpstr;
12093     char term;
12094     const char *found_newline;
12095     register char *d;
12096     register char *e;
12097     char *peek;
12098     const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
12099 #ifdef PERL_MAD
12100     I32 stuffstart = s - SvPVX(PL_linestr);
12101     char *tstart;
12102  
12103     PL_realtokenstart = -1;
12104 #endif
12105
12106     PERL_ARGS_ASSERT_SCAN_HEREDOC;
12107
12108     s += 2;
12109     d = PL_tokenbuf;
12110     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
12111     if (!outer)
12112         *d++ = '\n';
12113     peek = s;
12114     while (SPACE_OR_TAB(*peek))
12115         peek++;
12116     if (*peek == '`' || *peek == '\'' || *peek =='"') {
12117         s = peek;
12118         term = *s++;
12119         s = delimcpy(d, e, s, PL_bufend, term, &len);
12120         d += len;
12121         if (s < PL_bufend)
12122             s++;
12123     }
12124     else {
12125         if (*s == '\\')
12126             s++, term = '\'';
12127         else
12128             term = '"';
12129         if (!isALNUM_lazy_if(s,UTF))
12130             deprecate("bare << to mean <<\"\"");
12131         for (; isALNUM_lazy_if(s,UTF); s++) {
12132             if (d < e)
12133                 *d++ = *s;
12134         }
12135     }
12136     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
12137         Perl_croak(aTHX_ "Delimiter for here document is too long");
12138     *d++ = '\n';
12139     *d = '\0';
12140     len = d - PL_tokenbuf;
12141
12142 #ifdef PERL_MAD
12143     if (PL_madskills) {
12144         tstart = PL_tokenbuf + !outer;
12145         PL_thisclose = newSVpvn(tstart, len - !outer);
12146         tstart = SvPVX(PL_linestr) + stuffstart;
12147         PL_thisopen = newSVpvn(tstart, s - tstart);
12148         stuffstart = s - SvPVX(PL_linestr);
12149     }
12150 #endif
12151 #ifndef PERL_STRICT_CR
12152     d = strchr(s, '\r');
12153     if (d) {
12154         char * const olds = s;
12155         s = d;
12156         while (s < PL_bufend) {
12157             if (*s == '\r') {
12158                 *d++ = '\n';
12159                 if (*++s == '\n')
12160                     s++;
12161             }
12162             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
12163                 *d++ = *s++;
12164                 s++;
12165             }
12166             else
12167                 *d++ = *s++;
12168         }
12169         *d = '\0';
12170         PL_bufend = d;
12171         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
12172         s = olds;
12173     }
12174 #endif
12175 #ifdef PERL_MAD
12176     found_newline = 0;
12177 #endif
12178     if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
12179         herewas = newSVpvn(s,PL_bufend-s);
12180     }
12181     else {
12182 #ifdef PERL_MAD
12183         herewas = newSVpvn(s-1,found_newline-s+1);
12184 #else
12185         s--;
12186         herewas = newSVpvn(s,found_newline-s);
12187 #endif
12188     }
12189 #ifdef PERL_MAD
12190     if (PL_madskills) {
12191         tstart = SvPVX(PL_linestr) + stuffstart;
12192         if (PL_thisstuff)
12193             sv_catpvn(PL_thisstuff, tstart, s - tstart);
12194         else
12195             PL_thisstuff = newSVpvn(tstart, s - tstart);
12196     }
12197 #endif
12198     s += SvCUR(herewas);
12199
12200 #ifdef PERL_MAD
12201     stuffstart = s - SvPVX(PL_linestr);
12202
12203     if (found_newline)
12204         s--;
12205 #endif
12206
12207     tmpstr = newSV_type(SVt_PVIV);
12208     SvGROW(tmpstr, 80);
12209     if (term == '\'') {
12210         op_type = OP_CONST;
12211         SvIV_set(tmpstr, -1);
12212     }
12213     else if (term == '`') {
12214         op_type = OP_BACKTICK;
12215         SvIV_set(tmpstr, '\\');
12216     }
12217
12218     CLINE;
12219     PL_multi_start = CopLINE(PL_curcop);
12220     PL_multi_open = PL_multi_close = '<';
12221     term = *PL_tokenbuf;
12222     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
12223         char * const bufptr = PL_sublex_info.super_bufptr;
12224         char * const bufend = PL_sublex_info.super_bufend;
12225         char * const olds = s - SvCUR(herewas);
12226         s = strchr(bufptr, '\n');
12227         if (!s)
12228             s = bufend;
12229         d = s;
12230         while (s < bufend &&
12231           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12232             if (*s++ == '\n')
12233                 CopLINE_inc(PL_curcop);
12234         }
12235         if (s >= bufend) {
12236             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12237             missingterm(PL_tokenbuf);
12238         }
12239         sv_setpvn(herewas,bufptr,d-bufptr+1);
12240         sv_setpvn(tmpstr,d+1,s-d);
12241         s += len - 1;
12242         sv_catpvn(herewas,s,bufend-s);
12243         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
12244
12245         s = olds;
12246         goto retval;
12247     }
12248     else if (!outer) {
12249         d = s;
12250         while (s < PL_bufend &&
12251           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12252             if (*s++ == '\n')
12253                 CopLINE_inc(PL_curcop);
12254         }
12255         if (s >= PL_bufend) {
12256             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12257             missingterm(PL_tokenbuf);
12258         }
12259         sv_setpvn(tmpstr,d+1,s-d);
12260 #ifdef PERL_MAD
12261         if (PL_madskills) {
12262             if (PL_thisstuff)
12263                 sv_catpvn(PL_thisstuff, d + 1, s - d);
12264             else
12265                 PL_thisstuff = newSVpvn(d + 1, s - d);
12266             stuffstart = s - SvPVX(PL_linestr);
12267         }
12268 #endif
12269         s += len - 1;
12270         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
12271
12272         sv_catpvn(herewas,s,PL_bufend-s);
12273         sv_setsv(PL_linestr,herewas);
12274         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
12275         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12276         PL_last_lop = PL_last_uni = NULL;
12277     }
12278     else
12279         sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
12280     while (s >= PL_bufend) {    /* multiple line string? */
12281 #ifdef PERL_MAD
12282         if (PL_madskills) {
12283             tstart = SvPVX(PL_linestr) + stuffstart;
12284             if (PL_thisstuff)
12285                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12286             else
12287                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12288         }
12289 #endif
12290         PL_bufptr = s;
12291         CopLINE_inc(PL_curcop);
12292         if (!outer || !lex_next_chunk(0)) {
12293             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12294             missingterm(PL_tokenbuf);
12295         }
12296         CopLINE_dec(PL_curcop);
12297         s = PL_bufptr;
12298 #ifdef PERL_MAD
12299         stuffstart = s - SvPVX(PL_linestr);
12300 #endif
12301         CopLINE_inc(PL_curcop);
12302         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12303         PL_last_lop = PL_last_uni = NULL;
12304 #ifndef PERL_STRICT_CR
12305         if (PL_bufend - PL_linestart >= 2) {
12306             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
12307                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
12308             {
12309                 PL_bufend[-2] = '\n';
12310                 PL_bufend--;
12311                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
12312             }
12313             else if (PL_bufend[-1] == '\r')
12314                 PL_bufend[-1] = '\n';
12315         }
12316         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
12317             PL_bufend[-1] = '\n';
12318 #endif
12319         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
12320             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
12321             *(SvPVX(PL_linestr) + off ) = ' ';
12322             sv_catsv(PL_linestr,herewas);
12323             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12324             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
12325         }
12326         else {
12327             s = PL_bufend;
12328             sv_catsv(tmpstr,PL_linestr);
12329         }
12330     }
12331     s++;
12332 retval:
12333     PL_multi_end = CopLINE(PL_curcop);
12334     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
12335         SvPV_shrink_to_cur(tmpstr);
12336     }
12337     SvREFCNT_dec(herewas);
12338     if (!IN_BYTES) {
12339         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
12340             SvUTF8_on(tmpstr);
12341         else if (PL_encoding)
12342             sv_recode_to_utf8(tmpstr, PL_encoding);
12343     }
12344     PL_lex_stuff = tmpstr;
12345     pl_yylval.ival = op_type;
12346     return s;
12347 }
12348
12349 /* scan_inputsymbol
12350    takes: current position in input buffer
12351    returns: new position in input buffer
12352    side-effects: pl_yylval and lex_op are set.
12353
12354    This code handles:
12355
12356    <>           read from ARGV
12357    <FH>         read from filehandle
12358    <pkg::FH>    read from package qualified filehandle
12359    <pkg'FH>     read from package qualified filehandle
12360    <$fh>        read from filehandle in $fh
12361    <*.h>        filename glob
12362
12363 */
12364
12365 STATIC char *
12366 S_scan_inputsymbol(pTHX_ char *start)
12367 {
12368     dVAR;
12369     register char *s = start;           /* current position in buffer */
12370     char *end;
12371     I32 len;
12372     char *d = PL_tokenbuf;                                      /* start of temp holding space */
12373     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
12374
12375     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
12376
12377     end = strchr(s, '\n');
12378     if (!end)
12379         end = PL_bufend;
12380     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
12381
12382     /* die if we didn't have space for the contents of the <>,
12383        or if it didn't end, or if we see a newline
12384     */
12385
12386     if (len >= (I32)sizeof PL_tokenbuf)
12387         Perl_croak(aTHX_ "Excessively long <> operator");
12388     if (s >= end)
12389         Perl_croak(aTHX_ "Unterminated <> operator");
12390
12391     s++;
12392
12393     /* check for <$fh>
12394        Remember, only scalar variables are interpreted as filehandles by
12395        this code.  Anything more complex (e.g., <$fh{$num}>) will be
12396        treated as a glob() call.
12397        This code makes use of the fact that except for the $ at the front,
12398        a scalar variable and a filehandle look the same.
12399     */
12400     if (*d == '$' && d[1]) d++;
12401
12402     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
12403     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
12404         d++;
12405
12406     /* If we've tried to read what we allow filehandles to look like, and
12407        there's still text left, then it must be a glob() and not a getline.
12408        Use scan_str to pull out the stuff between the <> and treat it
12409        as nothing more than a string.
12410     */
12411
12412     if (d - PL_tokenbuf != len) {
12413         pl_yylval.ival = OP_GLOB;
12414         s = scan_str(start,!!PL_madskills,FALSE);
12415         if (!s)
12416            Perl_croak(aTHX_ "Glob not terminated");
12417         return s;
12418     }
12419     else {
12420         bool readline_overriden = FALSE;
12421         GV *gv_readline;
12422         GV **gvp;
12423         /* we're in a filehandle read situation */
12424         d = PL_tokenbuf;
12425
12426         /* turn <> into <ARGV> */
12427         if (!len)
12428             Copy("ARGV",d,5,char);
12429
12430         /* Check whether readline() is overriden */
12431         gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
12432         if ((gv_readline
12433                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
12434                 ||
12435                 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
12436                  && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
12437                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
12438             readline_overriden = TRUE;
12439
12440         /* if <$fh>, create the ops to turn the variable into a
12441            filehandle
12442         */
12443         if (*d == '$') {
12444             /* try to find it in the pad for this block, otherwise find
12445                add symbol table ops
12446             */
12447             const PADOFFSET tmp = pad_findmy(d, len, 0);
12448             if (tmp != NOT_IN_PAD) {
12449                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
12450                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
12451                     HEK * const stashname = HvNAME_HEK(stash);
12452                     SV * const sym = sv_2mortal(newSVhek(stashname));
12453                     sv_catpvs(sym, "::");
12454                     sv_catpv(sym, d+1);
12455                     d = SvPVX(sym);
12456                     goto intro_sym;
12457                 }
12458                 else {
12459                     OP * const o = newOP(OP_PADSV, 0);
12460                     o->op_targ = tmp;
12461                     PL_lex_op = readline_overriden
12462                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12463                                 append_elem(OP_LIST, o,
12464                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
12465                         : (OP*)newUNOP(OP_READLINE, 0, o);
12466                 }
12467             }
12468             else {
12469                 GV *gv;
12470                 ++d;
12471 intro_sym:
12472                 gv = gv_fetchpv(d,
12473                                 (PL_in_eval
12474                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
12475                                  : GV_ADDMULTI),
12476                                 SVt_PV);
12477                 PL_lex_op = readline_overriden
12478                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12479                             append_elem(OP_LIST,
12480                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
12481                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12482                     : (OP*)newUNOP(OP_READLINE, 0,
12483                             newUNOP(OP_RV2SV, 0,
12484                                 newGVOP(OP_GV, 0, gv)));
12485             }
12486             if (!readline_overriden)
12487                 PL_lex_op->op_flags |= OPf_SPECIAL;
12488             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
12489             pl_yylval.ival = OP_NULL;
12490         }
12491
12492         /* If it's none of the above, it must be a literal filehandle
12493            (<Foo::BAR> or <FOO>) so build a simple readline OP */
12494         else {
12495             GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
12496             PL_lex_op = readline_overriden
12497                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12498                         append_elem(OP_LIST,
12499                             newGVOP(OP_GV, 0, gv),
12500                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12501                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
12502             pl_yylval.ival = OP_NULL;
12503         }
12504     }
12505
12506     return s;
12507 }
12508
12509
12510 /* scan_str
12511    takes: start position in buffer
12512           keep_quoted preserve \ on the embedded delimiter(s)
12513           keep_delims preserve the delimiters around the string
12514    returns: position to continue reading from buffer
12515    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
12516         updates the read buffer.
12517
12518    This subroutine pulls a string out of the input.  It is called for:
12519         q               single quotes           q(literal text)
12520         '               single quotes           'literal text'
12521         qq              double quotes           qq(interpolate $here please)
12522         "               double quotes           "interpolate $here please"
12523         qx              backticks               qx(/bin/ls -l)
12524         `               backticks               `/bin/ls -l`
12525         qw              quote words             @EXPORT_OK = qw( func() $spam )
12526         m//             regexp match            m/this/
12527         s///            regexp substitute       s/this/that/
12528         tr///           string transliterate    tr/this/that/
12529         y///            string transliterate    y/this/that/
12530         ($*@)           sub prototypes          sub foo ($)
12531         (stuff)         sub attr parameters     sub foo : attr(stuff)
12532         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
12533         
12534    In most of these cases (all but <>, patterns and transliterate)
12535    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
12536    calls scan_str().  s/// makes yylex() call scan_subst() which calls
12537    scan_str().  tr/// and y/// make yylex() call scan_trans() which
12538    calls scan_str().
12539
12540    It skips whitespace before the string starts, and treats the first
12541    character as the delimiter.  If the delimiter is one of ([{< then
12542    the corresponding "close" character )]}> is used as the closing
12543    delimiter.  It allows quoting of delimiters, and if the string has
12544    balanced delimiters ([{<>}]) it allows nesting.
12545
12546    On success, the SV with the resulting string is put into lex_stuff or,
12547    if that is already non-NULL, into lex_repl. The second case occurs only
12548    when parsing the RHS of the special constructs s/// and tr/// (y///).
12549    For convenience, the terminating delimiter character is stuffed into
12550    SvIVX of the SV.
12551 */
12552
12553 STATIC char *
12554 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
12555 {
12556     dVAR;
12557     SV *sv;                             /* scalar value: string */
12558     const char *tmps;                   /* temp string, used for delimiter matching */
12559     register char *s = start;           /* current position in the buffer */
12560     register char term;                 /* terminating character */
12561     register char *to;                  /* current position in the sv's data */
12562     I32 brackets = 1;                   /* bracket nesting level */
12563     bool has_utf8 = FALSE;              /* is there any utf8 content? */
12564     I32 termcode;                       /* terminating char. code */
12565     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
12566     STRLEN termlen;                     /* length of terminating string */
12567     int last_off = 0;                   /* last position for nesting bracket */
12568 #ifdef PERL_MAD
12569     int stuffstart;
12570     char *tstart;
12571 #endif
12572
12573     PERL_ARGS_ASSERT_SCAN_STR;
12574
12575     /* skip space before the delimiter */
12576     if (isSPACE(*s)) {
12577         s = PEEKSPACE(s);
12578     }
12579
12580 #ifdef PERL_MAD
12581     if (PL_realtokenstart >= 0) {
12582         stuffstart = PL_realtokenstart;
12583         PL_realtokenstart = -1;
12584     }
12585     else
12586         stuffstart = start - SvPVX(PL_linestr);
12587 #endif
12588     /* mark where we are, in case we need to report errors */
12589     CLINE;
12590
12591     /* after skipping whitespace, the next character is the terminator */
12592     term = *s;
12593     if (!UTF) {
12594         termcode = termstr[0] = term;
12595         termlen = 1;
12596     }
12597     else {
12598         termcode = utf8_to_uvchr((U8*)s, &termlen);
12599         Copy(s, termstr, termlen, U8);
12600         if (!UTF8_IS_INVARIANT(term))
12601             has_utf8 = TRUE;
12602     }
12603
12604     /* mark where we are */
12605     PL_multi_start = CopLINE(PL_curcop);
12606     PL_multi_open = term;
12607
12608     /* find corresponding closing delimiter */
12609     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
12610         termcode = termstr[0] = term = tmps[5];
12611
12612     PL_multi_close = term;
12613
12614     /* create a new SV to hold the contents.  79 is the SV's initial length.
12615        What a random number. */
12616     sv = newSV_type(SVt_PVIV);
12617     SvGROW(sv, 80);
12618     SvIV_set(sv, termcode);
12619     (void)SvPOK_only(sv);               /* validate pointer */
12620
12621     /* move past delimiter and try to read a complete string */
12622     if (keep_delims)
12623         sv_catpvn(sv, s, termlen);
12624     s += termlen;
12625 #ifdef PERL_MAD
12626     tstart = SvPVX(PL_linestr) + stuffstart;
12627     if (!PL_thisopen && !keep_delims) {
12628         PL_thisopen = newSVpvn(tstart, s - tstart);
12629         stuffstart = s - SvPVX(PL_linestr);
12630     }
12631 #endif
12632     for (;;) {
12633         if (PL_encoding && !UTF) {
12634             bool cont = TRUE;
12635
12636             while (cont) {
12637                 int offset = s - SvPVX_const(PL_linestr);
12638                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
12639                                            &offset, (char*)termstr, termlen);
12640                 const char * const ns = SvPVX_const(PL_linestr) + offset;
12641                 char * const svlast = SvEND(sv) - 1;
12642
12643                 for (; s < ns; s++) {
12644                     if (*s == '\n' && !PL_rsfp)
12645                         CopLINE_inc(PL_curcop);
12646                 }
12647                 if (!found)
12648                     goto read_more_line;
12649                 else {
12650                     /* handle quoted delimiters */
12651                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
12652                         const char *t;
12653                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
12654                             t--;
12655                         if ((svlast-1 - t) % 2) {
12656                             if (!keep_quoted) {
12657                                 *(svlast-1) = term;
12658                                 *svlast = '\0';
12659                                 SvCUR_set(sv, SvCUR(sv) - 1);
12660                             }
12661                             continue;
12662                         }
12663                     }
12664                     if (PL_multi_open == PL_multi_close) {
12665                         cont = FALSE;
12666                     }
12667                     else {
12668                         const char *t;
12669                         char *w;
12670                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
12671                             /* At here, all closes are "was quoted" one,
12672                                so we don't check PL_multi_close. */
12673                             if (*t == '\\') {
12674                                 if (!keep_quoted && *(t+1) == PL_multi_open)
12675                                     t++;
12676                                 else
12677                                     *w++ = *t++;
12678                             }
12679                             else if (*t == PL_multi_open)
12680                                 brackets++;
12681
12682                             *w = *t;
12683                         }
12684                         if (w < t) {
12685                             *w++ = term;
12686                             *w = '\0';
12687                             SvCUR_set(sv, w - SvPVX_const(sv));
12688                         }
12689                         last_off = w - SvPVX(sv);
12690                         if (--brackets <= 0)
12691                             cont = FALSE;
12692                     }
12693                 }
12694             }
12695             if (!keep_delims) {
12696                 SvCUR_set(sv, SvCUR(sv) - 1);
12697                 *SvEND(sv) = '\0';
12698             }
12699             break;
12700         }
12701
12702         /* extend sv if need be */
12703         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
12704         /* set 'to' to the next character in the sv's string */
12705         to = SvPVX(sv)+SvCUR(sv);
12706
12707         /* if open delimiter is the close delimiter read unbridle */
12708         if (PL_multi_open == PL_multi_close) {
12709             for (; s < PL_bufend; s++,to++) {
12710                 /* embedded newlines increment the current line number */
12711                 if (*s == '\n' && !PL_rsfp)
12712                     CopLINE_inc(PL_curcop);
12713                 /* handle quoted delimiters */
12714                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
12715                     if (!keep_quoted && s[1] == term)
12716                         s++;
12717                 /* any other quotes are simply copied straight through */
12718                     else
12719                         *to++ = *s++;
12720                 }
12721                 /* terminate when run out of buffer (the for() condition), or
12722                    have found the terminator */
12723                 else if (*s == term) {
12724                     if (termlen == 1)
12725                         break;
12726                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
12727                         break;
12728                 }
12729                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12730                     has_utf8 = TRUE;
12731                 *to = *s;
12732             }
12733         }
12734         
12735         /* if the terminator isn't the same as the start character (e.g.,
12736            matched brackets), we have to allow more in the quoting, and
12737            be prepared for nested brackets.
12738         */
12739         else {
12740             /* read until we run out of string, or we find the terminator */
12741             for (; s < PL_bufend; s++,to++) {
12742                 /* embedded newlines increment the line count */
12743                 if (*s == '\n' && !PL_rsfp)
12744                     CopLINE_inc(PL_curcop);
12745                 /* backslashes can escape the open or closing characters */
12746                 if (*s == '\\' && s+1 < PL_bufend) {
12747                     if (!keep_quoted &&
12748                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
12749                         s++;
12750                     else
12751                         *to++ = *s++;
12752                 }
12753                 /* allow nested opens and closes */
12754                 else if (*s == PL_multi_close && --brackets <= 0)
12755                     break;
12756                 else if (*s == PL_multi_open)
12757                     brackets++;
12758                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12759                     has_utf8 = TRUE;
12760                 *to = *s;
12761             }
12762         }
12763         /* terminate the copied string and update the sv's end-of-string */
12764         *to = '\0';
12765         SvCUR_set(sv, to - SvPVX_const(sv));
12766
12767         /*
12768          * this next chunk reads more into the buffer if we're not done yet
12769          */
12770
12771         if (s < PL_bufend)
12772             break;              /* handle case where we are done yet :-) */
12773
12774 #ifndef PERL_STRICT_CR
12775         if (to - SvPVX_const(sv) >= 2) {
12776             if ((to[-2] == '\r' && to[-1] == '\n') ||
12777                 (to[-2] == '\n' && to[-1] == '\r'))
12778             {
12779                 to[-2] = '\n';
12780                 to--;
12781                 SvCUR_set(sv, to - SvPVX_const(sv));
12782             }
12783             else if (to[-1] == '\r')
12784                 to[-1] = '\n';
12785         }
12786         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
12787             to[-1] = '\n';
12788 #endif
12789         
12790      read_more_line:
12791         /* if we're out of file, or a read fails, bail and reset the current
12792            line marker so we can report where the unterminated string began
12793         */
12794 #ifdef PERL_MAD
12795         if (PL_madskills) {
12796             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12797             if (PL_thisstuff)
12798                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12799             else
12800                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12801         }
12802 #endif
12803         CopLINE_inc(PL_curcop);
12804         PL_bufptr = PL_bufend;
12805         if (!lex_next_chunk(0)) {
12806             sv_free(sv);
12807             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12808             return NULL;
12809         }
12810         s = PL_bufptr;
12811 #ifdef PERL_MAD
12812         stuffstart = 0;
12813 #endif
12814     }
12815
12816     /* at this point, we have successfully read the delimited string */
12817
12818     if (!PL_encoding || UTF) {
12819 #ifdef PERL_MAD
12820         if (PL_madskills) {
12821             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12822             const int len = s - tstart;
12823             if (PL_thisstuff)
12824                 sv_catpvn(PL_thisstuff, tstart, len);
12825             else
12826                 PL_thisstuff = newSVpvn(tstart, len);
12827             if (!PL_thisclose && !keep_delims)
12828                 PL_thisclose = newSVpvn(s,termlen);
12829         }
12830 #endif
12831
12832         if (keep_delims)
12833             sv_catpvn(sv, s, termlen);
12834         s += termlen;
12835     }
12836 #ifdef PERL_MAD
12837     else {
12838         if (PL_madskills) {
12839             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12840             const int len = s - tstart - termlen;
12841             if (PL_thisstuff)
12842                 sv_catpvn(PL_thisstuff, tstart, len);
12843             else
12844                 PL_thisstuff = newSVpvn(tstart, len);
12845             if (!PL_thisclose && !keep_delims)
12846                 PL_thisclose = newSVpvn(s - termlen,termlen);
12847         }
12848     }
12849 #endif
12850     if (has_utf8 || PL_encoding)
12851         SvUTF8_on(sv);
12852
12853     PL_multi_end = CopLINE(PL_curcop);
12854
12855     /* if we allocated too much space, give some back */
12856     if (SvCUR(sv) + 5 < SvLEN(sv)) {
12857         SvLEN_set(sv, SvCUR(sv) + 1);
12858         SvPV_renew(sv, SvLEN(sv));
12859     }
12860
12861     /* decide whether this is the first or second quoted string we've read
12862        for this op
12863     */
12864
12865     if (PL_lex_stuff)
12866         PL_lex_repl = sv;
12867     else
12868         PL_lex_stuff = sv;
12869     return s;
12870 }
12871
12872 /*
12873   scan_num
12874   takes: pointer to position in buffer
12875   returns: pointer to new position in buffer
12876   side-effects: builds ops for the constant in pl_yylval.op
12877
12878   Read a number in any of the formats that Perl accepts:
12879
12880   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
12881   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
12882   0b[01](_?[01])*
12883   0[0-7](_?[0-7])*
12884   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
12885
12886   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
12887   thing it reads.
12888
12889   If it reads a number without a decimal point or an exponent, it will
12890   try converting the number to an integer and see if it can do so
12891   without loss of precision.
12892 */
12893
12894 char *
12895 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
12896 {
12897     dVAR;
12898     register const char *s = start;     /* current position in buffer */
12899     register char *d;                   /* destination in temp buffer */
12900     register char *e;                   /* end of temp buffer */
12901     NV nv;                              /* number read, as a double */
12902     SV *sv = NULL;                      /* place to put the converted number */
12903     bool floatit;                       /* boolean: int or float? */
12904     const char *lastub = NULL;          /* position of last underbar */
12905     static char const number_too_long[] = "Number too long";
12906
12907     PERL_ARGS_ASSERT_SCAN_NUM;
12908
12909     /* We use the first character to decide what type of number this is */
12910
12911     switch (*s) {
12912     default:
12913       Perl_croak(aTHX_ "panic: scan_num");
12914
12915     /* if it starts with a 0, it could be an octal number, a decimal in
12916        0.13 disguise, or a hexadecimal number, or a binary number. */
12917     case '0':
12918         {
12919           /* variables:
12920              u          holds the "number so far"
12921              shift      the power of 2 of the base
12922                         (hex == 4, octal == 3, binary == 1)
12923              overflowed was the number more than we can hold?
12924
12925              Shift is used when we add a digit.  It also serves as an "are
12926              we in octal/hex/binary?" indicator to disallow hex characters
12927              when in octal mode.
12928            */
12929             NV n = 0.0;
12930             UV u = 0;
12931             I32 shift;
12932             bool overflowed = FALSE;
12933             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
12934             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
12935             static const char* const bases[5] =
12936               { "", "binary", "", "octal", "hexadecimal" };
12937             static const char* const Bases[5] =
12938               { "", "Binary", "", "Octal", "Hexadecimal" };
12939             static const char* const maxima[5] =
12940               { "",
12941                 "0b11111111111111111111111111111111",
12942                 "",
12943                 "037777777777",
12944                 "0xffffffff" };
12945             const char *base, *Base, *max;
12946
12947             /* check for hex */
12948             if (s[1] == 'x') {
12949                 shift = 4;
12950                 s += 2;
12951                 just_zero = FALSE;
12952             } else if (s[1] == 'b') {
12953                 shift = 1;
12954                 s += 2;
12955                 just_zero = FALSE;
12956             }
12957             /* check for a decimal in disguise */
12958             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
12959                 goto decimal;
12960             /* so it must be octal */
12961             else {
12962                 shift = 3;
12963                 s++;
12964             }
12965
12966             if (*s == '_') {
12967                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12968                                "Misplaced _ in number");
12969                lastub = s++;
12970             }
12971
12972             base = bases[shift];
12973             Base = Bases[shift];
12974             max  = maxima[shift];
12975
12976             /* read the rest of the number */
12977             for (;;) {
12978                 /* x is used in the overflow test,
12979                    b is the digit we're adding on. */
12980                 UV x, b;
12981
12982                 switch (*s) {
12983
12984                 /* if we don't mention it, we're done */
12985                 default:
12986                     goto out;
12987
12988                 /* _ are ignored -- but warned about if consecutive */
12989                 case '_':
12990                     if (lastub && s == lastub + 1)
12991                         Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12992                                        "Misplaced _ in number");
12993                     lastub = s++;
12994                     break;
12995
12996                 /* 8 and 9 are not octal */
12997                 case '8': case '9':
12998                     if (shift == 3)
12999                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
13000                     /* FALL THROUGH */
13001
13002                 /* octal digits */
13003                 case '2': case '3': case '4':
13004                 case '5': case '6': case '7':
13005                     if (shift == 1)
13006                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
13007                     /* FALL THROUGH */
13008
13009                 case '0': case '1':
13010                     b = *s++ & 15;              /* ASCII digit -> value of digit */
13011                     goto digit;
13012
13013                 /* hex digits */
13014                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
13015                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
13016                     /* make sure they said 0x */
13017                     if (shift != 4)
13018                         goto out;
13019                     b = (*s++ & 7) + 9;
13020
13021                     /* Prepare to put the digit we have onto the end
13022                        of the number so far.  We check for overflows.
13023                     */
13024
13025                   digit:
13026                     just_zero = FALSE;
13027                     if (!overflowed) {
13028                         x = u << shift; /* make room for the digit */
13029
13030                         if ((x >> shift) != u
13031                             && !(PL_hints & HINT_NEW_BINARY)) {
13032                             overflowed = TRUE;
13033                             n = (NV) u;
13034                             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13035                                              "Integer overflow in %s number",
13036                                              base);
13037                         } else
13038                             u = x | b;          /* add the digit to the end */
13039                     }
13040                     if (overflowed) {
13041                         n *= nvshift[shift];
13042                         /* If an NV has not enough bits in its
13043                          * mantissa to represent an UV this summing of
13044                          * small low-order numbers is a waste of time
13045                          * (because the NV cannot preserve the
13046                          * low-order bits anyway): we could just
13047                          * remember when did we overflow and in the
13048                          * end just multiply n by the right
13049                          * amount. */
13050                         n += (NV) b;
13051                     }
13052                     break;
13053                 }
13054             }
13055
13056           /* if we get here, we had success: make a scalar value from
13057              the number.
13058           */
13059           out:
13060
13061             /* final misplaced underbar check */
13062             if (s[-1] == '_') {
13063                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
13064             }
13065
13066             sv = newSV(0);
13067             if (overflowed) {
13068                 if (n > 4294967295.0)
13069                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
13070                                    "%s number > %s non-portable",
13071                                    Base, max);
13072                 sv_setnv(sv, n);
13073             }
13074             else {
13075 #if UVSIZE > 4
13076                 if (u > 0xffffffff)
13077                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
13078                                    "%s number > %s non-portable",
13079                                    Base, max);
13080 #endif
13081                 sv_setuv(sv, u);
13082             }
13083             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
13084                 sv = new_constant(start, s - start, "integer",
13085                                   sv, NULL, NULL, 0);
13086             else if (PL_hints & HINT_NEW_BINARY)
13087                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
13088         }
13089         break;
13090
13091     /*
13092       handle decimal numbers.
13093       we're also sent here when we read a 0 as the first digit
13094     */
13095     case '1': case '2': case '3': case '4': case '5':
13096     case '6': case '7': case '8': case '9': case '.':
13097       decimal:
13098         d = PL_tokenbuf;
13099         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
13100         floatit = FALSE;
13101
13102         /* read next group of digits and _ and copy into d */
13103         while (isDIGIT(*s) || *s == '_') {
13104             /* skip underscores, checking for misplaced ones
13105                if -w is on
13106             */
13107             if (*s == '_') {
13108                 if (lastub && s == lastub + 1)
13109                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13110                                    "Misplaced _ in number");
13111                 lastub = s++;
13112             }
13113             else {
13114                 /* check for end of fixed-length buffer */
13115                 if (d >= e)
13116                     Perl_croak(aTHX_ number_too_long);
13117                 /* if we're ok, copy the character */
13118                 *d++ = *s++;
13119             }
13120         }
13121
13122         /* final misplaced underbar check */
13123         if (lastub && s == lastub + 1) {
13124             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
13125         }
13126
13127         /* read a decimal portion if there is one.  avoid
13128            3..5 being interpreted as the number 3. followed
13129            by .5
13130         */
13131         if (*s == '.' && s[1] != '.') {
13132             floatit = TRUE;
13133             *d++ = *s++;
13134
13135             if (*s == '_') {
13136                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13137                                "Misplaced _ in number");
13138                 lastub = s;
13139             }
13140
13141             /* copy, ignoring underbars, until we run out of digits.
13142             */
13143             for (; isDIGIT(*s) || *s == '_'; s++) {
13144                 /* fixed length buffer check */
13145                 if (d >= e)
13146                     Perl_croak(aTHX_ number_too_long);
13147                 if (*s == '_') {
13148                    if (lastub && s == lastub + 1)
13149                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13150                                       "Misplaced _ in number");
13151                    lastub = s;
13152                 }
13153                 else
13154                     *d++ = *s;
13155             }
13156             /* fractional part ending in underbar? */
13157             if (s[-1] == '_') {
13158                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13159                                "Misplaced _ in number");
13160             }
13161             if (*s == '.' && isDIGIT(s[1])) {
13162                 /* oops, it's really a v-string, but without the "v" */
13163                 s = start;
13164                 goto vstring;
13165             }
13166         }
13167
13168         /* read exponent part, if present */
13169         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
13170             floatit = TRUE;
13171             s++;
13172
13173             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
13174             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
13175
13176             /* stray preinitial _ */
13177             if (*s == '_') {
13178                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13179                                "Misplaced _ in number");
13180                 lastub = s++;
13181             }
13182
13183             /* allow positive or negative exponent */
13184             if (*s == '+' || *s == '-')
13185                 *d++ = *s++;
13186
13187             /* stray initial _ */
13188             if (*s == '_') {
13189                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13190                                "Misplaced _ in number");
13191                 lastub = s++;
13192             }
13193
13194             /* read digits of exponent */
13195             while (isDIGIT(*s) || *s == '_') {
13196                 if (isDIGIT(*s)) {
13197                     if (d >= e)
13198                         Perl_croak(aTHX_ number_too_long);
13199                     *d++ = *s++;
13200                 }
13201                 else {
13202                    if (((lastub && s == lastub + 1) ||
13203                         (!isDIGIT(s[1]) && s[1] != '_')))
13204                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
13205                                       "Misplaced _ in number");
13206                    lastub = s++;
13207                 }
13208             }
13209         }
13210
13211
13212         /* make an sv from the string */
13213         sv = newSV(0);
13214
13215         /*
13216            We try to do an integer conversion first if no characters
13217            indicating "float" have been found.
13218          */
13219
13220         if (!floatit) {
13221             UV uv;
13222             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
13223
13224             if (flags == IS_NUMBER_IN_UV) {
13225               if (uv <= IV_MAX)
13226                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
13227               else
13228                 sv_setuv(sv, uv);
13229             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
13230               if (uv <= (UV) IV_MIN)
13231                 sv_setiv(sv, -(IV)uv);
13232               else
13233                 floatit = TRUE;
13234             } else
13235               floatit = TRUE;
13236         }
13237         if (floatit) {
13238             /* terminate the string */
13239             *d = '\0';
13240             nv = Atof(PL_tokenbuf);
13241             sv_setnv(sv, nv);
13242         }
13243
13244         if ( floatit
13245              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
13246             const char *const key = floatit ? "float" : "integer";
13247             const STRLEN keylen = floatit ? 5 : 7;
13248             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
13249                                 key, keylen, sv, NULL, NULL, 0);
13250         }
13251         break;
13252
13253     /* if it starts with a v, it could be a v-string */
13254     case 'v':
13255 vstring:
13256                 sv = newSV(5); /* preallocate storage space */
13257                 s = scan_vstring(s, PL_bufend, sv);
13258         break;
13259     }
13260
13261     /* make the op for the constant and return */
13262
13263     if (sv)
13264         lvalp->opval = newSVOP(OP_CONST, 0, sv);
13265     else
13266         lvalp->opval = NULL;
13267
13268     return (char *)s;
13269 }
13270
13271 STATIC char *
13272 S_scan_formline(pTHX_ register char *s)
13273 {
13274     dVAR;
13275     register char *eol;
13276     register char *t;
13277     SV * const stuff = newSVpvs("");
13278     bool needargs = FALSE;
13279     bool eofmt = FALSE;
13280 #ifdef PERL_MAD
13281     char *tokenstart = s;
13282     SV* savewhite = NULL;
13283
13284     if (PL_madskills) {
13285         savewhite = PL_thiswhite;
13286         PL_thiswhite = 0;
13287     }
13288 #endif
13289
13290     PERL_ARGS_ASSERT_SCAN_FORMLINE;
13291
13292     while (!needargs) {
13293         if (*s == '.') {
13294             t = s+1;
13295 #ifdef PERL_STRICT_CR
13296             while (SPACE_OR_TAB(*t))
13297                 t++;
13298 #else
13299             while (SPACE_OR_TAB(*t) || *t == '\r')
13300                 t++;
13301 #endif
13302             if (*t == '\n' || t == PL_bufend) {
13303                 eofmt = TRUE;
13304                 break;
13305             }
13306         }
13307         if (PL_in_eval && !PL_rsfp) {
13308             eol = (char *) memchr(s,'\n',PL_bufend-s);
13309             if (!eol++)
13310                 eol = PL_bufend;
13311         }
13312         else
13313             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
13314         if (*s != '#') {
13315             for (t = s; t < eol; t++) {
13316                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
13317                     needargs = FALSE;
13318                     goto enough;        /* ~~ must be first line in formline */
13319                 }
13320                 if (*t == '@' || *t == '^')
13321                     needargs = TRUE;
13322             }
13323             if (eol > s) {
13324                 sv_catpvn(stuff, s, eol-s);
13325 #ifndef PERL_STRICT_CR
13326                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
13327                     char *end = SvPVX(stuff) + SvCUR(stuff);
13328                     end[-2] = '\n';
13329                     end[-1] = '\0';
13330                     SvCUR_set(stuff, SvCUR(stuff) - 1);
13331                 }
13332 #endif
13333             }
13334             else
13335               break;
13336         }
13337         s = (char*)eol;
13338         if (PL_rsfp) {
13339             bool got_some;
13340 #ifdef PERL_MAD
13341             if (PL_madskills) {
13342                 if (PL_thistoken)
13343                     sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
13344                 else
13345                     PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
13346             }
13347 #endif
13348             PL_bufptr = PL_bufend;
13349             CopLINE_inc(PL_curcop);
13350             got_some = lex_next_chunk(0);
13351             CopLINE_dec(PL_curcop);
13352             s = PL_bufptr;
13353 #ifdef PERL_MAD
13354             tokenstart = PL_bufptr;
13355 #endif
13356             if (!got_some)
13357                 break;
13358         }
13359         incline(s);
13360     }
13361   enough:
13362     if (SvCUR(stuff)) {
13363         PL_expect = XTERM;
13364         if (needargs) {
13365             PL_lex_state = LEX_NORMAL;
13366             start_force(PL_curforce);
13367             NEXTVAL_NEXTTOKE.ival = 0;
13368             force_next(',');
13369         }
13370         else
13371             PL_lex_state = LEX_FORMLINE;
13372         if (!IN_BYTES) {
13373             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
13374                 SvUTF8_on(stuff);
13375             else if (PL_encoding)
13376                 sv_recode_to_utf8(stuff, PL_encoding);
13377         }
13378         start_force(PL_curforce);
13379         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
13380         force_next(THING);
13381         start_force(PL_curforce);
13382         NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
13383         force_next(LSTOP);
13384     }
13385     else {
13386         SvREFCNT_dec(stuff);
13387         if (eofmt)
13388             PL_lex_formbrack = 0;
13389         PL_bufptr = s;
13390     }
13391 #ifdef PERL_MAD
13392     if (PL_madskills) {
13393         if (PL_thistoken)
13394             sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
13395         else
13396             PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
13397         PL_thiswhite = savewhite;
13398     }
13399 #endif
13400     return s;
13401 }
13402
13403 I32
13404 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
13405 {
13406     dVAR;
13407     const I32 oldsavestack_ix = PL_savestack_ix;
13408     CV* const outsidecv = PL_compcv;
13409
13410     if (PL_compcv) {
13411         assert(SvTYPE(PL_compcv) == SVt_PVCV);
13412     }
13413     SAVEI32(PL_subline);
13414     save_item(PL_subname);
13415     SAVESPTR(PL_compcv);
13416
13417     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
13418     CvFLAGS(PL_compcv) |= flags;
13419
13420     PL_subline = CopLINE(PL_curcop);
13421     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
13422     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
13423     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
13424
13425     return oldsavestack_ix;
13426 }
13427
13428 #ifdef __SC__
13429 #pragma segment Perl_yylex
13430 #endif
13431 static int
13432 S_yywarn(pTHX_ const char *const s)
13433 {
13434     dVAR;
13435
13436     PERL_ARGS_ASSERT_YYWARN;
13437
13438     PL_in_eval |= EVAL_WARNONLY;
13439     yyerror(s);
13440     PL_in_eval &= ~EVAL_WARNONLY;
13441     return 0;
13442 }
13443
13444 int
13445 Perl_yyerror(pTHX_ const char *const s)
13446 {
13447     dVAR;
13448     const char *where = NULL;
13449     const char *context = NULL;
13450     int contlen = -1;
13451     SV *msg;
13452     int yychar  = PL_parser->yychar;
13453
13454     PERL_ARGS_ASSERT_YYERROR;
13455
13456     if (!yychar || (yychar == ';' && !PL_rsfp))
13457         where = "at EOF";
13458     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
13459       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
13460       PL_oldbufptr != PL_bufptr) {
13461         /*
13462                 Only for NetWare:
13463                 The code below is removed for NetWare because it abends/crashes on NetWare
13464                 when the script has error such as not having the closing quotes like:
13465                     if ($var eq "value)
13466                 Checking of white spaces is anyway done in NetWare code.
13467         */
13468 #ifndef NETWARE
13469         while (isSPACE(*PL_oldoldbufptr))
13470             PL_oldoldbufptr++;
13471 #endif
13472         context = PL_oldoldbufptr;
13473         contlen = PL_bufptr - PL_oldoldbufptr;
13474     }
13475     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
13476       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
13477         /*
13478                 Only for NetWare:
13479                 The code below is removed for NetWare because it abends/crashes on NetWare
13480                 when the script has error such as not having the closing quotes like:
13481                     if ($var eq "value)
13482                 Checking of white spaces is anyway done in NetWare code.
13483         */
13484 #ifndef NETWARE
13485         while (isSPACE(*PL_oldbufptr))
13486             PL_oldbufptr++;
13487 #endif
13488         context = PL_oldbufptr;
13489         contlen = PL_bufptr - PL_oldbufptr;
13490     }
13491     else if (yychar > 255)
13492         where = "next token ???";
13493     else if (yychar == -2) { /* YYEMPTY */
13494         if (PL_lex_state == LEX_NORMAL ||
13495            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
13496             where = "at end of line";
13497         else if (PL_lex_inpat)
13498             where = "within pattern";
13499         else
13500             where = "within string";
13501     }
13502     else {
13503         SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
13504         if (yychar < 32)
13505             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
13506         else if (isPRINT_LC(yychar)) {
13507             const char string = yychar;
13508             sv_catpvn(where_sv, &string, 1);
13509         }
13510         else
13511             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
13512         where = SvPVX_const(where_sv);
13513     }
13514     msg = sv_2mortal(newSVpv(s, 0));
13515     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
13516         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
13517     if (context)
13518         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
13519     else
13520         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
13521     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
13522         Perl_sv_catpvf(aTHX_ msg,
13523         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
13524                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
13525         PL_multi_end = 0;
13526     }
13527     if (PL_in_eval & EVAL_WARNONLY) {
13528         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
13529     }
13530     else
13531         qerror(msg);
13532     if (PL_error_count >= 10) {
13533         if (PL_in_eval && SvCUR(ERRSV))
13534             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
13535                        SVfARG(ERRSV), OutCopFILE(PL_curcop));
13536         else
13537             Perl_croak(aTHX_ "%s has too many errors.\n",
13538             OutCopFILE(PL_curcop));
13539     }
13540     PL_in_my = 0;
13541     PL_in_my_stash = NULL;
13542     return 0;
13543 }
13544 #ifdef __SC__
13545 #pragma segment Main
13546 #endif
13547
13548 STATIC char*
13549 S_swallow_bom(pTHX_ U8 *s)
13550 {
13551     dVAR;
13552     const STRLEN slen = SvCUR(PL_linestr);
13553
13554     PERL_ARGS_ASSERT_SWALLOW_BOM;
13555
13556     switch (s[0]) {
13557     case 0xFF:
13558         if (s[1] == 0xFE) {
13559             /* UTF-16 little-endian? (or UTF-32LE?) */
13560             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
13561                 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
13562 #ifndef PERL_NO_UTF16_FILTER
13563             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
13564             s += 2;
13565             if (PL_bufend > (char*)s) {
13566                 s = add_utf16_textfilter(s, TRUE);
13567             }
13568 #else
13569             Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13570 #endif
13571         }
13572         break;
13573     case 0xFE:
13574         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
13575 #ifndef PERL_NO_UTF16_FILTER
13576             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
13577             s += 2;
13578             if (PL_bufend > (char *)s) {
13579                 s = add_utf16_textfilter(s, FALSE);
13580             }
13581 #else
13582             Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13583 #endif
13584         }
13585         break;
13586     case 0xEF:
13587         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
13588             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13589             s += 3;                      /* UTF-8 */
13590         }
13591         break;
13592     case 0:
13593         if (slen > 3) {
13594              if (s[1] == 0) {
13595                   if (s[2] == 0xFE && s[3] == 0xFF) {
13596                        /* UTF-32 big-endian */
13597                        Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
13598                   }
13599              }
13600              else if (s[2] == 0 && s[3] != 0) {
13601                   /* Leading bytes
13602                    * 00 xx 00 xx
13603                    * are a good indicator of UTF-16BE. */
13604 #ifndef PERL_NO_UTF16_FILTER
13605                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
13606                   s = add_utf16_textfilter(s, FALSE);
13607 #else
13608                   Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13609 #endif
13610              }
13611         }
13612 #ifdef EBCDIC
13613     case 0xDD:
13614         if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
13615             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13616             s += 4;                      /* UTF-8 */
13617         }
13618         break;
13619 #endif
13620
13621     default:
13622          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
13623                   /* Leading bytes
13624                    * xx 00 xx 00
13625                    * are a good indicator of UTF-16LE. */
13626 #ifndef PERL_NO_UTF16_FILTER
13627               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
13628               s = add_utf16_textfilter(s, TRUE);
13629 #else
13630               Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13631 #endif
13632          }
13633     }
13634     return (char*)s;
13635 }
13636
13637
13638 #ifndef PERL_NO_UTF16_FILTER
13639 static I32
13640 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
13641 {
13642     dVAR;
13643     SV *const filter = FILTER_DATA(idx);
13644     /* We re-use this each time round, throwing the contents away before we
13645        return.  */
13646     SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
13647     SV *const utf8_buffer = filter;
13648     IV status = IoPAGE(filter);
13649     const bool reverse = (bool) IoLINES(filter);
13650     I32 retval;
13651
13652     /* As we're automatically added, at the lowest level, and hence only called
13653        from this file, we can be sure that we're not called in block mode. Hence
13654        don't bother writing code to deal with block mode.  */
13655     if (maxlen) {
13656         Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
13657     }
13658     if (status < 0) {
13659         Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
13660     }
13661     DEBUG_P(PerlIO_printf(Perl_debug_log,
13662                           "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13663                           FPTR2DPTR(void *, S_utf16_textfilter),
13664                           reverse ? 'l' : 'b', idx, maxlen, status,
13665                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13666
13667     while (1) {
13668         STRLEN chars;
13669         STRLEN have;
13670         I32 newlen;
13671         U8 *end;
13672         /* First, look in our buffer of existing UTF-8 data:  */
13673         char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
13674
13675         if (nl) {
13676             ++nl;
13677         } else if (status == 0) {
13678             /* EOF */
13679             IoPAGE(filter) = 0;
13680             nl = SvEND(utf8_buffer);
13681         }
13682         if (nl) {
13683             STRLEN got = nl - SvPVX(utf8_buffer);
13684             /* Did we have anything to append?  */
13685             retval = got != 0;
13686             sv_catpvn(sv, SvPVX(utf8_buffer), got);
13687             /* Everything else in this code works just fine if SVp_POK isn't
13688                set.  This, however, needs it, and we need it to work, else
13689                we loop infinitely because the buffer is never consumed.  */
13690             sv_chop(utf8_buffer, nl);
13691             break;
13692         }
13693
13694         /* OK, not a complete line there, so need to read some more UTF-16.
13695            Read an extra octect if the buffer currently has an odd number. */
13696         while (1) {
13697             if (status <= 0)
13698                 break;
13699             if (SvCUR(utf16_buffer) >= 2) {
13700                 /* Location of the high octet of the last complete code point.
13701                    Gosh, UTF-16 is a pain. All the benefits of variable length,
13702                    *coupled* with all the benefits of partial reads and
13703                    endianness.  */
13704                 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
13705                     + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
13706
13707                 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
13708                     break;
13709                 }
13710
13711                 /* We have the first half of a surrogate. Read more.  */
13712                 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
13713             }
13714
13715             status = FILTER_READ(idx + 1, utf16_buffer,
13716                                  160 + (SvCUR(utf16_buffer) & 1));
13717             DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
13718             DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
13719             if (status < 0) {
13720                 /* Error */
13721                 IoPAGE(filter) = status;
13722                 return status;
13723             }
13724         }
13725
13726         chars = SvCUR(utf16_buffer) >> 1;
13727         have = SvCUR(utf8_buffer);
13728         SvGROW(utf8_buffer, have + chars * 3 + 1);
13729
13730         if (reverse) {
13731             end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
13732                                          (U8*)SvPVX_const(utf8_buffer) + have,
13733                                          chars * 2, &newlen);
13734         } else {
13735             end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
13736                                 (U8*)SvPVX_const(utf8_buffer) + have,
13737                                 chars * 2, &newlen);
13738         }
13739         SvCUR_set(utf8_buffer, have + newlen);
13740         *end = '\0';
13741
13742         /* No need to keep this SV "well-formed" with a '\0' after the end, as
13743            it's private to us, and utf16_to_utf8{,reversed} take a
13744            (pointer,length) pair, rather than a NUL-terminated string.  */
13745         if(SvCUR(utf16_buffer) & 1) {
13746             *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
13747             SvCUR_set(utf16_buffer, 1);
13748         } else {
13749             SvCUR_set(utf16_buffer, 0);
13750         }
13751     }
13752     DEBUG_P(PerlIO_printf(Perl_debug_log,
13753                           "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13754                           status,
13755                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13756     DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
13757     return retval;
13758 }
13759
13760 static U8 *
13761 S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
13762 {
13763     SV *filter = filter_add(S_utf16_textfilter, NULL);
13764
13765     IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
13766     sv_setpvs(filter, "");
13767     IoLINES(filter) = reversed;
13768     IoPAGE(filter) = 1; /* Not EOF */
13769
13770     /* Sadly, we have to return a valid pointer, come what may, so we have to
13771        ignore any error return from this.  */
13772     SvCUR_set(PL_linestr, 0);
13773     if (FILTER_READ(0, PL_linestr, 0)) {
13774         SvUTF8_on(PL_linestr);
13775     } else {
13776         SvUTF8_on(PL_linestr);
13777     }
13778     PL_bufend = SvEND(PL_linestr);
13779     return (U8*)SvPVX(PL_linestr);
13780 }
13781 #endif
13782
13783 /*
13784 Returns a pointer to the next character after the parsed
13785 vstring, as well as updating the passed in sv.
13786
13787 Function must be called like
13788
13789         sv = newSV(5);
13790         s = scan_vstring(s,e,sv);
13791
13792 where s and e are the start and end of the string.
13793 The sv should already be large enough to store the vstring
13794 passed in, for performance reasons.
13795
13796 */
13797
13798 char *
13799 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
13800 {
13801     dVAR;
13802     const char *pos = s;
13803     const char *start = s;
13804
13805     PERL_ARGS_ASSERT_SCAN_VSTRING;
13806
13807     if (*pos == 'v') pos++;  /* get past 'v' */
13808     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13809         pos++;
13810     if ( *pos != '.') {
13811         /* this may not be a v-string if followed by => */
13812         const char *next = pos;
13813         while (next < e && isSPACE(*next))
13814             ++next;
13815         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
13816             /* return string not v-string */
13817             sv_setpvn(sv,(char *)s,pos-s);
13818             return (char *)pos;
13819         }
13820     }
13821
13822     if (!isALPHA(*pos)) {
13823         U8 tmpbuf[UTF8_MAXBYTES+1];
13824
13825         if (*s == 'v')
13826             s++;  /* get past 'v' */
13827
13828         sv_setpvs(sv, "");
13829
13830         for (;;) {
13831             /* this is atoi() that tolerates underscores */
13832             U8 *tmpend;
13833             UV rev = 0;
13834             const char *end = pos;
13835             UV mult = 1;
13836             while (--end >= s) {
13837                 if (*end != '_') {
13838                     const UV orev = rev;
13839                     rev += (*end - '0') * mult;
13840                     mult *= 10;
13841                     if (orev > rev)
13842                         Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13843                                          "Integer overflow in decimal number");
13844                 }
13845             }
13846 #ifdef EBCDIC
13847             if (rev > 0x7FFFFFFF)
13848                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
13849 #endif
13850             /* Append native character for the rev point */
13851             tmpend = uvchr_to_utf8(tmpbuf, rev);
13852             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
13853             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
13854                  SvUTF8_on(sv);
13855             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
13856                  s = ++pos;
13857             else {
13858                  s = pos;
13859                  break;
13860             }
13861             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13862                  pos++;
13863         }
13864         SvPOK_on(sv);
13865         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
13866         SvRMAGICAL_on(sv);
13867     }
13868     return (char *)s;
13869 }
13870
13871 int
13872 Perl_keyword_plugin_standard(pTHX_
13873         char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
13874 {
13875     PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
13876     PERL_UNUSED_CONTEXT;
13877     PERL_UNUSED_ARG(keyword_ptr);
13878     PERL_UNUSED_ARG(keyword_len);
13879     PERL_UNUSED_ARG(op_ptr);
13880     return KEYWORD_PLUGIN_DECLINE;
13881 }
13882
13883 /*
13884  * Local variables:
13885  * c-indentation-style: bsd
13886  * c-basic-offset: 4
13887  * indent-tabs-mode: t
13888  * End:
13889  *
13890  * ex: set ts=8 sts=4 sw=4 noet:
13891  */