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