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