This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge branch 'blead' into dual/Safe
[perl5.git] / toke.c
CommitLineData
a0d0e21e 1/* toke.c
a687059c 2 *
1129b882
NC
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
a687059c 5 *
d48672a2
LW
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.
378cc40b 8 *
a0d0e21e
LW
9 */
10
11/*
4ac71550
TC
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"]
378cc40b
LW
15 */
16
9cbb5ea2
GS
17/*
18 * This file is the lexer for Perl. It's closely linked to the
4e553d73 19 * parser, perly.y.
ffb4593c
NT
20 *
21 * The main routine is yylex(), which returns the next token.
22 */
23
378cc40b 24#include "EXTERN.h"
864dbfa3 25#define PERL_IN_TOKE_C
378cc40b 26#include "perl.h"
378cc40b 27
eb0d8d16
NC
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
6154021b 31#define pl_yylval (PL_parser->yylval)
d3b6f988 32
acdf0a21
DM
33/* YYINITDEPTH -- initial size of the parser's stacks. */
34#define YYINITDEPTH 200
35
199e78b7
DM
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)
bdc0bf6f 57#define PL_linestr (PL_parser->linestr)
c2598295
DM
58#define PL_expect (PL_parser->expect)
59#define PL_copline (PL_parser->copline)
f06b5848
DM
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)
bc177e6b 68#define PL_lex_state (PL_parser->lex_state)
2f9285f8 69#define PL_rsfp (PL_parser->rsfp)
5486870f 70#define PL_rsfp_filters (PL_parser->rsfp_filters)
12bd6ede
DM
71#define PL_in_my (PL_parser->in_my)
72#define PL_in_my_stash (PL_parser->in_my_stash)
14047fc9 73#define PL_tokenbuf (PL_parser->tokenbuf)
670a9cb2 74#define PL_multi_end (PL_parser->multi_end)
13765c85 75#define PL_error_count (PL_parser->error_count)
199e78b7
DM
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)
fb205e7a
DM
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)
199e78b7
DM
97#endif
98
3cbf51f5
DM
99static int
100S_pending_ident(pTHX);
199e78b7 101
0bd48802 102static const char ident_too_long[] = "Identifier too long";
c445ea15 103static const char commaless_variable_list[] = "comma-less variable list";
8903cb82 104
6e3aabd6 105#ifndef PERL_NO_UTF16_FILTER
acfe0abc
GS
106static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
107static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
6e3aabd6 108#endif
51371543 109
29595ff2 110#ifdef PERL_MAD
29595ff2 111# define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
cd81e915 112# define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
9ded7720 113#else
5db06880 114# define CURMAD(slot,sv)
9ded7720 115# define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
29595ff2
NC
116#endif
117
9059aa12
LW
118#define XFAKEBRACK 128
119#define XENUMMASK 127
120
39e02b42
JH
121#ifdef USE_UTF8_SCRIPTS
122# define UTF (!IN_BYTES)
2b9d42f0 123#else
746b446a 124# define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
2b9d42f0 125#endif
a0ed51b3 126
b1fc3636
CJ
127/* The maximum number of characters preceding the unrecognized one to display */
128#define UNRECOGNIZED_PRECEDE_COUNT 10
129
61f0cdd9 130/* In variables named $^X, these are the legal values for X.
2b92dfce
GS
131 * 1999-02-27 mjd-perl-patch@plover.com */
132#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
133
bf4acbe4 134#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
bf4acbe4 135
ffb4593c
NT
136/* LEX_* are values for PL_lex_state, the state of the lexer.
137 * They are arranged oddly so that the guard on the switch statement
79072805
LW
138 * can get by with a single comparison (if the compiler is smart enough).
139 */
140
fb73857a 141/* #define LEX_NOTPARSING 11 is done in perl.h. */
142
b6007c36
DM
143#define LEX_NORMAL 10 /* normal code (ie not within "...") */
144#define LEX_INTERPNORMAL 9 /* code within a string, eg "$foo[$x+1]" */
145#define LEX_INTERPCASEMOD 8 /* expecting a \U, \Q or \E etc */
146#define LEX_INTERPPUSH 7 /* starting a new sublex parse level */
147#define LEX_INTERPSTART 6 /* expecting the start of a $var */
148
149 /* at end of code, eg "$x" followed by: */
150#define LEX_INTERPEND 5 /* ... eg not one of [, { or -> */
151#define LEX_INTERPENDMAYBE 4 /* ... eg one of [, { or -> */
152
153#define LEX_INTERPCONCAT 3 /* expecting anything, eg at start of
154 string or after \E, $foo, etc */
155#define LEX_INTERPCONST 2 /* NOT USED */
156#define LEX_FORMLINE 1 /* expecting a format line */
157#define LEX_KNOWNEXT 0 /* next token known; just return it */
158
79072805 159
bbf60fe6 160#ifdef DEBUGGING
27da23d5 161static const char* const lex_state_names[] = {
bbf60fe6
DM
162 "KNOWNEXT",
163 "FORMLINE",
164 "INTERPCONST",
165 "INTERPCONCAT",
166 "INTERPENDMAYBE",
167 "INTERPEND",
168 "INTERPSTART",
169 "INTERPPUSH",
170 "INTERPCASEMOD",
171 "INTERPNORMAL",
172 "NORMAL"
173};
174#endif
175
79072805
LW
176#ifdef ff_next
177#undef ff_next
d48672a2
LW
178#endif
179
79072805 180#include "keywords.h"
fe14fcc3 181
ffb4593c
NT
182/* CLINE is a macro that ensures PL_copline has a sane value */
183
ae986130
LW
184#ifdef CLINE
185#undef CLINE
186#endif
57843af0 187#define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
3280af22 188
5db06880 189#ifdef PERL_MAD
29595ff2
NC
190# define SKIPSPACE0(s) skipspace0(s)
191# define SKIPSPACE1(s) skipspace1(s)
192# define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
193# define PEEKSPACE(s) skipspace2(s,0)
194#else
195# define SKIPSPACE0(s) skipspace(s)
196# define SKIPSPACE1(s) skipspace(s)
197# define SKIPSPACE2(s,tsv) skipspace(s)
198# define PEEKSPACE(s) skipspace(s)
199#endif
200
ffb4593c
NT
201/*
202 * Convenience functions to return different tokens and prime the
9cbb5ea2 203 * lexer for the next token. They all take an argument.
ffb4593c
NT
204 *
205 * TOKEN : generic token (used for '(', DOLSHARP, etc)
206 * OPERATOR : generic operator
207 * AOPERATOR : assignment operator
208 * PREBLOCK : beginning the block after an if, while, foreach, ...
209 * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
210 * PREREF : *EXPR where EXPR is not a simple identifier
211 * TERM : expression term
212 * LOOPX : loop exiting command (goto, last, dump, etc)
213 * FTST : file test operator
214 * FUN0 : zero-argument function
2d2e263d 215 * FUN1 : not used, except for not, which isn't a UNIOP
ffb4593c
NT
216 * BOop : bitwise or or xor
217 * BAop : bitwise and
218 * SHop : shift operator
219 * PWop : power operator
9cbb5ea2 220 * PMop : pattern-matching operator
ffb4593c
NT
221 * Aop : addition-level operator
222 * Mop : multiplication-level operator
223 * Eop : equality-testing operator
e5edeb50 224 * Rop : relational operator <= != gt
ffb4593c
NT
225 *
226 * Also see LOP and lop() below.
227 */
228
998054bd 229#ifdef DEBUGGING /* Serve -DT. */
704d4215 230# define REPORT(retval) tokereport((I32)retval, &pl_yylval)
998054bd 231#else
bbf60fe6 232# define REPORT(retval) (retval)
998054bd
SC
233#endif
234
bbf60fe6
DM
235#define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
236#define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
237#define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
238#define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
239#define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
240#define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
241#define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
6154021b
RGS
242#define LOOPX(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
243#define FTST(f) return (pl_yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
244#define FUN0(f) return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
245#define FUN1(f) return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
246#define BOop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
247#define BAop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
248#define SHop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
249#define PWop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
250#define PMop(f) return(pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
251#define Aop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
252#define Mop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
253#define Eop(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
254#define Rop(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
2f3197b3 255
a687059c
LW
256/* This bit of chicanery makes a unary function followed by
257 * a parenthesis into a function with one argument, highest precedence.
6f33ba73
RGS
258 * The UNIDOR macro is for unary functions that can be followed by the //
259 * operator (such as C<shift // 0>).
a687059c 260 */
376fcdbf 261#define UNI2(f,x) { \
6154021b 262 pl_yylval.ival = f; \
376fcdbf
AL
263 PL_expect = x; \
264 PL_bufptr = s; \
265 PL_last_uni = PL_oldbufptr; \
266 PL_last_lop_op = f; \
267 if (*s == '(') \
268 return REPORT( (int)FUNC1 ); \
29595ff2 269 s = PEEKSPACE(s); \
376fcdbf
AL
270 return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
271 }
6f33ba73
RGS
272#define UNI(f) UNI2(f,XTERM)
273#define UNIDOR(f) UNI2(f,XTERMORDORDOR)
a687059c 274
376fcdbf 275#define UNIBRACK(f) { \
6154021b 276 pl_yylval.ival = f; \
376fcdbf
AL
277 PL_bufptr = s; \
278 PL_last_uni = PL_oldbufptr; \
279 if (*s == '(') \
280 return REPORT( (int)FUNC1 ); \
29595ff2 281 s = PEEKSPACE(s); \
376fcdbf
AL
282 return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
283 }
79072805 284
9f68db38 285/* grandfather return to old style */
6154021b 286#define OLDLOP(f) return(pl_yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
79072805 287
8fa7f367
JH
288#ifdef DEBUGGING
289
6154021b 290/* how to interpret the pl_yylval associated with the token */
bbf60fe6
DM
291enum token_type {
292 TOKENTYPE_NONE,
293 TOKENTYPE_IVAL,
6154021b 294 TOKENTYPE_OPNUM, /* pl_yylval.ival contains an opcode number */
bbf60fe6
DM
295 TOKENTYPE_PVAL,
296 TOKENTYPE_OPVAL,
297 TOKENTYPE_GVVAL
298};
299
6d4a66ac
NC
300static struct debug_tokens {
301 const int token;
302 enum token_type type;
303 const char *name;
304} const debug_tokens[] =
9041c2e3 305{
bbf60fe6
DM
306 { ADDOP, TOKENTYPE_OPNUM, "ADDOP" },
307 { ANDAND, TOKENTYPE_NONE, "ANDAND" },
308 { ANDOP, TOKENTYPE_NONE, "ANDOP" },
309 { ANONSUB, TOKENTYPE_IVAL, "ANONSUB" },
310 { ARROW, TOKENTYPE_NONE, "ARROW" },
311 { ASSIGNOP, TOKENTYPE_OPNUM, "ASSIGNOP" },
312 { BITANDOP, TOKENTYPE_OPNUM, "BITANDOP" },
313 { BITOROP, TOKENTYPE_OPNUM, "BITOROP" },
314 { COLONATTR, TOKENTYPE_NONE, "COLONATTR" },
315 { CONTINUE, TOKENTYPE_NONE, "CONTINUE" },
0d863452 316 { DEFAULT, TOKENTYPE_NONE, "DEFAULT" },
bbf60fe6
DM
317 { DO, TOKENTYPE_NONE, "DO" },
318 { DOLSHARP, TOKENTYPE_NONE, "DOLSHARP" },
319 { DORDOR, TOKENTYPE_NONE, "DORDOR" },
320 { DOROP, TOKENTYPE_OPNUM, "DOROP" },
321 { DOTDOT, TOKENTYPE_IVAL, "DOTDOT" },
322 { ELSE, TOKENTYPE_NONE, "ELSE" },
323 { ELSIF, TOKENTYPE_IVAL, "ELSIF" },
324 { EQOP, TOKENTYPE_OPNUM, "EQOP" },
325 { FOR, TOKENTYPE_IVAL, "FOR" },
326 { FORMAT, TOKENTYPE_NONE, "FORMAT" },
327 { FUNC, TOKENTYPE_OPNUM, "FUNC" },
328 { FUNC0, TOKENTYPE_OPNUM, "FUNC0" },
329 { FUNC0SUB, TOKENTYPE_OPVAL, "FUNC0SUB" },
330 { FUNC1, TOKENTYPE_OPNUM, "FUNC1" },
331 { FUNCMETH, TOKENTYPE_OPVAL, "FUNCMETH" },
0d863452 332 { GIVEN, TOKENTYPE_IVAL, "GIVEN" },
bbf60fe6
DM
333 { HASHBRACK, TOKENTYPE_NONE, "HASHBRACK" },
334 { IF, TOKENTYPE_IVAL, "IF" },
335 { LABEL, TOKENTYPE_PVAL, "LABEL" },
336 { LOCAL, TOKENTYPE_IVAL, "LOCAL" },
337 { LOOPEX, TOKENTYPE_OPNUM, "LOOPEX" },
338 { LSTOP, TOKENTYPE_OPNUM, "LSTOP" },
339 { LSTOPSUB, TOKENTYPE_OPVAL, "LSTOPSUB" },
340 { MATCHOP, TOKENTYPE_OPNUM, "MATCHOP" },
341 { METHOD, TOKENTYPE_OPVAL, "METHOD" },
342 { MULOP, TOKENTYPE_OPNUM, "MULOP" },
343 { MY, TOKENTYPE_IVAL, "MY" },
344 { MYSUB, TOKENTYPE_NONE, "MYSUB" },
345 { NOAMP, TOKENTYPE_NONE, "NOAMP" },
346 { NOTOP, TOKENTYPE_NONE, "NOTOP" },
347 { OROP, TOKENTYPE_IVAL, "OROP" },
348 { OROR, TOKENTYPE_NONE, "OROR" },
349 { PACKAGE, TOKENTYPE_NONE, "PACKAGE" },
350 { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" },
351 { POSTDEC, TOKENTYPE_NONE, "POSTDEC" },
352 { POSTINC, TOKENTYPE_NONE, "POSTINC" },
353 { POWOP, TOKENTYPE_OPNUM, "POWOP" },
354 { PREDEC, TOKENTYPE_NONE, "PREDEC" },
355 { PREINC, TOKENTYPE_NONE, "PREINC" },
356 { PRIVATEREF, TOKENTYPE_OPVAL, "PRIVATEREF" },
357 { REFGEN, TOKENTYPE_NONE, "REFGEN" },
358 { RELOP, TOKENTYPE_OPNUM, "RELOP" },
359 { SHIFTOP, TOKENTYPE_OPNUM, "SHIFTOP" },
360 { SUB, TOKENTYPE_NONE, "SUB" },
361 { THING, TOKENTYPE_OPVAL, "THING" },
362 { UMINUS, TOKENTYPE_NONE, "UMINUS" },
363 { UNIOP, TOKENTYPE_OPNUM, "UNIOP" },
364 { UNIOPSUB, TOKENTYPE_OPVAL, "UNIOPSUB" },
365 { UNLESS, TOKENTYPE_IVAL, "UNLESS" },
366 { UNTIL, TOKENTYPE_IVAL, "UNTIL" },
367 { USE, TOKENTYPE_IVAL, "USE" },
0d863452 368 { WHEN, TOKENTYPE_IVAL, "WHEN" },
bbf60fe6
DM
369 { WHILE, TOKENTYPE_IVAL, "WHILE" },
370 { WORD, TOKENTYPE_OPVAL, "WORD" },
be25f609 371 { YADAYADA, TOKENTYPE_IVAL, "YADAYADA" },
c35e046a 372 { 0, TOKENTYPE_NONE, NULL }
bbf60fe6
DM
373};
374
6154021b 375/* dump the returned token in rv, plus any optional arg in pl_yylval */
998054bd 376
bbf60fe6 377STATIC int
704d4215 378S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
bbf60fe6 379{
97aff369 380 dVAR;
7918f24d
NC
381
382 PERL_ARGS_ASSERT_TOKEREPORT;
383
bbf60fe6 384 if (DEBUG_T_TEST) {
bd61b366 385 const char *name = NULL;
bbf60fe6 386 enum token_type type = TOKENTYPE_NONE;
f54cb97a 387 const struct debug_tokens *p;
396482e1 388 SV* const report = newSVpvs("<== ");
bbf60fe6 389
f54cb97a 390 for (p = debug_tokens; p->token; p++) {
bbf60fe6
DM
391 if (p->token == (int)rv) {
392 name = p->name;
393 type = p->type;
394 break;
395 }
396 }
397 if (name)
54667de8 398 Perl_sv_catpv(aTHX_ report, name);
bbf60fe6
DM
399 else if ((char)rv > ' ' && (char)rv < '~')
400 Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
401 else if (!rv)
396482e1 402 sv_catpvs(report, "EOF");
bbf60fe6
DM
403 else
404 Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
405 switch (type) {
406 case TOKENTYPE_NONE:
407 case TOKENTYPE_GVVAL: /* doesn't appear to be used */
408 break;
409 case TOKENTYPE_IVAL:
704d4215 410 Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)lvalp->ival);
bbf60fe6
DM
411 break;
412 case TOKENTYPE_OPNUM:
413 Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
704d4215 414 PL_op_name[lvalp->ival]);
bbf60fe6
DM
415 break;
416 case TOKENTYPE_PVAL:
704d4215 417 Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval);
bbf60fe6
DM
418 break;
419 case TOKENTYPE_OPVAL:
704d4215 420 if (lvalp->opval) {
401441c0 421 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
704d4215
GG
422 PL_op_name[lvalp->opval->op_type]);
423 if (lvalp->opval->op_type == OP_CONST) {
b6007c36 424 Perl_sv_catpvf(aTHX_ report, " %s",
704d4215 425 SvPEEK(cSVOPx_sv(lvalp->opval)));
b6007c36
DM
426 }
427
428 }
401441c0 429 else
396482e1 430 sv_catpvs(report, "(opval=null)");
bbf60fe6
DM
431 break;
432 }
b6007c36 433 PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
bbf60fe6
DM
434 };
435 return (int)rv;
998054bd
SC
436}
437
b6007c36
DM
438
439/* print the buffer with suitable escapes */
440
441STATIC void
15f169a1 442S_printbuf(pTHX_ const char *const fmt, const char *const s)
b6007c36 443{
396482e1 444 SV* const tmp = newSVpvs("");
7918f24d
NC
445
446 PERL_ARGS_ASSERT_PRINTBUF;
447
b6007c36
DM
448 PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
449 SvREFCNT_dec(tmp);
450}
451
8fa7f367
JH
452#endif
453
ffb4593c
NT
454/*
455 * S_ao
456 *
c963b151
BD
457 * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
458 * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
ffb4593c
NT
459 */
460
76e3520e 461STATIC int
cea2e8a9 462S_ao(pTHX_ int toketype)
a0d0e21e 463{
97aff369 464 dVAR;
3280af22
NIS
465 if (*PL_bufptr == '=') {
466 PL_bufptr++;
a0d0e21e 467 if (toketype == ANDAND)
6154021b 468 pl_yylval.ival = OP_ANDASSIGN;
a0d0e21e 469 else if (toketype == OROR)
6154021b 470 pl_yylval.ival = OP_ORASSIGN;
c963b151 471 else if (toketype == DORDOR)
6154021b 472 pl_yylval.ival = OP_DORASSIGN;
a0d0e21e
LW
473 toketype = ASSIGNOP;
474 }
475 return toketype;
476}
477
ffb4593c
NT
478/*
479 * S_no_op
480 * When Perl expects an operator and finds something else, no_op
481 * prints the warning. It always prints "<something> found where
482 * operator expected. It prints "Missing semicolon on previous line?"
483 * if the surprise occurs at the start of the line. "do you need to
484 * predeclare ..." is printed out for code like "sub bar; foo bar $x"
485 * where the compiler doesn't know if foo is a method call or a function.
486 * It prints "Missing operator before end of line" if there's nothing
487 * after the missing operator, or "... before <...>" if there is something
488 * after the missing operator.
489 */
490
76e3520e 491STATIC void
15f169a1 492S_no_op(pTHX_ const char *const what, char *s)
463ee0b2 493{
97aff369 494 dVAR;
9d4ba2ae
AL
495 char * const oldbp = PL_bufptr;
496 const bool is_first = (PL_oldbufptr == PL_linestart);
68dc0745 497
7918f24d
NC
498 PERL_ARGS_ASSERT_NO_OP;
499
1189a94a
GS
500 if (!s)
501 s = oldbp;
07c798fb 502 else
1189a94a 503 PL_bufptr = s;
cea2e8a9 504 yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
56da5a46
RGS
505 if (ckWARN_d(WARN_SYNTAX)) {
506 if (is_first)
507 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
508 "\t(Missing semicolon on previous line?)\n");
509 else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
f54cb97a 510 const char *t;
c35e046a
AL
511 for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
512 NOOP;
56da5a46
RGS
513 if (t < PL_bufptr && isSPACE(*t))
514 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
515 "\t(Do you need to predeclare %.*s?)\n",
551405c4 516 (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
56da5a46
RGS
517 }
518 else {
519 assert(s >= oldbp);
520 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
551405c4 521 "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
56da5a46 522 }
07c798fb 523 }
3280af22 524 PL_bufptr = oldbp;
8990e307
LW
525}
526
ffb4593c
NT
527/*
528 * S_missingterm
529 * Complain about missing quote/regexp/heredoc terminator.
d4c19fe8 530 * If it's called with NULL then it cauterizes the line buffer.
ffb4593c
NT
531 * If we're in a delimited string and the delimiter is a control
532 * character, it's reformatted into a two-char sequence like ^C.
533 * This is fatal.
534 */
535
76e3520e 536STATIC void
cea2e8a9 537S_missingterm(pTHX_ char *s)
8990e307 538{
97aff369 539 dVAR;
8990e307
LW
540 char tmpbuf[3];
541 char q;
542 if (s) {
9d4ba2ae 543 char * const nl = strrchr(s,'\n');
d2719217 544 if (nl)
8990e307
LW
545 *nl = '\0';
546 }
463559e7 547 else if (isCNTRL(PL_multi_close)) {
8990e307 548 *tmpbuf = '^';
585ec06d 549 tmpbuf[1] = (char)toCTRL(PL_multi_close);
8990e307
LW
550 tmpbuf[2] = '\0';
551 s = tmpbuf;
552 }
553 else {
eb160463 554 *tmpbuf = (char)PL_multi_close;
8990e307
LW
555 tmpbuf[1] = '\0';
556 s = tmpbuf;
557 }
558 q = strchr(s,'"') ? '\'' : '"';
cea2e8a9 559 Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
463ee0b2 560}
79072805 561
ef89dcc3 562#define FEATURE_IS_ENABLED(name) \
0d863452 563 ((0 != (PL_hints & HINT_LOCALIZE_HH)) \
89529cee 564 && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
4a731d7b
NC
565/* The longest string we pass in. */
566#define MAX_FEATURE_LEN (sizeof("switch")-1)
567
0d863452
RH
568/*
569 * S_feature_is_enabled
570 * Check whether the named feature is enabled.
571 */
572STATIC bool
15f169a1 573S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
0d863452 574{
97aff369 575 dVAR;
0d863452 576 HV * const hinthv = GvHV(PL_hintgv);
4a731d7b 577 char he_name[8 + MAX_FEATURE_LEN] = "feature_";
7918f24d
NC
578
579 PERL_ARGS_ASSERT_FEATURE_IS_ENABLED;
580
4a731d7b
NC
581 assert(namelen <= MAX_FEATURE_LEN);
582 memcpy(&he_name[8], name, namelen);
d4c19fe8 583
7b9ef140 584 return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
0d863452
RH
585}
586
ffb4593c
NT
587/*
588 * Perl_deprecate
ffb4593c
NT
589 */
590
79072805 591void
15f169a1 592Perl_deprecate(pTHX_ const char *const s)
a0d0e21e 593{
7918f24d
NC
594 PERL_ARGS_ASSERT_DEPRECATE;
595
599cee73 596 if (ckWARN(WARN_DEPRECATED))
9014280d 597 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
a0d0e21e
LW
598}
599
12bcd1a6 600void
15f169a1 601Perl_deprecate_old(pTHX_ const char *const s)
12bcd1a6
PM
602{
603 /* This function should NOT be called for any new deprecated warnings */
604 /* Use Perl_deprecate instead */
605 /* */
606 /* It is here to maintain backward compatibility with the pre-5.8 */
607 /* warnings category hierarchy. The "deprecated" category used to */
608 /* live under the "syntax" category. It is now a top-level category */
609 /* in its own right. */
610
7918f24d
NC
611 PERL_ARGS_ASSERT_DEPRECATE_OLD;
612
12bcd1a6 613 if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
bfed75c6 614 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
12bcd1a6
PM
615 "Use of %s is deprecated", s);
616}
617
ffb4593c 618/*
9cbb5ea2
GS
619 * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
620 * utf16-to-utf8-reversed.
ffb4593c
NT
621 */
622
c39cd008
GS
623#ifdef PERL_CR_FILTER
624static void
625strip_return(SV *sv)
626{
95a20fc0 627 register const char *s = SvPVX_const(sv);
9d4ba2ae 628 register const char * const e = s + SvCUR(sv);
7918f24d
NC
629
630 PERL_ARGS_ASSERT_STRIP_RETURN;
631
c39cd008
GS
632 /* outer loop optimized to do nothing if there are no CR-LFs */
633 while (s < e) {
634 if (*s++ == '\r' && *s == '\n') {
635 /* hit a CR-LF, need to copy the rest */
636 register char *d = s - 1;
637 *d++ = *s++;
638 while (s < e) {
639 if (*s == '\r' && s[1] == '\n')
640 s++;
641 *d++ = *s++;
642 }
643 SvCUR(sv) -= s - d;
644 return;
645 }
646 }
647}
a868473f 648
76e3520e 649STATIC I32
c39cd008 650S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
a868473f 651{
f54cb97a 652 const I32 count = FILTER_READ(idx+1, sv, maxlen);
c39cd008
GS
653 if (count > 0 && !maxlen)
654 strip_return(sv);
655 return count;
a868473f
NIS
656}
657#endif
658
199e78b7
DM
659
660
ffb4593c
NT
661/*
662 * Perl_lex_start
5486870f 663 *
e3abe207 664 * Create a parser object and initialise its parser and lexer fields
5486870f
DM
665 *
666 * rsfp is the opened file handle to read from (if any),
667 *
668 * line holds any initial content already read from the file (or in
669 * the case of no file, such as an eval, the whole contents);
670 *
671 * new_filter indicates that this is a new file and it shouldn't inherit
672 * the filters from the current parser (ie require).
ffb4593c
NT
673 */
674
a0d0e21e 675void
5486870f 676Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, bool new_filter)
79072805 677{
97aff369 678 dVAR;
6ef55633 679 const char *s = NULL;
8990e307 680 STRLEN len;
5486870f 681 yy_parser *parser, *oparser;
acdf0a21
DM
682
683 /* create and initialise a parser */
684
199e78b7 685 Newxz(parser, 1, yy_parser);
5486870f 686 parser->old_parser = oparser = PL_parser;
acdf0a21
DM
687 PL_parser = parser;
688
689 Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
690 parser->ps = parser->stack;
691 parser->stack_size = YYINITDEPTH;
692
693 parser->stack->state = 0;
694 parser->yyerrstatus = 0;
695 parser->yychar = YYEMPTY; /* Cause a token to be read. */
696
e3abe207
DM
697 /* on scope exit, free this parser and restore any outer one */
698 SAVEPARSER(parser);
7c4baf47 699 parser->saved_curcop = PL_curcop;
e3abe207 700
acdf0a21 701 /* initialise lexer state */
8990e307 702
fb205e7a
DM
703#ifdef PERL_MAD
704 parser->curforce = -1;
705#else
706 parser->nexttoke = 0;
707#endif
ca4cfd28 708 parser->error_count = oparser ? oparser->error_count : 0;
c2598295 709 parser->copline = NOLINE;
5afb0a62 710 parser->lex_state = LEX_NORMAL;
c2598295 711 parser->expect = XSTATE;
2f9285f8 712 parser->rsfp = rsfp;
56b27c9a 713 parser->rsfp_filters = (new_filter || !oparser) ? newAV()
502c6561 714 : MUTABLE_AV(SvREFCNT_inc(oparser->rsfp_filters));
2f9285f8 715
199e78b7
DM
716 Newx(parser->lex_brackstack, 120, char);
717 Newx(parser->lex_casestack, 12, char);
718 *parser->lex_casestack = '\0';
02b34bbe 719
10efb74f
NC
720 if (line) {
721 s = SvPV_const(line, len);
722 } else {
723 len = 0;
724 }
bdc0bf6f 725
10efb74f 726 if (!len) {
bdc0bf6f 727 parser->linestr = newSVpvs("\n;");
10efb74f 728 } else if (SvREADONLY(line) || s[len-1] != ';') {
bdc0bf6f 729 parser->linestr = newSVsv(line);
10efb74f 730 if (s[len-1] != ';')
bdc0bf6f 731 sv_catpvs(parser->linestr, "\n;");
6c5ce11d
NC
732 } else {
733 SvTEMP_off(line);
734 SvREFCNT_inc_simple_void_NN(line);
bdc0bf6f 735 parser->linestr = line;
8990e307 736 }
f06b5848
DM
737 parser->oldoldbufptr =
738 parser->oldbufptr =
739 parser->bufptr =
740 parser->linestart = SvPVX(parser->linestr);
741 parser->bufend = parser->bufptr + SvCUR(parser->linestr);
742 parser->last_lop = parser->last_uni = NULL;
79072805 743}
a687059c 744
e3abe207
DM
745
746/* delete a parser object */
747
748void
749Perl_parser_free(pTHX_ const yy_parser *parser)
750{
7918f24d
NC
751 PERL_ARGS_ASSERT_PARSER_FREE;
752
7c4baf47 753 PL_curcop = parser->saved_curcop;
bdc0bf6f
DM
754 SvREFCNT_dec(parser->linestr);
755
2f9285f8
DM
756 if (parser->rsfp == PerlIO_stdin())
757 PerlIO_clearerr(parser->rsfp);
799361c3
SH
758 else if (parser->rsfp && (!parser->old_parser ||
759 (parser->old_parser && parser->rsfp != parser->old_parser->rsfp)))
2f9285f8 760 PerlIO_close(parser->rsfp);
5486870f 761 SvREFCNT_dec(parser->rsfp_filters);
2f9285f8 762
e3abe207
DM
763 Safefree(parser->stack);
764 Safefree(parser->lex_brackstack);
765 Safefree(parser->lex_casestack);
766 PL_parser = parser->old_parser;
767 Safefree(parser);
768}
769
770
ffb4593c
NT
771/*
772 * Perl_lex_end
9cbb5ea2
GS
773 * Finalizer for lexing operations. Must be called when the parser is
774 * done with the lexer.
ffb4593c
NT
775 */
776
463ee0b2 777void
864dbfa3 778Perl_lex_end(pTHX)
463ee0b2 779{
97aff369 780 dVAR;
3280af22 781 PL_doextract = FALSE;
463ee0b2
LW
782}
783
ffb4593c
NT
784/*
785 * S_incline
786 * This subroutine has nothing to do with tilting, whether at windmills
787 * or pinball tables. Its name is short for "increment line". It
57843af0 788 * increments the current line number in CopLINE(PL_curcop) and checks
ffb4593c 789 * to see whether the line starts with a comment of the form
9cbb5ea2
GS
790 * # line 500 "foo.pm"
791 * If so, it sets the current line number and file to the values in the comment.
ffb4593c
NT
792 */
793
76e3520e 794STATIC void
d9095cec 795S_incline(pTHX_ const char *s)
463ee0b2 796{
97aff369 797 dVAR;
d9095cec
NC
798 const char *t;
799 const char *n;
800 const char *e;
463ee0b2 801
7918f24d
NC
802 PERL_ARGS_ASSERT_INCLINE;
803
57843af0 804 CopLINE_inc(PL_curcop);
463ee0b2
LW
805 if (*s++ != '#')
806 return;
d4c19fe8
AL
807 while (SPACE_OR_TAB(*s))
808 s++;
73659bf1
GS
809 if (strnEQ(s, "line", 4))
810 s += 4;
811 else
812 return;
084592ab 813 if (SPACE_OR_TAB(*s))
73659bf1 814 s++;
4e553d73 815 else
73659bf1 816 return;
d4c19fe8
AL
817 while (SPACE_OR_TAB(*s))
818 s++;
463ee0b2
LW
819 if (!isDIGIT(*s))
820 return;
d4c19fe8 821
463ee0b2
LW
822 n = s;
823 while (isDIGIT(*s))
824 s++;
07714eb4 825 if (!SPACE_OR_TAB(*s) && *s != '\r' && *s != '\n' && *s != '\0')
26b6dc3f 826 return;
bf4acbe4 827 while (SPACE_OR_TAB(*s))
463ee0b2 828 s++;
73659bf1 829 if (*s == '"' && (t = strchr(s+1, '"'))) {
463ee0b2 830 s++;
73659bf1
GS
831 e = t + 1;
832 }
463ee0b2 833 else {
c35e046a
AL
834 t = s;
835 while (!isSPACE(*t))
836 t++;
73659bf1 837 e = t;
463ee0b2 838 }
bf4acbe4 839 while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
73659bf1
GS
840 e++;
841 if (*e != '\n' && *e != '\0')
842 return; /* false alarm */
843
f4dd75d9 844 if (t - s > 0) {
d9095cec 845 const STRLEN len = t - s;
8a5ee598 846#ifndef USE_ITHREADS
19bad673
NC
847 SV *const temp_sv = CopFILESV(PL_curcop);
848 const char *cf;
849 STRLEN tmplen;
850
851 if (temp_sv) {
852 cf = SvPVX(temp_sv);
853 tmplen = SvCUR(temp_sv);
854 } else {
855 cf = NULL;
856 tmplen = 0;
857 }
858
42d9b98d 859 if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
e66cf94c
RGS
860 /* must copy *{"::_<(eval N)[oldfilename:L]"}
861 * to *{"::_<newfilename"} */
44867030
NC
862 /* However, the long form of evals is only turned on by the
863 debugger - usually they're "(eval %lu)" */
864 char smallbuf[128];
865 char *tmpbuf;
866 GV **gvp;
d9095cec 867 STRLEN tmplen2 = len;
798b63bc 868 if (tmplen + 2 <= sizeof smallbuf)
e66cf94c
RGS
869 tmpbuf = smallbuf;
870 else
2ae0db35 871 Newx(tmpbuf, tmplen + 2, char);
44867030
NC
872 tmpbuf[0] = '_';
873 tmpbuf[1] = '<';
2ae0db35 874 memcpy(tmpbuf + 2, cf, tmplen);
44867030 875 tmplen += 2;
8a5ee598
RGS
876 gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
877 if (gvp) {
44867030
NC
878 char *tmpbuf2;
879 GV *gv2;
880
881 if (tmplen2 + 2 <= sizeof smallbuf)
882 tmpbuf2 = smallbuf;
883 else
884 Newx(tmpbuf2, tmplen2 + 2, char);
885
886 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
887 /* Either they malloc'd it, or we malloc'd it,
888 so no prefix is present in ours. */
889 tmpbuf2[0] = '_';
890 tmpbuf2[1] = '<';
891 }
892
893 memcpy(tmpbuf2 + 2, s, tmplen2);
894 tmplen2 += 2;
895
8a5ee598 896 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
e5527e4b 897 if (!isGV(gv2)) {
8a5ee598 898 gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
e5527e4b
RGS
899 /* adjust ${"::_<newfilename"} to store the new file name */
900 GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
3cb1dbc6
NC
901 GvHV(gv2) = MUTABLE_HV(SvREFCNT_inc(GvHV(*gvp)));
902 GvAV(gv2) = MUTABLE_AV(SvREFCNT_inc(GvAV(*gvp)));
e5527e4b 903 }
44867030
NC
904
905 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
8a5ee598 906 }
e66cf94c 907 if (tmpbuf != smallbuf) Safefree(tmpbuf);
e66cf94c 908 }
8a5ee598 909#endif
05ec9bb3 910 CopFILE_free(PL_curcop);
d9095cec 911 CopFILE_setn(PL_curcop, s, len);
f4dd75d9 912 }
57843af0 913 CopLINE_set(PL_curcop, atoi(n)-1);
463ee0b2
LW
914}
915
29595ff2 916#ifdef PERL_MAD
cd81e915 917/* skip space before PL_thistoken */
29595ff2
NC
918
919STATIC char *
920S_skipspace0(pTHX_ register char *s)
921{
7918f24d
NC
922 PERL_ARGS_ASSERT_SKIPSPACE0;
923
29595ff2
NC
924 s = skipspace(s);
925 if (!PL_madskills)
926 return s;
cd81e915
NC
927 if (PL_skipwhite) {
928 if (!PL_thiswhite)
6b29d1f5 929 PL_thiswhite = newSVpvs("");
cd81e915
NC
930 sv_catsv(PL_thiswhite, PL_skipwhite);
931 sv_free(PL_skipwhite);
932 PL_skipwhite = 0;
933 }
934 PL_realtokenstart = s - SvPVX(PL_linestr);
29595ff2
NC
935 return s;
936}
937
cd81e915 938/* skip space after PL_thistoken */
29595ff2
NC
939
940STATIC char *
941S_skipspace1(pTHX_ register char *s)
942{
d4c19fe8 943 const char *start = s;
29595ff2
NC
944 I32 startoff = start - SvPVX(PL_linestr);
945
7918f24d
NC
946 PERL_ARGS_ASSERT_SKIPSPACE1;
947
29595ff2
NC
948 s = skipspace(s);
949 if (!PL_madskills)
950 return s;
951 start = SvPVX(PL_linestr) + startoff;
cd81e915 952 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 953 const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
954 PL_thistoken = newSVpvn(tstart, start - tstart);
955 }
956 PL_realtokenstart = -1;
957 if (PL_skipwhite) {
958 if (!PL_nextwhite)
6b29d1f5 959 PL_nextwhite = newSVpvs("");
cd81e915
NC
960 sv_catsv(PL_nextwhite, PL_skipwhite);
961 sv_free(PL_skipwhite);
962 PL_skipwhite = 0;
29595ff2
NC
963 }
964 return s;
965}
966
967STATIC char *
968S_skipspace2(pTHX_ register char *s, SV **svp)
969{
c35e046a
AL
970 char *start;
971 const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
972 const I32 startoff = s - SvPVX(PL_linestr);
973
7918f24d
NC
974 PERL_ARGS_ASSERT_SKIPSPACE2;
975
29595ff2
NC
976 s = skipspace(s);
977 PL_bufptr = SvPVX(PL_linestr) + bufptroff;
978 if (!PL_madskills || !svp)
979 return s;
980 start = SvPVX(PL_linestr) + startoff;
cd81e915 981 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 982 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
983 PL_thistoken = newSVpvn(tstart, start - tstart);
984 PL_realtokenstart = -1;
29595ff2 985 }
cd81e915 986 if (PL_skipwhite) {
29595ff2 987 if (!*svp)
6b29d1f5 988 *svp = newSVpvs("");
cd81e915
NC
989 sv_setsv(*svp, PL_skipwhite);
990 sv_free(PL_skipwhite);
991 PL_skipwhite = 0;
29595ff2
NC
992 }
993
994 return s;
995}
996#endif
997
80a702cd 998STATIC void
15f169a1 999S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
80a702cd
RGS
1000{
1001 AV *av = CopFILEAVx(PL_curcop);
1002 if (av) {
b9f83d2f 1003 SV * const sv = newSV_type(SVt_PVMG);
5fa550fb
NC
1004 if (orig_sv)
1005 sv_setsv(sv, orig_sv);
1006 else
1007 sv_setpvn(sv, buf, len);
80a702cd
RGS
1008 (void)SvIOK_on(sv);
1009 SvIV_set(sv, 0);
1010 av_store(av, (I32)CopLINE(PL_curcop), sv);
1011 }
1012}
1013
ffb4593c
NT
1014/*
1015 * S_skipspace
1016 * Called to gobble the appropriate amount and type of whitespace.
1017 * Skips comments as well.
1018 */
1019
76e3520e 1020STATIC char *
cea2e8a9 1021S_skipspace(pTHX_ register char *s)
a687059c 1022{
97aff369 1023 dVAR;
5db06880
NC
1024#ifdef PERL_MAD
1025 int curoff;
1026 int startoff = s - SvPVX(PL_linestr);
1027
7918f24d
NC
1028 PERL_ARGS_ASSERT_SKIPSPACE;
1029
cd81e915
NC
1030 if (PL_skipwhite) {
1031 sv_free(PL_skipwhite);
1032 PL_skipwhite = 0;
5db06880
NC
1033 }
1034#endif
7918f24d 1035 PERL_ARGS_ASSERT_SKIPSPACE;
5db06880 1036
3280af22 1037 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
bf4acbe4 1038 while (s < PL_bufend && SPACE_OR_TAB(*s))
463ee0b2 1039 s++;
5db06880
NC
1040#ifdef PERL_MAD
1041 goto done;
1042#else
463ee0b2 1043 return s;
5db06880 1044#endif
463ee0b2
LW
1045 }
1046 for (;;) {
fd049845 1047 STRLEN prevlen;
09bef843 1048 SSize_t oldprevlen, oldoldprevlen;
9c5ffd7c 1049 SSize_t oldloplen = 0, oldunilen = 0;
60e6418e
GS
1050 while (s < PL_bufend && isSPACE(*s)) {
1051 if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
1052 incline(s);
1053 }
ffb4593c
NT
1054
1055 /* comment */
3280af22
NIS
1056 if (s < PL_bufend && *s == '#') {
1057 while (s < PL_bufend && *s != '\n')
463ee0b2 1058 s++;
60e6418e 1059 if (s < PL_bufend) {
463ee0b2 1060 s++;
60e6418e
GS
1061 if (PL_in_eval && !PL_rsfp) {
1062 incline(s);
1063 continue;
1064 }
1065 }
463ee0b2 1066 }
ffb4593c
NT
1067
1068 /* only continue to recharge the buffer if we're at the end
1069 * of the buffer, we're not reading from a source filter, and
1070 * we're in normal lexing mode
1071 */
09bef843
SB
1072 if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
1073 PL_lex_state == LEX_FORMLINE)
5db06880
NC
1074#ifdef PERL_MAD
1075 goto done;
1076#else
463ee0b2 1077 return s;
5db06880 1078#endif
ffb4593c
NT
1079
1080 /* try to recharge the buffer */
5db06880
NC
1081#ifdef PERL_MAD
1082 curoff = s - SvPVX(PL_linestr);
1083#endif
1084
9cbb5ea2 1085 if ((s = filter_gets(PL_linestr, PL_rsfp,
bd61b366 1086 (prevlen = SvCUR(PL_linestr)))) == NULL)
9cbb5ea2 1087 {
5db06880
NC
1088#ifdef PERL_MAD
1089 if (PL_madskills && curoff != startoff) {
cd81e915 1090 if (!PL_skipwhite)
6b29d1f5 1091 PL_skipwhite = newSVpvs("");
cd81e915 1092 sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
5db06880
NC
1093 curoff - startoff);
1094 }
1095
1096 /* mustn't throw out old stuff yet if madpropping */
1097 SvCUR(PL_linestr) = curoff;
1098 s = SvPVX(PL_linestr) + curoff;
1099 *s = 0;
1100 if (curoff && s[-1] == '\n')
1101 s[-1] = ' ';
1102#endif
1103
9cbb5ea2 1104 /* end of file. Add on the -p or -n magic */
cd81e915 1105 /* XXX these shouldn't really be added here, can't set PL_faketokens */
01a19ab0 1106 if (PL_minus_p) {
5db06880 1107#ifdef PERL_MAD
6502358f 1108 sv_catpvs(PL_linestr,
5db06880
NC
1109 ";}continue{print or die qq(-p destination: $!\\n);}");
1110#else
6502358f 1111 sv_setpvs(PL_linestr,
01a19ab0 1112 ";}continue{print or die qq(-p destination: $!\\n);}");
5db06880 1113#endif
3280af22 1114 PL_minus_n = PL_minus_p = 0;
a0d0e21e 1115 }
01a19ab0 1116 else if (PL_minus_n) {
5db06880 1117#ifdef PERL_MAD
76f68e9b 1118 sv_catpvs(PL_linestr, ";}");
5db06880 1119#else
76f68e9b 1120 sv_setpvs(PL_linestr, ";}");
5db06880 1121#endif
01a19ab0
NC
1122 PL_minus_n = 0;
1123 }
a0d0e21e 1124 else
5db06880 1125#ifdef PERL_MAD
76f68e9b 1126 sv_catpvs(PL_linestr,";");
5db06880 1127#else
76f68e9b 1128 sv_setpvs(PL_linestr,";");
5db06880 1129#endif
ffb4593c
NT
1130
1131 /* reset variables for next time we lex */
9cbb5ea2 1132 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
89122651
NC
1133 = SvPVX(PL_linestr)
1134#ifdef PERL_MAD
1135 + curoff
1136#endif
1137 ;
3280af22 1138 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 1139 PL_last_lop = PL_last_uni = NULL;
ffb4593c 1140
4c84d7f2 1141 /* Close the filehandle. Could be from
ffb4593c
NT
1142 * STDIN, or a regular file. If we were reading code from
1143 * STDIN (because the commandline held no -e or filename)
1144 * then we don't close it, we reset it so the code can
1145 * read from STDIN too.
1146 */
1147
4c84d7f2 1148 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
3280af22 1149 PerlIO_clearerr(PL_rsfp);
8990e307 1150 else
3280af22 1151 (void)PerlIO_close(PL_rsfp);
4608196e 1152 PL_rsfp = NULL;
463ee0b2
LW
1153 return s;
1154 }
ffb4593c
NT
1155
1156 /* not at end of file, so we only read another line */
09bef843
SB
1157 /* make corresponding updates to old pointers, for yyerror() */
1158 oldprevlen = PL_oldbufptr - PL_bufend;
1159 oldoldprevlen = PL_oldoldbufptr - PL_bufend;
1160 if (PL_last_uni)
1161 oldunilen = PL_last_uni - PL_bufend;
1162 if (PL_last_lop)
1163 oldloplen = PL_last_lop - PL_bufend;
3280af22
NIS
1164 PL_linestart = PL_bufptr = s + prevlen;
1165 PL_bufend = s + SvCUR(PL_linestr);
1166 s = PL_bufptr;
09bef843
SB
1167 PL_oldbufptr = s + oldprevlen;
1168 PL_oldoldbufptr = s + oldoldprevlen;
1169 if (PL_last_uni)
1170 PL_last_uni = s + oldunilen;
1171 if (PL_last_lop)
1172 PL_last_lop = s + oldloplen;
a0d0e21e 1173 incline(s);
ffb4593c
NT
1174
1175 /* debugger active and we're not compiling the debugger code,
1176 * so store the line into the debugger's array of lines
1177 */
65269a95 1178 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
5fa550fb 1179 update_debugger_info(NULL, PL_bufptr, PL_bufend - PL_bufptr);
463ee0b2 1180 }
5db06880
NC
1181
1182#ifdef PERL_MAD
1183 done:
1184 if (PL_madskills) {
cd81e915 1185 if (!PL_skipwhite)
6b29d1f5 1186 PL_skipwhite = newSVpvs("");
5db06880
NC
1187 curoff = s - SvPVX(PL_linestr);
1188 if (curoff - startoff)
cd81e915 1189 sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
5db06880
NC
1190 curoff - startoff);
1191 }
1192 return s;
1193#endif
a687059c 1194}
378cc40b 1195
ffb4593c
NT
1196/*
1197 * S_check_uni
1198 * Check the unary operators to ensure there's no ambiguity in how they're
1199 * used. An ambiguous piece of code would be:
1200 * rand + 5
1201 * This doesn't mean rand() + 5. Because rand() is a unary operator,
1202 * the +5 is its argument.
1203 */
1204
76e3520e 1205STATIC void
cea2e8a9 1206S_check_uni(pTHX)
ba106d47 1207{
97aff369 1208 dVAR;
d4c19fe8
AL
1209 const char *s;
1210 const char *t;
2f3197b3 1211
3280af22 1212 if (PL_oldoldbufptr != PL_last_uni)
2f3197b3 1213 return;
3280af22
NIS
1214 while (isSPACE(*PL_last_uni))
1215 PL_last_uni++;
c35e046a
AL
1216 s = PL_last_uni;
1217 while (isALNUM_lazy_if(s,UTF) || *s == '-')
1218 s++;
3280af22 1219 if ((t = strchr(s, '(')) && t < PL_bufptr)
a0d0e21e 1220 return;
6136c704 1221
0453d815 1222 if (ckWARN_d(WARN_AMBIGUOUS)){
9014280d 1223 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
32d45c1d
NC
1224 "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1225 (int)(s - PL_last_uni), PL_last_uni);
0453d815 1226 }
2f3197b3
LW
1227}
1228
ffb4593c
NT
1229/*
1230 * LOP : macro to build a list operator. Its behaviour has been replaced
1231 * with a subroutine, S_lop() for which LOP is just another name.
1232 */
1233
a0d0e21e
LW
1234#define LOP(f,x) return lop(f,x,s)
1235
ffb4593c
NT
1236/*
1237 * S_lop
1238 * Build a list operator (or something that might be one). The rules:
1239 * - if we have a next token, then it's a list operator [why?]
1240 * - if the next thing is an opening paren, then it's a function
1241 * - else it's a list operator
1242 */
1243
76e3520e 1244STATIC I32
a0be28da 1245S_lop(pTHX_ I32 f, int x, char *s)
ffed7fef 1246{
97aff369 1247 dVAR;
7918f24d
NC
1248
1249 PERL_ARGS_ASSERT_LOP;
1250
6154021b 1251 pl_yylval.ival = f;
35c8bce7 1252 CLINE;
3280af22
NIS
1253 PL_expect = x;
1254 PL_bufptr = s;
1255 PL_last_lop = PL_oldbufptr;
eb160463 1256 PL_last_lop_op = (OPCODE)f;
5db06880
NC
1257#ifdef PERL_MAD
1258 if (PL_lasttoke)
1259 return REPORT(LSTOP);
1260#else
3280af22 1261 if (PL_nexttoke)
bbf60fe6 1262 return REPORT(LSTOP);
5db06880 1263#endif
79072805 1264 if (*s == '(')
bbf60fe6 1265 return REPORT(FUNC);
29595ff2 1266 s = PEEKSPACE(s);
79072805 1267 if (*s == '(')
bbf60fe6 1268 return REPORT(FUNC);
79072805 1269 else
bbf60fe6 1270 return REPORT(LSTOP);
79072805
LW
1271}
1272
5db06880
NC
1273#ifdef PERL_MAD
1274 /*
1275 * S_start_force
1276 * Sets up for an eventual force_next(). start_force(0) basically does
1277 * an unshift, while start_force(-1) does a push. yylex removes items
1278 * on the "pop" end.
1279 */
1280
1281STATIC void
1282S_start_force(pTHX_ int where)
1283{
1284 int i;
1285
cd81e915 1286 if (where < 0) /* so people can duplicate start_force(PL_curforce) */
5db06880 1287 where = PL_lasttoke;
cd81e915
NC
1288 assert(PL_curforce < 0 || PL_curforce == where);
1289 if (PL_curforce != where) {
5db06880
NC
1290 for (i = PL_lasttoke; i > where; --i) {
1291 PL_nexttoke[i] = PL_nexttoke[i-1];
1292 }
1293 PL_lasttoke++;
1294 }
cd81e915 1295 if (PL_curforce < 0) /* in case of duplicate start_force() */
5db06880 1296 Zero(&PL_nexttoke[where], 1, NEXTTOKE);
cd81e915
NC
1297 PL_curforce = where;
1298 if (PL_nextwhite) {
5db06880 1299 if (PL_madskills)
6b29d1f5 1300 curmad('^', newSVpvs(""));
cd81e915 1301 CURMAD('_', PL_nextwhite);
5db06880
NC
1302 }
1303}
1304
1305STATIC void
1306S_curmad(pTHX_ char slot, SV *sv)
1307{
1308 MADPROP **where;
1309
1310 if (!sv)
1311 return;
cd81e915
NC
1312 if (PL_curforce < 0)
1313 where = &PL_thismad;
5db06880 1314 else
cd81e915 1315 where = &PL_nexttoke[PL_curforce].next_mad;
5db06880 1316
cd81e915 1317 if (PL_faketokens)
76f68e9b 1318 sv_setpvs(sv, "");
5db06880
NC
1319 else {
1320 if (!IN_BYTES) {
1321 if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1322 SvUTF8_on(sv);
1323 else if (PL_encoding) {
1324 sv_recode_to_utf8(sv, PL_encoding);
1325 }
1326 }
1327 }
1328
1329 /* keep a slot open for the head of the list? */
1330 if (slot != '_' && *where && (*where)->mad_key == '^') {
1331 (*where)->mad_key = slot;
daba3364 1332 sv_free(MUTABLE_SV(((*where)->mad_val)));
5db06880
NC
1333 (*where)->mad_val = (void*)sv;
1334 }
1335 else
1336 addmad(newMADsv(slot, sv), where, 0);
1337}
1338#else
b3f24c00
MHM
1339# define start_force(where) NOOP
1340# define curmad(slot, sv) NOOP
5db06880
NC
1341#endif
1342
ffb4593c
NT
1343/*
1344 * S_force_next
9cbb5ea2 1345 * When the lexer realizes it knows the next token (for instance,
ffb4593c 1346 * it is reordering tokens for the parser) then it can call S_force_next
9cbb5ea2 1347 * to know what token to return the next time the lexer is called. Caller
5db06880
NC
1348 * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1349 * and possibly PL_expect to ensure the lexer handles the token correctly.
ffb4593c
NT
1350 */
1351
4e553d73 1352STATIC void
cea2e8a9 1353S_force_next(pTHX_ I32 type)
79072805 1354{
97aff369 1355 dVAR;
704d4215
GG
1356#ifdef DEBUGGING
1357 if (DEBUG_T_TEST) {
1358 PerlIO_printf(Perl_debug_log, "### forced token:\n");
f05d7009 1359 tokereport(type, &NEXTVAL_NEXTTOKE);
704d4215
GG
1360 }
1361#endif
5db06880 1362#ifdef PERL_MAD
cd81e915 1363 if (PL_curforce < 0)
5db06880 1364 start_force(PL_lasttoke);
cd81e915 1365 PL_nexttoke[PL_curforce].next_type = type;
5db06880
NC
1366 if (PL_lex_state != LEX_KNOWNEXT)
1367 PL_lex_defer = PL_lex_state;
1368 PL_lex_state = LEX_KNOWNEXT;
1369 PL_lex_expect = PL_expect;
cd81e915 1370 PL_curforce = -1;
5db06880 1371#else
3280af22
NIS
1372 PL_nexttype[PL_nexttoke] = type;
1373 PL_nexttoke++;
1374 if (PL_lex_state != LEX_KNOWNEXT) {
1375 PL_lex_defer = PL_lex_state;
1376 PL_lex_expect = PL_expect;
1377 PL_lex_state = LEX_KNOWNEXT;
79072805 1378 }
5db06880 1379#endif
79072805
LW
1380}
1381
d0a148a6 1382STATIC SV *
15f169a1 1383S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
d0a148a6 1384{
97aff369 1385 dVAR;
740cce10
NC
1386 SV * const sv = newSVpvn_utf8(start, len,
1387 UTF && !IN_BYTES
1388 && is_utf8_string((const U8*)start, len));
d0a148a6
NC
1389 return sv;
1390}
1391
ffb4593c
NT
1392/*
1393 * S_force_word
1394 * When the lexer knows the next thing is a word (for instance, it has
1395 * just seen -> and it knows that the next char is a word char, then
02b34bbe
DM
1396 * it calls S_force_word to stick the next word into the PL_nexttoke/val
1397 * lookahead.
ffb4593c
NT
1398 *
1399 * Arguments:
b1b65b59 1400 * char *start : buffer position (must be within PL_linestr)
02b34bbe 1401 * int token : PL_next* will be this type of bare word (e.g., METHOD,WORD)
ffb4593c
NT
1402 * int check_keyword : if true, Perl checks to make sure the word isn't
1403 * a keyword (do this if the word is a label, e.g. goto FOO)
1404 * int allow_pack : if true, : characters will also be allowed (require,
1405 * use, etc. do this)
9cbb5ea2 1406 * int allow_initial_tick : used by the "sub" lexer only.
ffb4593c
NT
1407 */
1408
76e3520e 1409STATIC char *
cea2e8a9 1410S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
79072805 1411{
97aff369 1412 dVAR;
463ee0b2
LW
1413 register char *s;
1414 STRLEN len;
4e553d73 1415
7918f24d
NC
1416 PERL_ARGS_ASSERT_FORCE_WORD;
1417
29595ff2 1418 start = SKIPSPACE1(start);
463ee0b2 1419 s = start;
7e2040f0 1420 if (isIDFIRST_lazy_if(s,UTF) ||
a0d0e21e 1421 (allow_pack && *s == ':') ||
15f0808c 1422 (allow_initial_tick && *s == '\'') )
a0d0e21e 1423 {
3280af22 1424 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
5458a98a 1425 if (check_keyword && keyword(PL_tokenbuf, len, 0))
463ee0b2 1426 return start;
cd81e915 1427 start_force(PL_curforce);
5db06880
NC
1428 if (PL_madskills)
1429 curmad('X', newSVpvn(start,s-start));
463ee0b2 1430 if (token == METHOD) {
29595ff2 1431 s = SKIPSPACE1(s);
463ee0b2 1432 if (*s == '(')
3280af22 1433 PL_expect = XTERM;
463ee0b2 1434 else {
3280af22 1435 PL_expect = XOPERATOR;
463ee0b2 1436 }
79072805 1437 }
e74e6b3d 1438 if (PL_madskills)
63575281 1439 curmad('g', newSVpvs( "forced" ));
9ded7720 1440 NEXTVAL_NEXTTOKE.opval
d0a148a6
NC
1441 = (OP*)newSVOP(OP_CONST,0,
1442 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
9ded7720 1443 NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
79072805
LW
1444 force_next(token);
1445 }
1446 return s;
1447}
1448
ffb4593c
NT
1449/*
1450 * S_force_ident
9cbb5ea2 1451 * Called when the lexer wants $foo *foo &foo etc, but the program
ffb4593c
NT
1452 * text only contains the "foo" portion. The first argument is a pointer
1453 * to the "foo", and the second argument is the type symbol to prefix.
1454 * Forces the next token to be a "WORD".
9cbb5ea2 1455 * Creates the symbol if it didn't already exist (via gv_fetchpv()).
ffb4593c
NT
1456 */
1457
76e3520e 1458STATIC void
bfed75c6 1459S_force_ident(pTHX_ register const char *s, int kind)
79072805 1460{
97aff369 1461 dVAR;
7918f24d
NC
1462
1463 PERL_ARGS_ASSERT_FORCE_IDENT;
1464
c35e046a 1465 if (*s) {
90e5519e
NC
1466 const STRLEN len = strlen(s);
1467 OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
cd81e915 1468 start_force(PL_curforce);
9ded7720 1469 NEXTVAL_NEXTTOKE.opval = o;
79072805 1470 force_next(WORD);
748a9306 1471 if (kind) {
11343788 1472 o->op_private = OPpCONST_ENTERED;
55497cff 1473 /* XXX see note in pp_entereval() for why we forgo typo
1474 warnings if the symbol must be introduced in an eval.
1475 GSAR 96-10-12 */
90e5519e
NC
1476 gv_fetchpvn_flags(s, len,
1477 PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
1478 : GV_ADD,
1479 kind == '$' ? SVt_PV :
1480 kind == '@' ? SVt_PVAV :
1481 kind == '%' ? SVt_PVHV :
a0d0e21e 1482 SVt_PVGV
90e5519e 1483 );
748a9306 1484 }
79072805
LW
1485 }
1486}
1487
1571675a
GS
1488NV
1489Perl_str_to_version(pTHX_ SV *sv)
1490{
1491 NV retval = 0.0;
1492 NV nshift = 1.0;
1493 STRLEN len;
cfd0369c 1494 const char *start = SvPV_const(sv,len);
9d4ba2ae 1495 const char * const end = start + len;
504618e9 1496 const bool utf = SvUTF8(sv) ? TRUE : FALSE;
7918f24d
NC
1497
1498 PERL_ARGS_ASSERT_STR_TO_VERSION;
1499
1571675a 1500 while (start < end) {
ba210ebe 1501 STRLEN skip;
1571675a
GS
1502 UV n;
1503 if (utf)
9041c2e3 1504 n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1571675a
GS
1505 else {
1506 n = *(U8*)start;
1507 skip = 1;
1508 }
1509 retval += ((NV)n)/nshift;
1510 start += skip;
1511 nshift *= 1000;
1512 }
1513 return retval;
1514}
1515
4e553d73 1516/*
ffb4593c
NT
1517 * S_force_version
1518 * Forces the next token to be a version number.
e759cc13
RGS
1519 * If the next token appears to be an invalid version number, (e.g. "v2b"),
1520 * and if "guessing" is TRUE, then no new token is created (and the caller
1521 * must use an alternative parsing method).
ffb4593c
NT
1522 */
1523
76e3520e 1524STATIC char *
e759cc13 1525S_force_version(pTHX_ char *s, int guessing)
89bfa8cd 1526{
97aff369 1527 dVAR;
5f66b61c 1528 OP *version = NULL;
44dcb63b 1529 char *d;
5db06880
NC
1530#ifdef PERL_MAD
1531 I32 startoff = s - SvPVX(PL_linestr);
1532#endif
89bfa8cd 1533
7918f24d
NC
1534 PERL_ARGS_ASSERT_FORCE_VERSION;
1535
29595ff2 1536 s = SKIPSPACE1(s);
89bfa8cd 1537
44dcb63b 1538 d = s;
dd629d5b 1539 if (*d == 'v')
44dcb63b 1540 d++;
44dcb63b 1541 if (isDIGIT(*d)) {
e759cc13
RGS
1542 while (isDIGIT(*d) || *d == '_' || *d == '.')
1543 d++;
5db06880
NC
1544#ifdef PERL_MAD
1545 if (PL_madskills) {
cd81e915 1546 start_force(PL_curforce);
5db06880
NC
1547 curmad('X', newSVpvn(s,d-s));
1548 }
1549#endif
9f3d182e 1550 if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
dd629d5b 1551 SV *ver;
6154021b
RGS
1552 s = scan_num(s, &pl_yylval);
1553 version = pl_yylval.opval;
dd629d5b
GS
1554 ver = cSVOPx(version)->op_sv;
1555 if (SvPOK(ver) && !SvNIOK(ver)) {
862a34c6 1556 SvUPGRADE(ver, SVt_PVNV);
9d6ce603 1557 SvNV_set(ver, str_to_version(ver));
1571675a 1558 SvNOK_on(ver); /* hint that it is a version */
44dcb63b 1559 }
89bfa8cd 1560 }
5db06880
NC
1561 else if (guessing) {
1562#ifdef PERL_MAD
1563 if (PL_madskills) {
cd81e915
NC
1564 sv_free(PL_nextwhite); /* let next token collect whitespace */
1565 PL_nextwhite = 0;
5db06880
NC
1566 s = SvPVX(PL_linestr) + startoff;
1567 }
1568#endif
e759cc13 1569 return s;
5db06880 1570 }
89bfa8cd 1571 }
1572
5db06880
NC
1573#ifdef PERL_MAD
1574 if (PL_madskills && !version) {
cd81e915
NC
1575 sv_free(PL_nextwhite); /* let next token collect whitespace */
1576 PL_nextwhite = 0;
5db06880
NC
1577 s = SvPVX(PL_linestr) + startoff;
1578 }
1579#endif
89bfa8cd 1580 /* NOTE: The parser sees the package name and the VERSION swapped */
cd81e915 1581 start_force(PL_curforce);
9ded7720 1582 NEXTVAL_NEXTTOKE.opval = version;
4e553d73 1583 force_next(WORD);
89bfa8cd 1584
e759cc13 1585 return s;
89bfa8cd 1586}
1587
ffb4593c
NT
1588/*
1589 * S_tokeq
1590 * Tokenize a quoted string passed in as an SV. It finds the next
1591 * chunk, up to end of string or a backslash. It may make a new
1592 * SV containing that chunk (if HINT_NEW_STRING is on). It also
1593 * turns \\ into \.
1594 */
1595
76e3520e 1596STATIC SV *
cea2e8a9 1597S_tokeq(pTHX_ SV *sv)
79072805 1598{
97aff369 1599 dVAR;
79072805
LW
1600 register char *s;
1601 register char *send;
1602 register char *d;
b3ac6de7
IZ
1603 STRLEN len = 0;
1604 SV *pv = sv;
79072805 1605
7918f24d
NC
1606 PERL_ARGS_ASSERT_TOKEQ;
1607
79072805 1608 if (!SvLEN(sv))
b3ac6de7 1609 goto finish;
79072805 1610
a0d0e21e 1611 s = SvPV_force(sv, len);
21a311ee 1612 if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
b3ac6de7 1613 goto finish;
463ee0b2 1614 send = s + len;
79072805
LW
1615 while (s < send && *s != '\\')
1616 s++;
1617 if (s == send)
b3ac6de7 1618 goto finish;
79072805 1619 d = s;
be4731d2 1620 if ( PL_hints & HINT_NEW_STRING ) {
59cd0e26 1621 pv = newSVpvn_flags(SvPVX_const(pv), len, SVs_TEMP | SvUTF8(sv));
be4731d2 1622 }
79072805
LW
1623 while (s < send) {
1624 if (*s == '\\') {
a0d0e21e 1625 if (s + 1 < send && (s[1] == '\\'))
79072805
LW
1626 s++; /* all that, just for this */
1627 }
1628 *d++ = *s++;
1629 }
1630 *d = '\0';
95a20fc0 1631 SvCUR_set(sv, d - SvPVX_const(sv));
b3ac6de7 1632 finish:
3280af22 1633 if ( PL_hints & HINT_NEW_STRING )
eb0d8d16 1634 return new_constant(NULL, 0, "q", sv, pv, "q", 1);
79072805
LW
1635 return sv;
1636}
1637
ffb4593c
NT
1638/*
1639 * Now come three functions related to double-quote context,
1640 * S_sublex_start, S_sublex_push, and S_sublex_done. They're used when
1641 * converting things like "\u\Lgnat" into ucfirst(lc("gnat")). They
1642 * interact with PL_lex_state, and create fake ( ... ) argument lists
1643 * to handle functions and concatenation.
1644 * They assume that whoever calls them will be setting up a fake
1645 * join call, because each subthing puts a ',' after it. This lets
1646 * "lower \luPpEr"
1647 * become
1648 * join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1649 *
1650 * (I'm not sure whether the spurious commas at the end of lcfirst's
1651 * arguments and join's arguments are created or not).
1652 */
1653
1654/*
1655 * S_sublex_start
6154021b 1656 * Assumes that pl_yylval.ival is the op we're creating (e.g. OP_LCFIRST).
ffb4593c
NT
1657 *
1658 * Pattern matching will set PL_lex_op to the pattern-matching op to
6154021b 1659 * make (we return THING if pl_yylval.ival is OP_NULL, PMFUNC otherwise).
ffb4593c
NT
1660 *
1661 * OP_CONST and OP_READLINE are easy--just make the new op and return.
1662 *
1663 * Everything else becomes a FUNC.
1664 *
1665 * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1666 * had an OP_CONST or OP_READLINE). This just sets us up for a
1667 * call to S_sublex_push().
1668 */
1669
76e3520e 1670STATIC I32
cea2e8a9 1671S_sublex_start(pTHX)
79072805 1672{
97aff369 1673 dVAR;
6154021b 1674 register const I32 op_type = pl_yylval.ival;
79072805
LW
1675
1676 if (op_type == OP_NULL) {
6154021b 1677 pl_yylval.opval = PL_lex_op;
5f66b61c 1678 PL_lex_op = NULL;
79072805
LW
1679 return THING;
1680 }
1681 if (op_type == OP_CONST || op_type == OP_READLINE) {
3280af22 1682 SV *sv = tokeq(PL_lex_stuff);
b3ac6de7
IZ
1683
1684 if (SvTYPE(sv) == SVt_PVIV) {
1685 /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1686 STRLEN len;
96a5add6 1687 const char * const p = SvPV_const(sv, len);
740cce10 1688 SV * const nsv = newSVpvn_flags(p, len, SvUTF8(sv));
b3ac6de7
IZ
1689 SvREFCNT_dec(sv);
1690 sv = nsv;
4e553d73 1691 }
6154021b 1692 pl_yylval.opval = (OP*)newSVOP(op_type, 0, sv);
a0714e2c 1693 PL_lex_stuff = NULL;
6f33ba73
RGS
1694 /* Allow <FH> // "foo" */
1695 if (op_type == OP_READLINE)
1696 PL_expect = XTERMORDORDOR;
79072805
LW
1697 return THING;
1698 }
e3f73d4e
RGS
1699 else if (op_type == OP_BACKTICK && PL_lex_op) {
1700 /* readpipe() vas overriden */
1701 cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
6154021b 1702 pl_yylval.opval = PL_lex_op;
9b201d7d 1703 PL_lex_op = NULL;
e3f73d4e
RGS
1704 PL_lex_stuff = NULL;
1705 return THING;
1706 }
79072805 1707
3280af22 1708 PL_sublex_info.super_state = PL_lex_state;
eac04b2e 1709 PL_sublex_info.sub_inwhat = (U16)op_type;
3280af22
NIS
1710 PL_sublex_info.sub_op = PL_lex_op;
1711 PL_lex_state = LEX_INTERPPUSH;
55497cff 1712
3280af22
NIS
1713 PL_expect = XTERM;
1714 if (PL_lex_op) {
6154021b 1715 pl_yylval.opval = PL_lex_op;
5f66b61c 1716 PL_lex_op = NULL;
55497cff 1717 return PMFUNC;
1718 }
1719 else
1720 return FUNC;
1721}
1722
ffb4593c
NT
1723/*
1724 * S_sublex_push
1725 * Create a new scope to save the lexing state. The scope will be
1726 * ended in S_sublex_done. Returns a '(', starting the function arguments
1727 * to the uc, lc, etc. found before.
1728 * Sets PL_lex_state to LEX_INTERPCONCAT.
1729 */
1730
76e3520e 1731STATIC I32
cea2e8a9 1732S_sublex_push(pTHX)
55497cff 1733{
27da23d5 1734 dVAR;
f46d017c 1735 ENTER;
55497cff 1736
3280af22 1737 PL_lex_state = PL_sublex_info.super_state;
651b5b28 1738 SAVEBOOL(PL_lex_dojoin);
3280af22 1739 SAVEI32(PL_lex_brackets);
3280af22
NIS
1740 SAVEI32(PL_lex_casemods);
1741 SAVEI32(PL_lex_starts);
651b5b28 1742 SAVEI8(PL_lex_state);
7766f137 1743 SAVEVPTR(PL_lex_inpat);
98246f1e 1744 SAVEI16(PL_lex_inwhat);
57843af0 1745 SAVECOPLINE(PL_curcop);
3280af22 1746 SAVEPPTR(PL_bufptr);
8452ff4b 1747 SAVEPPTR(PL_bufend);
3280af22
NIS
1748 SAVEPPTR(PL_oldbufptr);
1749 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
1750 SAVEPPTR(PL_last_lop);
1751 SAVEPPTR(PL_last_uni);
3280af22
NIS
1752 SAVEPPTR(PL_linestart);
1753 SAVESPTR(PL_linestr);
8edd5f42
RGS
1754 SAVEGENERICPV(PL_lex_brackstack);
1755 SAVEGENERICPV(PL_lex_casestack);
3280af22
NIS
1756
1757 PL_linestr = PL_lex_stuff;
a0714e2c 1758 PL_lex_stuff = NULL;
3280af22 1759
9cbb5ea2
GS
1760 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1761 = SvPVX(PL_linestr);
3280af22 1762 PL_bufend += SvCUR(PL_linestr);
bd61b366 1763 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
1764 SAVEFREESV(PL_linestr);
1765
1766 PL_lex_dojoin = FALSE;
1767 PL_lex_brackets = 0;
a02a5408
JC
1768 Newx(PL_lex_brackstack, 120, char);
1769 Newx(PL_lex_casestack, 12, char);
3280af22
NIS
1770 PL_lex_casemods = 0;
1771 *PL_lex_casestack = '\0';
1772 PL_lex_starts = 0;
1773 PL_lex_state = LEX_INTERPCONCAT;
eb160463 1774 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22
NIS
1775
1776 PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1777 if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1778 PL_lex_inpat = PL_sublex_info.sub_op;
79072805 1779 else
5f66b61c 1780 PL_lex_inpat = NULL;
79072805 1781
55497cff 1782 return '(';
79072805
LW
1783}
1784
ffb4593c
NT
1785/*
1786 * S_sublex_done
1787 * Restores lexer state after a S_sublex_push.
1788 */
1789
76e3520e 1790STATIC I32
cea2e8a9 1791S_sublex_done(pTHX)
79072805 1792{
27da23d5 1793 dVAR;
3280af22 1794 if (!PL_lex_starts++) {
396482e1 1795 SV * const sv = newSVpvs("");
9aa983d2
JH
1796 if (SvUTF8(PL_linestr))
1797 SvUTF8_on(sv);
3280af22 1798 PL_expect = XOPERATOR;
6154021b 1799 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
79072805
LW
1800 return THING;
1801 }
1802
3280af22
NIS
1803 if (PL_lex_casemods) { /* oops, we've got some unbalanced parens */
1804 PL_lex_state = LEX_INTERPCASEMOD;
cea2e8a9 1805 return yylex();
79072805
LW
1806 }
1807
ffb4593c 1808 /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
3280af22
NIS
1809 if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1810 PL_linestr = PL_lex_repl;
1811 PL_lex_inpat = 0;
1812 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1813 PL_bufend += SvCUR(PL_linestr);
bd61b366 1814 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
1815 SAVEFREESV(PL_linestr);
1816 PL_lex_dojoin = FALSE;
1817 PL_lex_brackets = 0;
3280af22
NIS
1818 PL_lex_casemods = 0;
1819 *PL_lex_casestack = '\0';
1820 PL_lex_starts = 0;
25da4f38 1821 if (SvEVALED(PL_lex_repl)) {
3280af22
NIS
1822 PL_lex_state = LEX_INTERPNORMAL;
1823 PL_lex_starts++;
e9fa98b2
HS
1824 /* we don't clear PL_lex_repl here, so that we can check later
1825 whether this is an evalled subst; that means we rely on the
1826 logic to ensure sublex_done() is called again only via the
1827 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
79072805 1828 }
e9fa98b2 1829 else {
3280af22 1830 PL_lex_state = LEX_INTERPCONCAT;
a0714e2c 1831 PL_lex_repl = NULL;
e9fa98b2 1832 }
79072805 1833 return ',';
ffed7fef
LW
1834 }
1835 else {
5db06880
NC
1836#ifdef PERL_MAD
1837 if (PL_madskills) {
cd81e915
NC
1838 if (PL_thiswhite) {
1839 if (!PL_endwhite)
6b29d1f5 1840 PL_endwhite = newSVpvs("");
cd81e915
NC
1841 sv_catsv(PL_endwhite, PL_thiswhite);
1842 PL_thiswhite = 0;
1843 }
1844 if (PL_thistoken)
76f68e9b 1845 sv_setpvs(PL_thistoken,"");
5db06880 1846 else
cd81e915 1847 PL_realtokenstart = -1;
5db06880
NC
1848 }
1849#endif
f46d017c 1850 LEAVE;
3280af22
NIS
1851 PL_bufend = SvPVX(PL_linestr);
1852 PL_bufend += SvCUR(PL_linestr);
1853 PL_expect = XOPERATOR;
09bef843 1854 PL_sublex_info.sub_inwhat = 0;
79072805 1855 return ')';
ffed7fef
LW
1856 }
1857}
1858
02aa26ce
NT
1859/*
1860 scan_const
1861
1862 Extracts a pattern, double-quoted string, or transliteration. This
1863 is terrifying code.
1864
94def140 1865 It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
3280af22 1866 processing a pattern (PL_lex_inpat is true), a transliteration
94def140 1867 (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
02aa26ce 1868
94def140
TS
1869 Returns a pointer to the character scanned up to. If this is
1870 advanced from the start pointer supplied (i.e. if anything was
9b599b2a 1871 successfully parsed), will leave an OP for the substring scanned
6154021b 1872 in pl_yylval. Caller must intuit reason for not parsing further
9b599b2a
GS
1873 by looking at the next characters herself.
1874
02aa26ce
NT
1875 In patterns:
1876 backslashes:
1877 double-quoted style: \r and \n
1878 regexp special ones: \D \s
94def140
TS
1879 constants: \x31
1880 backrefs: \1
02aa26ce
NT
1881 case and quoting: \U \Q \E
1882 stops on @ and $, but not for $ as tail anchor
1883
1884 In transliterations:
1885 characters are VERY literal, except for - not at the start or end
94def140
TS
1886 of the string, which indicates a range. If the range is in bytes,
1887 scan_const expands the range to the full set of intermediate
1888 characters. If the range is in utf8, the hyphen is replaced with
1889 a certain range mark which will be handled by pmtrans() in op.c.
02aa26ce
NT
1890
1891 In double-quoted strings:
1892 backslashes:
1893 double-quoted style: \r and \n
94def140
TS
1894 constants: \x31
1895 deprecated backrefs: \1 (in substitution replacements)
02aa26ce
NT
1896 case and quoting: \U \Q \E
1897 stops on @ and $
1898
1899 scan_const does *not* construct ops to handle interpolated strings.
1900 It stops processing as soon as it finds an embedded $ or @ variable
1901 and leaves it to the caller to work out what's going on.
1902
94def140
TS
1903 embedded arrays (whether in pattern or not) could be:
1904 @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
1905
1906 $ in double-quoted strings must be the symbol of an embedded scalar.
02aa26ce
NT
1907
1908 $ in pattern could be $foo or could be tail anchor. Assumption:
1909 it's a tail anchor if $ is the last thing in the string, or if it's
94def140 1910 followed by one of "()| \r\n\t"
02aa26ce
NT
1911
1912 \1 (backreferences) are turned into $1
1913
1914 The structure of the code is
1915 while (there's a character to process) {
94def140
TS
1916 handle transliteration ranges
1917 skip regexp comments /(?#comment)/ and codes /(?{code})/
1918 skip #-initiated comments in //x patterns
1919 check for embedded arrays
02aa26ce
NT
1920 check for embedded scalars
1921 if (backslash) {
94def140
TS
1922 leave intact backslashes from leaveit (below)
1923 deprecate \1 in substitution replacements
02aa26ce
NT
1924 handle string-changing backslashes \l \U \Q \E, etc.
1925 switch (what was escaped) {
94def140
TS
1926 handle \- in a transliteration (becomes a literal -)
1927 handle \132 (octal characters)
1928 handle \x15 and \x{1234} (hex characters)
1929 handle \N{name} (named characters)
1930 handle \cV (control characters)
1931 handle printf-style backslashes (\f, \r, \n, etc)
02aa26ce 1932 } (end switch)
77a135fe 1933 continue
02aa26ce 1934 } (end if backslash)
77a135fe 1935 handle regular character
02aa26ce 1936 } (end while character to read)
4e553d73 1937
02aa26ce
NT
1938*/
1939
76e3520e 1940STATIC char *
cea2e8a9 1941S_scan_const(pTHX_ char *start)
79072805 1942{
97aff369 1943 dVAR;
3280af22 1944 register char *send = PL_bufend; /* end of the constant */
77a135fe
KW
1945 SV *sv = newSV(send - start); /* sv for the constant. See
1946 note below on sizing. */
02aa26ce
NT
1947 register char *s = start; /* start of the constant */
1948 register char *d = SvPVX(sv); /* destination for copies */
1949 bool dorange = FALSE; /* are we in a translit range? */
c2e66d9e 1950 bool didrange = FALSE; /* did we just finish a range? */
2b9d42f0 1951 I32 has_utf8 = FALSE; /* Output constant is UTF8 */
77a135fe
KW
1952 I32 this_utf8 = UTF; /* Is the source string assumed
1953 to be UTF8? But, this can
1954 show as true when the source
1955 isn't utf8, as for example
1956 when it is entirely composed
1957 of hex constants */
1958
1959 /* Note on sizing: The scanned constant is placed into sv, which is
1960 * initialized by newSV() assuming one byte of output for every byte of
1961 * input. This routine expects newSV() to allocate an extra byte for a
1962 * trailing NUL, which this routine will append if it gets to the end of
1963 * the input. There may be more bytes of input than output (eg., \N{LATIN
1964 * CAPITAL LETTER A}), or more output than input if the constant ends up
1965 * recoded to utf8, but each time a construct is found that might increase
1966 * the needed size, SvGROW() is called. Its size parameter each time is
1967 * based on the best guess estimate at the time, namely the length used so
1968 * far, plus the length the current construct will occupy, plus room for
1969 * the trailing NUL, plus one byte for every input byte still unscanned */
1970
012bcf8d 1971 UV uv;
4c3a8340
TS
1972#ifdef EBCDIC
1973 UV literal_endpoint = 0;
e294cc5d 1974 bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
4c3a8340 1975#endif
012bcf8d 1976
7918f24d
NC
1977 PERL_ARGS_ASSERT_SCAN_CONST;
1978
2b9d42f0
NIS
1979 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1980 /* If we are doing a trans and we know we want UTF8 set expectation */
1981 has_utf8 = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1982 this_utf8 = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1983 }
1984
1985
79072805 1986 while (s < send || dorange) {
02aa26ce 1987 /* get transliterations out of the way (they're most literal) */
3280af22 1988 if (PL_lex_inwhat == OP_TRANS) {
02aa26ce 1989 /* expand a range A-Z to the full set of characters. AIE! */
79072805 1990 if (dorange) {
1ba5c669
JH
1991 I32 i; /* current expanded character */
1992 I32 min; /* first character in range */
1993 I32 max; /* last character in range */
02aa26ce 1994
e294cc5d
JH
1995#ifdef EBCDIC
1996 UV uvmax = 0;
1997#endif
1998
1999 if (has_utf8
2000#ifdef EBCDIC
2001 && !native_range
2002#endif
2003 ) {
9d4ba2ae 2004 char * const c = (char*)utf8_hop((U8*)d, -1);
8973db79
JH
2005 char *e = d++;
2006 while (e-- > c)
2007 *(e + 1) = *e;
25716404 2008 *c = (char)UTF_TO_NATIVE(0xff);
8973db79
JH
2009 /* mark the range as done, and continue */
2010 dorange = FALSE;
2011 didrange = TRUE;
2012 continue;
2013 }
2b9d42f0 2014
95a20fc0 2015 i = d - SvPVX_const(sv); /* remember current offset */
e294cc5d
JH
2016#ifdef EBCDIC
2017 SvGROW(sv,
2018 SvLEN(sv) + (has_utf8 ?
2019 (512 - UTF_CONTINUATION_MARK +
2020 UNISKIP(0x100))
2021 : 256));
2022 /* How many two-byte within 0..255: 128 in UTF-8,
2023 * 96 in UTF-8-mod. */
2024#else
9cbb5ea2 2025 SvGROW(sv, SvLEN(sv) + 256); /* never more than 256 chars in a range */
e294cc5d 2026#endif
9cbb5ea2 2027 d = SvPVX(sv) + i; /* refresh d after realloc */
e294cc5d
JH
2028#ifdef EBCDIC
2029 if (has_utf8) {
2030 int j;
2031 for (j = 0; j <= 1; j++) {
2032 char * const c = (char*)utf8_hop((U8*)d, -1);
2033 const UV uv = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
2034 if (j)
2035 min = (U8)uv;
2036 else if (uv < 256)
2037 max = (U8)uv;
2038 else {
2039 max = (U8)0xff; /* only to \xff */
2040 uvmax = uv; /* \x{100} to uvmax */
2041 }
2042 d = c; /* eat endpoint chars */
2043 }
2044 }
2045 else {
2046#endif
2047 d -= 2; /* eat the first char and the - */
2048 min = (U8)*d; /* first char in range */
2049 max = (U8)d[1]; /* last char in range */
2050#ifdef EBCDIC
2051 }
2052#endif
8ada0baa 2053
c2e66d9e 2054 if (min > max) {
01ec43d0 2055 Perl_croak(aTHX_
d1573ac7 2056 "Invalid range \"%c-%c\" in transliteration operator",
1ba5c669 2057 (char)min, (char)max);
c2e66d9e
GS
2058 }
2059
c7f1f016 2060#ifdef EBCDIC
4c3a8340
TS
2061 if (literal_endpoint == 2 &&
2062 ((isLOWER(min) && isLOWER(max)) ||
2063 (isUPPER(min) && isUPPER(max)))) {
8ada0baa
JH
2064 if (isLOWER(min)) {
2065 for (i = min; i <= max; i++)
2066 if (isLOWER(i))
db42d148 2067 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
2068 } else {
2069 for (i = min; i <= max; i++)
2070 if (isUPPER(i))
db42d148 2071 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
2072 }
2073 }
2074 else
2075#endif
2076 for (i = min; i <= max; i++)
e294cc5d
JH
2077#ifdef EBCDIC
2078 if (has_utf8) {
2079 const U8 ch = (U8)NATIVE_TO_UTF(i);
2080 if (UNI_IS_INVARIANT(ch))
2081 *d++ = (U8)i;
2082 else {
2083 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2084 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2085 }
2086 }
2087 else
2088#endif
2089 *d++ = (char)i;
2090
2091#ifdef EBCDIC
2092 if (uvmax) {
2093 d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2094 if (uvmax > 0x101)
2095 *d++ = (char)UTF_TO_NATIVE(0xff);
2096 if (uvmax > 0x100)
2097 d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2098 }
2099#endif
02aa26ce
NT
2100
2101 /* mark the range as done, and continue */
79072805 2102 dorange = FALSE;
01ec43d0 2103 didrange = TRUE;
4c3a8340
TS
2104#ifdef EBCDIC
2105 literal_endpoint = 0;
2106#endif
79072805 2107 continue;
4e553d73 2108 }
02aa26ce
NT
2109
2110 /* range begins (ignore - as first or last char) */
79072805 2111 else if (*s == '-' && s+1 < send && s != start) {
4e553d73 2112 if (didrange) {
1fafa243 2113 Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
01ec43d0 2114 }
e294cc5d
JH
2115 if (has_utf8
2116#ifdef EBCDIC
2117 && !native_range
2118#endif
2119 ) {
25716404 2120 *d++ = (char)UTF_TO_NATIVE(0xff); /* use illegal utf8 byte--see pmtrans */
a0ed51b3
LW
2121 s++;
2122 continue;
2123 }
79072805
LW
2124 dorange = TRUE;
2125 s++;
01ec43d0
GS
2126 }
2127 else {
2128 didrange = FALSE;
4c3a8340
TS
2129#ifdef EBCDIC
2130 literal_endpoint = 0;
e294cc5d 2131 native_range = TRUE;
4c3a8340 2132#endif
01ec43d0 2133 }
79072805 2134 }
02aa26ce
NT
2135
2136 /* if we get here, we're not doing a transliteration */
2137
0f5d15d6
IZ
2138 /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2139 except for the last char, which will be done separately. */
3280af22 2140 else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
cc6b7395 2141 if (s[2] == '#') {
e994fd66 2142 while (s+1 < send && *s != ')')
db42d148 2143 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
155aba94
GS
2144 }
2145 else if (s[2] == '{' /* This should match regcomp.c */
67edc0c9 2146 || (s[2] == '?' && s[3] == '{'))
155aba94 2147 {
cc6b7395 2148 I32 count = 1;
0f5d15d6 2149 char *regparse = s + (s[2] == '{' ? 3 : 4);
cc6b7395
IZ
2150 char c;
2151
d9f97599
GS
2152 while (count && (c = *regparse)) {
2153 if (c == '\\' && regparse[1])
2154 regparse++;
4e553d73 2155 else if (c == '{')
cc6b7395 2156 count++;
4e553d73 2157 else if (c == '}')
cc6b7395 2158 count--;
d9f97599 2159 regparse++;
cc6b7395 2160 }
e994fd66 2161 if (*regparse != ')')
5bdf89e7 2162 regparse--; /* Leave one char for continuation. */
0f5d15d6 2163 while (s < regparse)
db42d148 2164 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
cc6b7395 2165 }
748a9306 2166 }
02aa26ce
NT
2167
2168 /* likewise skip #-initiated comments in //x patterns */
3280af22
NIS
2169 else if (*s == '#' && PL_lex_inpat &&
2170 ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
748a9306 2171 while (s+1 < send && *s != '\n')
db42d148 2172 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
748a9306 2173 }
02aa26ce 2174
5d1d4326 2175 /* check for embedded arrays
da6eedaa 2176 (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
5d1d4326 2177 */
1749ea0d
TS
2178 else if (*s == '@' && s[1]) {
2179 if (isALNUM_lazy_if(s+1,UTF))
2180 break;
2181 if (strchr(":'{$", s[1]))
2182 break;
2183 if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2184 break; /* in regexp, neither @+ nor @- are interpolated */
2185 }
02aa26ce
NT
2186
2187 /* check for embedded scalars. only stop if we're sure it's a
2188 variable.
2189 */
79072805 2190 else if (*s == '$') {
3280af22 2191 if (!PL_lex_inpat) /* not a regexp, so $ must be var */
79072805 2192 break;
77772344
B
2193 if (s + 1 < send && !strchr("()| \r\n\t", s[1])) {
2194 if (s[1] == '\\' && ckWARN(WARN_AMBIGUOUS)) {
2195 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2196 "Possible unintended interpolation of $\\ in regex");
2197 }
79072805 2198 break; /* in regexp, $ might be tail anchor */
77772344 2199 }
79072805 2200 }
02aa26ce 2201
2b9d42f0
NIS
2202 /* End of else if chain - OP_TRANS rejoin rest */
2203
02aa26ce 2204 /* backslashes */
79072805
LW
2205 if (*s == '\\' && s+1 < send) {
2206 s++;
02aa26ce 2207
02aa26ce 2208 /* deprecate \1 in strings and substitution replacements */
3280af22 2209 if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
a0d0e21e 2210 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
79072805 2211 {
599cee73 2212 if (ckWARN(WARN_SYNTAX))
9014280d 2213 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
79072805
LW
2214 *--s = '$';
2215 break;
2216 }
02aa26ce
NT
2217
2218 /* string-change backslash escapes */
3280af22 2219 if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
79072805
LW
2220 --s;
2221 break;
2222 }
cc74c5bd
TS
2223 /* skip any other backslash escapes in a pattern */
2224 else if (PL_lex_inpat) {
2225 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2226 goto default_action;
2227 }
02aa26ce
NT
2228
2229 /* if we get here, it's either a quoted -, or a digit */
79072805 2230 switch (*s) {
02aa26ce
NT
2231
2232 /* quoted - in transliterations */
79072805 2233 case '-':
3280af22 2234 if (PL_lex_inwhat == OP_TRANS) {
79072805
LW
2235 *d++ = *s++;
2236 continue;
2237 }
2238 /* FALL THROUGH */
2239 default:
11b8faa4 2240 {
86f97054 2241 if ((isALPHA(*s) || isDIGIT(*s)) &&
041457d9 2242 ckWARN(WARN_MISC))
9014280d 2243 Perl_warner(aTHX_ packWARN(WARN_MISC),
e294cc5d
JH
2244 "Unrecognized escape \\%c passed through",
2245 *s);
11b8faa4 2246 /* default action is to copy the quoted character */
f9a63242 2247 goto default_action;
11b8faa4 2248 }
02aa26ce 2249
77a135fe 2250 /* eg. \132 indicates the octal constant 0x132 */
79072805
LW
2251 case '0': case '1': case '2': case '3':
2252 case '4': case '5': case '6': case '7':
ba210ebe 2253 {
53305cf1
NC
2254 I32 flags = 0;
2255 STRLEN len = 3;
77a135fe 2256 uv = NATIVE_TO_UNI(grok_oct(s, &len, &flags, NULL));
ba210ebe
JH
2257 s += len;
2258 }
012bcf8d 2259 goto NUM_ESCAPE_INSERT;
02aa26ce 2260
77a135fe 2261 /* eg. \x24 indicates the hex constant 0x24 */
79072805 2262 case 'x':
a0ed51b3
LW
2263 ++s;
2264 if (*s == '{') {
9d4ba2ae 2265 char* const e = strchr(s, '}');
a4c04bdc
NC
2266 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2267 PERL_SCAN_DISALLOW_PREFIX;
53305cf1 2268 STRLEN len;
355860ce 2269
53305cf1 2270 ++s;
adaeee49 2271 if (!e) {
a0ed51b3 2272 yyerror("Missing right brace on \\x{}");
355860ce 2273 continue;
ba210ebe 2274 }
53305cf1 2275 len = e - s;
77a135fe 2276 uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
ba210ebe 2277 s = e + 1;
a0ed51b3
LW
2278 }
2279 else {
ba210ebe 2280 {
53305cf1 2281 STRLEN len = 2;
a4c04bdc 2282 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
77a135fe 2283 uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
ba210ebe
JH
2284 s += len;
2285 }
012bcf8d
GS
2286 }
2287
2288 NUM_ESCAPE_INSERT:
77a135fe
KW
2289 /* Insert oct, hex, or \N{U+...} escaped character. There will
2290 * always be enough room in sv since such escapes will be
2291 * longer than any UTF-8 sequence they can end up as, except if
2292 * they force us to recode the rest of the string into utf8 */
ba7cea30 2293
77a135fe
KW
2294 /* Here uv is the ordinal of the next character being added in
2295 * unicode (converted from native). (It has to be done before
2296 * here because \N is interpreted as unicode, and oct and hex
2297 * as native.) */
2298 if (!UNI_IS_INVARIANT(uv)) {
9aa983d2 2299 if (!has_utf8 && uv > 255) {
77a135fe
KW
2300 /* Might need to recode whatever we have accumulated so
2301 * far if it contains any chars variant in utf8 or
2302 * utf-ebcdic. */
2303
2304 SvCUR_set(sv, d - SvPVX_const(sv));
2305 SvPOK_on(sv);
2306 *d = '\0';
77a135fe 2307 /* See Note on sizing above. */
7bf79863
KW
2308 sv_utf8_upgrade_flags_grow(sv,
2309 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2310 UNISKIP(uv) + (STRLEN)(send - s) + 1);
77a135fe
KW
2311 d = SvPVX(sv) + SvCUR(sv);
2312 has_utf8 = TRUE;
012bcf8d
GS
2313 }
2314
77a135fe
KW
2315 if (has_utf8) {
2316 d = (char*)uvuni_to_utf8((U8*)d, uv);
f9a63242
JH
2317 if (PL_lex_inwhat == OP_TRANS &&
2318 PL_sublex_info.sub_op) {
2319 PL_sublex_info.sub_op->op_private |=
2320 (PL_lex_repl ? OPpTRANS_FROM_UTF
2321 : OPpTRANS_TO_UTF);
f9a63242 2322 }
e294cc5d
JH
2323#ifdef EBCDIC
2324 if (uv > 255 && !dorange)
2325 native_range = FALSE;
2326#endif
012bcf8d 2327 }
a0ed51b3 2328 else {
012bcf8d 2329 *d++ = (char)uv;
a0ed51b3 2330 }
012bcf8d
GS
2331 }
2332 else {
c4d5f83a 2333 *d++ = (char) uv;
a0ed51b3 2334 }
79072805 2335 continue;
02aa26ce 2336
77a135fe
KW
2337 /* \N{LATIN SMALL LETTER A} is a named character, and so is
2338 * \N{U+0041} */
4a2d328f 2339 case 'N':
55eda711 2340 ++s;
423cee85
JH
2341 if (*s == '{') {
2342 char* e = strchr(s, '}');
155aba94 2343 SV *res;
423cee85 2344 STRLEN len;
cfd0369c 2345 const char *str;
4e553d73 2346
423cee85 2347 if (!e) {
5777a3f7 2348 yyerror("Missing right brace on \\N{}");
423cee85
JH
2349 e = s - 1;
2350 goto cont_scan;
2351 }
dbc0d4f2 2352 if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
77a135fe
KW
2353 /* \N{U+...} The ... is a unicode value even on EBCDIC
2354 * machines */
dbc0d4f2
JH
2355 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2356 PERL_SCAN_DISALLOW_PREFIX;
2357 s += 3;
2358 len = e - s;
2359 uv = grok_hex(s, &len, &flags, NULL);
b57a0404
JH
2360 if ( e > s && len != (STRLEN)(e - s) ) {
2361 uv = 0xFFFD;
fc8cd66c 2362 }
dbc0d4f2
JH
2363 s = e + 1;
2364 goto NUM_ESCAPE_INSERT;
2365 }
55eda711 2366 res = newSVpvn(s + 1, e - s - 1);
bd61b366 2367 res = new_constant( NULL, 0, "charnames",
eb0d8d16 2368 res, NULL, s - 2, e - s + 3 );
f9a63242
JH
2369 if (has_utf8)
2370 sv_utf8_upgrade(res);
cfd0369c 2371 str = SvPV_const(res,len);
1c47067b
JH
2372#ifdef EBCDIC_NEVER_MIND
2373 /* charnames uses pack U and that has been
2374 * recently changed to do the below uni->native
2375 * mapping, so this would be redundant (and wrong,
2376 * the code point would be doubly converted).
2377 * But leave this in just in case the pack U change
2378 * gets revoked, but the semantics is still
2379 * desireable for charnames. --jhi */
cddc7ef4 2380 {
cfd0369c 2381 UV uv = utf8_to_uvchr((const U8*)str, 0);
cddc7ef4
JH
2382
2383 if (uv < 0x100) {
89ebb4a3 2384 U8 tmpbuf[UTF8_MAXBYTES+1], *d;
cddc7ef4
JH
2385
2386 d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
2387 sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
cfd0369c 2388 str = SvPV_const(res, len);
cddc7ef4
JH
2389 }
2390 }
2391#endif
77a135fe
KW
2392 /* If destination is not in utf8 but this new character is,
2393 * recode the dest to utf8 */
89491803 2394 if (!has_utf8 && SvUTF8(res)) {
77a135fe 2395 SvCUR_set(sv, d - SvPVX_const(sv));
f08d6ad9 2396 SvPOK_on(sv);
e4f3eed8 2397 *d = '\0';
77a135fe 2398 /* See Note on sizing above. */
7bf79863
KW
2399 sv_utf8_upgrade_flags_grow(sv,
2400 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2401 len + (STRLEN)(send - s) + 1);
f08d6ad9 2402 d = SvPVX(sv) + SvCUR(sv);
89491803 2403 has_utf8 = TRUE;
77a135fe 2404 } else if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
423cee85 2405
77a135fe
KW
2406 /* See Note on sizing above. (NOTE: SvCUR() is not set
2407 * correctly here). */
2408 const STRLEN off = d - SvPVX_const(sv);
2409 d = SvGROW(sv, off + len + (STRLEN)(send - s) + 1) + off;
423cee85 2410 }
e294cc5d
JH
2411#ifdef EBCDIC
2412 if (!dorange)
2413 native_range = FALSE; /* \N{} is guessed to be Unicode */
2414#endif
423cee85
JH
2415 Copy(str, d, len, char);
2416 d += len;
2417 SvREFCNT_dec(res);
2418 cont_scan:
2419 s = e + 1;
2420 }
2421 else
5777a3f7 2422 yyerror("Missing braces on \\N{}");
423cee85
JH
2423 continue;
2424
02aa26ce 2425 /* \c is a control character */
79072805
LW
2426 case 'c':
2427 s++;
961ce445 2428 if (s < send) {
ba210ebe 2429 U8 c = *s++;
c7f1f016
NIS
2430#ifdef EBCDIC
2431 if (isLOWER(c))
2432 c = toUPPER(c);
2433#endif
db42d148 2434 *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
ba210ebe 2435 }
961ce445
RGS
2436 else {
2437 yyerror("Missing control char name in \\c");
2438 }
79072805 2439 continue;
02aa26ce
NT
2440
2441 /* printf-style backslashes, formfeeds, newlines, etc */
79072805 2442 case 'b':
db42d148 2443 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
79072805
LW
2444 break;
2445 case 'n':
db42d148 2446 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
79072805
LW
2447 break;
2448 case 'r':
db42d148 2449 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
79072805
LW
2450 break;
2451 case 'f':
db42d148 2452 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
79072805
LW
2453 break;
2454 case 't':
db42d148 2455 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
79072805 2456 break;
34a3fe2a 2457 case 'e':
db42d148 2458 *d++ = ASCII_TO_NEED(has_utf8,'\033');
34a3fe2a
PP
2459 break;
2460 case 'a':
db42d148 2461 *d++ = ASCII_TO_NEED(has_utf8,'\007');
79072805 2462 break;
02aa26ce
NT
2463 } /* end switch */
2464
79072805
LW
2465 s++;
2466 continue;
02aa26ce 2467 } /* end if (backslash) */
4c3a8340
TS
2468#ifdef EBCDIC
2469 else
2470 literal_endpoint++;
2471#endif
02aa26ce 2472
f9a63242 2473 default_action:
77a135fe
KW
2474 /* If we started with encoded form, or already know we want it,
2475 then encode the next character */
2476 if (! NATIVE_IS_INVARIANT((U8)(*s)) && (this_utf8 || has_utf8)) {
2b9d42f0 2477 STRLEN len = 1;
77a135fe
KW
2478
2479
2480 /* One might think that it is wasted effort in the case of the
2481 * source being utf8 (this_utf8 == TRUE) to take the next character
2482 * in the source, convert it to an unsigned value, and then convert
2483 * it back again. But the source has not been validated here. The
2484 * routine that does the conversion checks for errors like
2485 * malformed utf8 */
2486
5f66b61c
AL
2487 const UV nextuv = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
2488 const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
77a135fe
KW
2489 if (!has_utf8) {
2490 SvCUR_set(sv, d - SvPVX_const(sv));
2491 SvPOK_on(sv);
2492 *d = '\0';
77a135fe 2493 /* See Note on sizing above. */
7bf79863
KW
2494 sv_utf8_upgrade_flags_grow(sv,
2495 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2496 need + (STRLEN)(send - s) + 1);
77a135fe
KW
2497 d = SvPVX(sv) + SvCUR(sv);
2498 has_utf8 = TRUE;
2499 } else if (need > len) {
2500 /* encoded value larger than old, may need extra space (NOTE:
2501 * SvCUR() is not set correctly here). See Note on sizing
2502 * above. */
9d4ba2ae 2503 const STRLEN off = d - SvPVX_const(sv);
77a135fe 2504 d = SvGROW(sv, off + need + (STRLEN)(send - s) + 1) + off;
2b9d42f0 2505 }
77a135fe
KW
2506 s += len;
2507
5f66b61c 2508 d = (char*)uvchr_to_utf8((U8*)d, nextuv);
e294cc5d
JH
2509#ifdef EBCDIC
2510 if (uv > 255 && !dorange)
2511 native_range = FALSE;
2512#endif
2b9d42f0
NIS
2513 }
2514 else {
2515 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2516 }
02aa26ce
NT
2517 } /* while loop to process each character */
2518
2519 /* terminate the string and set up the sv */
79072805 2520 *d = '\0';
95a20fc0 2521 SvCUR_set(sv, d - SvPVX_const(sv));
2b9d42f0 2522 if (SvCUR(sv) >= SvLEN(sv))
d0063567 2523 Perl_croak(aTHX_ "panic: constant overflowed allocated space");
2b9d42f0 2524
79072805 2525 SvPOK_on(sv);
9f4817db 2526 if (PL_encoding && !has_utf8) {
d0063567
DK
2527 sv_recode_to_utf8(sv, PL_encoding);
2528 if (SvUTF8(sv))
2529 has_utf8 = TRUE;
9f4817db 2530 }
2b9d42f0 2531 if (has_utf8) {
7e2040f0 2532 SvUTF8_on(sv);
2b9d42f0 2533 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
d0063567 2534 PL_sublex_info.sub_op->op_private |=
2b9d42f0
NIS
2535 (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2536 }
2537 }
79072805 2538
02aa26ce 2539 /* shrink the sv if we allocated more than we used */
79072805 2540 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1da4ca5f 2541 SvPV_shrink_to_cur(sv);
79072805 2542 }
02aa26ce 2543
6154021b 2544 /* return the substring (via pl_yylval) only if we parsed anything */
3280af22 2545 if (s > PL_bufptr) {
eb0d8d16
NC
2546 if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) ) {
2547 const char *const key = PL_lex_inpat ? "qr" : "q";
2548 const STRLEN keylen = PL_lex_inpat ? 2 : 1;
2549 const char *type;
2550 STRLEN typelen;
2551
2552 if (PL_lex_inwhat == OP_TRANS) {
2553 type = "tr";
2554 typelen = 2;
2555 } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
2556 type = "s";
2557 typelen = 1;
2558 } else {
2559 type = "qq";
2560 typelen = 2;
2561 }
2562
2563 sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
2564 type, typelen);
2565 }
6154021b 2566 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
b3ac6de7 2567 } else
8990e307 2568 SvREFCNT_dec(sv);
79072805
LW
2569 return s;
2570}
2571
ffb4593c
NT
2572/* S_intuit_more
2573 * Returns TRUE if there's more to the expression (e.g., a subscript),
2574 * FALSE otherwise.
ffb4593c
NT
2575 *
2576 * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
2577 *
2578 * ->[ and ->{ return TRUE
2579 * { and [ outside a pattern are always subscripts, so return TRUE
2580 * if we're outside a pattern and it's not { or [, then return FALSE
2581 * if we're in a pattern and the first char is a {
2582 * {4,5} (any digits around the comma) returns FALSE
2583 * if we're in a pattern and the first char is a [
2584 * [] returns FALSE
2585 * [SOMETHING] has a funky algorithm to decide whether it's a
2586 * character class or not. It has to deal with things like
2587 * /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
2588 * anything else returns TRUE
2589 */
2590
9cbb5ea2
GS
2591/* This is the one truly awful dwimmer necessary to conflate C and sed. */
2592
76e3520e 2593STATIC int
cea2e8a9 2594S_intuit_more(pTHX_ register char *s)
79072805 2595{
97aff369 2596 dVAR;
7918f24d
NC
2597
2598 PERL_ARGS_ASSERT_INTUIT_MORE;
2599
3280af22 2600 if (PL_lex_brackets)
79072805
LW
2601 return TRUE;
2602 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
2603 return TRUE;
2604 if (*s != '{' && *s != '[')
2605 return FALSE;
3280af22 2606 if (!PL_lex_inpat)
79072805
LW
2607 return TRUE;
2608
2609 /* In a pattern, so maybe we have {n,m}. */
2610 if (*s == '{') {
2611 s++;
2612 if (!isDIGIT(*s))
2613 return TRUE;
2614 while (isDIGIT(*s))
2615 s++;
2616 if (*s == ',')
2617 s++;
2618 while (isDIGIT(*s))
2619 s++;
2620 if (*s == '}')
2621 return FALSE;
2622 return TRUE;
2623
2624 }
2625
2626 /* On the other hand, maybe we have a character class */
2627
2628 s++;
2629 if (*s == ']' || *s == '^')
2630 return FALSE;
2631 else {
ffb4593c 2632 /* this is terrifying, and it works */
79072805
LW
2633 int weight = 2; /* let's weigh the evidence */
2634 char seen[256];
f27ffc4a 2635 unsigned char un_char = 255, last_un_char;
9d4ba2ae 2636 const char * const send = strchr(s,']');
3280af22 2637 char tmpbuf[sizeof PL_tokenbuf * 4];
79072805
LW
2638
2639 if (!send) /* has to be an expression */
2640 return TRUE;
2641
2642 Zero(seen,256,char);
2643 if (*s == '$')
2644 weight -= 3;
2645 else if (isDIGIT(*s)) {
2646 if (s[1] != ']') {
2647 if (isDIGIT(s[1]) && s[2] == ']')
2648 weight -= 10;
2649 }
2650 else
2651 weight -= 100;
2652 }
2653 for (; s < send; s++) {
2654 last_un_char = un_char;
2655 un_char = (unsigned char)*s;
2656 switch (*s) {
2657 case '@':
2658 case '&':
2659 case '$':
2660 weight -= seen[un_char] * 10;
7e2040f0 2661 if (isALNUM_lazy_if(s+1,UTF)) {
90e5519e 2662 int len;
8903cb82 2663 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
90e5519e
NC
2664 len = (int)strlen(tmpbuf);
2665 if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
79072805
LW
2666 weight -= 100;
2667 else
2668 weight -= 10;
2669 }
2670 else if (*s == '$' && s[1] &&
93a17b20
LW
2671 strchr("[#!%*<>()-=",s[1])) {
2672 if (/*{*/ strchr("])} =",s[2]))
79072805
LW
2673 weight -= 10;
2674 else
2675 weight -= 1;
2676 }
2677 break;
2678 case '\\':
2679 un_char = 254;
2680 if (s[1]) {
93a17b20 2681 if (strchr("wds]",s[1]))
79072805 2682 weight += 100;
10edeb5d 2683 else if (seen[(U8)'\''] || seen[(U8)'"'])
79072805 2684 weight += 1;
93a17b20 2685 else if (strchr("rnftbxcav",s[1]))
79072805
LW
2686 weight += 40;
2687 else if (isDIGIT(s[1])) {
2688 weight += 40;
2689 while (s[1] && isDIGIT(s[1]))
2690 s++;
2691 }
2692 }
2693 else
2694 weight += 100;
2695 break;
2696 case '-':
2697 if (s[1] == '\\')
2698 weight += 50;
93a17b20 2699 if (strchr("aA01! ",last_un_char))
79072805 2700 weight += 30;
93a17b20 2701 if (strchr("zZ79~",s[1]))
79072805 2702 weight += 30;
f27ffc4a
GS
2703 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
2704 weight -= 5; /* cope with negative subscript */
79072805
LW
2705 break;
2706 default:
3792a11b
NC
2707 if (!isALNUM(last_un_char)
2708 && !(last_un_char == '$' || last_un_char == '@'
2709 || last_un_char == '&')
2710 && isALPHA(*s) && s[1] && isALPHA(s[1])) {
79072805
LW
2711 char *d = tmpbuf;
2712 while (isALPHA(*s))
2713 *d++ = *s++;
2714 *d = '\0';
5458a98a 2715 if (keyword(tmpbuf, d - tmpbuf, 0))
79072805
LW
2716 weight -= 150;
2717 }
2718 if (un_char == last_un_char + 1)
2719 weight += 5;
2720 weight -= seen[un_char];
2721 break;
2722 }
2723 seen[un_char]++;
2724 }
2725 if (weight >= 0) /* probably a character class */
2726 return FALSE;
2727 }
2728
2729 return TRUE;
2730}
ffed7fef 2731
ffb4593c
NT
2732/*
2733 * S_intuit_method
2734 *
2735 * Does all the checking to disambiguate
2736 * foo bar
2737 * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise
2738 * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2739 *
2740 * First argument is the stuff after the first token, e.g. "bar".
2741 *
2742 * Not a method if bar is a filehandle.
2743 * Not a method if foo is a subroutine prototyped to take a filehandle.
2744 * Not a method if it's really "Foo $bar"
2745 * Method if it's "foo $bar"
2746 * Not a method if it's really "print foo $bar"
2747 * Method if it's really "foo package::" (interpreted as package->foo)
8f8cf39c 2748 * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3cb0bbe5 2749 * Not a method if bar is a filehandle or package, but is quoted with
ffb4593c
NT
2750 * =>
2751 */
2752
76e3520e 2753STATIC int
62d55b22 2754S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
a0d0e21e 2755{
97aff369 2756 dVAR;
a0d0e21e 2757 char *s = start + (*start == '$');
3280af22 2758 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
2759 STRLEN len;
2760 GV* indirgv;
5db06880
NC
2761#ifdef PERL_MAD
2762 int soff;
2763#endif
a0d0e21e 2764
7918f24d
NC
2765 PERL_ARGS_ASSERT_INTUIT_METHOD;
2766
a0d0e21e 2767 if (gv) {
62d55b22 2768 if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
a0d0e21e 2769 return 0;
62d55b22
NC
2770 if (cv) {
2771 if (SvPOK(cv)) {
2772 const char *proto = SvPVX_const(cv);
2773 if (proto) {
2774 if (*proto == ';')
2775 proto++;
2776 if (*proto == '*')
2777 return 0;
2778 }
b6c543e3
IZ
2779 }
2780 } else
c35e046a 2781 gv = NULL;
a0d0e21e 2782 }
8903cb82 2783 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
ffb4593c
NT
2784 /* start is the beginning of the possible filehandle/object,
2785 * and s is the end of it
2786 * tmpbuf is a copy of it
2787 */
2788
a0d0e21e 2789 if (*start == '$') {
3ef1310e
RGS
2790 if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
2791 isUPPER(*PL_tokenbuf))
a0d0e21e 2792 return 0;
5db06880
NC
2793#ifdef PERL_MAD
2794 len = start - SvPVX(PL_linestr);
2795#endif
29595ff2 2796 s = PEEKSPACE(s);
f0092767 2797#ifdef PERL_MAD
5db06880
NC
2798 start = SvPVX(PL_linestr) + len;
2799#endif
3280af22
NIS
2800 PL_bufptr = start;
2801 PL_expect = XREF;
a0d0e21e
LW
2802 return *s == '(' ? FUNCMETH : METHOD;
2803 }
5458a98a 2804 if (!keyword(tmpbuf, len, 0)) {
c3e0f903
GS
2805 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2806 len -= 2;
2807 tmpbuf[len] = '\0';
5db06880
NC
2808#ifdef PERL_MAD
2809 soff = s - SvPVX(PL_linestr);
2810#endif
c3e0f903
GS
2811 goto bare_package;
2812 }
90e5519e 2813 indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
8ebc5c01 2814 if (indirgv && GvCVu(indirgv))
a0d0e21e
LW
2815 return 0;
2816 /* filehandle or package name makes it a method */
da51bb9b 2817 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
5db06880
NC
2818#ifdef PERL_MAD
2819 soff = s - SvPVX(PL_linestr);
2820#endif
29595ff2 2821 s = PEEKSPACE(s);
3280af22 2822 if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
55497cff 2823 return 0; /* no assumptions -- "=>" quotes bearword */
c3e0f903 2824 bare_package:
cd81e915 2825 start_force(PL_curforce);
9ded7720 2826 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
79cb57f6 2827 newSVpvn(tmpbuf,len));
9ded7720 2828 NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
5db06880
NC
2829 if (PL_madskills)
2830 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3280af22 2831 PL_expect = XTERM;
a0d0e21e 2832 force_next(WORD);
3280af22 2833 PL_bufptr = s;
5db06880
NC
2834#ifdef PERL_MAD
2835 PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
2836#endif
a0d0e21e
LW
2837 return *s == '(' ? FUNCMETH : METHOD;
2838 }
2839 }
2840 return 0;
2841}
2842
16d20bd9 2843/* Encoded script support. filter_add() effectively inserts a
4e553d73 2844 * 'pre-processing' function into the current source input stream.
16d20bd9
AD
2845 * Note that the filter function only applies to the current source file
2846 * (e.g., it will not affect files 'require'd or 'use'd by this one).
2847 *
2848 * The datasv parameter (which may be NULL) can be used to pass
2849 * private data to this instance of the filter. The filter function
2850 * can recover the SV using the FILTER_DATA macro and use it to
2851 * store private buffers and state information.
2852 *
2853 * The supplied datasv parameter is upgraded to a PVIO type
4755096e 2854 * and the IoDIRP/IoANY field is used to store the function pointer,
e0c19803 2855 * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
16d20bd9
AD
2856 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2857 * private use must be set using malloc'd pointers.
2858 */
16d20bd9
AD
2859
2860SV *
864dbfa3 2861Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
16d20bd9 2862{
97aff369 2863 dVAR;
f4c556ac 2864 if (!funcp)
a0714e2c 2865 return NULL;
f4c556ac 2866
5486870f
DM
2867 if (!PL_parser)
2868 return NULL;
2869
3280af22
NIS
2870 if (!PL_rsfp_filters)
2871 PL_rsfp_filters = newAV();
16d20bd9 2872 if (!datasv)
561b68a9 2873 datasv = newSV(0);
862a34c6 2874 SvUPGRADE(datasv, SVt_PVIO);
8141890a 2875 IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
e0c19803 2876 IoFLAGS(datasv) |= IOf_FAKE_DIRP;
f4c556ac 2877 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
55662e27
JH
2878 FPTR2DPTR(void *, IoANY(datasv)),
2879 SvPV_nolen(datasv)));
3280af22
NIS
2880 av_unshift(PL_rsfp_filters, 1);
2881 av_store(PL_rsfp_filters, 0, datasv) ;
16d20bd9
AD
2882 return(datasv);
2883}
4e553d73 2884
16d20bd9
AD
2885
2886/* Delete most recently added instance of this filter function. */
a0d0e21e 2887void
864dbfa3 2888Perl_filter_del(pTHX_ filter_t funcp)
16d20bd9 2889{
97aff369 2890 dVAR;
e0c19803 2891 SV *datasv;
24801a4b 2892
7918f24d
NC
2893 PERL_ARGS_ASSERT_FILTER_DEL;
2894
33073adb 2895#ifdef DEBUGGING
55662e27
JH
2896 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
2897 FPTR2DPTR(void*, funcp)));
33073adb 2898#endif
5486870f 2899 if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
16d20bd9
AD
2900 return;
2901 /* if filter is on top of stack (usual case) just pop it off */
e0c19803 2902 datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
8141890a 2903 if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
e0c19803 2904 IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
4755096e 2905 IoANY(datasv) = (void *)NULL;
3280af22 2906 sv_free(av_pop(PL_rsfp_filters));
e50aee73 2907
16d20bd9
AD
2908 return;
2909 }
2910 /* we need to search for the correct entry and clear it */
cea2e8a9 2911 Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
16d20bd9
AD
2912}
2913
2914
1de9afcd
RGS
2915/* Invoke the idxth filter function for the current rsfp. */
2916/* maxlen 0 = read one text line */
16d20bd9 2917I32
864dbfa3 2918Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
a0d0e21e 2919{
97aff369 2920 dVAR;
16d20bd9
AD
2921 filter_t funcp;
2922 SV *datasv = NULL;
f482118e
NC
2923 /* This API is bad. It should have been using unsigned int for maxlen.
2924 Not sure if we want to change the API, but if not we should sanity
2925 check the value here. */
39cd7a59
NC
2926 const unsigned int correct_length
2927 = maxlen < 0 ?
2928#ifdef PERL_MICRO
2929 0x7FFFFFFF
2930#else
2931 INT_MAX
2932#endif
2933 : maxlen;
e50aee73 2934
7918f24d
NC
2935 PERL_ARGS_ASSERT_FILTER_READ;
2936
5486870f 2937 if (!PL_parser || !PL_rsfp_filters)
16d20bd9 2938 return -1;
1de9afcd 2939 if (idx > AvFILLp(PL_rsfp_filters)) { /* Any more filters? */
16d20bd9
AD
2940 /* Provide a default input filter to make life easy. */
2941 /* Note that we append to the line. This is handy. */
f4c556ac
GS
2942 DEBUG_P(PerlIO_printf(Perl_debug_log,
2943 "filter_read %d: from rsfp\n", idx));
f482118e 2944 if (correct_length) {
16d20bd9
AD
2945 /* Want a block */
2946 int len ;
f54cb97a 2947 const int old_len = SvCUR(buf_sv);
16d20bd9
AD
2948
2949 /* ensure buf_sv is large enough */
f482118e
NC
2950 SvGROW(buf_sv, (STRLEN)(old_len + correct_length)) ;
2951 if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
2952 correct_length)) <= 0) {
3280af22 2953 if (PerlIO_error(PL_rsfp))
37120919
AD
2954 return -1; /* error */
2955 else
2956 return 0 ; /* end of file */
2957 }
16d20bd9
AD
2958 SvCUR_set(buf_sv, old_len + len) ;
2959 } else {
2960 /* Want a line */
3280af22
NIS
2961 if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2962 if (PerlIO_error(PL_rsfp))
37120919
AD
2963 return -1; /* error */
2964 else
2965 return 0 ; /* end of file */
2966 }
16d20bd9
AD
2967 }
2968 return SvCUR(buf_sv);
2969 }
2970 /* Skip this filter slot if filter has been deleted */
1de9afcd 2971 if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
f4c556ac
GS
2972 DEBUG_P(PerlIO_printf(Perl_debug_log,
2973 "filter_read %d: skipped (filter deleted)\n",
2974 idx));
f482118e 2975 return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
16d20bd9
AD
2976 }
2977 /* Get function pointer hidden within datasv */
8141890a 2978 funcp = DPTR2FPTR(filter_t, IoANY(datasv));
f4c556ac
GS
2979 DEBUG_P(PerlIO_printf(Perl_debug_log,
2980 "filter_read %d: via function %p (%s)\n",
ca0270c4 2981 idx, (void*)datasv, SvPV_nolen_const(datasv)));
16d20bd9
AD
2982 /* Call function. The function is expected to */
2983 /* call "FILTER_READ(idx+1, buf_sv)" first. */
37120919 2984 /* Return: <0:error, =0:eof, >0:not eof */
f482118e 2985 return (*funcp)(aTHX_ idx, buf_sv, correct_length);
16d20bd9
AD
2986}
2987
76e3520e 2988STATIC char *
cea2e8a9 2989S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
16d20bd9 2990{
97aff369 2991 dVAR;
7918f24d
NC
2992
2993 PERL_ARGS_ASSERT_FILTER_GETS;
2994
c39cd008 2995#ifdef PERL_CR_FILTER
3280af22 2996 if (!PL_rsfp_filters) {
c39cd008 2997 filter_add(S_cr_textfilter,NULL);
a868473f
NIS
2998 }
2999#endif
3280af22 3000 if (PL_rsfp_filters) {
55497cff 3001 if (!append)
3002 SvCUR_set(sv, 0); /* start with empty line */
16d20bd9
AD
3003 if (FILTER_READ(0, sv, 0) > 0)
3004 return ( SvPVX(sv) ) ;
3005 else
bd61b366 3006 return NULL ;
16d20bd9 3007 }
9d116dd7 3008 else
fd049845 3009 return (sv_gets(sv, fp, append));
a0d0e21e
LW
3010}
3011
01ec43d0 3012STATIC HV *
9bde8eb0 3013S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
def3634b 3014{
97aff369 3015 dVAR;
def3634b
GS
3016 GV *gv;
3017
7918f24d
NC
3018 PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
3019
01ec43d0 3020 if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
def3634b
GS
3021 return PL_curstash;
3022
3023 if (len > 2 &&
3024 (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
90e5519e 3025 (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
01ec43d0
GS
3026 {
3027 return GvHV(gv); /* Foo:: */
def3634b
GS
3028 }
3029
3030 /* use constant CLASS => 'MyClass' */
c35e046a
AL
3031 gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
3032 if (gv && GvCV(gv)) {
3033 SV * const sv = cv_const_sv(GvCV(gv));
3034 if (sv)
9bde8eb0 3035 pkgname = SvPV_const(sv, len);
def3634b
GS
3036 }
3037
9bde8eb0 3038 return gv_stashpvn(pkgname, len, 0);
def3634b 3039}
a0d0e21e 3040
e3f73d4e
RGS
3041/*
3042 * S_readpipe_override
3043 * Check whether readpipe() is overriden, and generates the appropriate
3044 * optree, provided sublex_start() is called afterwards.
3045 */
3046STATIC void
1d51329b 3047S_readpipe_override(pTHX)
e3f73d4e
RGS
3048{
3049 GV **gvp;
3050 GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
6154021b 3051 pl_yylval.ival = OP_BACKTICK;
e3f73d4e
RGS
3052 if ((gv_readpipe
3053 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
3054 ||
3055 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
d5e716f5 3056 && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
e3f73d4e
RGS
3057 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
3058 {
3059 PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
3060 append_elem(OP_LIST,
3061 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
3062 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
3063 }
e3f73d4e
RGS
3064}
3065
5db06880
NC
3066#ifdef PERL_MAD
3067 /*
3068 * Perl_madlex
3069 * The intent of this yylex wrapper is to minimize the changes to the
3070 * tokener when we aren't interested in collecting madprops. It remains
3071 * to be seen how successful this strategy will be...
3072 */
3073
3074int
3075Perl_madlex(pTHX)
3076{
3077 int optype;
3078 char *s = PL_bufptr;
3079
cd81e915
NC
3080 /* make sure PL_thiswhite is initialized */
3081 PL_thiswhite = 0;
3082 PL_thismad = 0;
5db06880 3083
cd81e915 3084 /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
5db06880
NC
3085 if (PL_pending_ident)
3086 return S_pending_ident(aTHX);
3087
3088 /* previous token ate up our whitespace? */
cd81e915
NC
3089 if (!PL_lasttoke && PL_nextwhite) {
3090 PL_thiswhite = PL_nextwhite;
3091 PL_nextwhite = 0;
5db06880
NC
3092 }
3093
3094 /* isolate the token, and figure out where it is without whitespace */
cd81e915
NC
3095 PL_realtokenstart = -1;
3096 PL_thistoken = 0;
5db06880
NC
3097 optype = yylex();
3098 s = PL_bufptr;
cd81e915 3099 assert(PL_curforce < 0);
5db06880 3100
cd81e915
NC
3101 if (!PL_thismad || PL_thismad->mad_key == '^') { /* not forced already? */
3102 if (!PL_thistoken) {
3103 if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
6b29d1f5 3104 PL_thistoken = newSVpvs("");
5db06880 3105 else {
c35e046a 3106 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915 3107 PL_thistoken = newSVpvn(tstart, s - tstart);
5db06880
NC
3108 }
3109 }
cd81e915
NC
3110 if (PL_thismad) /* install head */
3111 CURMAD('X', PL_thistoken);
5db06880
NC
3112 }
3113
3114 /* last whitespace of a sublex? */
cd81e915
NC
3115 if (optype == ')' && PL_endwhite) {
3116 CURMAD('X', PL_endwhite);
5db06880
NC
3117 }
3118
cd81e915 3119 if (!PL_thismad) {
5db06880
NC
3120
3121 /* if no whitespace and we're at EOF, bail. Otherwise fake EOF below. */
cd81e915
NC
3122 if (!PL_thiswhite && !PL_endwhite && !optype) {
3123 sv_free(PL_thistoken);
3124 PL_thistoken = 0;
5db06880
NC
3125 return 0;
3126 }
3127
3128 /* put off final whitespace till peg */
3129 if (optype == ';' && !PL_rsfp) {
cd81e915
NC
3130 PL_nextwhite = PL_thiswhite;
3131 PL_thiswhite = 0;
5db06880 3132 }
cd81e915
NC
3133 else if (PL_thisopen) {
3134 CURMAD('q', PL_thisopen);
3135 if (PL_thistoken)
3136 sv_free(PL_thistoken);
3137 PL_thistoken = 0;
5db06880
NC
3138 }
3139 else {
3140 /* Store actual token text as madprop X */
cd81e915 3141 CURMAD('X', PL_thistoken);
5db06880
NC
3142 }
3143
cd81e915 3144 if (PL_thiswhite) {
5db06880 3145 /* add preceding whitespace as madprop _ */
cd81e915 3146 CURMAD('_', PL_thiswhite);
5db06880
NC
3147 }
3148
cd81e915 3149 if (PL_thisstuff) {
5db06880 3150 /* add quoted material as madprop = */
cd81e915 3151 CURMAD('=', PL_thisstuff);
5db06880
NC
3152 }
3153
cd81e915 3154 if (PL_thisclose) {
5db06880 3155 /* add terminating quote as madprop Q */
cd81e915 3156 CURMAD('Q', PL_thisclose);
5db06880
NC
3157 }
3158 }
3159
3160 /* special processing based on optype */
3161
3162 switch (optype) {
3163
3164 /* opval doesn't need a TOKEN since it can already store mp */
3165 case WORD:
3166 case METHOD:
3167 case FUNCMETH:
3168 case THING:
3169 case PMFUNC:
3170 case PRIVATEREF:
3171 case FUNC0SUB:
3172 case UNIOPSUB:
3173 case LSTOPSUB:
6154021b
RGS
3174 if (pl_yylval.opval)
3175 append_madprops(PL_thismad, pl_yylval.opval, 0);
cd81e915 3176 PL_thismad = 0;
5db06880
NC
3177 return optype;
3178
3179 /* fake EOF */
3180 case 0:
3181 optype = PEG;
cd81e915
NC
3182 if (PL_endwhite) {
3183 addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
3184 PL_endwhite = 0;
5db06880
NC
3185 }
3186 break;
3187
3188 case ']':
3189 case '}':
cd81e915 3190 if (PL_faketokens)
5db06880
NC
3191 break;
3192 /* remember any fake bracket that lexer is about to discard */
3193 if (PL_lex_brackets == 1 &&
3194 ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
3195 {
3196 s = PL_bufptr;
3197 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3198 s++;
3199 if (*s == '}') {
cd81e915
NC
3200 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
3201 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3202 PL_thiswhite = 0;
5db06880
NC
3203 PL_bufptr = s - 1;
3204 break; /* don't bother looking for trailing comment */
3205 }
3206 else
3207 s = PL_bufptr;
3208 }
3209 if (optype == ']')
3210 break;
3211 /* FALLTHROUGH */
3212
3213 /* attach a trailing comment to its statement instead of next token */
3214 case ';':
cd81e915 3215 if (PL_faketokens)
5db06880
NC
3216 break;
3217 if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
3218 s = PL_bufptr;
3219 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3220 s++;
3221 if (*s == '\n' || *s == '#') {
3222 while (s < PL_bufend && *s != '\n')
3223 s++;
3224 if (s < PL_bufend)
3225 s++;
cd81e915
NC
3226 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
3227 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3228 PL_thiswhite = 0;
5db06880
NC
3229 PL_bufptr = s;
3230 }
3231 }
3232 break;
3233
3234 /* pval */
3235 case LABEL:
3236 break;
3237
3238 /* ival */
3239 default:
3240 break;
3241
3242 }
3243
3244 /* Create new token struct. Note: opvals return early above. */
6154021b 3245 pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
cd81e915 3246 PL_thismad = 0;
5db06880
NC
3247 return optype;
3248}
3249#endif
3250
468aa647 3251STATIC char *
cc6ed77d 3252S_tokenize_use(pTHX_ int is_use, char *s) {
97aff369 3253 dVAR;
7918f24d
NC
3254
3255 PERL_ARGS_ASSERT_TOKENIZE_USE;
3256
468aa647
RGS
3257 if (PL_expect != XSTATE)
3258 yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
3259 is_use ? "use" : "no"));
29595ff2 3260 s = SKIPSPACE1(s);
468aa647
RGS
3261 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
3262 s = force_version(s, TRUE);
29595ff2 3263 if (*s == ';' || (s = SKIPSPACE1(s), *s == ';')) {
cd81e915 3264 start_force(PL_curforce);
9ded7720 3265 NEXTVAL_NEXTTOKE.opval = NULL;
468aa647
RGS
3266 force_next(WORD);
3267 }
3268 else if (*s == 'v') {
3269 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3270 s = force_version(s, FALSE);
3271 }
3272 }
3273 else {
3274 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3275 s = force_version(s, FALSE);
3276 }
6154021b 3277 pl_yylval.ival = is_use;
468aa647
RGS
3278 return s;
3279}
748a9306 3280#ifdef DEBUGGING
27da23d5 3281 static const char* const exp_name[] =
09bef843 3282 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
27308ded 3283 "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
09bef843 3284 };
748a9306 3285#endif
463ee0b2 3286
02aa26ce
NT
3287/*
3288 yylex
3289
3290 Works out what to call the token just pulled out of the input
3291 stream. The yacc parser takes care of taking the ops we return and
3292 stitching them into a tree.
3293
3294 Returns:
3295 PRIVATEREF
3296
3297 Structure:
3298 if read an identifier
3299 if we're in a my declaration
3300 croak if they tried to say my($foo::bar)
3301 build the ops for a my() declaration
3302 if it's an access to a my() variable
3303 are we in a sort block?
3304 croak if my($a); $a <=> $b
3305 build ops for access to a my() variable
3306 if in a dq string, and they've said @foo and we can't find @foo
3307 croak
3308 build ops for a bareword
3309 if we already built the token before, use it.
3310*/
3311
20141f0e 3312
dba4d153
JH
3313#ifdef __SC__
3314#pragma segment Perl_yylex
3315#endif
dba4d153 3316int
dba4d153 3317Perl_yylex(pTHX)
20141f0e 3318{
97aff369 3319 dVAR;
3afc138a 3320 register char *s = PL_bufptr;
378cc40b 3321 register char *d;
463ee0b2 3322 STRLEN len;
aa7440fb 3323 bool bof = FALSE;
a687059c 3324
10edeb5d
JH
3325 /* orig_keyword, gvp, and gv are initialized here because
3326 * jump to the label just_a_word_zero can bypass their
3327 * initialization later. */
3328 I32 orig_keyword = 0;
3329 GV *gv = NULL;
3330 GV **gvp = NULL;
3331
bbf60fe6 3332 DEBUG_T( {
396482e1 3333 SV* tmp = newSVpvs("");
b6007c36
DM
3334 PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
3335 (IV)CopLINE(PL_curcop),
3336 lex_state_names[PL_lex_state],
3337 exp_name[PL_expect],
3338 pv_display(tmp, s, strlen(s), 0, 60));
3339 SvREFCNT_dec(tmp);
bbf60fe6 3340 } );
02aa26ce 3341 /* check if there's an identifier for us to look at */
ba979b31 3342 if (PL_pending_ident)
bbf60fe6 3343 return REPORT(S_pending_ident(aTHX));
bbce6d69 3344
02aa26ce
NT
3345 /* no identifier pending identification */
3346
3280af22 3347 switch (PL_lex_state) {
79072805
LW
3348#ifdef COMMENTARY
3349 case LEX_NORMAL: /* Some compilers will produce faster */
3350 case LEX_INTERPNORMAL: /* code if we comment these out. */
3351 break;
3352#endif
3353
09bef843 3354 /* when we've already built the next token, just pull it out of the queue */
79072805 3355 case LEX_KNOWNEXT:
5db06880
NC
3356#ifdef PERL_MAD
3357 PL_lasttoke--;
6154021b 3358 pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
5db06880 3359 if (PL_madskills) {
cd81e915 3360 PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
5db06880 3361 PL_nexttoke[PL_lasttoke].next_mad = 0;
cd81e915 3362 if (PL_thismad && PL_thismad->mad_key == '_') {
daba3364 3363 PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
cd81e915
NC
3364 PL_thismad->mad_val = 0;
3365 mad_free(PL_thismad);
3366 PL_thismad = 0;
5db06880
NC
3367 }
3368 }
3369 if (!PL_lasttoke) {
3370 PL_lex_state = PL_lex_defer;
3371 PL_expect = PL_lex_expect;
3372 PL_lex_defer = LEX_NORMAL;
3373 if (!PL_nexttoke[PL_lasttoke].next_type)
3374 return yylex();
3375 }
3376#else
3280af22 3377 PL_nexttoke--;
6154021b 3378 pl_yylval = PL_nextval[PL_nexttoke];
3280af22
NIS
3379 if (!PL_nexttoke) {
3380 PL_lex_state = PL_lex_defer;
3381 PL_expect = PL_lex_expect;
3382 PL_lex_defer = LEX_NORMAL;
463ee0b2 3383 }
5db06880
NC
3384#endif
3385#ifdef PERL_MAD
3386 /* FIXME - can these be merged? */
3387 return(PL_nexttoke[PL_lasttoke].next_type);
3388#else
bbf60fe6 3389 return REPORT(PL_nexttype[PL_nexttoke]);
5db06880 3390#endif
79072805 3391
02aa26ce 3392 /* interpolated case modifiers like \L \U, including \Q and \E.
3280af22 3393 when we get here, PL_bufptr is at the \
02aa26ce 3394 */
79072805
LW
3395 case LEX_INTERPCASEMOD:
3396#ifdef DEBUGGING
3280af22 3397 if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
cea2e8a9 3398 Perl_croak(aTHX_ "panic: INTERPCASEMOD");
79072805 3399#endif
02aa26ce 3400 /* handle \E or end of string */
3280af22 3401 if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
02aa26ce 3402 /* if at a \E */
3280af22 3403 if (PL_lex_casemods) {
f54cb97a 3404 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
3280af22 3405 PL_lex_casestack[PL_lex_casemods] = '\0';
02aa26ce 3406
3792a11b
NC
3407 if (PL_bufptr != PL_bufend
3408 && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
3280af22
NIS
3409 PL_bufptr += 2;
3410 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
3411#ifdef PERL_MAD
3412 if (PL_madskills)
6b29d1f5 3413 PL_thistoken = newSVpvs("\\E");
5db06880 3414#endif
a0d0e21e 3415 }
bbf60fe6 3416 return REPORT(')');
79072805 3417 }
5db06880
NC
3418#ifdef PERL_MAD
3419 while (PL_bufptr != PL_bufend &&
3420 PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
cd81e915 3421 if (!PL_thiswhite)
6b29d1f5 3422 PL_thiswhite = newSVpvs("");
cd81e915 3423 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
5db06880
NC
3424 PL_bufptr += 2;
3425 }
3426#else
3280af22
NIS
3427 if (PL_bufptr != PL_bufend)
3428 PL_bufptr += 2;
5db06880 3429#endif
3280af22 3430 PL_lex_state = LEX_INTERPCONCAT;
cea2e8a9 3431 return yylex();
79072805
LW
3432 }
3433 else {
607df283 3434 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 3435 "### Saw case modifier\n"); });
3280af22 3436 s = PL_bufptr + 1;
6e909404 3437 if (s[1] == '\\' && s[2] == 'E') {
5db06880 3438#ifdef PERL_MAD
cd81e915 3439 if (!PL_thiswhite)
6b29d1f5 3440 PL_thiswhite = newSVpvs("");
cd81e915 3441 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
5db06880 3442#endif
89122651 3443 PL_bufptr = s + 3;
6e909404
JH
3444 PL_lex_state = LEX_INTERPCONCAT;
3445 return yylex();
a0d0e21e 3446 }
6e909404 3447 else {
90771dc0 3448 I32 tmp;
5db06880
NC
3449 if (!PL_madskills) /* when just compiling don't need correct */
3450 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
3451 tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */
3792a11b 3452 if ((*s == 'L' || *s == 'U') &&
6e909404
JH
3453 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
3454 PL_lex_casestack[--PL_lex_casemods] = '\0';
bbf60fe6 3455 return REPORT(')');
6e909404
JH
3456 }
3457 if (PL_lex_casemods > 10)
3458 Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
3459 PL_lex_casestack[PL_lex_casemods++] = *s;
3460 PL_lex_casestack[PL_lex_casemods] = '\0';
3461 PL_lex_state = LEX_INTERPCONCAT;
cd81e915 3462 start_force(PL_curforce);
9ded7720 3463 NEXTVAL_NEXTTOKE.ival = 0;
6e909404 3464 force_next('(');
cd81e915 3465 start_force(PL_curforce);
6e909404 3466 if (*s == 'l')
9ded7720 3467 NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
6e909404 3468 else if (*s == 'u')
9ded7720 3469 NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
6e909404 3470 else if (*s == 'L')
9ded7720 3471 NEXTVAL_NEXTTOKE.ival = OP_LC;
6e909404 3472 else if (*s == 'U')
9ded7720 3473 NEXTVAL_NEXTTOKE.ival = OP_UC;
6e909404 3474 else if (*s == 'Q')
9ded7720 3475 NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
6e909404
JH
3476 else
3477 Perl_croak(aTHX_ "panic: yylex");
5db06880 3478 if (PL_madskills) {
a5849ce5
NC
3479 SV* const tmpsv = newSVpvs("\\ ");
3480 /* replace the space with the character we want to escape
3481 */
3482 SvPVX(tmpsv)[1] = *s;
5db06880
NC
3483 curmad('_', tmpsv);
3484 }
6e909404 3485 PL_bufptr = s + 1;
a0d0e21e 3486 }
79072805 3487 force_next(FUNC);
3280af22
NIS
3488 if (PL_lex_starts) {
3489 s = PL_bufptr;
3490 PL_lex_starts = 0;
5db06880
NC
3491#ifdef PERL_MAD
3492 if (PL_madskills) {
cd81e915
NC
3493 if (PL_thistoken)
3494 sv_free(PL_thistoken);
6b29d1f5 3495 PL_thistoken = newSVpvs("");
5db06880
NC
3496 }
3497#endif
131b3ad0
DM
3498 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3499 if (PL_lex_casemods == 1 && PL_lex_inpat)
3500 OPERATOR(',');
3501 else
3502 Aop(OP_CONCAT);
79072805
LW
3503 }
3504 else
cea2e8a9 3505 return yylex();
79072805
LW
3506 }
3507
55497cff 3508 case LEX_INTERPPUSH:
bbf60fe6 3509 return REPORT(sublex_push());
55497cff 3510
79072805 3511 case LEX_INTERPSTART:
3280af22 3512 if (PL_bufptr == PL_bufend)
bbf60fe6 3513 return REPORT(sublex_done());
607df283 3514 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 3515 "### Interpolated variable\n"); });
3280af22
NIS
3516 PL_expect = XTERM;
3517 PL_lex_dojoin = (*PL_bufptr == '@');
3518 PL_lex_state = LEX_INTERPNORMAL;
3519 if (PL_lex_dojoin) {
cd81e915 3520 start_force(PL_curforce);
9ded7720 3521 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3522 force_next(',');
cd81e915 3523 start_force(PL_curforce);
a0d0e21e 3524 force_ident("\"", '$');
cd81e915 3525 start_force(PL_curforce);
9ded7720 3526 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3527 force_next('$');
cd81e915 3528 start_force(PL_curforce);
9ded7720 3529 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3530 force_next('(');
cd81e915 3531 start_force(PL_curforce);
9ded7720 3532 NEXTVAL_NEXTTOKE.ival = OP_JOIN; /* emulate join($", ...) */
79072805
LW
3533 force_next(FUNC);
3534 }
3280af22
NIS
3535 if (PL_lex_starts++) {
3536 s = PL_bufptr;
5db06880
NC
3537#ifdef PERL_MAD
3538 if (PL_madskills) {
cd81e915
NC
3539 if (PL_thistoken)
3540 sv_free(PL_thistoken);
6b29d1f5 3541 PL_thistoken = newSVpvs("");
5db06880
NC
3542 }
3543#endif
131b3ad0
DM
3544 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3545 if (!PL_lex_casemods && PL_lex_inpat)
3546 OPERATOR(',');
3547 else
3548 Aop(OP_CONCAT);
79072805 3549 }
cea2e8a9 3550 return yylex();
79072805
LW
3551
3552 case LEX_INTERPENDMAYBE:
3280af22
NIS
3553 if (intuit_more(PL_bufptr)) {
3554 PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
79072805
LW
3555 break;
3556 }
3557 /* FALL THROUGH */
3558
3559 case LEX_INTERPEND:
3280af22
NIS
3560 if (PL_lex_dojoin) {
3561 PL_lex_dojoin = FALSE;
3562 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
3563#ifdef PERL_MAD
3564 if (PL_madskills) {
cd81e915
NC
3565 if (PL_thistoken)
3566 sv_free(PL_thistoken);
6b29d1f5 3567 PL_thistoken = newSVpvs("");
5db06880
NC
3568 }
3569#endif
bbf60fe6 3570 return REPORT(')');
79072805 3571 }
43a16006 3572 if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
25da4f38 3573 && SvEVALED(PL_lex_repl))
43a16006 3574 {
e9fa98b2 3575 if (PL_bufptr != PL_bufend)
cea2e8a9 3576 Perl_croak(aTHX_ "Bad evalled substitution pattern");
a0714e2c 3577 PL_lex_repl = NULL;
e9fa98b2 3578 }
79072805
LW
3579 /* FALLTHROUGH */
3580 case LEX_INTERPCONCAT:
3581#ifdef DEBUGGING
3280af22 3582 if (PL_lex_brackets)
cea2e8a9 3583 Perl_croak(aTHX_ "panic: INTERPCONCAT");
79072805 3584#endif
3280af22 3585 if (PL_bufptr == PL_bufend)
bbf60fe6 3586 return REPORT(sublex_done());
79072805 3587
3280af22
NIS
3588 if (SvIVX(PL_linestr) == '\'') {
3589 SV *sv = newSVsv(PL_linestr);
3590 if (!PL_lex_inpat)
76e3520e 3591 sv = tokeq(sv);
3280af22 3592 else if ( PL_hints & HINT_NEW_RE )
eb0d8d16 3593 sv = new_constant(NULL, 0, "qr", sv, sv, "q", 1);
6154021b 3594 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3280af22 3595 s = PL_bufend;
79072805
LW
3596 }
3597 else {
3280af22 3598 s = scan_const(PL_bufptr);
79072805 3599 if (*s == '\\')
3280af22 3600 PL_lex_state = LEX_INTERPCASEMOD;
79072805 3601 else
3280af22 3602 PL_lex_state = LEX_INTERPSTART;
79072805
LW
3603 }
3604
3280af22 3605 if (s != PL_bufptr) {
cd81e915 3606 start_force(PL_curforce);
5db06880
NC
3607 if (PL_madskills) {
3608 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
3609 }
6154021b 3610 NEXTVAL_NEXTTOKE = pl_yylval;
3280af22 3611 PL_expect = XTERM;
79072805 3612 force_next(THING);
131b3ad0 3613 if (PL_lex_starts++) {
5db06880
NC
3614#ifdef PERL_MAD
3615 if (PL_madskills) {
cd81e915
NC
3616 if (PL_thistoken)
3617 sv_free(PL_thistoken);
6b29d1f5 3618 PL_thistoken = newSVpvs("");
5db06880
NC
3619 }
3620#endif
131b3ad0
DM
3621 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3622 if (!PL_lex_casemods && PL_lex_inpat)
3623 OPERATOR(',');
3624 else
3625 Aop(OP_CONCAT);
3626 }
79072805 3627 else {
3280af22 3628 PL_bufptr = s;
cea2e8a9 3629 return yylex();
79072805
LW
3630 }
3631 }
3632
cea2e8a9 3633 return yylex();
a0d0e21e 3634 case LEX_FORMLINE:
3280af22
NIS
3635 PL_lex_state = LEX_NORMAL;
3636 s = scan_formline(PL_bufptr);
3637 if (!PL_lex_formbrack)
a0d0e21e
LW
3638 goto rightbracket;
3639 OPERATOR(';');
79072805
LW
3640 }
3641
3280af22
NIS
3642 s = PL_bufptr;
3643 PL_oldoldbufptr = PL_oldbufptr;
3644 PL_oldbufptr = s;
463ee0b2
LW
3645
3646 retry:
5db06880 3647#ifdef PERL_MAD
cd81e915
NC
3648 if (PL_thistoken) {
3649 sv_free(PL_thistoken);
3650 PL_thistoken = 0;
5db06880 3651 }
cd81e915 3652 PL_realtokenstart = s - SvPVX(PL_linestr); /* assume but undo on ws */
5db06880 3653#endif
378cc40b
LW
3654 switch (*s) {
3655 default:
7e2040f0 3656 if (isIDFIRST_lazy_if(s,UTF))
834a4ddd 3657 goto keylookup;
b1fc3636
CJ
3658 {
3659 unsigned char c = *s;
3660 len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
3661 if (len > UNRECOGNIZED_PRECEDE_COUNT) {
3662 d = UTF ? (char *) Perl_utf8_hop(aTHX_ (U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
3663 } else {
3664 d = PL_linestart;
3665 }
3666 *s = '\0';
3667 Perl_croak(aTHX_ "Unrecognized character \\x%02X; marked by <-- HERE after %s<-- HERE near column %d", c, d, (int) len + 1);
3668 }
e929a76b
LW
3669 case 4:
3670 case 26:
3671 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 3672 case 0:
5db06880
NC
3673#ifdef PERL_MAD
3674 if (PL_madskills)
cd81e915 3675 PL_faketokens = 0;
5db06880 3676#endif
3280af22
NIS
3677 if (!PL_rsfp) {
3678 PL_last_uni = 0;
3679 PL_last_lop = 0;
c5ee2135 3680 if (PL_lex_brackets) {
10edeb5d
JH
3681 yyerror((const char *)
3682 (PL_lex_formbrack
3683 ? "Format not terminated"
3684 : "Missing right curly or square bracket"));
c5ee2135 3685 }
4e553d73 3686 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 3687 "### Tokener got EOF\n");
5f80b19c 3688 } );
79072805 3689 TOKEN(0);
463ee0b2 3690 }
3280af22 3691 if (s++ < PL_bufend)
a687059c 3692 goto retry; /* ignore stray nulls */
3280af22
NIS
3693 PL_last_uni = 0;
3694 PL_last_lop = 0;
3695 if (!PL_in_eval && !PL_preambled) {
3696 PL_preambled = TRUE;
5db06880
NC
3697#ifdef PERL_MAD
3698 if (PL_madskills)
cd81e915 3699 PL_faketokens = 1;
5db06880 3700#endif
5ab7ff98
NC
3701 if (PL_perldb) {
3702 /* Generate a string of Perl code to load the debugger.
3703 * If PERL5DB is set, it will return the contents of that,
3704 * otherwise a compile-time require of perl5db.pl. */
3705
3706 const char * const pdb = PerlEnv_getenv("PERL5DB");
3707
3708 if (pdb) {
3709 sv_setpv(PL_linestr, pdb);
3710 sv_catpvs(PL_linestr,";");
3711 } else {
3712 SETERRNO(0,SS_NORMAL);
3713 sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
3714 }
3715 } else
3716 sv_setpvs(PL_linestr,"");
c62eb204
NC
3717 if (PL_preambleav) {
3718 SV **svp = AvARRAY(PL_preambleav);
3719 SV **const end = svp + AvFILLp(PL_preambleav);
3720 while(svp <= end) {
3721 sv_catsv(PL_linestr, *svp);
3722 ++svp;
396482e1 3723 sv_catpvs(PL_linestr, ";");
91b7def8 3724 }
daba3364 3725 sv_free(MUTABLE_SV(PL_preambleav));
3280af22 3726 PL_preambleav = NULL;
91b7def8 3727 }
9f639728
FR
3728 if (PL_minus_E)
3729 sv_catpvs(PL_linestr,
3730 "use feature ':5." STRINGIFY(PERL_VERSION) "';");
3280af22 3731 if (PL_minus_n || PL_minus_p) {
396482e1 3732 sv_catpvs(PL_linestr, "LINE: while (<>) {");
3280af22 3733 if (PL_minus_l)
396482e1 3734 sv_catpvs(PL_linestr,"chomp;");
3280af22 3735 if (PL_minus_a) {
3280af22 3736 if (PL_minus_F) {
3792a11b
NC
3737 if ((*PL_splitstr == '/' || *PL_splitstr == '\''
3738 || *PL_splitstr == '"')
3280af22 3739 && strchr(PL_splitstr + 1, *PL_splitstr))
3db68c4c 3740 Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
54310121 3741 else {
c8ef6a4b
NC
3742 /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
3743 bytes can be used as quoting characters. :-) */
dd374669 3744 const char *splits = PL_splitstr;
91d456ae 3745 sv_catpvs(PL_linestr, "our @F=split(q\0");
48c4c863
NC
3746 do {
3747 /* Need to \ \s */
dd374669
AL
3748 if (*splits == '\\')
3749 sv_catpvn(PL_linestr, splits, 1);
3750 sv_catpvn(PL_linestr, splits, 1);
3751 } while (*splits++);
48c4c863
NC
3752 /* This loop will embed the trailing NUL of
3753 PL_linestr as the last thing it does before
3754 terminating. */
396482e1 3755 sv_catpvs(PL_linestr, ");");
54310121 3756 }
2304df62
AD
3757 }
3758 else
396482e1 3759 sv_catpvs(PL_linestr,"our @F=split(' ');");
2304df62 3760 }
79072805 3761 }
396482e1 3762 sv_catpvs(PL_linestr, "\n");
3280af22
NIS
3763 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3764 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3765 PL_last_lop = PL_last_uni = NULL;
65269a95 3766 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
5fa550fb 3767 update_debugger_info(PL_linestr, NULL, 0);
79072805 3768 goto retry;
a687059c 3769 }
e929a76b 3770 do {
aa7440fb 3771 bof = PL_rsfp ? TRUE : FALSE;
bd61b366 3772 if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == NULL) {
7e28d3af 3773 fake_eof:
5db06880 3774#ifdef PERL_MAD
cd81e915 3775 PL_realtokenstart = -1;
5db06880 3776#endif
7e28d3af 3777 if (PL_rsfp) {
4c84d7f2 3778 if ((PerlIO *)PL_rsfp == PerlIO_stdin())
7e28d3af
JH
3779 PerlIO_clearerr(PL_rsfp);
3780 else
3781 (void)PerlIO_close(PL_rsfp);
4608196e 3782 PL_rsfp = NULL;
7e28d3af
JH
3783 PL_doextract = FALSE;
3784 }
3785 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
5db06880
NC
3786#ifdef PERL_MAD
3787 if (PL_madskills)
cd81e915 3788 PL_faketokens = 1;
5db06880 3789#endif
49a54bbe
NC
3790 if (PL_minus_p)
3791 sv_setpvs(PL_linestr, ";}continue{print;}");
3792 else
3793 sv_setpvs(PL_linestr, ";}");
7e28d3af
JH
3794 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3795 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3796 PL_last_lop = PL_last_uni = NULL;
7e28d3af
JH
3797 PL_minus_n = PL_minus_p = 0;
3798 goto retry;
3799 }
3800 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
bd61b366 3801 PL_last_lop = PL_last_uni = NULL;
76f68e9b 3802 sv_setpvs(PL_linestr,"");
7e28d3af
JH
3803 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
3804 }
7aa207d6
JH
3805 /* If it looks like the start of a BOM or raw UTF-16,
3806 * check if it in fact is. */
3807 else if (bof &&
3808 (*s == 0 ||
3809 *(U8*)s == 0xEF ||
3810 *(U8*)s >= 0xFE ||
3811 s[1] == 0)) {
226017aa 3812#ifdef PERLIO_IS_STDIO
e3f494f1
JH
3813# ifdef __GNU_LIBRARY__
3814# if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
226017aa
DD
3815# define FTELL_FOR_PIPE_IS_BROKEN
3816# endif
e3f494f1
JH
3817# else
3818# ifdef __GLIBC__
3819# if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
3820# define FTELL_FOR_PIPE_IS_BROKEN
3821# endif
3822# endif
226017aa
DD
3823# endif
3824#endif
eb160463 3825 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
7e28d3af 3826 if (bof) {
3280af22 3827 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 3828 s = swallow_bom((U8*)s);
e929a76b 3829 }
378cc40b 3830 }
3280af22 3831 if (PL_doextract) {
a0d0e21e 3832 /* Incest with pod. */
5db06880
NC
3833#ifdef PERL_MAD
3834 if (PL_madskills)
cd81e915 3835 sv_catsv(PL_thiswhite, PL_linestr);
5db06880 3836#endif
01a57ef7 3837 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
76f68e9b 3838 sv_setpvs(PL_linestr, "");
3280af22
NIS
3839 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3840 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3841 PL_last_lop = PL_last_uni = NULL;
3280af22 3842 PL_doextract = FALSE;
a0d0e21e 3843 }
4e553d73 3844 }
463ee0b2 3845 incline(s);
3280af22
NIS
3846 } while (PL_doextract);
3847 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
65269a95 3848 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
5fa550fb 3849 update_debugger_info(PL_linestr, NULL, 0);
3280af22 3850 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3851 PL_last_lop = PL_last_uni = NULL;
57843af0 3852 if (CopLINE(PL_curcop) == 1) {
3280af22 3853 while (s < PL_bufend && isSPACE(*s))
79072805 3854 s++;
a0d0e21e 3855 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 3856 s++;
5db06880
NC
3857#ifdef PERL_MAD
3858 if (PL_madskills)
cd81e915 3859 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
5db06880 3860#endif
bd61b366 3861 d = NULL;
3280af22 3862 if (!PL_in_eval) {
44a8e56a 3863 if (*s == '#' && *(s+1) == '!')
3864 d = s + 2;
3865#ifdef ALTERNATE_SHEBANG
3866 else {
bfed75c6 3867 static char const as[] = ALTERNATE_SHEBANG;
44a8e56a 3868 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
3869 d = s + (sizeof(as) - 1);
3870 }
3871#endif /* ALTERNATE_SHEBANG */
3872 }
3873 if (d) {
b8378b72 3874 char *ipath;
774d564b 3875 char *ipathend;
b8378b72 3876
774d564b 3877 while (isSPACE(*d))
b8378b72
CS
3878 d++;
3879 ipath = d;
774d564b 3880 while (*d && !isSPACE(*d))
3881 d++;
3882 ipathend = d;
3883
3884#ifdef ARG_ZERO_IS_SCRIPT
3885 if (ipathend > ipath) {
3886 /*
3887 * HP-UX (at least) sets argv[0] to the script name,
3888 * which makes $^X incorrect. And Digital UNIX and Linux,
3889 * at least, set argv[0] to the basename of the Perl
3890 * interpreter. So, having found "#!", we'll set it right.
3891 */
fafc274c
NC
3892 SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
3893 SVt_PV)); /* $^X */
774d564b 3894 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 3895 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 3896 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 3897 SvSETMAGIC(x);
3898 }
556c1dec
JH
3899 else {
3900 STRLEN blen;
3901 STRLEN llen;
cfd0369c 3902 const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
9d4ba2ae 3903 const char * const lstart = SvPV_const(x,llen);
556c1dec
JH
3904 if (llen < blen) {
3905 bstart += blen - llen;
3906 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
3907 sv_setpvn(x, ipath, ipathend - ipath);
3908 SvSETMAGIC(x);
3909 }
3910 }
3911 }
774d564b 3912 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 3913 }
774d564b 3914#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
3915
3916 /*
3917 * Look for options.
3918 */
748a9306 3919 d = instr(s,"perl -");
84e30d1a 3920 if (!d) {
748a9306 3921 d = instr(s,"perl");
84e30d1a
GS
3922#if defined(DOSISH)
3923 /* avoid getting into infinite loops when shebang
3924 * line contains "Perl" rather than "perl" */
3925 if (!d) {
3926 for (d = ipathend-4; d >= ipath; --d) {
3927 if ((*d == 'p' || *d == 'P')
3928 && !ibcmp(d, "perl", 4))
3929 {
3930 break;
3931 }
3932 }
3933 if (d < ipath)
bd61b366 3934 d = NULL;
84e30d1a
GS
3935 }
3936#endif
3937 }
44a8e56a 3938#ifdef ALTERNATE_SHEBANG
3939 /*
3940 * If the ALTERNATE_SHEBANG on this system starts with a
3941 * character that can be part of a Perl expression, then if
3942 * we see it but not "perl", we're probably looking at the
3943 * start of Perl code, not a request to hand off to some
3944 * other interpreter. Similarly, if "perl" is there, but
3945 * not in the first 'word' of the line, we assume the line
3946 * contains the start of the Perl program.
44a8e56a 3947 */
3948 if (d && *s != '#') {
f54cb97a 3949 const char *c = ipath;
44a8e56a 3950 while (*c && !strchr("; \t\r\n\f\v#", *c))
3951 c++;
3952 if (c < d)
bd61b366 3953 d = NULL; /* "perl" not in first word; ignore */
44a8e56a 3954 else
3955 *s = '#'; /* Don't try to parse shebang line */
3956 }
774d564b 3957#endif /* ALTERNATE_SHEBANG */
748a9306 3958 if (!d &&
44a8e56a 3959 *s == '#' &&
774d564b 3960 ipathend > ipath &&
3280af22 3961 !PL_minus_c &&
748a9306 3962 !instr(s,"indir") &&
3280af22 3963 instr(PL_origargv[0],"perl"))
748a9306 3964 {
27da23d5 3965 dVAR;
9f68db38 3966 char **newargv;
9f68db38 3967
774d564b 3968 *ipathend = '\0';
3969 s = ipathend + 1;
3280af22 3970 while (s < PL_bufend && isSPACE(*s))
9f68db38 3971 s++;
3280af22 3972 if (s < PL_bufend) {
d85f917e 3973 Newx(newargv,PL_origargc+3,char*);
9f68db38 3974 newargv[1] = s;
3280af22 3975 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
3976 s++;
3977 *s = '\0';
3280af22 3978 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
3979 }
3980 else
3280af22 3981 newargv = PL_origargv;
774d564b 3982 newargv[0] = ipath;
b35112e7 3983 PERL_FPU_PRE_EXEC
b4748376 3984 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 3985 PERL_FPU_POST_EXEC
cea2e8a9 3986 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 3987 }
748a9306 3988 if (d) {
c35e046a
AL
3989 while (*d && !isSPACE(*d))
3990 d++;
3991 while (SPACE_OR_TAB(*d))
3992 d++;
748a9306
LW
3993
3994 if (*d++ == '-') {
f54cb97a 3995 const bool switches_done = PL_doswitches;
fb993905
GA
3996 const U32 oldpdb = PL_perldb;
3997 const bool oldn = PL_minus_n;
3998 const bool oldp = PL_minus_p;
c7030b81 3999 const char *d1 = d;
fb993905 4000
8cc95fdb 4001 do {
4ba71d51
FC
4002 bool baduni = FALSE;
4003 if (*d1 == 'C') {
bd0ab00d
NC
4004 const char *d2 = d1 + 1;
4005 if (parse_unicode_opts((const char **)&d2)
4006 != PL_unicode)
4007 baduni = TRUE;
4ba71d51
FC
4008 }
4009 if (baduni || *d1 == 'M' || *d1 == 'm') {
c7030b81
NC
4010 const char * const m = d1;
4011 while (*d1 && !isSPACE(*d1))
4012 d1++;
cea2e8a9 4013 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
c7030b81 4014 (int)(d1 - m), m);
8cc95fdb 4015 }
c7030b81
NC
4016 d1 = moreswitches(d1);
4017 } while (d1);
f0b2cf55
YST
4018 if (PL_doswitches && !switches_done) {
4019 int argc = PL_origargc;
4020 char **argv = PL_origargv;
4021 do {
4022 argc--,argv++;
4023 } while (argc && argv[0][0] == '-' && argv[0][1]);
4024 init_argv_symbols(argc,argv);
4025 }
65269a95 4026 if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
155aba94 4027 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 4028 /* if we have already added "LINE: while (<>) {",
4029 we must not do it again */
748a9306 4030 {
76f68e9b 4031 sv_setpvs(PL_linestr, "");
3280af22
NIS
4032 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4033 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 4034 PL_last_lop = PL_last_uni = NULL;
3280af22 4035 PL_preambled = FALSE;
65269a95 4036 if (PERLDB_LINE || PERLDB_SAVESRC)
3280af22 4037 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
4038 goto retry;
4039 }
a0d0e21e 4040 }
79072805 4041 }
9f68db38 4042 }
79072805 4043 }
3280af22
NIS
4044 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4045 PL_bufptr = s;
4046 PL_lex_state = LEX_FORMLINE;
cea2e8a9 4047 return yylex();
ae986130 4048 }
378cc40b 4049 goto retry;
4fdae800 4050 case '\r':
6a27c188 4051#ifdef PERL_STRICT_CR
cea2e8a9 4052 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 4053 Perl_croak(aTHX_
cc507455 4054 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 4055#endif
4fdae800 4056 case ' ': case '\t': case '\f': case 013:
5db06880 4057#ifdef PERL_MAD
cd81e915 4058 PL_realtokenstart = -1;
ac372eb8
RD
4059 if (!PL_thiswhite)
4060 PL_thiswhite = newSVpvs("");
4061 sv_catpvn(PL_thiswhite, s, 1);
5db06880 4062#endif
ac372eb8 4063 s++;
378cc40b 4064 goto retry;
378cc40b 4065 case '#':
e929a76b 4066 case '\n':
5db06880 4067#ifdef PERL_MAD
cd81e915 4068 PL_realtokenstart = -1;
5db06880 4069 if (PL_madskills)
cd81e915 4070 PL_faketokens = 0;
5db06880 4071#endif
3280af22 4072 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
4073 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
4074 /* handle eval qq[#line 1 "foo"\n ...] */
4075 CopLINE_dec(PL_curcop);
4076 incline(s);
4077 }
5db06880
NC
4078 if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
4079 s = SKIPSPACE0(s);
4080 if (!PL_in_eval || PL_rsfp)
4081 incline(s);
4082 }
4083 else {
4084 d = s;
4085 while (d < PL_bufend && *d != '\n')
4086 d++;
4087 if (d < PL_bufend)
4088 d++;
4089 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4090 Perl_croak(aTHX_ "panic: input overflow");
4091#ifdef PERL_MAD
4092 if (PL_madskills)
cd81e915 4093 PL_thiswhite = newSVpvn(s, d - s);
5db06880
NC
4094#endif
4095 s = d;
4096 incline(s);
4097 }
3280af22
NIS
4098 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4099 PL_bufptr = s;
4100 PL_lex_state = LEX_FORMLINE;
cea2e8a9 4101 return yylex();
a687059c 4102 }
378cc40b 4103 }
a687059c 4104 else {
5db06880
NC
4105#ifdef PERL_MAD
4106 if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
4107 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
cd81e915 4108 PL_faketokens = 0;
5db06880
NC
4109 s = SKIPSPACE0(s);
4110 TOKEN(PEG); /* make sure any #! line is accessible */
4111 }
4112 s = SKIPSPACE0(s);
4113 }
4114 else {
4115/* if (PL_madskills && PL_lex_formbrack) { */
4116 d = s;
4117 while (d < PL_bufend && *d != '\n')
4118 d++;
4119 if (d < PL_bufend)
4120 d++;
4121 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4122 Perl_croak(aTHX_ "panic: input overflow");
4123 if (PL_madskills && CopLINE(PL_curcop) >= 1) {
cd81e915 4124 if (!PL_thiswhite)
6b29d1f5 4125 PL_thiswhite = newSVpvs("");
5db06880 4126 if (CopLINE(PL_curcop) == 1) {
76f68e9b 4127 sv_setpvs(PL_thiswhite, "");
cd81e915 4128 PL_faketokens = 0;
5db06880 4129 }
cd81e915 4130 sv_catpvn(PL_thiswhite, s, d - s);
5db06880
NC
4131 }
4132 s = d;
4133/* }
4134 *s = '\0';
4135 PL_bufend = s; */
4136 }
4137#else
378cc40b 4138 *s = '\0';
3280af22 4139 PL_bufend = s;
5db06880 4140#endif
a687059c 4141 }
378cc40b
LW
4142 goto retry;
4143 case '-':
79072805 4144 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50 4145 I32 ftst = 0;
90771dc0 4146 char tmp;
e5edeb50 4147
378cc40b 4148 s++;
3280af22 4149 PL_bufptr = s;
748a9306
LW
4150 tmp = *s++;
4151
bf4acbe4 4152 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
4153 s++;
4154
4155 if (strnEQ(s,"=>",2)) {
3280af22 4156 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
931e0695 4157 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
748a9306
LW
4158 OPERATOR('-'); /* unary minus */
4159 }
3280af22 4160 PL_last_uni = PL_oldbufptr;
748a9306 4161 switch (tmp) {
e5edeb50
JH
4162 case 'r': ftst = OP_FTEREAD; break;
4163 case 'w': ftst = OP_FTEWRITE; break;
4164 case 'x': ftst = OP_FTEEXEC; break;
4165 case 'o': ftst = OP_FTEOWNED; break;
4166 case 'R': ftst = OP_FTRREAD; break;
4167 case 'W': ftst = OP_FTRWRITE; break;
4168 case 'X': ftst = OP_FTREXEC; break;
4169 case 'O': ftst = OP_FTROWNED; break;
4170 case 'e': ftst = OP_FTIS; break;
4171 case 'z': ftst = OP_FTZERO; break;
4172 case 's': ftst = OP_FTSIZE; break;
4173 case 'f': ftst = OP_FTFILE; break;
4174 case 'd': ftst = OP_FTDIR; break;
4175 case 'l': ftst = OP_FTLINK; break;
4176 case 'p': ftst = OP_FTPIPE; break;
4177 case 'S': ftst = OP_FTSOCK; break;
4178 case 'u': ftst = OP_FTSUID; break;
4179 case 'g': ftst = OP_FTSGID; break;
4180 case 'k': ftst = OP_FTSVTX; break;
4181 case 'b': ftst = OP_FTBLK; break;
4182 case 'c': ftst = OP_FTCHR; break;
4183 case 't': ftst = OP_FTTTY; break;
4184 case 'T': ftst = OP_FTTEXT; break;
4185 case 'B': ftst = OP_FTBINARY; break;
4186 case 'M': case 'A': case 'C':
fafc274c 4187 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
e5edeb50
JH
4188 switch (tmp) {
4189 case 'M': ftst = OP_FTMTIME; break;
4190 case 'A': ftst = OP_FTATIME; break;
4191 case 'C': ftst = OP_FTCTIME; break;
4192 default: break;
4193 }
4194 break;
378cc40b 4195 default:
378cc40b
LW
4196 break;
4197 }
e5edeb50 4198 if (ftst) {
eb160463 4199 PL_last_lop_op = (OPCODE)ftst;
4e553d73 4200 DEBUG_T( { PerlIO_printf(Perl_debug_log,
a18d764d 4201 "### Saw file test %c\n", (int)tmp);
5f80b19c 4202 } );
e5edeb50
JH
4203 FTST(ftst);
4204 }
4205 else {
4206 /* Assume it was a minus followed by a one-letter named
4207 * subroutine call (or a -bareword), then. */
95c31fe3 4208 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0 4209 "### '-%c' looked like a file test but was not\n",
4fccd7c6 4210 (int) tmp);
5f80b19c 4211 } );
3cf7b4c4 4212 s = --PL_bufptr;
e5edeb50 4213 }
378cc40b 4214 }
90771dc0
NC
4215 {
4216 const char tmp = *s++;
4217 if (*s == tmp) {
4218 s++;
4219 if (PL_expect == XOPERATOR)
4220 TERM(POSTDEC);
4221 else
4222 OPERATOR(PREDEC);
4223 }
4224 else if (*s == '>') {
4225 s++;
29595ff2 4226 s = SKIPSPACE1(s);
90771dc0
NC
4227 if (isIDFIRST_lazy_if(s,UTF)) {
4228 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
4229 TOKEN(ARROW);
4230 }
4231 else if (*s == '$')
4232 OPERATOR(ARROW);
4233 else
4234 TERM(ARROW);
4235 }
3280af22 4236 if (PL_expect == XOPERATOR)
90771dc0
NC
4237 Aop(OP_SUBTRACT);
4238 else {
4239 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4240 check_uni();
4241 OPERATOR('-'); /* unary minus */
79072805 4242 }
2f3197b3 4243 }
79072805 4244
378cc40b 4245 case '+':
90771dc0
NC
4246 {
4247 const char tmp = *s++;
4248 if (*s == tmp) {
4249 s++;
4250 if (PL_expect == XOPERATOR)
4251 TERM(POSTINC);
4252 else
4253 OPERATOR(PREINC);
4254 }
3280af22 4255 if (PL_expect == XOPERATOR)
90771dc0
NC
4256 Aop(OP_ADD);
4257 else {
4258 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4259 check_uni();
4260 OPERATOR('+');
4261 }
2f3197b3 4262 }
a687059c 4263
378cc40b 4264 case '*':
3280af22
NIS
4265 if (PL_expect != XOPERATOR) {
4266 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4267 PL_expect = XOPERATOR;
4268 force_ident(PL_tokenbuf, '*');
4269 if (!*PL_tokenbuf)
a0d0e21e 4270 PREREF('*');
79072805 4271 TERM('*');
a687059c 4272 }
79072805
LW
4273 s++;
4274 if (*s == '*') {
a687059c 4275 s++;
79072805 4276 PWop(OP_POW);
a687059c 4277 }
79072805
LW
4278 Mop(OP_MULTIPLY);
4279
378cc40b 4280 case '%':
3280af22 4281 if (PL_expect == XOPERATOR) {
bbce6d69 4282 ++s;
4283 Mop(OP_MODULO);
a687059c 4284 }
3280af22 4285 PL_tokenbuf[0] = '%';
e8ae98db
RGS
4286 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4287 sizeof PL_tokenbuf - 1, FALSE);
3280af22 4288 if (!PL_tokenbuf[1]) {
bbce6d69 4289 PREREF('%');
a687059c 4290 }
3280af22 4291 PL_pending_ident = '%';
bbce6d69 4292 TERM('%');
a687059c 4293
378cc40b 4294 case '^':
79072805 4295 s++;
a0d0e21e 4296 BOop(OP_BIT_XOR);
79072805 4297 case '[':
3280af22 4298 PL_lex_brackets++;
df3467db
IG
4299 {
4300 const char tmp = *s++;
4301 OPERATOR(tmp);
4302 }
378cc40b 4303 case '~':
0d863452 4304 if (s[1] == '~'
3e7dd34d 4305 && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
0d863452
RH
4306 {
4307 s += 2;
4308 Eop(OP_SMARTMATCH);
4309 }
378cc40b 4310 case ',':
90771dc0
NC
4311 {
4312 const char tmp = *s++;
4313 OPERATOR(tmp);
4314 }
a0d0e21e
LW
4315 case ':':
4316 if (s[1] == ':') {
4317 len = 0;
0bfa2a8a 4318 goto just_a_word_zero_gv;
a0d0e21e
LW
4319 }
4320 s++;
09bef843
SB
4321 switch (PL_expect) {
4322 OP *attrs;
5db06880
NC
4323#ifdef PERL_MAD
4324 I32 stuffstart;
4325#endif
09bef843
SB
4326 case XOPERATOR:
4327 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
4328 break;
4329 PL_bufptr = s; /* update in case we back off */
4330 goto grabattrs;
4331 case XATTRBLOCK:
4332 PL_expect = XBLOCK;
4333 goto grabattrs;
4334 case XATTRTERM:
4335 PL_expect = XTERMBLOCK;
4336 grabattrs:
5db06880
NC
4337#ifdef PERL_MAD
4338 stuffstart = s - SvPVX(PL_linestr) - 1;
4339#endif
29595ff2 4340 s = PEEKSPACE(s);
5f66b61c 4341 attrs = NULL;
7e2040f0 4342 while (isIDFIRST_lazy_if(s,UTF)) {
90771dc0 4343 I32 tmp;
5cc237b8 4344 SV *sv;
09bef843 4345 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 4346 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
f9829d6b
GS
4347 if (tmp < 0) tmp = -tmp;
4348 switch (tmp) {
4349 case KEY_or:
4350 case KEY_and:
4351 case KEY_for:
11baf631 4352 case KEY_foreach:
f9829d6b
GS
4353 case KEY_unless:
4354 case KEY_if:
4355 case KEY_while:
4356 case KEY_until:
4357 goto got_attrs;
4358 default:
4359 break;
4360 }
4361 }
5cc237b8 4362 sv = newSVpvn(s, len);
09bef843
SB
4363 if (*d == '(') {
4364 d = scan_str(d,TRUE,TRUE);
4365 if (!d) {
09bef843
SB
4366 /* MUST advance bufptr here to avoid bogus
4367 "at end of line" context messages from yyerror().
4368 */
4369 PL_bufptr = s + len;
4370 yyerror("Unterminated attribute parameter in attribute list");
4371 if (attrs)
4372 op_free(attrs);
5cc237b8 4373 sv_free(sv);
bbf60fe6 4374 return REPORT(0); /* EOF indicator */
09bef843
SB
4375 }
4376 }
4377 if (PL_lex_stuff) {
09bef843
SB
4378 sv_catsv(sv, PL_lex_stuff);
4379 attrs = append_elem(OP_LIST, attrs,
4380 newSVOP(OP_CONST, 0, sv));
4381 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 4382 PL_lex_stuff = NULL;
09bef843
SB
4383 }
4384 else {
5cc237b8
BS
4385 if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
4386 sv_free(sv);
1108974d 4387 if (PL_in_my == KEY_our) {
df9a6019 4388 deprecate(":unique");
1108974d 4389 }
bfed75c6 4390 else
371fce9b
DM
4391 Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
4392 }
4393
d3cea301
SB
4394 /* NOTE: any CV attrs applied here need to be part of
4395 the CVf_BUILTIN_ATTRS define in cv.h! */
5cc237b8
BS
4396 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
4397 sv_free(sv);
78f9721b 4398 CvLVALUE_on(PL_compcv);
5cc237b8
BS
4399 }
4400 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
4401 sv_free(sv);
8e5dadda 4402 deprecate(":locked");
5cc237b8
BS
4403 }
4404 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
4405 sv_free(sv);
78f9721b 4406 CvMETHOD_on(PL_compcv);
5cc237b8 4407 }
78f9721b
SM
4408 /* After we've set the flags, it could be argued that
4409 we don't need to do the attributes.pm-based setting
4410 process, and shouldn't bother appending recognized
d3cea301
SB
4411 flags. To experiment with that, uncomment the
4412 following "else". (Note that's already been
4413 uncommented. That keeps the above-applied built-in
4414 attributes from being intercepted (and possibly
4415 rejected) by a package's attribute routines, but is
4416 justified by the performance win for the common case
4417 of applying only built-in attributes.) */
0256094b 4418 else
78f9721b
SM
4419 attrs = append_elem(OP_LIST, attrs,
4420 newSVOP(OP_CONST, 0,
5cc237b8 4421 sv));
09bef843 4422 }
29595ff2 4423 s = PEEKSPACE(d);
0120eecf 4424 if (*s == ':' && s[1] != ':')
29595ff2 4425 s = PEEKSPACE(s+1);
0120eecf
GS
4426 else if (s == d)
4427 break; /* require real whitespace or :'s */
29595ff2 4428 /* XXX losing whitespace on sequential attributes here */
09bef843 4429 }
90771dc0
NC
4430 {
4431 const char tmp
4432 = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
4433 if (*s != ';' && *s != '}' && *s != tmp
4434 && (tmp != '=' || *s != ')')) {
4435 const char q = ((*s == '\'') ? '"' : '\'');
4436 /* If here for an expression, and parsed no attrs, back
4437 off. */
4438 if (tmp == '=' && !attrs) {
4439 s = PL_bufptr;
4440 break;
4441 }
4442 /* MUST advance bufptr here to avoid bogus "at end of line"
4443 context messages from yyerror().
4444 */
4445 PL_bufptr = s;
10edeb5d
JH
4446 yyerror( (const char *)
4447 (*s
4448 ? Perl_form(aTHX_ "Invalid separator character "
4449 "%c%c%c in attribute list", q, *s, q)
4450 : "Unterminated attribute list" ) );
90771dc0
NC
4451 if (attrs)
4452 op_free(attrs);
4453 OPERATOR(':');
09bef843 4454 }
09bef843 4455 }
f9829d6b 4456 got_attrs:
09bef843 4457 if (attrs) {
cd81e915 4458 start_force(PL_curforce);
9ded7720 4459 NEXTVAL_NEXTTOKE.opval = attrs;
cd81e915 4460 CURMAD('_', PL_nextwhite);
89122651 4461 force_next(THING);
5db06880
NC
4462 }
4463#ifdef PERL_MAD
4464 if (PL_madskills) {
cd81e915 4465 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5db06880 4466 (s - SvPVX(PL_linestr)) - stuffstart);
09bef843 4467 }
5db06880 4468#endif
09bef843
SB
4469 TOKEN(COLONATTR);
4470 }
a0d0e21e 4471 OPERATOR(':');
8990e307
LW
4472 case '(':
4473 s++;
3280af22
NIS
4474 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
4475 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 4476 else
3280af22 4477 PL_expect = XTERM;
29595ff2 4478 s = SKIPSPACE1(s);
a0d0e21e 4479 TOKEN('(');
378cc40b 4480 case ';':
f4dd75d9 4481 CLINE;
90771dc0
NC
4482 {
4483 const char tmp = *s++;
4484 OPERATOR(tmp);
4485 }
378cc40b 4486 case ')':
90771dc0
NC
4487 {
4488 const char tmp = *s++;
29595ff2 4489 s = SKIPSPACE1(s);
90771dc0
NC
4490 if (*s == '{')
4491 PREBLOCK(tmp);
4492 TERM(tmp);
4493 }
79072805
LW
4494 case ']':
4495 s++;
3280af22 4496 if (PL_lex_brackets <= 0)
d98d5fff 4497 yyerror("Unmatched right square bracket");
463ee0b2 4498 else
3280af22
NIS
4499 --PL_lex_brackets;
4500 if (PL_lex_state == LEX_INTERPNORMAL) {
4501 if (PL_lex_brackets == 0) {
02255c60
FC
4502 if (*s == '-' && s[1] == '>')
4503 PL_lex_state = LEX_INTERPENDMAYBE;
4504 else if (*s != '[' && *s != '{')
3280af22 4505 PL_lex_state = LEX_INTERPEND;
79072805
LW
4506 }
4507 }
4633a7c4 4508 TERM(']');
79072805
LW
4509 case '{':
4510 leftbracket:
79072805 4511 s++;
3280af22 4512 if (PL_lex_brackets > 100) {
8edd5f42 4513 Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
8990e307 4514 }
3280af22 4515 switch (PL_expect) {
a0d0e21e 4516 case XTERM:
3280af22 4517 if (PL_lex_formbrack) {
a0d0e21e
LW
4518 s--;
4519 PRETERMBLOCK(DO);
4520 }
3280af22
NIS
4521 if (PL_oldoldbufptr == PL_last_lop)
4522 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 4523 else
3280af22 4524 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 4525 OPERATOR(HASHBRACK);
a0d0e21e 4526 case XOPERATOR:
bf4acbe4 4527 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306 4528 s++;
44a8e56a 4529 d = s;
3280af22
NIS
4530 PL_tokenbuf[0] = '\0';
4531 if (d < PL_bufend && *d == '-') {
4532 PL_tokenbuf[0] = '-';
44a8e56a 4533 d++;
bf4acbe4 4534 while (d < PL_bufend && SPACE_OR_TAB(*d))
44a8e56a 4535 d++;
4536 }
7e2040f0 4537 if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3280af22 4538 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 4539 FALSE, &len);
bf4acbe4 4540 while (d < PL_bufend && SPACE_OR_TAB(*d))
748a9306
LW
4541 d++;
4542 if (*d == '}') {
f54cb97a 4543 const char minus = (PL_tokenbuf[0] == '-');
44a8e56a 4544 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
4545 if (minus)
4546 force_next('-');
748a9306
LW
4547 }
4548 }
4549 /* FALL THROUGH */
09bef843 4550 case XATTRBLOCK:
748a9306 4551 case XBLOCK:
3280af22
NIS
4552 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
4553 PL_expect = XSTATE;
a0d0e21e 4554 break;
09bef843 4555 case XATTRTERM:
a0d0e21e 4556 case XTERMBLOCK:
3280af22
NIS
4557 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
4558 PL_expect = XSTATE;
a0d0e21e
LW
4559 break;
4560 default: {
f54cb97a 4561 const char *t;
3280af22
NIS
4562 if (PL_oldoldbufptr == PL_last_lop)
4563 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 4564 else
3280af22 4565 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
29595ff2 4566 s = SKIPSPACE1(s);
8452ff4b
SB
4567 if (*s == '}') {
4568 if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
4569 PL_expect = XTERM;
4570 /* This hack is to get the ${} in the message. */
4571 PL_bufptr = s+1;
4572 yyerror("syntax error");
4573 break;
4574 }
a0d0e21e 4575 OPERATOR(HASHBRACK);
8452ff4b 4576 }
b8a4b1be
GS
4577 /* This hack serves to disambiguate a pair of curlies
4578 * as being a block or an anon hash. Normally, expectation
4579 * determines that, but in cases where we're not in a
4580 * position to expect anything in particular (like inside
4581 * eval"") we have to resolve the ambiguity. This code
4582 * covers the case where the first term in the curlies is a
4583 * quoted string. Most other cases need to be explicitly
a0288114 4584 * disambiguated by prepending a "+" before the opening
b8a4b1be
GS
4585 * curly in order to force resolution as an anon hash.
4586 *
4587 * XXX should probably propagate the outer expectation
4588 * into eval"" to rely less on this hack, but that could
4589 * potentially break current behavior of eval"".
4590 * GSAR 97-07-21
4591 */
4592 t = s;
4593 if (*s == '\'' || *s == '"' || *s == '`') {
4594 /* common case: get past first string, handling escapes */
3280af22 4595 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
4596 if (*t++ == '\\' && (*t == '\\' || *t == *s))
4597 t++;
4598 t++;
a0d0e21e 4599 }
b8a4b1be 4600 else if (*s == 'q') {
3280af22 4601 if (++t < PL_bufend
b8a4b1be 4602 && (!isALNUM(*t)
3280af22 4603 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
4604 && !isALNUM(*t))))
4605 {
abc667d1 4606 /* skip q//-like construct */
f54cb97a 4607 const char *tmps;
b8a4b1be
GS
4608 char open, close, term;
4609 I32 brackets = 1;
4610
3280af22 4611 while (t < PL_bufend && isSPACE(*t))
b8a4b1be 4612 t++;
abc667d1
DM
4613 /* check for q => */
4614 if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
4615 OPERATOR(HASHBRACK);
4616 }
b8a4b1be
GS
4617 term = *t;
4618 open = term;
4619 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
4620 term = tmps[5];
4621 close = term;
4622 if (open == close)
3280af22
NIS
4623 for (t++; t < PL_bufend; t++) {
4624 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 4625 t++;
6d07e5e9 4626 else if (*t == open)
b8a4b1be
GS
4627 break;
4628 }
abc667d1 4629 else {
3280af22
NIS
4630 for (t++; t < PL_bufend; t++) {
4631 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 4632 t++;
6d07e5e9 4633 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
4634 break;
4635 else if (*t == open)
4636 brackets++;
4637 }
abc667d1
DM
4638 }
4639 t++;
b8a4b1be 4640 }
abc667d1
DM
4641 else
4642 /* skip plain q word */
4643 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
4644 t += UTF8SKIP(t);
a0d0e21e 4645 }
7e2040f0 4646 else if (isALNUM_lazy_if(t,UTF)) {
0505442f 4647 t += UTF8SKIP(t);
7e2040f0 4648 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
0505442f 4649 t += UTF8SKIP(t);
a0d0e21e 4650 }
3280af22 4651 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 4652 t++;
b8a4b1be
GS
4653 /* if comma follows first term, call it an anon hash */
4654 /* XXX it could be a comma expression with loop modifiers */
3280af22 4655 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 4656 || (*t == '=' && t[1] == '>')))
a0d0e21e 4657 OPERATOR(HASHBRACK);
3280af22 4658 if (PL_expect == XREF)
4e4e412b 4659 PL_expect = XTERM;
a0d0e21e 4660 else {
3280af22
NIS
4661 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
4662 PL_expect = XSTATE;
a0d0e21e 4663 }
8990e307 4664 }
a0d0e21e 4665 break;
463ee0b2 4666 }
6154021b 4667 pl_yylval.ival = CopLINE(PL_curcop);
79072805 4668 if (isSPACE(*s) || *s == '#')
3280af22 4669 PL_copline = NOLINE; /* invalidate current command line number */
79072805 4670 TOKEN('{');
378cc40b 4671 case '}':
79072805
LW
4672 rightbracket:
4673 s++;
3280af22 4674 if (PL_lex_brackets <= 0)
d98d5fff 4675 yyerror("Unmatched right curly bracket");
463ee0b2 4676 else
3280af22 4677 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
c2e66d9e 4678 if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3280af22
NIS
4679 PL_lex_formbrack = 0;
4680 if (PL_lex_state == LEX_INTERPNORMAL) {
4681 if (PL_lex_brackets == 0) {
9059aa12
LW
4682 if (PL_expect & XFAKEBRACK) {
4683 PL_expect &= XENUMMASK;
3280af22
NIS
4684 PL_lex_state = LEX_INTERPEND;
4685 PL_bufptr = s;
5db06880
NC
4686#if 0
4687 if (PL_madskills) {
cd81e915 4688 if (!PL_thiswhite)
6b29d1f5 4689 PL_thiswhite = newSVpvs("");
76f68e9b 4690 sv_catpvs(PL_thiswhite,"}");
5db06880
NC
4691 }
4692#endif
cea2e8a9 4693 return yylex(); /* ignore fake brackets */
79072805 4694 }
fa83b5b6 4695 if (*s == '-' && s[1] == '>')
3280af22 4696 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 4697 else if (*s != '[' && *s != '{')
3280af22 4698 PL_lex_state = LEX_INTERPEND;
79072805
LW
4699 }
4700 }
9059aa12
LW
4701 if (PL_expect & XFAKEBRACK) {
4702 PL_expect &= XENUMMASK;
3280af22 4703 PL_bufptr = s;
cea2e8a9 4704 return yylex(); /* ignore fake brackets */
748a9306 4705 }
cd81e915 4706 start_force(PL_curforce);
5db06880
NC
4707 if (PL_madskills) {
4708 curmad('X', newSVpvn(s-1,1));
cd81e915 4709 CURMAD('_', PL_thiswhite);
5db06880 4710 }
79072805 4711 force_next('}');
5db06880 4712#ifdef PERL_MAD
cd81e915 4713 if (!PL_thistoken)
6b29d1f5 4714 PL_thistoken = newSVpvs("");
5db06880 4715#endif
79072805 4716 TOKEN(';');
378cc40b
LW
4717 case '&':
4718 s++;
90771dc0 4719 if (*s++ == '&')
a0d0e21e 4720 AOPERATOR(ANDAND);
378cc40b 4721 s--;
3280af22 4722 if (PL_expect == XOPERATOR) {
041457d9
DM
4723 if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
4724 && isIDFIRST_lazy_if(s,UTF))
7e2040f0 4725 {
57843af0 4726 CopLINE_dec(PL_curcop);
f1f66076 4727 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
57843af0 4728 CopLINE_inc(PL_curcop);
463ee0b2 4729 }
79072805 4730 BAop(OP_BIT_AND);
463ee0b2 4731 }
79072805 4732
3280af22
NIS
4733 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4734 if (*PL_tokenbuf) {
4735 PL_expect = XOPERATOR;
4736 force_ident(PL_tokenbuf, '&');
463ee0b2 4737 }
79072805
LW
4738 else
4739 PREREF('&');
6154021b 4740 pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
4741 TERM('&');
4742
378cc40b
LW
4743 case '|':
4744 s++;
90771dc0 4745 if (*s++ == '|')
a0d0e21e 4746 AOPERATOR(OROR);
378cc40b 4747 s--;
79072805 4748 BOop(OP_BIT_OR);
378cc40b
LW
4749 case '=':
4750 s++;
748a9306 4751 {
90771dc0
NC
4752 const char tmp = *s++;
4753 if (tmp == '=')
4754 Eop(OP_EQ);
4755 if (tmp == '>')
4756 OPERATOR(',');
4757 if (tmp == '~')
4758 PMop(OP_MATCH);
4759 if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
4760 && strchr("+-*/%.^&|<",tmp))
4761 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4762 "Reversed %c= operator",(int)tmp);
4763 s--;
4764 if (PL_expect == XSTATE && isALPHA(tmp) &&
4765 (s == PL_linestart+1 || s[-2] == '\n') )
4766 {
4767 if (PL_in_eval && !PL_rsfp) {
4768 d = PL_bufend;
4769 while (s < d) {
4770 if (*s++ == '\n') {
4771 incline(s);
4772 if (strnEQ(s,"=cut",4)) {
4773 s = strchr(s,'\n');
4774 if (s)
4775 s++;
4776 else
4777 s = d;
4778 incline(s);
4779 goto retry;
4780 }
4781 }
a5f75d66 4782 }
90771dc0 4783 goto retry;
a5f75d66 4784 }
5db06880
NC
4785#ifdef PERL_MAD
4786 if (PL_madskills) {
cd81e915 4787 if (!PL_thiswhite)
6b29d1f5 4788 PL_thiswhite = newSVpvs("");
cd81e915 4789 sv_catpvn(PL_thiswhite, PL_linestart,
5db06880
NC
4790 PL_bufend - PL_linestart);
4791 }
4792#endif
90771dc0
NC
4793 s = PL_bufend;
4794 PL_doextract = TRUE;
4795 goto retry;
a5f75d66 4796 }
a0d0e21e 4797 }
3280af22 4798 if (PL_lex_brackets < PL_lex_formbrack) {
c35e046a 4799 const char *t = s;
51882d45 4800#ifdef PERL_STRICT_CR
c35e046a 4801 while (SPACE_OR_TAB(*t))
51882d45 4802#else
c35e046a 4803 while (SPACE_OR_TAB(*t) || *t == '\r')
51882d45 4804#endif
c35e046a 4805 t++;
a0d0e21e
LW
4806 if (*t == '\n' || *t == '#') {
4807 s--;
3280af22 4808 PL_expect = XBLOCK;
a0d0e21e
LW
4809 goto leftbracket;
4810 }
79072805 4811 }
6154021b 4812 pl_yylval.ival = 0;
a0d0e21e 4813 OPERATOR(ASSIGNOP);
378cc40b
LW
4814 case '!':
4815 s++;
90771dc0
NC
4816 {
4817 const char tmp = *s++;
4818 if (tmp == '=') {
4819 /* was this !=~ where !~ was meant?
4820 * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
4821
4822 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
4823 const char *t = s+1;
4824
4825 while (t < PL_bufend && isSPACE(*t))
4826 ++t;
4827
4828 if (*t == '/' || *t == '?' ||
4829 ((*t == 'm' || *t == 's' || *t == 'y')
4830 && !isALNUM(t[1])) ||
4831 (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
4832 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4833 "!=~ should be !~");
4834 }
4835 Eop(OP_NE);
4836 }
4837 if (tmp == '~')
4838 PMop(OP_NOT);
4839 }
378cc40b
LW
4840 s--;
4841 OPERATOR('!');
4842 case '<':
3280af22 4843 if (PL_expect != XOPERATOR) {
93a17b20 4844 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 4845 check_uni();
79072805
LW
4846 if (s[1] == '<')
4847 s = scan_heredoc(s);
4848 else
4849 s = scan_inputsymbol(s);
4850 TERM(sublex_start());
378cc40b
LW
4851 }
4852 s++;
90771dc0
NC
4853 {
4854 char tmp = *s++;
4855 if (tmp == '<')
4856 SHop(OP_LEFT_SHIFT);
4857 if (tmp == '=') {
4858 tmp = *s++;
4859 if (tmp == '>')
4860 Eop(OP_NCMP);
4861 s--;
4862 Rop(OP_LE);
4863 }
395c3793 4864 }
378cc40b 4865 s--;
79072805 4866 Rop(OP_LT);
378cc40b
LW
4867 case '>':
4868 s++;
90771dc0
NC
4869 {
4870 const char tmp = *s++;
4871 if (tmp == '>')
4872 SHop(OP_RIGHT_SHIFT);
d4c19fe8 4873 else if (tmp == '=')
90771dc0
NC
4874 Rop(OP_GE);
4875 }
378cc40b 4876 s--;
79072805 4877 Rop(OP_GT);
378cc40b
LW
4878
4879 case '$':
bbce6d69 4880 CLINE;
4881
3280af22
NIS
4882 if (PL_expect == XOPERATOR) {
4883 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
4884 PL_expect = XTERM;
c445ea15 4885 deprecate_old(commaless_variable_list);
bbf60fe6 4886 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 4887 }
8990e307 4888 }
a0d0e21e 4889
7e2040f0 4890 if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3280af22 4891 PL_tokenbuf[0] = '@';
376b8730
SM
4892 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
4893 sizeof PL_tokenbuf - 1, FALSE);
4894 if (PL_expect == XOPERATOR)
4895 no_op("Array length", s);
3280af22 4896 if (!PL_tokenbuf[1])
a0d0e21e 4897 PREREF(DOLSHARP);
3280af22
NIS
4898 PL_expect = XOPERATOR;
4899 PL_pending_ident = '#';
463ee0b2 4900 TOKEN(DOLSHARP);
79072805 4901 }
bbce6d69 4902
3280af22 4903 PL_tokenbuf[0] = '$';
376b8730
SM
4904 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4905 sizeof PL_tokenbuf - 1, FALSE);
4906 if (PL_expect == XOPERATOR)
4907 no_op("Scalar", s);
3280af22
NIS
4908 if (!PL_tokenbuf[1]) {
4909 if (s == PL_bufend)
bbce6d69 4910 yyerror("Final $ should be \\$ or $name");
4911 PREREF('$');
8990e307 4912 }
a0d0e21e 4913
bbce6d69 4914 /* This kludge not intended to be bulletproof. */
3280af22 4915 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
6154021b 4916 pl_yylval.opval = newSVOP(OP_CONST, 0,
fc15ae8f 4917 newSViv(CopARYBASE_get(&PL_compiling)));
6154021b 4918 pl_yylval.opval->op_private = OPpCONST_ARYBASE;
bbce6d69 4919 TERM(THING);
4920 }
4921
ff68c719 4922 d = s;
90771dc0
NC
4923 {
4924 const char tmp = *s;
4925 if (PL_lex_state == LEX_NORMAL)
29595ff2 4926 s = SKIPSPACE1(s);
ff68c719 4927
90771dc0
NC
4928 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
4929 && intuit_more(s)) {
4930 if (*s == '[') {
4931 PL_tokenbuf[0] = '@';
4932 if (ckWARN(WARN_SYNTAX)) {
c35e046a
AL
4933 char *t = s+1;
4934
4935 while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
4936 t++;
90771dc0 4937 if (*t++ == ',') {
29595ff2 4938 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
90771dc0
NC
4939 while (t < PL_bufend && *t != ']')
4940 t++;
9014280d 4941 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
90771dc0 4942 "Multidimensional syntax %.*s not supported",
36c7798d 4943 (int)((t - PL_bufptr) + 1), PL_bufptr);
90771dc0 4944 }
748a9306 4945 }
93a17b20 4946 }
90771dc0
NC
4947 else if (*s == '{') {
4948 char *t;
4949 PL_tokenbuf[0] = '%';
4950 if (strEQ(PL_tokenbuf+1, "SIG") && ckWARN(WARN_SYNTAX)
4951 && (t = strchr(s, '}')) && (t = strchr(t, '=')))
4952 {
4953 char tmpbuf[sizeof PL_tokenbuf];
c35e046a
AL
4954 do {
4955 t++;
4956 } while (isSPACE(*t));
90771dc0 4957 if (isIDFIRST_lazy_if(t,UTF)) {
780a5241 4958 STRLEN len;
90771dc0 4959 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
780a5241 4960 &len);
c35e046a
AL
4961 while (isSPACE(*t))
4962 t++;
780a5241 4963 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
90771dc0
NC
4964 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4965 "You need to quote \"%s\"",
4966 tmpbuf);
4967 }
4968 }
4969 }
93a17b20 4970 }
bbce6d69 4971
90771dc0
NC
4972 PL_expect = XOPERATOR;
4973 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
4974 const bool islop = (PL_last_lop == PL_oldoldbufptr);
4975 if (!islop || PL_last_lop_op == OP_GREPSTART)
4976 PL_expect = XOPERATOR;
4977 else if (strchr("$@\"'`q", *s))
4978 PL_expect = XTERM; /* e.g. print $fh "foo" */
4979 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
4980 PL_expect = XTERM; /* e.g. print $fh &sub */
4981 else if (isIDFIRST_lazy_if(s,UTF)) {
4982 char tmpbuf[sizeof PL_tokenbuf];
4983 int t2;
4984 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5458a98a 4985 if ((t2 = keyword(tmpbuf, len, 0))) {
90771dc0
NC
4986 /* binary operators exclude handle interpretations */
4987 switch (t2) {
4988 case -KEY_x:
4989 case -KEY_eq:
4990 case -KEY_ne:
4991 case -KEY_gt:
4992 case -KEY_lt:
4993 case -KEY_ge:
4994 case -KEY_le:
4995 case -KEY_cmp:
4996 break;
4997 default:
4998 PL_expect = XTERM; /* e.g. print $fh length() */
4999 break;
5000 }
5001 }
5002 else {
5003 PL_expect = XTERM; /* e.g. print $fh subr() */
84902520
TB
5004 }
5005 }
90771dc0
NC
5006 else if (isDIGIT(*s))
5007 PL_expect = XTERM; /* e.g. print $fh 3 */
5008 else if (*s == '.' && isDIGIT(s[1]))
5009 PL_expect = XTERM; /* e.g. print $fh .3 */
5010 else if ((*s == '?' || *s == '-' || *s == '+')
5011 && !isSPACE(s[1]) && s[1] != '=')
5012 PL_expect = XTERM; /* e.g. print $fh -1 */
5013 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
5014 && s[1] != '/')
5015 PL_expect = XTERM; /* e.g. print $fh /.../
5016 XXX except DORDOR operator
5017 */
5018 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
5019 && s[2] != '=')
5020 PL_expect = XTERM; /* print $fh <<"EOF" */
93a17b20 5021 }
bbce6d69 5022 }
3280af22 5023 PL_pending_ident = '$';
79072805 5024 TOKEN('$');
378cc40b
LW
5025
5026 case '@':
3280af22 5027 if (PL_expect == XOPERATOR)
bbce6d69 5028 no_op("Array", s);
3280af22
NIS
5029 PL_tokenbuf[0] = '@';
5030 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
5031 if (!PL_tokenbuf[1]) {
bbce6d69 5032 PREREF('@');
5033 }
3280af22 5034 if (PL_lex_state == LEX_NORMAL)
29595ff2 5035 s = SKIPSPACE1(s);
3280af22 5036 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 5037 if (*s == '{')
3280af22 5038 PL_tokenbuf[0] = '%';
a0d0e21e
LW
5039
5040 /* Warn about @ where they meant $. */
041457d9
DM
5041 if (*s == '[' || *s == '{') {
5042 if (ckWARN(WARN_SYNTAX)) {
f54cb97a 5043 const char *t = s + 1;
7e2040f0 5044 while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
5045 t++;
5046 if (*t == '}' || *t == ']') {
5047 t++;
29595ff2 5048 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
9014280d 5049 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 5050 "Scalar value %.*s better written as $%.*s",
36c7798d
DM
5051 (int)(t-PL_bufptr), PL_bufptr,
5052 (int)(t-PL_bufptr-1), PL_bufptr+1);
a0d0e21e 5053 }
93a17b20
LW
5054 }
5055 }
463ee0b2 5056 }
3280af22 5057 PL_pending_ident = '@';
79072805 5058 TERM('@');
378cc40b 5059
c963b151 5060 case '/': /* may be division, defined-or, or pattern */
6f33ba73
RGS
5061 if (PL_expect == XTERMORDORDOR && s[1] == '/') {
5062 s += 2;
5063 AOPERATOR(DORDOR);
5064 }
c963b151 5065 case '?': /* may either be conditional or pattern */
be25f609 5066 if (PL_expect == XOPERATOR) {
90771dc0 5067 char tmp = *s++;
c963b151 5068 if(tmp == '?') {
be25f609 5069 OPERATOR('?');
c963b151
BD
5070 }
5071 else {
5072 tmp = *s++;
5073 if(tmp == '/') {
5074 /* A // operator. */
5075 AOPERATOR(DORDOR);
5076 }
5077 else {
5078 s--;
5079 Mop(OP_DIVIDE);
5080 }
5081 }
5082 }
5083 else {
5084 /* Disable warning on "study /blah/" */
5085 if (PL_oldoldbufptr == PL_last_uni
5086 && (*PL_last_uni != 's' || s - PL_last_uni < 5
5087 || memNE(PL_last_uni, "study", 5)
5088 || isALNUM_lazy_if(PL_last_uni+5,UTF)
5089 ))
5090 check_uni();
5091 s = scan_pat(s,OP_MATCH);
5092 TERM(sublex_start());
5093 }
378cc40b
LW
5094
5095 case '.':
51882d45
GS
5096 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
5097#ifdef PERL_STRICT_CR
5098 && s[1] == '\n'
5099#else
5100 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
5101#endif
5102 && (s == PL_linestart || s[-1] == '\n') )
5103 {
3280af22
NIS
5104 PL_lex_formbrack = 0;
5105 PL_expect = XSTATE;
79072805
LW
5106 goto rightbracket;
5107 }
be25f609 5108 if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
5109 s += 3;
5110 OPERATOR(YADAYADA);
5111 }
3280af22 5112 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
90771dc0 5113 char tmp = *s++;
a687059c
LW
5114 if (*s == tmp) {
5115 s++;
2f3197b3
LW
5116 if (*s == tmp) {
5117 s++;
6154021b 5118 pl_yylval.ival = OPf_SPECIAL;
2f3197b3
LW
5119 }
5120 else
6154021b 5121 pl_yylval.ival = 0;
378cc40b 5122 OPERATOR(DOTDOT);
a687059c 5123 }
3280af22 5124 if (PL_expect != XOPERATOR)
2f3197b3 5125 check_uni();
79072805 5126 Aop(OP_CONCAT);
378cc40b
LW
5127 }
5128 /* FALL THROUGH */
5129 case '0': case '1': case '2': case '3': case '4':
5130 case '5': case '6': case '7': case '8': case '9':
6154021b 5131 s = scan_num(s, &pl_yylval);
931e0695 5132 DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
3280af22 5133 if (PL_expect == XOPERATOR)
8990e307 5134 no_op("Number",s);
79072805
LW
5135 TERM(THING);
5136
5137 case '\'':
5db06880 5138 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5139 DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
3280af22
NIS
5140 if (PL_expect == XOPERATOR) {
5141 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5142 PL_expect = XTERM;
c445ea15 5143 deprecate_old(commaless_variable_list);
bbf60fe6 5144 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 5145 }
463ee0b2 5146 else
8990e307 5147 no_op("String",s);
463ee0b2 5148 }
79072805 5149 if (!s)
d4c19fe8 5150 missingterm(NULL);
6154021b 5151 pl_yylval.ival = OP_CONST;
79072805
LW
5152 TERM(sublex_start());
5153
5154 case '"':
5db06880 5155 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5156 DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
3280af22
NIS
5157 if (PL_expect == XOPERATOR) {
5158 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5159 PL_expect = XTERM;
c445ea15 5160 deprecate_old(commaless_variable_list);
bbf60fe6 5161 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 5162 }
463ee0b2 5163 else
8990e307 5164 no_op("String",s);
463ee0b2 5165 }
79072805 5166 if (!s)
d4c19fe8 5167 missingterm(NULL);
6154021b 5168 pl_yylval.ival = OP_CONST;
cfd0369c
NC
5169 /* FIXME. I think that this can be const if char *d is replaced by
5170 more localised variables. */
3280af22 5171 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
63cd0674 5172 if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
6154021b 5173 pl_yylval.ival = OP_STRINGIFY;
4633a7c4
LW
5174 break;
5175 }
5176 }
79072805
LW
5177 TERM(sublex_start());
5178
5179 case '`':
5db06880 5180 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5181 DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
3280af22 5182 if (PL_expect == XOPERATOR)
8990e307 5183 no_op("Backticks",s);
79072805 5184 if (!s)
d4c19fe8 5185 missingterm(NULL);
9b201d7d 5186 readpipe_override();
79072805
LW
5187 TERM(sublex_start());
5188
5189 case '\\':
5190 s++;
041457d9 5191 if (PL_lex_inwhat && isDIGIT(*s) && ckWARN(WARN_SYNTAX))
9014280d 5192 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
599cee73 5193 *s, *s);
3280af22 5194 if (PL_expect == XOPERATOR)
8990e307 5195 no_op("Backslash",s);
79072805
LW
5196 OPERATOR(REFGEN);
5197
a7cb1f99 5198 case 'v':
e526c9e6 5199 if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
f54cb97a 5200 char *start = s + 2;
dd629d5b 5201 while (isDIGIT(*start) || *start == '_')
a7cb1f99
GS
5202 start++;
5203 if (*start == '.' && isDIGIT(start[1])) {
6154021b 5204 s = scan_num(s, &pl_yylval);
a7cb1f99
GS
5205 TERM(THING);
5206 }
e526c9e6 5207 /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6f33ba73
RGS
5208 else if (!isALPHA(*start) && (PL_expect == XTERM
5209 || PL_expect == XREF || PL_expect == XSTATE
5210 || PL_expect == XTERMORDORDOR)) {
9bde8eb0 5211 GV *const gv = gv_fetchpvn_flags(s, start - s, 0, SVt_PVCV);
e526c9e6 5212 if (!gv) {
6154021b 5213 s = scan_num(s, &pl_yylval);
e526c9e6
GS
5214 TERM(THING);
5215 }
5216 }
a7cb1f99
GS
5217 }
5218 goto keylookup;
79072805 5219 case 'x':
3280af22 5220 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
5221 s++;
5222 Mop(OP_REPEAT);
2f3197b3 5223 }
79072805
LW
5224 goto keylookup;
5225
378cc40b 5226 case '_':
79072805
LW
5227 case 'a': case 'A':
5228 case 'b': case 'B':
5229 case 'c': case 'C':
5230 case 'd': case 'D':
5231 case 'e': case 'E':
5232 case 'f': case 'F':
5233 case 'g': case 'G':
5234 case 'h': case 'H':
5235 case 'i': case 'I':
5236 case 'j': case 'J':
5237 case 'k': case 'K':
5238 case 'l': case 'L':
5239 case 'm': case 'M':
5240 case 'n': case 'N':
5241 case 'o': case 'O':
5242 case 'p': case 'P':
5243 case 'q': case 'Q':
5244 case 'r': case 'R':
5245 case 's': case 'S':
5246 case 't': case 'T':
5247 case 'u': case 'U':
a7cb1f99 5248 case 'V':
79072805
LW
5249 case 'w': case 'W':
5250 case 'X':
5251 case 'y': case 'Y':
5252 case 'z': case 'Z':
5253
49dc05e3 5254 keylookup: {
90771dc0 5255 I32 tmp;
10edeb5d
JH
5256
5257 orig_keyword = 0;
5258 gv = NULL;
5259 gvp = NULL;
49dc05e3 5260
3280af22
NIS
5261 PL_bufptr = s;
5262 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 5263
5264 /* Some keywords can be followed by any delimiter, including ':' */
155aba94
GS
5265 tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
5266 (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
5267 (PL_tokenbuf[0] == 'q' &&
5268 strchr("qwxr", PL_tokenbuf[1])))));
8ebc5c01 5269
5270 /* x::* is just a word, unless x is "CORE" */
3280af22 5271 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
5272 goto just_a_word;
5273
3643fb5f 5274 d = s;
3280af22 5275 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
5276 d++; /* no comments skipped here, or s### is misparsed */
5277
5278 /* Is this a label? */
3280af22
NIS
5279 if (!tmp && PL_expect == XSTATE
5280 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
28ccebc4
RGS
5281 tmp = keyword(PL_tokenbuf, len, 0);
5282 if (tmp)
5283 Perl_croak(aTHX_ "Can't use keyword '%s' as a label", PL_tokenbuf);
8ebc5c01 5284 s = d + 1;
6154021b 5285 pl_yylval.pval = CopLABEL_alloc(PL_tokenbuf);
8ebc5c01 5286 CLINE;
5287 TOKEN(LABEL);
3643fb5f 5288 }
28ccebc4
RGS
5289 else
5290 /* Check for keywords */
5291 tmp = keyword(PL_tokenbuf, len, 0);
3643fb5f 5292
748a9306 5293 /* Is this a word before a => operator? */
1c3923b3 5294 if (*d == '=' && d[1] == '>') {
748a9306 5295 CLINE;
6154021b 5296 pl_yylval.opval
d0a148a6
NC
5297 = (OP*)newSVOP(OP_CONST, 0,
5298 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
6154021b 5299 pl_yylval.opval->op_private = OPpCONST_BARE;
748a9306
LW
5300 TERM(WORD);
5301 }
5302
a0d0e21e 5303 if (tmp < 0) { /* second-class keyword? */
cbbf8932
AL
5304 GV *ogv = NULL; /* override (winner) */
5305 GV *hgv = NULL; /* hidden (loser) */
3280af22 5306 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 5307 CV *cv;
90e5519e 5308 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
56f7f34b
CS
5309 (cv = GvCVu(gv)))
5310 {
5311 if (GvIMPORTED_CV(gv))
5312 ogv = gv;
5313 else if (! CvMETHOD(cv))
5314 hgv = gv;
5315 }
5316 if (!ogv &&
3280af22 5317 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
9e0d86f8 5318 (gv = *gvp) && isGV_with_GP(gv) &&
56f7f34b
CS
5319 GvCVu(gv) && GvIMPORTED_CV(gv))
5320 {
5321 ogv = gv;
5322 }
5323 }
5324 if (ogv) {
30fe34ed 5325 orig_keyword = tmp;
56f7f34b 5326 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
5327 }
5328 else if (gv && !gvp
5329 && -tmp==KEY_lock /* XXX generalizable kludge */
47f9f84c 5330 && GvCVu(gv))
6e7b2336
GS
5331 {
5332 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 5333 }
56f7f34b
CS
5334 else { /* no override */
5335 tmp = -tmp;
ac206dc8 5336 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
9014280d 5337 Perl_warner(aTHX_ packWARN(WARN_MISC),
ac206dc8
RGS
5338 "dump() better written as CORE::dump()");
5339 }
a0714e2c 5340 gv = NULL;
56f7f34b 5341 gvp = 0;
041457d9
DM
5342 if (hgv && tmp != KEY_x && tmp != KEY_CORE
5343 && ckWARN(WARN_AMBIGUOUS)) /* never ambiguous */
9014280d 5344 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 5345 "Ambiguous call resolved as CORE::%s(), %s",
2f3ca594 5346 GvENAME(hgv), "qualify as such or use &");
49dc05e3 5347 }
a0d0e21e
LW
5348 }
5349
5350 reserved_word:
5351 switch (tmp) {
79072805
LW
5352
5353 default: /* not a keyword */
0bfa2a8a
NC
5354 /* Trade off - by using this evil construction we can pull the
5355 variable gv into the block labelled keylookup. If not, then
5356 we have to give it function scope so that the goto from the
5357 earlier ':' case doesn't bypass the initialisation. */
5358 if (0) {
5359 just_a_word_zero_gv:
5360 gv = NULL;
5361 gvp = NULL;
8bee0991 5362 orig_keyword = 0;
0bfa2a8a 5363 }
93a17b20 5364 just_a_word: {
96e4d5b1 5365 SV *sv;
ce29ac45 5366 int pkgname = 0;
f54cb97a 5367 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
5069cc75 5368 CV *cv;
5db06880 5369#ifdef PERL_MAD
cd81e915 5370 SV *nextPL_nextwhite = 0;
5db06880
NC
5371#endif
5372
8990e307
LW
5373
5374 /* Get the rest if it looks like a package qualifier */
5375
155aba94 5376 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
c3e0f903 5377 STRLEN morelen;
3280af22 5378 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
5379 TRUE, &morelen);
5380 if (!morelen)
cea2e8a9 5381 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 5382 *s == '\'' ? "'" : "::");
c3e0f903 5383 len += morelen;
ce29ac45 5384 pkgname = 1;
a0d0e21e 5385 }
8990e307 5386
3280af22
NIS
5387 if (PL_expect == XOPERATOR) {
5388 if (PL_bufptr == PL_linestart) {
57843af0 5389 CopLINE_dec(PL_curcop);
f1f66076 5390 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
57843af0 5391 CopLINE_inc(PL_curcop);
463ee0b2
LW
5392 }
5393 else
54310121 5394 no_op("Bareword",s);
463ee0b2 5395 }
8990e307 5396
c3e0f903
GS
5397 /* Look for a subroutine with this name in current package,
5398 unless name is "Foo::", in which case Foo is a bearword
5399 (and a package name). */
5400
5db06880 5401 if (len > 2 && !PL_madskills &&
3280af22 5402 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 5403 {
f776e3cd 5404 if (ckWARN(WARN_BAREWORD)
90e5519e 5405 && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
9014280d 5406 Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
599cee73 5407 "Bareword \"%s\" refers to nonexistent package",
3280af22 5408 PL_tokenbuf);
c3e0f903 5409 len -= 2;
3280af22 5410 PL_tokenbuf[len] = '\0';
a0714e2c 5411 gv = NULL;
c3e0f903
GS
5412 gvp = 0;
5413 }
5414 else {
62d55b22
NC
5415 if (!gv) {
5416 /* Mustn't actually add anything to a symbol table.
5417 But also don't want to "initialise" any placeholder
5418 constants that might already be there into full
5419 blown PVGVs with attached PVCV. */
90e5519e
NC
5420 gv = gv_fetchpvn_flags(PL_tokenbuf, len,
5421 GV_NOADD_NOINIT, SVt_PVCV);
62d55b22 5422 }
b3d904f3 5423 len = 0;
c3e0f903
GS
5424 }
5425
5426 /* if we saw a global override before, get the right name */
8990e307 5427
49dc05e3 5428 if (gvp) {
396482e1 5429 sv = newSVpvs("CORE::GLOBAL::");
3280af22 5430 sv_catpv(sv,PL_tokenbuf);
49dc05e3 5431 }
8a7a129d
NC
5432 else {
5433 /* If len is 0, newSVpv does strlen(), which is correct.
5434 If len is non-zero, then it will be the true length,
5435 and so the scalar will be created correctly. */
5436 sv = newSVpv(PL_tokenbuf,len);
5437 }
5db06880 5438#ifdef PERL_MAD
cd81e915
NC
5439 if (PL_madskills && !PL_thistoken) {
5440 char *start = SvPVX(PL_linestr) + PL_realtokenstart;
9ff8e806 5441 PL_thistoken = newSVpvn(start,s - start);
cd81e915 5442 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
5443 }
5444#endif
8990e307 5445
a0d0e21e
LW
5446 /* Presume this is going to be a bareword of some sort. */
5447
5448 CLINE;
6154021b
RGS
5449 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
5450 pl_yylval.opval->op_private = OPpCONST_BARE;
8f8cf39c
JH
5451 /* UTF-8 package name? */
5452 if (UTF && !IN_BYTES &&
95a20fc0 5453 is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
8f8cf39c 5454 SvUTF8_on(sv);
a0d0e21e 5455
c3e0f903
GS
5456 /* And if "Foo::", then that's what it certainly is. */
5457
5458 if (len)
5459 goto safe_bareword;
5460
5069cc75
NC
5461 /* Do the explicit type check so that we don't need to force
5462 the initialisation of the symbol table to have a real GV.
5463 Beware - gv may not really be a PVGV, cv may not really be
5464 a PVCV, (because of the space optimisations that gv_init
5465 understands) But they're true if for this symbol there is
5466 respectively a typeglob and a subroutine.
5467 */
5468 cv = gv ? ((SvTYPE(gv) == SVt_PVGV)
5469 /* Real typeglob, so get the real subroutine: */
5470 ? GvCVu(gv)
5471 /* A proxy for a subroutine in this package? */
ea726b52 5472 : SvOK(gv) ? MUTABLE_CV(gv) : NULL)
5069cc75
NC
5473 : NULL;
5474
8990e307
LW
5475 /* See if it's the indirect object for a list operator. */
5476
3280af22
NIS
5477 if (PL_oldoldbufptr &&
5478 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
5479 (PL_oldoldbufptr == PL_last_lop
5480 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 5481 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
5482 (PL_expect == XREF ||
5483 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 5484 {
748a9306
LW
5485 bool immediate_paren = *s == '(';
5486
a0d0e21e 5487 /* (Now we can afford to cross potential line boundary.) */
cd81e915 5488 s = SKIPSPACE2(s,nextPL_nextwhite);
5db06880 5489#ifdef PERL_MAD
cd81e915 5490 PL_nextwhite = nextPL_nextwhite; /* assume no & deception */
5db06880 5491#endif
a0d0e21e
LW
5492
5493 /* Two barewords in a row may indicate method call. */
5494
62d55b22
NC
5495 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
5496 (tmp = intuit_method(s, gv, cv)))
bbf60fe6 5497 return REPORT(tmp);
a0d0e21e
LW
5498
5499 /* If not a declared subroutine, it's an indirect object. */
5500 /* (But it's an indir obj regardless for sort.) */
7294df96 5501 /* Also, if "_" follows a filetest operator, it's a bareword */
a0d0e21e 5502
7294df96
RGS
5503 if (
5504 ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
5069cc75 5505 ((!gv || !cv) &&
a9ef352a 5506 (PL_last_lop_op != OP_MAPSTART &&
f0670693 5507 PL_last_lop_op != OP_GREPSTART))))
7294df96
RGS
5508 || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
5509 && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
5510 )
a9ef352a 5511 {
3280af22 5512 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 5513 goto bareword;
93a17b20
LW
5514 }
5515 }
8990e307 5516
3280af22 5517 PL_expect = XOPERATOR;
5db06880
NC
5518#ifdef PERL_MAD
5519 if (isSPACE(*s))
cd81e915
NC
5520 s = SKIPSPACE2(s,nextPL_nextwhite);
5521 PL_nextwhite = nextPL_nextwhite;
5db06880 5522#else
8990e307 5523 s = skipspace(s);
5db06880 5524#endif
1c3923b3
GS
5525
5526 /* Is this a word before a => operator? */
ce29ac45 5527 if (*s == '=' && s[1] == '>' && !pkgname) {
1c3923b3 5528 CLINE;
6154021b 5529 sv_setpv(((SVOP*)pl_yylval.opval)->op_sv, PL_tokenbuf);
0064a8a9 5530 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
6154021b 5531 SvUTF8_on(((SVOP*)pl_yylval.opval)->op_sv);
1c3923b3
GS
5532 TERM(WORD);
5533 }
5534
5535 /* If followed by a paren, it's certainly a subroutine. */
93a17b20 5536 if (*s == '(') {
79072805 5537 CLINE;
5069cc75 5538 if (cv) {
c35e046a
AL
5539 d = s + 1;
5540 while (SPACE_OR_TAB(*d))
5541 d++;
62d55b22 5542 if (*d == ')' && (sv = gv_const_sv(gv))) {
96e4d5b1 5543 s = d + 1;
c631f32b 5544 goto its_constant;
96e4d5b1 5545 }
5546 }
5db06880
NC
5547#ifdef PERL_MAD
5548 if (PL_madskills) {
cd81e915
NC
5549 PL_nextwhite = PL_thiswhite;
5550 PL_thiswhite = 0;
5db06880 5551 }
cd81e915 5552 start_force(PL_curforce);
5db06880 5553#endif
6154021b 5554 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
3280af22 5555 PL_expect = XOPERATOR;
5db06880
NC
5556#ifdef PERL_MAD
5557 if (PL_madskills) {
cd81e915
NC
5558 PL_nextwhite = nextPL_nextwhite;
5559 curmad('X', PL_thistoken);
6b29d1f5 5560 PL_thistoken = newSVpvs("");
5db06880
NC
5561 }
5562#endif
93a17b20 5563 force_next(WORD);
6154021b 5564 pl_yylval.ival = 0;
463ee0b2 5565 TOKEN('&');
79072805 5566 }
93a17b20 5567
a0d0e21e 5568 /* If followed by var or block, call it a method (unless sub) */
8990e307 5569
62d55b22 5570 if ((*s == '$' || *s == '{') && (!gv || !cv)) {
3280af22
NIS
5571 PL_last_lop = PL_oldbufptr;
5572 PL_last_lop_op = OP_METHOD;
93a17b20 5573 PREBLOCK(METHOD);
463ee0b2
LW
5574 }
5575
8990e307
LW
5576 /* If followed by a bareword, see if it looks like indir obj. */
5577
30fe34ed
RGS
5578 if (!orig_keyword
5579 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
62d55b22 5580 && (tmp = intuit_method(s, gv, cv)))
bbf60fe6 5581 return REPORT(tmp);
93a17b20 5582
8990e307
LW
5583 /* Not a method, so call it a subroutine (if defined) */
5584
5069cc75 5585 if (cv) {
0453d815 5586 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
9014280d 5587 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5588 "Ambiguous use of -%s resolved as -&%s()",
3280af22 5589 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 5590 /* Check for a constant sub */
c631f32b 5591 if ((sv = gv_const_sv(gv))) {
96e4d5b1 5592 its_constant:
6154021b
RGS
5593 SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
5594 ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
5595 pl_yylval.opval->op_private = 0;
96e4d5b1 5596 TOKEN(WORD);
89bfa8cd 5597 }
5598
a5f75d66 5599 /* Resolve to GV now. */
62d55b22 5600 if (SvTYPE(gv) != SVt_PVGV) {
b3d904f3 5601 gv = gv_fetchpv(PL_tokenbuf, 0, SVt_PVCV);
62d55b22
NC
5602 assert (SvTYPE(gv) == SVt_PVGV);
5603 /* cv must have been some sort of placeholder, so
5604 now needs replacing with a real code reference. */
5605 cv = GvCV(gv);
5606 }
5607
6154021b
RGS
5608 op_free(pl_yylval.opval);
5609 pl_yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
5610 pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 5611 PL_last_lop = PL_oldbufptr;
bf848113 5612 PL_last_lop_op = OP_ENTERSUB;
4633a7c4 5613 /* Is there a prototype? */
5db06880
NC
5614 if (
5615#ifdef PERL_MAD
5616 cv &&
5617#endif
d9f2850e
RGS
5618 SvPOK(cv))
5619 {
5f66b61c 5620 STRLEN protolen;
daba3364 5621 const char *proto = SvPV_const(MUTABLE_SV(cv), protolen);
5f66b61c 5622 if (!protolen)
4633a7c4 5623 TERM(FUNC0SUB);
8c28b960 5624 if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
4633a7c4 5625 OPERATOR(UNIOPSUB);
0f5d0394
AE
5626 while (*proto == ';')
5627 proto++;
7a52d87a 5628 if (*proto == '&' && *s == '{') {
49a54bbe
NC
5629 if (PL_curstash)
5630 sv_setpvs(PL_subname, "__ANON__");
5631 else
5632 sv_setpvs(PL_subname, "__ANON__::__ANON__");
4633a7c4
LW
5633 PREBLOCK(LSTOPSUB);
5634 }
a9ef352a 5635 }
5db06880
NC
5636#ifdef PERL_MAD
5637 {
5638 if (PL_madskills) {
cd81e915
NC
5639 PL_nextwhite = PL_thiswhite;
5640 PL_thiswhite = 0;
5db06880 5641 }
cd81e915 5642 start_force(PL_curforce);
6154021b 5643 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
5db06880
NC
5644 PL_expect = XTERM;
5645 if (PL_madskills) {
cd81e915
NC
5646 PL_nextwhite = nextPL_nextwhite;
5647 curmad('X', PL_thistoken);
6b29d1f5 5648 PL_thistoken = newSVpvs("");
5db06880
NC
5649 }
5650 force_next(WORD);
5651 TOKEN(NOAMP);
5652 }
5653 }
5654
5655 /* Guess harder when madskills require "best effort". */
5656 if (PL_madskills && (!gv || !GvCVu(gv))) {
5657 int probable_sub = 0;
5658 if (strchr("\"'`$@%0123456789!*+{[<", *s))
5659 probable_sub = 1;
5660 else if (isALPHA(*s)) {
5661 char tmpbuf[1024];
5662 STRLEN tmplen;
5663 d = s;
5664 d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
5458a98a 5665 if (!keyword(tmpbuf, tmplen, 0))
5db06880
NC
5666 probable_sub = 1;
5667 else {
5668 while (d < PL_bufend && isSPACE(*d))
5669 d++;
5670 if (*d == '=' && d[1] == '>')
5671 probable_sub = 1;
5672 }
5673 }
5674 if (probable_sub) {
7a6d04f4 5675 gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
6154021b
RGS
5676 op_free(pl_yylval.opval);
5677 pl_yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
5678 pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
5db06880
NC
5679 PL_last_lop = PL_oldbufptr;
5680 PL_last_lop_op = OP_ENTERSUB;
cd81e915
NC
5681 PL_nextwhite = PL_thiswhite;
5682 PL_thiswhite = 0;
5683 start_force(PL_curforce);
6154021b 5684 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
5db06880 5685 PL_expect = XTERM;
cd81e915
NC
5686 PL_nextwhite = nextPL_nextwhite;
5687 curmad('X', PL_thistoken);
6b29d1f5 5688 PL_thistoken = newSVpvs("");
5db06880
NC
5689 force_next(WORD);
5690 TOKEN(NOAMP);
5691 }
5692#else
6154021b 5693 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
3280af22 5694 PL_expect = XTERM;
8990e307
LW
5695 force_next(WORD);
5696 TOKEN(NOAMP);
5db06880 5697#endif
8990e307 5698 }
748a9306 5699
8990e307
LW
5700 /* Call it a bare word */
5701
5603f27d 5702 if (PL_hints & HINT_STRICT_SUBS)
6154021b 5703 pl_yylval.opval->op_private |= OPpCONST_STRICT;
5603f27d 5704 else {
9a073a1d
RGS
5705 bareword:
5706 /* after "print" and similar functions (corresponding to
5707 * "F? L" in opcode.pl), whatever wasn't already parsed as
5708 * a filehandle should be subject to "strict subs".
5709 * Likewise for the optional indirect-object argument to system
5710 * or exec, which can't be a bareword */
5711 if ((PL_last_lop_op == OP_PRINT
5712 || PL_last_lop_op == OP_PRTF
5713 || PL_last_lop_op == OP_SAY
5714 || PL_last_lop_op == OP_SYSTEM
5715 || PL_last_lop_op == OP_EXEC)
5716 && (PL_hints & HINT_STRICT_SUBS))
5717 pl_yylval.opval->op_private |= OPpCONST_STRICT;
041457d9
DM
5718 if (lastchar != '-') {
5719 if (ckWARN(WARN_RESERVED)) {
c35e046a
AL
5720 d = PL_tokenbuf;
5721 while (isLOWER(*d))
5722 d++;
da51bb9b 5723 if (!*d && !gv_stashpv(PL_tokenbuf, 0))
9014280d 5724 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
5725 PL_tokenbuf);
5726 }
748a9306
LW
5727 }
5728 }
c3e0f903
GS
5729
5730 safe_bareword:
3792a11b
NC
5731 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
5732 && ckWARN_d(WARN_AMBIGUOUS)) {
9014280d 5733 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5734 "Operator or semicolon missing before %c%s",
3280af22 5735 lastchar, PL_tokenbuf);
9014280d 5736 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5737 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
5738 lastchar, lastchar);
5739 }
93a17b20 5740 TOKEN(WORD);
79072805 5741 }
79072805 5742
68dc0745 5743 case KEY___FILE__:
6154021b 5744 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 5745 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 5746 TERM(THING);
5747
79072805 5748 case KEY___LINE__:
6154021b 5749 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 5750 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 5751 TERM(THING);
68dc0745 5752
5753 case KEY___PACKAGE__:
6154021b 5754 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22 5755 (PL_curstash
5aaec2b4 5756 ? newSVhek(HvNAME_HEK(PL_curstash))
3280af22 5757 : &PL_sv_undef));
79072805 5758 TERM(THING);
79072805 5759
e50aee73 5760 case KEY___DATA__:
79072805
LW
5761 case KEY___END__: {
5762 GV *gv;
3280af22 5763 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
bfed75c6 5764 const char *pname = "main";
3280af22 5765 if (PL_tokenbuf[2] == 'D')
bfcb3514 5766 pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
f776e3cd
NC
5767 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
5768 SVt_PVIO);
a5f75d66 5769 GvMULTI_on(gv);
79072805 5770 if (!GvIO(gv))
a0d0e21e 5771 GvIOp(gv) = newIO();
3280af22 5772 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
5773#if defined(HAS_FCNTL) && defined(F_SETFD)
5774 {
f54cb97a 5775 const int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
5776 fcntl(fd,F_SETFD,fd >= 3);
5777 }
79072805 5778#endif
fd049845 5779 /* Mark this internal pseudo-handle as clean */
5780 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4c84d7f2 5781 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 5782 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 5783 else
50952442 5784 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
5785#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
5786 /* if the script was opened in binmode, we need to revert
53129d29 5787 * it to text mode for compatibility; but only iff it has CRs
c39cd008 5788 * XXX this is a questionable hack at best. */
53129d29
GS
5789 if (PL_bufend-PL_bufptr > 2
5790 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
5791 {
5792 Off_t loc = 0;
50952442 5793 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
5794 loc = PerlIO_tell(PL_rsfp);
5795 (void)PerlIO_seek(PL_rsfp, 0L, 0);
5796 }
2986a63f
JH
5797#ifdef NETWARE
5798 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
5799#else
c39cd008 5800 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 5801#endif /* NETWARE */
1143fce0
JH
5802#ifdef PERLIO_IS_STDIO /* really? */
5803# if defined(__BORLANDC__)
cb359b41
JH
5804 /* XXX see note in do_binmode() */
5805 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
5806# endif
5807#endif
c39cd008
GS
5808 if (loc > 0)
5809 PerlIO_seek(PL_rsfp, loc, 0);
5810 }
5811 }
5812#endif
7948272d 5813#ifdef PERLIO_LAYERS
52d2e0f4
JH
5814 if (!IN_BYTES) {
5815 if (UTF)
5816 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
5817 else if (PL_encoding) {
5818 SV *name;
5819 dSP;
5820 ENTER;
5821 SAVETMPS;
5822 PUSHMARK(sp);
5823 EXTEND(SP, 1);
5824 XPUSHs(PL_encoding);
5825 PUTBACK;
5826 call_method("name", G_SCALAR);
5827 SPAGAIN;
5828 name = POPs;
5829 PUTBACK;
bfed75c6 5830 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
52d2e0f4 5831 Perl_form(aTHX_ ":encoding(%"SVf")",
be2597df 5832 SVfARG(name)));
52d2e0f4
JH
5833 FREETMPS;
5834 LEAVE;
5835 }
5836 }
7948272d 5837#endif
5db06880
NC
5838#ifdef PERL_MAD
5839 if (PL_madskills) {
cd81e915
NC
5840 if (PL_realtokenstart >= 0) {
5841 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5842 if (!PL_endwhite)
6b29d1f5 5843 PL_endwhite = newSVpvs("");
cd81e915
NC
5844 sv_catsv(PL_endwhite, PL_thiswhite);
5845 PL_thiswhite = 0;
5846 sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
5847 PL_realtokenstart = -1;
5db06880 5848 }
cd81e915 5849 while ((s = filter_gets(PL_endwhite, PL_rsfp,
1a9a51d4 5850 SvCUR(PL_endwhite))) != NULL) ;
5db06880
NC
5851 }
5852#endif
4608196e 5853 PL_rsfp = NULL;
79072805
LW
5854 }
5855 goto fake_eof;
e929a76b 5856 }
de3bb511 5857
8990e307 5858 case KEY_AUTOLOAD:
ed6116ce 5859 case KEY_DESTROY:
79072805 5860 case KEY_BEGIN:
3c10abe3 5861 case KEY_UNITCHECK:
7d30b5c4 5862 case KEY_CHECK:
7d07dbc2 5863 case KEY_INIT:
7d30b5c4 5864 case KEY_END:
3280af22
NIS
5865 if (PL_expect == XSTATE) {
5866 s = PL_bufptr;
93a17b20 5867 goto really_sub;
79072805
LW
5868 }
5869 goto just_a_word;
5870
a0d0e21e
LW
5871 case KEY_CORE:
5872 if (*s == ':' && s[1] == ':') {
5873 s += 2;
748a9306 5874 d = s;
3280af22 5875 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 5876 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6798c92b 5877 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
5878 if (tmp < 0)
5879 tmp = -tmp;
850e8516 5880 else if (tmp == KEY_require || tmp == KEY_do)
a72a1c8b 5881 /* that's a way to remember we saw "CORE::" */
850e8516 5882 orig_keyword = tmp;
a0d0e21e
LW
5883 goto reserved_word;
5884 }
5885 goto just_a_word;
5886
463ee0b2
LW
5887 case KEY_abs:
5888 UNI(OP_ABS);
5889
79072805
LW
5890 case KEY_alarm:
5891 UNI(OP_ALARM);
5892
5893 case KEY_accept:
a0d0e21e 5894 LOP(OP_ACCEPT,XTERM);
79072805 5895
463ee0b2
LW
5896 case KEY_and:
5897 OPERATOR(ANDOP);
5898
79072805 5899 case KEY_atan2:
a0d0e21e 5900 LOP(OP_ATAN2,XTERM);
85e6fe83 5901
79072805 5902 case KEY_bind:
a0d0e21e 5903 LOP(OP_BIND,XTERM);
79072805
LW
5904
5905 case KEY_binmode:
1c1fc3ea 5906 LOP(OP_BINMODE,XTERM);
79072805
LW
5907
5908 case KEY_bless:
a0d0e21e 5909 LOP(OP_BLESS,XTERM);
79072805 5910
0d863452
RH
5911 case KEY_break:
5912 FUN0(OP_BREAK);
5913
79072805
LW
5914 case KEY_chop:
5915 UNI(OP_CHOP);
5916
5917 case KEY_continue:
0d863452
RH
5918 /* When 'use switch' is in effect, continue has a dual
5919 life as a control operator. */
5920 {
ef89dcc3 5921 if (!FEATURE_IS_ENABLED("switch"))
0d863452
RH
5922 PREBLOCK(CONTINUE);
5923 else {
5924 /* We have to disambiguate the two senses of
5925 "continue". If the next token is a '{' then
5926 treat it as the start of a continue block;
5927 otherwise treat it as a control operator.
5928 */
5929 s = skipspace(s);
5930 if (*s == '{')
79072805 5931 PREBLOCK(CONTINUE);
0d863452
RH
5932 else
5933 FUN0(OP_CONTINUE);
5934 }
5935 }
79072805
LW
5936
5937 case KEY_chdir:
fafc274c
NC
5938 /* may use HOME */
5939 (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
79072805
LW
5940 UNI(OP_CHDIR);
5941
5942 case KEY_close:
5943 UNI(OP_CLOSE);
5944
5945 case KEY_closedir:
5946 UNI(OP_CLOSEDIR);
5947
5948 case KEY_cmp:
5949 Eop(OP_SCMP);
5950
5951 case KEY_caller:
5952 UNI(OP_CALLER);
5953
5954 case KEY_crypt:
5955#ifdef FCRYPT
f4c556ac
GS
5956 if (!PL_cryptseen) {
5957 PL_cryptseen = TRUE;
de3bb511 5958 init_des();
f4c556ac 5959 }
a687059c 5960#endif
a0d0e21e 5961 LOP(OP_CRYPT,XTERM);
79072805
LW
5962
5963 case KEY_chmod:
a0d0e21e 5964 LOP(OP_CHMOD,XTERM);
79072805
LW
5965
5966 case KEY_chown:
a0d0e21e 5967 LOP(OP_CHOWN,XTERM);
79072805
LW
5968
5969 case KEY_connect:
a0d0e21e 5970 LOP(OP_CONNECT,XTERM);
79072805 5971
463ee0b2
LW
5972 case KEY_chr:
5973 UNI(OP_CHR);
5974
79072805
LW
5975 case KEY_cos:
5976 UNI(OP_COS);
5977
5978 case KEY_chroot:
5979 UNI(OP_CHROOT);
5980
0d863452
RH
5981 case KEY_default:
5982 PREBLOCK(DEFAULT);
5983
79072805 5984 case KEY_do:
29595ff2 5985 s = SKIPSPACE1(s);
79072805 5986 if (*s == '{')
a0d0e21e 5987 PRETERMBLOCK(DO);
79072805 5988 if (*s != '\'')
89c5585f 5989 s = force_word(s,WORD,TRUE,TRUE,FALSE);
850e8516
RGS
5990 if (orig_keyword == KEY_do) {
5991 orig_keyword = 0;
6154021b 5992 pl_yylval.ival = 1;
850e8516
RGS
5993 }
5994 else
6154021b 5995 pl_yylval.ival = 0;
378cc40b 5996 OPERATOR(DO);
79072805
LW
5997
5998 case KEY_die:
3280af22 5999 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 6000 LOP(OP_DIE,XTERM);
79072805
LW
6001
6002 case KEY_defined:
6003 UNI(OP_DEFINED);
6004
6005 case KEY_delete:
a0d0e21e 6006 UNI(OP_DELETE);
79072805
LW
6007
6008 case KEY_dbmopen:
5c1737d1 6009 gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
a0d0e21e 6010 LOP(OP_DBMOPEN,XTERM);
79072805
LW
6011
6012 case KEY_dbmclose:
6013 UNI(OP_DBMCLOSE);
6014
6015 case KEY_dump:
a0d0e21e 6016 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6017 LOOPX(OP_DUMP);
6018
6019 case KEY_else:
6020 PREBLOCK(ELSE);
6021
6022 case KEY_elsif:
6154021b 6023 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
6024 OPERATOR(ELSIF);
6025
6026 case KEY_eq:
6027 Eop(OP_SEQ);
6028
a0d0e21e
LW
6029 case KEY_exists:
6030 UNI(OP_EXISTS);
4e553d73 6031
79072805 6032 case KEY_exit:
5db06880
NC
6033 if (PL_madskills)
6034 UNI(OP_INT);
79072805
LW
6035 UNI(OP_EXIT);
6036
6037 case KEY_eval:
29595ff2 6038 s = SKIPSPACE1(s);
3280af22 6039 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 6040 UNIBRACK(OP_ENTEREVAL);
79072805
LW
6041
6042 case KEY_eof:
6043 UNI(OP_EOF);
6044
6045 case KEY_exp:
6046 UNI(OP_EXP);
6047
6048 case KEY_each:
6049 UNI(OP_EACH);
6050
6051 case KEY_exec:
a0d0e21e 6052 LOP(OP_EXEC,XREF);
79072805
LW
6053
6054 case KEY_endhostent:
6055 FUN0(OP_EHOSTENT);
6056
6057 case KEY_endnetent:
6058 FUN0(OP_ENETENT);
6059
6060 case KEY_endservent:
6061 FUN0(OP_ESERVENT);
6062
6063 case KEY_endprotoent:
6064 FUN0(OP_EPROTOENT);
6065
6066 case KEY_endpwent:
6067 FUN0(OP_EPWENT);
6068
6069 case KEY_endgrent:
6070 FUN0(OP_EGRENT);
6071
6072 case KEY_for:
6073 case KEY_foreach:
6154021b 6074 pl_yylval.ival = CopLINE(PL_curcop);
29595ff2 6075 s = SKIPSPACE1(s);
7e2040f0 6076 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 6077 char *p = s;
5db06880
NC
6078#ifdef PERL_MAD
6079 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
6080#endif
6081
3280af22 6082 if ((PL_bufend - p) >= 3 &&
55497cff 6083 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
6084 p += 2;
77ca0c92
LW
6085 else if ((PL_bufend - p) >= 4 &&
6086 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
6087 p += 3;
29595ff2 6088 p = PEEKSPACE(p);
7e2040f0 6089 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
6090 p = scan_ident(p, PL_bufend,
6091 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
29595ff2 6092 p = PEEKSPACE(p);
77ca0c92
LW
6093 }
6094 if (*p != '$')
cea2e8a9 6095 Perl_croak(aTHX_ "Missing $ on loop variable");
5db06880
NC
6096#ifdef PERL_MAD
6097 s = SvPVX(PL_linestr) + soff;
6098#endif
55497cff 6099 }
79072805
LW
6100 OPERATOR(FOR);
6101
6102 case KEY_formline:
a0d0e21e 6103 LOP(OP_FORMLINE,XTERM);
79072805
LW
6104
6105 case KEY_fork:
6106 FUN0(OP_FORK);
6107
6108 case KEY_fcntl:
a0d0e21e 6109 LOP(OP_FCNTL,XTERM);
79072805
LW
6110
6111 case KEY_fileno:
6112 UNI(OP_FILENO);
6113
6114 case KEY_flock:
a0d0e21e 6115 LOP(OP_FLOCK,XTERM);
79072805
LW
6116
6117 case KEY_gt:
6118 Rop(OP_SGT);
6119
6120 case KEY_ge:
6121 Rop(OP_SGE);
6122
6123 case KEY_grep:
2c38e13d 6124 LOP(OP_GREPSTART, XREF);
79072805
LW
6125
6126 case KEY_goto:
a0d0e21e 6127 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6128 LOOPX(OP_GOTO);
6129
6130 case KEY_gmtime:
6131 UNI(OP_GMTIME);
6132
6133 case KEY_getc:
6f33ba73 6134 UNIDOR(OP_GETC);
79072805
LW
6135
6136 case KEY_getppid:
6137 FUN0(OP_GETPPID);
6138
6139 case KEY_getpgrp:
6140 UNI(OP_GETPGRP);
6141
6142 case KEY_getpriority:
a0d0e21e 6143 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
6144
6145 case KEY_getprotobyname:
6146 UNI(OP_GPBYNAME);
6147
6148 case KEY_getprotobynumber:
a0d0e21e 6149 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
6150
6151 case KEY_getprotoent:
6152 FUN0(OP_GPROTOENT);
6153
6154 case KEY_getpwent:
6155 FUN0(OP_GPWENT);
6156
6157 case KEY_getpwnam:
ff68c719 6158 UNI(OP_GPWNAM);
79072805
LW
6159
6160 case KEY_getpwuid:
ff68c719 6161 UNI(OP_GPWUID);
79072805
LW
6162
6163 case KEY_getpeername:
6164 UNI(OP_GETPEERNAME);
6165
6166 case KEY_gethostbyname:
6167 UNI(OP_GHBYNAME);
6168
6169 case KEY_gethostbyaddr:
a0d0e21e 6170 LOP(OP_GHBYADDR,XTERM);
79072805
LW
6171
6172 case KEY_gethostent:
6173 FUN0(OP_GHOSTENT);
6174
6175 case KEY_getnetbyname:
6176 UNI(OP_GNBYNAME);
6177
6178 case KEY_getnetbyaddr:
a0d0e21e 6179 LOP(OP_GNBYADDR,XTERM);
79072805
LW
6180
6181 case KEY_getnetent:
6182 FUN0(OP_GNETENT);
6183
6184 case KEY_getservbyname:
a0d0e21e 6185 LOP(OP_GSBYNAME,XTERM);
79072805
LW
6186
6187 case KEY_getservbyport:
a0d0e21e 6188 LOP(OP_GSBYPORT,XTERM);
79072805
LW
6189
6190 case KEY_getservent:
6191 FUN0(OP_GSERVENT);
6192
6193 case KEY_getsockname:
6194 UNI(OP_GETSOCKNAME);
6195
6196 case KEY_getsockopt:
a0d0e21e 6197 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
6198
6199 case KEY_getgrent:
6200 FUN0(OP_GGRENT);
6201
6202 case KEY_getgrnam:
ff68c719 6203 UNI(OP_GGRNAM);
79072805
LW
6204
6205 case KEY_getgrgid:
ff68c719 6206 UNI(OP_GGRGID);
79072805
LW
6207
6208 case KEY_getlogin:
6209 FUN0(OP_GETLOGIN);
6210
0d863452 6211 case KEY_given:
6154021b 6212 pl_yylval.ival = CopLINE(PL_curcop);
0d863452
RH
6213 OPERATOR(GIVEN);
6214
93a17b20 6215 case KEY_glob:
a0d0e21e 6216 LOP(OP_GLOB,XTERM);
93a17b20 6217
79072805
LW
6218 case KEY_hex:
6219 UNI(OP_HEX);
6220
6221 case KEY_if:
6154021b 6222 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
6223 OPERATOR(IF);
6224
6225 case KEY_index:
a0d0e21e 6226 LOP(OP_INDEX,XTERM);
79072805
LW
6227
6228 case KEY_int:
6229 UNI(OP_INT);
6230
6231 case KEY_ioctl:
a0d0e21e 6232 LOP(OP_IOCTL,XTERM);
79072805
LW
6233
6234 case KEY_join:
a0d0e21e 6235 LOP(OP_JOIN,XTERM);
79072805
LW
6236
6237 case KEY_keys:
6238 UNI(OP_KEYS);
6239
6240 case KEY_kill:
a0d0e21e 6241 LOP(OP_KILL,XTERM);
79072805
LW
6242
6243 case KEY_last:
a0d0e21e 6244 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 6245 LOOPX(OP_LAST);
4e553d73 6246
79072805
LW
6247 case KEY_lc:
6248 UNI(OP_LC);
6249
6250 case KEY_lcfirst:
6251 UNI(OP_LCFIRST);
6252
6253 case KEY_local:
6154021b 6254 pl_yylval.ival = 0;
79072805
LW
6255 OPERATOR(LOCAL);
6256
6257 case KEY_length:
6258 UNI(OP_LENGTH);
6259
6260 case KEY_lt:
6261 Rop(OP_SLT);
6262
6263 case KEY_le:
6264 Rop(OP_SLE);
6265
6266 case KEY_localtime:
6267 UNI(OP_LOCALTIME);
6268
6269 case KEY_log:
6270 UNI(OP_LOG);
6271
6272 case KEY_link:
a0d0e21e 6273 LOP(OP_LINK,XTERM);
79072805
LW
6274
6275 case KEY_listen:
a0d0e21e 6276 LOP(OP_LISTEN,XTERM);
79072805 6277
c0329465
MB
6278 case KEY_lock:
6279 UNI(OP_LOCK);
6280
79072805
LW
6281 case KEY_lstat:
6282 UNI(OP_LSTAT);
6283
6284 case KEY_m:
8782bef2 6285 s = scan_pat(s,OP_MATCH);
79072805
LW
6286 TERM(sublex_start());
6287
a0d0e21e 6288 case KEY_map:
2c38e13d 6289 LOP(OP_MAPSTART, XREF);
4e4e412b 6290
79072805 6291 case KEY_mkdir:
a0d0e21e 6292 LOP(OP_MKDIR,XTERM);
79072805
LW
6293
6294 case KEY_msgctl:
a0d0e21e 6295 LOP(OP_MSGCTL,XTERM);
79072805
LW
6296
6297 case KEY_msgget:
a0d0e21e 6298 LOP(OP_MSGGET,XTERM);
79072805
LW
6299
6300 case KEY_msgrcv:
a0d0e21e 6301 LOP(OP_MSGRCV,XTERM);
79072805
LW
6302
6303 case KEY_msgsnd:
a0d0e21e 6304 LOP(OP_MSGSND,XTERM);
79072805 6305
77ca0c92 6306 case KEY_our:
93a17b20 6307 case KEY_my:
952306ac 6308 case KEY_state:
eac04b2e 6309 PL_in_my = (U16)tmp;
29595ff2 6310 s = SKIPSPACE1(s);
7e2040f0 6311 if (isIDFIRST_lazy_if(s,UTF)) {
5db06880
NC
6312#ifdef PERL_MAD
6313 char* start = s;
6314#endif
3280af22 6315 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
6316 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
6317 goto really_sub;
def3634b 6318 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 6319 if (!PL_in_my_stash) {
c750a3ec 6320 char tmpbuf[1024];
3280af22 6321 PL_bufptr = s;
d9fad198 6322 my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
6323 yyerror(tmpbuf);
6324 }
5db06880
NC
6325#ifdef PERL_MAD
6326 if (PL_madskills) { /* just add type to declarator token */
cd81e915
NC
6327 sv_catsv(PL_thistoken, PL_nextwhite);
6328 PL_nextwhite = 0;
6329 sv_catpvn(PL_thistoken, start, s - start);
5db06880
NC
6330 }
6331#endif
c750a3ec 6332 }
6154021b 6333 pl_yylval.ival = 1;
55497cff 6334 OPERATOR(MY);
93a17b20 6335
79072805 6336 case KEY_next:
a0d0e21e 6337 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6338 LOOPX(OP_NEXT);
6339
6340 case KEY_ne:
6341 Eop(OP_SNE);
6342
a0d0e21e 6343 case KEY_no:
468aa647 6344 s = tokenize_use(0, s);
a0d0e21e
LW
6345 OPERATOR(USE);
6346
6347 case KEY_not:
29595ff2 6348 if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
2d2e263d
LW
6349 FUN1(OP_NOT);
6350 else
6351 OPERATOR(NOTOP);
a0d0e21e 6352
79072805 6353 case KEY_open:
29595ff2 6354 s = SKIPSPACE1(s);
7e2040f0 6355 if (isIDFIRST_lazy_if(s,UTF)) {
f54cb97a 6356 const char *t;
c35e046a
AL
6357 for (d = s; isALNUM_lazy_if(d,UTF);)
6358 d++;
6359 for (t=d; isSPACE(*t);)
6360 t++;
e2ab214b 6361 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
6362 /* [perl #16184] */
6363 && !(t[0] == '=' && t[1] == '>')
6364 ) {
5f66b61c 6365 int parms_len = (int)(d-s);
9014280d 6366 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 6367 "Precedence problem: open %.*s should be open(%.*s)",
5f66b61c 6368 parms_len, s, parms_len, s);
66fbe8fb 6369 }
93a17b20 6370 }
a0d0e21e 6371 LOP(OP_OPEN,XTERM);
79072805 6372
463ee0b2 6373 case KEY_or:
6154021b 6374 pl_yylval.ival = OP_OR;
463ee0b2
LW
6375 OPERATOR(OROP);
6376
79072805
LW
6377 case KEY_ord:
6378 UNI(OP_ORD);
6379
6380 case KEY_oct:
6381 UNI(OP_OCT);
6382
6383 case KEY_opendir:
a0d0e21e 6384 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
6385
6386 case KEY_print:
3280af22 6387 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6388 LOP(OP_PRINT,XREF);
79072805
LW
6389
6390 case KEY_printf:
3280af22 6391 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6392 LOP(OP_PRTF,XREF);
79072805 6393
c07a80fd 6394 case KEY_prototype:
6395 UNI(OP_PROTOTYPE);
6396
79072805 6397 case KEY_push:
a0d0e21e 6398 LOP(OP_PUSH,XTERM);
79072805
LW
6399
6400 case KEY_pop:
6f33ba73 6401 UNIDOR(OP_POP);
79072805 6402
a0d0e21e 6403 case KEY_pos:
6f33ba73 6404 UNIDOR(OP_POS);
4e553d73 6405
79072805 6406 case KEY_pack:
a0d0e21e 6407 LOP(OP_PACK,XTERM);
79072805
LW
6408
6409 case KEY_package:
a0d0e21e 6410 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
6411 OPERATOR(PACKAGE);
6412
6413 case KEY_pipe:
a0d0e21e 6414 LOP(OP_PIPE_OP,XTERM);
79072805
LW
6415
6416 case KEY_q:
5db06880 6417 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6418 if (!s)
d4c19fe8 6419 missingterm(NULL);
6154021b 6420 pl_yylval.ival = OP_CONST;
79072805
LW
6421 TERM(sublex_start());
6422
a0d0e21e
LW
6423 case KEY_quotemeta:
6424 UNI(OP_QUOTEMETA);
6425
8990e307 6426 case KEY_qw:
5db06880 6427 s = scan_str(s,!!PL_madskills,FALSE);
8990e307 6428 if (!s)
d4c19fe8 6429 missingterm(NULL);
3480a8d2 6430 PL_expect = XOPERATOR;
8127e0e3
GS
6431 force_next(')');
6432 if (SvCUR(PL_lex_stuff)) {
5f66b61c 6433 OP *words = NULL;
8127e0e3 6434 int warned = 0;
3280af22 6435 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 6436 while (len) {
d4c19fe8
AL
6437 for (; isSPACE(*d) && len; --len, ++d)
6438 /**/;
8127e0e3 6439 if (len) {
d4c19fe8 6440 SV *sv;
f54cb97a 6441 const char *b = d;
e476b1b5 6442 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
6443 for (; !isSPACE(*d) && len; --len, ++d) {
6444 if (*d == ',') {
9014280d 6445 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6446 "Possible attempt to separate words with commas");
6447 ++warned;
6448 }
6449 else if (*d == '#') {
9014280d 6450 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6451 "Possible attempt to put comments in qw() list");
6452 ++warned;
6453 }
6454 }
6455 }
6456 else {
d4c19fe8
AL
6457 for (; !isSPACE(*d) && len; --len, ++d)
6458 /**/;
8127e0e3 6459 }
740cce10 6460 sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
8127e0e3 6461 words = append_elem(OP_LIST, words,
7948272d 6462 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 6463 }
6464 }
8127e0e3 6465 if (words) {
cd81e915 6466 start_force(PL_curforce);
9ded7720 6467 NEXTVAL_NEXTTOKE.opval = words;
8127e0e3
GS
6468 force_next(THING);
6469 }
55497cff 6470 }
37fd879b 6471 if (PL_lex_stuff) {
8127e0e3 6472 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 6473 PL_lex_stuff = NULL;
37fd879b 6474 }
3280af22 6475 PL_expect = XTERM;
8127e0e3 6476 TOKEN('(');
8990e307 6477
79072805 6478 case KEY_qq:
5db06880 6479 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6480 if (!s)
d4c19fe8 6481 missingterm(NULL);
6154021b 6482 pl_yylval.ival = OP_STRINGIFY;
3280af22 6483 if (SvIVX(PL_lex_stuff) == '\'')
45977657 6484 SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should intepolate */
79072805
LW
6485 TERM(sublex_start());
6486
8782bef2
GB
6487 case KEY_qr:
6488 s = scan_pat(s,OP_QR);
6489 TERM(sublex_start());
6490
79072805 6491 case KEY_qx:
5db06880 6492 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6493 if (!s)
d4c19fe8 6494 missingterm(NULL);
9b201d7d 6495 readpipe_override();
79072805
LW
6496 TERM(sublex_start());
6497
6498 case KEY_return:
6499 OLDLOP(OP_RETURN);
6500
6501 case KEY_require:
29595ff2 6502 s = SKIPSPACE1(s);
e759cc13
RGS
6503 if (isDIGIT(*s)) {
6504 s = force_version(s, FALSE);
a7cb1f99 6505 }
e759cc13
RGS
6506 else if (*s != 'v' || !isDIGIT(s[1])
6507 || (s = force_version(s, TRUE), *s == 'v'))
6508 {
a7cb1f99
GS
6509 *PL_tokenbuf = '\0';
6510 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 6511 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
da51bb9b 6512 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
a7cb1f99
GS
6513 else if (*s == '<')
6514 yyerror("<> should be quotes");
6515 }
a72a1c8b
RGS
6516 if (orig_keyword == KEY_require) {
6517 orig_keyword = 0;
6154021b 6518 pl_yylval.ival = 1;
a72a1c8b
RGS
6519 }
6520 else
6154021b 6521 pl_yylval.ival = 0;
a72a1c8b
RGS
6522 PL_expect = XTERM;
6523 PL_bufptr = s;
6524 PL_last_uni = PL_oldbufptr;
6525 PL_last_lop_op = OP_REQUIRE;
6526 s = skipspace(s);
6527 return REPORT( (int)REQUIRE );
79072805
LW
6528
6529 case KEY_reset:
6530 UNI(OP_RESET);
6531
6532 case KEY_redo:
a0d0e21e 6533 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6534 LOOPX(OP_REDO);
6535
6536 case KEY_rename:
a0d0e21e 6537 LOP(OP_RENAME,XTERM);
79072805
LW
6538
6539 case KEY_rand:
6540 UNI(OP_RAND);
6541
6542 case KEY_rmdir:
6543 UNI(OP_RMDIR);
6544
6545 case KEY_rindex:
a0d0e21e 6546 LOP(OP_RINDEX,XTERM);
79072805
LW
6547
6548 case KEY_read:
a0d0e21e 6549 LOP(OP_READ,XTERM);
79072805
LW
6550
6551 case KEY_readdir:
6552 UNI(OP_READDIR);
6553
93a17b20 6554 case KEY_readline:
6f33ba73 6555 UNIDOR(OP_READLINE);
93a17b20
LW
6556
6557 case KEY_readpipe:
0858480c 6558 UNIDOR(OP_BACKTICK);
93a17b20 6559
79072805
LW
6560 case KEY_rewinddir:
6561 UNI(OP_REWINDDIR);
6562
6563 case KEY_recv:
a0d0e21e 6564 LOP(OP_RECV,XTERM);
79072805
LW
6565
6566 case KEY_reverse:
a0d0e21e 6567 LOP(OP_REVERSE,XTERM);
79072805
LW
6568
6569 case KEY_readlink:
6f33ba73 6570 UNIDOR(OP_READLINK);
79072805
LW
6571
6572 case KEY_ref:
6573 UNI(OP_REF);
6574
6575 case KEY_s:
6576 s = scan_subst(s);
6154021b 6577 if (pl_yylval.opval)
79072805
LW
6578 TERM(sublex_start());
6579 else
6580 TOKEN(1); /* force error */
6581
0d863452
RH
6582 case KEY_say:
6583 checkcomma(s,PL_tokenbuf,"filehandle");
6584 LOP(OP_SAY,XREF);
6585
a0d0e21e
LW
6586 case KEY_chomp:
6587 UNI(OP_CHOMP);
4e553d73 6588
79072805
LW
6589 case KEY_scalar:
6590 UNI(OP_SCALAR);
6591
6592 case KEY_select:
a0d0e21e 6593 LOP(OP_SELECT,XTERM);
79072805
LW
6594
6595 case KEY_seek:
a0d0e21e 6596 LOP(OP_SEEK,XTERM);
79072805
LW
6597
6598 case KEY_semctl:
a0d0e21e 6599 LOP(OP_SEMCTL,XTERM);
79072805
LW
6600
6601 case KEY_semget:
a0d0e21e 6602 LOP(OP_SEMGET,XTERM);
79072805
LW
6603
6604 case KEY_semop:
a0d0e21e 6605 LOP(OP_SEMOP,XTERM);
79072805
LW
6606
6607 case KEY_send:
a0d0e21e 6608 LOP(OP_SEND,XTERM);
79072805
LW
6609
6610 case KEY_setpgrp:
a0d0e21e 6611 LOP(OP_SETPGRP,XTERM);
79072805
LW
6612
6613 case KEY_setpriority:
a0d0e21e 6614 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
6615
6616 case KEY_sethostent:
ff68c719 6617 UNI(OP_SHOSTENT);
79072805
LW
6618
6619 case KEY_setnetent:
ff68c719 6620 UNI(OP_SNETENT);
79072805
LW
6621
6622 case KEY_setservent:
ff68c719 6623 UNI(OP_SSERVENT);
79072805
LW
6624
6625 case KEY_setprotoent:
ff68c719 6626 UNI(OP_SPROTOENT);
79072805
LW
6627
6628 case KEY_setpwent:
6629 FUN0(OP_SPWENT);
6630
6631 case KEY_setgrent:
6632 FUN0(OP_SGRENT);
6633
6634 case KEY_seekdir:
a0d0e21e 6635 LOP(OP_SEEKDIR,XTERM);
79072805
LW
6636
6637 case KEY_setsockopt:
a0d0e21e 6638 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
6639
6640 case KEY_shift:
6f33ba73 6641 UNIDOR(OP_SHIFT);
79072805
LW
6642
6643 case KEY_shmctl:
a0d0e21e 6644 LOP(OP_SHMCTL,XTERM);
79072805
LW
6645
6646 case KEY_shmget:
a0d0e21e 6647 LOP(OP_SHMGET,XTERM);
79072805
LW
6648
6649 case KEY_shmread:
a0d0e21e 6650 LOP(OP_SHMREAD,XTERM);
79072805
LW
6651
6652 case KEY_shmwrite:
a0d0e21e 6653 LOP(OP_SHMWRITE,XTERM);
79072805
LW
6654
6655 case KEY_shutdown:
a0d0e21e 6656 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
6657
6658 case KEY_sin:
6659 UNI(OP_SIN);
6660
6661 case KEY_sleep:
6662 UNI(OP_SLEEP);
6663
6664 case KEY_socket:
a0d0e21e 6665 LOP(OP_SOCKET,XTERM);
79072805
LW
6666
6667 case KEY_socketpair:
a0d0e21e 6668 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
6669
6670 case KEY_sort:
3280af22 6671 checkcomma(s,PL_tokenbuf,"subroutine name");
29595ff2 6672 s = SKIPSPACE1(s);
79072805 6673 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 6674 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 6675 PL_expect = XTERM;
15f0808c 6676 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 6677 LOP(OP_SORT,XREF);
79072805
LW
6678
6679 case KEY_split:
a0d0e21e 6680 LOP(OP_SPLIT,XTERM);
79072805
LW
6681
6682 case KEY_sprintf:
a0d0e21e 6683 LOP(OP_SPRINTF,XTERM);
79072805
LW
6684
6685 case KEY_splice:
a0d0e21e 6686 LOP(OP_SPLICE,XTERM);
79072805
LW
6687
6688 case KEY_sqrt:
6689 UNI(OP_SQRT);
6690
6691 case KEY_srand:
6692 UNI(OP_SRAND);
6693
6694 case KEY_stat:
6695 UNI(OP_STAT);
6696
6697 case KEY_study:
79072805
LW
6698 UNI(OP_STUDY);
6699
6700 case KEY_substr:
a0d0e21e 6701 LOP(OP_SUBSTR,XTERM);
79072805
LW
6702
6703 case KEY_format:
6704 case KEY_sub:
93a17b20 6705 really_sub:
09bef843 6706 {
3280af22 6707 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 6708 SSize_t tboffset = 0;
09bef843 6709 expectation attrful;
28cc6278 6710 bool have_name, have_proto;
f54cb97a 6711 const int key = tmp;
09bef843 6712
5db06880
NC
6713#ifdef PERL_MAD
6714 SV *tmpwhite = 0;
6715
cd81e915 6716 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5db06880 6717 SV *subtoken = newSVpvn(tstart, s - tstart);
cd81e915 6718 PL_thistoken = 0;
5db06880
NC
6719
6720 d = s;
6721 s = SKIPSPACE2(s,tmpwhite);
6722#else
09bef843 6723 s = skipspace(s);
5db06880 6724#endif
09bef843 6725
7e2040f0 6726 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
6727 (*s == ':' && s[1] == ':'))
6728 {
5db06880 6729#ifdef PERL_MAD
4f61fd4b 6730 SV *nametoke = NULL;
5db06880
NC
6731#endif
6732
09bef843
SB
6733 PL_expect = XBLOCK;
6734 attrful = XATTRBLOCK;
b1b65b59
JH
6735 /* remember buffer pos'n for later force_word */
6736 tboffset = s - PL_oldbufptr;
09bef843 6737 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5db06880
NC
6738#ifdef PERL_MAD
6739 if (PL_madskills)
6740 nametoke = newSVpvn(s, d - s);
6741#endif
6502358f
NC
6742 if (memchr(tmpbuf, ':', len))
6743 sv_setpvn(PL_subname, tmpbuf, len);
09bef843
SB
6744 else {
6745 sv_setsv(PL_subname,PL_curstname);
396482e1 6746 sv_catpvs(PL_subname,"::");
09bef843
SB
6747 sv_catpvn(PL_subname,tmpbuf,len);
6748 }
09bef843 6749 have_name = TRUE;
5db06880
NC
6750
6751#ifdef PERL_MAD
6752
6753 start_force(0);
6754 CURMAD('X', nametoke);
6755 CURMAD('_', tmpwhite);
6756 (void) force_word(PL_oldbufptr + tboffset, WORD,
6757 FALSE, TRUE, TRUE);
6758
6759 s = SKIPSPACE2(d,tmpwhite);
6760#else
6761 s = skipspace(d);
6762#endif
09bef843 6763 }
463ee0b2 6764 else {
09bef843
SB
6765 if (key == KEY_my)
6766 Perl_croak(aTHX_ "Missing name in \"my sub\"");
6767 PL_expect = XTERMBLOCK;
6768 attrful = XATTRTERM;
76f68e9b 6769 sv_setpvs(PL_subname,"?");
09bef843 6770 have_name = FALSE;
463ee0b2 6771 }
4633a7c4 6772
09bef843
SB
6773 if (key == KEY_format) {
6774 if (*s == '=')
6775 PL_lex_formbrack = PL_lex_brackets + 1;
5db06880 6776#ifdef PERL_MAD
cd81e915 6777 PL_thistoken = subtoken;
5db06880
NC
6778 s = d;
6779#else
09bef843 6780 if (have_name)
b1b65b59
JH
6781 (void) force_word(PL_oldbufptr + tboffset, WORD,
6782 FALSE, TRUE, TRUE);
5db06880 6783#endif
09bef843
SB
6784 OPERATOR(FORMAT);
6785 }
79072805 6786
09bef843
SB
6787 /* Look for a prototype */
6788 if (*s == '(') {
d9f2850e
RGS
6789 char *p;
6790 bool bad_proto = FALSE;
9e8d7757
RB
6791 bool in_brackets = FALSE;
6792 char greedy_proto = ' ';
6793 bool proto_after_greedy_proto = FALSE;
6794 bool must_be_last = FALSE;
6795 bool underscore = FALSE;
aef2a98a 6796 bool seen_underscore = FALSE;
d9f2850e 6797 const bool warnsyntax = ckWARN(WARN_SYNTAX);
09bef843 6798
5db06880 6799 s = scan_str(s,!!PL_madskills,FALSE);
37fd879b 6800 if (!s)
09bef843 6801 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 6802 /* strip spaces and check for bad characters */
09bef843
SB
6803 d = SvPVX(PL_lex_stuff);
6804 tmp = 0;
d9f2850e
RGS
6805 for (p = d; *p; ++p) {
6806 if (!isSPACE(*p)) {
6807 d[tmp++] = *p;
9e8d7757
RB
6808
6809 if (warnsyntax) {
6810 if (must_be_last)
6811 proto_after_greedy_proto = TRUE;
6812 if (!strchr("$@%*;[]&\\_", *p)) {
6813 bad_proto = TRUE;
6814 }
6815 else {
6816 if ( underscore ) {
6817 if ( *p != ';' )
6818 bad_proto = TRUE;
6819 underscore = FALSE;
6820 }
6821 if ( *p == '[' ) {
6822 in_brackets = TRUE;
6823 }
6824 else if ( *p == ']' ) {
6825 in_brackets = FALSE;
6826 }
6827 else if ( (*p == '@' || *p == '%') &&
6828 ( tmp < 2 || d[tmp-2] != '\\' ) &&
6829 !in_brackets ) {
6830 must_be_last = TRUE;
6831 greedy_proto = *p;
6832 }
6833 else if ( *p == '_' ) {
aef2a98a 6834 underscore = seen_underscore = TRUE;
9e8d7757
RB
6835 }
6836 }
6837 }
d37a9538 6838 }
09bef843 6839 }
d9f2850e 6840 d[tmp] = '\0';
9e8d7757
RB
6841 if (proto_after_greedy_proto)
6842 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6843 "Prototype after '%c' for %"SVf" : %s",
6844 greedy_proto, SVfARG(PL_subname), d);
d9f2850e
RGS
6845 if (bad_proto)
6846 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
aef2a98a
RGS
6847 "Illegal character %sin prototype for %"SVf" : %s",
6848 seen_underscore ? "after '_' " : "",
be2597df 6849 SVfARG(PL_subname), d);
b162af07 6850 SvCUR_set(PL_lex_stuff, tmp);
09bef843 6851 have_proto = TRUE;
68dc0745 6852
5db06880
NC
6853#ifdef PERL_MAD
6854 start_force(0);
cd81e915 6855 CURMAD('q', PL_thisopen);
5db06880 6856 CURMAD('_', tmpwhite);
cd81e915
NC
6857 CURMAD('=', PL_thisstuff);
6858 CURMAD('Q', PL_thisclose);
5db06880
NC
6859 NEXTVAL_NEXTTOKE.opval =
6860 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
1a9a51d4 6861 PL_lex_stuff = NULL;
5db06880
NC
6862 force_next(THING);
6863
6864 s = SKIPSPACE2(s,tmpwhite);
6865#else
09bef843 6866 s = skipspace(s);
5db06880 6867#endif
4633a7c4 6868 }
09bef843
SB
6869 else
6870 have_proto = FALSE;
6871
6872 if (*s == ':' && s[1] != ':')
6873 PL_expect = attrful;
8e742a20
MHM
6874 else if (*s != '{' && key == KEY_sub) {
6875 if (!have_name)
6876 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
6877 else if (*s != ';')
be2597df 6878 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
8e742a20 6879 }
09bef843 6880
5db06880
NC
6881#ifdef PERL_MAD
6882 start_force(0);
6883 if (tmpwhite) {
6884 if (PL_madskills)
6b29d1f5 6885 curmad('^', newSVpvs(""));
5db06880
NC
6886 CURMAD('_', tmpwhite);
6887 }
6888 force_next(0);
6889
cd81e915 6890 PL_thistoken = subtoken;
5db06880 6891#else
09bef843 6892 if (have_proto) {
9ded7720 6893 NEXTVAL_NEXTTOKE.opval =
b1b65b59 6894 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
a0714e2c 6895 PL_lex_stuff = NULL;
09bef843 6896 force_next(THING);
68dc0745 6897 }
5db06880 6898#endif
09bef843 6899 if (!have_name) {
49a54bbe
NC
6900 if (PL_curstash)
6901 sv_setpvs(PL_subname, "__ANON__");
6902 else
6903 sv_setpvs(PL_subname, "__ANON__::__ANON__");
09bef843 6904 TOKEN(ANONSUB);
4633a7c4 6905 }
5db06880 6906#ifndef PERL_MAD
b1b65b59
JH
6907 (void) force_word(PL_oldbufptr + tboffset, WORD,
6908 FALSE, TRUE, TRUE);
5db06880 6909#endif
09bef843
SB
6910 if (key == KEY_my)
6911 TOKEN(MYSUB);
6912 TOKEN(SUB);
4633a7c4 6913 }
79072805
LW
6914
6915 case KEY_system:
a0d0e21e 6916 LOP(OP_SYSTEM,XREF);
79072805
LW
6917
6918 case KEY_symlink:
a0d0e21e 6919 LOP(OP_SYMLINK,XTERM);
79072805
LW
6920
6921 case KEY_syscall:
a0d0e21e 6922 LOP(OP_SYSCALL,XTERM);
79072805 6923
c07a80fd 6924 case KEY_sysopen:
6925 LOP(OP_SYSOPEN,XTERM);
6926
137443ea 6927 case KEY_sysseek:
6928 LOP(OP_SYSSEEK,XTERM);
6929
79072805 6930 case KEY_sysread:
a0d0e21e 6931 LOP(OP_SYSREAD,XTERM);
79072805
LW
6932
6933 case KEY_syswrite:
a0d0e21e 6934 LOP(OP_SYSWRITE,XTERM);
79072805
LW
6935
6936 case KEY_tr:
6937 s = scan_trans(s);
6938 TERM(sublex_start());
6939
6940 case KEY_tell:
6941 UNI(OP_TELL);
6942
6943 case KEY_telldir:
6944 UNI(OP_TELLDIR);
6945
463ee0b2 6946 case KEY_tie:
a0d0e21e 6947 LOP(OP_TIE,XTERM);
463ee0b2 6948
c07a80fd 6949 case KEY_tied:
6950 UNI(OP_TIED);
6951
79072805
LW
6952 case KEY_time:
6953 FUN0(OP_TIME);
6954
6955 case KEY_times:
6956 FUN0(OP_TMS);
6957
6958 case KEY_truncate:
a0d0e21e 6959 LOP(OP_TRUNCATE,XTERM);
79072805
LW
6960
6961 case KEY_uc:
6962 UNI(OP_UC);
6963
6964 case KEY_ucfirst:
6965 UNI(OP_UCFIRST);
6966
463ee0b2
LW
6967 case KEY_untie:
6968 UNI(OP_UNTIE);
6969
79072805 6970 case KEY_until:
6154021b 6971 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
6972 OPERATOR(UNTIL);
6973
6974 case KEY_unless:
6154021b 6975 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
6976 OPERATOR(UNLESS);
6977
6978 case KEY_unlink:
a0d0e21e 6979 LOP(OP_UNLINK,XTERM);
79072805
LW
6980
6981 case KEY_undef:
6f33ba73 6982 UNIDOR(OP_UNDEF);
79072805
LW
6983
6984 case KEY_unpack:
a0d0e21e 6985 LOP(OP_UNPACK,XTERM);
79072805
LW
6986
6987 case KEY_utime:
a0d0e21e 6988 LOP(OP_UTIME,XTERM);
79072805
LW
6989
6990 case KEY_umask:
6f33ba73 6991 UNIDOR(OP_UMASK);
79072805
LW
6992
6993 case KEY_unshift:
a0d0e21e
LW
6994 LOP(OP_UNSHIFT,XTERM);
6995
6996 case KEY_use:
468aa647 6997 s = tokenize_use(1, s);
a0d0e21e 6998 OPERATOR(USE);
79072805
LW
6999
7000 case KEY_values:
7001 UNI(OP_VALUES);
7002
7003 case KEY_vec:
a0d0e21e 7004 LOP(OP_VEC,XTERM);
79072805 7005
0d863452 7006 case KEY_when:
6154021b 7007 pl_yylval.ival = CopLINE(PL_curcop);
0d863452
RH
7008 OPERATOR(WHEN);
7009
79072805 7010 case KEY_while:
6154021b 7011 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
7012 OPERATOR(WHILE);
7013
7014 case KEY_warn:
3280af22 7015 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 7016 LOP(OP_WARN,XTERM);
79072805
LW
7017
7018 case KEY_wait:
7019 FUN0(OP_WAIT);
7020
7021 case KEY_waitpid:
a0d0e21e 7022 LOP(OP_WAITPID,XTERM);
79072805
LW
7023
7024 case KEY_wantarray:
7025 FUN0(OP_WANTARRAY);
7026
7027 case KEY_write:
9d116dd7
JH
7028#ifdef EBCDIC
7029 {
df3728a2
JH
7030 char ctl_l[2];
7031 ctl_l[0] = toCTRL('L');
7032 ctl_l[1] = '\0';
fafc274c 7033 gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7
JH
7034 }
7035#else
fafc274c
NC
7036 /* Make sure $^L is defined */
7037 gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7 7038#endif
79072805
LW
7039 UNI(OP_ENTERWRITE);
7040
7041 case KEY_x:
3280af22 7042 if (PL_expect == XOPERATOR)
79072805
LW
7043 Mop(OP_REPEAT);
7044 check_uni();
7045 goto just_a_word;
7046
a0d0e21e 7047 case KEY_xor:
6154021b 7048 pl_yylval.ival = OP_XOR;
a0d0e21e
LW
7049 OPERATOR(OROP);
7050
79072805
LW
7051 case KEY_y:
7052 s = scan_trans(s);
7053 TERM(sublex_start());
7054 }
49dc05e3 7055 }}
79072805 7056}
bf4acbe4
GS
7057#ifdef __SC__
7058#pragma segment Main
7059#endif
79072805 7060
e930465f
JH
7061static int
7062S_pending_ident(pTHX)
8eceec63 7063{
97aff369 7064 dVAR;
8eceec63 7065 register char *d;
bbd11bfc 7066 PADOFFSET tmp = 0;
8eceec63
SC
7067 /* pit holds the identifier we read and pending_ident is reset */
7068 char pit = PL_pending_ident;
9bde8eb0
NC
7069 const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
7070 /* All routes through this function want to know if there is a colon. */
c099d646 7071 const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
8eceec63
SC
7072 PL_pending_ident = 0;
7073
cd81e915 7074 /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
8eceec63 7075 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 7076 "### Pending identifier '%s'\n", PL_tokenbuf); });
8eceec63
SC
7077
7078 /* if we're in a my(), we can't allow dynamics here.
7079 $foo'bar has already been turned into $foo::bar, so
7080 just check for colons.
7081
7082 if it's a legal name, the OP is a PADANY.
7083 */
7084 if (PL_in_my) {
7085 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
9bde8eb0 7086 if (has_colon)
8eceec63
SC
7087 yyerror(Perl_form(aTHX_ "No package name allowed for "
7088 "variable %s in \"our\"",
7089 PL_tokenbuf));
dd2155a4 7090 tmp = allocmy(PL_tokenbuf);
8eceec63
SC
7091 }
7092 else {
9bde8eb0 7093 if (has_colon)
952306ac
RGS
7094 yyerror(Perl_form(aTHX_ PL_no_myglob,
7095 PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
8eceec63 7096
6154021b
RGS
7097 pl_yylval.opval = newOP(OP_PADANY, 0);
7098 pl_yylval.opval->op_targ = allocmy(PL_tokenbuf);
8eceec63
SC
7099 return PRIVATEREF;
7100 }
7101 }
7102
7103 /*
7104 build the ops for accesses to a my() variable.
7105
7106 Deny my($a) or my($b) in a sort block, *if* $a or $b is
7107 then used in a comparison. This catches most, but not
7108 all cases. For instance, it catches
7109 sort { my($a); $a <=> $b }
7110 but not
7111 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
7112 (although why you'd do that is anyone's guess).
7113 */
7114
9bde8eb0 7115 if (!has_colon) {
8716503d
DM
7116 if (!PL_in_my)
7117 tmp = pad_findmy(PL_tokenbuf);
7118 if (tmp != NOT_IN_PAD) {
8eceec63 7119 /* might be an "our" variable" */
00b1698f 7120 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
8eceec63 7121 /* build ops for a bareword */
b64e5050
AL
7122 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
7123 HEK * const stashname = HvNAME_HEK(stash);
7124 SV * const sym = newSVhek(stashname);
396482e1 7125 sv_catpvs(sym, "::");
9bde8eb0 7126 sv_catpvn(sym, PL_tokenbuf+1, tokenbuf_len - 1);
6154021b
RGS
7127 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
7128 pl_yylval.opval->op_private = OPpCONST_ENTERED;
7a5fd60d 7129 gv_fetchsv(sym,
8eceec63
SC
7130 (PL_in_eval
7131 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 7132 : GV_ADDMULTI
8eceec63
SC
7133 ),
7134 ((PL_tokenbuf[0] == '$') ? SVt_PV
7135 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7136 : SVt_PVHV));
7137 return WORD;
7138 }
7139
7140 /* if it's a sort block and they're naming $a or $b */
7141 if (PL_last_lop_op == OP_SORT &&
7142 PL_tokenbuf[0] == '$' &&
7143 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
7144 && !PL_tokenbuf[2])
7145 {
7146 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
7147 d < PL_bufend && *d != '\n';
7148 d++)
7149 {
7150 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
7151 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
7152 PL_tokenbuf);
7153 }
7154 }
7155 }
7156
6154021b
RGS
7157 pl_yylval.opval = newOP(OP_PADANY, 0);
7158 pl_yylval.opval->op_targ = tmp;
8eceec63
SC
7159 return PRIVATEREF;
7160 }
7161 }
7162
7163 /*
7164 Whine if they've said @foo in a doublequoted string,
7165 and @foo isn't a variable we can find in the symbol
7166 table.
7167 */
7168 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
9bde8eb0
NC
7169 GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1, 0,
7170 SVt_PVAV);
8eceec63 7171 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
e879d94f
RGS
7172 && ckWARN(WARN_AMBIGUOUS)
7173 /* DO NOT warn for @- and @+ */
7174 && !( PL_tokenbuf[2] == '\0' &&
7175 ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7176 )
8eceec63
SC
7177 {
7178 /* Downgraded from fatal to warning 20000522 mjd */
9014280d 7179 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8eceec63
SC
7180 "Possible unintended interpolation of %s in string",
7181 PL_tokenbuf);
7182 }
7183 }
7184
7185 /* build ops for a bareword */
6154021b 7186 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
9bde8eb0 7187 tokenbuf_len - 1));
6154021b 7188 pl_yylval.opval->op_private = OPpCONST_ENTERED;
9bde8eb0
NC
7189 gv_fetchpvn_flags(
7190 PL_tokenbuf + 1, tokenbuf_len - 1,
d6069db2
RGS
7191 /* If the identifier refers to a stash, don't autovivify it.
7192 * Change 24660 had the side effect of causing symbol table
7193 * hashes to always be defined, even if they were freshly
7194 * created and the only reference in the entire program was
7195 * the single statement with the defined %foo::bar:: test.
7196 * It appears that all code in the wild doing this actually
7197 * wants to know whether sub-packages have been loaded, so
7198 * by avoiding auto-vivifying symbol tables, we ensure that
7199 * defined %foo::bar:: continues to be false, and the existing
7200 * tests still give the expected answers, even though what
7201 * they're actually testing has now changed subtly.
7202 */
9bde8eb0
NC
7203 (*PL_tokenbuf == '%'
7204 && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
7205 && d[-1] == ':'
d6069db2
RGS
7206 ? 0
7207 : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
adc51b97
RGS
7208 ((PL_tokenbuf[0] == '$') ? SVt_PV
7209 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7210 : SVt_PVHV));
8eceec63
SC
7211 return WORD;
7212}
7213
4c3bbe0f
MHM
7214/*
7215 * The following code was generated by perl_keyword.pl.
7216 */
e2e1dd5a 7217
79072805 7218I32
5458a98a 7219Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
4c3bbe0f 7220{
952306ac 7221 dVAR;
7918f24d
NC
7222
7223 PERL_ARGS_ASSERT_KEYWORD;
7224
4c3bbe0f
MHM
7225 switch (len)
7226 {
7227 case 1: /* 5 tokens of length 1 */
7228 switch (name[0])
e2e1dd5a 7229 {
4c3bbe0f
MHM
7230 case 'm':
7231 { /* m */
7232 return KEY_m;
7233 }
7234
4c3bbe0f
MHM
7235 case 'q':
7236 { /* q */
7237 return KEY_q;
7238 }
7239
4c3bbe0f
MHM
7240 case 's':
7241 { /* s */
7242 return KEY_s;
7243 }
7244
4c3bbe0f
MHM
7245 case 'x':
7246 { /* x */
7247 return -KEY_x;
7248 }
7249
4c3bbe0f
MHM
7250 case 'y':
7251 { /* y */
7252 return KEY_y;
7253 }
7254
4c3bbe0f
MHM
7255 default:
7256 goto unknown;
e2e1dd5a 7257 }
4c3bbe0f
MHM
7258
7259 case 2: /* 18 tokens of length 2 */
7260 switch (name[0])
e2e1dd5a 7261 {
4c3bbe0f
MHM
7262 case 'd':
7263 if (name[1] == 'o')
7264 { /* do */
7265 return KEY_do;
7266 }
7267
7268 goto unknown;
7269
7270 case 'e':
7271 if (name[1] == 'q')
7272 { /* eq */
7273 return -KEY_eq;
7274 }
7275
7276 goto unknown;
7277
7278 case 'g':
7279 switch (name[1])
7280 {
7281 case 'e':
7282 { /* ge */
7283 return -KEY_ge;
7284 }
7285
4c3bbe0f
MHM
7286 case 't':
7287 { /* gt */
7288 return -KEY_gt;
7289 }
7290
4c3bbe0f
MHM
7291 default:
7292 goto unknown;
7293 }
7294
7295 case 'i':
7296 if (name[1] == 'f')
7297 { /* if */
7298 return KEY_if;
7299 }
7300
7301 goto unknown;
7302
7303 case 'l':
7304 switch (name[1])
7305 {
7306 case 'c':
7307 { /* lc */
7308 return -KEY_lc;
7309 }
7310
4c3bbe0f
MHM
7311 case 'e':
7312 { /* le */
7313 return -KEY_le;
7314 }
7315
4c3bbe0f
MHM
7316 case 't':
7317 { /* lt */
7318 return -KEY_lt;
7319 }
7320
4c3bbe0f
MHM
7321 default:
7322 goto unknown;
7323 }
7324
7325 case 'm':
7326 if (name[1] == 'y')
7327 { /* my */
7328 return KEY_my;
7329 }
7330
7331 goto unknown;
7332
7333 case 'n':
7334 switch (name[1])
7335 {
7336 case 'e':
7337 { /* ne */
7338 return -KEY_ne;
7339 }
7340
4c3bbe0f
MHM
7341 case 'o':
7342 { /* no */
7343 return KEY_no;
7344 }
7345
4c3bbe0f
MHM
7346 default:
7347 goto unknown;
7348 }
7349
7350 case 'o':
7351 if (name[1] == 'r')
7352 { /* or */
7353 return -KEY_or;
7354 }
7355
7356 goto unknown;
7357
7358 case 'q':
7359 switch (name[1])
7360 {
7361 case 'q':
7362 { /* qq */
7363 return KEY_qq;
7364 }
7365
4c3bbe0f
MHM
7366 case 'r':
7367 { /* qr */
7368 return KEY_qr;
7369 }
7370
4c3bbe0f
MHM
7371 case 'w':
7372 { /* qw */
7373 return KEY_qw;
7374 }
7375
4c3bbe0f
MHM
7376 case 'x':
7377 { /* qx */
7378 return KEY_qx;
7379 }
7380
4c3bbe0f
MHM
7381 default:
7382 goto unknown;
7383 }
7384
7385 case 't':
7386 if (name[1] == 'r')
7387 { /* tr */
7388 return KEY_tr;
7389 }
7390
7391 goto unknown;
7392
7393 case 'u':
7394 if (name[1] == 'c')
7395 { /* uc */
7396 return -KEY_uc;
7397 }
7398
7399 goto unknown;
7400
7401 default:
7402 goto unknown;
e2e1dd5a 7403 }
4c3bbe0f 7404
0d863452 7405 case 3: /* 29 tokens of length 3 */
4c3bbe0f 7406 switch (name[0])
e2e1dd5a 7407 {
4c3bbe0f
MHM
7408 case 'E':
7409 if (name[1] == 'N' &&
7410 name[2] == 'D')
7411 { /* END */
7412 return KEY_END;
7413 }
7414
7415 goto unknown;
7416
7417 case 'a':
7418 switch (name[1])
7419 {
7420 case 'b':
7421 if (name[2] == 's')
7422 { /* abs */
7423 return -KEY_abs;
7424 }
7425
7426 goto unknown;
7427
7428 case 'n':
7429 if (name[2] == 'd')
7430 { /* and */
7431 return -KEY_and;
7432 }
7433
7434 goto unknown;
7435
7436 default:
7437 goto unknown;
7438 }
7439
7440 case 'c':
7441 switch (name[1])
7442 {
7443 case 'h':
7444 if (name[2] == 'r')
7445 { /* chr */
7446 return -KEY_chr;
7447 }
7448
7449 goto unknown;
7450
7451 case 'm':
7452 if (name[2] == 'p')
7453 { /* cmp */
7454 return -KEY_cmp;
7455 }
7456
7457 goto unknown;
7458
7459 case 'o':
7460 if (name[2] == 's')
7461 { /* cos */
7462 return -KEY_cos;
7463 }
7464
7465 goto unknown;
7466
7467 default:
7468 goto unknown;
7469 }
7470
7471 case 'd':
7472 if (name[1] == 'i' &&
7473 name[2] == 'e')
7474 { /* die */
7475 return -KEY_die;
7476 }
7477
7478 goto unknown;
7479
7480 case 'e':
7481 switch (name[1])
7482 {
7483 case 'o':
7484 if (name[2] == 'f')
7485 { /* eof */
7486 return -KEY_eof;
7487 }
7488
7489 goto unknown;
7490
4c3bbe0f
MHM
7491 case 'x':
7492 if (name[2] == 'p')
7493 { /* exp */
7494 return -KEY_exp;
7495 }
7496
7497 goto unknown;
7498
7499 default:
7500 goto unknown;
7501 }
7502
7503 case 'f':
7504 if (name[1] == 'o' &&
7505 name[2] == 'r')
7506 { /* for */
7507 return KEY_for;
7508 }
7509
7510 goto unknown;
7511
7512 case 'h':
7513 if (name[1] == 'e' &&
7514 name[2] == 'x')
7515 { /* hex */
7516 return -KEY_hex;
7517 }
7518
7519 goto unknown;
7520
7521 case 'i':
7522 if (name[1] == 'n' &&
7523 name[2] == 't')
7524 { /* int */
7525 return -KEY_int;
7526 }
7527
7528 goto unknown;
7529
7530 case 'l':
7531 if (name[1] == 'o' &&
7532 name[2] == 'g')
7533 { /* log */
7534 return -KEY_log;
7535 }
7536
7537 goto unknown;
7538
7539 case 'm':
7540 if (name[1] == 'a' &&
7541 name[2] == 'p')
7542 { /* map */
7543 return KEY_map;
7544 }
7545
7546 goto unknown;
7547
7548 case 'n':
7549 if (name[1] == 'o' &&
7550 name[2] == 't')
7551 { /* not */
7552 return -KEY_not;
7553 }
7554
7555 goto unknown;
7556
7557 case 'o':
7558 switch (name[1])
7559 {
7560 case 'c':
7561 if (name[2] == 't')
7562 { /* oct */
7563 return -KEY_oct;
7564 }
7565
7566 goto unknown;
7567
7568 case 'r':
7569 if (name[2] == 'd')
7570 { /* ord */
7571 return -KEY_ord;
7572 }
7573
7574 goto unknown;
7575
7576 case 'u':
7577 if (name[2] == 'r')
7578 { /* our */
7579 return KEY_our;
7580 }
7581
7582 goto unknown;
7583
7584 default:
7585 goto unknown;
7586 }
7587
7588 case 'p':
7589 if (name[1] == 'o')
7590 {
7591 switch (name[2])
7592 {
7593 case 'p':
7594 { /* pop */
7595 return -KEY_pop;
7596 }
7597
4c3bbe0f
MHM
7598 case 's':
7599 { /* pos */
7600 return KEY_pos;
7601 }
7602
4c3bbe0f
MHM
7603 default:
7604 goto unknown;
7605 }
7606 }
7607
7608 goto unknown;
7609
7610 case 'r':
7611 if (name[1] == 'e' &&
7612 name[2] == 'f')
7613 { /* ref */
7614 return -KEY_ref;
7615 }
7616
7617 goto unknown;
7618
7619 case 's':
7620 switch (name[1])
7621 {
0d863452
RH
7622 case 'a':
7623 if (name[2] == 'y')
7624 { /* say */
e3e804c9 7625 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
0d863452
RH
7626 }
7627
7628 goto unknown;
7629
4c3bbe0f
MHM
7630 case 'i':
7631 if (name[2] == 'n')
7632 { /* sin */
7633 return -KEY_sin;
7634 }
7635
7636 goto unknown;
7637
7638 case 'u':
7639 if (name[2] == 'b')
7640 { /* sub */
7641 return KEY_sub;
7642 }
7643
7644 goto unknown;
7645
7646 default:
7647 goto unknown;
7648 }
7649
7650 case 't':
7651 if (name[1] == 'i' &&
7652 name[2] == 'e')
7653 { /* tie */
7654 return KEY_tie;
7655 }
7656
7657 goto unknown;
7658
7659 case 'u':
7660 if (name[1] == 's' &&
7661 name[2] == 'e')
7662 { /* use */
7663 return KEY_use;
7664 }
7665
7666 goto unknown;
7667
7668 case 'v':
7669 if (name[1] == 'e' &&
7670 name[2] == 'c')
7671 { /* vec */
7672 return -KEY_vec;
7673 }
7674
7675 goto unknown;
7676
7677 case 'x':
7678 if (name[1] == 'o' &&
7679 name[2] == 'r')
7680 { /* xor */
7681 return -KEY_xor;
7682 }
7683
7684 goto unknown;
7685
7686 default:
7687 goto unknown;
e2e1dd5a 7688 }
4c3bbe0f 7689
0d863452 7690 case 4: /* 41 tokens of length 4 */
4c3bbe0f 7691 switch (name[0])
e2e1dd5a 7692 {
4c3bbe0f
MHM
7693 case 'C':
7694 if (name[1] == 'O' &&
7695 name[2] == 'R' &&
7696 name[3] == 'E')
7697 { /* CORE */
7698 return -KEY_CORE;
7699 }
7700
7701 goto unknown;
7702
7703 case 'I':
7704 if (name[1] == 'N' &&
7705 name[2] == 'I' &&
7706 name[3] == 'T')
7707 { /* INIT */
7708 return KEY_INIT;
7709 }
7710
7711 goto unknown;
7712
7713 case 'b':
7714 if (name[1] == 'i' &&
7715 name[2] == 'n' &&
7716 name[3] == 'd')
7717 { /* bind */
7718 return -KEY_bind;
7719 }
7720
7721 goto unknown;
7722
7723 case 'c':
7724 if (name[1] == 'h' &&
7725 name[2] == 'o' &&
7726 name[3] == 'p')
7727 { /* chop */
7728 return -KEY_chop;
7729 }
7730
7731 goto unknown;
7732
7733 case 'd':
7734 if (name[1] == 'u' &&
7735 name[2] == 'm' &&
7736 name[3] == 'p')
7737 { /* dump */
7738 return -KEY_dump;
7739 }
7740
7741 goto unknown;
7742
7743 case 'e':
7744 switch (name[1])
7745 {
7746 case 'a':
7747 if (name[2] == 'c' &&
7748 name[3] == 'h')
7749 { /* each */
7750 return -KEY_each;
7751 }
7752
7753 goto unknown;
7754
7755 case 'l':
7756 if (name[2] == 's' &&
7757 name[3] == 'e')
7758 { /* else */
7759 return KEY_else;
7760 }
7761
7762 goto unknown;
7763
7764 case 'v':
7765 if (name[2] == 'a' &&
7766 name[3] == 'l')
7767 { /* eval */
7768 return KEY_eval;
7769 }
7770
7771 goto unknown;
7772
7773 case 'x':
7774 switch (name[2])
7775 {
7776 case 'e':
7777 if (name[3] == 'c')
7778 { /* exec */
7779 return -KEY_exec;
7780 }
7781
7782 goto unknown;
7783
7784 case 'i':
7785 if (name[3] == 't')
7786 { /* exit */
7787 return -KEY_exit;
7788 }
7789
7790 goto unknown;
7791
7792 default:
7793 goto unknown;
7794 }
7795
7796 default:
7797 goto unknown;
7798 }
7799
7800 case 'f':
7801 if (name[1] == 'o' &&
7802 name[2] == 'r' &&
7803 name[3] == 'k')
7804 { /* fork */
7805 return -KEY_fork;
7806 }
7807
7808 goto unknown;
7809
7810 case 'g':
7811 switch (name[1])
7812 {
7813 case 'e':
7814 if (name[2] == 't' &&
7815 name[3] == 'c')
7816 { /* getc */
7817 return -KEY_getc;
7818 }
7819
7820 goto unknown;
7821
7822 case 'l':
7823 if (name[2] == 'o' &&
7824 name[3] == 'b')
7825 { /* glob */
7826 return KEY_glob;
7827 }
7828
7829 goto unknown;
7830
7831 case 'o':
7832 if (name[2] == 't' &&
7833 name[3] == 'o')
7834 { /* goto */
7835 return KEY_goto;
7836 }
7837
7838 goto unknown;
7839
7840 case 'r':
7841 if (name[2] == 'e' &&
7842 name[3] == 'p')
7843 { /* grep */
7844 return KEY_grep;
7845 }
7846
7847 goto unknown;
7848
7849 default:
7850 goto unknown;
7851 }
7852
7853 case 'j':
7854 if (name[1] == 'o' &&
7855 name[2] == 'i' &&
7856 name[3] == 'n')
7857 { /* join */
7858 return -KEY_join;
7859 }
7860
7861 goto unknown;
7862
7863 case 'k':
7864 switch (name[1])
7865 {
7866 case 'e':
7867 if (name[2] == 'y' &&
7868 name[3] == 's')
7869 { /* keys */
7870 return -KEY_keys;
7871 }
7872
7873 goto unknown;
7874
7875 case 'i':
7876 if (name[2] == 'l' &&
7877 name[3] == 'l')
7878 { /* kill */
7879 return -KEY_kill;
7880 }
7881
7882 goto unknown;
7883
7884 default:
7885 goto unknown;
7886 }
7887
7888 case 'l':
7889 switch (name[1])
7890 {
7891 case 'a':
7892 if (name[2] == 's' &&
7893 name[3] == 't')
7894 { /* last */
7895 return KEY_last;
7896 }
7897
7898 goto unknown;
7899
7900 case 'i':
7901 if (name[2] == 'n' &&
7902 name[3] == 'k')
7903 { /* link */
7904 return -KEY_link;
7905 }
7906
7907 goto unknown;
7908
7909 case 'o':
7910 if (name[2] == 'c' &&
7911 name[3] == 'k')
7912 { /* lock */
7913 return -KEY_lock;
7914 }
7915
7916 goto unknown;
7917
7918 default:
7919 goto unknown;
7920 }
7921
7922 case 'n':
7923 if (name[1] == 'e' &&
7924 name[2] == 'x' &&
7925 name[3] == 't')
7926 { /* next */
7927 return KEY_next;
7928 }
7929
7930 goto unknown;
7931
7932 case 'o':
7933 if (name[1] == 'p' &&
7934 name[2] == 'e' &&
7935 name[3] == 'n')
7936 { /* open */
7937 return -KEY_open;
7938 }
7939
7940 goto unknown;
7941
7942 case 'p':
7943 switch (name[1])
7944 {
7945 case 'a':
7946 if (name[2] == 'c' &&
7947 name[3] == 'k')
7948 { /* pack */
7949 return -KEY_pack;
7950 }
7951
7952 goto unknown;
7953
7954 case 'i':
7955 if (name[2] == 'p' &&
7956 name[3] == 'e')
7957 { /* pipe */
7958 return -KEY_pipe;
7959 }
7960
7961 goto unknown;
7962
7963 case 'u':
7964 if (name[2] == 's' &&
7965 name[3] == 'h')
7966 { /* push */
7967 return -KEY_push;
7968 }
7969
7970 goto unknown;
7971
7972 default:
7973 goto unknown;
7974 }
7975
7976 case 'r':
7977 switch (name[1])
7978 {
7979 case 'a':
7980 if (name[2] == 'n' &&
7981 name[3] == 'd')
7982 { /* rand */
7983 return -KEY_rand;
7984 }
7985
7986 goto unknown;
7987
7988 case 'e':
7989 switch (name[2])
7990 {
7991 case 'a':
7992 if (name[3] == 'd')
7993 { /* read */
7994 return -KEY_read;
7995 }
7996
7997 goto unknown;
7998
7999 case 'c':
8000 if (name[3] == 'v')
8001 { /* recv */
8002 return -KEY_recv;
8003 }
8004
8005 goto unknown;
8006
8007 case 'd':
8008 if (name[3] == 'o')
8009 { /* redo */
8010 return KEY_redo;
8011 }
8012
8013 goto unknown;
8014
8015 default:
8016 goto unknown;
8017 }
8018
8019 default:
8020 goto unknown;
8021 }
8022
8023 case 's':
8024 switch (name[1])
8025 {
8026 case 'e':
8027 switch (name[2])
8028 {
8029 case 'e':
8030 if (name[3] == 'k')
8031 { /* seek */
8032 return -KEY_seek;
8033 }
8034
8035 goto unknown;
8036
8037 case 'n':
8038 if (name[3] == 'd')
8039 { /* send */
8040 return -KEY_send;
8041 }
8042
8043 goto unknown;
8044
8045 default:
8046 goto unknown;
8047 }
8048
8049 case 'o':
8050 if (name[2] == 'r' &&
8051 name[3] == 't')
8052 { /* sort */
8053 return KEY_sort;
8054 }
8055
8056 goto unknown;
8057
8058 case 'q':
8059 if (name[2] == 'r' &&
8060 name[3] == 't')
8061 { /* sqrt */
8062 return -KEY_sqrt;
8063 }
8064
8065 goto unknown;
8066
8067 case 't':
8068 if (name[2] == 'a' &&
8069 name[3] == 't')
8070 { /* stat */
8071 return -KEY_stat;
8072 }
8073
8074 goto unknown;
8075
8076 default:
8077 goto unknown;
8078 }
8079
8080 case 't':
8081 switch (name[1])
8082 {
8083 case 'e':
8084 if (name[2] == 'l' &&
8085 name[3] == 'l')
8086 { /* tell */
8087 return -KEY_tell;
8088 }
8089
8090 goto unknown;
8091
8092 case 'i':
8093 switch (name[2])
8094 {
8095 case 'e':
8096 if (name[3] == 'd')
8097 { /* tied */
8098 return KEY_tied;
8099 }
8100
8101 goto unknown;
8102
8103 case 'm':
8104 if (name[3] == 'e')
8105 { /* time */
8106 return -KEY_time;
8107 }
8108
8109 goto unknown;
8110
8111 default:
8112 goto unknown;
8113 }
8114
8115 default:
8116 goto unknown;
8117 }
8118
8119 case 'w':
0d863452 8120 switch (name[1])
4c3bbe0f 8121 {
0d863452 8122 case 'a':
952306ac
RGS
8123 switch (name[2])
8124 {
8125 case 'i':
8126 if (name[3] == 't')
8127 { /* wait */
8128 return -KEY_wait;
8129 }
4c3bbe0f 8130
952306ac 8131 goto unknown;
4c3bbe0f 8132
952306ac
RGS
8133 case 'r':
8134 if (name[3] == 'n')
8135 { /* warn */
8136 return -KEY_warn;
8137 }
4c3bbe0f 8138
952306ac 8139 goto unknown;
4c3bbe0f 8140
952306ac
RGS
8141 default:
8142 goto unknown;
8143 }
0d863452
RH
8144
8145 case 'h':
8146 if (name[2] == 'e' &&
8147 name[3] == 'n')
8148 { /* when */
5458a98a 8149 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
952306ac 8150 }
4c3bbe0f 8151
952306ac 8152 goto unknown;
4c3bbe0f 8153
952306ac
RGS
8154 default:
8155 goto unknown;
8156 }
4c3bbe0f 8157
0d863452
RH
8158 default:
8159 goto unknown;
8160 }
8161
952306ac 8162 case 5: /* 39 tokens of length 5 */
4c3bbe0f 8163 switch (name[0])
e2e1dd5a 8164 {
4c3bbe0f
MHM
8165 case 'B':
8166 if (name[1] == 'E' &&
8167 name[2] == 'G' &&
8168 name[3] == 'I' &&
8169 name[4] == 'N')
8170 { /* BEGIN */
8171 return KEY_BEGIN;
8172 }
8173
8174 goto unknown;
8175
8176 case 'C':
8177 if (name[1] == 'H' &&
8178 name[2] == 'E' &&
8179 name[3] == 'C' &&
8180 name[4] == 'K')
8181 { /* CHECK */
8182 return KEY_CHECK;
8183 }
8184
8185 goto unknown;
8186
8187 case 'a':
8188 switch (name[1])
8189 {
8190 case 'l':
8191 if (name[2] == 'a' &&
8192 name[3] == 'r' &&
8193 name[4] == 'm')
8194 { /* alarm */
8195 return -KEY_alarm;
8196 }
8197
8198 goto unknown;
8199
8200 case 't':
8201 if (name[2] == 'a' &&
8202 name[3] == 'n' &&
8203 name[4] == '2')
8204 { /* atan2 */
8205 return -KEY_atan2;
8206 }
8207
8208 goto unknown;
8209
8210 default:
8211 goto unknown;
8212 }
8213
8214 case 'b':
0d863452
RH
8215 switch (name[1])
8216 {
8217 case 'l':
8218 if (name[2] == 'e' &&
952306ac
RGS
8219 name[3] == 's' &&
8220 name[4] == 's')
8221 { /* bless */
8222 return -KEY_bless;
8223 }
4c3bbe0f 8224
952306ac 8225 goto unknown;
4c3bbe0f 8226
0d863452
RH
8227 case 'r':
8228 if (name[2] == 'e' &&
8229 name[3] == 'a' &&
8230 name[4] == 'k')
8231 { /* break */
5458a98a 8232 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
0d863452
RH
8233 }
8234
8235 goto unknown;
8236
8237 default:
8238 goto unknown;
8239 }
8240
4c3bbe0f
MHM
8241 case 'c':
8242 switch (name[1])
8243 {
8244 case 'h':
8245 switch (name[2])
8246 {
8247 case 'd':
8248 if (name[3] == 'i' &&
8249 name[4] == 'r')
8250 { /* chdir */
8251 return -KEY_chdir;
8252 }
8253
8254 goto unknown;
8255
8256 case 'm':
8257 if (name[3] == 'o' &&
8258 name[4] == 'd')
8259 { /* chmod */
8260 return -KEY_chmod;
8261 }
8262
8263 goto unknown;
8264
8265 case 'o':
8266 switch (name[3])
8267 {
8268 case 'm':
8269 if (name[4] == 'p')
8270 { /* chomp */
8271 return -KEY_chomp;
8272 }
8273
8274 goto unknown;
8275
8276 case 'w':
8277 if (name[4] == 'n')
8278 { /* chown */
8279 return -KEY_chown;
8280 }
8281
8282 goto unknown;
8283
8284 default:
8285 goto unknown;
8286 }
8287
8288 default:
8289 goto unknown;
8290 }
8291
8292 case 'l':
8293 if (name[2] == 'o' &&
8294 name[3] == 's' &&
8295 name[4] == 'e')
8296 { /* close */
8297 return -KEY_close;
8298 }
8299
8300 goto unknown;
8301
8302 case 'r':
8303 if (name[2] == 'y' &&
8304 name[3] == 'p' &&
8305 name[4] == 't')
8306 { /* crypt */
8307 return -KEY_crypt;
8308 }
8309
8310 goto unknown;
8311
8312 default:
8313 goto unknown;
8314 }
8315
8316 case 'e':
8317 if (name[1] == 'l' &&
8318 name[2] == 's' &&
8319 name[3] == 'i' &&
8320 name[4] == 'f')
8321 { /* elsif */
8322 return KEY_elsif;
8323 }
8324
8325 goto unknown;
8326
8327 case 'f':
8328 switch (name[1])
8329 {
8330 case 'c':
8331 if (name[2] == 'n' &&
8332 name[3] == 't' &&
8333 name[4] == 'l')
8334 { /* fcntl */
8335 return -KEY_fcntl;
8336 }
8337
8338 goto unknown;
8339
8340 case 'l':
8341 if (name[2] == 'o' &&
8342 name[3] == 'c' &&
8343 name[4] == 'k')
8344 { /* flock */
8345 return -KEY_flock;
8346 }
8347
8348 goto unknown;
8349
8350 default:
8351 goto unknown;
8352 }
8353
0d863452
RH
8354 case 'g':
8355 if (name[1] == 'i' &&
8356 name[2] == 'v' &&
8357 name[3] == 'e' &&
8358 name[4] == 'n')
8359 { /* given */
5458a98a 8360 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
0d863452
RH
8361 }
8362
8363 goto unknown;
8364
4c3bbe0f
MHM
8365 case 'i':
8366 switch (name[1])
8367 {
8368 case 'n':
8369 if (name[2] == 'd' &&
8370 name[3] == 'e' &&
8371 name[4] == 'x')
8372 { /* index */
8373 return -KEY_index;
8374 }
8375
8376 goto unknown;
8377
8378 case 'o':
8379 if (name[2] == 'c' &&
8380 name[3] == 't' &&
8381 name[4] == 'l')
8382 { /* ioctl */
8383 return -KEY_ioctl;
8384 }
8385
8386 goto unknown;
8387
8388 default:
8389 goto unknown;
8390 }
8391
8392 case 'l':
8393 switch (name[1])
8394 {
8395 case 'o':
8396 if (name[2] == 'c' &&
8397 name[3] == 'a' &&
8398 name[4] == 'l')
8399 { /* local */
8400 return KEY_local;
8401 }
8402
8403 goto unknown;
8404
8405 case 's':
8406 if (name[2] == 't' &&
8407 name[3] == 'a' &&
8408 name[4] == 't')
8409 { /* lstat */
8410 return -KEY_lstat;
8411 }
8412
8413 goto unknown;
8414
8415 default:
8416 goto unknown;
8417 }
8418
8419 case 'm':
8420 if (name[1] == 'k' &&
8421 name[2] == 'd' &&
8422 name[3] == 'i' &&
8423 name[4] == 'r')
8424 { /* mkdir */
8425 return -KEY_mkdir;
8426 }
8427
8428 goto unknown;
8429
8430 case 'p':
8431 if (name[1] == 'r' &&
8432 name[2] == 'i' &&
8433 name[3] == 'n' &&
8434 name[4] == 't')
8435 { /* print */
8436 return KEY_print;
8437 }
8438
8439 goto unknown;
8440
8441 case 'r':
8442 switch (name[1])
8443 {
8444 case 'e':
8445 if (name[2] == 's' &&
8446 name[3] == 'e' &&
8447 name[4] == 't')
8448 { /* reset */
8449 return -KEY_reset;
8450 }
8451
8452 goto unknown;
8453
8454 case 'm':
8455 if (name[2] == 'd' &&
8456 name[3] == 'i' &&
8457 name[4] == 'r')
8458 { /* rmdir */
8459 return -KEY_rmdir;
8460 }
8461
8462 goto unknown;
8463
8464 default:
8465 goto unknown;
8466 }
8467
8468 case 's':
8469 switch (name[1])
8470 {
8471 case 'e':
8472 if (name[2] == 'm' &&
8473 name[3] == 'o' &&
8474 name[4] == 'p')
8475 { /* semop */
8476 return -KEY_semop;
8477 }
8478
8479 goto unknown;
8480
8481 case 'h':
8482 if (name[2] == 'i' &&
8483 name[3] == 'f' &&
8484 name[4] == 't')
8485 { /* shift */
8486 return -KEY_shift;
8487 }
8488
8489 goto unknown;
8490
8491 case 'l':
8492 if (name[2] == 'e' &&
8493 name[3] == 'e' &&
8494 name[4] == 'p')
8495 { /* sleep */
8496 return -KEY_sleep;
8497 }
8498
8499 goto unknown;
8500
8501 case 'p':
8502 if (name[2] == 'l' &&
8503 name[3] == 'i' &&
8504 name[4] == 't')
8505 { /* split */
8506 return KEY_split;
8507 }
8508
8509 goto unknown;
8510
8511 case 'r':
8512 if (name[2] == 'a' &&
8513 name[3] == 'n' &&
8514 name[4] == 'd')
8515 { /* srand */
8516 return -KEY_srand;
8517 }
8518
8519 goto unknown;
8520
8521 case 't':
952306ac
RGS
8522 switch (name[2])
8523 {
8524 case 'a':
8525 if (name[3] == 't' &&
8526 name[4] == 'e')
8527 { /* state */
5458a98a 8528 return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
952306ac 8529 }
4c3bbe0f 8530
952306ac
RGS
8531 goto unknown;
8532
8533 case 'u':
8534 if (name[3] == 'd' &&
8535 name[4] == 'y')
8536 { /* study */
8537 return KEY_study;
8538 }
8539
8540 goto unknown;
8541
8542 default:
8543 goto unknown;
8544 }
4c3bbe0f
MHM
8545
8546 default:
8547 goto unknown;
8548 }
8549
8550 case 't':
8551 if (name[1] == 'i' &&
8552 name[2] == 'm' &&
8553 name[3] == 'e' &&
8554 name[4] == 's')
8555 { /* times */
8556 return -KEY_times;
8557 }
8558
8559 goto unknown;
8560
8561 case 'u':
8562 switch (name[1])
8563 {
8564 case 'm':
8565 if (name[2] == 'a' &&
8566 name[3] == 's' &&
8567 name[4] == 'k')
8568 { /* umask */
8569 return -KEY_umask;
8570 }
8571
8572 goto unknown;
8573
8574 case 'n':
8575 switch (name[2])
8576 {
8577 case 'd':
8578 if (name[3] == 'e' &&
8579 name[4] == 'f')
8580 { /* undef */
8581 return KEY_undef;
8582 }
8583
8584 goto unknown;
8585
8586 case 't':
8587 if (name[3] == 'i')
8588 {
8589 switch (name[4])
8590 {
8591 case 'e':
8592 { /* untie */
8593 return KEY_untie;
8594 }
8595
4c3bbe0f
MHM
8596 case 'l':
8597 { /* until */
8598 return KEY_until;
8599 }
8600
4c3bbe0f
MHM
8601 default:
8602 goto unknown;
8603 }
8604 }
8605
8606 goto unknown;
8607
8608 default:
8609 goto unknown;
8610 }
8611
8612 case 't':
8613 if (name[2] == 'i' &&
8614 name[3] == 'm' &&
8615 name[4] == 'e')
8616 { /* utime */
8617 return -KEY_utime;
8618 }
8619
8620 goto unknown;
8621
8622 default:
8623 goto unknown;
8624 }
8625
8626 case 'w':
8627 switch (name[1])
8628 {
8629 case 'h':
8630 if (name[2] == 'i' &&
8631 name[3] == 'l' &&
8632 name[4] == 'e')
8633 { /* while */
8634 return KEY_while;
8635 }
8636
8637 goto unknown;
8638
8639 case 'r':
8640 if (name[2] == 'i' &&
8641 name[3] == 't' &&
8642 name[4] == 'e')
8643 { /* write */
8644 return -KEY_write;
8645 }
8646
8647 goto unknown;
8648
8649 default:
8650 goto unknown;
8651 }
8652
8653 default:
8654 goto unknown;
e2e1dd5a 8655 }
4c3bbe0f
MHM
8656
8657 case 6: /* 33 tokens of length 6 */
8658 switch (name[0])
8659 {
8660 case 'a':
8661 if (name[1] == 'c' &&
8662 name[2] == 'c' &&
8663 name[3] == 'e' &&
8664 name[4] == 'p' &&
8665 name[5] == 't')
8666 { /* accept */
8667 return -KEY_accept;
8668 }
8669
8670 goto unknown;
8671
8672 case 'c':
8673 switch (name[1])
8674 {
8675 case 'a':
8676 if (name[2] == 'l' &&
8677 name[3] == 'l' &&
8678 name[4] == 'e' &&
8679 name[5] == 'r')
8680 { /* caller */
8681 return -KEY_caller;
8682 }
8683
8684 goto unknown;
8685
8686 case 'h':
8687 if (name[2] == 'r' &&
8688 name[3] == 'o' &&
8689 name[4] == 'o' &&
8690 name[5] == 't')
8691 { /* chroot */
8692 return -KEY_chroot;
8693 }
8694
8695 goto unknown;
8696
8697 default:
8698 goto unknown;
8699 }
8700
8701 case 'd':
8702 if (name[1] == 'e' &&
8703 name[2] == 'l' &&
8704 name[3] == 'e' &&
8705 name[4] == 't' &&
8706 name[5] == 'e')
8707 { /* delete */
8708 return KEY_delete;
8709 }
8710
8711 goto unknown;
8712
8713 case 'e':
8714 switch (name[1])
8715 {
8716 case 'l':
8717 if (name[2] == 's' &&
8718 name[3] == 'e' &&
8719 name[4] == 'i' &&
8720 name[5] == 'f')
8721 { /* elseif */
8722 if(ckWARN_d(WARN_SYNTAX))
8723 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
8724 }
8725
8726 goto unknown;
8727
8728 case 'x':
8729 if (name[2] == 'i' &&
8730 name[3] == 's' &&
8731 name[4] == 't' &&
8732 name[5] == 's')
8733 { /* exists */
8734 return KEY_exists;
8735 }
8736
8737 goto unknown;
8738
8739 default:
8740 goto unknown;
8741 }
8742
8743 case 'f':
8744 switch (name[1])
8745 {
8746 case 'i':
8747 if (name[2] == 'l' &&
8748 name[3] == 'e' &&
8749 name[4] == 'n' &&
8750 name[5] == 'o')
8751 { /* fileno */
8752 return -KEY_fileno;
8753 }
8754
8755 goto unknown;
8756
8757 case 'o':
8758 if (name[2] == 'r' &&
8759 name[3] == 'm' &&
8760 name[4] == 'a' &&
8761 name[5] == 't')
8762 { /* format */
8763 return KEY_format;
8764 }
8765
8766 goto unknown;
8767
8768 default:
8769 goto unknown;
8770 }
8771
8772 case 'g':
8773 if (name[1] == 'm' &&
8774 name[2] == 't' &&
8775 name[3] == 'i' &&
8776 name[4] == 'm' &&
8777 name[5] == 'e')
8778 { /* gmtime */
8779 return -KEY_gmtime;
8780 }
8781
8782 goto unknown;
8783
8784 case 'l':
8785 switch (name[1])
8786 {
8787 case 'e':
8788 if (name[2] == 'n' &&
8789 name[3] == 'g' &&
8790 name[4] == 't' &&
8791 name[5] == 'h')
8792 { /* length */
8793 return -KEY_length;
8794 }
8795
8796 goto unknown;
8797
8798 case 'i':
8799 if (name[2] == 's' &&
8800 name[3] == 't' &&
8801 name[4] == 'e' &&
8802 name[5] == 'n')
8803 { /* listen */
8804 return -KEY_listen;
8805 }
8806
8807 goto unknown;
8808
8809 default:
8810 goto unknown;
8811 }
8812
8813 case 'm':
8814 if (name[1] == 's' &&
8815 name[2] == 'g')
8816 {
8817 switch (name[3])
8818 {
8819 case 'c':
8820 if (name[4] == 't' &&
8821 name[5] == 'l')
8822 { /* msgctl */
8823 return -KEY_msgctl;
8824 }
8825
8826 goto unknown;
8827
8828 case 'g':
8829 if (name[4] == 'e' &&
8830 name[5] == 't')
8831 { /* msgget */
8832 return -KEY_msgget;
8833 }
8834
8835 goto unknown;
8836
8837 case 'r':
8838 if (name[4] == 'c' &&
8839 name[5] == 'v')
8840 { /* msgrcv */
8841 return -KEY_msgrcv;
8842 }
8843
8844 goto unknown;
8845
8846 case 's':
8847 if (name[4] == 'n' &&
8848 name[5] == 'd')
8849 { /* msgsnd */
8850 return -KEY_msgsnd;
8851 }
8852
8853 goto unknown;
8854
8855 default:
8856 goto unknown;
8857 }
8858 }
8859
8860 goto unknown;
8861
8862 case 'p':
8863 if (name[1] == 'r' &&
8864 name[2] == 'i' &&
8865 name[3] == 'n' &&
8866 name[4] == 't' &&
8867 name[5] == 'f')
8868 { /* printf */
8869 return KEY_printf;
8870 }
8871
8872 goto unknown;
8873
8874 case 'r':
8875 switch (name[1])
8876 {
8877 case 'e':
8878 switch (name[2])
8879 {
8880 case 'n':
8881 if (name[3] == 'a' &&
8882 name[4] == 'm' &&
8883 name[5] == 'e')
8884 { /* rename */
8885 return -KEY_rename;
8886 }
8887
8888 goto unknown;
8889
8890 case 't':
8891 if (name[3] == 'u' &&
8892 name[4] == 'r' &&
8893 name[5] == 'n')
8894 { /* return */
8895 return KEY_return;
8896 }
8897
8898 goto unknown;
8899
8900 default:
8901 goto unknown;
8902 }
8903
8904 case 'i':
8905 if (name[2] == 'n' &&
8906 name[3] == 'd' &&
8907 name[4] == 'e' &&
8908 name[5] == 'x')
8909 { /* rindex */
8910 return -KEY_rindex;
8911 }
8912
8913 goto unknown;
8914
8915 default:
8916 goto unknown;
8917 }
8918
8919 case 's':
8920 switch (name[1])
8921 {
8922 case 'c':
8923 if (name[2] == 'a' &&
8924 name[3] == 'l' &&
8925 name[4] == 'a' &&
8926 name[5] == 'r')
8927 { /* scalar */
8928 return KEY_scalar;
8929 }
8930
8931 goto unknown;
8932
8933 case 'e':
8934 switch (name[2])
8935 {
8936 case 'l':
8937 if (name[3] == 'e' &&
8938 name[4] == 'c' &&
8939 name[5] == 't')
8940 { /* select */
8941 return -KEY_select;
8942 }
8943
8944 goto unknown;
8945
8946 case 'm':
8947 switch (name[3])
8948 {
8949 case 'c':
8950 if (name[4] == 't' &&
8951 name[5] == 'l')
8952 { /* semctl */
8953 return -KEY_semctl;
8954 }
8955
8956 goto unknown;
8957
8958 case 'g':
8959 if (name[4] == 'e' &&
8960 name[5] == 't')
8961 { /* semget */
8962 return -KEY_semget;
8963 }
8964
8965 goto unknown;
8966
8967 default:
8968 goto unknown;
8969 }
8970
8971 default:
8972 goto unknown;
8973 }
8974
8975 case 'h':
8976 if (name[2] == 'm')
8977 {
8978 switch (name[3])
8979 {
8980 case 'c':
8981 if (name[4] == 't' &&
8982 name[5] == 'l')
8983 { /* shmctl */
8984 return -KEY_shmctl;
8985 }
8986
8987 goto unknown;
8988
8989 case 'g':
8990 if (name[4] == 'e' &&
8991 name[5] == 't')
8992 { /* shmget */
8993 return -KEY_shmget;
8994 }
8995
8996 goto unknown;
8997
8998 default:
8999 goto unknown;
9000 }
9001 }
9002
9003 goto unknown;
9004
9005 case 'o':
9006 if (name[2] == 'c' &&
9007 name[3] == 'k' &&
9008 name[4] == 'e' &&
9009 name[5] == 't')
9010 { /* socket */
9011 return -KEY_socket;
9012 }
9013
9014 goto unknown;
9015
9016 case 'p':
9017 if (name[2] == 'l' &&
9018 name[3] == 'i' &&
9019 name[4] == 'c' &&
9020 name[5] == 'e')
9021 { /* splice */
9022 return -KEY_splice;
9023 }
9024
9025 goto unknown;
9026
9027 case 'u':
9028 if (name[2] == 'b' &&
9029 name[3] == 's' &&
9030 name[4] == 't' &&
9031 name[5] == 'r')
9032 { /* substr */
9033 return -KEY_substr;
9034 }
9035
9036 goto unknown;
9037
9038 case 'y':
9039 if (name[2] == 's' &&
9040 name[3] == 't' &&
9041 name[4] == 'e' &&
9042 name[5] == 'm')
9043 { /* system */
9044 return -KEY_system;
9045 }
9046
9047 goto unknown;
9048
9049 default:
9050 goto unknown;
9051 }
9052
9053 case 'u':
9054 if (name[1] == 'n')
9055 {
9056 switch (name[2])
9057 {
9058 case 'l':
9059 switch (name[3])
9060 {
9061 case 'e':
9062 if (name[4] == 's' &&
9063 name[5] == 's')
9064 { /* unless */
9065 return KEY_unless;
9066 }
9067
9068 goto unknown;
9069
9070 case 'i':
9071 if (name[4] == 'n' &&
9072 name[5] == 'k')
9073 { /* unlink */
9074 return -KEY_unlink;
9075 }
9076
9077 goto unknown;
9078
9079 default:
9080 goto unknown;
9081 }
9082
9083 case 'p':
9084 if (name[3] == 'a' &&
9085 name[4] == 'c' &&
9086 name[5] == 'k')
9087 { /* unpack */
9088 return -KEY_unpack;
9089 }
9090
9091 goto unknown;
9092
9093 default:
9094 goto unknown;
9095 }
9096 }
9097
9098 goto unknown;
9099
9100 case 'v':
9101 if (name[1] == 'a' &&
9102 name[2] == 'l' &&
9103 name[3] == 'u' &&
9104 name[4] == 'e' &&
9105 name[5] == 's')
9106 { /* values */
9107 return -KEY_values;
9108 }
9109
9110 goto unknown;
9111
9112 default:
9113 goto unknown;
e2e1dd5a 9114 }
4c3bbe0f 9115
0d863452 9116 case 7: /* 29 tokens of length 7 */
4c3bbe0f
MHM
9117 switch (name[0])
9118 {
9119 case 'D':
9120 if (name[1] == 'E' &&
9121 name[2] == 'S' &&
9122 name[3] == 'T' &&
9123 name[4] == 'R' &&
9124 name[5] == 'O' &&
9125 name[6] == 'Y')
9126 { /* DESTROY */
9127 return KEY_DESTROY;
9128 }
9129
9130 goto unknown;
9131
9132 case '_':
9133 if (name[1] == '_' &&
9134 name[2] == 'E' &&
9135 name[3] == 'N' &&
9136 name[4] == 'D' &&
9137 name[5] == '_' &&
9138 name[6] == '_')
9139 { /* __END__ */
9140 return KEY___END__;
9141 }
9142
9143 goto unknown;
9144
9145 case 'b':
9146 if (name[1] == 'i' &&
9147 name[2] == 'n' &&
9148 name[3] == 'm' &&
9149 name[4] == 'o' &&
9150 name[5] == 'd' &&
9151 name[6] == 'e')
9152 { /* binmode */
9153 return -KEY_binmode;
9154 }
9155
9156 goto unknown;
9157
9158 case 'c':
9159 if (name[1] == 'o' &&
9160 name[2] == 'n' &&
9161 name[3] == 'n' &&
9162 name[4] == 'e' &&
9163 name[5] == 'c' &&
9164 name[6] == 't')
9165 { /* connect */
9166 return -KEY_connect;
9167 }
9168
9169 goto unknown;
9170
9171 case 'd':
9172 switch (name[1])
9173 {
9174 case 'b':
9175 if (name[2] == 'm' &&
9176 name[3] == 'o' &&
9177 name[4] == 'p' &&
9178 name[5] == 'e' &&
9179 name[6] == 'n')
9180 { /* dbmopen */
9181 return -KEY_dbmopen;
9182 }
9183
9184 goto unknown;
9185
9186 case 'e':
0d863452
RH
9187 if (name[2] == 'f')
9188 {
9189 switch (name[3])
9190 {
9191 case 'a':
9192 if (name[4] == 'u' &&
9193 name[5] == 'l' &&
9194 name[6] == 't')
9195 { /* default */
5458a98a 9196 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
0d863452
RH
9197 }
9198
9199 goto unknown;
9200
9201 case 'i':
9202 if (name[4] == 'n' &&
952306ac
RGS
9203 name[5] == 'e' &&
9204 name[6] == 'd')
9205 { /* defined */
9206 return KEY_defined;
9207 }
4c3bbe0f 9208
952306ac 9209 goto unknown;
4c3bbe0f 9210
952306ac
RGS
9211 default:
9212 goto unknown;
9213 }
0d863452
RH
9214 }
9215
9216 goto unknown;
9217
9218 default:
9219 goto unknown;
9220 }
4c3bbe0f
MHM
9221
9222 case 'f':
9223 if (name[1] == 'o' &&
9224 name[2] == 'r' &&
9225 name[3] == 'e' &&
9226 name[4] == 'a' &&
9227 name[5] == 'c' &&
9228 name[6] == 'h')
9229 { /* foreach */
9230 return KEY_foreach;
9231 }
9232
9233 goto unknown;
9234
9235 case 'g':
9236 if (name[1] == 'e' &&
9237 name[2] == 't' &&
9238 name[3] == 'p')
9239 {
9240 switch (name[4])
9241 {
9242 case 'g':
9243 if (name[5] == 'r' &&
9244 name[6] == 'p')
9245 { /* getpgrp */
9246 return -KEY_getpgrp;
9247 }
9248
9249 goto unknown;
9250
9251 case 'p':
9252 if (name[5] == 'i' &&
9253 name[6] == 'd')
9254 { /* getppid */
9255 return -KEY_getppid;
9256 }
9257
9258 goto unknown;
9259
9260 default:
9261 goto unknown;
9262 }
9263 }
9264
9265 goto unknown;
9266
9267 case 'l':
9268 if (name[1] == 'c' &&
9269 name[2] == 'f' &&
9270 name[3] == 'i' &&
9271 name[4] == 'r' &&
9272 name[5] == 's' &&
9273 name[6] == 't')
9274 { /* lcfirst */
9275 return -KEY_lcfirst;
9276 }
9277
9278 goto unknown;
9279
9280 case 'o':
9281 if (name[1] == 'p' &&
9282 name[2] == 'e' &&
9283 name[3] == 'n' &&
9284 name[4] == 'd' &&
9285 name[5] == 'i' &&
9286 name[6] == 'r')
9287 { /* opendir */
9288 return -KEY_opendir;
9289 }
9290
9291 goto unknown;
9292
9293 case 'p':
9294 if (name[1] == 'a' &&
9295 name[2] == 'c' &&
9296 name[3] == 'k' &&
9297 name[4] == 'a' &&
9298 name[5] == 'g' &&
9299 name[6] == 'e')
9300 { /* package */
9301 return KEY_package;
9302 }
9303
9304 goto unknown;
9305
9306 case 'r':
9307 if (name[1] == 'e')
9308 {
9309 switch (name[2])
9310 {
9311 case 'a':
9312 if (name[3] == 'd' &&
9313 name[4] == 'd' &&
9314 name[5] == 'i' &&
9315 name[6] == 'r')
9316 { /* readdir */
9317 return -KEY_readdir;
9318 }
9319
9320 goto unknown;
9321
9322 case 'q':
9323 if (name[3] == 'u' &&
9324 name[4] == 'i' &&
9325 name[5] == 'r' &&
9326 name[6] == 'e')
9327 { /* require */
9328 return KEY_require;
9329 }
9330
9331 goto unknown;
9332
9333 case 'v':
9334 if (name[3] == 'e' &&
9335 name[4] == 'r' &&
9336 name[5] == 's' &&
9337 name[6] == 'e')
9338 { /* reverse */
9339 return -KEY_reverse;
9340 }
9341
9342 goto unknown;
9343
9344 default:
9345 goto unknown;
9346 }
9347 }
9348
9349 goto unknown;
9350
9351 case 's':
9352 switch (name[1])
9353 {
9354 case 'e':
9355 switch (name[2])
9356 {
9357 case 'e':
9358 if (name[3] == 'k' &&
9359 name[4] == 'd' &&
9360 name[5] == 'i' &&
9361 name[6] == 'r')
9362 { /* seekdir */
9363 return -KEY_seekdir;
9364 }
9365
9366 goto unknown;
9367
9368 case 't':
9369 if (name[3] == 'p' &&
9370 name[4] == 'g' &&
9371 name[5] == 'r' &&
9372 name[6] == 'p')
9373 { /* setpgrp */
9374 return -KEY_setpgrp;
9375 }
9376
9377 goto unknown;
9378
9379 default:
9380 goto unknown;
9381 }
9382
9383 case 'h':
9384 if (name[2] == 'm' &&
9385 name[3] == 'r' &&
9386 name[4] == 'e' &&
9387 name[5] == 'a' &&
9388 name[6] == 'd')
9389 { /* shmread */
9390 return -KEY_shmread;
9391 }
9392
9393 goto unknown;
9394
9395 case 'p':
9396 if (name[2] == 'r' &&
9397 name[3] == 'i' &&
9398 name[4] == 'n' &&
9399 name[5] == 't' &&
9400 name[6] == 'f')
9401 { /* sprintf */
9402 return -KEY_sprintf;
9403 }
9404
9405 goto unknown;
9406
9407 case 'y':
9408 switch (name[2])
9409 {
9410 case 'm':
9411 if (name[3] == 'l' &&
9412 name[4] == 'i' &&
9413 name[5] == 'n' &&
9414 name[6] == 'k')
9415 { /* symlink */
9416 return -KEY_symlink;
9417 }
9418
9419 goto unknown;
9420
9421 case 's':
9422 switch (name[3])
9423 {
9424 case 'c':
9425 if (name[4] == 'a' &&
9426 name[5] == 'l' &&
9427 name[6] == 'l')
9428 { /* syscall */
9429 return -KEY_syscall;
9430 }
9431
9432 goto unknown;
9433
9434 case 'o':
9435 if (name[4] == 'p' &&
9436 name[5] == 'e' &&
9437 name[6] == 'n')
9438 { /* sysopen */
9439 return -KEY_sysopen;
9440 }
9441
9442 goto unknown;
9443
9444 case 'r':
9445 if (name[4] == 'e' &&
9446 name[5] == 'a' &&
9447 name[6] == 'd')
9448 { /* sysread */
9449 return -KEY_sysread;
9450 }
9451
9452 goto unknown;
9453
9454 case 's':
9455 if (name[4] == 'e' &&
9456 name[5] == 'e' &&
9457 name[6] == 'k')
9458 { /* sysseek */
9459 return -KEY_sysseek;
9460 }
9461
9462 goto unknown;
9463
9464 default:
9465 goto unknown;
9466 }
9467
9468 default:
9469 goto unknown;
9470 }
9471
9472 default:
9473 goto unknown;
9474 }
9475
9476 case 't':
9477 if (name[1] == 'e' &&
9478 name[2] == 'l' &&
9479 name[3] == 'l' &&
9480 name[4] == 'd' &&
9481 name[5] == 'i' &&
9482 name[6] == 'r')
9483 { /* telldir */
9484 return -KEY_telldir;
9485 }
9486
9487 goto unknown;
9488
9489 case 'u':
9490 switch (name[1])
9491 {
9492 case 'c':
9493 if (name[2] == 'f' &&
9494 name[3] == 'i' &&
9495 name[4] == 'r' &&
9496 name[5] == 's' &&
9497 name[6] == 't')
9498 { /* ucfirst */
9499 return -KEY_ucfirst;
9500 }
9501
9502 goto unknown;
9503
9504 case 'n':
9505 if (name[2] == 's' &&
9506 name[3] == 'h' &&
9507 name[4] == 'i' &&
9508 name[5] == 'f' &&
9509 name[6] == 't')
9510 { /* unshift */
9511 return -KEY_unshift;
9512 }
9513
9514 goto unknown;
9515
9516 default:
9517 goto unknown;
9518 }
9519
9520 case 'w':
9521 if (name[1] == 'a' &&
9522 name[2] == 'i' &&
9523 name[3] == 't' &&
9524 name[4] == 'p' &&
9525 name[5] == 'i' &&
9526 name[6] == 'd')
9527 { /* waitpid */
9528 return -KEY_waitpid;
9529 }
9530
9531 goto unknown;
9532
9533 default:
9534 goto unknown;
9535 }
9536
9537 case 8: /* 26 tokens of length 8 */
9538 switch (name[0])
9539 {
9540 case 'A':
9541 if (name[1] == 'U' &&
9542 name[2] == 'T' &&
9543 name[3] == 'O' &&
9544 name[4] == 'L' &&
9545 name[5] == 'O' &&
9546 name[6] == 'A' &&
9547 name[7] == 'D')
9548 { /* AUTOLOAD */
9549 return KEY_AUTOLOAD;
9550 }
9551
9552 goto unknown;
9553
9554 case '_':
9555 if (name[1] == '_')
9556 {
9557 switch (name[2])
9558 {
9559 case 'D':
9560 if (name[3] == 'A' &&
9561 name[4] == 'T' &&
9562 name[5] == 'A' &&
9563 name[6] == '_' &&
9564 name[7] == '_')
9565 { /* __DATA__ */
9566 return KEY___DATA__;
9567 }
9568
9569 goto unknown;
9570
9571 case 'F':
9572 if (name[3] == 'I' &&
9573 name[4] == 'L' &&
9574 name[5] == 'E' &&
9575 name[6] == '_' &&
9576 name[7] == '_')
9577 { /* __FILE__ */
9578 return -KEY___FILE__;
9579 }
9580
9581 goto unknown;
9582
9583 case 'L':
9584 if (name[3] == 'I' &&
9585 name[4] == 'N' &&
9586 name[5] == 'E' &&
9587 name[6] == '_' &&
9588 name[7] == '_')
9589 { /* __LINE__ */
9590 return -KEY___LINE__;
9591 }
9592
9593 goto unknown;
9594
9595 default:
9596 goto unknown;
9597 }
9598 }
9599
9600 goto unknown;
9601
9602 case 'c':
9603 switch (name[1])
9604 {
9605 case 'l':
9606 if (name[2] == 'o' &&
9607 name[3] == 's' &&
9608 name[4] == 'e' &&
9609 name[5] == 'd' &&
9610 name[6] == 'i' &&
9611 name[7] == 'r')
9612 { /* closedir */
9613 return -KEY_closedir;
9614 }
9615
9616 goto unknown;
9617
9618 case 'o':
9619 if (name[2] == 'n' &&
9620 name[3] == 't' &&
9621 name[4] == 'i' &&
9622 name[5] == 'n' &&
9623 name[6] == 'u' &&
9624 name[7] == 'e')
9625 { /* continue */
9626 return -KEY_continue;
9627 }
9628
9629 goto unknown;
9630
9631 default:
9632 goto unknown;
9633 }
9634
9635 case 'd':
9636 if (name[1] == 'b' &&
9637 name[2] == 'm' &&
9638 name[3] == 'c' &&
9639 name[4] == 'l' &&
9640 name[5] == 'o' &&
9641 name[6] == 's' &&
9642 name[7] == 'e')
9643 { /* dbmclose */
9644 return -KEY_dbmclose;
9645 }
9646
9647 goto unknown;
9648
9649 case 'e':
9650 if (name[1] == 'n' &&
9651 name[2] == 'd')
9652 {
9653 switch (name[3])
9654 {
9655 case 'g':
9656 if (name[4] == 'r' &&
9657 name[5] == 'e' &&
9658 name[6] == 'n' &&
9659 name[7] == 't')
9660 { /* endgrent */
9661 return -KEY_endgrent;
9662 }
9663
9664 goto unknown;
9665
9666 case 'p':
9667 if (name[4] == 'w' &&
9668 name[5] == 'e' &&
9669 name[6] == 'n' &&
9670 name[7] == 't')
9671 { /* endpwent */
9672 return -KEY_endpwent;
9673 }
9674
9675 goto unknown;
9676
9677 default:
9678 goto unknown;
9679 }
9680 }
9681
9682 goto unknown;
9683
9684 case 'f':
9685 if (name[1] == 'o' &&
9686 name[2] == 'r' &&
9687 name[3] == 'm' &&
9688 name[4] == 'l' &&
9689 name[5] == 'i' &&
9690 name[6] == 'n' &&
9691 name[7] == 'e')
9692 { /* formline */
9693 return -KEY_formline;
9694 }
9695
9696 goto unknown;
9697
9698 case 'g':
9699 if (name[1] == 'e' &&
9700 name[2] == 't')
9701 {
9702 switch (name[3])
9703 {
9704 case 'g':
9705 if (name[4] == 'r')
9706 {
9707 switch (name[5])
9708 {
9709 case 'e':
9710 if (name[6] == 'n' &&
9711 name[7] == 't')
9712 { /* getgrent */
9713 return -KEY_getgrent;
9714 }
9715
9716 goto unknown;
9717
9718 case 'g':
9719 if (name[6] == 'i' &&
9720 name[7] == 'd')
9721 { /* getgrgid */
9722 return -KEY_getgrgid;
9723 }
9724
9725 goto unknown;
9726
9727 case 'n':
9728 if (name[6] == 'a' &&
9729 name[7] == 'm')
9730 { /* getgrnam */
9731 return -KEY_getgrnam;
9732 }
9733
9734 goto unknown;
9735
9736 default:
9737 goto unknown;
9738 }
9739 }
9740
9741 goto unknown;
9742
9743 case 'l':
9744 if (name[4] == 'o' &&
9745 name[5] == 'g' &&
9746 name[6] == 'i' &&
9747 name[7] == 'n')
9748 { /* getlogin */
9749 return -KEY_getlogin;
9750 }
9751
9752 goto unknown;
9753
9754 case 'p':
9755 if (name[4] == 'w')
9756 {
9757 switch (name[5])
9758 {
9759 case 'e':
9760 if (name[6] == 'n' &&
9761 name[7] == 't')
9762 { /* getpwent */
9763 return -KEY_getpwent;
9764 }
9765
9766 goto unknown;
9767
9768 case 'n':
9769 if (name[6] == 'a' &&
9770 name[7] == 'm')
9771 { /* getpwnam */
9772 return -KEY_getpwnam;
9773 }
9774
9775 goto unknown;
9776
9777 case 'u':
9778 if (name[6] == 'i' &&
9779 name[7] == 'd')
9780 { /* getpwuid */
9781 return -KEY_getpwuid;
9782 }
9783
9784 goto unknown;
9785
9786 default:
9787 goto unknown;
9788 }
9789 }
9790
9791 goto unknown;
9792
9793 default:
9794 goto unknown;
9795 }
9796 }
9797
9798 goto unknown;
9799
9800 case 'r':
9801 if (name[1] == 'e' &&
9802 name[2] == 'a' &&
9803 name[3] == 'd')
9804 {
9805 switch (name[4])
9806 {
9807 case 'l':
9808 if (name[5] == 'i' &&
9809 name[6] == 'n')
9810 {
9811 switch (name[7])
9812 {
9813 case 'e':
9814 { /* readline */
9815 return -KEY_readline;
9816 }
9817
4c3bbe0f
MHM
9818 case 'k':
9819 { /* readlink */
9820 return -KEY_readlink;
9821 }
9822
4c3bbe0f
MHM
9823 default:
9824 goto unknown;
9825 }
9826 }
9827
9828 goto unknown;
9829
9830 case 'p':
9831 if (name[5] == 'i' &&
9832 name[6] == 'p' &&
9833 name[7] == 'e')
9834 { /* readpipe */
9835 return -KEY_readpipe;
9836 }
9837
9838 goto unknown;
9839
9840 default:
9841 goto unknown;
9842 }
9843 }
9844
9845 goto unknown;
9846
9847 case 's':
9848 switch (name[1])
9849 {
9850 case 'e':
9851 if (name[2] == 't')
9852 {
9853 switch (name[3])
9854 {
9855 case 'g':
9856 if (name[4] == 'r' &&
9857 name[5] == 'e' &&
9858 name[6] == 'n' &&
9859 name[7] == 't')
9860 { /* setgrent */
9861 return -KEY_setgrent;
9862 }
9863
9864 goto unknown;
9865
9866 case 'p':
9867 if (name[4] == 'w' &&
9868 name[5] == 'e' &&
9869 name[6] == 'n' &&
9870 name[7] == 't')
9871 { /* setpwent */
9872 return -KEY_setpwent;
9873 }
9874
9875 goto unknown;
9876
9877 default:
9878 goto unknown;
9879 }
9880 }
9881
9882 goto unknown;
9883
9884 case 'h':
9885 switch (name[2])
9886 {
9887 case 'm':
9888 if (name[3] == 'w' &&
9889 name[4] == 'r' &&
9890 name[5] == 'i' &&
9891 name[6] == 't' &&
9892 name[7] == 'e')
9893 { /* shmwrite */
9894 return -KEY_shmwrite;
9895 }
9896
9897 goto unknown;
9898
9899 case 'u':
9900 if (name[3] == 't' &&
9901 name[4] == 'd' &&
9902 name[5] == 'o' &&
9903 name[6] == 'w' &&
9904 name[7] == 'n')
9905 { /* shutdown */
9906 return -KEY_shutdown;
9907 }
9908
9909 goto unknown;
9910
9911 default:
9912 goto unknown;
9913 }
9914
9915 case 'y':
9916 if (name[2] == 's' &&
9917 name[3] == 'w' &&
9918 name[4] == 'r' &&
9919 name[5] == 'i' &&
9920 name[6] == 't' &&
9921 name[7] == 'e')
9922 { /* syswrite */
9923 return -KEY_syswrite;
9924 }
9925
9926 goto unknown;
9927
9928 default:
9929 goto unknown;
9930 }
9931
9932 case 't':
9933 if (name[1] == 'r' &&
9934 name[2] == 'u' &&
9935 name[3] == 'n' &&
9936 name[4] == 'c' &&
9937 name[5] == 'a' &&
9938 name[6] == 't' &&
9939 name[7] == 'e')
9940 { /* truncate */
9941 return -KEY_truncate;
9942 }
9943
9944 goto unknown;
9945
9946 default:
9947 goto unknown;
9948 }
9949
3c10abe3 9950 case 9: /* 9 tokens of length 9 */
4c3bbe0f
MHM
9951 switch (name[0])
9952 {
3c10abe3
AG
9953 case 'U':
9954 if (name[1] == 'N' &&
9955 name[2] == 'I' &&
9956 name[3] == 'T' &&
9957 name[4] == 'C' &&
9958 name[5] == 'H' &&
9959 name[6] == 'E' &&
9960 name[7] == 'C' &&
9961 name[8] == 'K')
9962 { /* UNITCHECK */
9963 return KEY_UNITCHECK;
9964 }
9965
9966 goto unknown;
9967
4c3bbe0f
MHM
9968 case 'e':
9969 if (name[1] == 'n' &&
9970 name[2] == 'd' &&
9971 name[3] == 'n' &&
9972 name[4] == 'e' &&
9973 name[5] == 't' &&
9974 name[6] == 'e' &&
9975 name[7] == 'n' &&
9976 name[8] == 't')
9977 { /* endnetent */
9978 return -KEY_endnetent;
9979 }
9980
9981 goto unknown;
9982
9983 case 'g':
9984 if (name[1] == 'e' &&
9985 name[2] == 't' &&
9986 name[3] == 'n' &&
9987 name[4] == 'e' &&
9988 name[5] == 't' &&
9989 name[6] == 'e' &&
9990 name[7] == 'n' &&
9991 name[8] == 't')
9992 { /* getnetent */
9993 return -KEY_getnetent;
9994 }
9995
9996 goto unknown;
9997
9998 case 'l':
9999 if (name[1] == 'o' &&
10000 name[2] == 'c' &&
10001 name[3] == 'a' &&
10002 name[4] == 'l' &&
10003 name[5] == 't' &&
10004 name[6] == 'i' &&
10005 name[7] == 'm' &&
10006 name[8] == 'e')
10007 { /* localtime */
10008 return -KEY_localtime;
10009 }
10010
10011 goto unknown;
10012
10013 case 'p':
10014 if (name[1] == 'r' &&
10015 name[2] == 'o' &&
10016 name[3] == 't' &&
10017 name[4] == 'o' &&
10018 name[5] == 't' &&
10019 name[6] == 'y' &&
10020 name[7] == 'p' &&
10021 name[8] == 'e')
10022 { /* prototype */
10023 return KEY_prototype;
10024 }
10025
10026 goto unknown;
10027
10028 case 'q':
10029 if (name[1] == 'u' &&
10030 name[2] == 'o' &&
10031 name[3] == 't' &&
10032 name[4] == 'e' &&
10033 name[5] == 'm' &&
10034 name[6] == 'e' &&
10035 name[7] == 't' &&
10036 name[8] == 'a')
10037 { /* quotemeta */
10038 return -KEY_quotemeta;
10039 }
10040
10041 goto unknown;
10042
10043 case 'r':
10044 if (name[1] == 'e' &&
10045 name[2] == 'w' &&
10046 name[3] == 'i' &&
10047 name[4] == 'n' &&
10048 name[5] == 'd' &&
10049 name[6] == 'd' &&
10050 name[7] == 'i' &&
10051 name[8] == 'r')
10052 { /* rewinddir */
10053 return -KEY_rewinddir;
10054 }
10055
10056 goto unknown;
10057
10058 case 's':
10059 if (name[1] == 'e' &&
10060 name[2] == 't' &&
10061 name[3] == 'n' &&
10062 name[4] == 'e' &&
10063 name[5] == 't' &&
10064 name[6] == 'e' &&
10065 name[7] == 'n' &&
10066 name[8] == 't')
10067 { /* setnetent */
10068 return -KEY_setnetent;
10069 }
10070
10071 goto unknown;
10072
10073 case 'w':
10074 if (name[1] == 'a' &&
10075 name[2] == 'n' &&
10076 name[3] == 't' &&
10077 name[4] == 'a' &&
10078 name[5] == 'r' &&
10079 name[6] == 'r' &&
10080 name[7] == 'a' &&
10081 name[8] == 'y')
10082 { /* wantarray */
10083 return -KEY_wantarray;
10084 }
10085
10086 goto unknown;
10087
10088 default:
10089 goto unknown;
10090 }
10091
10092 case 10: /* 9 tokens of length 10 */
10093 switch (name[0])
10094 {
10095 case 'e':
10096 if (name[1] == 'n' &&
10097 name[2] == 'd')
10098 {
10099 switch (name[3])
10100 {
10101 case 'h':
10102 if (name[4] == 'o' &&
10103 name[5] == 's' &&
10104 name[6] == 't' &&
10105 name[7] == 'e' &&
10106 name[8] == 'n' &&
10107 name[9] == 't')
10108 { /* endhostent */
10109 return -KEY_endhostent;
10110 }
10111
10112 goto unknown;
10113
10114 case 's':
10115 if (name[4] == 'e' &&
10116 name[5] == 'r' &&
10117 name[6] == 'v' &&
10118 name[7] == 'e' &&
10119 name[8] == 'n' &&
10120 name[9] == 't')
10121 { /* endservent */
10122 return -KEY_endservent;
10123 }
10124
10125 goto unknown;
10126
10127 default:
10128 goto unknown;
10129 }
10130 }
10131
10132 goto unknown;
10133
10134 case 'g':
10135 if (name[1] == 'e' &&
10136 name[2] == 't')
10137 {
10138 switch (name[3])
10139 {
10140 case 'h':
10141 if (name[4] == 'o' &&
10142 name[5] == 's' &&
10143 name[6] == 't' &&
10144 name[7] == 'e' &&
10145 name[8] == 'n' &&
10146 name[9] == 't')
10147 { /* gethostent */
10148 return -KEY_gethostent;
10149 }
10150
10151 goto unknown;
10152
10153 case 's':
10154 switch (name[4])
10155 {
10156 case 'e':
10157 if (name[5] == 'r' &&
10158 name[6] == 'v' &&
10159 name[7] == 'e' &&
10160 name[8] == 'n' &&
10161 name[9] == 't')
10162 { /* getservent */
10163 return -KEY_getservent;
10164 }
10165
10166 goto unknown;
10167
10168 case 'o':
10169 if (name[5] == 'c' &&
10170 name[6] == 'k' &&
10171 name[7] == 'o' &&
10172 name[8] == 'p' &&
10173 name[9] == 't')
10174 { /* getsockopt */
10175 return -KEY_getsockopt;
10176 }
10177
10178 goto unknown;
10179
10180 default:
10181 goto unknown;
10182 }
10183
10184 default:
10185 goto unknown;
10186 }
10187 }
10188
10189 goto unknown;
10190
10191 case 's':
10192 switch (name[1])
10193 {
10194 case 'e':
10195 if (name[2] == 't')
10196 {
10197 switch (name[3])
10198 {
10199 case 'h':
10200 if (name[4] == 'o' &&
10201 name[5] == 's' &&
10202 name[6] == 't' &&
10203 name[7] == 'e' &&
10204 name[8] == 'n' &&
10205 name[9] == 't')
10206 { /* sethostent */
10207 return -KEY_sethostent;
10208 }
10209
10210 goto unknown;
10211
10212 case 's':
10213 switch (name[4])
10214 {
10215 case 'e':
10216 if (name[5] == 'r' &&
10217 name[6] == 'v' &&
10218 name[7] == 'e' &&
10219 name[8] == 'n' &&
10220 name[9] == 't')
10221 { /* setservent */
10222 return -KEY_setservent;
10223 }
10224
10225 goto unknown;
10226
10227 case 'o':
10228 if (name[5] == 'c' &&
10229 name[6] == 'k' &&
10230 name[7] == 'o' &&
10231 name[8] == 'p' &&
10232 name[9] == 't')
10233 { /* setsockopt */
10234 return -KEY_setsockopt;
10235 }
10236
10237 goto unknown;
10238
10239 default:
10240 goto unknown;
10241 }
10242
10243 default:
10244 goto unknown;
10245 }
10246 }
10247
10248 goto unknown;
10249
10250 case 'o':
10251 if (name[2] == 'c' &&
10252 name[3] == 'k' &&
10253 name[4] == 'e' &&
10254 name[5] == 't' &&
10255 name[6] == 'p' &&
10256 name[7] == 'a' &&
10257 name[8] == 'i' &&
10258 name[9] == 'r')
10259 { /* socketpair */
10260 return -KEY_socketpair;
10261 }
10262
10263 goto unknown;
10264
10265 default:
10266 goto unknown;
10267 }
10268
10269 default:
10270 goto unknown;
e2e1dd5a 10271 }
4c3bbe0f
MHM
10272
10273 case 11: /* 8 tokens of length 11 */
10274 switch (name[0])
10275 {
10276 case '_':
10277 if (name[1] == '_' &&
10278 name[2] == 'P' &&
10279 name[3] == 'A' &&
10280 name[4] == 'C' &&
10281 name[5] == 'K' &&
10282 name[6] == 'A' &&
10283 name[7] == 'G' &&
10284 name[8] == 'E' &&
10285 name[9] == '_' &&
10286 name[10] == '_')
10287 { /* __PACKAGE__ */
10288 return -KEY___PACKAGE__;
10289 }
10290
10291 goto unknown;
10292
10293 case 'e':
10294 if (name[1] == 'n' &&
10295 name[2] == 'd' &&
10296 name[3] == 'p' &&
10297 name[4] == 'r' &&
10298 name[5] == 'o' &&
10299 name[6] == 't' &&
10300 name[7] == 'o' &&
10301 name[8] == 'e' &&
10302 name[9] == 'n' &&
10303 name[10] == 't')
10304 { /* endprotoent */
10305 return -KEY_endprotoent;
10306 }
10307
10308 goto unknown;
10309
10310 case 'g':
10311 if (name[1] == 'e' &&
10312 name[2] == 't')
10313 {
10314 switch (name[3])
10315 {
10316 case 'p':
10317 switch (name[4])
10318 {
10319 case 'e':
10320 if (name[5] == 'e' &&
10321 name[6] == 'r' &&
10322 name[7] == 'n' &&
10323 name[8] == 'a' &&
10324 name[9] == 'm' &&
10325 name[10] == 'e')
10326 { /* getpeername */
10327 return -KEY_getpeername;
10328 }
10329
10330 goto unknown;
10331
10332 case 'r':
10333 switch (name[5])
10334 {
10335 case 'i':
10336 if (name[6] == 'o' &&
10337 name[7] == 'r' &&
10338 name[8] == 'i' &&
10339 name[9] == 't' &&
10340 name[10] == 'y')
10341 { /* getpriority */
10342 return -KEY_getpriority;
10343 }
10344
10345 goto unknown;
10346
10347 case 'o':
10348 if (name[6] == 't' &&
10349 name[7] == 'o' &&
10350 name[8] == 'e' &&
10351 name[9] == 'n' &&
10352 name[10] == 't')
10353 { /* getprotoent */
10354 return -KEY_getprotoent;
10355 }
10356
10357 goto unknown;
10358
10359 default:
10360 goto unknown;
10361 }
10362
10363 default:
10364 goto unknown;
10365 }
10366
10367 case 's':
10368 if (name[4] == 'o' &&
10369 name[5] == 'c' &&
10370 name[6] == 'k' &&
10371 name[7] == 'n' &&
10372 name[8] == 'a' &&
10373 name[9] == 'm' &&
10374 name[10] == 'e')
10375 { /* getsockname */
10376 return -KEY_getsockname;
10377 }
10378
10379 goto unknown;
10380
10381 default:
10382 goto unknown;
10383 }
10384 }
10385
10386 goto unknown;
10387
10388 case 's':
10389 if (name[1] == 'e' &&
10390 name[2] == 't' &&
10391 name[3] == 'p' &&
10392 name[4] == 'r')
10393 {
10394 switch (name[5])
10395 {
10396 case 'i':
10397 if (name[6] == 'o' &&
10398 name[7] == 'r' &&
10399 name[8] == 'i' &&
10400 name[9] == 't' &&
10401 name[10] == 'y')
10402 { /* setpriority */
10403 return -KEY_setpriority;
10404 }
10405
10406 goto unknown;
10407
10408 case 'o':
10409 if (name[6] == 't' &&
10410 name[7] == 'o' &&
10411 name[8] == 'e' &&
10412 name[9] == 'n' &&
10413 name[10] == 't')
10414 { /* setprotoent */
10415 return -KEY_setprotoent;
10416 }
10417
10418 goto unknown;
10419
10420 default:
10421 goto unknown;
10422 }
10423 }
10424
10425 goto unknown;
10426
10427 default:
10428 goto unknown;
e2e1dd5a 10429 }
4c3bbe0f
MHM
10430
10431 case 12: /* 2 tokens of length 12 */
10432 if (name[0] == 'g' &&
10433 name[1] == 'e' &&
10434 name[2] == 't' &&
10435 name[3] == 'n' &&
10436 name[4] == 'e' &&
10437 name[5] == 't' &&
10438 name[6] == 'b' &&
10439 name[7] == 'y')
10440 {
10441 switch (name[8])
10442 {
10443 case 'a':
10444 if (name[9] == 'd' &&
10445 name[10] == 'd' &&
10446 name[11] == 'r')
10447 { /* getnetbyaddr */
10448 return -KEY_getnetbyaddr;
10449 }
10450
10451 goto unknown;
10452
10453 case 'n':
10454 if (name[9] == 'a' &&
10455 name[10] == 'm' &&
10456 name[11] == 'e')
10457 { /* getnetbyname */
10458 return -KEY_getnetbyname;
10459 }
10460
10461 goto unknown;
10462
10463 default:
10464 goto unknown;
10465 }
e2e1dd5a 10466 }
4c3bbe0f
MHM
10467
10468 goto unknown;
10469
10470 case 13: /* 4 tokens of length 13 */
10471 if (name[0] == 'g' &&
10472 name[1] == 'e' &&
10473 name[2] == 't')
10474 {
10475 switch (name[3])
10476 {
10477 case 'h':
10478 if (name[4] == 'o' &&
10479 name[5] == 's' &&
10480 name[6] == 't' &&
10481 name[7] == 'b' &&
10482 name[8] == 'y')
10483 {
10484 switch (name[9])
10485 {
10486 case 'a':
10487 if (name[10] == 'd' &&
10488 name[11] == 'd' &&
10489 name[12] == 'r')
10490 { /* gethostbyaddr */
10491 return -KEY_gethostbyaddr;
10492 }
10493
10494 goto unknown;
10495
10496 case 'n':
10497 if (name[10] == 'a' &&
10498 name[11] == 'm' &&
10499 name[12] == 'e')
10500 { /* gethostbyname */
10501 return -KEY_gethostbyname;
10502 }
10503
10504 goto unknown;
10505
10506 default:
10507 goto unknown;
10508 }
10509 }
10510
10511 goto unknown;
10512
10513 case 's':
10514 if (name[4] == 'e' &&
10515 name[5] == 'r' &&
10516 name[6] == 'v' &&
10517 name[7] == 'b' &&
10518 name[8] == 'y')
10519 {
10520 switch (name[9])
10521 {
10522 case 'n':
10523 if (name[10] == 'a' &&
10524 name[11] == 'm' &&
10525 name[12] == 'e')
10526 { /* getservbyname */
10527 return -KEY_getservbyname;
10528 }
10529
10530 goto unknown;
10531
10532 case 'p':
10533 if (name[10] == 'o' &&
10534 name[11] == 'r' &&
10535 name[12] == 't')
10536 { /* getservbyport */
10537 return -KEY_getservbyport;
10538 }
10539
10540 goto unknown;
10541
10542 default:
10543 goto unknown;
10544 }
10545 }
10546
10547 goto unknown;
10548
10549 default:
10550 goto unknown;
10551 }
e2e1dd5a 10552 }
4c3bbe0f
MHM
10553
10554 goto unknown;
10555
10556 case 14: /* 1 tokens of length 14 */
10557 if (name[0] == 'g' &&
10558 name[1] == 'e' &&
10559 name[2] == 't' &&
10560 name[3] == 'p' &&
10561 name[4] == 'r' &&
10562 name[5] == 'o' &&
10563 name[6] == 't' &&
10564 name[7] == 'o' &&
10565 name[8] == 'b' &&
10566 name[9] == 'y' &&
10567 name[10] == 'n' &&
10568 name[11] == 'a' &&
10569 name[12] == 'm' &&
10570 name[13] == 'e')
10571 { /* getprotobyname */
10572 return -KEY_getprotobyname;
10573 }
10574
10575 goto unknown;
10576
10577 case 16: /* 1 tokens of length 16 */
10578 if (name[0] == 'g' &&
10579 name[1] == 'e' &&
10580 name[2] == 't' &&
10581 name[3] == 'p' &&
10582 name[4] == 'r' &&
10583 name[5] == 'o' &&
10584 name[6] == 't' &&
10585 name[7] == 'o' &&
10586 name[8] == 'b' &&
10587 name[9] == 'y' &&
10588 name[10] == 'n' &&
10589 name[11] == 'u' &&
10590 name[12] == 'm' &&
10591 name[13] == 'b' &&
10592 name[14] == 'e' &&
10593 name[15] == 'r')
10594 { /* getprotobynumber */
10595 return -KEY_getprotobynumber;
10596 }
10597
10598 goto unknown;
10599
10600 default:
10601 goto unknown;
e2e1dd5a 10602 }
4c3bbe0f
MHM
10603
10604unknown:
e2e1dd5a 10605 return 0;
a687059c
LW
10606}
10607
76e3520e 10608STATIC void
c94115d8 10609S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
a687059c 10610{
97aff369 10611 dVAR;
2f3197b3 10612
7918f24d
NC
10613 PERL_ARGS_ASSERT_CHECKCOMMA;
10614
d008e5eb 10615 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
10616 if (ckWARN(WARN_SYNTAX)) {
10617 int level = 1;
26ff0806 10618 const char *w;
d008e5eb
GS
10619 for (w = s+2; *w && level; w++) {
10620 if (*w == '(')
10621 ++level;
10622 else if (*w == ')')
10623 --level;
10624 }
888fea98
NC
10625 while (isSPACE(*w))
10626 ++w;
b1439985
RGS
10627 /* the list of chars below is for end of statements or
10628 * block / parens, boolean operators (&&, ||, //) and branch
10629 * constructs (or, and, if, until, unless, while, err, for).
10630 * Not a very solid hack... */
10631 if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
9014280d 10632 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 10633 "%s (...) interpreted as function",name);
d008e5eb 10634 }
2f3197b3 10635 }
3280af22 10636 while (s < PL_bufend && isSPACE(*s))
2f3197b3 10637 s++;
a687059c
LW
10638 if (*s == '(')
10639 s++;
3280af22 10640 while (s < PL_bufend && isSPACE(*s))
a687059c 10641 s++;
7e2040f0 10642 if (isIDFIRST_lazy_if(s,UTF)) {
26ff0806 10643 const char * const w = s++;
7e2040f0 10644 while (isALNUM_lazy_if(s,UTF))
a687059c 10645 s++;
3280af22 10646 while (s < PL_bufend && isSPACE(*s))
a687059c 10647 s++;
e929a76b 10648 if (*s == ',') {
c94115d8 10649 GV* gv;
5458a98a 10650 if (keyword(w, s - w, 0))
e929a76b 10651 return;
c94115d8
NC
10652
10653 gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
10654 if (gv && GvCVu(gv))
abbb3198 10655 return;
cea2e8a9 10656 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
10657 }
10658 }
10659}
10660
423cee85
JH
10661/* Either returns sv, or mortalizes sv and returns a new SV*.
10662 Best used as sv=new_constant(..., sv, ...).
10663 If s, pv are NULL, calls subroutine with one argument,
10664 and type is used with error messages only. */
10665
b3ac6de7 10666STATIC SV *
eb0d8d16
NC
10667S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
10668 SV *sv, SV *pv, const char *type, STRLEN typelen)
b3ac6de7 10669{
27da23d5 10670 dVAR; dSP;
890ce7af 10671 HV * const table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 10672 SV *res;
b3ac6de7
IZ
10673 SV **cvp;
10674 SV *cv, *typesv;
89e33a05 10675 const char *why1 = "", *why2 = "", *why3 = "";
4e553d73 10676
7918f24d
NC
10677 PERL_ARGS_ASSERT_NEW_CONSTANT;
10678
f0af216f 10679 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
10680 SV *msg;
10681
10edeb5d
JH
10682 why2 = (const char *)
10683 (strEQ(key,"charnames")
10684 ? "(possibly a missing \"use charnames ...\")"
10685 : "");
4e553d73 10686 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
10687 (type ? type: "undef"), why2);
10688
10689 /* This is convoluted and evil ("goto considered harmful")
10690 * but I do not understand the intricacies of all the different
10691 * failure modes of %^H in here. The goal here is to make
10692 * the most probable error message user-friendly. --jhi */
10693
10694 goto msgdone;
10695
423cee85 10696 report:
4e553d73 10697 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 10698 (type ? type: "undef"), why1, why2, why3);
41ab332f 10699 msgdone:
95a20fc0 10700 yyerror(SvPVX_const(msg));
423cee85
JH
10701 SvREFCNT_dec(msg);
10702 return sv;
10703 }
eb0d8d16 10704 cvp = hv_fetch(table, key, keylen, FALSE);
b3ac6de7 10705 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
10706 why1 = "$^H{";
10707 why2 = key;
f0af216f 10708 why3 = "} is not defined";
423cee85 10709 goto report;
b3ac6de7
IZ
10710 }
10711 sv_2mortal(sv); /* Parent created it permanently */
10712 cv = *cvp;
423cee85 10713 if (!pv && s)
59cd0e26 10714 pv = newSVpvn_flags(s, len, SVs_TEMP);
423cee85 10715 if (type && pv)
59cd0e26 10716 typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
b3ac6de7 10717 else
423cee85 10718 typesv = &PL_sv_undef;
4e553d73 10719
e788e7d3 10720 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
10721 ENTER ;
10722 SAVETMPS;
4e553d73 10723
423cee85 10724 PUSHMARK(SP) ;
a5845cb7 10725 EXTEND(sp, 3);
423cee85
JH
10726 if (pv)
10727 PUSHs(pv);
b3ac6de7 10728 PUSHs(sv);
423cee85
JH
10729 if (pv)
10730 PUSHs(typesv);
b3ac6de7 10731 PUTBACK;
423cee85 10732 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 10733
423cee85 10734 SPAGAIN ;
4e553d73 10735
423cee85 10736 /* Check the eval first */
9b0e499b 10737 if (!PL_in_eval && SvTRUE(ERRSV)) {
396482e1 10738 sv_catpvs(ERRSV, "Propagated");
8b6b16e7 10739 yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
e1f15930 10740 (void)POPs;
b37c2d43 10741 res = SvREFCNT_inc_simple(sv);
423cee85
JH
10742 }
10743 else {
10744 res = POPs;
b37c2d43 10745 SvREFCNT_inc_simple_void(res);
423cee85 10746 }
4e553d73 10747
423cee85
JH
10748 PUTBACK ;
10749 FREETMPS ;
10750 LEAVE ;
b3ac6de7 10751 POPSTACK;
4e553d73 10752
b3ac6de7 10753 if (!SvOK(res)) {
423cee85
JH
10754 why1 = "Call to &{$^H{";
10755 why2 = key;
f0af216f 10756 why3 = "}} did not return a defined value";
423cee85
JH
10757 sv = res;
10758 goto report;
9b0e499b 10759 }
423cee85 10760
9b0e499b 10761 return res;
b3ac6de7 10762}
4e553d73 10763
d0a148a6
NC
10764/* Returns a NUL terminated string, with the length of the string written to
10765 *slp
10766 */
76e3520e 10767STATIC char *
cea2e8a9 10768S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2 10769{
97aff369 10770 dVAR;
463ee0b2 10771 register char *d = dest;
890ce7af 10772 register char * const e = d + destlen - 3; /* two-character token, ending NUL */
7918f24d
NC
10773
10774 PERL_ARGS_ASSERT_SCAN_WORD;
10775
463ee0b2 10776 for (;;) {
8903cb82 10777 if (d >= e)
cea2e8a9 10778 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10779 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10780 *d++ = *s++;
c35e046a 10781 else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10782 *d++ = ':';
10783 *d++ = ':';
10784 s++;
10785 }
c35e046a 10786 else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
463ee0b2
LW
10787 *d++ = *s++;
10788 *d++ = *s++;
10789 }
fd400ab9 10790 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10791 char *t = s + UTF8SKIP(s);
c35e046a 10792 size_t len;
fd400ab9 10793 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3 10794 t += UTF8SKIP(t);
c35e046a
AL
10795 len = t - s;
10796 if (d + len > e)
cea2e8a9 10797 Perl_croak(aTHX_ ident_too_long);
c35e046a
AL
10798 Copy(s, d, len, char);
10799 d += len;
a0ed51b3
LW
10800 s = t;
10801 }
463ee0b2
LW
10802 else {
10803 *d = '\0';
10804 *slp = d - dest;
10805 return s;
e929a76b 10806 }
378cc40b
LW
10807 }
10808}
10809
76e3520e 10810STATIC char *
f54cb97a 10811S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b 10812{
97aff369 10813 dVAR;
6136c704 10814 char *bracket = NULL;
748a9306 10815 char funny = *s++;
6136c704
AL
10816 register char *d = dest;
10817 register char * const e = d + destlen + 3; /* two-character token, ending NUL */
378cc40b 10818
7918f24d
NC
10819 PERL_ARGS_ASSERT_SCAN_IDENT;
10820
a0d0e21e 10821 if (isSPACE(*s))
29595ff2 10822 s = PEEKSPACE(s);
de3bb511 10823 if (isDIGIT(*s)) {
8903cb82 10824 while (isDIGIT(*s)) {
10825 if (d >= e)
cea2e8a9 10826 Perl_croak(aTHX_ ident_too_long);
378cc40b 10827 *d++ = *s++;
8903cb82 10828 }
378cc40b
LW
10829 }
10830 else {
463ee0b2 10831 for (;;) {
8903cb82 10832 if (d >= e)
cea2e8a9 10833 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10834 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10835 *d++ = *s++;
7e2040f0 10836 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10837 *d++ = ':';
10838 *d++ = ':';
10839 s++;
10840 }
a0d0e21e 10841 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
10842 *d++ = *s++;
10843 *d++ = *s++;
10844 }
fd400ab9 10845 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10846 char *t = s + UTF8SKIP(s);
fd400ab9 10847 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
10848 t += UTF8SKIP(t);
10849 if (d + (t - s) > e)
cea2e8a9 10850 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
10851 Copy(s, d, t - s, char);
10852 d += t - s;
10853 s = t;
10854 }
463ee0b2
LW
10855 else
10856 break;
10857 }
378cc40b
LW
10858 }
10859 *d = '\0';
10860 d = dest;
79072805 10861 if (*d) {
3280af22
NIS
10862 if (PL_lex_state != LEX_NORMAL)
10863 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 10864 return s;
378cc40b 10865 }
748a9306 10866 if (*s == '$' && s[1] &&
3792a11b 10867 (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
5cd24f17 10868 {
4810e5ec 10869 return s;
5cd24f17 10870 }
79072805
LW
10871 if (*s == '{') {
10872 bracket = s;
10873 s++;
10874 }
10875 else if (ck_uni)
10876 check_uni();
93a17b20 10877 if (s < send)
79072805
LW
10878 *d = *s++;
10879 d[1] = '\0';
2b92dfce 10880 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 10881 *d = toCTRL(*s);
10882 s++;
de3bb511 10883 }
79072805 10884 if (bracket) {
748a9306 10885 if (isSPACE(s[-1])) {
fa83b5b6 10886 while (s < send) {
f54cb97a 10887 const char ch = *s++;
bf4acbe4 10888 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 10889 *d = ch;
10890 break;
10891 }
10892 }
748a9306 10893 }
7e2040f0 10894 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 10895 d++;
a0ed51b3 10896 if (UTF) {
6136c704
AL
10897 char *end = s;
10898 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
10899 end += UTF8SKIP(end);
10900 while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
10901 end += UTF8SKIP(end);
a0ed51b3 10902 }
6136c704
AL
10903 Copy(s, d, end - s, char);
10904 d += end - s;
10905 s = end;
a0ed51b3
LW
10906 }
10907 else {
2b92dfce 10908 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 10909 *d++ = *s++;
2b92dfce 10910 if (d >= e)
cea2e8a9 10911 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 10912 }
79072805 10913 *d = '\0';
c35e046a
AL
10914 while (s < send && SPACE_OR_TAB(*s))
10915 s++;
ff68c719 10916 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
5458a98a 10917 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
10edeb5d
JH
10918 const char * const brack =
10919 (const char *)
10920 ((*s == '[') ? "[...]" : "{...}");
9014280d 10921 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 10922 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
10923 funny, dest, brack, funny, dest, brack);
10924 }
79072805 10925 bracket++;
a0be28da 10926 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
10927 return s;
10928 }
4e553d73
NIS
10929 }
10930 /* Handle extended ${^Foo} variables
2b92dfce
GS
10931 * 1999-02-27 mjd-perl-patch@plover.com */
10932 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
10933 && isALNUM(*s))
10934 {
10935 d++;
10936 while (isALNUM(*s) && d < e) {
10937 *d++ = *s++;
10938 }
10939 if (d >= e)
cea2e8a9 10940 Perl_croak(aTHX_ ident_too_long);
2b92dfce 10941 *d = '\0';
79072805
LW
10942 }
10943 if (*s == '}') {
10944 s++;
7df0d042 10945 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 10946 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
10947 PL_expect = XREF;
10948 }
d008e5eb 10949 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 10950 if (ckWARN(WARN_AMBIGUOUS) &&
780a5241
NC
10951 (keyword(dest, d - dest, 0)
10952 || get_cvn_flags(dest, d - dest, 0)))
d008e5eb 10953 {
c35e046a
AL
10954 if (funny == '#')
10955 funny = '@';
9014280d 10956 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
10957 "Ambiguous use of %c{%s} resolved to %c%s",
10958 funny, dest, funny, dest);
10959 }
10960 }
79072805
LW
10961 }
10962 else {
10963 s = bracket; /* let the parser handle it */
93a17b20 10964 *dest = '\0';
79072805
LW
10965 }
10966 }
3280af22
NIS
10967 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
10968 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
10969 return s;
10970}
10971
cea2e8a9 10972void
2b36a5a0 10973Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 10974{
7918f24d
NC
10975 PERL_ARGS_ASSERT_PMFLAG;
10976
96a5add6 10977 PERL_UNUSED_CONTEXT;
cde0cee5 10978 if (ch<256) {
15f169a1 10979 const char c = (char)ch;
cde0cee5
YO
10980 switch (c) {
10981 CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl);
a20207d7
YO
10982 case GLOBAL_PAT_MOD: *pmfl |= PMf_GLOBAL; break;
10983 case CONTINUE_PAT_MOD: *pmfl |= PMf_CONTINUE; break;
10984 case ONCE_PAT_MOD: *pmfl |= PMf_KEEP; break;
10985 case KEEPCOPY_PAT_MOD: *pmfl |= PMf_KEEPCOPY; break;
cde0cee5
YO
10986 }
10987 }
a0d0e21e 10988}
378cc40b 10989
76e3520e 10990STATIC char *
cea2e8a9 10991S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 10992{
97aff369 10993 dVAR;
79072805 10994 PMOP *pm;
5db06880 10995 char *s = scan_str(start,!!PL_madskills,FALSE);
10edeb5d 10996 const char * const valid_flags =
a20207d7 10997 (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
5db06880
NC
10998#ifdef PERL_MAD
10999 char *modstart;
11000#endif
11001
7918f24d 11002 PERL_ARGS_ASSERT_SCAN_PAT;
378cc40b 11003
25c09cbf 11004 if (!s) {
6136c704 11005 const char * const delimiter = skipspace(start);
10edeb5d
JH
11006 Perl_croak(aTHX_
11007 (const char *)
11008 (*delimiter == '?'
11009 ? "Search pattern not terminated or ternary operator parsed as search pattern"
11010 : "Search pattern not terminated" ));
25c09cbf 11011 }
bbce6d69 11012
8782bef2 11013 pm = (PMOP*)newPMOP(type, 0);
ad639bfb
NC
11014 if (PL_multi_open == '?') {
11015 /* This is the only point in the code that sets PMf_ONCE: */
79072805 11016 pm->op_pmflags |= PMf_ONCE;
ad639bfb
NC
11017
11018 /* Hence it's safe to do this bit of PMOP book-keeping here, which
11019 allows us to restrict the list needed by reset to just the ??
11020 matches. */
11021 assert(type != OP_TRANS);
11022 if (PL_curstash) {
daba3364 11023 MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
ad639bfb
NC
11024 U32 elements;
11025 if (!mg) {
daba3364 11026 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
ad639bfb
NC
11027 0);
11028 }
11029 elements = mg->mg_len / sizeof(PMOP**);
11030 Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
11031 ((PMOP**)mg->mg_ptr) [elements++] = pm;
11032 mg->mg_len = elements * sizeof(PMOP**);
11033 PmopSTASH_set(pm,PL_curstash);
11034 }
11035 }
5db06880
NC
11036#ifdef PERL_MAD
11037 modstart = s;
11038#endif
6136c704
AL
11039 while (*s && strchr(valid_flags, *s))
11040 pmflag(&pm->op_pmflags,*s++);
5db06880
NC
11041#ifdef PERL_MAD
11042 if (PL_madskills && modstart != s) {
11043 SV* tmptoken = newSVpvn(modstart, s - modstart);
11044 append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
11045 }
11046#endif
4ac733c9 11047 /* issue a warning if /c is specified,but /g is not */
041457d9
DM
11048 if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
11049 && ckWARN(WARN_REGEXP))
4ac733c9 11050 {
a20207d7
YO
11051 Perl_warner(aTHX_ packWARN(WARN_REGEXP),
11052 "Use of /c modifier is meaningless without /g" );
4ac733c9
MJD
11053 }
11054
3280af22 11055 PL_lex_op = (OP*)pm;
6154021b 11056 pl_yylval.ival = OP_MATCH;
378cc40b
LW
11057 return s;
11058}
11059
76e3520e 11060STATIC char *
cea2e8a9 11061S_scan_subst(pTHX_ char *start)
79072805 11062{
27da23d5 11063 dVAR;
a0d0e21e 11064 register char *s;
79072805 11065 register PMOP *pm;
4fdae800 11066 I32 first_start;
79072805 11067 I32 es = 0;
5db06880
NC
11068#ifdef PERL_MAD
11069 char *modstart;
11070#endif
79072805 11071
7918f24d
NC
11072 PERL_ARGS_ASSERT_SCAN_SUBST;
11073
6154021b 11074 pl_yylval.ival = OP_NULL;
79072805 11075
5db06880 11076 s = scan_str(start,!!PL_madskills,FALSE);
79072805 11077
37fd879b 11078 if (!s)
cea2e8a9 11079 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 11080
3280af22 11081 if (s[-1] == PL_multi_open)
79072805 11082 s--;
5db06880
NC
11083#ifdef PERL_MAD
11084 if (PL_madskills) {
cd81e915
NC
11085 CURMAD('q', PL_thisopen);
11086 CURMAD('_', PL_thiswhite);
11087 CURMAD('E', PL_thisstuff);
11088 CURMAD('Q', PL_thisclose);
11089 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
11090 }
11091#endif
79072805 11092
3280af22 11093 first_start = PL_multi_start;
5db06880 11094 s = scan_str(s,!!PL_madskills,FALSE);
79072805 11095 if (!s) {
37fd879b 11096 if (PL_lex_stuff) {
3280af22 11097 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 11098 PL_lex_stuff = NULL;
37fd879b 11099 }
cea2e8a9 11100 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 11101 }
3280af22 11102 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 11103
79072805 11104 pm = (PMOP*)newPMOP(OP_SUBST, 0);
5db06880
NC
11105
11106#ifdef PERL_MAD
11107 if (PL_madskills) {
cd81e915
NC
11108 CURMAD('z', PL_thisopen);
11109 CURMAD('R', PL_thisstuff);
11110 CURMAD('Z', PL_thisclose);
5db06880
NC
11111 }
11112 modstart = s;
11113#endif
11114
48c036b1 11115 while (*s) {
a20207d7 11116 if (*s == EXEC_PAT_MOD) {
a687059c 11117 s++;
2f3197b3 11118 es++;
a687059c 11119 }
a20207d7 11120 else if (strchr(S_PAT_MODS, *s))
a0d0e21e 11121 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
11122 else
11123 break;
378cc40b 11124 }
79072805 11125
5db06880
NC
11126#ifdef PERL_MAD
11127 if (PL_madskills) {
11128 if (modstart != s)
11129 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
11130 append_madprops(PL_thismad, (OP*)pm, 0);
11131 PL_thismad = 0;
5db06880
NC
11132 }
11133#endif
0bd48802
AL
11134 if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP)) {
11135 Perl_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
4ac733c9
MJD
11136 }
11137
79072805 11138 if (es) {
6136c704
AL
11139 SV * const repl = newSVpvs("");
11140
0244c3a4
GS
11141 PL_sublex_info.super_bufptr = s;
11142 PL_sublex_info.super_bufend = PL_bufend;
11143 PL_multi_end = 0;
79072805 11144 pm->op_pmflags |= PMf_EVAL;
a5849ce5
NC
11145 while (es-- > 0) {
11146 if (es)
11147 sv_catpvs(repl, "eval ");
11148 else
11149 sv_catpvs(repl, "do ");
11150 }
6f43d98f 11151 sv_catpvs(repl, "{");
3280af22 11152 sv_catsv(repl, PL_lex_repl);
9badc361
RGS
11153 if (strchr(SvPVX(PL_lex_repl), '#'))
11154 sv_catpvs(repl, "\n");
11155 sv_catpvs(repl, "}");
25da4f38 11156 SvEVALED_on(repl);
3280af22
NIS
11157 SvREFCNT_dec(PL_lex_repl);
11158 PL_lex_repl = repl;
378cc40b 11159 }
79072805 11160
3280af22 11161 PL_lex_op = (OP*)pm;
6154021b 11162 pl_yylval.ival = OP_SUBST;
378cc40b
LW
11163 return s;
11164}
11165
76e3520e 11166STATIC char *
cea2e8a9 11167S_scan_trans(pTHX_ char *start)
378cc40b 11168{
97aff369 11169 dVAR;
a0d0e21e 11170 register char* s;
11343788 11171 OP *o;
79072805 11172 short *tbl;
b84c11c8
NC
11173 U8 squash;
11174 U8 del;
11175 U8 complement;
5db06880
NC
11176#ifdef PERL_MAD
11177 char *modstart;
11178#endif
79072805 11179
7918f24d
NC
11180 PERL_ARGS_ASSERT_SCAN_TRANS;
11181
6154021b 11182 pl_yylval.ival = OP_NULL;
79072805 11183
5db06880 11184 s = scan_str(start,!!PL_madskills,FALSE);
37fd879b 11185 if (!s)
cea2e8a9 11186 Perl_croak(aTHX_ "Transliteration pattern not terminated");
5db06880 11187
3280af22 11188 if (s[-1] == PL_multi_open)
2f3197b3 11189 s--;
5db06880
NC
11190#ifdef PERL_MAD
11191 if (PL_madskills) {
cd81e915
NC
11192 CURMAD('q', PL_thisopen);
11193 CURMAD('_', PL_thiswhite);
11194 CURMAD('E', PL_thisstuff);
11195 CURMAD('Q', PL_thisclose);
11196 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
11197 }
11198#endif
2f3197b3 11199
5db06880 11200 s = scan_str(s,!!PL_madskills,FALSE);
79072805 11201 if (!s) {
37fd879b 11202 if (PL_lex_stuff) {
3280af22 11203 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 11204 PL_lex_stuff = NULL;
37fd879b 11205 }
cea2e8a9 11206 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 11207 }
5db06880 11208 if (PL_madskills) {
cd81e915
NC
11209 CURMAD('z', PL_thisopen);
11210 CURMAD('R', PL_thisstuff);
11211 CURMAD('Z', PL_thisclose);
5db06880 11212 }
79072805 11213
a0ed51b3 11214 complement = del = squash = 0;
5db06880
NC
11215#ifdef PERL_MAD
11216 modstart = s;
11217#endif
7a1e2023
NC
11218 while (1) {
11219 switch (*s) {
11220 case 'c':
79072805 11221 complement = OPpTRANS_COMPLEMENT;
7a1e2023
NC
11222 break;
11223 case 'd':
a0ed51b3 11224 del = OPpTRANS_DELETE;
7a1e2023
NC
11225 break;
11226 case 's':
79072805 11227 squash = OPpTRANS_SQUASH;
7a1e2023
NC
11228 break;
11229 default:
11230 goto no_more;
11231 }
395c3793
LW
11232 s++;
11233 }
7a1e2023 11234 no_more:
8973db79 11235
aa1f7c5b 11236 tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
8973db79 11237 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
11238 o->op_private &= ~OPpTRANS_ALL;
11239 o->op_private |= del|squash|complement|
7948272d
NIS
11240 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
11241 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 11242
3280af22 11243 PL_lex_op = o;
6154021b 11244 pl_yylval.ival = OP_TRANS;
5db06880
NC
11245
11246#ifdef PERL_MAD
11247 if (PL_madskills) {
11248 if (modstart != s)
11249 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
11250 append_madprops(PL_thismad, o, 0);
11251 PL_thismad = 0;
5db06880
NC
11252 }
11253#endif
11254
79072805
LW
11255 return s;
11256}
11257
76e3520e 11258STATIC char *
cea2e8a9 11259S_scan_heredoc(pTHX_ register char *s)
79072805 11260{
97aff369 11261 dVAR;
79072805
LW
11262 SV *herewas;
11263 I32 op_type = OP_SCALAR;
11264 I32 len;
11265 SV *tmpstr;
11266 char term;
73d840c0 11267 const char *found_newline;
79072805 11268 register char *d;
fc36a67e 11269 register char *e;
4633a7c4 11270 char *peek;
f54cb97a 11271 const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
5db06880
NC
11272#ifdef PERL_MAD
11273 I32 stuffstart = s - SvPVX(PL_linestr);
11274 char *tstart;
11275
cd81e915 11276 PL_realtokenstart = -1;
5db06880 11277#endif
79072805 11278
7918f24d
NC
11279 PERL_ARGS_ASSERT_SCAN_HEREDOC;
11280
79072805 11281 s += 2;
3280af22
NIS
11282 d = PL_tokenbuf;
11283 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 11284 if (!outer)
79072805 11285 *d++ = '\n';
c35e046a
AL
11286 peek = s;
11287 while (SPACE_OR_TAB(*peek))
11288 peek++;
3792a11b 11289 if (*peek == '`' || *peek == '\'' || *peek =='"') {
4633a7c4 11290 s = peek;
79072805 11291 term = *s++;
3280af22 11292 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 11293 d += len;
3280af22 11294 if (s < PL_bufend)
79072805 11295 s++;
79072805
LW
11296 }
11297 else {
11298 if (*s == '\\')
11299 s++, term = '\'';
11300 else
11301 term = '"';
7e2040f0 11302 if (!isALNUM_lazy_if(s,UTF))
12bcd1a6 11303 deprecate_old("bare << to mean <<\"\"");
7e2040f0 11304 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 11305 if (d < e)
11306 *d++ = *s;
11307 }
11308 }
3280af22 11309 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 11310 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
11311 *d++ = '\n';
11312 *d = '\0';
3280af22 11313 len = d - PL_tokenbuf;
5db06880
NC
11314
11315#ifdef PERL_MAD
11316 if (PL_madskills) {
11317 tstart = PL_tokenbuf + !outer;
cd81e915 11318 PL_thisclose = newSVpvn(tstart, len - !outer);
5db06880 11319 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915 11320 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11321 stuffstart = s - SvPVX(PL_linestr);
11322 }
11323#endif
6a27c188 11324#ifndef PERL_STRICT_CR
f63a84b2
LW
11325 d = strchr(s, '\r');
11326 if (d) {
b464bac0 11327 char * const olds = s;
f63a84b2 11328 s = d;
3280af22 11329 while (s < PL_bufend) {
f63a84b2
LW
11330 if (*s == '\r') {
11331 *d++ = '\n';
11332 if (*++s == '\n')
11333 s++;
11334 }
11335 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
11336 *d++ = *s++;
11337 s++;
11338 }
11339 else
11340 *d++ = *s++;
11341 }
11342 *d = '\0';
3280af22 11343 PL_bufend = d;
95a20fc0 11344 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2
LW
11345 s = olds;
11346 }
11347#endif
5db06880
NC
11348#ifdef PERL_MAD
11349 found_newline = 0;
11350#endif
10edeb5d 11351 if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
73d840c0
AL
11352 herewas = newSVpvn(s,PL_bufend-s);
11353 }
11354 else {
5db06880
NC
11355#ifdef PERL_MAD
11356 herewas = newSVpvn(s-1,found_newline-s+1);
11357#else
73d840c0
AL
11358 s--;
11359 herewas = newSVpvn(s,found_newline-s);
5db06880 11360#endif
73d840c0 11361 }
5db06880
NC
11362#ifdef PERL_MAD
11363 if (PL_madskills) {
11364 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11365 if (PL_thisstuff)
11366 sv_catpvn(PL_thisstuff, tstart, s - tstart);
5db06880 11367 else
cd81e915 11368 PL_thisstuff = newSVpvn(tstart, s - tstart);
5db06880
NC
11369 }
11370#endif
79072805 11371 s += SvCUR(herewas);
748a9306 11372
5db06880
NC
11373#ifdef PERL_MAD
11374 stuffstart = s - SvPVX(PL_linestr);
11375
11376 if (found_newline)
11377 s--;
11378#endif
11379
7d0a29fe
NC
11380 tmpstr = newSV_type(SVt_PVIV);
11381 SvGROW(tmpstr, 80);
748a9306 11382 if (term == '\'') {
79072805 11383 op_type = OP_CONST;
45977657 11384 SvIV_set(tmpstr, -1);
748a9306
LW
11385 }
11386 else if (term == '`') {
79072805 11387 op_type = OP_BACKTICK;
45977657 11388 SvIV_set(tmpstr, '\\');
748a9306 11389 }
79072805
LW
11390
11391 CLINE;
57843af0 11392 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
11393 PL_multi_open = PL_multi_close = '<';
11394 term = *PL_tokenbuf;
0244c3a4 11395 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6136c704
AL
11396 char * const bufptr = PL_sublex_info.super_bufptr;
11397 char * const bufend = PL_sublex_info.super_bufend;
b464bac0 11398 char * const olds = s - SvCUR(herewas);
0244c3a4
GS
11399 s = strchr(bufptr, '\n');
11400 if (!s)
11401 s = bufend;
11402 d = s;
11403 while (s < bufend &&
11404 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
11405 if (*s++ == '\n')
57843af0 11406 CopLINE_inc(PL_curcop);
0244c3a4
GS
11407 }
11408 if (s >= bufend) {
eb160463 11409 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
11410 missingterm(PL_tokenbuf);
11411 }
11412 sv_setpvn(herewas,bufptr,d-bufptr+1);
11413 sv_setpvn(tmpstr,d+1,s-d);
11414 s += len - 1;
11415 sv_catpvn(herewas,s,bufend-s);
95a20fc0 11416 Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
0244c3a4
GS
11417
11418 s = olds;
11419 goto retval;
11420 }
11421 else if (!outer) {
79072805 11422 d = s;
3280af22
NIS
11423 while (s < PL_bufend &&
11424 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 11425 if (*s++ == '\n')
57843af0 11426 CopLINE_inc(PL_curcop);
79072805 11427 }
3280af22 11428 if (s >= PL_bufend) {
eb160463 11429 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11430 missingterm(PL_tokenbuf);
79072805
LW
11431 }
11432 sv_setpvn(tmpstr,d+1,s-d);
5db06880
NC
11433#ifdef PERL_MAD
11434 if (PL_madskills) {
cd81e915
NC
11435 if (PL_thisstuff)
11436 sv_catpvn(PL_thisstuff, d + 1, s - d);
5db06880 11437 else
cd81e915 11438 PL_thisstuff = newSVpvn(d + 1, s - d);
5db06880
NC
11439 stuffstart = s - SvPVX(PL_linestr);
11440 }
11441#endif
79072805 11442 s += len - 1;
57843af0 11443 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 11444
3280af22
NIS
11445 sv_catpvn(herewas,s,PL_bufend-s);
11446 sv_setsv(PL_linestr,herewas);
11447 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
11448 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11449 PL_last_lop = PL_last_uni = NULL;
79072805
LW
11450 }
11451 else
76f68e9b 11452 sv_setpvs(tmpstr,""); /* avoid "uninitialized" warning */
3280af22 11453 while (s >= PL_bufend) { /* multiple line string? */
5db06880
NC
11454#ifdef PERL_MAD
11455 if (PL_madskills) {
11456 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11457 if (PL_thisstuff)
11458 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11459 else
cd81e915 11460 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11461 }
11462#endif
fd2d0953 11463 if (!outer ||
3280af22 11464 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
eb160463 11465 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11466 missingterm(PL_tokenbuf);
79072805 11467 }
5db06880
NC
11468#ifdef PERL_MAD
11469 stuffstart = s - SvPVX(PL_linestr);
11470#endif
57843af0 11471 CopLINE_inc(PL_curcop);
3280af22 11472 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11473 PL_last_lop = PL_last_uni = NULL;
6a27c188 11474#ifndef PERL_STRICT_CR
3280af22 11475 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
11476 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
11477 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 11478 {
3280af22
NIS
11479 PL_bufend[-2] = '\n';
11480 PL_bufend--;
95a20fc0 11481 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2 11482 }
3280af22
NIS
11483 else if (PL_bufend[-1] == '\r')
11484 PL_bufend[-1] = '\n';
f63a84b2 11485 }
3280af22
NIS
11486 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
11487 PL_bufend[-1] = '\n';
f63a84b2 11488#endif
65269a95 11489 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
5fa550fb 11490 update_debugger_info(PL_linestr, NULL, 0);
3280af22 11491 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
95a20fc0 11492 STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
1de9afcd 11493 *(SvPVX(PL_linestr) + off ) = ' ';
3280af22
NIS
11494 sv_catsv(PL_linestr,herewas);
11495 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1de9afcd 11496 s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
79072805
LW
11497 }
11498 else {
3280af22
NIS
11499 s = PL_bufend;
11500 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
11501 }
11502 }
79072805 11503 s++;
0244c3a4 11504retval:
57843af0 11505 PL_multi_end = CopLINE(PL_curcop);
79072805 11506 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
1da4ca5f 11507 SvPV_shrink_to_cur(tmpstr);
79072805 11508 }
8990e307 11509 SvREFCNT_dec(herewas);
2f31ce75 11510 if (!IN_BYTES) {
95a20fc0 11511 if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
2f31ce75
JH
11512 SvUTF8_on(tmpstr);
11513 else if (PL_encoding)
11514 sv_recode_to_utf8(tmpstr, PL_encoding);
11515 }
3280af22 11516 PL_lex_stuff = tmpstr;
6154021b 11517 pl_yylval.ival = op_type;
79072805
LW
11518 return s;
11519}
11520
02aa26ce
NT
11521/* scan_inputsymbol
11522 takes: current position in input buffer
11523 returns: new position in input buffer
6154021b 11524 side-effects: pl_yylval and lex_op are set.
02aa26ce
NT
11525
11526 This code handles:
11527
11528 <> read from ARGV
11529 <FH> read from filehandle
11530 <pkg::FH> read from package qualified filehandle
11531 <pkg'FH> read from package qualified filehandle
11532 <$fh> read from filehandle in $fh
11533 <*.h> filename glob
11534
11535*/
11536
76e3520e 11537STATIC char *
cea2e8a9 11538S_scan_inputsymbol(pTHX_ char *start)
79072805 11539{
97aff369 11540 dVAR;
02aa26ce 11541 register char *s = start; /* current position in buffer */
1b420867 11542 char *end;
79072805 11543 I32 len;
6136c704
AL
11544 char *d = PL_tokenbuf; /* start of temp holding space */
11545 const char * const e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
11546
7918f24d
NC
11547 PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
11548
1b420867
GS
11549 end = strchr(s, '\n');
11550 if (!end)
11551 end = PL_bufend;
11552 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
11553
11554 /* die if we didn't have space for the contents of the <>,
1b420867 11555 or if it didn't end, or if we see a newline
02aa26ce
NT
11556 */
11557
bb7a0f54 11558 if (len >= (I32)sizeof PL_tokenbuf)
cea2e8a9 11559 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 11560 if (s >= end)
cea2e8a9 11561 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 11562
fc36a67e 11563 s++;
02aa26ce
NT
11564
11565 /* check for <$fh>
11566 Remember, only scalar variables are interpreted as filehandles by
11567 this code. Anything more complex (e.g., <$fh{$num}>) will be
11568 treated as a glob() call.
11569 This code makes use of the fact that except for the $ at the front,
11570 a scalar variable and a filehandle look the same.
11571 */
4633a7c4 11572 if (*d == '$' && d[1]) d++;
02aa26ce
NT
11573
11574 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 11575 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 11576 d++;
02aa26ce
NT
11577
11578 /* If we've tried to read what we allow filehandles to look like, and
11579 there's still text left, then it must be a glob() and not a getline.
11580 Use scan_str to pull out the stuff between the <> and treat it
11581 as nothing more than a string.
11582 */
11583
3280af22 11584 if (d - PL_tokenbuf != len) {
6154021b 11585 pl_yylval.ival = OP_GLOB;
5db06880 11586 s = scan_str(start,!!PL_madskills,FALSE);
79072805 11587 if (!s)
cea2e8a9 11588 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
11589 return s;
11590 }
395c3793 11591 else {
9b3023bc 11592 bool readline_overriden = FALSE;
6136c704 11593 GV *gv_readline;
9b3023bc 11594 GV **gvp;
02aa26ce 11595 /* we're in a filehandle read situation */
3280af22 11596 d = PL_tokenbuf;
02aa26ce
NT
11597
11598 /* turn <> into <ARGV> */
79072805 11599 if (!len)
689badd5 11600 Copy("ARGV",d,5,char);
02aa26ce 11601
9b3023bc 11602 /* Check whether readline() is overriden */
fafc274c 11603 gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
6136c704 11604 if ((gv_readline
ba979b31 11605 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 11606 ||
017a3ce5 11607 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
9e0d86f8 11608 && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
ba979b31 11609 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
11610 readline_overriden = TRUE;
11611
02aa26ce
NT
11612 /* if <$fh>, create the ops to turn the variable into a
11613 filehandle
11614 */
79072805 11615 if (*d == '$') {
02aa26ce
NT
11616 /* try to find it in the pad for this block, otherwise find
11617 add symbol table ops
11618 */
bbd11bfc
AL
11619 const PADOFFSET tmp = pad_findmy(d);
11620 if (tmp != NOT_IN_PAD) {
00b1698f 11621 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
6136c704
AL
11622 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
11623 HEK * const stashname = HvNAME_HEK(stash);
11624 SV * const sym = sv_2mortal(newSVhek(stashname));
396482e1 11625 sv_catpvs(sym, "::");
f558d5af
JH
11626 sv_catpv(sym, d+1);
11627 d = SvPVX(sym);
11628 goto intro_sym;
11629 }
11630 else {
6136c704 11631 OP * const o = newOP(OP_PADSV, 0);
f558d5af 11632 o->op_targ = tmp;
9b3023bc
RGS
11633 PL_lex_op = readline_overriden
11634 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11635 append_elem(OP_LIST, o,
11636 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
11637 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 11638 }
a0d0e21e
LW
11639 }
11640 else {
f558d5af
JH
11641 GV *gv;
11642 ++d;
11643intro_sym:
11644 gv = gv_fetchpv(d,
11645 (PL_in_eval
11646 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 11647 : GV_ADDMULTI),
f558d5af 11648 SVt_PV);
9b3023bc
RGS
11649 PL_lex_op = readline_overriden
11650 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11651 append_elem(OP_LIST,
11652 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
11653 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11654 : (OP*)newUNOP(OP_READLINE, 0,
11655 newUNOP(OP_RV2SV, 0,
11656 newGVOP(OP_GV, 0, gv)));
a0d0e21e 11657 }
7c6fadd6
RGS
11658 if (!readline_overriden)
11659 PL_lex_op->op_flags |= OPf_SPECIAL;
6154021b
RGS
11660 /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
11661 pl_yylval.ival = OP_NULL;
79072805 11662 }
02aa26ce
NT
11663
11664 /* If it's none of the above, it must be a literal filehandle
11665 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 11666 else {
6136c704 11667 GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
9b3023bc
RGS
11668 PL_lex_op = readline_overriden
11669 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11670 append_elem(OP_LIST,
11671 newGVOP(OP_GV, 0, gv),
11672 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11673 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
6154021b 11674 pl_yylval.ival = OP_NULL;
79072805
LW
11675 }
11676 }
02aa26ce 11677
79072805
LW
11678 return s;
11679}
11680
02aa26ce
NT
11681
11682/* scan_str
11683 takes: start position in buffer
09bef843
SB
11684 keep_quoted preserve \ on the embedded delimiter(s)
11685 keep_delims preserve the delimiters around the string
02aa26ce
NT
11686 returns: position to continue reading from buffer
11687 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
11688 updates the read buffer.
11689
11690 This subroutine pulls a string out of the input. It is called for:
11691 q single quotes q(literal text)
11692 ' single quotes 'literal text'
11693 qq double quotes qq(interpolate $here please)
11694 " double quotes "interpolate $here please"
11695 qx backticks qx(/bin/ls -l)
11696 ` backticks `/bin/ls -l`
11697 qw quote words @EXPORT_OK = qw( func() $spam )
11698 m// regexp match m/this/
11699 s/// regexp substitute s/this/that/
11700 tr/// string transliterate tr/this/that/
11701 y/// string transliterate y/this/that/
11702 ($*@) sub prototypes sub foo ($)
09bef843 11703 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
11704 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
11705
11706 In most of these cases (all but <>, patterns and transliterate)
11707 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
11708 calls scan_str(). s/// makes yylex() call scan_subst() which calls
11709 scan_str(). tr/// and y/// make yylex() call scan_trans() which
11710 calls scan_str().
4e553d73 11711
02aa26ce
NT
11712 It skips whitespace before the string starts, and treats the first
11713 character as the delimiter. If the delimiter is one of ([{< then
11714 the corresponding "close" character )]}> is used as the closing
11715 delimiter. It allows quoting of delimiters, and if the string has
11716 balanced delimiters ([{<>}]) it allows nesting.
11717
37fd879b
HS
11718 On success, the SV with the resulting string is put into lex_stuff or,
11719 if that is already non-NULL, into lex_repl. The second case occurs only
11720 when parsing the RHS of the special constructs s/// and tr/// (y///).
11721 For convenience, the terminating delimiter character is stuffed into
11722 SvIVX of the SV.
02aa26ce
NT
11723*/
11724
76e3520e 11725STATIC char *
09bef843 11726S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 11727{
97aff369 11728 dVAR;
02aa26ce 11729 SV *sv; /* scalar value: string */
d3fcec1f 11730 const char *tmps; /* temp string, used for delimiter matching */
02aa26ce
NT
11731 register char *s = start; /* current position in the buffer */
11732 register char term; /* terminating character */
11733 register char *to; /* current position in the sv's data */
11734 I32 brackets = 1; /* bracket nesting level */
89491803 11735 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e 11736 I32 termcode; /* terminating char. code */
89ebb4a3 11737 U8 termstr[UTF8_MAXBYTES]; /* terminating string */
220e2d4e 11738 STRLEN termlen; /* length of terminating string */
0331ef07 11739 int last_off = 0; /* last position for nesting bracket */
5db06880
NC
11740#ifdef PERL_MAD
11741 int stuffstart;
11742 char *tstart;
11743#endif
02aa26ce 11744
7918f24d
NC
11745 PERL_ARGS_ASSERT_SCAN_STR;
11746
02aa26ce 11747 /* skip space before the delimiter */
29595ff2
NC
11748 if (isSPACE(*s)) {
11749 s = PEEKSPACE(s);
11750 }
02aa26ce 11751
5db06880 11752#ifdef PERL_MAD
cd81e915
NC
11753 if (PL_realtokenstart >= 0) {
11754 stuffstart = PL_realtokenstart;
11755 PL_realtokenstart = -1;
5db06880
NC
11756 }
11757 else
11758 stuffstart = start - SvPVX(PL_linestr);
11759#endif
02aa26ce 11760 /* mark where we are, in case we need to report errors */
79072805 11761 CLINE;
02aa26ce
NT
11762
11763 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 11764 term = *s;
220e2d4e
IH
11765 if (!UTF) {
11766 termcode = termstr[0] = term;
11767 termlen = 1;
11768 }
11769 else {
f3b9ce0f 11770 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
11771 Copy(s, termstr, termlen, U8);
11772 if (!UTF8_IS_INVARIANT(term))
11773 has_utf8 = TRUE;
11774 }
b1c7b182 11775
02aa26ce 11776 /* mark where we are */
57843af0 11777 PL_multi_start = CopLINE(PL_curcop);
3280af22 11778 PL_multi_open = term;
02aa26ce
NT
11779
11780 /* find corresponding closing delimiter */
93a17b20 11781 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
11782 termcode = termstr[0] = term = tmps[5];
11783
3280af22 11784 PL_multi_close = term;
79072805 11785
561b68a9
SH
11786 /* create a new SV to hold the contents. 79 is the SV's initial length.
11787 What a random number. */
7d0a29fe
NC
11788 sv = newSV_type(SVt_PVIV);
11789 SvGROW(sv, 80);
45977657 11790 SvIV_set(sv, termcode);
a0d0e21e 11791 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
11792
11793 /* move past delimiter and try to read a complete string */
09bef843 11794 if (keep_delims)
220e2d4e
IH
11795 sv_catpvn(sv, s, termlen);
11796 s += termlen;
5db06880
NC
11797#ifdef PERL_MAD
11798 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11799 if (!PL_thisopen && !keep_delims) {
11800 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11801 stuffstart = s - SvPVX(PL_linestr);
11802 }
11803#endif
93a17b20 11804 for (;;) {
220e2d4e
IH
11805 if (PL_encoding && !UTF) {
11806 bool cont = TRUE;
11807
11808 while (cont) {
95a20fc0 11809 int offset = s - SvPVX_const(PL_linestr);
66a1b24b 11810 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 11811 &offset, (char*)termstr, termlen);
6136c704
AL
11812 const char * const ns = SvPVX_const(PL_linestr) + offset;
11813 char * const svlast = SvEND(sv) - 1;
220e2d4e
IH
11814
11815 for (; s < ns; s++) {
11816 if (*s == '\n' && !PL_rsfp)
11817 CopLINE_inc(PL_curcop);
11818 }
11819 if (!found)
11820 goto read_more_line;
11821 else {
11822 /* handle quoted delimiters */
52327caf 11823 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
f54cb97a 11824 const char *t;
95a20fc0 11825 for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
220e2d4e
IH
11826 t--;
11827 if ((svlast-1 - t) % 2) {
11828 if (!keep_quoted) {
11829 *(svlast-1) = term;
11830 *svlast = '\0';
11831 SvCUR_set(sv, SvCUR(sv) - 1);
11832 }
11833 continue;
11834 }
11835 }
11836 if (PL_multi_open == PL_multi_close) {
11837 cont = FALSE;
11838 }
11839 else {
f54cb97a
AL
11840 const char *t;
11841 char *w;
0331ef07 11842 for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
220e2d4e
IH
11843 /* At here, all closes are "was quoted" one,
11844 so we don't check PL_multi_close. */
11845 if (*t == '\\') {
11846 if (!keep_quoted && *(t+1) == PL_multi_open)
11847 t++;
11848 else
11849 *w++ = *t++;
11850 }
11851 else if (*t == PL_multi_open)
11852 brackets++;
11853
11854 *w = *t;
11855 }
11856 if (w < t) {
11857 *w++ = term;
11858 *w = '\0';
95a20fc0 11859 SvCUR_set(sv, w - SvPVX_const(sv));
220e2d4e 11860 }
0331ef07 11861 last_off = w - SvPVX(sv);
220e2d4e
IH
11862 if (--brackets <= 0)
11863 cont = FALSE;
11864 }
11865 }
11866 }
11867 if (!keep_delims) {
11868 SvCUR_set(sv, SvCUR(sv) - 1);
11869 *SvEND(sv) = '\0';
11870 }
11871 break;
11872 }
11873
02aa26ce 11874 /* extend sv if need be */
3280af22 11875 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 11876 /* set 'to' to the next character in the sv's string */
463ee0b2 11877 to = SvPVX(sv)+SvCUR(sv);
09bef843 11878
02aa26ce 11879 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
11880 if (PL_multi_open == PL_multi_close) {
11881 for (; s < PL_bufend; s++,to++) {
02aa26ce 11882 /* embedded newlines increment the current line number */
3280af22 11883 if (*s == '\n' && !PL_rsfp)
57843af0 11884 CopLINE_inc(PL_curcop);
02aa26ce 11885 /* handle quoted delimiters */
3280af22 11886 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 11887 if (!keep_quoted && s[1] == term)
a0d0e21e 11888 s++;
02aa26ce 11889 /* any other quotes are simply copied straight through */
a0d0e21e
LW
11890 else
11891 *to++ = *s++;
11892 }
02aa26ce
NT
11893 /* terminate when run out of buffer (the for() condition), or
11894 have found the terminator */
220e2d4e
IH
11895 else if (*s == term) {
11896 if (termlen == 1)
11897 break;
f3b9ce0f 11898 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
11899 break;
11900 }
63cd0674 11901 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11902 has_utf8 = TRUE;
93a17b20
LW
11903 *to = *s;
11904 }
11905 }
02aa26ce
NT
11906
11907 /* if the terminator isn't the same as the start character (e.g.,
11908 matched brackets), we have to allow more in the quoting, and
11909 be prepared for nested brackets.
11910 */
93a17b20 11911 else {
02aa26ce 11912 /* read until we run out of string, or we find the terminator */
3280af22 11913 for (; s < PL_bufend; s++,to++) {
02aa26ce 11914 /* embedded newlines increment the line count */
3280af22 11915 if (*s == '\n' && !PL_rsfp)
57843af0 11916 CopLINE_inc(PL_curcop);
02aa26ce 11917 /* backslashes can escape the open or closing characters */
3280af22 11918 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
11919 if (!keep_quoted &&
11920 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
11921 s++;
11922 else
11923 *to++ = *s++;
11924 }
02aa26ce 11925 /* allow nested opens and closes */
3280af22 11926 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 11927 break;
3280af22 11928 else if (*s == PL_multi_open)
93a17b20 11929 brackets++;
63cd0674 11930 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11931 has_utf8 = TRUE;
93a17b20
LW
11932 *to = *s;
11933 }
11934 }
02aa26ce 11935 /* terminate the copied string and update the sv's end-of-string */
93a17b20 11936 *to = '\0';
95a20fc0 11937 SvCUR_set(sv, to - SvPVX_const(sv));
93a17b20 11938
02aa26ce
NT
11939 /*
11940 * this next chunk reads more into the buffer if we're not done yet
11941 */
11942
b1c7b182
GS
11943 if (s < PL_bufend)
11944 break; /* handle case where we are done yet :-) */
79072805 11945
6a27c188 11946#ifndef PERL_STRICT_CR
95a20fc0 11947 if (to - SvPVX_const(sv) >= 2) {
c6f14548
GS
11948 if ((to[-2] == '\r' && to[-1] == '\n') ||
11949 (to[-2] == '\n' && to[-1] == '\r'))
11950 {
f63a84b2
LW
11951 to[-2] = '\n';
11952 to--;
95a20fc0 11953 SvCUR_set(sv, to - SvPVX_const(sv));
f63a84b2
LW
11954 }
11955 else if (to[-1] == '\r')
11956 to[-1] = '\n';
11957 }
95a20fc0 11958 else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
f63a84b2
LW
11959 to[-1] = '\n';
11960#endif
11961
220e2d4e 11962 read_more_line:
02aa26ce
NT
11963 /* if we're out of file, or a read fails, bail and reset the current
11964 line marker so we can report where the unterminated string began
11965 */
5db06880
NC
11966#ifdef PERL_MAD
11967 if (PL_madskills) {
c35e046a 11968 char * const tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11969 if (PL_thisstuff)
11970 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11971 else
cd81e915 11972 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11973 }
11974#endif
3280af22
NIS
11975 if (!PL_rsfp ||
11976 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 11977 sv_free(sv);
eb160463 11978 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
bd61b366 11979 return NULL;
79072805 11980 }
5db06880
NC
11981#ifdef PERL_MAD
11982 stuffstart = 0;
11983#endif
02aa26ce 11984 /* we read a line, so increment our line counter */
57843af0 11985 CopLINE_inc(PL_curcop);
a0ed51b3 11986
02aa26ce 11987 /* update debugger info */
65269a95 11988 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
5fa550fb 11989 update_debugger_info(PL_linestr, NULL, 0);
a0ed51b3 11990
3280af22
NIS
11991 /* having changed the buffer, we must update PL_bufend */
11992 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11993 PL_last_lop = PL_last_uni = NULL;
378cc40b 11994 }
4e553d73 11995
02aa26ce
NT
11996 /* at this point, we have successfully read the delimited string */
11997
220e2d4e 11998 if (!PL_encoding || UTF) {
5db06880
NC
11999#ifdef PERL_MAD
12000 if (PL_madskills) {
c35e046a 12001 char * const tstart = SvPVX(PL_linestr) + stuffstart;
29522234 12002 const int len = s - tstart;
cd81e915 12003 if (PL_thisstuff)
c35e046a 12004 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 12005 else
c35e046a 12006 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
12007 if (!PL_thisclose && !keep_delims)
12008 PL_thisclose = newSVpvn(s,termlen);
5db06880
NC
12009 }
12010#endif
12011
220e2d4e
IH
12012 if (keep_delims)
12013 sv_catpvn(sv, s, termlen);
12014 s += termlen;
12015 }
5db06880
NC
12016#ifdef PERL_MAD
12017 else {
12018 if (PL_madskills) {
c35e046a
AL
12019 char * const tstart = SvPVX(PL_linestr) + stuffstart;
12020 const int len = s - tstart - termlen;
cd81e915 12021 if (PL_thisstuff)
c35e046a 12022 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 12023 else
c35e046a 12024 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
12025 if (!PL_thisclose && !keep_delims)
12026 PL_thisclose = newSVpvn(s - termlen,termlen);
5db06880
NC
12027 }
12028 }
12029#endif
220e2d4e 12030 if (has_utf8 || PL_encoding)
b1c7b182 12031 SvUTF8_on(sv);
d0063567 12032
57843af0 12033 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
12034
12035 /* if we allocated too much space, give some back */
93a17b20
LW
12036 if (SvCUR(sv) + 5 < SvLEN(sv)) {
12037 SvLEN_set(sv, SvCUR(sv) + 1);
b7e9a5c2 12038 SvPV_renew(sv, SvLEN(sv));
79072805 12039 }
02aa26ce
NT
12040
12041 /* decide whether this is the first or second quoted string we've read
12042 for this op
12043 */
4e553d73 12044
3280af22
NIS
12045 if (PL_lex_stuff)
12046 PL_lex_repl = sv;
79072805 12047 else
3280af22 12048 PL_lex_stuff = sv;
378cc40b
LW
12049 return s;
12050}
12051
02aa26ce
NT
12052/*
12053 scan_num
12054 takes: pointer to position in buffer
12055 returns: pointer to new position in buffer
6154021b 12056 side-effects: builds ops for the constant in pl_yylval.op
02aa26ce
NT
12057
12058 Read a number in any of the formats that Perl accepts:
12059
7fd134d9
JH
12060 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
12061 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
12062 0b[01](_?[01])*
12063 0[0-7](_?[0-7])*
12064 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 12065
3280af22 12066 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
12067 thing it reads.
12068
12069 If it reads a number without a decimal point or an exponent, it will
12070 try converting the number to an integer and see if it can do so
12071 without loss of precision.
12072*/
4e553d73 12073
378cc40b 12074char *
bfed75c6 12075Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
378cc40b 12076{
97aff369 12077 dVAR;
bfed75c6 12078 register const char *s = start; /* current position in buffer */
02aa26ce
NT
12079 register char *d; /* destination in temp buffer */
12080 register char *e; /* end of temp buffer */
86554af2 12081 NV nv; /* number read, as a double */
a0714e2c 12082 SV *sv = NULL; /* place to put the converted number */
a86a20aa 12083 bool floatit; /* boolean: int or float? */
cbbf8932 12084 const char *lastub = NULL; /* position of last underbar */
bfed75c6 12085 static char const number_too_long[] = "Number too long";
378cc40b 12086
7918f24d
NC
12087 PERL_ARGS_ASSERT_SCAN_NUM;
12088
02aa26ce
NT
12089 /* We use the first character to decide what type of number this is */
12090
378cc40b 12091 switch (*s) {
79072805 12092 default:
cea2e8a9 12093 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 12094
02aa26ce 12095 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 12096 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
12097 case '0':
12098 {
02aa26ce
NT
12099 /* variables:
12100 u holds the "number so far"
4f19785b
WSI
12101 shift the power of 2 of the base
12102 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
12103 overflowed was the number more than we can hold?
12104
12105 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
12106 we in octal/hex/binary?" indicator to disallow hex characters
12107 when in octal mode.
02aa26ce 12108 */
9e24b6e2
JH
12109 NV n = 0.0;
12110 UV u = 0;
79072805 12111 I32 shift;
9e24b6e2 12112 bool overflowed = FALSE;
61f33854 12113 bool just_zero = TRUE; /* just plain 0 or binary number? */
27da23d5
JH
12114 static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
12115 static const char* const bases[5] =
12116 { "", "binary", "", "octal", "hexadecimal" };
12117 static const char* const Bases[5] =
12118 { "", "Binary", "", "Octal", "Hexadecimal" };
12119 static const char* const maxima[5] =
12120 { "",
12121 "0b11111111111111111111111111111111",
12122 "",
12123 "037777777777",
12124 "0xffffffff" };
bfed75c6 12125 const char *base, *Base, *max;
378cc40b 12126
02aa26ce 12127 /* check for hex */
378cc40b
LW
12128 if (s[1] == 'x') {
12129 shift = 4;
12130 s += 2;
61f33854 12131 just_zero = FALSE;
4f19785b
WSI
12132 } else if (s[1] == 'b') {
12133 shift = 1;
12134 s += 2;
61f33854 12135 just_zero = FALSE;
378cc40b 12136 }
02aa26ce 12137 /* check for a decimal in disguise */
b78218b7 12138 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 12139 goto decimal;
02aa26ce 12140 /* so it must be octal */
928753ea 12141 else {
378cc40b 12142 shift = 3;
928753ea
JH
12143 s++;
12144 }
12145
12146 if (*s == '_') {
12147 if (ckWARN(WARN_SYNTAX))
9014280d 12148 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12149 "Misplaced _ in number");
12150 lastub = s++;
12151 }
9e24b6e2
JH
12152
12153 base = bases[shift];
12154 Base = Bases[shift];
12155 max = maxima[shift];
02aa26ce 12156
4f19785b 12157 /* read the rest of the number */
378cc40b 12158 for (;;) {
9e24b6e2 12159 /* x is used in the overflow test,
893fe2c2 12160 b is the digit we're adding on. */
9e24b6e2 12161 UV x, b;
55497cff 12162
378cc40b 12163 switch (*s) {
02aa26ce
NT
12164
12165 /* if we don't mention it, we're done */
378cc40b
LW
12166 default:
12167 goto out;
02aa26ce 12168
928753ea 12169 /* _ are ignored -- but warned about if consecutive */
de3bb511 12170 case '_':
041457d9 12171 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12172 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12173 "Misplaced _ in number");
12174 lastub = s++;
de3bb511 12175 break;
02aa26ce
NT
12176
12177 /* 8 and 9 are not octal */
378cc40b 12178 case '8': case '9':
4f19785b 12179 if (shift == 3)
cea2e8a9 12180 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 12181 /* FALL THROUGH */
02aa26ce
NT
12182
12183 /* octal digits */
4f19785b 12184 case '2': case '3': case '4':
378cc40b 12185 case '5': case '6': case '7':
4f19785b 12186 if (shift == 1)
cea2e8a9 12187 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
12188 /* FALL THROUGH */
12189
12190 case '0': case '1':
02aa26ce 12191 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 12192 goto digit;
02aa26ce
NT
12193
12194 /* hex digits */
378cc40b
LW
12195 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12196 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 12197 /* make sure they said 0x */
378cc40b
LW
12198 if (shift != 4)
12199 goto out;
55497cff 12200 b = (*s++ & 7) + 9;
02aa26ce
NT
12201
12202 /* Prepare to put the digit we have onto the end
12203 of the number so far. We check for overflows.
12204 */
12205
55497cff 12206 digit:
61f33854 12207 just_zero = FALSE;
9e24b6e2
JH
12208 if (!overflowed) {
12209 x = u << shift; /* make room for the digit */
12210
12211 if ((x >> shift) != u
12212 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
12213 overflowed = TRUE;
12214 n = (NV) u;
767a6a26 12215 if (ckWARN_d(WARN_OVERFLOW))
9014280d 12216 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
9e24b6e2
JH
12217 "Integer overflow in %s number",
12218 base);
12219 } else
12220 u = x | b; /* add the digit to the end */
12221 }
12222 if (overflowed) {
12223 n *= nvshift[shift];
12224 /* If an NV has not enough bits in its
12225 * mantissa to represent an UV this summing of
12226 * small low-order numbers is a waste of time
12227 * (because the NV cannot preserve the
12228 * low-order bits anyway): we could just
12229 * remember when did we overflow and in the
12230 * end just multiply n by the right
12231 * amount. */
12232 n += (NV) b;
55497cff 12233 }
378cc40b
LW
12234 break;
12235 }
12236 }
02aa26ce
NT
12237
12238 /* if we get here, we had success: make a scalar value from
12239 the number.
12240 */
378cc40b 12241 out:
928753ea
JH
12242
12243 /* final misplaced underbar check */
12244 if (s[-1] == '_') {
12245 if (ckWARN(WARN_SYNTAX))
9014280d 12246 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
12247 }
12248
561b68a9 12249 sv = newSV(0);
9e24b6e2 12250 if (overflowed) {
041457d9 12251 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
9014280d 12252 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12253 "%s number > %s non-portable",
12254 Base, max);
12255 sv_setnv(sv, n);
12256 }
12257 else {
15041a67 12258#if UVSIZE > 4
041457d9 12259 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
9014280d 12260 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12261 "%s number > %s non-portable",
12262 Base, max);
2cc4c2dc 12263#endif
9e24b6e2
JH
12264 sv_setuv(sv, u);
12265 }
61f33854 12266 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
bfed75c6 12267 sv = new_constant(start, s - start, "integer",
eb0d8d16 12268 sv, NULL, NULL, 0);
61f33854 12269 else if (PL_hints & HINT_NEW_BINARY)
eb0d8d16 12270 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
378cc40b
LW
12271 }
12272 break;
02aa26ce
NT
12273
12274 /*
12275 handle decimal numbers.
12276 we're also sent here when we read a 0 as the first digit
12277 */
378cc40b
LW
12278 case '1': case '2': case '3': case '4': case '5':
12279 case '6': case '7': case '8': case '9': case '.':
12280 decimal:
3280af22
NIS
12281 d = PL_tokenbuf;
12282 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 12283 floatit = FALSE;
02aa26ce
NT
12284
12285 /* read next group of digits and _ and copy into d */
de3bb511 12286 while (isDIGIT(*s) || *s == '_') {
4e553d73 12287 /* skip underscores, checking for misplaced ones
02aa26ce
NT
12288 if -w is on
12289 */
93a17b20 12290 if (*s == '_') {
041457d9 12291 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12292 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12293 "Misplaced _ in number");
12294 lastub = s++;
93a17b20 12295 }
fc36a67e 12296 else {
02aa26ce 12297 /* check for end of fixed-length buffer */
fc36a67e 12298 if (d >= e)
cea2e8a9 12299 Perl_croak(aTHX_ number_too_long);
02aa26ce 12300 /* if we're ok, copy the character */
378cc40b 12301 *d++ = *s++;
fc36a67e 12302 }
378cc40b 12303 }
02aa26ce
NT
12304
12305 /* final misplaced underbar check */
928753ea 12306 if (lastub && s == lastub + 1) {
d008e5eb 12307 if (ckWARN(WARN_SYNTAX))
9014280d 12308 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 12309 }
02aa26ce
NT
12310
12311 /* read a decimal portion if there is one. avoid
12312 3..5 being interpreted as the number 3. followed
12313 by .5
12314 */
2f3197b3 12315 if (*s == '.' && s[1] != '.') {
79072805 12316 floatit = TRUE;
378cc40b 12317 *d++ = *s++;
02aa26ce 12318
928753ea
JH
12319 if (*s == '_') {
12320 if (ckWARN(WARN_SYNTAX))
9014280d 12321 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12322 "Misplaced _ in number");
12323 lastub = s;
12324 }
12325
12326 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 12327 */
fc36a67e 12328 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 12329 /* fixed length buffer check */
fc36a67e 12330 if (d >= e)
cea2e8a9 12331 Perl_croak(aTHX_ number_too_long);
928753ea 12332 if (*s == '_') {
041457d9 12333 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12334 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12335 "Misplaced _ in number");
12336 lastub = s;
12337 }
12338 else
fc36a67e 12339 *d++ = *s;
378cc40b 12340 }
928753ea
JH
12341 /* fractional part ending in underbar? */
12342 if (s[-1] == '_') {
12343 if (ckWARN(WARN_SYNTAX))
9014280d 12344 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12345 "Misplaced _ in number");
12346 }
dd629d5b
GS
12347 if (*s == '.' && isDIGIT(s[1])) {
12348 /* oops, it's really a v-string, but without the "v" */
f4758303 12349 s = start;
dd629d5b
GS
12350 goto vstring;
12351 }
378cc40b 12352 }
02aa26ce
NT
12353
12354 /* read exponent part, if present */
3792a11b 12355 if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
79072805
LW
12356 floatit = TRUE;
12357 s++;
02aa26ce
NT
12358
12359 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 12360 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 12361
7fd134d9
JH
12362 /* stray preinitial _ */
12363 if (*s == '_') {
12364 if (ckWARN(WARN_SYNTAX))
9014280d 12365 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12366 "Misplaced _ in number");
12367 lastub = s++;
12368 }
12369
02aa26ce 12370 /* allow positive or negative exponent */
378cc40b
LW
12371 if (*s == '+' || *s == '-')
12372 *d++ = *s++;
02aa26ce 12373
7fd134d9
JH
12374 /* stray initial _ */
12375 if (*s == '_') {
12376 if (ckWARN(WARN_SYNTAX))
9014280d 12377 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12378 "Misplaced _ in number");
12379 lastub = s++;
12380 }
12381
7fd134d9
JH
12382 /* read digits of exponent */
12383 while (isDIGIT(*s) || *s == '_') {
12384 if (isDIGIT(*s)) {
12385 if (d >= e)
12386 Perl_croak(aTHX_ number_too_long);
b3b48e3e 12387 *d++ = *s++;
7fd134d9
JH
12388 }
12389 else {
041457d9
DM
12390 if (((lastub && s == lastub + 1) ||
12391 (!isDIGIT(s[1]) && s[1] != '_'))
12392 && ckWARN(WARN_SYNTAX))
9014280d 12393 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9 12394 "Misplaced _ in number");
b3b48e3e 12395 lastub = s++;
7fd134d9 12396 }
7fd134d9 12397 }
378cc40b 12398 }
02aa26ce 12399
02aa26ce
NT
12400
12401 /* make an sv from the string */
561b68a9 12402 sv = newSV(0);
097ee67d 12403
0b7fceb9 12404 /*
58bb9ec3
NC
12405 We try to do an integer conversion first if no characters
12406 indicating "float" have been found.
0b7fceb9
MU
12407 */
12408
12409 if (!floatit) {
58bb9ec3 12410 UV uv;
6136c704 12411 const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
58bb9ec3
NC
12412
12413 if (flags == IS_NUMBER_IN_UV) {
12414 if (uv <= IV_MAX)
86554af2 12415 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 12416 else
c239479b 12417 sv_setuv(sv, uv);
58bb9ec3
NC
12418 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
12419 if (uv <= (UV) IV_MIN)
12420 sv_setiv(sv, -(IV)uv);
12421 else
12422 floatit = TRUE;
12423 } else
12424 floatit = TRUE;
12425 }
0b7fceb9 12426 if (floatit) {
58bb9ec3
NC
12427 /* terminate the string */
12428 *d = '\0';
86554af2
JH
12429 nv = Atof(PL_tokenbuf);
12430 sv_setnv(sv, nv);
12431 }
86554af2 12432
eb0d8d16
NC
12433 if ( floatit
12434 ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
12435 const char *const key = floatit ? "float" : "integer";
12436 const STRLEN keylen = floatit ? 5 : 7;
12437 sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
12438 key, keylen, sv, NULL, NULL, 0);
12439 }
378cc40b 12440 break;
0b7fceb9 12441
e312add1 12442 /* if it starts with a v, it could be a v-string */
a7cb1f99 12443 case 'v':
dd629d5b 12444vstring:
561b68a9 12445 sv = newSV(5); /* preallocate storage space */
65b06e02 12446 s = scan_vstring(s, PL_bufend, sv);
a7cb1f99 12447 break;
79072805 12448 }
a687059c 12449
02aa26ce
NT
12450 /* make the op for the constant and return */
12451
a86a20aa 12452 if (sv)
b73d6f50 12453 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 12454 else
5f66b61c 12455 lvalp->opval = NULL;
a687059c 12456
73d840c0 12457 return (char *)s;
378cc40b
LW
12458}
12459
76e3520e 12460STATIC char *
cea2e8a9 12461S_scan_formline(pTHX_ register char *s)
378cc40b 12462{
97aff369 12463 dVAR;
79072805 12464 register char *eol;
378cc40b 12465 register char *t;
6136c704 12466 SV * const stuff = newSVpvs("");
79072805 12467 bool needargs = FALSE;
c5ee2135 12468 bool eofmt = FALSE;
5db06880
NC
12469#ifdef PERL_MAD
12470 char *tokenstart = s;
4f61fd4b
JC
12471 SV* savewhite = NULL;
12472
5db06880 12473 if (PL_madskills) {
cd81e915
NC
12474 savewhite = PL_thiswhite;
12475 PL_thiswhite = 0;
5db06880
NC
12476 }
12477#endif
378cc40b 12478
7918f24d
NC
12479 PERL_ARGS_ASSERT_SCAN_FORMLINE;
12480
79072805 12481 while (!needargs) {
a1b95068 12482 if (*s == '.') {
c35e046a 12483 t = s+1;
51882d45 12484#ifdef PERL_STRICT_CR
c35e046a
AL
12485 while (SPACE_OR_TAB(*t))
12486 t++;
51882d45 12487#else
c35e046a
AL
12488 while (SPACE_OR_TAB(*t) || *t == '\r')
12489 t++;
51882d45 12490#endif
c5ee2135
WL
12491 if (*t == '\n' || t == PL_bufend) {
12492 eofmt = TRUE;
79072805 12493 break;
c5ee2135 12494 }
79072805 12495 }
3280af22 12496 if (PL_in_eval && !PL_rsfp) {
07409e01 12497 eol = (char *) memchr(s,'\n',PL_bufend-s);
0f85fab0 12498 if (!eol++)
3280af22 12499 eol = PL_bufend;
0f85fab0
LW
12500 }
12501 else
3280af22 12502 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 12503 if (*s != '#') {
a0d0e21e
LW
12504 for (t = s; t < eol; t++) {
12505 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
12506 needargs = FALSE;
12507 goto enough; /* ~~ must be first line in formline */
378cc40b 12508 }
a0d0e21e
LW
12509 if (*t == '@' || *t == '^')
12510 needargs = TRUE;
378cc40b 12511 }
7121b347
MG
12512 if (eol > s) {
12513 sv_catpvn(stuff, s, eol-s);
2dc4c65b 12514#ifndef PERL_STRICT_CR
7121b347
MG
12515 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
12516 char *end = SvPVX(stuff) + SvCUR(stuff);
12517 end[-2] = '\n';
12518 end[-1] = '\0';
b162af07 12519 SvCUR_set(stuff, SvCUR(stuff) - 1);
7121b347 12520 }
2dc4c65b 12521#endif
7121b347
MG
12522 }
12523 else
12524 break;
79072805 12525 }
95a20fc0 12526 s = (char*)eol;
3280af22 12527 if (PL_rsfp) {
5db06880
NC
12528#ifdef PERL_MAD
12529 if (PL_madskills) {
cd81e915
NC
12530 if (PL_thistoken)
12531 sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
5db06880 12532 else
cd81e915 12533 PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
5db06880
NC
12534 }
12535#endif
3280af22 12536 s = filter_gets(PL_linestr, PL_rsfp, 0);
5db06880
NC
12537#ifdef PERL_MAD
12538 tokenstart = PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
12539#else
3280af22 12540 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
5db06880 12541#endif
3280af22 12542 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
bd61b366 12543 PL_last_lop = PL_last_uni = NULL;
79072805 12544 if (!s) {
3280af22 12545 s = PL_bufptr;
378cc40b
LW
12546 break;
12547 }
378cc40b 12548 }
463ee0b2 12549 incline(s);
79072805 12550 }
a0d0e21e
LW
12551 enough:
12552 if (SvCUR(stuff)) {
3280af22 12553 PL_expect = XTERM;
79072805 12554 if (needargs) {
3280af22 12555 PL_lex_state = LEX_NORMAL;
cd81e915 12556 start_force(PL_curforce);
9ded7720 12557 NEXTVAL_NEXTTOKE.ival = 0;
79072805
LW
12558 force_next(',');
12559 }
a0d0e21e 12560 else
3280af22 12561 PL_lex_state = LEX_FORMLINE;
1bd51a4c 12562 if (!IN_BYTES) {
95a20fc0 12563 if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
1bd51a4c
IH
12564 SvUTF8_on(stuff);
12565 else if (PL_encoding)
12566 sv_recode_to_utf8(stuff, PL_encoding);
12567 }
cd81e915 12568 start_force(PL_curforce);
9ded7720 12569 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 12570 force_next(THING);
cd81e915 12571 start_force(PL_curforce);
9ded7720 12572 NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
79072805 12573 force_next(LSTOP);
378cc40b 12574 }
79072805 12575 else {
8990e307 12576 SvREFCNT_dec(stuff);
c5ee2135
WL
12577 if (eofmt)
12578 PL_lex_formbrack = 0;
3280af22 12579 PL_bufptr = s;
79072805 12580 }
5db06880
NC
12581#ifdef PERL_MAD
12582 if (PL_madskills) {
cd81e915
NC
12583 if (PL_thistoken)
12584 sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
5db06880 12585 else
cd81e915
NC
12586 PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
12587 PL_thiswhite = savewhite;
5db06880
NC
12588 }
12589#endif
79072805 12590 return s;
378cc40b 12591}
a687059c 12592
ba6d6ac9 12593I32
864dbfa3 12594Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 12595{
97aff369 12596 dVAR;
a3b680e6 12597 const I32 oldsavestack_ix = PL_savestack_ix;
6136c704 12598 CV* const outsidecv = PL_compcv;
8990e307 12599
3280af22
NIS
12600 if (PL_compcv) {
12601 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 12602 }
7766f137 12603 SAVEI32(PL_subline);
3280af22 12604 save_item(PL_subname);
3280af22 12605 SAVESPTR(PL_compcv);
3280af22 12606
ea726b52 12607 PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
3280af22
NIS
12608 CvFLAGS(PL_compcv) |= flags;
12609
57843af0 12610 PL_subline = CopLINE(PL_curcop);
dd2155a4 12611 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
ea726b52 12612 CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
a3985cdc 12613 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 12614
8990e307
LW
12615 return oldsavestack_ix;
12616}
12617
084592ab
CN
12618#ifdef __SC__
12619#pragma segment Perl_yylex
12620#endif
af41e527
NC
12621static int
12622S_yywarn(pTHX_ const char *const s)
8990e307 12623{
97aff369 12624 dVAR;
7918f24d
NC
12625
12626 PERL_ARGS_ASSERT_YYWARN;
12627
faef0170 12628 PL_in_eval |= EVAL_WARNONLY;
748a9306 12629 yyerror(s);
faef0170 12630 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 12631 return 0;
8990e307
LW
12632}
12633
12634int
15f169a1 12635Perl_yyerror(pTHX_ const char *const s)
463ee0b2 12636{
97aff369 12637 dVAR;
bfed75c6
AL
12638 const char *where = NULL;
12639 const char *context = NULL;
68dc0745 12640 int contlen = -1;
46fc3d4c 12641 SV *msg;
5912531f 12642 int yychar = PL_parser->yychar;
463ee0b2 12643
7918f24d
NC
12644 PERL_ARGS_ASSERT_YYERROR;
12645
3280af22 12646 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 12647 where = "at EOF";
8bcfe651
TM
12648 else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
12649 PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
12650 PL_oldbufptr != PL_bufptr) {
f355267c
JH
12651 /*
12652 Only for NetWare:
12653 The code below is removed for NetWare because it abends/crashes on NetWare
12654 when the script has error such as not having the closing quotes like:
12655 if ($var eq "value)
12656 Checking of white spaces is anyway done in NetWare code.
12657 */
12658#ifndef NETWARE
3280af22
NIS
12659 while (isSPACE(*PL_oldoldbufptr))
12660 PL_oldoldbufptr++;
f355267c 12661#endif
3280af22
NIS
12662 context = PL_oldoldbufptr;
12663 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 12664 }
8bcfe651
TM
12665 else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
12666 PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
f355267c
JH
12667 /*
12668 Only for NetWare:
12669 The code below is removed for NetWare because it abends/crashes on NetWare
12670 when the script has error such as not having the closing quotes like:
12671 if ($var eq "value)
12672 Checking of white spaces is anyway done in NetWare code.
12673 */
12674#ifndef NETWARE
3280af22
NIS
12675 while (isSPACE(*PL_oldbufptr))
12676 PL_oldbufptr++;
f355267c 12677#endif
3280af22
NIS
12678 context = PL_oldbufptr;
12679 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
12680 }
12681 else if (yychar > 255)
68dc0745 12682 where = "next token ???";
12fbd33b 12683 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
12684 if (PL_lex_state == LEX_NORMAL ||
12685 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 12686 where = "at end of line";
3280af22 12687 else if (PL_lex_inpat)
68dc0745 12688 where = "within pattern";
463ee0b2 12689 else
68dc0745 12690 where = "within string";
463ee0b2 12691 }
46fc3d4c 12692 else {
84bafc02 12693 SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
46fc3d4c 12694 if (yychar < 32)
cea2e8a9 12695 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
5e7aa789 12696 else if (isPRINT_LC(yychar)) {
88c9ea1e 12697 const char string = yychar;
5e7aa789
NC
12698 sv_catpvn(where_sv, &string, 1);
12699 }
463ee0b2 12700 else
cea2e8a9 12701 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
95a20fc0 12702 where = SvPVX_const(where_sv);
463ee0b2 12703 }
46fc3d4c 12704 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 12705 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 12706 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 12707 if (context)
cea2e8a9 12708 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 12709 else
cea2e8a9 12710 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 12711 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 12712 Perl_sv_catpvf(aTHX_ msg,
57def98f 12713 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 12714 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 12715 PL_multi_end = 0;
a0d0e21e 12716 }
500960a6
RD
12717 if (PL_in_eval & EVAL_WARNONLY) {
12718 if (ckWARN_d(WARN_SYNTAX))
12719 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
12720 }
463ee0b2 12721 else
5a844595 12722 qerror(msg);
c7d6bfb2
GS
12723 if (PL_error_count >= 10) {
12724 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 12725 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
be2597df 12726 SVfARG(ERRSV), OutCopFILE(PL_curcop));
c7d6bfb2
GS
12727 else
12728 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 12729 OutCopFILE(PL_curcop));
c7d6bfb2 12730 }
3280af22 12731 PL_in_my = 0;
5c284bb0 12732 PL_in_my_stash = NULL;
463ee0b2
LW
12733 return 0;
12734}
084592ab
CN
12735#ifdef __SC__
12736#pragma segment Main
12737#endif
4e35701f 12738
b250498f 12739STATIC char*
3ae08724 12740S_swallow_bom(pTHX_ U8 *s)
01ec43d0 12741{
97aff369 12742 dVAR;
f54cb97a 12743 const STRLEN slen = SvCUR(PL_linestr);
7918f24d
NC
12744
12745 PERL_ARGS_ASSERT_SWALLOW_BOM;
12746
7aa207d6 12747 switch (s[0]) {
4e553d73
NIS
12748 case 0xFF:
12749 if (s[1] == 0xFE) {
7aa207d6 12750 /* UTF-16 little-endian? (or UTF32-LE?) */
3ae08724 12751 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
7aa207d6 12752 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
01ec43d0 12753#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12754 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
3ae08724 12755 s += 2;
7aa207d6 12756 utf16le:
dea0fc0b
JH
12757 if (PL_bufend > (char*)s) {
12758 U8 *news;
12759 I32 newlen;
12760
12761 filter_add(utf16rev_textfilter, NULL);
a02a5408 12762 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd 12763 utf16_to_utf8_reversed(s, news,
aed58286 12764 PL_bufend - (char*)s - 1,
1de9afcd 12765 &newlen);
7aa207d6 12766 sv_setpvn(PL_linestr, (const char*)news, newlen);
5db06880
NC
12767#ifdef PERL_MAD
12768 s = (U8*)SvPVX(PL_linestr);
12769 Copy(news, s, newlen, U8);
12770 s[newlen] = '\0';
12771#endif
dea0fc0b 12772 Safefree(news);
7aa207d6
JH
12773 SvUTF8_on(PL_linestr);
12774 s = (U8*)SvPVX(PL_linestr);
5db06880
NC
12775#ifdef PERL_MAD
12776 /* FIXME - is this a general bug fix? */
12777 s[newlen] = '\0';
12778#endif
7aa207d6 12779 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12780 }
b250498f 12781#else
7aa207d6 12782 Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
b250498f 12783#endif
01ec43d0
GS
12784 }
12785 break;
78ae23f5 12786 case 0xFE:
7aa207d6 12787 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 12788#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12789 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b 12790 s += 2;
7aa207d6 12791 utf16be:
dea0fc0b
JH
12792 if (PL_bufend > (char *)s) {
12793 U8 *news;
12794 I32 newlen;
12795
12796 filter_add(utf16_textfilter, NULL);
a02a5408 12797 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
12798 utf16_to_utf8(s, news,
12799 PL_bufend - (char*)s,
12800 &newlen);
7aa207d6 12801 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 12802 Safefree(news);
7aa207d6
JH
12803 SvUTF8_on(PL_linestr);
12804 s = (U8*)SvPVX(PL_linestr);
12805 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12806 }
b250498f 12807#else
7aa207d6 12808 Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
b250498f 12809#endif
01ec43d0
GS
12810 }
12811 break;
3ae08724
GS
12812 case 0xEF:
12813 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 12814 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
12815 s += 3; /* UTF-8 */
12816 }
12817 break;
12818 case 0:
7aa207d6
JH
12819 if (slen > 3) {
12820 if (s[1] == 0) {
12821 if (s[2] == 0xFE && s[3] == 0xFF) {
12822 /* UTF-32 big-endian */
12823 Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
12824 }
12825 }
12826 else if (s[2] == 0 && s[3] != 0) {
12827 /* Leading bytes
12828 * 00 xx 00 xx
12829 * are a good indicator of UTF-16BE. */
12830 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
12831 goto utf16be;
12832 }
01ec43d0 12833 }
e294cc5d
JH
12834#ifdef EBCDIC
12835 case 0xDD:
12836 if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
12837 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
12838 s += 4; /* UTF-8 */
12839 }
12840 break;
12841#endif
12842
7aa207d6
JH
12843 default:
12844 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
12845 /* Leading bytes
12846 * xx 00 xx 00
12847 * are a good indicator of UTF-16LE. */
12848 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
12849 goto utf16le;
12850 }
01ec43d0 12851 }
b8f84bb2 12852 return (char*)s;
b250498f 12853}
4755096e 12854
6e3aabd6
GS
12855
12856#ifndef PERL_NO_UTF16_FILTER
12857static I32
acfe0abc 12858utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12859{
97aff369 12860 dVAR;
f54cb97a
AL
12861 const STRLEN old = SvCUR(sv);
12862 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12863 DEBUG_P(PerlIO_printf(Perl_debug_log,
12864 "utf16_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12865 FPTR2DPTR(void *, utf16_textfilter),
12866 idx, maxlen, (int) count));
6e3aabd6
GS
12867 if (count) {
12868 U8* tmps;
dea0fc0b 12869 I32 newlen;
a02a5408 12870 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12871 Copy(SvPVX_const(sv), tmps, old, char);
12872 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12873 SvCUR(sv) - old, &newlen);
12874 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12875 }
1de9afcd
RGS
12876 DEBUG_P({sv_dump(sv);});
12877 return SvCUR(sv);
6e3aabd6
GS
12878}
12879
12880static I32
acfe0abc 12881utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12882{
97aff369 12883 dVAR;
f54cb97a
AL
12884 const STRLEN old = SvCUR(sv);
12885 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12886 DEBUG_P(PerlIO_printf(Perl_debug_log,
12887 "utf16rev_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12888 FPTR2DPTR(void *, utf16rev_textfilter),
12889 idx, maxlen, (int) count));
6e3aabd6
GS
12890 if (count) {
12891 U8* tmps;
dea0fc0b 12892 I32 newlen;
a02a5408 12893 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12894 Copy(SvPVX_const(sv), tmps, old, char);
12895 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12896 SvCUR(sv) - old, &newlen);
12897 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12898 }
1de9afcd 12899 DEBUG_P({ sv_dump(sv); });
6e3aabd6
GS
12900 return count;
12901}
12902#endif
9f4817db 12903
f333445c
JP
12904/*
12905Returns a pointer to the next character after the parsed
12906vstring, as well as updating the passed in sv.
12907
12908Function must be called like
12909
561b68a9 12910 sv = newSV(5);
65b06e02 12911 s = scan_vstring(s,e,sv);
f333445c 12912
65b06e02 12913where s and e are the start and end of the string.
f333445c
JP
12914The sv should already be large enough to store the vstring
12915passed in, for performance reasons.
12916
12917*/
12918
12919char *
15f169a1 12920Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
f333445c 12921{
97aff369 12922 dVAR;
bfed75c6
AL
12923 const char *pos = s;
12924 const char *start = s;
7918f24d
NC
12925
12926 PERL_ARGS_ASSERT_SCAN_VSTRING;
12927
f333445c 12928 if (*pos == 'v') pos++; /* get past 'v' */
65b06e02 12929 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
3e884cbf 12930 pos++;
f333445c
JP
12931 if ( *pos != '.') {
12932 /* this may not be a v-string if followed by => */
bfed75c6 12933 const char *next = pos;
65b06e02 12934 while (next < e && isSPACE(*next))
8fc7bb1c 12935 ++next;
65b06e02 12936 if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
12937 /* return string not v-string */
12938 sv_setpvn(sv,(char *)s,pos-s);
73d840c0 12939 return (char *)pos;
f333445c
JP
12940 }
12941 }
12942
12943 if (!isALPHA(*pos)) {
89ebb4a3 12944 U8 tmpbuf[UTF8_MAXBYTES+1];
f333445c 12945
d4c19fe8
AL
12946 if (*s == 'v')
12947 s++; /* get past 'v' */
f333445c 12948
76f68e9b 12949 sv_setpvs(sv, "");
f333445c
JP
12950
12951 for (;;) {
d4c19fe8 12952 /* this is atoi() that tolerates underscores */
0bd48802
AL
12953 U8 *tmpend;
12954 UV rev = 0;
d4c19fe8
AL
12955 const char *end = pos;
12956 UV mult = 1;
12957 while (--end >= s) {
12958 if (*end != '_') {
12959 const UV orev = rev;
f333445c
JP
12960 rev += (*end - '0') * mult;
12961 mult *= 10;
12962 if (orev > rev && ckWARN_d(WARN_OVERFLOW))
12963 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
12964 "Integer overflow in decimal number");
12965 }
12966 }
12967#ifdef EBCDIC
12968 if (rev > 0x7FFFFFFF)
12969 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
12970#endif
12971 /* Append native character for the rev point */
12972 tmpend = uvchr_to_utf8(tmpbuf, rev);
12973 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
12974 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
12975 SvUTF8_on(sv);
65b06e02 12976 if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
12977 s = ++pos;
12978 else {
12979 s = pos;
12980 break;
12981 }
65b06e02 12982 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
12983 pos++;
12984 }
12985 SvPOK_on(sv);
12986 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
12987 SvRMAGICAL_on(sv);
12988 }
73d840c0 12989 return (char *)s;
f333445c
JP
12990}
12991
1da4ca5f
NC
12992/*
12993 * Local variables:
12994 * c-indentation-style: bsd
12995 * c-basic-offset: 4
12996 * indent-tabs-mode: t
12997 * End:
12998 *
37442d52
RGS
12999 * ex: set ts=8 sts=4 sw=4 noet:
13000 */