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