Allow arbitrary whitespace between NAME and VERSION in "package NAME VERSION;" statements
[p5sagit/p5-mst-13.2.git] / toke.c
1 /*    toke.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  *  'It all comes from here, the stench and the peril.'    --Frodo
13  *
14  *     [p.719 of _The Lord of the Rings_, IV/ix: "Shelob's Lair"]
15  */
16
17 /*
18  * This file is the lexer for Perl.  It's closely linked to the
19  * parser, perly.y.
20  *
21  * The main routine is yylex(), which returns the next token.
22  */
23
24 /*
25 =head1 Lexer interface
26
27 This is the lower layer of the Perl parser, managing characters and tokens.
28
29 =for apidoc AmU|yy_parser *|PL_parser
30
31 Pointer to a structure encapsulating the state of the parsing operation
32 currently in progress.  The pointer can be locally changed to perform
33 a nested parse without interfering with the state of an outer parse.
34 Individual members of C<PL_parser> have their own documentation.
35
36 =cut
37 */
38
39 #include "EXTERN.h"
40 #define PERL_IN_TOKE_C
41 #include "perl.h"
42
43 #define new_constant(a,b,c,d,e,f,g)     \
44         S_new_constant(aTHX_ a,b,STR_WITH_LEN(c),d,e,f, g)
45
46 #define pl_yylval       (PL_parser->yylval)
47
48 /* YYINITDEPTH -- initial size of the parser's stacks.  */
49 #define YYINITDEPTH 200
50
51 /* XXX temporary backwards compatibility */
52 #define PL_lex_brackets         (PL_parser->lex_brackets)
53 #define PL_lex_brackstack       (PL_parser->lex_brackstack)
54 #define PL_lex_casemods         (PL_parser->lex_casemods)
55 #define PL_lex_casestack        (PL_parser->lex_casestack)
56 #define PL_lex_defer            (PL_parser->lex_defer)
57 #define PL_lex_dojoin           (PL_parser->lex_dojoin)
58 #define PL_lex_expect           (PL_parser->lex_expect)
59 #define PL_lex_formbrack        (PL_parser->lex_formbrack)
60 #define PL_lex_inpat            (PL_parser->lex_inpat)
61 #define PL_lex_inwhat           (PL_parser->lex_inwhat)
62 #define PL_lex_op               (PL_parser->lex_op)
63 #define PL_lex_repl             (PL_parser->lex_repl)
64 #define PL_lex_starts           (PL_parser->lex_starts)
65 #define PL_lex_stuff            (PL_parser->lex_stuff)
66 #define PL_multi_start          (PL_parser->multi_start)
67 #define PL_multi_open           (PL_parser->multi_open)
68 #define PL_multi_close          (PL_parser->multi_close)
69 #define PL_pending_ident        (PL_parser->pending_ident)
70 #define PL_preambled            (PL_parser->preambled)
71 #define PL_sublex_info          (PL_parser->sublex_info)
72 #define PL_linestr              (PL_parser->linestr)
73 #define PL_expect               (PL_parser->expect)
74 #define PL_copline              (PL_parser->copline)
75 #define PL_bufptr               (PL_parser->bufptr)
76 #define PL_oldbufptr            (PL_parser->oldbufptr)
77 #define PL_oldoldbufptr         (PL_parser->oldoldbufptr)
78 #define PL_linestart            (PL_parser->linestart)
79 #define PL_bufend               (PL_parser->bufend)
80 #define PL_last_uni             (PL_parser->last_uni)
81 #define PL_last_lop             (PL_parser->last_lop)
82 #define PL_last_lop_op          (PL_parser->last_lop_op)
83 #define PL_lex_state            (PL_parser->lex_state)
84 #define PL_rsfp                 (PL_parser->rsfp)
85 #define PL_rsfp_filters         (PL_parser->rsfp_filters)
86 #define PL_in_my                (PL_parser->in_my)
87 #define PL_in_my_stash          (PL_parser->in_my_stash)
88 #define PL_tokenbuf             (PL_parser->tokenbuf)
89 #define PL_multi_end            (PL_parser->multi_end)
90 #define PL_error_count          (PL_parser->error_count)
91
92 #ifdef PERL_MAD
93 #  define PL_endwhite           (PL_parser->endwhite)
94 #  define PL_faketokens         (PL_parser->faketokens)
95 #  define PL_lasttoke           (PL_parser->lasttoke)
96 #  define PL_nextwhite          (PL_parser->nextwhite)
97 #  define PL_realtokenstart     (PL_parser->realtokenstart)
98 #  define PL_skipwhite          (PL_parser->skipwhite)
99 #  define PL_thisclose          (PL_parser->thisclose)
100 #  define PL_thismad            (PL_parser->thismad)
101 #  define PL_thisopen           (PL_parser->thisopen)
102 #  define PL_thisstuff          (PL_parser->thisstuff)
103 #  define PL_thistoken          (PL_parser->thistoken)
104 #  define PL_thiswhite          (PL_parser->thiswhite)
105 #  define PL_thiswhite          (PL_parser->thiswhite)
106 #  define PL_nexttoke           (PL_parser->nexttoke)
107 #  define PL_curforce           (PL_parser->curforce)
108 #else
109 #  define PL_nexttoke           (PL_parser->nexttoke)
110 #  define PL_nexttype           (PL_parser->nexttype)
111 #  define PL_nextval            (PL_parser->nextval)
112 #endif
113
114 /* This can't be done with embed.fnc, because struct yy_parser contains a
115    member named pending_ident, which clashes with the generated #define  */
116 static int
117 S_pending_ident(pTHX);
118
119 static const char ident_too_long[] = "Identifier too long";
120
121 #ifdef PERL_MAD
122 #  define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
123 #  define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
124 #else
125 #  define CURMAD(slot,sv)
126 #  define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
127 #endif
128
129 #define XFAKEBRACK 128
130 #define XENUMMASK 127
131
132 #ifdef USE_UTF8_SCRIPTS
133 #   define UTF (!IN_BYTES)
134 #else
135 #   define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
136 #endif
137
138 /* The maximum number of characters preceding the unrecognized one to display */
139 #define UNRECOGNIZED_PRECEDE_COUNT 10
140
141 /* In variables named $^X, these are the legal values for X.
142  * 1999-02-27 mjd-perl-patch@plover.com */
143 #define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
144
145 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
146
147 /* LEX_* are values for PL_lex_state, the state of the lexer.
148  * They are arranged oddly so that the guard on the switch statement
149  * can get by with a single comparison (if the compiler is smart enough).
150  */
151
152 /* #define LEX_NOTPARSING               11 is done in perl.h. */
153
154 #define LEX_NORMAL              10 /* normal code (ie not within "...")     */
155 #define LEX_INTERPNORMAL         9 /* code within a string, eg "$foo[$x+1]" */
156 #define LEX_INTERPCASEMOD        8 /* expecting a \U, \Q or \E etc          */
157 #define LEX_INTERPPUSH           7 /* starting a new sublex parse level     */
158 #define LEX_INTERPSTART          6 /* expecting the start of a $var         */
159
160                                    /* at end of code, eg "$x" followed by:  */
161 #define LEX_INTERPEND            5 /* ... eg not one of [, { or ->          */
162 #define LEX_INTERPENDMAYBE       4 /* ... eg one of [, { or ->              */
163
164 #define LEX_INTERPCONCAT         3 /* expecting anything, eg at start of
165                                         string or after \E, $foo, etc       */
166 #define LEX_INTERPCONST          2 /* NOT USED */
167 #define LEX_FORMLINE             1 /* expecting a format line               */
168 #define LEX_KNOWNEXT             0 /* next token known; just return it      */
169
170
171 #ifdef DEBUGGING
172 static const char* const lex_state_names[] = {
173     "KNOWNEXT",
174     "FORMLINE",
175     "INTERPCONST",
176     "INTERPCONCAT",
177     "INTERPENDMAYBE",
178     "INTERPEND",
179     "INTERPSTART",
180     "INTERPPUSH",
181     "INTERPCASEMOD",
182     "INTERPNORMAL",
183     "NORMAL"
184 };
185 #endif
186
187 #ifdef ff_next
188 #undef ff_next
189 #endif
190
191 #include "keywords.h"
192
193 /* CLINE is a macro that ensures PL_copline has a sane value */
194
195 #ifdef CLINE
196 #undef CLINE
197 #endif
198 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
199
200 #ifdef PERL_MAD
201 #  define SKIPSPACE0(s) skipspace0(s)
202 #  define SKIPSPACE1(s) skipspace1(s)
203 #  define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
204 #  define PEEKSPACE(s) skipspace2(s,0)
205 #else
206 #  define SKIPSPACE0(s) skipspace(s)
207 #  define SKIPSPACE1(s) skipspace(s)
208 #  define SKIPSPACE2(s,tsv) skipspace(s)
209 #  define PEEKSPACE(s) skipspace(s)
210 #endif
211
212 /*
213  * Convenience functions to return different tokens and prime the
214  * lexer for the next token.  They all take an argument.
215  *
216  * TOKEN        : generic token (used for '(', DOLSHARP, etc)
217  * OPERATOR     : generic operator
218  * AOPERATOR    : assignment operator
219  * PREBLOCK     : beginning the block after an if, while, foreach, ...
220  * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
221  * PREREF       : *EXPR where EXPR is not a simple identifier
222  * TERM         : expression term
223  * LOOPX        : loop exiting command (goto, last, dump, etc)
224  * FTST         : file test operator
225  * FUN0         : zero-argument function
226  * FUN1         : not used, except for not, which isn't a UNIOP
227  * BOop         : bitwise or or xor
228  * BAop         : bitwise and
229  * SHop         : shift operator
230  * PWop         : power operator
231  * PMop         : pattern-matching operator
232  * Aop          : addition-level operator
233  * Mop          : multiplication-level operator
234  * Eop          : equality-testing operator
235  * Rop          : relational operator <= != gt
236  *
237  * Also see LOP and lop() below.
238  */
239
240 #ifdef DEBUGGING /* Serve -DT. */
241 #   define REPORT(retval) tokereport((I32)retval, &pl_yylval)
242 #else
243 #   define REPORT(retval) (retval)
244 #endif
245
246 #define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
247 #define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
248 #define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
249 #define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
250 #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
251 #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
252 #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
253 #define LOOPX(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
254 #define FTST(f)  return (pl_yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
255 #define FUN0(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
256 #define FUN1(f)  return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
257 #define BOop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
258 #define BAop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
259 #define SHop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
260 #define PWop(f)  return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
261 #define PMop(f)  return(pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
262 #define Aop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
263 #define Mop(f)   return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
264 #define Eop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
265 #define Rop(f)   return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
266
267 /* This bit of chicanery makes a unary function followed by
268  * a parenthesis into a function with one argument, highest precedence.
269  * The UNIDOR macro is for unary functions that can be followed by the //
270  * operator (such as C<shift // 0>).
271  */
272 #define UNI2(f,x) { \
273         pl_yylval.ival = f; \
274         PL_expect = x; \
275         PL_bufptr = s; \
276         PL_last_uni = PL_oldbufptr; \
277         PL_last_lop_op = f; \
278         if (*s == '(') \
279             return REPORT( (int)FUNC1 ); \
280         s = PEEKSPACE(s); \
281         return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
282         }
283 #define UNI(f)    UNI2(f,XTERM)
284 #define UNIDOR(f) UNI2(f,XTERMORDORDOR)
285
286 #define UNIBRACK(f) { \
287         pl_yylval.ival = f; \
288         PL_bufptr = s; \
289         PL_last_uni = PL_oldbufptr; \
290         if (*s == '(') \
291             return REPORT( (int)FUNC1 ); \
292         s = PEEKSPACE(s); \
293         return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
294         }
295
296 /* grandfather return to old style */
297 #define OLDLOP(f) return(pl_yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
298
299 #ifdef DEBUGGING
300
301 /* how to interpret the pl_yylval associated with the token */
302 enum token_type {
303     TOKENTYPE_NONE,
304     TOKENTYPE_IVAL,
305     TOKENTYPE_OPNUM, /* pl_yylval.ival contains an opcode number */
306     TOKENTYPE_PVAL,
307     TOKENTYPE_OPVAL,
308     TOKENTYPE_GVVAL
309 };
310
311 static struct debug_tokens {
312     const int token;
313     enum token_type type;
314     const char *name;
315 } const debug_tokens[] =
316 {
317     { ADDOP,            TOKENTYPE_OPNUM,        "ADDOP" },
318     { ANDAND,           TOKENTYPE_NONE,         "ANDAND" },
319     { ANDOP,            TOKENTYPE_NONE,         "ANDOP" },
320     { ANONSUB,          TOKENTYPE_IVAL,         "ANONSUB" },
321     { ARROW,            TOKENTYPE_NONE,         "ARROW" },
322     { ASSIGNOP,         TOKENTYPE_OPNUM,        "ASSIGNOP" },
323     { BITANDOP,         TOKENTYPE_OPNUM,        "BITANDOP" },
324     { BITOROP,          TOKENTYPE_OPNUM,        "BITOROP" },
325     { COLONATTR,        TOKENTYPE_NONE,         "COLONATTR" },
326     { CONTINUE,         TOKENTYPE_NONE,         "CONTINUE" },
327     { DEFAULT,          TOKENTYPE_NONE,         "DEFAULT" },
328     { DO,               TOKENTYPE_NONE,         "DO" },
329     { DOLSHARP,         TOKENTYPE_NONE,         "DOLSHARP" },
330     { DORDOR,           TOKENTYPE_NONE,         "DORDOR" },
331     { DOROP,            TOKENTYPE_OPNUM,        "DOROP" },
332     { DOTDOT,           TOKENTYPE_IVAL,         "DOTDOT" },
333     { ELSE,             TOKENTYPE_NONE,         "ELSE" },
334     { ELSIF,            TOKENTYPE_IVAL,         "ELSIF" },
335     { EQOP,             TOKENTYPE_OPNUM,        "EQOP" },
336     { FOR,              TOKENTYPE_IVAL,         "FOR" },
337     { FORMAT,           TOKENTYPE_NONE,         "FORMAT" },
338     { FUNC,             TOKENTYPE_OPNUM,        "FUNC" },
339     { FUNC0,            TOKENTYPE_OPNUM,        "FUNC0" },
340     { FUNC0SUB,         TOKENTYPE_OPVAL,        "FUNC0SUB" },
341     { FUNC1,            TOKENTYPE_OPNUM,        "FUNC1" },
342     { FUNCMETH,         TOKENTYPE_OPVAL,        "FUNCMETH" },
343     { GIVEN,            TOKENTYPE_IVAL,         "GIVEN" },
344     { HASHBRACK,        TOKENTYPE_NONE,         "HASHBRACK" },
345     { IF,               TOKENTYPE_IVAL,         "IF" },
346     { LABEL,            TOKENTYPE_PVAL,         "LABEL" },
347     { LOCAL,            TOKENTYPE_IVAL,         "LOCAL" },
348     { LOOPEX,           TOKENTYPE_OPNUM,        "LOOPEX" },
349     { LSTOP,            TOKENTYPE_OPNUM,        "LSTOP" },
350     { LSTOPSUB,         TOKENTYPE_OPVAL,        "LSTOPSUB" },
351     { MATCHOP,          TOKENTYPE_OPNUM,        "MATCHOP" },
352     { METHOD,           TOKENTYPE_OPVAL,        "METHOD" },
353     { MULOP,            TOKENTYPE_OPNUM,        "MULOP" },
354     { MY,               TOKENTYPE_IVAL,         "MY" },
355     { MYSUB,            TOKENTYPE_NONE,         "MYSUB" },
356     { NOAMP,            TOKENTYPE_NONE,         "NOAMP" },
357     { NOTOP,            TOKENTYPE_NONE,         "NOTOP" },
358     { OROP,             TOKENTYPE_IVAL,         "OROP" },
359     { OROR,             TOKENTYPE_NONE,         "OROR" },
360     { PACKAGE,          TOKENTYPE_NONE,         "PACKAGE" },
361     { PLUGEXPR,         TOKENTYPE_OPVAL,        "PLUGEXPR" },
362     { PLUGSTMT,         TOKENTYPE_OPVAL,        "PLUGSTMT" },
363     { PMFUNC,           TOKENTYPE_OPVAL,        "PMFUNC" },
364     { POSTDEC,          TOKENTYPE_NONE,         "POSTDEC" },
365     { POSTINC,          TOKENTYPE_NONE,         "POSTINC" },
366     { POWOP,            TOKENTYPE_OPNUM,        "POWOP" },
367     { PREDEC,           TOKENTYPE_NONE,         "PREDEC" },
368     { PREINC,           TOKENTYPE_NONE,         "PREINC" },
369     { PRIVATEREF,       TOKENTYPE_OPVAL,        "PRIVATEREF" },
370     { REFGEN,           TOKENTYPE_NONE,         "REFGEN" },
371     { RELOP,            TOKENTYPE_OPNUM,        "RELOP" },
372     { SHIFTOP,          TOKENTYPE_OPNUM,        "SHIFTOP" },
373     { SUB,              TOKENTYPE_NONE,         "SUB" },
374     { THING,            TOKENTYPE_OPVAL,        "THING" },
375     { UMINUS,           TOKENTYPE_NONE,         "UMINUS" },
376     { UNIOP,            TOKENTYPE_OPNUM,        "UNIOP" },
377     { UNIOPSUB,         TOKENTYPE_OPVAL,        "UNIOPSUB" },
378     { UNLESS,           TOKENTYPE_IVAL,         "UNLESS" },
379     { UNTIL,            TOKENTYPE_IVAL,         "UNTIL" },
380     { USE,              TOKENTYPE_IVAL,         "USE" },
381     { WHEN,             TOKENTYPE_IVAL,         "WHEN" },
382     { WHILE,            TOKENTYPE_IVAL,         "WHILE" },
383     { WORD,             TOKENTYPE_OPVAL,        "WORD" },
384     { YADAYADA,         TOKENTYPE_IVAL,         "YADAYADA" },
385     { 0,                TOKENTYPE_NONE,         NULL }
386 };
387
388 /* dump the returned token in rv, plus any optional arg in pl_yylval */
389
390 STATIC int
391 S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
392 {
393     dVAR;
394
395     PERL_ARGS_ASSERT_TOKEREPORT;
396
397     if (DEBUG_T_TEST) {
398         const char *name = NULL;
399         enum token_type type = TOKENTYPE_NONE;
400         const struct debug_tokens *p;
401         SV* const report = newSVpvs("<== ");
402
403         for (p = debug_tokens; p->token; p++) {
404             if (p->token == (int)rv) {
405                 name = p->name;
406                 type = p->type;
407                 break;
408             }
409         }
410         if (name)
411             Perl_sv_catpv(aTHX_ report, name);
412         else if ((char)rv > ' ' && (char)rv < '~')
413             Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
414         else if (!rv)
415             sv_catpvs(report, "EOF");
416         else
417             Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
418         switch (type) {
419         case TOKENTYPE_NONE:
420         case TOKENTYPE_GVVAL: /* doesn't appear to be used */
421             break;
422         case TOKENTYPE_IVAL:
423             Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)lvalp->ival);
424             break;
425         case TOKENTYPE_OPNUM:
426             Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
427                                     PL_op_name[lvalp->ival]);
428             break;
429         case TOKENTYPE_PVAL:
430             Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval);
431             break;
432         case TOKENTYPE_OPVAL:
433             if (lvalp->opval) {
434                 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
435                                     PL_op_name[lvalp->opval->op_type]);
436                 if (lvalp->opval->op_type == OP_CONST) {
437                     Perl_sv_catpvf(aTHX_ report, " %s",
438                         SvPEEK(cSVOPx_sv(lvalp->opval)));
439                 }
440
441             }
442             else
443                 sv_catpvs(report, "(opval=null)");
444             break;
445         }
446         PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
447     };
448     return (int)rv;
449 }
450
451
452 /* print the buffer with suitable escapes */
453
454 STATIC void
455 S_printbuf(pTHX_ const char *const fmt, const char *const s)
456 {
457     SV* const tmp = newSVpvs("");
458
459     PERL_ARGS_ASSERT_PRINTBUF;
460
461     PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
462     SvREFCNT_dec(tmp);
463 }
464
465 #endif
466
467 static int
468 S_deprecate_commaless_var_list(pTHX) {
469     PL_expect = XTERM;
470     deprecate("comma-less variable list");
471     return REPORT(','); /* grandfather non-comma-format format */
472 }
473
474 /*
475  * S_ao
476  *
477  * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
478  * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
479  */
480
481 STATIC int
482 S_ao(pTHX_ int toketype)
483 {
484     dVAR;
485     if (*PL_bufptr == '=') {
486         PL_bufptr++;
487         if (toketype == ANDAND)
488             pl_yylval.ival = OP_ANDASSIGN;
489         else if (toketype == OROR)
490             pl_yylval.ival = OP_ORASSIGN;
491         else if (toketype == DORDOR)
492             pl_yylval.ival = OP_DORASSIGN;
493         toketype = ASSIGNOP;
494     }
495     return toketype;
496 }
497
498 /*
499  * S_no_op
500  * When Perl expects an operator and finds something else, no_op
501  * prints the warning.  It always prints "<something> found where
502  * operator expected.  It prints "Missing semicolon on previous line?"
503  * if the surprise occurs at the start of the line.  "do you need to
504  * predeclare ..." is printed out for code like "sub bar; foo bar $x"
505  * where the compiler doesn't know if foo is a method call or a function.
506  * It prints "Missing operator before end of line" if there's nothing
507  * after the missing operator, or "... before <...>" if there is something
508  * after the missing operator.
509  */
510
511 STATIC void
512 S_no_op(pTHX_ const char *const what, char *s)
513 {
514     dVAR;
515     char * const oldbp = PL_bufptr;
516     const bool is_first = (PL_oldbufptr == PL_linestart);
517
518     PERL_ARGS_ASSERT_NO_OP;
519
520     if (!s)
521         s = oldbp;
522     else
523         PL_bufptr = s;
524     yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
525     if (ckWARN_d(WARN_SYNTAX)) {
526         if (is_first)
527             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
528                     "\t(Missing semicolon on previous line?)\n");
529         else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
530             const char *t;
531             for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
532                 NOOP;
533             if (t < PL_bufptr && isSPACE(*t))
534                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
535                         "\t(Do you need to predeclare %.*s?)\n",
536                     (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
537         }
538         else {
539             assert(s >= oldbp);
540             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
541                     "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
542         }
543     }
544     PL_bufptr = oldbp;
545 }
546
547 /*
548  * S_missingterm
549  * Complain about missing quote/regexp/heredoc terminator.
550  * If it's called with NULL then it cauterizes the line buffer.
551  * If we're in a delimited string and the delimiter is a control
552  * character, it's reformatted into a two-char sequence like ^C.
553  * This is fatal.
554  */
555
556 STATIC void
557 S_missingterm(pTHX_ char *s)
558 {
559     dVAR;
560     char tmpbuf[3];
561     char q;
562     if (s) {
563         char * const nl = strrchr(s,'\n');
564         if (nl)
565             *nl = '\0';
566     }
567     else if (isCNTRL(PL_multi_close)) {
568         *tmpbuf = '^';
569         tmpbuf[1] = (char)toCTRL(PL_multi_close);
570         tmpbuf[2] = '\0';
571         s = tmpbuf;
572     }
573     else {
574         *tmpbuf = (char)PL_multi_close;
575         tmpbuf[1] = '\0';
576         s = tmpbuf;
577     }
578     q = strchr(s,'"') ? '\'' : '"';
579     Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
580 }
581
582 #define FEATURE_IS_ENABLED(name)                                        \
583         ((0 != (PL_hints & HINT_LOCALIZE_HH))                           \
584             && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
585 /* The longest string we pass in.  */
586 #define MAX_FEATURE_LEN (sizeof("unicode_strings")-1)
587
588 /*
589  * S_feature_is_enabled
590  * Check whether the named feature is enabled.
591  */
592 STATIC bool
593 S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
594 {
595     dVAR;
596     HV * const hinthv = GvHV(PL_hintgv);
597     char he_name[8 + MAX_FEATURE_LEN] = "feature_";
598
599     PERL_ARGS_ASSERT_FEATURE_IS_ENABLED;
600
601     assert(namelen <= MAX_FEATURE_LEN);
602     memcpy(&he_name[8], name, namelen);
603
604     return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
605 }
606
607 /*
608  * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
609  * utf16-to-utf8-reversed.
610  */
611
612 #ifdef PERL_CR_FILTER
613 static void
614 strip_return(SV *sv)
615 {
616     register const char *s = SvPVX_const(sv);
617     register const char * const e = s + SvCUR(sv);
618
619     PERL_ARGS_ASSERT_STRIP_RETURN;
620
621     /* outer loop optimized to do nothing if there are no CR-LFs */
622     while (s < e) {
623         if (*s++ == '\r' && *s == '\n') {
624             /* hit a CR-LF, need to copy the rest */
625             register char *d = s - 1;
626             *d++ = *s++;
627             while (s < e) {
628                 if (*s == '\r' && s[1] == '\n')
629                     s++;
630                 *d++ = *s++;
631             }
632             SvCUR(sv) -= s - d;
633             return;
634         }
635     }
636 }
637
638 STATIC I32
639 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
640 {
641     const I32 count = FILTER_READ(idx+1, sv, maxlen);
642     if (count > 0 && !maxlen)
643         strip_return(sv);
644     return count;
645 }
646 #endif
647
648
649
650 /*
651  * Perl_lex_start
652  *
653  * Create a parser object and initialise its parser and lexer fields
654  *
655  * rsfp       is the opened file handle to read from (if any),
656  *
657  * line       holds any initial content already read from the file (or in
658  *            the case of no file, such as an eval, the whole contents);
659  *
660  * new_filter indicates that this is a new file and it shouldn't inherit
661  *            the filters from the current parser (ie require).
662  */
663
664 void
665 Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, bool new_filter)
666 {
667     dVAR;
668     const char *s = NULL;
669     STRLEN len;
670     yy_parser *parser, *oparser;
671
672     /* create and initialise a parser */
673
674     Newxz(parser, 1, yy_parser);
675     parser->old_parser = oparser = PL_parser;
676     PL_parser = parser;
677
678     Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
679     parser->ps = parser->stack;
680     parser->stack_size = YYINITDEPTH;
681
682     parser->stack->state = 0;
683     parser->yyerrstatus = 0;
684     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
685
686     /* on scope exit, free this parser and restore any outer one */
687     SAVEPARSER(parser);
688     parser->saved_curcop = PL_curcop;
689
690     /* initialise lexer state */
691
692 #ifdef PERL_MAD
693     parser->curforce = -1;
694 #else
695     parser->nexttoke = 0;
696 #endif
697     parser->error_count = oparser ? oparser->error_count : 0;
698     parser->copline = NOLINE;
699     parser->lex_state = LEX_NORMAL;
700     parser->expect = XSTATE;
701     parser->rsfp = rsfp;
702     parser->rsfp_filters = (new_filter || !oparser) ? newAV()
703                 : MUTABLE_AV(SvREFCNT_inc(oparser->rsfp_filters));
704
705     Newx(parser->lex_brackstack, 120, char);
706     Newx(parser->lex_casestack, 12, char);
707     *parser->lex_casestack = '\0';
708
709     if (line) {
710         s = SvPV_const(line, len);
711     } else {
712         len = 0;
713     }
714
715     if (!len) {
716         parser->linestr = newSVpvs("\n;");
717     } else if (SvREADONLY(line) || s[len-1] != ';') {
718         parser->linestr = newSVsv(line);
719         if (s[len-1] != ';')
720             sv_catpvs(parser->linestr, "\n;");
721     } else {
722         SvTEMP_off(line);
723         SvREFCNT_inc_simple_void_NN(line);
724         parser->linestr = line;
725     }
726     parser->oldoldbufptr =
727         parser->oldbufptr =
728         parser->bufptr =
729         parser->linestart = SvPVX(parser->linestr);
730     parser->bufend = parser->bufptr + SvCUR(parser->linestr);
731     parser->last_lop = parser->last_uni = NULL;
732 }
733
734
735 /* delete a parser object */
736
737 void
738 Perl_parser_free(pTHX_  const yy_parser *parser)
739 {
740     PERL_ARGS_ASSERT_PARSER_FREE;
741
742     PL_curcop = parser->saved_curcop;
743     SvREFCNT_dec(parser->linestr);
744
745     if (parser->rsfp == PerlIO_stdin())
746         PerlIO_clearerr(parser->rsfp);
747     else if (parser->rsfp && (!parser->old_parser ||
748                 (parser->old_parser && parser->rsfp != parser->old_parser->rsfp)))
749         PerlIO_close(parser->rsfp);
750     SvREFCNT_dec(parser->rsfp_filters);
751
752     Safefree(parser->stack);
753     Safefree(parser->lex_brackstack);
754     Safefree(parser->lex_casestack);
755     PL_parser = parser->old_parser;
756     Safefree(parser);
757 }
758
759
760 /*
761  * Perl_lex_end
762  * Finalizer for lexing operations.  Must be called when the parser is
763  * done with the lexer.
764  */
765
766 void
767 Perl_lex_end(pTHX)
768 {
769     dVAR;
770     PL_doextract = FALSE;
771 }
772
773 /*
774 =for apidoc AmxU|SV *|PL_parser-E<gt>linestr
775
776 Buffer scalar containing the chunk currently under consideration of the
777 text currently being lexed.  This is always a plain string scalar (for
778 which C<SvPOK> is true).  It is not intended to be used as a scalar by
779 normal scalar means; instead refer to the buffer directly by the pointer
780 variables described below.
781
782 The lexer maintains various C<char*> pointers to things in the
783 C<PL_parser-E<gt>linestr> buffer.  If C<PL_parser-E<gt>linestr> is ever
784 reallocated, all of these pointers must be updated.  Don't attempt to
785 do this manually, but rather use L</lex_grow_linestr> if you need to
786 reallocate the buffer.
787
788 The content of the text chunk in the buffer is commonly exactly one
789 complete line of input, up to and including a newline terminator,
790 but there are situations where it is otherwise.  The octets of the
791 buffer may be intended to be interpreted as either UTF-8 or Latin-1.
792 The function L</lex_bufutf8> tells you which.  Do not use the C<SvUTF8>
793 flag on this scalar, which may disagree with it.
794
795 For direct examination of the buffer, the variable
796 L</PL_parser-E<gt>bufend> points to the end of the buffer.  The current
797 lexing position is pointed to by L</PL_parser-E<gt>bufptr>.  Direct use
798 of these pointers is usually preferable to examination of the scalar
799 through normal scalar means.
800
801 =for apidoc AmxU|char *|PL_parser-E<gt>bufend
802
803 Direct pointer to the end of the chunk of text currently being lexed, the
804 end of the lexer buffer.  This is equal to C<SvPVX(PL_parser-E<gt>linestr)
805 + SvCUR(PL_parser-E<gt>linestr)>.  A NUL character (zero octet) is
806 always located at the end of the buffer, and does not count as part of
807 the buffer's contents.
808
809 =for apidoc AmxU|char *|PL_parser-E<gt>bufptr
810
811 Points to the current position of lexing inside the lexer buffer.
812 Characters around this point may be freely examined, within
813 the range delimited by C<SvPVX(L</PL_parser-E<gt>linestr>)> and
814 L</PL_parser-E<gt>bufend>.  The octets of the buffer may be intended to be
815 interpreted as either UTF-8 or Latin-1, as indicated by L</lex_bufutf8>.
816
817 Lexing code (whether in the Perl core or not) moves this pointer past
818 the characters that it consumes.  It is also expected to perform some
819 bookkeeping whenever a newline character is consumed.  This movement
820 can be more conveniently performed by the function L</lex_read_to>,
821 which handles newlines appropriately.
822
823 Interpretation of the buffer's octets can be abstracted out by
824 using the slightly higher-level functions L</lex_peek_unichar> and
825 L</lex_read_unichar>.
826
827 =for apidoc AmxU|char *|PL_parser-E<gt>linestart
828
829 Points to the start of the current line inside the lexer buffer.
830 This is useful for indicating at which column an error occurred, and
831 not much else.  This must be updated by any lexing code that consumes
832 a newline; the function L</lex_read_to> handles this detail.
833
834 =cut
835 */
836
837 /*
838 =for apidoc Amx|bool|lex_bufutf8
839
840 Indicates whether the octets in the lexer buffer
841 (L</PL_parser-E<gt>linestr>) should be interpreted as the UTF-8 encoding
842 of Unicode characters.  If not, they should be interpreted as Latin-1
843 characters.  This is analogous to the C<SvUTF8> flag for scalars.
844
845 In UTF-8 mode, it is not guaranteed that the lexer buffer actually
846 contains valid UTF-8.  Lexing code must be robust in the face of invalid
847 encoding.
848
849 The actual C<SvUTF8> flag of the L</PL_parser-E<gt>linestr> scalar
850 is significant, but not the whole story regarding the input character
851 encoding.  Normally, when a file is being read, the scalar contains octets
852 and its C<SvUTF8> flag is off, but the octets should be interpreted as
853 UTF-8 if the C<use utf8> pragma is in effect.  During a string eval,
854 however, the scalar may have the C<SvUTF8> flag on, and in this case its
855 octets should be interpreted as UTF-8 unless the C<use bytes> pragma
856 is in effect.  This logic may change in the future; use this function
857 instead of implementing the logic yourself.
858
859 =cut
860 */
861
862 bool
863 Perl_lex_bufutf8(pTHX)
864 {
865     return UTF;
866 }
867
868 /*
869 =for apidoc Amx|char *|lex_grow_linestr|STRLEN len
870
871 Reallocates the lexer buffer (L</PL_parser-E<gt>linestr>) to accommodate
872 at least I<len> octets (including terminating NUL).  Returns a
873 pointer to the reallocated buffer.  This is necessary before making
874 any direct modification of the buffer that would increase its length.
875 L</lex_stuff_pvn> provides a more convenient way to insert text into
876 the buffer.
877
878 Do not use C<SvGROW> or C<sv_grow> directly on C<PL_parser-E<gt>linestr>;
879 this function updates all of the lexer's variables that point directly
880 into the buffer.
881
882 =cut
883 */
884
885 char *
886 Perl_lex_grow_linestr(pTHX_ STRLEN len)
887 {
888     SV *linestr;
889     char *buf;
890     STRLEN bufend_pos, bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
891     STRLEN linestart_pos, last_uni_pos, last_lop_pos;
892     linestr = PL_parser->linestr;
893     buf = SvPVX(linestr);
894     if (len <= SvLEN(linestr))
895         return buf;
896     bufend_pos = PL_parser->bufend - buf;
897     bufptr_pos = PL_parser->bufptr - buf;
898     oldbufptr_pos = PL_parser->oldbufptr - buf;
899     oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
900     linestart_pos = PL_parser->linestart - buf;
901     last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
902     last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
903     buf = sv_grow(linestr, len);
904     PL_parser->bufend = buf + bufend_pos;
905     PL_parser->bufptr = buf + bufptr_pos;
906     PL_parser->oldbufptr = buf + oldbufptr_pos;
907     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
908     PL_parser->linestart = buf + linestart_pos;
909     if (PL_parser->last_uni)
910         PL_parser->last_uni = buf + last_uni_pos;
911     if (PL_parser->last_lop)
912         PL_parser->last_lop = buf + last_lop_pos;
913     return buf;
914 }
915
916 /*
917 =for apidoc Amx|void|lex_stuff_pvn|char *pv|STRLEN len|U32 flags
918
919 Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
920 immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
921 reallocating the buffer if necessary.  This means that lexing code that
922 runs later will see the characters as if they had appeared in the input.
923 It is not recommended to do this as part of normal parsing, and most
924 uses of this facility run the risk of the inserted characters being
925 interpreted in an unintended manner.
926
927 The string to be inserted is represented by I<len> octets starting
928 at I<pv>.  These octets are interpreted as either UTF-8 or Latin-1,
929 according to whether the C<LEX_STUFF_UTF8> flag is set in I<flags>.
930 The characters are recoded for the lexer buffer, according to how the
931 buffer is currently being interpreted (L</lex_bufutf8>).  If a string
932 to be interpreted is available as a Perl scalar, the L</lex_stuff_sv>
933 function is more convenient.
934
935 =cut
936 */
937
938 void
939 Perl_lex_stuff_pvn(pTHX_ char *pv, STRLEN len, U32 flags)
940 {
941     char *bufptr;
942     PERL_ARGS_ASSERT_LEX_STUFF_PVN;
943     if (flags & ~(LEX_STUFF_UTF8))
944         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_pvn");
945     if (UTF) {
946         if (flags & LEX_STUFF_UTF8) {
947             goto plain_copy;
948         } else {
949             STRLEN highhalf = 0;
950             char *p, *e = pv+len;
951             for (p = pv; p != e; p++)
952                 highhalf += !!(((U8)*p) & 0x80);
953             if (!highhalf)
954                 goto plain_copy;
955             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len+highhalf);
956             bufptr = PL_parser->bufptr;
957             Move(bufptr, bufptr+len+highhalf, PL_parser->bufend+1-bufptr, char);
958             PL_parser->bufend += len+highhalf;
959             for (p = pv; p != e; p++) {
960                 U8 c = (U8)*p;
961                 if (c & 0x80) {
962                     *bufptr++ = (char)(0xc0 | (c >> 6));
963                     *bufptr++ = (char)(0x80 | (c & 0x3f));
964                 } else {
965                     *bufptr++ = (char)c;
966                 }
967             }
968         }
969     } else {
970         if (flags & LEX_STUFF_UTF8) {
971             STRLEN highhalf = 0;
972             char *p, *e = pv+len;
973             for (p = pv; p != e; p++) {
974                 U8 c = (U8)*p;
975                 if (c >= 0xc4) {
976                     Perl_croak(aTHX_ "Lexing code attempted to stuff "
977                                 "non-Latin-1 character into Latin-1 input");
978                 } else if (c >= 0xc2 && p+1 != e &&
979                             (((U8)p[1]) & 0xc0) == 0x80) {
980                     p++;
981                     highhalf++;
982                 } else if (c >= 0x80) {
983                     /* malformed UTF-8 */
984                     ENTER;
985                     SAVESPTR(PL_warnhook);
986                     PL_warnhook = PERL_WARNHOOK_FATAL;
987                     utf8n_to_uvuni((U8*)p, e-p, NULL, 0);
988                     LEAVE;
989                 }
990             }
991             if (!highhalf)
992                 goto plain_copy;
993             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len-highhalf);
994             bufptr = PL_parser->bufptr;
995             Move(bufptr, bufptr+len-highhalf, PL_parser->bufend+1-bufptr, char);
996             PL_parser->bufend += len-highhalf;
997             for (p = pv; p != e; p++) {
998                 U8 c = (U8)*p;
999                 if (c & 0x80) {
1000                     *bufptr++ = (char)(((c & 0x3) << 6) | (p[1] & 0x3f));
1001                     p++;
1002                 } else {
1003                     *bufptr++ = (char)c;
1004                 }
1005             }
1006         } else {
1007             plain_copy:
1008             lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len);
1009             bufptr = PL_parser->bufptr;
1010             Move(bufptr, bufptr+len, PL_parser->bufend+1-bufptr, char);
1011             PL_parser->bufend += len;
1012             Copy(pv, bufptr, len, char);
1013         }
1014     }
1015 }
1016
1017 /*
1018 =for apidoc Amx|void|lex_stuff_sv|SV *sv|U32 flags
1019
1020 Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
1021 immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
1022 reallocating the buffer if necessary.  This means that lexing code that
1023 runs later will see the characters as if they had appeared in the input.
1024 It is not recommended to do this as part of normal parsing, and most
1025 uses of this facility run the risk of the inserted characters being
1026 interpreted in an unintended manner.
1027
1028 The string to be inserted is the string value of I<sv>.  The characters
1029 are recoded for the lexer buffer, according to how the buffer is currently
1030 being interpreted (L</lex_bufutf8>).  If a string to be interpreted is
1031 not already a Perl scalar, the L</lex_stuff_pvn> function avoids the
1032 need to construct a scalar.
1033
1034 =cut
1035 */
1036
1037 void
1038 Perl_lex_stuff_sv(pTHX_ SV *sv, U32 flags)
1039 {
1040     char *pv;
1041     STRLEN len;
1042     PERL_ARGS_ASSERT_LEX_STUFF_SV;
1043     if (flags)
1044         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_sv");
1045     pv = SvPV(sv, len);
1046     lex_stuff_pvn(pv, len, flags | (SvUTF8(sv) ? LEX_STUFF_UTF8 : 0));
1047 }
1048
1049 /*
1050 =for apidoc Amx|void|lex_unstuff|char *ptr
1051
1052 Discards text about to be lexed, from L</PL_parser-E<gt>bufptr> up to
1053 I<ptr>.  Text following I<ptr> will be moved, and the buffer shortened.
1054 This hides the discarded text from any lexing code that runs later,
1055 as if the text had never appeared.
1056
1057 This is not the normal way to consume lexed text.  For that, use
1058 L</lex_read_to>.
1059
1060 =cut
1061 */
1062
1063 void
1064 Perl_lex_unstuff(pTHX_ char *ptr)
1065 {
1066     char *buf, *bufend;
1067     STRLEN unstuff_len;
1068     PERL_ARGS_ASSERT_LEX_UNSTUFF;
1069     buf = PL_parser->bufptr;
1070     if (ptr < buf)
1071         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1072     if (ptr == buf)
1073         return;
1074     bufend = PL_parser->bufend;
1075     if (ptr > bufend)
1076         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1077     unstuff_len = ptr - buf;
1078     Move(ptr, buf, bufend+1-ptr, char);
1079     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - unstuff_len);
1080     PL_parser->bufend = bufend - unstuff_len;
1081 }
1082
1083 /*
1084 =for apidoc Amx|void|lex_read_to|char *ptr
1085
1086 Consume text in the lexer buffer, from L</PL_parser-E<gt>bufptr> up
1087 to I<ptr>.  This advances L</PL_parser-E<gt>bufptr> to match I<ptr>,
1088 performing the correct bookkeeping whenever a newline character is passed.
1089 This is the normal way to consume lexed text.
1090
1091 Interpretation of the buffer's octets can be abstracted out by
1092 using the slightly higher-level functions L</lex_peek_unichar> and
1093 L</lex_read_unichar>.
1094
1095 =cut
1096 */
1097
1098 void
1099 Perl_lex_read_to(pTHX_ char *ptr)
1100 {
1101     char *s;
1102     PERL_ARGS_ASSERT_LEX_READ_TO;
1103     s = PL_parser->bufptr;
1104     if (ptr < s || ptr > PL_parser->bufend)
1105         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_to");
1106     for (; s != ptr; s++)
1107         if (*s == '\n') {
1108             CopLINE_inc(PL_curcop);
1109             PL_parser->linestart = s+1;
1110         }
1111     PL_parser->bufptr = ptr;
1112 }
1113
1114 /*
1115 =for apidoc Amx|void|lex_discard_to|char *ptr
1116
1117 Discards the first part of the L</PL_parser-E<gt>linestr> buffer,
1118 up to I<ptr>.  The remaining content of the buffer will be moved, and
1119 all pointers into the buffer updated appropriately.  I<ptr> must not
1120 be later in the buffer than the position of L</PL_parser-E<gt>bufptr>:
1121 it is not permitted to discard text that has yet to be lexed.
1122
1123 Normally it is not necessarily to do this directly, because it suffices to
1124 use the implicit discarding behaviour of L</lex_next_chunk> and things
1125 based on it.  However, if a token stretches across multiple lines,
1126 and the lexing code has kept multiple lines of text in the buffer fof
1127 that purpose, then after completion of the token it would be wise to
1128 explicitly discard the now-unneeded earlier lines, to avoid future
1129 multi-line tokens growing the buffer without bound.
1130
1131 =cut
1132 */
1133
1134 void
1135 Perl_lex_discard_to(pTHX_ char *ptr)
1136 {
1137     char *buf;
1138     STRLEN discard_len;
1139     PERL_ARGS_ASSERT_LEX_DISCARD_TO;
1140     buf = SvPVX(PL_parser->linestr);
1141     if (ptr < buf)
1142         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1143     if (ptr == buf)
1144         return;
1145     if (ptr > PL_parser->bufptr)
1146         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1147     discard_len = ptr - buf;
1148     if (PL_parser->oldbufptr < ptr)
1149         PL_parser->oldbufptr = ptr;
1150     if (PL_parser->oldoldbufptr < ptr)
1151         PL_parser->oldoldbufptr = ptr;
1152     if (PL_parser->last_uni && PL_parser->last_uni < ptr)
1153         PL_parser->last_uni = NULL;
1154     if (PL_parser->last_lop && PL_parser->last_lop < ptr)
1155         PL_parser->last_lop = NULL;
1156     Move(ptr, buf, PL_parser->bufend+1-ptr, char);
1157     SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - discard_len);
1158     PL_parser->bufend -= discard_len;
1159     PL_parser->bufptr -= discard_len;
1160     PL_parser->oldbufptr -= discard_len;
1161     PL_parser->oldoldbufptr -= discard_len;
1162     if (PL_parser->last_uni)
1163         PL_parser->last_uni -= discard_len;
1164     if (PL_parser->last_lop)
1165         PL_parser->last_lop -= discard_len;
1166 }
1167
1168 /*
1169 =for apidoc Amx|bool|lex_next_chunk|U32 flags
1170
1171 Reads in the next chunk of text to be lexed, appending it to
1172 L</PL_parser-E<gt>linestr>.  This should be called when lexing code has
1173 looked to the end of the current chunk and wants to know more.  It is
1174 usual, but not necessary, for lexing to have consumed the entirety of
1175 the current chunk at this time.
1176
1177 If L</PL_parser-E<gt>bufptr> is pointing to the very end of the current
1178 chunk (i.e., the current chunk has been entirely consumed), normally the
1179 current chunk will be discarded at the same time that the new chunk is
1180 read in.  If I<flags> includes C<LEX_KEEP_PREVIOUS>, the current chunk
1181 will not be discarded.  If the current chunk has not been entirely
1182 consumed, then it will not be discarded regardless of the flag.
1183
1184 Returns true if some new text was added to the buffer, or false if the
1185 buffer has reached the end of the input text.
1186
1187 =cut
1188 */
1189
1190 #define LEX_FAKE_EOF 0x80000000
1191
1192 bool
1193 Perl_lex_next_chunk(pTHX_ U32 flags)
1194 {
1195     SV *linestr;
1196     char *buf;
1197     STRLEN old_bufend_pos, new_bufend_pos;
1198     STRLEN bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
1199     STRLEN linestart_pos, last_uni_pos, last_lop_pos;
1200     bool got_some_for_debugger = 0;
1201     bool got_some;
1202     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_FAKE_EOF))
1203         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_next_chunk");
1204     linestr = PL_parser->linestr;
1205     buf = SvPVX(linestr);
1206     if (!(flags & LEX_KEEP_PREVIOUS) &&
1207             PL_parser->bufptr == PL_parser->bufend) {
1208         old_bufend_pos = bufptr_pos = oldbufptr_pos = oldoldbufptr_pos = 0;
1209         linestart_pos = 0;
1210         if (PL_parser->last_uni != PL_parser->bufend)
1211             PL_parser->last_uni = NULL;
1212         if (PL_parser->last_lop != PL_parser->bufend)
1213             PL_parser->last_lop = NULL;
1214         last_uni_pos = last_lop_pos = 0;
1215         *buf = 0;
1216         SvCUR(linestr) = 0;
1217     } else {
1218         old_bufend_pos = PL_parser->bufend - buf;
1219         bufptr_pos = PL_parser->bufptr - buf;
1220         oldbufptr_pos = PL_parser->oldbufptr - buf;
1221         oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
1222         linestart_pos = PL_parser->linestart - buf;
1223         last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
1224         last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
1225     }
1226     if (flags & LEX_FAKE_EOF) {
1227         goto eof;
1228     } else if (!PL_parser->rsfp) {
1229         got_some = 0;
1230     } else if (filter_gets(linestr, old_bufend_pos)) {
1231         got_some = 1;
1232         got_some_for_debugger = 1;
1233     } else {
1234         if (!SvPOK(linestr))   /* can get undefined by filter_gets */
1235             sv_setpvs(linestr, "");
1236         eof:
1237         /* End of real input.  Close filehandle (unless it was STDIN),
1238          * then add implicit termination.
1239          */
1240         if ((PerlIO*)PL_parser->rsfp == PerlIO_stdin())
1241             PerlIO_clearerr(PL_parser->rsfp);
1242         else if (PL_parser->rsfp)
1243             (void)PerlIO_close(PL_parser->rsfp);
1244         PL_parser->rsfp = NULL;
1245         PL_doextract = FALSE;
1246 #ifdef PERL_MAD
1247         if (PL_madskills && !PL_in_eval && (PL_minus_p || PL_minus_n))
1248             PL_faketokens = 1;
1249 #endif
1250         if (!PL_in_eval && PL_minus_p) {
1251             sv_catpvs(linestr,
1252                 /*{*/";}continue{print or die qq(-p destination: $!\\n);}");
1253             PL_minus_n = PL_minus_p = 0;
1254         } else if (!PL_in_eval && PL_minus_n) {
1255             sv_catpvs(linestr, /*{*/";}");
1256             PL_minus_n = 0;
1257         } else
1258             sv_catpvs(linestr, ";");
1259         got_some = 1;
1260     }
1261     buf = SvPVX(linestr);
1262     new_bufend_pos = SvCUR(linestr);
1263     PL_parser->bufend = buf + new_bufend_pos;
1264     PL_parser->bufptr = buf + bufptr_pos;
1265     PL_parser->oldbufptr = buf + oldbufptr_pos;
1266     PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
1267     PL_parser->linestart = buf + linestart_pos;
1268     if (PL_parser->last_uni)
1269         PL_parser->last_uni = buf + last_uni_pos;
1270     if (PL_parser->last_lop)
1271         PL_parser->last_lop = buf + last_lop_pos;
1272     if (got_some_for_debugger && (PERLDB_LINE || PERLDB_SAVESRC) &&
1273             PL_curstash != PL_debstash) {
1274         /* debugger active and we're not compiling the debugger code,
1275          * so store the line into the debugger's array of lines
1276          */
1277         update_debugger_info(NULL, buf+old_bufend_pos,
1278             new_bufend_pos-old_bufend_pos);
1279     }
1280     return got_some;
1281 }
1282
1283 /*
1284 =for apidoc Amx|I32|lex_peek_unichar|U32 flags
1285
1286 Looks ahead one (Unicode) character in the text currently being lexed.
1287 Returns the codepoint (unsigned integer value) of the next character,
1288 or -1 if lexing has reached the end of the input text.  To consume the
1289 peeked character, use L</lex_read_unichar>.
1290
1291 If the next character is in (or extends into) the next chunk of input
1292 text, the next chunk will be read in.  Normally the current chunk will be
1293 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1294 then the current chunk will not be discarded.
1295
1296 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1297 is encountered, an exception is generated.
1298
1299 =cut
1300 */
1301
1302 I32
1303 Perl_lex_peek_unichar(pTHX_ U32 flags)
1304 {
1305     char *s, *bufend;
1306     if (flags & ~(LEX_KEEP_PREVIOUS))
1307         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_peek_unichar");
1308     s = PL_parser->bufptr;
1309     bufend = PL_parser->bufend;
1310     if (UTF) {
1311         U8 head;
1312         I32 unichar;
1313         STRLEN len, retlen;
1314         if (s == bufend) {
1315             if (!lex_next_chunk(flags))
1316                 return -1;
1317             s = PL_parser->bufptr;
1318             bufend = PL_parser->bufend;
1319         }
1320         head = (U8)*s;
1321         if (!(head & 0x80))
1322             return head;
1323         if (head & 0x40) {
1324             len = PL_utf8skip[head];
1325             while ((STRLEN)(bufend-s) < len) {
1326                 if (!lex_next_chunk(flags | LEX_KEEP_PREVIOUS))
1327                     break;
1328                 s = PL_parser->bufptr;
1329                 bufend = PL_parser->bufend;
1330             }
1331         }
1332         unichar = utf8n_to_uvuni((U8*)s, bufend-s, &retlen, UTF8_CHECK_ONLY);
1333         if (retlen == (STRLEN)-1) {
1334             /* malformed UTF-8 */
1335             ENTER;
1336             SAVESPTR(PL_warnhook);
1337             PL_warnhook = PERL_WARNHOOK_FATAL;
1338             utf8n_to_uvuni((U8*)s, bufend-s, NULL, 0);
1339             LEAVE;
1340         }
1341         return unichar;
1342     } else {
1343         if (s == bufend) {
1344             if (!lex_next_chunk(flags))
1345                 return -1;
1346             s = PL_parser->bufptr;
1347         }
1348         return (U8)*s;
1349     }
1350 }
1351
1352 /*
1353 =for apidoc Amx|I32|lex_read_unichar|U32 flags
1354
1355 Reads the next (Unicode) character in the text currently being lexed.
1356 Returns the codepoint (unsigned integer value) of the character read,
1357 and moves L</PL_parser-E<gt>bufptr> past the character, or returns -1
1358 if lexing has reached the end of the input text.  To non-destructively
1359 examine the next character, use L</lex_peek_unichar> instead.
1360
1361 If the next character is in (or extends into) the next chunk of input
1362 text, the next chunk will be read in.  Normally the current chunk will be
1363 discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1364 then the current chunk will not be discarded.
1365
1366 If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1367 is encountered, an exception is generated.
1368
1369 =cut
1370 */
1371
1372 I32
1373 Perl_lex_read_unichar(pTHX_ U32 flags)
1374 {
1375     I32 c;
1376     if (flags & ~(LEX_KEEP_PREVIOUS))
1377         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_unichar");
1378     c = lex_peek_unichar(flags);
1379     if (c != -1) {
1380         if (c == '\n')
1381             CopLINE_inc(PL_curcop);
1382         PL_parser->bufptr += UTF8SKIP(PL_parser->bufptr);
1383     }
1384     return c;
1385 }
1386
1387 /*
1388 =for apidoc Amx|void|lex_read_space|U32 flags
1389
1390 Reads optional spaces, in Perl style, in the text currently being
1391 lexed.  The spaces may include ordinary whitespace characters and
1392 Perl-style comments.  C<#line> directives are processed if encountered.
1393 L</PL_parser-E<gt>bufptr> is moved past the spaces, so that it points
1394 at a non-space character (or the end of the input text).
1395
1396 If spaces extend into the next chunk of input text, the next chunk will
1397 be read in.  Normally the current chunk will be discarded at the same
1398 time, but if I<flags> includes C<LEX_KEEP_PREVIOUS> then the current
1399 chunk will not be discarded.
1400
1401 =cut
1402 */
1403
1404 #define LEX_NO_NEXT_CHUNK 0x80000000
1405
1406 void
1407 Perl_lex_read_space(pTHX_ U32 flags)
1408 {
1409     char *s, *bufend;
1410     bool need_incline = 0;
1411     if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK))
1412         Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space");
1413 #ifdef PERL_MAD
1414     if (PL_skipwhite) {
1415         sv_free(PL_skipwhite);
1416         PL_skipwhite = NULL;
1417     }
1418     if (PL_madskills)
1419         PL_skipwhite = newSVpvs("");
1420 #endif /* PERL_MAD */
1421     s = PL_parser->bufptr;
1422     bufend = PL_parser->bufend;
1423     while (1) {
1424         char c = *s;
1425         if (c == '#') {
1426             do {
1427                 c = *++s;
1428             } while (!(c == '\n' || (c == 0 && s == bufend)));
1429         } else if (c == '\n') {
1430             s++;
1431             PL_parser->linestart = s;
1432             if (s == bufend)
1433                 need_incline = 1;
1434             else
1435                 incline(s);
1436         } else if (isSPACE(c)) {
1437             s++;
1438         } else if (c == 0 && s == bufend) {
1439             bool got_more;
1440 #ifdef PERL_MAD
1441             if (PL_madskills)
1442                 sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1443 #endif /* PERL_MAD */
1444             if (flags & LEX_NO_NEXT_CHUNK)
1445                 break;
1446             PL_parser->bufptr = s;
1447             CopLINE_inc(PL_curcop);
1448             got_more = lex_next_chunk(flags);
1449             CopLINE_dec(PL_curcop);
1450             s = PL_parser->bufptr;
1451             bufend = PL_parser->bufend;
1452             if (!got_more)
1453                 break;
1454             if (need_incline && PL_parser->rsfp) {
1455                 incline(s);
1456                 need_incline = 0;
1457             }
1458         } else {
1459             break;
1460         }
1461     }
1462 #ifdef PERL_MAD
1463     if (PL_madskills)
1464         sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1465 #endif /* PERL_MAD */
1466     PL_parser->bufptr = s;
1467 }
1468
1469 /*
1470  * S_incline
1471  * This subroutine has nothing to do with tilting, whether at windmills
1472  * or pinball tables.  Its name is short for "increment line".  It
1473  * increments the current line number in CopLINE(PL_curcop) and checks
1474  * to see whether the line starts with a comment of the form
1475  *    # line 500 "foo.pm"
1476  * If so, it sets the current line number and file to the values in the comment.
1477  */
1478
1479 STATIC void
1480 S_incline(pTHX_ const char *s)
1481 {
1482     dVAR;
1483     const char *t;
1484     const char *n;
1485     const char *e;
1486
1487     PERL_ARGS_ASSERT_INCLINE;
1488
1489     CopLINE_inc(PL_curcop);
1490     if (*s++ != '#')
1491         return;
1492     while (SPACE_OR_TAB(*s))
1493         s++;
1494     if (strnEQ(s, "line", 4))
1495         s += 4;
1496     else
1497         return;
1498     if (SPACE_OR_TAB(*s))
1499         s++;
1500     else
1501         return;
1502     while (SPACE_OR_TAB(*s))
1503         s++;
1504     if (!isDIGIT(*s))
1505         return;
1506
1507     n = s;
1508     while (isDIGIT(*s))
1509         s++;
1510     if (!SPACE_OR_TAB(*s) && *s != '\r' && *s != '\n' && *s != '\0')
1511         return;
1512     while (SPACE_OR_TAB(*s))
1513         s++;
1514     if (*s == '"' && (t = strchr(s+1, '"'))) {
1515         s++;
1516         e = t + 1;
1517     }
1518     else {
1519         t = s;
1520         while (!isSPACE(*t))
1521             t++;
1522         e = t;
1523     }
1524     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
1525         e++;
1526     if (*e != '\n' && *e != '\0')
1527         return;         /* false alarm */
1528
1529     if (t - s > 0) {
1530         const STRLEN len = t - s;
1531 #ifndef USE_ITHREADS
1532         SV *const temp_sv = CopFILESV(PL_curcop);
1533         const char *cf;
1534         STRLEN tmplen;
1535
1536         if (temp_sv) {
1537             cf = SvPVX(temp_sv);
1538             tmplen = SvCUR(temp_sv);
1539         } else {
1540             cf = NULL;
1541             tmplen = 0;
1542         }
1543
1544         if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
1545             /* must copy *{"::_<(eval N)[oldfilename:L]"}
1546              * to *{"::_<newfilename"} */
1547             /* However, the long form of evals is only turned on by the
1548                debugger - usually they're "(eval %lu)" */
1549             char smallbuf[128];
1550             char *tmpbuf;
1551             GV **gvp;
1552             STRLEN tmplen2 = len;
1553             if (tmplen + 2 <= sizeof smallbuf)
1554                 tmpbuf = smallbuf;
1555             else
1556                 Newx(tmpbuf, tmplen + 2, char);
1557             tmpbuf[0] = '_';
1558             tmpbuf[1] = '<';
1559             memcpy(tmpbuf + 2, cf, tmplen);
1560             tmplen += 2;
1561             gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
1562             if (gvp) {
1563                 char *tmpbuf2;
1564                 GV *gv2;
1565
1566                 if (tmplen2 + 2 <= sizeof smallbuf)
1567                     tmpbuf2 = smallbuf;
1568                 else
1569                     Newx(tmpbuf2, tmplen2 + 2, char);
1570
1571                 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
1572                     /* Either they malloc'd it, or we malloc'd it,
1573                        so no prefix is present in ours.  */
1574                     tmpbuf2[0] = '_';
1575                     tmpbuf2[1] = '<';
1576                 }
1577
1578                 memcpy(tmpbuf2 + 2, s, tmplen2);
1579                 tmplen2 += 2;
1580
1581                 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
1582                 if (!isGV(gv2)) {
1583                     gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
1584                     /* adjust ${"::_<newfilename"} to store the new file name */
1585                     GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
1586                     GvHV(gv2) = MUTABLE_HV(SvREFCNT_inc(GvHV(*gvp)));
1587                     GvAV(gv2) = MUTABLE_AV(SvREFCNT_inc(GvAV(*gvp)));
1588                 }
1589
1590                 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
1591             }
1592             if (tmpbuf != smallbuf) Safefree(tmpbuf);
1593         }
1594 #endif
1595         CopFILE_free(PL_curcop);
1596         CopFILE_setn(PL_curcop, s, len);
1597     }
1598     CopLINE_set(PL_curcop, atoi(n)-1);
1599 }
1600
1601 #ifdef PERL_MAD
1602 /* skip space before PL_thistoken */
1603
1604 STATIC char *
1605 S_skipspace0(pTHX_ register char *s)
1606 {
1607     PERL_ARGS_ASSERT_SKIPSPACE0;
1608
1609     s = skipspace(s);
1610     if (!PL_madskills)
1611         return s;
1612     if (PL_skipwhite) {
1613         if (!PL_thiswhite)
1614             PL_thiswhite = newSVpvs("");
1615         sv_catsv(PL_thiswhite, PL_skipwhite);
1616         sv_free(PL_skipwhite);
1617         PL_skipwhite = 0;
1618     }
1619     PL_realtokenstart = s - SvPVX(PL_linestr);
1620     return s;
1621 }
1622
1623 /* skip space after PL_thistoken */
1624
1625 STATIC char *
1626 S_skipspace1(pTHX_ register char *s)
1627 {
1628     const char *start = s;
1629     I32 startoff = start - SvPVX(PL_linestr);
1630
1631     PERL_ARGS_ASSERT_SKIPSPACE1;
1632
1633     s = skipspace(s);
1634     if (!PL_madskills)
1635         return s;
1636     start = SvPVX(PL_linestr) + startoff;
1637     if (!PL_thistoken && PL_realtokenstart >= 0) {
1638         const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1639         PL_thistoken = newSVpvn(tstart, start - tstart);
1640     }
1641     PL_realtokenstart = -1;
1642     if (PL_skipwhite) {
1643         if (!PL_nextwhite)
1644             PL_nextwhite = newSVpvs("");
1645         sv_catsv(PL_nextwhite, PL_skipwhite);
1646         sv_free(PL_skipwhite);
1647         PL_skipwhite = 0;
1648     }
1649     return s;
1650 }
1651
1652 STATIC char *
1653 S_skipspace2(pTHX_ register char *s, SV **svp)
1654 {
1655     char *start;
1656     const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
1657     const I32 startoff = s - SvPVX(PL_linestr);
1658
1659     PERL_ARGS_ASSERT_SKIPSPACE2;
1660
1661     s = skipspace(s);
1662     PL_bufptr = SvPVX(PL_linestr) + bufptroff;
1663     if (!PL_madskills || !svp)
1664         return s;
1665     start = SvPVX(PL_linestr) + startoff;
1666     if (!PL_thistoken && PL_realtokenstart >= 0) {
1667         char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
1668         PL_thistoken = newSVpvn(tstart, start - tstart);
1669         PL_realtokenstart = -1;
1670     }
1671     if (PL_skipwhite) {
1672         if (!*svp)
1673             *svp = newSVpvs("");
1674         sv_setsv(*svp, PL_skipwhite);
1675         sv_free(PL_skipwhite);
1676         PL_skipwhite = 0;
1677     }
1678     
1679     return s;
1680 }
1681 #endif
1682
1683 STATIC void
1684 S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
1685 {
1686     AV *av = CopFILEAVx(PL_curcop);
1687     if (av) {
1688         SV * const sv = newSV_type(SVt_PVMG);
1689         if (orig_sv)
1690             sv_setsv(sv, orig_sv);
1691         else
1692             sv_setpvn(sv, buf, len);
1693         (void)SvIOK_on(sv);
1694         SvIV_set(sv, 0);
1695         av_store(av, (I32)CopLINE(PL_curcop), sv);
1696     }
1697 }
1698
1699 /*
1700  * S_skipspace
1701  * Called to gobble the appropriate amount and type of whitespace.
1702  * Skips comments as well.
1703  */
1704
1705 STATIC char *
1706 S_skipspace(pTHX_ register char *s)
1707 {
1708 #ifdef PERL_MAD
1709     char *start = s;
1710 #endif /* PERL_MAD */
1711     PERL_ARGS_ASSERT_SKIPSPACE;
1712 #ifdef PERL_MAD
1713     if (PL_skipwhite) {
1714         sv_free(PL_skipwhite);
1715         PL_skipwhite = NULL;
1716     }
1717 #endif /* PERL_MAD */
1718     if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
1719         while (s < PL_bufend && SPACE_OR_TAB(*s))
1720             s++;
1721     } else {
1722         STRLEN bufptr_pos = PL_bufptr - SvPVX(PL_linestr);
1723         PL_bufptr = s;
1724         lex_read_space(LEX_KEEP_PREVIOUS |
1725                 (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE ?
1726                     LEX_NO_NEXT_CHUNK : 0));
1727         s = PL_bufptr;
1728         PL_bufptr = SvPVX(PL_linestr) + bufptr_pos;
1729         if (PL_linestart > PL_bufptr)
1730             PL_bufptr = PL_linestart;
1731         return s;
1732     }
1733 #ifdef PERL_MAD
1734     if (PL_madskills)
1735         PL_skipwhite = newSVpvn(start, s-start);
1736 #endif /* PERL_MAD */
1737     return s;
1738 }
1739
1740 /*
1741  * S_check_uni
1742  * Check the unary operators to ensure there's no ambiguity in how they're
1743  * used.  An ambiguous piece of code would be:
1744  *     rand + 5
1745  * This doesn't mean rand() + 5.  Because rand() is a unary operator,
1746  * the +5 is its argument.
1747  */
1748
1749 STATIC void
1750 S_check_uni(pTHX)
1751 {
1752     dVAR;
1753     const char *s;
1754     const char *t;
1755
1756     if (PL_oldoldbufptr != PL_last_uni)
1757         return;
1758     while (isSPACE(*PL_last_uni))
1759         PL_last_uni++;
1760     s = PL_last_uni;
1761     while (isALNUM_lazy_if(s,UTF) || *s == '-')
1762         s++;
1763     if ((t = strchr(s, '(')) && t < PL_bufptr)
1764         return;
1765
1766     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
1767                      "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1768                      (int)(s - PL_last_uni), PL_last_uni);
1769 }
1770
1771 /*
1772  * LOP : macro to build a list operator.  Its behaviour has been replaced
1773  * with a subroutine, S_lop() for which LOP is just another name.
1774  */
1775
1776 #define LOP(f,x) return lop(f,x,s)
1777
1778 /*
1779  * S_lop
1780  * Build a list operator (or something that might be one).  The rules:
1781  *  - if we have a next token, then it's a list operator [why?]
1782  *  - if the next thing is an opening paren, then it's a function
1783  *  - else it's a list operator
1784  */
1785
1786 STATIC I32
1787 S_lop(pTHX_ I32 f, int x, char *s)
1788 {
1789     dVAR;
1790
1791     PERL_ARGS_ASSERT_LOP;
1792
1793     pl_yylval.ival = f;
1794     CLINE;
1795     PL_expect = x;
1796     PL_bufptr = s;
1797     PL_last_lop = PL_oldbufptr;
1798     PL_last_lop_op = (OPCODE)f;
1799 #ifdef PERL_MAD
1800     if (PL_lasttoke)
1801         return REPORT(LSTOP);
1802 #else
1803     if (PL_nexttoke)
1804         return REPORT(LSTOP);
1805 #endif
1806     if (*s == '(')
1807         return REPORT(FUNC);
1808     s = PEEKSPACE(s);
1809     if (*s == '(')
1810         return REPORT(FUNC);
1811     else
1812         return REPORT(LSTOP);
1813 }
1814
1815 #ifdef PERL_MAD
1816  /*
1817  * S_start_force
1818  * Sets up for an eventual force_next().  start_force(0) basically does
1819  * an unshift, while start_force(-1) does a push.  yylex removes items
1820  * on the "pop" end.
1821  */
1822
1823 STATIC void
1824 S_start_force(pTHX_ int where)
1825 {
1826     int i;
1827
1828     if (where < 0)      /* so people can duplicate start_force(PL_curforce) */
1829         where = PL_lasttoke;
1830     assert(PL_curforce < 0 || PL_curforce == where);
1831     if (PL_curforce != where) {
1832         for (i = PL_lasttoke; i > where; --i) {
1833             PL_nexttoke[i] = PL_nexttoke[i-1];
1834         }
1835         PL_lasttoke++;
1836     }
1837     if (PL_curforce < 0)        /* in case of duplicate start_force() */
1838         Zero(&PL_nexttoke[where], 1, NEXTTOKE);
1839     PL_curforce = where;
1840     if (PL_nextwhite) {
1841         if (PL_madskills)
1842             curmad('^', newSVpvs(""));
1843         CURMAD('_', PL_nextwhite);
1844     }
1845 }
1846
1847 STATIC void
1848 S_curmad(pTHX_ char slot, SV *sv)
1849 {
1850     MADPROP **where;
1851
1852     if (!sv)
1853         return;
1854     if (PL_curforce < 0)
1855         where = &PL_thismad;
1856     else
1857         where = &PL_nexttoke[PL_curforce].next_mad;
1858
1859     if (PL_faketokens)
1860         sv_setpvs(sv, "");
1861     else {
1862         if (!IN_BYTES) {
1863             if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1864                 SvUTF8_on(sv);
1865             else if (PL_encoding) {
1866                 sv_recode_to_utf8(sv, PL_encoding);
1867             }
1868         }
1869     }
1870
1871     /* keep a slot open for the head of the list? */
1872     if (slot != '_' && *where && (*where)->mad_key == '^') {
1873         (*where)->mad_key = slot;
1874         sv_free(MUTABLE_SV(((*where)->mad_val)));
1875         (*where)->mad_val = (void*)sv;
1876     }
1877     else
1878         addmad(newMADsv(slot, sv), where, 0);
1879 }
1880 #else
1881 #  define start_force(where)    NOOP
1882 #  define curmad(slot, sv)      NOOP
1883 #endif
1884
1885 /*
1886  * S_force_next
1887  * When the lexer realizes it knows the next token (for instance,
1888  * it is reordering tokens for the parser) then it can call S_force_next
1889  * to know what token to return the next time the lexer is called.  Caller
1890  * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1891  * and possibly PL_expect to ensure the lexer handles the token correctly.
1892  */
1893
1894 STATIC void
1895 S_force_next(pTHX_ I32 type)
1896 {
1897     dVAR;
1898 #ifdef DEBUGGING
1899     if (DEBUG_T_TEST) {
1900         PerlIO_printf(Perl_debug_log, "### forced token:\n");
1901         tokereport(type, &NEXTVAL_NEXTTOKE);
1902     }
1903 #endif
1904 #ifdef PERL_MAD
1905     if (PL_curforce < 0)
1906         start_force(PL_lasttoke);
1907     PL_nexttoke[PL_curforce].next_type = type;
1908     if (PL_lex_state != LEX_KNOWNEXT)
1909         PL_lex_defer = PL_lex_state;
1910     PL_lex_state = LEX_KNOWNEXT;
1911     PL_lex_expect = PL_expect;
1912     PL_curforce = -1;
1913 #else
1914     PL_nexttype[PL_nexttoke] = type;
1915     PL_nexttoke++;
1916     if (PL_lex_state != LEX_KNOWNEXT) {
1917         PL_lex_defer = PL_lex_state;
1918         PL_lex_expect = PL_expect;
1919         PL_lex_state = LEX_KNOWNEXT;
1920     }
1921 #endif
1922 }
1923
1924 STATIC SV *
1925 S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
1926 {
1927     dVAR;
1928     SV * const sv = newSVpvn_utf8(start, len,
1929                                   !IN_BYTES
1930                                   && UTF
1931                                   && !is_ascii_string((const U8*)start, len)
1932                                   && is_utf8_string((const U8*)start, len));
1933     return sv;
1934 }
1935
1936 /*
1937  * S_force_word
1938  * When the lexer knows the next thing is a word (for instance, it has
1939  * just seen -> and it knows that the next char is a word char, then
1940  * it calls S_force_word to stick the next word into the PL_nexttoke/val
1941  * lookahead.
1942  *
1943  * Arguments:
1944  *   char *start : buffer position (must be within PL_linestr)
1945  *   int token   : PL_next* will be this type of bare word (e.g., METHOD,WORD)
1946  *   int check_keyword : if true, Perl checks to make sure the word isn't
1947  *       a keyword (do this if the word is a label, e.g. goto FOO)
1948  *   int allow_pack : if true, : characters will also be allowed (require,
1949  *       use, etc. do this)
1950  *   int allow_initial_tick : used by the "sub" lexer only.
1951  */
1952
1953 STATIC char *
1954 S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
1955 {
1956     dVAR;
1957     register char *s;
1958     STRLEN len;
1959
1960     PERL_ARGS_ASSERT_FORCE_WORD;
1961
1962     start = SKIPSPACE1(start);
1963     s = start;
1964     if (isIDFIRST_lazy_if(s,UTF) ||
1965         (allow_pack && *s == ':') ||
1966         (allow_initial_tick && *s == '\'') )
1967     {
1968         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
1969         if (check_keyword && keyword(PL_tokenbuf, len, 0))
1970             return start;
1971         start_force(PL_curforce);
1972         if (PL_madskills)
1973             curmad('X', newSVpvn(start,s-start));
1974         if (token == METHOD) {
1975             s = SKIPSPACE1(s);
1976             if (*s == '(')
1977                 PL_expect = XTERM;
1978             else {
1979                 PL_expect = XOPERATOR;
1980             }
1981         }
1982         if (PL_madskills)
1983             curmad('g', newSVpvs( "forced" ));
1984         NEXTVAL_NEXTTOKE.opval
1985             = (OP*)newSVOP(OP_CONST,0,
1986                            S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
1987         NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
1988         force_next(token);
1989     }
1990     return s;
1991 }
1992
1993 /*
1994  * S_force_ident
1995  * Called when the lexer wants $foo *foo &foo etc, but the program
1996  * text only contains the "foo" portion.  The first argument is a pointer
1997  * to the "foo", and the second argument is the type symbol to prefix.
1998  * Forces the next token to be a "WORD".
1999  * Creates the symbol if it didn't already exist (via gv_fetchpv()).
2000  */
2001
2002 STATIC void
2003 S_force_ident(pTHX_ register const char *s, int kind)
2004 {
2005     dVAR;
2006
2007     PERL_ARGS_ASSERT_FORCE_IDENT;
2008
2009     if (*s) {
2010         const STRLEN len = strlen(s);
2011         OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
2012         start_force(PL_curforce);
2013         NEXTVAL_NEXTTOKE.opval = o;
2014         force_next(WORD);
2015         if (kind) {
2016             o->op_private = OPpCONST_ENTERED;
2017             /* XXX see note in pp_entereval() for why we forgo typo
2018                warnings if the symbol must be introduced in an eval.
2019                GSAR 96-10-12 */
2020             gv_fetchpvn_flags(s, len,
2021                               PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
2022                               : GV_ADD,
2023                               kind == '$' ? SVt_PV :
2024                               kind == '@' ? SVt_PVAV :
2025                               kind == '%' ? SVt_PVHV :
2026                               SVt_PVGV
2027                               );
2028         }
2029     }
2030 }
2031
2032 NV
2033 Perl_str_to_version(pTHX_ SV *sv)
2034 {
2035     NV retval = 0.0;
2036     NV nshift = 1.0;
2037     STRLEN len;
2038     const char *start = SvPV_const(sv,len);
2039     const char * const end = start + len;
2040     const bool utf = SvUTF8(sv) ? TRUE : FALSE;
2041
2042     PERL_ARGS_ASSERT_STR_TO_VERSION;
2043
2044     while (start < end) {
2045         STRLEN skip;
2046         UV n;
2047         if (utf)
2048             n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
2049         else {
2050             n = *(U8*)start;
2051             skip = 1;
2052         }
2053         retval += ((NV)n)/nshift;
2054         start += skip;
2055         nshift *= 1000;
2056     }
2057     return retval;
2058 }
2059
2060 /*
2061  * S_force_version
2062  * Forces the next token to be a version number.
2063  * If the next token appears to be an invalid version number, (e.g. "v2b"),
2064  * and if "guessing" is TRUE, then no new token is created (and the caller
2065  * must use an alternative parsing method).
2066  */
2067
2068 STATIC char *
2069 S_force_version(pTHX_ char *s, int guessing)
2070 {
2071     dVAR;
2072     OP *version = NULL;
2073     char *d;
2074 #ifdef PERL_MAD
2075     I32 startoff = s - SvPVX(PL_linestr);
2076 #endif
2077
2078     PERL_ARGS_ASSERT_FORCE_VERSION;
2079
2080     s = SKIPSPACE1(s);
2081
2082     d = s;
2083     if (*d == 'v')
2084         d++;
2085     if (isDIGIT(*d)) {
2086         while (isDIGIT(*d) || *d == '_' || *d == '.')
2087             d++;
2088 #ifdef PERL_MAD
2089         if (PL_madskills) {
2090             start_force(PL_curforce);
2091             curmad('X', newSVpvn(s,d-s));
2092         }
2093 #endif
2094         if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
2095             SV *ver;
2096 #ifdef USE_LOCALE_NUMERIC
2097             char *loc = setlocale(LC_NUMERIC, "C");
2098 #endif
2099             s = scan_num(s, &pl_yylval);
2100 #ifdef USE_LOCALE_NUMERIC
2101             setlocale(LC_NUMERIC, loc);
2102 #endif
2103             version = pl_yylval.opval;
2104             ver = cSVOPx(version)->op_sv;
2105             if (SvPOK(ver) && !SvNIOK(ver)) {
2106                 SvUPGRADE(ver, SVt_PVNV);
2107                 SvNV_set(ver, str_to_version(ver));
2108                 SvNOK_on(ver);          /* hint that it is a version */
2109             }
2110         }
2111         else if (guessing) {
2112 #ifdef PERL_MAD
2113             if (PL_madskills) {
2114                 sv_free(PL_nextwhite);  /* let next token collect whitespace */
2115                 PL_nextwhite = 0;
2116                 s = SvPVX(PL_linestr) + startoff;
2117             }
2118 #endif
2119             return s;
2120         }
2121     }
2122
2123 #ifdef PERL_MAD
2124     if (PL_madskills && !version) {
2125         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2126         PL_nextwhite = 0;
2127         s = SvPVX(PL_linestr) + startoff;
2128     }
2129 #endif
2130     /* NOTE: The parser sees the package name and the VERSION swapped */
2131     start_force(PL_curforce);
2132     NEXTVAL_NEXTTOKE.opval = version;
2133     force_next(WORD);
2134
2135     return s;
2136 }
2137
2138 /*
2139  * S_force_strict_version
2140  * Forces the next token to be a version number using strict syntax rules.
2141  */
2142
2143 STATIC char *
2144 S_force_strict_version(pTHX_ char *s)
2145 {
2146     dVAR;
2147     OP *version = NULL;
2148 #ifdef PERL_MAD
2149     I32 startoff = s - SvPVX(PL_linestr);
2150 #endif
2151     const char *errstr = NULL;
2152
2153     PERL_ARGS_ASSERT_FORCE_STRICT_VERSION;
2154
2155     while (isSPACE(*s)) /* leading whitespace */
2156         s++;
2157
2158     if (is_STRICT_VERSION(s,&errstr)) {
2159         SV *ver = newSV(0);
2160         s = (char *)scan_version(s, ver, 0);
2161         version = newSVOP(OP_CONST, 0, ver);
2162     }
2163     else if ( (*s != ';' && *s != '}' ) && (s = SKIPSPACE1(s), (*s != ';' && *s !='}' ))) {
2164         PL_bufptr = s;
2165         if (errstr)
2166             yyerror(errstr); /* version required */
2167         return s;
2168     }
2169
2170 #ifdef PERL_MAD
2171     if (PL_madskills && !version) {
2172         sv_free(PL_nextwhite);  /* let next token collect whitespace */
2173         PL_nextwhite = 0;
2174         s = SvPVX(PL_linestr) + startoff;
2175     }
2176 #endif
2177     /* NOTE: The parser sees the package name and the VERSION swapped */
2178     start_force(PL_curforce);
2179     NEXTVAL_NEXTTOKE.opval = version;
2180     force_next(WORD);
2181
2182     return s;
2183 }
2184
2185 /*
2186  * S_tokeq
2187  * Tokenize a quoted string passed in as an SV.  It finds the next
2188  * chunk, up to end of string or a backslash.  It may make a new
2189  * SV containing that chunk (if HINT_NEW_STRING is on).  It also
2190  * turns \\ into \.
2191  */
2192
2193 STATIC SV *
2194 S_tokeq(pTHX_ SV *sv)
2195 {
2196     dVAR;
2197     register char *s;
2198     register char *send;
2199     register char *d;
2200     STRLEN len = 0;
2201     SV *pv = sv;
2202
2203     PERL_ARGS_ASSERT_TOKEQ;
2204
2205     if (!SvLEN(sv))
2206         goto finish;
2207
2208     s = SvPV_force(sv, len);
2209     if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
2210         goto finish;
2211     send = s + len;
2212     while (s < send && *s != '\\')
2213         s++;
2214     if (s == send)
2215         goto finish;
2216     d = s;
2217     if ( PL_hints & HINT_NEW_STRING ) {
2218         pv = newSVpvn_flags(SvPVX_const(pv), len, SVs_TEMP | SvUTF8(sv));
2219     }
2220     while (s < send) {
2221         if (*s == '\\') {
2222             if (s + 1 < send && (s[1] == '\\'))
2223                 s++;            /* all that, just for this */
2224         }
2225         *d++ = *s++;
2226     }
2227     *d = '\0';
2228     SvCUR_set(sv, d - SvPVX_const(sv));
2229   finish:
2230     if ( PL_hints & HINT_NEW_STRING )
2231        return new_constant(NULL, 0, "q", sv, pv, "q", 1);
2232     return sv;
2233 }
2234
2235 /*
2236  * Now come three functions related to double-quote context,
2237  * S_sublex_start, S_sublex_push, and S_sublex_done.  They're used when
2238  * converting things like "\u\Lgnat" into ucfirst(lc("gnat")).  They
2239  * interact with PL_lex_state, and create fake ( ... ) argument lists
2240  * to handle functions and concatenation.
2241  * They assume that whoever calls them will be setting up a fake
2242  * join call, because each subthing puts a ',' after it.  This lets
2243  *   "lower \luPpEr"
2244  * become
2245  *  join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
2246  *
2247  * (I'm not sure whether the spurious commas at the end of lcfirst's
2248  * arguments and join's arguments are created or not).
2249  */
2250
2251 /*
2252  * S_sublex_start
2253  * Assumes that pl_yylval.ival is the op we're creating (e.g. OP_LCFIRST).
2254  *
2255  * Pattern matching will set PL_lex_op to the pattern-matching op to
2256  * make (we return THING if pl_yylval.ival is OP_NULL, PMFUNC otherwise).
2257  *
2258  * OP_CONST and OP_READLINE are easy--just make the new op and return.
2259  *
2260  * Everything else becomes a FUNC.
2261  *
2262  * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
2263  * had an OP_CONST or OP_READLINE).  This just sets us up for a
2264  * call to S_sublex_push().
2265  */
2266
2267 STATIC I32
2268 S_sublex_start(pTHX)
2269 {
2270     dVAR;
2271     register const I32 op_type = pl_yylval.ival;
2272
2273     if (op_type == OP_NULL) {
2274         pl_yylval.opval = PL_lex_op;
2275         PL_lex_op = NULL;
2276         return THING;
2277     }
2278     if (op_type == OP_CONST || op_type == OP_READLINE) {
2279         SV *sv = tokeq(PL_lex_stuff);
2280
2281         if (SvTYPE(sv) == SVt_PVIV) {
2282             /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
2283             STRLEN len;
2284             const char * const p = SvPV_const(sv, len);
2285             SV * const nsv = newSVpvn_flags(p, len, SvUTF8(sv));
2286             SvREFCNT_dec(sv);
2287             sv = nsv;
2288         }
2289         pl_yylval.opval = (OP*)newSVOP(op_type, 0, sv);
2290         PL_lex_stuff = NULL;
2291         /* Allow <FH> // "foo" */
2292         if (op_type == OP_READLINE)
2293             PL_expect = XTERMORDORDOR;
2294         return THING;
2295     }
2296     else if (op_type == OP_BACKTICK && PL_lex_op) {
2297         /* readpipe() vas overriden */
2298         cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
2299         pl_yylval.opval = PL_lex_op;
2300         PL_lex_op = NULL;
2301         PL_lex_stuff = NULL;
2302         return THING;
2303     }
2304
2305     PL_sublex_info.super_state = PL_lex_state;
2306     PL_sublex_info.sub_inwhat = (U16)op_type;
2307     PL_sublex_info.sub_op = PL_lex_op;
2308     PL_lex_state = LEX_INTERPPUSH;
2309
2310     PL_expect = XTERM;
2311     if (PL_lex_op) {
2312         pl_yylval.opval = PL_lex_op;
2313         PL_lex_op = NULL;
2314         return PMFUNC;
2315     }
2316     else
2317         return FUNC;
2318 }
2319
2320 /*
2321  * S_sublex_push
2322  * Create a new scope to save the lexing state.  The scope will be
2323  * ended in S_sublex_done.  Returns a '(', starting the function arguments
2324  * to the uc, lc, etc. found before.
2325  * Sets PL_lex_state to LEX_INTERPCONCAT.
2326  */
2327
2328 STATIC I32
2329 S_sublex_push(pTHX)
2330 {
2331     dVAR;
2332     ENTER;
2333
2334     PL_lex_state = PL_sublex_info.super_state;
2335     SAVEBOOL(PL_lex_dojoin);
2336     SAVEI32(PL_lex_brackets);
2337     SAVEI32(PL_lex_casemods);
2338     SAVEI32(PL_lex_starts);
2339     SAVEI8(PL_lex_state);
2340     SAVEVPTR(PL_lex_inpat);
2341     SAVEI16(PL_lex_inwhat);
2342     SAVECOPLINE(PL_curcop);
2343     SAVEPPTR(PL_bufptr);
2344     SAVEPPTR(PL_bufend);
2345     SAVEPPTR(PL_oldbufptr);
2346     SAVEPPTR(PL_oldoldbufptr);
2347     SAVEPPTR(PL_last_lop);
2348     SAVEPPTR(PL_last_uni);
2349     SAVEPPTR(PL_linestart);
2350     SAVESPTR(PL_linestr);
2351     SAVEGENERICPV(PL_lex_brackstack);
2352     SAVEGENERICPV(PL_lex_casestack);
2353
2354     PL_linestr = PL_lex_stuff;
2355     PL_lex_stuff = NULL;
2356
2357     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
2358         = SvPVX(PL_linestr);
2359     PL_bufend += SvCUR(PL_linestr);
2360     PL_last_lop = PL_last_uni = NULL;
2361     SAVEFREESV(PL_linestr);
2362
2363     PL_lex_dojoin = FALSE;
2364     PL_lex_brackets = 0;
2365     Newx(PL_lex_brackstack, 120, char);
2366     Newx(PL_lex_casestack, 12, char);
2367     PL_lex_casemods = 0;
2368     *PL_lex_casestack = '\0';
2369     PL_lex_starts = 0;
2370     PL_lex_state = LEX_INTERPCONCAT;
2371     CopLINE_set(PL_curcop, (line_t)PL_multi_start);
2372
2373     PL_lex_inwhat = PL_sublex_info.sub_inwhat;
2374     if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
2375         PL_lex_inpat = PL_sublex_info.sub_op;
2376     else
2377         PL_lex_inpat = NULL;
2378
2379     return '(';
2380 }
2381
2382 /*
2383  * S_sublex_done
2384  * Restores lexer state after a S_sublex_push.
2385  */
2386
2387 STATIC I32
2388 S_sublex_done(pTHX)
2389 {
2390     dVAR;
2391     if (!PL_lex_starts++) {
2392         SV * const sv = newSVpvs("");
2393         if (SvUTF8(PL_linestr))
2394             SvUTF8_on(sv);
2395         PL_expect = XOPERATOR;
2396         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2397         return THING;
2398     }
2399
2400     if (PL_lex_casemods) {              /* oops, we've got some unbalanced parens */
2401         PL_lex_state = LEX_INTERPCASEMOD;
2402         return yylex();
2403     }
2404
2405     /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
2406     if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
2407         PL_linestr = PL_lex_repl;
2408         PL_lex_inpat = 0;
2409         PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
2410         PL_bufend += SvCUR(PL_linestr);
2411         PL_last_lop = PL_last_uni = NULL;
2412         SAVEFREESV(PL_linestr);
2413         PL_lex_dojoin = FALSE;
2414         PL_lex_brackets = 0;
2415         PL_lex_casemods = 0;
2416         *PL_lex_casestack = '\0';
2417         PL_lex_starts = 0;
2418         if (SvEVALED(PL_lex_repl)) {
2419             PL_lex_state = LEX_INTERPNORMAL;
2420             PL_lex_starts++;
2421             /*  we don't clear PL_lex_repl here, so that we can check later
2422                 whether this is an evalled subst; that means we rely on the
2423                 logic to ensure sublex_done() is called again only via the
2424                 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
2425         }
2426         else {
2427             PL_lex_state = LEX_INTERPCONCAT;
2428             PL_lex_repl = NULL;
2429         }
2430         return ',';
2431     }
2432     else {
2433 #ifdef PERL_MAD
2434         if (PL_madskills) {
2435             if (PL_thiswhite) {
2436                 if (!PL_endwhite)
2437                     PL_endwhite = newSVpvs("");
2438                 sv_catsv(PL_endwhite, PL_thiswhite);
2439                 PL_thiswhite = 0;
2440             }
2441             if (PL_thistoken)
2442                 sv_setpvs(PL_thistoken,"");
2443             else
2444                 PL_realtokenstart = -1;
2445         }
2446 #endif
2447         LEAVE;
2448         PL_bufend = SvPVX(PL_linestr);
2449         PL_bufend += SvCUR(PL_linestr);
2450         PL_expect = XOPERATOR;
2451         PL_sublex_info.sub_inwhat = 0;
2452         return ')';
2453     }
2454 }
2455
2456 /*
2457   scan_const
2458
2459   Extracts a pattern, double-quoted string, or transliteration.  This
2460   is terrifying code.
2461
2462   It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
2463   processing a pattern (PL_lex_inpat is true), a transliteration
2464   (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
2465
2466   Returns a pointer to the character scanned up to. If this is
2467   advanced from the start pointer supplied (i.e. if anything was
2468   successfully parsed), will leave an OP for the substring scanned
2469   in pl_yylval. Caller must intuit reason for not parsing further
2470   by looking at the next characters herself.
2471
2472   In patterns:
2473     backslashes:
2474       double-quoted style: \r and \n
2475       regexp special ones: \D \s
2476       constants: \x31
2477       backrefs: \1
2478       case and quoting: \U \Q \E
2479     stops on @ and $, but not for $ as tail anchor
2480
2481   In transliterations:
2482     characters are VERY literal, except for - not at the start or end
2483     of the string, which indicates a range. If the range is in bytes,
2484     scan_const expands the range to the full set of intermediate
2485     characters. If the range is in utf8, the hyphen is replaced with
2486     a certain range mark which will be handled by pmtrans() in op.c.
2487
2488   In double-quoted strings:
2489     backslashes:
2490       double-quoted style: \r and \n
2491       constants: \x31
2492       deprecated backrefs: \1 (in substitution replacements)
2493       case and quoting: \U \Q \E
2494     stops on @ and $
2495
2496   scan_const does *not* construct ops to handle interpolated strings.
2497   It stops processing as soon as it finds an embedded $ or @ variable
2498   and leaves it to the caller to work out what's going on.
2499
2500   embedded arrays (whether in pattern or not) could be:
2501       @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
2502
2503   $ in double-quoted strings must be the symbol of an embedded scalar.
2504
2505   $ in pattern could be $foo or could be tail anchor.  Assumption:
2506   it's a tail anchor if $ is the last thing in the string, or if it's
2507   followed by one of "()| \r\n\t"
2508
2509   \1 (backreferences) are turned into $1
2510
2511   The structure of the code is
2512       while (there's a character to process) {
2513           handle transliteration ranges
2514           skip regexp comments /(?#comment)/ and codes /(?{code})/
2515           skip #-initiated comments in //x patterns
2516           check for embedded arrays
2517           check for embedded scalars
2518           if (backslash) {
2519               leave intact backslashes from leaveit (below)
2520               deprecate \1 in substitution replacements
2521               handle string-changing backslashes \l \U \Q \E, etc.
2522               switch (what was escaped) {
2523                   handle \- in a transliteration (becomes a literal -)
2524                   handle \132 (octal characters)
2525                   handle \x15 and \x{1234} (hex characters)
2526                   handle \N{name} (named characters)
2527                   handle \cV (control characters)
2528                   handle printf-style backslashes (\f, \r, \n, etc)
2529               } (end switch)
2530               continue
2531           } (end if backslash)
2532           handle regular character
2533     } (end while character to read)
2534                 
2535 */
2536
2537 STATIC char *
2538 S_scan_const(pTHX_ char *start)
2539 {
2540     dVAR;
2541     register char *send = PL_bufend;            /* end of the constant */
2542     SV *sv = newSV(send - start);               /* sv for the constant.  See
2543                                                    note below on sizing. */
2544     register char *s = start;                   /* start of the constant */
2545     register char *d = SvPVX(sv);               /* destination for copies */
2546     bool dorange = FALSE;                       /* are we in a translit range? */
2547     bool didrange = FALSE;                      /* did we just finish a range? */
2548     I32  has_utf8 = FALSE;                      /* Output constant is UTF8 */
2549     I32  this_utf8 = UTF;                       /* Is the source string assumed
2550                                                    to be UTF8?  But, this can
2551                                                    show as true when the source
2552                                                    isn't utf8, as for example
2553                                                    when it is entirely composed
2554                                                    of hex constants */
2555
2556     /* Note on sizing:  The scanned constant is placed into sv, which is
2557      * initialized by newSV() assuming one byte of output for every byte of
2558      * input.  This routine expects newSV() to allocate an extra byte for a
2559      * trailing NUL, which this routine will append if it gets to the end of
2560      * the input.  There may be more bytes of input than output (eg., \N{LATIN
2561      * CAPITAL LETTER A}), or more output than input if the constant ends up
2562      * recoded to utf8, but each time a construct is found that might increase
2563      * the needed size, SvGROW() is called.  Its size parameter each time is
2564      * based on the best guess estimate at the time, namely the length used so
2565      * far, plus the length the current construct will occupy, plus room for
2566      * the trailing NUL, plus one byte for every input byte still unscanned */ 
2567
2568     UV uv;
2569 #ifdef EBCDIC
2570     UV literal_endpoint = 0;
2571     bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
2572 #endif
2573
2574     PERL_ARGS_ASSERT_SCAN_CONST;
2575
2576     if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
2577         /* If we are doing a trans and we know we want UTF8 set expectation */
2578         has_utf8   = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
2579         this_utf8  = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2580     }
2581
2582
2583     while (s < send || dorange) {
2584         /* get transliterations out of the way (they're most literal) */
2585         if (PL_lex_inwhat == OP_TRANS) {
2586             /* expand a range A-Z to the full set of characters.  AIE! */
2587             if (dorange) {
2588                 I32 i;                          /* current expanded character */
2589                 I32 min;                        /* first character in range */
2590                 I32 max;                        /* last character in range */
2591
2592 #ifdef EBCDIC
2593                 UV uvmax = 0;
2594 #endif
2595
2596                 if (has_utf8
2597 #ifdef EBCDIC
2598                     && !native_range
2599 #endif
2600                     ) {
2601                     char * const c = (char*)utf8_hop((U8*)d, -1);
2602                     char *e = d++;
2603                     while (e-- > c)
2604                         *(e + 1) = *e;
2605                     *c = (char)UTF_TO_NATIVE(0xff);
2606                     /* mark the range as done, and continue */
2607                     dorange = FALSE;
2608                     didrange = TRUE;
2609                     continue;
2610                 }
2611
2612                 i = d - SvPVX_const(sv);                /* remember current offset */
2613 #ifdef EBCDIC
2614                 SvGROW(sv,
2615                        SvLEN(sv) + (has_utf8 ?
2616                                     (512 - UTF_CONTINUATION_MARK +
2617                                      UNISKIP(0x100))
2618                                     : 256));
2619                 /* How many two-byte within 0..255: 128 in UTF-8,
2620                  * 96 in UTF-8-mod. */
2621 #else
2622                 SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
2623 #endif
2624                 d = SvPVX(sv) + i;              /* refresh d after realloc */
2625 #ifdef EBCDIC
2626                 if (has_utf8) {
2627                     int j;
2628                     for (j = 0; j <= 1; j++) {
2629                         char * const c = (char*)utf8_hop((U8*)d, -1);
2630                         const UV uv    = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
2631                         if (j)
2632                             min = (U8)uv;
2633                         else if (uv < 256)
2634                             max = (U8)uv;
2635                         else {
2636                             max = (U8)0xff; /* only to \xff */
2637                             uvmax = uv; /* \x{100} to uvmax */
2638                         }
2639                         d = c; /* eat endpoint chars */
2640                      }
2641                 }
2642                else {
2643 #endif
2644                    d -= 2;              /* eat the first char and the - */
2645                    min = (U8)*d;        /* first char in range */
2646                    max = (U8)d[1];      /* last char in range  */
2647 #ifdef EBCDIC
2648                }
2649 #endif
2650
2651                 if (min > max) {
2652                     Perl_croak(aTHX_
2653                                "Invalid range \"%c-%c\" in transliteration operator",
2654                                (char)min, (char)max);
2655                 }
2656
2657 #ifdef EBCDIC
2658                 if (literal_endpoint == 2 &&
2659                     ((isLOWER(min) && isLOWER(max)) ||
2660                      (isUPPER(min) && isUPPER(max)))) {
2661                     if (isLOWER(min)) {
2662                         for (i = min; i <= max; i++)
2663                             if (isLOWER(i))
2664                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2665                     } else {
2666                         for (i = min; i <= max; i++)
2667                             if (isUPPER(i))
2668                                 *d++ = NATIVE_TO_NEED(has_utf8,i);
2669                     }
2670                 }
2671                 else
2672 #endif
2673                     for (i = min; i <= max; i++)
2674 #ifdef EBCDIC
2675                         if (has_utf8) {
2676                             const U8 ch = (U8)NATIVE_TO_UTF(i);
2677                             if (UNI_IS_INVARIANT(ch))
2678                                 *d++ = (U8)i;
2679                             else {
2680                                 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2681                                 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2682                             }
2683                         }
2684                         else
2685 #endif
2686                             *d++ = (char)i;
2687  
2688 #ifdef EBCDIC
2689                 if (uvmax) {
2690                     d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2691                     if (uvmax > 0x101)
2692                         *d++ = (char)UTF_TO_NATIVE(0xff);
2693                     if (uvmax > 0x100)
2694                         d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2695                 }
2696 #endif
2697
2698                 /* mark the range as done, and continue */
2699                 dorange = FALSE;
2700                 didrange = TRUE;
2701 #ifdef EBCDIC
2702                 literal_endpoint = 0;
2703 #endif
2704                 continue;
2705             }
2706
2707             /* range begins (ignore - as first or last char) */
2708             else if (*s == '-' && s+1 < send  && s != start) {
2709                 if (didrange) {
2710                     Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
2711                 }
2712                 if (has_utf8
2713 #ifdef EBCDIC
2714                     && !native_range
2715 #endif
2716                     ) {
2717                     *d++ = (char)UTF_TO_NATIVE(0xff);   /* use illegal utf8 byte--see pmtrans */
2718                     s++;
2719                     continue;
2720                 }
2721                 dorange = TRUE;
2722                 s++;
2723             }
2724             else {
2725                 didrange = FALSE;
2726 #ifdef EBCDIC
2727                 literal_endpoint = 0;
2728                 native_range = TRUE;
2729 #endif
2730             }
2731         }
2732
2733         /* if we get here, we're not doing a transliteration */
2734
2735         /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2736            except for the last char, which will be done separately. */
2737         else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
2738             if (s[2] == '#') {
2739                 while (s+1 < send && *s != ')')
2740                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2741             }
2742             else if (s[2] == '{' /* This should match regcomp.c */
2743                     || (s[2] == '?' && s[3] == '{'))
2744             {
2745                 I32 count = 1;
2746                 char *regparse = s + (s[2] == '{' ? 3 : 4);
2747                 char c;
2748
2749                 while (count && (c = *regparse)) {
2750                     if (c == '\\' && regparse[1])
2751                         regparse++;
2752                     else if (c == '{')
2753                         count++;
2754                     else if (c == '}')
2755                         count--;
2756                     regparse++;
2757                 }
2758                 if (*regparse != ')')
2759                     regparse--;         /* Leave one char for continuation. */
2760                 while (s < regparse)
2761                     *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2762             }
2763         }
2764
2765         /* likewise skip #-initiated comments in //x patterns */
2766         else if (*s == '#' && PL_lex_inpat &&
2767           ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
2768             while (s+1 < send && *s != '\n')
2769                 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2770         }
2771
2772         /* check for embedded arrays
2773            (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
2774            */
2775         else if (*s == '@' && s[1]) {
2776             if (isALNUM_lazy_if(s+1,UTF))
2777                 break;
2778             if (strchr(":'{$", s[1]))
2779                 break;
2780             if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2781                 break; /* in regexp, neither @+ nor @- are interpolated */
2782         }
2783
2784         /* check for embedded scalars.  only stop if we're sure it's a
2785            variable.
2786         */
2787         else if (*s == '$') {
2788             if (!PL_lex_inpat)  /* not a regexp, so $ must be var */
2789                 break;
2790             if (s + 1 < send && !strchr("()| \r\n\t", s[1])) {
2791                 if (s[1] == '\\') {
2792                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2793                                    "Possible unintended interpolation of $\\ in regex");
2794                 }
2795                 break;          /* in regexp, $ might be tail anchor */
2796             }
2797         }
2798
2799         /* End of else if chain - OP_TRANS rejoin rest */
2800
2801         /* backslashes */
2802         if (*s == '\\' && s+1 < send) {
2803             s++;
2804
2805             /* deprecate \1 in strings and substitution replacements */
2806             if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
2807                 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
2808             {
2809                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
2810                 *--s = '$';
2811                 break;
2812             }
2813
2814             /* string-change backslash escapes */
2815             if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
2816                 --s;
2817                 break;
2818             }
2819             /* skip any other backslash escapes in a pattern */
2820             else if (PL_lex_inpat) {
2821                 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2822                 goto default_action;
2823             }
2824
2825             /* if we get here, it's either a quoted -, or a digit */
2826             switch (*s) {
2827
2828             /* quoted - in transliterations */
2829             case '-':
2830                 if (PL_lex_inwhat == OP_TRANS) {
2831                     *d++ = *s++;
2832                     continue;
2833                 }
2834                 /* FALL THROUGH */
2835             default:
2836                 {
2837                     if ((isALPHA(*s) || isDIGIT(*s)))
2838                         Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2839                                        "Unrecognized escape \\%c passed through",
2840                                        *s);
2841                     /* default action is to copy the quoted character */
2842                     goto default_action;
2843                 }
2844
2845             /* eg. \132 indicates the octal constant 0x132 */
2846             case '0': case '1': case '2': case '3':
2847             case '4': case '5': case '6': case '7':
2848                 {
2849                     I32 flags = 0;
2850                     STRLEN len = 3;
2851                     uv = NATIVE_TO_UNI(grok_oct(s, &len, &flags, NULL));
2852                     s += len;
2853                 }
2854                 goto NUM_ESCAPE_INSERT;
2855
2856             /* eg. \x24 indicates the hex constant 0x24 */
2857             case 'x':
2858                 ++s;
2859                 if (*s == '{') {
2860                     char* const e = strchr(s, '}');
2861                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2862                       PERL_SCAN_DISALLOW_PREFIX;
2863                     STRLEN len;
2864
2865                     ++s;
2866                     if (!e) {
2867                         yyerror("Missing right brace on \\x{}");
2868                         continue;
2869                     }
2870                     len = e - s;
2871                     uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2872                     s = e + 1;
2873                 }
2874                 else {
2875                     {
2876                         STRLEN len = 2;
2877                         I32 flags = PERL_SCAN_DISALLOW_PREFIX;
2878                         uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
2879                         s += len;
2880                     }
2881                 }
2882
2883               NUM_ESCAPE_INSERT:
2884                 /* Insert oct, hex, or \N{U+...} escaped character.  There will
2885                  * always be enough room in sv since such escapes will be
2886                  * longer than any UTF-8 sequence they can end up as, except if
2887                  * they force us to recode the rest of the string into utf8 */
2888                 
2889                 /* Here uv is the ordinal of the next character being added in
2890                  * unicode (converted from native).  (It has to be done before
2891                  * here because \N is interpreted as unicode, and oct and hex
2892                  * as native.) */
2893                 if (!UNI_IS_INVARIANT(uv)) {
2894                     if (!has_utf8 && uv > 255) {
2895                         /* Might need to recode whatever we have accumulated so
2896                          * far if it contains any chars variant in utf8 or
2897                          * utf-ebcdic. */
2898                           
2899                         SvCUR_set(sv, d - SvPVX_const(sv));
2900                         SvPOK_on(sv);
2901                         *d = '\0';
2902                         /* See Note on sizing above.  */
2903                         sv_utf8_upgrade_flags_grow(sv,
2904                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2905                                         UNISKIP(uv) + (STRLEN)(send - s) + 1);
2906                         d = SvPVX(sv) + SvCUR(sv);
2907                         has_utf8 = TRUE;
2908                     }
2909
2910                     if (has_utf8) {
2911                         d = (char*)uvuni_to_utf8((U8*)d, uv);
2912                         if (PL_lex_inwhat == OP_TRANS &&
2913                             PL_sublex_info.sub_op) {
2914                             PL_sublex_info.sub_op->op_private |=
2915                                 (PL_lex_repl ? OPpTRANS_FROM_UTF
2916                                              : OPpTRANS_TO_UTF);
2917                         }
2918 #ifdef EBCDIC
2919                         if (uv > 255 && !dorange)
2920                             native_range = FALSE;
2921 #endif
2922                     }
2923                     else {
2924                         *d++ = (char)uv;
2925                     }
2926                 }
2927                 else {
2928                     *d++ = (char) uv;
2929                 }
2930                 continue;
2931
2932             /* \N{LATIN SMALL LETTER A} is a named character, and so is
2933              * \N{U+0041} */
2934             case 'N':
2935                 ++s;
2936                 if (*s == '{') {
2937                     char* e = strchr(s, '}');
2938                     SV *res;
2939                     STRLEN len;
2940                     const char *str;
2941
2942                     if (!e) {
2943                         yyerror("Missing right brace on \\N{}");
2944                         e = s - 1;
2945                         goto cont_scan;
2946                     }
2947                     if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
2948                         /* \N{U+...} The ... is a unicode value even on EBCDIC
2949                          * machines */
2950                         I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2951                           PERL_SCAN_DISALLOW_PREFIX;
2952                         s += 3;
2953                         len = e - s;
2954                         uv = grok_hex(s, &len, &flags, NULL);
2955                         if ( e > s && len != (STRLEN)(e - s) ) {
2956                             uv = 0xFFFD;
2957                         }
2958                         s = e + 1;
2959                         goto NUM_ESCAPE_INSERT;
2960                     }
2961                     res = newSVpvn(s + 1, e - s - 1);
2962                     res = new_constant( NULL, 0, "charnames",
2963                                         res, NULL, s - 2, e - s + 3 );
2964                     if (has_utf8)
2965                         sv_utf8_upgrade(res);
2966                     str = SvPV_const(res,len);
2967 #ifdef EBCDIC_NEVER_MIND
2968                     /* charnames uses pack U and that has been
2969                      * recently changed to do the below uni->native
2970                      * mapping, so this would be redundant (and wrong,
2971                      * the code point would be doubly converted).
2972                      * But leave this in just in case the pack U change
2973                      * gets revoked, but the semantics is still
2974                      * desireable for charnames. --jhi */
2975                     {
2976                          UV uv = utf8_to_uvchr((const U8*)str, 0);
2977
2978                          if (uv < 0x100) {
2979                               U8 tmpbuf[UTF8_MAXBYTES+1], *d;
2980
2981                               d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
2982                               sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
2983                               str = SvPV_const(res, len);
2984                          }
2985                     }
2986 #endif
2987                     /* If destination is not in utf8 but this new character is,
2988                      * recode the dest to utf8 */
2989                     if (!has_utf8 && SvUTF8(res)) {
2990                         SvCUR_set(sv, d - SvPVX_const(sv));
2991                         SvPOK_on(sv);
2992                         *d = '\0';
2993                         /* See Note on sizing above.  */
2994                         sv_utf8_upgrade_flags_grow(sv,
2995                                             SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2996                                             len + (STRLEN)(send - s) + 1);
2997                         d = SvPVX(sv) + SvCUR(sv);
2998                         has_utf8 = TRUE;
2999                     } else if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
3000
3001                         /* See Note on sizing above.  (NOTE: SvCUR() is not set
3002                          * correctly here). */
3003                         const STRLEN off = d - SvPVX_const(sv);
3004                         d = SvGROW(sv, off + len + (STRLEN)(send - s) + 1) + off;
3005                     }
3006 #ifdef EBCDIC
3007                     if (!dorange)
3008                         native_range = FALSE; /* \N{} is guessed to be Unicode */
3009 #endif
3010                     Copy(str, d, len, char);
3011                     d += len;
3012                     SvREFCNT_dec(res);
3013                   cont_scan:
3014                     s = e + 1;
3015                 }
3016                 else
3017                     yyerror("Missing braces on \\N{}");
3018                 continue;
3019
3020             /* \c is a control character */
3021             case 'c':
3022                 s++;
3023                 if (s < send) {
3024                     U8 c = *s++;
3025 #ifdef EBCDIC
3026                     if (isLOWER(c))
3027                         c = toUPPER(c);
3028 #endif
3029                     *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
3030                 }
3031                 else {
3032                     yyerror("Missing control char name in \\c");
3033                 }
3034                 continue;
3035
3036             /* printf-style backslashes, formfeeds, newlines, etc */
3037             case 'b':
3038                 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
3039                 break;
3040             case 'n':
3041                 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
3042                 break;
3043             case 'r':
3044                 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
3045                 break;
3046             case 'f':
3047                 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
3048                 break;
3049             case 't':
3050                 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
3051                 break;
3052             case 'e':
3053                 *d++ = ASCII_TO_NEED(has_utf8,'\033');
3054                 break;
3055             case 'a':
3056                 *d++ = ASCII_TO_NEED(has_utf8,'\007');
3057                 break;
3058             } /* end switch */
3059
3060             s++;
3061             continue;
3062         } /* end if (backslash) */
3063 #ifdef EBCDIC
3064         else
3065             literal_endpoint++;
3066 #endif
3067
3068     default_action:
3069         /* If we started with encoded form, or already know we want it,
3070            then encode the next character */
3071         if (! NATIVE_IS_INVARIANT((U8)(*s)) && (this_utf8 || has_utf8)) {
3072             STRLEN len  = 1;
3073
3074
3075             /* One might think that it is wasted effort in the case of the
3076              * source being utf8 (this_utf8 == TRUE) to take the next character
3077              * in the source, convert it to an unsigned value, and then convert
3078              * it back again.  But the source has not been validated here.  The
3079              * routine that does the conversion checks for errors like
3080              * malformed utf8 */
3081
3082             const UV nextuv   = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
3083             const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
3084             if (!has_utf8) {
3085                 SvCUR_set(sv, d - SvPVX_const(sv));
3086                 SvPOK_on(sv);
3087                 *d = '\0';
3088                 /* See Note on sizing above.  */
3089                 sv_utf8_upgrade_flags_grow(sv,
3090                                         SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3091                                         need + (STRLEN)(send - s) + 1);
3092                 d = SvPVX(sv) + SvCUR(sv);
3093                 has_utf8 = TRUE;
3094             } else if (need > len) {
3095                 /* encoded value larger than old, may need extra space (NOTE:
3096                  * SvCUR() is not set correctly here).   See Note on sizing
3097                  * above.  */
3098                 const STRLEN off = d - SvPVX_const(sv);
3099                 d = SvGROW(sv, off + need + (STRLEN)(send - s) + 1) + off;
3100             }
3101             s += len;
3102
3103             d = (char*)uvchr_to_utf8((U8*)d, nextuv);
3104 #ifdef EBCDIC
3105             if (uv > 255 && !dorange)
3106                 native_range = FALSE;
3107 #endif
3108         }
3109         else {
3110             *d++ = NATIVE_TO_NEED(has_utf8,*s++);
3111         }
3112     } /* while loop to process each character */
3113
3114     /* terminate the string and set up the sv */
3115     *d = '\0';
3116     SvCUR_set(sv, d - SvPVX_const(sv));
3117     if (SvCUR(sv) >= SvLEN(sv))
3118         Perl_croak(aTHX_ "panic: constant overflowed allocated space");
3119
3120     SvPOK_on(sv);
3121     if (PL_encoding && !has_utf8) {
3122         sv_recode_to_utf8(sv, PL_encoding);
3123         if (SvUTF8(sv))
3124             has_utf8 = TRUE;
3125     }
3126     if (has_utf8) {
3127         SvUTF8_on(sv);
3128         if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
3129             PL_sublex_info.sub_op->op_private |=
3130                     (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
3131         }
3132     }
3133
3134     /* shrink the sv if we allocated more than we used */
3135     if (SvCUR(sv) + 5 < SvLEN(sv)) {
3136         SvPV_shrink_to_cur(sv);
3137     }
3138
3139     /* return the substring (via pl_yylval) only if we parsed anything */
3140     if (s > PL_bufptr) {
3141         if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) ) {
3142             const char *const key = PL_lex_inpat ? "qr" : "q";
3143             const STRLEN keylen = PL_lex_inpat ? 2 : 1;
3144             const char *type;
3145             STRLEN typelen;
3146
3147             if (PL_lex_inwhat == OP_TRANS) {
3148                 type = "tr";
3149                 typelen = 2;
3150             } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
3151                 type = "s";
3152                 typelen = 1;
3153             } else  {
3154                 type = "qq";
3155                 typelen = 2;
3156             }
3157
3158             sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
3159                                 type, typelen);
3160         }
3161         pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3162     } else
3163         SvREFCNT_dec(sv);
3164     return s;
3165 }
3166
3167 /* S_intuit_more
3168  * Returns TRUE if there's more to the expression (e.g., a subscript),
3169  * FALSE otherwise.
3170  *
3171  * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
3172  *
3173  * ->[ and ->{ return TRUE
3174  * { and [ outside a pattern are always subscripts, so return TRUE
3175  * if we're outside a pattern and it's not { or [, then return FALSE
3176  * if we're in a pattern and the first char is a {
3177  *   {4,5} (any digits around the comma) returns FALSE
3178  * if we're in a pattern and the first char is a [
3179  *   [] returns FALSE
3180  *   [SOMETHING] has a funky algorithm to decide whether it's a
3181  *      character class or not.  It has to deal with things like
3182  *      /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
3183  * anything else returns TRUE
3184  */
3185
3186 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
3187
3188 STATIC int
3189 S_intuit_more(pTHX_ register char *s)
3190 {
3191     dVAR;
3192
3193     PERL_ARGS_ASSERT_INTUIT_MORE;
3194
3195     if (PL_lex_brackets)
3196         return TRUE;
3197     if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
3198         return TRUE;
3199     if (*s != '{' && *s != '[')
3200         return FALSE;
3201     if (!PL_lex_inpat)
3202         return TRUE;
3203
3204     /* In a pattern, so maybe we have {n,m}. */
3205     if (*s == '{') {
3206         s++;
3207         if (!isDIGIT(*s))
3208             return TRUE;
3209         while (isDIGIT(*s))
3210             s++;
3211         if (*s == ',')
3212             s++;
3213         while (isDIGIT(*s))
3214             s++;
3215         if (*s == '}')
3216             return FALSE;
3217         return TRUE;
3218         
3219     }
3220
3221     /* On the other hand, maybe we have a character class */
3222
3223     s++;
3224     if (*s == ']' || *s == '^')
3225         return FALSE;
3226     else {
3227         /* this is terrifying, and it works */
3228         int weight = 2;         /* let's weigh the evidence */
3229         char seen[256];
3230         unsigned char un_char = 255, last_un_char;
3231         const char * const send = strchr(s,']');
3232         char tmpbuf[sizeof PL_tokenbuf * 4];
3233
3234         if (!send)              /* has to be an expression */
3235             return TRUE;
3236
3237         Zero(seen,256,char);
3238         if (*s == '$')
3239             weight -= 3;
3240         else if (isDIGIT(*s)) {
3241             if (s[1] != ']') {
3242                 if (isDIGIT(s[1]) && s[2] == ']')
3243                     weight -= 10;
3244             }
3245             else
3246                 weight -= 100;
3247         }
3248         for (; s < send; s++) {
3249             last_un_char = un_char;
3250             un_char = (unsigned char)*s;
3251             switch (*s) {
3252             case '@':
3253             case '&':
3254             case '$':
3255                 weight -= seen[un_char] * 10;
3256                 if (isALNUM_lazy_if(s+1,UTF)) {
3257                     int len;
3258                     scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
3259                     len = (int)strlen(tmpbuf);
3260                     if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
3261                         weight -= 100;
3262                     else
3263                         weight -= 10;
3264                 }
3265                 else if (*s == '$' && s[1] &&
3266                   strchr("[#!%*<>()-=",s[1])) {
3267                     if (/*{*/ strchr("])} =",s[2]))
3268                         weight -= 10;
3269                     else
3270                         weight -= 1;
3271                 }
3272                 break;
3273             case '\\':
3274                 un_char = 254;
3275                 if (s[1]) {
3276                     if (strchr("wds]",s[1]))
3277                         weight += 100;
3278                     else if (seen[(U8)'\''] || seen[(U8)'"'])
3279                         weight += 1;
3280                     else if (strchr("rnftbxcav",s[1]))
3281                         weight += 40;
3282                     else if (isDIGIT(s[1])) {
3283                         weight += 40;
3284                         while (s[1] && isDIGIT(s[1]))
3285                             s++;
3286                     }
3287                 }
3288                 else
3289                     weight += 100;
3290                 break;
3291             case '-':
3292                 if (s[1] == '\\')
3293                     weight += 50;
3294                 if (strchr("aA01! ",last_un_char))
3295                     weight += 30;
3296                 if (strchr("zZ79~",s[1]))
3297                     weight += 30;
3298                 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
3299                     weight -= 5;        /* cope with negative subscript */
3300                 break;
3301             default:
3302                 if (!isALNUM(last_un_char)
3303                     && !(last_un_char == '$' || last_un_char == '@'
3304                          || last_un_char == '&')
3305                     && isALPHA(*s) && s[1] && isALPHA(s[1])) {
3306                     char *d = tmpbuf;
3307                     while (isALPHA(*s))
3308                         *d++ = *s++;
3309                     *d = '\0';
3310                     if (keyword(tmpbuf, d - tmpbuf, 0))
3311                         weight -= 150;
3312                 }
3313                 if (un_char == last_un_char + 1)
3314                     weight += 5;
3315                 weight -= seen[un_char];
3316                 break;
3317             }
3318             seen[un_char]++;
3319         }
3320         if (weight >= 0)        /* probably a character class */
3321             return FALSE;
3322     }
3323
3324     return TRUE;
3325 }
3326
3327 /*
3328  * S_intuit_method
3329  *
3330  * Does all the checking to disambiguate
3331  *   foo bar
3332  * between foo(bar) and bar->foo.  Returns 0 if not a method, otherwise
3333  * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
3334  *
3335  * First argument is the stuff after the first token, e.g. "bar".
3336  *
3337  * Not a method if bar is a filehandle.
3338  * Not a method if foo is a subroutine prototyped to take a filehandle.
3339  * Not a method if it's really "Foo $bar"
3340  * Method if it's "foo $bar"
3341  * Not a method if it's really "print foo $bar"
3342  * Method if it's really "foo package::" (interpreted as package->foo)
3343  * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3344  * Not a method if bar is a filehandle or package, but is quoted with
3345  *   =>
3346  */
3347
3348 STATIC int
3349 S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
3350 {
3351     dVAR;
3352     char *s = start + (*start == '$');
3353     char tmpbuf[sizeof PL_tokenbuf];
3354     STRLEN len;
3355     GV* indirgv;
3356 #ifdef PERL_MAD
3357     int soff;
3358 #endif
3359
3360     PERL_ARGS_ASSERT_INTUIT_METHOD;
3361
3362     if (gv) {
3363         if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
3364             return 0;
3365         if (cv) {
3366             if (SvPOK(cv)) {
3367                 const char *proto = SvPVX_const(cv);
3368                 if (proto) {
3369                     if (*proto == ';')
3370                         proto++;
3371                     if (*proto == '*')
3372                         return 0;
3373                 }
3374             }
3375         } else
3376             gv = NULL;
3377     }
3378     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3379     /* start is the beginning of the possible filehandle/object,
3380      * and s is the end of it
3381      * tmpbuf is a copy of it
3382      */
3383
3384     if (*start == '$') {
3385         if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
3386                 isUPPER(*PL_tokenbuf))
3387             return 0;
3388 #ifdef PERL_MAD
3389         len = start - SvPVX(PL_linestr);
3390 #endif
3391         s = PEEKSPACE(s);
3392 #ifdef PERL_MAD
3393         start = SvPVX(PL_linestr) + len;
3394 #endif
3395         PL_bufptr = start;
3396         PL_expect = XREF;
3397         return *s == '(' ? FUNCMETH : METHOD;
3398     }
3399     if (!keyword(tmpbuf, len, 0)) {
3400         if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
3401             len -= 2;
3402             tmpbuf[len] = '\0';
3403 #ifdef PERL_MAD
3404             soff = s - SvPVX(PL_linestr);
3405 #endif
3406             goto bare_package;
3407         }
3408         indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
3409         if (indirgv && GvCVu(indirgv))
3410             return 0;
3411         /* filehandle or package name makes it a method */
3412         if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
3413 #ifdef PERL_MAD
3414             soff = s - SvPVX(PL_linestr);
3415 #endif
3416             s = PEEKSPACE(s);
3417             if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
3418                 return 0;       /* no assumptions -- "=>" quotes bearword */
3419       bare_package:
3420             start_force(PL_curforce);
3421             NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
3422                                                   S_newSV_maybe_utf8(aTHX_ tmpbuf, len));
3423             NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
3424             if (PL_madskills)
3425                 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3426             PL_expect = XTERM;
3427             force_next(WORD);
3428             PL_bufptr = s;
3429 #ifdef PERL_MAD
3430             PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
3431 #endif
3432             return *s == '(' ? FUNCMETH : METHOD;
3433         }
3434     }
3435     return 0;
3436 }
3437
3438 /* Encoded script support. filter_add() effectively inserts a
3439  * 'pre-processing' function into the current source input stream.
3440  * Note that the filter function only applies to the current source file
3441  * (e.g., it will not affect files 'require'd or 'use'd by this one).
3442  *
3443  * The datasv parameter (which may be NULL) can be used to pass
3444  * private data to this instance of the filter. The filter function
3445  * can recover the SV using the FILTER_DATA macro and use it to
3446  * store private buffers and state information.
3447  *
3448  * The supplied datasv parameter is upgraded to a PVIO type
3449  * and the IoDIRP/IoANY field is used to store the function pointer,
3450  * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
3451  * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
3452  * private use must be set using malloc'd pointers.
3453  */
3454
3455 SV *
3456 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
3457 {
3458     dVAR;
3459     if (!funcp)
3460         return NULL;
3461
3462     if (!PL_parser)
3463         return NULL;
3464
3465     if (!PL_rsfp_filters)
3466         PL_rsfp_filters = newAV();
3467     if (!datasv)
3468         datasv = newSV(0);
3469     SvUPGRADE(datasv, SVt_PVIO);
3470     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
3471     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
3472     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
3473                           FPTR2DPTR(void *, IoANY(datasv)),
3474                           SvPV_nolen(datasv)));
3475     av_unshift(PL_rsfp_filters, 1);
3476     av_store(PL_rsfp_filters, 0, datasv) ;
3477     return(datasv);
3478 }
3479
3480
3481 /* Delete most recently added instance of this filter function. */
3482 void
3483 Perl_filter_del(pTHX_ filter_t funcp)
3484 {
3485     dVAR;
3486     SV *datasv;
3487
3488     PERL_ARGS_ASSERT_FILTER_DEL;
3489
3490 #ifdef DEBUGGING
3491     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
3492                           FPTR2DPTR(void*, funcp)));
3493 #endif
3494     if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
3495         return;
3496     /* if filter is on top of stack (usual case) just pop it off */
3497     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
3498     if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
3499         IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
3500         IoANY(datasv) = (void *)NULL;
3501         sv_free(av_pop(PL_rsfp_filters));
3502
3503         return;
3504     }
3505     /* we need to search for the correct entry and clear it     */
3506     Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
3507 }
3508
3509
3510 /* Invoke the idxth filter function for the current rsfp.        */
3511 /* maxlen 0 = read one text line */
3512 I32
3513 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
3514 {
3515     dVAR;
3516     filter_t funcp;
3517     SV *datasv = NULL;
3518     /* This API is bad. It should have been using unsigned int for maxlen.
3519        Not sure if we want to change the API, but if not we should sanity
3520        check the value here.  */
3521     const unsigned int correct_length
3522         = maxlen < 0 ?
3523 #ifdef PERL_MICRO
3524         0x7FFFFFFF
3525 #else
3526         INT_MAX
3527 #endif
3528         : maxlen;
3529
3530     PERL_ARGS_ASSERT_FILTER_READ;
3531
3532     if (!PL_parser || !PL_rsfp_filters)
3533         return -1;
3534     if (idx > AvFILLp(PL_rsfp_filters)) {       /* Any more filters?    */
3535         /* Provide a default input filter to make life easy.    */
3536         /* Note that we append to the line. This is handy.      */
3537         DEBUG_P(PerlIO_printf(Perl_debug_log,
3538                               "filter_read %d: from rsfp\n", idx));
3539         if (correct_length) {
3540             /* Want a block */
3541             int len ;
3542             const int old_len = SvCUR(buf_sv);
3543
3544             /* ensure buf_sv is large enough */
3545             SvGROW(buf_sv, (STRLEN)(old_len + correct_length + 1)) ;
3546             if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
3547                                    correct_length)) <= 0) {
3548                 if (PerlIO_error(PL_rsfp))
3549                     return -1;          /* error */
3550                 else
3551                     return 0 ;          /* end of file */
3552             }
3553             SvCUR_set(buf_sv, old_len + len) ;
3554             SvPVX(buf_sv)[old_len + len] = '\0';
3555         } else {
3556             /* Want a line */
3557             if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
3558                 if (PerlIO_error(PL_rsfp))
3559                     return -1;          /* error */
3560                 else
3561                     return 0 ;          /* end of file */
3562             }
3563         }
3564         return SvCUR(buf_sv);
3565     }
3566     /* Skip this filter slot if filter has been deleted */
3567     if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
3568         DEBUG_P(PerlIO_printf(Perl_debug_log,
3569                               "filter_read %d: skipped (filter deleted)\n",
3570                               idx));
3571         return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
3572     }
3573     /* Get function pointer hidden within datasv        */
3574     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
3575     DEBUG_P(PerlIO_printf(Perl_debug_log,
3576                           "filter_read %d: via function %p (%s)\n",
3577                           idx, (void*)datasv, SvPV_nolen_const(datasv)));
3578     /* Call function. The function is expected to       */
3579     /* call "FILTER_READ(idx+1, buf_sv)" first.         */
3580     /* Return: <0:error, =0:eof, >0:not eof             */
3581     return (*funcp)(aTHX_ idx, buf_sv, correct_length);
3582 }
3583
3584 STATIC char *
3585 S_filter_gets(pTHX_ register SV *sv, STRLEN append)
3586 {
3587     dVAR;
3588
3589     PERL_ARGS_ASSERT_FILTER_GETS;
3590
3591 #ifdef PERL_CR_FILTER
3592     if (!PL_rsfp_filters) {
3593         filter_add(S_cr_textfilter,NULL);
3594     }
3595 #endif
3596     if (PL_rsfp_filters) {
3597         if (!append)
3598             SvCUR_set(sv, 0);   /* start with empty line        */
3599         if (FILTER_READ(0, sv, 0) > 0)
3600             return ( SvPVX(sv) ) ;
3601         else
3602             return NULL ;
3603     }
3604     else
3605         return (sv_gets(sv, PL_rsfp, append));
3606 }
3607
3608 STATIC HV *
3609 S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
3610 {
3611     dVAR;
3612     GV *gv;
3613
3614     PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
3615
3616     if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
3617         return PL_curstash;
3618
3619     if (len > 2 &&
3620         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
3621         (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
3622     {
3623         return GvHV(gv);                        /* Foo:: */
3624     }
3625
3626     /* use constant CLASS => 'MyClass' */
3627     gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
3628     if (gv && GvCV(gv)) {
3629         SV * const sv = cv_const_sv(GvCV(gv));
3630         if (sv)
3631             pkgname = SvPV_const(sv, len);
3632     }
3633
3634     return gv_stashpvn(pkgname, len, 0);
3635 }
3636
3637 /*
3638  * S_readpipe_override
3639  * Check whether readpipe() is overriden, and generates the appropriate
3640  * optree, provided sublex_start() is called afterwards.
3641  */
3642 STATIC void
3643 S_readpipe_override(pTHX)
3644 {
3645     GV **gvp;
3646     GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
3647     pl_yylval.ival = OP_BACKTICK;
3648     if ((gv_readpipe
3649                 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
3650             ||
3651             ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
3652              && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
3653              && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
3654     {
3655         PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
3656             append_elem(OP_LIST,
3657                 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
3658                 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
3659     }
3660 }
3661
3662 #ifdef PERL_MAD 
3663  /*
3664  * Perl_madlex
3665  * The intent of this yylex wrapper is to minimize the changes to the
3666  * tokener when we aren't interested in collecting madprops.  It remains
3667  * to be seen how successful this strategy will be...
3668  */
3669
3670 int
3671 Perl_madlex(pTHX)
3672 {
3673     int optype;
3674     char *s = PL_bufptr;
3675
3676     /* make sure PL_thiswhite is initialized */
3677     PL_thiswhite = 0;
3678     PL_thismad = 0;
3679
3680     /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
3681     if (PL_pending_ident)
3682         return S_pending_ident(aTHX);
3683
3684     /* previous token ate up our whitespace? */
3685     if (!PL_lasttoke && PL_nextwhite) {
3686         PL_thiswhite = PL_nextwhite;
3687         PL_nextwhite = 0;
3688     }
3689
3690     /* isolate the token, and figure out where it is without whitespace */
3691     PL_realtokenstart = -1;
3692     PL_thistoken = 0;
3693     optype = yylex();
3694     s = PL_bufptr;
3695     assert(PL_curforce < 0);
3696
3697     if (!PL_thismad || PL_thismad->mad_key == '^') {    /* not forced already? */
3698         if (!PL_thistoken) {
3699             if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
3700                 PL_thistoken = newSVpvs("");
3701             else {
3702                 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
3703                 PL_thistoken = newSVpvn(tstart, s - tstart);
3704             }
3705         }
3706         if (PL_thismad) /* install head */
3707             CURMAD('X', PL_thistoken);
3708     }
3709
3710     /* last whitespace of a sublex? */
3711     if (optype == ')' && PL_endwhite) {
3712         CURMAD('X', PL_endwhite);
3713     }
3714
3715     if (!PL_thismad) {
3716
3717         /* if no whitespace and we're at EOF, bail.  Otherwise fake EOF below. */
3718         if (!PL_thiswhite && !PL_endwhite && !optype) {
3719             sv_free(PL_thistoken);
3720             PL_thistoken = 0;
3721             return 0;
3722         }
3723
3724         /* put off final whitespace till peg */
3725         if (optype == ';' && !PL_rsfp) {
3726             PL_nextwhite = PL_thiswhite;
3727             PL_thiswhite = 0;
3728         }
3729         else if (PL_thisopen) {
3730             CURMAD('q', PL_thisopen);
3731             if (PL_thistoken)
3732                 sv_free(PL_thistoken);
3733             PL_thistoken = 0;
3734         }
3735         else {
3736             /* Store actual token text as madprop X */
3737             CURMAD('X', PL_thistoken);
3738         }
3739
3740         if (PL_thiswhite) {
3741             /* add preceding whitespace as madprop _ */
3742             CURMAD('_', PL_thiswhite);
3743         }
3744
3745         if (PL_thisstuff) {
3746             /* add quoted material as madprop = */
3747             CURMAD('=', PL_thisstuff);
3748         }
3749
3750         if (PL_thisclose) {
3751             /* add terminating quote as madprop Q */
3752             CURMAD('Q', PL_thisclose);
3753         }
3754     }
3755
3756     /* special processing based on optype */
3757
3758     switch (optype) {
3759
3760     /* opval doesn't need a TOKEN since it can already store mp */
3761     case WORD:
3762     case METHOD:
3763     case FUNCMETH:
3764     case THING:
3765     case PMFUNC:
3766     case PRIVATEREF:
3767     case FUNC0SUB:
3768     case UNIOPSUB:
3769     case LSTOPSUB:
3770         if (pl_yylval.opval)
3771             append_madprops(PL_thismad, pl_yylval.opval, 0);
3772         PL_thismad = 0;
3773         return optype;
3774
3775     /* fake EOF */
3776     case 0:
3777         optype = PEG;
3778         if (PL_endwhite) {
3779             addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
3780             PL_endwhite = 0;
3781         }
3782         break;
3783
3784     case ']':
3785     case '}':
3786         if (PL_faketokens)
3787             break;
3788         /* remember any fake bracket that lexer is about to discard */ 
3789         if (PL_lex_brackets == 1 &&
3790             ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
3791         {
3792             s = PL_bufptr;
3793             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3794                 s++;
3795             if (*s == '}') {
3796                 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
3797                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3798                 PL_thiswhite = 0;
3799                 PL_bufptr = s - 1;
3800                 break;  /* don't bother looking for trailing comment */
3801             }
3802             else
3803                 s = PL_bufptr;
3804         }
3805         if (optype == ']')
3806             break;
3807         /* FALLTHROUGH */
3808
3809     /* attach a trailing comment to its statement instead of next token */
3810     case ';':
3811         if (PL_faketokens)
3812             break;
3813         if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
3814             s = PL_bufptr;
3815             while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3816                 s++;
3817             if (*s == '\n' || *s == '#') {
3818                 while (s < PL_bufend && *s != '\n')
3819                     s++;
3820                 if (s < PL_bufend)
3821                     s++;
3822                 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
3823                 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3824                 PL_thiswhite = 0;
3825                 PL_bufptr = s;
3826             }
3827         }
3828         break;
3829
3830     /* pval */
3831     case LABEL:
3832         break;
3833
3834     /* ival */
3835     default:
3836         break;
3837
3838     }
3839
3840     /* Create new token struct.  Note: opvals return early above. */
3841     pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
3842     PL_thismad = 0;
3843     return optype;
3844 }
3845 #endif
3846
3847 STATIC char *
3848 S_tokenize_use(pTHX_ int is_use, char *s) {
3849     dVAR;
3850
3851     PERL_ARGS_ASSERT_TOKENIZE_USE;
3852
3853     if (PL_expect != XSTATE)
3854         yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
3855                     is_use ? "use" : "no"));
3856     s = SKIPSPACE1(s);
3857     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
3858         s = force_version(s, TRUE);
3859         if (*s == ';' || *s == '}'
3860                 || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) {
3861             start_force(PL_curforce);
3862             NEXTVAL_NEXTTOKE.opval = NULL;
3863             force_next(WORD);
3864         }
3865         else if (*s == 'v') {
3866             s = force_word(s,WORD,FALSE,TRUE,FALSE);
3867             s = force_version(s, FALSE);
3868         }
3869     }
3870     else {
3871         s = force_word(s,WORD,FALSE,TRUE,FALSE);
3872         s = force_version(s, FALSE);
3873     }
3874     pl_yylval.ival = is_use;
3875     return s;
3876 }
3877 #ifdef DEBUGGING
3878     static const char* const exp_name[] =
3879         { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
3880           "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
3881         };
3882 #endif
3883
3884 /*
3885   yylex
3886
3887   Works out what to call the token just pulled out of the input
3888   stream.  The yacc parser takes care of taking the ops we return and
3889   stitching them into a tree.
3890
3891   Returns:
3892     PRIVATEREF
3893
3894   Structure:
3895       if read an identifier
3896           if we're in a my declaration
3897               croak if they tried to say my($foo::bar)
3898               build the ops for a my() declaration
3899           if it's an access to a my() variable
3900               are we in a sort block?
3901                   croak if my($a); $a <=> $b
3902               build ops for access to a my() variable
3903           if in a dq string, and they've said @foo and we can't find @foo
3904               croak
3905           build ops for a bareword
3906       if we already built the token before, use it.
3907 */
3908
3909
3910 #ifdef __SC__
3911 #pragma segment Perl_yylex
3912 #endif
3913 int
3914 Perl_yylex(pTHX)
3915 {
3916     dVAR;
3917     register char *s = PL_bufptr;
3918     register char *d;
3919     STRLEN len;
3920     bool bof = FALSE;
3921     U32 fake_eof = 0;
3922
3923     /* orig_keyword, gvp, and gv are initialized here because
3924      * jump to the label just_a_word_zero can bypass their
3925      * initialization later. */
3926     I32 orig_keyword = 0;
3927     GV *gv = NULL;
3928     GV **gvp = NULL;
3929
3930     DEBUG_T( {
3931         SV* tmp = newSVpvs("");
3932         PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
3933             (IV)CopLINE(PL_curcop),
3934             lex_state_names[PL_lex_state],
3935             exp_name[PL_expect],
3936             pv_display(tmp, s, strlen(s), 0, 60));
3937         SvREFCNT_dec(tmp);
3938     } );
3939     /* check if there's an identifier for us to look at */
3940     if (PL_pending_ident)
3941         return REPORT(S_pending_ident(aTHX));
3942
3943     /* no identifier pending identification */
3944
3945     switch (PL_lex_state) {
3946 #ifdef COMMENTARY
3947     case LEX_NORMAL:            /* Some compilers will produce faster */
3948     case LEX_INTERPNORMAL:      /* code if we comment these out. */
3949         break;
3950 #endif
3951
3952     /* when we've already built the next token, just pull it out of the queue */
3953     case LEX_KNOWNEXT:
3954 #ifdef PERL_MAD
3955         PL_lasttoke--;
3956         pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
3957         if (PL_madskills) {
3958             PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
3959             PL_nexttoke[PL_lasttoke].next_mad = 0;
3960             if (PL_thismad && PL_thismad->mad_key == '_') {
3961                 PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
3962                 PL_thismad->mad_val = 0;
3963                 mad_free(PL_thismad);
3964                 PL_thismad = 0;
3965             }
3966         }
3967         if (!PL_lasttoke) {
3968             PL_lex_state = PL_lex_defer;
3969             PL_expect = PL_lex_expect;
3970             PL_lex_defer = LEX_NORMAL;
3971             if (!PL_nexttoke[PL_lasttoke].next_type)
3972                 return yylex();
3973         }
3974 #else
3975         PL_nexttoke--;
3976         pl_yylval = PL_nextval[PL_nexttoke];
3977         if (!PL_nexttoke) {
3978             PL_lex_state = PL_lex_defer;
3979             PL_expect = PL_lex_expect;
3980             PL_lex_defer = LEX_NORMAL;
3981         }
3982 #endif
3983 #ifdef PERL_MAD
3984         /* FIXME - can these be merged?  */
3985         return(PL_nexttoke[PL_lasttoke].next_type);
3986 #else
3987         return REPORT(PL_nexttype[PL_nexttoke]);
3988 #endif
3989
3990     /* interpolated case modifiers like \L \U, including \Q and \E.
3991        when we get here, PL_bufptr is at the \
3992     */
3993     case LEX_INTERPCASEMOD:
3994 #ifdef DEBUGGING
3995         if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
3996             Perl_croak(aTHX_ "panic: INTERPCASEMOD");
3997 #endif
3998         /* handle \E or end of string */
3999         if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
4000             /* if at a \E */
4001             if (PL_lex_casemods) {
4002                 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
4003                 PL_lex_casestack[PL_lex_casemods] = '\0';
4004
4005                 if (PL_bufptr != PL_bufend
4006                     && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
4007                     PL_bufptr += 2;
4008                     PL_lex_state = LEX_INTERPCONCAT;
4009 #ifdef PERL_MAD
4010                     if (PL_madskills)
4011                         PL_thistoken = newSVpvs("\\E");
4012 #endif
4013                 }
4014                 return REPORT(')');
4015             }
4016 #ifdef PERL_MAD
4017             while (PL_bufptr != PL_bufend &&
4018               PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
4019                 if (!PL_thiswhite)
4020                     PL_thiswhite = newSVpvs("");
4021                 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
4022                 PL_bufptr += 2;
4023             }
4024 #else
4025             if (PL_bufptr != PL_bufend)
4026                 PL_bufptr += 2;
4027 #endif
4028             PL_lex_state = LEX_INTERPCONCAT;
4029             return yylex();
4030         }
4031         else {
4032             DEBUG_T({ PerlIO_printf(Perl_debug_log,
4033               "### Saw case modifier\n"); });
4034             s = PL_bufptr + 1;
4035             if (s[1] == '\\' && s[2] == 'E') {
4036 #ifdef PERL_MAD
4037                 if (!PL_thiswhite)
4038                     PL_thiswhite = newSVpvs("");
4039                 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
4040 #endif
4041                 PL_bufptr = s + 3;
4042                 PL_lex_state = LEX_INTERPCONCAT;
4043                 return yylex();
4044             }
4045             else {
4046                 I32 tmp;
4047                 if (!PL_madskills) /* when just compiling don't need correct */
4048                     if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
4049                         tmp = *s, *s = s[2], s[2] = (char)tmp;  /* misordered... */
4050                 if ((*s == 'L' || *s == 'U') &&
4051                     (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
4052                     PL_lex_casestack[--PL_lex_casemods] = '\0';
4053                     return REPORT(')');
4054                 }
4055                 if (PL_lex_casemods > 10)
4056                     Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
4057                 PL_lex_casestack[PL_lex_casemods++] = *s;
4058                 PL_lex_casestack[PL_lex_casemods] = '\0';
4059                 PL_lex_state = LEX_INTERPCONCAT;
4060                 start_force(PL_curforce);
4061                 NEXTVAL_NEXTTOKE.ival = 0;
4062                 force_next('(');
4063                 start_force(PL_curforce);
4064                 if (*s == 'l')
4065                     NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
4066                 else if (*s == 'u')
4067                     NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
4068                 else if (*s == 'L')
4069                     NEXTVAL_NEXTTOKE.ival = OP_LC;
4070                 else if (*s == 'U')
4071                     NEXTVAL_NEXTTOKE.ival = OP_UC;
4072                 else if (*s == 'Q')
4073                     NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
4074                 else
4075                     Perl_croak(aTHX_ "panic: yylex");
4076                 if (PL_madskills) {
4077                     SV* const tmpsv = newSVpvs("\\ ");
4078                     /* replace the space with the character we want to escape
4079                      */
4080                     SvPVX(tmpsv)[1] = *s;
4081                     curmad('_', tmpsv);
4082                 }
4083                 PL_bufptr = s + 1;
4084             }
4085             force_next(FUNC);
4086             if (PL_lex_starts) {
4087                 s = PL_bufptr;
4088                 PL_lex_starts = 0;
4089 #ifdef PERL_MAD
4090                 if (PL_madskills) {
4091                     if (PL_thistoken)
4092                         sv_free(PL_thistoken);
4093                     PL_thistoken = newSVpvs("");
4094                 }
4095 #endif
4096                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4097                 if (PL_lex_casemods == 1 && PL_lex_inpat)
4098                     OPERATOR(',');
4099                 else
4100                     Aop(OP_CONCAT);
4101             }
4102             else
4103                 return yylex();
4104         }
4105
4106     case LEX_INTERPPUSH:
4107         return REPORT(sublex_push());
4108
4109     case LEX_INTERPSTART:
4110         if (PL_bufptr == PL_bufend)
4111             return REPORT(sublex_done());
4112         DEBUG_T({ PerlIO_printf(Perl_debug_log,
4113               "### Interpolated variable\n"); });
4114         PL_expect = XTERM;
4115         PL_lex_dojoin = (*PL_bufptr == '@');
4116         PL_lex_state = LEX_INTERPNORMAL;
4117         if (PL_lex_dojoin) {
4118             start_force(PL_curforce);
4119             NEXTVAL_NEXTTOKE.ival = 0;
4120             force_next(',');
4121             start_force(PL_curforce);
4122             force_ident("\"", '$');
4123             start_force(PL_curforce);
4124             NEXTVAL_NEXTTOKE.ival = 0;
4125             force_next('$');
4126             start_force(PL_curforce);
4127             NEXTVAL_NEXTTOKE.ival = 0;
4128             force_next('(');
4129             start_force(PL_curforce);
4130             NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
4131             force_next(FUNC);
4132         }
4133         if (PL_lex_starts++) {
4134             s = PL_bufptr;
4135 #ifdef PERL_MAD
4136             if (PL_madskills) {
4137                 if (PL_thistoken)
4138                     sv_free(PL_thistoken);
4139                 PL_thistoken = newSVpvs("");
4140             }
4141 #endif
4142             /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4143             if (!PL_lex_casemods && PL_lex_inpat)
4144                 OPERATOR(',');
4145             else
4146                 Aop(OP_CONCAT);
4147         }
4148         return yylex();
4149
4150     case LEX_INTERPENDMAYBE:
4151         if (intuit_more(PL_bufptr)) {
4152             PL_lex_state = LEX_INTERPNORMAL;    /* false alarm, more expr */
4153             break;
4154         }
4155         /* FALL THROUGH */
4156
4157     case LEX_INTERPEND:
4158         if (PL_lex_dojoin) {
4159             PL_lex_dojoin = FALSE;
4160             PL_lex_state = LEX_INTERPCONCAT;
4161 #ifdef PERL_MAD
4162             if (PL_madskills) {
4163                 if (PL_thistoken)
4164                     sv_free(PL_thistoken);
4165                 PL_thistoken = newSVpvs("");
4166             }
4167 #endif
4168             return REPORT(')');
4169         }
4170         if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
4171             && SvEVALED(PL_lex_repl))
4172         {
4173             if (PL_bufptr != PL_bufend)
4174                 Perl_croak(aTHX_ "Bad evalled substitution pattern");
4175             PL_lex_repl = NULL;
4176         }
4177         /* FALLTHROUGH */
4178     case LEX_INTERPCONCAT:
4179 #ifdef DEBUGGING
4180         if (PL_lex_brackets)
4181             Perl_croak(aTHX_ "panic: INTERPCONCAT");
4182 #endif
4183         if (PL_bufptr == PL_bufend)
4184             return REPORT(sublex_done());
4185
4186         if (SvIVX(PL_linestr) == '\'') {
4187             SV *sv = newSVsv(PL_linestr);
4188             if (!PL_lex_inpat)
4189                 sv = tokeq(sv);
4190             else if ( PL_hints & HINT_NEW_RE )
4191                 sv = new_constant(NULL, 0, "qr", sv, sv, "q", 1);
4192             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
4193             s = PL_bufend;
4194         }
4195         else {
4196             s = scan_const(PL_bufptr);
4197             if (*s == '\\')
4198                 PL_lex_state = LEX_INTERPCASEMOD;
4199             else
4200                 PL_lex_state = LEX_INTERPSTART;
4201         }
4202
4203         if (s != PL_bufptr) {
4204             start_force(PL_curforce);
4205             if (PL_madskills) {
4206                 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
4207             }
4208             NEXTVAL_NEXTTOKE = pl_yylval;
4209             PL_expect = XTERM;
4210             force_next(THING);
4211             if (PL_lex_starts++) {
4212 #ifdef PERL_MAD
4213                 if (PL_madskills) {
4214                     if (PL_thistoken)
4215                         sv_free(PL_thistoken);
4216                     PL_thistoken = newSVpvs("");
4217                 }
4218 #endif
4219                 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4220                 if (!PL_lex_casemods && PL_lex_inpat)
4221                     OPERATOR(',');
4222                 else
4223                     Aop(OP_CONCAT);
4224             }
4225             else {
4226                 PL_bufptr = s;
4227                 return yylex();
4228             }
4229         }
4230
4231         return yylex();
4232     case LEX_FORMLINE:
4233         PL_lex_state = LEX_NORMAL;
4234         s = scan_formline(PL_bufptr);
4235         if (!PL_lex_formbrack)
4236             goto rightbracket;
4237         OPERATOR(';');
4238     }
4239
4240     s = PL_bufptr;
4241     PL_oldoldbufptr = PL_oldbufptr;
4242     PL_oldbufptr = s;
4243
4244   retry:
4245 #ifdef PERL_MAD
4246     if (PL_thistoken) {
4247         sv_free(PL_thistoken);
4248         PL_thistoken = 0;
4249     }
4250     PL_realtokenstart = s - SvPVX(PL_linestr);  /* assume but undo on ws */
4251 #endif
4252     switch (*s) {
4253     default:
4254         if (isIDFIRST_lazy_if(s,UTF))
4255             goto keylookup;
4256         {
4257         unsigned char c = *s;
4258         len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
4259         if (len > UNRECOGNIZED_PRECEDE_COUNT) {
4260             d = UTF ? (char *) Perl_utf8_hop(aTHX_ (U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
4261         } else {
4262             d = PL_linestart;
4263         }       
4264         *s = '\0';
4265         Perl_croak(aTHX_ "Unrecognized character \\x%02X; marked by <-- HERE after %s<-- HERE near column %d", c, d, (int) len + 1);
4266     }
4267     case 4:
4268     case 26:
4269         goto fake_eof;                  /* emulate EOF on ^D or ^Z */
4270     case 0:
4271 #ifdef PERL_MAD
4272         if (PL_madskills)
4273             PL_faketokens = 0;
4274 #endif
4275         if (!PL_rsfp) {
4276             PL_last_uni = 0;
4277             PL_last_lop = 0;
4278             if (PL_lex_brackets) {
4279                 yyerror((const char *)
4280                         (PL_lex_formbrack
4281                          ? "Format not terminated"
4282                          : "Missing right curly or square bracket"));
4283             }
4284             DEBUG_T( { PerlIO_printf(Perl_debug_log,
4285                         "### Tokener got EOF\n");
4286             } );
4287             TOKEN(0);
4288         }
4289         if (s++ < PL_bufend)
4290             goto retry;                 /* ignore stray nulls */
4291         PL_last_uni = 0;
4292         PL_last_lop = 0;
4293         if (!PL_in_eval && !PL_preambled) {
4294             PL_preambled = TRUE;
4295 #ifdef PERL_MAD
4296             if (PL_madskills)
4297                 PL_faketokens = 1;
4298 #endif
4299             if (PL_perldb) {
4300                 /* Generate a string of Perl code to load the debugger.
4301                  * If PERL5DB is set, it will return the contents of that,
4302                  * otherwise a compile-time require of perl5db.pl.  */
4303
4304                 const char * const pdb = PerlEnv_getenv("PERL5DB");
4305
4306                 if (pdb) {
4307                     sv_setpv(PL_linestr, pdb);
4308                     sv_catpvs(PL_linestr,";");
4309                 } else {
4310                     SETERRNO(0,SS_NORMAL);
4311                     sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
4312                 }
4313             } else
4314                 sv_setpvs(PL_linestr,"");
4315             if (PL_preambleav) {
4316                 SV **svp = AvARRAY(PL_preambleav);
4317                 SV **const end = svp + AvFILLp(PL_preambleav);
4318                 while(svp <= end) {
4319                     sv_catsv(PL_linestr, *svp);
4320                     ++svp;
4321                     sv_catpvs(PL_linestr, ";");
4322                 }
4323                 sv_free(MUTABLE_SV(PL_preambleav));
4324                 PL_preambleav = NULL;
4325             }
4326             if (PL_minus_E)
4327                 sv_catpvs(PL_linestr,
4328                           "use feature ':5." STRINGIFY(PERL_VERSION) "';");
4329             if (PL_minus_n || PL_minus_p) {
4330                 sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
4331                 if (PL_minus_l)
4332                     sv_catpvs(PL_linestr,"chomp;");
4333                 if (PL_minus_a) {
4334                     if (PL_minus_F) {
4335                         if ((*PL_splitstr == '/' || *PL_splitstr == '\''
4336                              || *PL_splitstr == '"')
4337                               && strchr(PL_splitstr + 1, *PL_splitstr))
4338                             Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
4339                         else {
4340                             /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
4341                                bytes can be used as quoting characters.  :-) */
4342                             const char *splits = PL_splitstr;
4343                             sv_catpvs(PL_linestr, "our @F=split(q\0");
4344                             do {
4345                                 /* Need to \ \s  */
4346                                 if (*splits == '\\')
4347                                     sv_catpvn(PL_linestr, splits, 1);
4348                                 sv_catpvn(PL_linestr, splits, 1);
4349                             } while (*splits++);
4350                             /* This loop will embed the trailing NUL of
4351                                PL_linestr as the last thing it does before
4352                                terminating.  */
4353                             sv_catpvs(PL_linestr, ");");
4354                         }
4355                     }
4356                     else
4357                         sv_catpvs(PL_linestr,"our @F=split(' ');");
4358                 }
4359             }
4360             sv_catpvs(PL_linestr, "\n");
4361             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4362             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4363             PL_last_lop = PL_last_uni = NULL;
4364             if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
4365                 update_debugger_info(PL_linestr, NULL, 0);
4366             goto retry;
4367         }
4368         do {
4369             fake_eof = 0;
4370             bof = PL_rsfp ? TRUE : FALSE;
4371             if (0) {
4372               fake_eof:
4373                 fake_eof = LEX_FAKE_EOF;
4374             }
4375             PL_bufptr = PL_bufend;
4376             CopLINE_inc(PL_curcop);
4377             if (!lex_next_chunk(fake_eof)) {
4378                 CopLINE_dec(PL_curcop);
4379                 s = PL_bufptr;
4380                 TOKEN(';');     /* not infinite loop because rsfp is NULL now */
4381             }
4382             CopLINE_dec(PL_curcop);
4383 #ifdef PERL_MAD
4384             if (!PL_rsfp)
4385                 PL_realtokenstart = -1;
4386 #endif
4387             s = PL_bufptr;
4388             /* If it looks like the start of a BOM or raw UTF-16,
4389              * check if it in fact is. */
4390             if (bof && PL_rsfp &&
4391                      (*s == 0 ||
4392                       *(U8*)s == 0xEF ||
4393                       *(U8*)s >= 0xFE ||
4394                       s[1] == 0)) {
4395                 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
4396                 if (bof) {
4397                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4398                     s = swallow_bom((U8*)s);
4399                 }
4400             }
4401             if (PL_doextract) {
4402                 /* Incest with pod. */
4403 #ifdef PERL_MAD
4404                 if (PL_madskills)
4405                     sv_catsv(PL_thiswhite, PL_linestr);
4406 #endif
4407                 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
4408                     sv_setpvs(PL_linestr, "");
4409                     PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4410                     PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4411                     PL_last_lop = PL_last_uni = NULL;
4412                     PL_doextract = FALSE;
4413                 }
4414             }
4415             if (PL_rsfp)
4416                 incline(s);
4417         } while (PL_doextract);
4418         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
4419         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4420         PL_last_lop = PL_last_uni = NULL;
4421         if (CopLINE(PL_curcop) == 1) {
4422             while (s < PL_bufend && isSPACE(*s))
4423                 s++;
4424             if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
4425                 s++;
4426 #ifdef PERL_MAD
4427             if (PL_madskills)
4428                 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
4429 #endif
4430             d = NULL;
4431             if (!PL_in_eval) {
4432                 if (*s == '#' && *(s+1) == '!')
4433                     d = s + 2;
4434 #ifdef ALTERNATE_SHEBANG
4435                 else {
4436                     static char const as[] = ALTERNATE_SHEBANG;
4437                     if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
4438                         d = s + (sizeof(as) - 1);
4439                 }
4440 #endif /* ALTERNATE_SHEBANG */
4441             }
4442             if (d) {
4443                 char *ipath;
4444                 char *ipathend;
4445
4446                 while (isSPACE(*d))
4447                     d++;
4448                 ipath = d;
4449                 while (*d && !isSPACE(*d))
4450                     d++;
4451                 ipathend = d;
4452
4453 #ifdef ARG_ZERO_IS_SCRIPT
4454                 if (ipathend > ipath) {
4455                     /*
4456                      * HP-UX (at least) sets argv[0] to the script name,
4457                      * which makes $^X incorrect.  And Digital UNIX and Linux,
4458                      * at least, set argv[0] to the basename of the Perl
4459                      * interpreter. So, having found "#!", we'll set it right.
4460                      */
4461                     SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
4462                                                     SVt_PV)); /* $^X */
4463                     assert(SvPOK(x) || SvGMAGICAL(x));
4464                     if (sv_eq(x, CopFILESV(PL_curcop))) {
4465                         sv_setpvn(x, ipath, ipathend - ipath);
4466                         SvSETMAGIC(x);
4467                     }
4468                     else {
4469                         STRLEN blen;
4470                         STRLEN llen;
4471                         const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
4472                         const char * const lstart = SvPV_const(x,llen);
4473                         if (llen < blen) {
4474                             bstart += blen - llen;
4475                             if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
4476                                 sv_setpvn(x, ipath, ipathend - ipath);
4477                                 SvSETMAGIC(x);
4478                             }
4479                         }
4480                     }
4481                     TAINT_NOT;  /* $^X is always tainted, but that's OK */
4482                 }
4483 #endif /* ARG_ZERO_IS_SCRIPT */
4484
4485                 /*
4486                  * Look for options.
4487                  */
4488                 d = instr(s,"perl -");
4489                 if (!d) {
4490                     d = instr(s,"perl");
4491 #if defined(DOSISH)
4492                     /* avoid getting into infinite loops when shebang
4493                      * line contains "Perl" rather than "perl" */
4494                     if (!d) {
4495                         for (d = ipathend-4; d >= ipath; --d) {
4496                             if ((*d == 'p' || *d == 'P')
4497                                 && !ibcmp(d, "perl", 4))
4498                             {
4499                                 break;
4500                             }
4501                         }
4502                         if (d < ipath)
4503                             d = NULL;
4504                     }
4505 #endif
4506                 }
4507 #ifdef ALTERNATE_SHEBANG
4508                 /*
4509                  * If the ALTERNATE_SHEBANG on this system starts with a
4510                  * character that can be part of a Perl expression, then if
4511                  * we see it but not "perl", we're probably looking at the
4512                  * start of Perl code, not a request to hand off to some
4513                  * other interpreter.  Similarly, if "perl" is there, but
4514                  * not in the first 'word' of the line, we assume the line
4515                  * contains the start of the Perl program.
4516                  */
4517                 if (d && *s != '#') {
4518                     const char *c = ipath;
4519                     while (*c && !strchr("; \t\r\n\f\v#", *c))
4520                         c++;
4521                     if (c < d)
4522                         d = NULL;       /* "perl" not in first word; ignore */
4523                     else
4524                         *s = '#';       /* Don't try to parse shebang line */
4525                 }
4526 #endif /* ALTERNATE_SHEBANG */
4527                 if (!d &&
4528                     *s == '#' &&
4529                     ipathend > ipath &&
4530                     !PL_minus_c &&
4531                     !instr(s,"indir") &&
4532                     instr(PL_origargv[0],"perl"))
4533                 {
4534                     dVAR;
4535                     char **newargv;
4536
4537                     *ipathend = '\0';
4538                     s = ipathend + 1;
4539                     while (s < PL_bufend && isSPACE(*s))
4540                         s++;
4541                     if (s < PL_bufend) {
4542                         Newx(newargv,PL_origargc+3,char*);
4543                         newargv[1] = s;
4544                         while (s < PL_bufend && !isSPACE(*s))
4545                             s++;
4546                         *s = '\0';
4547                         Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
4548                     }
4549                     else
4550                         newargv = PL_origargv;
4551                     newargv[0] = ipath;
4552                     PERL_FPU_PRE_EXEC
4553                     PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
4554                     PERL_FPU_POST_EXEC
4555                     Perl_croak(aTHX_ "Can't exec %s", ipath);
4556                 }
4557                 if (d) {
4558                     while (*d && !isSPACE(*d))
4559                         d++;
4560                     while (SPACE_OR_TAB(*d))
4561                         d++;
4562
4563                     if (*d++ == '-') {
4564                         const bool switches_done = PL_doswitches;
4565                         const U32 oldpdb = PL_perldb;
4566                         const bool oldn = PL_minus_n;
4567                         const bool oldp = PL_minus_p;
4568                         const char *d1 = d;
4569
4570                         do {
4571                             bool baduni = FALSE;
4572                             if (*d1 == 'C') {
4573                                 const char *d2 = d1 + 1;
4574                                 if (parse_unicode_opts((const char **)&d2)
4575                                     != PL_unicode)
4576                                     baduni = TRUE;
4577                             }
4578                             if (baduni || *d1 == 'M' || *d1 == 'm') {
4579                                 const char * const m = d1;
4580                                 while (*d1 && !isSPACE(*d1))
4581                                     d1++;
4582                                 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
4583                                       (int)(d1 - m), m);
4584                             }
4585                             d1 = moreswitches(d1);
4586                         } while (d1);
4587                         if (PL_doswitches && !switches_done) {
4588                             int argc = PL_origargc;
4589                             char **argv = PL_origargv;
4590                             do {
4591                                 argc--,argv++;
4592                             } while (argc && argv[0][0] == '-' && argv[0][1]);
4593                             init_argv_symbols(argc,argv);
4594                         }
4595                         if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
4596                             ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
4597                               /* if we have already added "LINE: while (<>) {",
4598                                  we must not do it again */
4599                         {
4600                             sv_setpvs(PL_linestr, "");
4601                             PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4602                             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
4603                             PL_last_lop = PL_last_uni = NULL;
4604                             PL_preambled = FALSE;
4605                             if (PERLDB_LINE || PERLDB_SAVESRC)
4606                                 (void)gv_fetchfile(PL_origfilename);
4607                             goto retry;
4608                         }
4609                     }
4610                 }
4611             }
4612         }
4613         if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4614             PL_bufptr = s;
4615             PL_lex_state = LEX_FORMLINE;
4616             return yylex();
4617         }
4618         goto retry;
4619     case '\r':
4620 #ifdef PERL_STRICT_CR
4621         Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4622         Perl_croak(aTHX_
4623       "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
4624 #endif
4625     case ' ': case '\t': case '\f': case 013:
4626 #ifdef PERL_MAD
4627         PL_realtokenstart = -1;
4628         if (!PL_thiswhite)
4629             PL_thiswhite = newSVpvs("");
4630         sv_catpvn(PL_thiswhite, s, 1);
4631 #endif
4632         s++;
4633         goto retry;
4634     case '#':
4635     case '\n':
4636 #ifdef PERL_MAD
4637         PL_realtokenstart = -1;
4638         if (PL_madskills)
4639             PL_faketokens = 0;
4640 #endif
4641         if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
4642             if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
4643                 /* handle eval qq[#line 1 "foo"\n ...] */
4644                 CopLINE_dec(PL_curcop);
4645                 incline(s);
4646             }
4647             if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
4648                 s = SKIPSPACE0(s);
4649                 if (!PL_in_eval || PL_rsfp)
4650                     incline(s);
4651             }
4652             else {
4653                 d = s;
4654                 while (d < PL_bufend && *d != '\n')
4655                     d++;
4656                 if (d < PL_bufend)
4657                     d++;
4658                 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4659                   Perl_croak(aTHX_ "panic: input overflow");
4660 #ifdef PERL_MAD
4661                 if (PL_madskills)
4662                     PL_thiswhite = newSVpvn(s, d - s);
4663 #endif
4664                 s = d;
4665                 incline(s);
4666             }
4667             if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4668                 PL_bufptr = s;
4669                 PL_lex_state = LEX_FORMLINE;
4670                 return yylex();
4671             }
4672         }
4673         else {
4674 #ifdef PERL_MAD
4675             if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
4676                 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
4677                     PL_faketokens = 0;
4678                     s = SKIPSPACE0(s);
4679                     TOKEN(PEG); /* make sure any #! line is accessible */
4680                 }
4681                 s = SKIPSPACE0(s);
4682             }
4683             else {
4684 /*              if (PL_madskills && PL_lex_formbrack) { */
4685                     d = s;
4686                     while (d < PL_bufend && *d != '\n')
4687                         d++;
4688                     if (d < PL_bufend)
4689                         d++;
4690                     else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4691                       Perl_croak(aTHX_ "panic: input overflow");
4692                     if (PL_madskills && CopLINE(PL_curcop) >= 1) {
4693                         if (!PL_thiswhite)
4694                             PL_thiswhite = newSVpvs("");
4695                         if (CopLINE(PL_curcop) == 1) {
4696                             sv_setpvs(PL_thiswhite, "");
4697                             PL_faketokens = 0;
4698                         }
4699                         sv_catpvn(PL_thiswhite, s, d - s);
4700                     }
4701                     s = d;
4702 /*              }
4703                 *s = '\0';
4704                 PL_bufend = s; */
4705             }
4706 #else
4707             *s = '\0';
4708             PL_bufend = s;
4709 #endif
4710         }
4711         goto retry;
4712     case '-':
4713         if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
4714             I32 ftst = 0;
4715             char tmp;
4716
4717             s++;
4718             PL_bufptr = s;
4719             tmp = *s++;
4720
4721             while (s < PL_bufend && SPACE_OR_TAB(*s))
4722                 s++;
4723
4724             if (strnEQ(s,"=>",2)) {
4725                 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
4726                 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
4727                 OPERATOR('-');          /* unary minus */
4728             }
4729             PL_last_uni = PL_oldbufptr;
4730             switch (tmp) {
4731             case 'r': ftst = OP_FTEREAD;        break;
4732             case 'w': ftst = OP_FTEWRITE;       break;
4733             case 'x': ftst = OP_FTEEXEC;        break;
4734             case 'o': ftst = OP_FTEOWNED;       break;
4735             case 'R': ftst = OP_FTRREAD;        break;
4736             case 'W': ftst = OP_FTRWRITE;       break;
4737             case 'X': ftst = OP_FTREXEC;        break;
4738             case 'O': ftst = OP_FTROWNED;       break;
4739             case 'e': ftst = OP_FTIS;           break;
4740             case 'z': ftst = OP_FTZERO;         break;
4741             case 's': ftst = OP_FTSIZE;         break;
4742             case 'f': ftst = OP_FTFILE;         break;
4743             case 'd': ftst = OP_FTDIR;          break;
4744             case 'l': ftst = OP_FTLINK;         break;
4745             case 'p': ftst = OP_FTPIPE;         break;
4746             case 'S': ftst = OP_FTSOCK;         break;
4747             case 'u': ftst = OP_FTSUID;         break;
4748             case 'g': ftst = OP_FTSGID;         break;
4749             case 'k': ftst = OP_FTSVTX;         break;
4750             case 'b': ftst = OP_FTBLK;          break;
4751             case 'c': ftst = OP_FTCHR;          break;
4752             case 't': ftst = OP_FTTTY;          break;
4753             case 'T': ftst = OP_FTTEXT;         break;
4754             case 'B': ftst = OP_FTBINARY;       break;
4755             case 'M': case 'A': case 'C':
4756                 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
4757                 switch (tmp) {
4758                 case 'M': ftst = OP_FTMTIME;    break;
4759                 case 'A': ftst = OP_FTATIME;    break;
4760                 case 'C': ftst = OP_FTCTIME;    break;
4761                 default:                        break;
4762                 }
4763                 break;
4764             default:
4765                 break;
4766             }
4767             if (ftst) {
4768                 PL_last_lop_op = (OPCODE)ftst;
4769                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
4770                         "### Saw file test %c\n", (int)tmp);
4771                 } );
4772                 FTST(ftst);
4773             }
4774             else {
4775                 /* Assume it was a minus followed by a one-letter named
4776                  * subroutine call (or a -bareword), then. */
4777                 DEBUG_T( { PerlIO_printf(Perl_debug_log,
4778                         "### '-%c' looked like a file test but was not\n",
4779                         (int) tmp);
4780                 } );
4781                 s = --PL_bufptr;
4782             }
4783         }
4784         {
4785             const char tmp = *s++;
4786             if (*s == tmp) {
4787                 s++;
4788                 if (PL_expect == XOPERATOR)
4789                     TERM(POSTDEC);
4790                 else
4791                     OPERATOR(PREDEC);
4792             }
4793             else if (*s == '>') {
4794                 s++;
4795                 s = SKIPSPACE1(s);
4796                 if (isIDFIRST_lazy_if(s,UTF)) {
4797                     s = force_word(s,METHOD,FALSE,TRUE,FALSE);
4798                     TOKEN(ARROW);
4799                 }
4800                 else if (*s == '$')
4801                     OPERATOR(ARROW);
4802                 else
4803                     TERM(ARROW);
4804             }
4805             if (PL_expect == XOPERATOR)
4806                 Aop(OP_SUBTRACT);
4807             else {
4808                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4809                     check_uni();
4810                 OPERATOR('-');          /* unary minus */
4811             }
4812         }
4813
4814     case '+':
4815         {
4816             const char tmp = *s++;
4817             if (*s == tmp) {
4818                 s++;
4819                 if (PL_expect == XOPERATOR)
4820                     TERM(POSTINC);
4821                 else
4822                     OPERATOR(PREINC);
4823             }
4824             if (PL_expect == XOPERATOR)
4825                 Aop(OP_ADD);
4826             else {
4827                 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4828                     check_uni();
4829                 OPERATOR('+');
4830             }
4831         }
4832
4833     case '*':
4834         if (PL_expect != XOPERATOR) {
4835             s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4836             PL_expect = XOPERATOR;
4837             force_ident(PL_tokenbuf, '*');
4838             if (!*PL_tokenbuf)
4839                 PREREF('*');
4840             TERM('*');
4841         }
4842         s++;
4843         if (*s == '*') {
4844             s++;
4845             PWop(OP_POW);
4846         }
4847         Mop(OP_MULTIPLY);
4848
4849     case '%':
4850         if (PL_expect == XOPERATOR) {
4851             ++s;
4852             Mop(OP_MODULO);
4853         }
4854         PL_tokenbuf[0] = '%';
4855         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4856                 sizeof PL_tokenbuf - 1, FALSE);
4857         if (!PL_tokenbuf[1]) {
4858             PREREF('%');
4859         }
4860         PL_pending_ident = '%';
4861         TERM('%');
4862
4863     case '^':
4864         s++;
4865         BOop(OP_BIT_XOR);
4866     case '[':
4867         PL_lex_brackets++;
4868         {
4869             const char tmp = *s++;
4870             OPERATOR(tmp);
4871         }
4872     case '~':
4873         if (s[1] == '~'
4874             && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
4875         {
4876             s += 2;
4877             Eop(OP_SMARTMATCH);
4878         }
4879     case ',':
4880         {
4881             const char tmp = *s++;
4882             OPERATOR(tmp);
4883         }
4884     case ':':
4885         if (s[1] == ':') {
4886             len = 0;
4887             goto just_a_word_zero_gv;
4888         }
4889         s++;
4890         switch (PL_expect) {
4891             OP *attrs;
4892 #ifdef PERL_MAD
4893             I32 stuffstart;
4894 #endif
4895         case XOPERATOR:
4896             if (!PL_in_my || PL_lex_state != LEX_NORMAL)
4897                 break;
4898             PL_bufptr = s;      /* update in case we back off */
4899             if (*s == '=') {
4900                 deprecate(":= for an empty attribute list");
4901             }
4902             goto grabattrs;
4903         case XATTRBLOCK:
4904             PL_expect = XBLOCK;
4905             goto grabattrs;
4906         case XATTRTERM:
4907             PL_expect = XTERMBLOCK;
4908          grabattrs:
4909 #ifdef PERL_MAD
4910             stuffstart = s - SvPVX(PL_linestr) - 1;
4911 #endif
4912             s = PEEKSPACE(s);
4913             attrs = NULL;
4914             while (isIDFIRST_lazy_if(s,UTF)) {
4915                 I32 tmp;
4916                 SV *sv;
4917                 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
4918                 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
4919                     if (tmp < 0) tmp = -tmp;
4920                     switch (tmp) {
4921                     case KEY_or:
4922                     case KEY_and:
4923                     case KEY_for:
4924                     case KEY_foreach:
4925                     case KEY_unless:
4926                     case KEY_if:
4927                     case KEY_while:
4928                     case KEY_until:
4929                         goto got_attrs;
4930                     default:
4931                         break;
4932                     }
4933                 }
4934                 sv = newSVpvn(s, len);
4935                 if (*d == '(') {
4936                     d = scan_str(d,TRUE,TRUE);
4937                     if (!d) {
4938                         /* MUST advance bufptr here to avoid bogus
4939                            "at end of line" context messages from yyerror().
4940                          */
4941                         PL_bufptr = s + len;
4942                         yyerror("Unterminated attribute parameter in attribute list");
4943                         if (attrs)
4944                             op_free(attrs);
4945                         sv_free(sv);
4946                         return REPORT(0);       /* EOF indicator */
4947                     }
4948                 }
4949                 if (PL_lex_stuff) {
4950                     sv_catsv(sv, PL_lex_stuff);
4951                     attrs = append_elem(OP_LIST, attrs,
4952                                         newSVOP(OP_CONST, 0, sv));
4953                     SvREFCNT_dec(PL_lex_stuff);
4954                     PL_lex_stuff = NULL;
4955                 }
4956                 else {
4957                     if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
4958                         sv_free(sv);
4959                         if (PL_in_my == KEY_our) {
4960                             deprecate(":unique");
4961                         }
4962                         else
4963                             Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
4964                     }
4965
4966                     /* NOTE: any CV attrs applied here need to be part of
4967                        the CVf_BUILTIN_ATTRS define in cv.h! */
4968                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
4969                         sv_free(sv);
4970                         CvLVALUE_on(PL_compcv);
4971                     }
4972                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
4973                         sv_free(sv);
4974                         deprecate(":locked");
4975                     }
4976                     else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
4977                         sv_free(sv);
4978                         CvMETHOD_on(PL_compcv);
4979                     }
4980                     /* After we've set the flags, it could be argued that
4981                        we don't need to do the attributes.pm-based setting
4982                        process, and shouldn't bother appending recognized
4983                        flags.  To experiment with that, uncomment the
4984                        following "else".  (Note that's already been
4985                        uncommented.  That keeps the above-applied built-in
4986                        attributes from being intercepted (and possibly
4987                        rejected) by a package's attribute routines, but is
4988                        justified by the performance win for the common case
4989                        of applying only built-in attributes.) */
4990                     else
4991                         attrs = append_elem(OP_LIST, attrs,
4992                                             newSVOP(OP_CONST, 0,
4993                                                     sv));
4994                 }
4995                 s = PEEKSPACE(d);
4996                 if (*s == ':' && s[1] != ':')
4997                     s = PEEKSPACE(s+1);
4998                 else if (s == d)
4999                     break;      /* require real whitespace or :'s */
5000                 /* XXX losing whitespace on sequential attributes here */
5001             }
5002             {
5003                 const char tmp
5004                     = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
5005                 if (*s != ';' && *s != '}' && *s != tmp
5006                     && (tmp != '=' || *s != ')')) {
5007                     const char q = ((*s == '\'') ? '"' : '\'');
5008                     /* If here for an expression, and parsed no attrs, back
5009                        off. */
5010                     if (tmp == '=' && !attrs) {
5011                         s = PL_bufptr;
5012                         break;
5013                     }
5014                     /* MUST advance bufptr here to avoid bogus "at end of line"
5015                        context messages from yyerror().
5016                     */
5017                     PL_bufptr = s;
5018                     yyerror( (const char *)
5019                              (*s
5020                               ? Perl_form(aTHX_ "Invalid separator character "
5021                                           "%c%c%c in attribute list", q, *s, q)
5022                               : "Unterminated attribute list" ) );
5023                     if (attrs)
5024                         op_free(attrs);
5025                     OPERATOR(':');
5026                 }
5027             }
5028         got_attrs:
5029             if (attrs) {
5030                 start_force(PL_curforce);
5031                 NEXTVAL_NEXTTOKE.opval = attrs;
5032                 CURMAD('_', PL_nextwhite);
5033                 force_next(THING);
5034             }
5035 #ifdef PERL_MAD
5036             if (PL_madskills) {
5037                 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5038                                      (s - SvPVX(PL_linestr)) - stuffstart);
5039             }
5040 #endif
5041             TOKEN(COLONATTR);
5042         }
5043         OPERATOR(':');
5044     case '(':
5045         s++;
5046         if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
5047             PL_oldbufptr = PL_oldoldbufptr;             /* allow print(STDOUT 123) */
5048         else
5049             PL_expect = XTERM;
5050         s = SKIPSPACE1(s);
5051         TOKEN('(');
5052     case ';':
5053         CLINE;
5054         {
5055             const char tmp = *s++;
5056             OPERATOR(tmp);
5057         }
5058     case ')':
5059         {
5060             const char tmp = *s++;
5061             s = SKIPSPACE1(s);
5062             if (*s == '{')
5063                 PREBLOCK(tmp);
5064             TERM(tmp);
5065         }
5066     case ']':
5067         s++;
5068         if (PL_lex_brackets <= 0)
5069             yyerror("Unmatched right square bracket");
5070         else
5071             --PL_lex_brackets;
5072         if (PL_lex_state == LEX_INTERPNORMAL) {
5073             if (PL_lex_brackets == 0) {
5074                 if (*s == '-' && s[1] == '>')
5075                     PL_lex_state = LEX_INTERPENDMAYBE;
5076                 else if (*s != '[' && *s != '{')
5077                     PL_lex_state = LEX_INTERPEND;
5078             }
5079         }
5080         TERM(']');
5081     case '{':
5082       leftbracket:
5083         s++;
5084         if (PL_lex_brackets > 100) {
5085             Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
5086         }
5087         switch (PL_expect) {
5088         case XTERM:
5089             if (PL_lex_formbrack) {
5090                 s--;
5091                 PRETERMBLOCK(DO);
5092             }
5093             if (PL_oldoldbufptr == PL_last_lop)
5094                 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5095             else
5096                 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5097             OPERATOR(HASHBRACK);
5098         case XOPERATOR:
5099             while (s < PL_bufend && SPACE_OR_TAB(*s))
5100                 s++;
5101             d = s;
5102             PL_tokenbuf[0] = '\0';
5103             if (d < PL_bufend && *d == '-') {
5104                 PL_tokenbuf[0] = '-';
5105                 d++;
5106                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5107                     d++;
5108             }
5109             if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
5110                 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
5111                               FALSE, &len);
5112                 while (d < PL_bufend && SPACE_OR_TAB(*d))
5113                     d++;
5114                 if (*d == '}') {
5115                     const char minus = (PL_tokenbuf[0] == '-');
5116                     s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
5117                     if (minus)
5118                         force_next('-');
5119                 }
5120             }
5121             /* FALL THROUGH */
5122         case XATTRBLOCK:
5123         case XBLOCK:
5124             PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
5125             PL_expect = XSTATE;
5126             break;
5127         case XATTRTERM:
5128         case XTERMBLOCK:
5129             PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5130             PL_expect = XSTATE;
5131             break;
5132         default: {
5133                 const char *t;
5134                 if (PL_oldoldbufptr == PL_last_lop)
5135                     PL_lex_brackstack[PL_lex_brackets++] = XTERM;
5136                 else
5137                     PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5138                 s = SKIPSPACE1(s);
5139                 if (*s == '}') {
5140                     if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
5141                         PL_expect = XTERM;
5142                         /* This hack is to get the ${} in the message. */
5143                         PL_bufptr = s+1;
5144                         yyerror("syntax error");
5145                         break;
5146                     }
5147                     OPERATOR(HASHBRACK);
5148                 }
5149                 /* This hack serves to disambiguate a pair of curlies
5150                  * as being a block or an anon hash.  Normally, expectation
5151                  * determines that, but in cases where we're not in a
5152                  * position to expect anything in particular (like inside
5153                  * eval"") we have to resolve the ambiguity.  This code
5154                  * covers the case where the first term in the curlies is a
5155                  * quoted string.  Most other cases need to be explicitly
5156                  * disambiguated by prepending a "+" before the opening
5157                  * curly in order to force resolution as an anon hash.
5158                  *
5159                  * XXX should probably propagate the outer expectation
5160                  * into eval"" to rely less on this hack, but that could
5161                  * potentially break current behavior of eval"".
5162                  * GSAR 97-07-21
5163                  */
5164                 t = s;
5165                 if (*s == '\'' || *s == '"' || *s == '`') {
5166                     /* common case: get past first string, handling escapes */
5167                     for (t++; t < PL_bufend && *t != *s;)
5168                         if (*t++ == '\\' && (*t == '\\' || *t == *s))
5169                             t++;
5170                     t++;
5171                 }
5172                 else if (*s == 'q') {
5173                     if (++t < PL_bufend
5174                         && (!isALNUM(*t)
5175                             || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
5176                                 && !isALNUM(*t))))
5177                     {
5178                         /* skip q//-like construct */
5179                         const char *tmps;
5180                         char open, close, term;
5181                         I32 brackets = 1;
5182
5183                         while (t < PL_bufend && isSPACE(*t))
5184                             t++;
5185                         /* check for q => */
5186                         if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
5187                             OPERATOR(HASHBRACK);
5188                         }
5189                         term = *t;
5190                         open = term;
5191                         if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5192                             term = tmps[5];
5193                         close = term;
5194                         if (open == close)
5195                             for (t++; t < PL_bufend; t++) {
5196                                 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
5197                                     t++;
5198                                 else if (*t == open)
5199                                     break;
5200                             }
5201                         else {
5202                             for (t++; t < PL_bufend; t++) {
5203                                 if (*t == '\\' && t+1 < PL_bufend)
5204                                     t++;
5205                                 else if (*t == close && --brackets <= 0)
5206                                     break;
5207                                 else if (*t == open)
5208                                     brackets++;
5209                             }
5210                         }
5211                         t++;
5212                     }
5213                     else
5214                         /* skip plain q word */
5215                         while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5216                              t += UTF8SKIP(t);
5217                 }
5218                 else if (isALNUM_lazy_if(t,UTF)) {
5219                     t += UTF8SKIP(t);
5220                     while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5221                          t += UTF8SKIP(t);
5222                 }
5223                 while (t < PL_bufend && isSPACE(*t))
5224                     t++;
5225                 /* if comma follows first term, call it an anon hash */
5226                 /* XXX it could be a comma expression with loop modifiers */
5227                 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
5228                                    || (*t == '=' && t[1] == '>')))
5229                     OPERATOR(HASHBRACK);
5230                 if (PL_expect == XREF)
5231                     PL_expect = XTERM;
5232                 else {
5233                     PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
5234                     PL_expect = XSTATE;
5235                 }
5236             }
5237             break;
5238         }
5239         pl_yylval.ival = CopLINE(PL_curcop);
5240         if (isSPACE(*s) || *s == '#')
5241             PL_copline = NOLINE;   /* invalidate current command line number */
5242         TOKEN('{');
5243     case '}':
5244       rightbracket:
5245         s++;
5246         if (PL_lex_brackets <= 0)
5247             yyerror("Unmatched right curly bracket");
5248         else
5249             PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
5250         if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
5251             PL_lex_formbrack = 0;
5252         if (PL_lex_state == LEX_INTERPNORMAL) {
5253             if (PL_lex_brackets == 0) {
5254                 if (PL_expect & XFAKEBRACK) {
5255                     PL_expect &= XENUMMASK;
5256                     PL_lex_state = LEX_INTERPEND;
5257                     PL_bufptr = s;
5258 #if 0
5259                     if (PL_madskills) {
5260                         if (!PL_thiswhite)
5261                             PL_thiswhite = newSVpvs("");
5262                         sv_catpvs(PL_thiswhite,"}");
5263                     }
5264 #endif
5265                     return yylex();     /* ignore fake brackets */
5266                 }
5267                 if (*s == '-' && s[1] == '>')
5268                     PL_lex_state = LEX_INTERPENDMAYBE;
5269                 else if (*s != '[' && *s != '{')
5270                     PL_lex_state = LEX_INTERPEND;
5271             }
5272         }
5273         if (PL_expect & XFAKEBRACK) {
5274             PL_expect &= XENUMMASK;
5275             PL_bufptr = s;
5276             return yylex();             /* ignore fake brackets */
5277         }
5278         start_force(PL_curforce);
5279         if (PL_madskills) {
5280             curmad('X', newSVpvn(s-1,1));
5281             CURMAD('_', PL_thiswhite);
5282         }
5283         force_next('}');
5284 #ifdef PERL_MAD
5285         if (!PL_thistoken)
5286             PL_thistoken = newSVpvs("");
5287 #endif
5288         TOKEN(';');
5289     case '&':
5290         s++;
5291         if (*s++ == '&')
5292             AOPERATOR(ANDAND);
5293         s--;
5294         if (PL_expect == XOPERATOR) {
5295             if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
5296                 && isIDFIRST_lazy_if(s,UTF))
5297             {
5298                 CopLINE_dec(PL_curcop);
5299                 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
5300                 CopLINE_inc(PL_curcop);
5301             }
5302             BAop(OP_BIT_AND);
5303         }
5304
5305         s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5306         if (*PL_tokenbuf) {
5307             PL_expect = XOPERATOR;
5308             force_ident(PL_tokenbuf, '&');
5309         }
5310         else
5311             PREREF('&');
5312         pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
5313         TERM('&');
5314
5315     case '|':
5316         s++;
5317         if (*s++ == '|')
5318             AOPERATOR(OROR);
5319         s--;
5320         BOop(OP_BIT_OR);
5321     case '=':
5322         s++;
5323         {
5324             const char tmp = *s++;
5325             if (tmp == '=')
5326                 Eop(OP_EQ);
5327             if (tmp == '>')
5328                 OPERATOR(',');
5329             if (tmp == '~')
5330                 PMop(OP_MATCH);
5331             if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
5332                 && strchr("+-*/%.^&|<",tmp))
5333                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5334                             "Reversed %c= operator",(int)tmp);
5335             s--;
5336             if (PL_expect == XSTATE && isALPHA(tmp) &&
5337                 (s == PL_linestart+1 || s[-2] == '\n') )
5338                 {
5339                     if (PL_in_eval && !PL_rsfp) {
5340                         d = PL_bufend;
5341                         while (s < d) {
5342                             if (*s++ == '\n') {
5343                                 incline(s);
5344                                 if (strnEQ(s,"=cut",4)) {
5345                                     s = strchr(s,'\n');
5346                                     if (s)
5347                                         s++;
5348                                     else
5349                                         s = d;
5350                                     incline(s);
5351                                     goto retry;
5352                                 }
5353                             }
5354                         }
5355                         goto retry;
5356                     }
5357 #ifdef PERL_MAD
5358                     if (PL_madskills) {
5359                         if (!PL_thiswhite)
5360                             PL_thiswhite = newSVpvs("");
5361                         sv_catpvn(PL_thiswhite, PL_linestart,
5362                                   PL_bufend - PL_linestart);
5363                     }
5364 #endif
5365                     s = PL_bufend;
5366                     PL_doextract = TRUE;
5367                     goto retry;
5368                 }
5369         }
5370         if (PL_lex_brackets < PL_lex_formbrack) {
5371             const char *t = s;
5372 #ifdef PERL_STRICT_CR
5373             while (SPACE_OR_TAB(*t))
5374 #else
5375             while (SPACE_OR_TAB(*t) || *t == '\r')
5376 #endif
5377                 t++;
5378             if (*t == '\n' || *t == '#') {
5379                 s--;
5380                 PL_expect = XBLOCK;
5381                 goto leftbracket;
5382             }
5383         }
5384         pl_yylval.ival = 0;
5385         OPERATOR(ASSIGNOP);
5386     case '!':
5387         s++;
5388         {
5389             const char tmp = *s++;
5390             if (tmp == '=') {
5391                 /* was this !=~ where !~ was meant?
5392                  * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
5393
5394                 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
5395                     const char *t = s+1;
5396
5397                     while (t < PL_bufend && isSPACE(*t))
5398                         ++t;
5399
5400                     if (*t == '/' || *t == '?' ||
5401                         ((*t == 'm' || *t == 's' || *t == 'y')
5402                          && !isALNUM(t[1])) ||
5403                         (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
5404                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5405                                     "!=~ should be !~");
5406                 }
5407                 Eop(OP_NE);
5408             }
5409             if (tmp == '~')
5410                 PMop(OP_NOT);
5411         }
5412         s--;
5413         OPERATOR('!');
5414     case '<':
5415         if (PL_expect != XOPERATOR) {
5416             if (s[1] != '<' && !strchr(s,'>'))
5417                 check_uni();
5418             if (s[1] == '<')
5419                 s = scan_heredoc(s);
5420             else
5421                 s = scan_inputsymbol(s);
5422             TERM(sublex_start());
5423         }
5424         s++;
5425         {
5426             char tmp = *s++;
5427             if (tmp == '<')
5428                 SHop(OP_LEFT_SHIFT);
5429             if (tmp == '=') {
5430                 tmp = *s++;
5431                 if (tmp == '>')
5432                     Eop(OP_NCMP);
5433                 s--;
5434                 Rop(OP_LE);
5435             }
5436         }
5437         s--;
5438         Rop(OP_LT);
5439     case '>':
5440         s++;
5441         {
5442             const char tmp = *s++;
5443             if (tmp == '>')
5444                 SHop(OP_RIGHT_SHIFT);
5445             else if (tmp == '=')
5446                 Rop(OP_GE);
5447         }
5448         s--;
5449         Rop(OP_GT);
5450
5451     case '$':
5452         CLINE;
5453
5454         if (PL_expect == XOPERATOR) {
5455             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5456                 return deprecate_commaless_var_list();
5457             }
5458         }
5459
5460         if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
5461             PL_tokenbuf[0] = '@';
5462             s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
5463                            sizeof PL_tokenbuf - 1, FALSE);
5464             if (PL_expect == XOPERATOR)
5465                 no_op("Array length", s);
5466             if (!PL_tokenbuf[1])
5467                 PREREF(DOLSHARP);
5468             PL_expect = XOPERATOR;
5469             PL_pending_ident = '#';
5470             TOKEN(DOLSHARP);
5471         }
5472
5473         PL_tokenbuf[0] = '$';
5474         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5475                        sizeof PL_tokenbuf - 1, FALSE);
5476         if (PL_expect == XOPERATOR)
5477             no_op("Scalar", s);
5478         if (!PL_tokenbuf[1]) {
5479             if (s == PL_bufend)
5480                 yyerror("Final $ should be \\$ or $name");
5481             PREREF('$');
5482         }
5483
5484         /* This kludge not intended to be bulletproof. */
5485         if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
5486             pl_yylval.opval = newSVOP(OP_CONST, 0,
5487                                    newSViv(CopARYBASE_get(&PL_compiling)));
5488             pl_yylval.opval->op_private = OPpCONST_ARYBASE;
5489             TERM(THING);
5490         }
5491
5492         d = s;
5493         {
5494             const char tmp = *s;
5495             if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
5496                 s = SKIPSPACE1(s);
5497
5498             if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
5499                 && intuit_more(s)) {
5500                 if (*s == '[') {
5501                     PL_tokenbuf[0] = '@';
5502                     if (ckWARN(WARN_SYNTAX)) {
5503                         char *t = s+1;
5504
5505                         while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
5506                             t++;
5507                         if (*t++ == ',') {
5508                             PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5509                             while (t < PL_bufend && *t != ']')
5510                                 t++;
5511                             Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5512                                         "Multidimensional syntax %.*s not supported",
5513                                     (int)((t - PL_bufptr) + 1), PL_bufptr);
5514                         }
5515                     }
5516                 }
5517                 else if (*s == '{') {
5518                     char *t;
5519                     PL_tokenbuf[0] = '%';
5520                     if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
5521                         && (t = strchr(s, '}')) && (t = strchr(t, '=')))
5522                         {
5523                             char tmpbuf[sizeof PL_tokenbuf];
5524                             do {
5525                                 t++;
5526                             } while (isSPACE(*t));
5527                             if (isIDFIRST_lazy_if(t,UTF)) {
5528                                 STRLEN len;
5529                                 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
5530                                               &len);
5531                                 while (isSPACE(*t))
5532                                     t++;
5533                                 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
5534                                     Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5535                                                 "You need to quote \"%s\"",
5536                                                 tmpbuf);
5537                             }
5538                         }
5539                 }
5540             }
5541
5542             PL_expect = XOPERATOR;
5543             if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
5544                 const bool islop = (PL_last_lop == PL_oldoldbufptr);
5545                 if (!islop || PL_last_lop_op == OP_GREPSTART)
5546                     PL_expect = XOPERATOR;
5547                 else if (strchr("$@\"'`q", *s))
5548                     PL_expect = XTERM;          /* e.g. print $fh "foo" */
5549                 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
5550                     PL_expect = XTERM;          /* e.g. print $fh &sub */
5551                 else if (isIDFIRST_lazy_if(s,UTF)) {
5552                     char tmpbuf[sizeof PL_tokenbuf];
5553                     int t2;
5554                     scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5555                     if ((t2 = keyword(tmpbuf, len, 0))) {
5556                         /* binary operators exclude handle interpretations */
5557                         switch (t2) {
5558                         case -KEY_x:
5559                         case -KEY_eq:
5560                         case -KEY_ne:
5561                         case -KEY_gt:
5562                         case -KEY_lt:
5563                         case -KEY_ge:
5564                         case -KEY_le:
5565                         case -KEY_cmp:
5566                             break;
5567                         default:
5568                             PL_expect = XTERM;  /* e.g. print $fh length() */
5569                             break;
5570                         }
5571                     }
5572                     else {
5573                         PL_expect = XTERM;      /* e.g. print $fh subr() */
5574                     }
5575                 }
5576                 else if (isDIGIT(*s))
5577                     PL_expect = XTERM;          /* e.g. print $fh 3 */
5578                 else if (*s == '.' && isDIGIT(s[1]))
5579                     PL_expect = XTERM;          /* e.g. print $fh .3 */
5580                 else if ((*s == '?' || *s == '-' || *s == '+')
5581                          && !isSPACE(s[1]) && s[1] != '=')
5582                     PL_expect = XTERM;          /* e.g. print $fh -1 */
5583                 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
5584                          && s[1] != '/')
5585                     PL_expect = XTERM;          /* e.g. print $fh /.../
5586                                                    XXX except DORDOR operator
5587                                                 */
5588                 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
5589                          && s[2] != '=')
5590                     PL_expect = XTERM;          /* print $fh <<"EOF" */
5591             }
5592         }
5593         PL_pending_ident = '$';
5594         TOKEN('$');
5595
5596     case '@':
5597         if (PL_expect == XOPERATOR)
5598             no_op("Array", s);
5599         PL_tokenbuf[0] = '@';
5600         s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
5601         if (!PL_tokenbuf[1]) {
5602             PREREF('@');
5603         }
5604         if (PL_lex_state == LEX_NORMAL)
5605             s = SKIPSPACE1(s);
5606         if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
5607             if (*s == '{')
5608                 PL_tokenbuf[0] = '%';
5609
5610             /* Warn about @ where they meant $. */
5611             if (*s == '[' || *s == '{') {
5612                 if (ckWARN(WARN_SYNTAX)) {
5613                     const char *t = s + 1;
5614                     while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
5615                         t++;
5616                     if (*t == '}' || *t == ']') {
5617                         t++;
5618                         PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
5619                         Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5620                             "Scalar value %.*s better written as $%.*s",
5621                             (int)(t-PL_bufptr), PL_bufptr,
5622                             (int)(t-PL_bufptr-1), PL_bufptr+1);
5623                     }
5624                 }
5625             }
5626         }
5627         PL_pending_ident = '@';
5628         TERM('@');
5629
5630      case '/':                  /* may be division, defined-or, or pattern */
5631         if (PL_expect == XTERMORDORDOR && s[1] == '/') {
5632             s += 2;
5633             AOPERATOR(DORDOR);
5634         }
5635      case '?':                  /* may either be conditional or pattern */
5636         if (PL_expect == XOPERATOR) {
5637              char tmp = *s++;
5638              if(tmp == '?') {
5639                 OPERATOR('?');
5640              }
5641              else {
5642                  tmp = *s++;
5643                  if(tmp == '/') {
5644                      /* A // operator. */
5645                     AOPERATOR(DORDOR);
5646                  }
5647                  else {
5648                      s--;
5649                      Mop(OP_DIVIDE);
5650                  }
5651              }
5652          }
5653          else {
5654              /* Disable warning on "study /blah/" */
5655              if (PL_oldoldbufptr == PL_last_uni
5656               && (*PL_last_uni != 's' || s - PL_last_uni < 5
5657                   || memNE(PL_last_uni, "study", 5)
5658                   || isALNUM_lazy_if(PL_last_uni+5,UTF)
5659               ))
5660                  check_uni();
5661              s = scan_pat(s,OP_MATCH);
5662              TERM(sublex_start());
5663          }
5664
5665     case '.':
5666         if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
5667 #ifdef PERL_STRICT_CR
5668             && s[1] == '\n'
5669 #else
5670             && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
5671 #endif
5672             && (s == PL_linestart || s[-1] == '\n') )
5673         {
5674             PL_lex_formbrack = 0;
5675             PL_expect = XSTATE;
5676             goto rightbracket;
5677         }
5678         if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
5679             s += 3;
5680             OPERATOR(YADAYADA);
5681         }
5682         if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
5683             char tmp = *s++;
5684             if (*s == tmp) {
5685                 s++;
5686                 if (*s == tmp) {
5687                     s++;
5688                     pl_yylval.ival = OPf_SPECIAL;
5689                 }
5690                 else
5691                     pl_yylval.ival = 0;
5692                 OPERATOR(DOTDOT);
5693             }
5694             Aop(OP_CONCAT);
5695         }
5696         /* FALL THROUGH */
5697     case '0': case '1': case '2': case '3': case '4':
5698     case '5': case '6': case '7': case '8': case '9':
5699         s = scan_num(s, &pl_yylval);
5700         DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
5701         if (PL_expect == XOPERATOR)
5702             no_op("Number",s);
5703         TERM(THING);
5704
5705     case '\'':
5706         s = scan_str(s,!!PL_madskills,FALSE);
5707         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5708         if (PL_expect == XOPERATOR) {
5709             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5710                 return deprecate_commaless_var_list();
5711             }
5712             else
5713                 no_op("String",s);
5714         }
5715         if (!s)
5716             missingterm(NULL);
5717         pl_yylval.ival = OP_CONST;
5718         TERM(sublex_start());
5719
5720     case '"':
5721         s = scan_str(s,!!PL_madskills,FALSE);
5722         DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
5723         if (PL_expect == XOPERATOR) {
5724             if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5725                 return deprecate_commaless_var_list();
5726             }
5727             else
5728                 no_op("String",s);
5729         }
5730         if (!s)
5731             missingterm(NULL);
5732         pl_yylval.ival = OP_CONST;
5733         /* FIXME. I think that this can be const if char *d is replaced by
5734            more localised variables.  */
5735         for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
5736             if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
5737                 pl_yylval.ival = OP_STRINGIFY;
5738                 break;
5739             }
5740         }
5741         TERM(sublex_start());
5742
5743     case '`':
5744         s = scan_str(s,!!PL_madskills,FALSE);
5745         DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
5746         if (PL_expect == XOPERATOR)
5747             no_op("Backticks",s);
5748         if (!s)
5749             missingterm(NULL);
5750         readpipe_override();
5751         TERM(sublex_start());
5752
5753     case '\\':
5754         s++;
5755         if (PL_lex_inwhat && isDIGIT(*s))
5756             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
5757                            *s, *s);
5758         if (PL_expect == XOPERATOR)
5759             no_op("Backslash",s);
5760         OPERATOR(REFGEN);
5761
5762     case 'v':
5763         if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
5764             char *start = s + 2;
5765             while (isDIGIT(*start) || *start == '_')
5766                 start++;
5767             if (*start == '.' && isDIGIT(start[1])) {
5768                 s = scan_num(s, &pl_yylval);
5769                 TERM(THING);
5770             }
5771             /* avoid v123abc() or $h{v1}, allow C<print v10;> */
5772             else if (!isALPHA(*start) && (PL_expect == XTERM
5773                         || PL_expect == XREF || PL_expect == XSTATE
5774                         || PL_expect == XTERMORDORDOR)) {
5775                 GV *const gv = gv_fetchpvn_flags(s, start - s, 0, SVt_PVCV);
5776                 if (!gv) {
5777                     s = scan_num(s, &pl_yylval);
5778                     TERM(THING);
5779                 }
5780             }
5781         }
5782         goto keylookup;
5783     case 'x':
5784         if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
5785             s++;
5786             Mop(OP_REPEAT);
5787         }
5788         goto keylookup;
5789
5790     case '_':
5791     case 'a': case 'A':
5792     case 'b': case 'B':
5793     case 'c': case 'C':
5794     case 'd': case 'D':
5795     case 'e': case 'E':
5796     case 'f': case 'F':
5797     case 'g': case 'G':
5798     case 'h': case 'H':
5799     case 'i': case 'I':
5800     case 'j': case 'J':
5801     case 'k': case 'K':
5802     case 'l': case 'L':
5803     case 'm': case 'M':
5804     case 'n': case 'N':
5805     case 'o': case 'O':
5806     case 'p': case 'P':
5807     case 'q': case 'Q':
5808     case 'r': case 'R':
5809     case 's': case 'S':
5810     case 't': case 'T':
5811     case 'u': case 'U':
5812               case 'V':
5813     case 'w': case 'W':
5814               case 'X':
5815     case 'y': case 'Y':
5816     case 'z': case 'Z':
5817
5818       keylookup: {
5819         bool anydelim;
5820         I32 tmp;
5821
5822         orig_keyword = 0;
5823         gv = NULL;
5824         gvp = NULL;
5825
5826         PL_bufptr = s;
5827         s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5828
5829         /* Some keywords can be followed by any delimiter, including ':' */
5830         anydelim = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
5831                (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
5832                              (PL_tokenbuf[0] == 'q' &&
5833                               strchr("qwxr", PL_tokenbuf[1])))));
5834
5835         /* x::* is just a word, unless x is "CORE" */
5836         if (!anydelim && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
5837             goto just_a_word;
5838
5839         d = s;
5840         while (d < PL_bufend && isSPACE(*d))
5841                 d++;    /* no comments skipped here, or s### is misparsed */
5842
5843         /* Is this a word before a => operator? */
5844         if (*d == '=' && d[1] == '>') {
5845             CLINE;
5846             pl_yylval.opval
5847                 = (OP*)newSVOP(OP_CONST, 0,
5848                                S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
5849             pl_yylval.opval->op_private = OPpCONST_BARE;
5850             TERM(WORD);
5851         }
5852
5853         /* Check for plugged-in keyword */
5854         {
5855             OP *o;
5856             int result;
5857             char *saved_bufptr = PL_bufptr;
5858             PL_bufptr = s;
5859             result = CALL_FPTR(PL_keyword_plugin)(aTHX_ PL_tokenbuf, len, &o);
5860             s = PL_bufptr;
5861             if (result == KEYWORD_PLUGIN_DECLINE) {
5862                 /* not a plugged-in keyword */
5863                 PL_bufptr = saved_bufptr;
5864             } else if (result == KEYWORD_PLUGIN_STMT) {
5865                 pl_yylval.opval = o;
5866                 CLINE;
5867                 PL_expect = XSTATE;
5868                 return REPORT(PLUGSTMT);
5869             } else if (result == KEYWORD_PLUGIN_EXPR) {
5870                 pl_yylval.opval = o;
5871                 CLINE;
5872                 PL_expect = XOPERATOR;
5873                 return REPORT(PLUGEXPR);
5874             } else {
5875                 Perl_croak(aTHX_ "Bad plugin affecting keyword '%s'",
5876                                         PL_tokenbuf);
5877             }
5878         }
5879
5880         /* Check for built-in keyword */
5881         tmp = keyword(PL_tokenbuf, len, 0);
5882
5883         /* Is this a label? */
5884         if (!anydelim && PL_expect == XSTATE
5885               && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
5886             if (tmp)
5887                 Perl_croak(aTHX_ "Can't use keyword '%s' as a label", PL_tokenbuf);
5888             s = d + 1;
5889             pl_yylval.pval = CopLABEL_alloc(PL_tokenbuf);
5890             CLINE;
5891             TOKEN(LABEL);
5892         }
5893
5894         if (tmp < 0) {                  /* second-class keyword? */
5895             GV *ogv = NULL;     /* override (winner) */
5896             GV *hgv = NULL;     /* hidden (loser) */
5897             if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
5898                 CV *cv;
5899                 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
5900                     (cv = GvCVu(gv)))
5901                 {
5902                     if (GvIMPORTED_CV(gv))
5903                         ogv = gv;
5904                     else if (! CvMETHOD(cv))
5905                         hgv = gv;
5906                 }
5907                 if (!ogv &&
5908                     (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
5909                     (gv = *gvp) && isGV_with_GP(gv) &&
5910                     GvCVu(gv) && GvIMPORTED_CV(gv))
5911                 {
5912                     ogv = gv;
5913                 }
5914             }
5915             if (ogv) {
5916                 orig_keyword = tmp;
5917                 tmp = 0;                /* overridden by import or by GLOBAL */
5918             }
5919             else if (gv && !gvp
5920                      && -tmp==KEY_lock  /* XXX generalizable kludge */
5921                      && GvCVu(gv))
5922             {
5923                 tmp = 0;                /* any sub overrides "weak" keyword */
5924             }
5925             else {                      /* no override */
5926                 tmp = -tmp;
5927                 if (tmp == KEY_dump) {
5928                     Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
5929                                    "dump() better written as CORE::dump()");
5930                 }
5931                 gv = NULL;
5932                 gvp = 0;
5933                 if (hgv && tmp != KEY_x && tmp != KEY_CORE)     /* never ambiguous */
5934                     Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5935                                    "Ambiguous call resolved as CORE::%s(), %s",
5936                                    GvENAME(hgv), "qualify as such or use &");
5937             }
5938         }
5939
5940       reserved_word:
5941         switch (tmp) {
5942
5943         default:                        /* not a keyword */
5944             /* Trade off - by using this evil construction we can pull the
5945                variable gv into the block labelled keylookup. If not, then
5946                we have to give it function scope so that the goto from the
5947                earlier ':' case doesn't bypass the initialisation.  */
5948             if (0) {
5949             just_a_word_zero_gv:
5950                 gv = NULL;
5951                 gvp = NULL;
5952                 orig_keyword = 0;
5953             }
5954           just_a_word: {
5955                 SV *sv;
5956                 int pkgname = 0;
5957                 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
5958                 OP *rv2cv_op;
5959                 CV *cv;
5960 #ifdef PERL_MAD
5961                 SV *nextPL_nextwhite = 0;
5962 #endif
5963
5964
5965                 /* Get the rest if it looks like a package qualifier */
5966
5967                 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
5968                     STRLEN morelen;
5969                     s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
5970                                   TRUE, &morelen);
5971                     if (!morelen)
5972                         Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
5973                                 *s == '\'' ? "'" : "::");
5974                     len += morelen;
5975                     pkgname = 1;
5976                 }
5977
5978                 if (PL_expect == XOPERATOR) {
5979                     if (PL_bufptr == PL_linestart) {
5980                         CopLINE_dec(PL_curcop);
5981                         Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
5982                         CopLINE_inc(PL_curcop);
5983                     }
5984                     else
5985                         no_op("Bareword",s);
5986                 }
5987
5988                 /* Look for a subroutine with this name in current package,
5989                    unless name is "Foo::", in which case Foo is a bearword
5990                    (and a package name). */
5991
5992                 if (len > 2 && !PL_madskills &&
5993                     PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
5994                 {
5995                     if (ckWARN(WARN_BAREWORD)
5996                         && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
5997                         Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
5998                             "Bareword \"%s\" refers to nonexistent package",
5999                              PL_tokenbuf);
6000                     len -= 2;
6001                     PL_tokenbuf[len] = '\0';
6002                     gv = NULL;
6003                     gvp = 0;
6004                 }
6005                 else {
6006                     if (!gv) {
6007                         /* Mustn't actually add anything to a symbol table.
6008                            But also don't want to "initialise" any placeholder
6009                            constants that might already be there into full
6010                            blown PVGVs with attached PVCV.  */
6011                         gv = gv_fetchpvn_flags(PL_tokenbuf, len,
6012                                                GV_NOADD_NOINIT, SVt_PVCV);
6013                     }
6014                     len = 0;
6015                 }
6016
6017                 /* if we saw a global override before, get the right name */
6018
6019                 if (gvp) {
6020                     sv = newSVpvs("CORE::GLOBAL::");
6021                     sv_catpv(sv,PL_tokenbuf);
6022                 }
6023                 else {
6024                     /* If len is 0, newSVpv does strlen(), which is correct.
6025                        If len is non-zero, then it will be the true length,
6026                        and so the scalar will be created correctly.  */
6027                     sv = newSVpv(PL_tokenbuf,len);
6028                 }
6029 #ifdef PERL_MAD
6030                 if (PL_madskills && !PL_thistoken) {
6031                     char *start = SvPVX(PL_linestr) + PL_realtokenstart;
6032                     PL_thistoken = newSVpvn(start,s - start);
6033                     PL_realtokenstart = s - SvPVX(PL_linestr);
6034                 }
6035 #endif
6036
6037                 /* Presume this is going to be a bareword of some sort. */
6038
6039                 CLINE;
6040                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
6041                 pl_yylval.opval->op_private = OPpCONST_BARE;
6042                 /* UTF-8 package name? */
6043                 if (UTF && !IN_BYTES &&
6044                     is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
6045                     SvUTF8_on(sv);
6046
6047                 /* And if "Foo::", then that's what it certainly is. */
6048
6049                 if (len)
6050                     goto safe_bareword;
6051
6052                 cv = NULL;
6053                 {
6054                     OP *const_op = newSVOP(OP_CONST, 0, SvREFCNT_inc(sv));
6055                     const_op->op_private = OPpCONST_BARE;
6056                     rv2cv_op = newCVREF(0, const_op);
6057                 }
6058                 if (rv2cv_op->op_type == OP_RV2CV &&
6059                         (rv2cv_op->op_flags & OPf_KIDS)) {
6060                     OP *rv_op = cUNOPx(rv2cv_op)->op_first;
6061                     switch (rv_op->op_type) {
6062                         case OP_CONST: {
6063                             SV *sv = cSVOPx_sv(rv_op);
6064                             if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)
6065                                 cv = (CV*)SvRV(sv);
6066                         } break;
6067                         case OP_GV: {
6068                             GV *gv = cGVOPx_gv(rv_op);
6069                             CV *maybe_cv = GvCVu(gv);
6070                             if (maybe_cv && SvTYPE((SV*)maybe_cv) == SVt_PVCV)
6071                                 cv = maybe_cv;
6072                         } break;
6073                     }
6074                 }
6075
6076                 /* See if it's the indirect object for a list operator. */
6077
6078                 if (PL_oldoldbufptr &&
6079                     PL_oldoldbufptr < PL_bufptr &&
6080                     (PL_oldoldbufptr == PL_last_lop
6081                      || PL_oldoldbufptr == PL_last_uni) &&
6082                     /* NO SKIPSPACE BEFORE HERE! */
6083                     (PL_expect == XREF ||
6084                      ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
6085                 {
6086                     bool immediate_paren = *s == '(';
6087
6088                     /* (Now we can afford to cross potential line boundary.) */
6089                     s = SKIPSPACE2(s,nextPL_nextwhite);
6090 #ifdef PERL_MAD
6091                     PL_nextwhite = nextPL_nextwhite;    /* assume no & deception */
6092 #endif
6093
6094                     /* Two barewords in a row may indicate method call. */
6095
6096                     if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
6097                         (tmp = intuit_method(s, gv, cv))) {
6098                         op_free(rv2cv_op);
6099                         return REPORT(tmp);
6100                     }
6101
6102                     /* If not a declared subroutine, it's an indirect object. */
6103                     /* (But it's an indir obj regardless for sort.) */
6104                     /* Also, if "_" follows a filetest operator, it's a bareword */
6105
6106                     if (
6107                         ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
6108                          (!cv &&
6109                         (PL_last_lop_op != OP_MAPSTART &&
6110                          PL_last_lop_op != OP_GREPSTART))))
6111                        || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
6112                             && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
6113                        )
6114                     {
6115                         PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
6116                         goto bareword;
6117                     }
6118                 }
6119
6120                 PL_expect = XOPERATOR;
6121 #ifdef PERL_MAD
6122                 if (isSPACE(*s))
6123                     s = SKIPSPACE2(s,nextPL_nextwhite);
6124                 PL_nextwhite = nextPL_nextwhite;
6125 #else
6126                 s = skipspace(s);
6127 #endif
6128
6129                 /* Is this a word before a => operator? */
6130                 if (*s == '=' && s[1] == '>' && !pkgname) {
6131                     op_free(rv2cv_op);
6132                     CLINE;
6133                     sv_setpv(((SVOP*)pl_yylval.opval)->op_sv, PL_tokenbuf);
6134                     if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
6135                       SvUTF8_on(((SVOP*)pl_yylval.opval)->op_sv);
6136                     TERM(WORD);
6137                 }
6138
6139                 /* If followed by a paren, it's certainly a subroutine. */
6140                 if (*s == '(') {
6141                     CLINE;
6142                     if (cv) {
6143                         d = s + 1;
6144                         while (SPACE_OR_TAB(*d))
6145                             d++;
6146                         if (*d == ')' && (sv = cv_const_sv(cv))) {
6147                             s = d + 1;
6148                             goto its_constant;
6149                         }
6150                     }
6151 #ifdef PERL_MAD
6152                     if (PL_madskills) {
6153                         PL_nextwhite = PL_thiswhite;
6154                         PL_thiswhite = 0;
6155                     }
6156                     start_force(PL_curforce);
6157 #endif
6158                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6159                     PL_expect = XOPERATOR;
6160 #ifdef PERL_MAD
6161                     if (PL_madskills) {
6162                         PL_nextwhite = nextPL_nextwhite;
6163                         curmad('X', PL_thistoken);
6164                         PL_thistoken = newSVpvs("");
6165                     }
6166 #endif
6167                     op_free(rv2cv_op);
6168                     force_next(WORD);
6169                     pl_yylval.ival = 0;
6170                     TOKEN('&');
6171                 }
6172
6173                 /* If followed by var or block, call it a method (unless sub) */
6174
6175                 if ((*s == '$' || *s == '{') && !cv) {
6176                     op_free(rv2cv_op);
6177                     PL_last_lop = PL_oldbufptr;
6178                     PL_last_lop_op = OP_METHOD;
6179                     PREBLOCK(METHOD);
6180                 }
6181
6182                 /* If followed by a bareword, see if it looks like indir obj. */
6183
6184                 if (!orig_keyword
6185                         && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
6186                         && (tmp = intuit_method(s, gv, cv))) {
6187                     op_free(rv2cv_op);
6188                     return REPORT(tmp);
6189                 }
6190
6191                 /* Not a method, so call it a subroutine (if defined) */
6192
6193                 if (cv) {
6194                     if (lastchar == '-')
6195                         Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6196                                          "Ambiguous use of -%s resolved as -&%s()",
6197                                          PL_tokenbuf, PL_tokenbuf);
6198                     /* Check for a constant sub */
6199                     if ((sv = cv_const_sv(cv))) {
6200                   its_constant:
6201                         op_free(rv2cv_op);
6202                         SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
6203                         ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
6204                         pl_yylval.opval->op_private = 0;
6205                         TOKEN(WORD);
6206                     }
6207
6208                     op_free(pl_yylval.opval);
6209                     pl_yylval.opval = rv2cv_op;
6210                     pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6211                     PL_last_lop = PL_oldbufptr;
6212                     PL_last_lop_op = OP_ENTERSUB;
6213                     /* Is there a prototype? */
6214                     if (
6215 #ifdef PERL_MAD
6216                         cv &&
6217 #endif
6218                         SvPOK(cv))
6219                     {
6220                         STRLEN protolen;
6221                         const char *proto = SvPV_const(MUTABLE_SV(cv), protolen);
6222                         if (!protolen)
6223                             TERM(FUNC0SUB);
6224                         if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
6225                             OPERATOR(UNIOPSUB);
6226                         while (*proto == ';')
6227                             proto++;
6228                         if (*proto == '&' && *s == '{') {
6229                             if (PL_curstash)
6230                                 sv_setpvs(PL_subname, "__ANON__");
6231                             else
6232                                 sv_setpvs(PL_subname, "__ANON__::__ANON__");
6233                             PREBLOCK(LSTOPSUB);
6234                         }
6235                     }
6236 #ifdef PERL_MAD
6237                     {
6238                         if (PL_madskills) {
6239                             PL_nextwhite = PL_thiswhite;
6240                             PL_thiswhite = 0;
6241                         }
6242                         start_force(PL_curforce);
6243                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6244                         PL_expect = XTERM;
6245                         if (PL_madskills) {
6246                             PL_nextwhite = nextPL_nextwhite;
6247                             curmad('X', PL_thistoken);
6248                             PL_thistoken = newSVpvs("");
6249                         }
6250                         force_next(WORD);
6251                         TOKEN(NOAMP);
6252                     }
6253                 }
6254
6255                 /* Guess harder when madskills require "best effort". */
6256                 if (PL_madskills && (!gv || !GvCVu(gv))) {
6257                     int probable_sub = 0;
6258                     if (strchr("\"'`$@%0123456789!*+{[<", *s))
6259                         probable_sub = 1;
6260                     else if (isALPHA(*s)) {
6261                         char tmpbuf[1024];
6262                         STRLEN tmplen;
6263                         d = s;
6264                         d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
6265                         if (!keyword(tmpbuf, tmplen, 0))
6266                             probable_sub = 1;
6267                         else {
6268                             while (d < PL_bufend && isSPACE(*d))
6269                                 d++;
6270                             if (*d == '=' && d[1] == '>')
6271                                 probable_sub = 1;
6272                         }
6273                     }
6274                     if (probable_sub) {
6275                         gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
6276                         op_free(pl_yylval.opval);
6277                         pl_yylval.opval = rv2cv_op;
6278                         pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
6279                         PL_last_lop = PL_oldbufptr;
6280                         PL_last_lop_op = OP_ENTERSUB;
6281                         PL_nextwhite = PL_thiswhite;
6282                         PL_thiswhite = 0;
6283                         start_force(PL_curforce);
6284                         NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6285                         PL_expect = XTERM;
6286                         PL_nextwhite = nextPL_nextwhite;
6287                         curmad('X', PL_thistoken);
6288                         PL_thistoken = newSVpvs("");
6289                         force_next(WORD);
6290                         TOKEN(NOAMP);
6291                     }
6292 #else
6293                     NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
6294                     PL_expect = XTERM;
6295                     force_next(WORD);
6296                     TOKEN(NOAMP);
6297 #endif
6298                 }
6299
6300                 /* Call it a bare word */
6301
6302                 if (PL_hints & HINT_STRICT_SUBS)
6303                     pl_yylval.opval->op_private |= OPpCONST_STRICT;
6304                 else {
6305                 bareword:
6306                     /* after "print" and similar functions (corresponding to
6307                      * "F? L" in opcode.pl), whatever wasn't already parsed as
6308                      * a filehandle should be subject to "strict subs".
6309                      * Likewise for the optional indirect-object argument to system
6310                      * or exec, which can't be a bareword */
6311                     if ((PL_last_lop_op == OP_PRINT
6312                             || PL_last_lop_op == OP_PRTF
6313                             || PL_last_lop_op == OP_SAY
6314                             || PL_last_lop_op == OP_SYSTEM
6315                             || PL_last_lop_op == OP_EXEC)
6316                             && (PL_hints & HINT_STRICT_SUBS))
6317                         pl_yylval.opval->op_private |= OPpCONST_STRICT;
6318                     if (lastchar != '-') {
6319                         if (ckWARN(WARN_RESERVED)) {
6320                             d = PL_tokenbuf;
6321                             while (isLOWER(*d))
6322                                 d++;
6323                             if (!*d && !gv_stashpv(PL_tokenbuf, 0))
6324                                 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
6325                                        PL_tokenbuf);
6326                         }
6327                     }
6328                 }
6329                 op_free(rv2cv_op);
6330
6331             safe_bareword:
6332                 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')) {
6333                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6334                                      "Operator or semicolon missing before %c%s",
6335                                      lastchar, PL_tokenbuf);
6336                     Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6337                                      "Ambiguous use of %c resolved as operator %c",
6338                                      lastchar, lastchar);
6339                 }
6340                 TOKEN(WORD);
6341             }
6342
6343         case KEY___FILE__:
6344             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6345                                         newSVpv(CopFILE(PL_curcop),0));
6346             TERM(THING);
6347
6348         case KEY___LINE__:
6349             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6350                                     Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
6351             TERM(THING);
6352
6353         case KEY___PACKAGE__:
6354             pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
6355                                         (PL_curstash
6356                                          ? newSVhek(HvNAME_HEK(PL_curstash))
6357                                          : &PL_sv_undef));
6358             TERM(THING);
6359
6360         case KEY___DATA__:
6361         case KEY___END__: {
6362             GV *gv;
6363             if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
6364                 const char *pname = "main";
6365                 if (PL_tokenbuf[2] == 'D')
6366                     pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
6367                 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
6368                                 SVt_PVIO);
6369                 GvMULTI_on(gv);
6370                 if (!GvIO(gv))
6371                     GvIOp(gv) = newIO();
6372                 IoIFP(GvIOp(gv)) = PL_rsfp;
6373 #if defined(HAS_FCNTL) && defined(F_SETFD)
6374                 {
6375                     const int fd = PerlIO_fileno(PL_rsfp);
6376                     fcntl(fd,F_SETFD,fd >= 3);
6377                 }
6378 #endif
6379                 /* Mark this internal pseudo-handle as clean */
6380                 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
6381                 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
6382                     IoTYPE(GvIOp(gv)) = IoTYPE_STD;
6383                 else
6384                     IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
6385 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
6386                 /* if the script was opened in binmode, we need to revert
6387                  * it to text mode for compatibility; but only iff it has CRs
6388                  * XXX this is a questionable hack at best. */
6389                 if (PL_bufend-PL_bufptr > 2
6390                     && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
6391                 {
6392                     Off_t loc = 0;
6393                     if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
6394                         loc = PerlIO_tell(PL_rsfp);
6395                         (void)PerlIO_seek(PL_rsfp, 0L, 0);
6396                     }
6397 #ifdef NETWARE
6398                         if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
6399 #else
6400                     if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
6401 #endif  /* NETWARE */
6402 #ifdef PERLIO_IS_STDIO /* really? */
6403 #  if defined(__BORLANDC__)
6404                         /* XXX see note in do_binmode() */
6405                         ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
6406 #  endif
6407 #endif
6408                         if (loc > 0)
6409                             PerlIO_seek(PL_rsfp, loc, 0);
6410                     }
6411                 }
6412 #endif
6413 #ifdef PERLIO_LAYERS
6414                 if (!IN_BYTES) {
6415                     if (UTF)
6416                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
6417                     else if (PL_encoding) {
6418                         SV *name;
6419                         dSP;
6420                         ENTER;
6421                         SAVETMPS;
6422                         PUSHMARK(sp);
6423                         EXTEND(SP, 1);
6424                         XPUSHs(PL_encoding);
6425                         PUTBACK;
6426                         call_method("name", G_SCALAR);
6427                         SPAGAIN;
6428                         name = POPs;
6429                         PUTBACK;
6430                         PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
6431                                             Perl_form(aTHX_ ":encoding(%"SVf")",
6432                                                       SVfARG(name)));
6433                         FREETMPS;
6434                         LEAVE;
6435                     }
6436                 }
6437 #endif
6438 #ifdef PERL_MAD
6439                 if (PL_madskills) {
6440                     if (PL_realtokenstart >= 0) {
6441                         char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
6442                         if (!PL_endwhite)
6443                             PL_endwhite = newSVpvs("");
6444                         sv_catsv(PL_endwhite, PL_thiswhite);
6445                         PL_thiswhite = 0;
6446                         sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
6447                         PL_realtokenstart = -1;
6448                     }
6449                     while ((s = filter_gets(PL_endwhite, SvCUR(PL_endwhite)))
6450                            != NULL) ;
6451                 }
6452 #endif
6453                 PL_rsfp = NULL;
6454             }
6455             goto fake_eof;
6456         }
6457
6458         case KEY_AUTOLOAD:
6459         case KEY_DESTROY:
6460         case KEY_BEGIN:
6461         case KEY_UNITCHECK:
6462         case KEY_CHECK:
6463         case KEY_INIT:
6464         case KEY_END:
6465             if (PL_expect == XSTATE) {
6466                 s = PL_bufptr;
6467                 goto really_sub;
6468             }
6469             goto just_a_word;
6470
6471         case KEY_CORE:
6472             if (*s == ':' && s[1] == ':') {
6473                 s += 2;
6474                 d = s;
6475                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6476                 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6477                     Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
6478                 if (tmp < 0)
6479                     tmp = -tmp;
6480                 else if (tmp == KEY_require || tmp == KEY_do)
6481                     /* that's a way to remember we saw "CORE::" */
6482                     orig_keyword = tmp;
6483                 goto reserved_word;
6484             }
6485             goto just_a_word;
6486
6487         case KEY_abs:
6488             UNI(OP_ABS);
6489
6490         case KEY_alarm:
6491             UNI(OP_ALARM);
6492
6493         case KEY_accept:
6494             LOP(OP_ACCEPT,XTERM);
6495
6496         case KEY_and:
6497             OPERATOR(ANDOP);
6498
6499         case KEY_atan2:
6500             LOP(OP_ATAN2,XTERM);
6501
6502         case KEY_bind:
6503             LOP(OP_BIND,XTERM);
6504
6505         case KEY_binmode:
6506             LOP(OP_BINMODE,XTERM);
6507
6508         case KEY_bless:
6509             LOP(OP_BLESS,XTERM);
6510
6511         case KEY_break:
6512             FUN0(OP_BREAK);
6513
6514         case KEY_chop:
6515             UNI(OP_CHOP);
6516
6517         case KEY_continue:
6518             /* When 'use switch' is in effect, continue has a dual
6519                life as a control operator. */
6520             {
6521                 if (!FEATURE_IS_ENABLED("switch"))
6522                     PREBLOCK(CONTINUE);
6523                 else {
6524                     /* We have to disambiguate the two senses of
6525                       "continue". If the next token is a '{' then
6526                       treat it as the start of a continue block;
6527                       otherwise treat it as a control operator.
6528                      */
6529                     s = skipspace(s);
6530                     if (*s == '{')
6531             PREBLOCK(CONTINUE);
6532                     else
6533                         FUN0(OP_CONTINUE);
6534                 }
6535             }
6536
6537         case KEY_chdir:
6538             /* may use HOME */
6539             (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
6540             UNI(OP_CHDIR);
6541
6542         case KEY_close:
6543             UNI(OP_CLOSE);
6544
6545         case KEY_closedir:
6546             UNI(OP_CLOSEDIR);
6547
6548         case KEY_cmp:
6549             Eop(OP_SCMP);
6550
6551         case KEY_caller:
6552             UNI(OP_CALLER);
6553
6554         case KEY_crypt:
6555 #ifdef FCRYPT
6556             if (!PL_cryptseen) {
6557                 PL_cryptseen = TRUE;
6558                 init_des();
6559             }
6560 #endif
6561             LOP(OP_CRYPT,XTERM);
6562
6563         case KEY_chmod:
6564             LOP(OP_CHMOD,XTERM);
6565
6566         case KEY_chown:
6567             LOP(OP_CHOWN,XTERM);
6568
6569         case KEY_connect:
6570             LOP(OP_CONNECT,XTERM);
6571
6572         case KEY_chr:
6573             UNI(OP_CHR);
6574
6575         case KEY_cos:
6576             UNI(OP_COS);
6577
6578         case KEY_chroot:
6579             UNI(OP_CHROOT);
6580
6581         case KEY_default:
6582             PREBLOCK(DEFAULT);
6583
6584         case KEY_do:
6585             s = SKIPSPACE1(s);
6586             if (*s == '{')
6587                 PRETERMBLOCK(DO);
6588             if (*s != '\'')
6589                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
6590             if (orig_keyword == KEY_do) {
6591                 orig_keyword = 0;
6592                 pl_yylval.ival = 1;
6593             }
6594             else
6595                 pl_yylval.ival = 0;
6596             OPERATOR(DO);
6597
6598         case KEY_die:
6599             PL_hints |= HINT_BLOCK_SCOPE;
6600             LOP(OP_DIE,XTERM);
6601
6602         case KEY_defined:
6603             UNI(OP_DEFINED);
6604
6605         case KEY_delete:
6606             UNI(OP_DELETE);
6607
6608         case KEY_dbmopen:
6609             gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
6610             LOP(OP_DBMOPEN,XTERM);
6611
6612         case KEY_dbmclose:
6613             UNI(OP_DBMCLOSE);
6614
6615         case KEY_dump:
6616             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6617             LOOPX(OP_DUMP);
6618
6619         case KEY_else:
6620             PREBLOCK(ELSE);
6621
6622         case KEY_elsif:
6623             pl_yylval.ival = CopLINE(PL_curcop);
6624             OPERATOR(ELSIF);
6625
6626         case KEY_eq:
6627             Eop(OP_SEQ);
6628
6629         case KEY_exists:
6630             UNI(OP_EXISTS);
6631         
6632         case KEY_exit:
6633             if (PL_madskills)
6634                 UNI(OP_INT);
6635             UNI(OP_EXIT);
6636
6637         case KEY_eval:
6638             s = SKIPSPACE1(s);
6639             if (*s == '{') { /* block eval */
6640                 PL_expect = XTERMBLOCK;
6641                 UNIBRACK(OP_ENTERTRY);
6642             }
6643             else { /* string eval */
6644                 PL_expect = XTERM;
6645                 UNIBRACK(OP_ENTEREVAL);
6646             }
6647
6648         case KEY_eof:
6649             UNI(OP_EOF);
6650
6651         case KEY_exp:
6652             UNI(OP_EXP);
6653
6654         case KEY_each:
6655             UNI(OP_EACH);
6656
6657         case KEY_exec:
6658             LOP(OP_EXEC,XREF);
6659
6660         case KEY_endhostent:
6661             FUN0(OP_EHOSTENT);
6662
6663         case KEY_endnetent:
6664             FUN0(OP_ENETENT);
6665
6666         case KEY_endservent:
6667             FUN0(OP_ESERVENT);
6668
6669         case KEY_endprotoent:
6670             FUN0(OP_EPROTOENT);
6671
6672         case KEY_endpwent:
6673             FUN0(OP_EPWENT);
6674
6675         case KEY_endgrent:
6676             FUN0(OP_EGRENT);
6677
6678         case KEY_for:
6679         case KEY_foreach:
6680             pl_yylval.ival = CopLINE(PL_curcop);
6681             s = SKIPSPACE1(s);
6682             if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
6683                 char *p = s;
6684 #ifdef PERL_MAD
6685                 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
6686 #endif
6687
6688                 if ((PL_bufend - p) >= 3 &&
6689                     strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
6690                     p += 2;
6691                 else if ((PL_bufend - p) >= 4 &&
6692                     strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
6693                     p += 3;
6694                 p = PEEKSPACE(p);
6695                 if (isIDFIRST_lazy_if(p,UTF)) {
6696                     p = scan_ident(p, PL_bufend,
6697                         PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
6698                     p = PEEKSPACE(p);
6699                 }
6700                 if (*p != '$')
6701                     Perl_croak(aTHX_ "Missing $ on loop variable");
6702 #ifdef PERL_MAD
6703                 s = SvPVX(PL_linestr) + soff;
6704 #endif
6705             }
6706             OPERATOR(FOR);
6707
6708         case KEY_formline:
6709             LOP(OP_FORMLINE,XTERM);
6710
6711         case KEY_fork:
6712             FUN0(OP_FORK);
6713
6714         case KEY_fcntl:
6715             LOP(OP_FCNTL,XTERM);
6716
6717         case KEY_fileno:
6718             UNI(OP_FILENO);
6719
6720         case KEY_flock:
6721             LOP(OP_FLOCK,XTERM);
6722
6723         case KEY_gt:
6724             Rop(OP_SGT);
6725
6726         case KEY_ge:
6727             Rop(OP_SGE);
6728
6729         case KEY_grep:
6730             LOP(OP_GREPSTART, XREF);
6731
6732         case KEY_goto:
6733             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6734             LOOPX(OP_GOTO);
6735
6736         case KEY_gmtime:
6737             UNI(OP_GMTIME);
6738
6739         case KEY_getc:
6740             UNIDOR(OP_GETC);
6741
6742         case KEY_getppid:
6743             FUN0(OP_GETPPID);
6744
6745         case KEY_getpgrp:
6746             UNI(OP_GETPGRP);
6747
6748         case KEY_getpriority:
6749             LOP(OP_GETPRIORITY,XTERM);
6750
6751         case KEY_getprotobyname:
6752             UNI(OP_GPBYNAME);
6753
6754         case KEY_getprotobynumber:
6755             LOP(OP_GPBYNUMBER,XTERM);
6756
6757         case KEY_getprotoent:
6758             FUN0(OP_GPROTOENT);
6759
6760         case KEY_getpwent:
6761             FUN0(OP_GPWENT);
6762
6763         case KEY_getpwnam:
6764             UNI(OP_GPWNAM);
6765
6766         case KEY_getpwuid:
6767             UNI(OP_GPWUID);
6768
6769         case KEY_getpeername:
6770             UNI(OP_GETPEERNAME);
6771
6772         case KEY_gethostbyname:
6773             UNI(OP_GHBYNAME);
6774
6775         case KEY_gethostbyaddr:
6776             LOP(OP_GHBYADDR,XTERM);
6777
6778         case KEY_gethostent:
6779             FUN0(OP_GHOSTENT);
6780
6781         case KEY_getnetbyname:
6782             UNI(OP_GNBYNAME);
6783
6784         case KEY_getnetbyaddr:
6785             LOP(OP_GNBYADDR,XTERM);
6786
6787         case KEY_getnetent:
6788             FUN0(OP_GNETENT);
6789
6790         case KEY_getservbyname:
6791             LOP(OP_GSBYNAME,XTERM);
6792
6793         case KEY_getservbyport:
6794             LOP(OP_GSBYPORT,XTERM);
6795
6796         case KEY_getservent:
6797             FUN0(OP_GSERVENT);
6798
6799         case KEY_getsockname:
6800             UNI(OP_GETSOCKNAME);
6801
6802         case KEY_getsockopt:
6803             LOP(OP_GSOCKOPT,XTERM);
6804
6805         case KEY_getgrent:
6806             FUN0(OP_GGRENT);
6807
6808         case KEY_getgrnam:
6809             UNI(OP_GGRNAM);
6810
6811         case KEY_getgrgid:
6812             UNI(OP_GGRGID);
6813
6814         case KEY_getlogin:
6815             FUN0(OP_GETLOGIN);
6816
6817         case KEY_given:
6818             pl_yylval.ival = CopLINE(PL_curcop);
6819             OPERATOR(GIVEN);
6820
6821         case KEY_glob:
6822             LOP(OP_GLOB,XTERM);
6823
6824         case KEY_hex:
6825             UNI(OP_HEX);
6826
6827         case KEY_if:
6828             pl_yylval.ival = CopLINE(PL_curcop);
6829             OPERATOR(IF);
6830
6831         case KEY_index:
6832             LOP(OP_INDEX,XTERM);
6833
6834         case KEY_int:
6835             UNI(OP_INT);
6836
6837         case KEY_ioctl:
6838             LOP(OP_IOCTL,XTERM);
6839
6840         case KEY_join:
6841             LOP(OP_JOIN,XTERM);
6842
6843         case KEY_keys:
6844             UNI(OP_KEYS);
6845
6846         case KEY_kill:
6847             LOP(OP_KILL,XTERM);
6848
6849         case KEY_last:
6850             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6851             LOOPX(OP_LAST);
6852         
6853         case KEY_lc:
6854             UNI(OP_LC);
6855
6856         case KEY_lcfirst:
6857             UNI(OP_LCFIRST);
6858
6859         case KEY_local:
6860             pl_yylval.ival = 0;
6861             OPERATOR(LOCAL);
6862
6863         case KEY_length:
6864             UNI(OP_LENGTH);
6865
6866         case KEY_lt:
6867             Rop(OP_SLT);
6868
6869         case KEY_le:
6870             Rop(OP_SLE);
6871
6872         case KEY_localtime:
6873             UNI(OP_LOCALTIME);
6874
6875         case KEY_log:
6876             UNI(OP_LOG);
6877
6878         case KEY_link:
6879             LOP(OP_LINK,XTERM);
6880
6881         case KEY_listen:
6882             LOP(OP_LISTEN,XTERM);
6883
6884         case KEY_lock:
6885             UNI(OP_LOCK);
6886
6887         case KEY_lstat:
6888             UNI(OP_LSTAT);
6889
6890         case KEY_m:
6891             s = scan_pat(s,OP_MATCH);
6892             TERM(sublex_start());
6893
6894         case KEY_map:
6895             LOP(OP_MAPSTART, XREF);
6896
6897         case KEY_mkdir:
6898             LOP(OP_MKDIR,XTERM);
6899
6900         case KEY_msgctl:
6901             LOP(OP_MSGCTL,XTERM);
6902
6903         case KEY_msgget:
6904             LOP(OP_MSGGET,XTERM);
6905
6906         case KEY_msgrcv:
6907             LOP(OP_MSGRCV,XTERM);
6908
6909         case KEY_msgsnd:
6910             LOP(OP_MSGSND,XTERM);
6911
6912         case KEY_our:
6913         case KEY_my:
6914         case KEY_state:
6915             PL_in_my = (U16)tmp;
6916             s = SKIPSPACE1(s);
6917             if (isIDFIRST_lazy_if(s,UTF)) {
6918 #ifdef PERL_MAD
6919                 char* start = s;
6920 #endif
6921                 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
6922                 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
6923                     goto really_sub;
6924                 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
6925                 if (!PL_in_my_stash) {
6926                     char tmpbuf[1024];
6927                     PL_bufptr = s;
6928                     my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
6929                     yyerror(tmpbuf);
6930                 }
6931 #ifdef PERL_MAD
6932                 if (PL_madskills) {     /* just add type to declarator token */
6933                     sv_catsv(PL_thistoken, PL_nextwhite);
6934                     PL_nextwhite = 0;
6935                     sv_catpvn(PL_thistoken, start, s - start);
6936                 }
6937 #endif
6938             }
6939             pl_yylval.ival = 1;
6940             OPERATOR(MY);
6941
6942         case KEY_next:
6943             s = force_word(s,WORD,TRUE,FALSE,FALSE);
6944             LOOPX(OP_NEXT);
6945
6946         case KEY_ne:
6947             Eop(OP_SNE);
6948
6949         case KEY_no:
6950             s = tokenize_use(0, s);
6951             OPERATOR(USE);
6952
6953         case KEY_not:
6954             if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
6955                 FUN1(OP_NOT);
6956             else
6957                 OPERATOR(NOTOP);
6958
6959         case KEY_open:
6960             s = SKIPSPACE1(s);
6961             if (isIDFIRST_lazy_if(s,UTF)) {
6962                 const char *t;
6963                 for (d = s; isALNUM_lazy_if(d,UTF);)
6964                     d++;
6965                 for (t=d; isSPACE(*t);)
6966                     t++;
6967                 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
6968                     /* [perl #16184] */
6969                     && !(t[0] == '=' && t[1] == '>')
6970                 ) {
6971                     int parms_len = (int)(d-s);
6972                     Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
6973                            "Precedence problem: open %.*s should be open(%.*s)",
6974                             parms_len, s, parms_len, s);
6975                 }
6976             }
6977             LOP(OP_OPEN,XTERM);
6978
6979         case KEY_or:
6980             pl_yylval.ival = OP_OR;
6981             OPERATOR(OROP);
6982
6983         case KEY_ord:
6984             UNI(OP_ORD);
6985
6986         case KEY_oct:
6987             UNI(OP_OCT);
6988
6989         case KEY_opendir:
6990             LOP(OP_OPEN_DIR,XTERM);
6991
6992         case KEY_print:
6993             checkcomma(s,PL_tokenbuf,"filehandle");
6994             LOP(OP_PRINT,XREF);
6995
6996         case KEY_printf:
6997             checkcomma(s,PL_tokenbuf,"filehandle");
6998             LOP(OP_PRTF,XREF);
6999
7000         case KEY_prototype:
7001             UNI(OP_PROTOTYPE);
7002
7003         case KEY_push:
7004             LOP(OP_PUSH,XTERM);
7005
7006         case KEY_pop:
7007             UNIDOR(OP_POP);
7008
7009         case KEY_pos:
7010             UNIDOR(OP_POS);
7011         
7012         case KEY_pack:
7013             LOP(OP_PACK,XTERM);
7014
7015         case KEY_package:
7016             s = force_word(s,WORD,FALSE,TRUE,FALSE);
7017             s = SKIPSPACE1(s);
7018             s = force_strict_version(s);
7019             OPERATOR(PACKAGE);
7020
7021         case KEY_pipe:
7022             LOP(OP_PIPE_OP,XTERM);
7023
7024         case KEY_q:
7025             s = scan_str(s,!!PL_madskills,FALSE);
7026             if (!s)
7027                 missingterm(NULL);
7028             pl_yylval.ival = OP_CONST;
7029             TERM(sublex_start());
7030
7031         case KEY_quotemeta:
7032             UNI(OP_QUOTEMETA);
7033
7034         case KEY_qw:
7035             s = scan_str(s,!!PL_madskills,FALSE);
7036             if (!s)
7037                 missingterm(NULL);
7038             PL_expect = XOPERATOR;
7039             force_next(')');
7040             if (SvCUR(PL_lex_stuff)) {
7041                 OP *words = NULL;
7042                 int warned = 0;
7043                 d = SvPV_force(PL_lex_stuff, len);
7044                 while (len) {
7045                     for (; isSPACE(*d) && len; --len, ++d)
7046                         /**/;
7047                     if (len) {
7048                         SV *sv;
7049                         const char *b = d;
7050                         if (!warned && ckWARN(WARN_QW)) {
7051                             for (; !isSPACE(*d) && len; --len, ++d) {
7052                                 if (*d == ',') {
7053                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7054                                         "Possible attempt to separate words with commas");
7055                                     ++warned;
7056                                 }
7057                                 else if (*d == '#') {
7058                                     Perl_warner(aTHX_ packWARN(WARN_QW),
7059                                         "Possible attempt to put comments in qw() list");
7060                                     ++warned;
7061                                 }
7062                             }
7063                         }
7064                         else {
7065                             for (; !isSPACE(*d) && len; --len, ++d)
7066                                 /**/;
7067                         }
7068                         sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
7069                         words = append_elem(OP_LIST, words,
7070                                             newSVOP(OP_CONST, 0, tokeq(sv)));
7071                     }
7072                 }
7073                 if (words) {
7074                     start_force(PL_curforce);
7075                     NEXTVAL_NEXTTOKE.opval = words;
7076                     force_next(THING);
7077                 }
7078             }
7079             if (PL_lex_stuff) {
7080                 SvREFCNT_dec(PL_lex_stuff);
7081                 PL_lex_stuff = NULL;
7082             }
7083             PL_expect = XTERM;
7084             TOKEN('(');
7085
7086         case KEY_qq:
7087             s = scan_str(s,!!PL_madskills,FALSE);
7088             if (!s)
7089                 missingterm(NULL);
7090             pl_yylval.ival = OP_STRINGIFY;
7091             if (SvIVX(PL_lex_stuff) == '\'')
7092                 SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
7093             TERM(sublex_start());
7094
7095         case KEY_qr:
7096             s = scan_pat(s,OP_QR);
7097             TERM(sublex_start());
7098
7099         case KEY_qx:
7100             s = scan_str(s,!!PL_madskills,FALSE);
7101             if (!s)
7102                 missingterm(NULL);
7103             readpipe_override();
7104             TERM(sublex_start());
7105
7106         case KEY_return:
7107             OLDLOP(OP_RETURN);
7108
7109         case KEY_require:
7110             s = SKIPSPACE1(s);
7111             if (isDIGIT(*s)) {
7112                 s = force_version(s, FALSE);
7113             }
7114             else if (*s != 'v' || !isDIGIT(s[1])
7115                     || (s = force_version(s, TRUE), *s == 'v'))
7116             {
7117                 *PL_tokenbuf = '\0';
7118                 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7119                 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
7120                     gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
7121                 else if (*s == '<')
7122                     yyerror("<> should be quotes");
7123             }
7124             if (orig_keyword == KEY_require) {
7125                 orig_keyword = 0;
7126                 pl_yylval.ival = 1;
7127             }
7128             else 
7129                 pl_yylval.ival = 0;
7130             PL_expect = XTERM;
7131             PL_bufptr = s;
7132             PL_last_uni = PL_oldbufptr;
7133             PL_last_lop_op = OP_REQUIRE;
7134             s = skipspace(s);
7135             return REPORT( (int)REQUIRE );
7136
7137         case KEY_reset:
7138             UNI(OP_RESET);
7139
7140         case KEY_redo:
7141             s = force_word(s,WORD,TRUE,FALSE,FALSE);
7142             LOOPX(OP_REDO);
7143
7144         case KEY_rename:
7145             LOP(OP_RENAME,XTERM);
7146
7147         case KEY_rand:
7148             UNI(OP_RAND);
7149
7150         case KEY_rmdir:
7151             UNI(OP_RMDIR);
7152
7153         case KEY_rindex:
7154             LOP(OP_RINDEX,XTERM);
7155
7156         case KEY_read:
7157             LOP(OP_READ,XTERM);
7158
7159         case KEY_readdir:
7160             UNI(OP_READDIR);
7161
7162         case KEY_readline:
7163             UNIDOR(OP_READLINE);
7164
7165         case KEY_readpipe:
7166             UNIDOR(OP_BACKTICK);
7167
7168         case KEY_rewinddir:
7169             UNI(OP_REWINDDIR);
7170
7171         case KEY_recv:
7172             LOP(OP_RECV,XTERM);
7173
7174         case KEY_reverse:
7175             LOP(OP_REVERSE,XTERM);
7176
7177         case KEY_readlink:
7178             UNIDOR(OP_READLINK);
7179
7180         case KEY_ref:
7181             UNI(OP_REF);
7182
7183         case KEY_s:
7184             s = scan_subst(s);
7185             if (pl_yylval.opval)
7186                 TERM(sublex_start());
7187             else
7188                 TOKEN(1);       /* force error */
7189
7190         case KEY_say:
7191             checkcomma(s,PL_tokenbuf,"filehandle");
7192             LOP(OP_SAY,XREF);
7193
7194         case KEY_chomp:
7195             UNI(OP_CHOMP);
7196         
7197         case KEY_scalar:
7198             UNI(OP_SCALAR);
7199
7200         case KEY_select:
7201             LOP(OP_SELECT,XTERM);
7202
7203         case KEY_seek:
7204             LOP(OP_SEEK,XTERM);
7205
7206         case KEY_semctl:
7207             LOP(OP_SEMCTL,XTERM);
7208
7209         case KEY_semget:
7210             LOP(OP_SEMGET,XTERM);
7211
7212         case KEY_semop:
7213             LOP(OP_SEMOP,XTERM);
7214
7215         case KEY_send:
7216             LOP(OP_SEND,XTERM);
7217
7218         case KEY_setpgrp:
7219             LOP(OP_SETPGRP,XTERM);
7220
7221         case KEY_setpriority:
7222             LOP(OP_SETPRIORITY,XTERM);
7223
7224         case KEY_sethostent:
7225             UNI(OP_SHOSTENT);
7226
7227         case KEY_setnetent:
7228             UNI(OP_SNETENT);
7229
7230         case KEY_setservent:
7231             UNI(OP_SSERVENT);
7232
7233         case KEY_setprotoent:
7234             UNI(OP_SPROTOENT);
7235
7236         case KEY_setpwent:
7237             FUN0(OP_SPWENT);
7238
7239         case KEY_setgrent:
7240             FUN0(OP_SGRENT);
7241
7242         case KEY_seekdir:
7243             LOP(OP_SEEKDIR,XTERM);
7244
7245         case KEY_setsockopt:
7246             LOP(OP_SSOCKOPT,XTERM);
7247
7248         case KEY_shift:
7249             UNIDOR(OP_SHIFT);
7250
7251         case KEY_shmctl:
7252             LOP(OP_SHMCTL,XTERM);
7253
7254         case KEY_shmget:
7255             LOP(OP_SHMGET,XTERM);
7256
7257         case KEY_shmread:
7258             LOP(OP_SHMREAD,XTERM);
7259
7260         case KEY_shmwrite:
7261             LOP(OP_SHMWRITE,XTERM);
7262
7263         case KEY_shutdown:
7264             LOP(OP_SHUTDOWN,XTERM);
7265
7266         case KEY_sin:
7267             UNI(OP_SIN);
7268
7269         case KEY_sleep:
7270             UNI(OP_SLEEP);
7271
7272         case KEY_socket:
7273             LOP(OP_SOCKET,XTERM);
7274
7275         case KEY_socketpair:
7276             LOP(OP_SOCKPAIR,XTERM);
7277
7278         case KEY_sort:
7279             checkcomma(s,PL_tokenbuf,"subroutine name");
7280             s = SKIPSPACE1(s);
7281             if (*s == ';' || *s == ')')         /* probably a close */
7282                 Perl_croak(aTHX_ "sort is now a reserved word");
7283             PL_expect = XTERM;
7284             s = force_word(s,WORD,TRUE,TRUE,FALSE);
7285             LOP(OP_SORT,XREF);
7286
7287         case KEY_split:
7288             LOP(OP_SPLIT,XTERM);
7289
7290         case KEY_sprintf:
7291             LOP(OP_SPRINTF,XTERM);
7292
7293         case KEY_splice:
7294             LOP(OP_SPLICE,XTERM);
7295
7296         case KEY_sqrt:
7297             UNI(OP_SQRT);
7298
7299         case KEY_srand:
7300             UNI(OP_SRAND);
7301
7302         case KEY_stat:
7303             UNI(OP_STAT);
7304
7305         case KEY_study:
7306             UNI(OP_STUDY);
7307
7308         case KEY_substr:
7309             LOP(OP_SUBSTR,XTERM);
7310
7311         case KEY_format:
7312         case KEY_sub:
7313           really_sub:
7314             {
7315                 char tmpbuf[sizeof PL_tokenbuf];
7316                 SSize_t tboffset = 0;
7317                 expectation attrful;
7318                 bool have_name, have_proto;
7319                 const int key = tmp;
7320
7321 #ifdef PERL_MAD
7322                 SV *tmpwhite = 0;
7323
7324                 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
7325                 SV *subtoken = newSVpvn(tstart, s - tstart);
7326                 PL_thistoken = 0;
7327
7328                 d = s;
7329                 s = SKIPSPACE2(s,tmpwhite);
7330 #else
7331                 s = skipspace(s);
7332 #endif
7333
7334                 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
7335                     (*s == ':' && s[1] == ':'))
7336                 {
7337 #ifdef PERL_MAD
7338                     SV *nametoke = NULL;
7339 #endif
7340
7341                     PL_expect = XBLOCK;
7342                     attrful = XATTRBLOCK;
7343                     /* remember buffer pos'n for later force_word */
7344                     tboffset = s - PL_oldbufptr;
7345                     d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
7346 #ifdef PERL_MAD
7347                     if (PL_madskills)
7348                         nametoke = newSVpvn(s, d - s);
7349 #endif
7350                     if (memchr(tmpbuf, ':', len))
7351                         sv_setpvn(PL_subname, tmpbuf, len);
7352                     else {
7353                         sv_setsv(PL_subname,PL_curstname);
7354                         sv_catpvs(PL_subname,"::");
7355                         sv_catpvn(PL_subname,tmpbuf,len);
7356                     }
7357                     have_name = TRUE;
7358
7359 #ifdef PERL_MAD
7360
7361                     start_force(0);
7362                     CURMAD('X', nametoke);
7363                     CURMAD('_', tmpwhite);
7364                     (void) force_word(PL_oldbufptr + tboffset, WORD,
7365                                       FALSE, TRUE, TRUE);
7366
7367                     s = SKIPSPACE2(d,tmpwhite);
7368 #else
7369                     s = skipspace(d);
7370 #endif
7371                 }
7372                 else {
7373                     if (key == KEY_my)
7374                         Perl_croak(aTHX_ "Missing name in \"my sub\"");
7375                     PL_expect = XTERMBLOCK;
7376                     attrful = XATTRTERM;
7377                     sv_setpvs(PL_subname,"?");
7378                     have_name = FALSE;
7379                 }
7380
7381                 if (key == KEY_format) {
7382                     if (*s == '=')
7383                         PL_lex_formbrack = PL_lex_brackets + 1;
7384 #ifdef PERL_MAD
7385                     PL_thistoken = subtoken;
7386                     s = d;
7387 #else
7388                     if (have_name)
7389                         (void) force_word(PL_oldbufptr + tboffset, WORD,
7390                                           FALSE, TRUE, TRUE);
7391 #endif
7392                     OPERATOR(FORMAT);
7393                 }
7394
7395                 /* Look for a prototype */
7396                 if (*s == '(') {
7397                     char *p;
7398                     bool bad_proto = FALSE;
7399                     bool in_brackets = FALSE;
7400                     char greedy_proto = ' ';
7401                     bool proto_after_greedy_proto = FALSE;
7402                     bool must_be_last = FALSE;
7403                     bool underscore = FALSE;
7404                     bool seen_underscore = FALSE;
7405                     const bool warnillegalproto = ckWARN(WARN_ILLEGALPROTO);
7406
7407                     s = scan_str(s,!!PL_madskills,FALSE);
7408                     if (!s)
7409                         Perl_croak(aTHX_ "Prototype not terminated");
7410                     /* strip spaces and check for bad characters */
7411                     d = SvPVX(PL_lex_stuff);
7412                     tmp = 0;
7413                     for (p = d; *p; ++p) {
7414                         if (!isSPACE(*p)) {
7415                             d[tmp++] = *p;
7416
7417                             if (warnillegalproto) {
7418                                 if (must_be_last)
7419                                     proto_after_greedy_proto = TRUE;
7420                                 if (!strchr("$@%*;[]&\\_", *p)) {
7421                                     bad_proto = TRUE;
7422                                 }
7423                                 else {
7424                                     if ( underscore ) {
7425                                         if ( *p != ';' )
7426                                             bad_proto = TRUE;
7427                                         underscore = FALSE;
7428                                     }
7429                                     if ( *p == '[' ) {
7430                                         in_brackets = TRUE;
7431                                     }
7432                                     else if ( *p == ']' ) {
7433                                         in_brackets = FALSE;
7434                                     }
7435                                     else if ( (*p == '@' || *p == '%') &&
7436                                          ( tmp < 2 || d[tmp-2] != '\\' ) &&
7437                                          !in_brackets ) {
7438                                         must_be_last = TRUE;
7439                                         greedy_proto = *p;
7440                                     }
7441                                     else if ( *p == '_' ) {
7442                                         underscore = seen_underscore = TRUE;
7443                                     }
7444                                 }
7445                             }
7446                         }
7447                     }
7448                     d[tmp] = '\0';
7449                     if (proto_after_greedy_proto)
7450                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7451                                     "Prototype after '%c' for %"SVf" : %s",
7452                                     greedy_proto, SVfARG(PL_subname), d);
7453                     if (bad_proto)
7454                         Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
7455                                     "Illegal character %sin prototype for %"SVf" : %s",
7456                                     seen_underscore ? "after '_' " : "",
7457                                     SVfARG(PL_subname), d);
7458                     SvCUR_set(PL_lex_stuff, tmp);
7459                     have_proto = TRUE;
7460
7461 #ifdef PERL_MAD
7462                     start_force(0);
7463                     CURMAD('q', PL_thisopen);
7464                     CURMAD('_', tmpwhite);
7465                     CURMAD('=', PL_thisstuff);
7466                     CURMAD('Q', PL_thisclose);
7467                     NEXTVAL_NEXTTOKE.opval =
7468                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7469                     PL_lex_stuff = NULL;
7470                     force_next(THING);
7471
7472                     s = SKIPSPACE2(s,tmpwhite);
7473 #else
7474                     s = skipspace(s);
7475 #endif
7476                 }
7477                 else
7478                     have_proto = FALSE;
7479
7480                 if (*s == ':' && s[1] != ':')
7481                     PL_expect = attrful;
7482                 else if (*s != '{' && key == KEY_sub) {
7483                     if (!have_name)
7484                         Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
7485                     else if (*s != ';' && *s != '}')
7486                         Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
7487                 }
7488
7489 #ifdef PERL_MAD
7490                 start_force(0);
7491                 if (tmpwhite) {
7492                     if (PL_madskills)
7493                         curmad('^', newSVpvs(""));
7494                     CURMAD('_', tmpwhite);
7495                 }
7496                 force_next(0);
7497
7498                 PL_thistoken = subtoken;
7499 #else
7500                 if (have_proto) {
7501                     NEXTVAL_NEXTTOKE.opval =
7502                         (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
7503                     PL_lex_stuff = NULL;
7504                     force_next(THING);
7505                 }
7506 #endif
7507                 if (!have_name) {
7508                     if (PL_curstash)
7509                         sv_setpvs(PL_subname, "__ANON__");
7510                     else
7511                         sv_setpvs(PL_subname, "__ANON__::__ANON__");
7512                     TOKEN(ANONSUB);
7513                 }
7514 #ifndef PERL_MAD
7515                 (void) force_word(PL_oldbufptr + tboffset, WORD,
7516                                   FALSE, TRUE, TRUE);
7517 #endif
7518                 if (key == KEY_my)
7519                     TOKEN(MYSUB);
7520                 TOKEN(SUB);
7521             }
7522
7523         case KEY_system:
7524             LOP(OP_SYSTEM,XREF);
7525
7526         case KEY_symlink:
7527             LOP(OP_SYMLINK,XTERM);
7528
7529         case KEY_syscall:
7530             LOP(OP_SYSCALL,XTERM);
7531
7532         case KEY_sysopen:
7533             LOP(OP_SYSOPEN,XTERM);
7534
7535         case KEY_sysseek:
7536             LOP(OP_SYSSEEK,XTERM);
7537
7538         case KEY_sysread:
7539             LOP(OP_SYSREAD,XTERM);
7540
7541         case KEY_syswrite:
7542             LOP(OP_SYSWRITE,XTERM);
7543
7544         case KEY_tr:
7545             s = scan_trans(s);
7546             TERM(sublex_start());
7547
7548         case KEY_tell:
7549             UNI(OP_TELL);
7550
7551         case KEY_telldir:
7552             UNI(OP_TELLDIR);
7553
7554         case KEY_tie:
7555             LOP(OP_TIE,XTERM);
7556
7557         case KEY_tied:
7558             UNI(OP_TIED);
7559
7560         case KEY_time:
7561             FUN0(OP_TIME);
7562
7563         case KEY_times:
7564             FUN0(OP_TMS);
7565
7566         case KEY_truncate:
7567             LOP(OP_TRUNCATE,XTERM);
7568
7569         case KEY_uc:
7570             UNI(OP_UC);
7571
7572         case KEY_ucfirst:
7573             UNI(OP_UCFIRST);
7574
7575         case KEY_untie:
7576             UNI(OP_UNTIE);
7577
7578         case KEY_until:
7579             pl_yylval.ival = CopLINE(PL_curcop);
7580             OPERATOR(UNTIL);
7581
7582         case KEY_unless:
7583             pl_yylval.ival = CopLINE(PL_curcop);
7584             OPERATOR(UNLESS);
7585
7586         case KEY_unlink:
7587             LOP(OP_UNLINK,XTERM);
7588
7589         case KEY_undef:
7590             UNIDOR(OP_UNDEF);
7591
7592         case KEY_unpack:
7593             LOP(OP_UNPACK,XTERM);
7594
7595         case KEY_utime:
7596             LOP(OP_UTIME,XTERM);
7597
7598         case KEY_umask:
7599             UNIDOR(OP_UMASK);
7600
7601         case KEY_unshift:
7602             LOP(OP_UNSHIFT,XTERM);
7603
7604         case KEY_use:
7605             s = tokenize_use(1, s);
7606             OPERATOR(USE);
7607
7608         case KEY_values:
7609             UNI(OP_VALUES);
7610
7611         case KEY_vec:
7612             LOP(OP_VEC,XTERM);
7613
7614         case KEY_when:
7615             pl_yylval.ival = CopLINE(PL_curcop);
7616             OPERATOR(WHEN);
7617
7618         case KEY_while:
7619             pl_yylval.ival = CopLINE(PL_curcop);
7620             OPERATOR(WHILE);
7621
7622         case KEY_warn:
7623             PL_hints |= HINT_BLOCK_SCOPE;
7624             LOP(OP_WARN,XTERM);
7625
7626         case KEY_wait:
7627             FUN0(OP_WAIT);
7628
7629         case KEY_waitpid:
7630             LOP(OP_WAITPID,XTERM);
7631
7632         case KEY_wantarray:
7633             FUN0(OP_WANTARRAY);
7634
7635         case KEY_write:
7636 #ifdef EBCDIC
7637         {
7638             char ctl_l[2];
7639             ctl_l[0] = toCTRL('L');
7640             ctl_l[1] = '\0';
7641             gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
7642         }
7643 #else
7644             /* Make sure $^L is defined */
7645             gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
7646 #endif
7647             UNI(OP_ENTERWRITE);
7648
7649         case KEY_x:
7650             if (PL_expect == XOPERATOR)
7651                 Mop(OP_REPEAT);
7652             check_uni();
7653             goto just_a_word;
7654
7655         case KEY_xor:
7656             pl_yylval.ival = OP_XOR;
7657             OPERATOR(OROP);
7658
7659         case KEY_y:
7660             s = scan_trans(s);
7661             TERM(sublex_start());
7662         }
7663     }}
7664 }
7665 #ifdef __SC__
7666 #pragma segment Main
7667 #endif
7668
7669 static int
7670 S_pending_ident(pTHX)
7671 {
7672     dVAR;
7673     register char *d;
7674     PADOFFSET tmp = 0;
7675     /* pit holds the identifier we read and pending_ident is reset */
7676     char pit = PL_pending_ident;
7677     const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
7678     /* All routes through this function want to know if there is a colon.  */
7679     const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
7680     PL_pending_ident = 0;
7681
7682     /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
7683     DEBUG_T({ PerlIO_printf(Perl_debug_log,
7684           "### Pending identifier '%s'\n", PL_tokenbuf); });
7685
7686     /* if we're in a my(), we can't allow dynamics here.
7687        $foo'bar has already been turned into $foo::bar, so
7688        just check for colons.
7689
7690        if it's a legal name, the OP is a PADANY.
7691     */
7692     if (PL_in_my) {
7693         if (PL_in_my == KEY_our) {      /* "our" is merely analogous to "my" */
7694             if (has_colon)
7695                 yyerror(Perl_form(aTHX_ "No package name allowed for "
7696                                   "variable %s in \"our\"",
7697                                   PL_tokenbuf));
7698             tmp = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7699         }
7700         else {
7701             if (has_colon)
7702                 yyerror(Perl_form(aTHX_ PL_no_myglob,
7703                             PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
7704
7705             pl_yylval.opval = newOP(OP_PADANY, 0);
7706             pl_yylval.opval->op_targ = allocmy(PL_tokenbuf, tokenbuf_len, 0);
7707             return PRIVATEREF;
7708         }
7709     }
7710
7711     /*
7712        build the ops for accesses to a my() variable.
7713
7714        Deny my($a) or my($b) in a sort block, *if* $a or $b is
7715        then used in a comparison.  This catches most, but not
7716        all cases.  For instance, it catches
7717            sort { my($a); $a <=> $b }
7718        but not
7719            sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
7720        (although why you'd do that is anyone's guess).
7721     */
7722
7723     if (!has_colon) {
7724         if (!PL_in_my)
7725             tmp = pad_findmy(PL_tokenbuf, tokenbuf_len, 0);
7726         if (tmp != NOT_IN_PAD) {
7727             /* might be an "our" variable" */
7728             if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
7729                 /* build ops for a bareword */
7730                 HV *  const stash = PAD_COMPNAME_OURSTASH(tmp);
7731                 HEK * const stashname = HvNAME_HEK(stash);
7732                 SV *  const sym = newSVhek(stashname);
7733                 sv_catpvs(sym, "::");
7734                 sv_catpvn(sym, PL_tokenbuf+1, tokenbuf_len - 1);
7735                 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
7736                 pl_yylval.opval->op_private = OPpCONST_ENTERED;
7737                 gv_fetchsv(sym,
7738                     (PL_in_eval
7739                         ? (GV_ADDMULTI | GV_ADDINEVAL)
7740                         : GV_ADDMULTI
7741                     ),
7742                     ((PL_tokenbuf[0] == '$') ? SVt_PV
7743                      : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7744                      : SVt_PVHV));
7745                 return WORD;
7746             }
7747
7748             /* if it's a sort block and they're naming $a or $b */
7749             if (PL_last_lop_op == OP_SORT &&
7750                 PL_tokenbuf[0] == '$' &&
7751                 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
7752                 && !PL_tokenbuf[2])
7753             {
7754                 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
7755                      d < PL_bufend && *d != '\n';
7756                      d++)
7757                 {
7758                     if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
7759                         Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
7760                               PL_tokenbuf);
7761                     }
7762                 }
7763             }
7764
7765             pl_yylval.opval = newOP(OP_PADANY, 0);
7766             pl_yylval.opval->op_targ = tmp;
7767             return PRIVATEREF;
7768         }
7769     }
7770
7771     /*
7772        Whine if they've said @foo in a doublequoted string,
7773        and @foo isn't a variable we can find in the symbol
7774        table.
7775     */
7776     if (ckWARN(WARN_AMBIGUOUS) &&
7777         pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
7778         GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1, 0,
7779                                          SVt_PVAV);
7780         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
7781                 /* DO NOT warn for @- and @+ */
7782                 && !( PL_tokenbuf[2] == '\0' &&
7783                     ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7784            )
7785         {
7786             /* Downgraded from fatal to warning 20000522 mjd */
7787             Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
7788                         "Possible unintended interpolation of %s in string",
7789                         PL_tokenbuf);
7790         }
7791     }
7792
7793     /* build ops for a bareword */
7794     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
7795                                                       tokenbuf_len - 1));
7796     pl_yylval.opval->op_private = OPpCONST_ENTERED;
7797     gv_fetchpvn_flags(
7798             PL_tokenbuf + 1, tokenbuf_len - 1,
7799             /* If the identifier refers to a stash, don't autovivify it.
7800              * Change 24660 had the side effect of causing symbol table
7801              * hashes to always be defined, even if they were freshly
7802              * created and the only reference in the entire program was
7803              * the single statement with the defined %foo::bar:: test.
7804              * It appears that all code in the wild doing this actually
7805              * wants to know whether sub-packages have been loaded, so
7806              * by avoiding auto-vivifying symbol tables, we ensure that
7807              * defined %foo::bar:: continues to be false, and the existing
7808              * tests still give the expected answers, even though what
7809              * they're actually testing has now changed subtly.
7810              */
7811             (*PL_tokenbuf == '%'
7812              && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
7813              && d[-1] == ':'
7814              ? 0
7815              : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
7816             ((PL_tokenbuf[0] == '$') ? SVt_PV
7817              : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7818              : SVt_PVHV));
7819     return WORD;
7820 }
7821
7822 /*
7823  *  The following code was generated by perl_keyword.pl.
7824  */
7825
7826 I32
7827 Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
7828 {
7829     dVAR;
7830
7831     PERL_ARGS_ASSERT_KEYWORD;
7832
7833   switch (len)
7834   {
7835     case 1: /* 5 tokens of length 1 */
7836       switch (name[0])
7837       {
7838         case 'm':
7839           {                                       /* m          */
7840             return KEY_m;
7841           }
7842
7843         case 'q':
7844           {                                       /* q          */
7845             return KEY_q;
7846           }
7847
7848         case 's':
7849           {                                       /* s          */
7850             return KEY_s;
7851           }
7852
7853         case 'x':
7854           {                                       /* x          */
7855             return -KEY_x;
7856           }
7857
7858         case 'y':
7859           {                                       /* y          */
7860             return KEY_y;
7861           }
7862
7863         default:
7864           goto unknown;
7865       }
7866
7867     case 2: /* 18 tokens of length 2 */
7868       switch (name[0])
7869       {
7870         case 'd':
7871           if (name[1] == 'o')
7872           {                                       /* do         */
7873             return KEY_do;
7874           }
7875
7876           goto unknown;
7877
7878         case 'e':
7879           if (name[1] == 'q')
7880           {                                       /* eq         */
7881             return -KEY_eq;
7882           }
7883
7884           goto unknown;
7885
7886         case 'g':
7887           switch (name[1])
7888           {
7889             case 'e':
7890               {                                   /* ge         */
7891                 return -KEY_ge;
7892               }
7893
7894             case 't':
7895               {                                   /* gt         */
7896                 return -KEY_gt;
7897               }
7898
7899             default:
7900               goto unknown;
7901           }
7902
7903         case 'i':
7904           if (name[1] == 'f')
7905           {                                       /* if         */
7906             return KEY_if;
7907           }
7908
7909           goto unknown;
7910
7911         case 'l':
7912           switch (name[1])
7913           {
7914             case 'c':
7915               {                                   /* lc         */
7916                 return -KEY_lc;
7917               }
7918
7919             case 'e':
7920               {                                   /* le         */
7921                 return -KEY_le;
7922               }
7923
7924             case 't':
7925               {                                   /* lt         */
7926                 return -KEY_lt;
7927               }
7928
7929             default:
7930               goto unknown;
7931           }
7932
7933         case 'm':
7934           if (name[1] == 'y')
7935           {                                       /* my         */
7936             return KEY_my;
7937           }
7938
7939           goto unknown;
7940
7941         case 'n':
7942           switch (name[1])
7943           {
7944             case 'e':
7945               {                                   /* ne         */
7946                 return -KEY_ne;
7947               }
7948
7949             case 'o':
7950               {                                   /* no         */
7951                 return KEY_no;
7952               }
7953
7954             default:
7955               goto unknown;
7956           }
7957
7958         case 'o':
7959           if (name[1] == 'r')
7960           {                                       /* or         */
7961             return -KEY_or;
7962           }
7963
7964           goto unknown;
7965
7966         case 'q':
7967           switch (name[1])
7968           {
7969             case 'q':
7970               {                                   /* qq         */
7971                 return KEY_qq;
7972               }
7973
7974             case 'r':
7975               {                                   /* qr         */
7976                 return KEY_qr;
7977               }
7978
7979             case 'w':
7980               {                                   /* qw         */
7981                 return KEY_qw;
7982               }
7983
7984             case 'x':
7985               {                                   /* qx         */
7986                 return KEY_qx;
7987               }
7988
7989             default:
7990               goto unknown;
7991           }
7992
7993         case 't':
7994           if (name[1] == 'r')
7995           {                                       /* tr         */
7996             return KEY_tr;
7997           }
7998
7999           goto unknown;
8000
8001         case 'u':
8002           if (name[1] == 'c')
8003           {                                       /* uc         */
8004             return -KEY_uc;
8005           }
8006
8007           goto unknown;
8008
8009         default:
8010           goto unknown;
8011       }
8012
8013     case 3: /* 29 tokens of length 3 */
8014       switch (name[0])
8015       {
8016         case 'E':
8017           if (name[1] == 'N' &&
8018               name[2] == 'D')
8019           {                                       /* END        */
8020             return KEY_END;
8021           }
8022
8023           goto unknown;
8024
8025         case 'a':
8026           switch (name[1])
8027           {
8028             case 'b':
8029               if (name[2] == 's')
8030               {                                   /* abs        */
8031                 return -KEY_abs;
8032               }
8033
8034               goto unknown;
8035
8036             case 'n':
8037               if (name[2] == 'd')
8038               {                                   /* and        */
8039                 return -KEY_and;
8040               }
8041
8042               goto unknown;
8043
8044             default:
8045               goto unknown;
8046           }
8047
8048         case 'c':
8049           switch (name[1])
8050           {
8051             case 'h':
8052               if (name[2] == 'r')
8053               {                                   /* chr        */
8054                 return -KEY_chr;
8055               }
8056
8057               goto unknown;
8058
8059             case 'm':
8060               if (name[2] == 'p')
8061               {                                   /* cmp        */
8062                 return -KEY_cmp;
8063               }
8064
8065               goto unknown;
8066
8067             case 'o':
8068               if (name[2] == 's')
8069               {                                   /* cos        */
8070                 return -KEY_cos;
8071               }
8072
8073               goto unknown;
8074
8075             default:
8076               goto unknown;
8077           }
8078
8079         case 'd':
8080           if (name[1] == 'i' &&
8081               name[2] == 'e')
8082           {                                       /* die        */
8083             return -KEY_die;
8084           }
8085
8086           goto unknown;
8087
8088         case 'e':
8089           switch (name[1])
8090           {
8091             case 'o':
8092               if (name[2] == 'f')
8093               {                                   /* eof        */
8094                 return -KEY_eof;
8095               }
8096
8097               goto unknown;
8098
8099             case 'x':
8100               if (name[2] == 'p')
8101               {                                   /* exp        */
8102                 return -KEY_exp;
8103               }
8104
8105               goto unknown;
8106
8107             default:
8108               goto unknown;
8109           }
8110
8111         case 'f':
8112           if (name[1] == 'o' &&
8113               name[2] == 'r')
8114           {                                       /* for        */
8115             return KEY_for;
8116           }
8117
8118           goto unknown;
8119
8120         case 'h':
8121           if (name[1] == 'e' &&
8122               name[2] == 'x')
8123           {                                       /* hex        */
8124             return -KEY_hex;
8125           }
8126
8127           goto unknown;
8128
8129         case 'i':
8130           if (name[1] == 'n' &&
8131               name[2] == 't')
8132           {                                       /* int        */
8133             return -KEY_int;
8134           }
8135
8136           goto unknown;
8137
8138         case 'l':
8139           if (name[1] == 'o' &&
8140               name[2] == 'g')
8141           {                                       /* log        */
8142             return -KEY_log;
8143           }
8144
8145           goto unknown;
8146
8147         case 'm':
8148           if (name[1] == 'a' &&
8149               name[2] == 'p')
8150           {                                       /* map        */
8151             return KEY_map;
8152           }
8153
8154           goto unknown;
8155
8156         case 'n':
8157           if (name[1] == 'o' &&
8158               name[2] == 't')
8159           {                                       /* not        */
8160             return -KEY_not;
8161           }
8162
8163           goto unknown;
8164
8165         case 'o':
8166           switch (name[1])
8167           {
8168             case 'c':
8169               if (name[2] == 't')
8170               {                                   /* oct        */
8171                 return -KEY_oct;
8172               }
8173
8174               goto unknown;
8175
8176             case 'r':
8177               if (name[2] == 'd')
8178               {                                   /* ord        */
8179                 return -KEY_ord;
8180               }
8181
8182               goto unknown;
8183
8184             case 'u':
8185               if (name[2] == 'r')
8186               {                                   /* our        */
8187                 return KEY_our;
8188               }
8189
8190               goto unknown;
8191
8192             default:
8193               goto unknown;
8194           }
8195
8196         case 'p':
8197           if (name[1] == 'o')
8198           {
8199             switch (name[2])
8200             {
8201               case 'p':
8202                 {                                 /* pop        */
8203                   return -KEY_pop;
8204                 }
8205
8206               case 's':
8207                 {                                 /* pos        */
8208                   return KEY_pos;
8209                 }
8210
8211               default:
8212                 goto unknown;
8213             }
8214           }
8215
8216           goto unknown;
8217
8218         case 'r':
8219           if (name[1] == 'e' &&
8220               name[2] == 'f')
8221           {                                       /* ref        */
8222             return -KEY_ref;
8223           }
8224
8225           goto unknown;
8226
8227         case 's':
8228           switch (name[1])
8229           {
8230             case 'a':
8231               if (name[2] == 'y')
8232               {                                   /* say        */
8233                 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
8234               }
8235
8236               goto unknown;
8237
8238             case 'i':
8239               if (name[2] == 'n')
8240               {                                   /* sin        */
8241                 return -KEY_sin;
8242               }
8243
8244               goto unknown;
8245
8246             case 'u':
8247               if (name[2] == 'b')
8248               {                                   /* sub        */
8249                 return KEY_sub;
8250               }
8251
8252               goto unknown;
8253
8254             default:
8255               goto unknown;
8256           }
8257
8258         case 't':
8259           if (name[1] == 'i' &&
8260               name[2] == 'e')
8261           {                                       /* tie        */
8262             return KEY_tie;
8263           }
8264
8265           goto unknown;
8266
8267         case 'u':
8268           if (name[1] == 's' &&
8269               name[2] == 'e')
8270           {                                       /* use        */
8271             return KEY_use;
8272           }
8273
8274           goto unknown;
8275
8276         case 'v':
8277           if (name[1] == 'e' &&
8278               name[2] == 'c')
8279           {                                       /* vec        */
8280             return -KEY_vec;
8281           }
8282
8283           goto unknown;
8284
8285         case 'x':
8286           if (name[1] == 'o' &&
8287               name[2] == 'r')
8288           {                                       /* xor        */
8289             return -KEY_xor;
8290           }
8291
8292           goto unknown;
8293
8294         default:
8295           goto unknown;
8296       }
8297
8298     case 4: /* 41 tokens of length 4 */
8299       switch (name[0])
8300       {
8301         case 'C':
8302           if (name[1] == 'O' &&
8303               name[2] == 'R' &&
8304               name[3] == 'E')
8305           {                                       /* CORE       */
8306             return -KEY_CORE;
8307           }
8308
8309           goto unknown;
8310
8311         case 'I':
8312           if (name[1] == 'N' &&
8313               name[2] == 'I' &&
8314               name[3] == 'T')
8315           {                                       /* INIT       */
8316             return KEY_INIT;
8317           }
8318
8319           goto unknown;
8320
8321         case 'b':
8322           if (name[1] == 'i' &&
8323               name[2] == 'n' &&
8324               name[3] == 'd')
8325           {                                       /* bind       */
8326             return -KEY_bind;
8327           }
8328
8329           goto unknown;
8330
8331         case 'c':
8332           if (name[1] == 'h' &&
8333               name[2] == 'o' &&
8334               name[3] == 'p')
8335           {                                       /* chop       */
8336             return -KEY_chop;
8337           }
8338
8339           goto unknown;
8340
8341         case 'd':
8342           if (name[1] == 'u' &&
8343               name[2] == 'm' &&
8344               name[3] == 'p')
8345           {                                       /* dump       */
8346             return -KEY_dump;
8347           }
8348
8349           goto unknown;
8350
8351         case 'e':
8352           switch (name[1])
8353           {
8354             case 'a':
8355               if (name[2] == 'c' &&
8356                   name[3] == 'h')
8357               {                                   /* each       */
8358                 return -KEY_each;
8359               }
8360
8361               goto unknown;
8362
8363             case 'l':
8364               if (name[2] == 's' &&
8365                   name[3] == 'e')
8366               {                                   /* else       */
8367                 return KEY_else;
8368               }
8369
8370               goto unknown;
8371
8372             case 'v':
8373               if (name[2] == 'a' &&
8374                   name[3] == 'l')
8375               {                                   /* eval       */
8376                 return KEY_eval;
8377               }
8378
8379               goto unknown;
8380
8381             case 'x':
8382               switch (name[2])
8383               {
8384                 case 'e':
8385                   if (name[3] == 'c')
8386                   {                               /* exec       */
8387                     return -KEY_exec;
8388                   }
8389
8390                   goto unknown;
8391
8392                 case 'i':
8393                   if (name[3] == 't')
8394                   {                               /* exit       */
8395                     return -KEY_exit;
8396                   }
8397
8398                   goto unknown;
8399
8400                 default:
8401                   goto unknown;
8402               }
8403
8404             default:
8405               goto unknown;
8406           }
8407
8408         case 'f':
8409           if (name[1] == 'o' &&
8410               name[2] == 'r' &&
8411               name[3] == 'k')
8412           {                                       /* fork       */
8413             return -KEY_fork;
8414           }
8415
8416           goto unknown;
8417
8418         case 'g':
8419           switch (name[1])
8420           {
8421             case 'e':
8422               if (name[2] == 't' &&
8423                   name[3] == 'c')
8424               {                                   /* getc       */
8425                 return -KEY_getc;
8426               }
8427
8428               goto unknown;
8429
8430             case 'l':
8431               if (name[2] == 'o' &&
8432                   name[3] == 'b')
8433               {                                   /* glob       */
8434                 return KEY_glob;
8435               }
8436
8437               goto unknown;
8438
8439             case 'o':
8440               if (name[2] == 't' &&
8441                   name[3] == 'o')
8442               {                                   /* goto       */
8443                 return KEY_goto;
8444               }
8445
8446               goto unknown;
8447
8448             case 'r':
8449               if (name[2] == 'e' &&
8450                   name[3] == 'p')
8451               {                                   /* grep       */
8452                 return KEY_grep;
8453               }
8454
8455               goto unknown;
8456
8457             default:
8458               goto unknown;
8459           }
8460
8461         case 'j':
8462           if (name[1] == 'o' &&
8463               name[2] == 'i' &&
8464               name[3] == 'n')
8465           {                                       /* join       */
8466             return -KEY_join;
8467           }
8468
8469           goto unknown;
8470
8471         case 'k':
8472           switch (name[1])
8473           {
8474             case 'e':
8475               if (name[2] == 'y' &&
8476                   name[3] == 's')
8477               {                                   /* keys       */
8478                 return -KEY_keys;
8479               }
8480
8481               goto unknown;
8482
8483             case 'i':
8484               if (name[2] == 'l' &&
8485                   name[3] == 'l')
8486               {                                   /* kill       */
8487                 return -KEY_kill;
8488               }
8489
8490               goto unknown;
8491
8492             default:
8493               goto unknown;
8494           }
8495
8496         case 'l':
8497           switch (name[1])
8498           {
8499             case 'a':
8500               if (name[2] == 's' &&
8501                   name[3] == 't')
8502               {                                   /* last       */
8503                 return KEY_last;
8504               }
8505
8506               goto unknown;
8507
8508             case 'i':
8509               if (name[2] == 'n' &&
8510                   name[3] == 'k')
8511               {                                   /* link       */
8512                 return -KEY_link;
8513               }
8514
8515               goto unknown;
8516
8517             case 'o':
8518               if (name[2] == 'c' &&
8519                   name[3] == 'k')
8520               {                                   /* lock       */
8521                 return -KEY_lock;
8522               }
8523
8524               goto unknown;
8525
8526             default:
8527               goto unknown;
8528           }
8529
8530         case 'n':
8531           if (name[1] == 'e' &&
8532               name[2] == 'x' &&
8533               name[3] == 't')
8534           {                                       /* next       */
8535             return KEY_next;
8536           }
8537
8538           goto unknown;
8539
8540         case 'o':
8541           if (name[1] == 'p' &&
8542               name[2] == 'e' &&
8543               name[3] == 'n')
8544           {                                       /* open       */
8545             return -KEY_open;
8546           }
8547
8548           goto unknown;
8549
8550         case 'p':
8551           switch (name[1])
8552           {
8553             case 'a':
8554               if (name[2] == 'c' &&
8555                   name[3] == 'k')
8556               {                                   /* pack       */
8557                 return -KEY_pack;
8558               }
8559
8560               goto unknown;
8561
8562             case 'i':
8563               if (name[2] == 'p' &&
8564                   name[3] == 'e')
8565               {                                   /* pipe       */
8566                 return -KEY_pipe;
8567               }
8568
8569               goto unknown;
8570
8571             case 'u':
8572               if (name[2] == 's' &&
8573                   name[3] == 'h')
8574               {                                   /* push       */
8575                 return -KEY_push;
8576               }
8577
8578               goto unknown;
8579
8580             default:
8581               goto unknown;
8582           }
8583
8584         case 'r':
8585           switch (name[1])
8586           {
8587             case 'a':
8588               if (name[2] == 'n' &&
8589                   name[3] == 'd')
8590               {                                   /* rand       */
8591                 return -KEY_rand;
8592               }
8593
8594               goto unknown;
8595
8596             case 'e':
8597               switch (name[2])
8598               {
8599                 case 'a':
8600                   if (name[3] == 'd')
8601                   {                               /* read       */
8602                     return -KEY_read;
8603                   }
8604
8605                   goto unknown;
8606
8607                 case 'c':
8608                   if (name[3] == 'v')
8609                   {                               /* recv       */
8610                     return -KEY_recv;
8611                   }
8612
8613                   goto unknown;
8614
8615                 case 'd':
8616                   if (name[3] == 'o')
8617                   {                               /* redo       */
8618                     return KEY_redo;
8619                   }
8620
8621                   goto unknown;
8622
8623                 default:
8624                   goto unknown;
8625               }
8626
8627             default:
8628               goto unknown;
8629           }
8630
8631         case 's':
8632           switch (name[1])
8633           {
8634             case 'e':
8635               switch (name[2])
8636               {
8637                 case 'e':
8638                   if (name[3] == 'k')
8639                   {                               /* seek       */
8640                     return -KEY_seek;
8641                   }
8642
8643                   goto unknown;
8644
8645                 case 'n':
8646                   if (name[3] == 'd')
8647                   {                               /* send       */
8648                     return -KEY_send;
8649                   }
8650
8651                   goto unknown;
8652
8653                 default:
8654                   goto unknown;
8655               }
8656
8657             case 'o':
8658               if (name[2] == 'r' &&
8659                   name[3] == 't')
8660               {                                   /* sort       */
8661                 return KEY_sort;
8662               }
8663
8664               goto unknown;
8665
8666             case 'q':
8667               if (name[2] == 'r' &&
8668                   name[3] == 't')
8669               {                                   /* sqrt       */
8670                 return -KEY_sqrt;
8671               }
8672
8673               goto unknown;
8674
8675             case 't':
8676               if (name[2] == 'a' &&
8677                   name[3] == 't')
8678               {                                   /* stat       */
8679                 return -KEY_stat;
8680               }
8681
8682               goto unknown;
8683
8684             default:
8685               goto unknown;
8686           }
8687
8688         case 't':
8689           switch (name[1])
8690           {
8691             case 'e':
8692               if (name[2] == 'l' &&
8693                   name[3] == 'l')
8694               {                                   /* tell       */
8695                 return -KEY_tell;
8696               }
8697
8698               goto unknown;
8699
8700             case 'i':
8701               switch (name[2])
8702               {
8703                 case 'e':
8704                   if (name[3] == 'd')
8705                   {                               /* tied       */
8706                     return KEY_tied;
8707                   }
8708
8709                   goto unknown;
8710
8711                 case 'm':
8712                   if (name[3] == 'e')
8713                   {                               /* time       */
8714                     return -KEY_time;
8715                   }
8716
8717                   goto unknown;
8718
8719                 default:
8720                   goto unknown;
8721               }
8722
8723             default:
8724               goto unknown;
8725           }
8726
8727         case 'w':
8728           switch (name[1])
8729           {
8730             case 'a':
8731               switch (name[2])
8732               {
8733                 case 'i':
8734                   if (name[3] == 't')
8735                   {                               /* wait       */
8736                     return -KEY_wait;
8737                   }
8738
8739                   goto unknown;
8740
8741                 case 'r':
8742                   if (name[3] == 'n')
8743                   {                               /* warn       */
8744                     return -KEY_warn;
8745                   }
8746
8747                   goto unknown;
8748
8749                 default:
8750                   goto unknown;
8751               }
8752
8753             case 'h':
8754               if (name[2] == 'e' &&
8755                   name[3] == 'n')
8756               {                                   /* when       */
8757                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
8758               }
8759
8760               goto unknown;
8761
8762             default:
8763               goto unknown;
8764           }
8765
8766         default:
8767           goto unknown;
8768       }
8769
8770     case 5: /* 39 tokens of length 5 */
8771       switch (name[0])
8772       {
8773         case 'B':
8774           if (name[1] == 'E' &&
8775               name[2] == 'G' &&
8776               name[3] == 'I' &&
8777               name[4] == 'N')
8778           {                                       /* BEGIN      */
8779             return KEY_BEGIN;
8780           }
8781
8782           goto unknown;
8783
8784         case 'C':
8785           if (name[1] == 'H' &&
8786               name[2] == 'E' &&
8787               name[3] == 'C' &&
8788               name[4] == 'K')
8789           {                                       /* CHECK      */
8790             return KEY_CHECK;
8791           }
8792
8793           goto unknown;
8794
8795         case 'a':
8796           switch (name[1])
8797           {
8798             case 'l':
8799               if (name[2] == 'a' &&
8800                   name[3] == 'r' &&
8801                   name[4] == 'm')
8802               {                                   /* alarm      */
8803                 return -KEY_alarm;
8804               }
8805
8806               goto unknown;
8807
8808             case 't':
8809               if (name[2] == 'a' &&
8810                   name[3] == 'n' &&
8811                   name[4] == '2')
8812               {                                   /* atan2      */
8813                 return -KEY_atan2;
8814               }
8815
8816               goto unknown;
8817
8818             default:
8819               goto unknown;
8820           }
8821
8822         case 'b':
8823           switch (name[1])
8824           {
8825             case 'l':
8826               if (name[2] == 'e' &&
8827                   name[3] == 's' &&
8828                   name[4] == 's')
8829               {                                   /* bless      */
8830                 return -KEY_bless;
8831               }
8832
8833               goto unknown;
8834
8835             case 'r':
8836               if (name[2] == 'e' &&
8837                   name[3] == 'a' &&
8838                   name[4] == 'k')
8839               {                                   /* break      */
8840                 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
8841               }
8842
8843               goto unknown;
8844
8845             default:
8846               goto unknown;
8847           }
8848
8849         case 'c':
8850           switch (name[1])
8851           {
8852             case 'h':
8853               switch (name[2])
8854               {
8855                 case 'd':
8856                   if (name[3] == 'i' &&
8857                       name[4] == 'r')
8858                   {                               /* chdir      */
8859                     return -KEY_chdir;
8860                   }
8861
8862                   goto unknown;
8863
8864                 case 'm':
8865                   if (name[3] == 'o' &&
8866                       name[4] == 'd')
8867                   {                               /* chmod      */
8868                     return -KEY_chmod;
8869                   }
8870
8871                   goto unknown;
8872
8873                 case 'o':
8874                   switch (name[3])
8875                   {
8876                     case 'm':
8877                       if (name[4] == 'p')
8878                       {                           /* chomp      */
8879                         return -KEY_chomp;
8880                       }
8881
8882                       goto unknown;
8883
8884                     case 'w':
8885                       if (name[4] == 'n')
8886                       {                           /* chown      */
8887                         return -KEY_chown;
8888                       }
8889
8890                       goto unknown;
8891
8892                     default:
8893                       goto unknown;
8894                   }
8895
8896                 default:
8897                   goto unknown;
8898               }
8899
8900             case 'l':
8901               if (name[2] == 'o' &&
8902                   name[3] == 's' &&
8903                   name[4] == 'e')
8904               {                                   /* close      */
8905                 return -KEY_close;
8906               }
8907
8908               goto unknown;
8909
8910             case 'r':
8911               if (name[2] == 'y' &&
8912                   name[3] == 'p' &&
8913                   name[4] == 't')
8914               {                                   /* crypt      */
8915                 return -KEY_crypt;
8916               }
8917
8918               goto unknown;
8919
8920             default:
8921               goto unknown;
8922           }
8923
8924         case 'e':
8925           if (name[1] == 'l' &&
8926               name[2] == 's' &&
8927               name[3] == 'i' &&
8928               name[4] == 'f')
8929           {                                       /* elsif      */
8930             return KEY_elsif;
8931           }
8932
8933           goto unknown;
8934
8935         case 'f':
8936           switch (name[1])
8937           {
8938             case 'c':
8939               if (name[2] == 'n' &&
8940                   name[3] == 't' &&
8941                   name[4] == 'l')
8942               {                                   /* fcntl      */
8943                 return -KEY_fcntl;
8944               }
8945
8946               goto unknown;
8947
8948             case 'l':
8949               if (name[2] == 'o' &&
8950                   name[3] == 'c' &&
8951                   name[4] == 'k')
8952               {                                   /* flock      */
8953                 return -KEY_flock;
8954               }
8955
8956               goto unknown;
8957
8958             default:
8959               goto unknown;
8960           }
8961
8962         case 'g':
8963           if (name[1] == 'i' &&
8964               name[2] == 'v' &&
8965               name[3] == 'e' &&
8966               name[4] == 'n')
8967           {                                       /* given      */
8968             return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
8969           }
8970
8971           goto unknown;
8972
8973         case 'i':
8974           switch (name[1])
8975           {
8976             case 'n':
8977               if (name[2] == 'd' &&
8978                   name[3] == 'e' &&
8979                   name[4] == 'x')
8980               {                                   /* index      */
8981                 return -KEY_index;
8982               }
8983
8984               goto unknown;
8985
8986             case 'o':
8987               if (name[2] == 'c' &&
8988                   name[3] == 't' &&
8989                   name[4] == 'l')
8990               {                                   /* ioctl      */
8991                 return -KEY_ioctl;
8992               }
8993
8994               goto unknown;
8995
8996             default:
8997               goto unknown;
8998           }
8999
9000         case 'l':
9001           switch (name[1])
9002           {
9003             case 'o':
9004               if (name[2] == 'c' &&
9005                   name[3] == 'a' &&
9006                   name[4] == 'l')
9007               {                                   /* local      */
9008                 return KEY_local;
9009               }
9010
9011               goto unknown;
9012
9013             case 's':
9014               if (name[2] == 't' &&
9015                   name[3] == 'a' &&
9016                   name[4] == 't')
9017               {                                   /* lstat      */
9018                 return -KEY_lstat;
9019               }
9020
9021               goto unknown;
9022
9023             default:
9024               goto unknown;
9025           }
9026
9027         case 'm':
9028           if (name[1] == 'k' &&
9029               name[2] == 'd' &&
9030               name[3] == 'i' &&
9031               name[4] == 'r')
9032           {                                       /* mkdir      */
9033             return -KEY_mkdir;
9034           }
9035
9036           goto unknown;
9037
9038         case 'p':
9039           if (name[1] == 'r' &&
9040               name[2] == 'i' &&
9041               name[3] == 'n' &&
9042               name[4] == 't')
9043           {                                       /* print      */
9044             return KEY_print;
9045           }
9046
9047           goto unknown;
9048
9049         case 'r':
9050           switch (name[1])
9051           {
9052             case 'e':
9053               if (name[2] == 's' &&
9054                   name[3] == 'e' &&
9055                   name[4] == 't')
9056               {                                   /* reset      */
9057                 return -KEY_reset;
9058               }
9059
9060               goto unknown;
9061
9062             case 'm':
9063               if (name[2] == 'd' &&
9064                   name[3] == 'i' &&
9065                   name[4] == 'r')
9066               {                                   /* rmdir      */
9067                 return -KEY_rmdir;
9068               }
9069
9070               goto unknown;
9071
9072             default:
9073               goto unknown;
9074           }
9075
9076         case 's':
9077           switch (name[1])
9078           {
9079             case 'e':
9080               if (name[2] == 'm' &&
9081                   name[3] == 'o' &&
9082                   name[4] == 'p')
9083               {                                   /* semop      */
9084                 return -KEY_semop;
9085               }
9086
9087               goto unknown;
9088
9089             case 'h':
9090               if (name[2] == 'i' &&
9091                   name[3] == 'f' &&
9092                   name[4] == 't')
9093               {                                   /* shift      */
9094                 return -KEY_shift;
9095               }
9096
9097               goto unknown;
9098
9099             case 'l':
9100               if (name[2] == 'e' &&
9101                   name[3] == 'e' &&
9102                   name[4] == 'p')
9103               {                                   /* sleep      */
9104                 return -KEY_sleep;
9105               }
9106
9107               goto unknown;
9108
9109             case 'p':
9110               if (name[2] == 'l' &&
9111                   name[3] == 'i' &&
9112                   name[4] == 't')
9113               {                                   /* split      */
9114                 return KEY_split;
9115               }
9116
9117               goto unknown;
9118
9119             case 'r':
9120               if (name[2] == 'a' &&
9121                   name[3] == 'n' &&
9122                   name[4] == 'd')
9123               {                                   /* srand      */
9124                 return -KEY_srand;
9125               }
9126
9127               goto unknown;
9128
9129             case 't':
9130               switch (name[2])
9131               {
9132                 case 'a':
9133                   if (name[3] == 't' &&
9134                       name[4] == 'e')
9135                   {                               /* state      */
9136                     return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
9137                   }
9138
9139                   goto unknown;
9140
9141                 case 'u':
9142                   if (name[3] == 'd' &&
9143                       name[4] == 'y')
9144                   {                               /* study      */
9145                     return KEY_study;
9146                   }
9147
9148                   goto unknown;
9149
9150                 default:
9151                   goto unknown;
9152               }
9153
9154             default:
9155               goto unknown;
9156           }
9157
9158         case 't':
9159           if (name[1] == 'i' &&
9160               name[2] == 'm' &&
9161               name[3] == 'e' &&
9162               name[4] == 's')
9163           {                                       /* times      */
9164             return -KEY_times;
9165           }
9166
9167           goto unknown;
9168
9169         case 'u':
9170           switch (name[1])
9171           {
9172             case 'm':
9173               if (name[2] == 'a' &&
9174                   name[3] == 's' &&
9175                   name[4] == 'k')
9176               {                                   /* umask      */
9177                 return -KEY_umask;
9178               }
9179
9180               goto unknown;
9181
9182             case 'n':
9183               switch (name[2])
9184               {
9185                 case 'd':
9186                   if (name[3] == 'e' &&
9187                       name[4] == 'f')
9188                   {                               /* undef      */
9189                     return KEY_undef;
9190                   }
9191
9192                   goto unknown;
9193
9194                 case 't':
9195                   if (name[3] == 'i')
9196                   {
9197                     switch (name[4])
9198                     {
9199                       case 'e':
9200                         {                         /* untie      */
9201                           return KEY_untie;
9202                         }
9203
9204                       case 'l':
9205                         {                         /* until      */
9206                           return KEY_until;
9207                         }
9208
9209                       default:
9210                         goto unknown;
9211                     }
9212                   }
9213
9214                   goto unknown;
9215
9216                 default:
9217                   goto unknown;
9218               }
9219
9220             case 't':
9221               if (name[2] == 'i' &&
9222                   name[3] == 'm' &&
9223                   name[4] == 'e')
9224               {                                   /* utime      */
9225                 return -KEY_utime;
9226               }
9227
9228               goto unknown;
9229
9230             default:
9231               goto unknown;
9232           }
9233
9234         case 'w':
9235           switch (name[1])
9236           {
9237             case 'h':
9238               if (name[2] == 'i' &&
9239                   name[3] == 'l' &&
9240                   name[4] == 'e')
9241               {                                   /* while      */
9242                 return KEY_while;
9243               }
9244
9245               goto unknown;
9246
9247             case 'r':
9248               if (name[2] == 'i' &&
9249                   name[3] == 't' &&
9250                   name[4] == 'e')
9251               {                                   /* write      */
9252                 return -KEY_write;
9253               }
9254
9255               goto unknown;
9256
9257             default:
9258               goto unknown;
9259           }
9260
9261         default:
9262           goto unknown;
9263       }
9264
9265     case 6: /* 33 tokens of length 6 */
9266       switch (name[0])
9267       {
9268         case 'a':
9269           if (name[1] == 'c' &&
9270               name[2] == 'c' &&
9271               name[3] == 'e' &&
9272               name[4] == 'p' &&
9273               name[5] == 't')
9274           {                                       /* accept     */
9275             return -KEY_accept;
9276           }
9277
9278           goto unknown;
9279
9280         case 'c':
9281           switch (name[1])
9282           {
9283             case 'a':
9284               if (name[2] == 'l' &&
9285                   name[3] == 'l' &&
9286                   name[4] == 'e' &&
9287                   name[5] == 'r')
9288               {                                   /* caller     */
9289                 return -KEY_caller;
9290               }
9291
9292               goto unknown;
9293
9294             case 'h':
9295               if (name[2] == 'r' &&
9296                   name[3] == 'o' &&
9297                   name[4] == 'o' &&
9298                   name[5] == 't')
9299               {                                   /* chroot     */
9300                 return -KEY_chroot;
9301               }
9302
9303               goto unknown;
9304
9305             default:
9306               goto unknown;
9307           }
9308
9309         case 'd':
9310           if (name[1] == 'e' &&
9311               name[2] == 'l' &&
9312               name[3] == 'e' &&
9313               name[4] == 't' &&
9314               name[5] == 'e')
9315           {                                       /* delete     */
9316             return KEY_delete;
9317           }
9318
9319           goto unknown;
9320
9321         case 'e':
9322           switch (name[1])
9323           {
9324             case 'l':
9325               if (name[2] == 's' &&
9326                   name[3] == 'e' &&
9327                   name[4] == 'i' &&
9328                   name[5] == 'f')
9329               {                                   /* elseif     */
9330                   Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
9331               }
9332
9333               goto unknown;
9334
9335             case 'x':
9336               if (name[2] == 'i' &&
9337                   name[3] == 's' &&
9338                   name[4] == 't' &&
9339                   name[5] == 's')
9340               {                                   /* exists     */
9341                 return KEY_exists;
9342               }
9343
9344               goto unknown;
9345
9346             default:
9347               goto unknown;
9348           }
9349
9350         case 'f':
9351           switch (name[1])
9352           {
9353             case 'i':
9354               if (name[2] == 'l' &&
9355                   name[3] == 'e' &&
9356                   name[4] == 'n' &&
9357                   name[5] == 'o')
9358               {                                   /* fileno     */
9359                 return -KEY_fileno;
9360               }
9361
9362               goto unknown;
9363
9364             case 'o':
9365               if (name[2] == 'r' &&
9366                   name[3] == 'm' &&
9367                   name[4] == 'a' &&
9368                   name[5] == 't')
9369               {                                   /* format     */
9370                 return KEY_format;
9371               }
9372
9373               goto unknown;
9374
9375             default:
9376               goto unknown;
9377           }
9378
9379         case 'g':
9380           if (name[1] == 'm' &&
9381               name[2] == 't' &&
9382               name[3] == 'i' &&
9383               name[4] == 'm' &&
9384               name[5] == 'e')
9385           {                                       /* gmtime     */
9386             return -KEY_gmtime;
9387           }
9388
9389           goto unknown;
9390
9391         case 'l':
9392           switch (name[1])
9393           {
9394             case 'e':
9395               if (name[2] == 'n' &&
9396                   name[3] == 'g' &&
9397                   name[4] == 't' &&
9398                   name[5] == 'h')
9399               {                                   /* length     */
9400                 return -KEY_length;
9401               }
9402
9403               goto unknown;
9404
9405             case 'i':
9406               if (name[2] == 's' &&
9407                   name[3] == 't' &&
9408                   name[4] == 'e' &&
9409                   name[5] == 'n')
9410               {                                   /* listen     */
9411                 return -KEY_listen;
9412               }
9413
9414               goto unknown;
9415
9416             default:
9417               goto unknown;
9418           }
9419
9420         case 'm':
9421           if (name[1] == 's' &&
9422               name[2] == 'g')
9423           {
9424             switch (name[3])
9425             {
9426               case 'c':
9427                 if (name[4] == 't' &&
9428                     name[5] == 'l')
9429                 {                                 /* msgctl     */
9430                   return -KEY_msgctl;
9431                 }
9432
9433                 goto unknown;
9434
9435               case 'g':
9436                 if (name[4] == 'e' &&
9437                     name[5] == 't')
9438                 {                                 /* msgget     */
9439                   return -KEY_msgget;
9440                 }
9441
9442                 goto unknown;
9443
9444               case 'r':
9445                 if (name[4] == 'c' &&
9446                     name[5] == 'v')
9447                 {                                 /* msgrcv     */
9448                   return -KEY_msgrcv;
9449                 }
9450
9451                 goto unknown;
9452
9453               case 's':
9454                 if (name[4] == 'n' &&
9455                     name[5] == 'd')
9456                 {                                 /* msgsnd     */
9457                   return -KEY_msgsnd;
9458                 }
9459
9460                 goto unknown;
9461
9462               default:
9463                 goto unknown;
9464             }
9465           }
9466
9467           goto unknown;
9468
9469         case 'p':
9470           if (name[1] == 'r' &&
9471               name[2] == 'i' &&
9472               name[3] == 'n' &&
9473               name[4] == 't' &&
9474               name[5] == 'f')
9475           {                                       /* printf     */
9476             return KEY_printf;
9477           }
9478
9479           goto unknown;
9480
9481         case 'r':
9482           switch (name[1])
9483           {
9484             case 'e':
9485               switch (name[2])
9486               {
9487                 case 'n':
9488                   if (name[3] == 'a' &&
9489                       name[4] == 'm' &&
9490                       name[5] == 'e')
9491                   {                               /* rename     */
9492                     return -KEY_rename;
9493                   }
9494
9495                   goto unknown;
9496
9497                 case 't':
9498                   if (name[3] == 'u' &&
9499                       name[4] == 'r' &&
9500                       name[5] == 'n')
9501                   {                               /* return     */
9502                     return KEY_return;
9503                   }
9504
9505                   goto unknown;
9506
9507                 default:
9508                   goto unknown;
9509               }
9510
9511             case 'i':
9512               if (name[2] == 'n' &&
9513                   name[3] == 'd' &&
9514                   name[4] == 'e' &&
9515                   name[5] == 'x')
9516               {                                   /* rindex     */
9517                 return -KEY_rindex;
9518               }
9519
9520               goto unknown;
9521
9522             default:
9523               goto unknown;
9524           }
9525
9526         case 's':
9527           switch (name[1])
9528           {
9529             case 'c':
9530               if (name[2] == 'a' &&
9531                   name[3] == 'l' &&
9532                   name[4] == 'a' &&
9533                   name[5] == 'r')
9534               {                                   /* scalar     */
9535                 return KEY_scalar;
9536               }
9537
9538               goto unknown;
9539
9540             case 'e':
9541               switch (name[2])
9542               {
9543                 case 'l':
9544                   if (name[3] == 'e' &&
9545                       name[4] == 'c' &&
9546                       name[5] == 't')
9547                   {                               /* select     */
9548                     return -KEY_select;
9549                   }
9550
9551                   goto unknown;
9552
9553                 case 'm':
9554                   switch (name[3])
9555                   {
9556                     case 'c':
9557                       if (name[4] == 't' &&
9558                           name[5] == 'l')
9559                       {                           /* semctl     */
9560                         return -KEY_semctl;
9561                       }
9562
9563                       goto unknown;
9564
9565                     case 'g':
9566                       if (name[4] == 'e' &&
9567                           name[5] == 't')
9568                       {                           /* semget     */
9569                         return -KEY_semget;
9570                       }
9571
9572                       goto unknown;
9573
9574                     default:
9575                       goto unknown;
9576                   }
9577
9578                 default:
9579                   goto unknown;
9580               }
9581
9582             case 'h':
9583               if (name[2] == 'm')
9584               {
9585                 switch (name[3])
9586                 {
9587                   case 'c':
9588                     if (name[4] == 't' &&
9589                         name[5] == 'l')
9590                     {                             /* shmctl     */
9591                       return -KEY_shmctl;
9592                     }
9593
9594                     goto unknown;
9595
9596                   case 'g':
9597                     if (name[4] == 'e' &&
9598                         name[5] == 't')
9599                     {                             /* shmget     */
9600                       return -KEY_shmget;
9601                     }
9602
9603                     goto unknown;
9604
9605                   default:
9606                     goto unknown;
9607                 }
9608               }
9609
9610               goto unknown;
9611
9612             case 'o':
9613               if (name[2] == 'c' &&
9614                   name[3] == 'k' &&
9615                   name[4] == 'e' &&
9616                   name[5] == 't')
9617               {                                   /* socket     */
9618                 return -KEY_socket;
9619               }
9620
9621               goto unknown;
9622
9623             case 'p':
9624               if (name[2] == 'l' &&
9625                   name[3] == 'i' &&
9626                   name[4] == 'c' &&
9627                   name[5] == 'e')
9628               {                                   /* splice     */
9629                 return -KEY_splice;
9630               }
9631
9632               goto unknown;
9633
9634             case 'u':
9635               if (name[2] == 'b' &&
9636                   name[3] == 's' &&
9637                   name[4] == 't' &&
9638                   name[5] == 'r')
9639               {                                   /* substr     */
9640                 return -KEY_substr;
9641               }
9642
9643               goto unknown;
9644
9645             case 'y':
9646               if (name[2] == 's' &&
9647                   name[3] == 't' &&
9648                   name[4] == 'e' &&
9649                   name[5] == 'm')
9650               {                                   /* system     */
9651                 return -KEY_system;
9652               }
9653
9654               goto unknown;
9655
9656             default:
9657               goto unknown;
9658           }
9659
9660         case 'u':
9661           if (name[1] == 'n')
9662           {
9663             switch (name[2])
9664             {
9665               case 'l':
9666                 switch (name[3])
9667                 {
9668                   case 'e':
9669                     if (name[4] == 's' &&
9670                         name[5] == 's')
9671                     {                             /* unless     */
9672                       return KEY_unless;
9673                     }
9674
9675                     goto unknown;
9676
9677                   case 'i':
9678                     if (name[4] == 'n' &&
9679                         name[5] == 'k')
9680                     {                             /* unlink     */
9681                       return -KEY_unlink;
9682                     }
9683
9684                     goto unknown;
9685
9686                   default:
9687                     goto unknown;
9688                 }
9689
9690               case 'p':
9691                 if (name[3] == 'a' &&
9692                     name[4] == 'c' &&
9693                     name[5] == 'k')
9694                 {                                 /* unpack     */
9695                   return -KEY_unpack;
9696                 }
9697
9698                 goto unknown;
9699
9700               default:
9701                 goto unknown;
9702             }
9703           }
9704
9705           goto unknown;
9706
9707         case 'v':
9708           if (name[1] == 'a' &&
9709               name[2] == 'l' &&
9710               name[3] == 'u' &&
9711               name[4] == 'e' &&
9712               name[5] == 's')
9713           {                                       /* values     */
9714             return -KEY_values;
9715           }
9716
9717           goto unknown;
9718
9719         default:
9720           goto unknown;
9721       }
9722
9723     case 7: /* 29 tokens of length 7 */
9724       switch (name[0])
9725       {
9726         case 'D':
9727           if (name[1] == 'E' &&
9728               name[2] == 'S' &&
9729               name[3] == 'T' &&
9730               name[4] == 'R' &&
9731               name[5] == 'O' &&
9732               name[6] == 'Y')
9733           {                                       /* DESTROY    */
9734             return KEY_DESTROY;
9735           }
9736
9737           goto unknown;
9738
9739         case '_':
9740           if (name[1] == '_' &&
9741               name[2] == 'E' &&
9742               name[3] == 'N' &&
9743               name[4] == 'D' &&
9744               name[5] == '_' &&
9745               name[6] == '_')
9746           {                                       /* __END__    */
9747             return KEY___END__;
9748           }
9749
9750           goto unknown;
9751
9752         case 'b':
9753           if (name[1] == 'i' &&
9754               name[2] == 'n' &&
9755               name[3] == 'm' &&
9756               name[4] == 'o' &&
9757               name[5] == 'd' &&
9758               name[6] == 'e')
9759           {                                       /* binmode    */
9760             return -KEY_binmode;
9761           }
9762
9763           goto unknown;
9764
9765         case 'c':
9766           if (name[1] == 'o' &&
9767               name[2] == 'n' &&
9768               name[3] == 'n' &&
9769               name[4] == 'e' &&
9770               name[5] == 'c' &&
9771               name[6] == 't')
9772           {                                       /* connect    */
9773             return -KEY_connect;
9774           }
9775
9776           goto unknown;
9777
9778         case 'd':
9779           switch (name[1])
9780           {
9781             case 'b':
9782               if (name[2] == 'm' &&
9783                   name[3] == 'o' &&
9784                   name[4] == 'p' &&
9785                   name[5] == 'e' &&
9786                   name[6] == 'n')
9787               {                                   /* dbmopen    */
9788                 return -KEY_dbmopen;
9789               }
9790
9791               goto unknown;
9792
9793             case 'e':
9794               if (name[2] == 'f')
9795               {
9796                 switch (name[3])
9797                 {
9798                   case 'a':
9799                     if (name[4] == 'u' &&
9800                         name[5] == 'l' &&
9801                         name[6] == 't')
9802                     {                             /* default    */
9803                       return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
9804                     }
9805
9806                     goto unknown;
9807
9808                   case 'i':
9809                     if (name[4] == 'n' &&
9810                         name[5] == 'e' &&
9811                         name[6] == 'd')
9812                     {                             /* defined    */
9813                       return KEY_defined;
9814                     }
9815
9816                     goto unknown;
9817
9818                   default:
9819                     goto unknown;
9820                 }
9821               }
9822
9823               goto unknown;
9824
9825             default:
9826               goto unknown;
9827           }
9828
9829         case 'f':
9830           if (name[1] == 'o' &&
9831               name[2] == 'r' &&
9832               name[3] == 'e' &&
9833               name[4] == 'a' &&
9834               name[5] == 'c' &&
9835               name[6] == 'h')
9836           {                                       /* foreach    */
9837             return KEY_foreach;
9838           }
9839
9840           goto unknown;
9841
9842         case 'g':
9843           if (name[1] == 'e' &&
9844               name[2] == 't' &&
9845               name[3] == 'p')
9846           {
9847             switch (name[4])
9848             {
9849               case 'g':
9850                 if (name[5] == 'r' &&
9851                     name[6] == 'p')
9852                 {                                 /* getpgrp    */
9853                   return -KEY_getpgrp;
9854                 }
9855
9856                 goto unknown;
9857
9858               case 'p':
9859                 if (name[5] == 'i' &&
9860                     name[6] == 'd')
9861                 {                                 /* getppid    */
9862                   return -KEY_getppid;
9863                 }
9864
9865                 goto unknown;
9866
9867               default:
9868                 goto unknown;
9869             }
9870           }
9871
9872           goto unknown;
9873
9874         case 'l':
9875           if (name[1] == 'c' &&
9876               name[2] == 'f' &&
9877               name[3] == 'i' &&
9878               name[4] == 'r' &&
9879               name[5] == 's' &&
9880               name[6] == 't')
9881           {                                       /* lcfirst    */
9882             return -KEY_lcfirst;
9883           }
9884
9885           goto unknown;
9886
9887         case 'o':
9888           if (name[1] == 'p' &&
9889               name[2] == 'e' &&
9890               name[3] == 'n' &&
9891               name[4] == 'd' &&
9892               name[5] == 'i' &&
9893               name[6] == 'r')
9894           {                                       /* opendir    */
9895             return -KEY_opendir;
9896           }
9897
9898           goto unknown;
9899
9900         case 'p':
9901           if (name[1] == 'a' &&
9902               name[2] == 'c' &&
9903               name[3] == 'k' &&
9904               name[4] == 'a' &&
9905               name[5] == 'g' &&
9906               name[6] == 'e')
9907           {                                       /* package    */
9908             return KEY_package;
9909           }
9910
9911           goto unknown;
9912
9913         case 'r':
9914           if (name[1] == 'e')
9915           {
9916             switch (name[2])
9917             {
9918               case 'a':
9919                 if (name[3] == 'd' &&
9920                     name[4] == 'd' &&
9921                     name[5] == 'i' &&
9922                     name[6] == 'r')
9923                 {                                 /* readdir    */
9924                   return -KEY_readdir;
9925                 }
9926
9927                 goto unknown;
9928
9929               case 'q':
9930                 if (name[3] == 'u' &&
9931                     name[4] == 'i' &&
9932                     name[5] == 'r' &&
9933                     name[6] == 'e')
9934                 {                                 /* require    */
9935                   return KEY_require;
9936                 }
9937
9938                 goto unknown;
9939
9940               case 'v':
9941                 if (name[3] == 'e' &&
9942                     name[4] == 'r' &&
9943                     name[5] == 's' &&
9944                     name[6] == 'e')
9945                 {                                 /* reverse    */
9946                   return -KEY_reverse;
9947                 }
9948
9949                 goto unknown;
9950
9951               default:
9952                 goto unknown;
9953             }
9954           }
9955
9956           goto unknown;
9957
9958         case 's':
9959           switch (name[1])
9960           {
9961             case 'e':
9962               switch (name[2])
9963               {
9964                 case 'e':
9965                   if (name[3] == 'k' &&
9966                       name[4] == 'd' &&
9967                       name[5] == 'i' &&
9968                       name[6] == 'r')
9969                   {                               /* seekdir    */
9970                     return -KEY_seekdir;
9971                   }
9972
9973                   goto unknown;
9974
9975                 case 't':
9976                   if (name[3] == 'p' &&
9977                       name[4] == 'g' &&
9978                       name[5] == 'r' &&
9979                       name[6] == 'p')
9980                   {                               /* setpgrp    */
9981                     return -KEY_setpgrp;
9982                   }
9983
9984                   goto unknown;
9985
9986                 default:
9987                   goto unknown;
9988               }
9989
9990             case 'h':
9991               if (name[2] == 'm' &&
9992                   name[3] == 'r' &&
9993                   name[4] == 'e' &&
9994                   name[5] == 'a' &&
9995                   name[6] == 'd')
9996               {                                   /* shmread    */
9997                 return -KEY_shmread;
9998               }
9999
10000               goto unknown;
10001
10002             case 'p':
10003               if (name[2] == 'r' &&
10004                   name[3] == 'i' &&
10005                   name[4] == 'n' &&
10006                   name[5] == 't' &&
10007                   name[6] == 'f')
10008               {                                   /* sprintf    */
10009                 return -KEY_sprintf;
10010               }
10011
10012               goto unknown;
10013
10014             case 'y':
10015               switch (name[2])
10016               {
10017                 case 'm':
10018                   if (name[3] == 'l' &&
10019                       name[4] == 'i' &&
10020                       name[5] == 'n' &&
10021                       name[6] == 'k')
10022                   {                               /* symlink    */
10023                     return -KEY_symlink;
10024                   }
10025
10026                   goto unknown;
10027
10028                 case 's':
10029                   switch (name[3])
10030                   {
10031                     case 'c':
10032                       if (name[4] == 'a' &&
10033                           name[5] == 'l' &&
10034                           name[6] == 'l')
10035                       {                           /* syscall    */
10036                         return -KEY_syscall;
10037                       }
10038
10039                       goto unknown;
10040
10041                     case 'o':
10042                       if (name[4] == 'p' &&
10043                           name[5] == 'e' &&
10044                           name[6] == 'n')
10045                       {                           /* sysopen    */
10046                         return -KEY_sysopen;
10047                       }
10048
10049                       goto unknown;
10050
10051                     case 'r':
10052                       if (name[4] == 'e' &&
10053                           name[5] == 'a' &&
10054                           name[6] == 'd')
10055                       {                           /* sysread    */
10056                         return -KEY_sysread;
10057                       }
10058
10059                       goto unknown;
10060
10061                     case 's':
10062                       if (name[4] == 'e' &&
10063                           name[5] == 'e' &&
10064                           name[6] == 'k')
10065                       {                           /* sysseek    */
10066                         return -KEY_sysseek;
10067                       }
10068
10069                       goto unknown;
10070
10071                     default:
10072                       goto unknown;
10073                   }
10074
10075                 default:
10076                   goto unknown;
10077               }
10078
10079             default:
10080               goto unknown;
10081           }
10082
10083         case 't':
10084           if (name[1] == 'e' &&
10085               name[2] == 'l' &&
10086               name[3] == 'l' &&
10087               name[4] == 'd' &&
10088               name[5] == 'i' &&
10089               name[6] == 'r')
10090           {                                       /* telldir    */
10091             return -KEY_telldir;
10092           }
10093
10094           goto unknown;
10095
10096         case 'u':
10097           switch (name[1])
10098           {
10099             case 'c':
10100               if (name[2] == 'f' &&
10101                   name[3] == 'i' &&
10102                   name[4] == 'r' &&
10103                   name[5] == 's' &&
10104                   name[6] == 't')
10105               {                                   /* ucfirst    */
10106                 return -KEY_ucfirst;
10107               }
10108
10109               goto unknown;
10110
10111             case 'n':
10112               if (name[2] == 's' &&
10113                   name[3] == 'h' &&
10114                   name[4] == 'i' &&
10115                   name[5] == 'f' &&
10116                   name[6] == 't')
10117               {                                   /* unshift    */
10118                 return -KEY_unshift;
10119               }
10120
10121               goto unknown;
10122
10123             default:
10124               goto unknown;
10125           }
10126
10127         case 'w':
10128           if (name[1] == 'a' &&
10129               name[2] == 'i' &&
10130               name[3] == 't' &&
10131               name[4] == 'p' &&
10132               name[5] == 'i' &&
10133               name[6] == 'd')
10134           {                                       /* waitpid    */
10135             return -KEY_waitpid;
10136           }
10137
10138           goto unknown;
10139
10140         default:
10141           goto unknown;
10142       }
10143
10144     case 8: /* 26 tokens of length 8 */
10145       switch (name[0])
10146       {
10147         case 'A':
10148           if (name[1] == 'U' &&
10149               name[2] == 'T' &&
10150               name[3] == 'O' &&
10151               name[4] == 'L' &&
10152               name[5] == 'O' &&
10153               name[6] == 'A' &&
10154               name[7] == 'D')
10155           {                                       /* AUTOLOAD   */
10156             return KEY_AUTOLOAD;
10157           }
10158
10159           goto unknown;
10160
10161         case '_':
10162           if (name[1] == '_')
10163           {
10164             switch (name[2])
10165             {
10166               case 'D':
10167                 if (name[3] == 'A' &&
10168                     name[4] == 'T' &&
10169                     name[5] == 'A' &&
10170                     name[6] == '_' &&
10171                     name[7] == '_')
10172                 {                                 /* __DATA__   */
10173                   return KEY___DATA__;
10174                 }
10175
10176                 goto unknown;
10177
10178               case 'F':
10179                 if (name[3] == 'I' &&
10180                     name[4] == 'L' &&
10181                     name[5] == 'E' &&
10182                     name[6] == '_' &&
10183                     name[7] == '_')
10184                 {                                 /* __FILE__   */
10185                   return -KEY___FILE__;
10186                 }
10187
10188                 goto unknown;
10189
10190               case 'L':
10191                 if (name[3] == 'I' &&
10192                     name[4] == 'N' &&
10193                     name[5] == 'E' &&
10194                     name[6] == '_' &&
10195                     name[7] == '_')
10196                 {                                 /* __LINE__   */
10197                   return -KEY___LINE__;
10198                 }
10199
10200                 goto unknown;
10201
10202               default:
10203                 goto unknown;
10204             }
10205           }
10206
10207           goto unknown;
10208
10209         case 'c':
10210           switch (name[1])
10211           {
10212             case 'l':
10213               if (name[2] == 'o' &&
10214                   name[3] == 's' &&
10215                   name[4] == 'e' &&
10216                   name[5] == 'd' &&
10217                   name[6] == 'i' &&
10218                   name[7] == 'r')
10219               {                                   /* closedir   */
10220                 return -KEY_closedir;
10221               }
10222
10223               goto unknown;
10224
10225             case 'o':
10226               if (name[2] == 'n' &&
10227                   name[3] == 't' &&
10228                   name[4] == 'i' &&
10229                   name[5] == 'n' &&
10230                   name[6] == 'u' &&
10231                   name[7] == 'e')
10232               {                                   /* continue   */
10233                 return -KEY_continue;
10234               }
10235
10236               goto unknown;
10237
10238             default:
10239               goto unknown;
10240           }
10241
10242         case 'd':
10243           if (name[1] == 'b' &&
10244               name[2] == 'm' &&
10245               name[3] == 'c' &&
10246               name[4] == 'l' &&
10247               name[5] == 'o' &&
10248               name[6] == 's' &&
10249               name[7] == 'e')
10250           {                                       /* dbmclose   */
10251             return -KEY_dbmclose;
10252           }
10253
10254           goto unknown;
10255
10256         case 'e':
10257           if (name[1] == 'n' &&
10258               name[2] == 'd')
10259           {
10260             switch (name[3])
10261             {
10262               case 'g':
10263                 if (name[4] == 'r' &&
10264                     name[5] == 'e' &&
10265                     name[6] == 'n' &&
10266                     name[7] == 't')
10267                 {                                 /* endgrent   */
10268                   return -KEY_endgrent;
10269                 }
10270
10271                 goto unknown;
10272
10273               case 'p':
10274                 if (name[4] == 'w' &&
10275                     name[5] == 'e' &&
10276                     name[6] == 'n' &&
10277                     name[7] == 't')
10278                 {                                 /* endpwent   */
10279                   return -KEY_endpwent;
10280                 }
10281
10282                 goto unknown;
10283
10284               default:
10285                 goto unknown;
10286             }
10287           }
10288
10289           goto unknown;
10290
10291         case 'f':
10292           if (name[1] == 'o' &&
10293               name[2] == 'r' &&
10294               name[3] == 'm' &&
10295               name[4] == 'l' &&
10296               name[5] == 'i' &&
10297               name[6] == 'n' &&
10298               name[7] == 'e')
10299           {                                       /* formline   */
10300             return -KEY_formline;
10301           }
10302
10303           goto unknown;
10304
10305         case 'g':
10306           if (name[1] == 'e' &&
10307               name[2] == 't')
10308           {
10309             switch (name[3])
10310             {
10311               case 'g':
10312                 if (name[4] == 'r')
10313                 {
10314                   switch (name[5])
10315                   {
10316                     case 'e':
10317                       if (name[6] == 'n' &&
10318                           name[7] == 't')
10319                       {                           /* getgrent   */
10320                         return -KEY_getgrent;
10321                       }
10322
10323                       goto unknown;
10324
10325                     case 'g':
10326                       if (name[6] == 'i' &&
10327                           name[7] == 'd')
10328                       {                           /* getgrgid   */
10329                         return -KEY_getgrgid;
10330                       }
10331
10332                       goto unknown;
10333
10334                     case 'n':
10335                       if (name[6] == 'a' &&
10336                           name[7] == 'm')
10337                       {                           /* getgrnam   */
10338                         return -KEY_getgrnam;
10339                       }
10340
10341                       goto unknown;
10342
10343                     default:
10344                       goto unknown;
10345                   }
10346                 }
10347
10348                 goto unknown;
10349
10350               case 'l':
10351                 if (name[4] == 'o' &&
10352                     name[5] == 'g' &&
10353                     name[6] == 'i' &&
10354                     name[7] == 'n')
10355                 {                                 /* getlogin   */
10356                   return -KEY_getlogin;
10357                 }
10358
10359                 goto unknown;
10360
10361               case 'p':
10362                 if (name[4] == 'w')
10363                 {
10364                   switch (name[5])
10365                   {
10366                     case 'e':
10367                       if (name[6] == 'n' &&
10368                           name[7] == 't')
10369                       {                           /* getpwent   */
10370                         return -KEY_getpwent;
10371                       }
10372
10373                       goto unknown;
10374
10375                     case 'n':
10376                       if (name[6] == 'a' &&
10377                           name[7] == 'm')
10378                       {                           /* getpwnam   */
10379                         return -KEY_getpwnam;
10380                       }
10381
10382                       goto unknown;
10383
10384                     case 'u':
10385                       if (name[6] == 'i' &&
10386                           name[7] == 'd')
10387                       {                           /* getpwuid   */
10388                         return -KEY_getpwuid;
10389                       }
10390
10391                       goto unknown;
10392
10393                     default:
10394                       goto unknown;
10395                   }
10396                 }
10397
10398                 goto unknown;
10399
10400               default:
10401                 goto unknown;
10402             }
10403           }
10404
10405           goto unknown;
10406
10407         case 'r':
10408           if (name[1] == 'e' &&
10409               name[2] == 'a' &&
10410               name[3] == 'd')
10411           {
10412             switch (name[4])
10413             {
10414               case 'l':
10415                 if (name[5] == 'i' &&
10416                     name[6] == 'n')
10417                 {
10418                   switch (name[7])
10419                   {
10420                     case 'e':
10421                       {                           /* readline   */
10422                         return -KEY_readline;
10423                       }
10424
10425                     case 'k':
10426                       {                           /* readlink   */
10427                         return -KEY_readlink;
10428                       }
10429
10430                     default:
10431                       goto unknown;
10432                   }
10433                 }
10434
10435                 goto unknown;
10436
10437               case 'p':
10438                 if (name[5] == 'i' &&
10439                     name[6] == 'p' &&
10440                     name[7] == 'e')
10441                 {                                 /* readpipe   */
10442                   return -KEY_readpipe;
10443                 }
10444
10445                 goto unknown;
10446
10447               default:
10448                 goto unknown;
10449             }
10450           }
10451
10452           goto unknown;
10453
10454         case 's':
10455           switch (name[1])
10456           {
10457             case 'e':
10458               if (name[2] == 't')
10459               {
10460                 switch (name[3])
10461                 {
10462                   case 'g':
10463                     if (name[4] == 'r' &&
10464                         name[5] == 'e' &&
10465                         name[6] == 'n' &&
10466                         name[7] == 't')
10467                     {                             /* setgrent   */
10468                       return -KEY_setgrent;
10469                     }
10470
10471                     goto unknown;
10472
10473                   case 'p':
10474                     if (name[4] == 'w' &&
10475                         name[5] == 'e' &&
10476                         name[6] == 'n' &&
10477                         name[7] == 't')
10478                     {                             /* setpwent   */
10479                       return -KEY_setpwent;
10480                     }
10481
10482                     goto unknown;
10483
10484                   default:
10485                     goto unknown;
10486                 }
10487               }
10488
10489               goto unknown;
10490
10491             case 'h':
10492               switch (name[2])
10493               {
10494                 case 'm':
10495                   if (name[3] == 'w' &&
10496                       name[4] == 'r' &&
10497                       name[5] == 'i' &&
10498                       name[6] == 't' &&
10499                       name[7] == 'e')
10500                   {                               /* shmwrite   */
10501                     return -KEY_shmwrite;
10502                   }
10503
10504                   goto unknown;
10505
10506                 case 'u':
10507                   if (name[3] == 't' &&
10508                       name[4] == 'd' &&
10509                       name[5] == 'o' &&
10510                       name[6] == 'w' &&
10511                       name[7] == 'n')
10512                   {                               /* shutdown   */
10513                     return -KEY_shutdown;
10514                   }
10515
10516                   goto unknown;
10517
10518                 default:
10519                   goto unknown;
10520               }
10521
10522             case 'y':
10523               if (name[2] == 's' &&
10524                   name[3] == 'w' &&
10525                   name[4] == 'r' &&
10526                   name[5] == 'i' &&
10527                   name[6] == 't' &&
10528                   name[7] == 'e')
10529               {                                   /* syswrite   */
10530                 return -KEY_syswrite;
10531               }
10532
10533               goto unknown;
10534
10535             default:
10536               goto unknown;
10537           }
10538
10539         case 't':
10540           if (name[1] == 'r' &&
10541               name[2] == 'u' &&
10542               name[3] == 'n' &&
10543               name[4] == 'c' &&
10544               name[5] == 'a' &&
10545               name[6] == 't' &&
10546               name[7] == 'e')
10547           {                                       /* truncate   */
10548             return -KEY_truncate;
10549           }
10550
10551           goto unknown;
10552
10553         default:
10554           goto unknown;
10555       }
10556
10557     case 9: /* 9 tokens of length 9 */
10558       switch (name[0])
10559       {
10560         case 'U':
10561           if (name[1] == 'N' &&
10562               name[2] == 'I' &&
10563               name[3] == 'T' &&
10564               name[4] == 'C' &&
10565               name[5] == 'H' &&
10566               name[6] == 'E' &&
10567               name[7] == 'C' &&
10568               name[8] == 'K')
10569           {                                       /* UNITCHECK  */
10570             return KEY_UNITCHECK;
10571           }
10572
10573           goto unknown;
10574
10575         case 'e':
10576           if (name[1] == 'n' &&
10577               name[2] == 'd' &&
10578               name[3] == 'n' &&
10579               name[4] == 'e' &&
10580               name[5] == 't' &&
10581               name[6] == 'e' &&
10582               name[7] == 'n' &&
10583               name[8] == 't')
10584           {                                       /* endnetent  */
10585             return -KEY_endnetent;
10586           }
10587
10588           goto unknown;
10589
10590         case 'g':
10591           if (name[1] == 'e' &&
10592               name[2] == 't' &&
10593               name[3] == 'n' &&
10594               name[4] == 'e' &&
10595               name[5] == 't' &&
10596               name[6] == 'e' &&
10597               name[7] == 'n' &&
10598               name[8] == 't')
10599           {                                       /* getnetent  */
10600             return -KEY_getnetent;
10601           }
10602
10603           goto unknown;
10604
10605         case 'l':
10606           if (name[1] == 'o' &&
10607               name[2] == 'c' &&
10608               name[3] == 'a' &&
10609               name[4] == 'l' &&
10610               name[5] == 't' &&
10611               name[6] == 'i' &&
10612               name[7] == 'm' &&
10613               name[8] == 'e')
10614           {                                       /* localtime  */
10615             return -KEY_localtime;
10616           }
10617
10618           goto unknown;
10619
10620         case 'p':
10621           if (name[1] == 'r' &&
10622               name[2] == 'o' &&
10623               name[3] == 't' &&
10624               name[4] == 'o' &&
10625               name[5] == 't' &&
10626               name[6] == 'y' &&
10627               name[7] == 'p' &&
10628               name[8] == 'e')
10629           {                                       /* prototype  */
10630             return KEY_prototype;
10631           }
10632
10633           goto unknown;
10634
10635         case 'q':
10636           if (name[1] == 'u' &&
10637               name[2] == 'o' &&
10638               name[3] == 't' &&
10639               name[4] == 'e' &&
10640               name[5] == 'm' &&
10641               name[6] == 'e' &&
10642               name[7] == 't' &&
10643               name[8] == 'a')
10644           {                                       /* quotemeta  */
10645             return -KEY_quotemeta;
10646           }
10647
10648           goto unknown;
10649
10650         case 'r':
10651           if (name[1] == 'e' &&
10652               name[2] == 'w' &&
10653               name[3] == 'i' &&
10654               name[4] == 'n' &&
10655               name[5] == 'd' &&
10656               name[6] == 'd' &&
10657               name[7] == 'i' &&
10658               name[8] == 'r')
10659           {                                       /* rewinddir  */
10660             return -KEY_rewinddir;
10661           }
10662
10663           goto unknown;
10664
10665         case 's':
10666           if (name[1] == 'e' &&
10667               name[2] == 't' &&
10668               name[3] == 'n' &&
10669               name[4] == 'e' &&
10670               name[5] == 't' &&
10671               name[6] == 'e' &&
10672               name[7] == 'n' &&
10673               name[8] == 't')
10674           {                                       /* setnetent  */
10675             return -KEY_setnetent;
10676           }
10677
10678           goto unknown;
10679
10680         case 'w':
10681           if (name[1] == 'a' &&
10682               name[2] == 'n' &&
10683               name[3] == 't' &&
10684               name[4] == 'a' &&
10685               name[5] == 'r' &&
10686               name[6] == 'r' &&
10687               name[7] == 'a' &&
10688               name[8] == 'y')
10689           {                                       /* wantarray  */
10690             return -KEY_wantarray;
10691           }
10692
10693           goto unknown;
10694
10695         default:
10696           goto unknown;
10697       }
10698
10699     case 10: /* 9 tokens of length 10 */
10700       switch (name[0])
10701       {
10702         case 'e':
10703           if (name[1] == 'n' &&
10704               name[2] == 'd')
10705           {
10706             switch (name[3])
10707             {
10708               case 'h':
10709                 if (name[4] == 'o' &&
10710                     name[5] == 's' &&
10711                     name[6] == 't' &&
10712                     name[7] == 'e' &&
10713                     name[8] == 'n' &&
10714                     name[9] == 't')
10715                 {                                 /* endhostent */
10716                   return -KEY_endhostent;
10717                 }
10718
10719                 goto unknown;
10720
10721               case 's':
10722                 if (name[4] == 'e' &&
10723                     name[5] == 'r' &&
10724                     name[6] == 'v' &&
10725                     name[7] == 'e' &&
10726                     name[8] == 'n' &&
10727                     name[9] == 't')
10728                 {                                 /* endservent */
10729                   return -KEY_endservent;
10730                 }
10731
10732                 goto unknown;
10733
10734               default:
10735                 goto unknown;
10736             }
10737           }
10738
10739           goto unknown;
10740
10741         case 'g':
10742           if (name[1] == 'e' &&
10743               name[2] == 't')
10744           {
10745             switch (name[3])
10746             {
10747               case 'h':
10748                 if (name[4] == 'o' &&
10749                     name[5] == 's' &&
10750                     name[6] == 't' &&
10751                     name[7] == 'e' &&
10752                     name[8] == 'n' &&
10753                     name[9] == 't')
10754                 {                                 /* gethostent */
10755                   return -KEY_gethostent;
10756                 }
10757
10758                 goto unknown;
10759
10760               case 's':
10761                 switch (name[4])
10762                 {
10763                   case 'e':
10764                     if (name[5] == 'r' &&
10765                         name[6] == 'v' &&
10766                         name[7] == 'e' &&
10767                         name[8] == 'n' &&
10768                         name[9] == 't')
10769                     {                             /* getservent */
10770                       return -KEY_getservent;
10771                     }
10772
10773                     goto unknown;
10774
10775                   case 'o':
10776                     if (name[5] == 'c' &&
10777                         name[6] == 'k' &&
10778                         name[7] == 'o' &&
10779                         name[8] == 'p' &&
10780                         name[9] == 't')
10781                     {                             /* getsockopt */
10782                       return -KEY_getsockopt;
10783                     }
10784
10785                     goto unknown;
10786
10787                   default:
10788                     goto unknown;
10789                 }
10790
10791               default:
10792                 goto unknown;
10793             }
10794           }
10795
10796           goto unknown;
10797
10798         case 's':
10799           switch (name[1])
10800           {
10801             case 'e':
10802               if (name[2] == 't')
10803               {
10804                 switch (name[3])
10805                 {
10806                   case 'h':
10807                     if (name[4] == 'o' &&
10808                         name[5] == 's' &&
10809                         name[6] == 't' &&
10810                         name[7] == 'e' &&
10811                         name[8] == 'n' &&
10812                         name[9] == 't')
10813                     {                             /* sethostent */
10814                       return -KEY_sethostent;
10815                     }
10816
10817                     goto unknown;
10818
10819                   case 's':
10820                     switch (name[4])
10821                     {
10822                       case 'e':
10823                         if (name[5] == 'r' &&
10824                             name[6] == 'v' &&
10825                             name[7] == 'e' &&
10826                             name[8] == 'n' &&
10827                             name[9] == 't')
10828                         {                         /* setservent */
10829                           return -KEY_setservent;
10830                         }
10831
10832                         goto unknown;
10833
10834                       case 'o':
10835                         if (name[5] == 'c' &&
10836                             name[6] == 'k' &&
10837                             name[7] == 'o' &&
10838                             name[8] == 'p' &&
10839                             name[9] == 't')
10840                         {                         /* setsockopt */
10841                           return -KEY_setsockopt;
10842                         }
10843
10844                         goto unknown;
10845
10846                       default:
10847                         goto unknown;
10848                     }
10849
10850                   default:
10851                     goto unknown;
10852                 }
10853               }
10854
10855               goto unknown;
10856
10857             case 'o':
10858               if (name[2] == 'c' &&
10859                   name[3] == 'k' &&
10860                   name[4] == 'e' &&
10861                   name[5] == 't' &&
10862                   name[6] == 'p' &&
10863                   name[7] == 'a' &&
10864                   name[8] == 'i' &&
10865                   name[9] == 'r')
10866               {                                   /* socketpair */
10867                 return -KEY_socketpair;
10868               }
10869
10870               goto unknown;
10871
10872             default:
10873               goto unknown;
10874           }
10875
10876         default:
10877           goto unknown;
10878       }
10879
10880     case 11: /* 8 tokens of length 11 */
10881       switch (name[0])
10882       {
10883         case '_':
10884           if (name[1] == '_' &&
10885               name[2] == 'P' &&
10886               name[3] == 'A' &&
10887               name[4] == 'C' &&
10888               name[5] == 'K' &&
10889               name[6] == 'A' &&
10890               name[7] == 'G' &&
10891               name[8] == 'E' &&
10892               name[9] == '_' &&
10893               name[10] == '_')
10894           {                                       /* __PACKAGE__ */
10895             return -KEY___PACKAGE__;
10896           }
10897
10898           goto unknown;
10899
10900         case 'e':
10901           if (name[1] == 'n' &&
10902               name[2] == 'd' &&
10903               name[3] == 'p' &&
10904               name[4] == 'r' &&
10905               name[5] == 'o' &&
10906               name[6] == 't' &&
10907               name[7] == 'o' &&
10908               name[8] == 'e' &&
10909               name[9] == 'n' &&
10910               name[10] == 't')
10911           {                                       /* endprotoent */
10912             return -KEY_endprotoent;
10913           }
10914
10915           goto unknown;
10916
10917         case 'g':
10918           if (name[1] == 'e' &&
10919               name[2] == 't')
10920           {
10921             switch (name[3])
10922             {
10923               case 'p':
10924                 switch (name[4])
10925                 {
10926                   case 'e':
10927                     if (name[5] == 'e' &&
10928                         name[6] == 'r' &&
10929                         name[7] == 'n' &&
10930                         name[8] == 'a' &&
10931                         name[9] == 'm' &&
10932                         name[10] == 'e')
10933                     {                             /* getpeername */
10934                       return -KEY_getpeername;
10935                     }
10936
10937                     goto unknown;
10938
10939                   case 'r':
10940                     switch (name[5])
10941                     {
10942                       case 'i':
10943                         if (name[6] == 'o' &&
10944                             name[7] == 'r' &&
10945                             name[8] == 'i' &&
10946                             name[9] == 't' &&
10947                             name[10] == 'y')
10948                         {                         /* getpriority */
10949                           return -KEY_getpriority;
10950                         }
10951
10952                         goto unknown;
10953
10954                       case 'o':
10955                         if (name[6] == 't' &&
10956                             name[7] == 'o' &&
10957                             name[8] == 'e' &&
10958                             name[9] == 'n' &&
10959                             name[10] == 't')
10960                         {                         /* getprotoent */
10961                           return -KEY_getprotoent;
10962                         }
10963
10964                         goto unknown;
10965
10966                       default:
10967                         goto unknown;
10968                     }
10969
10970                   default:
10971                     goto unknown;
10972                 }
10973
10974               case 's':
10975                 if (name[4] == 'o' &&
10976                     name[5] == 'c' &&
10977                     name[6] == 'k' &&
10978                     name[7] == 'n' &&
10979                     name[8] == 'a' &&
10980                     name[9] == 'm' &&
10981                     name[10] == 'e')
10982                 {                                 /* getsockname */
10983                   return -KEY_getsockname;
10984                 }
10985
10986                 goto unknown;
10987
10988               default:
10989                 goto unknown;
10990             }
10991           }
10992
10993           goto unknown;
10994
10995         case 's':
10996           if (name[1] == 'e' &&
10997               name[2] == 't' &&
10998               name[3] == 'p' &&
10999               name[4] == 'r')
11000           {
11001             switch (name[5])
11002             {
11003               case 'i':
11004                 if (name[6] == 'o' &&
11005                     name[7] == 'r' &&
11006                     name[8] == 'i' &&
11007                     name[9] == 't' &&
11008                     name[10] == 'y')
11009                 {                                 /* setpriority */
11010                   return -KEY_setpriority;
11011                 }
11012
11013                 goto unknown;
11014
11015               case 'o':
11016                 if (name[6] == 't' &&
11017                     name[7] == 'o' &&
11018                     name[8] == 'e' &&
11019                     name[9] == 'n' &&
11020                     name[10] == 't')
11021                 {                                 /* setprotoent */
11022                   return -KEY_setprotoent;
11023                 }
11024
11025                 goto unknown;
11026
11027               default:
11028                 goto unknown;
11029             }
11030           }
11031
11032           goto unknown;
11033
11034         default:
11035           goto unknown;
11036       }
11037
11038     case 12: /* 2 tokens of length 12 */
11039       if (name[0] == 'g' &&
11040           name[1] == 'e' &&
11041           name[2] == 't' &&
11042           name[3] == 'n' &&
11043           name[4] == 'e' &&
11044           name[5] == 't' &&
11045           name[6] == 'b' &&
11046           name[7] == 'y')
11047       {
11048         switch (name[8])
11049         {
11050           case 'a':
11051             if (name[9] == 'd' &&
11052                 name[10] == 'd' &&
11053                 name[11] == 'r')
11054             {                                     /* getnetbyaddr */
11055               return -KEY_getnetbyaddr;
11056             }
11057
11058             goto unknown;
11059
11060           case 'n':
11061             if (name[9] == 'a' &&
11062                 name[10] == 'm' &&
11063                 name[11] == 'e')
11064             {                                     /* getnetbyname */
11065               return -KEY_getnetbyname;
11066             }
11067
11068             goto unknown;
11069
11070           default:
11071             goto unknown;
11072         }
11073       }
11074
11075       goto unknown;
11076
11077     case 13: /* 4 tokens of length 13 */
11078       if (name[0] == 'g' &&
11079           name[1] == 'e' &&
11080           name[2] == 't')
11081       {
11082         switch (name[3])
11083         {
11084           case 'h':
11085             if (name[4] == 'o' &&
11086                 name[5] == 's' &&
11087                 name[6] == 't' &&
11088                 name[7] == 'b' &&
11089                 name[8] == 'y')
11090             {
11091               switch (name[9])
11092               {
11093                 case 'a':
11094                   if (name[10] == 'd' &&
11095                       name[11] == 'd' &&
11096                       name[12] == 'r')
11097                   {                               /* gethostbyaddr */
11098                     return -KEY_gethostbyaddr;
11099                   }
11100
11101                   goto unknown;
11102
11103                 case 'n':
11104                   if (name[10] == 'a' &&
11105                       name[11] == 'm' &&
11106                       name[12] == 'e')
11107                   {                               /* gethostbyname */
11108                     return -KEY_gethostbyname;
11109                   }
11110
11111                   goto unknown;
11112
11113                 default:
11114                   goto unknown;
11115               }
11116             }
11117
11118             goto unknown;
11119
11120           case 's':
11121             if (name[4] == 'e' &&
11122                 name[5] == 'r' &&
11123                 name[6] == 'v' &&
11124                 name[7] == 'b' &&
11125                 name[8] == 'y')
11126             {
11127               switch (name[9])
11128               {
11129                 case 'n':
11130                   if (name[10] == 'a' &&
11131                       name[11] == 'm' &&
11132                       name[12] == 'e')
11133                   {                               /* getservbyname */
11134                     return -KEY_getservbyname;
11135                   }
11136
11137                   goto unknown;
11138
11139                 case 'p':
11140                   if (name[10] == 'o' &&
11141                       name[11] == 'r' &&
11142                       name[12] == 't')
11143                   {                               /* getservbyport */
11144                     return -KEY_getservbyport;
11145                   }
11146
11147                   goto unknown;
11148
11149                 default:
11150                   goto unknown;
11151               }
11152             }
11153
11154             goto unknown;
11155
11156           default:
11157             goto unknown;
11158         }
11159       }
11160
11161       goto unknown;
11162
11163     case 14: /* 1 tokens of length 14 */
11164       if (name[0] == 'g' &&
11165           name[1] == 'e' &&
11166           name[2] == 't' &&
11167           name[3] == 'p' &&
11168           name[4] == 'r' &&
11169           name[5] == 'o' &&
11170           name[6] == 't' &&
11171           name[7] == 'o' &&
11172           name[8] == 'b' &&
11173           name[9] == 'y' &&
11174           name[10] == 'n' &&
11175           name[11] == 'a' &&
11176           name[12] == 'm' &&
11177           name[13] == 'e')
11178       {                                           /* getprotobyname */
11179         return -KEY_getprotobyname;
11180       }
11181
11182       goto unknown;
11183
11184     case 16: /* 1 tokens of length 16 */
11185       if (name[0] == 'g' &&
11186           name[1] == 'e' &&
11187           name[2] == 't' &&
11188           name[3] == 'p' &&
11189           name[4] == 'r' &&
11190           name[5] == 'o' &&
11191           name[6] == 't' &&
11192           name[7] == 'o' &&
11193           name[8] == 'b' &&
11194           name[9] == 'y' &&
11195           name[10] == 'n' &&
11196           name[11] == 'u' &&
11197           name[12] == 'm' &&
11198           name[13] == 'b' &&
11199           name[14] == 'e' &&
11200           name[15] == 'r')
11201       {                                           /* getprotobynumber */
11202         return -KEY_getprotobynumber;
11203       }
11204
11205       goto unknown;
11206
11207     default:
11208       goto unknown;
11209   }
11210
11211 unknown:
11212   return 0;
11213 }
11214
11215 STATIC void
11216 S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
11217 {
11218     dVAR;
11219
11220     PERL_ARGS_ASSERT_CHECKCOMMA;
11221
11222     if (*s == ' ' && s[1] == '(') {     /* XXX gotta be a better way */
11223         if (ckWARN(WARN_SYNTAX)) {
11224             int level = 1;
11225             const char *w;
11226             for (w = s+2; *w && level; w++) {
11227                 if (*w == '(')
11228                     ++level;
11229                 else if (*w == ')')
11230                     --level;
11231             }
11232             while (isSPACE(*w))
11233                 ++w;
11234             /* the list of chars below is for end of statements or
11235              * block / parens, boolean operators (&&, ||, //) and branch
11236              * constructs (or, and, if, until, unless, while, err, for).
11237              * Not a very solid hack... */
11238             if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
11239                 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
11240                             "%s (...) interpreted as function",name);
11241         }
11242     }
11243     while (s < PL_bufend && isSPACE(*s))
11244         s++;
11245     if (*s == '(')
11246         s++;
11247     while (s < PL_bufend && isSPACE(*s))
11248         s++;
11249     if (isIDFIRST_lazy_if(s,UTF)) {
11250         const char * const w = s++;
11251         while (isALNUM_lazy_if(s,UTF))
11252             s++;
11253         while (s < PL_bufend && isSPACE(*s))
11254             s++;
11255         if (*s == ',') {
11256             GV* gv;
11257             if (keyword(w, s - w, 0))
11258                 return;
11259
11260             gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
11261             if (gv && GvCVu(gv))
11262                 return;
11263             Perl_croak(aTHX_ "No comma allowed after %s", what);
11264         }
11265     }
11266 }
11267
11268 /* Either returns sv, or mortalizes sv and returns a new SV*.
11269    Best used as sv=new_constant(..., sv, ...).
11270    If s, pv are NULL, calls subroutine with one argument,
11271    and type is used with error messages only. */
11272
11273 STATIC SV *
11274 S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
11275                SV *sv, SV *pv, const char *type, STRLEN typelen)
11276 {
11277     dVAR; dSP;
11278     HV * const table = GvHV(PL_hintgv);          /* ^H */
11279     SV *res;
11280     SV **cvp;
11281     SV *cv, *typesv;
11282     const char *why1 = "", *why2 = "", *why3 = "";
11283
11284     PERL_ARGS_ASSERT_NEW_CONSTANT;
11285
11286     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
11287         SV *msg;
11288         
11289         why2 = (const char *)
11290             (strEQ(key,"charnames")
11291              ? "(possibly a missing \"use charnames ...\")"
11292              : "");
11293         msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
11294                             (type ? type: "undef"), why2);
11295
11296         /* This is convoluted and evil ("goto considered harmful")
11297          * but I do not understand the intricacies of all the different
11298          * failure modes of %^H in here.  The goal here is to make
11299          * the most probable error message user-friendly. --jhi */
11300
11301         goto msgdone;
11302
11303     report:
11304         msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
11305                             (type ? type: "undef"), why1, why2, why3);
11306     msgdone:
11307         yyerror(SvPVX_const(msg));
11308         SvREFCNT_dec(msg);
11309         return sv;
11310     }
11311     cvp = hv_fetch(table, key, keylen, FALSE);
11312     if (!cvp || !SvOK(*cvp)) {
11313         why1 = "$^H{";
11314         why2 = key;
11315         why3 = "} is not defined";
11316         goto report;
11317     }
11318     sv_2mortal(sv);                     /* Parent created it permanently */
11319     cv = *cvp;
11320     if (!pv && s)
11321         pv = newSVpvn_flags(s, len, SVs_TEMP);
11322     if (type && pv)
11323         typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
11324     else
11325         typesv = &PL_sv_undef;
11326
11327     PUSHSTACKi(PERLSI_OVERLOAD);
11328     ENTER ;
11329     SAVETMPS;
11330
11331     PUSHMARK(SP) ;
11332     EXTEND(sp, 3);
11333     if (pv)
11334         PUSHs(pv);
11335     PUSHs(sv);
11336     if (pv)
11337         PUSHs(typesv);
11338     PUTBACK;
11339     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
11340
11341     SPAGAIN ;
11342
11343     /* Check the eval first */
11344     if (!PL_in_eval && SvTRUE(ERRSV)) {
11345         sv_catpvs(ERRSV, "Propagated");
11346         yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
11347         (void)POPs;
11348         res = SvREFCNT_inc_simple(sv);
11349     }
11350     else {
11351         res = POPs;
11352         SvREFCNT_inc_simple_void(res);
11353     }
11354
11355     PUTBACK ;
11356     FREETMPS ;
11357     LEAVE ;
11358     POPSTACK;
11359
11360     if (!SvOK(res)) {
11361         why1 = "Call to &{$^H{";
11362         why2 = key;
11363         why3 = "}} did not return a defined value";
11364         sv = res;
11365         goto report;
11366     }
11367
11368     return res;
11369 }
11370
11371 /* Returns a NUL terminated string, with the length of the string written to
11372    *slp
11373    */
11374 STATIC char *
11375 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
11376 {
11377     dVAR;
11378     register char *d = dest;
11379     register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
11380
11381     PERL_ARGS_ASSERT_SCAN_WORD;
11382
11383     for (;;) {
11384         if (d >= e)
11385             Perl_croak(aTHX_ ident_too_long);
11386         if (isALNUM(*s))        /* UTF handled below */
11387             *d++ = *s++;
11388         else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
11389             *d++ = ':';
11390             *d++ = ':';
11391             s++;
11392         }
11393         else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
11394             *d++ = *s++;
11395             *d++ = *s++;
11396         }
11397         else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11398             char *t = s + UTF8SKIP(s);
11399             size_t len;
11400             while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11401                 t += UTF8SKIP(t);
11402             len = t - s;
11403             if (d + len > e)
11404                 Perl_croak(aTHX_ ident_too_long);
11405             Copy(s, d, len, char);
11406             d += len;
11407             s = t;
11408         }
11409         else {
11410             *d = '\0';
11411             *slp = d - dest;
11412             return s;
11413         }
11414     }
11415 }
11416
11417 STATIC char *
11418 S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
11419 {
11420     dVAR;
11421     char *bracket = NULL;
11422     char funny = *s++;
11423     register char *d = dest;
11424     register char * const e = d + destlen - 3;    /* two-character token, ending NUL */
11425
11426     PERL_ARGS_ASSERT_SCAN_IDENT;
11427
11428     if (isSPACE(*s))
11429         s = PEEKSPACE(s);
11430     if (isDIGIT(*s)) {
11431         while (isDIGIT(*s)) {
11432             if (d >= e)
11433                 Perl_croak(aTHX_ ident_too_long);
11434             *d++ = *s++;
11435         }
11436     }
11437     else {
11438         for (;;) {
11439             if (d >= e)
11440                 Perl_croak(aTHX_ ident_too_long);
11441             if (isALNUM(*s))    /* UTF handled below */
11442                 *d++ = *s++;
11443             else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
11444                 *d++ = ':';
11445                 *d++ = ':';
11446                 s++;
11447             }
11448             else if (*s == ':' && s[1] == ':') {
11449                 *d++ = *s++;
11450                 *d++ = *s++;
11451             }
11452             else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
11453                 char *t = s + UTF8SKIP(s);
11454                 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
11455                     t += UTF8SKIP(t);
11456                 if (d + (t - s) > e)
11457                     Perl_croak(aTHX_ ident_too_long);
11458                 Copy(s, d, t - s, char);
11459                 d += t - s;
11460                 s = t;
11461             }
11462             else
11463                 break;
11464         }
11465     }
11466     *d = '\0';
11467     d = dest;
11468     if (*d) {
11469         if (PL_lex_state != LEX_NORMAL)
11470             PL_lex_state = LEX_INTERPENDMAYBE;
11471         return s;
11472     }
11473     if (*s == '$' && s[1] &&
11474         (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
11475     {
11476         return s;
11477     }
11478     if (*s == '{') {
11479         bracket = s;
11480         s++;
11481     }
11482     else if (ck_uni)
11483         check_uni();
11484     if (s < send)
11485         *d = *s++;
11486     d[1] = '\0';
11487     if (*d == '^' && *s && isCONTROLVAR(*s)) {
11488         *d = toCTRL(*s);
11489         s++;
11490     }
11491     if (bracket) {
11492         if (isSPACE(s[-1])) {
11493             while (s < send) {
11494                 const char ch = *s++;
11495                 if (!SPACE_OR_TAB(ch)) {
11496                     *d = ch;
11497                     break;
11498                 }
11499             }
11500         }
11501         if (isIDFIRST_lazy_if(d,UTF)) {
11502             d++;
11503             if (UTF) {
11504                 char *end = s;
11505                 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
11506                     end += UTF8SKIP(end);
11507                     while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
11508                         end += UTF8SKIP(end);
11509                 }
11510                 Copy(s, d, end - s, char);
11511                 d += end - s;
11512                 s = end;
11513             }
11514             else {
11515                 while ((isALNUM(*s) || *s == ':') && d < e)
11516                     *d++ = *s++;
11517                 if (d >= e)
11518                     Perl_croak(aTHX_ ident_too_long);
11519             }
11520             *d = '\0';
11521             while (s < send && SPACE_OR_TAB(*s))
11522                 s++;
11523             if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
11524                 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
11525                     const char * const brack =
11526                         (const char *)
11527                         ((*s == '[') ? "[...]" : "{...}");
11528                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11529                         "Ambiguous use of %c{%s%s} resolved to %c%s%s",
11530                         funny, dest, brack, funny, dest, brack);
11531                 }
11532                 bracket++;
11533                 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
11534                 return s;
11535             }
11536         }
11537         /* Handle extended ${^Foo} variables
11538          * 1999-02-27 mjd-perl-patch@plover.com */
11539         else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
11540                  && isALNUM(*s))
11541         {
11542             d++;
11543             while (isALNUM(*s) && d < e) {
11544                 *d++ = *s++;
11545             }
11546             if (d >= e)
11547                 Perl_croak(aTHX_ ident_too_long);
11548             *d = '\0';
11549         }
11550         if (*s == '}') {
11551             s++;
11552             if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
11553                 PL_lex_state = LEX_INTERPEND;
11554                 PL_expect = XREF;
11555             }
11556             if (PL_lex_state == LEX_NORMAL) {
11557                 if (ckWARN(WARN_AMBIGUOUS) &&
11558                     (keyword(dest, d - dest, 0)
11559                      || get_cvn_flags(dest, d - dest, 0)))
11560                 {
11561                     if (funny == '#')
11562                         funny = '@';
11563                     Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
11564                         "Ambiguous use of %c{%s} resolved to %c%s",
11565                         funny, dest, funny, dest);
11566                 }
11567             }
11568         }
11569         else {
11570             s = bracket;                /* let the parser handle it */
11571             *dest = '\0';
11572         }
11573     }
11574     else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
11575         PL_lex_state = LEX_INTERPEND;
11576     return s;
11577 }
11578
11579 static U32
11580 S_pmflag(U32 pmfl, const char ch) {
11581     switch (ch) {
11582         CASE_STD_PMMOD_FLAGS_PARSE_SET(&pmfl);
11583     case GLOBAL_PAT_MOD:    pmfl |= PMf_GLOBAL; break;
11584     case CONTINUE_PAT_MOD:  pmfl |= PMf_CONTINUE; break;
11585     case ONCE_PAT_MOD:      pmfl |= PMf_KEEP; break;
11586     case KEEPCOPY_PAT_MOD:  pmfl |= PMf_KEEPCOPY; break;
11587     }
11588     return pmfl;
11589 }
11590
11591 void
11592 Perl_pmflag(pTHX_ U32* pmfl, int ch)
11593 {
11594     PERL_ARGS_ASSERT_PMFLAG;
11595
11596     Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
11597                      "Perl_pmflag() is deprecated, and will be removed from the XS API");
11598
11599     if (ch<256) {
11600         *pmfl = S_pmflag(*pmfl, (char)ch);
11601     }
11602 }
11603
11604 STATIC char *
11605 S_scan_pat(pTHX_ char *start, I32 type)
11606 {
11607     dVAR;
11608     PMOP *pm;
11609     char *s = scan_str(start,!!PL_madskills,FALSE);
11610     const char * const valid_flags =
11611         (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
11612 #ifdef PERL_MAD
11613     char *modstart;
11614 #endif
11615
11616     PERL_ARGS_ASSERT_SCAN_PAT;
11617
11618     if (!s) {
11619         const char * const delimiter = skipspace(start);
11620         Perl_croak(aTHX_
11621                    (const char *)
11622                    (*delimiter == '?'
11623                     ? "Search pattern not terminated or ternary operator parsed as search pattern"
11624                     : "Search pattern not terminated" ));
11625     }
11626
11627     pm = (PMOP*)newPMOP(type, 0);
11628     if (PL_multi_open == '?') {
11629         /* This is the only point in the code that sets PMf_ONCE:  */
11630         pm->op_pmflags |= PMf_ONCE;
11631
11632         /* Hence it's safe to do this bit of PMOP book-keeping here, which
11633            allows us to restrict the list needed by reset to just the ??
11634            matches.  */
11635         assert(type != OP_TRANS);
11636         if (PL_curstash) {
11637             MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
11638             U32 elements;
11639             if (!mg) {
11640                 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
11641                                  0);
11642             }
11643             elements = mg->mg_len / sizeof(PMOP**);
11644             Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
11645             ((PMOP**)mg->mg_ptr) [elements++] = pm;
11646             mg->mg_len = elements * sizeof(PMOP**);
11647             PmopSTASH_set(pm,PL_curstash);
11648         }
11649     }
11650 #ifdef PERL_MAD
11651     modstart = s;
11652 #endif
11653     while (*s && strchr(valid_flags, *s))
11654         pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
11655 #ifdef PERL_MAD
11656     if (PL_madskills && modstart != s) {
11657         SV* tmptoken = newSVpvn(modstart, s - modstart);
11658         append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
11659     }
11660 #endif
11661     /* issue a warning if /c is specified,but /g is not */
11662     if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
11663     {
11664         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), 
11665                        "Use of /c modifier is meaningless without /g" );
11666     }
11667
11668     PL_lex_op = (OP*)pm;
11669     pl_yylval.ival = OP_MATCH;
11670     return s;
11671 }
11672
11673 STATIC char *
11674 S_scan_subst(pTHX_ char *start)
11675 {
11676     dVAR;
11677     register char *s;
11678     register PMOP *pm;
11679     I32 first_start;
11680     I32 es = 0;
11681 #ifdef PERL_MAD
11682     char *modstart;
11683 #endif
11684
11685     PERL_ARGS_ASSERT_SCAN_SUBST;
11686
11687     pl_yylval.ival = OP_NULL;
11688
11689     s = scan_str(start,!!PL_madskills,FALSE);
11690
11691     if (!s)
11692         Perl_croak(aTHX_ "Substitution pattern not terminated");
11693
11694     if (s[-1] == PL_multi_open)
11695         s--;
11696 #ifdef PERL_MAD
11697     if (PL_madskills) {
11698         CURMAD('q', PL_thisopen);
11699         CURMAD('_', PL_thiswhite);
11700         CURMAD('E', PL_thisstuff);
11701         CURMAD('Q', PL_thisclose);
11702         PL_realtokenstart = s - SvPVX(PL_linestr);
11703     }
11704 #endif
11705
11706     first_start = PL_multi_start;
11707     s = scan_str(s,!!PL_madskills,FALSE);
11708     if (!s) {
11709         if (PL_lex_stuff) {
11710             SvREFCNT_dec(PL_lex_stuff);
11711             PL_lex_stuff = NULL;
11712         }
11713         Perl_croak(aTHX_ "Substitution replacement not terminated");
11714     }
11715     PL_multi_start = first_start;       /* so whole substitution is taken together */
11716
11717     pm = (PMOP*)newPMOP(OP_SUBST, 0);
11718
11719 #ifdef PERL_MAD
11720     if (PL_madskills) {
11721         CURMAD('z', PL_thisopen);
11722         CURMAD('R', PL_thisstuff);
11723         CURMAD('Z', PL_thisclose);
11724     }
11725     modstart = s;
11726 #endif
11727
11728     while (*s) {
11729         if (*s == EXEC_PAT_MOD) {
11730             s++;
11731             es++;
11732         }
11733         else if (strchr(S_PAT_MODS, *s))
11734             pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
11735         else
11736             break;
11737     }
11738
11739 #ifdef PERL_MAD
11740     if (PL_madskills) {
11741         if (modstart != s)
11742             curmad('m', newSVpvn(modstart, s - modstart));
11743         append_madprops(PL_thismad, (OP*)pm, 0);
11744         PL_thismad = 0;
11745     }
11746 #endif
11747     if ((pm->op_pmflags & PMf_CONTINUE)) {
11748         Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
11749     }
11750
11751     if (es) {
11752         SV * const repl = newSVpvs("");
11753
11754         PL_sublex_info.super_bufptr = s;
11755         PL_sublex_info.super_bufend = PL_bufend;
11756         PL_multi_end = 0;
11757         pm->op_pmflags |= PMf_EVAL;
11758         while (es-- > 0) {
11759             if (es)
11760                 sv_catpvs(repl, "eval ");
11761             else
11762                 sv_catpvs(repl, "do ");
11763         }
11764         sv_catpvs(repl, "{");
11765         sv_catsv(repl, PL_lex_repl);
11766         if (strchr(SvPVX(PL_lex_repl), '#'))
11767             sv_catpvs(repl, "\n");
11768         sv_catpvs(repl, "}");
11769         SvEVALED_on(repl);
11770         SvREFCNT_dec(PL_lex_repl);
11771         PL_lex_repl = repl;
11772     }
11773
11774     PL_lex_op = (OP*)pm;
11775     pl_yylval.ival = OP_SUBST;
11776     return s;
11777 }
11778
11779 STATIC char *
11780 S_scan_trans(pTHX_ char *start)
11781 {
11782     dVAR;
11783     register char* s;
11784     OP *o;
11785     short *tbl;
11786     U8 squash;
11787     U8 del;
11788     U8 complement;
11789 #ifdef PERL_MAD
11790     char *modstart;
11791 #endif
11792
11793     PERL_ARGS_ASSERT_SCAN_TRANS;
11794
11795     pl_yylval.ival = OP_NULL;
11796
11797     s = scan_str(start,!!PL_madskills,FALSE);
11798     if (!s)
11799         Perl_croak(aTHX_ "Transliteration pattern not terminated");
11800
11801     if (s[-1] == PL_multi_open)
11802         s--;
11803 #ifdef PERL_MAD
11804     if (PL_madskills) {
11805         CURMAD('q', PL_thisopen);
11806         CURMAD('_', PL_thiswhite);
11807         CURMAD('E', PL_thisstuff);
11808         CURMAD('Q', PL_thisclose);
11809         PL_realtokenstart = s - SvPVX(PL_linestr);
11810     }
11811 #endif
11812
11813     s = scan_str(s,!!PL_madskills,FALSE);
11814     if (!s) {
11815         if (PL_lex_stuff) {
11816             SvREFCNT_dec(PL_lex_stuff);
11817             PL_lex_stuff = NULL;
11818         }
11819         Perl_croak(aTHX_ "Transliteration replacement not terminated");
11820     }
11821     if (PL_madskills) {
11822         CURMAD('z', PL_thisopen);
11823         CURMAD('R', PL_thisstuff);
11824         CURMAD('Z', PL_thisclose);
11825     }
11826
11827     complement = del = squash = 0;
11828 #ifdef PERL_MAD
11829     modstart = s;
11830 #endif
11831     while (1) {
11832         switch (*s) {
11833         case 'c':
11834             complement = OPpTRANS_COMPLEMENT;
11835             break;
11836         case 'd':
11837             del = OPpTRANS_DELETE;
11838             break;
11839         case 's':
11840             squash = OPpTRANS_SQUASH;
11841             break;
11842         default:
11843             goto no_more;
11844         }
11845         s++;
11846     }
11847   no_more:
11848
11849     tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
11850     o = newPVOP(OP_TRANS, 0, (char*)tbl);
11851     o->op_private &= ~OPpTRANS_ALL;
11852     o->op_private |= del|squash|complement|
11853       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
11854       (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF   : 0);
11855
11856     PL_lex_op = o;
11857     pl_yylval.ival = OP_TRANS;
11858
11859 #ifdef PERL_MAD
11860     if (PL_madskills) {
11861         if (modstart != s)
11862             curmad('m', newSVpvn(modstart, s - modstart));
11863         append_madprops(PL_thismad, o, 0);
11864         PL_thismad = 0;
11865     }
11866 #endif
11867
11868     return s;
11869 }
11870
11871 STATIC char *
11872 S_scan_heredoc(pTHX_ register char *s)
11873 {
11874     dVAR;
11875     SV *herewas;
11876     I32 op_type = OP_SCALAR;
11877     I32 len;
11878     SV *tmpstr;
11879     char term;
11880     const char *found_newline;
11881     register char *d;
11882     register char *e;
11883     char *peek;
11884     const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
11885 #ifdef PERL_MAD
11886     I32 stuffstart = s - SvPVX(PL_linestr);
11887     char *tstart;
11888  
11889     PL_realtokenstart = -1;
11890 #endif
11891
11892     PERL_ARGS_ASSERT_SCAN_HEREDOC;
11893
11894     s += 2;
11895     d = PL_tokenbuf;
11896     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
11897     if (!outer)
11898         *d++ = '\n';
11899     peek = s;
11900     while (SPACE_OR_TAB(*peek))
11901         peek++;
11902     if (*peek == '`' || *peek == '\'' || *peek =='"') {
11903         s = peek;
11904         term = *s++;
11905         s = delimcpy(d, e, s, PL_bufend, term, &len);
11906         d += len;
11907         if (s < PL_bufend)
11908             s++;
11909     }
11910     else {
11911         if (*s == '\\')
11912             s++, term = '\'';
11913         else
11914             term = '"';
11915         if (!isALNUM_lazy_if(s,UTF))
11916             deprecate("bare << to mean <<\"\"");
11917         for (; isALNUM_lazy_if(s,UTF); s++) {
11918             if (d < e)
11919                 *d++ = *s;
11920         }
11921     }
11922     if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
11923         Perl_croak(aTHX_ "Delimiter for here document is too long");
11924     *d++ = '\n';
11925     *d = '\0';
11926     len = d - PL_tokenbuf;
11927
11928 #ifdef PERL_MAD
11929     if (PL_madskills) {
11930         tstart = PL_tokenbuf + !outer;
11931         PL_thisclose = newSVpvn(tstart, len - !outer);
11932         tstart = SvPVX(PL_linestr) + stuffstart;
11933         PL_thisopen = newSVpvn(tstart, s - tstart);
11934         stuffstart = s - SvPVX(PL_linestr);
11935     }
11936 #endif
11937 #ifndef PERL_STRICT_CR
11938     d = strchr(s, '\r');
11939     if (d) {
11940         char * const olds = s;
11941         s = d;
11942         while (s < PL_bufend) {
11943             if (*s == '\r') {
11944                 *d++ = '\n';
11945                 if (*++s == '\n')
11946                     s++;
11947             }
11948             else if (*s == '\n' && s[1] == '\r') {      /* \015\013 on a mac? */
11949                 *d++ = *s++;
11950                 s++;
11951             }
11952             else
11953                 *d++ = *s++;
11954         }
11955         *d = '\0';
11956         PL_bufend = d;
11957         SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
11958         s = olds;
11959     }
11960 #endif
11961 #ifdef PERL_MAD
11962     found_newline = 0;
11963 #endif
11964     if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
11965         herewas = newSVpvn(s,PL_bufend-s);
11966     }
11967     else {
11968 #ifdef PERL_MAD
11969         herewas = newSVpvn(s-1,found_newline-s+1);
11970 #else
11971         s--;
11972         herewas = newSVpvn(s,found_newline-s);
11973 #endif
11974     }
11975 #ifdef PERL_MAD
11976     if (PL_madskills) {
11977         tstart = SvPVX(PL_linestr) + stuffstart;
11978         if (PL_thisstuff)
11979             sv_catpvn(PL_thisstuff, tstart, s - tstart);
11980         else
11981             PL_thisstuff = newSVpvn(tstart, s - tstart);
11982     }
11983 #endif
11984     s += SvCUR(herewas);
11985
11986 #ifdef PERL_MAD
11987     stuffstart = s - SvPVX(PL_linestr);
11988
11989     if (found_newline)
11990         s--;
11991 #endif
11992
11993     tmpstr = newSV_type(SVt_PVIV);
11994     SvGROW(tmpstr, 80);
11995     if (term == '\'') {
11996         op_type = OP_CONST;
11997         SvIV_set(tmpstr, -1);
11998     }
11999     else if (term == '`') {
12000         op_type = OP_BACKTICK;
12001         SvIV_set(tmpstr, '\\');
12002     }
12003
12004     CLINE;
12005     PL_multi_start = CopLINE(PL_curcop);
12006     PL_multi_open = PL_multi_close = '<';
12007     term = *PL_tokenbuf;
12008     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
12009         char * const bufptr = PL_sublex_info.super_bufptr;
12010         char * const bufend = PL_sublex_info.super_bufend;
12011         char * const olds = s - SvCUR(herewas);
12012         s = strchr(bufptr, '\n');
12013         if (!s)
12014             s = bufend;
12015         d = s;
12016         while (s < bufend &&
12017           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12018             if (*s++ == '\n')
12019                 CopLINE_inc(PL_curcop);
12020         }
12021         if (s >= bufend) {
12022             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12023             missingterm(PL_tokenbuf);
12024         }
12025         sv_setpvn(herewas,bufptr,d-bufptr+1);
12026         sv_setpvn(tmpstr,d+1,s-d);
12027         s += len - 1;
12028         sv_catpvn(herewas,s,bufend-s);
12029         Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
12030
12031         s = olds;
12032         goto retval;
12033     }
12034     else if (!outer) {
12035         d = s;
12036         while (s < PL_bufend &&
12037           (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12038             if (*s++ == '\n')
12039                 CopLINE_inc(PL_curcop);
12040         }
12041         if (s >= PL_bufend) {
12042             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12043             missingterm(PL_tokenbuf);
12044         }
12045         sv_setpvn(tmpstr,d+1,s-d);
12046 #ifdef PERL_MAD
12047         if (PL_madskills) {
12048             if (PL_thisstuff)
12049                 sv_catpvn(PL_thisstuff, d + 1, s - d);
12050             else
12051                 PL_thisstuff = newSVpvn(d + 1, s - d);
12052             stuffstart = s - SvPVX(PL_linestr);
12053         }
12054 #endif
12055         s += len - 1;
12056         CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
12057
12058         sv_catpvn(herewas,s,PL_bufend-s);
12059         sv_setsv(PL_linestr,herewas);
12060         PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
12061         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12062         PL_last_lop = PL_last_uni = NULL;
12063     }
12064     else
12065         sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
12066     while (s >= PL_bufend) {    /* multiple line string? */
12067 #ifdef PERL_MAD
12068         if (PL_madskills) {
12069             tstart = SvPVX(PL_linestr) + stuffstart;
12070             if (PL_thisstuff)
12071                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12072             else
12073                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12074         }
12075 #endif
12076         PL_bufptr = s;
12077         CopLINE_inc(PL_curcop);
12078         if (!outer || !lex_next_chunk(0)) {
12079             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12080             missingterm(PL_tokenbuf);
12081         }
12082         CopLINE_dec(PL_curcop);
12083         s = PL_bufptr;
12084 #ifdef PERL_MAD
12085         stuffstart = s - SvPVX(PL_linestr);
12086 #endif
12087         CopLINE_inc(PL_curcop);
12088         PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12089         PL_last_lop = PL_last_uni = NULL;
12090 #ifndef PERL_STRICT_CR
12091         if (PL_bufend - PL_linestart >= 2) {
12092             if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
12093                 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
12094             {
12095                 PL_bufend[-2] = '\n';
12096                 PL_bufend--;
12097                 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
12098             }
12099             else if (PL_bufend[-1] == '\r')
12100                 PL_bufend[-1] = '\n';
12101         }
12102         else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
12103             PL_bufend[-1] = '\n';
12104 #endif
12105         if (*s == term && memEQ(s,PL_tokenbuf,len)) {
12106             STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
12107             *(SvPVX(PL_linestr) + off ) = ' ';
12108             sv_catsv(PL_linestr,herewas);
12109             PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
12110             s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
12111         }
12112         else {
12113             s = PL_bufend;
12114             sv_catsv(tmpstr,PL_linestr);
12115         }
12116     }
12117     s++;
12118 retval:
12119     PL_multi_end = CopLINE(PL_curcop);
12120     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
12121         SvPV_shrink_to_cur(tmpstr);
12122     }
12123     SvREFCNT_dec(herewas);
12124     if (!IN_BYTES) {
12125         if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
12126             SvUTF8_on(tmpstr);
12127         else if (PL_encoding)
12128             sv_recode_to_utf8(tmpstr, PL_encoding);
12129     }
12130     PL_lex_stuff = tmpstr;
12131     pl_yylval.ival = op_type;
12132     return s;
12133 }
12134
12135 /* scan_inputsymbol
12136    takes: current position in input buffer
12137    returns: new position in input buffer
12138    side-effects: pl_yylval and lex_op are set.
12139
12140    This code handles:
12141
12142    <>           read from ARGV
12143    <FH>         read from filehandle
12144    <pkg::FH>    read from package qualified filehandle
12145    <pkg'FH>     read from package qualified filehandle
12146    <$fh>        read from filehandle in $fh
12147    <*.h>        filename glob
12148
12149 */
12150
12151 STATIC char *
12152 S_scan_inputsymbol(pTHX_ char *start)
12153 {
12154     dVAR;
12155     register char *s = start;           /* current position in buffer */
12156     char *end;
12157     I32 len;
12158     char *d = PL_tokenbuf;                                      /* start of temp holding space */
12159     const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;    /* end of temp holding space */
12160
12161     PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
12162
12163     end = strchr(s, '\n');
12164     if (!end)
12165         end = PL_bufend;
12166     s = delimcpy(d, e, s + 1, end, '>', &len);  /* extract until > */
12167
12168     /* die if we didn't have space for the contents of the <>,
12169        or if it didn't end, or if we see a newline
12170     */
12171
12172     if (len >= (I32)sizeof PL_tokenbuf)
12173         Perl_croak(aTHX_ "Excessively long <> operator");
12174     if (s >= end)
12175         Perl_croak(aTHX_ "Unterminated <> operator");
12176
12177     s++;
12178
12179     /* check for <$fh>
12180        Remember, only scalar variables are interpreted as filehandles by
12181        this code.  Anything more complex (e.g., <$fh{$num}>) will be
12182        treated as a glob() call.
12183        This code makes use of the fact that except for the $ at the front,
12184        a scalar variable and a filehandle look the same.
12185     */
12186     if (*d == '$' && d[1]) d++;
12187
12188     /* allow <Pkg'VALUE> or <Pkg::VALUE> */
12189     while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
12190         d++;
12191
12192     /* If we've tried to read what we allow filehandles to look like, and
12193        there's still text left, then it must be a glob() and not a getline.
12194        Use scan_str to pull out the stuff between the <> and treat it
12195        as nothing more than a string.
12196     */
12197
12198     if (d - PL_tokenbuf != len) {
12199         pl_yylval.ival = OP_GLOB;
12200         s = scan_str(start,!!PL_madskills,FALSE);
12201         if (!s)
12202            Perl_croak(aTHX_ "Glob not terminated");
12203         return s;
12204     }
12205     else {
12206         bool readline_overriden = FALSE;
12207         GV *gv_readline;
12208         GV **gvp;
12209         /* we're in a filehandle read situation */
12210         d = PL_tokenbuf;
12211
12212         /* turn <> into <ARGV> */
12213         if (!len)
12214             Copy("ARGV",d,5,char);
12215
12216         /* Check whether readline() is overriden */
12217         gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
12218         if ((gv_readline
12219                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
12220                 ||
12221                 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
12222                  && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
12223                 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
12224             readline_overriden = TRUE;
12225
12226         /* if <$fh>, create the ops to turn the variable into a
12227            filehandle
12228         */
12229         if (*d == '$') {
12230             /* try to find it in the pad for this block, otherwise find
12231                add symbol table ops
12232             */
12233             const PADOFFSET tmp = pad_findmy(d, len, 0);
12234             if (tmp != NOT_IN_PAD) {
12235                 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
12236                     HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
12237                     HEK * const stashname = HvNAME_HEK(stash);
12238                     SV * const sym = sv_2mortal(newSVhek(stashname));
12239                     sv_catpvs(sym, "::");
12240                     sv_catpv(sym, d+1);
12241                     d = SvPVX(sym);
12242                     goto intro_sym;
12243                 }
12244                 else {
12245                     OP * const o = newOP(OP_PADSV, 0);
12246                     o->op_targ = tmp;
12247                     PL_lex_op = readline_overriden
12248                         ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12249                                 append_elem(OP_LIST, o,
12250                                     newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
12251                         : (OP*)newUNOP(OP_READLINE, 0, o);
12252                 }
12253             }
12254             else {
12255                 GV *gv;
12256                 ++d;
12257 intro_sym:
12258                 gv = gv_fetchpv(d,
12259                                 (PL_in_eval
12260                                  ? (GV_ADDMULTI | GV_ADDINEVAL)
12261                                  : GV_ADDMULTI),
12262                                 SVt_PV);
12263                 PL_lex_op = readline_overriden
12264                     ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12265                             append_elem(OP_LIST,
12266                                 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
12267                                 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12268                     : (OP*)newUNOP(OP_READLINE, 0,
12269                             newUNOP(OP_RV2SV, 0,
12270                                 newGVOP(OP_GV, 0, gv)));
12271             }
12272             if (!readline_overriden)
12273                 PL_lex_op->op_flags |= OPf_SPECIAL;
12274             /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
12275             pl_yylval.ival = OP_NULL;
12276         }
12277
12278         /* If it's none of the above, it must be a literal filehandle
12279            (<Foo::BAR> or <FOO>) so build a simple readline OP */
12280         else {
12281             GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
12282             PL_lex_op = readline_overriden
12283                 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12284                         append_elem(OP_LIST,
12285                             newGVOP(OP_GV, 0, gv),
12286                             newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12287                 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
12288             pl_yylval.ival = OP_NULL;
12289         }
12290     }
12291
12292     return s;
12293 }
12294
12295
12296 /* scan_str
12297    takes: start position in buffer
12298           keep_quoted preserve \ on the embedded delimiter(s)
12299           keep_delims preserve the delimiters around the string
12300    returns: position to continue reading from buffer
12301    side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
12302         updates the read buffer.
12303
12304    This subroutine pulls a string out of the input.  It is called for:
12305         q               single quotes           q(literal text)
12306         '               single quotes           'literal text'
12307         qq              double quotes           qq(interpolate $here please)
12308         "               double quotes           "interpolate $here please"
12309         qx              backticks               qx(/bin/ls -l)
12310         `               backticks               `/bin/ls -l`
12311         qw              quote words             @EXPORT_OK = qw( func() $spam )
12312         m//             regexp match            m/this/
12313         s///            regexp substitute       s/this/that/
12314         tr///           string transliterate    tr/this/that/
12315         y///            string transliterate    y/this/that/
12316         ($*@)           sub prototypes          sub foo ($)
12317         (stuff)         sub attr parameters     sub foo : attr(stuff)
12318         <>              readline or globs       <FOO>, <>, <$fh>, or <*.c>
12319         
12320    In most of these cases (all but <>, patterns and transliterate)
12321    yylex() calls scan_str().  m// makes yylex() call scan_pat() which
12322    calls scan_str().  s/// makes yylex() call scan_subst() which calls
12323    scan_str().  tr/// and y/// make yylex() call scan_trans() which
12324    calls scan_str().
12325
12326    It skips whitespace before the string starts, and treats the first
12327    character as the delimiter.  If the delimiter is one of ([{< then
12328    the corresponding "close" character )]}> is used as the closing
12329    delimiter.  It allows quoting of delimiters, and if the string has
12330    balanced delimiters ([{<>}]) it allows nesting.
12331
12332    On success, the SV with the resulting string is put into lex_stuff or,
12333    if that is already non-NULL, into lex_repl. The second case occurs only
12334    when parsing the RHS of the special constructs s/// and tr/// (y///).
12335    For convenience, the terminating delimiter character is stuffed into
12336    SvIVX of the SV.
12337 */
12338
12339 STATIC char *
12340 S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
12341 {
12342     dVAR;
12343     SV *sv;                             /* scalar value: string */
12344     const char *tmps;                   /* temp string, used for delimiter matching */
12345     register char *s = start;           /* current position in the buffer */
12346     register char term;                 /* terminating character */
12347     register char *to;                  /* current position in the sv's data */
12348     I32 brackets = 1;                   /* bracket nesting level */
12349     bool has_utf8 = FALSE;              /* is there any utf8 content? */
12350     I32 termcode;                       /* terminating char. code */
12351     U8 termstr[UTF8_MAXBYTES];          /* terminating string */
12352     STRLEN termlen;                     /* length of terminating string */
12353     int last_off = 0;                   /* last position for nesting bracket */
12354 #ifdef PERL_MAD
12355     int stuffstart;
12356     char *tstart;
12357 #endif
12358
12359     PERL_ARGS_ASSERT_SCAN_STR;
12360
12361     /* skip space before the delimiter */
12362     if (isSPACE(*s)) {
12363         s = PEEKSPACE(s);
12364     }
12365
12366 #ifdef PERL_MAD
12367     if (PL_realtokenstart >= 0) {
12368         stuffstart = PL_realtokenstart;
12369         PL_realtokenstart = -1;
12370     }
12371     else
12372         stuffstart = start - SvPVX(PL_linestr);
12373 #endif
12374     /* mark where we are, in case we need to report errors */
12375     CLINE;
12376
12377     /* after skipping whitespace, the next character is the terminator */
12378     term = *s;
12379     if (!UTF) {
12380         termcode = termstr[0] = term;
12381         termlen = 1;
12382     }
12383     else {
12384         termcode = utf8_to_uvchr((U8*)s, &termlen);
12385         Copy(s, termstr, termlen, U8);
12386         if (!UTF8_IS_INVARIANT(term))
12387             has_utf8 = TRUE;
12388     }
12389
12390     /* mark where we are */
12391     PL_multi_start = CopLINE(PL_curcop);
12392     PL_multi_open = term;
12393
12394     /* find corresponding closing delimiter */
12395     if (term && (tmps = strchr("([{< )]}> )]}>",term)))
12396         termcode = termstr[0] = term = tmps[5];
12397
12398     PL_multi_close = term;
12399
12400     /* create a new SV to hold the contents.  79 is the SV's initial length.
12401        What a random number. */
12402     sv = newSV_type(SVt_PVIV);
12403     SvGROW(sv, 80);
12404     SvIV_set(sv, termcode);
12405     (void)SvPOK_only(sv);               /* validate pointer */
12406
12407     /* move past delimiter and try to read a complete string */
12408     if (keep_delims)
12409         sv_catpvn(sv, s, termlen);
12410     s += termlen;
12411 #ifdef PERL_MAD
12412     tstart = SvPVX(PL_linestr) + stuffstart;
12413     if (!PL_thisopen && !keep_delims) {
12414         PL_thisopen = newSVpvn(tstart, s - tstart);
12415         stuffstart = s - SvPVX(PL_linestr);
12416     }
12417 #endif
12418     for (;;) {
12419         if (PL_encoding && !UTF) {
12420             bool cont = TRUE;
12421
12422             while (cont) {
12423                 int offset = s - SvPVX_const(PL_linestr);
12424                 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
12425                                            &offset, (char*)termstr, termlen);
12426                 const char * const ns = SvPVX_const(PL_linestr) + offset;
12427                 char * const svlast = SvEND(sv) - 1;
12428
12429                 for (; s < ns; s++) {
12430                     if (*s == '\n' && !PL_rsfp)
12431                         CopLINE_inc(PL_curcop);
12432                 }
12433                 if (!found)
12434                     goto read_more_line;
12435                 else {
12436                     /* handle quoted delimiters */
12437                     if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
12438                         const char *t;
12439                         for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
12440                             t--;
12441                         if ((svlast-1 - t) % 2) {
12442                             if (!keep_quoted) {
12443                                 *(svlast-1) = term;
12444                                 *svlast = '\0';
12445                                 SvCUR_set(sv, SvCUR(sv) - 1);
12446                             }
12447                             continue;
12448                         }
12449                     }
12450                     if (PL_multi_open == PL_multi_close) {
12451                         cont = FALSE;
12452                     }
12453                     else {
12454                         const char *t;
12455                         char *w;
12456                         for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
12457                             /* At here, all closes are "was quoted" one,
12458                                so we don't check PL_multi_close. */
12459                             if (*t == '\\') {
12460                                 if (!keep_quoted && *(t+1) == PL_multi_open)
12461                                     t++;
12462                                 else
12463                                     *w++ = *t++;
12464                             }
12465                             else if (*t == PL_multi_open)
12466                                 brackets++;
12467
12468                             *w = *t;
12469                         }
12470                         if (w < t) {
12471                             *w++ = term;
12472                             *w = '\0';
12473                             SvCUR_set(sv, w - SvPVX_const(sv));
12474                         }
12475                         last_off = w - SvPVX(sv);
12476                         if (--brackets <= 0)
12477                             cont = FALSE;
12478                     }
12479                 }
12480             }
12481             if (!keep_delims) {
12482                 SvCUR_set(sv, SvCUR(sv) - 1);
12483                 *SvEND(sv) = '\0';
12484             }
12485             break;
12486         }
12487
12488         /* extend sv if need be */
12489         SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
12490         /* set 'to' to the next character in the sv's string */
12491         to = SvPVX(sv)+SvCUR(sv);
12492
12493         /* if open delimiter is the close delimiter read unbridle */
12494         if (PL_multi_open == PL_multi_close) {
12495             for (; s < PL_bufend; s++,to++) {
12496                 /* embedded newlines increment the current line number */
12497                 if (*s == '\n' && !PL_rsfp)
12498                     CopLINE_inc(PL_curcop);
12499                 /* handle quoted delimiters */
12500                 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
12501                     if (!keep_quoted && s[1] == term)
12502                         s++;
12503                 /* any other quotes are simply copied straight through */
12504                     else
12505                         *to++ = *s++;
12506                 }
12507                 /* terminate when run out of buffer (the for() condition), or
12508                    have found the terminator */
12509                 else if (*s == term) {
12510                     if (termlen == 1)
12511                         break;
12512                     if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
12513                         break;
12514                 }
12515                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12516                     has_utf8 = TRUE;
12517                 *to = *s;
12518             }
12519         }
12520         
12521         /* if the terminator isn't the same as the start character (e.g.,
12522            matched brackets), we have to allow more in the quoting, and
12523            be prepared for nested brackets.
12524         */
12525         else {
12526             /* read until we run out of string, or we find the terminator */
12527             for (; s < PL_bufend; s++,to++) {
12528                 /* embedded newlines increment the line count */
12529                 if (*s == '\n' && !PL_rsfp)
12530                     CopLINE_inc(PL_curcop);
12531                 /* backslashes can escape the open or closing characters */
12532                 if (*s == '\\' && s+1 < PL_bufend) {
12533                     if (!keep_quoted &&
12534                         ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
12535                         s++;
12536                     else
12537                         *to++ = *s++;
12538                 }
12539                 /* allow nested opens and closes */
12540                 else if (*s == PL_multi_close && --brackets <= 0)
12541                     break;
12542                 else if (*s == PL_multi_open)
12543                     brackets++;
12544                 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
12545                     has_utf8 = TRUE;
12546                 *to = *s;
12547             }
12548         }
12549         /* terminate the copied string and update the sv's end-of-string */
12550         *to = '\0';
12551         SvCUR_set(sv, to - SvPVX_const(sv));
12552
12553         /*
12554          * this next chunk reads more into the buffer if we're not done yet
12555          */
12556
12557         if (s < PL_bufend)
12558             break;              /* handle case where we are done yet :-) */
12559
12560 #ifndef PERL_STRICT_CR
12561         if (to - SvPVX_const(sv) >= 2) {
12562             if ((to[-2] == '\r' && to[-1] == '\n') ||
12563                 (to[-2] == '\n' && to[-1] == '\r'))
12564             {
12565                 to[-2] = '\n';
12566                 to--;
12567                 SvCUR_set(sv, to - SvPVX_const(sv));
12568             }
12569             else if (to[-1] == '\r')
12570                 to[-1] = '\n';
12571         }
12572         else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
12573             to[-1] = '\n';
12574 #endif
12575         
12576      read_more_line:
12577         /* if we're out of file, or a read fails, bail and reset the current
12578            line marker so we can report where the unterminated string began
12579         */
12580 #ifdef PERL_MAD
12581         if (PL_madskills) {
12582             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12583             if (PL_thisstuff)
12584                 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
12585             else
12586                 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
12587         }
12588 #endif
12589         CopLINE_inc(PL_curcop);
12590         PL_bufptr = PL_bufend;
12591         if (!lex_next_chunk(0)) {
12592             sv_free(sv);
12593             CopLINE_set(PL_curcop, (line_t)PL_multi_start);
12594             return NULL;
12595         }
12596         s = PL_bufptr;
12597 #ifdef PERL_MAD
12598         stuffstart = 0;
12599 #endif
12600     }
12601
12602     /* at this point, we have successfully read the delimited string */
12603
12604     if (!PL_encoding || UTF) {
12605 #ifdef PERL_MAD
12606         if (PL_madskills) {
12607             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12608             const int len = s - tstart;
12609             if (PL_thisstuff)
12610                 sv_catpvn(PL_thisstuff, tstart, len);
12611             else
12612                 PL_thisstuff = newSVpvn(tstart, len);
12613             if (!PL_thisclose && !keep_delims)
12614                 PL_thisclose = newSVpvn(s,termlen);
12615         }
12616 #endif
12617
12618         if (keep_delims)
12619             sv_catpvn(sv, s, termlen);
12620         s += termlen;
12621     }
12622 #ifdef PERL_MAD
12623     else {
12624         if (PL_madskills) {
12625             char * const tstart = SvPVX(PL_linestr) + stuffstart;
12626             const int len = s - tstart - termlen;
12627             if (PL_thisstuff)
12628                 sv_catpvn(PL_thisstuff, tstart, len);
12629             else
12630                 PL_thisstuff = newSVpvn(tstart, len);
12631             if (!PL_thisclose && !keep_delims)
12632                 PL_thisclose = newSVpvn(s - termlen,termlen);
12633         }
12634     }
12635 #endif
12636     if (has_utf8 || PL_encoding)
12637         SvUTF8_on(sv);
12638
12639     PL_multi_end = CopLINE(PL_curcop);
12640
12641     /* if we allocated too much space, give some back */
12642     if (SvCUR(sv) + 5 < SvLEN(sv)) {
12643         SvLEN_set(sv, SvCUR(sv) + 1);
12644         SvPV_renew(sv, SvLEN(sv));
12645     }
12646
12647     /* decide whether this is the first or second quoted string we've read
12648        for this op
12649     */
12650
12651     if (PL_lex_stuff)
12652         PL_lex_repl = sv;
12653     else
12654         PL_lex_stuff = sv;
12655     return s;
12656 }
12657
12658 /*
12659   scan_num
12660   takes: pointer to position in buffer
12661   returns: pointer to new position in buffer
12662   side-effects: builds ops for the constant in pl_yylval.op
12663
12664   Read a number in any of the formats that Perl accepts:
12665
12666   \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*)      12 12.34 12.
12667   \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*)                     .34
12668   0b[01](_?[01])*
12669   0[0-7](_?[0-7])*
12670   0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
12671
12672   Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
12673   thing it reads.
12674
12675   If it reads a number without a decimal point or an exponent, it will
12676   try converting the number to an integer and see if it can do so
12677   without loss of precision.
12678 */
12679
12680 char *
12681 Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
12682 {
12683     dVAR;
12684     register const char *s = start;     /* current position in buffer */
12685     register char *d;                   /* destination in temp buffer */
12686     register char *e;                   /* end of temp buffer */
12687     NV nv;                              /* number read, as a double */
12688     SV *sv = NULL;                      /* place to put the converted number */
12689     bool floatit;                       /* boolean: int or float? */
12690     const char *lastub = NULL;          /* position of last underbar */
12691     static char const number_too_long[] = "Number too long";
12692
12693     PERL_ARGS_ASSERT_SCAN_NUM;
12694
12695     /* We use the first character to decide what type of number this is */
12696
12697     switch (*s) {
12698     default:
12699       Perl_croak(aTHX_ "panic: scan_num");
12700
12701     /* if it starts with a 0, it could be an octal number, a decimal in
12702        0.13 disguise, or a hexadecimal number, or a binary number. */
12703     case '0':
12704         {
12705           /* variables:
12706              u          holds the "number so far"
12707              shift      the power of 2 of the base
12708                         (hex == 4, octal == 3, binary == 1)
12709              overflowed was the number more than we can hold?
12710
12711              Shift is used when we add a digit.  It also serves as an "are
12712              we in octal/hex/binary?" indicator to disallow hex characters
12713              when in octal mode.
12714            */
12715             NV n = 0.0;
12716             UV u = 0;
12717             I32 shift;
12718             bool overflowed = FALSE;
12719             bool just_zero  = TRUE;     /* just plain 0 or binary number? */
12720             static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
12721             static const char* const bases[5] =
12722               { "", "binary", "", "octal", "hexadecimal" };
12723             static const char* const Bases[5] =
12724               { "", "Binary", "", "Octal", "Hexadecimal" };
12725             static const char* const maxima[5] =
12726               { "",
12727                 "0b11111111111111111111111111111111",
12728                 "",
12729                 "037777777777",
12730                 "0xffffffff" };
12731             const char *base, *Base, *max;
12732
12733             /* check for hex */
12734             if (s[1] == 'x') {
12735                 shift = 4;
12736                 s += 2;
12737                 just_zero = FALSE;
12738             } else if (s[1] == 'b') {
12739                 shift = 1;
12740                 s += 2;
12741                 just_zero = FALSE;
12742             }
12743             /* check for a decimal in disguise */
12744             else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
12745                 goto decimal;
12746             /* so it must be octal */
12747             else {
12748                 shift = 3;
12749                 s++;
12750             }
12751
12752             if (*s == '_') {
12753                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12754                                "Misplaced _ in number");
12755                lastub = s++;
12756             }
12757
12758             base = bases[shift];
12759             Base = Bases[shift];
12760             max  = maxima[shift];
12761
12762             /* read the rest of the number */
12763             for (;;) {
12764                 /* x is used in the overflow test,
12765                    b is the digit we're adding on. */
12766                 UV x, b;
12767
12768                 switch (*s) {
12769
12770                 /* if we don't mention it, we're done */
12771                 default:
12772                     goto out;
12773
12774                 /* _ are ignored -- but warned about if consecutive */
12775                 case '_':
12776                     if (lastub && s == lastub + 1)
12777                         Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12778                                        "Misplaced _ in number");
12779                     lastub = s++;
12780                     break;
12781
12782                 /* 8 and 9 are not octal */
12783                 case '8': case '9':
12784                     if (shift == 3)
12785                         yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
12786                     /* FALL THROUGH */
12787
12788                 /* octal digits */
12789                 case '2': case '3': case '4':
12790                 case '5': case '6': case '7':
12791                     if (shift == 1)
12792                         yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
12793                     /* FALL THROUGH */
12794
12795                 case '0': case '1':
12796                     b = *s++ & 15;              /* ASCII digit -> value of digit */
12797                     goto digit;
12798
12799                 /* hex digits */
12800                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12801                 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
12802                     /* make sure they said 0x */
12803                     if (shift != 4)
12804                         goto out;
12805                     b = (*s++ & 7) + 9;
12806
12807                     /* Prepare to put the digit we have onto the end
12808                        of the number so far.  We check for overflows.
12809                     */
12810
12811                   digit:
12812                     just_zero = FALSE;
12813                     if (!overflowed) {
12814                         x = u << shift; /* make room for the digit */
12815
12816                         if ((x >> shift) != u
12817                             && !(PL_hints & HINT_NEW_BINARY)) {
12818                             overflowed = TRUE;
12819                             n = (NV) u;
12820                             Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
12821                                              "Integer overflow in %s number",
12822                                              base);
12823                         } else
12824                             u = x | b;          /* add the digit to the end */
12825                     }
12826                     if (overflowed) {
12827                         n *= nvshift[shift];
12828                         /* If an NV has not enough bits in its
12829                          * mantissa to represent an UV this summing of
12830                          * small low-order numbers is a waste of time
12831                          * (because the NV cannot preserve the
12832                          * low-order bits anyway): we could just
12833                          * remember when did we overflow and in the
12834                          * end just multiply n by the right
12835                          * amount. */
12836                         n += (NV) b;
12837                     }
12838                     break;
12839                 }
12840             }
12841
12842           /* if we get here, we had success: make a scalar value from
12843              the number.
12844           */
12845           out:
12846
12847             /* final misplaced underbar check */
12848             if (s[-1] == '_') {
12849                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
12850             }
12851
12852             sv = newSV(0);
12853             if (overflowed) {
12854                 if (n > 4294967295.0)
12855                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
12856                                    "%s number > %s non-portable",
12857                                    Base, max);
12858                 sv_setnv(sv, n);
12859             }
12860             else {
12861 #if UVSIZE > 4
12862                 if (u > 0xffffffff)
12863                     Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
12864                                    "%s number > %s non-portable",
12865                                    Base, max);
12866 #endif
12867                 sv_setuv(sv, u);
12868             }
12869             if (just_zero && (PL_hints & HINT_NEW_INTEGER))
12870                 sv = new_constant(start, s - start, "integer",
12871                                   sv, NULL, NULL, 0);
12872             else if (PL_hints & HINT_NEW_BINARY)
12873                 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
12874         }
12875         break;
12876
12877     /*
12878       handle decimal numbers.
12879       we're also sent here when we read a 0 as the first digit
12880     */
12881     case '1': case '2': case '3': case '4': case '5':
12882     case '6': case '7': case '8': case '9': case '.':
12883       decimal:
12884         d = PL_tokenbuf;
12885         e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
12886         floatit = FALSE;
12887
12888         /* read next group of digits and _ and copy into d */
12889         while (isDIGIT(*s) || *s == '_') {
12890             /* skip underscores, checking for misplaced ones
12891                if -w is on
12892             */
12893             if (*s == '_') {
12894                 if (lastub && s == lastub + 1)
12895                     Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12896                                    "Misplaced _ in number");
12897                 lastub = s++;
12898             }
12899             else {
12900                 /* check for end of fixed-length buffer */
12901                 if (d >= e)
12902                     Perl_croak(aTHX_ number_too_long);
12903                 /* if we're ok, copy the character */
12904                 *d++ = *s++;
12905             }
12906         }
12907
12908         /* final misplaced underbar check */
12909         if (lastub && s == lastub + 1) {
12910             Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
12911         }
12912
12913         /* read a decimal portion if there is one.  avoid
12914            3..5 being interpreted as the number 3. followed
12915            by .5
12916         */
12917         if (*s == '.' && s[1] != '.') {
12918             floatit = TRUE;
12919             *d++ = *s++;
12920
12921             if (*s == '_') {
12922                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12923                                "Misplaced _ in number");
12924                 lastub = s;
12925             }
12926
12927             /* copy, ignoring underbars, until we run out of digits.
12928             */
12929             for (; isDIGIT(*s) || *s == '_'; s++) {
12930                 /* fixed length buffer check */
12931                 if (d >= e)
12932                     Perl_croak(aTHX_ number_too_long);
12933                 if (*s == '_') {
12934                    if (lastub && s == lastub + 1)
12935                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12936                                       "Misplaced _ in number");
12937                    lastub = s;
12938                 }
12939                 else
12940                     *d++ = *s;
12941             }
12942             /* fractional part ending in underbar? */
12943             if (s[-1] == '_') {
12944                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12945                                "Misplaced _ in number");
12946             }
12947             if (*s == '.' && isDIGIT(s[1])) {
12948                 /* oops, it's really a v-string, but without the "v" */
12949                 s = start;
12950                 goto vstring;
12951             }
12952         }
12953
12954         /* read exponent part, if present */
12955         if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
12956             floatit = TRUE;
12957             s++;
12958
12959             /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
12960             *d++ = 'e';         /* At least some Mach atof()s don't grok 'E' */
12961
12962             /* stray preinitial _ */
12963             if (*s == '_') {
12964                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12965                                "Misplaced _ in number");
12966                 lastub = s++;
12967             }
12968
12969             /* allow positive or negative exponent */
12970             if (*s == '+' || *s == '-')
12971                 *d++ = *s++;
12972
12973             /* stray initial _ */
12974             if (*s == '_') {
12975                 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12976                                "Misplaced _ in number");
12977                 lastub = s++;
12978             }
12979
12980             /* read digits of exponent */
12981             while (isDIGIT(*s) || *s == '_') {
12982                 if (isDIGIT(*s)) {
12983                     if (d >= e)
12984                         Perl_croak(aTHX_ number_too_long);
12985                     *d++ = *s++;
12986                 }
12987                 else {
12988                    if (((lastub && s == lastub + 1) ||
12989                         (!isDIGIT(s[1]) && s[1] != '_')))
12990                        Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12991                                       "Misplaced _ in number");
12992                    lastub = s++;
12993                 }
12994             }
12995         }
12996
12997
12998         /* make an sv from the string */
12999         sv = newSV(0);
13000
13001         /*
13002            We try to do an integer conversion first if no characters
13003            indicating "float" have been found.
13004          */
13005
13006         if (!floatit) {
13007             UV uv;
13008             const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
13009
13010             if (flags == IS_NUMBER_IN_UV) {
13011               if (uv <= IV_MAX)
13012                 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
13013               else
13014                 sv_setuv(sv, uv);
13015             } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
13016               if (uv <= (UV) IV_MIN)
13017                 sv_setiv(sv, -(IV)uv);
13018               else
13019                 floatit = TRUE;
13020             } else
13021               floatit = TRUE;
13022         }
13023         if (floatit) {
13024             /* terminate the string */
13025             *d = '\0';
13026             nv = Atof(PL_tokenbuf);
13027             sv_setnv(sv, nv);
13028         }
13029
13030         if ( floatit
13031              ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
13032             const char *const key = floatit ? "float" : "integer";
13033             const STRLEN keylen = floatit ? 5 : 7;
13034             sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
13035                                 key, keylen, sv, NULL, NULL, 0);
13036         }
13037         break;
13038
13039     /* if it starts with a v, it could be a v-string */
13040     case 'v':
13041 vstring:
13042                 sv = newSV(5); /* preallocate storage space */
13043                 s = scan_vstring(s, PL_bufend, sv);
13044         break;
13045     }
13046
13047     /* make the op for the constant and return */
13048
13049     if (sv)
13050         lvalp->opval = newSVOP(OP_CONST, 0, sv);
13051     else
13052         lvalp->opval = NULL;
13053
13054     return (char *)s;
13055 }
13056
13057 STATIC char *
13058 S_scan_formline(pTHX_ register char *s)
13059 {
13060     dVAR;
13061     register char *eol;
13062     register char *t;
13063     SV * const stuff = newSVpvs("");
13064     bool needargs = FALSE;
13065     bool eofmt = FALSE;
13066 #ifdef PERL_MAD
13067     char *tokenstart = s;
13068     SV* savewhite = NULL;
13069
13070     if (PL_madskills) {
13071         savewhite = PL_thiswhite;
13072         PL_thiswhite = 0;
13073     }
13074 #endif
13075
13076     PERL_ARGS_ASSERT_SCAN_FORMLINE;
13077
13078     while (!needargs) {
13079         if (*s == '.') {
13080             t = s+1;
13081 #ifdef PERL_STRICT_CR
13082             while (SPACE_OR_TAB(*t))
13083                 t++;
13084 #else
13085             while (SPACE_OR_TAB(*t) || *t == '\r')
13086                 t++;
13087 #endif
13088             if (*t == '\n' || t == PL_bufend) {
13089                 eofmt = TRUE;
13090                 break;
13091             }
13092         }
13093         if (PL_in_eval && !PL_rsfp) {
13094             eol = (char *) memchr(s,'\n',PL_bufend-s);
13095             if (!eol++)
13096                 eol = PL_bufend;
13097         }
13098         else
13099             eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
13100         if (*s != '#') {
13101             for (t = s; t < eol; t++) {
13102                 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
13103                     needargs = FALSE;
13104                     goto enough;        /* ~~ must be first line in formline */
13105                 }
13106                 if (*t == '@' || *t == '^')
13107                     needargs = TRUE;
13108             }
13109             if (eol > s) {
13110                 sv_catpvn(stuff, s, eol-s);
13111 #ifndef PERL_STRICT_CR
13112                 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
13113                     char *end = SvPVX(stuff) + SvCUR(stuff);
13114                     end[-2] = '\n';
13115                     end[-1] = '\0';
13116                     SvCUR_set(stuff, SvCUR(stuff) - 1);
13117                 }
13118 #endif
13119             }
13120             else
13121               break;
13122         }
13123         s = (char*)eol;
13124         if (PL_rsfp) {
13125             bool got_some;
13126 #ifdef PERL_MAD
13127             if (PL_madskills) {
13128                 if (PL_thistoken)
13129                     sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
13130                 else
13131                     PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
13132             }
13133 #endif
13134             PL_bufptr = PL_bufend;
13135             CopLINE_inc(PL_curcop);
13136             got_some = lex_next_chunk(0);
13137             CopLINE_dec(PL_curcop);
13138             s = PL_bufptr;
13139 #ifdef PERL_MAD
13140             tokenstart = PL_bufptr;
13141 #endif
13142             if (!got_some)
13143                 break;
13144         }
13145         incline(s);
13146     }
13147   enough:
13148     if (SvCUR(stuff)) {
13149         PL_expect = XTERM;
13150         if (needargs) {
13151             PL_lex_state = LEX_NORMAL;
13152             start_force(PL_curforce);
13153             NEXTVAL_NEXTTOKE.ival = 0;
13154             force_next(',');
13155         }
13156         else
13157             PL_lex_state = LEX_FORMLINE;
13158         if (!IN_BYTES) {
13159             if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
13160                 SvUTF8_on(stuff);
13161             else if (PL_encoding)
13162                 sv_recode_to_utf8(stuff, PL_encoding);
13163         }
13164         start_force(PL_curforce);
13165         NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
13166         force_next(THING);
13167         start_force(PL_curforce);
13168         NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
13169         force_next(LSTOP);
13170     }
13171     else {
13172         SvREFCNT_dec(stuff);
13173         if (eofmt)
13174             PL_lex_formbrack = 0;
13175         PL_bufptr = s;
13176     }
13177 #ifdef PERL_MAD
13178     if (PL_madskills) {
13179         if (PL_thistoken)
13180             sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
13181         else
13182             PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
13183         PL_thiswhite = savewhite;
13184     }
13185 #endif
13186     return s;
13187 }
13188
13189 I32
13190 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
13191 {
13192     dVAR;
13193     const I32 oldsavestack_ix = PL_savestack_ix;
13194     CV* const outsidecv = PL_compcv;
13195
13196     if (PL_compcv) {
13197         assert(SvTYPE(PL_compcv) == SVt_PVCV);
13198     }
13199     SAVEI32(PL_subline);
13200     save_item(PL_subname);
13201     SAVESPTR(PL_compcv);
13202
13203     PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
13204     CvFLAGS(PL_compcv) |= flags;
13205
13206     PL_subline = CopLINE(PL_curcop);
13207     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
13208     CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
13209     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
13210
13211     return oldsavestack_ix;
13212 }
13213
13214 #ifdef __SC__
13215 #pragma segment Perl_yylex
13216 #endif
13217 static int
13218 S_yywarn(pTHX_ const char *const s)
13219 {
13220     dVAR;
13221
13222     PERL_ARGS_ASSERT_YYWARN;
13223
13224     PL_in_eval |= EVAL_WARNONLY;
13225     yyerror(s);
13226     PL_in_eval &= ~EVAL_WARNONLY;
13227     return 0;
13228 }
13229
13230 int
13231 Perl_yyerror(pTHX_ const char *const s)
13232 {
13233     dVAR;
13234     const char *where = NULL;
13235     const char *context = NULL;
13236     int contlen = -1;
13237     SV *msg;
13238     int yychar  = PL_parser->yychar;
13239
13240     PERL_ARGS_ASSERT_YYERROR;
13241
13242     if (!yychar || (yychar == ';' && !PL_rsfp))
13243         where = "at EOF";
13244     else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
13245       PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
13246       PL_oldbufptr != PL_bufptr) {
13247         /*
13248                 Only for NetWare:
13249                 The code below is removed for NetWare because it abends/crashes on NetWare
13250                 when the script has error such as not having the closing quotes like:
13251                     if ($var eq "value)
13252                 Checking of white spaces is anyway done in NetWare code.
13253         */
13254 #ifndef NETWARE
13255         while (isSPACE(*PL_oldoldbufptr))
13256             PL_oldoldbufptr++;
13257 #endif
13258         context = PL_oldoldbufptr;
13259         contlen = PL_bufptr - PL_oldoldbufptr;
13260     }
13261     else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
13262       PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
13263         /*
13264                 Only for NetWare:
13265                 The code below is removed for NetWare because it abends/crashes on NetWare
13266                 when the script has error such as not having the closing quotes like:
13267                     if ($var eq "value)
13268                 Checking of white spaces is anyway done in NetWare code.
13269         */
13270 #ifndef NETWARE
13271         while (isSPACE(*PL_oldbufptr))
13272             PL_oldbufptr++;
13273 #endif
13274         context = PL_oldbufptr;
13275         contlen = PL_bufptr - PL_oldbufptr;
13276     }
13277     else if (yychar > 255)
13278         where = "next token ???";
13279     else if (yychar == -2) { /* YYEMPTY */
13280         if (PL_lex_state == LEX_NORMAL ||
13281            (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
13282             where = "at end of line";
13283         else if (PL_lex_inpat)
13284             where = "within pattern";
13285         else
13286             where = "within string";
13287     }
13288     else {
13289         SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
13290         if (yychar < 32)
13291             Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
13292         else if (isPRINT_LC(yychar)) {
13293             const char string = yychar;
13294             sv_catpvn(where_sv, &string, 1);
13295         }
13296         else
13297             Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
13298         where = SvPVX_const(where_sv);
13299     }
13300     msg = sv_2mortal(newSVpv(s, 0));
13301     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
13302         OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
13303     if (context)
13304         Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
13305     else
13306         Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
13307     if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
13308         Perl_sv_catpvf(aTHX_ msg,
13309         "  (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
13310                 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
13311         PL_multi_end = 0;
13312     }
13313     if (PL_in_eval & EVAL_WARNONLY) {
13314         Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
13315     }
13316     else
13317         qerror(msg);
13318     if (PL_error_count >= 10) {
13319         if (PL_in_eval && SvCUR(ERRSV))
13320             Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
13321                        SVfARG(ERRSV), OutCopFILE(PL_curcop));
13322         else
13323             Perl_croak(aTHX_ "%s has too many errors.\n",
13324             OutCopFILE(PL_curcop));
13325     }
13326     PL_in_my = 0;
13327     PL_in_my_stash = NULL;
13328     return 0;
13329 }
13330 #ifdef __SC__
13331 #pragma segment Main
13332 #endif
13333
13334 STATIC char*
13335 S_swallow_bom(pTHX_ U8 *s)
13336 {
13337     dVAR;
13338     const STRLEN slen = SvCUR(PL_linestr);
13339
13340     PERL_ARGS_ASSERT_SWALLOW_BOM;
13341
13342     switch (s[0]) {
13343     case 0xFF:
13344         if (s[1] == 0xFE) {
13345             /* UTF-16 little-endian? (or UTF-32LE?) */
13346             if (s[2] == 0 && s[3] == 0)  /* UTF-32 little-endian */
13347                 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
13348 #ifndef PERL_NO_UTF16_FILTER
13349             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
13350             s += 2;
13351             if (PL_bufend > (char*)s) {
13352                 s = add_utf16_textfilter(s, TRUE);
13353             }
13354 #else
13355             Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13356 #endif
13357         }
13358         break;
13359     case 0xFE:
13360         if (s[1] == 0xFF) {   /* UTF-16 big-endian? */
13361 #ifndef PERL_NO_UTF16_FILTER
13362             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
13363             s += 2;
13364             if (PL_bufend > (char *)s) {
13365                 s = add_utf16_textfilter(s, FALSE);
13366             }
13367 #else
13368             Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13369 #endif
13370         }
13371         break;
13372     case 0xEF:
13373         if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
13374             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13375             s += 3;                      /* UTF-8 */
13376         }
13377         break;
13378     case 0:
13379         if (slen > 3) {
13380              if (s[1] == 0) {
13381                   if (s[2] == 0xFE && s[3] == 0xFF) {
13382                        /* UTF-32 big-endian */
13383                        Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
13384                   }
13385              }
13386              else if (s[2] == 0 && s[3] != 0) {
13387                   /* Leading bytes
13388                    * 00 xx 00 xx
13389                    * are a good indicator of UTF-16BE. */
13390 #ifndef PERL_NO_UTF16_FILTER
13391                   if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
13392                   s = add_utf16_textfilter(s, FALSE);
13393 #else
13394                   Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13395 #endif
13396              }
13397         }
13398 #ifdef EBCDIC
13399     case 0xDD:
13400         if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
13401             if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13402             s += 4;                      /* UTF-8 */
13403         }
13404         break;
13405 #endif
13406
13407     default:
13408          if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
13409                   /* Leading bytes
13410                    * xx 00 xx 00
13411                    * are a good indicator of UTF-16LE. */
13412 #ifndef PERL_NO_UTF16_FILTER
13413               if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
13414               s = add_utf16_textfilter(s, TRUE);
13415 #else
13416               Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13417 #endif
13418          }
13419     }
13420     return (char*)s;
13421 }
13422
13423
13424 #ifndef PERL_NO_UTF16_FILTER
13425 static I32
13426 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
13427 {
13428     dVAR;
13429     SV *const filter = FILTER_DATA(idx);
13430     /* We re-use this each time round, throwing the contents away before we
13431        return.  */
13432     SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
13433     SV *const utf8_buffer = filter;
13434     IV status = IoPAGE(filter);
13435     const bool reverse = (bool) IoLINES(filter);
13436     I32 retval;
13437
13438     /* As we're automatically added, at the lowest level, and hence only called
13439        from this file, we can be sure that we're not called in block mode. Hence
13440        don't bother writing code to deal with block mode.  */
13441     if (maxlen) {
13442         Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
13443     }
13444     if (status < 0) {
13445         Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
13446     }
13447     DEBUG_P(PerlIO_printf(Perl_debug_log,
13448                           "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13449                           FPTR2DPTR(void *, S_utf16_textfilter),
13450                           reverse ? 'l' : 'b', idx, maxlen, status,
13451                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13452
13453     while (1) {
13454         STRLEN chars;
13455         STRLEN have;
13456         I32 newlen;
13457         U8 *end;
13458         /* First, look in our buffer of existing UTF-8 data:  */
13459         char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
13460
13461         if (nl) {
13462             ++nl;
13463         } else if (status == 0) {
13464             /* EOF */
13465             IoPAGE(filter) = 0;
13466             nl = SvEND(utf8_buffer);
13467         }
13468         if (nl) {
13469             STRLEN got = nl - SvPVX(utf8_buffer);
13470             /* Did we have anything to append?  */
13471             retval = got != 0;
13472             sv_catpvn(sv, SvPVX(utf8_buffer), got);
13473             /* Everything else in this code works just fine if SVp_POK isn't
13474                set.  This, however, needs it, and we need it to work, else
13475                we loop infinitely because the buffer is never consumed.  */
13476             sv_chop(utf8_buffer, nl);
13477             break;
13478         }
13479
13480         /* OK, not a complete line there, so need to read some more UTF-16.
13481            Read an extra octect if the buffer currently has an odd number. */
13482         while (1) {
13483             if (status <= 0)
13484                 break;
13485             if (SvCUR(utf16_buffer) >= 2) {
13486                 /* Location of the high octet of the last complete code point.
13487                    Gosh, UTF-16 is a pain. All the benefits of variable length,
13488                    *coupled* with all the benefits of partial reads and
13489                    endianness.  */
13490                 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
13491                     + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
13492
13493                 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
13494                     break;
13495                 }
13496
13497                 /* We have the first half of a surrogate. Read more.  */
13498                 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
13499             }
13500
13501             status = FILTER_READ(idx + 1, utf16_buffer,
13502                                  160 + (SvCUR(utf16_buffer) & 1));
13503             DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
13504             DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
13505             if (status < 0) {
13506                 /* Error */
13507                 IoPAGE(filter) = status;
13508                 return status;
13509             }
13510         }
13511
13512         chars = SvCUR(utf16_buffer) >> 1;
13513         have = SvCUR(utf8_buffer);
13514         SvGROW(utf8_buffer, have + chars * 3 + 1);
13515
13516         if (reverse) {
13517             end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
13518                                          (U8*)SvPVX_const(utf8_buffer) + have,
13519                                          chars * 2, &newlen);
13520         } else {
13521             end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
13522                                 (U8*)SvPVX_const(utf8_buffer) + have,
13523                                 chars * 2, &newlen);
13524         }
13525         SvCUR_set(utf8_buffer, have + newlen);
13526         *end = '\0';
13527
13528         /* No need to keep this SV "well-formed" with a '\0' after the end, as
13529            it's private to us, and utf16_to_utf8{,reversed} take a
13530            (pointer,length) pair, rather than a NUL-terminated string.  */
13531         if(SvCUR(utf16_buffer) & 1) {
13532             *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
13533             SvCUR_set(utf16_buffer, 1);
13534         } else {
13535             SvCUR_set(utf16_buffer, 0);
13536         }
13537     }
13538     DEBUG_P(PerlIO_printf(Perl_debug_log,
13539                           "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13540                           status,
13541                           (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13542     DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
13543     return retval;
13544 }
13545
13546 static U8 *
13547 S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
13548 {
13549     SV *filter = filter_add(S_utf16_textfilter, NULL);
13550
13551     IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
13552     sv_setpvs(filter, "");
13553     IoLINES(filter) = reversed;
13554     IoPAGE(filter) = 1; /* Not EOF */
13555
13556     /* Sadly, we have to return a valid pointer, come what may, so we have to
13557        ignore any error return from this.  */
13558     SvCUR_set(PL_linestr, 0);
13559     if (FILTER_READ(0, PL_linestr, 0)) {
13560         SvUTF8_on(PL_linestr);
13561     } else {
13562         SvUTF8_on(PL_linestr);
13563     }
13564     PL_bufend = SvEND(PL_linestr);
13565     return (U8*)SvPVX(PL_linestr);
13566 }
13567 #endif
13568
13569 /*
13570 Returns a pointer to the next character after the parsed
13571 vstring, as well as updating the passed in sv.
13572
13573 Function must be called like
13574
13575         sv = newSV(5);
13576         s = scan_vstring(s,e,sv);
13577
13578 where s and e are the start and end of the string.
13579 The sv should already be large enough to store the vstring
13580 passed in, for performance reasons.
13581
13582 */
13583
13584 char *
13585 Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
13586 {
13587     dVAR;
13588     const char *pos = s;
13589     const char *start = s;
13590
13591     PERL_ARGS_ASSERT_SCAN_VSTRING;
13592
13593     if (*pos == 'v') pos++;  /* get past 'v' */
13594     while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13595         pos++;
13596     if ( *pos != '.') {
13597         /* this may not be a v-string if followed by => */
13598         const char *next = pos;
13599         while (next < e && isSPACE(*next))
13600             ++next;
13601         if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
13602             /* return string not v-string */
13603             sv_setpvn(sv,(char *)s,pos-s);
13604             return (char *)pos;
13605         }
13606     }
13607
13608     if (!isALPHA(*pos)) {
13609         U8 tmpbuf[UTF8_MAXBYTES+1];
13610
13611         if (*s == 'v')
13612             s++;  /* get past 'v' */
13613
13614         sv_setpvs(sv, "");
13615
13616         for (;;) {
13617             /* this is atoi() that tolerates underscores */
13618             U8 *tmpend;
13619             UV rev = 0;
13620             const char *end = pos;
13621             UV mult = 1;
13622             while (--end >= s) {
13623                 if (*end != '_') {
13624                     const UV orev = rev;
13625                     rev += (*end - '0') * mult;
13626                     mult *= 10;
13627                     if (orev > rev)
13628                         Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13629                                          "Integer overflow in decimal number");
13630                 }
13631             }
13632 #ifdef EBCDIC
13633             if (rev > 0x7FFFFFFF)
13634                  Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
13635 #endif
13636             /* Append native character for the rev point */
13637             tmpend = uvchr_to_utf8(tmpbuf, rev);
13638             sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
13639             if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
13640                  SvUTF8_on(sv);
13641             if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
13642                  s = ++pos;
13643             else {
13644                  s = pos;
13645                  break;
13646             }
13647             while (pos < e && (isDIGIT(*pos) || *pos == '_'))
13648                  pos++;
13649         }
13650         SvPOK_on(sv);
13651         sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
13652         SvRMAGICAL_on(sv);
13653     }
13654     return (char *)s;
13655 }
13656
13657 int
13658 Perl_keyword_plugin_standard(pTHX_
13659         char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
13660 {
13661     PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
13662     PERL_UNUSED_CONTEXT;
13663     PERL_UNUSED_ARG(keyword_ptr);
13664     PERL_UNUSED_ARG(keyword_len);
13665     PERL_UNUSED_ARG(op_ptr);
13666     return KEYWORD_PLUGIN_DECLINE;
13667 }
13668
13669 /*
13670  * Local variables:
13671  * c-indentation-style: bsd
13672  * c-basic-offset: 4
13673  * indent-tabs-mode: t
13674  * End:
13675  *
13676  * ex: set ts=8 sts=4 sw=4 noet:
13677  */