This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Convert Perl_sv_pos_u2b_proper() to Perl_sv_pos_u2b_flags().
[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
f0e67a1d
Z
24/*
25=head1 Lexer interface
26
27This is the lower layer of the Perl parser, managing characters and tokens.
28
29=for apidoc AmU|yy_parser *|PL_parser
30
31Pointer to a structure encapsulating the state of the parsing operation
32currently in progress. The pointer can be locally changed to perform
33a nested parse without interfering with the state of an outer parse.
34Individual members of C<PL_parser> have their own documentation.
35
36=cut
37*/
38
378cc40b 39#include "EXTERN.h"
864dbfa3 40#define PERL_IN_TOKE_C
378cc40b 41#include "perl.h"
378cc40b 42
eb0d8d16
NC
43#define new_constant(a,b,c,d,e,f,g) \
44 S_new_constant(aTHX_ a,b,STR_WITH_LEN(c),d,e,f, g)
45
6154021b 46#define pl_yylval (PL_parser->yylval)
d3b6f988 47
acdf0a21
DM
48/* YYINITDEPTH -- initial size of the parser's stacks. */
49#define YYINITDEPTH 200
50
199e78b7
DM
51/* XXX temporary backwards compatibility */
52#define PL_lex_brackets (PL_parser->lex_brackets)
53#define PL_lex_brackstack (PL_parser->lex_brackstack)
54#define PL_lex_casemods (PL_parser->lex_casemods)
55#define PL_lex_casestack (PL_parser->lex_casestack)
56#define PL_lex_defer (PL_parser->lex_defer)
57#define PL_lex_dojoin (PL_parser->lex_dojoin)
58#define PL_lex_expect (PL_parser->lex_expect)
59#define PL_lex_formbrack (PL_parser->lex_formbrack)
60#define PL_lex_inpat (PL_parser->lex_inpat)
61#define PL_lex_inwhat (PL_parser->lex_inwhat)
62#define PL_lex_op (PL_parser->lex_op)
63#define PL_lex_repl (PL_parser->lex_repl)
64#define PL_lex_starts (PL_parser->lex_starts)
65#define PL_lex_stuff (PL_parser->lex_stuff)
66#define PL_multi_start (PL_parser->multi_start)
67#define PL_multi_open (PL_parser->multi_open)
68#define PL_multi_close (PL_parser->multi_close)
69#define PL_pending_ident (PL_parser->pending_ident)
70#define PL_preambled (PL_parser->preambled)
71#define PL_sublex_info (PL_parser->sublex_info)
bdc0bf6f 72#define PL_linestr (PL_parser->linestr)
c2598295
DM
73#define PL_expect (PL_parser->expect)
74#define PL_copline (PL_parser->copline)
f06b5848
DM
75#define PL_bufptr (PL_parser->bufptr)
76#define PL_oldbufptr (PL_parser->oldbufptr)
77#define PL_oldoldbufptr (PL_parser->oldoldbufptr)
78#define PL_linestart (PL_parser->linestart)
79#define PL_bufend (PL_parser->bufend)
80#define PL_last_uni (PL_parser->last_uni)
81#define PL_last_lop (PL_parser->last_lop)
82#define PL_last_lop_op (PL_parser->last_lop_op)
bc177e6b 83#define PL_lex_state (PL_parser->lex_state)
2f9285f8 84#define PL_rsfp (PL_parser->rsfp)
5486870f 85#define PL_rsfp_filters (PL_parser->rsfp_filters)
12bd6ede
DM
86#define PL_in_my (PL_parser->in_my)
87#define PL_in_my_stash (PL_parser->in_my_stash)
14047fc9 88#define PL_tokenbuf (PL_parser->tokenbuf)
670a9cb2 89#define PL_multi_end (PL_parser->multi_end)
13765c85 90#define PL_error_count (PL_parser->error_count)
199e78b7
DM
91
92#ifdef PERL_MAD
93# define PL_endwhite (PL_parser->endwhite)
94# define PL_faketokens (PL_parser->faketokens)
95# define PL_lasttoke (PL_parser->lasttoke)
96# define PL_nextwhite (PL_parser->nextwhite)
97# define PL_realtokenstart (PL_parser->realtokenstart)
98# define PL_skipwhite (PL_parser->skipwhite)
99# define PL_thisclose (PL_parser->thisclose)
100# define PL_thismad (PL_parser->thismad)
101# define PL_thisopen (PL_parser->thisopen)
102# define PL_thisstuff (PL_parser->thisstuff)
103# define PL_thistoken (PL_parser->thistoken)
104# define PL_thiswhite (PL_parser->thiswhite)
fb205e7a
DM
105# define PL_thiswhite (PL_parser->thiswhite)
106# define PL_nexttoke (PL_parser->nexttoke)
107# define PL_curforce (PL_parser->curforce)
108#else
109# define PL_nexttoke (PL_parser->nexttoke)
110# define PL_nexttype (PL_parser->nexttype)
111# define PL_nextval (PL_parser->nextval)
199e78b7
DM
112#endif
113
16173588
NC
114/* This can't be done with embed.fnc, because struct yy_parser contains a
115 member named pending_ident, which clashes with the generated #define */
3cbf51f5
DM
116static int
117S_pending_ident(pTHX);
199e78b7 118
0bd48802 119static const char ident_too_long[] = "Identifier too long";
8903cb82 120
29595ff2 121#ifdef PERL_MAD
29595ff2 122# define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
cd81e915 123# define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
9ded7720 124#else
5db06880 125# define CURMAD(slot,sv)
9ded7720 126# define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
29595ff2
NC
127#endif
128
9059aa12
LW
129#define XFAKEBRACK 128
130#define XENUMMASK 127
131
39e02b42
JH
132#ifdef USE_UTF8_SCRIPTS
133# define UTF (!IN_BYTES)
2b9d42f0 134#else
746b446a 135# define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
2b9d42f0 136#endif
a0ed51b3 137
b1fc3636
CJ
138/* The maximum number of characters preceding the unrecognized one to display */
139#define UNRECOGNIZED_PRECEDE_COUNT 10
140
61f0cdd9 141/* In variables named $^X, these are the legal values for X.
2b92dfce
GS
142 * 1999-02-27 mjd-perl-patch@plover.com */
143#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
144
bf4acbe4 145#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
bf4acbe4 146
ffb4593c
NT
147/* LEX_* are values for PL_lex_state, the state of the lexer.
148 * They are arranged oddly so that the guard on the switch statement
79072805
LW
149 * can get by with a single comparison (if the compiler is smart enough).
150 */
151
fb73857a 152/* #define LEX_NOTPARSING 11 is done in perl.h. */
153
b6007c36
DM
154#define LEX_NORMAL 10 /* normal code (ie not within "...") */
155#define LEX_INTERPNORMAL 9 /* code within a string, eg "$foo[$x+1]" */
156#define LEX_INTERPCASEMOD 8 /* expecting a \U, \Q or \E etc */
157#define LEX_INTERPPUSH 7 /* starting a new sublex parse level */
158#define LEX_INTERPSTART 6 /* expecting the start of a $var */
159
160 /* at end of code, eg "$x" followed by: */
161#define LEX_INTERPEND 5 /* ... eg not one of [, { or -> */
162#define LEX_INTERPENDMAYBE 4 /* ... eg one of [, { or -> */
163
164#define LEX_INTERPCONCAT 3 /* expecting anything, eg at start of
165 string or after \E, $foo, etc */
166#define LEX_INTERPCONST 2 /* NOT USED */
167#define LEX_FORMLINE 1 /* expecting a format line */
168#define LEX_KNOWNEXT 0 /* next token known; just return it */
169
79072805 170
bbf60fe6 171#ifdef DEBUGGING
27da23d5 172static const char* const lex_state_names[] = {
bbf60fe6
DM
173 "KNOWNEXT",
174 "FORMLINE",
175 "INTERPCONST",
176 "INTERPCONCAT",
177 "INTERPENDMAYBE",
178 "INTERPEND",
179 "INTERPSTART",
180 "INTERPPUSH",
181 "INTERPCASEMOD",
182 "INTERPNORMAL",
183 "NORMAL"
184};
185#endif
186
79072805
LW
187#ifdef ff_next
188#undef ff_next
d48672a2
LW
189#endif
190
79072805 191#include "keywords.h"
fe14fcc3 192
ffb4593c
NT
193/* CLINE is a macro that ensures PL_copline has a sane value */
194
ae986130
LW
195#ifdef CLINE
196#undef CLINE
197#endif
57843af0 198#define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
3280af22 199
5db06880 200#ifdef PERL_MAD
29595ff2
NC
201# define SKIPSPACE0(s) skipspace0(s)
202# define SKIPSPACE1(s) skipspace1(s)
203# define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
204# define PEEKSPACE(s) skipspace2(s,0)
205#else
206# define SKIPSPACE0(s) skipspace(s)
207# define SKIPSPACE1(s) skipspace(s)
208# define SKIPSPACE2(s,tsv) skipspace(s)
209# define PEEKSPACE(s) skipspace(s)
210#endif
211
ffb4593c
NT
212/*
213 * Convenience functions to return different tokens and prime the
9cbb5ea2 214 * lexer for the next token. They all take an argument.
ffb4593c
NT
215 *
216 * TOKEN : generic token (used for '(', DOLSHARP, etc)
217 * OPERATOR : generic operator
218 * AOPERATOR : assignment operator
219 * PREBLOCK : beginning the block after an if, while, foreach, ...
220 * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
221 * PREREF : *EXPR where EXPR is not a simple identifier
222 * TERM : expression term
223 * LOOPX : loop exiting command (goto, last, dump, etc)
224 * FTST : file test operator
225 * FUN0 : zero-argument function
2d2e263d 226 * FUN1 : not used, except for not, which isn't a UNIOP
ffb4593c
NT
227 * BOop : bitwise or or xor
228 * BAop : bitwise and
229 * SHop : shift operator
230 * PWop : power operator
9cbb5ea2 231 * PMop : pattern-matching operator
ffb4593c
NT
232 * Aop : addition-level operator
233 * Mop : multiplication-level operator
234 * Eop : equality-testing operator
e5edeb50 235 * Rop : relational operator <= != gt
ffb4593c
NT
236 *
237 * Also see LOP and lop() below.
238 */
239
998054bd 240#ifdef DEBUGGING /* Serve -DT. */
704d4215 241# define REPORT(retval) tokereport((I32)retval, &pl_yylval)
998054bd 242#else
bbf60fe6 243# define REPORT(retval) (retval)
998054bd
SC
244#endif
245
bbf60fe6
DM
246#define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
247#define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
248#define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
249#define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
250#define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
251#define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
252#define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
6154021b
RGS
253#define LOOPX(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
254#define FTST(f) return (pl_yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
255#define FUN0(f) return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
256#define FUN1(f) return (pl_yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
257#define BOop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
258#define BAop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
259#define SHop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
260#define PWop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
261#define PMop(f) return(pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
262#define Aop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
263#define Mop(f) return ao((pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
264#define Eop(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
265#define Rop(f) return (pl_yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
2f3197b3 266
a687059c
LW
267/* This bit of chicanery makes a unary function followed by
268 * a parenthesis into a function with one argument, highest precedence.
6f33ba73
RGS
269 * The UNIDOR macro is for unary functions that can be followed by the //
270 * operator (such as C<shift // 0>).
a687059c 271 */
376fcdbf 272#define UNI2(f,x) { \
6154021b 273 pl_yylval.ival = f; \
376fcdbf
AL
274 PL_expect = x; \
275 PL_bufptr = s; \
276 PL_last_uni = PL_oldbufptr; \
277 PL_last_lop_op = f; \
278 if (*s == '(') \
279 return REPORT( (int)FUNC1 ); \
29595ff2 280 s = PEEKSPACE(s); \
376fcdbf
AL
281 return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
282 }
6f33ba73
RGS
283#define UNI(f) UNI2(f,XTERM)
284#define UNIDOR(f) UNI2(f,XTERMORDORDOR)
a687059c 285
376fcdbf 286#define UNIBRACK(f) { \
6154021b 287 pl_yylval.ival = f; \
376fcdbf
AL
288 PL_bufptr = s; \
289 PL_last_uni = PL_oldbufptr; \
290 if (*s == '(') \
291 return REPORT( (int)FUNC1 ); \
29595ff2 292 s = PEEKSPACE(s); \
376fcdbf
AL
293 return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
294 }
79072805 295
9f68db38 296/* grandfather return to old style */
6154021b 297#define OLDLOP(f) return(pl_yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
79072805 298
8fa7f367
JH
299#ifdef DEBUGGING
300
6154021b 301/* how to interpret the pl_yylval associated with the token */
bbf60fe6
DM
302enum token_type {
303 TOKENTYPE_NONE,
304 TOKENTYPE_IVAL,
6154021b 305 TOKENTYPE_OPNUM, /* pl_yylval.ival contains an opcode number */
bbf60fe6
DM
306 TOKENTYPE_PVAL,
307 TOKENTYPE_OPVAL,
308 TOKENTYPE_GVVAL
309};
310
6d4a66ac
NC
311static struct debug_tokens {
312 const int token;
313 enum token_type type;
314 const char *name;
315} const debug_tokens[] =
9041c2e3 316{
bbf60fe6
DM
317 { ADDOP, TOKENTYPE_OPNUM, "ADDOP" },
318 { ANDAND, TOKENTYPE_NONE, "ANDAND" },
319 { ANDOP, TOKENTYPE_NONE, "ANDOP" },
320 { ANONSUB, TOKENTYPE_IVAL, "ANONSUB" },
321 { ARROW, TOKENTYPE_NONE, "ARROW" },
322 { ASSIGNOP, TOKENTYPE_OPNUM, "ASSIGNOP" },
323 { BITANDOP, TOKENTYPE_OPNUM, "BITANDOP" },
324 { BITOROP, TOKENTYPE_OPNUM, "BITOROP" },
325 { COLONATTR, TOKENTYPE_NONE, "COLONATTR" },
326 { CONTINUE, TOKENTYPE_NONE, "CONTINUE" },
0d863452 327 { DEFAULT, TOKENTYPE_NONE, "DEFAULT" },
bbf60fe6
DM
328 { DO, TOKENTYPE_NONE, "DO" },
329 { DOLSHARP, TOKENTYPE_NONE, "DOLSHARP" },
330 { DORDOR, TOKENTYPE_NONE, "DORDOR" },
331 { DOROP, TOKENTYPE_OPNUM, "DOROP" },
332 { DOTDOT, TOKENTYPE_IVAL, "DOTDOT" },
333 { ELSE, TOKENTYPE_NONE, "ELSE" },
334 { ELSIF, TOKENTYPE_IVAL, "ELSIF" },
335 { EQOP, TOKENTYPE_OPNUM, "EQOP" },
336 { FOR, TOKENTYPE_IVAL, "FOR" },
337 { FORMAT, TOKENTYPE_NONE, "FORMAT" },
338 { FUNC, TOKENTYPE_OPNUM, "FUNC" },
339 { FUNC0, TOKENTYPE_OPNUM, "FUNC0" },
340 { FUNC0SUB, TOKENTYPE_OPVAL, "FUNC0SUB" },
341 { FUNC1, TOKENTYPE_OPNUM, "FUNC1" },
342 { FUNCMETH, TOKENTYPE_OPVAL, "FUNCMETH" },
0d863452 343 { GIVEN, TOKENTYPE_IVAL, "GIVEN" },
bbf60fe6
DM
344 { HASHBRACK, TOKENTYPE_NONE, "HASHBRACK" },
345 { IF, TOKENTYPE_IVAL, "IF" },
346 { LABEL, TOKENTYPE_PVAL, "LABEL" },
347 { LOCAL, TOKENTYPE_IVAL, "LOCAL" },
348 { LOOPEX, TOKENTYPE_OPNUM, "LOOPEX" },
349 { LSTOP, TOKENTYPE_OPNUM, "LSTOP" },
350 { LSTOPSUB, TOKENTYPE_OPVAL, "LSTOPSUB" },
351 { MATCHOP, TOKENTYPE_OPNUM, "MATCHOP" },
352 { METHOD, TOKENTYPE_OPVAL, "METHOD" },
353 { MULOP, TOKENTYPE_OPNUM, "MULOP" },
354 { MY, TOKENTYPE_IVAL, "MY" },
355 { MYSUB, TOKENTYPE_NONE, "MYSUB" },
356 { NOAMP, TOKENTYPE_NONE, "NOAMP" },
357 { NOTOP, TOKENTYPE_NONE, "NOTOP" },
358 { OROP, TOKENTYPE_IVAL, "OROP" },
359 { OROR, TOKENTYPE_NONE, "OROR" },
360 { PACKAGE, TOKENTYPE_NONE, "PACKAGE" },
88e1f1a2
JV
361 { PLUGEXPR, TOKENTYPE_OPVAL, "PLUGEXPR" },
362 { PLUGSTMT, TOKENTYPE_OPVAL, "PLUGSTMT" },
bbf60fe6
DM
363 { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" },
364 { POSTDEC, TOKENTYPE_NONE, "POSTDEC" },
365 { POSTINC, TOKENTYPE_NONE, "POSTINC" },
366 { POWOP, TOKENTYPE_OPNUM, "POWOP" },
367 { PREDEC, TOKENTYPE_NONE, "PREDEC" },
368 { PREINC, TOKENTYPE_NONE, "PREINC" },
369 { PRIVATEREF, TOKENTYPE_OPVAL, "PRIVATEREF" },
370 { REFGEN, TOKENTYPE_NONE, "REFGEN" },
371 { RELOP, TOKENTYPE_OPNUM, "RELOP" },
372 { SHIFTOP, TOKENTYPE_OPNUM, "SHIFTOP" },
373 { SUB, TOKENTYPE_NONE, "SUB" },
374 { THING, TOKENTYPE_OPVAL, "THING" },
375 { UMINUS, TOKENTYPE_NONE, "UMINUS" },
376 { UNIOP, TOKENTYPE_OPNUM, "UNIOP" },
377 { UNIOPSUB, TOKENTYPE_OPVAL, "UNIOPSUB" },
378 { UNLESS, TOKENTYPE_IVAL, "UNLESS" },
379 { UNTIL, TOKENTYPE_IVAL, "UNTIL" },
380 { USE, TOKENTYPE_IVAL, "USE" },
0d863452 381 { WHEN, TOKENTYPE_IVAL, "WHEN" },
bbf60fe6
DM
382 { WHILE, TOKENTYPE_IVAL, "WHILE" },
383 { WORD, TOKENTYPE_OPVAL, "WORD" },
be25f609 384 { YADAYADA, TOKENTYPE_IVAL, "YADAYADA" },
c35e046a 385 { 0, TOKENTYPE_NONE, NULL }
bbf60fe6
DM
386};
387
6154021b 388/* dump the returned token in rv, plus any optional arg in pl_yylval */
998054bd 389
bbf60fe6 390STATIC int
704d4215 391S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
bbf60fe6 392{
97aff369 393 dVAR;
7918f24d
NC
394
395 PERL_ARGS_ASSERT_TOKEREPORT;
396
bbf60fe6 397 if (DEBUG_T_TEST) {
bd61b366 398 const char *name = NULL;
bbf60fe6 399 enum token_type type = TOKENTYPE_NONE;
f54cb97a 400 const struct debug_tokens *p;
396482e1 401 SV* const report = newSVpvs("<== ");
bbf60fe6 402
f54cb97a 403 for (p = debug_tokens; p->token; p++) {
bbf60fe6
DM
404 if (p->token == (int)rv) {
405 name = p->name;
406 type = p->type;
407 break;
408 }
409 }
410 if (name)
54667de8 411 Perl_sv_catpv(aTHX_ report, name);
bbf60fe6
DM
412 else if ((char)rv > ' ' && (char)rv < '~')
413 Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
414 else if (!rv)
396482e1 415 sv_catpvs(report, "EOF");
bbf60fe6
DM
416 else
417 Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
418 switch (type) {
419 case TOKENTYPE_NONE:
420 case TOKENTYPE_GVVAL: /* doesn't appear to be used */
421 break;
422 case TOKENTYPE_IVAL:
704d4215 423 Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)lvalp->ival);
bbf60fe6
DM
424 break;
425 case TOKENTYPE_OPNUM:
426 Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
704d4215 427 PL_op_name[lvalp->ival]);
bbf60fe6
DM
428 break;
429 case TOKENTYPE_PVAL:
704d4215 430 Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval);
bbf60fe6
DM
431 break;
432 case TOKENTYPE_OPVAL:
704d4215 433 if (lvalp->opval) {
401441c0 434 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
704d4215
GG
435 PL_op_name[lvalp->opval->op_type]);
436 if (lvalp->opval->op_type == OP_CONST) {
b6007c36 437 Perl_sv_catpvf(aTHX_ report, " %s",
704d4215 438 SvPEEK(cSVOPx_sv(lvalp->opval)));
b6007c36
DM
439 }
440
441 }
401441c0 442 else
396482e1 443 sv_catpvs(report, "(opval=null)");
bbf60fe6
DM
444 break;
445 }
b6007c36 446 PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
bbf60fe6
DM
447 };
448 return (int)rv;
998054bd
SC
449}
450
b6007c36
DM
451
452/* print the buffer with suitable escapes */
453
454STATIC void
15f169a1 455S_printbuf(pTHX_ const char *const fmt, const char *const s)
b6007c36 456{
396482e1 457 SV* const tmp = newSVpvs("");
7918f24d
NC
458
459 PERL_ARGS_ASSERT_PRINTBUF;
460
b6007c36
DM
461 PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
462 SvREFCNT_dec(tmp);
463}
464
8fa7f367
JH
465#endif
466
8290c323
NC
467static int
468S_deprecate_commaless_var_list(pTHX) {
469 PL_expect = XTERM;
470 deprecate("comma-less variable list");
471 return REPORT(','); /* grandfather non-comma-format format */
472}
473
ffb4593c
NT
474/*
475 * S_ao
476 *
c963b151
BD
477 * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
478 * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
ffb4593c
NT
479 */
480
76e3520e 481STATIC int
cea2e8a9 482S_ao(pTHX_ int toketype)
a0d0e21e 483{
97aff369 484 dVAR;
3280af22
NIS
485 if (*PL_bufptr == '=') {
486 PL_bufptr++;
a0d0e21e 487 if (toketype == ANDAND)
6154021b 488 pl_yylval.ival = OP_ANDASSIGN;
a0d0e21e 489 else if (toketype == OROR)
6154021b 490 pl_yylval.ival = OP_ORASSIGN;
c963b151 491 else if (toketype == DORDOR)
6154021b 492 pl_yylval.ival = OP_DORASSIGN;
a0d0e21e
LW
493 toketype = ASSIGNOP;
494 }
495 return toketype;
496}
497
ffb4593c
NT
498/*
499 * S_no_op
500 * When Perl expects an operator and finds something else, no_op
501 * prints the warning. It always prints "<something> found where
502 * operator expected. It prints "Missing semicolon on previous line?"
503 * if the surprise occurs at the start of the line. "do you need to
504 * predeclare ..." is printed out for code like "sub bar; foo bar $x"
505 * where the compiler doesn't know if foo is a method call or a function.
506 * It prints "Missing operator before end of line" if there's nothing
507 * after the missing operator, or "... before <...>" if there is something
508 * after the missing operator.
509 */
510
76e3520e 511STATIC void
15f169a1 512S_no_op(pTHX_ const char *const what, char *s)
463ee0b2 513{
97aff369 514 dVAR;
9d4ba2ae
AL
515 char * const oldbp = PL_bufptr;
516 const bool is_first = (PL_oldbufptr == PL_linestart);
68dc0745 517
7918f24d
NC
518 PERL_ARGS_ASSERT_NO_OP;
519
1189a94a
GS
520 if (!s)
521 s = oldbp;
07c798fb 522 else
1189a94a 523 PL_bufptr = s;
cea2e8a9 524 yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
56da5a46
RGS
525 if (ckWARN_d(WARN_SYNTAX)) {
526 if (is_first)
527 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
528 "\t(Missing semicolon on previous line?)\n");
529 else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
f54cb97a 530 const char *t;
c35e046a
AL
531 for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
532 NOOP;
56da5a46
RGS
533 if (t < PL_bufptr && isSPACE(*t))
534 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
535 "\t(Do you need to predeclare %.*s?)\n",
551405c4 536 (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
56da5a46
RGS
537 }
538 else {
539 assert(s >= oldbp);
540 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
551405c4 541 "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
56da5a46 542 }
07c798fb 543 }
3280af22 544 PL_bufptr = oldbp;
8990e307
LW
545}
546
ffb4593c
NT
547/*
548 * S_missingterm
549 * Complain about missing quote/regexp/heredoc terminator.
d4c19fe8 550 * If it's called with NULL then it cauterizes the line buffer.
ffb4593c
NT
551 * If we're in a delimited string and the delimiter is a control
552 * character, it's reformatted into a two-char sequence like ^C.
553 * This is fatal.
554 */
555
76e3520e 556STATIC void
cea2e8a9 557S_missingterm(pTHX_ char *s)
8990e307 558{
97aff369 559 dVAR;
8990e307
LW
560 char tmpbuf[3];
561 char q;
562 if (s) {
9d4ba2ae 563 char * const nl = strrchr(s,'\n');
d2719217 564 if (nl)
8990e307
LW
565 *nl = '\0';
566 }
463559e7 567 else if (isCNTRL(PL_multi_close)) {
8990e307 568 *tmpbuf = '^';
585ec06d 569 tmpbuf[1] = (char)toCTRL(PL_multi_close);
8990e307
LW
570 tmpbuf[2] = '\0';
571 s = tmpbuf;
572 }
573 else {
eb160463 574 *tmpbuf = (char)PL_multi_close;
8990e307
LW
575 tmpbuf[1] = '\0';
576 s = tmpbuf;
577 }
578 q = strchr(s,'"') ? '\'' : '"';
cea2e8a9 579 Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
463ee0b2 580}
79072805 581
ef89dcc3 582#define FEATURE_IS_ENABLED(name) \
0d863452 583 ((0 != (PL_hints & HINT_LOCALIZE_HH)) \
89529cee 584 && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
4a731d7b 585/* The longest string we pass in. */
1863b879 586#define MAX_FEATURE_LEN (sizeof("unicode_strings")-1)
4a731d7b 587
0d863452
RH
588/*
589 * S_feature_is_enabled
590 * Check whether the named feature is enabled.
591 */
592STATIC bool
15f169a1 593S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
0d863452 594{
97aff369 595 dVAR;
0d863452 596 HV * const hinthv = GvHV(PL_hintgv);
4a731d7b 597 char he_name[8 + MAX_FEATURE_LEN] = "feature_";
7918f24d
NC
598
599 PERL_ARGS_ASSERT_FEATURE_IS_ENABLED;
600
4a731d7b
NC
601 assert(namelen <= MAX_FEATURE_LEN);
602 memcpy(&he_name[8], name, namelen);
d4c19fe8 603
7b9ef140 604 return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
0d863452
RH
605}
606
ffb4593c 607/*
9cbb5ea2
GS
608 * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
609 * utf16-to-utf8-reversed.
ffb4593c
NT
610 */
611
c39cd008
GS
612#ifdef PERL_CR_FILTER
613static void
614strip_return(SV *sv)
615{
95a20fc0 616 register const char *s = SvPVX_const(sv);
9d4ba2ae 617 register const char * const e = s + SvCUR(sv);
7918f24d
NC
618
619 PERL_ARGS_ASSERT_STRIP_RETURN;
620
c39cd008
GS
621 /* outer loop optimized to do nothing if there are no CR-LFs */
622 while (s < e) {
623 if (*s++ == '\r' && *s == '\n') {
624 /* hit a CR-LF, need to copy the rest */
625 register char *d = s - 1;
626 *d++ = *s++;
627 while (s < e) {
628 if (*s == '\r' && s[1] == '\n')
629 s++;
630 *d++ = *s++;
631 }
632 SvCUR(sv) -= s - d;
633 return;
634 }
635 }
636}
a868473f 637
76e3520e 638STATIC I32
c39cd008 639S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
a868473f 640{
f54cb97a 641 const I32 count = FILTER_READ(idx+1, sv, maxlen);
c39cd008
GS
642 if (count > 0 && !maxlen)
643 strip_return(sv);
644 return count;
a868473f
NIS
645}
646#endif
647
199e78b7
DM
648
649
ffb4593c
NT
650/*
651 * Perl_lex_start
5486870f 652 *
e3abe207 653 * Create a parser object and initialise its parser and lexer fields
5486870f
DM
654 *
655 * rsfp is the opened file handle to read from (if any),
656 *
657 * line holds any initial content already read from the file (or in
658 * the case of no file, such as an eval, the whole contents);
659 *
660 * new_filter indicates that this is a new file and it shouldn't inherit
661 * the filters from the current parser (ie require).
ffb4593c
NT
662 */
663
a0d0e21e 664void
5486870f 665Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, bool new_filter)
79072805 666{
97aff369 667 dVAR;
6ef55633 668 const char *s = NULL;
8990e307 669 STRLEN len;
5486870f 670 yy_parser *parser, *oparser;
acdf0a21
DM
671
672 /* create and initialise a parser */
673
199e78b7 674 Newxz(parser, 1, yy_parser);
5486870f 675 parser->old_parser = oparser = PL_parser;
acdf0a21
DM
676 PL_parser = parser;
677
678 Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
679 parser->ps = parser->stack;
680 parser->stack_size = YYINITDEPTH;
681
682 parser->stack->state = 0;
683 parser->yyerrstatus = 0;
684 parser->yychar = YYEMPTY; /* Cause a token to be read. */
685
e3abe207
DM
686 /* on scope exit, free this parser and restore any outer one */
687 SAVEPARSER(parser);
7c4baf47 688 parser->saved_curcop = PL_curcop;
e3abe207 689
acdf0a21 690 /* initialise lexer state */
8990e307 691
fb205e7a
DM
692#ifdef PERL_MAD
693 parser->curforce = -1;
694#else
695 parser->nexttoke = 0;
696#endif
ca4cfd28 697 parser->error_count = oparser ? oparser->error_count : 0;
c2598295 698 parser->copline = NOLINE;
5afb0a62 699 parser->lex_state = LEX_NORMAL;
c2598295 700 parser->expect = XSTATE;
2f9285f8 701 parser->rsfp = rsfp;
56b27c9a 702 parser->rsfp_filters = (new_filter || !oparser) ? newAV()
502c6561 703 : MUTABLE_AV(SvREFCNT_inc(oparser->rsfp_filters));
2f9285f8 704
199e78b7
DM
705 Newx(parser->lex_brackstack, 120, char);
706 Newx(parser->lex_casestack, 12, char);
707 *parser->lex_casestack = '\0';
02b34bbe 708
10efb74f
NC
709 if (line) {
710 s = SvPV_const(line, len);
711 } else {
712 len = 0;
713 }
bdc0bf6f 714
10efb74f 715 if (!len) {
bdc0bf6f 716 parser->linestr = newSVpvs("\n;");
10efb74f 717 } else if (SvREADONLY(line) || s[len-1] != ';') {
bdc0bf6f 718 parser->linestr = newSVsv(line);
10efb74f 719 if (s[len-1] != ';')
bdc0bf6f 720 sv_catpvs(parser->linestr, "\n;");
6c5ce11d
NC
721 } else {
722 SvTEMP_off(line);
723 SvREFCNT_inc_simple_void_NN(line);
bdc0bf6f 724 parser->linestr = line;
8990e307 725 }
f06b5848
DM
726 parser->oldoldbufptr =
727 parser->oldbufptr =
728 parser->bufptr =
729 parser->linestart = SvPVX(parser->linestr);
730 parser->bufend = parser->bufptr + SvCUR(parser->linestr);
731 parser->last_lop = parser->last_uni = NULL;
79072805 732}
a687059c 733
e3abe207
DM
734
735/* delete a parser object */
736
737void
738Perl_parser_free(pTHX_ const yy_parser *parser)
739{
7918f24d
NC
740 PERL_ARGS_ASSERT_PARSER_FREE;
741
7c4baf47 742 PL_curcop = parser->saved_curcop;
bdc0bf6f
DM
743 SvREFCNT_dec(parser->linestr);
744
2f9285f8
DM
745 if (parser->rsfp == PerlIO_stdin())
746 PerlIO_clearerr(parser->rsfp);
799361c3
SH
747 else if (parser->rsfp && (!parser->old_parser ||
748 (parser->old_parser && parser->rsfp != parser->old_parser->rsfp)))
2f9285f8 749 PerlIO_close(parser->rsfp);
5486870f 750 SvREFCNT_dec(parser->rsfp_filters);
2f9285f8 751
e3abe207
DM
752 Safefree(parser->stack);
753 Safefree(parser->lex_brackstack);
754 Safefree(parser->lex_casestack);
755 PL_parser = parser->old_parser;
756 Safefree(parser);
757}
758
759
ffb4593c
NT
760/*
761 * Perl_lex_end
9cbb5ea2
GS
762 * Finalizer for lexing operations. Must be called when the parser is
763 * done with the lexer.
ffb4593c
NT
764 */
765
463ee0b2 766void
864dbfa3 767Perl_lex_end(pTHX)
463ee0b2 768{
97aff369 769 dVAR;
3280af22 770 PL_doextract = FALSE;
463ee0b2
LW
771}
772
ffb4593c 773/*
f0e67a1d
Z
774=for apidoc AmxU|SV *|PL_parser-E<gt>linestr
775
776Buffer scalar containing the chunk currently under consideration of the
777text currently being lexed. This is always a plain string scalar (for
778which C<SvPOK> is true). It is not intended to be used as a scalar by
779normal scalar means; instead refer to the buffer directly by the pointer
780variables described below.
781
782The lexer maintains various C<char*> pointers to things in the
783C<PL_parser-E<gt>linestr> buffer. If C<PL_parser-E<gt>linestr> is ever
784reallocated, all of these pointers must be updated. Don't attempt to
785do this manually, but rather use L</lex_grow_linestr> if you need to
786reallocate the buffer.
787
788The content of the text chunk in the buffer is commonly exactly one
789complete line of input, up to and including a newline terminator,
790but there are situations where it is otherwise. The octets of the
791buffer may be intended to be interpreted as either UTF-8 or Latin-1.
792The function L</lex_bufutf8> tells you which. Do not use the C<SvUTF8>
793flag on this scalar, which may disagree with it.
794
795For direct examination of the buffer, the variable
796L</PL_parser-E<gt>bufend> points to the end of the buffer. The current
797lexing position is pointed to by L</PL_parser-E<gt>bufptr>. Direct use
798of these pointers is usually preferable to examination of the scalar
799through normal scalar means.
800
801=for apidoc AmxU|char *|PL_parser-E<gt>bufend
802
803Direct pointer to the end of the chunk of text currently being lexed, the
804end of the lexer buffer. This is equal to C<SvPVX(PL_parser-E<gt>linestr)
805+ SvCUR(PL_parser-E<gt>linestr)>. A NUL character (zero octet) is
806always located at the end of the buffer, and does not count as part of
807the buffer's contents.
808
809=for apidoc AmxU|char *|PL_parser-E<gt>bufptr
810
811Points to the current position of lexing inside the lexer buffer.
812Characters around this point may be freely examined, within
813the range delimited by C<SvPVX(L</PL_parser-E<gt>linestr>)> and
814L</PL_parser-E<gt>bufend>. The octets of the buffer may be intended to be
815interpreted as either UTF-8 or Latin-1, as indicated by L</lex_bufutf8>.
816
817Lexing code (whether in the Perl core or not) moves this pointer past
818the characters that it consumes. It is also expected to perform some
819bookkeeping whenever a newline character is consumed. This movement
820can be more conveniently performed by the function L</lex_read_to>,
821which handles newlines appropriately.
822
823Interpretation of the buffer's octets can be abstracted out by
824using the slightly higher-level functions L</lex_peek_unichar> and
825L</lex_read_unichar>.
826
827=for apidoc AmxU|char *|PL_parser-E<gt>linestart
828
829Points to the start of the current line inside the lexer buffer.
830This is useful for indicating at which column an error occurred, and
831not much else. This must be updated by any lexing code that consumes
832a newline; the function L</lex_read_to> handles this detail.
833
834=cut
835*/
836
837/*
838=for apidoc Amx|bool|lex_bufutf8
839
840Indicates whether the octets in the lexer buffer
841(L</PL_parser-E<gt>linestr>) should be interpreted as the UTF-8 encoding
842of Unicode characters. If not, they should be interpreted as Latin-1
843characters. This is analogous to the C<SvUTF8> flag for scalars.
844
845In UTF-8 mode, it is not guaranteed that the lexer buffer actually
846contains valid UTF-8. Lexing code must be robust in the face of invalid
847encoding.
848
849The actual C<SvUTF8> flag of the L</PL_parser-E<gt>linestr> scalar
850is significant, but not the whole story regarding the input character
851encoding. Normally, when a file is being read, the scalar contains octets
852and its C<SvUTF8> flag is off, but the octets should be interpreted as
853UTF-8 if the C<use utf8> pragma is in effect. During a string eval,
854however, the scalar may have the C<SvUTF8> flag on, and in this case its
855octets should be interpreted as UTF-8 unless the C<use bytes> pragma
856is in effect. This logic may change in the future; use this function
857instead of implementing the logic yourself.
858
859=cut
860*/
861
862bool
863Perl_lex_bufutf8(pTHX)
864{
865 return UTF;
866}
867
868/*
869=for apidoc Amx|char *|lex_grow_linestr|STRLEN len
870
871Reallocates the lexer buffer (L</PL_parser-E<gt>linestr>) to accommodate
872at least I<len> octets (including terminating NUL). Returns a
873pointer to the reallocated buffer. This is necessary before making
874any direct modification of the buffer that would increase its length.
875L</lex_stuff_pvn> provides a more convenient way to insert text into
876the buffer.
877
878Do not use C<SvGROW> or C<sv_grow> directly on C<PL_parser-E<gt>linestr>;
879this function updates all of the lexer's variables that point directly
880into the buffer.
881
882=cut
883*/
884
885char *
886Perl_lex_grow_linestr(pTHX_ STRLEN len)
887{
888 SV *linestr;
889 char *buf;
890 STRLEN bufend_pos, bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
891 STRLEN linestart_pos, last_uni_pos, last_lop_pos;
892 linestr = PL_parser->linestr;
893 buf = SvPVX(linestr);
894 if (len <= SvLEN(linestr))
895 return buf;
896 bufend_pos = PL_parser->bufend - buf;
897 bufptr_pos = PL_parser->bufptr - buf;
898 oldbufptr_pos = PL_parser->oldbufptr - buf;
899 oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
900 linestart_pos = PL_parser->linestart - buf;
901 last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
902 last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
903 buf = sv_grow(linestr, len);
904 PL_parser->bufend = buf + bufend_pos;
905 PL_parser->bufptr = buf + bufptr_pos;
906 PL_parser->oldbufptr = buf + oldbufptr_pos;
907 PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
908 PL_parser->linestart = buf + linestart_pos;
909 if (PL_parser->last_uni)
910 PL_parser->last_uni = buf + last_uni_pos;
911 if (PL_parser->last_lop)
912 PL_parser->last_lop = buf + last_lop_pos;
913 return buf;
914}
915
916/*
917=for apidoc Amx|void|lex_stuff_pvn|char *pv|STRLEN len|U32 flags
918
919Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
920immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
921reallocating the buffer if necessary. This means that lexing code that
922runs later will see the characters as if they had appeared in the input.
923It is not recommended to do this as part of normal parsing, and most
924uses of this facility run the risk of the inserted characters being
925interpreted in an unintended manner.
926
927The string to be inserted is represented by I<len> octets starting
928at I<pv>. These octets are interpreted as either UTF-8 or Latin-1,
929according to whether the C<LEX_STUFF_UTF8> flag is set in I<flags>.
930The characters are recoded for the lexer buffer, according to how the
931buffer is currently being interpreted (L</lex_bufutf8>). If a string
932to be interpreted is available as a Perl scalar, the L</lex_stuff_sv>
933function is more convenient.
934
935=cut
936*/
937
938void
939Perl_lex_stuff_pvn(pTHX_ char *pv, STRLEN len, U32 flags)
940{
941 char *bufptr;
942 PERL_ARGS_ASSERT_LEX_STUFF_PVN;
943 if (flags & ~(LEX_STUFF_UTF8))
944 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_pvn");
945 if (UTF) {
946 if (flags & LEX_STUFF_UTF8) {
947 goto plain_copy;
948 } else {
949 STRLEN highhalf = 0;
950 char *p, *e = pv+len;
951 for (p = pv; p != e; p++)
952 highhalf += !!(((U8)*p) & 0x80);
953 if (!highhalf)
954 goto plain_copy;
955 lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len+highhalf);
956 bufptr = PL_parser->bufptr;
957 Move(bufptr, bufptr+len+highhalf, PL_parser->bufend+1-bufptr, char);
958 PL_parser->bufend += len+highhalf;
959 for (p = pv; p != e; p++) {
960 U8 c = (U8)*p;
961 if (c & 0x80) {
962 *bufptr++ = (char)(0xc0 | (c >> 6));
963 *bufptr++ = (char)(0x80 | (c & 0x3f));
964 } else {
965 *bufptr++ = (char)c;
966 }
967 }
968 }
969 } else {
970 if (flags & LEX_STUFF_UTF8) {
971 STRLEN highhalf = 0;
972 char *p, *e = pv+len;
973 for (p = pv; p != e; p++) {
974 U8 c = (U8)*p;
975 if (c >= 0xc4) {
976 Perl_croak(aTHX_ "Lexing code attempted to stuff "
977 "non-Latin-1 character into Latin-1 input");
978 } else if (c >= 0xc2 && p+1 != e &&
979 (((U8)p[1]) & 0xc0) == 0x80) {
980 p++;
981 highhalf++;
982 } else if (c >= 0x80) {
983 /* malformed UTF-8 */
984 ENTER;
985 SAVESPTR(PL_warnhook);
986 PL_warnhook = PERL_WARNHOOK_FATAL;
987 utf8n_to_uvuni((U8*)p, e-p, NULL, 0);
988 LEAVE;
989 }
990 }
991 if (!highhalf)
992 goto plain_copy;
993 lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len-highhalf);
994 bufptr = PL_parser->bufptr;
995 Move(bufptr, bufptr+len-highhalf, PL_parser->bufend+1-bufptr, char);
996 PL_parser->bufend += len-highhalf;
997 for (p = pv; p != e; p++) {
998 U8 c = (U8)*p;
999 if (c & 0x80) {
1000 *bufptr++ = (char)(((c & 0x3) << 6) | (p[1] & 0x3f));
1001 p++;
1002 } else {
1003 *bufptr++ = (char)c;
1004 }
1005 }
1006 } else {
1007 plain_copy:
1008 lex_grow_linestr(SvCUR(PL_parser->linestr)+1+len);
1009 bufptr = PL_parser->bufptr;
1010 Move(bufptr, bufptr+len, PL_parser->bufend+1-bufptr, char);
1011 PL_parser->bufend += len;
1012 Copy(pv, bufptr, len, char);
1013 }
1014 }
1015}
1016
1017/*
1018=for apidoc Amx|void|lex_stuff_sv|SV *sv|U32 flags
1019
1020Insert characters into the lexer buffer (L</PL_parser-E<gt>linestr>),
1021immediately after the current lexing point (L</PL_parser-E<gt>bufptr>),
1022reallocating the buffer if necessary. This means that lexing code that
1023runs later will see the characters as if they had appeared in the input.
1024It is not recommended to do this as part of normal parsing, and most
1025uses of this facility run the risk of the inserted characters being
1026interpreted in an unintended manner.
1027
1028The string to be inserted is the string value of I<sv>. The characters
1029are recoded for the lexer buffer, according to how the buffer is currently
1030being interpreted (L</lex_bufutf8>). If a string to be interpreted is
1031not already a Perl scalar, the L</lex_stuff_pvn> function avoids the
1032need to construct a scalar.
1033
1034=cut
1035*/
1036
1037void
1038Perl_lex_stuff_sv(pTHX_ SV *sv, U32 flags)
1039{
1040 char *pv;
1041 STRLEN len;
1042 PERL_ARGS_ASSERT_LEX_STUFF_SV;
1043 if (flags)
1044 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_stuff_sv");
1045 pv = SvPV(sv, len);
1046 lex_stuff_pvn(pv, len, flags | (SvUTF8(sv) ? LEX_STUFF_UTF8 : 0));
1047}
1048
1049/*
1050=for apidoc Amx|void|lex_unstuff|char *ptr
1051
1052Discards text about to be lexed, from L</PL_parser-E<gt>bufptr> up to
1053I<ptr>. Text following I<ptr> will be moved, and the buffer shortened.
1054This hides the discarded text from any lexing code that runs later,
1055as if the text had never appeared.
1056
1057This is not the normal way to consume lexed text. For that, use
1058L</lex_read_to>.
1059
1060=cut
1061*/
1062
1063void
1064Perl_lex_unstuff(pTHX_ char *ptr)
1065{
1066 char *buf, *bufend;
1067 STRLEN unstuff_len;
1068 PERL_ARGS_ASSERT_LEX_UNSTUFF;
1069 buf = PL_parser->bufptr;
1070 if (ptr < buf)
1071 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1072 if (ptr == buf)
1073 return;
1074 bufend = PL_parser->bufend;
1075 if (ptr > bufend)
1076 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_unstuff");
1077 unstuff_len = ptr - buf;
1078 Move(ptr, buf, bufend+1-ptr, char);
1079 SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - unstuff_len);
1080 PL_parser->bufend = bufend - unstuff_len;
1081}
1082
1083/*
1084=for apidoc Amx|void|lex_read_to|char *ptr
1085
1086Consume text in the lexer buffer, from L</PL_parser-E<gt>bufptr> up
1087to I<ptr>. This advances L</PL_parser-E<gt>bufptr> to match I<ptr>,
1088performing the correct bookkeeping whenever a newline character is passed.
1089This is the normal way to consume lexed text.
1090
1091Interpretation of the buffer's octets can be abstracted out by
1092using the slightly higher-level functions L</lex_peek_unichar> and
1093L</lex_read_unichar>.
1094
1095=cut
1096*/
1097
1098void
1099Perl_lex_read_to(pTHX_ char *ptr)
1100{
1101 char *s;
1102 PERL_ARGS_ASSERT_LEX_READ_TO;
1103 s = PL_parser->bufptr;
1104 if (ptr < s || ptr > PL_parser->bufend)
1105 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_to");
1106 for (; s != ptr; s++)
1107 if (*s == '\n') {
1108 CopLINE_inc(PL_curcop);
1109 PL_parser->linestart = s+1;
1110 }
1111 PL_parser->bufptr = ptr;
1112}
1113
1114/*
1115=for apidoc Amx|void|lex_discard_to|char *ptr
1116
1117Discards the first part of the L</PL_parser-E<gt>linestr> buffer,
1118up to I<ptr>. The remaining content of the buffer will be moved, and
1119all pointers into the buffer updated appropriately. I<ptr> must not
1120be later in the buffer than the position of L</PL_parser-E<gt>bufptr>:
1121it is not permitted to discard text that has yet to be lexed.
1122
1123Normally it is not necessarily to do this directly, because it suffices to
1124use the implicit discarding behaviour of L</lex_next_chunk> and things
1125based on it. However, if a token stretches across multiple lines,
1126and the lexing code has kept multiple lines of text in the buffer fof
1127that purpose, then after completion of the token it would be wise to
1128explicitly discard the now-unneeded earlier lines, to avoid future
1129multi-line tokens growing the buffer without bound.
1130
1131=cut
1132*/
1133
1134void
1135Perl_lex_discard_to(pTHX_ char *ptr)
1136{
1137 char *buf;
1138 STRLEN discard_len;
1139 PERL_ARGS_ASSERT_LEX_DISCARD_TO;
1140 buf = SvPVX(PL_parser->linestr);
1141 if (ptr < buf)
1142 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1143 if (ptr == buf)
1144 return;
1145 if (ptr > PL_parser->bufptr)
1146 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_discard_to");
1147 discard_len = ptr - buf;
1148 if (PL_parser->oldbufptr < ptr)
1149 PL_parser->oldbufptr = ptr;
1150 if (PL_parser->oldoldbufptr < ptr)
1151 PL_parser->oldoldbufptr = ptr;
1152 if (PL_parser->last_uni && PL_parser->last_uni < ptr)
1153 PL_parser->last_uni = NULL;
1154 if (PL_parser->last_lop && PL_parser->last_lop < ptr)
1155 PL_parser->last_lop = NULL;
1156 Move(ptr, buf, PL_parser->bufend+1-ptr, char);
1157 SvCUR_set(PL_parser->linestr, SvCUR(PL_parser->linestr) - discard_len);
1158 PL_parser->bufend -= discard_len;
1159 PL_parser->bufptr -= discard_len;
1160 PL_parser->oldbufptr -= discard_len;
1161 PL_parser->oldoldbufptr -= discard_len;
1162 if (PL_parser->last_uni)
1163 PL_parser->last_uni -= discard_len;
1164 if (PL_parser->last_lop)
1165 PL_parser->last_lop -= discard_len;
1166}
1167
1168/*
1169=for apidoc Amx|bool|lex_next_chunk|U32 flags
1170
1171Reads in the next chunk of text to be lexed, appending it to
1172L</PL_parser-E<gt>linestr>. This should be called when lexing code has
1173looked to the end of the current chunk and wants to know more. It is
1174usual, but not necessary, for lexing to have consumed the entirety of
1175the current chunk at this time.
1176
1177If L</PL_parser-E<gt>bufptr> is pointing to the very end of the current
1178chunk (i.e., the current chunk has been entirely consumed), normally the
1179current chunk will be discarded at the same time that the new chunk is
1180read in. If I<flags> includes C<LEX_KEEP_PREVIOUS>, the current chunk
1181will not be discarded. If the current chunk has not been entirely
1182consumed, then it will not be discarded regardless of the flag.
1183
1184Returns true if some new text was added to the buffer, or false if the
1185buffer has reached the end of the input text.
1186
1187=cut
1188*/
1189
1190#define LEX_FAKE_EOF 0x80000000
1191
1192bool
1193Perl_lex_next_chunk(pTHX_ U32 flags)
1194{
1195 SV *linestr;
1196 char *buf;
1197 STRLEN old_bufend_pos, new_bufend_pos;
1198 STRLEN bufptr_pos, oldbufptr_pos, oldoldbufptr_pos;
1199 STRLEN linestart_pos, last_uni_pos, last_lop_pos;
17cc9359 1200 bool got_some_for_debugger = 0;
f0e67a1d
Z
1201 bool got_some;
1202 if (flags & ~(LEX_KEEP_PREVIOUS|LEX_FAKE_EOF))
1203 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_next_chunk");
f0e67a1d
Z
1204 linestr = PL_parser->linestr;
1205 buf = SvPVX(linestr);
1206 if (!(flags & LEX_KEEP_PREVIOUS) &&
1207 PL_parser->bufptr == PL_parser->bufend) {
1208 old_bufend_pos = bufptr_pos = oldbufptr_pos = oldoldbufptr_pos = 0;
1209 linestart_pos = 0;
1210 if (PL_parser->last_uni != PL_parser->bufend)
1211 PL_parser->last_uni = NULL;
1212 if (PL_parser->last_lop != PL_parser->bufend)
1213 PL_parser->last_lop = NULL;
1214 last_uni_pos = last_lop_pos = 0;
1215 *buf = 0;
1216 SvCUR(linestr) = 0;
1217 } else {
1218 old_bufend_pos = PL_parser->bufend - buf;
1219 bufptr_pos = PL_parser->bufptr - buf;
1220 oldbufptr_pos = PL_parser->oldbufptr - buf;
1221 oldoldbufptr_pos = PL_parser->oldoldbufptr - buf;
1222 linestart_pos = PL_parser->linestart - buf;
1223 last_uni_pos = PL_parser->last_uni ? PL_parser->last_uni - buf : 0;
1224 last_lop_pos = PL_parser->last_lop ? PL_parser->last_lop - buf : 0;
1225 }
1226 if (flags & LEX_FAKE_EOF) {
1227 goto eof;
1228 } else if (!PL_parser->rsfp) {
1229 got_some = 0;
1230 } else if (filter_gets(linestr, old_bufend_pos)) {
1231 got_some = 1;
17cc9359 1232 got_some_for_debugger = 1;
f0e67a1d 1233 } else {
580561a3
Z
1234 if (!SvPOK(linestr)) /* can get undefined by filter_gets */
1235 sv_setpvs(linestr, "");
f0e67a1d
Z
1236 eof:
1237 /* End of real input. Close filehandle (unless it was STDIN),
1238 * then add implicit termination.
1239 */
1240 if ((PerlIO*)PL_parser->rsfp == PerlIO_stdin())
1241 PerlIO_clearerr(PL_parser->rsfp);
1242 else if (PL_parser->rsfp)
1243 (void)PerlIO_close(PL_parser->rsfp);
1244 PL_parser->rsfp = NULL;
1245 PL_doextract = FALSE;
1246#ifdef PERL_MAD
1247 if (PL_madskills && !PL_in_eval && (PL_minus_p || PL_minus_n))
1248 PL_faketokens = 1;
1249#endif
1250 if (!PL_in_eval && PL_minus_p) {
1251 sv_catpvs(linestr,
1252 /*{*/";}continue{print or die qq(-p destination: $!\\n);}");
1253 PL_minus_n = PL_minus_p = 0;
1254 } else if (!PL_in_eval && PL_minus_n) {
1255 sv_catpvs(linestr, /*{*/";}");
1256 PL_minus_n = 0;
1257 } else
1258 sv_catpvs(linestr, ";");
1259 got_some = 1;
1260 }
1261 buf = SvPVX(linestr);
1262 new_bufend_pos = SvCUR(linestr);
1263 PL_parser->bufend = buf + new_bufend_pos;
1264 PL_parser->bufptr = buf + bufptr_pos;
1265 PL_parser->oldbufptr = buf + oldbufptr_pos;
1266 PL_parser->oldoldbufptr = buf + oldoldbufptr_pos;
1267 PL_parser->linestart = buf + linestart_pos;
1268 if (PL_parser->last_uni)
1269 PL_parser->last_uni = buf + last_uni_pos;
1270 if (PL_parser->last_lop)
1271 PL_parser->last_lop = buf + last_lop_pos;
17cc9359 1272 if (got_some_for_debugger && (PERLDB_LINE || PERLDB_SAVESRC) &&
f0e67a1d
Z
1273 PL_curstash != PL_debstash) {
1274 /* debugger active and we're not compiling the debugger code,
1275 * so store the line into the debugger's array of lines
1276 */
1277 update_debugger_info(NULL, buf+old_bufend_pos,
1278 new_bufend_pos-old_bufend_pos);
1279 }
1280 return got_some;
1281}
1282
1283/*
1284=for apidoc Amx|I32|lex_peek_unichar|U32 flags
1285
1286Looks ahead one (Unicode) character in the text currently being lexed.
1287Returns the codepoint (unsigned integer value) of the next character,
1288or -1 if lexing has reached the end of the input text. To consume the
1289peeked character, use L</lex_read_unichar>.
1290
1291If the next character is in (or extends into) the next chunk of input
1292text, the next chunk will be read in. Normally the current chunk will be
1293discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1294then the current chunk will not be discarded.
1295
1296If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1297is encountered, an exception is generated.
1298
1299=cut
1300*/
1301
1302I32
1303Perl_lex_peek_unichar(pTHX_ U32 flags)
1304{
1305 char *s, *bufend;
1306 if (flags & ~(LEX_KEEP_PREVIOUS))
1307 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_peek_unichar");
1308 s = PL_parser->bufptr;
1309 bufend = PL_parser->bufend;
1310 if (UTF) {
1311 U8 head;
1312 I32 unichar;
1313 STRLEN len, retlen;
1314 if (s == bufend) {
1315 if (!lex_next_chunk(flags))
1316 return -1;
1317 s = PL_parser->bufptr;
1318 bufend = PL_parser->bufend;
1319 }
1320 head = (U8)*s;
1321 if (!(head & 0x80))
1322 return head;
1323 if (head & 0x40) {
1324 len = PL_utf8skip[head];
1325 while ((STRLEN)(bufend-s) < len) {
1326 if (!lex_next_chunk(flags | LEX_KEEP_PREVIOUS))
1327 break;
1328 s = PL_parser->bufptr;
1329 bufend = PL_parser->bufend;
1330 }
1331 }
1332 unichar = utf8n_to_uvuni((U8*)s, bufend-s, &retlen, UTF8_CHECK_ONLY);
1333 if (retlen == (STRLEN)-1) {
1334 /* malformed UTF-8 */
1335 ENTER;
1336 SAVESPTR(PL_warnhook);
1337 PL_warnhook = PERL_WARNHOOK_FATAL;
1338 utf8n_to_uvuni((U8*)s, bufend-s, NULL, 0);
1339 LEAVE;
1340 }
1341 return unichar;
1342 } else {
1343 if (s == bufend) {
1344 if (!lex_next_chunk(flags))
1345 return -1;
1346 s = PL_parser->bufptr;
1347 }
1348 return (U8)*s;
1349 }
1350}
1351
1352/*
1353=for apidoc Amx|I32|lex_read_unichar|U32 flags
1354
1355Reads the next (Unicode) character in the text currently being lexed.
1356Returns the codepoint (unsigned integer value) of the character read,
1357and moves L</PL_parser-E<gt>bufptr> past the character, or returns -1
1358if lexing has reached the end of the input text. To non-destructively
1359examine the next character, use L</lex_peek_unichar> instead.
1360
1361If the next character is in (or extends into) the next chunk of input
1362text, the next chunk will be read in. Normally the current chunk will be
1363discarded at the same time, but if I<flags> includes C<LEX_KEEP_PREVIOUS>
1364then the current chunk will not be discarded.
1365
1366If the input is being interpreted as UTF-8 and a UTF-8 encoding error
1367is encountered, an exception is generated.
1368
1369=cut
1370*/
1371
1372I32
1373Perl_lex_read_unichar(pTHX_ U32 flags)
1374{
1375 I32 c;
1376 if (flags & ~(LEX_KEEP_PREVIOUS))
1377 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_unichar");
1378 c = lex_peek_unichar(flags);
1379 if (c != -1) {
1380 if (c == '\n')
1381 CopLINE_inc(PL_curcop);
1382 PL_parser->bufptr += UTF8SKIP(PL_parser->bufptr);
1383 }
1384 return c;
1385}
1386
1387/*
1388=for apidoc Amx|void|lex_read_space|U32 flags
1389
1390Reads optional spaces, in Perl style, in the text currently being
1391lexed. The spaces may include ordinary whitespace characters and
1392Perl-style comments. C<#line> directives are processed if encountered.
1393L</PL_parser-E<gt>bufptr> is moved past the spaces, so that it points
1394at a non-space character (or the end of the input text).
1395
1396If spaces extend into the next chunk of input text, the next chunk will
1397be read in. Normally the current chunk will be discarded at the same
1398time, but if I<flags> includes C<LEX_KEEP_PREVIOUS> then the current
1399chunk will not be discarded.
1400
1401=cut
1402*/
1403
f0998909
Z
1404#define LEX_NO_NEXT_CHUNK 0x80000000
1405
f0e67a1d
Z
1406void
1407Perl_lex_read_space(pTHX_ U32 flags)
1408{
1409 char *s, *bufend;
1410 bool need_incline = 0;
f0998909 1411 if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK))
f0e67a1d
Z
1412 Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space");
1413#ifdef PERL_MAD
1414 if (PL_skipwhite) {
1415 sv_free(PL_skipwhite);
1416 PL_skipwhite = NULL;
1417 }
1418 if (PL_madskills)
1419 PL_skipwhite = newSVpvs("");
1420#endif /* PERL_MAD */
1421 s = PL_parser->bufptr;
1422 bufend = PL_parser->bufend;
1423 while (1) {
1424 char c = *s;
1425 if (c == '#') {
1426 do {
1427 c = *++s;
1428 } while (!(c == '\n' || (c == 0 && s == bufend)));
1429 } else if (c == '\n') {
1430 s++;
1431 PL_parser->linestart = s;
1432 if (s == bufend)
1433 need_incline = 1;
1434 else
1435 incline(s);
1436 } else if (isSPACE(c)) {
1437 s++;
1438 } else if (c == 0 && s == bufend) {
1439 bool got_more;
1440#ifdef PERL_MAD
1441 if (PL_madskills)
1442 sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1443#endif /* PERL_MAD */
f0998909
Z
1444 if (flags & LEX_NO_NEXT_CHUNK)
1445 break;
f0e67a1d
Z
1446 PL_parser->bufptr = s;
1447 CopLINE_inc(PL_curcop);
1448 got_more = lex_next_chunk(flags);
1449 CopLINE_dec(PL_curcop);
1450 s = PL_parser->bufptr;
1451 bufend = PL_parser->bufend;
1452 if (!got_more)
1453 break;
1454 if (need_incline && PL_parser->rsfp) {
1455 incline(s);
1456 need_incline = 0;
1457 }
1458 } else {
1459 break;
1460 }
1461 }
1462#ifdef PERL_MAD
1463 if (PL_madskills)
1464 sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr);
1465#endif /* PERL_MAD */
1466 PL_parser->bufptr = s;
1467}
1468
1469/*
ffb4593c
NT
1470 * S_incline
1471 * This subroutine has nothing to do with tilting, whether at windmills
1472 * or pinball tables. Its name is short for "increment line". It
57843af0 1473 * increments the current line number in CopLINE(PL_curcop) and checks
ffb4593c 1474 * to see whether the line starts with a comment of the form
9cbb5ea2
GS
1475 * # line 500 "foo.pm"
1476 * If so, it sets the current line number and file to the values in the comment.
ffb4593c
NT
1477 */
1478
76e3520e 1479STATIC void
d9095cec 1480S_incline(pTHX_ const char *s)
463ee0b2 1481{
97aff369 1482 dVAR;
d9095cec
NC
1483 const char *t;
1484 const char *n;
1485 const char *e;
463ee0b2 1486
7918f24d
NC
1487 PERL_ARGS_ASSERT_INCLINE;
1488
57843af0 1489 CopLINE_inc(PL_curcop);
463ee0b2
LW
1490 if (*s++ != '#')
1491 return;
d4c19fe8
AL
1492 while (SPACE_OR_TAB(*s))
1493 s++;
73659bf1
GS
1494 if (strnEQ(s, "line", 4))
1495 s += 4;
1496 else
1497 return;
084592ab 1498 if (SPACE_OR_TAB(*s))
73659bf1 1499 s++;
4e553d73 1500 else
73659bf1 1501 return;
d4c19fe8
AL
1502 while (SPACE_OR_TAB(*s))
1503 s++;
463ee0b2
LW
1504 if (!isDIGIT(*s))
1505 return;
d4c19fe8 1506
463ee0b2
LW
1507 n = s;
1508 while (isDIGIT(*s))
1509 s++;
07714eb4 1510 if (!SPACE_OR_TAB(*s) && *s != '\r' && *s != '\n' && *s != '\0')
26b6dc3f 1511 return;
bf4acbe4 1512 while (SPACE_OR_TAB(*s))
463ee0b2 1513 s++;
73659bf1 1514 if (*s == '"' && (t = strchr(s+1, '"'))) {
463ee0b2 1515 s++;
73659bf1
GS
1516 e = t + 1;
1517 }
463ee0b2 1518 else {
c35e046a
AL
1519 t = s;
1520 while (!isSPACE(*t))
1521 t++;
73659bf1 1522 e = t;
463ee0b2 1523 }
bf4acbe4 1524 while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
73659bf1
GS
1525 e++;
1526 if (*e != '\n' && *e != '\0')
1527 return; /* false alarm */
1528
f4dd75d9 1529 if (t - s > 0) {
d9095cec 1530 const STRLEN len = t - s;
8a5ee598 1531#ifndef USE_ITHREADS
19bad673
NC
1532 SV *const temp_sv = CopFILESV(PL_curcop);
1533 const char *cf;
1534 STRLEN tmplen;
1535
1536 if (temp_sv) {
1537 cf = SvPVX(temp_sv);
1538 tmplen = SvCUR(temp_sv);
1539 } else {
1540 cf = NULL;
1541 tmplen = 0;
1542 }
1543
42d9b98d 1544 if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
e66cf94c
RGS
1545 /* must copy *{"::_<(eval N)[oldfilename:L]"}
1546 * to *{"::_<newfilename"} */
44867030
NC
1547 /* However, the long form of evals is only turned on by the
1548 debugger - usually they're "(eval %lu)" */
1549 char smallbuf[128];
1550 char *tmpbuf;
1551 GV **gvp;
d9095cec 1552 STRLEN tmplen2 = len;
798b63bc 1553 if (tmplen + 2 <= sizeof smallbuf)
e66cf94c
RGS
1554 tmpbuf = smallbuf;
1555 else
2ae0db35 1556 Newx(tmpbuf, tmplen + 2, char);
44867030
NC
1557 tmpbuf[0] = '_';
1558 tmpbuf[1] = '<';
2ae0db35 1559 memcpy(tmpbuf + 2, cf, tmplen);
44867030 1560 tmplen += 2;
8a5ee598
RGS
1561 gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
1562 if (gvp) {
44867030
NC
1563 char *tmpbuf2;
1564 GV *gv2;
1565
1566 if (tmplen2 + 2 <= sizeof smallbuf)
1567 tmpbuf2 = smallbuf;
1568 else
1569 Newx(tmpbuf2, tmplen2 + 2, char);
1570
1571 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
1572 /* Either they malloc'd it, or we malloc'd it,
1573 so no prefix is present in ours. */
1574 tmpbuf2[0] = '_';
1575 tmpbuf2[1] = '<';
1576 }
1577
1578 memcpy(tmpbuf2 + 2, s, tmplen2);
1579 tmplen2 += 2;
1580
8a5ee598 1581 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
e5527e4b 1582 if (!isGV(gv2)) {
8a5ee598 1583 gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
e5527e4b
RGS
1584 /* adjust ${"::_<newfilename"} to store the new file name */
1585 GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
3cb1dbc6
NC
1586 GvHV(gv2) = MUTABLE_HV(SvREFCNT_inc(GvHV(*gvp)));
1587 GvAV(gv2) = MUTABLE_AV(SvREFCNT_inc(GvAV(*gvp)));
e5527e4b 1588 }
44867030
NC
1589
1590 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
8a5ee598 1591 }
e66cf94c 1592 if (tmpbuf != smallbuf) Safefree(tmpbuf);
e66cf94c 1593 }
8a5ee598 1594#endif
05ec9bb3 1595 CopFILE_free(PL_curcop);
d9095cec 1596 CopFILE_setn(PL_curcop, s, len);
f4dd75d9 1597 }
57843af0 1598 CopLINE_set(PL_curcop, atoi(n)-1);
463ee0b2
LW
1599}
1600
29595ff2 1601#ifdef PERL_MAD
cd81e915 1602/* skip space before PL_thistoken */
29595ff2
NC
1603
1604STATIC char *
1605S_skipspace0(pTHX_ register char *s)
1606{
7918f24d
NC
1607 PERL_ARGS_ASSERT_SKIPSPACE0;
1608
29595ff2
NC
1609 s = skipspace(s);
1610 if (!PL_madskills)
1611 return s;
cd81e915
NC
1612 if (PL_skipwhite) {
1613 if (!PL_thiswhite)
6b29d1f5 1614 PL_thiswhite = newSVpvs("");
cd81e915
NC
1615 sv_catsv(PL_thiswhite, PL_skipwhite);
1616 sv_free(PL_skipwhite);
1617 PL_skipwhite = 0;
1618 }
1619 PL_realtokenstart = s - SvPVX(PL_linestr);
29595ff2
NC
1620 return s;
1621}
1622
cd81e915 1623/* skip space after PL_thistoken */
29595ff2
NC
1624
1625STATIC char *
1626S_skipspace1(pTHX_ register char *s)
1627{
d4c19fe8 1628 const char *start = s;
29595ff2
NC
1629 I32 startoff = start - SvPVX(PL_linestr);
1630
7918f24d
NC
1631 PERL_ARGS_ASSERT_SKIPSPACE1;
1632
29595ff2
NC
1633 s = skipspace(s);
1634 if (!PL_madskills)
1635 return s;
1636 start = SvPVX(PL_linestr) + startoff;
cd81e915 1637 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 1638 const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
1639 PL_thistoken = newSVpvn(tstart, start - tstart);
1640 }
1641 PL_realtokenstart = -1;
1642 if (PL_skipwhite) {
1643 if (!PL_nextwhite)
6b29d1f5 1644 PL_nextwhite = newSVpvs("");
cd81e915
NC
1645 sv_catsv(PL_nextwhite, PL_skipwhite);
1646 sv_free(PL_skipwhite);
1647 PL_skipwhite = 0;
29595ff2
NC
1648 }
1649 return s;
1650}
1651
1652STATIC char *
1653S_skipspace2(pTHX_ register char *s, SV **svp)
1654{
c35e046a
AL
1655 char *start;
1656 const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
1657 const I32 startoff = s - SvPVX(PL_linestr);
1658
7918f24d
NC
1659 PERL_ARGS_ASSERT_SKIPSPACE2;
1660
29595ff2
NC
1661 s = skipspace(s);
1662 PL_bufptr = SvPVX(PL_linestr) + bufptroff;
1663 if (!PL_madskills || !svp)
1664 return s;
1665 start = SvPVX(PL_linestr) + startoff;
cd81e915 1666 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 1667 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
1668 PL_thistoken = newSVpvn(tstart, start - tstart);
1669 PL_realtokenstart = -1;
29595ff2 1670 }
cd81e915 1671 if (PL_skipwhite) {
29595ff2 1672 if (!*svp)
6b29d1f5 1673 *svp = newSVpvs("");
cd81e915
NC
1674 sv_setsv(*svp, PL_skipwhite);
1675 sv_free(PL_skipwhite);
1676 PL_skipwhite = 0;
29595ff2
NC
1677 }
1678
1679 return s;
1680}
1681#endif
1682
80a702cd 1683STATIC void
15f169a1 1684S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len)
80a702cd
RGS
1685{
1686 AV *av = CopFILEAVx(PL_curcop);
1687 if (av) {
b9f83d2f 1688 SV * const sv = newSV_type(SVt_PVMG);
5fa550fb
NC
1689 if (orig_sv)
1690 sv_setsv(sv, orig_sv);
1691 else
1692 sv_setpvn(sv, buf, len);
80a702cd
RGS
1693 (void)SvIOK_on(sv);
1694 SvIV_set(sv, 0);
1695 av_store(av, (I32)CopLINE(PL_curcop), sv);
1696 }
1697}
1698
ffb4593c
NT
1699/*
1700 * S_skipspace
1701 * Called to gobble the appropriate amount and type of whitespace.
1702 * Skips comments as well.
1703 */
1704
76e3520e 1705STATIC char *
cea2e8a9 1706S_skipspace(pTHX_ register char *s)
a687059c 1707{
5db06880 1708#ifdef PERL_MAD
f0e67a1d
Z
1709 char *start = s;
1710#endif /* PERL_MAD */
7918f24d 1711 PERL_ARGS_ASSERT_SKIPSPACE;
f0e67a1d 1712#ifdef PERL_MAD
cd81e915
NC
1713 if (PL_skipwhite) {
1714 sv_free(PL_skipwhite);
f0e67a1d 1715 PL_skipwhite = NULL;
5db06880 1716 }
f0e67a1d 1717#endif /* PERL_MAD */
3280af22 1718 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
bf4acbe4 1719 while (s < PL_bufend && SPACE_OR_TAB(*s))
463ee0b2 1720 s++;
f0e67a1d
Z
1721 } else {
1722 STRLEN bufptr_pos = PL_bufptr - SvPVX(PL_linestr);
1723 PL_bufptr = s;
f0998909
Z
1724 lex_read_space(LEX_KEEP_PREVIOUS |
1725 (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE ?
1726 LEX_NO_NEXT_CHUNK : 0));
3280af22 1727 s = PL_bufptr;
f0e67a1d
Z
1728 PL_bufptr = SvPVX(PL_linestr) + bufptr_pos;
1729 if (PL_linestart > PL_bufptr)
1730 PL_bufptr = PL_linestart;
1731 return s;
463ee0b2 1732 }
5db06880 1733#ifdef PERL_MAD
f0e67a1d
Z
1734 if (PL_madskills)
1735 PL_skipwhite = newSVpvn(start, s-start);
1736#endif /* PERL_MAD */
5db06880 1737 return s;
a687059c 1738}
378cc40b 1739
ffb4593c
NT
1740/*
1741 * S_check_uni
1742 * Check the unary operators to ensure there's no ambiguity in how they're
1743 * used. An ambiguous piece of code would be:
1744 * rand + 5
1745 * This doesn't mean rand() + 5. Because rand() is a unary operator,
1746 * the +5 is its argument.
1747 */
1748
76e3520e 1749STATIC void
cea2e8a9 1750S_check_uni(pTHX)
ba106d47 1751{
97aff369 1752 dVAR;
d4c19fe8
AL
1753 const char *s;
1754 const char *t;
2f3197b3 1755
3280af22 1756 if (PL_oldoldbufptr != PL_last_uni)
2f3197b3 1757 return;
3280af22
NIS
1758 while (isSPACE(*PL_last_uni))
1759 PL_last_uni++;
c35e046a
AL
1760 s = PL_last_uni;
1761 while (isALNUM_lazy_if(s,UTF) || *s == '-')
1762 s++;
3280af22 1763 if ((t = strchr(s, '(')) && t < PL_bufptr)
a0d0e21e 1764 return;
6136c704 1765
9b387841
NC
1766 Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
1767 "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1768 (int)(s - PL_last_uni), PL_last_uni);
2f3197b3
LW
1769}
1770
ffb4593c
NT
1771/*
1772 * LOP : macro to build a list operator. Its behaviour has been replaced
1773 * with a subroutine, S_lop() for which LOP is just another name.
1774 */
1775
a0d0e21e
LW
1776#define LOP(f,x) return lop(f,x,s)
1777
ffb4593c
NT
1778/*
1779 * S_lop
1780 * Build a list operator (or something that might be one). The rules:
1781 * - if we have a next token, then it's a list operator [why?]
1782 * - if the next thing is an opening paren, then it's a function
1783 * - else it's a list operator
1784 */
1785
76e3520e 1786STATIC I32
a0be28da 1787S_lop(pTHX_ I32 f, int x, char *s)
ffed7fef 1788{
97aff369 1789 dVAR;
7918f24d
NC
1790
1791 PERL_ARGS_ASSERT_LOP;
1792
6154021b 1793 pl_yylval.ival = f;
35c8bce7 1794 CLINE;
3280af22
NIS
1795 PL_expect = x;
1796 PL_bufptr = s;
1797 PL_last_lop = PL_oldbufptr;
eb160463 1798 PL_last_lop_op = (OPCODE)f;
5db06880
NC
1799#ifdef PERL_MAD
1800 if (PL_lasttoke)
1801 return REPORT(LSTOP);
1802#else
3280af22 1803 if (PL_nexttoke)
bbf60fe6 1804 return REPORT(LSTOP);
5db06880 1805#endif
79072805 1806 if (*s == '(')
bbf60fe6 1807 return REPORT(FUNC);
29595ff2 1808 s = PEEKSPACE(s);
79072805 1809 if (*s == '(')
bbf60fe6 1810 return REPORT(FUNC);
79072805 1811 else
bbf60fe6 1812 return REPORT(LSTOP);
79072805
LW
1813}
1814
5db06880
NC
1815#ifdef PERL_MAD
1816 /*
1817 * S_start_force
1818 * Sets up for an eventual force_next(). start_force(0) basically does
1819 * an unshift, while start_force(-1) does a push. yylex removes items
1820 * on the "pop" end.
1821 */
1822
1823STATIC void
1824S_start_force(pTHX_ int where)
1825{
1826 int i;
1827
cd81e915 1828 if (where < 0) /* so people can duplicate start_force(PL_curforce) */
5db06880 1829 where = PL_lasttoke;
cd81e915
NC
1830 assert(PL_curforce < 0 || PL_curforce == where);
1831 if (PL_curforce != where) {
5db06880
NC
1832 for (i = PL_lasttoke; i > where; --i) {
1833 PL_nexttoke[i] = PL_nexttoke[i-1];
1834 }
1835 PL_lasttoke++;
1836 }
cd81e915 1837 if (PL_curforce < 0) /* in case of duplicate start_force() */
5db06880 1838 Zero(&PL_nexttoke[where], 1, NEXTTOKE);
cd81e915
NC
1839 PL_curforce = where;
1840 if (PL_nextwhite) {
5db06880 1841 if (PL_madskills)
6b29d1f5 1842 curmad('^', newSVpvs(""));
cd81e915 1843 CURMAD('_', PL_nextwhite);
5db06880
NC
1844 }
1845}
1846
1847STATIC void
1848S_curmad(pTHX_ char slot, SV *sv)
1849{
1850 MADPROP **where;
1851
1852 if (!sv)
1853 return;
cd81e915
NC
1854 if (PL_curforce < 0)
1855 where = &PL_thismad;
5db06880 1856 else
cd81e915 1857 where = &PL_nexttoke[PL_curforce].next_mad;
5db06880 1858
cd81e915 1859 if (PL_faketokens)
76f68e9b 1860 sv_setpvs(sv, "");
5db06880
NC
1861 else {
1862 if (!IN_BYTES) {
1863 if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1864 SvUTF8_on(sv);
1865 else if (PL_encoding) {
1866 sv_recode_to_utf8(sv, PL_encoding);
1867 }
1868 }
1869 }
1870
1871 /* keep a slot open for the head of the list? */
1872 if (slot != '_' && *where && (*where)->mad_key == '^') {
1873 (*where)->mad_key = slot;
daba3364 1874 sv_free(MUTABLE_SV(((*where)->mad_val)));
5db06880
NC
1875 (*where)->mad_val = (void*)sv;
1876 }
1877 else
1878 addmad(newMADsv(slot, sv), where, 0);
1879}
1880#else
b3f24c00
MHM
1881# define start_force(where) NOOP
1882# define curmad(slot, sv) NOOP
5db06880
NC
1883#endif
1884
ffb4593c
NT
1885/*
1886 * S_force_next
9cbb5ea2 1887 * When the lexer realizes it knows the next token (for instance,
ffb4593c 1888 * it is reordering tokens for the parser) then it can call S_force_next
9cbb5ea2 1889 * to know what token to return the next time the lexer is called. Caller
5db06880
NC
1890 * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1891 * and possibly PL_expect to ensure the lexer handles the token correctly.
ffb4593c
NT
1892 */
1893
4e553d73 1894STATIC void
cea2e8a9 1895S_force_next(pTHX_ I32 type)
79072805 1896{
97aff369 1897 dVAR;
704d4215
GG
1898#ifdef DEBUGGING
1899 if (DEBUG_T_TEST) {
1900 PerlIO_printf(Perl_debug_log, "### forced token:\n");
f05d7009 1901 tokereport(type, &NEXTVAL_NEXTTOKE);
704d4215
GG
1902 }
1903#endif
5db06880 1904#ifdef PERL_MAD
cd81e915 1905 if (PL_curforce < 0)
5db06880 1906 start_force(PL_lasttoke);
cd81e915 1907 PL_nexttoke[PL_curforce].next_type = type;
5db06880
NC
1908 if (PL_lex_state != LEX_KNOWNEXT)
1909 PL_lex_defer = PL_lex_state;
1910 PL_lex_state = LEX_KNOWNEXT;
1911 PL_lex_expect = PL_expect;
cd81e915 1912 PL_curforce = -1;
5db06880 1913#else
3280af22
NIS
1914 PL_nexttype[PL_nexttoke] = type;
1915 PL_nexttoke++;
1916 if (PL_lex_state != LEX_KNOWNEXT) {
1917 PL_lex_defer = PL_lex_state;
1918 PL_lex_expect = PL_expect;
1919 PL_lex_state = LEX_KNOWNEXT;
79072805 1920 }
5db06880 1921#endif
79072805
LW
1922}
1923
d0a148a6 1924STATIC SV *
15f169a1 1925S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len)
d0a148a6 1926{
97aff369 1927 dVAR;
740cce10 1928 SV * const sv = newSVpvn_utf8(start, len,
eaf7a4d2
CS
1929 !IN_BYTES
1930 && UTF
1931 && !is_ascii_string((const U8*)start, len)
740cce10 1932 && is_utf8_string((const U8*)start, len));
d0a148a6
NC
1933 return sv;
1934}
1935
ffb4593c
NT
1936/*
1937 * S_force_word
1938 * When the lexer knows the next thing is a word (for instance, it has
1939 * just seen -> and it knows that the next char is a word char, then
02b34bbe
DM
1940 * it calls S_force_word to stick the next word into the PL_nexttoke/val
1941 * lookahead.
ffb4593c
NT
1942 *
1943 * Arguments:
b1b65b59 1944 * char *start : buffer position (must be within PL_linestr)
02b34bbe 1945 * int token : PL_next* will be this type of bare word (e.g., METHOD,WORD)
ffb4593c
NT
1946 * int check_keyword : if true, Perl checks to make sure the word isn't
1947 * a keyword (do this if the word is a label, e.g. goto FOO)
1948 * int allow_pack : if true, : characters will also be allowed (require,
1949 * use, etc. do this)
9cbb5ea2 1950 * int allow_initial_tick : used by the "sub" lexer only.
ffb4593c
NT
1951 */
1952
76e3520e 1953STATIC char *
cea2e8a9 1954S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
79072805 1955{
97aff369 1956 dVAR;
463ee0b2
LW
1957 register char *s;
1958 STRLEN len;
4e553d73 1959
7918f24d
NC
1960 PERL_ARGS_ASSERT_FORCE_WORD;
1961
29595ff2 1962 start = SKIPSPACE1(start);
463ee0b2 1963 s = start;
7e2040f0 1964 if (isIDFIRST_lazy_if(s,UTF) ||
a0d0e21e 1965 (allow_pack && *s == ':') ||
15f0808c 1966 (allow_initial_tick && *s == '\'') )
a0d0e21e 1967 {
3280af22 1968 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
5458a98a 1969 if (check_keyword && keyword(PL_tokenbuf, len, 0))
463ee0b2 1970 return start;
cd81e915 1971 start_force(PL_curforce);
5db06880
NC
1972 if (PL_madskills)
1973 curmad('X', newSVpvn(start,s-start));
463ee0b2 1974 if (token == METHOD) {
29595ff2 1975 s = SKIPSPACE1(s);
463ee0b2 1976 if (*s == '(')
3280af22 1977 PL_expect = XTERM;
463ee0b2 1978 else {
3280af22 1979 PL_expect = XOPERATOR;
463ee0b2 1980 }
79072805 1981 }
e74e6b3d 1982 if (PL_madskills)
63575281 1983 curmad('g', newSVpvs( "forced" ));
9ded7720 1984 NEXTVAL_NEXTTOKE.opval
d0a148a6
NC
1985 = (OP*)newSVOP(OP_CONST,0,
1986 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
9ded7720 1987 NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
79072805
LW
1988 force_next(token);
1989 }
1990 return s;
1991}
1992
ffb4593c
NT
1993/*
1994 * S_force_ident
9cbb5ea2 1995 * Called when the lexer wants $foo *foo &foo etc, but the program
ffb4593c
NT
1996 * text only contains the "foo" portion. The first argument is a pointer
1997 * to the "foo", and the second argument is the type symbol to prefix.
1998 * Forces the next token to be a "WORD".
9cbb5ea2 1999 * Creates the symbol if it didn't already exist (via gv_fetchpv()).
ffb4593c
NT
2000 */
2001
76e3520e 2002STATIC void
bfed75c6 2003S_force_ident(pTHX_ register const char *s, int kind)
79072805 2004{
97aff369 2005 dVAR;
7918f24d
NC
2006
2007 PERL_ARGS_ASSERT_FORCE_IDENT;
2008
c35e046a 2009 if (*s) {
90e5519e
NC
2010 const STRLEN len = strlen(s);
2011 OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
cd81e915 2012 start_force(PL_curforce);
9ded7720 2013 NEXTVAL_NEXTTOKE.opval = o;
79072805 2014 force_next(WORD);
748a9306 2015 if (kind) {
11343788 2016 o->op_private = OPpCONST_ENTERED;
55497cff 2017 /* XXX see note in pp_entereval() for why we forgo typo
2018 warnings if the symbol must be introduced in an eval.
2019 GSAR 96-10-12 */
90e5519e
NC
2020 gv_fetchpvn_flags(s, len,
2021 PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
2022 : GV_ADD,
2023 kind == '$' ? SVt_PV :
2024 kind == '@' ? SVt_PVAV :
2025 kind == '%' ? SVt_PVHV :
a0d0e21e 2026 SVt_PVGV
90e5519e 2027 );
748a9306 2028 }
79072805
LW
2029 }
2030}
2031
1571675a
GS
2032NV
2033Perl_str_to_version(pTHX_ SV *sv)
2034{
2035 NV retval = 0.0;
2036 NV nshift = 1.0;
2037 STRLEN len;
cfd0369c 2038 const char *start = SvPV_const(sv,len);
9d4ba2ae 2039 const char * const end = start + len;
504618e9 2040 const bool utf = SvUTF8(sv) ? TRUE : FALSE;
7918f24d
NC
2041
2042 PERL_ARGS_ASSERT_STR_TO_VERSION;
2043
1571675a 2044 while (start < end) {
ba210ebe 2045 STRLEN skip;
1571675a
GS
2046 UV n;
2047 if (utf)
9041c2e3 2048 n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1571675a
GS
2049 else {
2050 n = *(U8*)start;
2051 skip = 1;
2052 }
2053 retval += ((NV)n)/nshift;
2054 start += skip;
2055 nshift *= 1000;
2056 }
2057 return retval;
2058}
2059
4e553d73 2060/*
ffb4593c
NT
2061 * S_force_version
2062 * Forces the next token to be a version number.
e759cc13
RGS
2063 * If the next token appears to be an invalid version number, (e.g. "v2b"),
2064 * and if "guessing" is TRUE, then no new token is created (and the caller
2065 * must use an alternative parsing method).
ffb4593c
NT
2066 */
2067
76e3520e 2068STATIC char *
e759cc13 2069S_force_version(pTHX_ char *s, int guessing)
89bfa8cd 2070{
97aff369 2071 dVAR;
5f66b61c 2072 OP *version = NULL;
44dcb63b 2073 char *d;
5db06880
NC
2074#ifdef PERL_MAD
2075 I32 startoff = s - SvPVX(PL_linestr);
2076#endif
89bfa8cd 2077
7918f24d
NC
2078 PERL_ARGS_ASSERT_FORCE_VERSION;
2079
29595ff2 2080 s = SKIPSPACE1(s);
89bfa8cd 2081
44dcb63b 2082 d = s;
dd629d5b 2083 if (*d == 'v')
44dcb63b 2084 d++;
44dcb63b 2085 if (isDIGIT(*d)) {
e759cc13
RGS
2086 while (isDIGIT(*d) || *d == '_' || *d == '.')
2087 d++;
5db06880
NC
2088#ifdef PERL_MAD
2089 if (PL_madskills) {
cd81e915 2090 start_force(PL_curforce);
5db06880
NC
2091 curmad('X', newSVpvn(s,d-s));
2092 }
2093#endif
9f3d182e 2094 if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
dd629d5b 2095 SV *ver;
8d08d9ba
DG
2096#ifdef USE_LOCALE_NUMERIC
2097 char *loc = setlocale(LC_NUMERIC, "C");
2098#endif
6154021b 2099 s = scan_num(s, &pl_yylval);
8d08d9ba
DG
2100#ifdef USE_LOCALE_NUMERIC
2101 setlocale(LC_NUMERIC, loc);
2102#endif
6154021b 2103 version = pl_yylval.opval;
dd629d5b
GS
2104 ver = cSVOPx(version)->op_sv;
2105 if (SvPOK(ver) && !SvNIOK(ver)) {
862a34c6 2106 SvUPGRADE(ver, SVt_PVNV);
9d6ce603 2107 SvNV_set(ver, str_to_version(ver));
1571675a 2108 SvNOK_on(ver); /* hint that it is a version */
44dcb63b 2109 }
89bfa8cd 2110 }
5db06880
NC
2111 else if (guessing) {
2112#ifdef PERL_MAD
2113 if (PL_madskills) {
cd81e915
NC
2114 sv_free(PL_nextwhite); /* let next token collect whitespace */
2115 PL_nextwhite = 0;
5db06880
NC
2116 s = SvPVX(PL_linestr) + startoff;
2117 }
2118#endif
e759cc13 2119 return s;
5db06880 2120 }
89bfa8cd 2121 }
2122
5db06880
NC
2123#ifdef PERL_MAD
2124 if (PL_madskills && !version) {
cd81e915
NC
2125 sv_free(PL_nextwhite); /* let next token collect whitespace */
2126 PL_nextwhite = 0;
5db06880
NC
2127 s = SvPVX(PL_linestr) + startoff;
2128 }
2129#endif
89bfa8cd 2130 /* NOTE: The parser sees the package name and the VERSION swapped */
cd81e915 2131 start_force(PL_curforce);
9ded7720 2132 NEXTVAL_NEXTTOKE.opval = version;
4e553d73 2133 force_next(WORD);
89bfa8cd 2134
e759cc13 2135 return s;
89bfa8cd 2136}
2137
ffb4593c 2138/*
91152fc1
DG
2139 * S_force_strict_version
2140 * Forces the next token to be a version number using strict syntax rules.
2141 */
2142
2143STATIC char *
2144S_force_strict_version(pTHX_ char *s)
2145{
2146 dVAR;
2147 OP *version = NULL;
2148#ifdef PERL_MAD
2149 I32 startoff = s - SvPVX(PL_linestr);
2150#endif
2151 const char *errstr = NULL;
2152
2153 PERL_ARGS_ASSERT_FORCE_STRICT_VERSION;
2154
2155 while (isSPACE(*s)) /* leading whitespace */
2156 s++;
2157
2158 if (is_STRICT_VERSION(s,&errstr)) {
2159 SV *ver = newSV(0);
2160 s = (char *)scan_version(s, ver, 0);
2161 version = newSVOP(OP_CONST, 0, ver);
2162 }
2163 else if ( (*s != ';' && *s != '}' ) && (s = SKIPSPACE1(s), (*s != ';' && *s !='}' ))) {
2164 PL_bufptr = s;
2165 if (errstr)
2166 yyerror(errstr); /* version required */
2167 return s;
2168 }
2169
2170#ifdef PERL_MAD
2171 if (PL_madskills && !version) {
2172 sv_free(PL_nextwhite); /* let next token collect whitespace */
2173 PL_nextwhite = 0;
2174 s = SvPVX(PL_linestr) + startoff;
2175 }
2176#endif
2177 /* NOTE: The parser sees the package name and the VERSION swapped */
2178 start_force(PL_curforce);
2179 NEXTVAL_NEXTTOKE.opval = version;
2180 force_next(WORD);
2181
2182 return s;
2183}
2184
2185/*
ffb4593c
NT
2186 * S_tokeq
2187 * Tokenize a quoted string passed in as an SV. It finds the next
2188 * chunk, up to end of string or a backslash. It may make a new
2189 * SV containing that chunk (if HINT_NEW_STRING is on). It also
2190 * turns \\ into \.
2191 */
2192
76e3520e 2193STATIC SV *
cea2e8a9 2194S_tokeq(pTHX_ SV *sv)
79072805 2195{
97aff369 2196 dVAR;
79072805
LW
2197 register char *s;
2198 register char *send;
2199 register char *d;
b3ac6de7
IZ
2200 STRLEN len = 0;
2201 SV *pv = sv;
79072805 2202
7918f24d
NC
2203 PERL_ARGS_ASSERT_TOKEQ;
2204
79072805 2205 if (!SvLEN(sv))
b3ac6de7 2206 goto finish;
79072805 2207
a0d0e21e 2208 s = SvPV_force(sv, len);
21a311ee 2209 if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
b3ac6de7 2210 goto finish;
463ee0b2 2211 send = s + len;
79072805
LW
2212 while (s < send && *s != '\\')
2213 s++;
2214 if (s == send)
b3ac6de7 2215 goto finish;
79072805 2216 d = s;
be4731d2 2217 if ( PL_hints & HINT_NEW_STRING ) {
59cd0e26 2218 pv = newSVpvn_flags(SvPVX_const(pv), len, SVs_TEMP | SvUTF8(sv));
be4731d2 2219 }
79072805
LW
2220 while (s < send) {
2221 if (*s == '\\') {
a0d0e21e 2222 if (s + 1 < send && (s[1] == '\\'))
79072805
LW
2223 s++; /* all that, just for this */
2224 }
2225 *d++ = *s++;
2226 }
2227 *d = '\0';
95a20fc0 2228 SvCUR_set(sv, d - SvPVX_const(sv));
b3ac6de7 2229 finish:
3280af22 2230 if ( PL_hints & HINT_NEW_STRING )
eb0d8d16 2231 return new_constant(NULL, 0, "q", sv, pv, "q", 1);
79072805
LW
2232 return sv;
2233}
2234
ffb4593c
NT
2235/*
2236 * Now come three functions related to double-quote context,
2237 * S_sublex_start, S_sublex_push, and S_sublex_done. They're used when
2238 * converting things like "\u\Lgnat" into ucfirst(lc("gnat")). They
2239 * interact with PL_lex_state, and create fake ( ... ) argument lists
2240 * to handle functions and concatenation.
2241 * They assume that whoever calls them will be setting up a fake
2242 * join call, because each subthing puts a ',' after it. This lets
2243 * "lower \luPpEr"
2244 * become
2245 * join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
2246 *
2247 * (I'm not sure whether the spurious commas at the end of lcfirst's
2248 * arguments and join's arguments are created or not).
2249 */
2250
2251/*
2252 * S_sublex_start
6154021b 2253 * Assumes that pl_yylval.ival is the op we're creating (e.g. OP_LCFIRST).
ffb4593c
NT
2254 *
2255 * Pattern matching will set PL_lex_op to the pattern-matching op to
6154021b 2256 * make (we return THING if pl_yylval.ival is OP_NULL, PMFUNC otherwise).
ffb4593c
NT
2257 *
2258 * OP_CONST and OP_READLINE are easy--just make the new op and return.
2259 *
2260 * Everything else becomes a FUNC.
2261 *
2262 * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
2263 * had an OP_CONST or OP_READLINE). This just sets us up for a
2264 * call to S_sublex_push().
2265 */
2266
76e3520e 2267STATIC I32
cea2e8a9 2268S_sublex_start(pTHX)
79072805 2269{
97aff369 2270 dVAR;
6154021b 2271 register const I32 op_type = pl_yylval.ival;
79072805
LW
2272
2273 if (op_type == OP_NULL) {
6154021b 2274 pl_yylval.opval = PL_lex_op;
5f66b61c 2275 PL_lex_op = NULL;
79072805
LW
2276 return THING;
2277 }
2278 if (op_type == OP_CONST || op_type == OP_READLINE) {
3280af22 2279 SV *sv = tokeq(PL_lex_stuff);
b3ac6de7
IZ
2280
2281 if (SvTYPE(sv) == SVt_PVIV) {
2282 /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
2283 STRLEN len;
96a5add6 2284 const char * const p = SvPV_const(sv, len);
740cce10 2285 SV * const nsv = newSVpvn_flags(p, len, SvUTF8(sv));
b3ac6de7
IZ
2286 SvREFCNT_dec(sv);
2287 sv = nsv;
4e553d73 2288 }
6154021b 2289 pl_yylval.opval = (OP*)newSVOP(op_type, 0, sv);
a0714e2c 2290 PL_lex_stuff = NULL;
6f33ba73
RGS
2291 /* Allow <FH> // "foo" */
2292 if (op_type == OP_READLINE)
2293 PL_expect = XTERMORDORDOR;
79072805
LW
2294 return THING;
2295 }
e3f73d4e
RGS
2296 else if (op_type == OP_BACKTICK && PL_lex_op) {
2297 /* readpipe() vas overriden */
2298 cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
6154021b 2299 pl_yylval.opval = PL_lex_op;
9b201d7d 2300 PL_lex_op = NULL;
e3f73d4e
RGS
2301 PL_lex_stuff = NULL;
2302 return THING;
2303 }
79072805 2304
3280af22 2305 PL_sublex_info.super_state = PL_lex_state;
eac04b2e 2306 PL_sublex_info.sub_inwhat = (U16)op_type;
3280af22
NIS
2307 PL_sublex_info.sub_op = PL_lex_op;
2308 PL_lex_state = LEX_INTERPPUSH;
55497cff 2309
3280af22
NIS
2310 PL_expect = XTERM;
2311 if (PL_lex_op) {
6154021b 2312 pl_yylval.opval = PL_lex_op;
5f66b61c 2313 PL_lex_op = NULL;
55497cff 2314 return PMFUNC;
2315 }
2316 else
2317 return FUNC;
2318}
2319
ffb4593c
NT
2320/*
2321 * S_sublex_push
2322 * Create a new scope to save the lexing state. The scope will be
2323 * ended in S_sublex_done. Returns a '(', starting the function arguments
2324 * to the uc, lc, etc. found before.
2325 * Sets PL_lex_state to LEX_INTERPCONCAT.
2326 */
2327
76e3520e 2328STATIC I32
cea2e8a9 2329S_sublex_push(pTHX)
55497cff 2330{
27da23d5 2331 dVAR;
f46d017c 2332 ENTER;
55497cff 2333
3280af22 2334 PL_lex_state = PL_sublex_info.super_state;
651b5b28 2335 SAVEBOOL(PL_lex_dojoin);
3280af22 2336 SAVEI32(PL_lex_brackets);
3280af22
NIS
2337 SAVEI32(PL_lex_casemods);
2338 SAVEI32(PL_lex_starts);
651b5b28 2339 SAVEI8(PL_lex_state);
7766f137 2340 SAVEVPTR(PL_lex_inpat);
98246f1e 2341 SAVEI16(PL_lex_inwhat);
57843af0 2342 SAVECOPLINE(PL_curcop);
3280af22 2343 SAVEPPTR(PL_bufptr);
8452ff4b 2344 SAVEPPTR(PL_bufend);
3280af22
NIS
2345 SAVEPPTR(PL_oldbufptr);
2346 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
2347 SAVEPPTR(PL_last_lop);
2348 SAVEPPTR(PL_last_uni);
3280af22
NIS
2349 SAVEPPTR(PL_linestart);
2350 SAVESPTR(PL_linestr);
8edd5f42
RGS
2351 SAVEGENERICPV(PL_lex_brackstack);
2352 SAVEGENERICPV(PL_lex_casestack);
3280af22
NIS
2353
2354 PL_linestr = PL_lex_stuff;
a0714e2c 2355 PL_lex_stuff = NULL;
3280af22 2356
9cbb5ea2
GS
2357 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
2358 = SvPVX(PL_linestr);
3280af22 2359 PL_bufend += SvCUR(PL_linestr);
bd61b366 2360 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
2361 SAVEFREESV(PL_linestr);
2362
2363 PL_lex_dojoin = FALSE;
2364 PL_lex_brackets = 0;
a02a5408
JC
2365 Newx(PL_lex_brackstack, 120, char);
2366 Newx(PL_lex_casestack, 12, char);
3280af22
NIS
2367 PL_lex_casemods = 0;
2368 *PL_lex_casestack = '\0';
2369 PL_lex_starts = 0;
2370 PL_lex_state = LEX_INTERPCONCAT;
eb160463 2371 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22
NIS
2372
2373 PL_lex_inwhat = PL_sublex_info.sub_inwhat;
2374 if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
2375 PL_lex_inpat = PL_sublex_info.sub_op;
79072805 2376 else
5f66b61c 2377 PL_lex_inpat = NULL;
79072805 2378
55497cff 2379 return '(';
79072805
LW
2380}
2381
ffb4593c
NT
2382/*
2383 * S_sublex_done
2384 * Restores lexer state after a S_sublex_push.
2385 */
2386
76e3520e 2387STATIC I32
cea2e8a9 2388S_sublex_done(pTHX)
79072805 2389{
27da23d5 2390 dVAR;
3280af22 2391 if (!PL_lex_starts++) {
396482e1 2392 SV * const sv = newSVpvs("");
9aa983d2
JH
2393 if (SvUTF8(PL_linestr))
2394 SvUTF8_on(sv);
3280af22 2395 PL_expect = XOPERATOR;
6154021b 2396 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
79072805
LW
2397 return THING;
2398 }
2399
3280af22
NIS
2400 if (PL_lex_casemods) { /* oops, we've got some unbalanced parens */
2401 PL_lex_state = LEX_INTERPCASEMOD;
cea2e8a9 2402 return yylex();
79072805
LW
2403 }
2404
ffb4593c 2405 /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
3280af22
NIS
2406 if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
2407 PL_linestr = PL_lex_repl;
2408 PL_lex_inpat = 0;
2409 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
2410 PL_bufend += SvCUR(PL_linestr);
bd61b366 2411 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
2412 SAVEFREESV(PL_linestr);
2413 PL_lex_dojoin = FALSE;
2414 PL_lex_brackets = 0;
3280af22
NIS
2415 PL_lex_casemods = 0;
2416 *PL_lex_casestack = '\0';
2417 PL_lex_starts = 0;
25da4f38 2418 if (SvEVALED(PL_lex_repl)) {
3280af22
NIS
2419 PL_lex_state = LEX_INTERPNORMAL;
2420 PL_lex_starts++;
e9fa98b2
HS
2421 /* we don't clear PL_lex_repl here, so that we can check later
2422 whether this is an evalled subst; that means we rely on the
2423 logic to ensure sublex_done() is called again only via the
2424 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
79072805 2425 }
e9fa98b2 2426 else {
3280af22 2427 PL_lex_state = LEX_INTERPCONCAT;
a0714e2c 2428 PL_lex_repl = NULL;
e9fa98b2 2429 }
79072805 2430 return ',';
ffed7fef
LW
2431 }
2432 else {
5db06880
NC
2433#ifdef PERL_MAD
2434 if (PL_madskills) {
cd81e915
NC
2435 if (PL_thiswhite) {
2436 if (!PL_endwhite)
6b29d1f5 2437 PL_endwhite = newSVpvs("");
cd81e915
NC
2438 sv_catsv(PL_endwhite, PL_thiswhite);
2439 PL_thiswhite = 0;
2440 }
2441 if (PL_thistoken)
76f68e9b 2442 sv_setpvs(PL_thistoken,"");
5db06880 2443 else
cd81e915 2444 PL_realtokenstart = -1;
5db06880
NC
2445 }
2446#endif
f46d017c 2447 LEAVE;
3280af22
NIS
2448 PL_bufend = SvPVX(PL_linestr);
2449 PL_bufend += SvCUR(PL_linestr);
2450 PL_expect = XOPERATOR;
09bef843 2451 PL_sublex_info.sub_inwhat = 0;
79072805 2452 return ')';
ffed7fef
LW
2453 }
2454}
2455
02aa26ce
NT
2456/*
2457 scan_const
2458
2459 Extracts a pattern, double-quoted string, or transliteration. This
2460 is terrifying code.
2461
94def140 2462 It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
3280af22 2463 processing a pattern (PL_lex_inpat is true), a transliteration
94def140 2464 (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
02aa26ce 2465
94def140
TS
2466 Returns a pointer to the character scanned up to. If this is
2467 advanced from the start pointer supplied (i.e. if anything was
9b599b2a 2468 successfully parsed), will leave an OP for the substring scanned
6154021b 2469 in pl_yylval. Caller must intuit reason for not parsing further
9b599b2a
GS
2470 by looking at the next characters herself.
2471
02aa26ce
NT
2472 In patterns:
2473 backslashes:
2474 double-quoted style: \r and \n
2475 regexp special ones: \D \s
94def140
TS
2476 constants: \x31
2477 backrefs: \1
02aa26ce
NT
2478 case and quoting: \U \Q \E
2479 stops on @ and $, but not for $ as tail anchor
2480
2481 In transliterations:
2482 characters are VERY literal, except for - not at the start or end
94def140
TS
2483 of the string, which indicates a range. If the range is in bytes,
2484 scan_const expands the range to the full set of intermediate
2485 characters. If the range is in utf8, the hyphen is replaced with
2486 a certain range mark which will be handled by pmtrans() in op.c.
02aa26ce
NT
2487
2488 In double-quoted strings:
2489 backslashes:
2490 double-quoted style: \r and \n
94def140
TS
2491 constants: \x31
2492 deprecated backrefs: \1 (in substitution replacements)
02aa26ce
NT
2493 case and quoting: \U \Q \E
2494 stops on @ and $
2495
2496 scan_const does *not* construct ops to handle interpolated strings.
2497 It stops processing as soon as it finds an embedded $ or @ variable
2498 and leaves it to the caller to work out what's going on.
2499
94def140
TS
2500 embedded arrays (whether in pattern or not) could be:
2501 @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
2502
2503 $ in double-quoted strings must be the symbol of an embedded scalar.
02aa26ce
NT
2504
2505 $ in pattern could be $foo or could be tail anchor. Assumption:
2506 it's a tail anchor if $ is the last thing in the string, or if it's
94def140 2507 followed by one of "()| \r\n\t"
02aa26ce
NT
2508
2509 \1 (backreferences) are turned into $1
2510
2511 The structure of the code is
2512 while (there's a character to process) {
94def140
TS
2513 handle transliteration ranges
2514 skip regexp comments /(?#comment)/ and codes /(?{code})/
2515 skip #-initiated comments in //x patterns
2516 check for embedded arrays
02aa26ce
NT
2517 check for embedded scalars
2518 if (backslash) {
94def140
TS
2519 leave intact backslashes from leaveit (below)
2520 deprecate \1 in substitution replacements
02aa26ce
NT
2521 handle string-changing backslashes \l \U \Q \E, etc.
2522 switch (what was escaped) {
94def140
TS
2523 handle \- in a transliteration (becomes a literal -)
2524 handle \132 (octal characters)
2525 handle \x15 and \x{1234} (hex characters)
2526 handle \N{name} (named characters)
2527 handle \cV (control characters)
2528 handle printf-style backslashes (\f, \r, \n, etc)
02aa26ce 2529 } (end switch)
77a135fe 2530 continue
02aa26ce 2531 } (end if backslash)
77a135fe 2532 handle regular character
02aa26ce 2533 } (end while character to read)
4e553d73 2534
02aa26ce
NT
2535*/
2536
76e3520e 2537STATIC char *
cea2e8a9 2538S_scan_const(pTHX_ char *start)
79072805 2539{
97aff369 2540 dVAR;
3280af22 2541 register char *send = PL_bufend; /* end of the constant */
77a135fe
KW
2542 SV *sv = newSV(send - start); /* sv for the constant. See
2543 note below on sizing. */
02aa26ce
NT
2544 register char *s = start; /* start of the constant */
2545 register char *d = SvPVX(sv); /* destination for copies */
2546 bool dorange = FALSE; /* are we in a translit range? */
c2e66d9e 2547 bool didrange = FALSE; /* did we just finish a range? */
2b9d42f0 2548 I32 has_utf8 = FALSE; /* Output constant is UTF8 */
77a135fe
KW
2549 I32 this_utf8 = UTF; /* Is the source string assumed
2550 to be UTF8? But, this can
2551 show as true when the source
2552 isn't utf8, as for example
2553 when it is entirely composed
2554 of hex constants */
2555
2556 /* Note on sizing: The scanned constant is placed into sv, which is
2557 * initialized by newSV() assuming one byte of output for every byte of
2558 * input. This routine expects newSV() to allocate an extra byte for a
2559 * trailing NUL, which this routine will append if it gets to the end of
2560 * the input. There may be more bytes of input than output (eg., \N{LATIN
2561 * CAPITAL LETTER A}), or more output than input if the constant ends up
2562 * recoded to utf8, but each time a construct is found that might increase
2563 * the needed size, SvGROW() is called. Its size parameter each time is
2564 * based on the best guess estimate at the time, namely the length used so
2565 * far, plus the length the current construct will occupy, plus room for
2566 * the trailing NUL, plus one byte for every input byte still unscanned */
2567
012bcf8d 2568 UV uv;
4c3a8340
TS
2569#ifdef EBCDIC
2570 UV literal_endpoint = 0;
e294cc5d 2571 bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
4c3a8340 2572#endif
012bcf8d 2573
7918f24d
NC
2574 PERL_ARGS_ASSERT_SCAN_CONST;
2575
2b9d42f0
NIS
2576 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
2577 /* If we are doing a trans and we know we want UTF8 set expectation */
2578 has_utf8 = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
2579 this_utf8 = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2580 }
2581
2582
79072805 2583 while (s < send || dorange) {
02aa26ce 2584 /* get transliterations out of the way (they're most literal) */
3280af22 2585 if (PL_lex_inwhat == OP_TRANS) {
02aa26ce 2586 /* expand a range A-Z to the full set of characters. AIE! */
79072805 2587 if (dorange) {
1ba5c669
JH
2588 I32 i; /* current expanded character */
2589 I32 min; /* first character in range */
2590 I32 max; /* last character in range */
02aa26ce 2591
e294cc5d
JH
2592#ifdef EBCDIC
2593 UV uvmax = 0;
2594#endif
2595
2596 if (has_utf8
2597#ifdef EBCDIC
2598 && !native_range
2599#endif
2600 ) {
9d4ba2ae 2601 char * const c = (char*)utf8_hop((U8*)d, -1);
8973db79
JH
2602 char *e = d++;
2603 while (e-- > c)
2604 *(e + 1) = *e;
25716404 2605 *c = (char)UTF_TO_NATIVE(0xff);
8973db79
JH
2606 /* mark the range as done, and continue */
2607 dorange = FALSE;
2608 didrange = TRUE;
2609 continue;
2610 }
2b9d42f0 2611
95a20fc0 2612 i = d - SvPVX_const(sv); /* remember current offset */
e294cc5d
JH
2613#ifdef EBCDIC
2614 SvGROW(sv,
2615 SvLEN(sv) + (has_utf8 ?
2616 (512 - UTF_CONTINUATION_MARK +
2617 UNISKIP(0x100))
2618 : 256));
2619 /* How many two-byte within 0..255: 128 in UTF-8,
2620 * 96 in UTF-8-mod. */
2621#else
9cbb5ea2 2622 SvGROW(sv, SvLEN(sv) + 256); /* never more than 256 chars in a range */
e294cc5d 2623#endif
9cbb5ea2 2624 d = SvPVX(sv) + i; /* refresh d after realloc */
e294cc5d
JH
2625#ifdef EBCDIC
2626 if (has_utf8) {
2627 int j;
2628 for (j = 0; j <= 1; j++) {
2629 char * const c = (char*)utf8_hop((U8*)d, -1);
2630 const UV uv = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
2631 if (j)
2632 min = (U8)uv;
2633 else if (uv < 256)
2634 max = (U8)uv;
2635 else {
2636 max = (U8)0xff; /* only to \xff */
2637 uvmax = uv; /* \x{100} to uvmax */
2638 }
2639 d = c; /* eat endpoint chars */
2640 }
2641 }
2642 else {
2643#endif
2644 d -= 2; /* eat the first char and the - */
2645 min = (U8)*d; /* first char in range */
2646 max = (U8)d[1]; /* last char in range */
2647#ifdef EBCDIC
2648 }
2649#endif
8ada0baa 2650
c2e66d9e 2651 if (min > max) {
01ec43d0 2652 Perl_croak(aTHX_
d1573ac7 2653 "Invalid range \"%c-%c\" in transliteration operator",
1ba5c669 2654 (char)min, (char)max);
c2e66d9e
GS
2655 }
2656
c7f1f016 2657#ifdef EBCDIC
4c3a8340
TS
2658 if (literal_endpoint == 2 &&
2659 ((isLOWER(min) && isLOWER(max)) ||
2660 (isUPPER(min) && isUPPER(max)))) {
8ada0baa
JH
2661 if (isLOWER(min)) {
2662 for (i = min; i <= max; i++)
2663 if (isLOWER(i))
db42d148 2664 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
2665 } else {
2666 for (i = min; i <= max; i++)
2667 if (isUPPER(i))
db42d148 2668 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
2669 }
2670 }
2671 else
2672#endif
2673 for (i = min; i <= max; i++)
e294cc5d
JH
2674#ifdef EBCDIC
2675 if (has_utf8) {
2676 const U8 ch = (U8)NATIVE_TO_UTF(i);
2677 if (UNI_IS_INVARIANT(ch))
2678 *d++ = (U8)i;
2679 else {
2680 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2681 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2682 }
2683 }
2684 else
2685#endif
2686 *d++ = (char)i;
2687
2688#ifdef EBCDIC
2689 if (uvmax) {
2690 d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2691 if (uvmax > 0x101)
2692 *d++ = (char)UTF_TO_NATIVE(0xff);
2693 if (uvmax > 0x100)
2694 d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2695 }
2696#endif
02aa26ce
NT
2697
2698 /* mark the range as done, and continue */
79072805 2699 dorange = FALSE;
01ec43d0 2700 didrange = TRUE;
4c3a8340
TS
2701#ifdef EBCDIC
2702 literal_endpoint = 0;
2703#endif
79072805 2704 continue;
4e553d73 2705 }
02aa26ce
NT
2706
2707 /* range begins (ignore - as first or last char) */
79072805 2708 else if (*s == '-' && s+1 < send && s != start) {
4e553d73 2709 if (didrange) {
1fafa243 2710 Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
01ec43d0 2711 }
e294cc5d
JH
2712 if (has_utf8
2713#ifdef EBCDIC
2714 && !native_range
2715#endif
2716 ) {
25716404 2717 *d++ = (char)UTF_TO_NATIVE(0xff); /* use illegal utf8 byte--see pmtrans */
a0ed51b3
LW
2718 s++;
2719 continue;
2720 }
79072805
LW
2721 dorange = TRUE;
2722 s++;
01ec43d0
GS
2723 }
2724 else {
2725 didrange = FALSE;
4c3a8340
TS
2726#ifdef EBCDIC
2727 literal_endpoint = 0;
e294cc5d 2728 native_range = TRUE;
4c3a8340 2729#endif
01ec43d0 2730 }
79072805 2731 }
02aa26ce
NT
2732
2733 /* if we get here, we're not doing a transliteration */
2734
0f5d15d6
IZ
2735 /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2736 except for the last char, which will be done separately. */
3280af22 2737 else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
cc6b7395 2738 if (s[2] == '#') {
e994fd66 2739 while (s+1 < send && *s != ')')
db42d148 2740 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
155aba94
GS
2741 }
2742 else if (s[2] == '{' /* This should match regcomp.c */
67edc0c9 2743 || (s[2] == '?' && s[3] == '{'))
155aba94 2744 {
cc6b7395 2745 I32 count = 1;
0f5d15d6 2746 char *regparse = s + (s[2] == '{' ? 3 : 4);
cc6b7395
IZ
2747 char c;
2748
d9f97599
GS
2749 while (count && (c = *regparse)) {
2750 if (c == '\\' && regparse[1])
2751 regparse++;
4e553d73 2752 else if (c == '{')
cc6b7395 2753 count++;
4e553d73 2754 else if (c == '}')
cc6b7395 2755 count--;
d9f97599 2756 regparse++;
cc6b7395 2757 }
e994fd66 2758 if (*regparse != ')')
5bdf89e7 2759 regparse--; /* Leave one char for continuation. */
0f5d15d6 2760 while (s < regparse)
db42d148 2761 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
cc6b7395 2762 }
748a9306 2763 }
02aa26ce
NT
2764
2765 /* likewise skip #-initiated comments in //x patterns */
3280af22
NIS
2766 else if (*s == '#' && PL_lex_inpat &&
2767 ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
748a9306 2768 while (s+1 < send && *s != '\n')
db42d148 2769 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
748a9306 2770 }
02aa26ce 2771
5d1d4326 2772 /* check for embedded arrays
da6eedaa 2773 (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
5d1d4326 2774 */
1749ea0d
TS
2775 else if (*s == '@' && s[1]) {
2776 if (isALNUM_lazy_if(s+1,UTF))
2777 break;
2778 if (strchr(":'{$", s[1]))
2779 break;
2780 if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2781 break; /* in regexp, neither @+ nor @- are interpolated */
2782 }
02aa26ce
NT
2783
2784 /* check for embedded scalars. only stop if we're sure it's a
2785 variable.
2786 */
79072805 2787 else if (*s == '$') {
3280af22 2788 if (!PL_lex_inpat) /* not a regexp, so $ must be var */
79072805 2789 break;
77772344 2790 if (s + 1 < send && !strchr("()| \r\n\t", s[1])) {
a2a5de95
NC
2791 if (s[1] == '\\') {
2792 Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2793 "Possible unintended interpolation of $\\ in regex");
77772344 2794 }
79072805 2795 break; /* in regexp, $ might be tail anchor */
77772344 2796 }
79072805 2797 }
02aa26ce 2798
2b9d42f0
NIS
2799 /* End of else if chain - OP_TRANS rejoin rest */
2800
02aa26ce 2801 /* backslashes */
79072805
LW
2802 if (*s == '\\' && s+1 < send) {
2803 s++;
02aa26ce 2804
02aa26ce 2805 /* deprecate \1 in strings and substitution replacements */
3280af22 2806 if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
a0d0e21e 2807 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
79072805 2808 {
a2a5de95 2809 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
79072805
LW
2810 *--s = '$';
2811 break;
2812 }
02aa26ce
NT
2813
2814 /* string-change backslash escapes */
3280af22 2815 if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
79072805
LW
2816 --s;
2817 break;
2818 }
cc74c5bd
TS
2819 /* skip any other backslash escapes in a pattern */
2820 else if (PL_lex_inpat) {
2821 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2822 goto default_action;
2823 }
02aa26ce
NT
2824
2825 /* if we get here, it's either a quoted -, or a digit */
79072805 2826 switch (*s) {
02aa26ce
NT
2827
2828 /* quoted - in transliterations */
79072805 2829 case '-':
3280af22 2830 if (PL_lex_inwhat == OP_TRANS) {
79072805
LW
2831 *d++ = *s++;
2832 continue;
2833 }
2834 /* FALL THROUGH */
2835 default:
11b8faa4 2836 {
a2a5de95
NC
2837 if ((isALPHA(*s) || isDIGIT(*s)))
2838 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
2839 "Unrecognized escape \\%c passed through",
2840 *s);
11b8faa4 2841 /* default action is to copy the quoted character */
f9a63242 2842 goto default_action;
11b8faa4 2843 }
02aa26ce 2844
77a135fe 2845 /* eg. \132 indicates the octal constant 0x132 */
79072805
LW
2846 case '0': case '1': case '2': case '3':
2847 case '4': case '5': case '6': case '7':
ba210ebe 2848 {
53305cf1
NC
2849 I32 flags = 0;
2850 STRLEN len = 3;
77a135fe 2851 uv = NATIVE_TO_UNI(grok_oct(s, &len, &flags, NULL));
ba210ebe
JH
2852 s += len;
2853 }
012bcf8d 2854 goto NUM_ESCAPE_INSERT;
02aa26ce 2855
77a135fe 2856 /* eg. \x24 indicates the hex constant 0x24 */
79072805 2857 case 'x':
a0ed51b3
LW
2858 ++s;
2859 if (*s == '{') {
9d4ba2ae 2860 char* const e = strchr(s, '}');
a4c04bdc
NC
2861 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2862 PERL_SCAN_DISALLOW_PREFIX;
53305cf1 2863 STRLEN len;
355860ce 2864
53305cf1 2865 ++s;
adaeee49 2866 if (!e) {
a0ed51b3 2867 yyerror("Missing right brace on \\x{}");
355860ce 2868 continue;
ba210ebe 2869 }
53305cf1 2870 len = e - s;
77a135fe 2871 uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
ba210ebe 2872 s = e + 1;
a0ed51b3
LW
2873 }
2874 else {
ba210ebe 2875 {
53305cf1 2876 STRLEN len = 2;
a4c04bdc 2877 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
77a135fe 2878 uv = NATIVE_TO_UNI(grok_hex(s, &len, &flags, NULL));
ba210ebe
JH
2879 s += len;
2880 }
012bcf8d
GS
2881 }
2882
2883 NUM_ESCAPE_INSERT:
77a135fe
KW
2884 /* Insert oct, hex, or \N{U+...} escaped character. There will
2885 * always be enough room in sv since such escapes will be
2886 * longer than any UTF-8 sequence they can end up as, except if
2887 * they force us to recode the rest of the string into utf8 */
ba7cea30 2888
77a135fe
KW
2889 /* Here uv is the ordinal of the next character being added in
2890 * unicode (converted from native). (It has to be done before
2891 * here because \N is interpreted as unicode, and oct and hex
2892 * as native.) */
2893 if (!UNI_IS_INVARIANT(uv)) {
9aa983d2 2894 if (!has_utf8 && uv > 255) {
77a135fe
KW
2895 /* Might need to recode whatever we have accumulated so
2896 * far if it contains any chars variant in utf8 or
2897 * utf-ebcdic. */
2898
2899 SvCUR_set(sv, d - SvPVX_const(sv));
2900 SvPOK_on(sv);
2901 *d = '\0';
77a135fe 2902 /* See Note on sizing above. */
7bf79863
KW
2903 sv_utf8_upgrade_flags_grow(sv,
2904 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2905 UNISKIP(uv) + (STRLEN)(send - s) + 1);
77a135fe
KW
2906 d = SvPVX(sv) + SvCUR(sv);
2907 has_utf8 = TRUE;
012bcf8d
GS
2908 }
2909
77a135fe
KW
2910 if (has_utf8) {
2911 d = (char*)uvuni_to_utf8((U8*)d, uv);
f9a63242
JH
2912 if (PL_lex_inwhat == OP_TRANS &&
2913 PL_sublex_info.sub_op) {
2914 PL_sublex_info.sub_op->op_private |=
2915 (PL_lex_repl ? OPpTRANS_FROM_UTF
2916 : OPpTRANS_TO_UTF);
f9a63242 2917 }
e294cc5d
JH
2918#ifdef EBCDIC
2919 if (uv > 255 && !dorange)
2920 native_range = FALSE;
2921#endif
012bcf8d 2922 }
a0ed51b3 2923 else {
012bcf8d 2924 *d++ = (char)uv;
a0ed51b3 2925 }
012bcf8d
GS
2926 }
2927 else {
c4d5f83a 2928 *d++ = (char) uv;
a0ed51b3 2929 }
79072805 2930 continue;
02aa26ce 2931
77a135fe
KW
2932 /* \N{LATIN SMALL LETTER A} is a named character, and so is
2933 * \N{U+0041} */
4a2d328f 2934 case 'N':
55eda711 2935 ++s;
423cee85
JH
2936 if (*s == '{') {
2937 char* e = strchr(s, '}');
155aba94 2938 SV *res;
423cee85 2939 STRLEN len;
cfd0369c 2940 const char *str;
4e553d73 2941
423cee85 2942 if (!e) {
5777a3f7 2943 yyerror("Missing right brace on \\N{}");
423cee85
JH
2944 e = s - 1;
2945 goto cont_scan;
2946 }
dbc0d4f2 2947 if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
77a135fe
KW
2948 /* \N{U+...} The ... is a unicode value even on EBCDIC
2949 * machines */
dbc0d4f2
JH
2950 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2951 PERL_SCAN_DISALLOW_PREFIX;
2952 s += 3;
2953 len = e - s;
2954 uv = grok_hex(s, &len, &flags, NULL);
b57a0404
JH
2955 if ( e > s && len != (STRLEN)(e - s) ) {
2956 uv = 0xFFFD;
fc8cd66c 2957 }
dbc0d4f2
JH
2958 s = e + 1;
2959 goto NUM_ESCAPE_INSERT;
2960 }
55eda711 2961 res = newSVpvn(s + 1, e - s - 1);
bd61b366 2962 res = new_constant( NULL, 0, "charnames",
eb0d8d16 2963 res, NULL, s - 2, e - s + 3 );
f9a63242
JH
2964 if (has_utf8)
2965 sv_utf8_upgrade(res);
cfd0369c 2966 str = SvPV_const(res,len);
1c47067b
JH
2967#ifdef EBCDIC_NEVER_MIND
2968 /* charnames uses pack U and that has been
2969 * recently changed to do the below uni->native
2970 * mapping, so this would be redundant (and wrong,
2971 * the code point would be doubly converted).
2972 * But leave this in just in case the pack U change
2973 * gets revoked, but the semantics is still
2974 * desireable for charnames. --jhi */
cddc7ef4 2975 {
cfd0369c 2976 UV uv = utf8_to_uvchr((const U8*)str, 0);
cddc7ef4
JH
2977
2978 if (uv < 0x100) {
89ebb4a3 2979 U8 tmpbuf[UTF8_MAXBYTES+1], *d;
cddc7ef4
JH
2980
2981 d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
2982 sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
cfd0369c 2983 str = SvPV_const(res, len);
cddc7ef4
JH
2984 }
2985 }
2986#endif
77a135fe
KW
2987 /* If destination is not in utf8 but this new character is,
2988 * recode the dest to utf8 */
89491803 2989 if (!has_utf8 && SvUTF8(res)) {
77a135fe 2990 SvCUR_set(sv, d - SvPVX_const(sv));
f08d6ad9 2991 SvPOK_on(sv);
e4f3eed8 2992 *d = '\0';
77a135fe 2993 /* See Note on sizing above. */
7bf79863
KW
2994 sv_utf8_upgrade_flags_grow(sv,
2995 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
2996 len + (STRLEN)(send - s) + 1);
f08d6ad9 2997 d = SvPVX(sv) + SvCUR(sv);
89491803 2998 has_utf8 = TRUE;
77a135fe 2999 } else if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
423cee85 3000
77a135fe
KW
3001 /* See Note on sizing above. (NOTE: SvCUR() is not set
3002 * correctly here). */
3003 const STRLEN off = d - SvPVX_const(sv);
3004 d = SvGROW(sv, off + len + (STRLEN)(send - s) + 1) + off;
423cee85 3005 }
e294cc5d
JH
3006#ifdef EBCDIC
3007 if (!dorange)
3008 native_range = FALSE; /* \N{} is guessed to be Unicode */
3009#endif
423cee85
JH
3010 Copy(str, d, len, char);
3011 d += len;
3012 SvREFCNT_dec(res);
3013 cont_scan:
3014 s = e + 1;
3015 }
3016 else
5777a3f7 3017 yyerror("Missing braces on \\N{}");
423cee85
JH
3018 continue;
3019
02aa26ce 3020 /* \c is a control character */
79072805
LW
3021 case 'c':
3022 s++;
961ce445 3023 if (s < send) {
ba210ebe 3024 U8 c = *s++;
c7f1f016
NIS
3025#ifdef EBCDIC
3026 if (isLOWER(c))
3027 c = toUPPER(c);
3028#endif
db42d148 3029 *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
ba210ebe 3030 }
961ce445
RGS
3031 else {
3032 yyerror("Missing control char name in \\c");
3033 }
79072805 3034 continue;
02aa26ce
NT
3035
3036 /* printf-style backslashes, formfeeds, newlines, etc */
79072805 3037 case 'b':
db42d148 3038 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
79072805
LW
3039 break;
3040 case 'n':
db42d148 3041 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
79072805
LW
3042 break;
3043 case 'r':
db42d148 3044 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
79072805
LW
3045 break;
3046 case 'f':
db42d148 3047 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
79072805
LW
3048 break;
3049 case 't':
db42d148 3050 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
79072805 3051 break;
34a3fe2a 3052 case 'e':
db42d148 3053 *d++ = ASCII_TO_NEED(has_utf8,'\033');
34a3fe2a
PP
3054 break;
3055 case 'a':
db42d148 3056 *d++ = ASCII_TO_NEED(has_utf8,'\007');
79072805 3057 break;
02aa26ce
NT
3058 } /* end switch */
3059
79072805
LW
3060 s++;
3061 continue;
02aa26ce 3062 } /* end if (backslash) */
4c3a8340
TS
3063#ifdef EBCDIC
3064 else
3065 literal_endpoint++;
3066#endif
02aa26ce 3067
f9a63242 3068 default_action:
77a135fe
KW
3069 /* If we started with encoded form, or already know we want it,
3070 then encode the next character */
3071 if (! NATIVE_IS_INVARIANT((U8)(*s)) && (this_utf8 || has_utf8)) {
2b9d42f0 3072 STRLEN len = 1;
77a135fe
KW
3073
3074
3075 /* One might think that it is wasted effort in the case of the
3076 * source being utf8 (this_utf8 == TRUE) to take the next character
3077 * in the source, convert it to an unsigned value, and then convert
3078 * it back again. But the source has not been validated here. The
3079 * routine that does the conversion checks for errors like
3080 * malformed utf8 */
3081
5f66b61c
AL
3082 const UV nextuv = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
3083 const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
77a135fe
KW
3084 if (!has_utf8) {
3085 SvCUR_set(sv, d - SvPVX_const(sv));
3086 SvPOK_on(sv);
3087 *d = '\0';
77a135fe 3088 /* See Note on sizing above. */
7bf79863
KW
3089 sv_utf8_upgrade_flags_grow(sv,
3090 SV_GMAGIC|SV_FORCE_UTF8_UPGRADE,
3091 need + (STRLEN)(send - s) + 1);
77a135fe
KW
3092 d = SvPVX(sv) + SvCUR(sv);
3093 has_utf8 = TRUE;
3094 } else if (need > len) {
3095 /* encoded value larger than old, may need extra space (NOTE:
3096 * SvCUR() is not set correctly here). See Note on sizing
3097 * above. */
9d4ba2ae 3098 const STRLEN off = d - SvPVX_const(sv);
77a135fe 3099 d = SvGROW(sv, off + need + (STRLEN)(send - s) + 1) + off;
2b9d42f0 3100 }
77a135fe
KW
3101 s += len;
3102
5f66b61c 3103 d = (char*)uvchr_to_utf8((U8*)d, nextuv);
e294cc5d
JH
3104#ifdef EBCDIC
3105 if (uv > 255 && !dorange)
3106 native_range = FALSE;
3107#endif
2b9d42f0
NIS
3108 }
3109 else {
3110 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
3111 }
02aa26ce
NT
3112 } /* while loop to process each character */
3113
3114 /* terminate the string and set up the sv */
79072805 3115 *d = '\0';
95a20fc0 3116 SvCUR_set(sv, d - SvPVX_const(sv));
2b9d42f0 3117 if (SvCUR(sv) >= SvLEN(sv))
d0063567 3118 Perl_croak(aTHX_ "panic: constant overflowed allocated space");
2b9d42f0 3119
79072805 3120 SvPOK_on(sv);
9f4817db 3121 if (PL_encoding && !has_utf8) {
d0063567
DK
3122 sv_recode_to_utf8(sv, PL_encoding);
3123 if (SvUTF8(sv))
3124 has_utf8 = TRUE;
9f4817db 3125 }
2b9d42f0 3126 if (has_utf8) {
7e2040f0 3127 SvUTF8_on(sv);
2b9d42f0 3128 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
d0063567 3129 PL_sublex_info.sub_op->op_private |=
2b9d42f0
NIS
3130 (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
3131 }
3132 }
79072805 3133
02aa26ce 3134 /* shrink the sv if we allocated more than we used */
79072805 3135 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1da4ca5f 3136 SvPV_shrink_to_cur(sv);
79072805 3137 }
02aa26ce 3138
6154021b 3139 /* return the substring (via pl_yylval) only if we parsed anything */
3280af22 3140 if (s > PL_bufptr) {
eb0d8d16
NC
3141 if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) ) {
3142 const char *const key = PL_lex_inpat ? "qr" : "q";
3143 const STRLEN keylen = PL_lex_inpat ? 2 : 1;
3144 const char *type;
3145 STRLEN typelen;
3146
3147 if (PL_lex_inwhat == OP_TRANS) {
3148 type = "tr";
3149 typelen = 2;
3150 } else if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat) {
3151 type = "s";
3152 typelen = 1;
3153 } else {
3154 type = "qq";
3155 typelen = 2;
3156 }
3157
3158 sv = S_new_constant(aTHX_ start, s - start, key, keylen, sv, NULL,
3159 type, typelen);
3160 }
6154021b 3161 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
b3ac6de7 3162 } else
8990e307 3163 SvREFCNT_dec(sv);
79072805
LW
3164 return s;
3165}
3166
ffb4593c
NT
3167/* S_intuit_more
3168 * Returns TRUE if there's more to the expression (e.g., a subscript),
3169 * FALSE otherwise.
ffb4593c
NT
3170 *
3171 * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
3172 *
3173 * ->[ and ->{ return TRUE
3174 * { and [ outside a pattern are always subscripts, so return TRUE
3175 * if we're outside a pattern and it's not { or [, then return FALSE
3176 * if we're in a pattern and the first char is a {
3177 * {4,5} (any digits around the comma) returns FALSE
3178 * if we're in a pattern and the first char is a [
3179 * [] returns FALSE
3180 * [SOMETHING] has a funky algorithm to decide whether it's a
3181 * character class or not. It has to deal with things like
3182 * /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
3183 * anything else returns TRUE
3184 */
3185
9cbb5ea2
GS
3186/* This is the one truly awful dwimmer necessary to conflate C and sed. */
3187
76e3520e 3188STATIC int
cea2e8a9 3189S_intuit_more(pTHX_ register char *s)
79072805 3190{
97aff369 3191 dVAR;
7918f24d
NC
3192
3193 PERL_ARGS_ASSERT_INTUIT_MORE;
3194
3280af22 3195 if (PL_lex_brackets)
79072805
LW
3196 return TRUE;
3197 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
3198 return TRUE;
3199 if (*s != '{' && *s != '[')
3200 return FALSE;
3280af22 3201 if (!PL_lex_inpat)
79072805
LW
3202 return TRUE;
3203
3204 /* In a pattern, so maybe we have {n,m}. */
3205 if (*s == '{') {
3206 s++;
3207 if (!isDIGIT(*s))
3208 return TRUE;
3209 while (isDIGIT(*s))
3210 s++;
3211 if (*s == ',')
3212 s++;
3213 while (isDIGIT(*s))
3214 s++;
3215 if (*s == '}')
3216 return FALSE;
3217 return TRUE;
3218
3219 }
3220
3221 /* On the other hand, maybe we have a character class */
3222
3223 s++;
3224 if (*s == ']' || *s == '^')
3225 return FALSE;
3226 else {
ffb4593c 3227 /* this is terrifying, and it works */
79072805
LW
3228 int weight = 2; /* let's weigh the evidence */
3229 char seen[256];
f27ffc4a 3230 unsigned char un_char = 255, last_un_char;
9d4ba2ae 3231 const char * const send = strchr(s,']');
3280af22 3232 char tmpbuf[sizeof PL_tokenbuf * 4];
79072805
LW
3233
3234 if (!send) /* has to be an expression */
3235 return TRUE;
3236
3237 Zero(seen,256,char);
3238 if (*s == '$')
3239 weight -= 3;
3240 else if (isDIGIT(*s)) {
3241 if (s[1] != ']') {
3242 if (isDIGIT(s[1]) && s[2] == ']')
3243 weight -= 10;
3244 }
3245 else
3246 weight -= 100;
3247 }
3248 for (; s < send; s++) {
3249 last_un_char = un_char;
3250 un_char = (unsigned char)*s;
3251 switch (*s) {
3252 case '@':
3253 case '&':
3254 case '$':
3255 weight -= seen[un_char] * 10;
7e2040f0 3256 if (isALNUM_lazy_if(s+1,UTF)) {
90e5519e 3257 int len;
8903cb82 3258 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
90e5519e
NC
3259 len = (int)strlen(tmpbuf);
3260 if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
79072805
LW
3261 weight -= 100;
3262 else
3263 weight -= 10;
3264 }
3265 else if (*s == '$' && s[1] &&
93a17b20
LW
3266 strchr("[#!%*<>()-=",s[1])) {
3267 if (/*{*/ strchr("])} =",s[2]))
79072805
LW
3268 weight -= 10;
3269 else
3270 weight -= 1;
3271 }
3272 break;
3273 case '\\':
3274 un_char = 254;
3275 if (s[1]) {
93a17b20 3276 if (strchr("wds]",s[1]))
79072805 3277 weight += 100;
10edeb5d 3278 else if (seen[(U8)'\''] || seen[(U8)'"'])
79072805 3279 weight += 1;
93a17b20 3280 else if (strchr("rnftbxcav",s[1]))
79072805
LW
3281 weight += 40;
3282 else if (isDIGIT(s[1])) {
3283 weight += 40;
3284 while (s[1] && isDIGIT(s[1]))
3285 s++;
3286 }
3287 }
3288 else
3289 weight += 100;
3290 break;
3291 case '-':
3292 if (s[1] == '\\')
3293 weight += 50;
93a17b20 3294 if (strchr("aA01! ",last_un_char))
79072805 3295 weight += 30;
93a17b20 3296 if (strchr("zZ79~",s[1]))
79072805 3297 weight += 30;
f27ffc4a
GS
3298 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
3299 weight -= 5; /* cope with negative subscript */
79072805
LW
3300 break;
3301 default:
3792a11b
NC
3302 if (!isALNUM(last_un_char)
3303 && !(last_un_char == '$' || last_un_char == '@'
3304 || last_un_char == '&')
3305 && isALPHA(*s) && s[1] && isALPHA(s[1])) {
79072805
LW
3306 char *d = tmpbuf;
3307 while (isALPHA(*s))
3308 *d++ = *s++;
3309 *d = '\0';
5458a98a 3310 if (keyword(tmpbuf, d - tmpbuf, 0))
79072805
LW
3311 weight -= 150;
3312 }
3313 if (un_char == last_un_char + 1)
3314 weight += 5;
3315 weight -= seen[un_char];
3316 break;
3317 }
3318 seen[un_char]++;
3319 }
3320 if (weight >= 0) /* probably a character class */
3321 return FALSE;
3322 }
3323
3324 return TRUE;
3325}
ffed7fef 3326
ffb4593c
NT
3327/*
3328 * S_intuit_method
3329 *
3330 * Does all the checking to disambiguate
3331 * foo bar
3332 * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise
3333 * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
3334 *
3335 * First argument is the stuff after the first token, e.g. "bar".
3336 *
3337 * Not a method if bar is a filehandle.
3338 * Not a method if foo is a subroutine prototyped to take a filehandle.
3339 * Not a method if it's really "Foo $bar"
3340 * Method if it's "foo $bar"
3341 * Not a method if it's really "print foo $bar"
3342 * Method if it's really "foo package::" (interpreted as package->foo)
8f8cf39c 3343 * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3cb0bbe5 3344 * Not a method if bar is a filehandle or package, but is quoted with
ffb4593c
NT
3345 * =>
3346 */
3347
76e3520e 3348STATIC int
62d55b22 3349S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
a0d0e21e 3350{
97aff369 3351 dVAR;
a0d0e21e 3352 char *s = start + (*start == '$');
3280af22 3353 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
3354 STRLEN len;
3355 GV* indirgv;
5db06880
NC
3356#ifdef PERL_MAD
3357 int soff;
3358#endif
a0d0e21e 3359
7918f24d
NC
3360 PERL_ARGS_ASSERT_INTUIT_METHOD;
3361
a0d0e21e 3362 if (gv) {
62d55b22 3363 if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
a0d0e21e 3364 return 0;
62d55b22
NC
3365 if (cv) {
3366 if (SvPOK(cv)) {
3367 const char *proto = SvPVX_const(cv);
3368 if (proto) {
3369 if (*proto == ';')
3370 proto++;
3371 if (*proto == '*')
3372 return 0;
3373 }
b6c543e3
IZ
3374 }
3375 } else
c35e046a 3376 gv = NULL;
a0d0e21e 3377 }
8903cb82 3378 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
ffb4593c
NT
3379 /* start is the beginning of the possible filehandle/object,
3380 * and s is the end of it
3381 * tmpbuf is a copy of it
3382 */
3383
a0d0e21e 3384 if (*start == '$') {
3ef1310e
RGS
3385 if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
3386 isUPPER(*PL_tokenbuf))
a0d0e21e 3387 return 0;
5db06880
NC
3388#ifdef PERL_MAD
3389 len = start - SvPVX(PL_linestr);
3390#endif
29595ff2 3391 s = PEEKSPACE(s);
f0092767 3392#ifdef PERL_MAD
5db06880
NC
3393 start = SvPVX(PL_linestr) + len;
3394#endif
3280af22
NIS
3395 PL_bufptr = start;
3396 PL_expect = XREF;
a0d0e21e
LW
3397 return *s == '(' ? FUNCMETH : METHOD;
3398 }
5458a98a 3399 if (!keyword(tmpbuf, len, 0)) {
c3e0f903
GS
3400 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
3401 len -= 2;
3402 tmpbuf[len] = '\0';
5db06880
NC
3403#ifdef PERL_MAD
3404 soff = s - SvPVX(PL_linestr);
3405#endif
c3e0f903
GS
3406 goto bare_package;
3407 }
90e5519e 3408 indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
8ebc5c01 3409 if (indirgv && GvCVu(indirgv))
a0d0e21e
LW
3410 return 0;
3411 /* filehandle or package name makes it a method */
da51bb9b 3412 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
5db06880
NC
3413#ifdef PERL_MAD
3414 soff = s - SvPVX(PL_linestr);
3415#endif
29595ff2 3416 s = PEEKSPACE(s);
3280af22 3417 if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
55497cff 3418 return 0; /* no assumptions -- "=>" quotes bearword */
c3e0f903 3419 bare_package:
cd81e915 3420 start_force(PL_curforce);
9ded7720 3421 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
64142370 3422 S_newSV_maybe_utf8(aTHX_ tmpbuf, len));
9ded7720 3423 NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
5db06880
NC
3424 if (PL_madskills)
3425 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3280af22 3426 PL_expect = XTERM;
a0d0e21e 3427 force_next(WORD);
3280af22 3428 PL_bufptr = s;
5db06880
NC
3429#ifdef PERL_MAD
3430 PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
3431#endif
a0d0e21e
LW
3432 return *s == '(' ? FUNCMETH : METHOD;
3433 }
3434 }
3435 return 0;
3436}
3437
16d20bd9 3438/* Encoded script support. filter_add() effectively inserts a
4e553d73 3439 * 'pre-processing' function into the current source input stream.
16d20bd9
AD
3440 * Note that the filter function only applies to the current source file
3441 * (e.g., it will not affect files 'require'd or 'use'd by this one).
3442 *
3443 * The datasv parameter (which may be NULL) can be used to pass
3444 * private data to this instance of the filter. The filter function
3445 * can recover the SV using the FILTER_DATA macro and use it to
3446 * store private buffers and state information.
3447 *
3448 * The supplied datasv parameter is upgraded to a PVIO type
4755096e 3449 * and the IoDIRP/IoANY field is used to store the function pointer,
e0c19803 3450 * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
16d20bd9
AD
3451 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
3452 * private use must be set using malloc'd pointers.
3453 */
16d20bd9
AD
3454
3455SV *
864dbfa3 3456Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
16d20bd9 3457{
97aff369 3458 dVAR;
f4c556ac 3459 if (!funcp)
a0714e2c 3460 return NULL;
f4c556ac 3461
5486870f
DM
3462 if (!PL_parser)
3463 return NULL;
3464
3280af22
NIS
3465 if (!PL_rsfp_filters)
3466 PL_rsfp_filters = newAV();
16d20bd9 3467 if (!datasv)
561b68a9 3468 datasv = newSV(0);
862a34c6 3469 SvUPGRADE(datasv, SVt_PVIO);
8141890a 3470 IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
e0c19803 3471 IoFLAGS(datasv) |= IOf_FAKE_DIRP;
f4c556ac 3472 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
55662e27
JH
3473 FPTR2DPTR(void *, IoANY(datasv)),
3474 SvPV_nolen(datasv)));
3280af22
NIS
3475 av_unshift(PL_rsfp_filters, 1);
3476 av_store(PL_rsfp_filters, 0, datasv) ;
16d20bd9
AD
3477 return(datasv);
3478}
4e553d73 3479
16d20bd9
AD
3480
3481/* Delete most recently added instance of this filter function. */
a0d0e21e 3482void
864dbfa3 3483Perl_filter_del(pTHX_ filter_t funcp)
16d20bd9 3484{
97aff369 3485 dVAR;
e0c19803 3486 SV *datasv;
24801a4b 3487
7918f24d
NC
3488 PERL_ARGS_ASSERT_FILTER_DEL;
3489
33073adb 3490#ifdef DEBUGGING
55662e27
JH
3491 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
3492 FPTR2DPTR(void*, funcp)));
33073adb 3493#endif
5486870f 3494 if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
16d20bd9
AD
3495 return;
3496 /* if filter is on top of stack (usual case) just pop it off */
e0c19803 3497 datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
8141890a 3498 if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
e0c19803 3499 IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
4755096e 3500 IoANY(datasv) = (void *)NULL;
3280af22 3501 sv_free(av_pop(PL_rsfp_filters));
e50aee73 3502
16d20bd9
AD
3503 return;
3504 }
3505 /* we need to search for the correct entry and clear it */
cea2e8a9 3506 Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
16d20bd9
AD
3507}
3508
3509
1de9afcd
RGS
3510/* Invoke the idxth filter function for the current rsfp. */
3511/* maxlen 0 = read one text line */
16d20bd9 3512I32
864dbfa3 3513Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
a0d0e21e 3514{
97aff369 3515 dVAR;
16d20bd9
AD
3516 filter_t funcp;
3517 SV *datasv = NULL;
f482118e
NC
3518 /* This API is bad. It should have been using unsigned int for maxlen.
3519 Not sure if we want to change the API, but if not we should sanity
3520 check the value here. */
39cd7a59
NC
3521 const unsigned int correct_length
3522 = maxlen < 0 ?
3523#ifdef PERL_MICRO
3524 0x7FFFFFFF
3525#else
3526 INT_MAX
3527#endif
3528 : maxlen;
e50aee73 3529
7918f24d
NC
3530 PERL_ARGS_ASSERT_FILTER_READ;
3531
5486870f 3532 if (!PL_parser || !PL_rsfp_filters)
16d20bd9 3533 return -1;
1de9afcd 3534 if (idx > AvFILLp(PL_rsfp_filters)) { /* Any more filters? */
16d20bd9
AD
3535 /* Provide a default input filter to make life easy. */
3536 /* Note that we append to the line. This is handy. */
f4c556ac
GS
3537 DEBUG_P(PerlIO_printf(Perl_debug_log,
3538 "filter_read %d: from rsfp\n", idx));
f482118e 3539 if (correct_length) {
16d20bd9
AD
3540 /* Want a block */
3541 int len ;
f54cb97a 3542 const int old_len = SvCUR(buf_sv);
16d20bd9
AD
3543
3544 /* ensure buf_sv is large enough */
881d8f0a 3545 SvGROW(buf_sv, (STRLEN)(old_len + correct_length + 1)) ;
f482118e
NC
3546 if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
3547 correct_length)) <= 0) {
3280af22 3548 if (PerlIO_error(PL_rsfp))
37120919
AD
3549 return -1; /* error */
3550 else
3551 return 0 ; /* end of file */
3552 }
16d20bd9 3553 SvCUR_set(buf_sv, old_len + len) ;
881d8f0a 3554 SvPVX(buf_sv)[old_len + len] = '\0';
16d20bd9
AD
3555 } else {
3556 /* Want a line */
3280af22
NIS
3557 if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
3558 if (PerlIO_error(PL_rsfp))
37120919
AD
3559 return -1; /* error */
3560 else
3561 return 0 ; /* end of file */
3562 }
16d20bd9
AD
3563 }
3564 return SvCUR(buf_sv);
3565 }
3566 /* Skip this filter slot if filter has been deleted */
1de9afcd 3567 if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
f4c556ac
GS
3568 DEBUG_P(PerlIO_printf(Perl_debug_log,
3569 "filter_read %d: skipped (filter deleted)\n",
3570 idx));
f482118e 3571 return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
16d20bd9
AD
3572 }
3573 /* Get function pointer hidden within datasv */
8141890a 3574 funcp = DPTR2FPTR(filter_t, IoANY(datasv));
f4c556ac
GS
3575 DEBUG_P(PerlIO_printf(Perl_debug_log,
3576 "filter_read %d: via function %p (%s)\n",
ca0270c4 3577 idx, (void*)datasv, SvPV_nolen_const(datasv)));
16d20bd9
AD
3578 /* Call function. The function is expected to */
3579 /* call "FILTER_READ(idx+1, buf_sv)" first. */
37120919 3580 /* Return: <0:error, =0:eof, >0:not eof */
f482118e 3581 return (*funcp)(aTHX_ idx, buf_sv, correct_length);
16d20bd9
AD
3582}
3583
76e3520e 3584STATIC char *
5cc814fd 3585S_filter_gets(pTHX_ register SV *sv, STRLEN append)
16d20bd9 3586{
97aff369 3587 dVAR;
7918f24d
NC
3588
3589 PERL_ARGS_ASSERT_FILTER_GETS;
3590
c39cd008 3591#ifdef PERL_CR_FILTER
3280af22 3592 if (!PL_rsfp_filters) {
c39cd008 3593 filter_add(S_cr_textfilter,NULL);
a868473f
NIS
3594 }
3595#endif
3280af22 3596 if (PL_rsfp_filters) {
55497cff 3597 if (!append)
3598 SvCUR_set(sv, 0); /* start with empty line */
16d20bd9
AD
3599 if (FILTER_READ(0, sv, 0) > 0)
3600 return ( SvPVX(sv) ) ;
3601 else
bd61b366 3602 return NULL ;
16d20bd9 3603 }
9d116dd7 3604 else
5cc814fd 3605 return (sv_gets(sv, PL_rsfp, append));
a0d0e21e
LW
3606}
3607
01ec43d0 3608STATIC HV *
9bde8eb0 3609S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
def3634b 3610{
97aff369 3611 dVAR;
def3634b
GS
3612 GV *gv;
3613
7918f24d
NC
3614 PERL_ARGS_ASSERT_FIND_IN_MY_STASH;
3615
01ec43d0 3616 if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
def3634b
GS
3617 return PL_curstash;
3618
3619 if (len > 2 &&
3620 (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
90e5519e 3621 (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
01ec43d0
GS
3622 {
3623 return GvHV(gv); /* Foo:: */
def3634b
GS
3624 }
3625
3626 /* use constant CLASS => 'MyClass' */
c35e046a
AL
3627 gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
3628 if (gv && GvCV(gv)) {
3629 SV * const sv = cv_const_sv(GvCV(gv));
3630 if (sv)
9bde8eb0 3631 pkgname = SvPV_const(sv, len);
def3634b
GS
3632 }
3633
9bde8eb0 3634 return gv_stashpvn(pkgname, len, 0);
def3634b 3635}
a0d0e21e 3636
e3f73d4e
RGS
3637/*
3638 * S_readpipe_override
3639 * Check whether readpipe() is overriden, and generates the appropriate
3640 * optree, provided sublex_start() is called afterwards.
3641 */
3642STATIC void
1d51329b 3643S_readpipe_override(pTHX)
e3f73d4e
RGS
3644{
3645 GV **gvp;
3646 GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
6154021b 3647 pl_yylval.ival = OP_BACKTICK;
e3f73d4e
RGS
3648 if ((gv_readpipe
3649 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
3650 ||
3651 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
d5e716f5 3652 && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
e3f73d4e
RGS
3653 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
3654 {
3655 PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
3656 append_elem(OP_LIST,
3657 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
3658 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
3659 }
e3f73d4e
RGS
3660}
3661
5db06880
NC
3662#ifdef PERL_MAD
3663 /*
3664 * Perl_madlex
3665 * The intent of this yylex wrapper is to minimize the changes to the
3666 * tokener when we aren't interested in collecting madprops. It remains
3667 * to be seen how successful this strategy will be...
3668 */
3669
3670int
3671Perl_madlex(pTHX)
3672{
3673 int optype;
3674 char *s = PL_bufptr;
3675
cd81e915
NC
3676 /* make sure PL_thiswhite is initialized */
3677 PL_thiswhite = 0;
3678 PL_thismad = 0;
5db06880 3679
cd81e915 3680 /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
5db06880
NC
3681 if (PL_pending_ident)
3682 return S_pending_ident(aTHX);
3683
3684 /* previous token ate up our whitespace? */
cd81e915
NC
3685 if (!PL_lasttoke && PL_nextwhite) {
3686 PL_thiswhite = PL_nextwhite;
3687 PL_nextwhite = 0;
5db06880
NC
3688 }
3689
3690 /* isolate the token, and figure out where it is without whitespace */
cd81e915
NC
3691 PL_realtokenstart = -1;
3692 PL_thistoken = 0;
5db06880
NC
3693 optype = yylex();
3694 s = PL_bufptr;
cd81e915 3695 assert(PL_curforce < 0);
5db06880 3696
cd81e915
NC
3697 if (!PL_thismad || PL_thismad->mad_key == '^') { /* not forced already? */
3698 if (!PL_thistoken) {
3699 if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
6b29d1f5 3700 PL_thistoken = newSVpvs("");
5db06880 3701 else {
c35e046a 3702 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915 3703 PL_thistoken = newSVpvn(tstart, s - tstart);
5db06880
NC
3704 }
3705 }
cd81e915
NC
3706 if (PL_thismad) /* install head */
3707 CURMAD('X', PL_thistoken);
5db06880
NC
3708 }
3709
3710 /* last whitespace of a sublex? */
cd81e915
NC
3711 if (optype == ')' && PL_endwhite) {
3712 CURMAD('X', PL_endwhite);
5db06880
NC
3713 }
3714
cd81e915 3715 if (!PL_thismad) {
5db06880
NC
3716
3717 /* if no whitespace and we're at EOF, bail. Otherwise fake EOF below. */
cd81e915
NC
3718 if (!PL_thiswhite && !PL_endwhite && !optype) {
3719 sv_free(PL_thistoken);
3720 PL_thistoken = 0;
5db06880
NC
3721 return 0;
3722 }
3723
3724 /* put off final whitespace till peg */
3725 if (optype == ';' && !PL_rsfp) {
cd81e915
NC
3726 PL_nextwhite = PL_thiswhite;
3727 PL_thiswhite = 0;
5db06880 3728 }
cd81e915
NC
3729 else if (PL_thisopen) {
3730 CURMAD('q', PL_thisopen);
3731 if (PL_thistoken)
3732 sv_free(PL_thistoken);
3733 PL_thistoken = 0;
5db06880
NC
3734 }
3735 else {
3736 /* Store actual token text as madprop X */
cd81e915 3737 CURMAD('X', PL_thistoken);
5db06880
NC
3738 }
3739
cd81e915 3740 if (PL_thiswhite) {
5db06880 3741 /* add preceding whitespace as madprop _ */
cd81e915 3742 CURMAD('_', PL_thiswhite);
5db06880
NC
3743 }
3744
cd81e915 3745 if (PL_thisstuff) {
5db06880 3746 /* add quoted material as madprop = */
cd81e915 3747 CURMAD('=', PL_thisstuff);
5db06880
NC
3748 }
3749
cd81e915 3750 if (PL_thisclose) {
5db06880 3751 /* add terminating quote as madprop Q */
cd81e915 3752 CURMAD('Q', PL_thisclose);
5db06880
NC
3753 }
3754 }
3755
3756 /* special processing based on optype */
3757
3758 switch (optype) {
3759
3760 /* opval doesn't need a TOKEN since it can already store mp */
3761 case WORD:
3762 case METHOD:
3763 case FUNCMETH:
3764 case THING:
3765 case PMFUNC:
3766 case PRIVATEREF:
3767 case FUNC0SUB:
3768 case UNIOPSUB:
3769 case LSTOPSUB:
6154021b
RGS
3770 if (pl_yylval.opval)
3771 append_madprops(PL_thismad, pl_yylval.opval, 0);
cd81e915 3772 PL_thismad = 0;
5db06880
NC
3773 return optype;
3774
3775 /* fake EOF */
3776 case 0:
3777 optype = PEG;
cd81e915
NC
3778 if (PL_endwhite) {
3779 addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
3780 PL_endwhite = 0;
5db06880
NC
3781 }
3782 break;
3783
3784 case ']':
3785 case '}':
cd81e915 3786 if (PL_faketokens)
5db06880
NC
3787 break;
3788 /* remember any fake bracket that lexer is about to discard */
3789 if (PL_lex_brackets == 1 &&
3790 ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
3791 {
3792 s = PL_bufptr;
3793 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3794 s++;
3795 if (*s == '}') {
cd81e915
NC
3796 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
3797 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3798 PL_thiswhite = 0;
5db06880
NC
3799 PL_bufptr = s - 1;
3800 break; /* don't bother looking for trailing comment */
3801 }
3802 else
3803 s = PL_bufptr;
3804 }
3805 if (optype == ']')
3806 break;
3807 /* FALLTHROUGH */
3808
3809 /* attach a trailing comment to its statement instead of next token */
3810 case ';':
cd81e915 3811 if (PL_faketokens)
5db06880
NC
3812 break;
3813 if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
3814 s = PL_bufptr;
3815 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3816 s++;
3817 if (*s == '\n' || *s == '#') {
3818 while (s < PL_bufend && *s != '\n')
3819 s++;
3820 if (s < PL_bufend)
3821 s++;
cd81e915
NC
3822 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
3823 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3824 PL_thiswhite = 0;
5db06880
NC
3825 PL_bufptr = s;
3826 }
3827 }
3828 break;
3829
3830 /* pval */
3831 case LABEL:
3832 break;
3833
3834 /* ival */
3835 default:
3836 break;
3837
3838 }
3839
3840 /* Create new token struct. Note: opvals return early above. */
6154021b 3841 pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad);
cd81e915 3842 PL_thismad = 0;
5db06880
NC
3843 return optype;
3844}
3845#endif
3846
468aa647 3847STATIC char *
cc6ed77d 3848S_tokenize_use(pTHX_ int is_use, char *s) {
97aff369 3849 dVAR;
7918f24d
NC
3850
3851 PERL_ARGS_ASSERT_TOKENIZE_USE;
3852
468aa647
RGS
3853 if (PL_expect != XSTATE)
3854 yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
3855 is_use ? "use" : "no"));
29595ff2 3856 s = SKIPSPACE1(s);
468aa647
RGS
3857 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
3858 s = force_version(s, TRUE);
17c59fdf
VP
3859 if (*s == ';' || *s == '}'
3860 || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) {
cd81e915 3861 start_force(PL_curforce);
9ded7720 3862 NEXTVAL_NEXTTOKE.opval = NULL;
468aa647
RGS
3863 force_next(WORD);
3864 }
3865 else if (*s == 'v') {
3866 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3867 s = force_version(s, FALSE);
3868 }
3869 }
3870 else {
3871 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3872 s = force_version(s, FALSE);
3873 }
6154021b 3874 pl_yylval.ival = is_use;
468aa647
RGS
3875 return s;
3876}
748a9306 3877#ifdef DEBUGGING
27da23d5 3878 static const char* const exp_name[] =
09bef843 3879 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
27308ded 3880 "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
09bef843 3881 };
748a9306 3882#endif
463ee0b2 3883
02aa26ce
NT
3884/*
3885 yylex
3886
3887 Works out what to call the token just pulled out of the input
3888 stream. The yacc parser takes care of taking the ops we return and
3889 stitching them into a tree.
3890
3891 Returns:
3892 PRIVATEREF
3893
3894 Structure:
3895 if read an identifier
3896 if we're in a my declaration
3897 croak if they tried to say my($foo::bar)
3898 build the ops for a my() declaration
3899 if it's an access to a my() variable
3900 are we in a sort block?
3901 croak if my($a); $a <=> $b
3902 build ops for access to a my() variable
3903 if in a dq string, and they've said @foo and we can't find @foo
3904 croak
3905 build ops for a bareword
3906 if we already built the token before, use it.
3907*/
3908
20141f0e 3909
dba4d153
JH
3910#ifdef __SC__
3911#pragma segment Perl_yylex
3912#endif
dba4d153 3913int
dba4d153 3914Perl_yylex(pTHX)
20141f0e 3915{
97aff369 3916 dVAR;
3afc138a 3917 register char *s = PL_bufptr;
378cc40b 3918 register char *d;
463ee0b2 3919 STRLEN len;
aa7440fb 3920 bool bof = FALSE;
580561a3 3921 U32 fake_eof = 0;
a687059c 3922
10edeb5d
JH
3923 /* orig_keyword, gvp, and gv are initialized here because
3924 * jump to the label just_a_word_zero can bypass their
3925 * initialization later. */
3926 I32 orig_keyword = 0;
3927 GV *gv = NULL;
3928 GV **gvp = NULL;
3929
bbf60fe6 3930 DEBUG_T( {
396482e1 3931 SV* tmp = newSVpvs("");
b6007c36
DM
3932 PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
3933 (IV)CopLINE(PL_curcop),
3934 lex_state_names[PL_lex_state],
3935 exp_name[PL_expect],
3936 pv_display(tmp, s, strlen(s), 0, 60));
3937 SvREFCNT_dec(tmp);
bbf60fe6 3938 } );
02aa26ce 3939 /* check if there's an identifier for us to look at */
ba979b31 3940 if (PL_pending_ident)
bbf60fe6 3941 return REPORT(S_pending_ident(aTHX));
bbce6d69 3942
02aa26ce
NT
3943 /* no identifier pending identification */
3944
3280af22 3945 switch (PL_lex_state) {
79072805
LW
3946#ifdef COMMENTARY
3947 case LEX_NORMAL: /* Some compilers will produce faster */
3948 case LEX_INTERPNORMAL: /* code if we comment these out. */
3949 break;
3950#endif
3951
09bef843 3952 /* when we've already built the next token, just pull it out of the queue */
79072805 3953 case LEX_KNOWNEXT:
5db06880
NC
3954#ifdef PERL_MAD
3955 PL_lasttoke--;
6154021b 3956 pl_yylval = PL_nexttoke[PL_lasttoke].next_val;
5db06880 3957 if (PL_madskills) {
cd81e915 3958 PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
5db06880 3959 PL_nexttoke[PL_lasttoke].next_mad = 0;
cd81e915 3960 if (PL_thismad && PL_thismad->mad_key == '_') {
daba3364 3961 PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val);
cd81e915
NC
3962 PL_thismad->mad_val = 0;
3963 mad_free(PL_thismad);
3964 PL_thismad = 0;
5db06880
NC
3965 }
3966 }
3967 if (!PL_lasttoke) {
3968 PL_lex_state = PL_lex_defer;
3969 PL_expect = PL_lex_expect;
3970 PL_lex_defer = LEX_NORMAL;
3971 if (!PL_nexttoke[PL_lasttoke].next_type)
3972 return yylex();
3973 }
3974#else
3280af22 3975 PL_nexttoke--;
6154021b 3976 pl_yylval = PL_nextval[PL_nexttoke];
3280af22
NIS
3977 if (!PL_nexttoke) {
3978 PL_lex_state = PL_lex_defer;
3979 PL_expect = PL_lex_expect;
3980 PL_lex_defer = LEX_NORMAL;
463ee0b2 3981 }
5db06880
NC
3982#endif
3983#ifdef PERL_MAD
3984 /* FIXME - can these be merged? */
3985 return(PL_nexttoke[PL_lasttoke].next_type);
3986#else
bbf60fe6 3987 return REPORT(PL_nexttype[PL_nexttoke]);
5db06880 3988#endif
79072805 3989
02aa26ce 3990 /* interpolated case modifiers like \L \U, including \Q and \E.
3280af22 3991 when we get here, PL_bufptr is at the \
02aa26ce 3992 */
79072805
LW
3993 case LEX_INTERPCASEMOD:
3994#ifdef DEBUGGING
3280af22 3995 if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
cea2e8a9 3996 Perl_croak(aTHX_ "panic: INTERPCASEMOD");
79072805 3997#endif
02aa26ce 3998 /* handle \E or end of string */
3280af22 3999 if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
02aa26ce 4000 /* if at a \E */
3280af22 4001 if (PL_lex_casemods) {
f54cb97a 4002 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
3280af22 4003 PL_lex_casestack[PL_lex_casemods] = '\0';
02aa26ce 4004
3792a11b
NC
4005 if (PL_bufptr != PL_bufend
4006 && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
3280af22
NIS
4007 PL_bufptr += 2;
4008 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
4009#ifdef PERL_MAD
4010 if (PL_madskills)
6b29d1f5 4011 PL_thistoken = newSVpvs("\\E");
5db06880 4012#endif
a0d0e21e 4013 }
bbf60fe6 4014 return REPORT(')');
79072805 4015 }
5db06880
NC
4016#ifdef PERL_MAD
4017 while (PL_bufptr != PL_bufend &&
4018 PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
cd81e915 4019 if (!PL_thiswhite)
6b29d1f5 4020 PL_thiswhite = newSVpvs("");
cd81e915 4021 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
5db06880
NC
4022 PL_bufptr += 2;
4023 }
4024#else
3280af22
NIS
4025 if (PL_bufptr != PL_bufend)
4026 PL_bufptr += 2;
5db06880 4027#endif
3280af22 4028 PL_lex_state = LEX_INTERPCONCAT;
cea2e8a9 4029 return yylex();
79072805
LW
4030 }
4031 else {
607df283 4032 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 4033 "### Saw case modifier\n"); });
3280af22 4034 s = PL_bufptr + 1;
6e909404 4035 if (s[1] == '\\' && s[2] == 'E') {
5db06880 4036#ifdef PERL_MAD
cd81e915 4037 if (!PL_thiswhite)
6b29d1f5 4038 PL_thiswhite = newSVpvs("");
cd81e915 4039 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
5db06880 4040#endif
89122651 4041 PL_bufptr = s + 3;
6e909404
JH
4042 PL_lex_state = LEX_INTERPCONCAT;
4043 return yylex();
a0d0e21e 4044 }
6e909404 4045 else {
90771dc0 4046 I32 tmp;
5db06880
NC
4047 if (!PL_madskills) /* when just compiling don't need correct */
4048 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
4049 tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */
3792a11b 4050 if ((*s == 'L' || *s == 'U') &&
6e909404
JH
4051 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
4052 PL_lex_casestack[--PL_lex_casemods] = '\0';
bbf60fe6 4053 return REPORT(')');
6e909404
JH
4054 }
4055 if (PL_lex_casemods > 10)
4056 Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
4057 PL_lex_casestack[PL_lex_casemods++] = *s;
4058 PL_lex_casestack[PL_lex_casemods] = '\0';
4059 PL_lex_state = LEX_INTERPCONCAT;
cd81e915 4060 start_force(PL_curforce);
9ded7720 4061 NEXTVAL_NEXTTOKE.ival = 0;
6e909404 4062 force_next('(');
cd81e915 4063 start_force(PL_curforce);
6e909404 4064 if (*s == 'l')
9ded7720 4065 NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
6e909404 4066 else if (*s == 'u')
9ded7720 4067 NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
6e909404 4068 else if (*s == 'L')
9ded7720 4069 NEXTVAL_NEXTTOKE.ival = OP_LC;
6e909404 4070 else if (*s == 'U')
9ded7720 4071 NEXTVAL_NEXTTOKE.ival = OP_UC;
6e909404 4072 else if (*s == 'Q')
9ded7720 4073 NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
6e909404
JH
4074 else
4075 Perl_croak(aTHX_ "panic: yylex");
5db06880 4076 if (PL_madskills) {
a5849ce5
NC
4077 SV* const tmpsv = newSVpvs("\\ ");
4078 /* replace the space with the character we want to escape
4079 */
4080 SvPVX(tmpsv)[1] = *s;
5db06880
NC
4081 curmad('_', tmpsv);
4082 }
6e909404 4083 PL_bufptr = s + 1;
a0d0e21e 4084 }
79072805 4085 force_next(FUNC);
3280af22
NIS
4086 if (PL_lex_starts) {
4087 s = PL_bufptr;
4088 PL_lex_starts = 0;
5db06880
NC
4089#ifdef PERL_MAD
4090 if (PL_madskills) {
cd81e915
NC
4091 if (PL_thistoken)
4092 sv_free(PL_thistoken);
6b29d1f5 4093 PL_thistoken = newSVpvs("");
5db06880
NC
4094 }
4095#endif
131b3ad0
DM
4096 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4097 if (PL_lex_casemods == 1 && PL_lex_inpat)
4098 OPERATOR(',');
4099 else
4100 Aop(OP_CONCAT);
79072805
LW
4101 }
4102 else
cea2e8a9 4103 return yylex();
79072805
LW
4104 }
4105
55497cff 4106 case LEX_INTERPPUSH:
bbf60fe6 4107 return REPORT(sublex_push());
55497cff 4108
79072805 4109 case LEX_INTERPSTART:
3280af22 4110 if (PL_bufptr == PL_bufend)
bbf60fe6 4111 return REPORT(sublex_done());
607df283 4112 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 4113 "### Interpolated variable\n"); });
3280af22
NIS
4114 PL_expect = XTERM;
4115 PL_lex_dojoin = (*PL_bufptr == '@');
4116 PL_lex_state = LEX_INTERPNORMAL;
4117 if (PL_lex_dojoin) {
cd81e915 4118 start_force(PL_curforce);
9ded7720 4119 NEXTVAL_NEXTTOKE.ival = 0;
79072805 4120 force_next(',');
cd81e915 4121 start_force(PL_curforce);
a0d0e21e 4122 force_ident("\"", '$');
cd81e915 4123 start_force(PL_curforce);
9ded7720 4124 NEXTVAL_NEXTTOKE.ival = 0;
79072805 4125 force_next('$');
cd81e915 4126 start_force(PL_curforce);
9ded7720 4127 NEXTVAL_NEXTTOKE.ival = 0;
79072805 4128 force_next('(');
cd81e915 4129 start_force(PL_curforce);
9ded7720 4130 NEXTVAL_NEXTTOKE.ival = OP_JOIN; /* emulate join($", ...) */
79072805
LW
4131 force_next(FUNC);
4132 }
3280af22
NIS
4133 if (PL_lex_starts++) {
4134 s = PL_bufptr;
5db06880
NC
4135#ifdef PERL_MAD
4136 if (PL_madskills) {
cd81e915
NC
4137 if (PL_thistoken)
4138 sv_free(PL_thistoken);
6b29d1f5 4139 PL_thistoken = newSVpvs("");
5db06880
NC
4140 }
4141#endif
131b3ad0
DM
4142 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4143 if (!PL_lex_casemods && PL_lex_inpat)
4144 OPERATOR(',');
4145 else
4146 Aop(OP_CONCAT);
79072805 4147 }
cea2e8a9 4148 return yylex();
79072805
LW
4149
4150 case LEX_INTERPENDMAYBE:
3280af22
NIS
4151 if (intuit_more(PL_bufptr)) {
4152 PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
79072805
LW
4153 break;
4154 }
4155 /* FALL THROUGH */
4156
4157 case LEX_INTERPEND:
3280af22
NIS
4158 if (PL_lex_dojoin) {
4159 PL_lex_dojoin = FALSE;
4160 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
4161#ifdef PERL_MAD
4162 if (PL_madskills) {
cd81e915
NC
4163 if (PL_thistoken)
4164 sv_free(PL_thistoken);
6b29d1f5 4165 PL_thistoken = newSVpvs("");
5db06880
NC
4166 }
4167#endif
bbf60fe6 4168 return REPORT(')');
79072805 4169 }
43a16006 4170 if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
25da4f38 4171 && SvEVALED(PL_lex_repl))
43a16006 4172 {
e9fa98b2 4173 if (PL_bufptr != PL_bufend)
cea2e8a9 4174 Perl_croak(aTHX_ "Bad evalled substitution pattern");
a0714e2c 4175 PL_lex_repl = NULL;
e9fa98b2 4176 }
79072805
LW
4177 /* FALLTHROUGH */
4178 case LEX_INTERPCONCAT:
4179#ifdef DEBUGGING
3280af22 4180 if (PL_lex_brackets)
cea2e8a9 4181 Perl_croak(aTHX_ "panic: INTERPCONCAT");
79072805 4182#endif
3280af22 4183 if (PL_bufptr == PL_bufend)
bbf60fe6 4184 return REPORT(sublex_done());
79072805 4185
3280af22
NIS
4186 if (SvIVX(PL_linestr) == '\'') {
4187 SV *sv = newSVsv(PL_linestr);
4188 if (!PL_lex_inpat)
76e3520e 4189 sv = tokeq(sv);
3280af22 4190 else if ( PL_hints & HINT_NEW_RE )
eb0d8d16 4191 sv = new_constant(NULL, 0, "qr", sv, sv, "q", 1);
6154021b 4192 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3280af22 4193 s = PL_bufend;
79072805
LW
4194 }
4195 else {
3280af22 4196 s = scan_const(PL_bufptr);
79072805 4197 if (*s == '\\')
3280af22 4198 PL_lex_state = LEX_INTERPCASEMOD;
79072805 4199 else
3280af22 4200 PL_lex_state = LEX_INTERPSTART;
79072805
LW
4201 }
4202
3280af22 4203 if (s != PL_bufptr) {
cd81e915 4204 start_force(PL_curforce);
5db06880
NC
4205 if (PL_madskills) {
4206 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
4207 }
6154021b 4208 NEXTVAL_NEXTTOKE = pl_yylval;
3280af22 4209 PL_expect = XTERM;
79072805 4210 force_next(THING);
131b3ad0 4211 if (PL_lex_starts++) {
5db06880
NC
4212#ifdef PERL_MAD
4213 if (PL_madskills) {
cd81e915
NC
4214 if (PL_thistoken)
4215 sv_free(PL_thistoken);
6b29d1f5 4216 PL_thistoken = newSVpvs("");
5db06880
NC
4217 }
4218#endif
131b3ad0
DM
4219 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
4220 if (!PL_lex_casemods && PL_lex_inpat)
4221 OPERATOR(',');
4222 else
4223 Aop(OP_CONCAT);
4224 }
79072805 4225 else {
3280af22 4226 PL_bufptr = s;
cea2e8a9 4227 return yylex();
79072805
LW
4228 }
4229 }
4230
cea2e8a9 4231 return yylex();
a0d0e21e 4232 case LEX_FORMLINE:
3280af22
NIS
4233 PL_lex_state = LEX_NORMAL;
4234 s = scan_formline(PL_bufptr);
4235 if (!PL_lex_formbrack)
a0d0e21e
LW
4236 goto rightbracket;
4237 OPERATOR(';');
79072805
LW
4238 }
4239
3280af22
NIS
4240 s = PL_bufptr;
4241 PL_oldoldbufptr = PL_oldbufptr;
4242 PL_oldbufptr = s;
463ee0b2
LW
4243
4244 retry:
5db06880 4245#ifdef PERL_MAD
cd81e915
NC
4246 if (PL_thistoken) {
4247 sv_free(PL_thistoken);
4248 PL_thistoken = 0;
5db06880 4249 }
cd81e915 4250 PL_realtokenstart = s - SvPVX(PL_linestr); /* assume but undo on ws */
5db06880 4251#endif
378cc40b
LW
4252 switch (*s) {
4253 default:
7e2040f0 4254 if (isIDFIRST_lazy_if(s,UTF))
834a4ddd 4255 goto keylookup;
b1fc3636
CJ
4256 {
4257 unsigned char c = *s;
4258 len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
4259 if (len > UNRECOGNIZED_PRECEDE_COUNT) {
4260 d = UTF ? (char *) Perl_utf8_hop(aTHX_ (U8 *) s, -UNRECOGNIZED_PRECEDE_COUNT) : s - UNRECOGNIZED_PRECEDE_COUNT;
4261 } else {
4262 d = PL_linestart;
4263 }
4264 *s = '\0';
4265 Perl_croak(aTHX_ "Unrecognized character \\x%02X; marked by <-- HERE after %s<-- HERE near column %d", c, d, (int) len + 1);
4266 }
e929a76b
LW
4267 case 4:
4268 case 26:
4269 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 4270 case 0:
5db06880
NC
4271#ifdef PERL_MAD
4272 if (PL_madskills)
cd81e915 4273 PL_faketokens = 0;
5db06880 4274#endif
3280af22
NIS
4275 if (!PL_rsfp) {
4276 PL_last_uni = 0;
4277 PL_last_lop = 0;
c5ee2135 4278 if (PL_lex_brackets) {
10edeb5d
JH
4279 yyerror((const char *)
4280 (PL_lex_formbrack
4281 ? "Format not terminated"
4282 : "Missing right curly or square bracket"));
c5ee2135 4283 }
4e553d73 4284 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 4285 "### Tokener got EOF\n");
5f80b19c 4286 } );
79072805 4287 TOKEN(0);
463ee0b2 4288 }
3280af22 4289 if (s++ < PL_bufend)
a687059c 4290 goto retry; /* ignore stray nulls */
3280af22
NIS
4291 PL_last_uni = 0;
4292 PL_last_lop = 0;
4293 if (!PL_in_eval && !PL_preambled) {
4294 PL_preambled = TRUE;
5db06880
NC
4295#ifdef PERL_MAD
4296 if (PL_madskills)
cd81e915 4297 PL_faketokens = 1;
5db06880 4298#endif
5ab7ff98
NC
4299 if (PL_perldb) {
4300 /* Generate a string of Perl code to load the debugger.
4301 * If PERL5DB is set, it will return the contents of that,
4302 * otherwise a compile-time require of perl5db.pl. */
4303
4304 const char * const pdb = PerlEnv_getenv("PERL5DB");
4305
4306 if (pdb) {
4307 sv_setpv(PL_linestr, pdb);
4308 sv_catpvs(PL_linestr,";");
4309 } else {
4310 SETERRNO(0,SS_NORMAL);
4311 sv_setpvs(PL_linestr, "BEGIN { require 'perl5db.pl' };");
4312 }
4313 } else
4314 sv_setpvs(PL_linestr,"");
c62eb204
NC
4315 if (PL_preambleav) {
4316 SV **svp = AvARRAY(PL_preambleav);
4317 SV **const end = svp + AvFILLp(PL_preambleav);
4318 while(svp <= end) {
4319 sv_catsv(PL_linestr, *svp);
4320 ++svp;
396482e1 4321 sv_catpvs(PL_linestr, ";");
91b7def8 4322 }
daba3364 4323 sv_free(MUTABLE_SV(PL_preambleav));
3280af22 4324 PL_preambleav = NULL;
91b7def8 4325 }
9f639728
FR
4326 if (PL_minus_E)
4327 sv_catpvs(PL_linestr,
4328 "use feature ':5." STRINGIFY(PERL_VERSION) "';");
3280af22 4329 if (PL_minus_n || PL_minus_p) {
f0e67a1d 4330 sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
3280af22 4331 if (PL_minus_l)
396482e1 4332 sv_catpvs(PL_linestr,"chomp;");
3280af22 4333 if (PL_minus_a) {
3280af22 4334 if (PL_minus_F) {
3792a11b
NC
4335 if ((*PL_splitstr == '/' || *PL_splitstr == '\''
4336 || *PL_splitstr == '"')
3280af22 4337 && strchr(PL_splitstr + 1, *PL_splitstr))
3db68c4c 4338 Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
54310121 4339 else {
c8ef6a4b
NC
4340 /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
4341 bytes can be used as quoting characters. :-) */
dd374669 4342 const char *splits = PL_splitstr;
91d456ae 4343 sv_catpvs(PL_linestr, "our @F=split(q\0");
48c4c863
NC
4344 do {
4345 /* Need to \ \s */
dd374669
AL
4346 if (*splits == '\\')
4347 sv_catpvn(PL_linestr, splits, 1);
4348 sv_catpvn(PL_linestr, splits, 1);
4349 } while (*splits++);
48c4c863
NC
4350 /* This loop will embed the trailing NUL of
4351 PL_linestr as the last thing it does before
4352 terminating. */
396482e1 4353 sv_catpvs(PL_linestr, ");");
54310121 4354 }
2304df62
AD
4355 }
4356 else
396482e1 4357 sv_catpvs(PL_linestr,"our @F=split(' ');");
2304df62 4358 }
79072805 4359 }
396482e1 4360 sv_catpvs(PL_linestr, "\n");
3280af22
NIS
4361 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4362 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 4363 PL_last_lop = PL_last_uni = NULL;
65269a95 4364 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash)
5fa550fb 4365 update_debugger_info(PL_linestr, NULL, 0);
79072805 4366 goto retry;
a687059c 4367 }
e929a76b 4368 do {
580561a3
Z
4369 fake_eof = 0;
4370 bof = PL_rsfp ? TRUE : FALSE;
f0e67a1d 4371 if (0) {
7e28d3af 4372 fake_eof:
f0e67a1d
Z
4373 fake_eof = LEX_FAKE_EOF;
4374 }
4375 PL_bufptr = PL_bufend;
17cc9359 4376 CopLINE_inc(PL_curcop);
f0e67a1d 4377 if (!lex_next_chunk(fake_eof)) {
17cc9359 4378 CopLINE_dec(PL_curcop);
f0e67a1d
Z
4379 s = PL_bufptr;
4380 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
4381 }
17cc9359 4382 CopLINE_dec(PL_curcop);
5db06880 4383#ifdef PERL_MAD
f0e67a1d 4384 if (!PL_rsfp)
cd81e915 4385 PL_realtokenstart = -1;
5db06880 4386#endif
f0e67a1d 4387 s = PL_bufptr;
7aa207d6
JH
4388 /* If it looks like the start of a BOM or raw UTF-16,
4389 * check if it in fact is. */
580561a3 4390 if (bof && PL_rsfp &&
7aa207d6
JH
4391 (*s == 0 ||
4392 *(U8*)s == 0xEF ||
4393 *(U8*)s >= 0xFE ||
4394 s[1] == 0)) {
eb160463 4395 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
7e28d3af 4396 if (bof) {
3280af22 4397 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 4398 s = swallow_bom((U8*)s);
e929a76b 4399 }
378cc40b 4400 }
3280af22 4401 if (PL_doextract) {
a0d0e21e 4402 /* Incest with pod. */
5db06880
NC
4403#ifdef PERL_MAD
4404 if (PL_madskills)
cd81e915 4405 sv_catsv(PL_thiswhite, PL_linestr);
5db06880 4406#endif
01a57ef7 4407 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
76f68e9b 4408 sv_setpvs(PL_linestr, "");
3280af22
NIS
4409 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4410 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 4411 PL_last_lop = PL_last_uni = NULL;
3280af22 4412 PL_doextract = FALSE;
a0d0e21e 4413 }
4e553d73 4414 }
85613cab
Z
4415 if (PL_rsfp)
4416 incline(s);
3280af22
NIS
4417 } while (PL_doextract);
4418 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
3280af22 4419 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 4420 PL_last_lop = PL_last_uni = NULL;
57843af0 4421 if (CopLINE(PL_curcop) == 1) {
3280af22 4422 while (s < PL_bufend && isSPACE(*s))
79072805 4423 s++;
a0d0e21e 4424 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 4425 s++;
5db06880
NC
4426#ifdef PERL_MAD
4427 if (PL_madskills)
cd81e915 4428 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
5db06880 4429#endif
bd61b366 4430 d = NULL;
3280af22 4431 if (!PL_in_eval) {
44a8e56a 4432 if (*s == '#' && *(s+1) == '!')
4433 d = s + 2;
4434#ifdef ALTERNATE_SHEBANG
4435 else {
bfed75c6 4436 static char const as[] = ALTERNATE_SHEBANG;
44a8e56a 4437 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
4438 d = s + (sizeof(as) - 1);
4439 }
4440#endif /* ALTERNATE_SHEBANG */
4441 }
4442 if (d) {
b8378b72 4443 char *ipath;
774d564b 4444 char *ipathend;
b8378b72 4445
774d564b 4446 while (isSPACE(*d))
b8378b72
CS
4447 d++;
4448 ipath = d;
774d564b 4449 while (*d && !isSPACE(*d))
4450 d++;
4451 ipathend = d;
4452
4453#ifdef ARG_ZERO_IS_SCRIPT
4454 if (ipathend > ipath) {
4455 /*
4456 * HP-UX (at least) sets argv[0] to the script name,
4457 * which makes $^X incorrect. And Digital UNIX and Linux,
4458 * at least, set argv[0] to the basename of the Perl
4459 * interpreter. So, having found "#!", we'll set it right.
4460 */
fafc274c
NC
4461 SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
4462 SVt_PV)); /* $^X */
774d564b 4463 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 4464 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 4465 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 4466 SvSETMAGIC(x);
4467 }
556c1dec
JH
4468 else {
4469 STRLEN blen;
4470 STRLEN llen;
cfd0369c 4471 const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
9d4ba2ae 4472 const char * const lstart = SvPV_const(x,llen);
556c1dec
JH
4473 if (llen < blen) {
4474 bstart += blen - llen;
4475 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
4476 sv_setpvn(x, ipath, ipathend - ipath);
4477 SvSETMAGIC(x);
4478 }
4479 }
4480 }
774d564b 4481 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 4482 }
774d564b 4483#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
4484
4485 /*
4486 * Look for options.
4487 */
748a9306 4488 d = instr(s,"perl -");
84e30d1a 4489 if (!d) {
748a9306 4490 d = instr(s,"perl");
84e30d1a
GS
4491#if defined(DOSISH)
4492 /* avoid getting into infinite loops when shebang
4493 * line contains "Perl" rather than "perl" */
4494 if (!d) {
4495 for (d = ipathend-4; d >= ipath; --d) {
4496 if ((*d == 'p' || *d == 'P')
4497 && !ibcmp(d, "perl", 4))
4498 {
4499 break;
4500 }
4501 }
4502 if (d < ipath)
bd61b366 4503 d = NULL;
84e30d1a
GS
4504 }
4505#endif
4506 }
44a8e56a 4507#ifdef ALTERNATE_SHEBANG
4508 /*
4509 * If the ALTERNATE_SHEBANG on this system starts with a
4510 * character that can be part of a Perl expression, then if
4511 * we see it but not "perl", we're probably looking at the
4512 * start of Perl code, not a request to hand off to some
4513 * other interpreter. Similarly, if "perl" is there, but
4514 * not in the first 'word' of the line, we assume the line
4515 * contains the start of the Perl program.
44a8e56a 4516 */
4517 if (d && *s != '#') {
f54cb97a 4518 const char *c = ipath;
44a8e56a 4519 while (*c && !strchr("; \t\r\n\f\v#", *c))
4520 c++;
4521 if (c < d)
bd61b366 4522 d = NULL; /* "perl" not in first word; ignore */
44a8e56a 4523 else
4524 *s = '#'; /* Don't try to parse shebang line */
4525 }
774d564b 4526#endif /* ALTERNATE_SHEBANG */
748a9306 4527 if (!d &&
44a8e56a 4528 *s == '#' &&
774d564b 4529 ipathend > ipath &&
3280af22 4530 !PL_minus_c &&
748a9306 4531 !instr(s,"indir") &&
3280af22 4532 instr(PL_origargv[0],"perl"))
748a9306 4533 {
27da23d5 4534 dVAR;
9f68db38 4535 char **newargv;
9f68db38 4536
774d564b 4537 *ipathend = '\0';
4538 s = ipathend + 1;
3280af22 4539 while (s < PL_bufend && isSPACE(*s))
9f68db38 4540 s++;
3280af22 4541 if (s < PL_bufend) {
d85f917e 4542 Newx(newargv,PL_origargc+3,char*);
9f68db38 4543 newargv[1] = s;
3280af22 4544 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
4545 s++;
4546 *s = '\0';
3280af22 4547 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
4548 }
4549 else
3280af22 4550 newargv = PL_origargv;
774d564b 4551 newargv[0] = ipath;
b35112e7 4552 PERL_FPU_PRE_EXEC
b4748376 4553 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 4554 PERL_FPU_POST_EXEC
cea2e8a9 4555 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 4556 }
748a9306 4557 if (d) {
c35e046a
AL
4558 while (*d && !isSPACE(*d))
4559 d++;
4560 while (SPACE_OR_TAB(*d))
4561 d++;
748a9306
LW
4562
4563 if (*d++ == '-') {
f54cb97a 4564 const bool switches_done = PL_doswitches;
fb993905
GA
4565 const U32 oldpdb = PL_perldb;
4566 const bool oldn = PL_minus_n;
4567 const bool oldp = PL_minus_p;
c7030b81 4568 const char *d1 = d;
fb993905 4569
8cc95fdb 4570 do {
4ba71d51
FC
4571 bool baduni = FALSE;
4572 if (*d1 == 'C') {
bd0ab00d
NC
4573 const char *d2 = d1 + 1;
4574 if (parse_unicode_opts((const char **)&d2)
4575 != PL_unicode)
4576 baduni = TRUE;
4ba71d51
FC
4577 }
4578 if (baduni || *d1 == 'M' || *d1 == 'm') {
c7030b81
NC
4579 const char * const m = d1;
4580 while (*d1 && !isSPACE(*d1))
4581 d1++;
cea2e8a9 4582 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
c7030b81 4583 (int)(d1 - m), m);
8cc95fdb 4584 }
c7030b81
NC
4585 d1 = moreswitches(d1);
4586 } while (d1);
f0b2cf55
YST
4587 if (PL_doswitches && !switches_done) {
4588 int argc = PL_origargc;
4589 char **argv = PL_origargv;
4590 do {
4591 argc--,argv++;
4592 } while (argc && argv[0][0] == '-' && argv[0][1]);
4593 init_argv_symbols(argc,argv);
4594 }
65269a95 4595 if (((PERLDB_LINE || PERLDB_SAVESRC) && !oldpdb) ||
155aba94 4596 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 4597 /* if we have already added "LINE: while (<>) {",
4598 we must not do it again */
748a9306 4599 {
76f68e9b 4600 sv_setpvs(PL_linestr, "");
3280af22
NIS
4601 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
4602 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 4603 PL_last_lop = PL_last_uni = NULL;
3280af22 4604 PL_preambled = FALSE;
65269a95 4605 if (PERLDB_LINE || PERLDB_SAVESRC)
3280af22 4606 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
4607 goto retry;
4608 }
a0d0e21e 4609 }
79072805 4610 }
9f68db38 4611 }
79072805 4612 }
3280af22
NIS
4613 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4614 PL_bufptr = s;
4615 PL_lex_state = LEX_FORMLINE;
cea2e8a9 4616 return yylex();
ae986130 4617 }
378cc40b 4618 goto retry;
4fdae800 4619 case '\r':
6a27c188 4620#ifdef PERL_STRICT_CR
cea2e8a9 4621 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 4622 Perl_croak(aTHX_
cc507455 4623 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 4624#endif
4fdae800 4625 case ' ': case '\t': case '\f': case 013:
5db06880 4626#ifdef PERL_MAD
cd81e915 4627 PL_realtokenstart = -1;
ac372eb8
RD
4628 if (!PL_thiswhite)
4629 PL_thiswhite = newSVpvs("");
4630 sv_catpvn(PL_thiswhite, s, 1);
5db06880 4631#endif
ac372eb8 4632 s++;
378cc40b 4633 goto retry;
378cc40b 4634 case '#':
e929a76b 4635 case '\n':
5db06880 4636#ifdef PERL_MAD
cd81e915 4637 PL_realtokenstart = -1;
5db06880 4638 if (PL_madskills)
cd81e915 4639 PL_faketokens = 0;
5db06880 4640#endif
3280af22 4641 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
4642 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
4643 /* handle eval qq[#line 1 "foo"\n ...] */
4644 CopLINE_dec(PL_curcop);
4645 incline(s);
4646 }
5db06880
NC
4647 if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
4648 s = SKIPSPACE0(s);
4649 if (!PL_in_eval || PL_rsfp)
4650 incline(s);
4651 }
4652 else {
4653 d = s;
4654 while (d < PL_bufend && *d != '\n')
4655 d++;
4656 if (d < PL_bufend)
4657 d++;
4658 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4659 Perl_croak(aTHX_ "panic: input overflow");
4660#ifdef PERL_MAD
4661 if (PL_madskills)
cd81e915 4662 PL_thiswhite = newSVpvn(s, d - s);
5db06880
NC
4663#endif
4664 s = d;
4665 incline(s);
4666 }
3280af22
NIS
4667 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
4668 PL_bufptr = s;
4669 PL_lex_state = LEX_FORMLINE;
cea2e8a9 4670 return yylex();
a687059c 4671 }
378cc40b 4672 }
a687059c 4673 else {
5db06880
NC
4674#ifdef PERL_MAD
4675 if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
4676 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
cd81e915 4677 PL_faketokens = 0;
5db06880
NC
4678 s = SKIPSPACE0(s);
4679 TOKEN(PEG); /* make sure any #! line is accessible */
4680 }
4681 s = SKIPSPACE0(s);
4682 }
4683 else {
4684/* if (PL_madskills && PL_lex_formbrack) { */
4685 d = s;
4686 while (d < PL_bufend && *d != '\n')
4687 d++;
4688 if (d < PL_bufend)
4689 d++;
4690 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4691 Perl_croak(aTHX_ "panic: input overflow");
4692 if (PL_madskills && CopLINE(PL_curcop) >= 1) {
cd81e915 4693 if (!PL_thiswhite)
6b29d1f5 4694 PL_thiswhite = newSVpvs("");
5db06880 4695 if (CopLINE(PL_curcop) == 1) {
76f68e9b 4696 sv_setpvs(PL_thiswhite, "");
cd81e915 4697 PL_faketokens = 0;
5db06880 4698 }
cd81e915 4699 sv_catpvn(PL_thiswhite, s, d - s);
5db06880
NC
4700 }
4701 s = d;
4702/* }
4703 *s = '\0';
4704 PL_bufend = s; */
4705 }
4706#else
378cc40b 4707 *s = '\0';
3280af22 4708 PL_bufend = s;
5db06880 4709#endif
a687059c 4710 }
378cc40b
LW
4711 goto retry;
4712 case '-':
79072805 4713 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50 4714 I32 ftst = 0;
90771dc0 4715 char tmp;
e5edeb50 4716
378cc40b 4717 s++;
3280af22 4718 PL_bufptr = s;
748a9306
LW
4719 tmp = *s++;
4720
bf4acbe4 4721 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
4722 s++;
4723
4724 if (strnEQ(s,"=>",2)) {
3280af22 4725 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
931e0695 4726 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
748a9306
LW
4727 OPERATOR('-'); /* unary minus */
4728 }
3280af22 4729 PL_last_uni = PL_oldbufptr;
748a9306 4730 switch (tmp) {
e5edeb50
JH
4731 case 'r': ftst = OP_FTEREAD; break;
4732 case 'w': ftst = OP_FTEWRITE; break;
4733 case 'x': ftst = OP_FTEEXEC; break;
4734 case 'o': ftst = OP_FTEOWNED; break;
4735 case 'R': ftst = OP_FTRREAD; break;
4736 case 'W': ftst = OP_FTRWRITE; break;
4737 case 'X': ftst = OP_FTREXEC; break;
4738 case 'O': ftst = OP_FTROWNED; break;
4739 case 'e': ftst = OP_FTIS; break;
4740 case 'z': ftst = OP_FTZERO; break;
4741 case 's': ftst = OP_FTSIZE; break;
4742 case 'f': ftst = OP_FTFILE; break;
4743 case 'd': ftst = OP_FTDIR; break;
4744 case 'l': ftst = OP_FTLINK; break;
4745 case 'p': ftst = OP_FTPIPE; break;
4746 case 'S': ftst = OP_FTSOCK; break;
4747 case 'u': ftst = OP_FTSUID; break;
4748 case 'g': ftst = OP_FTSGID; break;
4749 case 'k': ftst = OP_FTSVTX; break;
4750 case 'b': ftst = OP_FTBLK; break;
4751 case 'c': ftst = OP_FTCHR; break;
4752 case 't': ftst = OP_FTTTY; break;
4753 case 'T': ftst = OP_FTTEXT; break;
4754 case 'B': ftst = OP_FTBINARY; break;
4755 case 'M': case 'A': case 'C':
fafc274c 4756 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
e5edeb50
JH
4757 switch (tmp) {
4758 case 'M': ftst = OP_FTMTIME; break;
4759 case 'A': ftst = OP_FTATIME; break;
4760 case 'C': ftst = OP_FTCTIME; break;
4761 default: break;
4762 }
4763 break;
378cc40b 4764 default:
378cc40b
LW
4765 break;
4766 }
e5edeb50 4767 if (ftst) {
eb160463 4768 PL_last_lop_op = (OPCODE)ftst;
4e553d73 4769 DEBUG_T( { PerlIO_printf(Perl_debug_log,
a18d764d 4770 "### Saw file test %c\n", (int)tmp);
5f80b19c 4771 } );
e5edeb50
JH
4772 FTST(ftst);
4773 }
4774 else {
4775 /* Assume it was a minus followed by a one-letter named
4776 * subroutine call (or a -bareword), then. */
95c31fe3 4777 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0 4778 "### '-%c' looked like a file test but was not\n",
4fccd7c6 4779 (int) tmp);
5f80b19c 4780 } );
3cf7b4c4 4781 s = --PL_bufptr;
e5edeb50 4782 }
378cc40b 4783 }
90771dc0
NC
4784 {
4785 const char tmp = *s++;
4786 if (*s == tmp) {
4787 s++;
4788 if (PL_expect == XOPERATOR)
4789 TERM(POSTDEC);
4790 else
4791 OPERATOR(PREDEC);
4792 }
4793 else if (*s == '>') {
4794 s++;
29595ff2 4795 s = SKIPSPACE1(s);
90771dc0
NC
4796 if (isIDFIRST_lazy_if(s,UTF)) {
4797 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
4798 TOKEN(ARROW);
4799 }
4800 else if (*s == '$')
4801 OPERATOR(ARROW);
4802 else
4803 TERM(ARROW);
4804 }
3280af22 4805 if (PL_expect == XOPERATOR)
90771dc0
NC
4806 Aop(OP_SUBTRACT);
4807 else {
4808 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4809 check_uni();
4810 OPERATOR('-'); /* unary minus */
79072805 4811 }
2f3197b3 4812 }
79072805 4813
378cc40b 4814 case '+':
90771dc0
NC
4815 {
4816 const char tmp = *s++;
4817 if (*s == tmp) {
4818 s++;
4819 if (PL_expect == XOPERATOR)
4820 TERM(POSTINC);
4821 else
4822 OPERATOR(PREINC);
4823 }
3280af22 4824 if (PL_expect == XOPERATOR)
90771dc0
NC
4825 Aop(OP_ADD);
4826 else {
4827 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4828 check_uni();
4829 OPERATOR('+');
4830 }
2f3197b3 4831 }
a687059c 4832
378cc40b 4833 case '*':
3280af22
NIS
4834 if (PL_expect != XOPERATOR) {
4835 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4836 PL_expect = XOPERATOR;
4837 force_ident(PL_tokenbuf, '*');
4838 if (!*PL_tokenbuf)
a0d0e21e 4839 PREREF('*');
79072805 4840 TERM('*');
a687059c 4841 }
79072805
LW
4842 s++;
4843 if (*s == '*') {
a687059c 4844 s++;
79072805 4845 PWop(OP_POW);
a687059c 4846 }
79072805
LW
4847 Mop(OP_MULTIPLY);
4848
378cc40b 4849 case '%':
3280af22 4850 if (PL_expect == XOPERATOR) {
bbce6d69 4851 ++s;
4852 Mop(OP_MODULO);
a687059c 4853 }
3280af22 4854 PL_tokenbuf[0] = '%';
e8ae98db
RGS
4855 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4856 sizeof PL_tokenbuf - 1, FALSE);
3280af22 4857 if (!PL_tokenbuf[1]) {
bbce6d69 4858 PREREF('%');
a687059c 4859 }
3280af22 4860 PL_pending_ident = '%';
bbce6d69 4861 TERM('%');
a687059c 4862
378cc40b 4863 case '^':
79072805 4864 s++;
a0d0e21e 4865 BOop(OP_BIT_XOR);
79072805 4866 case '[':
3280af22 4867 PL_lex_brackets++;
df3467db
IG
4868 {
4869 const char tmp = *s++;
4870 OPERATOR(tmp);
4871 }
378cc40b 4872 case '~':
0d863452 4873 if (s[1] == '~'
3e7dd34d 4874 && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
0d863452
RH
4875 {
4876 s += 2;
4877 Eop(OP_SMARTMATCH);
4878 }
378cc40b 4879 case ',':
90771dc0
NC
4880 {
4881 const char tmp = *s++;
4882 OPERATOR(tmp);
4883 }
a0d0e21e
LW
4884 case ':':
4885 if (s[1] == ':') {
4886 len = 0;
0bfa2a8a 4887 goto just_a_word_zero_gv;
a0d0e21e
LW
4888 }
4889 s++;
09bef843
SB
4890 switch (PL_expect) {
4891 OP *attrs;
5db06880
NC
4892#ifdef PERL_MAD
4893 I32 stuffstart;
4894#endif
09bef843
SB
4895 case XOPERATOR:
4896 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
4897 break;
4898 PL_bufptr = s; /* update in case we back off */
d83f38d8
NC
4899 if (*s == '=') {
4900 deprecate(":= for an empty attribute list");
4901 }
09bef843
SB
4902 goto grabattrs;
4903 case XATTRBLOCK:
4904 PL_expect = XBLOCK;
4905 goto grabattrs;
4906 case XATTRTERM:
4907 PL_expect = XTERMBLOCK;
4908 grabattrs:
5db06880
NC
4909#ifdef PERL_MAD
4910 stuffstart = s - SvPVX(PL_linestr) - 1;
4911#endif
29595ff2 4912 s = PEEKSPACE(s);
5f66b61c 4913 attrs = NULL;
7e2040f0 4914 while (isIDFIRST_lazy_if(s,UTF)) {
90771dc0 4915 I32 tmp;
5cc237b8 4916 SV *sv;
09bef843 4917 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 4918 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
f9829d6b
GS
4919 if (tmp < 0) tmp = -tmp;
4920 switch (tmp) {
4921 case KEY_or:
4922 case KEY_and:
4923 case KEY_for:
11baf631 4924 case KEY_foreach:
f9829d6b
GS
4925 case KEY_unless:
4926 case KEY_if:
4927 case KEY_while:
4928 case KEY_until:
4929 goto got_attrs;
4930 default:
4931 break;
4932 }
4933 }
5cc237b8 4934 sv = newSVpvn(s, len);
09bef843
SB
4935 if (*d == '(') {
4936 d = scan_str(d,TRUE,TRUE);
4937 if (!d) {
09bef843
SB
4938 /* MUST advance bufptr here to avoid bogus
4939 "at end of line" context messages from yyerror().
4940 */
4941 PL_bufptr = s + len;
4942 yyerror("Unterminated attribute parameter in attribute list");
4943 if (attrs)
4944 op_free(attrs);
5cc237b8 4945 sv_free(sv);
bbf60fe6 4946 return REPORT(0); /* EOF indicator */
09bef843
SB
4947 }
4948 }
4949 if (PL_lex_stuff) {
09bef843
SB
4950 sv_catsv(sv, PL_lex_stuff);
4951 attrs = append_elem(OP_LIST, attrs,
4952 newSVOP(OP_CONST, 0, sv));
4953 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 4954 PL_lex_stuff = NULL;
09bef843
SB
4955 }
4956 else {
5cc237b8
BS
4957 if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
4958 sv_free(sv);
1108974d 4959 if (PL_in_my == KEY_our) {
df9a6019 4960 deprecate(":unique");
1108974d 4961 }
bfed75c6 4962 else
371fce9b
DM
4963 Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
4964 }
4965
d3cea301
SB
4966 /* NOTE: any CV attrs applied here need to be part of
4967 the CVf_BUILTIN_ATTRS define in cv.h! */
5cc237b8
BS
4968 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
4969 sv_free(sv);
78f9721b 4970 CvLVALUE_on(PL_compcv);
5cc237b8
BS
4971 }
4972 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
4973 sv_free(sv);
8e5dadda 4974 deprecate(":locked");
5cc237b8
BS
4975 }
4976 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
4977 sv_free(sv);
78f9721b 4978 CvMETHOD_on(PL_compcv);
5cc237b8 4979 }
78f9721b
SM
4980 /* After we've set the flags, it could be argued that
4981 we don't need to do the attributes.pm-based setting
4982 process, and shouldn't bother appending recognized
d3cea301
SB
4983 flags. To experiment with that, uncomment the
4984 following "else". (Note that's already been
4985 uncommented. That keeps the above-applied built-in
4986 attributes from being intercepted (and possibly
4987 rejected) by a package's attribute routines, but is
4988 justified by the performance win for the common case
4989 of applying only built-in attributes.) */
0256094b 4990 else
78f9721b
SM
4991 attrs = append_elem(OP_LIST, attrs,
4992 newSVOP(OP_CONST, 0,
5cc237b8 4993 sv));
09bef843 4994 }
29595ff2 4995 s = PEEKSPACE(d);
0120eecf 4996 if (*s == ':' && s[1] != ':')
29595ff2 4997 s = PEEKSPACE(s+1);
0120eecf
GS
4998 else if (s == d)
4999 break; /* require real whitespace or :'s */
29595ff2 5000 /* XXX losing whitespace on sequential attributes here */
09bef843 5001 }
90771dc0
NC
5002 {
5003 const char tmp
5004 = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
5005 if (*s != ';' && *s != '}' && *s != tmp
5006 && (tmp != '=' || *s != ')')) {
5007 const char q = ((*s == '\'') ? '"' : '\'');
5008 /* If here for an expression, and parsed no attrs, back
5009 off. */
5010 if (tmp == '=' && !attrs) {
5011 s = PL_bufptr;
5012 break;
5013 }
5014 /* MUST advance bufptr here to avoid bogus "at end of line"
5015 context messages from yyerror().
5016 */
5017 PL_bufptr = s;
10edeb5d
JH
5018 yyerror( (const char *)
5019 (*s
5020 ? Perl_form(aTHX_ "Invalid separator character "
5021 "%c%c%c in attribute list", q, *s, q)
5022 : "Unterminated attribute list" ) );
90771dc0
NC
5023 if (attrs)
5024 op_free(attrs);
5025 OPERATOR(':');
09bef843 5026 }
09bef843 5027 }
f9829d6b 5028 got_attrs:
09bef843 5029 if (attrs) {
cd81e915 5030 start_force(PL_curforce);
9ded7720 5031 NEXTVAL_NEXTTOKE.opval = attrs;
cd81e915 5032 CURMAD('_', PL_nextwhite);
89122651 5033 force_next(THING);
5db06880
NC
5034 }
5035#ifdef PERL_MAD
5036 if (PL_madskills) {
cd81e915 5037 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5db06880 5038 (s - SvPVX(PL_linestr)) - stuffstart);
09bef843 5039 }
5db06880 5040#endif
09bef843
SB
5041 TOKEN(COLONATTR);
5042 }
a0d0e21e 5043 OPERATOR(':');
8990e307
LW
5044 case '(':
5045 s++;
3280af22
NIS
5046 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
5047 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 5048 else
3280af22 5049 PL_expect = XTERM;
29595ff2 5050 s = SKIPSPACE1(s);
a0d0e21e 5051 TOKEN('(');
378cc40b 5052 case ';':
f4dd75d9 5053 CLINE;
90771dc0
NC
5054 {
5055 const char tmp = *s++;
5056 OPERATOR(tmp);
5057 }
378cc40b 5058 case ')':
90771dc0
NC
5059 {
5060 const char tmp = *s++;
29595ff2 5061 s = SKIPSPACE1(s);
90771dc0
NC
5062 if (*s == '{')
5063 PREBLOCK(tmp);
5064 TERM(tmp);
5065 }
79072805
LW
5066 case ']':
5067 s++;
3280af22 5068 if (PL_lex_brackets <= 0)
d98d5fff 5069 yyerror("Unmatched right square bracket");
463ee0b2 5070 else
3280af22
NIS
5071 --PL_lex_brackets;
5072 if (PL_lex_state == LEX_INTERPNORMAL) {
5073 if (PL_lex_brackets == 0) {
02255c60
FC
5074 if (*s == '-' && s[1] == '>')
5075 PL_lex_state = LEX_INTERPENDMAYBE;
5076 else if (*s != '[' && *s != '{')
3280af22 5077 PL_lex_state = LEX_INTERPEND;
79072805
LW
5078 }
5079 }
4633a7c4 5080 TERM(']');
79072805
LW
5081 case '{':
5082 leftbracket:
79072805 5083 s++;
3280af22 5084 if (PL_lex_brackets > 100) {
8edd5f42 5085 Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
8990e307 5086 }
3280af22 5087 switch (PL_expect) {
a0d0e21e 5088 case XTERM:
3280af22 5089 if (PL_lex_formbrack) {
a0d0e21e
LW
5090 s--;
5091 PRETERMBLOCK(DO);
5092 }
3280af22
NIS
5093 if (PL_oldoldbufptr == PL_last_lop)
5094 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 5095 else
3280af22 5096 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 5097 OPERATOR(HASHBRACK);
a0d0e21e 5098 case XOPERATOR:
bf4acbe4 5099 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306 5100 s++;
44a8e56a 5101 d = s;
3280af22
NIS
5102 PL_tokenbuf[0] = '\0';
5103 if (d < PL_bufend && *d == '-') {
5104 PL_tokenbuf[0] = '-';
44a8e56a 5105 d++;
bf4acbe4 5106 while (d < PL_bufend && SPACE_OR_TAB(*d))
44a8e56a 5107 d++;
5108 }
7e2040f0 5109 if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3280af22 5110 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 5111 FALSE, &len);
bf4acbe4 5112 while (d < PL_bufend && SPACE_OR_TAB(*d))
748a9306
LW
5113 d++;
5114 if (*d == '}') {
f54cb97a 5115 const char minus = (PL_tokenbuf[0] == '-');
44a8e56a 5116 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
5117 if (minus)
5118 force_next('-');
748a9306
LW
5119 }
5120 }
5121 /* FALL THROUGH */
09bef843 5122 case XATTRBLOCK:
748a9306 5123 case XBLOCK:
3280af22
NIS
5124 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
5125 PL_expect = XSTATE;
a0d0e21e 5126 break;
09bef843 5127 case XATTRTERM:
a0d0e21e 5128 case XTERMBLOCK:
3280af22
NIS
5129 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
5130 PL_expect = XSTATE;
a0d0e21e
LW
5131 break;
5132 default: {
f54cb97a 5133 const char *t;
3280af22
NIS
5134 if (PL_oldoldbufptr == PL_last_lop)
5135 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 5136 else
3280af22 5137 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
29595ff2 5138 s = SKIPSPACE1(s);
8452ff4b
SB
5139 if (*s == '}') {
5140 if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
5141 PL_expect = XTERM;
5142 /* This hack is to get the ${} in the message. */
5143 PL_bufptr = s+1;
5144 yyerror("syntax error");
5145 break;
5146 }
a0d0e21e 5147 OPERATOR(HASHBRACK);
8452ff4b 5148 }
b8a4b1be
GS
5149 /* This hack serves to disambiguate a pair of curlies
5150 * as being a block or an anon hash. Normally, expectation
5151 * determines that, but in cases where we're not in a
5152 * position to expect anything in particular (like inside
5153 * eval"") we have to resolve the ambiguity. This code
5154 * covers the case where the first term in the curlies is a
5155 * quoted string. Most other cases need to be explicitly
a0288114 5156 * disambiguated by prepending a "+" before the opening
b8a4b1be
GS
5157 * curly in order to force resolution as an anon hash.
5158 *
5159 * XXX should probably propagate the outer expectation
5160 * into eval"" to rely less on this hack, but that could
5161 * potentially break current behavior of eval"".
5162 * GSAR 97-07-21
5163 */
5164 t = s;
5165 if (*s == '\'' || *s == '"' || *s == '`') {
5166 /* common case: get past first string, handling escapes */
3280af22 5167 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
5168 if (*t++ == '\\' && (*t == '\\' || *t == *s))
5169 t++;
5170 t++;
a0d0e21e 5171 }
b8a4b1be 5172 else if (*s == 'q') {
3280af22 5173 if (++t < PL_bufend
b8a4b1be 5174 && (!isALNUM(*t)
3280af22 5175 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
5176 && !isALNUM(*t))))
5177 {
abc667d1 5178 /* skip q//-like construct */
f54cb97a 5179 const char *tmps;
b8a4b1be
GS
5180 char open, close, term;
5181 I32 brackets = 1;
5182
3280af22 5183 while (t < PL_bufend && isSPACE(*t))
b8a4b1be 5184 t++;
abc667d1
DM
5185 /* check for q => */
5186 if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
5187 OPERATOR(HASHBRACK);
5188 }
b8a4b1be
GS
5189 term = *t;
5190 open = term;
5191 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5192 term = tmps[5];
5193 close = term;
5194 if (open == close)
3280af22
NIS
5195 for (t++; t < PL_bufend; t++) {
5196 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 5197 t++;
6d07e5e9 5198 else if (*t == open)
b8a4b1be
GS
5199 break;
5200 }
abc667d1 5201 else {
3280af22
NIS
5202 for (t++; t < PL_bufend; t++) {
5203 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 5204 t++;
6d07e5e9 5205 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
5206 break;
5207 else if (*t == open)
5208 brackets++;
5209 }
abc667d1
DM
5210 }
5211 t++;
b8a4b1be 5212 }
abc667d1
DM
5213 else
5214 /* skip plain q word */
5215 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
5216 t += UTF8SKIP(t);
a0d0e21e 5217 }
7e2040f0 5218 else if (isALNUM_lazy_if(t,UTF)) {
0505442f 5219 t += UTF8SKIP(t);
7e2040f0 5220 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
0505442f 5221 t += UTF8SKIP(t);
a0d0e21e 5222 }
3280af22 5223 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 5224 t++;
b8a4b1be
GS
5225 /* if comma follows first term, call it an anon hash */
5226 /* XXX it could be a comma expression with loop modifiers */
3280af22 5227 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 5228 || (*t == '=' && t[1] == '>')))
a0d0e21e 5229 OPERATOR(HASHBRACK);
3280af22 5230 if (PL_expect == XREF)
4e4e412b 5231 PL_expect = XTERM;
a0d0e21e 5232 else {
3280af22
NIS
5233 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
5234 PL_expect = XSTATE;
a0d0e21e 5235 }
8990e307 5236 }
a0d0e21e 5237 break;
463ee0b2 5238 }
6154021b 5239 pl_yylval.ival = CopLINE(PL_curcop);
79072805 5240 if (isSPACE(*s) || *s == '#')
3280af22 5241 PL_copline = NOLINE; /* invalidate current command line number */
79072805 5242 TOKEN('{');
378cc40b 5243 case '}':
79072805
LW
5244 rightbracket:
5245 s++;
3280af22 5246 if (PL_lex_brackets <= 0)
d98d5fff 5247 yyerror("Unmatched right curly bracket");
463ee0b2 5248 else
3280af22 5249 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
c2e66d9e 5250 if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3280af22
NIS
5251 PL_lex_formbrack = 0;
5252 if (PL_lex_state == LEX_INTERPNORMAL) {
5253 if (PL_lex_brackets == 0) {
9059aa12
LW
5254 if (PL_expect & XFAKEBRACK) {
5255 PL_expect &= XENUMMASK;
3280af22
NIS
5256 PL_lex_state = LEX_INTERPEND;
5257 PL_bufptr = s;
5db06880
NC
5258#if 0
5259 if (PL_madskills) {
cd81e915 5260 if (!PL_thiswhite)
6b29d1f5 5261 PL_thiswhite = newSVpvs("");
76f68e9b 5262 sv_catpvs(PL_thiswhite,"}");
5db06880
NC
5263 }
5264#endif
cea2e8a9 5265 return yylex(); /* ignore fake brackets */
79072805 5266 }
fa83b5b6 5267 if (*s == '-' && s[1] == '>')
3280af22 5268 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 5269 else if (*s != '[' && *s != '{')
3280af22 5270 PL_lex_state = LEX_INTERPEND;
79072805
LW
5271 }
5272 }
9059aa12
LW
5273 if (PL_expect & XFAKEBRACK) {
5274 PL_expect &= XENUMMASK;
3280af22 5275 PL_bufptr = s;
cea2e8a9 5276 return yylex(); /* ignore fake brackets */
748a9306 5277 }
cd81e915 5278 start_force(PL_curforce);
5db06880
NC
5279 if (PL_madskills) {
5280 curmad('X', newSVpvn(s-1,1));
cd81e915 5281 CURMAD('_', PL_thiswhite);
5db06880 5282 }
79072805 5283 force_next('}');
5db06880 5284#ifdef PERL_MAD
cd81e915 5285 if (!PL_thistoken)
6b29d1f5 5286 PL_thistoken = newSVpvs("");
5db06880 5287#endif
79072805 5288 TOKEN(';');
378cc40b
LW
5289 case '&':
5290 s++;
90771dc0 5291 if (*s++ == '&')
a0d0e21e 5292 AOPERATOR(ANDAND);
378cc40b 5293 s--;
3280af22 5294 if (PL_expect == XOPERATOR) {
041457d9
DM
5295 if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
5296 && isIDFIRST_lazy_if(s,UTF))
7e2040f0 5297 {
57843af0 5298 CopLINE_dec(PL_curcop);
f1f66076 5299 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
57843af0 5300 CopLINE_inc(PL_curcop);
463ee0b2 5301 }
79072805 5302 BAop(OP_BIT_AND);
463ee0b2 5303 }
79072805 5304
3280af22
NIS
5305 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
5306 if (*PL_tokenbuf) {
5307 PL_expect = XOPERATOR;
5308 force_ident(PL_tokenbuf, '&');
463ee0b2 5309 }
79072805
LW
5310 else
5311 PREREF('&');
6154021b 5312 pl_yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
5313 TERM('&');
5314
378cc40b
LW
5315 case '|':
5316 s++;
90771dc0 5317 if (*s++ == '|')
a0d0e21e 5318 AOPERATOR(OROR);
378cc40b 5319 s--;
79072805 5320 BOop(OP_BIT_OR);
378cc40b
LW
5321 case '=':
5322 s++;
748a9306 5323 {
90771dc0
NC
5324 const char tmp = *s++;
5325 if (tmp == '=')
5326 Eop(OP_EQ);
5327 if (tmp == '>')
5328 OPERATOR(',');
5329 if (tmp == '~')
5330 PMop(OP_MATCH);
5331 if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
5332 && strchr("+-*/%.^&|<",tmp))
5333 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5334 "Reversed %c= operator",(int)tmp);
5335 s--;
5336 if (PL_expect == XSTATE && isALPHA(tmp) &&
5337 (s == PL_linestart+1 || s[-2] == '\n') )
5338 {
5339 if (PL_in_eval && !PL_rsfp) {
5340 d = PL_bufend;
5341 while (s < d) {
5342 if (*s++ == '\n') {
5343 incline(s);
5344 if (strnEQ(s,"=cut",4)) {
5345 s = strchr(s,'\n');
5346 if (s)
5347 s++;
5348 else
5349 s = d;
5350 incline(s);
5351 goto retry;
5352 }
5353 }
a5f75d66 5354 }
90771dc0 5355 goto retry;
a5f75d66 5356 }
5db06880
NC
5357#ifdef PERL_MAD
5358 if (PL_madskills) {
cd81e915 5359 if (!PL_thiswhite)
6b29d1f5 5360 PL_thiswhite = newSVpvs("");
cd81e915 5361 sv_catpvn(PL_thiswhite, PL_linestart,
5db06880
NC
5362 PL_bufend - PL_linestart);
5363 }
5364#endif
90771dc0
NC
5365 s = PL_bufend;
5366 PL_doextract = TRUE;
5367 goto retry;
a5f75d66 5368 }
a0d0e21e 5369 }
3280af22 5370 if (PL_lex_brackets < PL_lex_formbrack) {
c35e046a 5371 const char *t = s;
51882d45 5372#ifdef PERL_STRICT_CR
c35e046a 5373 while (SPACE_OR_TAB(*t))
51882d45 5374#else
c35e046a 5375 while (SPACE_OR_TAB(*t) || *t == '\r')
51882d45 5376#endif
c35e046a 5377 t++;
a0d0e21e
LW
5378 if (*t == '\n' || *t == '#') {
5379 s--;
3280af22 5380 PL_expect = XBLOCK;
a0d0e21e
LW
5381 goto leftbracket;
5382 }
79072805 5383 }
6154021b 5384 pl_yylval.ival = 0;
a0d0e21e 5385 OPERATOR(ASSIGNOP);
378cc40b
LW
5386 case '!':
5387 s++;
90771dc0
NC
5388 {
5389 const char tmp = *s++;
5390 if (tmp == '=') {
5391 /* was this !=~ where !~ was meant?
5392 * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
5393
5394 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
5395 const char *t = s+1;
5396
5397 while (t < PL_bufend && isSPACE(*t))
5398 ++t;
5399
5400 if (*t == '/' || *t == '?' ||
5401 ((*t == 'm' || *t == 's' || *t == 'y')
5402 && !isALNUM(t[1])) ||
5403 (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
5404 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5405 "!=~ should be !~");
5406 }
5407 Eop(OP_NE);
5408 }
5409 if (tmp == '~')
5410 PMop(OP_NOT);
5411 }
378cc40b
LW
5412 s--;
5413 OPERATOR('!');
5414 case '<':
3280af22 5415 if (PL_expect != XOPERATOR) {
93a17b20 5416 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 5417 check_uni();
79072805
LW
5418 if (s[1] == '<')
5419 s = scan_heredoc(s);
5420 else
5421 s = scan_inputsymbol(s);
5422 TERM(sublex_start());
378cc40b
LW
5423 }
5424 s++;
90771dc0
NC
5425 {
5426 char tmp = *s++;
5427 if (tmp == '<')
5428 SHop(OP_LEFT_SHIFT);
5429 if (tmp == '=') {
5430 tmp = *s++;
5431 if (tmp == '>')
5432 Eop(OP_NCMP);
5433 s--;
5434 Rop(OP_LE);
5435 }
395c3793 5436 }
378cc40b 5437 s--;
79072805 5438 Rop(OP_LT);
378cc40b
LW
5439 case '>':
5440 s++;
90771dc0
NC
5441 {
5442 const char tmp = *s++;
5443 if (tmp == '>')
5444 SHop(OP_RIGHT_SHIFT);
d4c19fe8 5445 else if (tmp == '=')
90771dc0
NC
5446 Rop(OP_GE);
5447 }
378cc40b 5448 s--;
79072805 5449 Rop(OP_GT);
378cc40b
LW
5450
5451 case '$':
bbce6d69 5452 CLINE;
5453
3280af22
NIS
5454 if (PL_expect == XOPERATOR) {
5455 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
8290c323 5456 return deprecate_commaless_var_list();
a0d0e21e 5457 }
8990e307 5458 }
a0d0e21e 5459
7e2040f0 5460 if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3280af22 5461 PL_tokenbuf[0] = '@';
376b8730
SM
5462 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
5463 sizeof PL_tokenbuf - 1, FALSE);
5464 if (PL_expect == XOPERATOR)
5465 no_op("Array length", s);
3280af22 5466 if (!PL_tokenbuf[1])
a0d0e21e 5467 PREREF(DOLSHARP);
3280af22
NIS
5468 PL_expect = XOPERATOR;
5469 PL_pending_ident = '#';
463ee0b2 5470 TOKEN(DOLSHARP);
79072805 5471 }
bbce6d69 5472
3280af22 5473 PL_tokenbuf[0] = '$';
376b8730
SM
5474 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
5475 sizeof PL_tokenbuf - 1, FALSE);
5476 if (PL_expect == XOPERATOR)
5477 no_op("Scalar", s);
3280af22
NIS
5478 if (!PL_tokenbuf[1]) {
5479 if (s == PL_bufend)
bbce6d69 5480 yyerror("Final $ should be \\$ or $name");
5481 PREREF('$');
8990e307 5482 }
a0d0e21e 5483
bbce6d69 5484 /* This kludge not intended to be bulletproof. */
3280af22 5485 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
6154021b 5486 pl_yylval.opval = newSVOP(OP_CONST, 0,
fc15ae8f 5487 newSViv(CopARYBASE_get(&PL_compiling)));
6154021b 5488 pl_yylval.opval->op_private = OPpCONST_ARYBASE;
bbce6d69 5489 TERM(THING);
5490 }
5491
ff68c719 5492 d = s;
90771dc0
NC
5493 {
5494 const char tmp = *s;
ae28bb2a 5495 if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
29595ff2 5496 s = SKIPSPACE1(s);
ff68c719 5497
90771dc0
NC
5498 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
5499 && intuit_more(s)) {
5500 if (*s == '[') {
5501 PL_tokenbuf[0] = '@';
5502 if (ckWARN(WARN_SYNTAX)) {
c35e046a
AL
5503 char *t = s+1;
5504
5505 while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
5506 t++;
90771dc0 5507 if (*t++ == ',') {
29595ff2 5508 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
90771dc0
NC
5509 while (t < PL_bufend && *t != ']')
5510 t++;
9014280d 5511 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
90771dc0 5512 "Multidimensional syntax %.*s not supported",
36c7798d 5513 (int)((t - PL_bufptr) + 1), PL_bufptr);
90771dc0 5514 }
748a9306 5515 }
93a17b20 5516 }
90771dc0
NC
5517 else if (*s == '{') {
5518 char *t;
5519 PL_tokenbuf[0] = '%';
5520 if (strEQ(PL_tokenbuf+1, "SIG") && ckWARN(WARN_SYNTAX)
5521 && (t = strchr(s, '}')) && (t = strchr(t, '=')))
5522 {
5523 char tmpbuf[sizeof PL_tokenbuf];
c35e046a
AL
5524 do {
5525 t++;
5526 } while (isSPACE(*t));
90771dc0 5527 if (isIDFIRST_lazy_if(t,UTF)) {
780a5241 5528 STRLEN len;
90771dc0 5529 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
780a5241 5530 &len);
c35e046a
AL
5531 while (isSPACE(*t))
5532 t++;
780a5241 5533 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
90771dc0
NC
5534 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5535 "You need to quote \"%s\"",
5536 tmpbuf);
5537 }
5538 }
5539 }
93a17b20 5540 }
bbce6d69 5541
90771dc0
NC
5542 PL_expect = XOPERATOR;
5543 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
5544 const bool islop = (PL_last_lop == PL_oldoldbufptr);
5545 if (!islop || PL_last_lop_op == OP_GREPSTART)
5546 PL_expect = XOPERATOR;
5547 else if (strchr("$@\"'`q", *s))
5548 PL_expect = XTERM; /* e.g. print $fh "foo" */
5549 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
5550 PL_expect = XTERM; /* e.g. print $fh &sub */
5551 else if (isIDFIRST_lazy_if(s,UTF)) {
5552 char tmpbuf[sizeof PL_tokenbuf];
5553 int t2;
5554 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5458a98a 5555 if ((t2 = keyword(tmpbuf, len, 0))) {
90771dc0
NC
5556 /* binary operators exclude handle interpretations */
5557 switch (t2) {
5558 case -KEY_x:
5559 case -KEY_eq:
5560 case -KEY_ne:
5561 case -KEY_gt:
5562 case -KEY_lt:
5563 case -KEY_ge:
5564 case -KEY_le:
5565 case -KEY_cmp:
5566 break;
5567 default:
5568 PL_expect = XTERM; /* e.g. print $fh length() */
5569 break;
5570 }
5571 }
5572 else {
5573 PL_expect = XTERM; /* e.g. print $fh subr() */
84902520
TB
5574 }
5575 }
90771dc0
NC
5576 else if (isDIGIT(*s))
5577 PL_expect = XTERM; /* e.g. print $fh 3 */
5578 else if (*s == '.' && isDIGIT(s[1]))
5579 PL_expect = XTERM; /* e.g. print $fh .3 */
5580 else if ((*s == '?' || *s == '-' || *s == '+')
5581 && !isSPACE(s[1]) && s[1] != '=')
5582 PL_expect = XTERM; /* e.g. print $fh -1 */
5583 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
5584 && s[1] != '/')
5585 PL_expect = XTERM; /* e.g. print $fh /.../
5586 XXX except DORDOR operator
5587 */
5588 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
5589 && s[2] != '=')
5590 PL_expect = XTERM; /* print $fh <<"EOF" */
93a17b20 5591 }
bbce6d69 5592 }
3280af22 5593 PL_pending_ident = '$';
79072805 5594 TOKEN('$');
378cc40b
LW
5595
5596 case '@':
3280af22 5597 if (PL_expect == XOPERATOR)
bbce6d69 5598 no_op("Array", s);
3280af22
NIS
5599 PL_tokenbuf[0] = '@';
5600 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
5601 if (!PL_tokenbuf[1]) {
bbce6d69 5602 PREREF('@');
5603 }
3280af22 5604 if (PL_lex_state == LEX_NORMAL)
29595ff2 5605 s = SKIPSPACE1(s);
3280af22 5606 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 5607 if (*s == '{')
3280af22 5608 PL_tokenbuf[0] = '%';
a0d0e21e
LW
5609
5610 /* Warn about @ where they meant $. */
041457d9
DM
5611 if (*s == '[' || *s == '{') {
5612 if (ckWARN(WARN_SYNTAX)) {
f54cb97a 5613 const char *t = s + 1;
7e2040f0 5614 while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
5615 t++;
5616 if (*t == '}' || *t == ']') {
5617 t++;
29595ff2 5618 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
9014280d 5619 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 5620 "Scalar value %.*s better written as $%.*s",
36c7798d
DM
5621 (int)(t-PL_bufptr), PL_bufptr,
5622 (int)(t-PL_bufptr-1), PL_bufptr+1);
a0d0e21e 5623 }
93a17b20
LW
5624 }
5625 }
463ee0b2 5626 }
3280af22 5627 PL_pending_ident = '@';
79072805 5628 TERM('@');
378cc40b 5629
c963b151 5630 case '/': /* may be division, defined-or, or pattern */
6f33ba73
RGS
5631 if (PL_expect == XTERMORDORDOR && s[1] == '/') {
5632 s += 2;
5633 AOPERATOR(DORDOR);
5634 }
c963b151 5635 case '?': /* may either be conditional or pattern */
be25f609 5636 if (PL_expect == XOPERATOR) {
90771dc0 5637 char tmp = *s++;
c963b151 5638 if(tmp == '?') {
be25f609 5639 OPERATOR('?');
c963b151
BD
5640 }
5641 else {
5642 tmp = *s++;
5643 if(tmp == '/') {
5644 /* A // operator. */
5645 AOPERATOR(DORDOR);
5646 }
5647 else {
5648 s--;
5649 Mop(OP_DIVIDE);
5650 }
5651 }
5652 }
5653 else {
5654 /* Disable warning on "study /blah/" */
5655 if (PL_oldoldbufptr == PL_last_uni
5656 && (*PL_last_uni != 's' || s - PL_last_uni < 5
5657 || memNE(PL_last_uni, "study", 5)
5658 || isALNUM_lazy_if(PL_last_uni+5,UTF)
5659 ))
5660 check_uni();
5661 s = scan_pat(s,OP_MATCH);
5662 TERM(sublex_start());
5663 }
378cc40b
LW
5664
5665 case '.':
51882d45
GS
5666 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
5667#ifdef PERL_STRICT_CR
5668 && s[1] == '\n'
5669#else
5670 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
5671#endif
5672 && (s == PL_linestart || s[-1] == '\n') )
5673 {
3280af22
NIS
5674 PL_lex_formbrack = 0;
5675 PL_expect = XSTATE;
79072805
LW
5676 goto rightbracket;
5677 }
be25f609 5678 if (PL_expect == XSTATE && s[1] == '.' && s[2] == '.') {
5679 s += 3;
5680 OPERATOR(YADAYADA);
5681 }
3280af22 5682 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
90771dc0 5683 char tmp = *s++;
a687059c
LW
5684 if (*s == tmp) {
5685 s++;
2f3197b3
LW
5686 if (*s == tmp) {
5687 s++;
6154021b 5688 pl_yylval.ival = OPf_SPECIAL;
2f3197b3
LW
5689 }
5690 else
6154021b 5691 pl_yylval.ival = 0;
378cc40b 5692 OPERATOR(DOTDOT);
a687059c 5693 }
79072805 5694 Aop(OP_CONCAT);
378cc40b
LW
5695 }
5696 /* FALL THROUGH */
5697 case '0': case '1': case '2': case '3': case '4':
5698 case '5': case '6': case '7': case '8': case '9':
6154021b 5699 s = scan_num(s, &pl_yylval);
931e0695 5700 DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
3280af22 5701 if (PL_expect == XOPERATOR)
8990e307 5702 no_op("Number",s);
79072805
LW
5703 TERM(THING);
5704
5705 case '\'':
5db06880 5706 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5707 DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
3280af22
NIS
5708 if (PL_expect == XOPERATOR) {
5709 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
8290c323 5710 return deprecate_commaless_var_list();
a0d0e21e 5711 }
463ee0b2 5712 else
8990e307 5713 no_op("String",s);
463ee0b2 5714 }
79072805 5715 if (!s)
d4c19fe8 5716 missingterm(NULL);
6154021b 5717 pl_yylval.ival = OP_CONST;
79072805
LW
5718 TERM(sublex_start());
5719
5720 case '"':
5db06880 5721 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5722 DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
3280af22
NIS
5723 if (PL_expect == XOPERATOR) {
5724 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
8290c323 5725 return deprecate_commaless_var_list();
a0d0e21e 5726 }
463ee0b2 5727 else
8990e307 5728 no_op("String",s);
463ee0b2 5729 }
79072805 5730 if (!s)
d4c19fe8 5731 missingterm(NULL);
6154021b 5732 pl_yylval.ival = OP_CONST;
cfd0369c
NC
5733 /* FIXME. I think that this can be const if char *d is replaced by
5734 more localised variables. */
3280af22 5735 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
63cd0674 5736 if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
6154021b 5737 pl_yylval.ival = OP_STRINGIFY;
4633a7c4
LW
5738 break;
5739 }
5740 }
79072805
LW
5741 TERM(sublex_start());
5742
5743 case '`':
5db06880 5744 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5745 DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
3280af22 5746 if (PL_expect == XOPERATOR)
8990e307 5747 no_op("Backticks",s);
79072805 5748 if (!s)
d4c19fe8 5749 missingterm(NULL);
9b201d7d 5750 readpipe_override();
79072805
LW
5751 TERM(sublex_start());
5752
5753 case '\\':
5754 s++;
a2a5de95
NC
5755 if (PL_lex_inwhat && isDIGIT(*s))
5756 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
5757 *s, *s);
3280af22 5758 if (PL_expect == XOPERATOR)
8990e307 5759 no_op("Backslash",s);
79072805
LW
5760 OPERATOR(REFGEN);
5761
a7cb1f99 5762 case 'v':
e526c9e6 5763 if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
f54cb97a 5764 char *start = s + 2;
dd629d5b 5765 while (isDIGIT(*start) || *start == '_')
a7cb1f99
GS
5766 start++;
5767 if (*start == '.' && isDIGIT(start[1])) {
6154021b 5768 s = scan_num(s, &pl_yylval);
a7cb1f99
GS
5769 TERM(THING);
5770 }
e526c9e6 5771 /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6f33ba73
RGS
5772 else if (!isALPHA(*start) && (PL_expect == XTERM
5773 || PL_expect == XREF || PL_expect == XSTATE
5774 || PL_expect == XTERMORDORDOR)) {
9bde8eb0 5775 GV *const gv = gv_fetchpvn_flags(s, start - s, 0, SVt_PVCV);
e526c9e6 5776 if (!gv) {
6154021b 5777 s = scan_num(s, &pl_yylval);
e526c9e6
GS
5778 TERM(THING);
5779 }
5780 }
a7cb1f99
GS
5781 }
5782 goto keylookup;
79072805 5783 case 'x':
3280af22 5784 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
5785 s++;
5786 Mop(OP_REPEAT);
2f3197b3 5787 }
79072805
LW
5788 goto keylookup;
5789
378cc40b 5790 case '_':
79072805
LW
5791 case 'a': case 'A':
5792 case 'b': case 'B':
5793 case 'c': case 'C':
5794 case 'd': case 'D':
5795 case 'e': case 'E':
5796 case 'f': case 'F':
5797 case 'g': case 'G':
5798 case 'h': case 'H':
5799 case 'i': case 'I':
5800 case 'j': case 'J':
5801 case 'k': case 'K':
5802 case 'l': case 'L':
5803 case 'm': case 'M':
5804 case 'n': case 'N':
5805 case 'o': case 'O':
5806 case 'p': case 'P':
5807 case 'q': case 'Q':
5808 case 'r': case 'R':
5809 case 's': case 'S':
5810 case 't': case 'T':
5811 case 'u': case 'U':
a7cb1f99 5812 case 'V':
79072805
LW
5813 case 'w': case 'W':
5814 case 'X':
5815 case 'y': case 'Y':
5816 case 'z': case 'Z':
5817
49dc05e3 5818 keylookup: {
88e1f1a2 5819 bool anydelim;
90771dc0 5820 I32 tmp;
10edeb5d
JH
5821
5822 orig_keyword = 0;
5823 gv = NULL;
5824 gvp = NULL;
49dc05e3 5825
3280af22
NIS
5826 PL_bufptr = s;
5827 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 5828
5829 /* Some keywords can be followed by any delimiter, including ':' */
88e1f1a2 5830 anydelim = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
155aba94
GS
5831 (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
5832 (PL_tokenbuf[0] == 'q' &&
5833 strchr("qwxr", PL_tokenbuf[1])))));
8ebc5c01 5834
5835 /* x::* is just a word, unless x is "CORE" */
88e1f1a2 5836 if (!anydelim && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
5837 goto just_a_word;
5838
3643fb5f 5839 d = s;
3280af22 5840 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
5841 d++; /* no comments skipped here, or s### is misparsed */
5842
748a9306 5843 /* Is this a word before a => operator? */
1c3923b3 5844 if (*d == '=' && d[1] == '>') {
748a9306 5845 CLINE;
6154021b 5846 pl_yylval.opval
d0a148a6
NC
5847 = (OP*)newSVOP(OP_CONST, 0,
5848 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
6154021b 5849 pl_yylval.opval->op_private = OPpCONST_BARE;
748a9306
LW
5850 TERM(WORD);
5851 }
5852
88e1f1a2
JV
5853 /* Check for plugged-in keyword */
5854 {
5855 OP *o;
5856 int result;
5857 char *saved_bufptr = PL_bufptr;
5858 PL_bufptr = s;
5859 result = CALL_FPTR(PL_keyword_plugin)(aTHX_ PL_tokenbuf, len, &o);
5860 s = PL_bufptr;
5861 if (result == KEYWORD_PLUGIN_DECLINE) {
5862 /* not a plugged-in keyword */
5863 PL_bufptr = saved_bufptr;
5864 } else if (result == KEYWORD_PLUGIN_STMT) {
5865 pl_yylval.opval = o;
5866 CLINE;
5867 PL_expect = XSTATE;
5868 return REPORT(PLUGSTMT);
5869 } else if (result == KEYWORD_PLUGIN_EXPR) {
5870 pl_yylval.opval = o;
5871 CLINE;
5872 PL_expect = XOPERATOR;
5873 return REPORT(PLUGEXPR);
5874 } else {
5875 Perl_croak(aTHX_ "Bad plugin affecting keyword '%s'",
5876 PL_tokenbuf);
5877 }
5878 }
5879
5880 /* Check for built-in keyword */
5881 tmp = keyword(PL_tokenbuf, len, 0);
5882
5883 /* Is this a label? */
5884 if (!anydelim && PL_expect == XSTATE
5885 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
5886 if (tmp)
5887 Perl_croak(aTHX_ "Can't use keyword '%s' as a label", PL_tokenbuf);
5888 s = d + 1;
5889 pl_yylval.pval = CopLABEL_alloc(PL_tokenbuf);
5890 CLINE;
5891 TOKEN(LABEL);
5892 }
5893
a0d0e21e 5894 if (tmp < 0) { /* second-class keyword? */
cbbf8932
AL
5895 GV *ogv = NULL; /* override (winner) */
5896 GV *hgv = NULL; /* hidden (loser) */
3280af22 5897 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 5898 CV *cv;
90e5519e 5899 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
56f7f34b
CS
5900 (cv = GvCVu(gv)))
5901 {
5902 if (GvIMPORTED_CV(gv))
5903 ogv = gv;
5904 else if (! CvMETHOD(cv))
5905 hgv = gv;
5906 }
5907 if (!ogv &&
3280af22 5908 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
9e0d86f8 5909 (gv = *gvp) && isGV_with_GP(gv) &&
56f7f34b
CS
5910 GvCVu(gv) && GvIMPORTED_CV(gv))
5911 {
5912 ogv = gv;
5913 }
5914 }
5915 if (ogv) {
30fe34ed 5916 orig_keyword = tmp;
56f7f34b 5917 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
5918 }
5919 else if (gv && !gvp
5920 && -tmp==KEY_lock /* XXX generalizable kludge */
47f9f84c 5921 && GvCVu(gv))
6e7b2336
GS
5922 {
5923 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 5924 }
56f7f34b
CS
5925 else { /* no override */
5926 tmp = -tmp;
a2a5de95
NC
5927 if (tmp == KEY_dump) {
5928 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
5929 "dump() better written as CORE::dump()");
ac206dc8 5930 }
a0714e2c 5931 gv = NULL;
56f7f34b 5932 gvp = 0;
a2a5de95
NC
5933 if (hgv && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
5934 Perl_ck_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
5935 "Ambiguous call resolved as CORE::%s(), %s",
5936 GvENAME(hgv), "qualify as such or use &");
49dc05e3 5937 }
a0d0e21e
LW
5938 }
5939
5940 reserved_word:
5941 switch (tmp) {
79072805
LW
5942
5943 default: /* not a keyword */
0bfa2a8a
NC
5944 /* Trade off - by using this evil construction we can pull the
5945 variable gv into the block labelled keylookup. If not, then
5946 we have to give it function scope so that the goto from the
5947 earlier ':' case doesn't bypass the initialisation. */
5948 if (0) {
5949 just_a_word_zero_gv:
5950 gv = NULL;
5951 gvp = NULL;
8bee0991 5952 orig_keyword = 0;
0bfa2a8a 5953 }
93a17b20 5954 just_a_word: {
96e4d5b1 5955 SV *sv;
ce29ac45 5956 int pkgname = 0;
f54cb97a 5957 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
f7461760 5958 OP *rv2cv_op;
5069cc75 5959 CV *cv;
5db06880 5960#ifdef PERL_MAD
cd81e915 5961 SV *nextPL_nextwhite = 0;
5db06880
NC
5962#endif
5963
8990e307
LW
5964
5965 /* Get the rest if it looks like a package qualifier */
5966
155aba94 5967 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
c3e0f903 5968 STRLEN morelen;
3280af22 5969 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
5970 TRUE, &morelen);
5971 if (!morelen)
cea2e8a9 5972 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 5973 *s == '\'' ? "'" : "::");
c3e0f903 5974 len += morelen;
ce29ac45 5975 pkgname = 1;
a0d0e21e 5976 }
8990e307 5977
3280af22
NIS
5978 if (PL_expect == XOPERATOR) {
5979 if (PL_bufptr == PL_linestart) {
57843af0 5980 CopLINE_dec(PL_curcop);
f1f66076 5981 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi);
57843af0 5982 CopLINE_inc(PL_curcop);
463ee0b2
LW
5983 }
5984 else
54310121 5985 no_op("Bareword",s);
463ee0b2 5986 }
8990e307 5987
c3e0f903
GS
5988 /* Look for a subroutine with this name in current package,
5989 unless name is "Foo::", in which case Foo is a bearword
5990 (and a package name). */
5991
5db06880 5992 if (len > 2 && !PL_madskills &&
3280af22 5993 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 5994 {
f776e3cd 5995 if (ckWARN(WARN_BAREWORD)
90e5519e 5996 && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
9014280d 5997 Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
599cee73 5998 "Bareword \"%s\" refers to nonexistent package",
3280af22 5999 PL_tokenbuf);
c3e0f903 6000 len -= 2;
3280af22 6001 PL_tokenbuf[len] = '\0';
a0714e2c 6002 gv = NULL;
c3e0f903
GS
6003 gvp = 0;
6004 }
6005 else {
62d55b22
NC
6006 if (!gv) {
6007 /* Mustn't actually add anything to a symbol table.
6008 But also don't want to "initialise" any placeholder
6009 constants that might already be there into full
6010 blown PVGVs with attached PVCV. */
90e5519e
NC
6011 gv = gv_fetchpvn_flags(PL_tokenbuf, len,
6012 GV_NOADD_NOINIT, SVt_PVCV);
62d55b22 6013 }
b3d904f3 6014 len = 0;
c3e0f903
GS
6015 }
6016
6017 /* if we saw a global override before, get the right name */
8990e307 6018
49dc05e3 6019 if (gvp) {
396482e1 6020 sv = newSVpvs("CORE::GLOBAL::");
3280af22 6021 sv_catpv(sv,PL_tokenbuf);
49dc05e3 6022 }
8a7a129d
NC
6023 else {
6024 /* If len is 0, newSVpv does strlen(), which is correct.
6025 If len is non-zero, then it will be the true length,
6026 and so the scalar will be created correctly. */
6027 sv = newSVpv(PL_tokenbuf,len);
6028 }
5db06880 6029#ifdef PERL_MAD
cd81e915
NC
6030 if (PL_madskills && !PL_thistoken) {
6031 char *start = SvPVX(PL_linestr) + PL_realtokenstart;
9ff8e806 6032 PL_thistoken = newSVpvn(start,s - start);
cd81e915 6033 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
6034 }
6035#endif
8990e307 6036
a0d0e21e
LW
6037 /* Presume this is going to be a bareword of some sort. */
6038
6039 CLINE;
6154021b
RGS
6040 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
6041 pl_yylval.opval->op_private = OPpCONST_BARE;
8f8cf39c
JH
6042 /* UTF-8 package name? */
6043 if (UTF && !IN_BYTES &&
95a20fc0 6044 is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
8f8cf39c 6045 SvUTF8_on(sv);
a0d0e21e 6046
c3e0f903
GS
6047 /* And if "Foo::", then that's what it certainly is. */
6048
6049 if (len)
6050 goto safe_bareword;
6051
f7461760
Z
6052 cv = NULL;
6053 {
6054 OP *const_op = newSVOP(OP_CONST, 0, SvREFCNT_inc(sv));
6055 const_op->op_private = OPpCONST_BARE;
6056 rv2cv_op = newCVREF(0, const_op);
6057 }
6058 if (rv2cv_op->op_type == OP_RV2CV &&
6059 (rv2cv_op->op_flags & OPf_KIDS)) {
6060 OP *rv_op = cUNOPx(rv2cv_op)->op_first;
6061 switch (rv_op->op_type) {
6062 case OP_CONST: {
6063 SV *sv = cSVOPx_sv(rv_op);
6064 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)
6065 cv = (CV*)SvRV(sv);
6066 } break;
6067 case OP_GV: {
6068 GV *gv = cGVOPx_gv(rv_op);
6069 CV *maybe_cv = GvCVu(gv);
6070 if (maybe_cv && SvTYPE((SV*)maybe_cv) == SVt_PVCV)
6071 cv = maybe_cv;
6072 } break;
6073 }
6074 }
5069cc75 6075
8990e307
LW
6076 /* See if it's the indirect object for a list operator. */
6077
3280af22
NIS
6078 if (PL_oldoldbufptr &&
6079 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
6080 (PL_oldoldbufptr == PL_last_lop
6081 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 6082 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
6083 (PL_expect == XREF ||
6084 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 6085 {
748a9306
LW
6086 bool immediate_paren = *s == '(';
6087
a0d0e21e 6088 /* (Now we can afford to cross potential line boundary.) */
cd81e915 6089 s = SKIPSPACE2(s,nextPL_nextwhite);
5db06880 6090#ifdef PERL_MAD
cd81e915 6091 PL_nextwhite = nextPL_nextwhite; /* assume no & deception */
5db06880 6092#endif
a0d0e21e
LW
6093
6094 /* Two barewords in a row may indicate method call. */
6095
62d55b22 6096 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
f7461760
Z
6097 (tmp = intuit_method(s, gv, cv))) {
6098 op_free(rv2cv_op);
bbf60fe6 6099 return REPORT(tmp);
f7461760 6100 }
a0d0e21e
LW
6101
6102 /* If not a declared subroutine, it's an indirect object. */
6103 /* (But it's an indir obj regardless for sort.) */
7294df96 6104 /* Also, if "_" follows a filetest operator, it's a bareword */
a0d0e21e 6105
7294df96
RGS
6106 if (
6107 ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
f7461760 6108 (!cv &&
a9ef352a 6109 (PL_last_lop_op != OP_MAPSTART &&
f0670693 6110 PL_last_lop_op != OP_GREPSTART))))
7294df96
RGS
6111 || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
6112 && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
6113 )
a9ef352a 6114 {
3280af22 6115 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 6116 goto bareword;
93a17b20
LW
6117 }
6118 }
8990e307 6119
3280af22 6120 PL_expect = XOPERATOR;
5db06880
NC
6121#ifdef PERL_MAD
6122 if (isSPACE(*s))
cd81e915
NC
6123 s = SKIPSPACE2(s,nextPL_nextwhite);
6124 PL_nextwhite = nextPL_nextwhite;
5db06880 6125#else
8990e307 6126 s = skipspace(s);
5db06880 6127#endif
1c3923b3
GS
6128
6129 /* Is this a word before a => operator? */
ce29ac45 6130 if (*s == '=' && s[1] == '>' && !pkgname) {
f7461760 6131 op_free(rv2cv_op);
1c3923b3 6132 CLINE;
6154021b 6133 sv_setpv(((SVOP*)pl_yylval.opval)->op_sv, PL_tokenbuf);
0064a8a9 6134 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
6154021b 6135 SvUTF8_on(((SVOP*)pl_yylval.opval)->op_sv);
1c3923b3
GS
6136 TERM(WORD);
6137 }
6138
6139 /* If followed by a paren, it's certainly a subroutine. */
93a17b20 6140 if (*s == '(') {
79072805 6141 CLINE;
5069cc75 6142 if (cv) {
c35e046a
AL
6143 d = s + 1;
6144 while (SPACE_OR_TAB(*d))
6145 d++;
f7461760 6146 if (*d == ')' && (sv = cv_const_sv(cv))) {
96e4d5b1 6147 s = d + 1;
c631f32b 6148 goto its_constant;
96e4d5b1 6149 }
6150 }
5db06880
NC
6151#ifdef PERL_MAD
6152 if (PL_madskills) {
cd81e915
NC
6153 PL_nextwhite = PL_thiswhite;
6154 PL_thiswhite = 0;
5db06880 6155 }
cd81e915 6156 start_force(PL_curforce);
5db06880 6157#endif
6154021b 6158 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
3280af22 6159 PL_expect = XOPERATOR;
5db06880
NC
6160#ifdef PERL_MAD
6161 if (PL_madskills) {
cd81e915
NC
6162 PL_nextwhite = nextPL_nextwhite;
6163 curmad('X', PL_thistoken);
6b29d1f5 6164 PL_thistoken = newSVpvs("");
5db06880
NC
6165 }
6166#endif
f7461760 6167 op_free(rv2cv_op);
93a17b20 6168 force_next(WORD);
6154021b 6169 pl_yylval.ival = 0;
463ee0b2 6170 TOKEN('&');
79072805 6171 }
93a17b20 6172
a0d0e21e 6173 /* If followed by var or block, call it a method (unless sub) */
8990e307 6174
f7461760
Z
6175 if ((*s == '$' || *s == '{') && !cv) {
6176 op_free(rv2cv_op);
3280af22
NIS
6177 PL_last_lop = PL_oldbufptr;
6178 PL_last_lop_op = OP_METHOD;
93a17b20 6179 PREBLOCK(METHOD);
463ee0b2
LW
6180 }
6181
8990e307
LW
6182 /* If followed by a bareword, see if it looks like indir obj. */
6183
30fe34ed
RGS
6184 if (!orig_keyword
6185 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
f7461760
Z
6186 && (tmp = intuit_method(s, gv, cv))) {
6187 op_free(rv2cv_op);
bbf60fe6 6188 return REPORT(tmp);
f7461760 6189 }
93a17b20 6190
8990e307
LW
6191 /* Not a method, so call it a subroutine (if defined) */
6192
5069cc75 6193 if (cv) {
9b387841
NC
6194 if (lastchar == '-')
6195 Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6196 "Ambiguous use of -%s resolved as -&%s()",
6197 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 6198 /* Check for a constant sub */
f7461760 6199 if ((sv = cv_const_sv(cv))) {
96e4d5b1 6200 its_constant:
f7461760 6201 op_free(rv2cv_op);
6154021b
RGS
6202 SvREFCNT_dec(((SVOP*)pl_yylval.opval)->op_sv);
6203 ((SVOP*)pl_yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
6204 pl_yylval.opval->op_private = 0;
96e4d5b1 6205 TOKEN(WORD);
89bfa8cd 6206 }
6207
6154021b 6208 op_free(pl_yylval.opval);
f7461760 6209 pl_yylval.opval = rv2cv_op;
6154021b 6210 pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 6211 PL_last_lop = PL_oldbufptr;
bf848113 6212 PL_last_lop_op = OP_ENTERSUB;
4633a7c4 6213 /* Is there a prototype? */
5db06880
NC
6214 if (
6215#ifdef PERL_MAD
6216 cv &&
6217#endif
d9f2850e
RGS
6218 SvPOK(cv))
6219 {
5f66b61c 6220 STRLEN protolen;
daba3364 6221 const char *proto = SvPV_const(MUTABLE_SV(cv), protolen);
5f66b61c 6222 if (!protolen)
4633a7c4 6223 TERM(FUNC0SUB);
8c28b960 6224 if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
4633a7c4 6225 OPERATOR(UNIOPSUB);
0f5d0394
AE
6226 while (*proto == ';')
6227 proto++;
7a52d87a 6228 if (*proto == '&' && *s == '{') {
49a54bbe
NC
6229 if (PL_curstash)
6230 sv_setpvs(PL_subname, "__ANON__");
6231 else
6232 sv_setpvs(PL_subname, "__ANON__::__ANON__");
4633a7c4
LW
6233 PREBLOCK(LSTOPSUB);
6234 }
a9ef352a 6235 }
5db06880
NC
6236#ifdef PERL_MAD
6237 {
6238 if (PL_madskills) {
cd81e915
NC
6239 PL_nextwhite = PL_thiswhite;
6240 PL_thiswhite = 0;
5db06880 6241 }
cd81e915 6242 start_force(PL_curforce);
6154021b 6243 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
5db06880
NC
6244 PL_expect = XTERM;
6245 if (PL_madskills) {
cd81e915
NC
6246 PL_nextwhite = nextPL_nextwhite;
6247 curmad('X', PL_thistoken);
6b29d1f5 6248 PL_thistoken = newSVpvs("");
5db06880
NC
6249 }
6250 force_next(WORD);
6251 TOKEN(NOAMP);
6252 }
6253 }
6254
6255 /* Guess harder when madskills require "best effort". */
6256 if (PL_madskills && (!gv || !GvCVu(gv))) {
6257 int probable_sub = 0;
6258 if (strchr("\"'`$@%0123456789!*+{[<", *s))
6259 probable_sub = 1;
6260 else if (isALPHA(*s)) {
6261 char tmpbuf[1024];
6262 STRLEN tmplen;
6263 d = s;
6264 d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
5458a98a 6265 if (!keyword(tmpbuf, tmplen, 0))
5db06880
NC
6266 probable_sub = 1;
6267 else {
6268 while (d < PL_bufend && isSPACE(*d))
6269 d++;
6270 if (*d == '=' && d[1] == '>')
6271 probable_sub = 1;
6272 }
6273 }
6274 if (probable_sub) {
7a6d04f4 6275 gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
6154021b 6276 op_free(pl_yylval.opval);
f7461760 6277 pl_yylval.opval = rv2cv_op;
6154021b 6278 pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
5db06880
NC
6279 PL_last_lop = PL_oldbufptr;
6280 PL_last_lop_op = OP_ENTERSUB;
cd81e915
NC
6281 PL_nextwhite = PL_thiswhite;
6282 PL_thiswhite = 0;
6283 start_force(PL_curforce);
6154021b 6284 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
5db06880 6285 PL_expect = XTERM;
cd81e915
NC
6286 PL_nextwhite = nextPL_nextwhite;
6287 curmad('X', PL_thistoken);
6b29d1f5 6288 PL_thistoken = newSVpvs("");
5db06880
NC
6289 force_next(WORD);
6290 TOKEN(NOAMP);
6291 }
6292#else
6154021b 6293 NEXTVAL_NEXTTOKE.opval = pl_yylval.opval;
3280af22 6294 PL_expect = XTERM;
8990e307
LW
6295 force_next(WORD);
6296 TOKEN(NOAMP);
5db06880 6297#endif
8990e307 6298 }
748a9306 6299
8990e307
LW
6300 /* Call it a bare word */
6301
5603f27d 6302 if (PL_hints & HINT_STRICT_SUBS)
6154021b 6303 pl_yylval.opval->op_private |= OPpCONST_STRICT;
5603f27d 6304 else {
9a073a1d
RGS
6305 bareword:
6306 /* after "print" and similar functions (corresponding to
6307 * "F? L" in opcode.pl), whatever wasn't already parsed as
6308 * a filehandle should be subject to "strict subs".
6309 * Likewise for the optional indirect-object argument to system
6310 * or exec, which can't be a bareword */
6311 if ((PL_last_lop_op == OP_PRINT
6312 || PL_last_lop_op == OP_PRTF
6313 || PL_last_lop_op == OP_SAY
6314 || PL_last_lop_op == OP_SYSTEM
6315 || PL_last_lop_op == OP_EXEC)
6316 && (PL_hints & HINT_STRICT_SUBS))
6317 pl_yylval.opval->op_private |= OPpCONST_STRICT;
041457d9
DM
6318 if (lastchar != '-') {
6319 if (ckWARN(WARN_RESERVED)) {
c35e046a
AL
6320 d = PL_tokenbuf;
6321 while (isLOWER(*d))
6322 d++;
da51bb9b 6323 if (!*d && !gv_stashpv(PL_tokenbuf, 0))
9014280d 6324 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
6325 PL_tokenbuf);
6326 }
748a9306
LW
6327 }
6328 }
f7461760 6329 op_free(rv2cv_op);
c3e0f903
GS
6330
6331 safe_bareword:
9b387841
NC
6332 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')) {
6333 Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6334 "Operator or semicolon missing before %c%s",
6335 lastchar, PL_tokenbuf);
6336 Perl_ck_warner_d(aTHX_ packWARN(WARN_AMBIGUOUS),
6337 "Ambiguous use of %c resolved as operator %c",
6338 lastchar, lastchar);
748a9306 6339 }
93a17b20 6340 TOKEN(WORD);
79072805 6341 }
79072805 6342
68dc0745 6343 case KEY___FILE__:
6154021b 6344 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 6345 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 6346 TERM(THING);
6347
79072805 6348 case KEY___LINE__:
6154021b 6349 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 6350 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 6351 TERM(THING);
68dc0745 6352
6353 case KEY___PACKAGE__:
6154021b 6354 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22 6355 (PL_curstash
5aaec2b4 6356 ? newSVhek(HvNAME_HEK(PL_curstash))
3280af22 6357 : &PL_sv_undef));
79072805 6358 TERM(THING);
79072805 6359
e50aee73 6360 case KEY___DATA__:
79072805
LW
6361 case KEY___END__: {
6362 GV *gv;
3280af22 6363 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
bfed75c6 6364 const char *pname = "main";
3280af22 6365 if (PL_tokenbuf[2] == 'D')
bfcb3514 6366 pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
f776e3cd
NC
6367 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
6368 SVt_PVIO);
a5f75d66 6369 GvMULTI_on(gv);
79072805 6370 if (!GvIO(gv))
a0d0e21e 6371 GvIOp(gv) = newIO();
3280af22 6372 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
6373#if defined(HAS_FCNTL) && defined(F_SETFD)
6374 {
f54cb97a 6375 const int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
6376 fcntl(fd,F_SETFD,fd >= 3);
6377 }
79072805 6378#endif
fd049845 6379 /* Mark this internal pseudo-handle as clean */
6380 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
4c84d7f2 6381 if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 6382 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 6383 else
50952442 6384 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
6385#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
6386 /* if the script was opened in binmode, we need to revert
53129d29 6387 * it to text mode for compatibility; but only iff it has CRs
c39cd008 6388 * XXX this is a questionable hack at best. */
53129d29
GS
6389 if (PL_bufend-PL_bufptr > 2
6390 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
6391 {
6392 Off_t loc = 0;
50952442 6393 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
6394 loc = PerlIO_tell(PL_rsfp);
6395 (void)PerlIO_seek(PL_rsfp, 0L, 0);
6396 }
2986a63f
JH
6397#ifdef NETWARE
6398 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
6399#else
c39cd008 6400 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 6401#endif /* NETWARE */
1143fce0
JH
6402#ifdef PERLIO_IS_STDIO /* really? */
6403# if defined(__BORLANDC__)
cb359b41
JH
6404 /* XXX see note in do_binmode() */
6405 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
6406# endif
6407#endif
c39cd008
GS
6408 if (loc > 0)
6409 PerlIO_seek(PL_rsfp, loc, 0);
6410 }
6411 }
6412#endif
7948272d 6413#ifdef PERLIO_LAYERS
52d2e0f4
JH
6414 if (!IN_BYTES) {
6415 if (UTF)
6416 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
6417 else if (PL_encoding) {
6418 SV *name;
6419 dSP;
6420 ENTER;
6421 SAVETMPS;
6422 PUSHMARK(sp);
6423 EXTEND(SP, 1);
6424 XPUSHs(PL_encoding);
6425 PUTBACK;
6426 call_method("name", G_SCALAR);
6427 SPAGAIN;
6428 name = POPs;
6429 PUTBACK;
bfed75c6 6430 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
52d2e0f4 6431 Perl_form(aTHX_ ":encoding(%"SVf")",
be2597df 6432 SVfARG(name)));
52d2e0f4
JH
6433 FREETMPS;
6434 LEAVE;
6435 }
6436 }
7948272d 6437#endif
5db06880
NC
6438#ifdef PERL_MAD
6439 if (PL_madskills) {
cd81e915
NC
6440 if (PL_realtokenstart >= 0) {
6441 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
6442 if (!PL_endwhite)
6b29d1f5 6443 PL_endwhite = newSVpvs("");
cd81e915
NC
6444 sv_catsv(PL_endwhite, PL_thiswhite);
6445 PL_thiswhite = 0;
6446 sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
6447 PL_realtokenstart = -1;
5db06880 6448 }
5cc814fd
NC
6449 while ((s = filter_gets(PL_endwhite, SvCUR(PL_endwhite)))
6450 != NULL) ;
5db06880
NC
6451 }
6452#endif
4608196e 6453 PL_rsfp = NULL;
79072805
LW
6454 }
6455 goto fake_eof;
e929a76b 6456 }
de3bb511 6457
8990e307 6458 case KEY_AUTOLOAD:
ed6116ce 6459 case KEY_DESTROY:
79072805 6460 case KEY_BEGIN:
3c10abe3 6461 case KEY_UNITCHECK:
7d30b5c4 6462 case KEY_CHECK:
7d07dbc2 6463 case KEY_INIT:
7d30b5c4 6464 case KEY_END:
3280af22
NIS
6465 if (PL_expect == XSTATE) {
6466 s = PL_bufptr;
93a17b20 6467 goto really_sub;
79072805
LW
6468 }
6469 goto just_a_word;
6470
a0d0e21e
LW
6471 case KEY_CORE:
6472 if (*s == ':' && s[1] == ':') {
6473 s += 2;
748a9306 6474 d = s;
3280af22 6475 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 6476 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6798c92b 6477 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
6478 if (tmp < 0)
6479 tmp = -tmp;
850e8516 6480 else if (tmp == KEY_require || tmp == KEY_do)
a72a1c8b 6481 /* that's a way to remember we saw "CORE::" */
850e8516 6482 orig_keyword = tmp;
a0d0e21e
LW
6483 goto reserved_word;
6484 }
6485 goto just_a_word;
6486
463ee0b2
LW
6487 case KEY_abs:
6488 UNI(OP_ABS);
6489
79072805
LW
6490 case KEY_alarm:
6491 UNI(OP_ALARM);
6492
6493 case KEY_accept:
a0d0e21e 6494 LOP(OP_ACCEPT,XTERM);
79072805 6495
463ee0b2
LW
6496 case KEY_and:
6497 OPERATOR(ANDOP);
6498
79072805 6499 case KEY_atan2:
a0d0e21e 6500 LOP(OP_ATAN2,XTERM);
85e6fe83 6501
79072805 6502 case KEY_bind:
a0d0e21e 6503 LOP(OP_BIND,XTERM);
79072805
LW
6504
6505 case KEY_binmode:
1c1fc3ea 6506 LOP(OP_BINMODE,XTERM);
79072805
LW
6507
6508 case KEY_bless:
a0d0e21e 6509 LOP(OP_BLESS,XTERM);
79072805 6510
0d863452
RH
6511 case KEY_break:
6512 FUN0(OP_BREAK);
6513
79072805
LW
6514 case KEY_chop:
6515 UNI(OP_CHOP);
6516
6517 case KEY_continue:
0d863452
RH
6518 /* When 'use switch' is in effect, continue has a dual
6519 life as a control operator. */
6520 {
ef89dcc3 6521 if (!FEATURE_IS_ENABLED("switch"))
0d863452
RH
6522 PREBLOCK(CONTINUE);
6523 else {
6524 /* We have to disambiguate the two senses of
6525 "continue". If the next token is a '{' then
6526 treat it as the start of a continue block;
6527 otherwise treat it as a control operator.
6528 */
6529 s = skipspace(s);
6530 if (*s == '{')
79072805 6531 PREBLOCK(CONTINUE);
0d863452
RH
6532 else
6533 FUN0(OP_CONTINUE);
6534 }
6535 }
79072805
LW
6536
6537 case KEY_chdir:
fafc274c
NC
6538 /* may use HOME */
6539 (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
79072805
LW
6540 UNI(OP_CHDIR);
6541
6542 case KEY_close:
6543 UNI(OP_CLOSE);
6544
6545 case KEY_closedir:
6546 UNI(OP_CLOSEDIR);
6547
6548 case KEY_cmp:
6549 Eop(OP_SCMP);
6550
6551 case KEY_caller:
6552 UNI(OP_CALLER);
6553
6554 case KEY_crypt:
6555#ifdef FCRYPT
f4c556ac
GS
6556 if (!PL_cryptseen) {
6557 PL_cryptseen = TRUE;
de3bb511 6558 init_des();
f4c556ac 6559 }
a687059c 6560#endif
a0d0e21e 6561 LOP(OP_CRYPT,XTERM);
79072805
LW
6562
6563 case KEY_chmod:
a0d0e21e 6564 LOP(OP_CHMOD,XTERM);
79072805
LW
6565
6566 case KEY_chown:
a0d0e21e 6567 LOP(OP_CHOWN,XTERM);
79072805
LW
6568
6569 case KEY_connect:
a0d0e21e 6570 LOP(OP_CONNECT,XTERM);
79072805 6571
463ee0b2
LW
6572 case KEY_chr:
6573 UNI(OP_CHR);
6574
79072805
LW
6575 case KEY_cos:
6576 UNI(OP_COS);
6577
6578 case KEY_chroot:
6579 UNI(OP_CHROOT);
6580
0d863452
RH
6581 case KEY_default:
6582 PREBLOCK(DEFAULT);
6583
79072805 6584 case KEY_do:
29595ff2 6585 s = SKIPSPACE1(s);
79072805 6586 if (*s == '{')
a0d0e21e 6587 PRETERMBLOCK(DO);
79072805 6588 if (*s != '\'')
89c5585f 6589 s = force_word(s,WORD,TRUE,TRUE,FALSE);
850e8516
RGS
6590 if (orig_keyword == KEY_do) {
6591 orig_keyword = 0;
6154021b 6592 pl_yylval.ival = 1;
850e8516
RGS
6593 }
6594 else
6154021b 6595 pl_yylval.ival = 0;
378cc40b 6596 OPERATOR(DO);
79072805
LW
6597
6598 case KEY_die:
3280af22 6599 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 6600 LOP(OP_DIE,XTERM);
79072805
LW
6601
6602 case KEY_defined:
6603 UNI(OP_DEFINED);
6604
6605 case KEY_delete:
a0d0e21e 6606 UNI(OP_DELETE);
79072805
LW
6607
6608 case KEY_dbmopen:
5c1737d1 6609 gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
a0d0e21e 6610 LOP(OP_DBMOPEN,XTERM);
79072805
LW
6611
6612 case KEY_dbmclose:
6613 UNI(OP_DBMCLOSE);
6614
6615 case KEY_dump:
a0d0e21e 6616 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6617 LOOPX(OP_DUMP);
6618
6619 case KEY_else:
6620 PREBLOCK(ELSE);
6621
6622 case KEY_elsif:
6154021b 6623 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
6624 OPERATOR(ELSIF);
6625
6626 case KEY_eq:
6627 Eop(OP_SEQ);
6628
a0d0e21e
LW
6629 case KEY_exists:
6630 UNI(OP_EXISTS);
4e553d73 6631
79072805 6632 case KEY_exit:
5db06880
NC
6633 if (PL_madskills)
6634 UNI(OP_INT);
79072805
LW
6635 UNI(OP_EXIT);
6636
6637 case KEY_eval:
29595ff2 6638 s = SKIPSPACE1(s);
32e2a35d
RGS
6639 if (*s == '{') { /* block eval */
6640 PL_expect = XTERMBLOCK;
6641 UNIBRACK(OP_ENTERTRY);
6642 }
6643 else { /* string eval */
6644 PL_expect = XTERM;
6645 UNIBRACK(OP_ENTEREVAL);
6646 }
79072805
LW
6647
6648 case KEY_eof:
6649 UNI(OP_EOF);
6650
6651 case KEY_exp:
6652 UNI(OP_EXP);
6653
6654 case KEY_each:
6655 UNI(OP_EACH);
6656
6657 case KEY_exec:
a0d0e21e 6658 LOP(OP_EXEC,XREF);
79072805
LW
6659
6660 case KEY_endhostent:
6661 FUN0(OP_EHOSTENT);
6662
6663 case KEY_endnetent:
6664 FUN0(OP_ENETENT);
6665
6666 case KEY_endservent:
6667 FUN0(OP_ESERVENT);
6668
6669 case KEY_endprotoent:
6670 FUN0(OP_EPROTOENT);
6671
6672 case KEY_endpwent:
6673 FUN0(OP_EPWENT);
6674
6675 case KEY_endgrent:
6676 FUN0(OP_EGRENT);
6677
6678 case KEY_for:
6679 case KEY_foreach:
6154021b 6680 pl_yylval.ival = CopLINE(PL_curcop);
29595ff2 6681 s = SKIPSPACE1(s);
7e2040f0 6682 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 6683 char *p = s;
5db06880
NC
6684#ifdef PERL_MAD
6685 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
6686#endif
6687
3280af22 6688 if ((PL_bufend - p) >= 3 &&
55497cff 6689 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
6690 p += 2;
77ca0c92
LW
6691 else if ((PL_bufend - p) >= 4 &&
6692 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
6693 p += 3;
29595ff2 6694 p = PEEKSPACE(p);
7e2040f0 6695 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
6696 p = scan_ident(p, PL_bufend,
6697 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
29595ff2 6698 p = PEEKSPACE(p);
77ca0c92
LW
6699 }
6700 if (*p != '$')
cea2e8a9 6701 Perl_croak(aTHX_ "Missing $ on loop variable");
5db06880
NC
6702#ifdef PERL_MAD
6703 s = SvPVX(PL_linestr) + soff;
6704#endif
55497cff 6705 }
79072805
LW
6706 OPERATOR(FOR);
6707
6708 case KEY_formline:
a0d0e21e 6709 LOP(OP_FORMLINE,XTERM);
79072805
LW
6710
6711 case KEY_fork:
6712 FUN0(OP_FORK);
6713
6714 case KEY_fcntl:
a0d0e21e 6715 LOP(OP_FCNTL,XTERM);
79072805
LW
6716
6717 case KEY_fileno:
6718 UNI(OP_FILENO);
6719
6720 case KEY_flock:
a0d0e21e 6721 LOP(OP_FLOCK,XTERM);
79072805
LW
6722
6723 case KEY_gt:
6724 Rop(OP_SGT);
6725
6726 case KEY_ge:
6727 Rop(OP_SGE);
6728
6729 case KEY_grep:
2c38e13d 6730 LOP(OP_GREPSTART, XREF);
79072805
LW
6731
6732 case KEY_goto:
a0d0e21e 6733 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6734 LOOPX(OP_GOTO);
6735
6736 case KEY_gmtime:
6737 UNI(OP_GMTIME);
6738
6739 case KEY_getc:
6f33ba73 6740 UNIDOR(OP_GETC);
79072805
LW
6741
6742 case KEY_getppid:
6743 FUN0(OP_GETPPID);
6744
6745 case KEY_getpgrp:
6746 UNI(OP_GETPGRP);
6747
6748 case KEY_getpriority:
a0d0e21e 6749 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
6750
6751 case KEY_getprotobyname:
6752 UNI(OP_GPBYNAME);
6753
6754 case KEY_getprotobynumber:
a0d0e21e 6755 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
6756
6757 case KEY_getprotoent:
6758 FUN0(OP_GPROTOENT);
6759
6760 case KEY_getpwent:
6761 FUN0(OP_GPWENT);
6762
6763 case KEY_getpwnam:
ff68c719 6764 UNI(OP_GPWNAM);
79072805
LW
6765
6766 case KEY_getpwuid:
ff68c719 6767 UNI(OP_GPWUID);
79072805
LW
6768
6769 case KEY_getpeername:
6770 UNI(OP_GETPEERNAME);
6771
6772 case KEY_gethostbyname:
6773 UNI(OP_GHBYNAME);
6774
6775 case KEY_gethostbyaddr:
a0d0e21e 6776 LOP(OP_GHBYADDR,XTERM);
79072805
LW
6777
6778 case KEY_gethostent:
6779 FUN0(OP_GHOSTENT);
6780
6781 case KEY_getnetbyname:
6782 UNI(OP_GNBYNAME);
6783
6784 case KEY_getnetbyaddr:
a0d0e21e 6785 LOP(OP_GNBYADDR,XTERM);
79072805
LW
6786
6787 case KEY_getnetent:
6788 FUN0(OP_GNETENT);
6789
6790 case KEY_getservbyname:
a0d0e21e 6791 LOP(OP_GSBYNAME,XTERM);
79072805
LW
6792
6793 case KEY_getservbyport:
a0d0e21e 6794 LOP(OP_GSBYPORT,XTERM);
79072805
LW
6795
6796 case KEY_getservent:
6797 FUN0(OP_GSERVENT);
6798
6799 case KEY_getsockname:
6800 UNI(OP_GETSOCKNAME);
6801
6802 case KEY_getsockopt:
a0d0e21e 6803 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
6804
6805 case KEY_getgrent:
6806 FUN0(OP_GGRENT);
6807
6808 case KEY_getgrnam:
ff68c719 6809 UNI(OP_GGRNAM);
79072805
LW
6810
6811 case KEY_getgrgid:
ff68c719 6812 UNI(OP_GGRGID);
79072805
LW
6813
6814 case KEY_getlogin:
6815 FUN0(OP_GETLOGIN);
6816
0d863452 6817 case KEY_given:
6154021b 6818 pl_yylval.ival = CopLINE(PL_curcop);
0d863452
RH
6819 OPERATOR(GIVEN);
6820
93a17b20 6821 case KEY_glob:
a0d0e21e 6822 LOP(OP_GLOB,XTERM);
93a17b20 6823
79072805
LW
6824 case KEY_hex:
6825 UNI(OP_HEX);
6826
6827 case KEY_if:
6154021b 6828 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
6829 OPERATOR(IF);
6830
6831 case KEY_index:
a0d0e21e 6832 LOP(OP_INDEX,XTERM);
79072805
LW
6833
6834 case KEY_int:
6835 UNI(OP_INT);
6836
6837 case KEY_ioctl:
a0d0e21e 6838 LOP(OP_IOCTL,XTERM);
79072805
LW
6839
6840 case KEY_join:
a0d0e21e 6841 LOP(OP_JOIN,XTERM);
79072805
LW
6842
6843 case KEY_keys:
6844 UNI(OP_KEYS);
6845
6846 case KEY_kill:
a0d0e21e 6847 LOP(OP_KILL,XTERM);
79072805
LW
6848
6849 case KEY_last:
a0d0e21e 6850 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 6851 LOOPX(OP_LAST);
4e553d73 6852
79072805
LW
6853 case KEY_lc:
6854 UNI(OP_LC);
6855
6856 case KEY_lcfirst:
6857 UNI(OP_LCFIRST);
6858
6859 case KEY_local:
6154021b 6860 pl_yylval.ival = 0;
79072805
LW
6861 OPERATOR(LOCAL);
6862
6863 case KEY_length:
6864 UNI(OP_LENGTH);
6865
6866 case KEY_lt:
6867 Rop(OP_SLT);
6868
6869 case KEY_le:
6870 Rop(OP_SLE);
6871
6872 case KEY_localtime:
6873 UNI(OP_LOCALTIME);
6874
6875 case KEY_log:
6876 UNI(OP_LOG);
6877
6878 case KEY_link:
a0d0e21e 6879 LOP(OP_LINK,XTERM);
79072805
LW
6880
6881 case KEY_listen:
a0d0e21e 6882 LOP(OP_LISTEN,XTERM);
79072805 6883
c0329465
MB
6884 case KEY_lock:
6885 UNI(OP_LOCK);
6886
79072805
LW
6887 case KEY_lstat:
6888 UNI(OP_LSTAT);
6889
6890 case KEY_m:
8782bef2 6891 s = scan_pat(s,OP_MATCH);
79072805
LW
6892 TERM(sublex_start());
6893
a0d0e21e 6894 case KEY_map:
2c38e13d 6895 LOP(OP_MAPSTART, XREF);
4e4e412b 6896
79072805 6897 case KEY_mkdir:
a0d0e21e 6898 LOP(OP_MKDIR,XTERM);
79072805
LW
6899
6900 case KEY_msgctl:
a0d0e21e 6901 LOP(OP_MSGCTL,XTERM);
79072805
LW
6902
6903 case KEY_msgget:
a0d0e21e 6904 LOP(OP_MSGGET,XTERM);
79072805
LW
6905
6906 case KEY_msgrcv:
a0d0e21e 6907 LOP(OP_MSGRCV,XTERM);
79072805
LW
6908
6909 case KEY_msgsnd:
a0d0e21e 6910 LOP(OP_MSGSND,XTERM);
79072805 6911
77ca0c92 6912 case KEY_our:
93a17b20 6913 case KEY_my:
952306ac 6914 case KEY_state:
eac04b2e 6915 PL_in_my = (U16)tmp;
29595ff2 6916 s = SKIPSPACE1(s);
7e2040f0 6917 if (isIDFIRST_lazy_if(s,UTF)) {
5db06880
NC
6918#ifdef PERL_MAD
6919 char* start = s;
6920#endif
3280af22 6921 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
6922 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
6923 goto really_sub;
def3634b 6924 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 6925 if (!PL_in_my_stash) {
c750a3ec 6926 char tmpbuf[1024];
3280af22 6927 PL_bufptr = s;
d9fad198 6928 my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
6929 yyerror(tmpbuf);
6930 }
5db06880
NC
6931#ifdef PERL_MAD
6932 if (PL_madskills) { /* just add type to declarator token */
cd81e915
NC
6933 sv_catsv(PL_thistoken, PL_nextwhite);
6934 PL_nextwhite = 0;
6935 sv_catpvn(PL_thistoken, start, s - start);
5db06880
NC
6936 }
6937#endif
c750a3ec 6938 }
6154021b 6939 pl_yylval.ival = 1;
55497cff 6940 OPERATOR(MY);
93a17b20 6941
79072805 6942 case KEY_next:
a0d0e21e 6943 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6944 LOOPX(OP_NEXT);
6945
6946 case KEY_ne:
6947 Eop(OP_SNE);
6948
a0d0e21e 6949 case KEY_no:
468aa647 6950 s = tokenize_use(0, s);
a0d0e21e
LW
6951 OPERATOR(USE);
6952
6953 case KEY_not:
29595ff2 6954 if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
2d2e263d
LW
6955 FUN1(OP_NOT);
6956 else
6957 OPERATOR(NOTOP);
a0d0e21e 6958
79072805 6959 case KEY_open:
29595ff2 6960 s = SKIPSPACE1(s);
7e2040f0 6961 if (isIDFIRST_lazy_if(s,UTF)) {
f54cb97a 6962 const char *t;
c35e046a
AL
6963 for (d = s; isALNUM_lazy_if(d,UTF);)
6964 d++;
6965 for (t=d; isSPACE(*t);)
6966 t++;
e2ab214b 6967 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
6968 /* [perl #16184] */
6969 && !(t[0] == '=' && t[1] == '>')
6970 ) {
5f66b61c 6971 int parms_len = (int)(d-s);
9014280d 6972 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 6973 "Precedence problem: open %.*s should be open(%.*s)",
5f66b61c 6974 parms_len, s, parms_len, s);
66fbe8fb 6975 }
93a17b20 6976 }
a0d0e21e 6977 LOP(OP_OPEN,XTERM);
79072805 6978
463ee0b2 6979 case KEY_or:
6154021b 6980 pl_yylval.ival = OP_OR;
463ee0b2
LW
6981 OPERATOR(OROP);
6982
79072805
LW
6983 case KEY_ord:
6984 UNI(OP_ORD);
6985
6986 case KEY_oct:
6987 UNI(OP_OCT);
6988
6989 case KEY_opendir:
a0d0e21e 6990 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
6991
6992 case KEY_print:
3280af22 6993 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6994 LOP(OP_PRINT,XREF);
79072805
LW
6995
6996 case KEY_printf:
3280af22 6997 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6998 LOP(OP_PRTF,XREF);
79072805 6999
c07a80fd 7000 case KEY_prototype:
7001 UNI(OP_PROTOTYPE);
7002
79072805 7003 case KEY_push:
a0d0e21e 7004 LOP(OP_PUSH,XTERM);
79072805
LW
7005
7006 case KEY_pop:
6f33ba73 7007 UNIDOR(OP_POP);
79072805 7008
a0d0e21e 7009 case KEY_pos:
6f33ba73 7010 UNIDOR(OP_POS);
4e553d73 7011
79072805 7012 case KEY_pack:
a0d0e21e 7013 LOP(OP_PACK,XTERM);
79072805
LW
7014
7015 case KEY_package:
a0d0e21e 7016 s = force_word(s,WORD,FALSE,TRUE,FALSE);
14a86d0c 7017 s = SKIPSPACE1(s);
91152fc1 7018 s = force_strict_version(s);
79072805
LW
7019 OPERATOR(PACKAGE);
7020
7021 case KEY_pipe:
a0d0e21e 7022 LOP(OP_PIPE_OP,XTERM);
79072805
LW
7023
7024 case KEY_q:
5db06880 7025 s = scan_str(s,!!PL_madskills,FALSE);
79072805 7026 if (!s)
d4c19fe8 7027 missingterm(NULL);
6154021b 7028 pl_yylval.ival = OP_CONST;
79072805
LW
7029 TERM(sublex_start());
7030
a0d0e21e
LW
7031 case KEY_quotemeta:
7032 UNI(OP_QUOTEMETA);
7033
8990e307 7034 case KEY_qw:
5db06880 7035 s = scan_str(s,!!PL_madskills,FALSE);
8990e307 7036 if (!s)
d4c19fe8 7037 missingterm(NULL);
3480a8d2 7038 PL_expect = XOPERATOR;
8127e0e3
GS
7039 force_next(')');
7040 if (SvCUR(PL_lex_stuff)) {
5f66b61c 7041 OP *words = NULL;
8127e0e3 7042 int warned = 0;
3280af22 7043 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 7044 while (len) {
d4c19fe8
AL
7045 for (; isSPACE(*d) && len; --len, ++d)
7046 /**/;
8127e0e3 7047 if (len) {
d4c19fe8 7048 SV *sv;
f54cb97a 7049 const char *b = d;
e476b1b5 7050 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
7051 for (; !isSPACE(*d) && len; --len, ++d) {
7052 if (*d == ',') {
9014280d 7053 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
7054 "Possible attempt to separate words with commas");
7055 ++warned;
7056 }
7057 else if (*d == '#') {
9014280d 7058 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
7059 "Possible attempt to put comments in qw() list");
7060 ++warned;
7061 }
7062 }
7063 }
7064 else {
d4c19fe8
AL
7065 for (; !isSPACE(*d) && len; --len, ++d)
7066 /**/;
8127e0e3 7067 }
740cce10 7068 sv = newSVpvn_utf8(b, d-b, DO_UTF8(PL_lex_stuff));
8127e0e3 7069 words = append_elem(OP_LIST, words,
7948272d 7070 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 7071 }
7072 }
8127e0e3 7073 if (words) {
cd81e915 7074 start_force(PL_curforce);
9ded7720 7075 NEXTVAL_NEXTTOKE.opval = words;
8127e0e3
GS
7076 force_next(THING);
7077 }
55497cff 7078 }
37fd879b 7079 if (PL_lex_stuff) {
8127e0e3 7080 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 7081 PL_lex_stuff = NULL;
37fd879b 7082 }
3280af22 7083 PL_expect = XTERM;
8127e0e3 7084 TOKEN('(');
8990e307 7085
79072805 7086 case KEY_qq:
5db06880 7087 s = scan_str(s,!!PL_madskills,FALSE);
79072805 7088 if (!s)
d4c19fe8 7089 missingterm(NULL);
6154021b 7090 pl_yylval.ival = OP_STRINGIFY;
3280af22 7091 if (SvIVX(PL_lex_stuff) == '\'')
45977657 7092 SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should intepolate */
79072805
LW
7093 TERM(sublex_start());
7094
8782bef2
GB
7095 case KEY_qr:
7096 s = scan_pat(s,OP_QR);
7097 TERM(sublex_start());
7098
79072805 7099 case KEY_qx:
5db06880 7100 s = scan_str(s,!!PL_madskills,FALSE);
79072805 7101 if (!s)
d4c19fe8 7102 missingterm(NULL);
9b201d7d 7103 readpipe_override();
79072805
LW
7104 TERM(sublex_start());
7105
7106 case KEY_return:
7107 OLDLOP(OP_RETURN);
7108
7109 case KEY_require:
29595ff2 7110 s = SKIPSPACE1(s);
e759cc13
RGS
7111 if (isDIGIT(*s)) {
7112 s = force_version(s, FALSE);
a7cb1f99 7113 }
e759cc13
RGS
7114 else if (*s != 'v' || !isDIGIT(s[1])
7115 || (s = force_version(s, TRUE), *s == 'v'))
7116 {
a7cb1f99
GS
7117 *PL_tokenbuf = '\0';
7118 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 7119 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
da51bb9b 7120 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
a7cb1f99
GS
7121 else if (*s == '<')
7122 yyerror("<> should be quotes");
7123 }
a72a1c8b
RGS
7124 if (orig_keyword == KEY_require) {
7125 orig_keyword = 0;
6154021b 7126 pl_yylval.ival = 1;
a72a1c8b
RGS
7127 }
7128 else
6154021b 7129 pl_yylval.ival = 0;
a72a1c8b
RGS
7130 PL_expect = XTERM;
7131 PL_bufptr = s;
7132 PL_last_uni = PL_oldbufptr;
7133 PL_last_lop_op = OP_REQUIRE;
7134 s = skipspace(s);
7135 return REPORT( (int)REQUIRE );
79072805
LW
7136
7137 case KEY_reset:
7138 UNI(OP_RESET);
7139
7140 case KEY_redo:
a0d0e21e 7141 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
7142 LOOPX(OP_REDO);
7143
7144 case KEY_rename:
a0d0e21e 7145 LOP(OP_RENAME,XTERM);
79072805
LW
7146
7147 case KEY_rand:
7148 UNI(OP_RAND);
7149
7150 case KEY_rmdir:
7151 UNI(OP_RMDIR);
7152
7153 case KEY_rindex:
a0d0e21e 7154 LOP(OP_RINDEX,XTERM);
79072805
LW
7155
7156 case KEY_read:
a0d0e21e 7157 LOP(OP_READ,XTERM);
79072805
LW
7158
7159 case KEY_readdir:
7160 UNI(OP_READDIR);
7161
93a17b20 7162 case KEY_readline:
6f33ba73 7163 UNIDOR(OP_READLINE);
93a17b20
LW
7164
7165 case KEY_readpipe:
0858480c 7166 UNIDOR(OP_BACKTICK);
93a17b20 7167
79072805
LW
7168 case KEY_rewinddir:
7169 UNI(OP_REWINDDIR);
7170
7171 case KEY_recv:
a0d0e21e 7172 LOP(OP_RECV,XTERM);
79072805
LW
7173
7174 case KEY_reverse:
a0d0e21e 7175 LOP(OP_REVERSE,XTERM);
79072805
LW
7176
7177 case KEY_readlink:
6f33ba73 7178 UNIDOR(OP_READLINK);
79072805
LW
7179
7180 case KEY_ref:
7181 UNI(OP_REF);
7182
7183 case KEY_s:
7184 s = scan_subst(s);
6154021b 7185 if (pl_yylval.opval)
79072805
LW
7186 TERM(sublex_start());
7187 else
7188 TOKEN(1); /* force error */
7189
0d863452
RH
7190 case KEY_say:
7191 checkcomma(s,PL_tokenbuf,"filehandle");
7192 LOP(OP_SAY,XREF);
7193
a0d0e21e
LW
7194 case KEY_chomp:
7195 UNI(OP_CHOMP);
4e553d73 7196
79072805
LW
7197 case KEY_scalar:
7198 UNI(OP_SCALAR);
7199
7200 case KEY_select:
a0d0e21e 7201 LOP(OP_SELECT,XTERM);
79072805
LW
7202
7203 case KEY_seek:
a0d0e21e 7204 LOP(OP_SEEK,XTERM);
79072805
LW
7205
7206 case KEY_semctl:
a0d0e21e 7207 LOP(OP_SEMCTL,XTERM);
79072805
LW
7208
7209 case KEY_semget:
a0d0e21e 7210 LOP(OP_SEMGET,XTERM);
79072805
LW
7211
7212 case KEY_semop:
a0d0e21e 7213 LOP(OP_SEMOP,XTERM);
79072805
LW
7214
7215 case KEY_send:
a0d0e21e 7216 LOP(OP_SEND,XTERM);
79072805
LW
7217
7218 case KEY_setpgrp:
a0d0e21e 7219 LOP(OP_SETPGRP,XTERM);
79072805
LW
7220
7221 case KEY_setpriority:
a0d0e21e 7222 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
7223
7224 case KEY_sethostent:
ff68c719 7225 UNI(OP_SHOSTENT);
79072805
LW
7226
7227 case KEY_setnetent:
ff68c719 7228 UNI(OP_SNETENT);
79072805
LW
7229
7230 case KEY_setservent:
ff68c719 7231 UNI(OP_SSERVENT);
79072805
LW
7232
7233 case KEY_setprotoent:
ff68c719 7234 UNI(OP_SPROTOENT);
79072805
LW
7235
7236 case KEY_setpwent:
7237 FUN0(OP_SPWENT);
7238
7239 case KEY_setgrent:
7240 FUN0(OP_SGRENT);
7241
7242 case KEY_seekdir:
a0d0e21e 7243 LOP(OP_SEEKDIR,XTERM);
79072805
LW
7244
7245 case KEY_setsockopt:
a0d0e21e 7246 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
7247
7248 case KEY_shift:
6f33ba73 7249 UNIDOR(OP_SHIFT);
79072805
LW
7250
7251 case KEY_shmctl:
a0d0e21e 7252 LOP(OP_SHMCTL,XTERM);
79072805
LW
7253
7254 case KEY_shmget:
a0d0e21e 7255 LOP(OP_SHMGET,XTERM);
79072805
LW
7256
7257 case KEY_shmread:
a0d0e21e 7258 LOP(OP_SHMREAD,XTERM);
79072805
LW
7259
7260 case KEY_shmwrite:
a0d0e21e 7261 LOP(OP_SHMWRITE,XTERM);
79072805
LW
7262
7263 case KEY_shutdown:
a0d0e21e 7264 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
7265
7266 case KEY_sin:
7267 UNI(OP_SIN);
7268
7269 case KEY_sleep:
7270 UNI(OP_SLEEP);
7271
7272 case KEY_socket:
a0d0e21e 7273 LOP(OP_SOCKET,XTERM);
79072805
LW
7274
7275 case KEY_socketpair:
a0d0e21e 7276 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
7277
7278 case KEY_sort:
3280af22 7279 checkcomma(s,PL_tokenbuf,"subroutine name");
29595ff2 7280 s = SKIPSPACE1(s);
79072805 7281 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 7282 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 7283 PL_expect = XTERM;
15f0808c 7284 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 7285 LOP(OP_SORT,XREF);
79072805
LW
7286
7287 case KEY_split:
a0d0e21e 7288 LOP(OP_SPLIT,XTERM);
79072805
LW
7289
7290 case KEY_sprintf:
a0d0e21e 7291 LOP(OP_SPRINTF,XTERM);
79072805
LW
7292
7293 case KEY_splice:
a0d0e21e 7294 LOP(OP_SPLICE,XTERM);
79072805
LW
7295
7296 case KEY_sqrt:
7297 UNI(OP_SQRT);
7298
7299 case KEY_srand:
7300 UNI(OP_SRAND);
7301
7302 case KEY_stat:
7303 UNI(OP_STAT);
7304
7305 case KEY_study:
79072805
LW
7306 UNI(OP_STUDY);
7307
7308 case KEY_substr:
a0d0e21e 7309 LOP(OP_SUBSTR,XTERM);
79072805
LW
7310
7311 case KEY_format:
7312 case KEY_sub:
93a17b20 7313 really_sub:
09bef843 7314 {
3280af22 7315 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 7316 SSize_t tboffset = 0;
09bef843 7317 expectation attrful;
28cc6278 7318 bool have_name, have_proto;
f54cb97a 7319 const int key = tmp;
09bef843 7320
5db06880
NC
7321#ifdef PERL_MAD
7322 SV *tmpwhite = 0;
7323
cd81e915 7324 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5db06880 7325 SV *subtoken = newSVpvn(tstart, s - tstart);
cd81e915 7326 PL_thistoken = 0;
5db06880
NC
7327
7328 d = s;
7329 s = SKIPSPACE2(s,tmpwhite);
7330#else
09bef843 7331 s = skipspace(s);
5db06880 7332#endif
09bef843 7333
7e2040f0 7334 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
7335 (*s == ':' && s[1] == ':'))
7336 {
5db06880 7337#ifdef PERL_MAD
4f61fd4b 7338 SV *nametoke = NULL;
5db06880
NC
7339#endif
7340
09bef843
SB
7341 PL_expect = XBLOCK;
7342 attrful = XATTRBLOCK;
b1b65b59
JH
7343 /* remember buffer pos'n for later force_word */
7344 tboffset = s - PL_oldbufptr;
09bef843 7345 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5db06880
NC
7346#ifdef PERL_MAD
7347 if (PL_madskills)
7348 nametoke = newSVpvn(s, d - s);
7349#endif
6502358f
NC
7350 if (memchr(tmpbuf, ':', len))
7351 sv_setpvn(PL_subname, tmpbuf, len);
09bef843
SB
7352 else {
7353 sv_setsv(PL_subname,PL_curstname);
396482e1 7354 sv_catpvs(PL_subname,"::");
09bef843
SB
7355 sv_catpvn(PL_subname,tmpbuf,len);
7356 }
09bef843 7357 have_name = TRUE;
5db06880
NC
7358
7359#ifdef PERL_MAD
7360
7361 start_force(0);
7362 CURMAD('X', nametoke);
7363 CURMAD('_', tmpwhite);
7364 (void) force_word(PL_oldbufptr + tboffset, WORD,
7365 FALSE, TRUE, TRUE);
7366
7367 s = SKIPSPACE2(d,tmpwhite);
7368#else
7369 s = skipspace(d);
7370#endif
09bef843 7371 }
463ee0b2 7372 else {
09bef843
SB
7373 if (key == KEY_my)
7374 Perl_croak(aTHX_ "Missing name in \"my sub\"");
7375 PL_expect = XTERMBLOCK;
7376 attrful = XATTRTERM;
76f68e9b 7377 sv_setpvs(PL_subname,"?");
09bef843 7378 have_name = FALSE;
463ee0b2 7379 }
4633a7c4 7380
09bef843
SB
7381 if (key == KEY_format) {
7382 if (*s == '=')
7383 PL_lex_formbrack = PL_lex_brackets + 1;
5db06880 7384#ifdef PERL_MAD
cd81e915 7385 PL_thistoken = subtoken;
5db06880
NC
7386 s = d;
7387#else
09bef843 7388 if (have_name)
b1b65b59
JH
7389 (void) force_word(PL_oldbufptr + tboffset, WORD,
7390 FALSE, TRUE, TRUE);
5db06880 7391#endif
09bef843
SB
7392 OPERATOR(FORMAT);
7393 }
79072805 7394
09bef843
SB
7395 /* Look for a prototype */
7396 if (*s == '(') {
d9f2850e
RGS
7397 char *p;
7398 bool bad_proto = FALSE;
9e8d7757
RB
7399 bool in_brackets = FALSE;
7400 char greedy_proto = ' ';
7401 bool proto_after_greedy_proto = FALSE;
7402 bool must_be_last = FALSE;
7403 bool underscore = FALSE;
aef2a98a 7404 bool seen_underscore = FALSE;
197afce1 7405 const bool warnillegalproto = ckWARN(WARN_ILLEGALPROTO);
09bef843 7406
5db06880 7407 s = scan_str(s,!!PL_madskills,FALSE);
37fd879b 7408 if (!s)
09bef843 7409 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 7410 /* strip spaces and check for bad characters */
09bef843
SB
7411 d = SvPVX(PL_lex_stuff);
7412 tmp = 0;
d9f2850e
RGS
7413 for (p = d; *p; ++p) {
7414 if (!isSPACE(*p)) {
7415 d[tmp++] = *p;
9e8d7757 7416
197afce1 7417 if (warnillegalproto) {
9e8d7757
RB
7418 if (must_be_last)
7419 proto_after_greedy_proto = TRUE;
7420 if (!strchr("$@%*;[]&\\_", *p)) {
7421 bad_proto = TRUE;
7422 }
7423 else {
7424 if ( underscore ) {
7425 if ( *p != ';' )
7426 bad_proto = TRUE;
7427 underscore = FALSE;
7428 }
7429 if ( *p == '[' ) {
7430 in_brackets = TRUE;
7431 }
7432 else if ( *p == ']' ) {
7433 in_brackets = FALSE;
7434 }
7435 else if ( (*p == '@' || *p == '%') &&
7436 ( tmp < 2 || d[tmp-2] != '\\' ) &&
7437 !in_brackets ) {
7438 must_be_last = TRUE;
7439 greedy_proto = *p;
7440 }
7441 else if ( *p == '_' ) {
aef2a98a 7442 underscore = seen_underscore = TRUE;
9e8d7757
RB
7443 }
7444 }
7445 }
d37a9538 7446 }
09bef843 7447 }
d9f2850e 7448 d[tmp] = '\0';
9e8d7757 7449 if (proto_after_greedy_proto)
197afce1 7450 Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
9e8d7757
RB
7451 "Prototype after '%c' for %"SVf" : %s",
7452 greedy_proto, SVfARG(PL_subname), d);
d9f2850e 7453 if (bad_proto)
197afce1 7454 Perl_warner(aTHX_ packWARN(WARN_ILLEGALPROTO),
aef2a98a
RGS
7455 "Illegal character %sin prototype for %"SVf" : %s",
7456 seen_underscore ? "after '_' " : "",
be2597df 7457 SVfARG(PL_subname), d);
b162af07 7458 SvCUR_set(PL_lex_stuff, tmp);
09bef843 7459 have_proto = TRUE;
68dc0745 7460
5db06880
NC
7461#ifdef PERL_MAD
7462 start_force(0);
cd81e915 7463 CURMAD('q', PL_thisopen);
5db06880 7464 CURMAD('_', tmpwhite);
cd81e915
NC
7465 CURMAD('=', PL_thisstuff);
7466 CURMAD('Q', PL_thisclose);
5db06880
NC
7467 NEXTVAL_NEXTTOKE.opval =
7468 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
1a9a51d4 7469 PL_lex_stuff = NULL;
5db06880
NC
7470 force_next(THING);
7471
7472 s = SKIPSPACE2(s,tmpwhite);
7473#else
09bef843 7474 s = skipspace(s);
5db06880 7475#endif
4633a7c4 7476 }
09bef843
SB
7477 else
7478 have_proto = FALSE;
7479
7480 if (*s == ':' && s[1] != ':')
7481 PL_expect = attrful;
8e742a20
MHM
7482 else if (*s != '{' && key == KEY_sub) {
7483 if (!have_name)
7484 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
fd909433 7485 else if (*s != ';' && *s != '}')
be2597df 7486 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
8e742a20 7487 }
09bef843 7488
5db06880
NC
7489#ifdef PERL_MAD
7490 start_force(0);
7491 if (tmpwhite) {
7492 if (PL_madskills)
6b29d1f5 7493 curmad('^', newSVpvs(""));
5db06880
NC
7494 CURMAD('_', tmpwhite);
7495 }
7496 force_next(0);
7497
cd81e915 7498 PL_thistoken = subtoken;
5db06880 7499#else
09bef843 7500 if (have_proto) {
9ded7720 7501 NEXTVAL_NEXTTOKE.opval =
b1b65b59 7502 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
a0714e2c 7503 PL_lex_stuff = NULL;
09bef843 7504 force_next(THING);
68dc0745 7505 }
5db06880 7506#endif
09bef843 7507 if (!have_name) {
49a54bbe
NC
7508 if (PL_curstash)
7509 sv_setpvs(PL_subname, "__ANON__");
7510 else
7511 sv_setpvs(PL_subname, "__ANON__::__ANON__");
09bef843 7512 TOKEN(ANONSUB);
4633a7c4 7513 }
5db06880 7514#ifndef PERL_MAD
b1b65b59
JH
7515 (void) force_word(PL_oldbufptr + tboffset, WORD,
7516 FALSE, TRUE, TRUE);
5db06880 7517#endif
09bef843
SB
7518 if (key == KEY_my)
7519 TOKEN(MYSUB);
7520 TOKEN(SUB);
4633a7c4 7521 }
79072805
LW
7522
7523 case KEY_system:
a0d0e21e 7524 LOP(OP_SYSTEM,XREF);
79072805
LW
7525
7526 case KEY_symlink:
a0d0e21e 7527 LOP(OP_SYMLINK,XTERM);
79072805
LW
7528
7529 case KEY_syscall:
a0d0e21e 7530 LOP(OP_SYSCALL,XTERM);
79072805 7531
c07a80fd 7532 case KEY_sysopen:
7533 LOP(OP_SYSOPEN,XTERM);
7534
137443ea 7535 case KEY_sysseek:
7536 LOP(OP_SYSSEEK,XTERM);
7537
79072805 7538 case KEY_sysread:
a0d0e21e 7539 LOP(OP_SYSREAD,XTERM);
79072805
LW
7540
7541 case KEY_syswrite:
a0d0e21e 7542 LOP(OP_SYSWRITE,XTERM);
79072805
LW
7543
7544 case KEY_tr:
7545 s = scan_trans(s);
7546 TERM(sublex_start());
7547
7548 case KEY_tell:
7549 UNI(OP_TELL);
7550
7551 case KEY_telldir:
7552 UNI(OP_TELLDIR);
7553
463ee0b2 7554 case KEY_tie:
a0d0e21e 7555 LOP(OP_TIE,XTERM);
463ee0b2 7556
c07a80fd 7557 case KEY_tied:
7558 UNI(OP_TIED);
7559
79072805
LW
7560 case KEY_time:
7561 FUN0(OP_TIME);
7562
7563 case KEY_times:
7564 FUN0(OP_TMS);
7565
7566 case KEY_truncate:
a0d0e21e 7567 LOP(OP_TRUNCATE,XTERM);
79072805
LW
7568
7569 case KEY_uc:
7570 UNI(OP_UC);
7571
7572 case KEY_ucfirst:
7573 UNI(OP_UCFIRST);
7574
463ee0b2
LW
7575 case KEY_untie:
7576 UNI(OP_UNTIE);
7577
79072805 7578 case KEY_until:
6154021b 7579 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
7580 OPERATOR(UNTIL);
7581
7582 case KEY_unless:
6154021b 7583 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
7584 OPERATOR(UNLESS);
7585
7586 case KEY_unlink:
a0d0e21e 7587 LOP(OP_UNLINK,XTERM);
79072805
LW
7588
7589 case KEY_undef:
6f33ba73 7590 UNIDOR(OP_UNDEF);
79072805
LW
7591
7592 case KEY_unpack:
a0d0e21e 7593 LOP(OP_UNPACK,XTERM);
79072805
LW
7594
7595 case KEY_utime:
a0d0e21e 7596 LOP(OP_UTIME,XTERM);
79072805
LW
7597
7598 case KEY_umask:
6f33ba73 7599 UNIDOR(OP_UMASK);
79072805
LW
7600
7601 case KEY_unshift:
a0d0e21e
LW
7602 LOP(OP_UNSHIFT,XTERM);
7603
7604 case KEY_use:
468aa647 7605 s = tokenize_use(1, s);
a0d0e21e 7606 OPERATOR(USE);
79072805
LW
7607
7608 case KEY_values:
7609 UNI(OP_VALUES);
7610
7611 case KEY_vec:
a0d0e21e 7612 LOP(OP_VEC,XTERM);
79072805 7613
0d863452 7614 case KEY_when:
6154021b 7615 pl_yylval.ival = CopLINE(PL_curcop);
0d863452
RH
7616 OPERATOR(WHEN);
7617
79072805 7618 case KEY_while:
6154021b 7619 pl_yylval.ival = CopLINE(PL_curcop);
79072805
LW
7620 OPERATOR(WHILE);
7621
7622 case KEY_warn:
3280af22 7623 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 7624 LOP(OP_WARN,XTERM);
79072805
LW
7625
7626 case KEY_wait:
7627 FUN0(OP_WAIT);
7628
7629 case KEY_waitpid:
a0d0e21e 7630 LOP(OP_WAITPID,XTERM);
79072805
LW
7631
7632 case KEY_wantarray:
7633 FUN0(OP_WANTARRAY);
7634
7635 case KEY_write:
9d116dd7
JH
7636#ifdef EBCDIC
7637 {
df3728a2
JH
7638 char ctl_l[2];
7639 ctl_l[0] = toCTRL('L');
7640 ctl_l[1] = '\0';
fafc274c 7641 gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7
JH
7642 }
7643#else
fafc274c
NC
7644 /* Make sure $^L is defined */
7645 gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7 7646#endif
79072805
LW
7647 UNI(OP_ENTERWRITE);
7648
7649 case KEY_x:
3280af22 7650 if (PL_expect == XOPERATOR)
79072805
LW
7651 Mop(OP_REPEAT);
7652 check_uni();
7653 goto just_a_word;
7654
a0d0e21e 7655 case KEY_xor:
6154021b 7656 pl_yylval.ival = OP_XOR;
a0d0e21e
LW
7657 OPERATOR(OROP);
7658
79072805
LW
7659 case KEY_y:
7660 s = scan_trans(s);
7661 TERM(sublex_start());
7662 }
49dc05e3 7663 }}
79072805 7664}
bf4acbe4
GS
7665#ifdef __SC__
7666#pragma segment Main
7667#endif
79072805 7668
e930465f
JH
7669static int
7670S_pending_ident(pTHX)
8eceec63 7671{
97aff369 7672 dVAR;
8eceec63 7673 register char *d;
bbd11bfc 7674 PADOFFSET tmp = 0;
8eceec63
SC
7675 /* pit holds the identifier we read and pending_ident is reset */
7676 char pit = PL_pending_ident;
9bde8eb0
NC
7677 const STRLEN tokenbuf_len = strlen(PL_tokenbuf);
7678 /* All routes through this function want to know if there is a colon. */
c099d646 7679 const char *const has_colon = (const char*) memchr (PL_tokenbuf, ':', tokenbuf_len);
8eceec63
SC
7680 PL_pending_ident = 0;
7681
cd81e915 7682 /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
8eceec63 7683 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 7684 "### Pending identifier '%s'\n", PL_tokenbuf); });
8eceec63
SC
7685
7686 /* if we're in a my(), we can't allow dynamics here.
7687 $foo'bar has already been turned into $foo::bar, so
7688 just check for colons.
7689
7690 if it's a legal name, the OP is a PADANY.
7691 */
7692 if (PL_in_my) {
7693 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
9bde8eb0 7694 if (has_colon)
8eceec63
SC
7695 yyerror(Perl_form(aTHX_ "No package name allowed for "
7696 "variable %s in \"our\"",
7697 PL_tokenbuf));
d6447115 7698 tmp = allocmy(PL_tokenbuf, tokenbuf_len, 0);
8eceec63
SC
7699 }
7700 else {
9bde8eb0 7701 if (has_colon)
952306ac
RGS
7702 yyerror(Perl_form(aTHX_ PL_no_myglob,
7703 PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
8eceec63 7704
6154021b 7705 pl_yylval.opval = newOP(OP_PADANY, 0);
d6447115 7706 pl_yylval.opval->op_targ = allocmy(PL_tokenbuf, tokenbuf_len, 0);
8eceec63
SC
7707 return PRIVATEREF;
7708 }
7709 }
7710
7711 /*
7712 build the ops for accesses to a my() variable.
7713
7714 Deny my($a) or my($b) in a sort block, *if* $a or $b is
7715 then used in a comparison. This catches most, but not
7716 all cases. For instance, it catches
7717 sort { my($a); $a <=> $b }
7718 but not
7719 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
7720 (although why you'd do that is anyone's guess).
7721 */
7722
9bde8eb0 7723 if (!has_colon) {
8716503d 7724 if (!PL_in_my)
f8f98e0a 7725 tmp = pad_findmy(PL_tokenbuf, tokenbuf_len, 0);
8716503d 7726 if (tmp != NOT_IN_PAD) {
8eceec63 7727 /* might be an "our" variable" */
00b1698f 7728 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
8eceec63 7729 /* build ops for a bareword */
b64e5050
AL
7730 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
7731 HEK * const stashname = HvNAME_HEK(stash);
7732 SV * const sym = newSVhek(stashname);
396482e1 7733 sv_catpvs(sym, "::");
9bde8eb0 7734 sv_catpvn(sym, PL_tokenbuf+1, tokenbuf_len - 1);
6154021b
RGS
7735 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
7736 pl_yylval.opval->op_private = OPpCONST_ENTERED;
7a5fd60d 7737 gv_fetchsv(sym,
8eceec63
SC
7738 (PL_in_eval
7739 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 7740 : GV_ADDMULTI
8eceec63
SC
7741 ),
7742 ((PL_tokenbuf[0] == '$') ? SVt_PV
7743 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7744 : SVt_PVHV));
7745 return WORD;
7746 }
7747
7748 /* if it's a sort block and they're naming $a or $b */
7749 if (PL_last_lop_op == OP_SORT &&
7750 PL_tokenbuf[0] == '$' &&
7751 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
7752 && !PL_tokenbuf[2])
7753 {
7754 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
7755 d < PL_bufend && *d != '\n';
7756 d++)
7757 {
7758 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
7759 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
7760 PL_tokenbuf);
7761 }
7762 }
7763 }
7764
6154021b
RGS
7765 pl_yylval.opval = newOP(OP_PADANY, 0);
7766 pl_yylval.opval->op_targ = tmp;
8eceec63
SC
7767 return PRIVATEREF;
7768 }
7769 }
7770
7771 /*
7772 Whine if they've said @foo in a doublequoted string,
7773 and @foo isn't a variable we can find in the symbol
7774 table.
7775 */
d824713b
NC
7776 if (ckWARN(WARN_AMBIGUOUS) &&
7777 pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
9bde8eb0
NC
7778 GV *const gv = gv_fetchpvn_flags(PL_tokenbuf + 1, tokenbuf_len - 1, 0,
7779 SVt_PVAV);
8eceec63 7780 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
e879d94f
RGS
7781 /* DO NOT warn for @- and @+ */
7782 && !( PL_tokenbuf[2] == '\0' &&
7783 ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7784 )
8eceec63
SC
7785 {
7786 /* Downgraded from fatal to warning 20000522 mjd */
d824713b
NC
7787 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
7788 "Possible unintended interpolation of %s in string",
7789 PL_tokenbuf);
8eceec63
SC
7790 }
7791 }
7792
7793 /* build ops for a bareword */
6154021b 7794 pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
9bde8eb0 7795 tokenbuf_len - 1));
6154021b 7796 pl_yylval.opval->op_private = OPpCONST_ENTERED;
9bde8eb0
NC
7797 gv_fetchpvn_flags(
7798 PL_tokenbuf + 1, tokenbuf_len - 1,
d6069db2
RGS
7799 /* If the identifier refers to a stash, don't autovivify it.
7800 * Change 24660 had the side effect of causing symbol table
7801 * hashes to always be defined, even if they were freshly
7802 * created and the only reference in the entire program was
7803 * the single statement with the defined %foo::bar:: test.
7804 * It appears that all code in the wild doing this actually
7805 * wants to know whether sub-packages have been loaded, so
7806 * by avoiding auto-vivifying symbol tables, we ensure that
7807 * defined %foo::bar:: continues to be false, and the existing
7808 * tests still give the expected answers, even though what
7809 * they're actually testing has now changed subtly.
7810 */
9bde8eb0
NC
7811 (*PL_tokenbuf == '%'
7812 && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
7813 && d[-1] == ':'
d6069db2
RGS
7814 ? 0
7815 : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
adc51b97
RGS
7816 ((PL_tokenbuf[0] == '$') ? SVt_PV
7817 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7818 : SVt_PVHV));
8eceec63
SC
7819 return WORD;
7820}
7821
4c3bbe0f
MHM
7822/*
7823 * The following code was generated by perl_keyword.pl.
7824 */
e2e1dd5a 7825
79072805 7826I32
5458a98a 7827Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
4c3bbe0f 7828{
952306ac 7829 dVAR;
7918f24d
NC
7830
7831 PERL_ARGS_ASSERT_KEYWORD;
7832
4c3bbe0f
MHM
7833 switch (len)
7834 {
7835 case 1: /* 5 tokens of length 1 */
7836 switch (name[0])
e2e1dd5a 7837 {
4c3bbe0f
MHM
7838 case 'm':
7839 { /* m */
7840 return KEY_m;
7841 }
7842
4c3bbe0f
MHM
7843 case 'q':
7844 { /* q */
7845 return KEY_q;
7846 }
7847
4c3bbe0f
MHM
7848 case 's':
7849 { /* s */
7850 return KEY_s;
7851 }
7852
4c3bbe0f
MHM
7853 case 'x':
7854 { /* x */
7855 return -KEY_x;
7856 }
7857
4c3bbe0f
MHM
7858 case 'y':
7859 { /* y */
7860 return KEY_y;
7861 }
7862
4c3bbe0f
MHM
7863 default:
7864 goto unknown;
e2e1dd5a 7865 }
4c3bbe0f
MHM
7866
7867 case 2: /* 18 tokens of length 2 */
7868 switch (name[0])
e2e1dd5a 7869 {
4c3bbe0f
MHM
7870 case 'd':
7871 if (name[1] == 'o')
7872 { /* do */
7873 return KEY_do;
7874 }
7875
7876 goto unknown;
7877
7878 case 'e':
7879 if (name[1] == 'q')
7880 { /* eq */
7881 return -KEY_eq;
7882 }
7883
7884 goto unknown;
7885
7886 case 'g':
7887 switch (name[1])
7888 {
7889 case 'e':
7890 { /* ge */
7891 return -KEY_ge;
7892 }
7893
4c3bbe0f
MHM
7894 case 't':
7895 { /* gt */
7896 return -KEY_gt;
7897 }
7898
4c3bbe0f
MHM
7899 default:
7900 goto unknown;
7901 }
7902
7903 case 'i':
7904 if (name[1] == 'f')
7905 { /* if */
7906 return KEY_if;
7907 }
7908
7909 goto unknown;
7910
7911 case 'l':
7912 switch (name[1])
7913 {
7914 case 'c':
7915 { /* lc */
7916 return -KEY_lc;
7917 }
7918
4c3bbe0f
MHM
7919 case 'e':
7920 { /* le */
7921 return -KEY_le;
7922 }
7923
4c3bbe0f
MHM
7924 case 't':
7925 { /* lt */
7926 return -KEY_lt;
7927 }
7928
4c3bbe0f
MHM
7929 default:
7930 goto unknown;
7931 }
7932
7933 case 'm':
7934 if (name[1] == 'y')
7935 { /* my */
7936 return KEY_my;
7937 }
7938
7939 goto unknown;
7940
7941 case 'n':
7942 switch (name[1])
7943 {
7944 case 'e':
7945 { /* ne */
7946 return -KEY_ne;
7947 }
7948
4c3bbe0f
MHM
7949 case 'o':
7950 { /* no */
7951 return KEY_no;
7952 }
7953
4c3bbe0f
MHM
7954 default:
7955 goto unknown;
7956 }
7957
7958 case 'o':
7959 if (name[1] == 'r')
7960 { /* or */
7961 return -KEY_or;
7962 }
7963
7964 goto unknown;
7965
7966 case 'q':
7967 switch (name[1])
7968 {
7969 case 'q':
7970 { /* qq */
7971 return KEY_qq;
7972 }
7973
4c3bbe0f
MHM
7974 case 'r':
7975 { /* qr */
7976 return KEY_qr;
7977 }
7978
4c3bbe0f
MHM
7979 case 'w':
7980 { /* qw */
7981 return KEY_qw;
7982 }
7983
4c3bbe0f
MHM
7984 case 'x':
7985 { /* qx */
7986 return KEY_qx;
7987 }
7988
4c3bbe0f
MHM
7989 default:
7990 goto unknown;
7991 }
7992
7993 case 't':
7994 if (name[1] == 'r')
7995 { /* tr */
7996 return KEY_tr;
7997 }
7998
7999 goto unknown;
8000
8001 case 'u':
8002 if (name[1] == 'c')
8003 { /* uc */
8004 return -KEY_uc;
8005 }
8006
8007 goto unknown;
8008
8009 default:
8010 goto unknown;
e2e1dd5a 8011 }
4c3bbe0f 8012
0d863452 8013 case 3: /* 29 tokens of length 3 */
4c3bbe0f 8014 switch (name[0])
e2e1dd5a 8015 {
4c3bbe0f
MHM
8016 case 'E':
8017 if (name[1] == 'N' &&
8018 name[2] == 'D')
8019 { /* END */
8020 return KEY_END;
8021 }
8022
8023 goto unknown;
8024
8025 case 'a':
8026 switch (name[1])
8027 {
8028 case 'b':
8029 if (name[2] == 's')
8030 { /* abs */
8031 return -KEY_abs;
8032 }
8033
8034 goto unknown;
8035
8036 case 'n':
8037 if (name[2] == 'd')
8038 { /* and */
8039 return -KEY_and;
8040 }
8041
8042 goto unknown;
8043
8044 default:
8045 goto unknown;
8046 }
8047
8048 case 'c':
8049 switch (name[1])
8050 {
8051 case 'h':
8052 if (name[2] == 'r')
8053 { /* chr */
8054 return -KEY_chr;
8055 }
8056
8057 goto unknown;
8058
8059 case 'm':
8060 if (name[2] == 'p')
8061 { /* cmp */
8062 return -KEY_cmp;
8063 }
8064
8065 goto unknown;
8066
8067 case 'o':
8068 if (name[2] == 's')
8069 { /* cos */
8070 return -KEY_cos;
8071 }
8072
8073 goto unknown;
8074
8075 default:
8076 goto unknown;
8077 }
8078
8079 case 'd':
8080 if (name[1] == 'i' &&
8081 name[2] == 'e')
8082 { /* die */
8083 return -KEY_die;
8084 }
8085
8086 goto unknown;
8087
8088 case 'e':
8089 switch (name[1])
8090 {
8091 case 'o':
8092 if (name[2] == 'f')
8093 { /* eof */
8094 return -KEY_eof;
8095 }
8096
8097 goto unknown;
8098
4c3bbe0f
MHM
8099 case 'x':
8100 if (name[2] == 'p')
8101 { /* exp */
8102 return -KEY_exp;
8103 }
8104
8105 goto unknown;
8106
8107 default:
8108 goto unknown;
8109 }
8110
8111 case 'f':
8112 if (name[1] == 'o' &&
8113 name[2] == 'r')
8114 { /* for */
8115 return KEY_for;
8116 }
8117
8118 goto unknown;
8119
8120 case 'h':
8121 if (name[1] == 'e' &&
8122 name[2] == 'x')
8123 { /* hex */
8124 return -KEY_hex;
8125 }
8126
8127 goto unknown;
8128
8129 case 'i':
8130 if (name[1] == 'n' &&
8131 name[2] == 't')
8132 { /* int */
8133 return -KEY_int;
8134 }
8135
8136 goto unknown;
8137
8138 case 'l':
8139 if (name[1] == 'o' &&
8140 name[2] == 'g')
8141 { /* log */
8142 return -KEY_log;
8143 }
8144
8145 goto unknown;
8146
8147 case 'm':
8148 if (name[1] == 'a' &&
8149 name[2] == 'p')
8150 { /* map */
8151 return KEY_map;
8152 }
8153
8154 goto unknown;
8155
8156 case 'n':
8157 if (name[1] == 'o' &&
8158 name[2] == 't')
8159 { /* not */
8160 return -KEY_not;
8161 }
8162
8163 goto unknown;
8164
8165 case 'o':
8166 switch (name[1])
8167 {
8168 case 'c':
8169 if (name[2] == 't')
8170 { /* oct */
8171 return -KEY_oct;
8172 }
8173
8174 goto unknown;
8175
8176 case 'r':
8177 if (name[2] == 'd')
8178 { /* ord */
8179 return -KEY_ord;
8180 }
8181
8182 goto unknown;
8183
8184 case 'u':
8185 if (name[2] == 'r')
8186 { /* our */
8187 return KEY_our;
8188 }
8189
8190 goto unknown;
8191
8192 default:
8193 goto unknown;
8194 }
8195
8196 case 'p':
8197 if (name[1] == 'o')
8198 {
8199 switch (name[2])
8200 {
8201 case 'p':
8202 { /* pop */
8203 return -KEY_pop;
8204 }
8205
4c3bbe0f
MHM
8206 case 's':
8207 { /* pos */
8208 return KEY_pos;
8209 }
8210
4c3bbe0f
MHM
8211 default:
8212 goto unknown;
8213 }
8214 }
8215
8216 goto unknown;
8217
8218 case 'r':
8219 if (name[1] == 'e' &&
8220 name[2] == 'f')
8221 { /* ref */
8222 return -KEY_ref;
8223 }
8224
8225 goto unknown;
8226
8227 case 's':
8228 switch (name[1])
8229 {
0d863452
RH
8230 case 'a':
8231 if (name[2] == 'y')
8232 { /* say */
e3e804c9 8233 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
0d863452
RH
8234 }
8235
8236 goto unknown;
8237
4c3bbe0f
MHM
8238 case 'i':
8239 if (name[2] == 'n')
8240 { /* sin */
8241 return -KEY_sin;
8242 }
8243
8244 goto unknown;
8245
8246 case 'u':
8247 if (name[2] == 'b')
8248 { /* sub */
8249 return KEY_sub;
8250 }
8251
8252 goto unknown;
8253
8254 default:
8255 goto unknown;
8256 }
8257
8258 case 't':
8259 if (name[1] == 'i' &&
8260 name[2] == 'e')
8261 { /* tie */
8262 return KEY_tie;
8263 }
8264
8265 goto unknown;
8266
8267 case 'u':
8268 if (name[1] == 's' &&
8269 name[2] == 'e')
8270 { /* use */
8271 return KEY_use;
8272 }
8273
8274 goto unknown;
8275
8276 case 'v':
8277 if (name[1] == 'e' &&
8278 name[2] == 'c')
8279 { /* vec */
8280 return -KEY_vec;
8281 }
8282
8283 goto unknown;
8284
8285 case 'x':
8286 if (name[1] == 'o' &&
8287 name[2] == 'r')
8288 { /* xor */
8289 return -KEY_xor;
8290 }
8291
8292 goto unknown;
8293
8294 default:
8295 goto unknown;
e2e1dd5a 8296 }
4c3bbe0f 8297
0d863452 8298 case 4: /* 41 tokens of length 4 */
4c3bbe0f 8299 switch (name[0])
e2e1dd5a 8300 {
4c3bbe0f
MHM
8301 case 'C':
8302 if (name[1] == 'O' &&
8303 name[2] == 'R' &&
8304 name[3] == 'E')
8305 { /* CORE */
8306 return -KEY_CORE;
8307 }
8308
8309 goto unknown;
8310
8311 case 'I':
8312 if (name[1] == 'N' &&
8313 name[2] == 'I' &&
8314 name[3] == 'T')
8315 { /* INIT */
8316 return KEY_INIT;
8317 }
8318
8319 goto unknown;
8320
8321 case 'b':
8322 if (name[1] == 'i' &&
8323 name[2] == 'n' &&
8324 name[3] == 'd')
8325 { /* bind */
8326 return -KEY_bind;
8327 }
8328
8329 goto unknown;
8330
8331 case 'c':
8332 if (name[1] == 'h' &&
8333 name[2] == 'o' &&
8334 name[3] == 'p')
8335 { /* chop */
8336 return -KEY_chop;
8337 }
8338
8339 goto unknown;
8340
8341 case 'd':
8342 if (name[1] == 'u' &&
8343 name[2] == 'm' &&
8344 name[3] == 'p')
8345 { /* dump */
8346 return -KEY_dump;
8347 }
8348
8349 goto unknown;
8350
8351 case 'e':
8352 switch (name[1])
8353 {
8354 case 'a':
8355 if (name[2] == 'c' &&
8356 name[3] == 'h')
8357 { /* each */
8358 return -KEY_each;
8359 }
8360
8361 goto unknown;
8362
8363 case 'l':
8364 if (name[2] == 's' &&
8365 name[3] == 'e')
8366 { /* else */
8367 return KEY_else;
8368 }
8369
8370 goto unknown;
8371
8372 case 'v':
8373 if (name[2] == 'a' &&
8374 name[3] == 'l')
8375 { /* eval */
8376 return KEY_eval;
8377 }
8378
8379 goto unknown;
8380
8381 case 'x':
8382 switch (name[2])
8383 {
8384 case 'e':
8385 if (name[3] == 'c')
8386 { /* exec */
8387 return -KEY_exec;
8388 }
8389
8390 goto unknown;
8391
8392 case 'i':
8393 if (name[3] == 't')
8394 { /* exit */
8395 return -KEY_exit;
8396 }
8397
8398 goto unknown;
8399
8400 default:
8401 goto unknown;
8402 }
8403
8404 default:
8405 goto unknown;
8406 }
8407
8408 case 'f':
8409 if (name[1] == 'o' &&
8410 name[2] == 'r' &&
8411 name[3] == 'k')
8412 { /* fork */
8413 return -KEY_fork;
8414 }
8415
8416 goto unknown;
8417
8418 case 'g':
8419 switch (name[1])
8420 {
8421 case 'e':
8422 if (name[2] == 't' &&
8423 name[3] == 'c')
8424 { /* getc */
8425 return -KEY_getc;
8426 }
8427
8428 goto unknown;
8429
8430 case 'l':
8431 if (name[2] == 'o' &&
8432 name[3] == 'b')
8433 { /* glob */
8434 return KEY_glob;
8435 }
8436
8437 goto unknown;
8438
8439 case 'o':
8440 if (name[2] == 't' &&
8441 name[3] == 'o')
8442 { /* goto */
8443 return KEY_goto;
8444 }
8445
8446 goto unknown;
8447
8448 case 'r':
8449 if (name[2] == 'e' &&
8450 name[3] == 'p')
8451 { /* grep */
8452 return KEY_grep;
8453 }
8454
8455 goto unknown;
8456
8457 default:
8458 goto unknown;
8459 }
8460
8461 case 'j':
8462 if (name[1] == 'o' &&
8463 name[2] == 'i' &&
8464 name[3] == 'n')
8465 { /* join */
8466 return -KEY_join;
8467 }
8468
8469 goto unknown;
8470
8471 case 'k':
8472 switch (name[1])
8473 {
8474 case 'e':
8475 if (name[2] == 'y' &&
8476 name[3] == 's')
8477 { /* keys */
8478 return -KEY_keys;
8479 }
8480
8481 goto unknown;
8482
8483 case 'i':
8484 if (name[2] == 'l' &&
8485 name[3] == 'l')
8486 { /* kill */
8487 return -KEY_kill;
8488 }
8489
8490 goto unknown;
8491
8492 default:
8493 goto unknown;
8494 }
8495
8496 case 'l':
8497 switch (name[1])
8498 {
8499 case 'a':
8500 if (name[2] == 's' &&
8501 name[3] == 't')
8502 { /* last */
8503 return KEY_last;
8504 }
8505
8506 goto unknown;
8507
8508 case 'i':
8509 if (name[2] == 'n' &&
8510 name[3] == 'k')
8511 { /* link */
8512 return -KEY_link;
8513 }
8514
8515 goto unknown;
8516
8517 case 'o':
8518 if (name[2] == 'c' &&
8519 name[3] == 'k')
8520 { /* lock */
8521 return -KEY_lock;
8522 }
8523
8524 goto unknown;
8525
8526 default:
8527 goto unknown;
8528 }
8529
8530 case 'n':
8531 if (name[1] == 'e' &&
8532 name[2] == 'x' &&
8533 name[3] == 't')
8534 { /* next */
8535 return KEY_next;
8536 }
8537
8538 goto unknown;
8539
8540 case 'o':
8541 if (name[1] == 'p' &&
8542 name[2] == 'e' &&
8543 name[3] == 'n')
8544 { /* open */
8545 return -KEY_open;
8546 }
8547
8548 goto unknown;
8549
8550 case 'p':
8551 switch (name[1])
8552 {
8553 case 'a':
8554 if (name[2] == 'c' &&
8555 name[3] == 'k')
8556 { /* pack */
8557 return -KEY_pack;
8558 }
8559
8560 goto unknown;
8561
8562 case 'i':
8563 if (name[2] == 'p' &&
8564 name[3] == 'e')
8565 { /* pipe */
8566 return -KEY_pipe;
8567 }
8568
8569 goto unknown;
8570
8571 case 'u':
8572 if (name[2] == 's' &&
8573 name[3] == 'h')
8574 { /* push */
8575 return -KEY_push;
8576 }
8577
8578 goto unknown;
8579
8580 default:
8581 goto unknown;
8582 }
8583
8584 case 'r':
8585 switch (name[1])
8586 {
8587 case 'a':
8588 if (name[2] == 'n' &&
8589 name[3] == 'd')
8590 { /* rand */
8591 return -KEY_rand;
8592 }
8593
8594 goto unknown;
8595
8596 case 'e':
8597 switch (name[2])
8598 {
8599 case 'a':
8600 if (name[3] == 'd')
8601 { /* read */
8602 return -KEY_read;
8603 }
8604
8605 goto unknown;
8606
8607 case 'c':
8608 if (name[3] == 'v')
8609 { /* recv */
8610 return -KEY_recv;
8611 }
8612
8613 goto unknown;
8614
8615 case 'd':
8616 if (name[3] == 'o')
8617 { /* redo */
8618 return KEY_redo;
8619 }
8620
8621 goto unknown;
8622
8623 default:
8624 goto unknown;
8625 }
8626
8627 default:
8628 goto unknown;
8629 }
8630
8631 case 's':
8632 switch (name[1])
8633 {
8634 case 'e':
8635 switch (name[2])
8636 {
8637 case 'e':
8638 if (name[3] == 'k')
8639 { /* seek */
8640 return -KEY_seek;
8641 }
8642
8643 goto unknown;
8644
8645 case 'n':
8646 if (name[3] == 'd')
8647 { /* send */
8648 return -KEY_send;
8649 }
8650
8651 goto unknown;
8652
8653 default:
8654 goto unknown;
8655 }
8656
8657 case 'o':
8658 if (name[2] == 'r' &&
8659 name[3] == 't')
8660 { /* sort */
8661 return KEY_sort;
8662 }
8663
8664 goto unknown;
8665
8666 case 'q':
8667 if (name[2] == 'r' &&
8668 name[3] == 't')
8669 { /* sqrt */
8670 return -KEY_sqrt;
8671 }
8672
8673 goto unknown;
8674
8675 case 't':
8676 if (name[2] == 'a' &&
8677 name[3] == 't')
8678 { /* stat */
8679 return -KEY_stat;
8680 }
8681
8682 goto unknown;
8683
8684 default:
8685 goto unknown;
8686 }
8687
8688 case 't':
8689 switch (name[1])
8690 {
8691 case 'e':
8692 if (name[2] == 'l' &&
8693 name[3] == 'l')
8694 { /* tell */
8695 return -KEY_tell;
8696 }
8697
8698 goto unknown;
8699
8700 case 'i':
8701 switch (name[2])
8702 {
8703 case 'e':
8704 if (name[3] == 'd')
8705 { /* tied */
8706 return KEY_tied;
8707 }
8708
8709 goto unknown;
8710
8711 case 'm':
8712 if (name[3] == 'e')
8713 { /* time */
8714 return -KEY_time;
8715 }
8716
8717 goto unknown;
8718
8719 default:
8720 goto unknown;
8721 }
8722
8723 default:
8724 goto unknown;
8725 }
8726
8727 case 'w':
0d863452 8728 switch (name[1])
4c3bbe0f 8729 {
0d863452 8730 case 'a':
952306ac
RGS
8731 switch (name[2])
8732 {
8733 case 'i':
8734 if (name[3] == 't')
8735 { /* wait */
8736 return -KEY_wait;
8737 }
4c3bbe0f 8738
952306ac 8739 goto unknown;
4c3bbe0f 8740
952306ac
RGS
8741 case 'r':
8742 if (name[3] == 'n')
8743 { /* warn */
8744 return -KEY_warn;
8745 }
4c3bbe0f 8746
952306ac 8747 goto unknown;
4c3bbe0f 8748
952306ac
RGS
8749 default:
8750 goto unknown;
8751 }
0d863452
RH
8752
8753 case 'h':
8754 if (name[2] == 'e' &&
8755 name[3] == 'n')
8756 { /* when */
5458a98a 8757 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
952306ac 8758 }
4c3bbe0f 8759
952306ac 8760 goto unknown;
4c3bbe0f 8761
952306ac
RGS
8762 default:
8763 goto unknown;
8764 }
4c3bbe0f 8765
0d863452
RH
8766 default:
8767 goto unknown;
8768 }
8769
952306ac 8770 case 5: /* 39 tokens of length 5 */
4c3bbe0f 8771 switch (name[0])
e2e1dd5a 8772 {
4c3bbe0f
MHM
8773 case 'B':
8774 if (name[1] == 'E' &&
8775 name[2] == 'G' &&
8776 name[3] == 'I' &&
8777 name[4] == 'N')
8778 { /* BEGIN */
8779 return KEY_BEGIN;
8780 }
8781
8782 goto unknown;
8783
8784 case 'C':
8785 if (name[1] == 'H' &&
8786 name[2] == 'E' &&
8787 name[3] == 'C' &&
8788 name[4] == 'K')
8789 { /* CHECK */
8790 return KEY_CHECK;
8791 }
8792
8793 goto unknown;
8794
8795 case 'a':
8796 switch (name[1])
8797 {
8798 case 'l':
8799 if (name[2] == 'a' &&
8800 name[3] == 'r' &&
8801 name[4] == 'm')
8802 { /* alarm */
8803 return -KEY_alarm;
8804 }
8805
8806 goto unknown;
8807
8808 case 't':
8809 if (name[2] == 'a' &&
8810 name[3] == 'n' &&
8811 name[4] == '2')
8812 { /* atan2 */
8813 return -KEY_atan2;
8814 }
8815
8816 goto unknown;
8817
8818 default:
8819 goto unknown;
8820 }
8821
8822 case 'b':
0d863452
RH
8823 switch (name[1])
8824 {
8825 case 'l':
8826 if (name[2] == 'e' &&
952306ac
RGS
8827 name[3] == 's' &&
8828 name[4] == 's')
8829 { /* bless */
8830 return -KEY_bless;
8831 }
4c3bbe0f 8832
952306ac 8833 goto unknown;
4c3bbe0f 8834
0d863452
RH
8835 case 'r':
8836 if (name[2] == 'e' &&
8837 name[3] == 'a' &&
8838 name[4] == 'k')
8839 { /* break */
5458a98a 8840 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
0d863452
RH
8841 }
8842
8843 goto unknown;
8844
8845 default:
8846 goto unknown;
8847 }
8848
4c3bbe0f
MHM
8849 case 'c':
8850 switch (name[1])
8851 {
8852 case 'h':
8853 switch (name[2])
8854 {
8855 case 'd':
8856 if (name[3] == 'i' &&
8857 name[4] == 'r')
8858 { /* chdir */
8859 return -KEY_chdir;
8860 }
8861
8862 goto unknown;
8863
8864 case 'm':
8865 if (name[3] == 'o' &&
8866 name[4] == 'd')
8867 { /* chmod */
8868 return -KEY_chmod;
8869 }
8870
8871 goto unknown;
8872
8873 case 'o':
8874 switch (name[3])
8875 {
8876 case 'm':
8877 if (name[4] == 'p')
8878 { /* chomp */
8879 return -KEY_chomp;
8880 }
8881
8882 goto unknown;
8883
8884 case 'w':
8885 if (name[4] == 'n')
8886 { /* chown */
8887 return -KEY_chown;
8888 }
8889
8890 goto unknown;
8891
8892 default:
8893 goto unknown;
8894 }
8895
8896 default:
8897 goto unknown;
8898 }
8899
8900 case 'l':
8901 if (name[2] == 'o' &&
8902 name[3] == 's' &&
8903 name[4] == 'e')
8904 { /* close */
8905 return -KEY_close;
8906 }
8907
8908 goto unknown;
8909
8910 case 'r':
8911 if (name[2] == 'y' &&
8912 name[3] == 'p' &&
8913 name[4] == 't')
8914 { /* crypt */
8915 return -KEY_crypt;
8916 }
8917
8918 goto unknown;
8919
8920 default:
8921 goto unknown;
8922 }
8923
8924 case 'e':
8925 if (name[1] == 'l' &&
8926 name[2] == 's' &&
8927 name[3] == 'i' &&
8928 name[4] == 'f')
8929 { /* elsif */
8930 return KEY_elsif;
8931 }
8932
8933 goto unknown;
8934
8935 case 'f':
8936 switch (name[1])
8937 {
8938 case 'c':
8939 if (name[2] == 'n' &&
8940 name[3] == 't' &&
8941 name[4] == 'l')
8942 { /* fcntl */
8943 return -KEY_fcntl;
8944 }
8945
8946 goto unknown;
8947
8948 case 'l':
8949 if (name[2] == 'o' &&
8950 name[3] == 'c' &&
8951 name[4] == 'k')
8952 { /* flock */
8953 return -KEY_flock;
8954 }
8955
8956 goto unknown;
8957
8958 default:
8959 goto unknown;
8960 }
8961
0d863452
RH
8962 case 'g':
8963 if (name[1] == 'i' &&
8964 name[2] == 'v' &&
8965 name[3] == 'e' &&
8966 name[4] == 'n')
8967 { /* given */
5458a98a 8968 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
0d863452
RH
8969 }
8970
8971 goto unknown;
8972
4c3bbe0f
MHM
8973 case 'i':
8974 switch (name[1])
8975 {
8976 case 'n':
8977 if (name[2] == 'd' &&
8978 name[3] == 'e' &&
8979 name[4] == 'x')
8980 { /* index */
8981 return -KEY_index;
8982 }
8983
8984 goto unknown;
8985
8986 case 'o':
8987 if (name[2] == 'c' &&
8988 name[3] == 't' &&
8989 name[4] == 'l')
8990 { /* ioctl */
8991 return -KEY_ioctl;
8992 }
8993
8994 goto unknown;
8995
8996 default:
8997 goto unknown;
8998 }
8999
9000 case 'l':
9001 switch (name[1])
9002 {
9003 case 'o':
9004 if (name[2] == 'c' &&
9005 name[3] == 'a' &&
9006 name[4] == 'l')
9007 { /* local */
9008 return KEY_local;
9009 }
9010
9011 goto unknown;
9012
9013 case 's':
9014 if (name[2] == 't' &&
9015 name[3] == 'a' &&
9016 name[4] == 't')
9017 { /* lstat */
9018 return -KEY_lstat;
9019 }
9020
9021 goto unknown;
9022
9023 default:
9024 goto unknown;
9025 }
9026
9027 case 'm':
9028 if (name[1] == 'k' &&
9029 name[2] == 'd' &&
9030 name[3] == 'i' &&
9031 name[4] == 'r')
9032 { /* mkdir */
9033 return -KEY_mkdir;
9034 }
9035
9036 goto unknown;
9037
9038 case 'p':
9039 if (name[1] == 'r' &&
9040 name[2] == 'i' &&
9041 name[3] == 'n' &&
9042 name[4] == 't')
9043 { /* print */
9044 return KEY_print;
9045 }
9046
9047 goto unknown;
9048
9049 case 'r':
9050 switch (name[1])
9051 {
9052 case 'e':
9053 if (name[2] == 's' &&
9054 name[3] == 'e' &&
9055 name[4] == 't')
9056 { /* reset */
9057 return -KEY_reset;
9058 }
9059
9060 goto unknown;
9061
9062 case 'm':
9063 if (name[2] == 'd' &&
9064 name[3] == 'i' &&
9065 name[4] == 'r')
9066 { /* rmdir */
9067 return -KEY_rmdir;
9068 }
9069
9070 goto unknown;
9071
9072 default:
9073 goto unknown;
9074 }
9075
9076 case 's':
9077 switch (name[1])
9078 {
9079 case 'e':
9080 if (name[2] == 'm' &&
9081 name[3] == 'o' &&
9082 name[4] == 'p')
9083 { /* semop */
9084 return -KEY_semop;
9085 }
9086
9087 goto unknown;
9088
9089 case 'h':
9090 if (name[2] == 'i' &&
9091 name[3] == 'f' &&
9092 name[4] == 't')
9093 { /* shift */
9094 return -KEY_shift;
9095 }
9096
9097 goto unknown;
9098
9099 case 'l':
9100 if (name[2] == 'e' &&
9101 name[3] == 'e' &&
9102 name[4] == 'p')
9103 { /* sleep */
9104 return -KEY_sleep;
9105 }
9106
9107 goto unknown;
9108
9109 case 'p':
9110 if (name[2] == 'l' &&
9111 name[3] == 'i' &&
9112 name[4] == 't')
9113 { /* split */
9114 return KEY_split;
9115 }
9116
9117 goto unknown;
9118
9119 case 'r':
9120 if (name[2] == 'a' &&
9121 name[3] == 'n' &&
9122 name[4] == 'd')
9123 { /* srand */
9124 return -KEY_srand;
9125 }
9126
9127 goto unknown;
9128
9129 case 't':
952306ac
RGS
9130 switch (name[2])
9131 {
9132 case 'a':
9133 if (name[3] == 't' &&
9134 name[4] == 'e')
9135 { /* state */
5458a98a 9136 return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
952306ac 9137 }
4c3bbe0f 9138
952306ac
RGS
9139 goto unknown;
9140
9141 case 'u':
9142 if (name[3] == 'd' &&
9143 name[4] == 'y')
9144 { /* study */
9145 return KEY_study;
9146 }
9147
9148 goto unknown;
9149
9150 default:
9151 goto unknown;
9152 }
4c3bbe0f
MHM
9153
9154 default:
9155 goto unknown;
9156 }
9157
9158 case 't':
9159 if (name[1] == 'i' &&
9160 name[2] == 'm' &&
9161 name[3] == 'e' &&
9162 name[4] == 's')
9163 { /* times */
9164 return -KEY_times;
9165 }
9166
9167 goto unknown;
9168
9169 case 'u':
9170 switch (name[1])
9171 {
9172 case 'm':
9173 if (name[2] == 'a' &&
9174 name[3] == 's' &&
9175 name[4] == 'k')
9176 { /* umask */
9177 return -KEY_umask;
9178 }
9179
9180 goto unknown;
9181
9182 case 'n':
9183 switch (name[2])
9184 {
9185 case 'd':
9186 if (name[3] == 'e' &&
9187 name[4] == 'f')
9188 { /* undef */
9189 return KEY_undef;
9190 }
9191
9192 goto unknown;
9193
9194 case 't':
9195 if (name[3] == 'i')
9196 {
9197 switch (name[4])
9198 {
9199 case 'e':
9200 { /* untie */
9201 return KEY_untie;
9202 }
9203
4c3bbe0f
MHM
9204 case 'l':
9205 { /* until */
9206 return KEY_until;
9207 }
9208
4c3bbe0f
MHM
9209 default:
9210 goto unknown;
9211 }
9212 }
9213
9214 goto unknown;
9215
9216 default:
9217 goto unknown;
9218 }
9219
9220 case 't':
9221 if (name[2] == 'i' &&
9222 name[3] == 'm' &&
9223 name[4] == 'e')
9224 { /* utime */
9225 return -KEY_utime;
9226 }
9227
9228 goto unknown;
9229
9230 default:
9231 goto unknown;
9232 }
9233
9234 case 'w':
9235 switch (name[1])
9236 {
9237 case 'h':
9238 if (name[2] == 'i' &&
9239 name[3] == 'l' &&
9240 name[4] == 'e')
9241 { /* while */
9242 return KEY_while;
9243 }
9244
9245 goto unknown;
9246
9247 case 'r':
9248 if (name[2] == 'i' &&
9249 name[3] == 't' &&
9250 name[4] == 'e')
9251 { /* write */
9252 return -KEY_write;
9253 }
9254
9255 goto unknown;
9256
9257 default:
9258 goto unknown;
9259 }
9260
9261 default:
9262 goto unknown;
e2e1dd5a 9263 }
4c3bbe0f
MHM
9264
9265 case 6: /* 33 tokens of length 6 */
9266 switch (name[0])
9267 {
9268 case 'a':
9269 if (name[1] == 'c' &&
9270 name[2] == 'c' &&
9271 name[3] == 'e' &&
9272 name[4] == 'p' &&
9273 name[5] == 't')
9274 { /* accept */
9275 return -KEY_accept;
9276 }
9277
9278 goto unknown;
9279
9280 case 'c':
9281 switch (name[1])
9282 {
9283 case 'a':
9284 if (name[2] == 'l' &&
9285 name[3] == 'l' &&
9286 name[4] == 'e' &&
9287 name[5] == 'r')
9288 { /* caller */
9289 return -KEY_caller;
9290 }
9291
9292 goto unknown;
9293
9294 case 'h':
9295 if (name[2] == 'r' &&
9296 name[3] == 'o' &&
9297 name[4] == 'o' &&
9298 name[5] == 't')
9299 { /* chroot */
9300 return -KEY_chroot;
9301 }
9302
9303 goto unknown;
9304
9305 default:
9306 goto unknown;
9307 }
9308
9309 case 'd':
9310 if (name[1] == 'e' &&
9311 name[2] == 'l' &&
9312 name[3] == 'e' &&
9313 name[4] == 't' &&
9314 name[5] == 'e')
9315 { /* delete */
9316 return KEY_delete;
9317 }
9318
9319 goto unknown;
9320
9321 case 'e':
9322 switch (name[1])
9323 {
9324 case 'l':
9325 if (name[2] == 's' &&
9326 name[3] == 'e' &&
9327 name[4] == 'i' &&
9328 name[5] == 'f')
9329 { /* elseif */
9b387841 9330 Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
4c3bbe0f
MHM
9331 }
9332
9333 goto unknown;
9334
9335 case 'x':
9336 if (name[2] == 'i' &&
9337 name[3] == 's' &&
9338 name[4] == 't' &&
9339 name[5] == 's')
9340 { /* exists */
9341 return KEY_exists;
9342 }
9343
9344 goto unknown;
9345
9346 default:
9347 goto unknown;
9348 }
9349
9350 case 'f':
9351 switch (name[1])
9352 {
9353 case 'i':
9354 if (name[2] == 'l' &&
9355 name[3] == 'e' &&
9356 name[4] == 'n' &&
9357 name[5] == 'o')
9358 { /* fileno */
9359 return -KEY_fileno;
9360 }
9361
9362 goto unknown;
9363
9364 case 'o':
9365 if (name[2] == 'r' &&
9366 name[3] == 'm' &&
9367 name[4] == 'a' &&
9368 name[5] == 't')
9369 { /* format */
9370 return KEY_format;
9371 }
9372
9373 goto unknown;
9374
9375 default:
9376 goto unknown;
9377 }
9378
9379 case 'g':
9380 if (name[1] == 'm' &&
9381 name[2] == 't' &&
9382 name[3] == 'i' &&
9383 name[4] == 'm' &&
9384 name[5] == 'e')
9385 { /* gmtime */
9386 return -KEY_gmtime;
9387 }
9388
9389 goto unknown;
9390
9391 case 'l':
9392 switch (name[1])
9393 {
9394 case 'e':
9395 if (name[2] == 'n' &&
9396 name[3] == 'g' &&
9397 name[4] == 't' &&
9398 name[5] == 'h')
9399 { /* length */
9400 return -KEY_length;
9401 }
9402
9403 goto unknown;
9404
9405 case 'i':
9406 if (name[2] == 's' &&
9407 name[3] == 't' &&
9408 name[4] == 'e' &&
9409 name[5] == 'n')
9410 { /* listen */
9411 return -KEY_listen;
9412 }
9413
9414 goto unknown;
9415
9416 default:
9417 goto unknown;
9418 }
9419
9420 case 'm':
9421 if (name[1] == 's' &&
9422 name[2] == 'g')
9423 {
9424 switch (name[3])
9425 {
9426 case 'c':
9427 if (name[4] == 't' &&
9428 name[5] == 'l')
9429 { /* msgctl */
9430 return -KEY_msgctl;
9431 }
9432
9433 goto unknown;
9434
9435 case 'g':
9436 if (name[4] == 'e' &&
9437 name[5] == 't')
9438 { /* msgget */
9439 return -KEY_msgget;
9440 }
9441
9442 goto unknown;
9443
9444 case 'r':
9445 if (name[4] == 'c' &&
9446 name[5] == 'v')
9447 { /* msgrcv */
9448 return -KEY_msgrcv;
9449 }
9450
9451 goto unknown;
9452
9453 case 's':
9454 if (name[4] == 'n' &&
9455 name[5] == 'd')
9456 { /* msgsnd */
9457 return -KEY_msgsnd;
9458 }
9459
9460 goto unknown;
9461
9462 default:
9463 goto unknown;
9464 }
9465 }
9466
9467 goto unknown;
9468
9469 case 'p':
9470 if (name[1] == 'r' &&
9471 name[2] == 'i' &&
9472 name[3] == 'n' &&
9473 name[4] == 't' &&
9474 name[5] == 'f')
9475 { /* printf */
9476 return KEY_printf;
9477 }
9478
9479 goto unknown;
9480
9481 case 'r':
9482 switch (name[1])
9483 {
9484 case 'e':
9485 switch (name[2])
9486 {
9487 case 'n':
9488 if (name[3] == 'a' &&
9489 name[4] == 'm' &&
9490 name[5] == 'e')
9491 { /* rename */
9492 return -KEY_rename;
9493 }
9494
9495 goto unknown;
9496
9497 case 't':
9498 if (name[3] == 'u' &&
9499 name[4] == 'r' &&
9500 name[5] == 'n')
9501 { /* return */
9502 return KEY_return;
9503 }
9504
9505 goto unknown;
9506
9507 default:
9508 goto unknown;
9509 }
9510
9511 case 'i':
9512 if (name[2] == 'n' &&
9513 name[3] == 'd' &&
9514 name[4] == 'e' &&
9515 name[5] == 'x')
9516 { /* rindex */
9517 return -KEY_rindex;
9518 }
9519
9520 goto unknown;
9521
9522 default:
9523 goto unknown;
9524 }
9525
9526 case 's':
9527 switch (name[1])
9528 {
9529 case 'c':
9530 if (name[2] == 'a' &&
9531 name[3] == 'l' &&
9532 name[4] == 'a' &&
9533 name[5] == 'r')
9534 { /* scalar */
9535 return KEY_scalar;
9536 }
9537
9538 goto unknown;
9539
9540 case 'e':
9541 switch (name[2])
9542 {
9543 case 'l':
9544 if (name[3] == 'e' &&
9545 name[4] == 'c' &&
9546 name[5] == 't')
9547 { /* select */
9548 return -KEY_select;
9549 }
9550
9551 goto unknown;
9552
9553 case 'm':
9554 switch (name[3])
9555 {
9556 case 'c':
9557 if (name[4] == 't' &&
9558 name[5] == 'l')
9559 { /* semctl */
9560 return -KEY_semctl;
9561 }
9562
9563 goto unknown;
9564
9565 case 'g':
9566 if (name[4] == 'e' &&
9567 name[5] == 't')
9568 { /* semget */
9569 return -KEY_semget;
9570 }
9571
9572 goto unknown;
9573
9574 default:
9575 goto unknown;
9576 }
9577
9578 default:
9579 goto unknown;
9580 }
9581
9582 case 'h':
9583 if (name[2] == 'm')
9584 {
9585 switch (name[3])
9586 {
9587 case 'c':
9588 if (name[4] == 't' &&
9589 name[5] == 'l')
9590 { /* shmctl */
9591 return -KEY_shmctl;
9592 }
9593
9594 goto unknown;
9595
9596 case 'g':
9597 if (name[4] == 'e' &&
9598 name[5] == 't')
9599 { /* shmget */
9600 return -KEY_shmget;
9601 }
9602
9603 goto unknown;
9604
9605 default:
9606 goto unknown;
9607 }
9608 }
9609
9610 goto unknown;
9611
9612 case 'o':
9613 if (name[2] == 'c' &&
9614 name[3] == 'k' &&
9615 name[4] == 'e' &&
9616 name[5] == 't')
9617 { /* socket */
9618 return -KEY_socket;
9619 }
9620
9621 goto unknown;
9622
9623 case 'p':
9624 if (name[2] == 'l' &&
9625 name[3] == 'i' &&
9626 name[4] == 'c' &&
9627 name[5] == 'e')
9628 { /* splice */
9629 return -KEY_splice;
9630 }
9631
9632 goto unknown;
9633
9634 case 'u':
9635 if (name[2] == 'b' &&
9636 name[3] == 's' &&
9637 name[4] == 't' &&
9638 name[5] == 'r')
9639 { /* substr */
9640 return -KEY_substr;
9641 }
9642
9643 goto unknown;
9644
9645 case 'y':
9646 if (name[2] == 's' &&
9647 name[3] == 't' &&
9648 name[4] == 'e' &&
9649 name[5] == 'm')
9650 { /* system */
9651 return -KEY_system;
9652 }
9653
9654 goto unknown;
9655
9656 default:
9657 goto unknown;
9658 }
9659
9660 case 'u':
9661 if (name[1] == 'n')
9662 {
9663 switch (name[2])
9664 {
9665 case 'l':
9666 switch (name[3])
9667 {
9668 case 'e':
9669 if (name[4] == 's' &&
9670 name[5] == 's')
9671 { /* unless */
9672 return KEY_unless;
9673 }
9674
9675 goto unknown;
9676
9677 case 'i':
9678 if (name[4] == 'n' &&
9679 name[5] == 'k')
9680 { /* unlink */
9681 return -KEY_unlink;
9682 }
9683
9684 goto unknown;
9685
9686 default:
9687 goto unknown;
9688 }
9689
9690 case 'p':
9691 if (name[3] == 'a' &&
9692 name[4] == 'c' &&
9693 name[5] == 'k')
9694 { /* unpack */
9695 return -KEY_unpack;
9696 }
9697
9698 goto unknown;
9699
9700 default:
9701 goto unknown;
9702 }
9703 }
9704
9705 goto unknown;
9706
9707 case 'v':
9708 if (name[1] == 'a' &&
9709 name[2] == 'l' &&
9710 name[3] == 'u' &&
9711 name[4] == 'e' &&
9712 name[5] == 's')
9713 { /* values */
9714 return -KEY_values;
9715 }
9716
9717 goto unknown;
9718
9719 default:
9720 goto unknown;
e2e1dd5a 9721 }
4c3bbe0f 9722
0d863452 9723 case 7: /* 29 tokens of length 7 */
4c3bbe0f
MHM
9724 switch (name[0])
9725 {
9726 case 'D':
9727 if (name[1] == 'E' &&
9728 name[2] == 'S' &&
9729 name[3] == 'T' &&
9730 name[4] == 'R' &&
9731 name[5] == 'O' &&
9732 name[6] == 'Y')
9733 { /* DESTROY */
9734 return KEY_DESTROY;
9735 }
9736
9737 goto unknown;
9738
9739 case '_':
9740 if (name[1] == '_' &&
9741 name[2] == 'E' &&
9742 name[3] == 'N' &&
9743 name[4] == 'D' &&
9744 name[5] == '_' &&
9745 name[6] == '_')
9746 { /* __END__ */
9747 return KEY___END__;
9748 }
9749
9750 goto unknown;
9751
9752 case 'b':
9753 if (name[1] == 'i' &&
9754 name[2] == 'n' &&
9755 name[3] == 'm' &&
9756 name[4] == 'o' &&
9757 name[5] == 'd' &&
9758 name[6] == 'e')
9759 { /* binmode */
9760 return -KEY_binmode;
9761 }
9762
9763 goto unknown;
9764
9765 case 'c':
9766 if (name[1] == 'o' &&
9767 name[2] == 'n' &&
9768 name[3] == 'n' &&
9769 name[4] == 'e' &&
9770 name[5] == 'c' &&
9771 name[6] == 't')
9772 { /* connect */
9773 return -KEY_connect;
9774 }
9775
9776 goto unknown;
9777
9778 case 'd':
9779 switch (name[1])
9780 {
9781 case 'b':
9782 if (name[2] == 'm' &&
9783 name[3] == 'o' &&
9784 name[4] == 'p' &&
9785 name[5] == 'e' &&
9786 name[6] == 'n')
9787 { /* dbmopen */
9788 return -KEY_dbmopen;
9789 }
9790
9791 goto unknown;
9792
9793 case 'e':
0d863452
RH
9794 if (name[2] == 'f')
9795 {
9796 switch (name[3])
9797 {
9798 case 'a':
9799 if (name[4] == 'u' &&
9800 name[5] == 'l' &&
9801 name[6] == 't')
9802 { /* default */
5458a98a 9803 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
0d863452
RH
9804 }
9805
9806 goto unknown;
9807
9808 case 'i':
9809 if (name[4] == 'n' &&
952306ac
RGS
9810 name[5] == 'e' &&
9811 name[6] == 'd')
9812 { /* defined */
9813 return KEY_defined;
9814 }
4c3bbe0f 9815
952306ac 9816 goto unknown;
4c3bbe0f 9817
952306ac
RGS
9818 default:
9819 goto unknown;
9820 }
0d863452
RH
9821 }
9822
9823 goto unknown;
9824
9825 default:
9826 goto unknown;
9827 }
4c3bbe0f
MHM
9828
9829 case 'f':
9830 if (name[1] == 'o' &&
9831 name[2] == 'r' &&
9832 name[3] == 'e' &&
9833 name[4] == 'a' &&
9834 name[5] == 'c' &&
9835 name[6] == 'h')
9836 { /* foreach */
9837 return KEY_foreach;
9838 }
9839
9840 goto unknown;
9841
9842 case 'g':
9843 if (name[1] == 'e' &&
9844 name[2] == 't' &&
9845 name[3] == 'p')
9846 {
9847 switch (name[4])
9848 {
9849 case 'g':
9850 if (name[5] == 'r' &&
9851 name[6] == 'p')
9852 { /* getpgrp */
9853 return -KEY_getpgrp;
9854 }
9855
9856 goto unknown;
9857
9858 case 'p':
9859 if (name[5] == 'i' &&
9860 name[6] == 'd')
9861 { /* getppid */
9862 return -KEY_getppid;
9863 }
9864
9865 goto unknown;
9866
9867 default:
9868 goto unknown;
9869 }
9870 }
9871
9872 goto unknown;
9873
9874 case 'l':
9875 if (name[1] == 'c' &&
9876 name[2] == 'f' &&
9877 name[3] == 'i' &&
9878 name[4] == 'r' &&
9879 name[5] == 's' &&
9880 name[6] == 't')
9881 { /* lcfirst */
9882 return -KEY_lcfirst;
9883 }
9884
9885 goto unknown;
9886
9887 case 'o':
9888 if (name[1] == 'p' &&
9889 name[2] == 'e' &&
9890 name[3] == 'n' &&
9891 name[4] == 'd' &&
9892 name[5] == 'i' &&
9893 name[6] == 'r')
9894 { /* opendir */
9895 return -KEY_opendir;
9896 }
9897
9898 goto unknown;
9899
9900 case 'p':
9901 if (name[1] == 'a' &&
9902 name[2] == 'c' &&
9903 name[3] == 'k' &&
9904 name[4] == 'a' &&
9905 name[5] == 'g' &&
9906 name[6] == 'e')
9907 { /* package */
9908 return KEY_package;
9909 }
9910
9911 goto unknown;
9912
9913 case 'r':
9914 if (name[1] == 'e')
9915 {
9916 switch (name[2])
9917 {
9918 case 'a':
9919 if (name[3] == 'd' &&
9920 name[4] == 'd' &&
9921 name[5] == 'i' &&
9922 name[6] == 'r')
9923 { /* readdir */
9924 return -KEY_readdir;
9925 }
9926
9927 goto unknown;
9928
9929 case 'q':
9930 if (name[3] == 'u' &&
9931 name[4] == 'i' &&
9932 name[5] == 'r' &&
9933 name[6] == 'e')
9934 { /* require */
9935 return KEY_require;
9936 }
9937
9938 goto unknown;
9939
9940 case 'v':
9941 if (name[3] == 'e' &&
9942 name[4] == 'r' &&
9943 name[5] == 's' &&
9944 name[6] == 'e')
9945 { /* reverse */
9946 return -KEY_reverse;
9947 }
9948
9949 goto unknown;
9950
9951 default:
9952 goto unknown;
9953 }
9954 }
9955
9956 goto unknown;
9957
9958 case 's':
9959 switch (name[1])
9960 {
9961 case 'e':
9962 switch (name[2])
9963 {
9964 case 'e':
9965 if (name[3] == 'k' &&
9966 name[4] == 'd' &&
9967 name[5] == 'i' &&
9968 name[6] == 'r')
9969 { /* seekdir */
9970 return -KEY_seekdir;
9971 }
9972
9973 goto unknown;
9974
9975 case 't':
9976 if (name[3] == 'p' &&
9977 name[4] == 'g' &&
9978 name[5] == 'r' &&
9979 name[6] == 'p')
9980 { /* setpgrp */
9981 return -KEY_setpgrp;
9982 }
9983
9984 goto unknown;
9985
9986 default:
9987 goto unknown;
9988 }
9989
9990 case 'h':
9991 if (name[2] == 'm' &&
9992 name[3] == 'r' &&
9993 name[4] == 'e' &&
9994 name[5] == 'a' &&
9995 name[6] == 'd')
9996 { /* shmread */
9997 return -KEY_shmread;
9998 }
9999
10000 goto unknown;
10001
10002 case 'p':
10003 if (name[2] == 'r' &&
10004 name[3] == 'i' &&
10005 name[4] == 'n' &&
10006 name[5] == 't' &&
10007 name[6] == 'f')
10008 { /* sprintf */
10009 return -KEY_sprintf;
10010 }
10011
10012 goto unknown;
10013
10014 case 'y':
10015 switch (name[2])
10016 {
10017 case 'm':
10018 if (name[3] == 'l' &&
10019 name[4] == 'i' &&
10020 name[5] == 'n' &&
10021 name[6] == 'k')
10022 { /* symlink */
10023 return -KEY_symlink;
10024 }
10025
10026 goto unknown;
10027
10028 case 's':
10029 switch (name[3])
10030 {
10031 case 'c':
10032 if (name[4] == 'a' &&
10033 name[5] == 'l' &&
10034 name[6] == 'l')
10035 { /* syscall */
10036 return -KEY_syscall;
10037 }
10038
10039 goto unknown;
10040
10041 case 'o':
10042 if (name[4] == 'p' &&
10043 name[5] == 'e' &&
10044 name[6] == 'n')
10045 { /* sysopen */
10046 return -KEY_sysopen;
10047 }
10048
10049 goto unknown;
10050
10051 case 'r':
10052 if (name[4] == 'e' &&
10053 name[5] == 'a' &&
10054 name[6] == 'd')
10055 { /* sysread */
10056 return -KEY_sysread;
10057 }
10058
10059 goto unknown;
10060
10061 case 's':
10062 if (name[4] == 'e' &&
10063 name[5] == 'e' &&
10064 name[6] == 'k')
10065 { /* sysseek */
10066 return -KEY_sysseek;
10067 }
10068
10069 goto unknown;
10070
10071 default:
10072 goto unknown;
10073 }
10074
10075 default:
10076 goto unknown;
10077 }
10078
10079 default:
10080 goto unknown;
10081 }
10082
10083 case 't':
10084 if (name[1] == 'e' &&
10085 name[2] == 'l' &&
10086 name[3] == 'l' &&
10087 name[4] == 'd' &&
10088 name[5] == 'i' &&
10089 name[6] == 'r')
10090 { /* telldir */
10091 return -KEY_telldir;
10092 }
10093
10094 goto unknown;
10095
10096 case 'u':
10097 switch (name[1])
10098 {
10099 case 'c':
10100 if (name[2] == 'f' &&
10101 name[3] == 'i' &&
10102 name[4] == 'r' &&
10103 name[5] == 's' &&
10104 name[6] == 't')
10105 { /* ucfirst */
10106 return -KEY_ucfirst;
10107 }
10108
10109 goto unknown;
10110
10111 case 'n':
10112 if (name[2] == 's' &&
10113 name[3] == 'h' &&
10114 name[4] == 'i' &&
10115 name[5] == 'f' &&
10116 name[6] == 't')
10117 { /* unshift */
10118 return -KEY_unshift;
10119 }
10120
10121 goto unknown;
10122
10123 default:
10124 goto unknown;
10125 }
10126
10127 case 'w':
10128 if (name[1] == 'a' &&
10129 name[2] == 'i' &&
10130 name[3] == 't' &&
10131 name[4] == 'p' &&
10132 name[5] == 'i' &&
10133 name[6] == 'd')
10134 { /* waitpid */
10135 return -KEY_waitpid;
10136 }
10137
10138 goto unknown;
10139
10140 default:
10141 goto unknown;
10142 }
10143
10144 case 8: /* 26 tokens of length 8 */
10145 switch (name[0])
10146 {
10147 case 'A':
10148 if (name[1] == 'U' &&
10149 name[2] == 'T' &&
10150 name[3] == 'O' &&
10151 name[4] == 'L' &&
10152 name[5] == 'O' &&
10153 name[6] == 'A' &&
10154 name[7] == 'D')
10155 { /* AUTOLOAD */
10156 return KEY_AUTOLOAD;
10157 }
10158
10159 goto unknown;
10160
10161 case '_':
10162 if (name[1] == '_')
10163 {
10164 switch (name[2])
10165 {
10166 case 'D':
10167 if (name[3] == 'A' &&
10168 name[4] == 'T' &&
10169 name[5] == 'A' &&
10170 name[6] == '_' &&
10171 name[7] == '_')
10172 { /* __DATA__ */
10173 return KEY___DATA__;
10174 }
10175
10176 goto unknown;
10177
10178 case 'F':
10179 if (name[3] == 'I' &&
10180 name[4] == 'L' &&
10181 name[5] == 'E' &&
10182 name[6] == '_' &&
10183 name[7] == '_')
10184 { /* __FILE__ */
10185 return -KEY___FILE__;
10186 }
10187
10188 goto unknown;
10189
10190 case 'L':
10191 if (name[3] == 'I' &&
10192 name[4] == 'N' &&
10193 name[5] == 'E' &&
10194 name[6] == '_' &&
10195 name[7] == '_')
10196 { /* __LINE__ */
10197 return -KEY___LINE__;
10198 }
10199
10200 goto unknown;
10201
10202 default:
10203 goto unknown;
10204 }
10205 }
10206
10207 goto unknown;
10208
10209 case 'c':
10210 switch (name[1])
10211 {
10212 case 'l':
10213 if (name[2] == 'o' &&
10214 name[3] == 's' &&
10215 name[4] == 'e' &&
10216 name[5] == 'd' &&
10217 name[6] == 'i' &&
10218 name[7] == 'r')
10219 { /* closedir */
10220 return -KEY_closedir;
10221 }
10222
10223 goto unknown;
10224
10225 case 'o':
10226 if (name[2] == 'n' &&
10227 name[3] == 't' &&
10228 name[4] == 'i' &&
10229 name[5] == 'n' &&
10230 name[6] == 'u' &&
10231 name[7] == 'e')
10232 { /* continue */
10233 return -KEY_continue;
10234 }
10235
10236 goto unknown;
10237
10238 default:
10239 goto unknown;
10240 }
10241
10242 case 'd':
10243 if (name[1] == 'b' &&
10244 name[2] == 'm' &&
10245 name[3] == 'c' &&
10246 name[4] == 'l' &&
10247 name[5] == 'o' &&
10248 name[6] == 's' &&
10249 name[7] == 'e')
10250 { /* dbmclose */
10251 return -KEY_dbmclose;
10252 }
10253
10254 goto unknown;
10255
10256 case 'e':
10257 if (name[1] == 'n' &&
10258 name[2] == 'd')
10259 {
10260 switch (name[3])
10261 {
10262 case 'g':
10263 if (name[4] == 'r' &&
10264 name[5] == 'e' &&
10265 name[6] == 'n' &&
10266 name[7] == 't')
10267 { /* endgrent */
10268 return -KEY_endgrent;
10269 }
10270
10271 goto unknown;
10272
10273 case 'p':
10274 if (name[4] == 'w' &&
10275 name[5] == 'e' &&
10276 name[6] == 'n' &&
10277 name[7] == 't')
10278 { /* endpwent */
10279 return -KEY_endpwent;
10280 }
10281
10282 goto unknown;
10283
10284 default:
10285 goto unknown;
10286 }
10287 }
10288
10289 goto unknown;
10290
10291 case 'f':
10292 if (name[1] == 'o' &&
10293 name[2] == 'r' &&
10294 name[3] == 'm' &&
10295 name[4] == 'l' &&
10296 name[5] == 'i' &&
10297 name[6] == 'n' &&
10298 name[7] == 'e')
10299 { /* formline */
10300 return -KEY_formline;
10301 }
10302
10303 goto unknown;
10304
10305 case 'g':
10306 if (name[1] == 'e' &&
10307 name[2] == 't')
10308 {
10309 switch (name[3])
10310 {
10311 case 'g':
10312 if (name[4] == 'r')
10313 {
10314 switch (name[5])
10315 {
10316 case 'e':
10317 if (name[6] == 'n' &&
10318 name[7] == 't')
10319 { /* getgrent */
10320 return -KEY_getgrent;
10321 }
10322
10323 goto unknown;
10324
10325 case 'g':
10326 if (name[6] == 'i' &&
10327 name[7] == 'd')
10328 { /* getgrgid */
10329 return -KEY_getgrgid;
10330 }
10331
10332 goto unknown;
10333
10334 case 'n':
10335 if (name[6] == 'a' &&
10336 name[7] == 'm')
10337 { /* getgrnam */
10338 return -KEY_getgrnam;
10339 }
10340
10341 goto unknown;
10342
10343 default:
10344 goto unknown;
10345 }
10346 }
10347
10348 goto unknown;
10349
10350 case 'l':
10351 if (name[4] == 'o' &&
10352 name[5] == 'g' &&
10353 name[6] == 'i' &&
10354 name[7] == 'n')
10355 { /* getlogin */
10356 return -KEY_getlogin;
10357 }
10358
10359 goto unknown;
10360
10361 case 'p':
10362 if (name[4] == 'w')
10363 {
10364 switch (name[5])
10365 {
10366 case 'e':
10367 if (name[6] == 'n' &&
10368 name[7] == 't')
10369 { /* getpwent */
10370 return -KEY_getpwent;
10371 }
10372
10373 goto unknown;
10374
10375 case 'n':
10376 if (name[6] == 'a' &&
10377 name[7] == 'm')
10378 { /* getpwnam */
10379 return -KEY_getpwnam;
10380 }
10381
10382 goto unknown;
10383
10384 case 'u':
10385 if (name[6] == 'i' &&
10386 name[7] == 'd')
10387 { /* getpwuid */
10388 return -KEY_getpwuid;
10389 }
10390
10391 goto unknown;
10392
10393 default:
10394 goto unknown;
10395 }
10396 }
10397
10398 goto unknown;
10399
10400 default:
10401 goto unknown;
10402 }
10403 }
10404
10405 goto unknown;
10406
10407 case 'r':
10408 if (name[1] == 'e' &&
10409 name[2] == 'a' &&
10410 name[3] == 'd')
10411 {
10412 switch (name[4])
10413 {
10414 case 'l':
10415 if (name[5] == 'i' &&
10416 name[6] == 'n')
10417 {
10418 switch (name[7])
10419 {
10420 case 'e':
10421 { /* readline */
10422 return -KEY_readline;
10423 }
10424
4c3bbe0f
MHM
10425 case 'k':
10426 { /* readlink */
10427 return -KEY_readlink;
10428 }
10429
4c3bbe0f
MHM
10430 default:
10431 goto unknown;
10432 }
10433 }
10434
10435 goto unknown;
10436
10437 case 'p':
10438 if (name[5] == 'i' &&
10439 name[6] == 'p' &&
10440 name[7] == 'e')
10441 { /* readpipe */
10442 return -KEY_readpipe;
10443 }
10444
10445 goto unknown;
10446
10447 default:
10448 goto unknown;
10449 }
10450 }
10451
10452 goto unknown;
10453
10454 case 's':
10455 switch (name[1])
10456 {
10457 case 'e':
10458 if (name[2] == 't')
10459 {
10460 switch (name[3])
10461 {
10462 case 'g':
10463 if (name[4] == 'r' &&
10464 name[5] == 'e' &&
10465 name[6] == 'n' &&
10466 name[7] == 't')
10467 { /* setgrent */
10468 return -KEY_setgrent;
10469 }
10470
10471 goto unknown;
10472
10473 case 'p':
10474 if (name[4] == 'w' &&
10475 name[5] == 'e' &&
10476 name[6] == 'n' &&
10477 name[7] == 't')
10478 { /* setpwent */
10479 return -KEY_setpwent;
10480 }
10481
10482 goto unknown;
10483
10484 default:
10485 goto unknown;
10486 }
10487 }
10488
10489 goto unknown;
10490
10491 case 'h':
10492 switch (name[2])
10493 {
10494 case 'm':
10495 if (name[3] == 'w' &&
10496 name[4] == 'r' &&
10497 name[5] == 'i' &&
10498 name[6] == 't' &&
10499 name[7] == 'e')
10500 { /* shmwrite */
10501 return -KEY_shmwrite;
10502 }
10503
10504 goto unknown;
10505
10506 case 'u':
10507 if (name[3] == 't' &&
10508 name[4] == 'd' &&
10509 name[5] == 'o' &&
10510 name[6] == 'w' &&
10511 name[7] == 'n')
10512 { /* shutdown */
10513 return -KEY_shutdown;
10514 }
10515
10516 goto unknown;
10517
10518 default:
10519 goto unknown;
10520 }
10521
10522 case 'y':
10523 if (name[2] == 's' &&
10524 name[3] == 'w' &&
10525 name[4] == 'r' &&
10526 name[5] == 'i' &&
10527 name[6] == 't' &&
10528 name[7] == 'e')
10529 { /* syswrite */
10530 return -KEY_syswrite;
10531 }
10532
10533 goto unknown;
10534
10535 default:
10536 goto unknown;
10537 }
10538
10539 case 't':
10540 if (name[1] == 'r' &&
10541 name[2] == 'u' &&
10542 name[3] == 'n' &&
10543 name[4] == 'c' &&
10544 name[5] == 'a' &&
10545 name[6] == 't' &&
10546 name[7] == 'e')
10547 { /* truncate */
10548 return -KEY_truncate;
10549 }
10550
10551 goto unknown;
10552
10553 default:
10554 goto unknown;
10555 }
10556
3c10abe3 10557 case 9: /* 9 tokens of length 9 */
4c3bbe0f
MHM
10558 switch (name[0])
10559 {
3c10abe3
AG
10560 case 'U':
10561 if (name[1] == 'N' &&
10562 name[2] == 'I' &&
10563 name[3] == 'T' &&
10564 name[4] == 'C' &&
10565 name[5] == 'H' &&
10566 name[6] == 'E' &&
10567 name[7] == 'C' &&
10568 name[8] == 'K')
10569 { /* UNITCHECK */
10570 return KEY_UNITCHECK;
10571 }
10572
10573 goto unknown;
10574
4c3bbe0f
MHM
10575 case 'e':
10576 if (name[1] == 'n' &&
10577 name[2] == 'd' &&
10578 name[3] == 'n' &&
10579 name[4] == 'e' &&
10580 name[5] == 't' &&
10581 name[6] == 'e' &&
10582 name[7] == 'n' &&
10583 name[8] == 't')
10584 { /* endnetent */
10585 return -KEY_endnetent;
10586 }
10587
10588 goto unknown;
10589
10590 case 'g':
10591 if (name[1] == 'e' &&
10592 name[2] == 't' &&
10593 name[3] == 'n' &&
10594 name[4] == 'e' &&
10595 name[5] == 't' &&
10596 name[6] == 'e' &&
10597 name[7] == 'n' &&
10598 name[8] == 't')
10599 { /* getnetent */
10600 return -KEY_getnetent;
10601 }
10602
10603 goto unknown;
10604
10605 case 'l':
10606 if (name[1] == 'o' &&
10607 name[2] == 'c' &&
10608 name[3] == 'a' &&
10609 name[4] == 'l' &&
10610 name[5] == 't' &&
10611 name[6] == 'i' &&
10612 name[7] == 'm' &&
10613 name[8] == 'e')
10614 { /* localtime */
10615 return -KEY_localtime;
10616 }
10617
10618 goto unknown;
10619
10620 case 'p':
10621 if (name[1] == 'r' &&
10622 name[2] == 'o' &&
10623 name[3] == 't' &&
10624 name[4] == 'o' &&
10625 name[5] == 't' &&
10626 name[6] == 'y' &&
10627 name[7] == 'p' &&
10628 name[8] == 'e')
10629 { /* prototype */
10630 return KEY_prototype;
10631 }
10632
10633 goto unknown;
10634
10635 case 'q':
10636 if (name[1] == 'u' &&
10637 name[2] == 'o' &&
10638 name[3] == 't' &&
10639 name[4] == 'e' &&
10640 name[5] == 'm' &&
10641 name[6] == 'e' &&
10642 name[7] == 't' &&
10643 name[8] == 'a')
10644 { /* quotemeta */
10645 return -KEY_quotemeta;
10646 }
10647
10648 goto unknown;
10649
10650 case 'r':
10651 if (name[1] == 'e' &&
10652 name[2] == 'w' &&
10653 name[3] == 'i' &&
10654 name[4] == 'n' &&
10655 name[5] == 'd' &&
10656 name[6] == 'd' &&
10657 name[7] == 'i' &&
10658 name[8] == 'r')
10659 { /* rewinddir */
10660 return -KEY_rewinddir;
10661 }
10662
10663 goto unknown;
10664
10665 case 's':
10666 if (name[1] == 'e' &&
10667 name[2] == 't' &&
10668 name[3] == 'n' &&
10669 name[4] == 'e' &&
10670 name[5] == 't' &&
10671 name[6] == 'e' &&
10672 name[7] == 'n' &&
10673 name[8] == 't')
10674 { /* setnetent */
10675 return -KEY_setnetent;
10676 }
10677
10678 goto unknown;
10679
10680 case 'w':
10681 if (name[1] == 'a' &&
10682 name[2] == 'n' &&
10683 name[3] == 't' &&
10684 name[4] == 'a' &&
10685 name[5] == 'r' &&
10686 name[6] == 'r' &&
10687 name[7] == 'a' &&
10688 name[8] == 'y')
10689 { /* wantarray */
10690 return -KEY_wantarray;
10691 }
10692
10693 goto unknown;
10694
10695 default:
10696 goto unknown;
10697 }
10698
10699 case 10: /* 9 tokens of length 10 */
10700 switch (name[0])
10701 {
10702 case 'e':
10703 if (name[1] == 'n' &&
10704 name[2] == 'd')
10705 {
10706 switch (name[3])
10707 {
10708 case 'h':
10709 if (name[4] == 'o' &&
10710 name[5] == 's' &&
10711 name[6] == 't' &&
10712 name[7] == 'e' &&
10713 name[8] == 'n' &&
10714 name[9] == 't')
10715 { /* endhostent */
10716 return -KEY_endhostent;
10717 }
10718
10719 goto unknown;
10720
10721 case 's':
10722 if (name[4] == 'e' &&
10723 name[5] == 'r' &&
10724 name[6] == 'v' &&
10725 name[7] == 'e' &&
10726 name[8] == 'n' &&
10727 name[9] == 't')
10728 { /* endservent */
10729 return -KEY_endservent;
10730 }
10731
10732 goto unknown;
10733
10734 default:
10735 goto unknown;
10736 }
10737 }
10738
10739 goto unknown;
10740
10741 case 'g':
10742 if (name[1] == 'e' &&
10743 name[2] == 't')
10744 {
10745 switch (name[3])
10746 {
10747 case 'h':
10748 if (name[4] == 'o' &&
10749 name[5] == 's' &&
10750 name[6] == 't' &&
10751 name[7] == 'e' &&
10752 name[8] == 'n' &&
10753 name[9] == 't')
10754 { /* gethostent */
10755 return -KEY_gethostent;
10756 }
10757
10758 goto unknown;
10759
10760 case 's':
10761 switch (name[4])
10762 {
10763 case 'e':
10764 if (name[5] == 'r' &&
10765 name[6] == 'v' &&
10766 name[7] == 'e' &&
10767 name[8] == 'n' &&
10768 name[9] == 't')
10769 { /* getservent */
10770 return -KEY_getservent;
10771 }
10772
10773 goto unknown;
10774
10775 case 'o':
10776 if (name[5] == 'c' &&
10777 name[6] == 'k' &&
10778 name[7] == 'o' &&
10779 name[8] == 'p' &&
10780 name[9] == 't')
10781 { /* getsockopt */
10782 return -KEY_getsockopt;
10783 }
10784
10785 goto unknown;
10786
10787 default:
10788 goto unknown;
10789 }
10790
10791 default:
10792 goto unknown;
10793 }
10794 }
10795
10796 goto unknown;
10797
10798 case 's':
10799 switch (name[1])
10800 {
10801 case 'e':
10802 if (name[2] == 't')
10803 {
10804 switch (name[3])
10805 {
10806 case 'h':
10807 if (name[4] == 'o' &&
10808 name[5] == 's' &&
10809 name[6] == 't' &&
10810 name[7] == 'e' &&
10811 name[8] == 'n' &&
10812 name[9] == 't')
10813 { /* sethostent */
10814 return -KEY_sethostent;
10815 }
10816
10817 goto unknown;
10818
10819 case 's':
10820 switch (name[4])
10821 {
10822 case 'e':
10823 if (name[5] == 'r' &&
10824 name[6] == 'v' &&
10825 name[7] == 'e' &&
10826 name[8] == 'n' &&
10827 name[9] == 't')
10828 { /* setservent */
10829 return -KEY_setservent;
10830 }
10831
10832 goto unknown;
10833
10834 case 'o':
10835 if (name[5] == 'c' &&
10836 name[6] == 'k' &&
10837 name[7] == 'o' &&
10838 name[8] == 'p' &&
10839 name[9] == 't')
10840 { /* setsockopt */
10841 return -KEY_setsockopt;
10842 }
10843
10844 goto unknown;
10845
10846 default:
10847 goto unknown;
10848 }
10849
10850 default:
10851 goto unknown;
10852 }
10853 }
10854
10855 goto unknown;
10856
10857 case 'o':
10858 if (name[2] == 'c' &&
10859 name[3] == 'k' &&
10860 name[4] == 'e' &&
10861 name[5] == 't' &&
10862 name[6] == 'p' &&
10863 name[7] == 'a' &&
10864 name[8] == 'i' &&
10865 name[9] == 'r')
10866 { /* socketpair */
10867 return -KEY_socketpair;
10868 }
10869
10870 goto unknown;
10871
10872 default:
10873 goto unknown;
10874 }
10875
10876 default:
10877 goto unknown;
e2e1dd5a 10878 }
4c3bbe0f
MHM
10879
10880 case 11: /* 8 tokens of length 11 */
10881 switch (name[0])
10882 {
10883 case '_':
10884 if (name[1] == '_' &&
10885 name[2] == 'P' &&
10886 name[3] == 'A' &&
10887 name[4] == 'C' &&
10888 name[5] == 'K' &&
10889 name[6] == 'A' &&
10890 name[7] == 'G' &&
10891 name[8] == 'E' &&
10892 name[9] == '_' &&
10893 name[10] == '_')
10894 { /* __PACKAGE__ */
10895 return -KEY___PACKAGE__;
10896 }
10897
10898 goto unknown;
10899
10900 case 'e':
10901 if (name[1] == 'n' &&
10902 name[2] == 'd' &&
10903 name[3] == 'p' &&
10904 name[4] == 'r' &&
10905 name[5] == 'o' &&
10906 name[6] == 't' &&
10907 name[7] == 'o' &&
10908 name[8] == 'e' &&
10909 name[9] == 'n' &&
10910 name[10] == 't')
10911 { /* endprotoent */
10912 return -KEY_endprotoent;
10913 }
10914
10915 goto unknown;
10916
10917 case 'g':
10918 if (name[1] == 'e' &&
10919 name[2] == 't')
10920 {
10921 switch (name[3])
10922 {
10923 case 'p':
10924 switch (name[4])
10925 {
10926 case 'e':
10927 if (name[5] == 'e' &&
10928 name[6] == 'r' &&
10929 name[7] == 'n' &&
10930 name[8] == 'a' &&
10931 name[9] == 'm' &&
10932 name[10] == 'e')
10933 { /* getpeername */
10934 return -KEY_getpeername;
10935 }
10936
10937 goto unknown;
10938
10939 case 'r':
10940 switch (name[5])
10941 {
10942 case 'i':
10943 if (name[6] == 'o' &&
10944 name[7] == 'r' &&
10945 name[8] == 'i' &&
10946 name[9] == 't' &&
10947 name[10] == 'y')
10948 { /* getpriority */
10949 return -KEY_getpriority;
10950 }
10951
10952 goto unknown;
10953
10954 case 'o':
10955 if (name[6] == 't' &&
10956 name[7] == 'o' &&
10957 name[8] == 'e' &&
10958 name[9] == 'n' &&
10959 name[10] == 't')
10960 { /* getprotoent */
10961 return -KEY_getprotoent;
10962 }
10963
10964 goto unknown;
10965
10966 default:
10967 goto unknown;
10968 }
10969
10970 default:
10971 goto unknown;
10972 }
10973
10974 case 's':
10975 if (name[4] == 'o' &&
10976 name[5] == 'c' &&
10977 name[6] == 'k' &&
10978 name[7] == 'n' &&
10979 name[8] == 'a' &&
10980 name[9] == 'm' &&
10981 name[10] == 'e')
10982 { /* getsockname */
10983 return -KEY_getsockname;
10984 }
10985
10986 goto unknown;
10987
10988 default:
10989 goto unknown;
10990 }
10991 }
10992
10993 goto unknown;
10994
10995 case 's':
10996 if (name[1] == 'e' &&
10997 name[2] == 't' &&
10998 name[3] == 'p' &&
10999 name[4] == 'r')
11000 {
11001 switch (name[5])
11002 {
11003 case 'i':
11004 if (name[6] == 'o' &&
11005 name[7] == 'r' &&
11006 name[8] == 'i' &&
11007 name[9] == 't' &&
11008 name[10] == 'y')
11009 { /* setpriority */
11010 return -KEY_setpriority;
11011 }
11012
11013 goto unknown;
11014
11015 case 'o':
11016 if (name[6] == 't' &&
11017 name[7] == 'o' &&
11018 name[8] == 'e' &&
11019 name[9] == 'n' &&
11020 name[10] == 't')
11021 { /* setprotoent */
11022 return -KEY_setprotoent;
11023 }
11024
11025 goto unknown;
11026
11027 default:
11028 goto unknown;
11029 }
11030 }
11031
11032 goto unknown;
11033
11034 default:
11035 goto unknown;
e2e1dd5a 11036 }
4c3bbe0f
MHM
11037
11038 case 12: /* 2 tokens of length 12 */
11039 if (name[0] == 'g' &&
11040 name[1] == 'e' &&
11041 name[2] == 't' &&
11042 name[3] == 'n' &&
11043 name[4] == 'e' &&
11044 name[5] == 't' &&
11045 name[6] == 'b' &&
11046 name[7] == 'y')
11047 {
11048 switch (name[8])
11049 {
11050 case 'a':
11051 if (name[9] == 'd' &&
11052 name[10] == 'd' &&
11053 name[11] == 'r')
11054 { /* getnetbyaddr */
11055 return -KEY_getnetbyaddr;
11056 }
11057
11058 goto unknown;
11059
11060 case 'n':
11061 if (name[9] == 'a' &&
11062 name[10] == 'm' &&
11063 name[11] == 'e')
11064 { /* getnetbyname */
11065 return -KEY_getnetbyname;
11066 }
11067
11068 goto unknown;
11069
11070 default:
11071 goto unknown;
11072 }
e2e1dd5a 11073 }
4c3bbe0f
MHM
11074
11075 goto unknown;
11076
11077 case 13: /* 4 tokens of length 13 */
11078 if (name[0] == 'g' &&
11079 name[1] == 'e' &&
11080 name[2] == 't')
11081 {
11082 switch (name[3])
11083 {
11084 case 'h':
11085 if (name[4] == 'o' &&
11086 name[5] == 's' &&
11087 name[6] == 't' &&
11088 name[7] == 'b' &&
11089 name[8] == 'y')
11090 {
11091 switch (name[9])
11092 {
11093 case 'a':
11094 if (name[10] == 'd' &&
11095 name[11] == 'd' &&
11096 name[12] == 'r')
11097 { /* gethostbyaddr */
11098 return -KEY_gethostbyaddr;
11099 }
11100
11101 goto unknown;
11102
11103 case 'n':
11104 if (name[10] == 'a' &&
11105 name[11] == 'm' &&
11106 name[12] == 'e')
11107 { /* gethostbyname */
11108 return -KEY_gethostbyname;
11109 }
11110
11111 goto unknown;
11112
11113 default:
11114 goto unknown;
11115 }
11116 }
11117
11118 goto unknown;
11119
11120 case 's':
11121 if (name[4] == 'e' &&
11122 name[5] == 'r' &&
11123 name[6] == 'v' &&
11124 name[7] == 'b' &&
11125 name[8] == 'y')
11126 {
11127 switch (name[9])
11128 {
11129 case 'n':
11130 if (name[10] == 'a' &&
11131 name[11] == 'm' &&
11132 name[12] == 'e')
11133 { /* getservbyname */
11134 return -KEY_getservbyname;
11135 }
11136
11137 goto unknown;
11138
11139 case 'p':
11140 if (name[10] == 'o' &&
11141 name[11] == 'r' &&
11142 name[12] == 't')
11143 { /* getservbyport */
11144 return -KEY_getservbyport;
11145 }
11146
11147 goto unknown;
11148
11149 default:
11150 goto unknown;
11151 }
11152 }
11153
11154 goto unknown;
11155
11156 default:
11157 goto unknown;
11158 }
e2e1dd5a 11159 }
4c3bbe0f
MHM
11160
11161 goto unknown;
11162
11163 case 14: /* 1 tokens of length 14 */
11164 if (name[0] == 'g' &&
11165 name[1] == 'e' &&
11166 name[2] == 't' &&
11167 name[3] == 'p' &&
11168 name[4] == 'r' &&
11169 name[5] == 'o' &&
11170 name[6] == 't' &&
11171 name[7] == 'o' &&
11172 name[8] == 'b' &&
11173 name[9] == 'y' &&
11174 name[10] == 'n' &&
11175 name[11] == 'a' &&
11176 name[12] == 'm' &&
11177 name[13] == 'e')
11178 { /* getprotobyname */
11179 return -KEY_getprotobyname;
11180 }
11181
11182 goto unknown;
11183
11184 case 16: /* 1 tokens of length 16 */
11185 if (name[0] == 'g' &&
11186 name[1] == 'e' &&
11187 name[2] == 't' &&
11188 name[3] == 'p' &&
11189 name[4] == 'r' &&
11190 name[5] == 'o' &&
11191 name[6] == 't' &&
11192 name[7] == 'o' &&
11193 name[8] == 'b' &&
11194 name[9] == 'y' &&
11195 name[10] == 'n' &&
11196 name[11] == 'u' &&
11197 name[12] == 'm' &&
11198 name[13] == 'b' &&
11199 name[14] == 'e' &&
11200 name[15] == 'r')
11201 { /* getprotobynumber */
11202 return -KEY_getprotobynumber;
11203 }
11204
11205 goto unknown;
11206
11207 default:
11208 goto unknown;
e2e1dd5a 11209 }
4c3bbe0f
MHM
11210
11211unknown:
e2e1dd5a 11212 return 0;
a687059c
LW
11213}
11214
76e3520e 11215STATIC void
c94115d8 11216S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
a687059c 11217{
97aff369 11218 dVAR;
2f3197b3 11219
7918f24d
NC
11220 PERL_ARGS_ASSERT_CHECKCOMMA;
11221
d008e5eb 11222 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
11223 if (ckWARN(WARN_SYNTAX)) {
11224 int level = 1;
26ff0806 11225 const char *w;
d008e5eb
GS
11226 for (w = s+2; *w && level; w++) {
11227 if (*w == '(')
11228 ++level;
11229 else if (*w == ')')
11230 --level;
11231 }
888fea98
NC
11232 while (isSPACE(*w))
11233 ++w;
b1439985
RGS
11234 /* the list of chars below is for end of statements or
11235 * block / parens, boolean operators (&&, ||, //) and branch
11236 * constructs (or, and, if, until, unless, while, err, for).
11237 * Not a very solid hack... */
11238 if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
9014280d 11239 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 11240 "%s (...) interpreted as function",name);
d008e5eb 11241 }
2f3197b3 11242 }
3280af22 11243 while (s < PL_bufend && isSPACE(*s))
2f3197b3 11244 s++;
a687059c
LW
11245 if (*s == '(')
11246 s++;
3280af22 11247 while (s < PL_bufend && isSPACE(*s))
a687059c 11248 s++;
7e2040f0 11249 if (isIDFIRST_lazy_if(s,UTF)) {
26ff0806 11250 const char * const w = s++;
7e2040f0 11251 while (isALNUM_lazy_if(s,UTF))
a687059c 11252 s++;
3280af22 11253 while (s < PL_bufend && isSPACE(*s))
a687059c 11254 s++;
e929a76b 11255 if (*s == ',') {
c94115d8 11256 GV* gv;
5458a98a 11257 if (keyword(w, s - w, 0))
e929a76b 11258 return;
c94115d8
NC
11259
11260 gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
11261 if (gv && GvCVu(gv))
abbb3198 11262 return;
cea2e8a9 11263 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
11264 }
11265 }
11266}
11267
423cee85
JH
11268/* Either returns sv, or mortalizes sv and returns a new SV*.
11269 Best used as sv=new_constant(..., sv, ...).
11270 If s, pv are NULL, calls subroutine with one argument,
11271 and type is used with error messages only. */
11272
b3ac6de7 11273STATIC SV *
eb0d8d16
NC
11274S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen,
11275 SV *sv, SV *pv, const char *type, STRLEN typelen)
b3ac6de7 11276{
27da23d5 11277 dVAR; dSP;
890ce7af 11278 HV * const table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 11279 SV *res;
b3ac6de7
IZ
11280 SV **cvp;
11281 SV *cv, *typesv;
89e33a05 11282 const char *why1 = "", *why2 = "", *why3 = "";
4e553d73 11283
7918f24d
NC
11284 PERL_ARGS_ASSERT_NEW_CONSTANT;
11285
f0af216f 11286 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
11287 SV *msg;
11288
10edeb5d
JH
11289 why2 = (const char *)
11290 (strEQ(key,"charnames")
11291 ? "(possibly a missing \"use charnames ...\")"
11292 : "");
4e553d73 11293 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
11294 (type ? type: "undef"), why2);
11295
11296 /* This is convoluted and evil ("goto considered harmful")
11297 * but I do not understand the intricacies of all the different
11298 * failure modes of %^H in here. The goal here is to make
11299 * the most probable error message user-friendly. --jhi */
11300
11301 goto msgdone;
11302
423cee85 11303 report:
4e553d73 11304 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 11305 (type ? type: "undef"), why1, why2, why3);
41ab332f 11306 msgdone:
95a20fc0 11307 yyerror(SvPVX_const(msg));
423cee85
JH
11308 SvREFCNT_dec(msg);
11309 return sv;
11310 }
eb0d8d16 11311 cvp = hv_fetch(table, key, keylen, FALSE);
b3ac6de7 11312 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
11313 why1 = "$^H{";
11314 why2 = key;
f0af216f 11315 why3 = "} is not defined";
423cee85 11316 goto report;
b3ac6de7
IZ
11317 }
11318 sv_2mortal(sv); /* Parent created it permanently */
11319 cv = *cvp;
423cee85 11320 if (!pv && s)
59cd0e26 11321 pv = newSVpvn_flags(s, len, SVs_TEMP);
423cee85 11322 if (type && pv)
59cd0e26 11323 typesv = newSVpvn_flags(type, typelen, SVs_TEMP);
b3ac6de7 11324 else
423cee85 11325 typesv = &PL_sv_undef;
4e553d73 11326
e788e7d3 11327 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
11328 ENTER ;
11329 SAVETMPS;
4e553d73 11330
423cee85 11331 PUSHMARK(SP) ;
a5845cb7 11332 EXTEND(sp, 3);
423cee85
JH
11333 if (pv)
11334 PUSHs(pv);
b3ac6de7 11335 PUSHs(sv);
423cee85
JH
11336 if (pv)
11337 PUSHs(typesv);
b3ac6de7 11338 PUTBACK;
423cee85 11339 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 11340
423cee85 11341 SPAGAIN ;
4e553d73 11342
423cee85 11343 /* Check the eval first */
9b0e499b 11344 if (!PL_in_eval && SvTRUE(ERRSV)) {
396482e1 11345 sv_catpvs(ERRSV, "Propagated");
8b6b16e7 11346 yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
e1f15930 11347 (void)POPs;
b37c2d43 11348 res = SvREFCNT_inc_simple(sv);
423cee85
JH
11349 }
11350 else {
11351 res = POPs;
b37c2d43 11352 SvREFCNT_inc_simple_void(res);
423cee85 11353 }
4e553d73 11354
423cee85
JH
11355 PUTBACK ;
11356 FREETMPS ;
11357 LEAVE ;
b3ac6de7 11358 POPSTACK;
4e553d73 11359
b3ac6de7 11360 if (!SvOK(res)) {
423cee85
JH
11361 why1 = "Call to &{$^H{";
11362 why2 = key;
f0af216f 11363 why3 = "}} did not return a defined value";
423cee85
JH
11364 sv = res;
11365 goto report;
9b0e499b 11366 }
423cee85 11367
9b0e499b 11368 return res;
b3ac6de7 11369}
4e553d73 11370
d0a148a6
NC
11371/* Returns a NUL terminated string, with the length of the string written to
11372 *slp
11373 */
76e3520e 11374STATIC char *
cea2e8a9 11375S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2 11376{
97aff369 11377 dVAR;
463ee0b2 11378 register char *d = dest;
890ce7af 11379 register char * const e = d + destlen - 3; /* two-character token, ending NUL */
7918f24d
NC
11380
11381 PERL_ARGS_ASSERT_SCAN_WORD;
11382
463ee0b2 11383 for (;;) {
8903cb82 11384 if (d >= e)
cea2e8a9 11385 Perl_croak(aTHX_ ident_too_long);
834a4ddd 11386 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 11387 *d++ = *s++;
c35e046a 11388 else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
11389 *d++ = ':';
11390 *d++ = ':';
11391 s++;
11392 }
c35e046a 11393 else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
463ee0b2
LW
11394 *d++ = *s++;
11395 *d++ = *s++;
11396 }
fd400ab9 11397 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 11398 char *t = s + UTF8SKIP(s);
c35e046a 11399 size_t len;
fd400ab9 11400 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3 11401 t += UTF8SKIP(t);
c35e046a
AL
11402 len = t - s;
11403 if (d + len > e)
cea2e8a9 11404 Perl_croak(aTHX_ ident_too_long);
c35e046a
AL
11405 Copy(s, d, len, char);
11406 d += len;
a0ed51b3
LW
11407 s = t;
11408 }
463ee0b2
LW
11409 else {
11410 *d = '\0';
11411 *slp = d - dest;
11412 return s;
e929a76b 11413 }
378cc40b
LW
11414 }
11415}
11416
76e3520e 11417STATIC char *
f54cb97a 11418S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b 11419{
97aff369 11420 dVAR;
6136c704 11421 char *bracket = NULL;
748a9306 11422 char funny = *s++;
6136c704 11423 register char *d = dest;
0b3da58d 11424 register char * const e = d + destlen - 3; /* two-character token, ending NUL */
378cc40b 11425
7918f24d
NC
11426 PERL_ARGS_ASSERT_SCAN_IDENT;
11427
a0d0e21e 11428 if (isSPACE(*s))
29595ff2 11429 s = PEEKSPACE(s);
de3bb511 11430 if (isDIGIT(*s)) {
8903cb82 11431 while (isDIGIT(*s)) {
11432 if (d >= e)
cea2e8a9 11433 Perl_croak(aTHX_ ident_too_long);
378cc40b 11434 *d++ = *s++;
8903cb82 11435 }
378cc40b
LW
11436 }
11437 else {
463ee0b2 11438 for (;;) {
8903cb82 11439 if (d >= e)
cea2e8a9 11440 Perl_croak(aTHX_ ident_too_long);
834a4ddd 11441 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 11442 *d++ = *s++;
7e2040f0 11443 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
11444 *d++ = ':';
11445 *d++ = ':';
11446 s++;
11447 }
a0d0e21e 11448 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
11449 *d++ = *s++;
11450 *d++ = *s++;
11451 }
fd400ab9 11452 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 11453 char *t = s + UTF8SKIP(s);
fd400ab9 11454 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
11455 t += UTF8SKIP(t);
11456 if (d + (t - s) > e)
cea2e8a9 11457 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
11458 Copy(s, d, t - s, char);
11459 d += t - s;
11460 s = t;
11461 }
463ee0b2
LW
11462 else
11463 break;
11464 }
378cc40b
LW
11465 }
11466 *d = '\0';
11467 d = dest;
79072805 11468 if (*d) {
3280af22
NIS
11469 if (PL_lex_state != LEX_NORMAL)
11470 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 11471 return s;
378cc40b 11472 }
748a9306 11473 if (*s == '$' && s[1] &&
3792a11b 11474 (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
5cd24f17 11475 {
4810e5ec 11476 return s;
5cd24f17 11477 }
79072805
LW
11478 if (*s == '{') {
11479 bracket = s;
11480 s++;
11481 }
11482 else if (ck_uni)
11483 check_uni();
93a17b20 11484 if (s < send)
79072805
LW
11485 *d = *s++;
11486 d[1] = '\0';
2b92dfce 11487 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 11488 *d = toCTRL(*s);
11489 s++;
de3bb511 11490 }
79072805 11491 if (bracket) {
748a9306 11492 if (isSPACE(s[-1])) {
fa83b5b6 11493 while (s < send) {
f54cb97a 11494 const char ch = *s++;
bf4acbe4 11495 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 11496 *d = ch;
11497 break;
11498 }
11499 }
748a9306 11500 }
7e2040f0 11501 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 11502 d++;
a0ed51b3 11503 if (UTF) {
6136c704
AL
11504 char *end = s;
11505 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
11506 end += UTF8SKIP(end);
11507 while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
11508 end += UTF8SKIP(end);
a0ed51b3 11509 }
6136c704
AL
11510 Copy(s, d, end - s, char);
11511 d += end - s;
11512 s = end;
a0ed51b3
LW
11513 }
11514 else {
2b92dfce 11515 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 11516 *d++ = *s++;
2b92dfce 11517 if (d >= e)
cea2e8a9 11518 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 11519 }
79072805 11520 *d = '\0';
c35e046a
AL
11521 while (s < send && SPACE_OR_TAB(*s))
11522 s++;
ff68c719 11523 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
5458a98a 11524 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
10edeb5d
JH
11525 const char * const brack =
11526 (const char *)
11527 ((*s == '[') ? "[...]" : "{...}");
9014280d 11528 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 11529 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
11530 funny, dest, brack, funny, dest, brack);
11531 }
79072805 11532 bracket++;
a0be28da 11533 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
11534 return s;
11535 }
4e553d73
NIS
11536 }
11537 /* Handle extended ${^Foo} variables
2b92dfce
GS
11538 * 1999-02-27 mjd-perl-patch@plover.com */
11539 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
11540 && isALNUM(*s))
11541 {
11542 d++;
11543 while (isALNUM(*s) && d < e) {
11544 *d++ = *s++;
11545 }
11546 if (d >= e)
cea2e8a9 11547 Perl_croak(aTHX_ ident_too_long);
2b92dfce 11548 *d = '\0';
79072805
LW
11549 }
11550 if (*s == '}') {
11551 s++;
7df0d042 11552 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 11553 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
11554 PL_expect = XREF;
11555 }
d008e5eb 11556 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 11557 if (ckWARN(WARN_AMBIGUOUS) &&
780a5241
NC
11558 (keyword(dest, d - dest, 0)
11559 || get_cvn_flags(dest, d - dest, 0)))
d008e5eb 11560 {
c35e046a
AL
11561 if (funny == '#')
11562 funny = '@';
9014280d 11563 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
11564 "Ambiguous use of %c{%s} resolved to %c%s",
11565 funny, dest, funny, dest);
11566 }
11567 }
79072805
LW
11568 }
11569 else {
11570 s = bracket; /* let the parser handle it */
93a17b20 11571 *dest = '\0';
79072805
LW
11572 }
11573 }
3280af22
NIS
11574 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
11575 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
11576 return s;
11577}
11578
879d0c72
NC
11579static U32
11580S_pmflag(U32 pmfl, const char ch) {
11581 switch (ch) {
11582 CASE_STD_PMMOD_FLAGS_PARSE_SET(&pmfl);
11583 case GLOBAL_PAT_MOD: pmfl |= PMf_GLOBAL; break;
11584 case CONTINUE_PAT_MOD: pmfl |= PMf_CONTINUE; break;
11585 case ONCE_PAT_MOD: pmfl |= PMf_KEEP; break;
11586 case KEEPCOPY_PAT_MOD: pmfl |= PMf_KEEPCOPY; break;
11587 }
11588 return pmfl;
11589}
11590
cea2e8a9 11591void
2b36a5a0 11592Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 11593{
7918f24d
NC
11594 PERL_ARGS_ASSERT_PMFLAG;
11595
879d0c72
NC
11596 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
11597 "Perl_pmflag() is deprecated, and will be removed from the XS API");
11598
cde0cee5 11599 if (ch<256) {
879d0c72 11600 *pmfl = S_pmflag(*pmfl, (char)ch);
cde0cee5 11601 }
a0d0e21e 11602}
378cc40b 11603
76e3520e 11604STATIC char *
cea2e8a9 11605S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 11606{
97aff369 11607 dVAR;
79072805 11608 PMOP *pm;
5db06880 11609 char *s = scan_str(start,!!PL_madskills,FALSE);
10edeb5d 11610 const char * const valid_flags =
a20207d7 11611 (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
5db06880
NC
11612#ifdef PERL_MAD
11613 char *modstart;
11614#endif
11615
7918f24d 11616 PERL_ARGS_ASSERT_SCAN_PAT;
378cc40b 11617
25c09cbf 11618 if (!s) {
6136c704 11619 const char * const delimiter = skipspace(start);
10edeb5d
JH
11620 Perl_croak(aTHX_
11621 (const char *)
11622 (*delimiter == '?'
11623 ? "Search pattern not terminated or ternary operator parsed as search pattern"
11624 : "Search pattern not terminated" ));
25c09cbf 11625 }
bbce6d69 11626
8782bef2 11627 pm = (PMOP*)newPMOP(type, 0);
ad639bfb
NC
11628 if (PL_multi_open == '?') {
11629 /* This is the only point in the code that sets PMf_ONCE: */
79072805 11630 pm->op_pmflags |= PMf_ONCE;
ad639bfb
NC
11631
11632 /* Hence it's safe to do this bit of PMOP book-keeping here, which
11633 allows us to restrict the list needed by reset to just the ??
11634 matches. */
11635 assert(type != OP_TRANS);
11636 if (PL_curstash) {
daba3364 11637 MAGIC *mg = mg_find((const SV *)PL_curstash, PERL_MAGIC_symtab);
ad639bfb
NC
11638 U32 elements;
11639 if (!mg) {
daba3364 11640 mg = sv_magicext(MUTABLE_SV(PL_curstash), 0, PERL_MAGIC_symtab, 0, 0,
ad639bfb
NC
11641 0);
11642 }
11643 elements = mg->mg_len / sizeof(PMOP**);
11644 Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
11645 ((PMOP**)mg->mg_ptr) [elements++] = pm;
11646 mg->mg_len = elements * sizeof(PMOP**);
11647 PmopSTASH_set(pm,PL_curstash);
11648 }
11649 }
5db06880
NC
11650#ifdef PERL_MAD
11651 modstart = s;
11652#endif
6136c704 11653 while (*s && strchr(valid_flags, *s))
879d0c72 11654 pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
5db06880
NC
11655#ifdef PERL_MAD
11656 if (PL_madskills && modstart != s) {
11657 SV* tmptoken = newSVpvn(modstart, s - modstart);
11658 append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
11659 }
11660#endif
4ac733c9 11661 /* issue a warning if /c is specified,but /g is not */
a2a5de95 11662 if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
4ac733c9 11663 {
a2a5de95
NC
11664 Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),
11665 "Use of /c modifier is meaningless without /g" );
4ac733c9
MJD
11666 }
11667
3280af22 11668 PL_lex_op = (OP*)pm;
6154021b 11669 pl_yylval.ival = OP_MATCH;
378cc40b
LW
11670 return s;
11671}
11672
76e3520e 11673STATIC char *
cea2e8a9 11674S_scan_subst(pTHX_ char *start)
79072805 11675{
27da23d5 11676 dVAR;
a0d0e21e 11677 register char *s;
79072805 11678 register PMOP *pm;
4fdae800 11679 I32 first_start;
79072805 11680 I32 es = 0;
5db06880
NC
11681#ifdef PERL_MAD
11682 char *modstart;
11683#endif
79072805 11684
7918f24d
NC
11685 PERL_ARGS_ASSERT_SCAN_SUBST;
11686
6154021b 11687 pl_yylval.ival = OP_NULL;
79072805 11688
5db06880 11689 s = scan_str(start,!!PL_madskills,FALSE);
79072805 11690
37fd879b 11691 if (!s)
cea2e8a9 11692 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 11693
3280af22 11694 if (s[-1] == PL_multi_open)
79072805 11695 s--;
5db06880
NC
11696#ifdef PERL_MAD
11697 if (PL_madskills) {
cd81e915
NC
11698 CURMAD('q', PL_thisopen);
11699 CURMAD('_', PL_thiswhite);
11700 CURMAD('E', PL_thisstuff);
11701 CURMAD('Q', PL_thisclose);
11702 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
11703 }
11704#endif
79072805 11705
3280af22 11706 first_start = PL_multi_start;
5db06880 11707 s = scan_str(s,!!PL_madskills,FALSE);
79072805 11708 if (!s) {
37fd879b 11709 if (PL_lex_stuff) {
3280af22 11710 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 11711 PL_lex_stuff = NULL;
37fd879b 11712 }
cea2e8a9 11713 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 11714 }
3280af22 11715 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 11716
79072805 11717 pm = (PMOP*)newPMOP(OP_SUBST, 0);
5db06880
NC
11718
11719#ifdef PERL_MAD
11720 if (PL_madskills) {
cd81e915
NC
11721 CURMAD('z', PL_thisopen);
11722 CURMAD('R', PL_thisstuff);
11723 CURMAD('Z', PL_thisclose);
5db06880
NC
11724 }
11725 modstart = s;
11726#endif
11727
48c036b1 11728 while (*s) {
a20207d7 11729 if (*s == EXEC_PAT_MOD) {
a687059c 11730 s++;
2f3197b3 11731 es++;
a687059c 11732 }
a20207d7 11733 else if (strchr(S_PAT_MODS, *s))
879d0c72 11734 pm->op_pmflags = S_pmflag(pm->op_pmflags, *s++);
48c036b1
GS
11735 else
11736 break;
378cc40b 11737 }
79072805 11738
5db06880
NC
11739#ifdef PERL_MAD
11740 if (PL_madskills) {
11741 if (modstart != s)
11742 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
11743 append_madprops(PL_thismad, (OP*)pm, 0);
11744 PL_thismad = 0;
5db06880
NC
11745 }
11746#endif
a2a5de95
NC
11747 if ((pm->op_pmflags & PMf_CONTINUE)) {
11748 Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
4ac733c9
MJD
11749 }
11750
79072805 11751 if (es) {
6136c704
AL
11752 SV * const repl = newSVpvs("");
11753
0244c3a4
GS
11754 PL_sublex_info.super_bufptr = s;
11755 PL_sublex_info.super_bufend = PL_bufend;
11756 PL_multi_end = 0;
79072805 11757 pm->op_pmflags |= PMf_EVAL;
a5849ce5
NC
11758 while (es-- > 0) {
11759 if (es)
11760 sv_catpvs(repl, "eval ");
11761 else
11762 sv_catpvs(repl, "do ");
11763 }
6f43d98f 11764 sv_catpvs(repl, "{");
3280af22 11765 sv_catsv(repl, PL_lex_repl);
9badc361
RGS
11766 if (strchr(SvPVX(PL_lex_repl), '#'))
11767 sv_catpvs(repl, "\n");
11768 sv_catpvs(repl, "}");
25da4f38 11769 SvEVALED_on(repl);
3280af22
NIS
11770 SvREFCNT_dec(PL_lex_repl);
11771 PL_lex_repl = repl;
378cc40b 11772 }
79072805 11773
3280af22 11774 PL_lex_op = (OP*)pm;
6154021b 11775 pl_yylval.ival = OP_SUBST;
378cc40b
LW
11776 return s;
11777}
11778
76e3520e 11779STATIC char *
cea2e8a9 11780S_scan_trans(pTHX_ char *start)
378cc40b 11781{
97aff369 11782 dVAR;
a0d0e21e 11783 register char* s;
11343788 11784 OP *o;
79072805 11785 short *tbl;
b84c11c8
NC
11786 U8 squash;
11787 U8 del;
11788 U8 complement;
5db06880
NC
11789#ifdef PERL_MAD
11790 char *modstart;
11791#endif
79072805 11792
7918f24d
NC
11793 PERL_ARGS_ASSERT_SCAN_TRANS;
11794
6154021b 11795 pl_yylval.ival = OP_NULL;
79072805 11796
5db06880 11797 s = scan_str(start,!!PL_madskills,FALSE);
37fd879b 11798 if (!s)
cea2e8a9 11799 Perl_croak(aTHX_ "Transliteration pattern not terminated");
5db06880 11800
3280af22 11801 if (s[-1] == PL_multi_open)
2f3197b3 11802 s--;
5db06880
NC
11803#ifdef PERL_MAD
11804 if (PL_madskills) {
cd81e915
NC
11805 CURMAD('q', PL_thisopen);
11806 CURMAD('_', PL_thiswhite);
11807 CURMAD('E', PL_thisstuff);
11808 CURMAD('Q', PL_thisclose);
11809 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
11810 }
11811#endif
2f3197b3 11812
5db06880 11813 s = scan_str(s,!!PL_madskills,FALSE);
79072805 11814 if (!s) {
37fd879b 11815 if (PL_lex_stuff) {
3280af22 11816 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 11817 PL_lex_stuff = NULL;
37fd879b 11818 }
cea2e8a9 11819 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 11820 }
5db06880 11821 if (PL_madskills) {
cd81e915
NC
11822 CURMAD('z', PL_thisopen);
11823 CURMAD('R', PL_thisstuff);
11824 CURMAD('Z', PL_thisclose);
5db06880 11825 }
79072805 11826
a0ed51b3 11827 complement = del = squash = 0;
5db06880
NC
11828#ifdef PERL_MAD
11829 modstart = s;
11830#endif
7a1e2023
NC
11831 while (1) {
11832 switch (*s) {
11833 case 'c':
79072805 11834 complement = OPpTRANS_COMPLEMENT;
7a1e2023
NC
11835 break;
11836 case 'd':
a0ed51b3 11837 del = OPpTRANS_DELETE;
7a1e2023
NC
11838 break;
11839 case 's':
79072805 11840 squash = OPpTRANS_SQUASH;
7a1e2023
NC
11841 break;
11842 default:
11843 goto no_more;
11844 }
395c3793
LW
11845 s++;
11846 }
7a1e2023 11847 no_more:
8973db79 11848
aa1f7c5b 11849 tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
8973db79 11850 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
11851 o->op_private &= ~OPpTRANS_ALL;
11852 o->op_private |= del|squash|complement|
7948272d
NIS
11853 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
11854 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 11855
3280af22 11856 PL_lex_op = o;
6154021b 11857 pl_yylval.ival = OP_TRANS;
5db06880
NC
11858
11859#ifdef PERL_MAD
11860 if (PL_madskills) {
11861 if (modstart != s)
11862 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
11863 append_madprops(PL_thismad, o, 0);
11864 PL_thismad = 0;
5db06880
NC
11865 }
11866#endif
11867
79072805
LW
11868 return s;
11869}
11870
76e3520e 11871STATIC char *
cea2e8a9 11872S_scan_heredoc(pTHX_ register char *s)
79072805 11873{
97aff369 11874 dVAR;
79072805
LW
11875 SV *herewas;
11876 I32 op_type = OP_SCALAR;
11877 I32 len;
11878 SV *tmpstr;
11879 char term;
73d840c0 11880 const char *found_newline;
79072805 11881 register char *d;
fc36a67e 11882 register char *e;
4633a7c4 11883 char *peek;
f54cb97a 11884 const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
5db06880
NC
11885#ifdef PERL_MAD
11886 I32 stuffstart = s - SvPVX(PL_linestr);
11887 char *tstart;
11888
cd81e915 11889 PL_realtokenstart = -1;
5db06880 11890#endif
79072805 11891
7918f24d
NC
11892 PERL_ARGS_ASSERT_SCAN_HEREDOC;
11893
79072805 11894 s += 2;
3280af22
NIS
11895 d = PL_tokenbuf;
11896 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 11897 if (!outer)
79072805 11898 *d++ = '\n';
c35e046a
AL
11899 peek = s;
11900 while (SPACE_OR_TAB(*peek))
11901 peek++;
3792a11b 11902 if (*peek == '`' || *peek == '\'' || *peek =='"') {
4633a7c4 11903 s = peek;
79072805 11904 term = *s++;
3280af22 11905 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 11906 d += len;
3280af22 11907 if (s < PL_bufend)
79072805 11908 s++;
79072805
LW
11909 }
11910 else {
11911 if (*s == '\\')
11912 s++, term = '\'';
11913 else
11914 term = '"';
7e2040f0 11915 if (!isALNUM_lazy_if(s,UTF))
8ab8f082 11916 deprecate("bare << to mean <<\"\"");
7e2040f0 11917 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 11918 if (d < e)
11919 *d++ = *s;
11920 }
11921 }
3280af22 11922 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 11923 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
11924 *d++ = '\n';
11925 *d = '\0';
3280af22 11926 len = d - PL_tokenbuf;
5db06880
NC
11927
11928#ifdef PERL_MAD
11929 if (PL_madskills) {
11930 tstart = PL_tokenbuf + !outer;
cd81e915 11931 PL_thisclose = newSVpvn(tstart, len - !outer);
5db06880 11932 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915 11933 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11934 stuffstart = s - SvPVX(PL_linestr);
11935 }
11936#endif
6a27c188 11937#ifndef PERL_STRICT_CR
f63a84b2
LW
11938 d = strchr(s, '\r');
11939 if (d) {
b464bac0 11940 char * const olds = s;
f63a84b2 11941 s = d;
3280af22 11942 while (s < PL_bufend) {
f63a84b2
LW
11943 if (*s == '\r') {
11944 *d++ = '\n';
11945 if (*++s == '\n')
11946 s++;
11947 }
11948 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
11949 *d++ = *s++;
11950 s++;
11951 }
11952 else
11953 *d++ = *s++;
11954 }
11955 *d = '\0';
3280af22 11956 PL_bufend = d;
95a20fc0 11957 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2
LW
11958 s = olds;
11959 }
11960#endif
5db06880
NC
11961#ifdef PERL_MAD
11962 found_newline = 0;
11963#endif
10edeb5d 11964 if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
73d840c0
AL
11965 herewas = newSVpvn(s,PL_bufend-s);
11966 }
11967 else {
5db06880
NC
11968#ifdef PERL_MAD
11969 herewas = newSVpvn(s-1,found_newline-s+1);
11970#else
73d840c0
AL
11971 s--;
11972 herewas = newSVpvn(s,found_newline-s);
5db06880 11973#endif
73d840c0 11974 }
5db06880
NC
11975#ifdef PERL_MAD
11976 if (PL_madskills) {
11977 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11978 if (PL_thisstuff)
11979 sv_catpvn(PL_thisstuff, tstart, s - tstart);
5db06880 11980 else
cd81e915 11981 PL_thisstuff = newSVpvn(tstart, s - tstart);
5db06880
NC
11982 }
11983#endif
79072805 11984 s += SvCUR(herewas);
748a9306 11985
5db06880
NC
11986#ifdef PERL_MAD
11987 stuffstart = s - SvPVX(PL_linestr);
11988
11989 if (found_newline)
11990 s--;
11991#endif
11992
7d0a29fe
NC
11993 tmpstr = newSV_type(SVt_PVIV);
11994 SvGROW(tmpstr, 80);
748a9306 11995 if (term == '\'') {
79072805 11996 op_type = OP_CONST;
45977657 11997 SvIV_set(tmpstr, -1);
748a9306
LW
11998 }
11999 else if (term == '`') {
79072805 12000 op_type = OP_BACKTICK;
45977657 12001 SvIV_set(tmpstr, '\\');
748a9306 12002 }
79072805
LW
12003
12004 CLINE;
57843af0 12005 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
12006 PL_multi_open = PL_multi_close = '<';
12007 term = *PL_tokenbuf;
0244c3a4 12008 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6136c704
AL
12009 char * const bufptr = PL_sublex_info.super_bufptr;
12010 char * const bufend = PL_sublex_info.super_bufend;
b464bac0 12011 char * const olds = s - SvCUR(herewas);
0244c3a4
GS
12012 s = strchr(bufptr, '\n');
12013 if (!s)
12014 s = bufend;
12015 d = s;
12016 while (s < bufend &&
12017 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
12018 if (*s++ == '\n')
57843af0 12019 CopLINE_inc(PL_curcop);
0244c3a4
GS
12020 }
12021 if (s >= bufend) {
eb160463 12022 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
12023 missingterm(PL_tokenbuf);
12024 }
12025 sv_setpvn(herewas,bufptr,d-bufptr+1);
12026 sv_setpvn(tmpstr,d+1,s-d);
12027 s += len - 1;
12028 sv_catpvn(herewas,s,bufend-s);
95a20fc0 12029 Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
0244c3a4
GS
12030
12031 s = olds;
12032 goto retval;
12033 }
12034 else if (!outer) {
79072805 12035 d = s;
3280af22
NIS
12036 while (s < PL_bufend &&
12037 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 12038 if (*s++ == '\n')
57843af0 12039 CopLINE_inc(PL_curcop);
79072805 12040 }
3280af22 12041 if (s >= PL_bufend) {
eb160463 12042 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 12043 missingterm(PL_tokenbuf);
79072805
LW
12044 }
12045 sv_setpvn(tmpstr,d+1,s-d);
5db06880
NC
12046#ifdef PERL_MAD
12047 if (PL_madskills) {
cd81e915
NC
12048 if (PL_thisstuff)
12049 sv_catpvn(PL_thisstuff, d + 1, s - d);
5db06880 12050 else
cd81e915 12051 PL_thisstuff = newSVpvn(d + 1, s - d);
5db06880
NC
12052 stuffstart = s - SvPVX(PL_linestr);
12053 }
12054#endif
79072805 12055 s += len - 1;
57843af0 12056 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 12057
3280af22
NIS
12058 sv_catpvn(herewas,s,PL_bufend-s);
12059 sv_setsv(PL_linestr,herewas);
12060 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
12061 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 12062 PL_last_lop = PL_last_uni = NULL;
79072805
LW
12063 }
12064 else
76f68e9b 12065 sv_setpvs(tmpstr,""); /* avoid "uninitialized" warning */
3280af22 12066 while (s >= PL_bufend) { /* multiple line string? */
5db06880
NC
12067#ifdef PERL_MAD
12068 if (PL_madskills) {
12069 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
12070 if (PL_thisstuff)
12071 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 12072 else
cd81e915 12073 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
12074 }
12075#endif
f0e67a1d 12076 PL_bufptr = s;
17cc9359 12077 CopLINE_inc(PL_curcop);
f0e67a1d 12078 if (!outer || !lex_next_chunk(0)) {
eb160463 12079 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 12080 missingterm(PL_tokenbuf);
79072805 12081 }
17cc9359 12082 CopLINE_dec(PL_curcop);
f0e67a1d 12083 s = PL_bufptr;
5db06880
NC
12084#ifdef PERL_MAD
12085 stuffstart = s - SvPVX(PL_linestr);
12086#endif
57843af0 12087 CopLINE_inc(PL_curcop);
3280af22 12088 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 12089 PL_last_lop = PL_last_uni = NULL;
6a27c188 12090#ifndef PERL_STRICT_CR
3280af22 12091 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
12092 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
12093 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 12094 {
3280af22
NIS
12095 PL_bufend[-2] = '\n';
12096 PL_bufend--;
95a20fc0 12097 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2 12098 }
3280af22
NIS
12099 else if (PL_bufend[-1] == '\r')
12100 PL_bufend[-1] = '\n';
f63a84b2 12101 }
3280af22
NIS
12102 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
12103 PL_bufend[-1] = '\n';
f63a84b2 12104#endif
3280af22 12105 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
95a20fc0 12106 STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
1de9afcd 12107 *(SvPVX(PL_linestr) + off ) = ' ';
3280af22
NIS
12108 sv_catsv(PL_linestr,herewas);
12109 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1de9afcd 12110 s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
79072805
LW
12111 }
12112 else {
3280af22
NIS
12113 s = PL_bufend;
12114 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
12115 }
12116 }
79072805 12117 s++;
0244c3a4 12118retval:
57843af0 12119 PL_multi_end = CopLINE(PL_curcop);
79072805 12120 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
1da4ca5f 12121 SvPV_shrink_to_cur(tmpstr);
79072805 12122 }
8990e307 12123 SvREFCNT_dec(herewas);
2f31ce75 12124 if (!IN_BYTES) {
95a20fc0 12125 if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
2f31ce75
JH
12126 SvUTF8_on(tmpstr);
12127 else if (PL_encoding)
12128 sv_recode_to_utf8(tmpstr, PL_encoding);
12129 }
3280af22 12130 PL_lex_stuff = tmpstr;
6154021b 12131 pl_yylval.ival = op_type;
79072805
LW
12132 return s;
12133}
12134
02aa26ce
NT
12135/* scan_inputsymbol
12136 takes: current position in input buffer
12137 returns: new position in input buffer
6154021b 12138 side-effects: pl_yylval and lex_op are set.
02aa26ce
NT
12139
12140 This code handles:
12141
12142 <> read from ARGV
12143 <FH> read from filehandle
12144 <pkg::FH> read from package qualified filehandle
12145 <pkg'FH> read from package qualified filehandle
12146 <$fh> read from filehandle in $fh
12147 <*.h> filename glob
12148
12149*/
12150
76e3520e 12151STATIC char *
cea2e8a9 12152S_scan_inputsymbol(pTHX_ char *start)
79072805 12153{
97aff369 12154 dVAR;
02aa26ce 12155 register char *s = start; /* current position in buffer */
1b420867 12156 char *end;
79072805 12157 I32 len;
6136c704
AL
12158 char *d = PL_tokenbuf; /* start of temp holding space */
12159 const char * const e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
12160
7918f24d
NC
12161 PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL;
12162
1b420867
GS
12163 end = strchr(s, '\n');
12164 if (!end)
12165 end = PL_bufend;
12166 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
12167
12168 /* die if we didn't have space for the contents of the <>,
1b420867 12169 or if it didn't end, or if we see a newline
02aa26ce
NT
12170 */
12171
bb7a0f54 12172 if (len >= (I32)sizeof PL_tokenbuf)
cea2e8a9 12173 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 12174 if (s >= end)
cea2e8a9 12175 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 12176
fc36a67e 12177 s++;
02aa26ce
NT
12178
12179 /* check for <$fh>
12180 Remember, only scalar variables are interpreted as filehandles by
12181 this code. Anything more complex (e.g., <$fh{$num}>) will be
12182 treated as a glob() call.
12183 This code makes use of the fact that except for the $ at the front,
12184 a scalar variable and a filehandle look the same.
12185 */
4633a7c4 12186 if (*d == '$' && d[1]) d++;
02aa26ce
NT
12187
12188 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 12189 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 12190 d++;
02aa26ce
NT
12191
12192 /* If we've tried to read what we allow filehandles to look like, and
12193 there's still text left, then it must be a glob() and not a getline.
12194 Use scan_str to pull out the stuff between the <> and treat it
12195 as nothing more than a string.
12196 */
12197
3280af22 12198 if (d - PL_tokenbuf != len) {
6154021b 12199 pl_yylval.ival = OP_GLOB;
5db06880 12200 s = scan_str(start,!!PL_madskills,FALSE);
79072805 12201 if (!s)
cea2e8a9 12202 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
12203 return s;
12204 }
395c3793 12205 else {
9b3023bc 12206 bool readline_overriden = FALSE;
6136c704 12207 GV *gv_readline;
9b3023bc 12208 GV **gvp;
02aa26ce 12209 /* we're in a filehandle read situation */
3280af22 12210 d = PL_tokenbuf;
02aa26ce
NT
12211
12212 /* turn <> into <ARGV> */
79072805 12213 if (!len)
689badd5 12214 Copy("ARGV",d,5,char);
02aa26ce 12215
9b3023bc 12216 /* Check whether readline() is overriden */
fafc274c 12217 gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
6136c704 12218 if ((gv_readline
ba979b31 12219 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 12220 ||
017a3ce5 12221 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
9e0d86f8 12222 && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
ba979b31 12223 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
12224 readline_overriden = TRUE;
12225
02aa26ce
NT
12226 /* if <$fh>, create the ops to turn the variable into a
12227 filehandle
12228 */
79072805 12229 if (*d == '$') {
02aa26ce
NT
12230 /* try to find it in the pad for this block, otherwise find
12231 add symbol table ops
12232 */
f8f98e0a 12233 const PADOFFSET tmp = pad_findmy(d, len, 0);
bbd11bfc 12234 if (tmp != NOT_IN_PAD) {
00b1698f 12235 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
6136c704
AL
12236 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
12237 HEK * const stashname = HvNAME_HEK(stash);
12238 SV * const sym = sv_2mortal(newSVhek(stashname));
396482e1 12239 sv_catpvs(sym, "::");
f558d5af
JH
12240 sv_catpv(sym, d+1);
12241 d = SvPVX(sym);
12242 goto intro_sym;
12243 }
12244 else {
6136c704 12245 OP * const o = newOP(OP_PADSV, 0);
f558d5af 12246 o->op_targ = tmp;
9b3023bc
RGS
12247 PL_lex_op = readline_overriden
12248 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12249 append_elem(OP_LIST, o,
12250 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
12251 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 12252 }
a0d0e21e
LW
12253 }
12254 else {
f558d5af
JH
12255 GV *gv;
12256 ++d;
12257intro_sym:
12258 gv = gv_fetchpv(d,
12259 (PL_in_eval
12260 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 12261 : GV_ADDMULTI),
f558d5af 12262 SVt_PV);
9b3023bc
RGS
12263 PL_lex_op = readline_overriden
12264 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12265 append_elem(OP_LIST,
12266 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
12267 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12268 : (OP*)newUNOP(OP_READLINE, 0,
12269 newUNOP(OP_RV2SV, 0,
12270 newGVOP(OP_GV, 0, gv)));
a0d0e21e 12271 }
7c6fadd6
RGS
12272 if (!readline_overriden)
12273 PL_lex_op->op_flags |= OPf_SPECIAL;
6154021b
RGS
12274 /* we created the ops in PL_lex_op, so make pl_yylval.ival a null op */
12275 pl_yylval.ival = OP_NULL;
79072805 12276 }
02aa26ce
NT
12277
12278 /* If it's none of the above, it must be a literal filehandle
12279 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 12280 else {
6136c704 12281 GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
9b3023bc
RGS
12282 PL_lex_op = readline_overriden
12283 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
12284 append_elem(OP_LIST,
12285 newGVOP(OP_GV, 0, gv),
12286 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
12287 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
6154021b 12288 pl_yylval.ival = OP_NULL;
79072805
LW
12289 }
12290 }
02aa26ce 12291
79072805
LW
12292 return s;
12293}
12294
02aa26ce
NT
12295
12296/* scan_str
12297 takes: start position in buffer
09bef843
SB
12298 keep_quoted preserve \ on the embedded delimiter(s)
12299 keep_delims preserve the delimiters around the string
02aa26ce
NT
12300 returns: position to continue reading from buffer
12301 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
12302 updates the read buffer.
12303
12304 This subroutine pulls a string out of the input. It is called for:
12305 q single quotes q(literal text)
12306 ' single quotes 'literal text'
12307 qq double quotes qq(interpolate $here please)
12308 " double quotes "interpolate $here please"
12309 qx backticks qx(/bin/ls -l)
12310 ` backticks `/bin/ls -l`
12311 qw quote words @EXPORT_OK = qw( func() $spam )
12312 m// regexp match m/this/
12313 s/// regexp substitute s/this/that/
12314 tr/// string transliterate tr/this/that/
12315 y/// string transliterate y/this/that/
12316 ($*@) sub prototypes sub foo ($)
09bef843 12317 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
12318 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
12319
12320 In most of these cases (all but <>, patterns and transliterate)
12321 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
12322 calls scan_str(). s/// makes yylex() call scan_subst() which calls
12323 scan_str(). tr/// and y/// make yylex() call scan_trans() which
12324 calls scan_str().
4e553d73 12325
02aa26ce
NT
12326 It skips whitespace before the string starts, and treats the first
12327 character as the delimiter. If the delimiter is one of ([{< then
12328 the corresponding "close" character )]}> is used as the closing
12329 delimiter. It allows quoting of delimiters, and if the string has
12330 balanced delimiters ([{<>}]) it allows nesting.
12331
37fd879b
HS
12332 On success, the SV with the resulting string is put into lex_stuff or,
12333 if that is already non-NULL, into lex_repl. The second case occurs only
12334 when parsing the RHS of the special constructs s/// and tr/// (y///).
12335 For convenience, the terminating delimiter character is stuffed into
12336 SvIVX of the SV.
02aa26ce
NT
12337*/
12338
76e3520e 12339STATIC char *
09bef843 12340S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 12341{
97aff369 12342 dVAR;
02aa26ce 12343 SV *sv; /* scalar value: string */
d3fcec1f 12344 const char *tmps; /* temp string, used for delimiter matching */
02aa26ce
NT
12345 register char *s = start; /* current position in the buffer */
12346 register char term; /* terminating character */
12347 register char *to; /* current position in the sv's data */
12348 I32 brackets = 1; /* bracket nesting level */
89491803 12349 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e 12350 I32 termcode; /* terminating char. code */
89ebb4a3 12351 U8 termstr[UTF8_MAXBYTES]; /* terminating string */
220e2d4e 12352 STRLEN termlen; /* length of terminating string */
0331ef07 12353 int last_off = 0; /* last position for nesting bracket */
5db06880
NC
12354#ifdef PERL_MAD
12355 int stuffstart;
12356 char *tstart;
12357#endif
02aa26ce 12358
7918f24d
NC
12359 PERL_ARGS_ASSERT_SCAN_STR;
12360
02aa26ce 12361 /* skip space before the delimiter */
29595ff2
NC
12362 if (isSPACE(*s)) {
12363 s = PEEKSPACE(s);
12364 }
02aa26ce 12365
5db06880 12366#ifdef PERL_MAD
cd81e915
NC
12367 if (PL_realtokenstart >= 0) {
12368 stuffstart = PL_realtokenstart;
12369 PL_realtokenstart = -1;
5db06880
NC
12370 }
12371 else
12372 stuffstart = start - SvPVX(PL_linestr);
12373#endif
02aa26ce 12374 /* mark where we are, in case we need to report errors */
79072805 12375 CLINE;
02aa26ce
NT
12376
12377 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 12378 term = *s;
220e2d4e
IH
12379 if (!UTF) {
12380 termcode = termstr[0] = term;
12381 termlen = 1;
12382 }
12383 else {
f3b9ce0f 12384 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
12385 Copy(s, termstr, termlen, U8);
12386 if (!UTF8_IS_INVARIANT(term))
12387 has_utf8 = TRUE;
12388 }
b1c7b182 12389
02aa26ce 12390 /* mark where we are */
57843af0 12391 PL_multi_start = CopLINE(PL_curcop);
3280af22 12392 PL_multi_open = term;
02aa26ce
NT
12393
12394 /* find corresponding closing delimiter */
93a17b20 12395 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
12396 termcode = termstr[0] = term = tmps[5];
12397
3280af22 12398 PL_multi_close = term;
79072805 12399
561b68a9
SH
12400 /* create a new SV to hold the contents. 79 is the SV's initial length.
12401 What a random number. */
7d0a29fe
NC
12402 sv = newSV_type(SVt_PVIV);
12403 SvGROW(sv, 80);
45977657 12404 SvIV_set(sv, termcode);
a0d0e21e 12405 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
12406
12407 /* move past delimiter and try to read a complete string */
09bef843 12408 if (keep_delims)
220e2d4e
IH
12409 sv_catpvn(sv, s, termlen);
12410 s += termlen;
5db06880
NC
12411#ifdef PERL_MAD
12412 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
12413 if (!PL_thisopen && !keep_delims) {
12414 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
12415 stuffstart = s - SvPVX(PL_linestr);
12416 }
12417#endif
93a17b20 12418 for (;;) {
220e2d4e
IH
12419 if (PL_encoding && !UTF) {
12420 bool cont = TRUE;
12421
12422 while (cont) {
95a20fc0 12423 int offset = s - SvPVX_const(PL_linestr);
66a1b24b 12424 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 12425 &offset, (char*)termstr, termlen);
6136c704
AL
12426 const char * const ns = SvPVX_const(PL_linestr) + offset;
12427 char * const svlast = SvEND(sv) - 1;
220e2d4e
IH
12428
12429 for (; s < ns; s++) {
12430 if (*s == '\n' && !PL_rsfp)
12431 CopLINE_inc(PL_curcop);
12432 }
12433 if (!found)
12434 goto read_more_line;
12435 else {
12436 /* handle quoted delimiters */
52327caf 12437 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
f54cb97a 12438 const char *t;
95a20fc0 12439 for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
220e2d4e
IH
12440 t--;
12441 if ((svlast-1 - t) % 2) {
12442 if (!keep_quoted) {
12443 *(svlast-1) = term;
12444 *svlast = '\0';
12445 SvCUR_set(sv, SvCUR(sv) - 1);
12446 }
12447 continue;
12448 }
12449 }
12450 if (PL_multi_open == PL_multi_close) {
12451 cont = FALSE;
12452 }
12453 else {
f54cb97a
AL
12454 const char *t;
12455 char *w;
0331ef07 12456 for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
220e2d4e
IH
12457 /* At here, all closes are "was quoted" one,
12458 so we don't check PL_multi_close. */
12459 if (*t == '\\') {
12460 if (!keep_quoted && *(t+1) == PL_multi_open)
12461 t++;
12462 else
12463 *w++ = *t++;
12464 }
12465 else if (*t == PL_multi_open)
12466 brackets++;
12467
12468 *w = *t;
12469 }
12470 if (w < t) {
12471 *w++ = term;
12472 *w = '\0';
95a20fc0 12473 SvCUR_set(sv, w - SvPVX_const(sv));
220e2d4e 12474 }
0331ef07 12475 last_off = w - SvPVX(sv);
220e2d4e
IH
12476 if (--brackets <= 0)
12477 cont = FALSE;
12478 }
12479 }
12480 }
12481 if (!keep_delims) {
12482 SvCUR_set(sv, SvCUR(sv) - 1);
12483 *SvEND(sv) = '\0';
12484 }
12485 break;
12486 }
12487
02aa26ce 12488 /* extend sv if need be */
3280af22 12489 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 12490 /* set 'to' to the next character in the sv's string */
463ee0b2 12491 to = SvPVX(sv)+SvCUR(sv);
09bef843 12492
02aa26ce 12493 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
12494 if (PL_multi_open == PL_multi_close) {
12495 for (; s < PL_bufend; s++,to++) {
02aa26ce 12496 /* embedded newlines increment the current line number */
3280af22 12497 if (*s == '\n' && !PL_rsfp)
57843af0 12498 CopLINE_inc(PL_curcop);
02aa26ce 12499 /* handle quoted delimiters */
3280af22 12500 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 12501 if (!keep_quoted && s[1] == term)
a0d0e21e 12502 s++;
02aa26ce 12503 /* any other quotes are simply copied straight through */
a0d0e21e
LW
12504 else
12505 *to++ = *s++;
12506 }
02aa26ce
NT
12507 /* terminate when run out of buffer (the for() condition), or
12508 have found the terminator */
220e2d4e
IH
12509 else if (*s == term) {
12510 if (termlen == 1)
12511 break;
f3b9ce0f 12512 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
12513 break;
12514 }
63cd0674 12515 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 12516 has_utf8 = TRUE;
93a17b20
LW
12517 *to = *s;
12518 }
12519 }
02aa26ce
NT
12520
12521 /* if the terminator isn't the same as the start character (e.g.,
12522 matched brackets), we have to allow more in the quoting, and
12523 be prepared for nested brackets.
12524 */
93a17b20 12525 else {
02aa26ce 12526 /* read until we run out of string, or we find the terminator */
3280af22 12527 for (; s < PL_bufend; s++,to++) {
02aa26ce 12528 /* embedded newlines increment the line count */
3280af22 12529 if (*s == '\n' && !PL_rsfp)
57843af0 12530 CopLINE_inc(PL_curcop);
02aa26ce 12531 /* backslashes can escape the open or closing characters */
3280af22 12532 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
12533 if (!keep_quoted &&
12534 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
12535 s++;
12536 else
12537 *to++ = *s++;
12538 }
02aa26ce 12539 /* allow nested opens and closes */
3280af22 12540 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 12541 break;
3280af22 12542 else if (*s == PL_multi_open)
93a17b20 12543 brackets++;
63cd0674 12544 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 12545 has_utf8 = TRUE;
93a17b20
LW
12546 *to = *s;
12547 }
12548 }
02aa26ce 12549 /* terminate the copied string and update the sv's end-of-string */
93a17b20 12550 *to = '\0';
95a20fc0 12551 SvCUR_set(sv, to - SvPVX_const(sv));
93a17b20 12552
02aa26ce
NT
12553 /*
12554 * this next chunk reads more into the buffer if we're not done yet
12555 */
12556
b1c7b182
GS
12557 if (s < PL_bufend)
12558 break; /* handle case where we are done yet :-) */
79072805 12559
6a27c188 12560#ifndef PERL_STRICT_CR
95a20fc0 12561 if (to - SvPVX_const(sv) >= 2) {
c6f14548
GS
12562 if ((to[-2] == '\r' && to[-1] == '\n') ||
12563 (to[-2] == '\n' && to[-1] == '\r'))
12564 {
f63a84b2
LW
12565 to[-2] = '\n';
12566 to--;
95a20fc0 12567 SvCUR_set(sv, to - SvPVX_const(sv));
f63a84b2
LW
12568 }
12569 else if (to[-1] == '\r')
12570 to[-1] = '\n';
12571 }
95a20fc0 12572 else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
f63a84b2
LW
12573 to[-1] = '\n';
12574#endif
12575
220e2d4e 12576 read_more_line:
02aa26ce
NT
12577 /* if we're out of file, or a read fails, bail and reset the current
12578 line marker so we can report where the unterminated string began
12579 */
5db06880
NC
12580#ifdef PERL_MAD
12581 if (PL_madskills) {
c35e046a 12582 char * const tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
12583 if (PL_thisstuff)
12584 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 12585 else
cd81e915 12586 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
12587 }
12588#endif
f0e67a1d
Z
12589 CopLINE_inc(PL_curcop);
12590 PL_bufptr = PL_bufend;
12591 if (!lex_next_chunk(0)) {
c07a80fd 12592 sv_free(sv);
eb160463 12593 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
bd61b366 12594 return NULL;
79072805 12595 }
f0e67a1d 12596 s = PL_bufptr;
5db06880
NC
12597#ifdef PERL_MAD
12598 stuffstart = 0;
12599#endif
378cc40b 12600 }
4e553d73 12601
02aa26ce
NT
12602 /* at this point, we have successfully read the delimited string */
12603
220e2d4e 12604 if (!PL_encoding || UTF) {
5db06880
NC
12605#ifdef PERL_MAD
12606 if (PL_madskills) {
c35e046a 12607 char * const tstart = SvPVX(PL_linestr) + stuffstart;
29522234 12608 const int len = s - tstart;
cd81e915 12609 if (PL_thisstuff)
c35e046a 12610 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 12611 else
c35e046a 12612 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
12613 if (!PL_thisclose && !keep_delims)
12614 PL_thisclose = newSVpvn(s,termlen);
5db06880
NC
12615 }
12616#endif
12617
220e2d4e
IH
12618 if (keep_delims)
12619 sv_catpvn(sv, s, termlen);
12620 s += termlen;
12621 }
5db06880
NC
12622#ifdef PERL_MAD
12623 else {
12624 if (PL_madskills) {
c35e046a
AL
12625 char * const tstart = SvPVX(PL_linestr) + stuffstart;
12626 const int len = s - tstart - termlen;
cd81e915 12627 if (PL_thisstuff)
c35e046a 12628 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 12629 else
c35e046a 12630 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
12631 if (!PL_thisclose && !keep_delims)
12632 PL_thisclose = newSVpvn(s - termlen,termlen);
5db06880
NC
12633 }
12634 }
12635#endif
220e2d4e 12636 if (has_utf8 || PL_encoding)
b1c7b182 12637 SvUTF8_on(sv);
d0063567 12638
57843af0 12639 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
12640
12641 /* if we allocated too much space, give some back */
93a17b20
LW
12642 if (SvCUR(sv) + 5 < SvLEN(sv)) {
12643 SvLEN_set(sv, SvCUR(sv) + 1);
b7e9a5c2 12644 SvPV_renew(sv, SvLEN(sv));
79072805 12645 }
02aa26ce
NT
12646
12647 /* decide whether this is the first or second quoted string we've read
12648 for this op
12649 */
4e553d73 12650
3280af22
NIS
12651 if (PL_lex_stuff)
12652 PL_lex_repl = sv;
79072805 12653 else
3280af22 12654 PL_lex_stuff = sv;
378cc40b
LW
12655 return s;
12656}
12657
02aa26ce
NT
12658/*
12659 scan_num
12660 takes: pointer to position in buffer
12661 returns: pointer to new position in buffer
6154021b 12662 side-effects: builds ops for the constant in pl_yylval.op
02aa26ce
NT
12663
12664 Read a number in any of the formats that Perl accepts:
12665
7fd134d9
JH
12666 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
12667 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
12668 0b[01](_?[01])*
12669 0[0-7](_?[0-7])*
12670 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 12671
3280af22 12672 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
12673 thing it reads.
12674
12675 If it reads a number without a decimal point or an exponent, it will
12676 try converting the number to an integer and see if it can do so
12677 without loss of precision.
12678*/
4e553d73 12679
378cc40b 12680char *
bfed75c6 12681Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
378cc40b 12682{
97aff369 12683 dVAR;
bfed75c6 12684 register const char *s = start; /* current position in buffer */
02aa26ce
NT
12685 register char *d; /* destination in temp buffer */
12686 register char *e; /* end of temp buffer */
86554af2 12687 NV nv; /* number read, as a double */
a0714e2c 12688 SV *sv = NULL; /* place to put the converted number */
a86a20aa 12689 bool floatit; /* boolean: int or float? */
cbbf8932 12690 const char *lastub = NULL; /* position of last underbar */
bfed75c6 12691 static char const number_too_long[] = "Number too long";
378cc40b 12692
7918f24d
NC
12693 PERL_ARGS_ASSERT_SCAN_NUM;
12694
02aa26ce
NT
12695 /* We use the first character to decide what type of number this is */
12696
378cc40b 12697 switch (*s) {
79072805 12698 default:
cea2e8a9 12699 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 12700
02aa26ce 12701 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 12702 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
12703 case '0':
12704 {
02aa26ce
NT
12705 /* variables:
12706 u holds the "number so far"
4f19785b
WSI
12707 shift the power of 2 of the base
12708 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
12709 overflowed was the number more than we can hold?
12710
12711 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
12712 we in octal/hex/binary?" indicator to disallow hex characters
12713 when in octal mode.
02aa26ce 12714 */
9e24b6e2
JH
12715 NV n = 0.0;
12716 UV u = 0;
79072805 12717 I32 shift;
9e24b6e2 12718 bool overflowed = FALSE;
61f33854 12719 bool just_zero = TRUE; /* just plain 0 or binary number? */
27da23d5
JH
12720 static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
12721 static const char* const bases[5] =
12722 { "", "binary", "", "octal", "hexadecimal" };
12723 static const char* const Bases[5] =
12724 { "", "Binary", "", "Octal", "Hexadecimal" };
12725 static const char* const maxima[5] =
12726 { "",
12727 "0b11111111111111111111111111111111",
12728 "",
12729 "037777777777",
12730 "0xffffffff" };
bfed75c6 12731 const char *base, *Base, *max;
378cc40b 12732
02aa26ce 12733 /* check for hex */
378cc40b
LW
12734 if (s[1] == 'x') {
12735 shift = 4;
12736 s += 2;
61f33854 12737 just_zero = FALSE;
4f19785b
WSI
12738 } else if (s[1] == 'b') {
12739 shift = 1;
12740 s += 2;
61f33854 12741 just_zero = FALSE;
378cc40b 12742 }
02aa26ce 12743 /* check for a decimal in disguise */
b78218b7 12744 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 12745 goto decimal;
02aa26ce 12746 /* so it must be octal */
928753ea 12747 else {
378cc40b 12748 shift = 3;
928753ea
JH
12749 s++;
12750 }
12751
12752 if (*s == '_') {
a2a5de95 12753 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12754 "Misplaced _ in number");
12755 lastub = s++;
12756 }
9e24b6e2
JH
12757
12758 base = bases[shift];
12759 Base = Bases[shift];
12760 max = maxima[shift];
02aa26ce 12761
4f19785b 12762 /* read the rest of the number */
378cc40b 12763 for (;;) {
9e24b6e2 12764 /* x is used in the overflow test,
893fe2c2 12765 b is the digit we're adding on. */
9e24b6e2 12766 UV x, b;
55497cff 12767
378cc40b 12768 switch (*s) {
02aa26ce
NT
12769
12770 /* if we don't mention it, we're done */
378cc40b
LW
12771 default:
12772 goto out;
02aa26ce 12773
928753ea 12774 /* _ are ignored -- but warned about if consecutive */
de3bb511 12775 case '_':
a2a5de95
NC
12776 if (lastub && s == lastub + 1)
12777 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12778 "Misplaced _ in number");
928753ea 12779 lastub = s++;
de3bb511 12780 break;
02aa26ce
NT
12781
12782 /* 8 and 9 are not octal */
378cc40b 12783 case '8': case '9':
4f19785b 12784 if (shift == 3)
cea2e8a9 12785 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 12786 /* FALL THROUGH */
02aa26ce
NT
12787
12788 /* octal digits */
4f19785b 12789 case '2': case '3': case '4':
378cc40b 12790 case '5': case '6': case '7':
4f19785b 12791 if (shift == 1)
cea2e8a9 12792 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
12793 /* FALL THROUGH */
12794
12795 case '0': case '1':
02aa26ce 12796 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 12797 goto digit;
02aa26ce
NT
12798
12799 /* hex digits */
378cc40b
LW
12800 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12801 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 12802 /* make sure they said 0x */
378cc40b
LW
12803 if (shift != 4)
12804 goto out;
55497cff 12805 b = (*s++ & 7) + 9;
02aa26ce
NT
12806
12807 /* Prepare to put the digit we have onto the end
12808 of the number so far. We check for overflows.
12809 */
12810
55497cff 12811 digit:
61f33854 12812 just_zero = FALSE;
9e24b6e2
JH
12813 if (!overflowed) {
12814 x = u << shift; /* make room for the digit */
12815
12816 if ((x >> shift) != u
12817 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
12818 overflowed = TRUE;
12819 n = (NV) u;
9b387841
NC
12820 Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
12821 "Integer overflow in %s number",
12822 base);
9e24b6e2
JH
12823 } else
12824 u = x | b; /* add the digit to the end */
12825 }
12826 if (overflowed) {
12827 n *= nvshift[shift];
12828 /* If an NV has not enough bits in its
12829 * mantissa to represent an UV this summing of
12830 * small low-order numbers is a waste of time
12831 * (because the NV cannot preserve the
12832 * low-order bits anyway): we could just
12833 * remember when did we overflow and in the
12834 * end just multiply n by the right
12835 * amount. */
12836 n += (NV) b;
55497cff 12837 }
378cc40b
LW
12838 break;
12839 }
12840 }
02aa26ce
NT
12841
12842 /* if we get here, we had success: make a scalar value from
12843 the number.
12844 */
378cc40b 12845 out:
928753ea
JH
12846
12847 /* final misplaced underbar check */
12848 if (s[-1] == '_') {
a2a5de95 12849 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
12850 }
12851
561b68a9 12852 sv = newSV(0);
9e24b6e2 12853 if (overflowed) {
a2a5de95
NC
12854 if (n > 4294967295.0)
12855 Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
12856 "%s number > %s non-portable",
12857 Base, max);
9e24b6e2
JH
12858 sv_setnv(sv, n);
12859 }
12860 else {
15041a67 12861#if UVSIZE > 4
a2a5de95
NC
12862 if (u > 0xffffffff)
12863 Perl_ck_warner(aTHX_ packWARN(WARN_PORTABLE),
12864 "%s number > %s non-portable",
12865 Base, max);
2cc4c2dc 12866#endif
9e24b6e2
JH
12867 sv_setuv(sv, u);
12868 }
61f33854 12869 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
bfed75c6 12870 sv = new_constant(start, s - start, "integer",
eb0d8d16 12871 sv, NULL, NULL, 0);
61f33854 12872 else if (PL_hints & HINT_NEW_BINARY)
eb0d8d16 12873 sv = new_constant(start, s - start, "binary", sv, NULL, NULL, 0);
378cc40b
LW
12874 }
12875 break;
02aa26ce
NT
12876
12877 /*
12878 handle decimal numbers.
12879 we're also sent here when we read a 0 as the first digit
12880 */
378cc40b
LW
12881 case '1': case '2': case '3': case '4': case '5':
12882 case '6': case '7': case '8': case '9': case '.':
12883 decimal:
3280af22
NIS
12884 d = PL_tokenbuf;
12885 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 12886 floatit = FALSE;
02aa26ce
NT
12887
12888 /* read next group of digits and _ and copy into d */
de3bb511 12889 while (isDIGIT(*s) || *s == '_') {
4e553d73 12890 /* skip underscores, checking for misplaced ones
02aa26ce
NT
12891 if -w is on
12892 */
93a17b20 12893 if (*s == '_') {
a2a5de95
NC
12894 if (lastub && s == lastub + 1)
12895 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12896 "Misplaced _ in number");
928753ea 12897 lastub = s++;
93a17b20 12898 }
fc36a67e 12899 else {
02aa26ce 12900 /* check for end of fixed-length buffer */
fc36a67e 12901 if (d >= e)
cea2e8a9 12902 Perl_croak(aTHX_ number_too_long);
02aa26ce 12903 /* if we're ok, copy the character */
378cc40b 12904 *d++ = *s++;
fc36a67e 12905 }
378cc40b 12906 }
02aa26ce
NT
12907
12908 /* final misplaced underbar check */
928753ea 12909 if (lastub && s == lastub + 1) {
a2a5de95 12910 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 12911 }
02aa26ce
NT
12912
12913 /* read a decimal portion if there is one. avoid
12914 3..5 being interpreted as the number 3. followed
12915 by .5
12916 */
2f3197b3 12917 if (*s == '.' && s[1] != '.') {
79072805 12918 floatit = TRUE;
378cc40b 12919 *d++ = *s++;
02aa26ce 12920
928753ea 12921 if (*s == '_') {
a2a5de95
NC
12922 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12923 "Misplaced _ in number");
928753ea
JH
12924 lastub = s;
12925 }
12926
12927 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 12928 */
fc36a67e 12929 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 12930 /* fixed length buffer check */
fc36a67e 12931 if (d >= e)
cea2e8a9 12932 Perl_croak(aTHX_ number_too_long);
928753ea 12933 if (*s == '_') {
a2a5de95
NC
12934 if (lastub && s == lastub + 1)
12935 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12936 "Misplaced _ in number");
928753ea
JH
12937 lastub = s;
12938 }
12939 else
fc36a67e 12940 *d++ = *s;
378cc40b 12941 }
928753ea
JH
12942 /* fractional part ending in underbar? */
12943 if (s[-1] == '_') {
a2a5de95
NC
12944 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12945 "Misplaced _ in number");
928753ea 12946 }
dd629d5b
GS
12947 if (*s == '.' && isDIGIT(s[1])) {
12948 /* oops, it's really a v-string, but without the "v" */
f4758303 12949 s = start;
dd629d5b
GS
12950 goto vstring;
12951 }
378cc40b 12952 }
02aa26ce
NT
12953
12954 /* read exponent part, if present */
3792a11b 12955 if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
79072805
LW
12956 floatit = TRUE;
12957 s++;
02aa26ce
NT
12958
12959 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 12960 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 12961
7fd134d9
JH
12962 /* stray preinitial _ */
12963 if (*s == '_') {
a2a5de95
NC
12964 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12965 "Misplaced _ in number");
7fd134d9
JH
12966 lastub = s++;
12967 }
12968
02aa26ce 12969 /* allow positive or negative exponent */
378cc40b
LW
12970 if (*s == '+' || *s == '-')
12971 *d++ = *s++;
02aa26ce 12972
7fd134d9
JH
12973 /* stray initial _ */
12974 if (*s == '_') {
a2a5de95
NC
12975 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12976 "Misplaced _ in number");
7fd134d9
JH
12977 lastub = s++;
12978 }
12979
7fd134d9
JH
12980 /* read digits of exponent */
12981 while (isDIGIT(*s) || *s == '_') {
12982 if (isDIGIT(*s)) {
12983 if (d >= e)
12984 Perl_croak(aTHX_ number_too_long);
b3b48e3e 12985 *d++ = *s++;
7fd134d9
JH
12986 }
12987 else {
041457d9 12988 if (((lastub && s == lastub + 1) ||
a2a5de95
NC
12989 (!isDIGIT(s[1]) && s[1] != '_')))
12990 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
12991 "Misplaced _ in number");
b3b48e3e 12992 lastub = s++;
7fd134d9 12993 }
7fd134d9 12994 }
378cc40b 12995 }
02aa26ce 12996
02aa26ce
NT
12997
12998 /* make an sv from the string */
561b68a9 12999 sv = newSV(0);
097ee67d 13000
0b7fceb9 13001 /*
58bb9ec3
NC
13002 We try to do an integer conversion first if no characters
13003 indicating "float" have been found.
0b7fceb9
MU
13004 */
13005
13006 if (!floatit) {
58bb9ec3 13007 UV uv;
6136c704 13008 const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
58bb9ec3
NC
13009
13010 if (flags == IS_NUMBER_IN_UV) {
13011 if (uv <= IV_MAX)
86554af2 13012 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 13013 else
c239479b 13014 sv_setuv(sv, uv);
58bb9ec3
NC
13015 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
13016 if (uv <= (UV) IV_MIN)
13017 sv_setiv(sv, -(IV)uv);
13018 else
13019 floatit = TRUE;
13020 } else
13021 floatit = TRUE;
13022 }
0b7fceb9 13023 if (floatit) {
58bb9ec3
NC
13024 /* terminate the string */
13025 *d = '\0';
86554af2
JH
13026 nv = Atof(PL_tokenbuf);
13027 sv_setnv(sv, nv);
13028 }
86554af2 13029
eb0d8d16
NC
13030 if ( floatit
13031 ? (PL_hints & HINT_NEW_FLOAT) : (PL_hints & HINT_NEW_INTEGER) ) {
13032 const char *const key = floatit ? "float" : "integer";
13033 const STRLEN keylen = floatit ? 5 : 7;
13034 sv = S_new_constant(aTHX_ PL_tokenbuf, d - PL_tokenbuf,
13035 key, keylen, sv, NULL, NULL, 0);
13036 }
378cc40b 13037 break;
0b7fceb9 13038
e312add1 13039 /* if it starts with a v, it could be a v-string */
a7cb1f99 13040 case 'v':
dd629d5b 13041vstring:
561b68a9 13042 sv = newSV(5); /* preallocate storage space */
65b06e02 13043 s = scan_vstring(s, PL_bufend, sv);
a7cb1f99 13044 break;
79072805 13045 }
a687059c 13046
02aa26ce
NT
13047 /* make the op for the constant and return */
13048
a86a20aa 13049 if (sv)
b73d6f50 13050 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 13051 else
5f66b61c 13052 lvalp->opval = NULL;
a687059c 13053
73d840c0 13054 return (char *)s;
378cc40b
LW
13055}
13056
76e3520e 13057STATIC char *
cea2e8a9 13058S_scan_formline(pTHX_ register char *s)
378cc40b 13059{
97aff369 13060 dVAR;
79072805 13061 register char *eol;
378cc40b 13062 register char *t;
6136c704 13063 SV * const stuff = newSVpvs("");
79072805 13064 bool needargs = FALSE;
c5ee2135 13065 bool eofmt = FALSE;
5db06880
NC
13066#ifdef PERL_MAD
13067 char *tokenstart = s;
4f61fd4b
JC
13068 SV* savewhite = NULL;
13069
5db06880 13070 if (PL_madskills) {
cd81e915
NC
13071 savewhite = PL_thiswhite;
13072 PL_thiswhite = 0;
5db06880
NC
13073 }
13074#endif
378cc40b 13075
7918f24d
NC
13076 PERL_ARGS_ASSERT_SCAN_FORMLINE;
13077
79072805 13078 while (!needargs) {
a1b95068 13079 if (*s == '.') {
c35e046a 13080 t = s+1;
51882d45 13081#ifdef PERL_STRICT_CR
c35e046a
AL
13082 while (SPACE_OR_TAB(*t))
13083 t++;
51882d45 13084#else
c35e046a
AL
13085 while (SPACE_OR_TAB(*t) || *t == '\r')
13086 t++;
51882d45 13087#endif
c5ee2135
WL
13088 if (*t == '\n' || t == PL_bufend) {
13089 eofmt = TRUE;
79072805 13090 break;
c5ee2135 13091 }
79072805 13092 }
3280af22 13093 if (PL_in_eval && !PL_rsfp) {
07409e01 13094 eol = (char *) memchr(s,'\n',PL_bufend-s);
0f85fab0 13095 if (!eol++)
3280af22 13096 eol = PL_bufend;
0f85fab0
LW
13097 }
13098 else
3280af22 13099 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 13100 if (*s != '#') {
a0d0e21e
LW
13101 for (t = s; t < eol; t++) {
13102 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
13103 needargs = FALSE;
13104 goto enough; /* ~~ must be first line in formline */
378cc40b 13105 }
a0d0e21e
LW
13106 if (*t == '@' || *t == '^')
13107 needargs = TRUE;
378cc40b 13108 }
7121b347
MG
13109 if (eol > s) {
13110 sv_catpvn(stuff, s, eol-s);
2dc4c65b 13111#ifndef PERL_STRICT_CR
7121b347
MG
13112 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
13113 char *end = SvPVX(stuff) + SvCUR(stuff);
13114 end[-2] = '\n';
13115 end[-1] = '\0';
b162af07 13116 SvCUR_set(stuff, SvCUR(stuff) - 1);
7121b347 13117 }
2dc4c65b 13118#endif
7121b347
MG
13119 }
13120 else
13121 break;
79072805 13122 }
95a20fc0 13123 s = (char*)eol;
3280af22 13124 if (PL_rsfp) {
f0e67a1d 13125 bool got_some;
5db06880
NC
13126#ifdef PERL_MAD
13127 if (PL_madskills) {
cd81e915
NC
13128 if (PL_thistoken)
13129 sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
5db06880 13130 else
cd81e915 13131 PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
5db06880
NC
13132 }
13133#endif
f0e67a1d
Z
13134 PL_bufptr = PL_bufend;
13135 CopLINE_inc(PL_curcop);
13136 got_some = lex_next_chunk(0);
13137 CopLINE_dec(PL_curcop);
13138 s = PL_bufptr;
5db06880 13139#ifdef PERL_MAD
f0e67a1d 13140 tokenstart = PL_bufptr;
5db06880 13141#endif
f0e67a1d 13142 if (!got_some)
378cc40b 13143 break;
378cc40b 13144 }
463ee0b2 13145 incline(s);
79072805 13146 }
a0d0e21e
LW
13147 enough:
13148 if (SvCUR(stuff)) {
3280af22 13149 PL_expect = XTERM;
79072805 13150 if (needargs) {
3280af22 13151 PL_lex_state = LEX_NORMAL;
cd81e915 13152 start_force(PL_curforce);
9ded7720 13153 NEXTVAL_NEXTTOKE.ival = 0;
79072805
LW
13154 force_next(',');
13155 }
a0d0e21e 13156 else
3280af22 13157 PL_lex_state = LEX_FORMLINE;
1bd51a4c 13158 if (!IN_BYTES) {
95a20fc0 13159 if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
1bd51a4c
IH
13160 SvUTF8_on(stuff);
13161 else if (PL_encoding)
13162 sv_recode_to_utf8(stuff, PL_encoding);
13163 }
cd81e915 13164 start_force(PL_curforce);
9ded7720 13165 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 13166 force_next(THING);
cd81e915 13167 start_force(PL_curforce);
9ded7720 13168 NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
79072805 13169 force_next(LSTOP);
378cc40b 13170 }
79072805 13171 else {
8990e307 13172 SvREFCNT_dec(stuff);
c5ee2135
WL
13173 if (eofmt)
13174 PL_lex_formbrack = 0;
3280af22 13175 PL_bufptr = s;
79072805 13176 }
5db06880
NC
13177#ifdef PERL_MAD
13178 if (PL_madskills) {
cd81e915
NC
13179 if (PL_thistoken)
13180 sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
5db06880 13181 else
cd81e915
NC
13182 PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
13183 PL_thiswhite = savewhite;
5db06880
NC
13184 }
13185#endif
79072805 13186 return s;
378cc40b 13187}
a687059c 13188
ba6d6ac9 13189I32
864dbfa3 13190Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 13191{
97aff369 13192 dVAR;
a3b680e6 13193 const I32 oldsavestack_ix = PL_savestack_ix;
6136c704 13194 CV* const outsidecv = PL_compcv;
8990e307 13195
3280af22
NIS
13196 if (PL_compcv) {
13197 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 13198 }
7766f137 13199 SAVEI32(PL_subline);
3280af22 13200 save_item(PL_subname);
3280af22 13201 SAVESPTR(PL_compcv);
3280af22 13202
ea726b52 13203 PL_compcv = MUTABLE_CV(newSV_type(is_format ? SVt_PVFM : SVt_PVCV));
3280af22
NIS
13204 CvFLAGS(PL_compcv) |= flags;
13205
57843af0 13206 PL_subline = CopLINE(PL_curcop);
dd2155a4 13207 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
ea726b52 13208 CvOUTSIDE(PL_compcv) = MUTABLE_CV(SvREFCNT_inc_simple(outsidecv));
a3985cdc 13209 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 13210
8990e307
LW
13211 return oldsavestack_ix;
13212}
13213
084592ab
CN
13214#ifdef __SC__
13215#pragma segment Perl_yylex
13216#endif
af41e527
NC
13217static int
13218S_yywarn(pTHX_ const char *const s)
8990e307 13219{
97aff369 13220 dVAR;
7918f24d
NC
13221
13222 PERL_ARGS_ASSERT_YYWARN;
13223
faef0170 13224 PL_in_eval |= EVAL_WARNONLY;
748a9306 13225 yyerror(s);
faef0170 13226 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 13227 return 0;
8990e307
LW
13228}
13229
13230int
15f169a1 13231Perl_yyerror(pTHX_ const char *const s)
463ee0b2 13232{
97aff369 13233 dVAR;
bfed75c6
AL
13234 const char *where = NULL;
13235 const char *context = NULL;
68dc0745 13236 int contlen = -1;
46fc3d4c 13237 SV *msg;
5912531f 13238 int yychar = PL_parser->yychar;
463ee0b2 13239
7918f24d
NC
13240 PERL_ARGS_ASSERT_YYERROR;
13241
3280af22 13242 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 13243 where = "at EOF";
8bcfe651
TM
13244 else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
13245 PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
13246 PL_oldbufptr != PL_bufptr) {
f355267c
JH
13247 /*
13248 Only for NetWare:
13249 The code below is removed for NetWare because it abends/crashes on NetWare
13250 when the script has error such as not having the closing quotes like:
13251 if ($var eq "value)
13252 Checking of white spaces is anyway done in NetWare code.
13253 */
13254#ifndef NETWARE
3280af22
NIS
13255 while (isSPACE(*PL_oldoldbufptr))
13256 PL_oldoldbufptr++;
f355267c 13257#endif
3280af22
NIS
13258 context = PL_oldoldbufptr;
13259 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 13260 }
8bcfe651
TM
13261 else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
13262 PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
f355267c
JH
13263 /*
13264 Only for NetWare:
13265 The code below is removed for NetWare because it abends/crashes on NetWare
13266 when the script has error such as not having the closing quotes like:
13267 if ($var eq "value)
13268 Checking of white spaces is anyway done in NetWare code.
13269 */
13270#ifndef NETWARE
3280af22
NIS
13271 while (isSPACE(*PL_oldbufptr))
13272 PL_oldbufptr++;
f355267c 13273#endif
3280af22
NIS
13274 context = PL_oldbufptr;
13275 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
13276 }
13277 else if (yychar > 255)
68dc0745 13278 where = "next token ???";
12fbd33b 13279 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
13280 if (PL_lex_state == LEX_NORMAL ||
13281 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 13282 where = "at end of line";
3280af22 13283 else if (PL_lex_inpat)
68dc0745 13284 where = "within pattern";
463ee0b2 13285 else
68dc0745 13286 where = "within string";
463ee0b2 13287 }
46fc3d4c 13288 else {
84bafc02 13289 SV * const where_sv = newSVpvs_flags("next char ", SVs_TEMP);
46fc3d4c 13290 if (yychar < 32)
cea2e8a9 13291 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
5e7aa789 13292 else if (isPRINT_LC(yychar)) {
88c9ea1e 13293 const char string = yychar;
5e7aa789
NC
13294 sv_catpvn(where_sv, &string, 1);
13295 }
463ee0b2 13296 else
cea2e8a9 13297 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
95a20fc0 13298 where = SvPVX_const(where_sv);
463ee0b2 13299 }
46fc3d4c 13300 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 13301 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 13302 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 13303 if (context)
cea2e8a9 13304 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 13305 else
cea2e8a9 13306 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 13307 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 13308 Perl_sv_catpvf(aTHX_ msg,
57def98f 13309 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 13310 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 13311 PL_multi_end = 0;
a0d0e21e 13312 }
500960a6 13313 if (PL_in_eval & EVAL_WARNONLY) {
9b387841 13314 Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
500960a6 13315 }
463ee0b2 13316 else
5a844595 13317 qerror(msg);
c7d6bfb2
GS
13318 if (PL_error_count >= 10) {
13319 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 13320 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
be2597df 13321 SVfARG(ERRSV), OutCopFILE(PL_curcop));
c7d6bfb2
GS
13322 else
13323 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 13324 OutCopFILE(PL_curcop));
c7d6bfb2 13325 }
3280af22 13326 PL_in_my = 0;
5c284bb0 13327 PL_in_my_stash = NULL;
463ee0b2
LW
13328 return 0;
13329}
084592ab
CN
13330#ifdef __SC__
13331#pragma segment Main
13332#endif
4e35701f 13333
b250498f 13334STATIC char*
3ae08724 13335S_swallow_bom(pTHX_ U8 *s)
01ec43d0 13336{
97aff369 13337 dVAR;
f54cb97a 13338 const STRLEN slen = SvCUR(PL_linestr);
7918f24d
NC
13339
13340 PERL_ARGS_ASSERT_SWALLOW_BOM;
13341
7aa207d6 13342 switch (s[0]) {
4e553d73
NIS
13343 case 0xFF:
13344 if (s[1] == 0xFE) {
ee6ba15d 13345 /* UTF-16 little-endian? (or UTF-32LE?) */
3ae08724 13346 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
ee6ba15d 13347 Perl_croak(aTHX_ "Unsupported script encoding UTF-32LE");
01ec43d0 13348#ifndef PERL_NO_UTF16_FILTER
ee6ba15d 13349 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (BOM)\n");
3ae08724 13350 s += 2;
dea0fc0b 13351 if (PL_bufend > (char*)s) {
81a923f4 13352 s = add_utf16_textfilter(s, TRUE);
dea0fc0b 13353 }
b250498f 13354#else
ee6ba15d 13355 Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
b250498f 13356#endif
01ec43d0
GS
13357 }
13358 break;
78ae23f5 13359 case 0xFE:
7aa207d6 13360 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 13361#ifndef PERL_NO_UTF16_FILTER
7aa207d6 13362 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b
JH
13363 s += 2;
13364 if (PL_bufend > (char *)s) {
81a923f4 13365 s = add_utf16_textfilter(s, FALSE);
dea0fc0b 13366 }
b250498f 13367#else
ee6ba15d 13368 Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
b250498f 13369#endif
01ec43d0
GS
13370 }
13371 break;
3ae08724
GS
13372 case 0xEF:
13373 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 13374 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
13375 s += 3; /* UTF-8 */
13376 }
13377 break;
13378 case 0:
7aa207d6
JH
13379 if (slen > 3) {
13380 if (s[1] == 0) {
13381 if (s[2] == 0xFE && s[3] == 0xFF) {
13382 /* UTF-32 big-endian */
ee6ba15d 13383 Perl_croak(aTHX_ "Unsupported script encoding UTF-32BE");
7aa207d6
JH
13384 }
13385 }
13386 else if (s[2] == 0 && s[3] != 0) {
13387 /* Leading bytes
13388 * 00 xx 00 xx
13389 * are a good indicator of UTF-16BE. */
ee6ba15d 13390#ifndef PERL_NO_UTF16_FILTER
7aa207d6 13391 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
ee6ba15d
EB
13392 s = add_utf16_textfilter(s, FALSE);
13393#else
13394 Perl_croak(aTHX_ "Unsupported script encoding UTF-16BE");
13395#endif
7aa207d6 13396 }
01ec43d0 13397 }
e294cc5d
JH
13398#ifdef EBCDIC
13399 case 0xDD:
13400 if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
13401 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
13402 s += 4; /* UTF-8 */
13403 }
13404 break;
13405#endif
13406
7aa207d6
JH
13407 default:
13408 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
13409 /* Leading bytes
13410 * xx 00 xx 00
13411 * are a good indicator of UTF-16LE. */
ee6ba15d 13412#ifndef PERL_NO_UTF16_FILTER
7aa207d6 13413 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
81a923f4 13414 s = add_utf16_textfilter(s, TRUE);
ee6ba15d
EB
13415#else
13416 Perl_croak(aTHX_ "Unsupported script encoding UTF-16LE");
13417#endif
7aa207d6 13418 }
01ec43d0 13419 }
b8f84bb2 13420 return (char*)s;
b250498f 13421}
4755096e 13422
6e3aabd6
GS
13423
13424#ifndef PERL_NO_UTF16_FILTER
13425static I32
a28af015 13426S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 13427{
97aff369 13428 dVAR;
f3040f2c 13429 SV *const filter = FILTER_DATA(idx);
2a773401
NC
13430 /* We re-use this each time round, throwing the contents away before we
13431 return. */
2a773401 13432 SV *const utf16_buffer = MUTABLE_SV(IoTOP_GV(filter));
f3040f2c 13433 SV *const utf8_buffer = filter;
c28d6105 13434 IV status = IoPAGE(filter);
eda4663d 13435 const bool reverse = (bool) IoLINES(filter);
d2d1d4de 13436 I32 retval;
c8b0cbae
NC
13437
13438 /* As we're automatically added, at the lowest level, and hence only called
13439 from this file, we can be sure that we're not called in block mode. Hence
13440 don't bother writing code to deal with block mode. */
13441 if (maxlen) {
13442 Perl_croak(aTHX_ "panic: utf16_textfilter called in block mode (for %d characters)", maxlen);
13443 }
c28d6105
NC
13444 if (status < 0) {
13445 Perl_croak(aTHX_ "panic: utf16_textfilter called after error (status=%"IVdf")", status);
13446 }
1de9afcd 13447 DEBUG_P(PerlIO_printf(Perl_debug_log,
c28d6105 13448 "utf16_textfilter(%p,%ce): idx=%d maxlen=%d status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
a28af015 13449 FPTR2DPTR(void *, S_utf16_textfilter),
c28d6105
NC
13450 reverse ? 'l' : 'b', idx, maxlen, status,
13451 (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13452
13453 while (1) {
13454 STRLEN chars;
13455 STRLEN have;
dea0fc0b 13456 I32 newlen;
2a773401 13457 U8 *end;
c28d6105
NC
13458 /* First, look in our buffer of existing UTF-8 data: */
13459 char *nl = (char *)memchr(SvPVX(utf8_buffer), '\n', SvCUR(utf8_buffer));
13460
13461 if (nl) {
13462 ++nl;
13463 } else if (status == 0) {
13464 /* EOF */
13465 IoPAGE(filter) = 0;
13466 nl = SvEND(utf8_buffer);
13467 }
13468 if (nl) {
d2d1d4de
NC
13469 STRLEN got = nl - SvPVX(utf8_buffer);
13470 /* Did we have anything to append? */
13471 retval = got != 0;
13472 sv_catpvn(sv, SvPVX(utf8_buffer), got);
c28d6105
NC
13473 /* Everything else in this code works just fine if SVp_POK isn't
13474 set. This, however, needs it, and we need it to work, else
13475 we loop infinitely because the buffer is never consumed. */
13476 sv_chop(utf8_buffer, nl);
13477 break;
13478 }
ba77e4cc 13479
c28d6105
NC
13480 /* OK, not a complete line there, so need to read some more UTF-16.
13481 Read an extra octect if the buffer currently has an odd number. */
ba77e4cc
NC
13482 while (1) {
13483 if (status <= 0)
13484 break;
13485 if (SvCUR(utf16_buffer) >= 2) {
13486 /* Location of the high octet of the last complete code point.
13487 Gosh, UTF-16 is a pain. All the benefits of variable length,
13488 *coupled* with all the benefits of partial reads and
13489 endianness. */
13490 const U8 *const last_hi = (U8*)SvPVX(utf16_buffer)
13491 + ((SvCUR(utf16_buffer) & ~1) - (reverse ? 1 : 2));
13492
13493 if (*last_hi < 0xd8 || *last_hi > 0xdb) {
13494 break;
13495 }
13496
13497 /* We have the first half of a surrogate. Read more. */
13498 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter partial surrogate detected at %p\n", last_hi));
13499 }
c28d6105 13500
c28d6105
NC
13501 status = FILTER_READ(idx + 1, utf16_buffer,
13502 160 + (SvCUR(utf16_buffer) & 1));
13503 DEBUG_P(PerlIO_printf(Perl_debug_log, "utf16_textfilter status=%"IVdf" SvCUR(sv)=%"UVuf"\n", status, (UV)SvCUR(utf16_buffer)));
ba77e4cc 13504 DEBUG_P({ sv_dump(utf16_buffer); sv_dump(utf8_buffer);});
c28d6105
NC
13505 if (status < 0) {
13506 /* Error */
13507 IoPAGE(filter) = status;
13508 return status;
13509 }
13510 }
13511
13512 chars = SvCUR(utf16_buffer) >> 1;
13513 have = SvCUR(utf8_buffer);
13514 SvGROW(utf8_buffer, have + chars * 3 + 1);
2a773401 13515
aa6dbd60 13516 if (reverse) {
c28d6105
NC
13517 end = utf16_to_utf8_reversed((U8*)SvPVX(utf16_buffer),
13518 (U8*)SvPVX_const(utf8_buffer) + have,
13519 chars * 2, &newlen);
aa6dbd60 13520 } else {
2a773401 13521 end = utf16_to_utf8((U8*)SvPVX(utf16_buffer),
c28d6105
NC
13522 (U8*)SvPVX_const(utf8_buffer) + have,
13523 chars * 2, &newlen);
2a773401 13524 }
c28d6105 13525 SvCUR_set(utf8_buffer, have + newlen);
2a773401 13526 *end = '\0';
c28d6105 13527
e07286ed
NC
13528 /* No need to keep this SV "well-formed" with a '\0' after the end, as
13529 it's private to us, and utf16_to_utf8{,reversed} take a
13530 (pointer,length) pair, rather than a NUL-terminated string. */
13531 if(SvCUR(utf16_buffer) & 1) {
13532 *SvPVX(utf16_buffer) = SvEND(utf16_buffer)[-1];
13533 SvCUR_set(utf16_buffer, 1);
13534 } else {
13535 SvCUR_set(utf16_buffer, 0);
13536 }
2a773401 13537 }
c28d6105
NC
13538 DEBUG_P(PerlIO_printf(Perl_debug_log,
13539 "utf16_textfilter: returns, status=%"IVdf" utf16=%"UVuf" utf8=%"UVuf"\n",
13540 status,
13541 (UV)SvCUR(utf16_buffer), (UV)SvCUR(utf8_buffer)));
13542 DEBUG_P({ sv_dump(utf8_buffer); sv_dump(sv);});
d2d1d4de 13543 return retval;
6e3aabd6 13544}
81a923f4
NC
13545
13546static U8 *
13547S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
13548{
2a773401 13549 SV *filter = filter_add(S_utf16_textfilter, NULL);
81a923f4 13550
c28d6105 13551 IoTOP_GV(filter) = MUTABLE_GV(newSVpvn((char *)s, PL_bufend - (char*)s));
f3040f2c 13552 sv_setpvs(filter, "");
2a773401 13553 IoLINES(filter) = reversed;
c28d6105
NC
13554 IoPAGE(filter) = 1; /* Not EOF */
13555
13556 /* Sadly, we have to return a valid pointer, come what may, so we have to
13557 ignore any error return from this. */
13558 SvCUR_set(PL_linestr, 0);
13559 if (FILTER_READ(0, PL_linestr, 0)) {
13560 SvUTF8_on(PL_linestr);
81a923f4 13561 } else {
c28d6105 13562 SvUTF8_on(PL_linestr);
81a923f4 13563 }
c28d6105 13564 PL_bufend = SvEND(PL_linestr);
81a923f4
NC
13565 return (U8*)SvPVX(PL_linestr);
13566}
6e3aabd6 13567#endif
9f4817db 13568
f333445c
JP
13569/*
13570Returns a pointer to the next character after the parsed
13571vstring, as well as updating the passed in sv.
13572
13573Function must be called like
13574
561b68a9 13575 sv = newSV(5);
65b06e02 13576 s = scan_vstring(s,e,sv);
f333445c 13577
65b06e02 13578where s and e are the start and end of the string.
f333445c
JP
13579The sv should already be large enough to store the vstring
13580passed in, for performance reasons.
13581
13582*/
13583
13584char *
15f169a1 13585Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
f333445c 13586{
97aff369 13587 dVAR;
bfed75c6
AL
13588 const char *pos = s;
13589 const char *start = s;
7918f24d
NC
13590
13591 PERL_ARGS_ASSERT_SCAN_VSTRING;
13592
f333445c 13593 if (*pos == 'v') pos++; /* get past 'v' */
65b06e02 13594 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
3e884cbf 13595 pos++;
f333445c
JP
13596 if ( *pos != '.') {
13597 /* this may not be a v-string if followed by => */
bfed75c6 13598 const char *next = pos;
65b06e02 13599 while (next < e && isSPACE(*next))
8fc7bb1c 13600 ++next;
65b06e02 13601 if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
13602 /* return string not v-string */
13603 sv_setpvn(sv,(char *)s,pos-s);
73d840c0 13604 return (char *)pos;
f333445c
JP
13605 }
13606 }
13607
13608 if (!isALPHA(*pos)) {
89ebb4a3 13609 U8 tmpbuf[UTF8_MAXBYTES+1];
f333445c 13610
d4c19fe8
AL
13611 if (*s == 'v')
13612 s++; /* get past 'v' */
f333445c 13613
76f68e9b 13614 sv_setpvs(sv, "");
f333445c
JP
13615
13616 for (;;) {
d4c19fe8 13617 /* this is atoi() that tolerates underscores */
0bd48802
AL
13618 U8 *tmpend;
13619 UV rev = 0;
d4c19fe8
AL
13620 const char *end = pos;
13621 UV mult = 1;
13622 while (--end >= s) {
13623 if (*end != '_') {
13624 const UV orev = rev;
f333445c
JP
13625 rev += (*end - '0') * mult;
13626 mult *= 10;
9b387841
NC
13627 if (orev > rev)
13628 Perl_ck_warner_d(aTHX_ packWARN(WARN_OVERFLOW),
13629 "Integer overflow in decimal number");
f333445c
JP
13630 }
13631 }
13632#ifdef EBCDIC
13633 if (rev > 0x7FFFFFFF)
13634 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
13635#endif
13636 /* Append native character for the rev point */
13637 tmpend = uvchr_to_utf8(tmpbuf, rev);
13638 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
13639 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
13640 SvUTF8_on(sv);
65b06e02 13641 if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
13642 s = ++pos;
13643 else {
13644 s = pos;
13645 break;
13646 }
65b06e02 13647 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
13648 pos++;
13649 }
13650 SvPOK_on(sv);
13651 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
13652 SvRMAGICAL_on(sv);
13653 }
73d840c0 13654 return (char *)s;
f333445c
JP
13655}
13656
88e1f1a2
JV
13657int
13658Perl_keyword_plugin_standard(pTHX_
13659 char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
13660{
13661 PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD;
13662 PERL_UNUSED_CONTEXT;
13663 PERL_UNUSED_ARG(keyword_ptr);
13664 PERL_UNUSED_ARG(keyword_len);
13665 PERL_UNUSED_ARG(op_ptr);
13666 return KEYWORD_PLUGIN_DECLINE;
13667}
13668
1da4ca5f
NC
13669/*
13670 * Local variables:
13671 * c-indentation-style: bsd
13672 * c-basic-offset: 4
13673 * indent-tabs-mode: t
13674 * End:
13675 *
37442d52
RGS
13676 * ex: set ts=8 sts=4 sw=4 noet:
13677 */