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