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