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