This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Resolve
[perl5.git] / toke.c
CommitLineData
a0d0e21e 1/* toke.c
a687059c 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
6ef55633 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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/*
12 * "It all comes from here, the stench and the peril." --Frodo
378cc40b
LW
13 */
14
9cbb5ea2
GS
15/*
16 * This file is the lexer for Perl. It's closely linked to the
4e553d73 17 * parser, perly.y.
ffb4593c
NT
18 *
19 * The main routine is yylex(), which returns the next token.
20 */
21
378cc40b 22#include "EXTERN.h"
864dbfa3 23#define PERL_IN_TOKE_C
378cc40b 24#include "perl.h"
378cc40b 25
5912531f 26#define yylval (PL_parser->yylval)
d3b6f988 27
acdf0a21
DM
28/* YYINITDEPTH -- initial size of the parser's stacks. */
29#define YYINITDEPTH 200
30
199e78b7
DM
31/* XXX temporary backwards compatibility */
32#define PL_lex_brackets (PL_parser->lex_brackets)
33#define PL_lex_brackstack (PL_parser->lex_brackstack)
34#define PL_lex_casemods (PL_parser->lex_casemods)
35#define PL_lex_casestack (PL_parser->lex_casestack)
36#define PL_lex_defer (PL_parser->lex_defer)
37#define PL_lex_dojoin (PL_parser->lex_dojoin)
38#define PL_lex_expect (PL_parser->lex_expect)
39#define PL_lex_formbrack (PL_parser->lex_formbrack)
40#define PL_lex_inpat (PL_parser->lex_inpat)
41#define PL_lex_inwhat (PL_parser->lex_inwhat)
42#define PL_lex_op (PL_parser->lex_op)
43#define PL_lex_repl (PL_parser->lex_repl)
44#define PL_lex_starts (PL_parser->lex_starts)
45#define PL_lex_stuff (PL_parser->lex_stuff)
46#define PL_multi_start (PL_parser->multi_start)
47#define PL_multi_open (PL_parser->multi_open)
48#define PL_multi_close (PL_parser->multi_close)
49#define PL_pending_ident (PL_parser->pending_ident)
50#define PL_preambled (PL_parser->preambled)
51#define PL_sublex_info (PL_parser->sublex_info)
bdc0bf6f 52#define PL_linestr (PL_parser->linestr)
c2598295
DM
53#define PL_expect (PL_parser->expect)
54#define PL_copline (PL_parser->copline)
f06b5848
DM
55#define PL_bufptr (PL_parser->bufptr)
56#define PL_oldbufptr (PL_parser->oldbufptr)
57#define PL_oldoldbufptr (PL_parser->oldoldbufptr)
58#define PL_linestart (PL_parser->linestart)
59#define PL_bufend (PL_parser->bufend)
60#define PL_last_uni (PL_parser->last_uni)
61#define PL_last_lop (PL_parser->last_lop)
62#define PL_last_lop_op (PL_parser->last_lop_op)
bc177e6b 63#define PL_lex_state (PL_parser->lex_state)
2f9285f8 64#define PL_rsfp (PL_parser->rsfp)
5486870f 65#define PL_rsfp_filters (PL_parser->rsfp_filters)
12bd6ede
DM
66#define PL_in_my (PL_parser->in_my)
67#define PL_in_my_stash (PL_parser->in_my_stash)
14047fc9 68#define PL_tokenbuf (PL_parser->tokenbuf)
670a9cb2 69#define PL_multi_end (PL_parser->multi_end)
13765c85 70#define PL_error_count (PL_parser->error_count)
199e78b7
DM
71
72#ifdef PERL_MAD
73# define PL_endwhite (PL_parser->endwhite)
74# define PL_faketokens (PL_parser->faketokens)
75# define PL_lasttoke (PL_parser->lasttoke)
76# define PL_nextwhite (PL_parser->nextwhite)
77# define PL_realtokenstart (PL_parser->realtokenstart)
78# define PL_skipwhite (PL_parser->skipwhite)
79# define PL_thisclose (PL_parser->thisclose)
80# define PL_thismad (PL_parser->thismad)
81# define PL_thisopen (PL_parser->thisopen)
82# define PL_thisstuff (PL_parser->thisstuff)
83# define PL_thistoken (PL_parser->thistoken)
84# define PL_thiswhite (PL_parser->thiswhite)
fb205e7a
DM
85# define PL_thiswhite (PL_parser->thiswhite)
86# define PL_nexttoke (PL_parser->nexttoke)
87# define PL_curforce (PL_parser->curforce)
88#else
89# define PL_nexttoke (PL_parser->nexttoke)
90# define PL_nexttype (PL_parser->nexttype)
91# define PL_nextval (PL_parser->nextval)
199e78b7
DM
92#endif
93
3cbf51f5
DM
94static int
95S_pending_ident(pTHX);
199e78b7 96
0bd48802 97static const char ident_too_long[] = "Identifier too long";
c445ea15 98static const char commaless_variable_list[] = "comma-less variable list";
8903cb82 99
6e3aabd6 100#ifndef PERL_NO_UTF16_FILTER
acfe0abc
GS
101static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
102static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
6e3aabd6 103#endif
51371543 104
29595ff2 105#ifdef PERL_MAD
29595ff2 106# define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
cd81e915 107# define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
9ded7720 108#else
5db06880 109# define CURMAD(slot,sv)
9ded7720 110# define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
29595ff2
NC
111#endif
112
9059aa12
LW
113#define XFAKEBRACK 128
114#define XENUMMASK 127
115
39e02b42
JH
116#ifdef USE_UTF8_SCRIPTS
117# define UTF (!IN_BYTES)
2b9d42f0 118#else
746b446a 119# define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
2b9d42f0 120#endif
a0ed51b3 121
61f0cdd9 122/* In variables named $^X, these are the legal values for X.
2b92dfce
GS
123 * 1999-02-27 mjd-perl-patch@plover.com */
124#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
125
bf4acbe4
GS
126/* On MacOS, respect nonbreaking spaces */
127#ifdef MACOS_TRADITIONAL
128#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
129#else
130#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
131#endif
132
ffb4593c
NT
133/* LEX_* are values for PL_lex_state, the state of the lexer.
134 * They are arranged oddly so that the guard on the switch statement
79072805
LW
135 * can get by with a single comparison (if the compiler is smart enough).
136 */
137
fb73857a 138/* #define LEX_NOTPARSING 11 is done in perl.h. */
139
b6007c36
DM
140#define LEX_NORMAL 10 /* normal code (ie not within "...") */
141#define LEX_INTERPNORMAL 9 /* code within a string, eg "$foo[$x+1]" */
142#define LEX_INTERPCASEMOD 8 /* expecting a \U, \Q or \E etc */
143#define LEX_INTERPPUSH 7 /* starting a new sublex parse level */
144#define LEX_INTERPSTART 6 /* expecting the start of a $var */
145
146 /* at end of code, eg "$x" followed by: */
147#define LEX_INTERPEND 5 /* ... eg not one of [, { or -> */
148#define LEX_INTERPENDMAYBE 4 /* ... eg one of [, { or -> */
149
150#define LEX_INTERPCONCAT 3 /* expecting anything, eg at start of
151 string or after \E, $foo, etc */
152#define LEX_INTERPCONST 2 /* NOT USED */
153#define LEX_FORMLINE 1 /* expecting a format line */
154#define LEX_KNOWNEXT 0 /* next token known; just return it */
155
79072805 156
bbf60fe6 157#ifdef DEBUGGING
27da23d5 158static const char* const lex_state_names[] = {
bbf60fe6
DM
159 "KNOWNEXT",
160 "FORMLINE",
161 "INTERPCONST",
162 "INTERPCONCAT",
163 "INTERPENDMAYBE",
164 "INTERPEND",
165 "INTERPSTART",
166 "INTERPPUSH",
167 "INTERPCASEMOD",
168 "INTERPNORMAL",
169 "NORMAL"
170};
171#endif
172
79072805
LW
173#ifdef ff_next
174#undef ff_next
d48672a2
LW
175#endif
176
79072805 177#include "keywords.h"
fe14fcc3 178
ffb4593c
NT
179/* CLINE is a macro that ensures PL_copline has a sane value */
180
ae986130
LW
181#ifdef CLINE
182#undef CLINE
183#endif
57843af0 184#define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
3280af22 185
5db06880 186#ifdef PERL_MAD
29595ff2
NC
187# define SKIPSPACE0(s) skipspace0(s)
188# define SKIPSPACE1(s) skipspace1(s)
189# define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
190# define PEEKSPACE(s) skipspace2(s,0)
191#else
192# define SKIPSPACE0(s) skipspace(s)
193# define SKIPSPACE1(s) skipspace(s)
194# define SKIPSPACE2(s,tsv) skipspace(s)
195# define PEEKSPACE(s) skipspace(s)
196#endif
197
ffb4593c
NT
198/*
199 * Convenience functions to return different tokens and prime the
9cbb5ea2 200 * lexer for the next token. They all take an argument.
ffb4593c
NT
201 *
202 * TOKEN : generic token (used for '(', DOLSHARP, etc)
203 * OPERATOR : generic operator
204 * AOPERATOR : assignment operator
205 * PREBLOCK : beginning the block after an if, while, foreach, ...
206 * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
207 * PREREF : *EXPR where EXPR is not a simple identifier
208 * TERM : expression term
209 * LOOPX : loop exiting command (goto, last, dump, etc)
210 * FTST : file test operator
211 * FUN0 : zero-argument function
2d2e263d 212 * FUN1 : not used, except for not, which isn't a UNIOP
ffb4593c
NT
213 * BOop : bitwise or or xor
214 * BAop : bitwise and
215 * SHop : shift operator
216 * PWop : power operator
9cbb5ea2 217 * PMop : pattern-matching operator
ffb4593c
NT
218 * Aop : addition-level operator
219 * Mop : multiplication-level operator
220 * Eop : equality-testing operator
e5edeb50 221 * Rop : relational operator <= != gt
ffb4593c
NT
222 *
223 * Also see LOP and lop() below.
224 */
225
998054bd 226#ifdef DEBUGGING /* Serve -DT. */
f5bd084c 227# define REPORT(retval) tokereport((I32)retval)
998054bd 228#else
bbf60fe6 229# define REPORT(retval) (retval)
998054bd
SC
230#endif
231
bbf60fe6
DM
232#define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
233#define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
234#define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
235#define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
236#define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
237#define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
238#define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
239#define LOOPX(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
240#define FTST(f) return (yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
241#define FUN0(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
242#define FUN1(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
243#define BOop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
244#define BAop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
245#define SHop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
246#define PWop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
247#define PMop(f) return(yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
248#define Aop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
249#define Mop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
250#define Eop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
251#define Rop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
2f3197b3 252
a687059c
LW
253/* This bit of chicanery makes a unary function followed by
254 * a parenthesis into a function with one argument, highest precedence.
6f33ba73
RGS
255 * The UNIDOR macro is for unary functions that can be followed by the //
256 * operator (such as C<shift // 0>).
a687059c 257 */
376fcdbf
AL
258#define UNI2(f,x) { \
259 yylval.ival = f; \
260 PL_expect = x; \
261 PL_bufptr = s; \
262 PL_last_uni = PL_oldbufptr; \
263 PL_last_lop_op = f; \
264 if (*s == '(') \
265 return REPORT( (int)FUNC1 ); \
29595ff2 266 s = PEEKSPACE(s); \
376fcdbf
AL
267 return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
268 }
6f33ba73
RGS
269#define UNI(f) UNI2(f,XTERM)
270#define UNIDOR(f) UNI2(f,XTERMORDORDOR)
a687059c 271
376fcdbf
AL
272#define UNIBRACK(f) { \
273 yylval.ival = f; \
274 PL_bufptr = s; \
275 PL_last_uni = PL_oldbufptr; \
276 if (*s == '(') \
277 return REPORT( (int)FUNC1 ); \
29595ff2 278 s = PEEKSPACE(s); \
376fcdbf
AL
279 return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
280 }
79072805 281
9f68db38 282/* grandfather return to old style */
3280af22 283#define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
79072805 284
8fa7f367
JH
285#ifdef DEBUGGING
286
bbf60fe6
DM
287/* how to interpret the yylval associated with the token */
288enum token_type {
289 TOKENTYPE_NONE,
290 TOKENTYPE_IVAL,
291 TOKENTYPE_OPNUM, /* yylval.ival contains an opcode number */
292 TOKENTYPE_PVAL,
293 TOKENTYPE_OPVAL,
294 TOKENTYPE_GVVAL
295};
296
6d4a66ac
NC
297static struct debug_tokens {
298 const int token;
299 enum token_type type;
300 const char *name;
301} const debug_tokens[] =
9041c2e3 302{
bbf60fe6
DM
303 { ADDOP, TOKENTYPE_OPNUM, "ADDOP" },
304 { ANDAND, TOKENTYPE_NONE, "ANDAND" },
305 { ANDOP, TOKENTYPE_NONE, "ANDOP" },
306 { ANONSUB, TOKENTYPE_IVAL, "ANONSUB" },
307 { ARROW, TOKENTYPE_NONE, "ARROW" },
308 { ASSIGNOP, TOKENTYPE_OPNUM, "ASSIGNOP" },
309 { BITANDOP, TOKENTYPE_OPNUM, "BITANDOP" },
310 { BITOROP, TOKENTYPE_OPNUM, "BITOROP" },
311 { COLONATTR, TOKENTYPE_NONE, "COLONATTR" },
312 { CONTINUE, TOKENTYPE_NONE, "CONTINUE" },
0d863452 313 { DEFAULT, TOKENTYPE_NONE, "DEFAULT" },
bbf60fe6
DM
314 { DO, TOKENTYPE_NONE, "DO" },
315 { DOLSHARP, TOKENTYPE_NONE, "DOLSHARP" },
316 { DORDOR, TOKENTYPE_NONE, "DORDOR" },
317 { DOROP, TOKENTYPE_OPNUM, "DOROP" },
318 { DOTDOT, TOKENTYPE_IVAL, "DOTDOT" },
319 { ELSE, TOKENTYPE_NONE, "ELSE" },
320 { ELSIF, TOKENTYPE_IVAL, "ELSIF" },
321 { EQOP, TOKENTYPE_OPNUM, "EQOP" },
322 { FOR, TOKENTYPE_IVAL, "FOR" },
323 { FORMAT, TOKENTYPE_NONE, "FORMAT" },
324 { FUNC, TOKENTYPE_OPNUM, "FUNC" },
325 { FUNC0, TOKENTYPE_OPNUM, "FUNC0" },
326 { FUNC0SUB, TOKENTYPE_OPVAL, "FUNC0SUB" },
327 { FUNC1, TOKENTYPE_OPNUM, "FUNC1" },
328 { FUNCMETH, TOKENTYPE_OPVAL, "FUNCMETH" },
0d863452 329 { GIVEN, TOKENTYPE_IVAL, "GIVEN" },
bbf60fe6
DM
330 { HASHBRACK, TOKENTYPE_NONE, "HASHBRACK" },
331 { IF, TOKENTYPE_IVAL, "IF" },
332 { LABEL, TOKENTYPE_PVAL, "LABEL" },
333 { LOCAL, TOKENTYPE_IVAL, "LOCAL" },
334 { LOOPEX, TOKENTYPE_OPNUM, "LOOPEX" },
335 { LSTOP, TOKENTYPE_OPNUM, "LSTOP" },
336 { LSTOPSUB, TOKENTYPE_OPVAL, "LSTOPSUB" },
337 { MATCHOP, TOKENTYPE_OPNUM, "MATCHOP" },
338 { METHOD, TOKENTYPE_OPVAL, "METHOD" },
339 { MULOP, TOKENTYPE_OPNUM, "MULOP" },
340 { MY, TOKENTYPE_IVAL, "MY" },
341 { MYSUB, TOKENTYPE_NONE, "MYSUB" },
342 { NOAMP, TOKENTYPE_NONE, "NOAMP" },
343 { NOTOP, TOKENTYPE_NONE, "NOTOP" },
344 { OROP, TOKENTYPE_IVAL, "OROP" },
345 { OROR, TOKENTYPE_NONE, "OROR" },
346 { PACKAGE, TOKENTYPE_NONE, "PACKAGE" },
347 { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" },
348 { POSTDEC, TOKENTYPE_NONE, "POSTDEC" },
349 { POSTINC, TOKENTYPE_NONE, "POSTINC" },
350 { POWOP, TOKENTYPE_OPNUM, "POWOP" },
351 { PREDEC, TOKENTYPE_NONE, "PREDEC" },
352 { PREINC, TOKENTYPE_NONE, "PREINC" },
353 { PRIVATEREF, TOKENTYPE_OPVAL, "PRIVATEREF" },
354 { REFGEN, TOKENTYPE_NONE, "REFGEN" },
355 { RELOP, TOKENTYPE_OPNUM, "RELOP" },
356 { SHIFTOP, TOKENTYPE_OPNUM, "SHIFTOP" },
357 { SUB, TOKENTYPE_NONE, "SUB" },
358 { THING, TOKENTYPE_OPVAL, "THING" },
359 { UMINUS, TOKENTYPE_NONE, "UMINUS" },
360 { UNIOP, TOKENTYPE_OPNUM, "UNIOP" },
361 { UNIOPSUB, TOKENTYPE_OPVAL, "UNIOPSUB" },
362 { UNLESS, TOKENTYPE_IVAL, "UNLESS" },
363 { UNTIL, TOKENTYPE_IVAL, "UNTIL" },
364 { USE, TOKENTYPE_IVAL, "USE" },
0d863452 365 { WHEN, TOKENTYPE_IVAL, "WHEN" },
bbf60fe6
DM
366 { WHILE, TOKENTYPE_IVAL, "WHILE" },
367 { WORD, TOKENTYPE_OPVAL, "WORD" },
c35e046a 368 { 0, TOKENTYPE_NONE, NULL }
bbf60fe6
DM
369};
370
371/* dump the returned token in rv, plus any optional arg in yylval */
998054bd 372
bbf60fe6 373STATIC int
f5bd084c 374S_tokereport(pTHX_ I32 rv)
bbf60fe6 375{
97aff369 376 dVAR;
bbf60fe6 377 if (DEBUG_T_TEST) {
bd61b366 378 const char *name = NULL;
bbf60fe6 379 enum token_type type = TOKENTYPE_NONE;
f54cb97a 380 const struct debug_tokens *p;
396482e1 381 SV* const report = newSVpvs("<== ");
bbf60fe6 382
f54cb97a 383 for (p = debug_tokens; p->token; p++) {
bbf60fe6
DM
384 if (p->token == (int)rv) {
385 name = p->name;
386 type = p->type;
387 break;
388 }
389 }
390 if (name)
54667de8 391 Perl_sv_catpv(aTHX_ report, name);
bbf60fe6
DM
392 else if ((char)rv > ' ' && (char)rv < '~')
393 Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
394 else if (!rv)
396482e1 395 sv_catpvs(report, "EOF");
bbf60fe6
DM
396 else
397 Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
398 switch (type) {
399 case TOKENTYPE_NONE:
400 case TOKENTYPE_GVVAL: /* doesn't appear to be used */
401 break;
402 case TOKENTYPE_IVAL:
e4584336 403 Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)yylval.ival);
bbf60fe6
DM
404 break;
405 case TOKENTYPE_OPNUM:
406 Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
407 PL_op_name[yylval.ival]);
408 break;
409 case TOKENTYPE_PVAL:
410 Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", yylval.pval);
411 break;
412 case TOKENTYPE_OPVAL:
b6007c36 413 if (yylval.opval) {
401441c0 414 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
bbf60fe6 415 PL_op_name[yylval.opval->op_type]);
b6007c36
DM
416 if (yylval.opval->op_type == OP_CONST) {
417 Perl_sv_catpvf(aTHX_ report, " %s",
418 SvPEEK(cSVOPx_sv(yylval.opval)));
419 }
420
421 }
401441c0 422 else
396482e1 423 sv_catpvs(report, "(opval=null)");
bbf60fe6
DM
424 break;
425 }
b6007c36 426 PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
bbf60fe6
DM
427 };
428 return (int)rv;
998054bd
SC
429}
430
b6007c36
DM
431
432/* print the buffer with suitable escapes */
433
434STATIC void
435S_printbuf(pTHX_ const char* fmt, const char* s)
436{
396482e1 437 SV* const tmp = newSVpvs("");
b6007c36
DM
438 PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
439 SvREFCNT_dec(tmp);
440}
441
8fa7f367
JH
442#endif
443
ffb4593c
NT
444/*
445 * S_ao
446 *
c963b151
BD
447 * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
448 * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
ffb4593c
NT
449 */
450
76e3520e 451STATIC int
cea2e8a9 452S_ao(pTHX_ int toketype)
a0d0e21e 453{
97aff369 454 dVAR;
3280af22
NIS
455 if (*PL_bufptr == '=') {
456 PL_bufptr++;
a0d0e21e
LW
457 if (toketype == ANDAND)
458 yylval.ival = OP_ANDASSIGN;
459 else if (toketype == OROR)
460 yylval.ival = OP_ORASSIGN;
c963b151
BD
461 else if (toketype == DORDOR)
462 yylval.ival = OP_DORASSIGN;
a0d0e21e
LW
463 toketype = ASSIGNOP;
464 }
465 return toketype;
466}
467
ffb4593c
NT
468/*
469 * S_no_op
470 * When Perl expects an operator and finds something else, no_op
471 * prints the warning. It always prints "<something> found where
472 * operator expected. It prints "Missing semicolon on previous line?"
473 * if the surprise occurs at the start of the line. "do you need to
474 * predeclare ..." is printed out for code like "sub bar; foo bar $x"
475 * where the compiler doesn't know if foo is a method call or a function.
476 * It prints "Missing operator before end of line" if there's nothing
477 * after the missing operator, or "... before <...>" if there is something
478 * after the missing operator.
479 */
480
76e3520e 481STATIC void
bfed75c6 482S_no_op(pTHX_ const char *what, char *s)
463ee0b2 483{
97aff369 484 dVAR;
9d4ba2ae
AL
485 char * const oldbp = PL_bufptr;
486 const bool is_first = (PL_oldbufptr == PL_linestart);
68dc0745 487
1189a94a
GS
488 if (!s)
489 s = oldbp;
07c798fb 490 else
1189a94a 491 PL_bufptr = s;
cea2e8a9 492 yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
56da5a46
RGS
493 if (ckWARN_d(WARN_SYNTAX)) {
494 if (is_first)
495 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
496 "\t(Missing semicolon on previous line?)\n");
497 else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
f54cb97a 498 const char *t;
c35e046a
AL
499 for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
500 NOOP;
56da5a46
RGS
501 if (t < PL_bufptr && isSPACE(*t))
502 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
503 "\t(Do you need to predeclare %.*s?)\n",
551405c4 504 (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
56da5a46
RGS
505 }
506 else {
507 assert(s >= oldbp);
508 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
551405c4 509 "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
56da5a46 510 }
07c798fb 511 }
3280af22 512 PL_bufptr = oldbp;
8990e307
LW
513}
514
ffb4593c
NT
515/*
516 * S_missingterm
517 * Complain about missing quote/regexp/heredoc terminator.
d4c19fe8 518 * If it's called with NULL then it cauterizes the line buffer.
ffb4593c
NT
519 * If we're in a delimited string and the delimiter is a control
520 * character, it's reformatted into a two-char sequence like ^C.
521 * This is fatal.
522 */
523
76e3520e 524STATIC void
cea2e8a9 525S_missingterm(pTHX_ char *s)
8990e307 526{
97aff369 527 dVAR;
8990e307
LW
528 char tmpbuf[3];
529 char q;
530 if (s) {
9d4ba2ae 531 char * const nl = strrchr(s,'\n');
d2719217 532 if (nl)
8990e307
LW
533 *nl = '\0';
534 }
9d116dd7
JH
535 else if (
536#ifdef EBCDIC
537 iscntrl(PL_multi_close)
538#else
539 PL_multi_close < 32 || PL_multi_close == 127
540#endif
541 ) {
8990e307 542 *tmpbuf = '^';
585ec06d 543 tmpbuf[1] = (char)toCTRL(PL_multi_close);
8990e307
LW
544 tmpbuf[2] = '\0';
545 s = tmpbuf;
546 }
547 else {
eb160463 548 *tmpbuf = (char)PL_multi_close;
8990e307
LW
549 tmpbuf[1] = '\0';
550 s = tmpbuf;
551 }
552 q = strchr(s,'"') ? '\'' : '"';
cea2e8a9 553 Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
463ee0b2 554}
79072805 555
ef89dcc3 556#define FEATURE_IS_ENABLED(name) \
0d863452 557 ((0 != (PL_hints & HINT_LOCALIZE_HH)) \
89529cee 558 && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
0d863452
RH
559/*
560 * S_feature_is_enabled
561 * Check whether the named feature is enabled.
562 */
563STATIC bool
d4c19fe8 564S_feature_is_enabled(pTHX_ const char *name, STRLEN namelen)
0d863452 565{
97aff369 566 dVAR;
0d863452 567 HV * const hinthv = GvHV(PL_hintgv);
7b9ef140 568 char he_name[32] = "feature_";
6fca0082 569 (void) my_strlcpy(&he_name[8], name, 24);
d4c19fe8 570
7b9ef140 571 return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
0d863452
RH
572}
573
ffb4593c
NT
574/*
575 * Perl_deprecate
ffb4593c
NT
576 */
577
79072805 578void
bfed75c6 579Perl_deprecate(pTHX_ const char *s)
a0d0e21e 580{
599cee73 581 if (ckWARN(WARN_DEPRECATED))
9014280d 582 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
a0d0e21e
LW
583}
584
12bcd1a6 585void
bfed75c6 586Perl_deprecate_old(pTHX_ const char *s)
12bcd1a6
PM
587{
588 /* This function should NOT be called for any new deprecated warnings */
589 /* Use Perl_deprecate instead */
590 /* */
591 /* It is here to maintain backward compatibility with the pre-5.8 */
592 /* warnings category hierarchy. The "deprecated" category used to */
593 /* live under the "syntax" category. It is now a top-level category */
594 /* in its own right. */
595
596 if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
bfed75c6 597 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
12bcd1a6
PM
598 "Use of %s is deprecated", s);
599}
600
ffb4593c 601/*
9cbb5ea2
GS
602 * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
603 * utf16-to-utf8-reversed.
ffb4593c
NT
604 */
605
c39cd008
GS
606#ifdef PERL_CR_FILTER
607static void
608strip_return(SV *sv)
609{
95a20fc0 610 register const char *s = SvPVX_const(sv);
9d4ba2ae 611 register const char * const e = s + SvCUR(sv);
c39cd008
GS
612 /* outer loop optimized to do nothing if there are no CR-LFs */
613 while (s < e) {
614 if (*s++ == '\r' && *s == '\n') {
615 /* hit a CR-LF, need to copy the rest */
616 register char *d = s - 1;
617 *d++ = *s++;
618 while (s < e) {
619 if (*s == '\r' && s[1] == '\n')
620 s++;
621 *d++ = *s++;
622 }
623 SvCUR(sv) -= s - d;
624 return;
625 }
626 }
627}
a868473f 628
76e3520e 629STATIC I32
c39cd008 630S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
a868473f 631{
f54cb97a 632 const I32 count = FILTER_READ(idx+1, sv, maxlen);
c39cd008
GS
633 if (count > 0 && !maxlen)
634 strip_return(sv);
635 return count;
a868473f
NIS
636}
637#endif
638
199e78b7
DM
639
640
ffb4593c
NT
641/*
642 * Perl_lex_start
5486870f 643 *
e3abe207 644 * Create a parser object and initialise its parser and lexer fields
5486870f
DM
645 *
646 * rsfp is the opened file handle to read from (if any),
647 *
648 * line holds any initial content already read from the file (or in
649 * the case of no file, such as an eval, the whole contents);
650 *
651 * new_filter indicates that this is a new file and it shouldn't inherit
652 * the filters from the current parser (ie require).
ffb4593c
NT
653 */
654
a0d0e21e 655void
5486870f 656Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, bool new_filter)
79072805 657{
97aff369 658 dVAR;
6ef55633 659 const char *s = NULL;
8990e307 660 STRLEN len;
5486870f 661 yy_parser *parser, *oparser;
acdf0a21
DM
662
663 /* create and initialise a parser */
664
199e78b7 665 Newxz(parser, 1, yy_parser);
5486870f 666 parser->old_parser = oparser = PL_parser;
acdf0a21
DM
667 PL_parser = parser;
668
669 Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
670 parser->ps = parser->stack;
671 parser->stack_size = YYINITDEPTH;
672
673 parser->stack->state = 0;
674 parser->yyerrstatus = 0;
675 parser->yychar = YYEMPTY; /* Cause a token to be read. */
676
e3abe207
DM
677 /* on scope exit, free this parser and restore any outer one */
678 SAVEPARSER(parser);
7c4baf47 679 parser->saved_curcop = PL_curcop;
e3abe207 680
acdf0a21 681 /* initialise lexer state */
8990e307 682
fb205e7a
DM
683#ifdef PERL_MAD
684 parser->curforce = -1;
685#else
686 parser->nexttoke = 0;
687#endif
c2598295 688 parser->copline = NOLINE;
5afb0a62 689 parser->lex_state = LEX_NORMAL;
c2598295 690 parser->expect = XSTATE;
2f9285f8 691 parser->rsfp = rsfp;
56b27c9a 692 parser->rsfp_filters = (new_filter || !oparser) ? newAV()
5486870f 693 : (AV*)SvREFCNT_inc(oparser->rsfp_filters);
2f9285f8 694
199e78b7
DM
695 Newx(parser->lex_brackstack, 120, char);
696 Newx(parser->lex_casestack, 12, char);
697 *parser->lex_casestack = '\0';
02b34bbe 698
10efb74f
NC
699 if (line) {
700 s = SvPV_const(line, len);
701 } else {
702 len = 0;
703 }
bdc0bf6f 704
10efb74f 705 if (!len) {
bdc0bf6f 706 parser->linestr = newSVpvs("\n;");
10efb74f 707 } else if (SvREADONLY(line) || s[len-1] != ';') {
bdc0bf6f 708 parser->linestr = newSVsv(line);
10efb74f 709 if (s[len-1] != ';')
bdc0bf6f 710 sv_catpvs(parser->linestr, "\n;");
6c5ce11d
NC
711 } else {
712 SvTEMP_off(line);
713 SvREFCNT_inc_simple_void_NN(line);
bdc0bf6f 714 parser->linestr = line;
8990e307 715 }
f06b5848
DM
716 parser->oldoldbufptr =
717 parser->oldbufptr =
718 parser->bufptr =
719 parser->linestart = SvPVX(parser->linestr);
720 parser->bufend = parser->bufptr + SvCUR(parser->linestr);
721 parser->last_lop = parser->last_uni = NULL;
79072805 722}
a687059c 723
e3abe207
DM
724
725/* delete a parser object */
726
727void
728Perl_parser_free(pTHX_ const yy_parser *parser)
729{
7c4baf47 730 PL_curcop = parser->saved_curcop;
bdc0bf6f
DM
731 SvREFCNT_dec(parser->linestr);
732
2f9285f8
DM
733 if (parser->rsfp == PerlIO_stdin())
734 PerlIO_clearerr(parser->rsfp);
735 else if (parser->rsfp && parser->old_parser
736 && parser->rsfp != parser->old_parser->rsfp)
737 PerlIO_close(parser->rsfp);
5486870f 738 SvREFCNT_dec(parser->rsfp_filters);
2f9285f8 739
e3abe207
DM
740 Safefree(parser->stack);
741 Safefree(parser->lex_brackstack);
742 Safefree(parser->lex_casestack);
743 PL_parser = parser->old_parser;
744 Safefree(parser);
745}
746
747
ffb4593c
NT
748/*
749 * Perl_lex_end
9cbb5ea2
GS
750 * Finalizer for lexing operations. Must be called when the parser is
751 * done with the lexer.
ffb4593c
NT
752 */
753
463ee0b2 754void
864dbfa3 755Perl_lex_end(pTHX)
463ee0b2 756{
97aff369 757 dVAR;
3280af22 758 PL_doextract = FALSE;
463ee0b2
LW
759}
760
ffb4593c
NT
761/*
762 * S_incline
763 * This subroutine has nothing to do with tilting, whether at windmills
764 * or pinball tables. Its name is short for "increment line". It
57843af0 765 * increments the current line number in CopLINE(PL_curcop) and checks
ffb4593c 766 * to see whether the line starts with a comment of the form
9cbb5ea2
GS
767 * # line 500 "foo.pm"
768 * If so, it sets the current line number and file to the values in the comment.
ffb4593c
NT
769 */
770
76e3520e 771STATIC void
d9095cec 772S_incline(pTHX_ const char *s)
463ee0b2 773{
97aff369 774 dVAR;
d9095cec
NC
775 const char *t;
776 const char *n;
777 const char *e;
463ee0b2 778
57843af0 779 CopLINE_inc(PL_curcop);
463ee0b2
LW
780 if (*s++ != '#')
781 return;
d4c19fe8
AL
782 while (SPACE_OR_TAB(*s))
783 s++;
73659bf1
GS
784 if (strnEQ(s, "line", 4))
785 s += 4;
786 else
787 return;
084592ab 788 if (SPACE_OR_TAB(*s))
73659bf1 789 s++;
4e553d73 790 else
73659bf1 791 return;
d4c19fe8
AL
792 while (SPACE_OR_TAB(*s))
793 s++;
463ee0b2
LW
794 if (!isDIGIT(*s))
795 return;
d4c19fe8 796
463ee0b2
LW
797 n = s;
798 while (isDIGIT(*s))
799 s++;
bf4acbe4 800 while (SPACE_OR_TAB(*s))
463ee0b2 801 s++;
73659bf1 802 if (*s == '"' && (t = strchr(s+1, '"'))) {
463ee0b2 803 s++;
73659bf1
GS
804 e = t + 1;
805 }
463ee0b2 806 else {
c35e046a
AL
807 t = s;
808 while (!isSPACE(*t))
809 t++;
73659bf1 810 e = t;
463ee0b2 811 }
bf4acbe4 812 while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
73659bf1
GS
813 e++;
814 if (*e != '\n' && *e != '\0')
815 return; /* false alarm */
816
f4dd75d9 817 if (t - s > 0) {
d9095cec 818 const STRLEN len = t - s;
8a5ee598 819#ifndef USE_ITHREADS
c4420975 820 const char * const cf = CopFILE(PL_curcop);
42d9b98d
NC
821 STRLEN tmplen = cf ? strlen(cf) : 0;
822 if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
e66cf94c
RGS
823 /* must copy *{"::_<(eval N)[oldfilename:L]"}
824 * to *{"::_<newfilename"} */
44867030
NC
825 /* However, the long form of evals is only turned on by the
826 debugger - usually they're "(eval %lu)" */
827 char smallbuf[128];
828 char *tmpbuf;
829 GV **gvp;
d9095cec 830 STRLEN tmplen2 = len;
798b63bc 831 if (tmplen + 2 <= sizeof smallbuf)
e66cf94c
RGS
832 tmpbuf = smallbuf;
833 else
2ae0db35 834 Newx(tmpbuf, tmplen + 2, char);
44867030
NC
835 tmpbuf[0] = '_';
836 tmpbuf[1] = '<';
2ae0db35 837 memcpy(tmpbuf + 2, cf, tmplen);
44867030 838 tmplen += 2;
8a5ee598
RGS
839 gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
840 if (gvp) {
44867030
NC
841 char *tmpbuf2;
842 GV *gv2;
843
844 if (tmplen2 + 2 <= sizeof smallbuf)
845 tmpbuf2 = smallbuf;
846 else
847 Newx(tmpbuf2, tmplen2 + 2, char);
848
849 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
850 /* Either they malloc'd it, or we malloc'd it,
851 so no prefix is present in ours. */
852 tmpbuf2[0] = '_';
853 tmpbuf2[1] = '<';
854 }
855
856 memcpy(tmpbuf2 + 2, s, tmplen2);
857 tmplen2 += 2;
858
8a5ee598 859 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
e5527e4b 860 if (!isGV(gv2)) {
8a5ee598 861 gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
e5527e4b
RGS
862 /* adjust ${"::_<newfilename"} to store the new file name */
863 GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
864 GvHV(gv2) = (HV*)SvREFCNT_inc(GvHV(*gvp));
865 GvAV(gv2) = (AV*)SvREFCNT_inc(GvAV(*gvp));
866 }
44867030
NC
867
868 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
8a5ee598 869 }
e66cf94c 870 if (tmpbuf != smallbuf) Safefree(tmpbuf);
e66cf94c 871 }
8a5ee598 872#endif
05ec9bb3 873 CopFILE_free(PL_curcop);
d9095cec 874 CopFILE_setn(PL_curcop, s, len);
f4dd75d9 875 }
57843af0 876 CopLINE_set(PL_curcop, atoi(n)-1);
463ee0b2
LW
877}
878
29595ff2 879#ifdef PERL_MAD
cd81e915 880/* skip space before PL_thistoken */
29595ff2
NC
881
882STATIC char *
883S_skipspace0(pTHX_ register char *s)
884{
885 s = skipspace(s);
886 if (!PL_madskills)
887 return s;
cd81e915
NC
888 if (PL_skipwhite) {
889 if (!PL_thiswhite)
6b29d1f5 890 PL_thiswhite = newSVpvs("");
cd81e915
NC
891 sv_catsv(PL_thiswhite, PL_skipwhite);
892 sv_free(PL_skipwhite);
893 PL_skipwhite = 0;
894 }
895 PL_realtokenstart = s - SvPVX(PL_linestr);
29595ff2
NC
896 return s;
897}
898
cd81e915 899/* skip space after PL_thistoken */
29595ff2
NC
900
901STATIC char *
902S_skipspace1(pTHX_ register char *s)
903{
d4c19fe8 904 const char *start = s;
29595ff2
NC
905 I32 startoff = start - SvPVX(PL_linestr);
906
907 s = skipspace(s);
908 if (!PL_madskills)
909 return s;
910 start = SvPVX(PL_linestr) + startoff;
cd81e915 911 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 912 const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
913 PL_thistoken = newSVpvn(tstart, start - tstart);
914 }
915 PL_realtokenstart = -1;
916 if (PL_skipwhite) {
917 if (!PL_nextwhite)
6b29d1f5 918 PL_nextwhite = newSVpvs("");
cd81e915
NC
919 sv_catsv(PL_nextwhite, PL_skipwhite);
920 sv_free(PL_skipwhite);
921 PL_skipwhite = 0;
29595ff2
NC
922 }
923 return s;
924}
925
926STATIC char *
927S_skipspace2(pTHX_ register char *s, SV **svp)
928{
c35e046a
AL
929 char *start;
930 const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
931 const I32 startoff = s - SvPVX(PL_linestr);
932
29595ff2
NC
933 s = skipspace(s);
934 PL_bufptr = SvPVX(PL_linestr) + bufptroff;
935 if (!PL_madskills || !svp)
936 return s;
937 start = SvPVX(PL_linestr) + startoff;
cd81e915 938 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 939 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
940 PL_thistoken = newSVpvn(tstart, start - tstart);
941 PL_realtokenstart = -1;
29595ff2 942 }
cd81e915 943 if (PL_skipwhite) {
29595ff2 944 if (!*svp)
6b29d1f5 945 *svp = newSVpvs("");
cd81e915
NC
946 sv_setsv(*svp, PL_skipwhite);
947 sv_free(PL_skipwhite);
948 PL_skipwhite = 0;
29595ff2
NC
949 }
950
951 return s;
952}
953#endif
954
80a702cd 955STATIC void
5fa550fb 956S_update_debugger_info(pTHX_ SV *orig_sv, const char *buf, STRLEN len)
80a702cd
RGS
957{
958 AV *av = CopFILEAVx(PL_curcop);
959 if (av) {
b9f83d2f 960 SV * const sv = newSV_type(SVt_PVMG);
5fa550fb
NC
961 if (orig_sv)
962 sv_setsv(sv, orig_sv);
963 else
964 sv_setpvn(sv, buf, len);
80a702cd
RGS
965 (void)SvIOK_on(sv);
966 SvIV_set(sv, 0);
967 av_store(av, (I32)CopLINE(PL_curcop), sv);
968 }
969}
970
ffb4593c
NT
971/*
972 * S_skipspace
973 * Called to gobble the appropriate amount and type of whitespace.
974 * Skips comments as well.
975 */
976
76e3520e 977STATIC char *
cea2e8a9 978S_skipspace(pTHX_ register char *s)
a687059c 979{
97aff369 980 dVAR;
5db06880
NC
981#ifdef PERL_MAD
982 int curoff;
983 int startoff = s - SvPVX(PL_linestr);
984
cd81e915
NC
985 if (PL_skipwhite) {
986 sv_free(PL_skipwhite);
987 PL_skipwhite = 0;
5db06880
NC
988 }
989#endif
990
3280af22 991 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
bf4acbe4 992 while (s < PL_bufend && SPACE_OR_TAB(*s))
463ee0b2 993 s++;
5db06880
NC
994#ifdef PERL_MAD
995 goto done;
996#else
463ee0b2 997 return s;
5db06880 998#endif
463ee0b2
LW
999 }
1000 for (;;) {
fd049845 1001 STRLEN prevlen;
09bef843 1002 SSize_t oldprevlen, oldoldprevlen;
9c5ffd7c 1003 SSize_t oldloplen = 0, oldunilen = 0;
60e6418e
GS
1004 while (s < PL_bufend && isSPACE(*s)) {
1005 if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
1006 incline(s);
1007 }
ffb4593c
NT
1008
1009 /* comment */
3280af22
NIS
1010 if (s < PL_bufend && *s == '#') {
1011 while (s < PL_bufend && *s != '\n')
463ee0b2 1012 s++;
60e6418e 1013 if (s < PL_bufend) {
463ee0b2 1014 s++;
60e6418e
GS
1015 if (PL_in_eval && !PL_rsfp) {
1016 incline(s);
1017 continue;
1018 }
1019 }
463ee0b2 1020 }
ffb4593c
NT
1021
1022 /* only continue to recharge the buffer if we're at the end
1023 * of the buffer, we're not reading from a source filter, and
1024 * we're in normal lexing mode
1025 */
09bef843
SB
1026 if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
1027 PL_lex_state == LEX_FORMLINE)
5db06880
NC
1028#ifdef PERL_MAD
1029 goto done;
1030#else
463ee0b2 1031 return s;
5db06880 1032#endif
ffb4593c
NT
1033
1034 /* try to recharge the buffer */
5db06880
NC
1035#ifdef PERL_MAD
1036 curoff = s - SvPVX(PL_linestr);
1037#endif
1038
9cbb5ea2 1039 if ((s = filter_gets(PL_linestr, PL_rsfp,
bd61b366 1040 (prevlen = SvCUR(PL_linestr)))) == NULL)
9cbb5ea2 1041 {
5db06880
NC
1042#ifdef PERL_MAD
1043 if (PL_madskills && curoff != startoff) {
cd81e915 1044 if (!PL_skipwhite)
6b29d1f5 1045 PL_skipwhite = newSVpvs("");
cd81e915 1046 sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
5db06880
NC
1047 curoff - startoff);
1048 }
1049
1050 /* mustn't throw out old stuff yet if madpropping */
1051 SvCUR(PL_linestr) = curoff;
1052 s = SvPVX(PL_linestr) + curoff;
1053 *s = 0;
1054 if (curoff && s[-1] == '\n')
1055 s[-1] = ' ';
1056#endif
1057
9cbb5ea2 1058 /* end of file. Add on the -p or -n magic */
cd81e915 1059 /* XXX these shouldn't really be added here, can't set PL_faketokens */
01a19ab0 1060 if (PL_minus_p) {
5db06880 1061#ifdef PERL_MAD
6502358f 1062 sv_catpvs(PL_linestr,
5db06880
NC
1063 ";}continue{print or die qq(-p destination: $!\\n);}");
1064#else
6502358f 1065 sv_setpvs(PL_linestr,
01a19ab0 1066 ";}continue{print or die qq(-p destination: $!\\n);}");
5db06880 1067#endif
3280af22 1068 PL_minus_n = PL_minus_p = 0;
a0d0e21e 1069 }
01a19ab0 1070 else if (PL_minus_n) {
5db06880
NC
1071#ifdef PERL_MAD
1072 sv_catpvn(PL_linestr, ";}", 2);
1073#else
01a19ab0 1074 sv_setpvn(PL_linestr, ";}", 2);
5db06880 1075#endif
01a19ab0
NC
1076 PL_minus_n = 0;
1077 }
a0d0e21e 1078 else
5db06880
NC
1079#ifdef PERL_MAD
1080 sv_catpvn(PL_linestr,";", 1);
1081#else
4147a61b 1082 sv_setpvn(PL_linestr,";", 1);
5db06880 1083#endif
ffb4593c
NT
1084
1085 /* reset variables for next time we lex */
9cbb5ea2 1086 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
89122651
NC
1087 = SvPVX(PL_linestr)
1088#ifdef PERL_MAD
1089 + curoff
1090#endif
1091 ;
3280af22 1092 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 1093 PL_last_lop = PL_last_uni = NULL;
ffb4593c
NT
1094
1095 /* Close the filehandle. Could be from -P preprocessor,
1096 * STDIN, or a regular file. If we were reading code from
1097 * STDIN (because the commandline held no -e or filename)
1098 * then we don't close it, we reset it so the code can
1099 * read from STDIN too.
1100 */
1101
3280af22
NIS
1102 if (PL_preprocess && !PL_in_eval)
1103 (void)PerlProc_pclose(PL_rsfp);
1104 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
1105 PerlIO_clearerr(PL_rsfp);
8990e307 1106 else
3280af22 1107 (void)PerlIO_close(PL_rsfp);
4608196e 1108 PL_rsfp = NULL;
463ee0b2
LW
1109 return s;
1110 }
ffb4593c
NT
1111
1112 /* not at end of file, so we only read another line */
09bef843
SB
1113 /* make corresponding updates to old pointers, for yyerror() */
1114 oldprevlen = PL_oldbufptr - PL_bufend;
1115 oldoldprevlen = PL_oldoldbufptr - PL_bufend;
1116 if (PL_last_uni)
1117 oldunilen = PL_last_uni - PL_bufend;
1118 if (PL_last_lop)
1119 oldloplen = PL_last_lop - PL_bufend;
3280af22
NIS
1120 PL_linestart = PL_bufptr = s + prevlen;
1121 PL_bufend = s + SvCUR(PL_linestr);
1122 s = PL_bufptr;
09bef843
SB
1123 PL_oldbufptr = s + oldprevlen;
1124 PL_oldoldbufptr = s + oldoldprevlen;
1125 if (PL_last_uni)
1126 PL_last_uni = s + oldunilen;
1127 if (PL_last_lop)
1128 PL_last_lop = s + oldloplen;
a0d0e21e 1129 incline(s);
ffb4593c
NT
1130
1131 /* debugger active and we're not compiling the debugger code,
1132 * so store the line into the debugger's array of lines
1133 */
80a702cd 1134 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 1135 update_debugger_info(NULL, PL_bufptr, PL_bufend - PL_bufptr);
463ee0b2 1136 }
5db06880
NC
1137
1138#ifdef PERL_MAD
1139 done:
1140 if (PL_madskills) {
cd81e915 1141 if (!PL_skipwhite)
6b29d1f5 1142 PL_skipwhite = newSVpvs("");
5db06880
NC
1143 curoff = s - SvPVX(PL_linestr);
1144 if (curoff - startoff)
cd81e915 1145 sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
5db06880
NC
1146 curoff - startoff);
1147 }
1148 return s;
1149#endif
a687059c 1150}
378cc40b 1151
ffb4593c
NT
1152/*
1153 * S_check_uni
1154 * Check the unary operators to ensure there's no ambiguity in how they're
1155 * used. An ambiguous piece of code would be:
1156 * rand + 5
1157 * This doesn't mean rand() + 5. Because rand() is a unary operator,
1158 * the +5 is its argument.
1159 */
1160
76e3520e 1161STATIC void
cea2e8a9 1162S_check_uni(pTHX)
ba106d47 1163{
97aff369 1164 dVAR;
d4c19fe8
AL
1165 const char *s;
1166 const char *t;
2f3197b3 1167
3280af22 1168 if (PL_oldoldbufptr != PL_last_uni)
2f3197b3 1169 return;
3280af22
NIS
1170 while (isSPACE(*PL_last_uni))
1171 PL_last_uni++;
c35e046a
AL
1172 s = PL_last_uni;
1173 while (isALNUM_lazy_if(s,UTF) || *s == '-')
1174 s++;
3280af22 1175 if ((t = strchr(s, '(')) && t < PL_bufptr)
a0d0e21e 1176 return;
6136c704 1177
0453d815 1178 if (ckWARN_d(WARN_AMBIGUOUS)){
9014280d 1179 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
32d45c1d
NC
1180 "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1181 (int)(s - PL_last_uni), PL_last_uni);
0453d815 1182 }
2f3197b3
LW
1183}
1184
ffb4593c
NT
1185/*
1186 * LOP : macro to build a list operator. Its behaviour has been replaced
1187 * with a subroutine, S_lop() for which LOP is just another name.
1188 */
1189
a0d0e21e
LW
1190#define LOP(f,x) return lop(f,x,s)
1191
ffb4593c
NT
1192/*
1193 * S_lop
1194 * Build a list operator (or something that might be one). The rules:
1195 * - if we have a next token, then it's a list operator [why?]
1196 * - if the next thing is an opening paren, then it's a function
1197 * - else it's a list operator
1198 */
1199
76e3520e 1200STATIC I32
a0be28da 1201S_lop(pTHX_ I32 f, int x, char *s)
ffed7fef 1202{
97aff369 1203 dVAR;
79072805 1204 yylval.ival = f;
35c8bce7 1205 CLINE;
3280af22
NIS
1206 PL_expect = x;
1207 PL_bufptr = s;
1208 PL_last_lop = PL_oldbufptr;
eb160463 1209 PL_last_lop_op = (OPCODE)f;
5db06880
NC
1210#ifdef PERL_MAD
1211 if (PL_lasttoke)
1212 return REPORT(LSTOP);
1213#else
3280af22 1214 if (PL_nexttoke)
bbf60fe6 1215 return REPORT(LSTOP);
5db06880 1216#endif
79072805 1217 if (*s == '(')
bbf60fe6 1218 return REPORT(FUNC);
29595ff2 1219 s = PEEKSPACE(s);
79072805 1220 if (*s == '(')
bbf60fe6 1221 return REPORT(FUNC);
79072805 1222 else
bbf60fe6 1223 return REPORT(LSTOP);
79072805
LW
1224}
1225
5db06880
NC
1226#ifdef PERL_MAD
1227 /*
1228 * S_start_force
1229 * Sets up for an eventual force_next(). start_force(0) basically does
1230 * an unshift, while start_force(-1) does a push. yylex removes items
1231 * on the "pop" end.
1232 */
1233
1234STATIC void
1235S_start_force(pTHX_ int where)
1236{
1237 int i;
1238
cd81e915 1239 if (where < 0) /* so people can duplicate start_force(PL_curforce) */
5db06880 1240 where = PL_lasttoke;
cd81e915
NC
1241 assert(PL_curforce < 0 || PL_curforce == where);
1242 if (PL_curforce != where) {
5db06880
NC
1243 for (i = PL_lasttoke; i > where; --i) {
1244 PL_nexttoke[i] = PL_nexttoke[i-1];
1245 }
1246 PL_lasttoke++;
1247 }
cd81e915 1248 if (PL_curforce < 0) /* in case of duplicate start_force() */
5db06880 1249 Zero(&PL_nexttoke[where], 1, NEXTTOKE);
cd81e915
NC
1250 PL_curforce = where;
1251 if (PL_nextwhite) {
5db06880 1252 if (PL_madskills)
6b29d1f5 1253 curmad('^', newSVpvs(""));
cd81e915 1254 CURMAD('_', PL_nextwhite);
5db06880
NC
1255 }
1256}
1257
1258STATIC void
1259S_curmad(pTHX_ char slot, SV *sv)
1260{
1261 MADPROP **where;
1262
1263 if (!sv)
1264 return;
cd81e915
NC
1265 if (PL_curforce < 0)
1266 where = &PL_thismad;
5db06880 1267 else
cd81e915 1268 where = &PL_nexttoke[PL_curforce].next_mad;
5db06880 1269
cd81e915 1270 if (PL_faketokens)
5db06880
NC
1271 sv_setpvn(sv, "", 0);
1272 else {
1273 if (!IN_BYTES) {
1274 if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1275 SvUTF8_on(sv);
1276 else if (PL_encoding) {
1277 sv_recode_to_utf8(sv, PL_encoding);
1278 }
1279 }
1280 }
1281
1282 /* keep a slot open for the head of the list? */
1283 if (slot != '_' && *where && (*where)->mad_key == '^') {
1284 (*where)->mad_key = slot;
035e2bcc 1285 sv_free((SV*)((*where)->mad_val));
5db06880
NC
1286 (*where)->mad_val = (void*)sv;
1287 }
1288 else
1289 addmad(newMADsv(slot, sv), where, 0);
1290}
1291#else
b3f24c00
MHM
1292# define start_force(where) NOOP
1293# define curmad(slot, sv) NOOP
5db06880
NC
1294#endif
1295
ffb4593c
NT
1296/*
1297 * S_force_next
9cbb5ea2 1298 * When the lexer realizes it knows the next token (for instance,
ffb4593c 1299 * it is reordering tokens for the parser) then it can call S_force_next
9cbb5ea2 1300 * to know what token to return the next time the lexer is called. Caller
5db06880
NC
1301 * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1302 * and possibly PL_expect to ensure the lexer handles the token correctly.
ffb4593c
NT
1303 */
1304
4e553d73 1305STATIC void
cea2e8a9 1306S_force_next(pTHX_ I32 type)
79072805 1307{
97aff369 1308 dVAR;
5db06880 1309#ifdef PERL_MAD
cd81e915 1310 if (PL_curforce < 0)
5db06880 1311 start_force(PL_lasttoke);
cd81e915 1312 PL_nexttoke[PL_curforce].next_type = type;
5db06880
NC
1313 if (PL_lex_state != LEX_KNOWNEXT)
1314 PL_lex_defer = PL_lex_state;
1315 PL_lex_state = LEX_KNOWNEXT;
1316 PL_lex_expect = PL_expect;
cd81e915 1317 PL_curforce = -1;
5db06880 1318#else
3280af22
NIS
1319 PL_nexttype[PL_nexttoke] = type;
1320 PL_nexttoke++;
1321 if (PL_lex_state != LEX_KNOWNEXT) {
1322 PL_lex_defer = PL_lex_state;
1323 PL_lex_expect = PL_expect;
1324 PL_lex_state = LEX_KNOWNEXT;
79072805 1325 }
5db06880 1326#endif
79072805
LW
1327}
1328
d0a148a6
NC
1329STATIC SV *
1330S_newSV_maybe_utf8(pTHX_ const char *start, STRLEN len)
1331{
97aff369 1332 dVAR;
9d4ba2ae 1333 SV * const sv = newSVpvn(start,len);
bfed75c6 1334 if (UTF && !IN_BYTES && is_utf8_string((const U8*)start, len))
d0a148a6
NC
1335 SvUTF8_on(sv);
1336 return sv;
1337}
1338
ffb4593c
NT
1339/*
1340 * S_force_word
1341 * When the lexer knows the next thing is a word (for instance, it has
1342 * just seen -> and it knows that the next char is a word char, then
02b34bbe
DM
1343 * it calls S_force_word to stick the next word into the PL_nexttoke/val
1344 * lookahead.
ffb4593c
NT
1345 *
1346 * Arguments:
b1b65b59 1347 * char *start : buffer position (must be within PL_linestr)
02b34bbe 1348 * int token : PL_next* will be this type of bare word (e.g., METHOD,WORD)
ffb4593c
NT
1349 * int check_keyword : if true, Perl checks to make sure the word isn't
1350 * a keyword (do this if the word is a label, e.g. goto FOO)
1351 * int allow_pack : if true, : characters will also be allowed (require,
1352 * use, etc. do this)
9cbb5ea2 1353 * int allow_initial_tick : used by the "sub" lexer only.
ffb4593c
NT
1354 */
1355
76e3520e 1356STATIC char *
cea2e8a9 1357S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
79072805 1358{
97aff369 1359 dVAR;
463ee0b2
LW
1360 register char *s;
1361 STRLEN len;
4e553d73 1362
29595ff2 1363 start = SKIPSPACE1(start);
463ee0b2 1364 s = start;
7e2040f0 1365 if (isIDFIRST_lazy_if(s,UTF) ||
a0d0e21e 1366 (allow_pack && *s == ':') ||
15f0808c 1367 (allow_initial_tick && *s == '\'') )
a0d0e21e 1368 {
3280af22 1369 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
5458a98a 1370 if (check_keyword && keyword(PL_tokenbuf, len, 0))
463ee0b2 1371 return start;
cd81e915 1372 start_force(PL_curforce);
5db06880
NC
1373 if (PL_madskills)
1374 curmad('X', newSVpvn(start,s-start));
463ee0b2 1375 if (token == METHOD) {
29595ff2 1376 s = SKIPSPACE1(s);
463ee0b2 1377 if (*s == '(')
3280af22 1378 PL_expect = XTERM;
463ee0b2 1379 else {
3280af22 1380 PL_expect = XOPERATOR;
463ee0b2 1381 }
79072805 1382 }
e74e6b3d 1383 if (PL_madskills)
63575281 1384 curmad('g', newSVpvs( "forced" ));
9ded7720 1385 NEXTVAL_NEXTTOKE.opval
d0a148a6
NC
1386 = (OP*)newSVOP(OP_CONST,0,
1387 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
9ded7720 1388 NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
79072805
LW
1389 force_next(token);
1390 }
1391 return s;
1392}
1393
ffb4593c
NT
1394/*
1395 * S_force_ident
9cbb5ea2 1396 * Called when the lexer wants $foo *foo &foo etc, but the program
ffb4593c
NT
1397 * text only contains the "foo" portion. The first argument is a pointer
1398 * to the "foo", and the second argument is the type symbol to prefix.
1399 * Forces the next token to be a "WORD".
9cbb5ea2 1400 * Creates the symbol if it didn't already exist (via gv_fetchpv()).
ffb4593c
NT
1401 */
1402
76e3520e 1403STATIC void
bfed75c6 1404S_force_ident(pTHX_ register const char *s, int kind)
79072805 1405{
97aff369 1406 dVAR;
c35e046a 1407 if (*s) {
90e5519e
NC
1408 const STRLEN len = strlen(s);
1409 OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
cd81e915 1410 start_force(PL_curforce);
9ded7720 1411 NEXTVAL_NEXTTOKE.opval = o;
79072805 1412 force_next(WORD);
748a9306 1413 if (kind) {
11343788 1414 o->op_private = OPpCONST_ENTERED;
55497cff 1415 /* XXX see note in pp_entereval() for why we forgo typo
1416 warnings if the symbol must be introduced in an eval.
1417 GSAR 96-10-12 */
90e5519e
NC
1418 gv_fetchpvn_flags(s, len,
1419 PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
1420 : GV_ADD,
1421 kind == '$' ? SVt_PV :
1422 kind == '@' ? SVt_PVAV :
1423 kind == '%' ? SVt_PVHV :
a0d0e21e 1424 SVt_PVGV
90e5519e 1425 );
748a9306 1426 }
79072805
LW
1427 }
1428}
1429
1571675a
GS
1430NV
1431Perl_str_to_version(pTHX_ SV *sv)
1432{
1433 NV retval = 0.0;
1434 NV nshift = 1.0;
1435 STRLEN len;
cfd0369c 1436 const char *start = SvPV_const(sv,len);
9d4ba2ae 1437 const char * const end = start + len;
504618e9 1438 const bool utf = SvUTF8(sv) ? TRUE : FALSE;
1571675a 1439 while (start < end) {
ba210ebe 1440 STRLEN skip;
1571675a
GS
1441 UV n;
1442 if (utf)
9041c2e3 1443 n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1571675a
GS
1444 else {
1445 n = *(U8*)start;
1446 skip = 1;
1447 }
1448 retval += ((NV)n)/nshift;
1449 start += skip;
1450 nshift *= 1000;
1451 }
1452 return retval;
1453}
1454
4e553d73 1455/*
ffb4593c
NT
1456 * S_force_version
1457 * Forces the next token to be a version number.
e759cc13
RGS
1458 * If the next token appears to be an invalid version number, (e.g. "v2b"),
1459 * and if "guessing" is TRUE, then no new token is created (and the caller
1460 * must use an alternative parsing method).
ffb4593c
NT
1461 */
1462
76e3520e 1463STATIC char *
e759cc13 1464S_force_version(pTHX_ char *s, int guessing)
89bfa8cd 1465{
97aff369 1466 dVAR;
5f66b61c 1467 OP *version = NULL;
44dcb63b 1468 char *d;
5db06880
NC
1469#ifdef PERL_MAD
1470 I32 startoff = s - SvPVX(PL_linestr);
1471#endif
89bfa8cd 1472
29595ff2 1473 s = SKIPSPACE1(s);
89bfa8cd 1474
44dcb63b 1475 d = s;
dd629d5b 1476 if (*d == 'v')
44dcb63b 1477 d++;
44dcb63b 1478 if (isDIGIT(*d)) {
e759cc13
RGS
1479 while (isDIGIT(*d) || *d == '_' || *d == '.')
1480 d++;
5db06880
NC
1481#ifdef PERL_MAD
1482 if (PL_madskills) {
cd81e915 1483 start_force(PL_curforce);
5db06880
NC
1484 curmad('X', newSVpvn(s,d-s));
1485 }
1486#endif
9f3d182e 1487 if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
dd629d5b 1488 SV *ver;
b73d6f50 1489 s = scan_num(s, &yylval);
89bfa8cd 1490 version = yylval.opval;
dd629d5b
GS
1491 ver = cSVOPx(version)->op_sv;
1492 if (SvPOK(ver) && !SvNIOK(ver)) {
862a34c6 1493 SvUPGRADE(ver, SVt_PVNV);
9d6ce603 1494 SvNV_set(ver, str_to_version(ver));
1571675a 1495 SvNOK_on(ver); /* hint that it is a version */
44dcb63b 1496 }
89bfa8cd 1497 }
5db06880
NC
1498 else if (guessing) {
1499#ifdef PERL_MAD
1500 if (PL_madskills) {
cd81e915
NC
1501 sv_free(PL_nextwhite); /* let next token collect whitespace */
1502 PL_nextwhite = 0;
5db06880
NC
1503 s = SvPVX(PL_linestr) + startoff;
1504 }
1505#endif
e759cc13 1506 return s;
5db06880 1507 }
89bfa8cd 1508 }
1509
5db06880
NC
1510#ifdef PERL_MAD
1511 if (PL_madskills && !version) {
cd81e915
NC
1512 sv_free(PL_nextwhite); /* let next token collect whitespace */
1513 PL_nextwhite = 0;
5db06880
NC
1514 s = SvPVX(PL_linestr) + startoff;
1515 }
1516#endif
89bfa8cd 1517 /* NOTE: The parser sees the package name and the VERSION swapped */
cd81e915 1518 start_force(PL_curforce);
9ded7720 1519 NEXTVAL_NEXTTOKE.opval = version;
4e553d73 1520 force_next(WORD);
89bfa8cd 1521
e759cc13 1522 return s;
89bfa8cd 1523}
1524
ffb4593c
NT
1525/*
1526 * S_tokeq
1527 * Tokenize a quoted string passed in as an SV. It finds the next
1528 * chunk, up to end of string or a backslash. It may make a new
1529 * SV containing that chunk (if HINT_NEW_STRING is on). It also
1530 * turns \\ into \.
1531 */
1532
76e3520e 1533STATIC SV *
cea2e8a9 1534S_tokeq(pTHX_ SV *sv)
79072805 1535{
97aff369 1536 dVAR;
79072805
LW
1537 register char *s;
1538 register char *send;
1539 register char *d;
b3ac6de7
IZ
1540 STRLEN len = 0;
1541 SV *pv = sv;
79072805
LW
1542
1543 if (!SvLEN(sv))
b3ac6de7 1544 goto finish;
79072805 1545
a0d0e21e 1546 s = SvPV_force(sv, len);
21a311ee 1547 if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
b3ac6de7 1548 goto finish;
463ee0b2 1549 send = s + len;
79072805
LW
1550 while (s < send && *s != '\\')
1551 s++;
1552 if (s == send)
b3ac6de7 1553 goto finish;
79072805 1554 d = s;
be4731d2 1555 if ( PL_hints & HINT_NEW_STRING ) {
95a20fc0 1556 pv = sv_2mortal(newSVpvn(SvPVX_const(pv), len));
be4731d2
NIS
1557 if (SvUTF8(sv))
1558 SvUTF8_on(pv);
1559 }
79072805
LW
1560 while (s < send) {
1561 if (*s == '\\') {
a0d0e21e 1562 if (s + 1 < send && (s[1] == '\\'))
79072805
LW
1563 s++; /* all that, just for this */
1564 }
1565 *d++ = *s++;
1566 }
1567 *d = '\0';
95a20fc0 1568 SvCUR_set(sv, d - SvPVX_const(sv));
b3ac6de7 1569 finish:
3280af22 1570 if ( PL_hints & HINT_NEW_STRING )
b3ac6de7 1571 return new_constant(NULL, 0, "q", sv, pv, "q");
79072805
LW
1572 return sv;
1573}
1574
ffb4593c
NT
1575/*
1576 * Now come three functions related to double-quote context,
1577 * S_sublex_start, S_sublex_push, and S_sublex_done. They're used when
1578 * converting things like "\u\Lgnat" into ucfirst(lc("gnat")). They
1579 * interact with PL_lex_state, and create fake ( ... ) argument lists
1580 * to handle functions and concatenation.
1581 * They assume that whoever calls them will be setting up a fake
1582 * join call, because each subthing puts a ',' after it. This lets
1583 * "lower \luPpEr"
1584 * become
1585 * join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1586 *
1587 * (I'm not sure whether the spurious commas at the end of lcfirst's
1588 * arguments and join's arguments are created or not).
1589 */
1590
1591/*
1592 * S_sublex_start
1593 * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
1594 *
1595 * Pattern matching will set PL_lex_op to the pattern-matching op to
1596 * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
1597 *
1598 * OP_CONST and OP_READLINE are easy--just make the new op and return.
1599 *
1600 * Everything else becomes a FUNC.
1601 *
1602 * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1603 * had an OP_CONST or OP_READLINE). This just sets us up for a
1604 * call to S_sublex_push().
1605 */
1606
76e3520e 1607STATIC I32
cea2e8a9 1608S_sublex_start(pTHX)
79072805 1609{
97aff369 1610 dVAR;
0d46e09a 1611 register const I32 op_type = yylval.ival;
79072805
LW
1612
1613 if (op_type == OP_NULL) {
3280af22 1614 yylval.opval = PL_lex_op;
5f66b61c 1615 PL_lex_op = NULL;
79072805
LW
1616 return THING;
1617 }
1618 if (op_type == OP_CONST || op_type == OP_READLINE) {
3280af22 1619 SV *sv = tokeq(PL_lex_stuff);
b3ac6de7
IZ
1620
1621 if (SvTYPE(sv) == SVt_PVIV) {
1622 /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1623 STRLEN len;
96a5add6 1624 const char * const p = SvPV_const(sv, len);
f54cb97a 1625 SV * const nsv = newSVpvn(p, len);
01ec43d0
GS
1626 if (SvUTF8(sv))
1627 SvUTF8_on(nsv);
b3ac6de7
IZ
1628 SvREFCNT_dec(sv);
1629 sv = nsv;
4e553d73 1630 }
b3ac6de7 1631 yylval.opval = (OP*)newSVOP(op_type, 0, sv);
a0714e2c 1632 PL_lex_stuff = NULL;
6f33ba73
RGS
1633 /* Allow <FH> // "foo" */
1634 if (op_type == OP_READLINE)
1635 PL_expect = XTERMORDORDOR;
79072805
LW
1636 return THING;
1637 }
e3f73d4e
RGS
1638 else if (op_type == OP_BACKTICK && PL_lex_op) {
1639 /* readpipe() vas overriden */
1640 cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
1641 yylval.opval = PL_lex_op;
9b201d7d 1642 PL_lex_op = NULL;
e3f73d4e
RGS
1643 PL_lex_stuff = NULL;
1644 return THING;
1645 }
79072805 1646
3280af22 1647 PL_sublex_info.super_state = PL_lex_state;
eac04b2e 1648 PL_sublex_info.sub_inwhat = (U16)op_type;
3280af22
NIS
1649 PL_sublex_info.sub_op = PL_lex_op;
1650 PL_lex_state = LEX_INTERPPUSH;
55497cff 1651
3280af22
NIS
1652 PL_expect = XTERM;
1653 if (PL_lex_op) {
1654 yylval.opval = PL_lex_op;
5f66b61c 1655 PL_lex_op = NULL;
55497cff 1656 return PMFUNC;
1657 }
1658 else
1659 return FUNC;
1660}
1661
ffb4593c
NT
1662/*
1663 * S_sublex_push
1664 * Create a new scope to save the lexing state. The scope will be
1665 * ended in S_sublex_done. Returns a '(', starting the function arguments
1666 * to the uc, lc, etc. found before.
1667 * Sets PL_lex_state to LEX_INTERPCONCAT.
1668 */
1669
76e3520e 1670STATIC I32
cea2e8a9 1671S_sublex_push(pTHX)
55497cff 1672{
27da23d5 1673 dVAR;
f46d017c 1674 ENTER;
55497cff 1675
3280af22 1676 PL_lex_state = PL_sublex_info.super_state;
651b5b28 1677 SAVEBOOL(PL_lex_dojoin);
3280af22 1678 SAVEI32(PL_lex_brackets);
3280af22
NIS
1679 SAVEI32(PL_lex_casemods);
1680 SAVEI32(PL_lex_starts);
651b5b28 1681 SAVEI8(PL_lex_state);
7766f137 1682 SAVEVPTR(PL_lex_inpat);
98246f1e 1683 SAVEI16(PL_lex_inwhat);
57843af0 1684 SAVECOPLINE(PL_curcop);
3280af22 1685 SAVEPPTR(PL_bufptr);
8452ff4b 1686 SAVEPPTR(PL_bufend);
3280af22
NIS
1687 SAVEPPTR(PL_oldbufptr);
1688 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
1689 SAVEPPTR(PL_last_lop);
1690 SAVEPPTR(PL_last_uni);
3280af22
NIS
1691 SAVEPPTR(PL_linestart);
1692 SAVESPTR(PL_linestr);
8edd5f42
RGS
1693 SAVEGENERICPV(PL_lex_brackstack);
1694 SAVEGENERICPV(PL_lex_casestack);
3280af22
NIS
1695
1696 PL_linestr = PL_lex_stuff;
a0714e2c 1697 PL_lex_stuff = NULL;
3280af22 1698
9cbb5ea2
GS
1699 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1700 = SvPVX(PL_linestr);
3280af22 1701 PL_bufend += SvCUR(PL_linestr);
bd61b366 1702 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
1703 SAVEFREESV(PL_linestr);
1704
1705 PL_lex_dojoin = FALSE;
1706 PL_lex_brackets = 0;
a02a5408
JC
1707 Newx(PL_lex_brackstack, 120, char);
1708 Newx(PL_lex_casestack, 12, char);
3280af22
NIS
1709 PL_lex_casemods = 0;
1710 *PL_lex_casestack = '\0';
1711 PL_lex_starts = 0;
1712 PL_lex_state = LEX_INTERPCONCAT;
eb160463 1713 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22
NIS
1714
1715 PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1716 if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1717 PL_lex_inpat = PL_sublex_info.sub_op;
79072805 1718 else
5f66b61c 1719 PL_lex_inpat = NULL;
79072805 1720
55497cff 1721 return '(';
79072805
LW
1722}
1723
ffb4593c
NT
1724/*
1725 * S_sublex_done
1726 * Restores lexer state after a S_sublex_push.
1727 */
1728
76e3520e 1729STATIC I32
cea2e8a9 1730S_sublex_done(pTHX)
79072805 1731{
27da23d5 1732 dVAR;
3280af22 1733 if (!PL_lex_starts++) {
396482e1 1734 SV * const sv = newSVpvs("");
9aa983d2
JH
1735 if (SvUTF8(PL_linestr))
1736 SvUTF8_on(sv);
3280af22 1737 PL_expect = XOPERATOR;
9aa983d2 1738 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
79072805
LW
1739 return THING;
1740 }
1741
3280af22
NIS
1742 if (PL_lex_casemods) { /* oops, we've got some unbalanced parens */
1743 PL_lex_state = LEX_INTERPCASEMOD;
cea2e8a9 1744 return yylex();
79072805
LW
1745 }
1746
ffb4593c 1747 /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
3280af22
NIS
1748 if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1749 PL_linestr = PL_lex_repl;
1750 PL_lex_inpat = 0;
1751 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1752 PL_bufend += SvCUR(PL_linestr);
bd61b366 1753 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
1754 SAVEFREESV(PL_linestr);
1755 PL_lex_dojoin = FALSE;
1756 PL_lex_brackets = 0;
3280af22
NIS
1757 PL_lex_casemods = 0;
1758 *PL_lex_casestack = '\0';
1759 PL_lex_starts = 0;
25da4f38 1760 if (SvEVALED(PL_lex_repl)) {
3280af22
NIS
1761 PL_lex_state = LEX_INTERPNORMAL;
1762 PL_lex_starts++;
e9fa98b2
HS
1763 /* we don't clear PL_lex_repl here, so that we can check later
1764 whether this is an evalled subst; that means we rely on the
1765 logic to ensure sublex_done() is called again only via the
1766 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
79072805 1767 }
e9fa98b2 1768 else {
3280af22 1769 PL_lex_state = LEX_INTERPCONCAT;
a0714e2c 1770 PL_lex_repl = NULL;
e9fa98b2 1771 }
79072805 1772 return ',';
ffed7fef
LW
1773 }
1774 else {
5db06880
NC
1775#ifdef PERL_MAD
1776 if (PL_madskills) {
cd81e915
NC
1777 if (PL_thiswhite) {
1778 if (!PL_endwhite)
6b29d1f5 1779 PL_endwhite = newSVpvs("");
cd81e915
NC
1780 sv_catsv(PL_endwhite, PL_thiswhite);
1781 PL_thiswhite = 0;
1782 }
1783 if (PL_thistoken)
1784 sv_setpvn(PL_thistoken,"",0);
5db06880 1785 else
cd81e915 1786 PL_realtokenstart = -1;
5db06880
NC
1787 }
1788#endif
f46d017c 1789 LEAVE;
3280af22
NIS
1790 PL_bufend = SvPVX(PL_linestr);
1791 PL_bufend += SvCUR(PL_linestr);
1792 PL_expect = XOPERATOR;
09bef843 1793 PL_sublex_info.sub_inwhat = 0;
79072805 1794 return ')';
ffed7fef
LW
1795 }
1796}
1797
02aa26ce
NT
1798/*
1799 scan_const
1800
1801 Extracts a pattern, double-quoted string, or transliteration. This
1802 is terrifying code.
1803
94def140 1804 It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
3280af22 1805 processing a pattern (PL_lex_inpat is true), a transliteration
94def140 1806 (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
02aa26ce 1807
94def140
TS
1808 Returns a pointer to the character scanned up to. If this is
1809 advanced from the start pointer supplied (i.e. if anything was
9b599b2a
GS
1810 successfully parsed), will leave an OP for the substring scanned
1811 in yylval. Caller must intuit reason for not parsing further
1812 by looking at the next characters herself.
1813
02aa26ce
NT
1814 In patterns:
1815 backslashes:
1816 double-quoted style: \r and \n
1817 regexp special ones: \D \s
94def140
TS
1818 constants: \x31
1819 backrefs: \1
02aa26ce
NT
1820 case and quoting: \U \Q \E
1821 stops on @ and $, but not for $ as tail anchor
1822
1823 In transliterations:
1824 characters are VERY literal, except for - not at the start or end
94def140
TS
1825 of the string, which indicates a range. If the range is in bytes,
1826 scan_const expands the range to the full set of intermediate
1827 characters. If the range is in utf8, the hyphen is replaced with
1828 a certain range mark which will be handled by pmtrans() in op.c.
02aa26ce
NT
1829
1830 In double-quoted strings:
1831 backslashes:
1832 double-quoted style: \r and \n
94def140
TS
1833 constants: \x31
1834 deprecated backrefs: \1 (in substitution replacements)
02aa26ce
NT
1835 case and quoting: \U \Q \E
1836 stops on @ and $
1837
1838 scan_const does *not* construct ops to handle interpolated strings.
1839 It stops processing as soon as it finds an embedded $ or @ variable
1840 and leaves it to the caller to work out what's going on.
1841
94def140
TS
1842 embedded arrays (whether in pattern or not) could be:
1843 @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
1844
1845 $ in double-quoted strings must be the symbol of an embedded scalar.
02aa26ce
NT
1846
1847 $ in pattern could be $foo or could be tail anchor. Assumption:
1848 it's a tail anchor if $ is the last thing in the string, or if it's
94def140 1849 followed by one of "()| \r\n\t"
02aa26ce
NT
1850
1851 \1 (backreferences) are turned into $1
1852
1853 The structure of the code is
1854 while (there's a character to process) {
94def140
TS
1855 handle transliteration ranges
1856 skip regexp comments /(?#comment)/ and codes /(?{code})/
1857 skip #-initiated comments in //x patterns
1858 check for embedded arrays
02aa26ce
NT
1859 check for embedded scalars
1860 if (backslash) {
94def140
TS
1861 leave intact backslashes from leaveit (below)
1862 deprecate \1 in substitution replacements
02aa26ce
NT
1863 handle string-changing backslashes \l \U \Q \E, etc.
1864 switch (what was escaped) {
94def140
TS
1865 handle \- in a transliteration (becomes a literal -)
1866 handle \132 (octal characters)
1867 handle \x15 and \x{1234} (hex characters)
1868 handle \N{name} (named characters)
1869 handle \cV (control characters)
1870 handle printf-style backslashes (\f, \r, \n, etc)
02aa26ce
NT
1871 } (end switch)
1872 } (end if backslash)
1873 } (end while character to read)
4e553d73 1874
02aa26ce
NT
1875*/
1876
76e3520e 1877STATIC char *
cea2e8a9 1878S_scan_const(pTHX_ char *start)
79072805 1879{
97aff369 1880 dVAR;
3280af22 1881 register char *send = PL_bufend; /* end of the constant */
561b68a9 1882 SV *sv = newSV(send - start); /* sv for the constant */
02aa26ce
NT
1883 register char *s = start; /* start of the constant */
1884 register char *d = SvPVX(sv); /* destination for copies */
1885 bool dorange = FALSE; /* are we in a translit range? */
c2e66d9e 1886 bool didrange = FALSE; /* did we just finish a range? */
2b9d42f0
NIS
1887 I32 has_utf8 = FALSE; /* Output constant is UTF8 */
1888 I32 this_utf8 = UTF; /* The source string is assumed to be UTF8 */
012bcf8d 1889 UV uv;
4c3a8340
TS
1890#ifdef EBCDIC
1891 UV literal_endpoint = 0;
e294cc5d 1892 bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
4c3a8340 1893#endif
012bcf8d 1894
2b9d42f0
NIS
1895 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1896 /* If we are doing a trans and we know we want UTF8 set expectation */
1897 has_utf8 = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1898 this_utf8 = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1899 }
1900
1901
79072805 1902 while (s < send || dorange) {
02aa26ce 1903 /* get transliterations out of the way (they're most literal) */
3280af22 1904 if (PL_lex_inwhat == OP_TRANS) {
02aa26ce 1905 /* expand a range A-Z to the full set of characters. AIE! */
79072805 1906 if (dorange) {
1ba5c669
JH
1907 I32 i; /* current expanded character */
1908 I32 min; /* first character in range */
1909 I32 max; /* last character in range */
02aa26ce 1910
e294cc5d
JH
1911#ifdef EBCDIC
1912 UV uvmax = 0;
1913#endif
1914
1915 if (has_utf8
1916#ifdef EBCDIC
1917 && !native_range
1918#endif
1919 ) {
9d4ba2ae 1920 char * const c = (char*)utf8_hop((U8*)d, -1);
8973db79
JH
1921 char *e = d++;
1922 while (e-- > c)
1923 *(e + 1) = *e;
25716404 1924 *c = (char)UTF_TO_NATIVE(0xff);
8973db79
JH
1925 /* mark the range as done, and continue */
1926 dorange = FALSE;
1927 didrange = TRUE;
1928 continue;
1929 }
2b9d42f0 1930
95a20fc0 1931 i = d - SvPVX_const(sv); /* remember current offset */
e294cc5d
JH
1932#ifdef EBCDIC
1933 SvGROW(sv,
1934 SvLEN(sv) + (has_utf8 ?
1935 (512 - UTF_CONTINUATION_MARK +
1936 UNISKIP(0x100))
1937 : 256));
1938 /* How many two-byte within 0..255: 128 in UTF-8,
1939 * 96 in UTF-8-mod. */
1940#else
9cbb5ea2 1941 SvGROW(sv, SvLEN(sv) + 256); /* never more than 256 chars in a range */
e294cc5d 1942#endif
9cbb5ea2 1943 d = SvPVX(sv) + i; /* refresh d after realloc */
e294cc5d
JH
1944#ifdef EBCDIC
1945 if (has_utf8) {
1946 int j;
1947 for (j = 0; j <= 1; j++) {
1948 char * const c = (char*)utf8_hop((U8*)d, -1);
1949 const UV uv = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
1950 if (j)
1951 min = (U8)uv;
1952 else if (uv < 256)
1953 max = (U8)uv;
1954 else {
1955 max = (U8)0xff; /* only to \xff */
1956 uvmax = uv; /* \x{100} to uvmax */
1957 }
1958 d = c; /* eat endpoint chars */
1959 }
1960 }
1961 else {
1962#endif
1963 d -= 2; /* eat the first char and the - */
1964 min = (U8)*d; /* first char in range */
1965 max = (U8)d[1]; /* last char in range */
1966#ifdef EBCDIC
1967 }
1968#endif
8ada0baa 1969
c2e66d9e 1970 if (min > max) {
01ec43d0 1971 Perl_croak(aTHX_
d1573ac7 1972 "Invalid range \"%c-%c\" in transliteration operator",
1ba5c669 1973 (char)min, (char)max);
c2e66d9e
GS
1974 }
1975
c7f1f016 1976#ifdef EBCDIC
4c3a8340
TS
1977 if (literal_endpoint == 2 &&
1978 ((isLOWER(min) && isLOWER(max)) ||
1979 (isUPPER(min) && isUPPER(max)))) {
8ada0baa
JH
1980 if (isLOWER(min)) {
1981 for (i = min; i <= max; i++)
1982 if (isLOWER(i))
db42d148 1983 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1984 } else {
1985 for (i = min; i <= max; i++)
1986 if (isUPPER(i))
db42d148 1987 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1988 }
1989 }
1990 else
1991#endif
1992 for (i = min; i <= max; i++)
e294cc5d
JH
1993#ifdef EBCDIC
1994 if (has_utf8) {
1995 const U8 ch = (U8)NATIVE_TO_UTF(i);
1996 if (UNI_IS_INVARIANT(ch))
1997 *d++ = (U8)i;
1998 else {
1999 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
2000 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
2001 }
2002 }
2003 else
2004#endif
2005 *d++ = (char)i;
2006
2007#ifdef EBCDIC
2008 if (uvmax) {
2009 d = (char*)uvchr_to_utf8((U8*)d, 0x100);
2010 if (uvmax > 0x101)
2011 *d++ = (char)UTF_TO_NATIVE(0xff);
2012 if (uvmax > 0x100)
2013 d = (char*)uvchr_to_utf8((U8*)d, uvmax);
2014 }
2015#endif
02aa26ce
NT
2016
2017 /* mark the range as done, and continue */
79072805 2018 dorange = FALSE;
01ec43d0 2019 didrange = TRUE;
4c3a8340
TS
2020#ifdef EBCDIC
2021 literal_endpoint = 0;
2022#endif
79072805 2023 continue;
4e553d73 2024 }
02aa26ce
NT
2025
2026 /* range begins (ignore - as first or last char) */
79072805 2027 else if (*s == '-' && s+1 < send && s != start) {
4e553d73 2028 if (didrange) {
1fafa243 2029 Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
01ec43d0 2030 }
e294cc5d
JH
2031 if (has_utf8
2032#ifdef EBCDIC
2033 && !native_range
2034#endif
2035 ) {
25716404 2036 *d++ = (char)UTF_TO_NATIVE(0xff); /* use illegal utf8 byte--see pmtrans */
a0ed51b3
LW
2037 s++;
2038 continue;
2039 }
79072805
LW
2040 dorange = TRUE;
2041 s++;
01ec43d0
GS
2042 }
2043 else {
2044 didrange = FALSE;
4c3a8340
TS
2045#ifdef EBCDIC
2046 literal_endpoint = 0;
e294cc5d 2047 native_range = TRUE;
4c3a8340 2048#endif
01ec43d0 2049 }
79072805 2050 }
02aa26ce
NT
2051
2052 /* if we get here, we're not doing a transliteration */
2053
0f5d15d6
IZ
2054 /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2055 except for the last char, which will be done separately. */
3280af22 2056 else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
cc6b7395 2057 if (s[2] == '#') {
e994fd66 2058 while (s+1 < send && *s != ')')
db42d148 2059 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
155aba94
GS
2060 }
2061 else if (s[2] == '{' /* This should match regcomp.c */
67edc0c9 2062 || (s[2] == '?' && s[3] == '{'))
155aba94 2063 {
cc6b7395 2064 I32 count = 1;
0f5d15d6 2065 char *regparse = s + (s[2] == '{' ? 3 : 4);
cc6b7395
IZ
2066 char c;
2067
d9f97599
GS
2068 while (count && (c = *regparse)) {
2069 if (c == '\\' && regparse[1])
2070 regparse++;
4e553d73 2071 else if (c == '{')
cc6b7395 2072 count++;
4e553d73 2073 else if (c == '}')
cc6b7395 2074 count--;
d9f97599 2075 regparse++;
cc6b7395 2076 }
e994fd66 2077 if (*regparse != ')')
5bdf89e7 2078 regparse--; /* Leave one char for continuation. */
0f5d15d6 2079 while (s < regparse)
db42d148 2080 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
cc6b7395 2081 }
748a9306 2082 }
02aa26ce
NT
2083
2084 /* likewise skip #-initiated comments in //x patterns */
3280af22
NIS
2085 else if (*s == '#' && PL_lex_inpat &&
2086 ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
748a9306 2087 while (s+1 < send && *s != '\n')
db42d148 2088 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
748a9306 2089 }
02aa26ce 2090
5d1d4326 2091 /* check for embedded arrays
da6eedaa 2092 (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
5d1d4326 2093 */
1749ea0d
TS
2094 else if (*s == '@' && s[1]) {
2095 if (isALNUM_lazy_if(s+1,UTF))
2096 break;
2097 if (strchr(":'{$", s[1]))
2098 break;
2099 if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2100 break; /* in regexp, neither @+ nor @- are interpolated */
2101 }
02aa26ce
NT
2102
2103 /* check for embedded scalars. only stop if we're sure it's a
2104 variable.
2105 */
79072805 2106 else if (*s == '$') {
3280af22 2107 if (!PL_lex_inpat) /* not a regexp, so $ must be var */
79072805 2108 break;
6002328a 2109 if (s + 1 < send && !strchr("()| \r\n\t", s[1]))
79072805
LW
2110 break; /* in regexp, $ might be tail anchor */
2111 }
02aa26ce 2112
2b9d42f0
NIS
2113 /* End of else if chain - OP_TRANS rejoin rest */
2114
02aa26ce 2115 /* backslashes */
79072805
LW
2116 if (*s == '\\' && s+1 < send) {
2117 s++;
02aa26ce 2118
02aa26ce 2119 /* deprecate \1 in strings and substitution replacements */
3280af22 2120 if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
a0d0e21e 2121 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
79072805 2122 {
599cee73 2123 if (ckWARN(WARN_SYNTAX))
9014280d 2124 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
79072805
LW
2125 *--s = '$';
2126 break;
2127 }
02aa26ce
NT
2128
2129 /* string-change backslash escapes */
3280af22 2130 if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
79072805
LW
2131 --s;
2132 break;
2133 }
cc74c5bd
TS
2134 /* skip any other backslash escapes in a pattern */
2135 else if (PL_lex_inpat) {
2136 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2137 goto default_action;
2138 }
02aa26ce
NT
2139
2140 /* if we get here, it's either a quoted -, or a digit */
79072805 2141 switch (*s) {
02aa26ce
NT
2142
2143 /* quoted - in transliterations */
79072805 2144 case '-':
3280af22 2145 if (PL_lex_inwhat == OP_TRANS) {
79072805
LW
2146 *d++ = *s++;
2147 continue;
2148 }
2149 /* FALL THROUGH */
2150 default:
11b8faa4 2151 {
86f97054 2152 if ((isALPHA(*s) || isDIGIT(*s)) &&
041457d9 2153 ckWARN(WARN_MISC))
9014280d 2154 Perl_warner(aTHX_ packWARN(WARN_MISC),
e294cc5d
JH
2155 "Unrecognized escape \\%c passed through",
2156 *s);
11b8faa4 2157 /* default action is to copy the quoted character */
f9a63242 2158 goto default_action;
11b8faa4 2159 }
02aa26ce
NT
2160
2161 /* \132 indicates an octal constant */
79072805
LW
2162 case '0': case '1': case '2': case '3':
2163 case '4': case '5': case '6': case '7':
ba210ebe 2164 {
53305cf1
NC
2165 I32 flags = 0;
2166 STRLEN len = 3;
2167 uv = grok_oct(s, &len, &flags, NULL);
ba210ebe
JH
2168 s += len;
2169 }
012bcf8d 2170 goto NUM_ESCAPE_INSERT;
02aa26ce
NT
2171
2172 /* \x24 indicates a hex constant */
79072805 2173 case 'x':
a0ed51b3
LW
2174 ++s;
2175 if (*s == '{') {
9d4ba2ae 2176 char* const e = strchr(s, '}');
a4c04bdc
NC
2177 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2178 PERL_SCAN_DISALLOW_PREFIX;
53305cf1 2179 STRLEN len;
355860ce 2180
53305cf1 2181 ++s;
adaeee49 2182 if (!e) {
a0ed51b3 2183 yyerror("Missing right brace on \\x{}");
355860ce 2184 continue;
ba210ebe 2185 }
53305cf1
NC
2186 len = e - s;
2187 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe 2188 s = e + 1;
a0ed51b3
LW
2189 }
2190 else {
ba210ebe 2191 {
53305cf1 2192 STRLEN len = 2;
a4c04bdc 2193 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
53305cf1 2194 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe
JH
2195 s += len;
2196 }
012bcf8d
GS
2197 }
2198
2199 NUM_ESCAPE_INSERT:
2200 /* Insert oct or hex escaped character.
301d3d20 2201 * There will always enough room in sv since such
db42d148 2202 * escapes will be longer than any UTF-8 sequence
301d3d20 2203 * they can end up as. */
ba7cea30 2204
c7f1f016
NIS
2205 /* We need to map to chars to ASCII before doing the tests
2206 to cover EBCDIC
2207 */
c4d5f83a 2208 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
9aa983d2 2209 if (!has_utf8 && uv > 255) {
301d3d20
JH
2210 /* Might need to recode whatever we have
2211 * accumulated so far if it contains any
2212 * hibit chars.
2213 *
2214 * (Can't we keep track of that and avoid
2215 * this rescan? --jhi)
012bcf8d 2216 */
c7f1f016 2217 int hicount = 0;
63cd0674
NIS
2218 U8 *c;
2219 for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
c4d5f83a 2220 if (!NATIVE_IS_INVARIANT(*c)) {
012bcf8d 2221 hicount++;
db42d148 2222 }
012bcf8d 2223 }
63cd0674 2224 if (hicount) {
9d4ba2ae 2225 const STRLEN offset = d - SvPVX_const(sv);
db42d148
NIS
2226 U8 *src, *dst;
2227 d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
2228 src = (U8 *)d - 1;
2229 dst = src+hicount;
2230 d += hicount;
cfd0369c 2231 while (src >= (const U8 *)SvPVX_const(sv)) {
c4d5f83a 2232 if (!NATIVE_IS_INVARIANT(*src)) {
9d4ba2ae 2233 const U8 ch = NATIVE_TO_ASCII(*src);
eb160463
GS
2234 *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
2235 *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
012bcf8d
GS
2236 }
2237 else {
63cd0674 2238 *dst-- = *src;
012bcf8d 2239 }
c7f1f016 2240 src--;
012bcf8d
GS
2241 }
2242 }
2243 }
2244
9aa983d2 2245 if (has_utf8 || uv > 255) {
9041c2e3 2246 d = (char*)uvchr_to_utf8((U8*)d, uv);
4e553d73 2247 has_utf8 = TRUE;
f9a63242
JH
2248 if (PL_lex_inwhat == OP_TRANS &&
2249 PL_sublex_info.sub_op) {
2250 PL_sublex_info.sub_op->op_private |=
2251 (PL_lex_repl ? OPpTRANS_FROM_UTF
2252 : OPpTRANS_TO_UTF);
f9a63242 2253 }
e294cc5d
JH
2254#ifdef EBCDIC
2255 if (uv > 255 && !dorange)
2256 native_range = FALSE;
2257#endif
012bcf8d 2258 }
a0ed51b3 2259 else {
012bcf8d 2260 *d++ = (char)uv;
a0ed51b3 2261 }
012bcf8d
GS
2262 }
2263 else {
c4d5f83a 2264 *d++ = (char) uv;
a0ed51b3 2265 }
79072805 2266 continue;
02aa26ce 2267
b239daa5 2268 /* \N{LATIN SMALL LETTER A} is a named character */
4a2d328f 2269 case 'N':
55eda711 2270 ++s;
423cee85
JH
2271 if (*s == '{') {
2272 char* e = strchr(s, '}');
155aba94 2273 SV *res;
423cee85 2274 STRLEN len;
cfd0369c 2275 const char *str;
fc8cd66c 2276 SV *type;
4e553d73 2277
423cee85 2278 if (!e) {
5777a3f7 2279 yyerror("Missing right brace on \\N{}");
423cee85
JH
2280 e = s - 1;
2281 goto cont_scan;
2282 }
dbc0d4f2
JH
2283 if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
2284 /* \N{U+...} */
2285 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2286 PERL_SCAN_DISALLOW_PREFIX;
2287 s += 3;
2288 len = e - s;
2289 uv = grok_hex(s, &len, &flags, NULL);
b57a0404
JH
2290 if ( e > s && len != (STRLEN)(e - s) ) {
2291 uv = 0xFFFD;
fc8cd66c 2292 }
dbc0d4f2
JH
2293 s = e + 1;
2294 goto NUM_ESCAPE_INSERT;
2295 }
55eda711 2296 res = newSVpvn(s + 1, e - s - 1);
fc8cd66c 2297 type = newSVpvn(s - 2,e - s + 3);
bd61b366 2298 res = new_constant( NULL, 0, "charnames",
fc8cd66c
YO
2299 res, NULL, SvPVX(type) );
2300 SvREFCNT_dec(type);
f9a63242
JH
2301 if (has_utf8)
2302 sv_utf8_upgrade(res);
cfd0369c 2303 str = SvPV_const(res,len);
1c47067b
JH
2304#ifdef EBCDIC_NEVER_MIND
2305 /* charnames uses pack U and that has been
2306 * recently changed to do the below uni->native
2307 * mapping, so this would be redundant (and wrong,
2308 * the code point would be doubly converted).
2309 * But leave this in just in case the pack U change
2310 * gets revoked, but the semantics is still
2311 * desireable for charnames. --jhi */
cddc7ef4 2312 {
cfd0369c 2313 UV uv = utf8_to_uvchr((const U8*)str, 0);
cddc7ef4
JH
2314
2315 if (uv < 0x100) {
89ebb4a3 2316 U8 tmpbuf[UTF8_MAXBYTES+1], *d;
cddc7ef4
JH
2317
2318 d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
2319 sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
cfd0369c 2320 str = SvPV_const(res, len);
cddc7ef4
JH
2321 }
2322 }
2323#endif
89491803 2324 if (!has_utf8 && SvUTF8(res)) {
9d4ba2ae 2325 const char * const ostart = SvPVX_const(sv);
f08d6ad9
GS
2326 SvCUR_set(sv, d - ostart);
2327 SvPOK_on(sv);
e4f3eed8 2328 *d = '\0';
f08d6ad9 2329 sv_utf8_upgrade(sv);
d2f449dd 2330 /* this just broke our allocation above... */
eb160463 2331 SvGROW(sv, (STRLEN)(send - start));
f08d6ad9 2332 d = SvPVX(sv) + SvCUR(sv);
89491803 2333 has_utf8 = TRUE;
f08d6ad9 2334 }
eb160463 2335 if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
9d4ba2ae 2336 const char * const odest = SvPVX_const(sv);
423cee85 2337
8973db79 2338 SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
423cee85
JH
2339 d = SvPVX(sv) + (d - odest);
2340 }
e294cc5d
JH
2341#ifdef EBCDIC
2342 if (!dorange)
2343 native_range = FALSE; /* \N{} is guessed to be Unicode */
2344#endif
423cee85
JH
2345 Copy(str, d, len, char);
2346 d += len;
2347 SvREFCNT_dec(res);
2348 cont_scan:
2349 s = e + 1;
2350 }
2351 else
5777a3f7 2352 yyerror("Missing braces on \\N{}");
423cee85
JH
2353 continue;
2354
02aa26ce 2355 /* \c is a control character */
79072805
LW
2356 case 'c':
2357 s++;
961ce445 2358 if (s < send) {
ba210ebe 2359 U8 c = *s++;
c7f1f016
NIS
2360#ifdef EBCDIC
2361 if (isLOWER(c))
2362 c = toUPPER(c);
2363#endif
db42d148 2364 *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
ba210ebe 2365 }
961ce445
RGS
2366 else {
2367 yyerror("Missing control char name in \\c");
2368 }
79072805 2369 continue;
02aa26ce
NT
2370
2371 /* printf-style backslashes, formfeeds, newlines, etc */
79072805 2372 case 'b':
db42d148 2373 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
79072805
LW
2374 break;
2375 case 'n':
db42d148 2376 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
79072805
LW
2377 break;
2378 case 'r':
db42d148 2379 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
79072805
LW
2380 break;
2381 case 'f':
db42d148 2382 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
79072805
LW
2383 break;
2384 case 't':
db42d148 2385 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
79072805 2386 break;
34a3fe2a 2387 case 'e':
db42d148 2388 *d++ = ASCII_TO_NEED(has_utf8,'\033');
34a3fe2a
PP
2389 break;
2390 case 'a':
db42d148 2391 *d++ = ASCII_TO_NEED(has_utf8,'\007');
79072805 2392 break;
02aa26ce
NT
2393 } /* end switch */
2394
79072805
LW
2395 s++;
2396 continue;
02aa26ce 2397 } /* end if (backslash) */
4c3a8340
TS
2398#ifdef EBCDIC
2399 else
2400 literal_endpoint++;
2401#endif
02aa26ce 2402
f9a63242 2403 default_action:
2b9d42f0
NIS
2404 /* If we started with encoded form, or already know we want it
2405 and then encode the next character */
2406 if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
2407 STRLEN len = 1;
5f66b61c
AL
2408 const UV nextuv = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
2409 const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
2b9d42f0
NIS
2410 s += len;
2411 if (need > len) {
2412 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
9d4ba2ae 2413 const STRLEN off = d - SvPVX_const(sv);
2b9d42f0
NIS
2414 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
2415 }
5f66b61c 2416 d = (char*)uvchr_to_utf8((U8*)d, nextuv);
2b9d42f0 2417 has_utf8 = TRUE;
e294cc5d
JH
2418#ifdef EBCDIC
2419 if (uv > 255 && !dorange)
2420 native_range = FALSE;
2421#endif
2b9d42f0
NIS
2422 }
2423 else {
2424 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2425 }
02aa26ce
NT
2426 } /* while loop to process each character */
2427
2428 /* terminate the string and set up the sv */
79072805 2429 *d = '\0';
95a20fc0 2430 SvCUR_set(sv, d - SvPVX_const(sv));
2b9d42f0 2431 if (SvCUR(sv) >= SvLEN(sv))
d0063567 2432 Perl_croak(aTHX_ "panic: constant overflowed allocated space");
2b9d42f0 2433
79072805 2434 SvPOK_on(sv);
9f4817db 2435 if (PL_encoding && !has_utf8) {
d0063567
DK
2436 sv_recode_to_utf8(sv, PL_encoding);
2437 if (SvUTF8(sv))
2438 has_utf8 = TRUE;
9f4817db 2439 }
2b9d42f0 2440 if (has_utf8) {
7e2040f0 2441 SvUTF8_on(sv);
2b9d42f0 2442 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
d0063567 2443 PL_sublex_info.sub_op->op_private |=
2b9d42f0
NIS
2444 (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2445 }
2446 }
79072805 2447
02aa26ce 2448 /* shrink the sv if we allocated more than we used */
79072805 2449 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1da4ca5f 2450 SvPV_shrink_to_cur(sv);
79072805 2451 }
02aa26ce 2452
9b599b2a 2453 /* return the substring (via yylval) only if we parsed anything */
3280af22
NIS
2454 if (s > PL_bufptr) {
2455 if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
10edeb5d
JH
2456 sv = new_constant(start, s - start,
2457 (const char *)(PL_lex_inpat ? "qr" : "q"),
a0714e2c 2458 sv, NULL,
10edeb5d
JH
2459 (const char *)
2460 (( PL_lex_inwhat == OP_TRANS
2461 ? "tr"
2462 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
2463 ? "s"
2464 : "qq"))));
79072805 2465 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
b3ac6de7 2466 } else
8990e307 2467 SvREFCNT_dec(sv);
79072805
LW
2468 return s;
2469}
2470
ffb4593c
NT
2471/* S_intuit_more
2472 * Returns TRUE if there's more to the expression (e.g., a subscript),
2473 * FALSE otherwise.
ffb4593c
NT
2474 *
2475 * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
2476 *
2477 * ->[ and ->{ return TRUE
2478 * { and [ outside a pattern are always subscripts, so return TRUE
2479 * if we're outside a pattern and it's not { or [, then return FALSE
2480 * if we're in a pattern and the first char is a {
2481 * {4,5} (any digits around the comma) returns FALSE
2482 * if we're in a pattern and the first char is a [
2483 * [] returns FALSE
2484 * [SOMETHING] has a funky algorithm to decide whether it's a
2485 * character class or not. It has to deal with things like
2486 * /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
2487 * anything else returns TRUE
2488 */
2489
9cbb5ea2
GS
2490/* This is the one truly awful dwimmer necessary to conflate C and sed. */
2491
76e3520e 2492STATIC int
cea2e8a9 2493S_intuit_more(pTHX_ register char *s)
79072805 2494{
97aff369 2495 dVAR;
3280af22 2496 if (PL_lex_brackets)
79072805
LW
2497 return TRUE;
2498 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
2499 return TRUE;
2500 if (*s != '{' && *s != '[')
2501 return FALSE;
3280af22 2502 if (!PL_lex_inpat)
79072805
LW
2503 return TRUE;
2504
2505 /* In a pattern, so maybe we have {n,m}. */
2506 if (*s == '{') {
2507 s++;
2508 if (!isDIGIT(*s))
2509 return TRUE;
2510 while (isDIGIT(*s))
2511 s++;
2512 if (*s == ',')
2513 s++;
2514 while (isDIGIT(*s))
2515 s++;
2516 if (*s == '}')
2517 return FALSE;
2518 return TRUE;
2519
2520 }
2521
2522 /* On the other hand, maybe we have a character class */
2523
2524 s++;
2525 if (*s == ']' || *s == '^')
2526 return FALSE;
2527 else {
ffb4593c 2528 /* this is terrifying, and it works */
79072805
LW
2529 int weight = 2; /* let's weigh the evidence */
2530 char seen[256];
f27ffc4a 2531 unsigned char un_char = 255, last_un_char;
9d4ba2ae 2532 const char * const send = strchr(s,']');
3280af22 2533 char tmpbuf[sizeof PL_tokenbuf * 4];
79072805
LW
2534
2535 if (!send) /* has to be an expression */
2536 return TRUE;
2537
2538 Zero(seen,256,char);
2539 if (*s == '$')
2540 weight -= 3;
2541 else if (isDIGIT(*s)) {
2542 if (s[1] != ']') {
2543 if (isDIGIT(s[1]) && s[2] == ']')
2544 weight -= 10;
2545 }
2546 else
2547 weight -= 100;
2548 }
2549 for (; s < send; s++) {
2550 last_un_char = un_char;
2551 un_char = (unsigned char)*s;
2552 switch (*s) {
2553 case '@':
2554 case '&':
2555 case '$':
2556 weight -= seen[un_char] * 10;
7e2040f0 2557 if (isALNUM_lazy_if(s+1,UTF)) {
90e5519e 2558 int len;
8903cb82 2559 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
90e5519e
NC
2560 len = (int)strlen(tmpbuf);
2561 if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
79072805
LW
2562 weight -= 100;
2563 else
2564 weight -= 10;
2565 }
2566 else if (*s == '$' && s[1] &&
93a17b20
LW
2567 strchr("[#!%*<>()-=",s[1])) {
2568 if (/*{*/ strchr("])} =",s[2]))
79072805
LW
2569 weight -= 10;
2570 else
2571 weight -= 1;
2572 }
2573 break;
2574 case '\\':
2575 un_char = 254;
2576 if (s[1]) {
93a17b20 2577 if (strchr("wds]",s[1]))
79072805 2578 weight += 100;
10edeb5d 2579 else if (seen[(U8)'\''] || seen[(U8)'"'])
79072805 2580 weight += 1;
93a17b20 2581 else if (strchr("rnftbxcav",s[1]))
79072805
LW
2582 weight += 40;
2583 else if (isDIGIT(s[1])) {
2584 weight += 40;
2585 while (s[1] && isDIGIT(s[1]))
2586 s++;
2587 }
2588 }
2589 else
2590 weight += 100;
2591 break;
2592 case '-':
2593 if (s[1] == '\\')
2594 weight += 50;
93a17b20 2595 if (strchr("aA01! ",last_un_char))
79072805 2596 weight += 30;
93a17b20 2597 if (strchr("zZ79~",s[1]))
79072805 2598 weight += 30;
f27ffc4a
GS
2599 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
2600 weight -= 5; /* cope with negative subscript */
79072805
LW
2601 break;
2602 default:
3792a11b
NC
2603 if (!isALNUM(last_un_char)
2604 && !(last_un_char == '$' || last_un_char == '@'
2605 || last_un_char == '&')
2606 && isALPHA(*s) && s[1] && isALPHA(s[1])) {
79072805
LW
2607 char *d = tmpbuf;
2608 while (isALPHA(*s))
2609 *d++ = *s++;
2610 *d = '\0';
5458a98a 2611 if (keyword(tmpbuf, d - tmpbuf, 0))
79072805
LW
2612 weight -= 150;
2613 }
2614 if (un_char == last_un_char + 1)
2615 weight += 5;
2616 weight -= seen[un_char];
2617 break;
2618 }
2619 seen[un_char]++;
2620 }
2621 if (weight >= 0) /* probably a character class */
2622 return FALSE;
2623 }
2624
2625 return TRUE;
2626}
ffed7fef 2627
ffb4593c
NT
2628/*
2629 * S_intuit_method
2630 *
2631 * Does all the checking to disambiguate
2632 * foo bar
2633 * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise
2634 * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2635 *
2636 * First argument is the stuff after the first token, e.g. "bar".
2637 *
2638 * Not a method if bar is a filehandle.
2639 * Not a method if foo is a subroutine prototyped to take a filehandle.
2640 * Not a method if it's really "Foo $bar"
2641 * Method if it's "foo $bar"
2642 * Not a method if it's really "print foo $bar"
2643 * Method if it's really "foo package::" (interpreted as package->foo)
8f8cf39c 2644 * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3cb0bbe5 2645 * Not a method if bar is a filehandle or package, but is quoted with
ffb4593c
NT
2646 * =>
2647 */
2648
76e3520e 2649STATIC int
62d55b22 2650S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
a0d0e21e 2651{
97aff369 2652 dVAR;
a0d0e21e 2653 char *s = start + (*start == '$');
3280af22 2654 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
2655 STRLEN len;
2656 GV* indirgv;
5db06880
NC
2657#ifdef PERL_MAD
2658 int soff;
2659#endif
a0d0e21e
LW
2660
2661 if (gv) {
62d55b22 2662 if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
a0d0e21e 2663 return 0;
62d55b22
NC
2664 if (cv) {
2665 if (SvPOK(cv)) {
2666 const char *proto = SvPVX_const(cv);
2667 if (proto) {
2668 if (*proto == ';')
2669 proto++;
2670 if (*proto == '*')
2671 return 0;
2672 }
b6c543e3
IZ
2673 }
2674 } else
c35e046a 2675 gv = NULL;
a0d0e21e 2676 }
8903cb82 2677 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
ffb4593c
NT
2678 /* start is the beginning of the possible filehandle/object,
2679 * and s is the end of it
2680 * tmpbuf is a copy of it
2681 */
2682
a0d0e21e 2683 if (*start == '$') {
3ef1310e
RGS
2684 if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
2685 isUPPER(*PL_tokenbuf))
a0d0e21e 2686 return 0;
5db06880
NC
2687#ifdef PERL_MAD
2688 len = start - SvPVX(PL_linestr);
2689#endif
29595ff2 2690 s = PEEKSPACE(s);
f0092767 2691#ifdef PERL_MAD
5db06880
NC
2692 start = SvPVX(PL_linestr) + len;
2693#endif
3280af22
NIS
2694 PL_bufptr = start;
2695 PL_expect = XREF;
a0d0e21e
LW
2696 return *s == '(' ? FUNCMETH : METHOD;
2697 }
5458a98a 2698 if (!keyword(tmpbuf, len, 0)) {
c3e0f903
GS
2699 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2700 len -= 2;
2701 tmpbuf[len] = '\0';
5db06880
NC
2702#ifdef PERL_MAD
2703 soff = s - SvPVX(PL_linestr);
2704#endif
c3e0f903
GS
2705 goto bare_package;
2706 }
90e5519e 2707 indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
8ebc5c01 2708 if (indirgv && GvCVu(indirgv))
a0d0e21e
LW
2709 return 0;
2710 /* filehandle or package name makes it a method */
da51bb9b 2711 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
5db06880
NC
2712#ifdef PERL_MAD
2713 soff = s - SvPVX(PL_linestr);
2714#endif
29595ff2 2715 s = PEEKSPACE(s);
3280af22 2716 if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
55497cff 2717 return 0; /* no assumptions -- "=>" quotes bearword */
c3e0f903 2718 bare_package:
cd81e915 2719 start_force(PL_curforce);
9ded7720 2720 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
79cb57f6 2721 newSVpvn(tmpbuf,len));
9ded7720 2722 NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
5db06880
NC
2723 if (PL_madskills)
2724 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3280af22 2725 PL_expect = XTERM;
a0d0e21e 2726 force_next(WORD);
3280af22 2727 PL_bufptr = s;
5db06880
NC
2728#ifdef PERL_MAD
2729 PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
2730#endif
a0d0e21e
LW
2731 return *s == '(' ? FUNCMETH : METHOD;
2732 }
2733 }
2734 return 0;
2735}
2736
ffb4593c
NT
2737/*
2738 * S_incl_perldb
2739 * Return a string of Perl code to load the debugger. If PERL5DB
2740 * is set, it will return the contents of that, otherwise a
2741 * compile-time require of perl5db.pl.
2742 */
2743
bfed75c6 2744STATIC const char*
cea2e8a9 2745S_incl_perldb(pTHX)
a0d0e21e 2746{
97aff369 2747 dVAR;
3280af22 2748 if (PL_perldb) {
9d4ba2ae 2749 const char * const pdb = PerlEnv_getenv("PERL5DB");
a0d0e21e
LW
2750
2751 if (pdb)
2752 return pdb;
93189314 2753 SETERRNO(0,SS_NORMAL);
a0d0e21e
LW
2754 return "BEGIN { require 'perl5db.pl' }";
2755 }
2756 return "";
2757}
2758
2759
16d20bd9 2760/* Encoded script support. filter_add() effectively inserts a
4e553d73 2761 * 'pre-processing' function into the current source input stream.
16d20bd9
AD
2762 * Note that the filter function only applies to the current source file
2763 * (e.g., it will not affect files 'require'd or 'use'd by this one).
2764 *
2765 * The datasv parameter (which may be NULL) can be used to pass
2766 * private data to this instance of the filter. The filter function
2767 * can recover the SV using the FILTER_DATA macro and use it to
2768 * store private buffers and state information.
2769 *
2770 * The supplied datasv parameter is upgraded to a PVIO type
4755096e 2771 * and the IoDIRP/IoANY field is used to store the function pointer,
e0c19803 2772 * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
16d20bd9
AD
2773 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2774 * private use must be set using malloc'd pointers.
2775 */
16d20bd9
AD
2776
2777SV *
864dbfa3 2778Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
16d20bd9 2779{
97aff369 2780 dVAR;
f4c556ac 2781 if (!funcp)
a0714e2c 2782 return NULL;
f4c556ac 2783
5486870f
DM
2784 if (!PL_parser)
2785 return NULL;
2786
3280af22
NIS
2787 if (!PL_rsfp_filters)
2788 PL_rsfp_filters = newAV();
16d20bd9 2789 if (!datasv)
561b68a9 2790 datasv = newSV(0);
862a34c6 2791 SvUPGRADE(datasv, SVt_PVIO);
8141890a 2792 IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
e0c19803 2793 IoFLAGS(datasv) |= IOf_FAKE_DIRP;
f4c556ac 2794 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
55662e27
JH
2795 FPTR2DPTR(void *, IoANY(datasv)),
2796 SvPV_nolen(datasv)));
3280af22
NIS
2797 av_unshift(PL_rsfp_filters, 1);
2798 av_store(PL_rsfp_filters, 0, datasv) ;
16d20bd9
AD
2799 return(datasv);
2800}
4e553d73 2801
16d20bd9
AD
2802
2803/* Delete most recently added instance of this filter function. */
a0d0e21e 2804void
864dbfa3 2805Perl_filter_del(pTHX_ filter_t funcp)
16d20bd9 2806{
97aff369 2807 dVAR;
e0c19803 2808 SV *datasv;
24801a4b 2809
33073adb 2810#ifdef DEBUGGING
55662e27
JH
2811 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
2812 FPTR2DPTR(void*, funcp)));
33073adb 2813#endif
5486870f 2814 if (!PL_parser || !PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
16d20bd9
AD
2815 return;
2816 /* if filter is on top of stack (usual case) just pop it off */
e0c19803 2817 datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
8141890a 2818 if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
e0c19803 2819 IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
4755096e 2820 IoANY(datasv) = (void *)NULL;
3280af22 2821 sv_free(av_pop(PL_rsfp_filters));
e50aee73 2822
16d20bd9
AD
2823 return;
2824 }
2825 /* we need to search for the correct entry and clear it */
cea2e8a9 2826 Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
16d20bd9
AD
2827}
2828
2829
1de9afcd
RGS
2830/* Invoke the idxth filter function for the current rsfp. */
2831/* maxlen 0 = read one text line */
16d20bd9 2832I32
864dbfa3 2833Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
a0d0e21e 2834{
97aff369 2835 dVAR;
16d20bd9
AD
2836 filter_t funcp;
2837 SV *datasv = NULL;
f482118e
NC
2838 /* This API is bad. It should have been using unsigned int for maxlen.
2839 Not sure if we want to change the API, but if not we should sanity
2840 check the value here. */
39cd7a59
NC
2841 const unsigned int correct_length
2842 = maxlen < 0 ?
2843#ifdef PERL_MICRO
2844 0x7FFFFFFF
2845#else
2846 INT_MAX
2847#endif
2848 : maxlen;
e50aee73 2849
5486870f 2850 if (!PL_parser || !PL_rsfp_filters)
16d20bd9 2851 return -1;
1de9afcd 2852 if (idx > AvFILLp(PL_rsfp_filters)) { /* Any more filters? */
16d20bd9
AD
2853 /* Provide a default input filter to make life easy. */
2854 /* Note that we append to the line. This is handy. */
f4c556ac
GS
2855 DEBUG_P(PerlIO_printf(Perl_debug_log,
2856 "filter_read %d: from rsfp\n", idx));
f482118e 2857 if (correct_length) {
16d20bd9
AD
2858 /* Want a block */
2859 int len ;
f54cb97a 2860 const int old_len = SvCUR(buf_sv);
16d20bd9
AD
2861
2862 /* ensure buf_sv is large enough */
f482118e
NC
2863 SvGROW(buf_sv, (STRLEN)(old_len + correct_length)) ;
2864 if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
2865 correct_length)) <= 0) {
3280af22 2866 if (PerlIO_error(PL_rsfp))
37120919
AD
2867 return -1; /* error */
2868 else
2869 return 0 ; /* end of file */
2870 }
16d20bd9
AD
2871 SvCUR_set(buf_sv, old_len + len) ;
2872 } else {
2873 /* Want a line */
3280af22
NIS
2874 if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2875 if (PerlIO_error(PL_rsfp))
37120919
AD
2876 return -1; /* error */
2877 else
2878 return 0 ; /* end of file */
2879 }
16d20bd9
AD
2880 }
2881 return SvCUR(buf_sv);
2882 }
2883 /* Skip this filter slot if filter has been deleted */
1de9afcd 2884 if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
f4c556ac
GS
2885 DEBUG_P(PerlIO_printf(Perl_debug_log,
2886 "filter_read %d: skipped (filter deleted)\n",
2887 idx));
f482118e 2888 return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
16d20bd9
AD
2889 }
2890 /* Get function pointer hidden within datasv */
8141890a 2891 funcp = DPTR2FPTR(filter_t, IoANY(datasv));
f4c556ac
GS
2892 DEBUG_P(PerlIO_printf(Perl_debug_log,
2893 "filter_read %d: via function %p (%s)\n",
ca0270c4 2894 idx, (void*)datasv, SvPV_nolen_const(datasv)));
16d20bd9
AD
2895 /* Call function. The function is expected to */
2896 /* call "FILTER_READ(idx+1, buf_sv)" first. */
37120919 2897 /* Return: <0:error, =0:eof, >0:not eof */
f482118e 2898 return (*funcp)(aTHX_ idx, buf_sv, correct_length);
16d20bd9
AD
2899}
2900
76e3520e 2901STATIC char *
cea2e8a9 2902S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
16d20bd9 2903{
97aff369 2904 dVAR;
c39cd008 2905#ifdef PERL_CR_FILTER
3280af22 2906 if (!PL_rsfp_filters) {
c39cd008 2907 filter_add(S_cr_textfilter,NULL);
a868473f
NIS
2908 }
2909#endif
3280af22 2910 if (PL_rsfp_filters) {
55497cff 2911 if (!append)
2912 SvCUR_set(sv, 0); /* start with empty line */
16d20bd9
AD
2913 if (FILTER_READ(0, sv, 0) > 0)
2914 return ( SvPVX(sv) ) ;
2915 else
bd61b366 2916 return NULL ;
16d20bd9 2917 }
9d116dd7 2918 else
fd049845 2919 return (sv_gets(sv, fp, append));
a0d0e21e
LW
2920}
2921
01ec43d0 2922STATIC HV *
7fc63493 2923S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
def3634b 2924{
97aff369 2925 dVAR;
def3634b
GS
2926 GV *gv;
2927
01ec43d0 2928 if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
def3634b
GS
2929 return PL_curstash;
2930
2931 if (len > 2 &&
2932 (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
90e5519e 2933 (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
01ec43d0
GS
2934 {
2935 return GvHV(gv); /* Foo:: */
def3634b
GS
2936 }
2937
2938 /* use constant CLASS => 'MyClass' */
c35e046a
AL
2939 gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
2940 if (gv && GvCV(gv)) {
2941 SV * const sv = cv_const_sv(GvCV(gv));
2942 if (sv)
83003860 2943 pkgname = SvPV_nolen_const(sv);
def3634b
GS
2944 }
2945
da51bb9b 2946 return gv_stashpv(pkgname, 0);
def3634b 2947}
a0d0e21e 2948
e3f73d4e
RGS
2949/*
2950 * S_readpipe_override
2951 * Check whether readpipe() is overriden, and generates the appropriate
2952 * optree, provided sublex_start() is called afterwards.
2953 */
2954STATIC void
1d51329b 2955S_readpipe_override(pTHX)
e3f73d4e
RGS
2956{
2957 GV **gvp;
2958 GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
2959 yylval.ival = OP_BACKTICK;
2960 if ((gv_readpipe
2961 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
2962 ||
2963 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
d5e716f5 2964 && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
e3f73d4e
RGS
2965 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
2966 {
2967 PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
2968 append_elem(OP_LIST,
2969 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
2970 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
2971 }
2972 else {
2973 set_csh();
2974 }
2975}
2976
5db06880
NC
2977#ifdef PERL_MAD
2978 /*
2979 * Perl_madlex
2980 * The intent of this yylex wrapper is to minimize the changes to the
2981 * tokener when we aren't interested in collecting madprops. It remains
2982 * to be seen how successful this strategy will be...
2983 */
2984
2985int
2986Perl_madlex(pTHX)
2987{
2988 int optype;
2989 char *s = PL_bufptr;
2990
cd81e915
NC
2991 /* make sure PL_thiswhite is initialized */
2992 PL_thiswhite = 0;
2993 PL_thismad = 0;
5db06880 2994
cd81e915 2995 /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
5db06880
NC
2996 if (PL_pending_ident)
2997 return S_pending_ident(aTHX);
2998
2999 /* previous token ate up our whitespace? */
cd81e915
NC
3000 if (!PL_lasttoke && PL_nextwhite) {
3001 PL_thiswhite = PL_nextwhite;
3002 PL_nextwhite = 0;
5db06880
NC
3003 }
3004
3005 /* isolate the token, and figure out where it is without whitespace */
cd81e915
NC
3006 PL_realtokenstart = -1;
3007 PL_thistoken = 0;
5db06880
NC
3008 optype = yylex();
3009 s = PL_bufptr;
cd81e915 3010 assert(PL_curforce < 0);
5db06880 3011
cd81e915
NC
3012 if (!PL_thismad || PL_thismad->mad_key == '^') { /* not forced already? */
3013 if (!PL_thistoken) {
3014 if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
6b29d1f5 3015 PL_thistoken = newSVpvs("");
5db06880 3016 else {
c35e046a 3017 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915 3018 PL_thistoken = newSVpvn(tstart, s - tstart);
5db06880
NC
3019 }
3020 }
cd81e915
NC
3021 if (PL_thismad) /* install head */
3022 CURMAD('X', PL_thistoken);
5db06880
NC
3023 }
3024
3025 /* last whitespace of a sublex? */
cd81e915
NC
3026 if (optype == ')' && PL_endwhite) {
3027 CURMAD('X', PL_endwhite);
5db06880
NC
3028 }
3029
cd81e915 3030 if (!PL_thismad) {
5db06880
NC
3031
3032 /* if no whitespace and we're at EOF, bail. Otherwise fake EOF below. */
cd81e915
NC
3033 if (!PL_thiswhite && !PL_endwhite && !optype) {
3034 sv_free(PL_thistoken);
3035 PL_thistoken = 0;
5db06880
NC
3036 return 0;
3037 }
3038
3039 /* put off final whitespace till peg */
3040 if (optype == ';' && !PL_rsfp) {
cd81e915
NC
3041 PL_nextwhite = PL_thiswhite;
3042 PL_thiswhite = 0;
5db06880 3043 }
cd81e915
NC
3044 else if (PL_thisopen) {
3045 CURMAD('q', PL_thisopen);
3046 if (PL_thistoken)
3047 sv_free(PL_thistoken);
3048 PL_thistoken = 0;
5db06880
NC
3049 }
3050 else {
3051 /* Store actual token text as madprop X */
cd81e915 3052 CURMAD('X', PL_thistoken);
5db06880
NC
3053 }
3054
cd81e915 3055 if (PL_thiswhite) {
5db06880 3056 /* add preceding whitespace as madprop _ */
cd81e915 3057 CURMAD('_', PL_thiswhite);
5db06880
NC
3058 }
3059
cd81e915 3060 if (PL_thisstuff) {
5db06880 3061 /* add quoted material as madprop = */
cd81e915 3062 CURMAD('=', PL_thisstuff);
5db06880
NC
3063 }
3064
cd81e915 3065 if (PL_thisclose) {
5db06880 3066 /* add terminating quote as madprop Q */
cd81e915 3067 CURMAD('Q', PL_thisclose);
5db06880
NC
3068 }
3069 }
3070
3071 /* special processing based on optype */
3072
3073 switch (optype) {
3074
3075 /* opval doesn't need a TOKEN since it can already store mp */
3076 case WORD:
3077 case METHOD:
3078 case FUNCMETH:
3079 case THING:
3080 case PMFUNC:
3081 case PRIVATEREF:
3082 case FUNC0SUB:
3083 case UNIOPSUB:
3084 case LSTOPSUB:
3085 if (yylval.opval)
cd81e915
NC
3086 append_madprops(PL_thismad, yylval.opval, 0);
3087 PL_thismad = 0;
5db06880
NC
3088 return optype;
3089
3090 /* fake EOF */
3091 case 0:
3092 optype = PEG;
cd81e915
NC
3093 if (PL_endwhite) {
3094 addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
3095 PL_endwhite = 0;
5db06880
NC
3096 }
3097 break;
3098
3099 case ']':
3100 case '}':
cd81e915 3101 if (PL_faketokens)
5db06880
NC
3102 break;
3103 /* remember any fake bracket that lexer is about to discard */
3104 if (PL_lex_brackets == 1 &&
3105 ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
3106 {
3107 s = PL_bufptr;
3108 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3109 s++;
3110 if (*s == '}') {
cd81e915
NC
3111 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
3112 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3113 PL_thiswhite = 0;
5db06880
NC
3114 PL_bufptr = s - 1;
3115 break; /* don't bother looking for trailing comment */
3116 }
3117 else
3118 s = PL_bufptr;
3119 }
3120 if (optype == ']')
3121 break;
3122 /* FALLTHROUGH */
3123
3124 /* attach a trailing comment to its statement instead of next token */
3125 case ';':
cd81e915 3126 if (PL_faketokens)
5db06880
NC
3127 break;
3128 if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
3129 s = PL_bufptr;
3130 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3131 s++;
3132 if (*s == '\n' || *s == '#') {
3133 while (s < PL_bufend && *s != '\n')
3134 s++;
3135 if (s < PL_bufend)
3136 s++;
cd81e915
NC
3137 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
3138 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3139 PL_thiswhite = 0;
5db06880
NC
3140 PL_bufptr = s;
3141 }
3142 }
3143 break;
3144
3145 /* pval */
3146 case LABEL:
3147 break;
3148
3149 /* ival */
3150 default:
3151 break;
3152
3153 }
3154
3155 /* Create new token struct. Note: opvals return early above. */
cd81e915
NC
3156 yylval.tkval = newTOKEN(optype, yylval, PL_thismad);
3157 PL_thismad = 0;
5db06880
NC
3158 return optype;
3159}
3160#endif
3161
468aa647 3162STATIC char *
cc6ed77d 3163S_tokenize_use(pTHX_ int is_use, char *s) {
97aff369 3164 dVAR;
468aa647
RGS
3165 if (PL_expect != XSTATE)
3166 yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
3167 is_use ? "use" : "no"));
29595ff2 3168 s = SKIPSPACE1(s);
468aa647
RGS
3169 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
3170 s = force_version(s, TRUE);
29595ff2 3171 if (*s == ';' || (s = SKIPSPACE1(s), *s == ';')) {
cd81e915 3172 start_force(PL_curforce);
9ded7720 3173 NEXTVAL_NEXTTOKE.opval = NULL;
468aa647
RGS
3174 force_next(WORD);
3175 }
3176 else if (*s == 'v') {
3177 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3178 s = force_version(s, FALSE);
3179 }
3180 }
3181 else {
3182 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3183 s = force_version(s, FALSE);
3184 }
3185 yylval.ival = is_use;
3186 return s;
3187}
748a9306 3188#ifdef DEBUGGING
27da23d5 3189 static const char* const exp_name[] =
09bef843 3190 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
27308ded 3191 "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
09bef843 3192 };
748a9306 3193#endif
463ee0b2 3194
02aa26ce
NT
3195/*
3196 yylex
3197
3198 Works out what to call the token just pulled out of the input
3199 stream. The yacc parser takes care of taking the ops we return and
3200 stitching them into a tree.
3201
3202 Returns:
3203 PRIVATEREF
3204
3205 Structure:
3206 if read an identifier
3207 if we're in a my declaration
3208 croak if they tried to say my($foo::bar)
3209 build the ops for a my() declaration
3210 if it's an access to a my() variable
3211 are we in a sort block?
3212 croak if my($a); $a <=> $b
3213 build ops for access to a my() variable
3214 if in a dq string, and they've said @foo and we can't find @foo
3215 croak
3216 build ops for a bareword
3217 if we already built the token before, use it.
3218*/
3219
20141f0e 3220
dba4d153
JH
3221#ifdef __SC__
3222#pragma segment Perl_yylex
3223#endif
dba4d153 3224int
dba4d153 3225Perl_yylex(pTHX)
20141f0e 3226{
97aff369 3227 dVAR;
3afc138a 3228 register char *s = PL_bufptr;
378cc40b 3229 register char *d;
463ee0b2 3230 STRLEN len;
aa7440fb 3231 bool bof = FALSE;
a687059c 3232
10edeb5d
JH
3233 /* orig_keyword, gvp, and gv are initialized here because
3234 * jump to the label just_a_word_zero can bypass their
3235 * initialization later. */
3236 I32 orig_keyword = 0;
3237 GV *gv = NULL;
3238 GV **gvp = NULL;
3239
bbf60fe6 3240 DEBUG_T( {
396482e1 3241 SV* tmp = newSVpvs("");
b6007c36
DM
3242 PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
3243 (IV)CopLINE(PL_curcop),
3244 lex_state_names[PL_lex_state],
3245 exp_name[PL_expect],
3246 pv_display(tmp, s, strlen(s), 0, 60));
3247 SvREFCNT_dec(tmp);
bbf60fe6 3248 } );
02aa26ce 3249 /* check if there's an identifier for us to look at */
ba979b31 3250 if (PL_pending_ident)
bbf60fe6 3251 return REPORT(S_pending_ident(aTHX));
bbce6d69 3252
02aa26ce
NT
3253 /* no identifier pending identification */
3254
3280af22 3255 switch (PL_lex_state) {
79072805
LW
3256#ifdef COMMENTARY
3257 case LEX_NORMAL: /* Some compilers will produce faster */
3258 case LEX_INTERPNORMAL: /* code if we comment these out. */
3259 break;
3260#endif
3261
09bef843 3262 /* when we've already built the next token, just pull it out of the queue */
79072805 3263 case LEX_KNOWNEXT:
5db06880
NC
3264#ifdef PERL_MAD
3265 PL_lasttoke--;
3266 yylval = PL_nexttoke[PL_lasttoke].next_val;
3267 if (PL_madskills) {
cd81e915 3268 PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
5db06880 3269 PL_nexttoke[PL_lasttoke].next_mad = 0;
cd81e915
NC
3270 if (PL_thismad && PL_thismad->mad_key == '_') {
3271 PL_thiswhite = (SV*)PL_thismad->mad_val;
3272 PL_thismad->mad_val = 0;
3273 mad_free(PL_thismad);
3274 PL_thismad = 0;
5db06880
NC
3275 }
3276 }
3277 if (!PL_lasttoke) {
3278 PL_lex_state = PL_lex_defer;
3279 PL_expect = PL_lex_expect;
3280 PL_lex_defer = LEX_NORMAL;
3281 if (!PL_nexttoke[PL_lasttoke].next_type)
3282 return yylex();
3283 }
3284#else
3280af22 3285 PL_nexttoke--;
5db06880 3286 yylval = PL_nextval[PL_nexttoke];
3280af22
NIS
3287 if (!PL_nexttoke) {
3288 PL_lex_state = PL_lex_defer;
3289 PL_expect = PL_lex_expect;
3290 PL_lex_defer = LEX_NORMAL;
463ee0b2 3291 }
5db06880
NC
3292#endif
3293#ifdef PERL_MAD
3294 /* FIXME - can these be merged? */
3295 return(PL_nexttoke[PL_lasttoke].next_type);
3296#else
bbf60fe6 3297 return REPORT(PL_nexttype[PL_nexttoke]);
5db06880 3298#endif
79072805 3299
02aa26ce 3300 /* interpolated case modifiers like \L \U, including \Q and \E.
3280af22 3301 when we get here, PL_bufptr is at the \
02aa26ce 3302 */
79072805
LW
3303 case LEX_INTERPCASEMOD:
3304#ifdef DEBUGGING
3280af22 3305 if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
cea2e8a9 3306 Perl_croak(aTHX_ "panic: INTERPCASEMOD");
79072805 3307#endif
02aa26ce 3308 /* handle \E or end of string */
3280af22 3309 if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
02aa26ce 3310 /* if at a \E */
3280af22 3311 if (PL_lex_casemods) {
f54cb97a 3312 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
3280af22 3313 PL_lex_casestack[PL_lex_casemods] = '\0';
02aa26ce 3314
3792a11b
NC
3315 if (PL_bufptr != PL_bufend
3316 && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
3280af22
NIS
3317 PL_bufptr += 2;
3318 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
3319#ifdef PERL_MAD
3320 if (PL_madskills)
6b29d1f5 3321 PL_thistoken = newSVpvs("\\E");
5db06880 3322#endif
a0d0e21e 3323 }
bbf60fe6 3324 return REPORT(')');
79072805 3325 }
5db06880
NC
3326#ifdef PERL_MAD
3327 while (PL_bufptr != PL_bufend &&
3328 PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
cd81e915 3329 if (!PL_thiswhite)
6b29d1f5 3330 PL_thiswhite = newSVpvs("");
cd81e915 3331 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
5db06880
NC
3332 PL_bufptr += 2;
3333 }
3334#else
3280af22
NIS
3335 if (PL_bufptr != PL_bufend)
3336 PL_bufptr += 2;
5db06880 3337#endif
3280af22 3338 PL_lex_state = LEX_INTERPCONCAT;
cea2e8a9 3339 return yylex();
79072805
LW
3340 }
3341 else {
607df283 3342 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 3343 "### Saw case modifier\n"); });
3280af22 3344 s = PL_bufptr + 1;
6e909404 3345 if (s[1] == '\\' && s[2] == 'E') {
5db06880 3346#ifdef PERL_MAD
cd81e915 3347 if (!PL_thiswhite)
6b29d1f5 3348 PL_thiswhite = newSVpvs("");
cd81e915 3349 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
5db06880 3350#endif
89122651 3351 PL_bufptr = s + 3;
6e909404
JH
3352 PL_lex_state = LEX_INTERPCONCAT;
3353 return yylex();
a0d0e21e 3354 }
6e909404 3355 else {
90771dc0 3356 I32 tmp;
5db06880
NC
3357 if (!PL_madskills) /* when just compiling don't need correct */
3358 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
3359 tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */
3792a11b 3360 if ((*s == 'L' || *s == 'U') &&
6e909404
JH
3361 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
3362 PL_lex_casestack[--PL_lex_casemods] = '\0';
bbf60fe6 3363 return REPORT(')');
6e909404
JH
3364 }
3365 if (PL_lex_casemods > 10)
3366 Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
3367 PL_lex_casestack[PL_lex_casemods++] = *s;
3368 PL_lex_casestack[PL_lex_casemods] = '\0';
3369 PL_lex_state = LEX_INTERPCONCAT;
cd81e915 3370 start_force(PL_curforce);
9ded7720 3371 NEXTVAL_NEXTTOKE.ival = 0;
6e909404 3372 force_next('(');
cd81e915 3373 start_force(PL_curforce);
6e909404 3374 if (*s == 'l')
9ded7720 3375 NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
6e909404 3376 else if (*s == 'u')
9ded7720 3377 NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
6e909404 3378 else if (*s == 'L')
9ded7720 3379 NEXTVAL_NEXTTOKE.ival = OP_LC;
6e909404 3380 else if (*s == 'U')
9ded7720 3381 NEXTVAL_NEXTTOKE.ival = OP_UC;
6e909404 3382 else if (*s == 'Q')
9ded7720 3383 NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
6e909404
JH
3384 else
3385 Perl_croak(aTHX_ "panic: yylex");
5db06880 3386 if (PL_madskills) {
6b29d1f5 3387 SV* const tmpsv = newSVpvs("");
5db06880
NC
3388 Perl_sv_catpvf(aTHX_ tmpsv, "\\%c", *s);
3389 curmad('_', tmpsv);
3390 }
6e909404 3391 PL_bufptr = s + 1;
a0d0e21e 3392 }
79072805 3393 force_next(FUNC);
3280af22
NIS
3394 if (PL_lex_starts) {
3395 s = PL_bufptr;
3396 PL_lex_starts = 0;
5db06880
NC
3397#ifdef PERL_MAD
3398 if (PL_madskills) {
cd81e915
NC
3399 if (PL_thistoken)
3400 sv_free(PL_thistoken);
6b29d1f5 3401 PL_thistoken = newSVpvs("");
5db06880
NC
3402 }
3403#endif
131b3ad0
DM
3404 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3405 if (PL_lex_casemods == 1 && PL_lex_inpat)
3406 OPERATOR(',');
3407 else
3408 Aop(OP_CONCAT);
79072805
LW
3409 }
3410 else
cea2e8a9 3411 return yylex();
79072805
LW
3412 }
3413
55497cff 3414 case LEX_INTERPPUSH:
bbf60fe6 3415 return REPORT(sublex_push());
55497cff 3416
79072805 3417 case LEX_INTERPSTART:
3280af22 3418 if (PL_bufptr == PL_bufend)
bbf60fe6 3419 return REPORT(sublex_done());
607df283 3420 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 3421 "### Interpolated variable\n"); });
3280af22
NIS
3422 PL_expect = XTERM;
3423 PL_lex_dojoin = (*PL_bufptr == '@');
3424 PL_lex_state = LEX_INTERPNORMAL;
3425 if (PL_lex_dojoin) {
cd81e915 3426 start_force(PL_curforce);
9ded7720 3427 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3428 force_next(',');
cd81e915 3429 start_force(PL_curforce);
a0d0e21e 3430 force_ident("\"", '$');
cd81e915 3431 start_force(PL_curforce);
9ded7720 3432 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3433 force_next('$');
cd81e915 3434 start_force(PL_curforce);
9ded7720 3435 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3436 force_next('(');
cd81e915 3437 start_force(PL_curforce);
9ded7720 3438 NEXTVAL_NEXTTOKE.ival = OP_JOIN; /* emulate join($", ...) */
79072805
LW
3439 force_next(FUNC);
3440 }
3280af22
NIS
3441 if (PL_lex_starts++) {
3442 s = PL_bufptr;
5db06880
NC
3443#ifdef PERL_MAD
3444 if (PL_madskills) {
cd81e915
NC
3445 if (PL_thistoken)
3446 sv_free(PL_thistoken);
6b29d1f5 3447 PL_thistoken = newSVpvs("");
5db06880
NC
3448 }
3449#endif
131b3ad0
DM
3450 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3451 if (!PL_lex_casemods && PL_lex_inpat)
3452 OPERATOR(',');
3453 else
3454 Aop(OP_CONCAT);
79072805 3455 }
cea2e8a9 3456 return yylex();
79072805
LW
3457
3458 case LEX_INTERPENDMAYBE:
3280af22
NIS
3459 if (intuit_more(PL_bufptr)) {
3460 PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
79072805
LW
3461 break;
3462 }
3463 /* FALL THROUGH */
3464
3465 case LEX_INTERPEND:
3280af22
NIS
3466 if (PL_lex_dojoin) {
3467 PL_lex_dojoin = FALSE;
3468 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
3469#ifdef PERL_MAD
3470 if (PL_madskills) {
cd81e915
NC
3471 if (PL_thistoken)
3472 sv_free(PL_thistoken);
6b29d1f5 3473 PL_thistoken = newSVpvs("");
5db06880
NC
3474 }
3475#endif
bbf60fe6 3476 return REPORT(')');
79072805 3477 }
43a16006 3478 if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
25da4f38 3479 && SvEVALED(PL_lex_repl))
43a16006 3480 {
e9fa98b2 3481 if (PL_bufptr != PL_bufend)
cea2e8a9 3482 Perl_croak(aTHX_ "Bad evalled substitution pattern");
a0714e2c 3483 PL_lex_repl = NULL;
e9fa98b2 3484 }
79072805
LW
3485 /* FALLTHROUGH */
3486 case LEX_INTERPCONCAT:
3487#ifdef DEBUGGING
3280af22 3488 if (PL_lex_brackets)
cea2e8a9 3489 Perl_croak(aTHX_ "panic: INTERPCONCAT");
79072805 3490#endif
3280af22 3491 if (PL_bufptr == PL_bufend)
bbf60fe6 3492 return REPORT(sublex_done());
79072805 3493
3280af22
NIS
3494 if (SvIVX(PL_linestr) == '\'') {
3495 SV *sv = newSVsv(PL_linestr);
3496 if (!PL_lex_inpat)
76e3520e 3497 sv = tokeq(sv);
3280af22 3498 else if ( PL_hints & HINT_NEW_RE )
b3ac6de7 3499 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
79072805 3500 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3280af22 3501 s = PL_bufend;
79072805
LW
3502 }
3503 else {
3280af22 3504 s = scan_const(PL_bufptr);
79072805 3505 if (*s == '\\')
3280af22 3506 PL_lex_state = LEX_INTERPCASEMOD;
79072805 3507 else
3280af22 3508 PL_lex_state = LEX_INTERPSTART;
79072805
LW
3509 }
3510
3280af22 3511 if (s != PL_bufptr) {
cd81e915 3512 start_force(PL_curforce);
5db06880
NC
3513 if (PL_madskills) {
3514 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
3515 }
9ded7720 3516 NEXTVAL_NEXTTOKE = yylval;
3280af22 3517 PL_expect = XTERM;
79072805 3518 force_next(THING);
131b3ad0 3519 if (PL_lex_starts++) {
5db06880
NC
3520#ifdef PERL_MAD
3521 if (PL_madskills) {
cd81e915
NC
3522 if (PL_thistoken)
3523 sv_free(PL_thistoken);
6b29d1f5 3524 PL_thistoken = newSVpvs("");
5db06880
NC
3525 }
3526#endif
131b3ad0
DM
3527 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3528 if (!PL_lex_casemods && PL_lex_inpat)
3529 OPERATOR(',');
3530 else
3531 Aop(OP_CONCAT);
3532 }
79072805 3533 else {
3280af22 3534 PL_bufptr = s;
cea2e8a9 3535 return yylex();
79072805
LW
3536 }
3537 }
3538
cea2e8a9 3539 return yylex();
a0d0e21e 3540 case LEX_FORMLINE:
3280af22
NIS
3541 PL_lex_state = LEX_NORMAL;
3542 s = scan_formline(PL_bufptr);
3543 if (!PL_lex_formbrack)
a0d0e21e
LW
3544 goto rightbracket;
3545 OPERATOR(';');
79072805
LW
3546 }
3547
3280af22
NIS
3548 s = PL_bufptr;
3549 PL_oldoldbufptr = PL_oldbufptr;
3550 PL_oldbufptr = s;
463ee0b2
LW
3551
3552 retry:
5db06880 3553#ifdef PERL_MAD
cd81e915
NC
3554 if (PL_thistoken) {
3555 sv_free(PL_thistoken);
3556 PL_thistoken = 0;
5db06880 3557 }
cd81e915 3558 PL_realtokenstart = s - SvPVX(PL_linestr); /* assume but undo on ws */
5db06880 3559#endif
378cc40b
LW
3560 switch (*s) {
3561 default:
7e2040f0 3562 if (isIDFIRST_lazy_if(s,UTF))
834a4ddd 3563 goto keylookup;
cea2e8a9 3564 Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
e929a76b
LW
3565 case 4:
3566 case 26:
3567 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 3568 case 0:
5db06880
NC
3569#ifdef PERL_MAD
3570 if (PL_madskills)
cd81e915 3571 PL_faketokens = 0;
5db06880 3572#endif
3280af22
NIS
3573 if (!PL_rsfp) {
3574 PL_last_uni = 0;
3575 PL_last_lop = 0;
c5ee2135 3576 if (PL_lex_brackets) {
10edeb5d
JH
3577 yyerror((const char *)
3578 (PL_lex_formbrack
3579 ? "Format not terminated"
3580 : "Missing right curly or square bracket"));
c5ee2135 3581 }
4e553d73 3582 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 3583 "### Tokener got EOF\n");
5f80b19c 3584 } );
79072805 3585 TOKEN(0);
463ee0b2 3586 }
3280af22 3587 if (s++ < PL_bufend)
a687059c 3588 goto retry; /* ignore stray nulls */
3280af22
NIS
3589 PL_last_uni = 0;
3590 PL_last_lop = 0;
3591 if (!PL_in_eval && !PL_preambled) {
3592 PL_preambled = TRUE;
5db06880
NC
3593#ifdef PERL_MAD
3594 if (PL_madskills)
cd81e915 3595 PL_faketokens = 1;
5db06880 3596#endif
3280af22
NIS
3597 sv_setpv(PL_linestr,incl_perldb());
3598 if (SvCUR(PL_linestr))
396482e1 3599 sv_catpvs(PL_linestr,";");
3280af22
NIS
3600 if (PL_preambleav){
3601 while(AvFILLp(PL_preambleav) >= 0) {
3602 SV *tmpsv = av_shift(PL_preambleav);
3603 sv_catsv(PL_linestr, tmpsv);
396482e1 3604 sv_catpvs(PL_linestr, ";");
91b7def8 3605 sv_free(tmpsv);
3606 }
3280af22
NIS
3607 sv_free((SV*)PL_preambleav);
3608 PL_preambleav = NULL;
91b7def8 3609 }
3280af22 3610 if (PL_minus_n || PL_minus_p) {
396482e1 3611 sv_catpvs(PL_linestr, "LINE: while (<>) {");
3280af22 3612 if (PL_minus_l)
396482e1 3613 sv_catpvs(PL_linestr,"chomp;");
3280af22 3614 if (PL_minus_a) {
3280af22 3615 if (PL_minus_F) {
3792a11b
NC
3616 if ((*PL_splitstr == '/' || *PL_splitstr == '\''
3617 || *PL_splitstr == '"')
3280af22 3618 && strchr(PL_splitstr + 1, *PL_splitstr))
3db68c4c 3619 Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
54310121 3620 else {
c8ef6a4b
NC
3621 /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
3622 bytes can be used as quoting characters. :-) */
dd374669 3623 const char *splits = PL_splitstr;
91d456ae 3624 sv_catpvs(PL_linestr, "our @F=split(q\0");
48c4c863
NC
3625 do {
3626 /* Need to \ \s */
dd374669
AL
3627 if (*splits == '\\')
3628 sv_catpvn(PL_linestr, splits, 1);
3629 sv_catpvn(PL_linestr, splits, 1);
3630 } while (*splits++);
48c4c863
NC
3631 /* This loop will embed the trailing NUL of
3632 PL_linestr as the last thing it does before
3633 terminating. */
396482e1 3634 sv_catpvs(PL_linestr, ");");
54310121 3635 }
2304df62
AD
3636 }
3637 else
396482e1 3638 sv_catpvs(PL_linestr,"our @F=split(' ');");
2304df62 3639 }
79072805 3640 }
bc9b29db 3641 if (PL_minus_E)
396482e1
GA
3642 sv_catpvs(PL_linestr,"use feature ':5.10';");
3643 sv_catpvs(PL_linestr, "\n");
3280af22
NIS
3644 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3645 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3646 PL_last_lop = PL_last_uni = NULL;
80a702cd 3647 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 3648 update_debugger_info(PL_linestr, NULL, 0);
79072805 3649 goto retry;
a687059c 3650 }
e929a76b 3651 do {
aa7440fb 3652 bof = PL_rsfp ? TRUE : FALSE;
bd61b366 3653 if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == NULL) {
7e28d3af 3654 fake_eof:
5db06880 3655#ifdef PERL_MAD
cd81e915 3656 PL_realtokenstart = -1;
5db06880 3657#endif
7e28d3af
JH
3658 if (PL_rsfp) {
3659 if (PL_preprocess && !PL_in_eval)
3660 (void)PerlProc_pclose(PL_rsfp);
3661 else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
3662 PerlIO_clearerr(PL_rsfp);
3663 else
3664 (void)PerlIO_close(PL_rsfp);
4608196e 3665 PL_rsfp = NULL;
7e28d3af
JH
3666 PL_doextract = FALSE;
3667 }
3668 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
5db06880
NC
3669#ifdef PERL_MAD
3670 if (PL_madskills)
cd81e915 3671 PL_faketokens = 1;
5db06880 3672#endif
10edeb5d
JH
3673 sv_setpv(PL_linestr,
3674 (const char *)
3675 (PL_minus_p
3676 ? ";}continue{print;}" : ";}"));
7e28d3af
JH
3677 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3678 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3679 PL_last_lop = PL_last_uni = NULL;
7e28d3af
JH
3680 PL_minus_n = PL_minus_p = 0;
3681 goto retry;
3682 }
3683 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
bd61b366 3684 PL_last_lop = PL_last_uni = NULL;
c69006e4 3685 sv_setpvn(PL_linestr,"",0);
7e28d3af
JH
3686 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
3687 }
7aa207d6
JH
3688 /* If it looks like the start of a BOM or raw UTF-16,
3689 * check if it in fact is. */
3690 else if (bof &&
3691 (*s == 0 ||
3692 *(U8*)s == 0xEF ||
3693 *(U8*)s >= 0xFE ||
3694 s[1] == 0)) {
226017aa 3695#ifdef PERLIO_IS_STDIO
e3f494f1
JH
3696# ifdef __GNU_LIBRARY__
3697# if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
226017aa
DD
3698# define FTELL_FOR_PIPE_IS_BROKEN
3699# endif
e3f494f1
JH
3700# else
3701# ifdef __GLIBC__
3702# if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
3703# define FTELL_FOR_PIPE_IS_BROKEN
3704# endif
3705# endif
226017aa
DD
3706# endif
3707#endif
3708#ifdef FTELL_FOR_PIPE_IS_BROKEN
3709 /* This loses the possibility to detect the bof
3710 * situation on perl -P when the libc5 is being used.
3711 * Workaround? Maybe attach some extra state to PL_rsfp?
3712 */
3713 if (!PL_preprocess)
7e28d3af 3714 bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
226017aa 3715#else
eb160463 3716 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
226017aa 3717#endif
7e28d3af 3718 if (bof) {
3280af22 3719 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 3720 s = swallow_bom((U8*)s);
e929a76b 3721 }
378cc40b 3722 }
3280af22 3723 if (PL_doextract) {
a0d0e21e 3724 /* Incest with pod. */
5db06880
NC
3725#ifdef PERL_MAD
3726 if (PL_madskills)
cd81e915 3727 sv_catsv(PL_thiswhite, PL_linestr);
5db06880 3728#endif
01a57ef7 3729 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
c69006e4 3730 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
3731 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3732 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3733 PL_last_lop = PL_last_uni = NULL;
3280af22 3734 PL_doextract = FALSE;
a0d0e21e 3735 }
4e553d73 3736 }
463ee0b2 3737 incline(s);
3280af22
NIS
3738 } while (PL_doextract);
3739 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
80a702cd 3740 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 3741 update_debugger_info(PL_linestr, NULL, 0);
3280af22 3742 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3743 PL_last_lop = PL_last_uni = NULL;
57843af0 3744 if (CopLINE(PL_curcop) == 1) {
3280af22 3745 while (s < PL_bufend && isSPACE(*s))
79072805 3746 s++;
a0d0e21e 3747 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 3748 s++;
5db06880
NC
3749#ifdef PERL_MAD
3750 if (PL_madskills)
cd81e915 3751 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
5db06880 3752#endif
bd61b366 3753 d = NULL;
3280af22 3754 if (!PL_in_eval) {
44a8e56a 3755 if (*s == '#' && *(s+1) == '!')
3756 d = s + 2;
3757#ifdef ALTERNATE_SHEBANG
3758 else {
bfed75c6 3759 static char const as[] = ALTERNATE_SHEBANG;
44a8e56a 3760 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
3761 d = s + (sizeof(as) - 1);
3762 }
3763#endif /* ALTERNATE_SHEBANG */
3764 }
3765 if (d) {
b8378b72 3766 char *ipath;
774d564b 3767 char *ipathend;
b8378b72 3768
774d564b 3769 while (isSPACE(*d))
b8378b72
CS
3770 d++;
3771 ipath = d;
774d564b 3772 while (*d && !isSPACE(*d))
3773 d++;
3774 ipathend = d;
3775
3776#ifdef ARG_ZERO_IS_SCRIPT
3777 if (ipathend > ipath) {
3778 /*
3779 * HP-UX (at least) sets argv[0] to the script name,
3780 * which makes $^X incorrect. And Digital UNIX and Linux,
3781 * at least, set argv[0] to the basename of the Perl
3782 * interpreter. So, having found "#!", we'll set it right.
3783 */
fafc274c
NC
3784 SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
3785 SVt_PV)); /* $^X */
774d564b 3786 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 3787 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 3788 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 3789 SvSETMAGIC(x);
3790 }
556c1dec
JH
3791 else {
3792 STRLEN blen;
3793 STRLEN llen;
cfd0369c 3794 const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
9d4ba2ae 3795 const char * const lstart = SvPV_const(x,llen);
556c1dec
JH
3796 if (llen < blen) {
3797 bstart += blen - llen;
3798 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
3799 sv_setpvn(x, ipath, ipathend - ipath);
3800 SvSETMAGIC(x);
3801 }
3802 }
3803 }
774d564b 3804 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 3805 }
774d564b 3806#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
3807
3808 /*
3809 * Look for options.
3810 */
748a9306 3811 d = instr(s,"perl -");
84e30d1a 3812 if (!d) {
748a9306 3813 d = instr(s,"perl");
84e30d1a
GS
3814#if defined(DOSISH)
3815 /* avoid getting into infinite loops when shebang
3816 * line contains "Perl" rather than "perl" */
3817 if (!d) {
3818 for (d = ipathend-4; d >= ipath; --d) {
3819 if ((*d == 'p' || *d == 'P')
3820 && !ibcmp(d, "perl", 4))
3821 {
3822 break;
3823 }
3824 }
3825 if (d < ipath)
bd61b366 3826 d = NULL;
84e30d1a
GS
3827 }
3828#endif
3829 }
44a8e56a 3830#ifdef ALTERNATE_SHEBANG
3831 /*
3832 * If the ALTERNATE_SHEBANG on this system starts with a
3833 * character that can be part of a Perl expression, then if
3834 * we see it but not "perl", we're probably looking at the
3835 * start of Perl code, not a request to hand off to some
3836 * other interpreter. Similarly, if "perl" is there, but
3837 * not in the first 'word' of the line, we assume the line
3838 * contains the start of the Perl program.
44a8e56a 3839 */
3840 if (d && *s != '#') {
f54cb97a 3841 const char *c = ipath;
44a8e56a 3842 while (*c && !strchr("; \t\r\n\f\v#", *c))
3843 c++;
3844 if (c < d)
bd61b366 3845 d = NULL; /* "perl" not in first word; ignore */
44a8e56a 3846 else
3847 *s = '#'; /* Don't try to parse shebang line */
3848 }
774d564b 3849#endif /* ALTERNATE_SHEBANG */
bf4acbe4 3850#ifndef MACOS_TRADITIONAL
748a9306 3851 if (!d &&
44a8e56a 3852 *s == '#' &&
774d564b 3853 ipathend > ipath &&
3280af22 3854 !PL_minus_c &&
748a9306 3855 !instr(s,"indir") &&
3280af22 3856 instr(PL_origargv[0],"perl"))
748a9306 3857 {
27da23d5 3858 dVAR;
9f68db38 3859 char **newargv;
9f68db38 3860
774d564b 3861 *ipathend = '\0';
3862 s = ipathend + 1;
3280af22 3863 while (s < PL_bufend && isSPACE(*s))
9f68db38 3864 s++;
3280af22 3865 if (s < PL_bufend) {
a02a5408 3866 Newxz(newargv,PL_origargc+3,char*);
9f68db38 3867 newargv[1] = s;
3280af22 3868 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
3869 s++;
3870 *s = '\0';
3280af22 3871 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
3872 }
3873 else
3280af22 3874 newargv = PL_origargv;
774d564b 3875 newargv[0] = ipath;
b35112e7 3876 PERL_FPU_PRE_EXEC
b4748376 3877 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 3878 PERL_FPU_POST_EXEC
cea2e8a9 3879 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 3880 }
bf4acbe4 3881#endif
748a9306 3882 if (d) {
c35e046a
AL
3883 while (*d && !isSPACE(*d))
3884 d++;
3885 while (SPACE_OR_TAB(*d))
3886 d++;
748a9306
LW
3887
3888 if (*d++ == '-') {
f54cb97a 3889 const bool switches_done = PL_doswitches;
fb993905
GA
3890 const U32 oldpdb = PL_perldb;
3891 const bool oldn = PL_minus_n;
3892 const bool oldp = PL_minus_p;
3893
8cc95fdb 3894 do {
3ffe3ee4 3895 if (*d == 'M' || *d == 'm' || *d == 'C') {
9d4ba2ae 3896 const char * const m = d;
d4c19fe8
AL
3897 while (*d && !isSPACE(*d))
3898 d++;
cea2e8a9 3899 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
8cc95fdb 3900 (int)(d - m), m);
3901 }
97bd5664 3902 d = moreswitches(d);
8cc95fdb 3903 } while (d);
f0b2cf55
YST
3904 if (PL_doswitches && !switches_done) {
3905 int argc = PL_origargc;
3906 char **argv = PL_origargv;
3907 do {
3908 argc--,argv++;
3909 } while (argc && argv[0][0] == '-' && argv[0][1]);
3910 init_argv_symbols(argc,argv);
3911 }
155aba94
GS
3912 if ((PERLDB_LINE && !oldpdb) ||
3913 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 3914 /* if we have already added "LINE: while (<>) {",
3915 we must not do it again */
748a9306 3916 {
c69006e4 3917 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
3918 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3919 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3920 PL_last_lop = PL_last_uni = NULL;
3280af22 3921 PL_preambled = FALSE;
84902520 3922 if (PERLDB_LINE)
3280af22 3923 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
3924 goto retry;
3925 }
a0d0e21e 3926 }
79072805 3927 }
9f68db38 3928 }
79072805 3929 }
3280af22
NIS
3930 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3931 PL_bufptr = s;
3932 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3933 return yylex();
ae986130 3934 }
378cc40b 3935 goto retry;
4fdae800 3936 case '\r':
6a27c188 3937#ifdef PERL_STRICT_CR
cea2e8a9 3938 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 3939 Perl_croak(aTHX_
cc507455 3940 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 3941#endif
4fdae800 3942 case ' ': case '\t': case '\f': case 013:
bf4acbe4
GS
3943#ifdef MACOS_TRADITIONAL
3944 case '\312':
3945#endif
5db06880 3946#ifdef PERL_MAD
cd81e915 3947 PL_realtokenstart = -1;
ac372eb8
RD
3948 if (!PL_thiswhite)
3949 PL_thiswhite = newSVpvs("");
3950 sv_catpvn(PL_thiswhite, s, 1);
5db06880 3951#endif
ac372eb8 3952 s++;
378cc40b 3953 goto retry;
378cc40b 3954 case '#':
e929a76b 3955 case '\n':
5db06880 3956#ifdef PERL_MAD
cd81e915 3957 PL_realtokenstart = -1;
5db06880 3958 if (PL_madskills)
cd81e915 3959 PL_faketokens = 0;
5db06880 3960#endif
3280af22 3961 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
3962 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
3963 /* handle eval qq[#line 1 "foo"\n ...] */
3964 CopLINE_dec(PL_curcop);
3965 incline(s);
3966 }
5db06880
NC
3967 if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
3968 s = SKIPSPACE0(s);
3969 if (!PL_in_eval || PL_rsfp)
3970 incline(s);
3971 }
3972 else {
3973 d = s;
3974 while (d < PL_bufend && *d != '\n')
3975 d++;
3976 if (d < PL_bufend)
3977 d++;
3978 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
3979 Perl_croak(aTHX_ "panic: input overflow");
3980#ifdef PERL_MAD
3981 if (PL_madskills)
cd81e915 3982 PL_thiswhite = newSVpvn(s, d - s);
5db06880
NC
3983#endif
3984 s = d;
3985 incline(s);
3986 }
3280af22
NIS
3987 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3988 PL_bufptr = s;
3989 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3990 return yylex();
a687059c 3991 }
378cc40b 3992 }
a687059c 3993 else {
5db06880
NC
3994#ifdef PERL_MAD
3995 if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
3996 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
cd81e915 3997 PL_faketokens = 0;
5db06880
NC
3998 s = SKIPSPACE0(s);
3999 TOKEN(PEG); /* make sure any #! line is accessible */
4000 }
4001 s = SKIPSPACE0(s);
4002 }
4003 else {
4004/* if (PL_madskills && PL_lex_formbrack) { */
4005 d = s;
4006 while (d < PL_bufend && *d != '\n')
4007 d++;
4008 if (d < PL_bufend)
4009 d++;
4010 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4011 Perl_croak(aTHX_ "panic: input overflow");
4012 if (PL_madskills && CopLINE(PL_curcop) >= 1) {
cd81e915 4013 if (!PL_thiswhite)
6b29d1f5 4014 PL_thiswhite = newSVpvs("");
5db06880 4015 if (CopLINE(PL_curcop) == 1) {
cd81e915
NC
4016 sv_setpvn(PL_thiswhite, "", 0);
4017 PL_faketokens = 0;
5db06880 4018 }
cd81e915 4019 sv_catpvn(PL_thiswhite, s, d - s);
5db06880
NC
4020 }
4021 s = d;
4022/* }
4023 *s = '\0';
4024 PL_bufend = s; */
4025 }
4026#else
378cc40b 4027 *s = '\0';
3280af22 4028 PL_bufend = s;
5db06880 4029#endif
a687059c 4030 }
378cc40b
LW
4031 goto retry;
4032 case '-':
79072805 4033 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50 4034 I32 ftst = 0;
90771dc0 4035 char tmp;
e5edeb50 4036
378cc40b 4037 s++;
3280af22 4038 PL_bufptr = s;
748a9306
LW
4039 tmp = *s++;
4040
bf4acbe4 4041 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
4042 s++;
4043
4044 if (strnEQ(s,"=>",2)) {
3280af22 4045 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
931e0695 4046 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
748a9306
LW
4047 OPERATOR('-'); /* unary minus */
4048 }
3280af22 4049 PL_last_uni = PL_oldbufptr;
748a9306 4050 switch (tmp) {
e5edeb50
JH
4051 case 'r': ftst = OP_FTEREAD; break;
4052 case 'w': ftst = OP_FTEWRITE; break;
4053 case 'x': ftst = OP_FTEEXEC; break;
4054 case 'o': ftst = OP_FTEOWNED; break;
4055 case 'R': ftst = OP_FTRREAD; break;
4056 case 'W': ftst = OP_FTRWRITE; break;
4057 case 'X': ftst = OP_FTREXEC; break;
4058 case 'O': ftst = OP_FTROWNED; break;
4059 case 'e': ftst = OP_FTIS; break;
4060 case 'z': ftst = OP_FTZERO; break;
4061 case 's': ftst = OP_FTSIZE; break;
4062 case 'f': ftst = OP_FTFILE; break;
4063 case 'd': ftst = OP_FTDIR; break;
4064 case 'l': ftst = OP_FTLINK; break;
4065 case 'p': ftst = OP_FTPIPE; break;
4066 case 'S': ftst = OP_FTSOCK; break;
4067 case 'u': ftst = OP_FTSUID; break;
4068 case 'g': ftst = OP_FTSGID; break;
4069 case 'k': ftst = OP_FTSVTX; break;
4070 case 'b': ftst = OP_FTBLK; break;
4071 case 'c': ftst = OP_FTCHR; break;
4072 case 't': ftst = OP_FTTTY; break;
4073 case 'T': ftst = OP_FTTEXT; break;
4074 case 'B': ftst = OP_FTBINARY; break;
4075 case 'M': case 'A': case 'C':
fafc274c 4076 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
e5edeb50
JH
4077 switch (tmp) {
4078 case 'M': ftst = OP_FTMTIME; break;
4079 case 'A': ftst = OP_FTATIME; break;
4080 case 'C': ftst = OP_FTCTIME; break;
4081 default: break;
4082 }
4083 break;
378cc40b 4084 default:
378cc40b
LW
4085 break;
4086 }
e5edeb50 4087 if (ftst) {
eb160463 4088 PL_last_lop_op = (OPCODE)ftst;
4e553d73 4089 DEBUG_T( { PerlIO_printf(Perl_debug_log,
a18d764d 4090 "### Saw file test %c\n", (int)tmp);
5f80b19c 4091 } );
e5edeb50
JH
4092 FTST(ftst);
4093 }
4094 else {
4095 /* Assume it was a minus followed by a one-letter named
4096 * subroutine call (or a -bareword), then. */
95c31fe3 4097 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0 4098 "### '-%c' looked like a file test but was not\n",
4fccd7c6 4099 (int) tmp);
5f80b19c 4100 } );
3cf7b4c4 4101 s = --PL_bufptr;
e5edeb50 4102 }
378cc40b 4103 }
90771dc0
NC
4104 {
4105 const char tmp = *s++;
4106 if (*s == tmp) {
4107 s++;
4108 if (PL_expect == XOPERATOR)
4109 TERM(POSTDEC);
4110 else
4111 OPERATOR(PREDEC);
4112 }
4113 else if (*s == '>') {
4114 s++;
29595ff2 4115 s = SKIPSPACE1(s);
90771dc0
NC
4116 if (isIDFIRST_lazy_if(s,UTF)) {
4117 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
4118 TOKEN(ARROW);
4119 }
4120 else if (*s == '$')
4121 OPERATOR(ARROW);
4122 else
4123 TERM(ARROW);
4124 }
3280af22 4125 if (PL_expect == XOPERATOR)
90771dc0
NC
4126 Aop(OP_SUBTRACT);
4127 else {
4128 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4129 check_uni();
4130 OPERATOR('-'); /* unary minus */
79072805 4131 }
2f3197b3 4132 }
79072805 4133
378cc40b 4134 case '+':
90771dc0
NC
4135 {
4136 const char tmp = *s++;
4137 if (*s == tmp) {
4138 s++;
4139 if (PL_expect == XOPERATOR)
4140 TERM(POSTINC);
4141 else
4142 OPERATOR(PREINC);
4143 }
3280af22 4144 if (PL_expect == XOPERATOR)
90771dc0
NC
4145 Aop(OP_ADD);
4146 else {
4147 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4148 check_uni();
4149 OPERATOR('+');
4150 }
2f3197b3 4151 }
a687059c 4152
378cc40b 4153 case '*':
3280af22
NIS
4154 if (PL_expect != XOPERATOR) {
4155 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4156 PL_expect = XOPERATOR;
4157 force_ident(PL_tokenbuf, '*');
4158 if (!*PL_tokenbuf)
a0d0e21e 4159 PREREF('*');
79072805 4160 TERM('*');
a687059c 4161 }
79072805
LW
4162 s++;
4163 if (*s == '*') {
a687059c 4164 s++;
79072805 4165 PWop(OP_POW);
a687059c 4166 }
79072805
LW
4167 Mop(OP_MULTIPLY);
4168
378cc40b 4169 case '%':
3280af22 4170 if (PL_expect == XOPERATOR) {
bbce6d69 4171 ++s;
4172 Mop(OP_MODULO);
a687059c 4173 }
3280af22 4174 PL_tokenbuf[0] = '%';
e8ae98db
RGS
4175 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4176 sizeof PL_tokenbuf - 1, FALSE);
3280af22 4177 if (!PL_tokenbuf[1]) {
bbce6d69 4178 PREREF('%');
a687059c 4179 }
3280af22 4180 PL_pending_ident = '%';
bbce6d69 4181 TERM('%');
a687059c 4182
378cc40b 4183 case '^':
79072805 4184 s++;
a0d0e21e 4185 BOop(OP_BIT_XOR);
79072805 4186 case '[':
3280af22 4187 PL_lex_brackets++;
79072805 4188 /* FALL THROUGH */
378cc40b 4189 case '~':
0d863452 4190 if (s[1] == '~'
3e7dd34d 4191 && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
0d863452
RH
4192 {
4193 s += 2;
4194 Eop(OP_SMARTMATCH);
4195 }
378cc40b 4196 case ',':
90771dc0
NC
4197 {
4198 const char tmp = *s++;
4199 OPERATOR(tmp);
4200 }
a0d0e21e
LW
4201 case ':':
4202 if (s[1] == ':') {
4203 len = 0;
0bfa2a8a 4204 goto just_a_word_zero_gv;
a0d0e21e
LW
4205 }
4206 s++;
09bef843
SB
4207 switch (PL_expect) {
4208 OP *attrs;
5db06880
NC
4209#ifdef PERL_MAD
4210 I32 stuffstart;
4211#endif
09bef843
SB
4212 case XOPERATOR:
4213 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
4214 break;
4215 PL_bufptr = s; /* update in case we back off */
4216 goto grabattrs;
4217 case XATTRBLOCK:
4218 PL_expect = XBLOCK;
4219 goto grabattrs;
4220 case XATTRTERM:
4221 PL_expect = XTERMBLOCK;
4222 grabattrs:
5db06880
NC
4223#ifdef PERL_MAD
4224 stuffstart = s - SvPVX(PL_linestr) - 1;
4225#endif
29595ff2 4226 s = PEEKSPACE(s);
5f66b61c 4227 attrs = NULL;
7e2040f0 4228 while (isIDFIRST_lazy_if(s,UTF)) {
90771dc0 4229 I32 tmp;
5cc237b8 4230 SV *sv;
09bef843 4231 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 4232 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
f9829d6b
GS
4233 if (tmp < 0) tmp = -tmp;
4234 switch (tmp) {
4235 case KEY_or:
4236 case KEY_and:
c963b151 4237 case KEY_err:
f9829d6b
GS
4238 case KEY_for:
4239 case KEY_unless:
4240 case KEY_if:
4241 case KEY_while:
4242 case KEY_until:
4243 goto got_attrs;
4244 default:
4245 break;
4246 }
4247 }
5cc237b8 4248 sv = newSVpvn(s, len);
09bef843
SB
4249 if (*d == '(') {
4250 d = scan_str(d,TRUE,TRUE);
4251 if (!d) {
09bef843
SB
4252 /* MUST advance bufptr here to avoid bogus
4253 "at end of line" context messages from yyerror().
4254 */
4255 PL_bufptr = s + len;
4256 yyerror("Unterminated attribute parameter in attribute list");
4257 if (attrs)
4258 op_free(attrs);
5cc237b8 4259 sv_free(sv);
bbf60fe6 4260 return REPORT(0); /* EOF indicator */
09bef843
SB
4261 }
4262 }
4263 if (PL_lex_stuff) {
09bef843
SB
4264 sv_catsv(sv, PL_lex_stuff);
4265 attrs = append_elem(OP_LIST, attrs,
4266 newSVOP(OP_CONST, 0, sv));
4267 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 4268 PL_lex_stuff = NULL;
09bef843
SB
4269 }
4270 else {
5cc237b8
BS
4271 if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
4272 sv_free(sv);
1108974d 4273 if (PL_in_my == KEY_our) {
371fce9b
DM
4274#ifdef USE_ITHREADS
4275 GvUNIQUE_on(cGVOPx_gv(yylval.opval));
4276#else
1108974d 4277 /* skip to avoid loading attributes.pm */
371fce9b 4278#endif
df9a6019 4279 deprecate(":unique");
1108974d 4280 }
bfed75c6 4281 else
371fce9b
DM
4282 Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
4283 }
4284
d3cea301
SB
4285 /* NOTE: any CV attrs applied here need to be part of
4286 the CVf_BUILTIN_ATTRS define in cv.h! */
5cc237b8
BS
4287 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
4288 sv_free(sv);
78f9721b 4289 CvLVALUE_on(PL_compcv);
5cc237b8
BS
4290 }
4291 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
4292 sv_free(sv);
78f9721b 4293 CvLOCKED_on(PL_compcv);
5cc237b8
BS
4294 }
4295 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
4296 sv_free(sv);
78f9721b 4297 CvMETHOD_on(PL_compcv);
5cc237b8 4298 }
78f9721b
SM
4299 /* After we've set the flags, it could be argued that
4300 we don't need to do the attributes.pm-based setting
4301 process, and shouldn't bother appending recognized
d3cea301
SB
4302 flags. To experiment with that, uncomment the
4303 following "else". (Note that's already been
4304 uncommented. That keeps the above-applied built-in
4305 attributes from being intercepted (and possibly
4306 rejected) by a package's attribute routines, but is
4307 justified by the performance win for the common case
4308 of applying only built-in attributes.) */
0256094b 4309 else
78f9721b
SM
4310 attrs = append_elem(OP_LIST, attrs,
4311 newSVOP(OP_CONST, 0,
5cc237b8 4312 sv));
09bef843 4313 }
29595ff2 4314 s = PEEKSPACE(d);
0120eecf 4315 if (*s == ':' && s[1] != ':')
29595ff2 4316 s = PEEKSPACE(s+1);
0120eecf
GS
4317 else if (s == d)
4318 break; /* require real whitespace or :'s */
29595ff2 4319 /* XXX losing whitespace on sequential attributes here */
09bef843 4320 }
90771dc0
NC
4321 {
4322 const char tmp
4323 = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
4324 if (*s != ';' && *s != '}' && *s != tmp
4325 && (tmp != '=' || *s != ')')) {
4326 const char q = ((*s == '\'') ? '"' : '\'');
4327 /* If here for an expression, and parsed no attrs, back
4328 off. */
4329 if (tmp == '=' && !attrs) {
4330 s = PL_bufptr;
4331 break;
4332 }
4333 /* MUST advance bufptr here to avoid bogus "at end of line"
4334 context messages from yyerror().
4335 */
4336 PL_bufptr = s;
10edeb5d
JH
4337 yyerror( (const char *)
4338 (*s
4339 ? Perl_form(aTHX_ "Invalid separator character "
4340 "%c%c%c in attribute list", q, *s, q)
4341 : "Unterminated attribute list" ) );
90771dc0
NC
4342 if (attrs)
4343 op_free(attrs);
4344 OPERATOR(':');
09bef843 4345 }
09bef843 4346 }
f9829d6b 4347 got_attrs:
09bef843 4348 if (attrs) {
cd81e915 4349 start_force(PL_curforce);
9ded7720 4350 NEXTVAL_NEXTTOKE.opval = attrs;
cd81e915 4351 CURMAD('_', PL_nextwhite);
89122651 4352 force_next(THING);
5db06880
NC
4353 }
4354#ifdef PERL_MAD
4355 if (PL_madskills) {
cd81e915 4356 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5db06880 4357 (s - SvPVX(PL_linestr)) - stuffstart);
09bef843 4358 }
5db06880 4359#endif
09bef843
SB
4360 TOKEN(COLONATTR);
4361 }
a0d0e21e 4362 OPERATOR(':');
8990e307
LW
4363 case '(':
4364 s++;
3280af22
NIS
4365 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
4366 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 4367 else
3280af22 4368 PL_expect = XTERM;
29595ff2 4369 s = SKIPSPACE1(s);
a0d0e21e 4370 TOKEN('(');
378cc40b 4371 case ';':
f4dd75d9 4372 CLINE;
90771dc0
NC
4373 {
4374 const char tmp = *s++;
4375 OPERATOR(tmp);
4376 }
378cc40b 4377 case ')':
90771dc0
NC
4378 {
4379 const char tmp = *s++;
29595ff2 4380 s = SKIPSPACE1(s);
90771dc0
NC
4381 if (*s == '{')
4382 PREBLOCK(tmp);
4383 TERM(tmp);
4384 }
79072805
LW
4385 case ']':
4386 s++;
3280af22 4387 if (PL_lex_brackets <= 0)
d98d5fff 4388 yyerror("Unmatched right square bracket");
463ee0b2 4389 else
3280af22
NIS
4390 --PL_lex_brackets;
4391 if (PL_lex_state == LEX_INTERPNORMAL) {
4392 if (PL_lex_brackets == 0) {
02255c60
FC
4393 if (*s == '-' && s[1] == '>')
4394 PL_lex_state = LEX_INTERPENDMAYBE;
4395 else if (*s != '[' && *s != '{')
3280af22 4396 PL_lex_state = LEX_INTERPEND;
79072805
LW
4397 }
4398 }
4633a7c4 4399 TERM(']');
79072805
LW
4400 case '{':
4401 leftbracket:
79072805 4402 s++;
3280af22 4403 if (PL_lex_brackets > 100) {
8edd5f42 4404 Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
8990e307 4405 }
3280af22 4406 switch (PL_expect) {
a0d0e21e 4407 case XTERM:
3280af22 4408 if (PL_lex_formbrack) {
a0d0e21e
LW
4409 s--;
4410 PRETERMBLOCK(DO);
4411 }
3280af22
NIS
4412 if (PL_oldoldbufptr == PL_last_lop)
4413 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 4414 else
3280af22 4415 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 4416 OPERATOR(HASHBRACK);
a0d0e21e 4417 case XOPERATOR:
bf4acbe4 4418 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306 4419 s++;
44a8e56a 4420 d = s;
3280af22
NIS
4421 PL_tokenbuf[0] = '\0';
4422 if (d < PL_bufend && *d == '-') {
4423 PL_tokenbuf[0] = '-';
44a8e56a 4424 d++;
bf4acbe4 4425 while (d < PL_bufend && SPACE_OR_TAB(*d))
44a8e56a 4426 d++;
4427 }
7e2040f0 4428 if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3280af22 4429 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 4430 FALSE, &len);
bf4acbe4 4431 while (d < PL_bufend && SPACE_OR_TAB(*d))
748a9306
LW
4432 d++;
4433 if (*d == '}') {
f54cb97a 4434 const char minus = (PL_tokenbuf[0] == '-');
44a8e56a 4435 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
4436 if (minus)
4437 force_next('-');
748a9306
LW
4438 }
4439 }
4440 /* FALL THROUGH */
09bef843 4441 case XATTRBLOCK:
748a9306 4442 case XBLOCK:
3280af22
NIS
4443 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
4444 PL_expect = XSTATE;
a0d0e21e 4445 break;
09bef843 4446 case XATTRTERM:
a0d0e21e 4447 case XTERMBLOCK:
3280af22
NIS
4448 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
4449 PL_expect = XSTATE;
a0d0e21e
LW
4450 break;
4451 default: {
f54cb97a 4452 const char *t;
3280af22
NIS
4453 if (PL_oldoldbufptr == PL_last_lop)
4454 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 4455 else
3280af22 4456 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
29595ff2 4457 s = SKIPSPACE1(s);
8452ff4b
SB
4458 if (*s == '}') {
4459 if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
4460 PL_expect = XTERM;
4461 /* This hack is to get the ${} in the message. */
4462 PL_bufptr = s+1;
4463 yyerror("syntax error");
4464 break;
4465 }
a0d0e21e 4466 OPERATOR(HASHBRACK);
8452ff4b 4467 }
b8a4b1be
GS
4468 /* This hack serves to disambiguate a pair of curlies
4469 * as being a block or an anon hash. Normally, expectation
4470 * determines that, but in cases where we're not in a
4471 * position to expect anything in particular (like inside
4472 * eval"") we have to resolve the ambiguity. This code
4473 * covers the case where the first term in the curlies is a
4474 * quoted string. Most other cases need to be explicitly
a0288114 4475 * disambiguated by prepending a "+" before the opening
b8a4b1be
GS
4476 * curly in order to force resolution as an anon hash.
4477 *
4478 * XXX should probably propagate the outer expectation
4479 * into eval"" to rely less on this hack, but that could
4480 * potentially break current behavior of eval"".
4481 * GSAR 97-07-21
4482 */
4483 t = s;
4484 if (*s == '\'' || *s == '"' || *s == '`') {
4485 /* common case: get past first string, handling escapes */
3280af22 4486 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
4487 if (*t++ == '\\' && (*t == '\\' || *t == *s))
4488 t++;
4489 t++;
a0d0e21e 4490 }
b8a4b1be 4491 else if (*s == 'q') {
3280af22 4492 if (++t < PL_bufend
b8a4b1be 4493 && (!isALNUM(*t)
3280af22 4494 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
4495 && !isALNUM(*t))))
4496 {
abc667d1 4497 /* skip q//-like construct */
f54cb97a 4498 const char *tmps;
b8a4b1be
GS
4499 char open, close, term;
4500 I32 brackets = 1;
4501
3280af22 4502 while (t < PL_bufend && isSPACE(*t))
b8a4b1be 4503 t++;
abc667d1
DM
4504 /* check for q => */
4505 if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
4506 OPERATOR(HASHBRACK);
4507 }
b8a4b1be
GS
4508 term = *t;
4509 open = term;
4510 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
4511 term = tmps[5];
4512 close = term;
4513 if (open == close)
3280af22
NIS
4514 for (t++; t < PL_bufend; t++) {
4515 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 4516 t++;
6d07e5e9 4517 else if (*t == open)
b8a4b1be
GS
4518 break;
4519 }
abc667d1 4520 else {
3280af22
NIS
4521 for (t++; t < PL_bufend; t++) {
4522 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 4523 t++;
6d07e5e9 4524 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
4525 break;
4526 else if (*t == open)
4527 brackets++;
4528 }
abc667d1
DM
4529 }
4530 t++;
b8a4b1be 4531 }
abc667d1
DM
4532 else
4533 /* skip plain q word */
4534 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
4535 t += UTF8SKIP(t);
a0d0e21e 4536 }
7e2040f0 4537 else if (isALNUM_lazy_if(t,UTF)) {
0505442f 4538 t += UTF8SKIP(t);
7e2040f0 4539 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
0505442f 4540 t += UTF8SKIP(t);
a0d0e21e 4541 }
3280af22 4542 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 4543 t++;
b8a4b1be
GS
4544 /* if comma follows first term, call it an anon hash */
4545 /* XXX it could be a comma expression with loop modifiers */
3280af22 4546 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 4547 || (*t == '=' && t[1] == '>')))
a0d0e21e 4548 OPERATOR(HASHBRACK);
3280af22 4549 if (PL_expect == XREF)
4e4e412b 4550 PL_expect = XTERM;
a0d0e21e 4551 else {
3280af22
NIS
4552 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
4553 PL_expect = XSTATE;
a0d0e21e 4554 }
8990e307 4555 }
a0d0e21e 4556 break;
463ee0b2 4557 }
57843af0 4558 yylval.ival = CopLINE(PL_curcop);
79072805 4559 if (isSPACE(*s) || *s == '#')
3280af22 4560 PL_copline = NOLINE; /* invalidate current command line number */
79072805 4561 TOKEN('{');
378cc40b 4562 case '}':
79072805
LW
4563 rightbracket:
4564 s++;
3280af22 4565 if (PL_lex_brackets <= 0)
d98d5fff 4566 yyerror("Unmatched right curly bracket");
463ee0b2 4567 else
3280af22 4568 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
c2e66d9e 4569 if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3280af22
NIS
4570 PL_lex_formbrack = 0;
4571 if (PL_lex_state == LEX_INTERPNORMAL) {
4572 if (PL_lex_brackets == 0) {
9059aa12
LW
4573 if (PL_expect & XFAKEBRACK) {
4574 PL_expect &= XENUMMASK;
3280af22
NIS
4575 PL_lex_state = LEX_INTERPEND;
4576 PL_bufptr = s;
5db06880
NC
4577#if 0
4578 if (PL_madskills) {
cd81e915 4579 if (!PL_thiswhite)
6b29d1f5 4580 PL_thiswhite = newSVpvs("");
cd81e915 4581 sv_catpvn(PL_thiswhite,"}",1);
5db06880
NC
4582 }
4583#endif
cea2e8a9 4584 return yylex(); /* ignore fake brackets */
79072805 4585 }
fa83b5b6 4586 if (*s == '-' && s[1] == '>')
3280af22 4587 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 4588 else if (*s != '[' && *s != '{')
3280af22 4589 PL_lex_state = LEX_INTERPEND;
79072805
LW
4590 }
4591 }
9059aa12
LW
4592 if (PL_expect & XFAKEBRACK) {
4593 PL_expect &= XENUMMASK;
3280af22 4594 PL_bufptr = s;
cea2e8a9 4595 return yylex(); /* ignore fake brackets */
748a9306 4596 }
cd81e915 4597 start_force(PL_curforce);
5db06880
NC
4598 if (PL_madskills) {
4599 curmad('X', newSVpvn(s-1,1));
cd81e915 4600 CURMAD('_', PL_thiswhite);
5db06880 4601 }
79072805 4602 force_next('}');
5db06880 4603#ifdef PERL_MAD
cd81e915 4604 if (!PL_thistoken)
6b29d1f5 4605 PL_thistoken = newSVpvs("");
5db06880 4606#endif
79072805 4607 TOKEN(';');
378cc40b
LW
4608 case '&':
4609 s++;
90771dc0 4610 if (*s++ == '&')
a0d0e21e 4611 AOPERATOR(ANDAND);
378cc40b 4612 s--;
3280af22 4613 if (PL_expect == XOPERATOR) {
041457d9
DM
4614 if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
4615 && isIDFIRST_lazy_if(s,UTF))
7e2040f0 4616 {
57843af0 4617 CopLINE_dec(PL_curcop);
9014280d 4618 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 4619 CopLINE_inc(PL_curcop);
463ee0b2 4620 }
79072805 4621 BAop(OP_BIT_AND);
463ee0b2 4622 }
79072805 4623
3280af22
NIS
4624 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4625 if (*PL_tokenbuf) {
4626 PL_expect = XOPERATOR;
4627 force_ident(PL_tokenbuf, '&');
463ee0b2 4628 }
79072805
LW
4629 else
4630 PREREF('&');
c07a80fd 4631 yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
4632 TERM('&');
4633
378cc40b
LW
4634 case '|':
4635 s++;
90771dc0 4636 if (*s++ == '|')
a0d0e21e 4637 AOPERATOR(OROR);
378cc40b 4638 s--;
79072805 4639 BOop(OP_BIT_OR);
378cc40b
LW
4640 case '=':
4641 s++;
748a9306 4642 {
90771dc0
NC
4643 const char tmp = *s++;
4644 if (tmp == '=')
4645 Eop(OP_EQ);
4646 if (tmp == '>')
4647 OPERATOR(',');
4648 if (tmp == '~')
4649 PMop(OP_MATCH);
4650 if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
4651 && strchr("+-*/%.^&|<",tmp))
4652 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4653 "Reversed %c= operator",(int)tmp);
4654 s--;
4655 if (PL_expect == XSTATE && isALPHA(tmp) &&
4656 (s == PL_linestart+1 || s[-2] == '\n') )
4657 {
4658 if (PL_in_eval && !PL_rsfp) {
4659 d = PL_bufend;
4660 while (s < d) {
4661 if (*s++ == '\n') {
4662 incline(s);
4663 if (strnEQ(s,"=cut",4)) {
4664 s = strchr(s,'\n');
4665 if (s)
4666 s++;
4667 else
4668 s = d;
4669 incline(s);
4670 goto retry;
4671 }
4672 }
a5f75d66 4673 }
90771dc0 4674 goto retry;
a5f75d66 4675 }
5db06880
NC
4676#ifdef PERL_MAD
4677 if (PL_madskills) {
cd81e915 4678 if (!PL_thiswhite)
6b29d1f5 4679 PL_thiswhite = newSVpvs("");
cd81e915 4680 sv_catpvn(PL_thiswhite, PL_linestart,
5db06880
NC
4681 PL_bufend - PL_linestart);
4682 }
4683#endif
90771dc0
NC
4684 s = PL_bufend;
4685 PL_doextract = TRUE;
4686 goto retry;
a5f75d66 4687 }
a0d0e21e 4688 }
3280af22 4689 if (PL_lex_brackets < PL_lex_formbrack) {
c35e046a 4690 const char *t = s;
51882d45 4691#ifdef PERL_STRICT_CR
c35e046a 4692 while (SPACE_OR_TAB(*t))
51882d45 4693#else
c35e046a 4694 while (SPACE_OR_TAB(*t) || *t == '\r')
51882d45 4695#endif
c35e046a 4696 t++;
a0d0e21e
LW
4697 if (*t == '\n' || *t == '#') {
4698 s--;
3280af22 4699 PL_expect = XBLOCK;
a0d0e21e
LW
4700 goto leftbracket;
4701 }
79072805 4702 }
a0d0e21e
LW
4703 yylval.ival = 0;
4704 OPERATOR(ASSIGNOP);
378cc40b
LW
4705 case '!':
4706 s++;
90771dc0
NC
4707 {
4708 const char tmp = *s++;
4709 if (tmp == '=') {
4710 /* was this !=~ where !~ was meant?
4711 * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
4712
4713 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
4714 const char *t = s+1;
4715
4716 while (t < PL_bufend && isSPACE(*t))
4717 ++t;
4718
4719 if (*t == '/' || *t == '?' ||
4720 ((*t == 'm' || *t == 's' || *t == 'y')
4721 && !isALNUM(t[1])) ||
4722 (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
4723 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4724 "!=~ should be !~");
4725 }
4726 Eop(OP_NE);
4727 }
4728 if (tmp == '~')
4729 PMop(OP_NOT);
4730 }
378cc40b
LW
4731 s--;
4732 OPERATOR('!');
4733 case '<':
3280af22 4734 if (PL_expect != XOPERATOR) {
93a17b20 4735 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 4736 check_uni();
79072805
LW
4737 if (s[1] == '<')
4738 s = scan_heredoc(s);
4739 else
4740 s = scan_inputsymbol(s);
4741 TERM(sublex_start());
378cc40b
LW
4742 }
4743 s++;
90771dc0
NC
4744 {
4745 char tmp = *s++;
4746 if (tmp == '<')
4747 SHop(OP_LEFT_SHIFT);
4748 if (tmp == '=') {
4749 tmp = *s++;
4750 if (tmp == '>')
4751 Eop(OP_NCMP);
4752 s--;
4753 Rop(OP_LE);
4754 }
395c3793 4755 }
378cc40b 4756 s--;
79072805 4757 Rop(OP_LT);
378cc40b
LW
4758 case '>':
4759 s++;
90771dc0
NC
4760 {
4761 const char tmp = *s++;
4762 if (tmp == '>')
4763 SHop(OP_RIGHT_SHIFT);
d4c19fe8 4764 else if (tmp == '=')
90771dc0
NC
4765 Rop(OP_GE);
4766 }
378cc40b 4767 s--;
79072805 4768 Rop(OP_GT);
378cc40b
LW
4769
4770 case '$':
bbce6d69 4771 CLINE;
4772
3280af22
NIS
4773 if (PL_expect == XOPERATOR) {
4774 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
4775 PL_expect = XTERM;
c445ea15 4776 deprecate_old(commaless_variable_list);
bbf60fe6 4777 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 4778 }
8990e307 4779 }
a0d0e21e 4780
7e2040f0 4781 if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3280af22 4782 PL_tokenbuf[0] = '@';
376b8730
SM
4783 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
4784 sizeof PL_tokenbuf - 1, FALSE);
4785 if (PL_expect == XOPERATOR)
4786 no_op("Array length", s);
3280af22 4787 if (!PL_tokenbuf[1])
a0d0e21e 4788 PREREF(DOLSHARP);
3280af22
NIS
4789 PL_expect = XOPERATOR;
4790 PL_pending_ident = '#';
463ee0b2 4791 TOKEN(DOLSHARP);
79072805 4792 }
bbce6d69 4793
3280af22 4794 PL_tokenbuf[0] = '$';
376b8730
SM
4795 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4796 sizeof PL_tokenbuf - 1, FALSE);
4797 if (PL_expect == XOPERATOR)
4798 no_op("Scalar", s);
3280af22
NIS
4799 if (!PL_tokenbuf[1]) {
4800 if (s == PL_bufend)
bbce6d69 4801 yyerror("Final $ should be \\$ or $name");
4802 PREREF('$');
8990e307 4803 }
a0d0e21e 4804
bbce6d69 4805 /* This kludge not intended to be bulletproof. */
3280af22 4806 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
bbce6d69 4807 yylval.opval = newSVOP(OP_CONST, 0,
fc15ae8f 4808 newSViv(CopARYBASE_get(&PL_compiling)));
bbce6d69 4809 yylval.opval->op_private = OPpCONST_ARYBASE;
4810 TERM(THING);
4811 }
4812
ff68c719 4813 d = s;
90771dc0
NC
4814 {
4815 const char tmp = *s;
4816 if (PL_lex_state == LEX_NORMAL)
29595ff2 4817 s = SKIPSPACE1(s);
ff68c719 4818
90771dc0
NC
4819 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
4820 && intuit_more(s)) {
4821 if (*s == '[') {
4822 PL_tokenbuf[0] = '@';
4823 if (ckWARN(WARN_SYNTAX)) {
c35e046a
AL
4824 char *t = s+1;
4825
4826 while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
4827 t++;
90771dc0 4828 if (*t++ == ',') {
29595ff2 4829 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
90771dc0
NC
4830 while (t < PL_bufend && *t != ']')
4831 t++;
9014280d 4832 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
90771dc0 4833 "Multidimensional syntax %.*s not supported",
36c7798d 4834 (int)((t - PL_bufptr) + 1), PL_bufptr);
90771dc0 4835 }
748a9306 4836 }
93a17b20 4837 }
90771dc0
NC
4838 else if (*s == '{') {
4839 char *t;
4840 PL_tokenbuf[0] = '%';
4841 if (strEQ(PL_tokenbuf+1, "SIG") && ckWARN(WARN_SYNTAX)
4842 && (t = strchr(s, '}')) && (t = strchr(t, '=')))
4843 {
4844 char tmpbuf[sizeof PL_tokenbuf];
c35e046a
AL
4845 do {
4846 t++;
4847 } while (isSPACE(*t));
90771dc0 4848 if (isIDFIRST_lazy_if(t,UTF)) {
780a5241 4849 STRLEN len;
90771dc0 4850 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
780a5241 4851 &len);
c35e046a
AL
4852 while (isSPACE(*t))
4853 t++;
780a5241 4854 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
90771dc0
NC
4855 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4856 "You need to quote \"%s\"",
4857 tmpbuf);
4858 }
4859 }
4860 }
93a17b20 4861 }
bbce6d69 4862
90771dc0
NC
4863 PL_expect = XOPERATOR;
4864 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
4865 const bool islop = (PL_last_lop == PL_oldoldbufptr);
4866 if (!islop || PL_last_lop_op == OP_GREPSTART)
4867 PL_expect = XOPERATOR;
4868 else if (strchr("$@\"'`q", *s))
4869 PL_expect = XTERM; /* e.g. print $fh "foo" */
4870 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
4871 PL_expect = XTERM; /* e.g. print $fh &sub */
4872 else if (isIDFIRST_lazy_if(s,UTF)) {
4873 char tmpbuf[sizeof PL_tokenbuf];
4874 int t2;
4875 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5458a98a 4876 if ((t2 = keyword(tmpbuf, len, 0))) {
90771dc0
NC
4877 /* binary operators exclude handle interpretations */
4878 switch (t2) {
4879 case -KEY_x:
4880 case -KEY_eq:
4881 case -KEY_ne:
4882 case -KEY_gt:
4883 case -KEY_lt:
4884 case -KEY_ge:
4885 case -KEY_le:
4886 case -KEY_cmp:
4887 break;
4888 default:
4889 PL_expect = XTERM; /* e.g. print $fh length() */
4890 break;
4891 }
4892 }
4893 else {
4894 PL_expect = XTERM; /* e.g. print $fh subr() */
84902520
TB
4895 }
4896 }
90771dc0
NC
4897 else if (isDIGIT(*s))
4898 PL_expect = XTERM; /* e.g. print $fh 3 */
4899 else if (*s == '.' && isDIGIT(s[1]))
4900 PL_expect = XTERM; /* e.g. print $fh .3 */
4901 else if ((*s == '?' || *s == '-' || *s == '+')
4902 && !isSPACE(s[1]) && s[1] != '=')
4903 PL_expect = XTERM; /* e.g. print $fh -1 */
4904 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
4905 && s[1] != '/')
4906 PL_expect = XTERM; /* e.g. print $fh /.../
4907 XXX except DORDOR operator
4908 */
4909 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
4910 && s[2] != '=')
4911 PL_expect = XTERM; /* print $fh <<"EOF" */
93a17b20 4912 }
bbce6d69 4913 }
3280af22 4914 PL_pending_ident = '$';
79072805 4915 TOKEN('$');
378cc40b
LW
4916
4917 case '@':
3280af22 4918 if (PL_expect == XOPERATOR)
bbce6d69 4919 no_op("Array", s);
3280af22
NIS
4920 PL_tokenbuf[0] = '@';
4921 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
4922 if (!PL_tokenbuf[1]) {
bbce6d69 4923 PREREF('@');
4924 }
3280af22 4925 if (PL_lex_state == LEX_NORMAL)
29595ff2 4926 s = SKIPSPACE1(s);
3280af22 4927 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 4928 if (*s == '{')
3280af22 4929 PL_tokenbuf[0] = '%';
a0d0e21e
LW
4930
4931 /* Warn about @ where they meant $. */
041457d9
DM
4932 if (*s == '[' || *s == '{') {
4933 if (ckWARN(WARN_SYNTAX)) {
f54cb97a 4934 const char *t = s + 1;
7e2040f0 4935 while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
4936 t++;
4937 if (*t == '}' || *t == ']') {
4938 t++;
29595ff2 4939 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
9014280d 4940 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 4941 "Scalar value %.*s better written as $%.*s",
36c7798d
DM
4942 (int)(t-PL_bufptr), PL_bufptr,
4943 (int)(t-PL_bufptr-1), PL_bufptr+1);
a0d0e21e 4944 }
93a17b20
LW
4945 }
4946 }
463ee0b2 4947 }
3280af22 4948 PL_pending_ident = '@';
79072805 4949 TERM('@');
378cc40b 4950
c963b151 4951 case '/': /* may be division, defined-or, or pattern */
6f33ba73
RGS
4952 if (PL_expect == XTERMORDORDOR && s[1] == '/') {
4953 s += 2;
4954 AOPERATOR(DORDOR);
4955 }
c963b151
BD
4956 case '?': /* may either be conditional or pattern */
4957 if(PL_expect == XOPERATOR) {
90771dc0 4958 char tmp = *s++;
c963b151
BD
4959 if(tmp == '?') {
4960 OPERATOR('?');
4961 }
4962 else {
4963 tmp = *s++;
4964 if(tmp == '/') {
4965 /* A // operator. */
4966 AOPERATOR(DORDOR);
4967 }
4968 else {
4969 s--;
4970 Mop(OP_DIVIDE);
4971 }
4972 }
4973 }
4974 else {
4975 /* Disable warning on "study /blah/" */
4976 if (PL_oldoldbufptr == PL_last_uni
4977 && (*PL_last_uni != 's' || s - PL_last_uni < 5
4978 || memNE(PL_last_uni, "study", 5)
4979 || isALNUM_lazy_if(PL_last_uni+5,UTF)
4980 ))
4981 check_uni();
4982 s = scan_pat(s,OP_MATCH);
4983 TERM(sublex_start());
4984 }
378cc40b
LW
4985
4986 case '.':
51882d45
GS
4987 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
4988#ifdef PERL_STRICT_CR
4989 && s[1] == '\n'
4990#else
4991 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
4992#endif
4993 && (s == PL_linestart || s[-1] == '\n') )
4994 {
3280af22
NIS
4995 PL_lex_formbrack = 0;
4996 PL_expect = XSTATE;
79072805
LW
4997 goto rightbracket;
4998 }
3280af22 4999 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
90771dc0 5000 char tmp = *s++;
a687059c
LW
5001 if (*s == tmp) {
5002 s++;
2f3197b3
LW
5003 if (*s == tmp) {
5004 s++;
79072805 5005 yylval.ival = OPf_SPECIAL;
2f3197b3
LW
5006 }
5007 else
79072805 5008 yylval.ival = 0;
378cc40b 5009 OPERATOR(DOTDOT);
a687059c 5010 }
3280af22 5011 if (PL_expect != XOPERATOR)
2f3197b3 5012 check_uni();
79072805 5013 Aop(OP_CONCAT);
378cc40b
LW
5014 }
5015 /* FALL THROUGH */
5016 case '0': case '1': case '2': case '3': case '4':
5017 case '5': case '6': case '7': case '8': case '9':
b73d6f50 5018 s = scan_num(s, &yylval);
931e0695 5019 DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
3280af22 5020 if (PL_expect == XOPERATOR)
8990e307 5021 no_op("Number",s);
79072805
LW
5022 TERM(THING);
5023
5024 case '\'':
5db06880 5025 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5026 DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
3280af22
NIS
5027 if (PL_expect == XOPERATOR) {
5028 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5029 PL_expect = XTERM;
c445ea15 5030 deprecate_old(commaless_variable_list);
bbf60fe6 5031 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 5032 }
463ee0b2 5033 else
8990e307 5034 no_op("String",s);
463ee0b2 5035 }
79072805 5036 if (!s)
d4c19fe8 5037 missingterm(NULL);
79072805
LW
5038 yylval.ival = OP_CONST;
5039 TERM(sublex_start());
5040
5041 case '"':
5db06880 5042 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5043 DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
3280af22
NIS
5044 if (PL_expect == XOPERATOR) {
5045 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5046 PL_expect = XTERM;
c445ea15 5047 deprecate_old(commaless_variable_list);
bbf60fe6 5048 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 5049 }
463ee0b2 5050 else
8990e307 5051 no_op("String",s);
463ee0b2 5052 }
79072805 5053 if (!s)
d4c19fe8 5054 missingterm(NULL);
4633a7c4 5055 yylval.ival = OP_CONST;
cfd0369c
NC
5056 /* FIXME. I think that this can be const if char *d is replaced by
5057 more localised variables. */
3280af22 5058 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
63cd0674 5059 if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
4633a7c4
LW
5060 yylval.ival = OP_STRINGIFY;
5061 break;
5062 }
5063 }
79072805
LW
5064 TERM(sublex_start());
5065
5066 case '`':
5db06880 5067 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5068 DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
3280af22 5069 if (PL_expect == XOPERATOR)
8990e307 5070 no_op("Backticks",s);
79072805 5071 if (!s)
d4c19fe8 5072 missingterm(NULL);
9b201d7d 5073 readpipe_override();
79072805
LW
5074 TERM(sublex_start());
5075
5076 case '\\':
5077 s++;
041457d9 5078 if (PL_lex_inwhat && isDIGIT(*s) && ckWARN(WARN_SYNTAX))
9014280d 5079 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
599cee73 5080 *s, *s);
3280af22 5081 if (PL_expect == XOPERATOR)
8990e307 5082 no_op("Backslash",s);
79072805
LW
5083 OPERATOR(REFGEN);
5084
a7cb1f99 5085 case 'v':
e526c9e6 5086 if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
f54cb97a 5087 char *start = s + 2;
dd629d5b 5088 while (isDIGIT(*start) || *start == '_')
a7cb1f99
GS
5089 start++;
5090 if (*start == '.' && isDIGIT(start[1])) {
b73d6f50 5091 s = scan_num(s, &yylval);
a7cb1f99
GS
5092 TERM(THING);
5093 }
e526c9e6 5094 /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6f33ba73
RGS
5095 else if (!isALPHA(*start) && (PL_expect == XTERM
5096 || PL_expect == XREF || PL_expect == XSTATE
5097 || PL_expect == XTERMORDORDOR)) {
d4c19fe8 5098 /* XXX Use gv_fetchpvn rather than stomping on a const string */
f54cb97a 5099 const char c = *start;
e526c9e6
GS
5100 GV *gv;
5101 *start = '\0';
f776e3cd 5102 gv = gv_fetchpv(s, 0, SVt_PVCV);
e526c9e6
GS
5103 *start = c;
5104 if (!gv) {
b73d6f50 5105 s = scan_num(s, &yylval);
e526c9e6
GS
5106 TERM(THING);
5107 }
5108 }
a7cb1f99
GS
5109 }
5110 goto keylookup;
79072805 5111 case 'x':
3280af22 5112 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
5113 s++;
5114 Mop(OP_REPEAT);
2f3197b3 5115 }
79072805
LW
5116 goto keylookup;
5117
378cc40b 5118 case '_':
79072805
LW
5119 case 'a': case 'A':
5120 case 'b': case 'B':
5121 case 'c': case 'C':
5122 case 'd': case 'D':
5123 case 'e': case 'E':
5124 case 'f': case 'F':
5125 case 'g': case 'G':
5126 case 'h': case 'H':
5127 case 'i': case 'I':
5128 case 'j': case 'J':
5129 case 'k': case 'K':
5130 case 'l': case 'L':
5131 case 'm': case 'M':
5132 case 'n': case 'N':
5133 case 'o': case 'O':
5134 case 'p': case 'P':
5135 case 'q': case 'Q':
5136 case 'r': case 'R':
5137 case 's': case 'S':
5138 case 't': case 'T':
5139 case 'u': case 'U':
a7cb1f99 5140 case 'V':
79072805
LW
5141 case 'w': case 'W':
5142 case 'X':
5143 case 'y': case 'Y':
5144 case 'z': case 'Z':
5145
49dc05e3 5146 keylookup: {
90771dc0 5147 I32 tmp;
10edeb5d
JH
5148
5149 orig_keyword = 0;
5150 gv = NULL;
5151 gvp = NULL;
49dc05e3 5152
3280af22
NIS
5153 PL_bufptr = s;
5154 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 5155
5156 /* Some keywords can be followed by any delimiter, including ':' */
155aba94
GS
5157 tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
5158 (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
5159 (PL_tokenbuf[0] == 'q' &&
5160 strchr("qwxr", PL_tokenbuf[1])))));
8ebc5c01 5161
5162 /* x::* is just a word, unless x is "CORE" */
3280af22 5163 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
5164 goto just_a_word;
5165
3643fb5f 5166 d = s;
3280af22 5167 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
5168 d++; /* no comments skipped here, or s### is misparsed */
5169
5170 /* Is this a label? */
3280af22
NIS
5171 if (!tmp && PL_expect == XSTATE
5172 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
8ebc5c01 5173 s = d + 1;
63031daf 5174 yylval.pval = CopLABEL_alloc(PL_tokenbuf);
8ebc5c01 5175 CLINE;
5176 TOKEN(LABEL);
3643fb5f
CS
5177 }
5178
5179 /* Check for keywords */
5458a98a 5180 tmp = keyword(PL_tokenbuf, len, 0);
748a9306
LW
5181
5182 /* Is this a word before a => operator? */
1c3923b3 5183 if (*d == '=' && d[1] == '>') {
748a9306 5184 CLINE;
d0a148a6
NC
5185 yylval.opval
5186 = (OP*)newSVOP(OP_CONST, 0,
5187 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
748a9306
LW
5188 yylval.opval->op_private = OPpCONST_BARE;
5189 TERM(WORD);
5190 }
5191
a0d0e21e 5192 if (tmp < 0) { /* second-class keyword? */
cbbf8932
AL
5193 GV *ogv = NULL; /* override (winner) */
5194 GV *hgv = NULL; /* hidden (loser) */
3280af22 5195 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 5196 CV *cv;
90e5519e 5197 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
56f7f34b
CS
5198 (cv = GvCVu(gv)))
5199 {
5200 if (GvIMPORTED_CV(gv))
5201 ogv = gv;
5202 else if (! CvMETHOD(cv))
5203 hgv = gv;
5204 }
5205 if (!ogv &&
3280af22 5206 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
9e0d86f8 5207 (gv = *gvp) && isGV_with_GP(gv) &&
56f7f34b
CS
5208 GvCVu(gv) && GvIMPORTED_CV(gv))
5209 {
5210 ogv = gv;
5211 }
5212 }
5213 if (ogv) {
30fe34ed 5214 orig_keyword = tmp;
56f7f34b 5215 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
5216 }
5217 else if (gv && !gvp
5218 && -tmp==KEY_lock /* XXX generalizable kludge */
47f9f84c 5219 && GvCVu(gv))
6e7b2336
GS
5220 {
5221 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 5222 }
56f7f34b
CS
5223 else { /* no override */
5224 tmp = -tmp;
ac206dc8 5225 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
9014280d 5226 Perl_warner(aTHX_ packWARN(WARN_MISC),
ac206dc8
RGS
5227 "dump() better written as CORE::dump()");
5228 }
a0714e2c 5229 gv = NULL;
56f7f34b 5230 gvp = 0;
041457d9
DM
5231 if (hgv && tmp != KEY_x && tmp != KEY_CORE
5232 && ckWARN(WARN_AMBIGUOUS)) /* never ambiguous */
9014280d 5233 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 5234 "Ambiguous call resolved as CORE::%s(), %s",
2f3ca594 5235 GvENAME(hgv), "qualify as such or use &");
49dc05e3 5236 }
a0d0e21e
LW
5237 }
5238
5239 reserved_word:
5240 switch (tmp) {
79072805
LW
5241
5242 default: /* not a keyword */
0bfa2a8a
NC
5243 /* Trade off - by using this evil construction we can pull the
5244 variable gv into the block labelled keylookup. If not, then
5245 we have to give it function scope so that the goto from the
5246 earlier ':' case doesn't bypass the initialisation. */
5247 if (0) {
5248 just_a_word_zero_gv:
5249 gv = NULL;
5250 gvp = NULL;
8bee0991 5251 orig_keyword = 0;
0bfa2a8a 5252 }
93a17b20 5253 just_a_word: {
96e4d5b1 5254 SV *sv;
ce29ac45 5255 int pkgname = 0;
f54cb97a 5256 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
5069cc75 5257 CV *cv;
5db06880 5258#ifdef PERL_MAD
cd81e915 5259 SV *nextPL_nextwhite = 0;
5db06880
NC
5260#endif
5261
8990e307
LW
5262
5263 /* Get the rest if it looks like a package qualifier */
5264
155aba94 5265 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
c3e0f903 5266 STRLEN morelen;
3280af22 5267 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
5268 TRUE, &morelen);
5269 if (!morelen)
cea2e8a9 5270 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 5271 *s == '\'' ? "'" : "::");
c3e0f903 5272 len += morelen;
ce29ac45 5273 pkgname = 1;
a0d0e21e 5274 }
8990e307 5275
3280af22
NIS
5276 if (PL_expect == XOPERATOR) {
5277 if (PL_bufptr == PL_linestart) {
57843af0 5278 CopLINE_dec(PL_curcop);
9014280d 5279 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 5280 CopLINE_inc(PL_curcop);
463ee0b2
LW
5281 }
5282 else
54310121 5283 no_op("Bareword",s);
463ee0b2 5284 }
8990e307 5285
c3e0f903
GS
5286 /* Look for a subroutine with this name in current package,
5287 unless name is "Foo::", in which case Foo is a bearword
5288 (and a package name). */
5289
5db06880 5290 if (len > 2 && !PL_madskills &&
3280af22 5291 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 5292 {
f776e3cd 5293 if (ckWARN(WARN_BAREWORD)
90e5519e 5294 && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
9014280d 5295 Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
599cee73 5296 "Bareword \"%s\" refers to nonexistent package",
3280af22 5297 PL_tokenbuf);
c3e0f903 5298 len -= 2;
3280af22 5299 PL_tokenbuf[len] = '\0';
a0714e2c 5300 gv = NULL;
c3e0f903
GS
5301 gvp = 0;
5302 }
5303 else {
62d55b22
NC
5304 if (!gv) {
5305 /* Mustn't actually add anything to a symbol table.
5306 But also don't want to "initialise" any placeholder
5307 constants that might already be there into full
5308 blown PVGVs with attached PVCV. */
90e5519e
NC
5309 gv = gv_fetchpvn_flags(PL_tokenbuf, len,
5310 GV_NOADD_NOINIT, SVt_PVCV);
62d55b22 5311 }
b3d904f3 5312 len = 0;
c3e0f903
GS
5313 }
5314
5315 /* if we saw a global override before, get the right name */
8990e307 5316
49dc05e3 5317 if (gvp) {
396482e1 5318 sv = newSVpvs("CORE::GLOBAL::");
3280af22 5319 sv_catpv(sv,PL_tokenbuf);
49dc05e3 5320 }
8a7a129d
NC
5321 else {
5322 /* If len is 0, newSVpv does strlen(), which is correct.
5323 If len is non-zero, then it will be the true length,
5324 and so the scalar will be created correctly. */
5325 sv = newSVpv(PL_tokenbuf,len);
5326 }
5db06880 5327#ifdef PERL_MAD
cd81e915
NC
5328 if (PL_madskills && !PL_thistoken) {
5329 char *start = SvPVX(PL_linestr) + PL_realtokenstart;
5330 PL_thistoken = newSVpv(start,s - start);
5331 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
5332 }
5333#endif
8990e307 5334
a0d0e21e
LW
5335 /* Presume this is going to be a bareword of some sort. */
5336
5337 CLINE;
49dc05e3 5338 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
a0d0e21e 5339 yylval.opval->op_private = OPpCONST_BARE;
8f8cf39c
JH
5340 /* UTF-8 package name? */
5341 if (UTF && !IN_BYTES &&
95a20fc0 5342 is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
8f8cf39c 5343 SvUTF8_on(sv);
a0d0e21e 5344
c3e0f903
GS
5345 /* And if "Foo::", then that's what it certainly is. */
5346
5347 if (len)
5348 goto safe_bareword;
5349
5069cc75
NC
5350 /* Do the explicit type check so that we don't need to force
5351 the initialisation of the symbol table to have a real GV.
5352 Beware - gv may not really be a PVGV, cv may not really be
5353 a PVCV, (because of the space optimisations that gv_init
5354 understands) But they're true if for this symbol there is
5355 respectively a typeglob and a subroutine.
5356 */
5357 cv = gv ? ((SvTYPE(gv) == SVt_PVGV)
5358 /* Real typeglob, so get the real subroutine: */
5359 ? GvCVu(gv)
5360 /* A proxy for a subroutine in this package? */
5361 : SvOK(gv) ? (CV *) gv : NULL)
5362 : NULL;
5363
8990e307
LW
5364 /* See if it's the indirect object for a list operator. */
5365
3280af22
NIS
5366 if (PL_oldoldbufptr &&
5367 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
5368 (PL_oldoldbufptr == PL_last_lop
5369 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 5370 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
5371 (PL_expect == XREF ||
5372 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 5373 {
748a9306
LW
5374 bool immediate_paren = *s == '(';
5375
a0d0e21e 5376 /* (Now we can afford to cross potential line boundary.) */
cd81e915 5377 s = SKIPSPACE2(s,nextPL_nextwhite);
5db06880 5378#ifdef PERL_MAD
cd81e915 5379 PL_nextwhite = nextPL_nextwhite; /* assume no & deception */
5db06880 5380#endif
a0d0e21e
LW
5381
5382 /* Two barewords in a row may indicate method call. */
5383
62d55b22
NC
5384 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
5385 (tmp = intuit_method(s, gv, cv)))
bbf60fe6 5386 return REPORT(tmp);
a0d0e21e
LW
5387
5388 /* If not a declared subroutine, it's an indirect object. */
5389 /* (But it's an indir obj regardless for sort.) */
7294df96 5390 /* Also, if "_" follows a filetest operator, it's a bareword */
a0d0e21e 5391
7294df96
RGS
5392 if (
5393 ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
5069cc75 5394 ((!gv || !cv) &&
a9ef352a 5395 (PL_last_lop_op != OP_MAPSTART &&
f0670693 5396 PL_last_lop_op != OP_GREPSTART))))
7294df96
RGS
5397 || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
5398 && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
5399 )
a9ef352a 5400 {
3280af22 5401 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 5402 goto bareword;
93a17b20
LW
5403 }
5404 }
8990e307 5405
3280af22 5406 PL_expect = XOPERATOR;
5db06880
NC
5407#ifdef PERL_MAD
5408 if (isSPACE(*s))
cd81e915
NC
5409 s = SKIPSPACE2(s,nextPL_nextwhite);
5410 PL_nextwhite = nextPL_nextwhite;
5db06880 5411#else
8990e307 5412 s = skipspace(s);
5db06880 5413#endif
1c3923b3
GS
5414
5415 /* Is this a word before a => operator? */
ce29ac45 5416 if (*s == '=' && s[1] == '>' && !pkgname) {
1c3923b3
GS
5417 CLINE;
5418 sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
0064a8a9 5419 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
7948272d 5420 SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
1c3923b3
GS
5421 TERM(WORD);
5422 }
5423
5424 /* If followed by a paren, it's certainly a subroutine. */
93a17b20 5425 if (*s == '(') {
79072805 5426 CLINE;
5069cc75 5427 if (cv) {
c35e046a
AL
5428 d = s + 1;
5429 while (SPACE_OR_TAB(*d))
5430 d++;
62d55b22 5431 if (*d == ')' && (sv = gv_const_sv(gv))) {
96e4d5b1 5432 s = d + 1;
5db06880
NC
5433#ifdef PERL_MAD
5434 if (PL_madskills) {
cd81e915
NC
5435 char *par = SvPVX(PL_linestr) + PL_realtokenstart;
5436 sv_catpvn(PL_thistoken, par, s - par);
5437 if (PL_nextwhite) {
5438 sv_free(PL_nextwhite);
5439 PL_nextwhite = 0;
5db06880
NC
5440 }
5441 }
36dee510 5442 else
5db06880 5443#endif
36dee510 5444 goto its_constant;
96e4d5b1 5445 }
5446 }
5db06880
NC
5447#ifdef PERL_MAD
5448 if (PL_madskills) {
cd81e915
NC
5449 PL_nextwhite = PL_thiswhite;
5450 PL_thiswhite = 0;
5db06880 5451 }
cd81e915 5452 start_force(PL_curforce);
5db06880 5453#endif
9ded7720 5454 NEXTVAL_NEXTTOKE.opval = yylval.opval;
3280af22 5455 PL_expect = XOPERATOR;
5db06880
NC
5456#ifdef PERL_MAD
5457 if (PL_madskills) {
cd81e915
NC
5458 PL_nextwhite = nextPL_nextwhite;
5459 curmad('X', PL_thistoken);
6b29d1f5 5460 PL_thistoken = newSVpvs("");
5db06880
NC
5461 }
5462#endif
93a17b20 5463 force_next(WORD);
c07a80fd 5464 yylval.ival = 0;
463ee0b2 5465 TOKEN('&');
79072805 5466 }
93a17b20 5467
a0d0e21e 5468 /* If followed by var or block, call it a method (unless sub) */
8990e307 5469
62d55b22 5470 if ((*s == '$' || *s == '{') && (!gv || !cv)) {
3280af22
NIS
5471 PL_last_lop = PL_oldbufptr;
5472 PL_last_lop_op = OP_METHOD;
93a17b20 5473 PREBLOCK(METHOD);
463ee0b2
LW
5474 }
5475
8990e307
LW
5476 /* If followed by a bareword, see if it looks like indir obj. */
5477
30fe34ed
RGS
5478 if (!orig_keyword
5479 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
62d55b22 5480 && (tmp = intuit_method(s, gv, cv)))
bbf60fe6 5481 return REPORT(tmp);
93a17b20 5482
8990e307
LW
5483 /* Not a method, so call it a subroutine (if defined) */
5484
5069cc75 5485 if (cv) {
0453d815 5486 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
9014280d 5487 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5488 "Ambiguous use of -%s resolved as -&%s()",
3280af22 5489 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 5490 /* Check for a constant sub */
36dee510 5491 if ((sv = gv_const_sv(gv)) && !PL_madskills) {
96e4d5b1 5492 its_constant:
5493 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
b37c2d43 5494 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
96e4d5b1 5495 yylval.opval->op_private = 0;
5496 TOKEN(WORD);
89bfa8cd 5497 }
5498
a5f75d66 5499 /* Resolve to GV now. */
62d55b22 5500 if (SvTYPE(gv) != SVt_PVGV) {
b3d904f3 5501 gv = gv_fetchpv(PL_tokenbuf, 0, SVt_PVCV);
62d55b22
NC
5502 assert (SvTYPE(gv) == SVt_PVGV);
5503 /* cv must have been some sort of placeholder, so
5504 now needs replacing with a real code reference. */
5505 cv = GvCV(gv);
5506 }
5507
a5f75d66
AD
5508 op_free(yylval.opval);
5509 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
9675f7ac 5510 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 5511 PL_last_lop = PL_oldbufptr;
bf848113 5512 PL_last_lop_op = OP_ENTERSUB;
4633a7c4 5513 /* Is there a prototype? */
5db06880
NC
5514 if (
5515#ifdef PERL_MAD
5516 cv &&
5517#endif
d9f2850e
RGS
5518 SvPOK(cv))
5519 {
5f66b61c
AL
5520 STRLEN protolen;
5521 const char *proto = SvPV_const((SV*)cv, protolen);
5522 if (!protolen)
4633a7c4 5523 TERM(FUNC0SUB);
8c28b960 5524 if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
4633a7c4 5525 OPERATOR(UNIOPSUB);
0f5d0394
AE
5526 while (*proto == ';')
5527 proto++;
7a52d87a 5528 if (*proto == '&' && *s == '{') {
10edeb5d
JH
5529 sv_setpv(PL_subname,
5530 (const char *)
5531 (PL_curstash ?
5532 "__ANON__" : "__ANON__::__ANON__"));
4633a7c4
LW
5533 PREBLOCK(LSTOPSUB);
5534 }
a9ef352a 5535 }
5db06880
NC
5536#ifdef PERL_MAD
5537 {
5538 if (PL_madskills) {
cd81e915
NC
5539 PL_nextwhite = PL_thiswhite;
5540 PL_thiswhite = 0;
5db06880 5541 }
cd81e915 5542 start_force(PL_curforce);
5db06880
NC
5543 NEXTVAL_NEXTTOKE.opval = yylval.opval;
5544 PL_expect = XTERM;
5545 if (PL_madskills) {
cd81e915
NC
5546 PL_nextwhite = nextPL_nextwhite;
5547 curmad('X', PL_thistoken);
6b29d1f5 5548 PL_thistoken = newSVpvs("");
5db06880
NC
5549 }
5550 force_next(WORD);
5551 TOKEN(NOAMP);
5552 }
5553 }
5554
5555 /* Guess harder when madskills require "best effort". */
5556 if (PL_madskills && (!gv || !GvCVu(gv))) {
5557 int probable_sub = 0;
5558 if (strchr("\"'`$@%0123456789!*+{[<", *s))
5559 probable_sub = 1;
5560 else if (isALPHA(*s)) {
5561 char tmpbuf[1024];
5562 STRLEN tmplen;
5563 d = s;
5564 d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
5458a98a 5565 if (!keyword(tmpbuf, tmplen, 0))
5db06880
NC
5566 probable_sub = 1;
5567 else {
5568 while (d < PL_bufend && isSPACE(*d))
5569 d++;
5570 if (*d == '=' && d[1] == '>')
5571 probable_sub = 1;
5572 }
5573 }
5574 if (probable_sub) {
7a6d04f4 5575 gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
5db06880
NC
5576 op_free(yylval.opval);
5577 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
5578 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
5579 PL_last_lop = PL_oldbufptr;
5580 PL_last_lop_op = OP_ENTERSUB;
cd81e915
NC
5581 PL_nextwhite = PL_thiswhite;
5582 PL_thiswhite = 0;
5583 start_force(PL_curforce);
5db06880
NC
5584 NEXTVAL_NEXTTOKE.opval = yylval.opval;
5585 PL_expect = XTERM;
cd81e915
NC
5586 PL_nextwhite = nextPL_nextwhite;
5587 curmad('X', PL_thistoken);
6b29d1f5 5588 PL_thistoken = newSVpvs("");
5db06880
NC
5589 force_next(WORD);
5590 TOKEN(NOAMP);
5591 }
5592#else
9ded7720 5593 NEXTVAL_NEXTTOKE.opval = yylval.opval;
3280af22 5594 PL_expect = XTERM;
8990e307
LW
5595 force_next(WORD);
5596 TOKEN(NOAMP);
5db06880 5597#endif
8990e307 5598 }
748a9306 5599
8990e307
LW
5600 /* Call it a bare word */
5601
5603f27d
GS
5602 if (PL_hints & HINT_STRICT_SUBS)
5603 yylval.opval->op_private |= OPpCONST_STRICT;
5604 else {
5605 bareword:
041457d9
DM
5606 if (lastchar != '-') {
5607 if (ckWARN(WARN_RESERVED)) {
c35e046a
AL
5608 d = PL_tokenbuf;
5609 while (isLOWER(*d))
5610 d++;
da51bb9b 5611 if (!*d && !gv_stashpv(PL_tokenbuf, 0))
9014280d 5612 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
5613 PL_tokenbuf);
5614 }
748a9306
LW
5615 }
5616 }
c3e0f903
GS
5617
5618 safe_bareword:
3792a11b
NC
5619 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
5620 && ckWARN_d(WARN_AMBIGUOUS)) {
9014280d 5621 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5622 "Operator or semicolon missing before %c%s",
3280af22 5623 lastchar, PL_tokenbuf);
9014280d 5624 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5625 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
5626 lastchar, lastchar);
5627 }
93a17b20 5628 TOKEN(WORD);
79072805 5629 }
79072805 5630
68dc0745 5631 case KEY___FILE__:
46fc3d4c 5632 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 5633 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 5634 TERM(THING);
5635
79072805 5636 case KEY___LINE__:
cf2093f6 5637 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 5638 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 5639 TERM(THING);
68dc0745 5640
5641 case KEY___PACKAGE__:
5642 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22 5643 (PL_curstash
5aaec2b4 5644 ? newSVhek(HvNAME_HEK(PL_curstash))
3280af22 5645 : &PL_sv_undef));
79072805 5646 TERM(THING);
79072805 5647
e50aee73 5648 case KEY___DATA__:
79072805
LW
5649 case KEY___END__: {
5650 GV *gv;
3280af22 5651 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
bfed75c6 5652 const char *pname = "main";
3280af22 5653 if (PL_tokenbuf[2] == 'D')
bfcb3514 5654 pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
f776e3cd
NC
5655 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
5656 SVt_PVIO);
a5f75d66 5657 GvMULTI_on(gv);
79072805 5658 if (!GvIO(gv))
a0d0e21e 5659 GvIOp(gv) = newIO();
3280af22 5660 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
5661#if defined(HAS_FCNTL) && defined(F_SETFD)
5662 {
f54cb97a 5663 const int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
5664 fcntl(fd,F_SETFD,fd >= 3);
5665 }
79072805 5666#endif
fd049845 5667 /* Mark this internal pseudo-handle as clean */
5668 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3280af22 5669 if (PL_preprocess)
50952442 5670 IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
3280af22 5671 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 5672 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 5673 else
50952442 5674 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
5675#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
5676 /* if the script was opened in binmode, we need to revert
53129d29 5677 * it to text mode for compatibility; but only iff it has CRs
c39cd008 5678 * XXX this is a questionable hack at best. */
53129d29
GS
5679 if (PL_bufend-PL_bufptr > 2
5680 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
5681 {
5682 Off_t loc = 0;
50952442 5683 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
5684 loc = PerlIO_tell(PL_rsfp);
5685 (void)PerlIO_seek(PL_rsfp, 0L, 0);
5686 }
2986a63f
JH
5687#ifdef NETWARE
5688 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
5689#else
c39cd008 5690 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 5691#endif /* NETWARE */
1143fce0
JH
5692#ifdef PERLIO_IS_STDIO /* really? */
5693# if defined(__BORLANDC__)
cb359b41
JH
5694 /* XXX see note in do_binmode() */
5695 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
5696# endif
5697#endif
c39cd008
GS
5698 if (loc > 0)
5699 PerlIO_seek(PL_rsfp, loc, 0);
5700 }
5701 }
5702#endif
7948272d 5703#ifdef PERLIO_LAYERS
52d2e0f4
JH
5704 if (!IN_BYTES) {
5705 if (UTF)
5706 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
5707 else if (PL_encoding) {
5708 SV *name;
5709 dSP;
5710 ENTER;
5711 SAVETMPS;
5712 PUSHMARK(sp);
5713 EXTEND(SP, 1);
5714 XPUSHs(PL_encoding);
5715 PUTBACK;
5716 call_method("name", G_SCALAR);
5717 SPAGAIN;
5718 name = POPs;
5719 PUTBACK;
bfed75c6 5720 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
52d2e0f4 5721 Perl_form(aTHX_ ":encoding(%"SVf")",
be2597df 5722 SVfARG(name)));
52d2e0f4
JH
5723 FREETMPS;
5724 LEAVE;
5725 }
5726 }
7948272d 5727#endif
5db06880
NC
5728#ifdef PERL_MAD
5729 if (PL_madskills) {
cd81e915
NC
5730 if (PL_realtokenstart >= 0) {
5731 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5732 if (!PL_endwhite)
6b29d1f5 5733 PL_endwhite = newSVpvs("");
cd81e915
NC
5734 sv_catsv(PL_endwhite, PL_thiswhite);
5735 PL_thiswhite = 0;
5736 sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
5737 PL_realtokenstart = -1;
5db06880 5738 }
cd81e915
NC
5739 while ((s = filter_gets(PL_endwhite, PL_rsfp,
5740 SvCUR(PL_endwhite))) != Nullch) ;
5db06880
NC
5741 }
5742#endif
4608196e 5743 PL_rsfp = NULL;
79072805
LW
5744 }
5745 goto fake_eof;
e929a76b 5746 }
de3bb511 5747
8990e307 5748 case KEY_AUTOLOAD:
ed6116ce 5749 case KEY_DESTROY:
79072805 5750 case KEY_BEGIN:
3c10abe3 5751 case KEY_UNITCHECK:
7d30b5c4 5752 case KEY_CHECK:
7d07dbc2 5753 case KEY_INIT:
7d30b5c4 5754 case KEY_END:
3280af22
NIS
5755 if (PL_expect == XSTATE) {
5756 s = PL_bufptr;
93a17b20 5757 goto really_sub;
79072805
LW
5758 }
5759 goto just_a_word;
5760
a0d0e21e
LW
5761 case KEY_CORE:
5762 if (*s == ':' && s[1] == ':') {
5763 s += 2;
748a9306 5764 d = s;
3280af22 5765 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 5766 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6798c92b 5767 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
5768 if (tmp < 0)
5769 tmp = -tmp;
850e8516 5770 else if (tmp == KEY_require || tmp == KEY_do)
a72a1c8b 5771 /* that's a way to remember we saw "CORE::" */
850e8516 5772 orig_keyword = tmp;
a0d0e21e
LW
5773 goto reserved_word;
5774 }
5775 goto just_a_word;
5776
463ee0b2
LW
5777 case KEY_abs:
5778 UNI(OP_ABS);
5779
79072805
LW
5780 case KEY_alarm:
5781 UNI(OP_ALARM);
5782
5783 case KEY_accept:
a0d0e21e 5784 LOP(OP_ACCEPT,XTERM);
79072805 5785
463ee0b2
LW
5786 case KEY_and:
5787 OPERATOR(ANDOP);
5788
79072805 5789 case KEY_atan2:
a0d0e21e 5790 LOP(OP_ATAN2,XTERM);
85e6fe83 5791
79072805 5792 case KEY_bind:
a0d0e21e 5793 LOP(OP_BIND,XTERM);
79072805
LW
5794
5795 case KEY_binmode:
1c1fc3ea 5796 LOP(OP_BINMODE,XTERM);
79072805
LW
5797
5798 case KEY_bless:
a0d0e21e 5799 LOP(OP_BLESS,XTERM);
79072805 5800
0d863452
RH
5801 case KEY_break:
5802 FUN0(OP_BREAK);
5803
79072805
LW
5804 case KEY_chop:
5805 UNI(OP_CHOP);
5806
5807 case KEY_continue:
0d863452
RH
5808 /* When 'use switch' is in effect, continue has a dual
5809 life as a control operator. */
5810 {
ef89dcc3 5811 if (!FEATURE_IS_ENABLED("switch"))
0d863452
RH
5812 PREBLOCK(CONTINUE);
5813 else {
5814 /* We have to disambiguate the two senses of
5815 "continue". If the next token is a '{' then
5816 treat it as the start of a continue block;
5817 otherwise treat it as a control operator.
5818 */
5819 s = skipspace(s);
5820 if (*s == '{')
79072805 5821 PREBLOCK(CONTINUE);
0d863452
RH
5822 else
5823 FUN0(OP_CONTINUE);
5824 }
5825 }
79072805
LW
5826
5827 case KEY_chdir:
fafc274c
NC
5828 /* may use HOME */
5829 (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
79072805
LW
5830 UNI(OP_CHDIR);
5831
5832 case KEY_close:
5833 UNI(OP_CLOSE);
5834
5835 case KEY_closedir:
5836 UNI(OP_CLOSEDIR);
5837
5838 case KEY_cmp:
5839 Eop(OP_SCMP);
5840
5841 case KEY_caller:
5842 UNI(OP_CALLER);
5843
5844 case KEY_crypt:
5845#ifdef FCRYPT
f4c556ac
GS
5846 if (!PL_cryptseen) {
5847 PL_cryptseen = TRUE;
de3bb511 5848 init_des();
f4c556ac 5849 }
a687059c 5850#endif
a0d0e21e 5851 LOP(OP_CRYPT,XTERM);
79072805
LW
5852
5853 case KEY_chmod:
a0d0e21e 5854 LOP(OP_CHMOD,XTERM);
79072805
LW
5855
5856 case KEY_chown:
a0d0e21e 5857 LOP(OP_CHOWN,XTERM);
79072805
LW
5858
5859 case KEY_connect:
a0d0e21e 5860 LOP(OP_CONNECT,XTERM);
79072805 5861
463ee0b2
LW
5862 case KEY_chr:
5863 UNI(OP_CHR);
5864
79072805
LW
5865 case KEY_cos:
5866 UNI(OP_COS);
5867
5868 case KEY_chroot:
5869 UNI(OP_CHROOT);
5870
0d863452
RH
5871 case KEY_default:
5872 PREBLOCK(DEFAULT);
5873
79072805 5874 case KEY_do:
29595ff2 5875 s = SKIPSPACE1(s);
79072805 5876 if (*s == '{')
a0d0e21e 5877 PRETERMBLOCK(DO);
79072805 5878 if (*s != '\'')
89c5585f 5879 s = force_word(s,WORD,TRUE,TRUE,FALSE);
850e8516
RGS
5880 if (orig_keyword == KEY_do) {
5881 orig_keyword = 0;
5882 yylval.ival = 1;
5883 }
5884 else
5885 yylval.ival = 0;
378cc40b 5886 OPERATOR(DO);
79072805
LW
5887
5888 case KEY_die:
3280af22 5889 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 5890 LOP(OP_DIE,XTERM);
79072805
LW
5891
5892 case KEY_defined:
5893 UNI(OP_DEFINED);
5894
5895 case KEY_delete:
a0d0e21e 5896 UNI(OP_DELETE);
79072805
LW
5897
5898 case KEY_dbmopen:
5c1737d1 5899 gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
a0d0e21e 5900 LOP(OP_DBMOPEN,XTERM);
79072805
LW
5901
5902 case KEY_dbmclose:
5903 UNI(OP_DBMCLOSE);
5904
5905 case KEY_dump:
a0d0e21e 5906 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
5907 LOOPX(OP_DUMP);
5908
5909 case KEY_else:
5910 PREBLOCK(ELSE);
5911
5912 case KEY_elsif:
57843af0 5913 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5914 OPERATOR(ELSIF);
5915
5916 case KEY_eq:
5917 Eop(OP_SEQ);
5918
a0d0e21e
LW
5919 case KEY_exists:
5920 UNI(OP_EXISTS);
4e553d73 5921
79072805 5922 case KEY_exit:
5db06880
NC
5923 if (PL_madskills)
5924 UNI(OP_INT);
79072805
LW
5925 UNI(OP_EXIT);
5926
5927 case KEY_eval:
29595ff2 5928 s = SKIPSPACE1(s);
3280af22 5929 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 5930 UNIBRACK(OP_ENTEREVAL);
79072805
LW
5931
5932 case KEY_eof:
5933 UNI(OP_EOF);
5934
c963b151
BD
5935 case KEY_err:
5936 OPERATOR(DOROP);
5937
79072805
LW
5938 case KEY_exp:
5939 UNI(OP_EXP);
5940
5941 case KEY_each:
5942 UNI(OP_EACH);
5943
5944 case KEY_exec:
5945 set_csh();
a0d0e21e 5946 LOP(OP_EXEC,XREF);
79072805
LW
5947
5948 case KEY_endhostent:
5949 FUN0(OP_EHOSTENT);
5950
5951 case KEY_endnetent:
5952 FUN0(OP_ENETENT);
5953
5954 case KEY_endservent:
5955 FUN0(OP_ESERVENT);
5956
5957 case KEY_endprotoent:
5958 FUN0(OP_EPROTOENT);
5959
5960 case KEY_endpwent:
5961 FUN0(OP_EPWENT);
5962
5963 case KEY_endgrent:
5964 FUN0(OP_EGRENT);
5965
5966 case KEY_for:
5967 case KEY_foreach:
57843af0 5968 yylval.ival = CopLINE(PL_curcop);
29595ff2 5969 s = SKIPSPACE1(s);
7e2040f0 5970 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 5971 char *p = s;
5db06880
NC
5972#ifdef PERL_MAD
5973 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
5974#endif
5975
3280af22 5976 if ((PL_bufend - p) >= 3 &&
55497cff 5977 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
5978 p += 2;
77ca0c92
LW
5979 else if ((PL_bufend - p) >= 4 &&
5980 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
5981 p += 3;
29595ff2 5982 p = PEEKSPACE(p);
7e2040f0 5983 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
5984 p = scan_ident(p, PL_bufend,
5985 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
29595ff2 5986 p = PEEKSPACE(p);
77ca0c92
LW
5987 }
5988 if (*p != '$')
cea2e8a9 5989 Perl_croak(aTHX_ "Missing $ on loop variable");
5db06880
NC
5990#ifdef PERL_MAD
5991 s = SvPVX(PL_linestr) + soff;
5992#endif
55497cff 5993 }
79072805
LW
5994 OPERATOR(FOR);
5995
5996 case KEY_formline:
a0d0e21e 5997 LOP(OP_FORMLINE,XTERM);
79072805
LW
5998
5999 case KEY_fork:
6000 FUN0(OP_FORK);
6001
6002 case KEY_fcntl:
a0d0e21e 6003 LOP(OP_FCNTL,XTERM);
79072805
LW
6004
6005 case KEY_fileno:
6006 UNI(OP_FILENO);
6007
6008 case KEY_flock:
a0d0e21e 6009 LOP(OP_FLOCK,XTERM);
79072805
LW
6010
6011 case KEY_gt:
6012 Rop(OP_SGT);
6013
6014 case KEY_ge:
6015 Rop(OP_SGE);
6016
6017 case KEY_grep:
2c38e13d 6018 LOP(OP_GREPSTART, XREF);
79072805
LW
6019
6020 case KEY_goto:
a0d0e21e 6021 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6022 LOOPX(OP_GOTO);
6023
6024 case KEY_gmtime:
6025 UNI(OP_GMTIME);
6026
6027 case KEY_getc:
6f33ba73 6028 UNIDOR(OP_GETC);
79072805
LW
6029
6030 case KEY_getppid:
6031 FUN0(OP_GETPPID);
6032
6033 case KEY_getpgrp:
6034 UNI(OP_GETPGRP);
6035
6036 case KEY_getpriority:
a0d0e21e 6037 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
6038
6039 case KEY_getprotobyname:
6040 UNI(OP_GPBYNAME);
6041
6042 case KEY_getprotobynumber:
a0d0e21e 6043 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
6044
6045 case KEY_getprotoent:
6046 FUN0(OP_GPROTOENT);
6047
6048 case KEY_getpwent:
6049 FUN0(OP_GPWENT);
6050
6051 case KEY_getpwnam:
ff68c719 6052 UNI(OP_GPWNAM);
79072805
LW
6053
6054 case KEY_getpwuid:
ff68c719 6055 UNI(OP_GPWUID);
79072805
LW
6056
6057 case KEY_getpeername:
6058 UNI(OP_GETPEERNAME);
6059
6060 case KEY_gethostbyname:
6061 UNI(OP_GHBYNAME);
6062
6063 case KEY_gethostbyaddr:
a0d0e21e 6064 LOP(OP_GHBYADDR,XTERM);
79072805
LW
6065
6066 case KEY_gethostent:
6067 FUN0(OP_GHOSTENT);
6068
6069 case KEY_getnetbyname:
6070 UNI(OP_GNBYNAME);
6071
6072 case KEY_getnetbyaddr:
a0d0e21e 6073 LOP(OP_GNBYADDR,XTERM);
79072805
LW
6074
6075 case KEY_getnetent:
6076 FUN0(OP_GNETENT);
6077
6078 case KEY_getservbyname:
a0d0e21e 6079 LOP(OP_GSBYNAME,XTERM);
79072805
LW
6080
6081 case KEY_getservbyport:
a0d0e21e 6082 LOP(OP_GSBYPORT,XTERM);
79072805
LW
6083
6084 case KEY_getservent:
6085 FUN0(OP_GSERVENT);
6086
6087 case KEY_getsockname:
6088 UNI(OP_GETSOCKNAME);
6089
6090 case KEY_getsockopt:
a0d0e21e 6091 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
6092
6093 case KEY_getgrent:
6094 FUN0(OP_GGRENT);
6095
6096 case KEY_getgrnam:
ff68c719 6097 UNI(OP_GGRNAM);
79072805
LW
6098
6099 case KEY_getgrgid:
ff68c719 6100 UNI(OP_GGRGID);
79072805
LW
6101
6102 case KEY_getlogin:
6103 FUN0(OP_GETLOGIN);
6104
0d863452
RH
6105 case KEY_given:
6106 yylval.ival = CopLINE(PL_curcop);
6107 OPERATOR(GIVEN);
6108
93a17b20 6109 case KEY_glob:
a0d0e21e
LW
6110 set_csh();
6111 LOP(OP_GLOB,XTERM);
93a17b20 6112
79072805
LW
6113 case KEY_hex:
6114 UNI(OP_HEX);
6115
6116 case KEY_if:
57843af0 6117 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6118 OPERATOR(IF);
6119
6120 case KEY_index:
a0d0e21e 6121 LOP(OP_INDEX,XTERM);
79072805
LW
6122
6123 case KEY_int:
6124 UNI(OP_INT);
6125
6126 case KEY_ioctl:
a0d0e21e 6127 LOP(OP_IOCTL,XTERM);
79072805
LW
6128
6129 case KEY_join:
a0d0e21e 6130 LOP(OP_JOIN,XTERM);
79072805
LW
6131
6132 case KEY_keys:
6133 UNI(OP_KEYS);
6134
6135 case KEY_kill:
a0d0e21e 6136 LOP(OP_KILL,XTERM);
79072805
LW
6137
6138 case KEY_last:
a0d0e21e 6139 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 6140 LOOPX(OP_LAST);
4e553d73 6141
79072805
LW
6142 case KEY_lc:
6143 UNI(OP_LC);
6144
6145 case KEY_lcfirst:
6146 UNI(OP_LCFIRST);
6147
6148 case KEY_local:
09bef843 6149 yylval.ival = 0;
79072805
LW
6150 OPERATOR(LOCAL);
6151
6152 case KEY_length:
6153 UNI(OP_LENGTH);
6154
6155 case KEY_lt:
6156 Rop(OP_SLT);
6157
6158 case KEY_le:
6159 Rop(OP_SLE);
6160
6161 case KEY_localtime:
6162 UNI(OP_LOCALTIME);
6163
6164 case KEY_log:
6165 UNI(OP_LOG);
6166
6167 case KEY_link:
a0d0e21e 6168 LOP(OP_LINK,XTERM);
79072805
LW
6169
6170 case KEY_listen:
a0d0e21e 6171 LOP(OP_LISTEN,XTERM);
79072805 6172
c0329465
MB
6173 case KEY_lock:
6174 UNI(OP_LOCK);
6175
79072805
LW
6176 case KEY_lstat:
6177 UNI(OP_LSTAT);
6178
6179 case KEY_m:
8782bef2 6180 s = scan_pat(s,OP_MATCH);
79072805
LW
6181 TERM(sublex_start());
6182
a0d0e21e 6183 case KEY_map:
2c38e13d 6184 LOP(OP_MAPSTART, XREF);
4e4e412b 6185
79072805 6186 case KEY_mkdir:
a0d0e21e 6187 LOP(OP_MKDIR,XTERM);
79072805
LW
6188
6189 case KEY_msgctl:
a0d0e21e 6190 LOP(OP_MSGCTL,XTERM);
79072805
LW
6191
6192 case KEY_msgget:
a0d0e21e 6193 LOP(OP_MSGGET,XTERM);
79072805
LW
6194
6195 case KEY_msgrcv:
a0d0e21e 6196 LOP(OP_MSGRCV,XTERM);
79072805
LW
6197
6198 case KEY_msgsnd:
a0d0e21e 6199 LOP(OP_MSGSND,XTERM);
79072805 6200
77ca0c92 6201 case KEY_our:
93a17b20 6202 case KEY_my:
952306ac 6203 case KEY_state:
eac04b2e 6204 PL_in_my = (U16)tmp;
29595ff2 6205 s = SKIPSPACE1(s);
7e2040f0 6206 if (isIDFIRST_lazy_if(s,UTF)) {
5db06880
NC
6207#ifdef PERL_MAD
6208 char* start = s;
6209#endif
3280af22 6210 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
6211 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
6212 goto really_sub;
def3634b 6213 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 6214 if (!PL_in_my_stash) {
c750a3ec 6215 char tmpbuf[1024];
3280af22 6216 PL_bufptr = s;
d9fad198 6217 my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
6218 yyerror(tmpbuf);
6219 }
5db06880
NC
6220#ifdef PERL_MAD
6221 if (PL_madskills) { /* just add type to declarator token */
cd81e915
NC
6222 sv_catsv(PL_thistoken, PL_nextwhite);
6223 PL_nextwhite = 0;
6224 sv_catpvn(PL_thistoken, start, s - start);
5db06880
NC
6225 }
6226#endif
c750a3ec 6227 }
09bef843 6228 yylval.ival = 1;
55497cff 6229 OPERATOR(MY);
93a17b20 6230
79072805 6231 case KEY_next:
a0d0e21e 6232 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6233 LOOPX(OP_NEXT);
6234
6235 case KEY_ne:
6236 Eop(OP_SNE);
6237
a0d0e21e 6238 case KEY_no:
468aa647 6239 s = tokenize_use(0, s);
a0d0e21e
LW
6240 OPERATOR(USE);
6241
6242 case KEY_not:
29595ff2 6243 if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
2d2e263d
LW
6244 FUN1(OP_NOT);
6245 else
6246 OPERATOR(NOTOP);
a0d0e21e 6247
79072805 6248 case KEY_open:
29595ff2 6249 s = SKIPSPACE1(s);
7e2040f0 6250 if (isIDFIRST_lazy_if(s,UTF)) {
f54cb97a 6251 const char *t;
c35e046a
AL
6252 for (d = s; isALNUM_lazy_if(d,UTF);)
6253 d++;
6254 for (t=d; isSPACE(*t);)
6255 t++;
e2ab214b 6256 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
6257 /* [perl #16184] */
6258 && !(t[0] == '=' && t[1] == '>')
6259 ) {
5f66b61c 6260 int parms_len = (int)(d-s);
9014280d 6261 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 6262 "Precedence problem: open %.*s should be open(%.*s)",
5f66b61c 6263 parms_len, s, parms_len, s);
66fbe8fb 6264 }
93a17b20 6265 }
a0d0e21e 6266 LOP(OP_OPEN,XTERM);
79072805 6267
463ee0b2 6268 case KEY_or:
a0d0e21e 6269 yylval.ival = OP_OR;
463ee0b2
LW
6270 OPERATOR(OROP);
6271
79072805
LW
6272 case KEY_ord:
6273 UNI(OP_ORD);
6274
6275 case KEY_oct:
6276 UNI(OP_OCT);
6277
6278 case KEY_opendir:
a0d0e21e 6279 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
6280
6281 case KEY_print:
3280af22 6282 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6283 LOP(OP_PRINT,XREF);
79072805
LW
6284
6285 case KEY_printf:
3280af22 6286 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6287 LOP(OP_PRTF,XREF);
79072805 6288
c07a80fd 6289 case KEY_prototype:
6290 UNI(OP_PROTOTYPE);
6291
79072805 6292 case KEY_push:
a0d0e21e 6293 LOP(OP_PUSH,XTERM);
79072805
LW
6294
6295 case KEY_pop:
6f33ba73 6296 UNIDOR(OP_POP);
79072805 6297
a0d0e21e 6298 case KEY_pos:
6f33ba73 6299 UNIDOR(OP_POS);
4e553d73 6300
79072805 6301 case KEY_pack:
a0d0e21e 6302 LOP(OP_PACK,XTERM);
79072805
LW
6303
6304 case KEY_package:
a0d0e21e 6305 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
6306 OPERATOR(PACKAGE);
6307
6308 case KEY_pipe:
a0d0e21e 6309 LOP(OP_PIPE_OP,XTERM);
79072805
LW
6310
6311 case KEY_q:
5db06880 6312 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6313 if (!s)
d4c19fe8 6314 missingterm(NULL);
79072805
LW
6315 yylval.ival = OP_CONST;
6316 TERM(sublex_start());
6317
a0d0e21e
LW
6318 case KEY_quotemeta:
6319 UNI(OP_QUOTEMETA);
6320
8990e307 6321 case KEY_qw:
5db06880 6322 s = scan_str(s,!!PL_madskills,FALSE);
8990e307 6323 if (!s)
d4c19fe8 6324 missingterm(NULL);
3480a8d2 6325 PL_expect = XOPERATOR;
8127e0e3
GS
6326 force_next(')');
6327 if (SvCUR(PL_lex_stuff)) {
5f66b61c 6328 OP *words = NULL;
8127e0e3 6329 int warned = 0;
3280af22 6330 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 6331 while (len) {
d4c19fe8
AL
6332 for (; isSPACE(*d) && len; --len, ++d)
6333 /**/;
8127e0e3 6334 if (len) {
d4c19fe8 6335 SV *sv;
f54cb97a 6336 const char *b = d;
e476b1b5 6337 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
6338 for (; !isSPACE(*d) && len; --len, ++d) {
6339 if (*d == ',') {
9014280d 6340 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6341 "Possible attempt to separate words with commas");
6342 ++warned;
6343 }
6344 else if (*d == '#') {
9014280d 6345 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6346 "Possible attempt to put comments in qw() list");
6347 ++warned;
6348 }
6349 }
6350 }
6351 else {
d4c19fe8
AL
6352 for (; !isSPACE(*d) && len; --len, ++d)
6353 /**/;
8127e0e3 6354 }
7948272d
NIS
6355 sv = newSVpvn(b, d-b);
6356 if (DO_UTF8(PL_lex_stuff))
6357 SvUTF8_on(sv);
8127e0e3 6358 words = append_elem(OP_LIST, words,
7948272d 6359 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 6360 }
6361 }
8127e0e3 6362 if (words) {
cd81e915 6363 start_force(PL_curforce);
9ded7720 6364 NEXTVAL_NEXTTOKE.opval = words;
8127e0e3
GS
6365 force_next(THING);
6366 }
55497cff 6367 }
37fd879b 6368 if (PL_lex_stuff) {
8127e0e3 6369 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 6370 PL_lex_stuff = NULL;
37fd879b 6371 }
3280af22 6372 PL_expect = XTERM;
8127e0e3 6373 TOKEN('(');
8990e307 6374
79072805 6375 case KEY_qq:
5db06880 6376 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6377 if (!s)
d4c19fe8 6378 missingterm(NULL);
a0d0e21e 6379 yylval.ival = OP_STRINGIFY;
3280af22 6380 if (SvIVX(PL_lex_stuff) == '\'')
45977657 6381 SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should intepolate */
79072805
LW
6382 TERM(sublex_start());
6383
8782bef2
GB
6384 case KEY_qr:
6385 s = scan_pat(s,OP_QR);
6386 TERM(sublex_start());
6387
79072805 6388 case KEY_qx:
5db06880 6389 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6390 if (!s)
d4c19fe8 6391 missingterm(NULL);
9b201d7d 6392 readpipe_override();
79072805
LW
6393 TERM(sublex_start());
6394
6395 case KEY_return:
6396 OLDLOP(OP_RETURN);
6397
6398 case KEY_require:
29595ff2 6399 s = SKIPSPACE1(s);
e759cc13
RGS
6400 if (isDIGIT(*s)) {
6401 s = force_version(s, FALSE);
a7cb1f99 6402 }
e759cc13
RGS
6403 else if (*s != 'v' || !isDIGIT(s[1])
6404 || (s = force_version(s, TRUE), *s == 'v'))
6405 {
a7cb1f99
GS
6406 *PL_tokenbuf = '\0';
6407 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 6408 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
da51bb9b 6409 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
a7cb1f99
GS
6410 else if (*s == '<')
6411 yyerror("<> should be quotes");
6412 }
a72a1c8b
RGS
6413 if (orig_keyword == KEY_require) {
6414 orig_keyword = 0;
6415 yylval.ival = 1;
6416 }
6417 else
6418 yylval.ival = 0;
6419 PL_expect = XTERM;
6420 PL_bufptr = s;
6421 PL_last_uni = PL_oldbufptr;
6422 PL_last_lop_op = OP_REQUIRE;
6423 s = skipspace(s);
6424 return REPORT( (int)REQUIRE );
79072805
LW
6425
6426 case KEY_reset:
6427 UNI(OP_RESET);
6428
6429 case KEY_redo:
a0d0e21e 6430 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6431 LOOPX(OP_REDO);
6432
6433 case KEY_rename:
a0d0e21e 6434 LOP(OP_RENAME,XTERM);
79072805
LW
6435
6436 case KEY_rand:
6437 UNI(OP_RAND);
6438
6439 case KEY_rmdir:
6440 UNI(OP_RMDIR);
6441
6442 case KEY_rindex:
a0d0e21e 6443 LOP(OP_RINDEX,XTERM);
79072805
LW
6444
6445 case KEY_read:
a0d0e21e 6446 LOP(OP_READ,XTERM);
79072805
LW
6447
6448 case KEY_readdir:
6449 UNI(OP_READDIR);
6450
93a17b20
LW
6451 case KEY_readline:
6452 set_csh();
6f33ba73 6453 UNIDOR(OP_READLINE);
93a17b20
LW
6454
6455 case KEY_readpipe:
6456 set_csh();
0858480c 6457 UNIDOR(OP_BACKTICK);
93a17b20 6458
79072805
LW
6459 case KEY_rewinddir:
6460 UNI(OP_REWINDDIR);
6461
6462 case KEY_recv:
a0d0e21e 6463 LOP(OP_RECV,XTERM);
79072805
LW
6464
6465 case KEY_reverse:
a0d0e21e 6466 LOP(OP_REVERSE,XTERM);
79072805
LW
6467
6468 case KEY_readlink:
6f33ba73 6469 UNIDOR(OP_READLINK);
79072805
LW
6470
6471 case KEY_ref:
6472 UNI(OP_REF);
6473
6474 case KEY_s:
6475 s = scan_subst(s);
6476 if (yylval.opval)
6477 TERM(sublex_start());
6478 else
6479 TOKEN(1); /* force error */
6480
0d863452
RH
6481 case KEY_say:
6482 checkcomma(s,PL_tokenbuf,"filehandle");
6483 LOP(OP_SAY,XREF);
6484
a0d0e21e
LW
6485 case KEY_chomp:
6486 UNI(OP_CHOMP);
4e553d73 6487
79072805
LW
6488 case KEY_scalar:
6489 UNI(OP_SCALAR);
6490
6491 case KEY_select:
a0d0e21e 6492 LOP(OP_SELECT,XTERM);
79072805
LW
6493
6494 case KEY_seek:
a0d0e21e 6495 LOP(OP_SEEK,XTERM);
79072805
LW
6496
6497 case KEY_semctl:
a0d0e21e 6498 LOP(OP_SEMCTL,XTERM);
79072805
LW
6499
6500 case KEY_semget:
a0d0e21e 6501 LOP(OP_SEMGET,XTERM);
79072805
LW
6502
6503 case KEY_semop:
a0d0e21e 6504 LOP(OP_SEMOP,XTERM);
79072805
LW
6505
6506 case KEY_send:
a0d0e21e 6507 LOP(OP_SEND,XTERM);
79072805
LW
6508
6509 case KEY_setpgrp:
a0d0e21e 6510 LOP(OP_SETPGRP,XTERM);
79072805
LW
6511
6512 case KEY_setpriority:
a0d0e21e 6513 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
6514
6515 case KEY_sethostent:
ff68c719 6516 UNI(OP_SHOSTENT);
79072805
LW
6517
6518 case KEY_setnetent:
ff68c719 6519 UNI(OP_SNETENT);
79072805
LW
6520
6521 case KEY_setservent:
ff68c719 6522 UNI(OP_SSERVENT);
79072805
LW
6523
6524 case KEY_setprotoent:
ff68c719 6525 UNI(OP_SPROTOENT);
79072805
LW
6526
6527 case KEY_setpwent:
6528 FUN0(OP_SPWENT);
6529
6530 case KEY_setgrent:
6531 FUN0(OP_SGRENT);
6532
6533 case KEY_seekdir:
a0d0e21e 6534 LOP(OP_SEEKDIR,XTERM);
79072805
LW
6535
6536 case KEY_setsockopt:
a0d0e21e 6537 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
6538
6539 case KEY_shift:
6f33ba73 6540 UNIDOR(OP_SHIFT);
79072805
LW
6541
6542 case KEY_shmctl:
a0d0e21e 6543 LOP(OP_SHMCTL,XTERM);
79072805
LW
6544
6545 case KEY_shmget:
a0d0e21e 6546 LOP(OP_SHMGET,XTERM);
79072805
LW
6547
6548 case KEY_shmread:
a0d0e21e 6549 LOP(OP_SHMREAD,XTERM);
79072805
LW
6550
6551 case KEY_shmwrite:
a0d0e21e 6552 LOP(OP_SHMWRITE,XTERM);
79072805
LW
6553
6554 case KEY_shutdown:
a0d0e21e 6555 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
6556
6557 case KEY_sin:
6558 UNI(OP_SIN);
6559
6560 case KEY_sleep:
6561 UNI(OP_SLEEP);
6562
6563 case KEY_socket:
a0d0e21e 6564 LOP(OP_SOCKET,XTERM);
79072805
LW
6565
6566 case KEY_socketpair:
a0d0e21e 6567 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
6568
6569 case KEY_sort:
3280af22 6570 checkcomma(s,PL_tokenbuf,"subroutine name");
29595ff2 6571 s = SKIPSPACE1(s);
79072805 6572 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 6573 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 6574 PL_expect = XTERM;
15f0808c 6575 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 6576 LOP(OP_SORT,XREF);
79072805
LW
6577
6578 case KEY_split:
a0d0e21e 6579 LOP(OP_SPLIT,XTERM);
79072805
LW
6580
6581 case KEY_sprintf:
a0d0e21e 6582 LOP(OP_SPRINTF,XTERM);
79072805
LW
6583
6584 case KEY_splice:
a0d0e21e 6585 LOP(OP_SPLICE,XTERM);
79072805
LW
6586
6587 case KEY_sqrt:
6588 UNI(OP_SQRT);
6589
6590 case KEY_srand:
6591 UNI(OP_SRAND);
6592
6593 case KEY_stat:
6594 UNI(OP_STAT);
6595
6596 case KEY_study:
79072805
LW
6597 UNI(OP_STUDY);
6598
6599 case KEY_substr:
a0d0e21e 6600 LOP(OP_SUBSTR,XTERM);
79072805
LW
6601
6602 case KEY_format:
6603 case KEY_sub:
93a17b20 6604 really_sub:
09bef843 6605 {
3280af22 6606 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 6607 SSize_t tboffset = 0;
09bef843 6608 expectation attrful;
28cc6278 6609 bool have_name, have_proto;
f54cb97a 6610 const int key = tmp;
09bef843 6611
5db06880
NC
6612#ifdef PERL_MAD
6613 SV *tmpwhite = 0;
6614
cd81e915 6615 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5db06880 6616 SV *subtoken = newSVpvn(tstart, s - tstart);
cd81e915 6617 PL_thistoken = 0;
5db06880
NC
6618
6619 d = s;
6620 s = SKIPSPACE2(s,tmpwhite);
6621#else
09bef843 6622 s = skipspace(s);
5db06880 6623#endif
09bef843 6624
7e2040f0 6625 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
6626 (*s == ':' && s[1] == ':'))
6627 {
5db06880
NC
6628#ifdef PERL_MAD
6629 SV *nametoke;
6630#endif
6631
09bef843
SB
6632 PL_expect = XBLOCK;
6633 attrful = XATTRBLOCK;
b1b65b59
JH
6634 /* remember buffer pos'n for later force_word */
6635 tboffset = s - PL_oldbufptr;
09bef843 6636 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5db06880
NC
6637#ifdef PERL_MAD
6638 if (PL_madskills)
6639 nametoke = newSVpvn(s, d - s);
6640#endif
6502358f
NC
6641 if (memchr(tmpbuf, ':', len))
6642 sv_setpvn(PL_subname, tmpbuf, len);
09bef843
SB
6643 else {
6644 sv_setsv(PL_subname,PL_curstname);
396482e1 6645 sv_catpvs(PL_subname,"::");
09bef843
SB
6646 sv_catpvn(PL_subname,tmpbuf,len);
6647 }
09bef843 6648 have_name = TRUE;
5db06880
NC
6649
6650#ifdef PERL_MAD
6651
6652 start_force(0);
6653 CURMAD('X', nametoke);
6654 CURMAD('_', tmpwhite);
6655 (void) force_word(PL_oldbufptr + tboffset, WORD,
6656 FALSE, TRUE, TRUE);
6657
6658 s = SKIPSPACE2(d,tmpwhite);
6659#else
6660 s = skipspace(d);
6661#endif
09bef843 6662 }
463ee0b2 6663 else {
09bef843
SB
6664 if (key == KEY_my)
6665 Perl_croak(aTHX_ "Missing name in \"my sub\"");
6666 PL_expect = XTERMBLOCK;
6667 attrful = XATTRTERM;
c69006e4 6668 sv_setpvn(PL_subname,"?",1);
09bef843 6669 have_name = FALSE;
463ee0b2 6670 }
4633a7c4 6671
09bef843
SB
6672 if (key == KEY_format) {
6673 if (*s == '=')
6674 PL_lex_formbrack = PL_lex_brackets + 1;
5db06880 6675#ifdef PERL_MAD
cd81e915 6676 PL_thistoken = subtoken;
5db06880
NC
6677 s = d;
6678#else
09bef843 6679 if (have_name)
b1b65b59
JH
6680 (void) force_word(PL_oldbufptr + tboffset, WORD,
6681 FALSE, TRUE, TRUE);
5db06880 6682#endif
09bef843
SB
6683 OPERATOR(FORMAT);
6684 }
79072805 6685
09bef843
SB
6686 /* Look for a prototype */
6687 if (*s == '(') {
d9f2850e
RGS
6688 char *p;
6689 bool bad_proto = FALSE;
6690 const bool warnsyntax = ckWARN(WARN_SYNTAX);
09bef843 6691
5db06880 6692 s = scan_str(s,!!PL_madskills,FALSE);
37fd879b 6693 if (!s)
09bef843 6694 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 6695 /* strip spaces and check for bad characters */
09bef843
SB
6696 d = SvPVX(PL_lex_stuff);
6697 tmp = 0;
d9f2850e
RGS
6698 for (p = d; *p; ++p) {
6699 if (!isSPACE(*p)) {
6700 d[tmp++] = *p;
b13fd70a 6701 if (warnsyntax && !strchr("$@%*;[]&\\_", *p))
d9f2850e 6702 bad_proto = TRUE;
d37a9538 6703 }
09bef843 6704 }
d9f2850e
RGS
6705 d[tmp] = '\0';
6706 if (bad_proto)
6707 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6708 "Illegal character in prototype for %"SVf" : %s",
be2597df 6709 SVfARG(PL_subname), d);
b162af07 6710 SvCUR_set(PL_lex_stuff, tmp);
09bef843 6711 have_proto = TRUE;
68dc0745 6712
5db06880
NC
6713#ifdef PERL_MAD
6714 start_force(0);
cd81e915 6715 CURMAD('q', PL_thisopen);
5db06880 6716 CURMAD('_', tmpwhite);
cd81e915
NC
6717 CURMAD('=', PL_thisstuff);
6718 CURMAD('Q', PL_thisclose);
5db06880
NC
6719 NEXTVAL_NEXTTOKE.opval =
6720 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
6721 PL_lex_stuff = Nullsv;
6722 force_next(THING);
6723
6724 s = SKIPSPACE2(s,tmpwhite);
6725#else
09bef843 6726 s = skipspace(s);
5db06880 6727#endif
4633a7c4 6728 }
09bef843
SB
6729 else
6730 have_proto = FALSE;
6731
6732 if (*s == ':' && s[1] != ':')
6733 PL_expect = attrful;
8e742a20
MHM
6734 else if (*s != '{' && key == KEY_sub) {
6735 if (!have_name)
6736 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
6737 else if (*s != ';')
be2597df 6738 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
8e742a20 6739 }
09bef843 6740
5db06880
NC
6741#ifdef PERL_MAD
6742 start_force(0);
6743 if (tmpwhite) {
6744 if (PL_madskills)
6b29d1f5 6745 curmad('^', newSVpvs(""));
5db06880
NC
6746 CURMAD('_', tmpwhite);
6747 }
6748 force_next(0);
6749
cd81e915 6750 PL_thistoken = subtoken;
5db06880 6751#else
09bef843 6752 if (have_proto) {
9ded7720 6753 NEXTVAL_NEXTTOKE.opval =
b1b65b59 6754 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
a0714e2c 6755 PL_lex_stuff = NULL;
09bef843 6756 force_next(THING);
68dc0745 6757 }
5db06880 6758#endif
09bef843 6759 if (!have_name) {
c99da370 6760 sv_setpv(PL_subname,
10edeb5d
JH
6761 (const char *)
6762 (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"));
09bef843 6763 TOKEN(ANONSUB);
4633a7c4 6764 }
5db06880 6765#ifndef PERL_MAD
b1b65b59
JH
6766 (void) force_word(PL_oldbufptr + tboffset, WORD,
6767 FALSE, TRUE, TRUE);
5db06880 6768#endif
09bef843
SB
6769 if (key == KEY_my)
6770 TOKEN(MYSUB);
6771 TOKEN(SUB);
4633a7c4 6772 }
79072805
LW
6773
6774 case KEY_system:
6775 set_csh();
a0d0e21e 6776 LOP(OP_SYSTEM,XREF);
79072805
LW
6777
6778 case KEY_symlink:
a0d0e21e 6779 LOP(OP_SYMLINK,XTERM);
79072805
LW
6780
6781 case KEY_syscall:
a0d0e21e 6782 LOP(OP_SYSCALL,XTERM);
79072805 6783
c07a80fd 6784 case KEY_sysopen:
6785 LOP(OP_SYSOPEN,XTERM);
6786
137443ea 6787 case KEY_sysseek:
6788 LOP(OP_SYSSEEK,XTERM);
6789
79072805 6790 case KEY_sysread:
a0d0e21e 6791 LOP(OP_SYSREAD,XTERM);
79072805
LW
6792
6793 case KEY_syswrite:
a0d0e21e 6794 LOP(OP_SYSWRITE,XTERM);
79072805
LW
6795
6796 case KEY_tr:
6797 s = scan_trans(s);
6798 TERM(sublex_start());
6799
6800 case KEY_tell:
6801 UNI(OP_TELL);
6802
6803 case KEY_telldir:
6804 UNI(OP_TELLDIR);
6805
463ee0b2 6806 case KEY_tie:
a0d0e21e 6807 LOP(OP_TIE,XTERM);
463ee0b2 6808
c07a80fd 6809 case KEY_tied:
6810 UNI(OP_TIED);
6811
79072805
LW
6812 case KEY_time:
6813 FUN0(OP_TIME);
6814
6815 case KEY_times:
6816 FUN0(OP_TMS);
6817
6818 case KEY_truncate:
a0d0e21e 6819 LOP(OP_TRUNCATE,XTERM);
79072805
LW
6820
6821 case KEY_uc:
6822 UNI(OP_UC);
6823
6824 case KEY_ucfirst:
6825 UNI(OP_UCFIRST);
6826
463ee0b2
LW
6827 case KEY_untie:
6828 UNI(OP_UNTIE);
6829
79072805 6830 case KEY_until:
57843af0 6831 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6832 OPERATOR(UNTIL);
6833
6834 case KEY_unless:
57843af0 6835 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6836 OPERATOR(UNLESS);
6837
6838 case KEY_unlink:
a0d0e21e 6839 LOP(OP_UNLINK,XTERM);
79072805
LW
6840
6841 case KEY_undef:
6f33ba73 6842 UNIDOR(OP_UNDEF);
79072805
LW
6843
6844 case KEY_unpack:
a0d0e21e 6845 LOP(OP_UNPACK,XTERM);
79072805
LW
6846
6847 case KEY_utime:
a0d0e21e 6848 LOP(OP_UTIME,XTERM);
79072805
LW
6849
6850 case KEY_umask:
6f33ba73 6851 UNIDOR(OP_UMASK);
79072805
LW
6852
6853 case KEY_unshift:
a0d0e21e
LW
6854 LOP(OP_UNSHIFT,XTERM);
6855
6856 case KEY_use:
468aa647 6857 s = tokenize_use(1, s);
a0d0e21e 6858 OPERATOR(USE);
79072805
LW
6859
6860 case KEY_values:
6861 UNI(OP_VALUES);
6862
6863 case KEY_vec:
a0d0e21e 6864 LOP(OP_VEC,XTERM);
79072805 6865
0d863452
RH
6866 case KEY_when:
6867 yylval.ival = CopLINE(PL_curcop);
6868 OPERATOR(WHEN);
6869
79072805 6870 case KEY_while:
57843af0 6871 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6872 OPERATOR(WHILE);
6873
6874 case KEY_warn:
3280af22 6875 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 6876 LOP(OP_WARN,XTERM);
79072805
LW
6877
6878 case KEY_wait:
6879 FUN0(OP_WAIT);
6880
6881 case KEY_waitpid:
a0d0e21e 6882 LOP(OP_WAITPID,XTERM);
79072805
LW
6883
6884 case KEY_wantarray:
6885 FUN0(OP_WANTARRAY);
6886
6887 case KEY_write:
9d116dd7
JH
6888#ifdef EBCDIC
6889 {
df3728a2
JH
6890 char ctl_l[2];
6891 ctl_l[0] = toCTRL('L');
6892 ctl_l[1] = '\0';
fafc274c 6893 gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7
JH
6894 }
6895#else
fafc274c
NC
6896 /* Make sure $^L is defined */
6897 gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7 6898#endif
79072805
LW
6899 UNI(OP_ENTERWRITE);
6900
6901 case KEY_x:
3280af22 6902 if (PL_expect == XOPERATOR)
79072805
LW
6903 Mop(OP_REPEAT);
6904 check_uni();
6905 goto just_a_word;
6906
a0d0e21e
LW
6907 case KEY_xor:
6908 yylval.ival = OP_XOR;
6909 OPERATOR(OROP);
6910
79072805
LW
6911 case KEY_y:
6912 s = scan_trans(s);
6913 TERM(sublex_start());
6914 }
49dc05e3 6915 }}
79072805 6916}
bf4acbe4
GS
6917#ifdef __SC__
6918#pragma segment Main
6919#endif
79072805 6920
e930465f
JH
6921static int
6922S_pending_ident(pTHX)
8eceec63 6923{
97aff369 6924 dVAR;
8eceec63 6925 register char *d;
bbd11bfc 6926 PADOFFSET tmp = 0;
8eceec63
SC
6927 /* pit holds the identifier we read and pending_ident is reset */
6928 char pit = PL_pending_ident;
6929 PL_pending_ident = 0;
6930
cd81e915 6931 /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
8eceec63 6932 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 6933 "### Pending identifier '%s'\n", PL_tokenbuf); });
8eceec63
SC
6934
6935 /* if we're in a my(), we can't allow dynamics here.
6936 $foo'bar has already been turned into $foo::bar, so
6937 just check for colons.
6938
6939 if it's a legal name, the OP is a PADANY.
6940 */
6941 if (PL_in_my) {
6942 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
6943 if (strchr(PL_tokenbuf,':'))
6944 yyerror(Perl_form(aTHX_ "No package name allowed for "
6945 "variable %s in \"our\"",
6946 PL_tokenbuf));
dd2155a4 6947 tmp = allocmy(PL_tokenbuf);
8eceec63
SC
6948 }
6949 else {
6950 if (strchr(PL_tokenbuf,':'))
952306ac
RGS
6951 yyerror(Perl_form(aTHX_ PL_no_myglob,
6952 PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
8eceec63
SC
6953
6954 yylval.opval = newOP(OP_PADANY, 0);
dd2155a4 6955 yylval.opval->op_targ = allocmy(PL_tokenbuf);
8eceec63
SC
6956 return PRIVATEREF;
6957 }
6958 }
6959
6960 /*
6961 build the ops for accesses to a my() variable.
6962
6963 Deny my($a) or my($b) in a sort block, *if* $a or $b is
6964 then used in a comparison. This catches most, but not
6965 all cases. For instance, it catches
6966 sort { my($a); $a <=> $b }
6967 but not
6968 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
6969 (although why you'd do that is anyone's guess).
6970 */
6971
6972 if (!strchr(PL_tokenbuf,':')) {
8716503d
DM
6973 if (!PL_in_my)
6974 tmp = pad_findmy(PL_tokenbuf);
6975 if (tmp != NOT_IN_PAD) {
8eceec63 6976 /* might be an "our" variable" */
00b1698f 6977 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
8eceec63 6978 /* build ops for a bareword */
b64e5050
AL
6979 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
6980 HEK * const stashname = HvNAME_HEK(stash);
6981 SV * const sym = newSVhek(stashname);
396482e1 6982 sv_catpvs(sym, "::");
8eceec63
SC
6983 sv_catpv(sym, PL_tokenbuf+1);
6984 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
6985 yylval.opval->op_private = OPpCONST_ENTERED;
7a5fd60d 6986 gv_fetchsv(sym,
8eceec63
SC
6987 (PL_in_eval
6988 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 6989 : GV_ADDMULTI
8eceec63
SC
6990 ),
6991 ((PL_tokenbuf[0] == '$') ? SVt_PV
6992 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
6993 : SVt_PVHV));
6994 return WORD;
6995 }
6996
6997 /* if it's a sort block and they're naming $a or $b */
6998 if (PL_last_lop_op == OP_SORT &&
6999 PL_tokenbuf[0] == '$' &&
7000 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
7001 && !PL_tokenbuf[2])
7002 {
7003 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
7004 d < PL_bufend && *d != '\n';
7005 d++)
7006 {
7007 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
7008 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
7009 PL_tokenbuf);
7010 }
7011 }
7012 }
7013
7014 yylval.opval = newOP(OP_PADANY, 0);
7015 yylval.opval->op_targ = tmp;
7016 return PRIVATEREF;
7017 }
7018 }
7019
7020 /*
7021 Whine if they've said @foo in a doublequoted string,
7022 and @foo isn't a variable we can find in the symbol
7023 table.
7024 */
7025 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
f776e3cd 7026 GV *gv = gv_fetchpv(PL_tokenbuf+1, 0, SVt_PVAV);
8eceec63 7027 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
e879d94f
RGS
7028 && ckWARN(WARN_AMBIGUOUS)
7029 /* DO NOT warn for @- and @+ */
7030 && !( PL_tokenbuf[2] == '\0' &&
7031 ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7032 )
8eceec63
SC
7033 {
7034 /* Downgraded from fatal to warning 20000522 mjd */
9014280d 7035 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8eceec63
SC
7036 "Possible unintended interpolation of %s in string",
7037 PL_tokenbuf);
7038 }
7039 }
7040
7041 /* build ops for a bareword */
7042 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
7043 yylval.opval->op_private = OPpCONST_ENTERED;
adc51b97
RGS
7044 gv_fetchpv(
7045 PL_tokenbuf+1,
d6069db2
RGS
7046 /* If the identifier refers to a stash, don't autovivify it.
7047 * Change 24660 had the side effect of causing symbol table
7048 * hashes to always be defined, even if they were freshly
7049 * created and the only reference in the entire program was
7050 * the single statement with the defined %foo::bar:: test.
7051 * It appears that all code in the wild doing this actually
7052 * wants to know whether sub-packages have been loaded, so
7053 * by avoiding auto-vivifying symbol tables, we ensure that
7054 * defined %foo::bar:: continues to be false, and the existing
7055 * tests still give the expected answers, even though what
7056 * they're actually testing has now changed subtly.
7057 */
7058 (*PL_tokenbuf == '%' && *(d = PL_tokenbuf + strlen(PL_tokenbuf) - 1) == ':' && d[-1] == ':'
7059 ? 0
7060 : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
adc51b97
RGS
7061 ((PL_tokenbuf[0] == '$') ? SVt_PV
7062 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7063 : SVt_PVHV));
8eceec63
SC
7064 return WORD;
7065}
7066
4c3bbe0f
MHM
7067/*
7068 * The following code was generated by perl_keyword.pl.
7069 */
e2e1dd5a 7070
79072805 7071I32
5458a98a 7072Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
4c3bbe0f 7073{
952306ac 7074 dVAR;
4c3bbe0f
MHM
7075 switch (len)
7076 {
7077 case 1: /* 5 tokens of length 1 */
7078 switch (name[0])
e2e1dd5a 7079 {
4c3bbe0f
MHM
7080 case 'm':
7081 { /* m */
7082 return KEY_m;
7083 }
7084
4c3bbe0f
MHM
7085 case 'q':
7086 { /* q */
7087 return KEY_q;
7088 }
7089
4c3bbe0f
MHM
7090 case 's':
7091 { /* s */
7092 return KEY_s;
7093 }
7094
4c3bbe0f
MHM
7095 case 'x':
7096 { /* x */
7097 return -KEY_x;
7098 }
7099
4c3bbe0f
MHM
7100 case 'y':
7101 { /* y */
7102 return KEY_y;
7103 }
7104
4c3bbe0f
MHM
7105 default:
7106 goto unknown;
e2e1dd5a 7107 }
4c3bbe0f
MHM
7108
7109 case 2: /* 18 tokens of length 2 */
7110 switch (name[0])
e2e1dd5a 7111 {
4c3bbe0f
MHM
7112 case 'd':
7113 if (name[1] == 'o')
7114 { /* do */
7115 return KEY_do;
7116 }
7117
7118 goto unknown;
7119
7120 case 'e':
7121 if (name[1] == 'q')
7122 { /* eq */
7123 return -KEY_eq;
7124 }
7125
7126 goto unknown;
7127
7128 case 'g':
7129 switch (name[1])
7130 {
7131 case 'e':
7132 { /* ge */
7133 return -KEY_ge;
7134 }
7135
4c3bbe0f
MHM
7136 case 't':
7137 { /* gt */
7138 return -KEY_gt;
7139 }
7140
4c3bbe0f
MHM
7141 default:
7142 goto unknown;
7143 }
7144
7145 case 'i':
7146 if (name[1] == 'f')
7147 { /* if */
7148 return KEY_if;
7149 }
7150
7151 goto unknown;
7152
7153 case 'l':
7154 switch (name[1])
7155 {
7156 case 'c':
7157 { /* lc */
7158 return -KEY_lc;
7159 }
7160
4c3bbe0f
MHM
7161 case 'e':
7162 { /* le */
7163 return -KEY_le;
7164 }
7165
4c3bbe0f
MHM
7166 case 't':
7167 { /* lt */
7168 return -KEY_lt;
7169 }
7170
4c3bbe0f
MHM
7171 default:
7172 goto unknown;
7173 }
7174
7175 case 'm':
7176 if (name[1] == 'y')
7177 { /* my */
7178 return KEY_my;
7179 }
7180
7181 goto unknown;
7182
7183 case 'n':
7184 switch (name[1])
7185 {
7186 case 'e':
7187 { /* ne */
7188 return -KEY_ne;
7189 }
7190
4c3bbe0f
MHM
7191 case 'o':
7192 { /* no */
7193 return KEY_no;
7194 }
7195
4c3bbe0f
MHM
7196 default:
7197 goto unknown;
7198 }
7199
7200 case 'o':
7201 if (name[1] == 'r')
7202 { /* or */
7203 return -KEY_or;
7204 }
7205
7206 goto unknown;
7207
7208 case 'q':
7209 switch (name[1])
7210 {
7211 case 'q':
7212 { /* qq */
7213 return KEY_qq;
7214 }
7215
4c3bbe0f
MHM
7216 case 'r':
7217 { /* qr */
7218 return KEY_qr;
7219 }
7220
4c3bbe0f
MHM
7221 case 'w':
7222 { /* qw */
7223 return KEY_qw;
7224 }
7225
4c3bbe0f
MHM
7226 case 'x':
7227 { /* qx */
7228 return KEY_qx;
7229 }
7230
4c3bbe0f
MHM
7231 default:
7232 goto unknown;
7233 }
7234
7235 case 't':
7236 if (name[1] == 'r')
7237 { /* tr */
7238 return KEY_tr;
7239 }
7240
7241 goto unknown;
7242
7243 case 'u':
7244 if (name[1] == 'c')
7245 { /* uc */
7246 return -KEY_uc;
7247 }
7248
7249 goto unknown;
7250
7251 default:
7252 goto unknown;
e2e1dd5a 7253 }
4c3bbe0f 7254
0d863452 7255 case 3: /* 29 tokens of length 3 */
4c3bbe0f 7256 switch (name[0])
e2e1dd5a 7257 {
4c3bbe0f
MHM
7258 case 'E':
7259 if (name[1] == 'N' &&
7260 name[2] == 'D')
7261 { /* END */
7262 return KEY_END;
7263 }
7264
7265 goto unknown;
7266
7267 case 'a':
7268 switch (name[1])
7269 {
7270 case 'b':
7271 if (name[2] == 's')
7272 { /* abs */
7273 return -KEY_abs;
7274 }
7275
7276 goto unknown;
7277
7278 case 'n':
7279 if (name[2] == 'd')
7280 { /* and */
7281 return -KEY_and;
7282 }
7283
7284 goto unknown;
7285
7286 default:
7287 goto unknown;
7288 }
7289
7290 case 'c':
7291 switch (name[1])
7292 {
7293 case 'h':
7294 if (name[2] == 'r')
7295 { /* chr */
7296 return -KEY_chr;
7297 }
7298
7299 goto unknown;
7300
7301 case 'm':
7302 if (name[2] == 'p')
7303 { /* cmp */
7304 return -KEY_cmp;
7305 }
7306
7307 goto unknown;
7308
7309 case 'o':
7310 if (name[2] == 's')
7311 { /* cos */
7312 return -KEY_cos;
7313 }
7314
7315 goto unknown;
7316
7317 default:
7318 goto unknown;
7319 }
7320
7321 case 'd':
7322 if (name[1] == 'i' &&
7323 name[2] == 'e')
7324 { /* die */
7325 return -KEY_die;
7326 }
7327
7328 goto unknown;
7329
7330 case 'e':
7331 switch (name[1])
7332 {
7333 case 'o':
7334 if (name[2] == 'f')
7335 { /* eof */
7336 return -KEY_eof;
7337 }
7338
7339 goto unknown;
7340
7341 case 'r':
7342 if (name[2] == 'r')
7343 { /* err */
5458a98a 7344 return (all_keywords || FEATURE_IS_ENABLED("err") ? -KEY_err : 0);
4c3bbe0f
MHM
7345 }
7346
7347 goto unknown;
7348
7349 case 'x':
7350 if (name[2] == 'p')
7351 { /* exp */
7352 return -KEY_exp;
7353 }
7354
7355 goto unknown;
7356
7357 default:
7358 goto unknown;
7359 }
7360
7361 case 'f':
7362 if (name[1] == 'o' &&
7363 name[2] == 'r')
7364 { /* for */
7365 return KEY_for;
7366 }
7367
7368 goto unknown;
7369
7370 case 'h':
7371 if (name[1] == 'e' &&
7372 name[2] == 'x')
7373 { /* hex */
7374 return -KEY_hex;
7375 }
7376
7377 goto unknown;
7378
7379 case 'i':
7380 if (name[1] == 'n' &&
7381 name[2] == 't')
7382 { /* int */
7383 return -KEY_int;
7384 }
7385
7386 goto unknown;
7387
7388 case 'l':
7389 if (name[1] == 'o' &&
7390 name[2] == 'g')
7391 { /* log */
7392 return -KEY_log;
7393 }
7394
7395 goto unknown;
7396
7397 case 'm':
7398 if (name[1] == 'a' &&
7399 name[2] == 'p')
7400 { /* map */
7401 return KEY_map;
7402 }
7403
7404 goto unknown;
7405
7406 case 'n':
7407 if (name[1] == 'o' &&
7408 name[2] == 't')
7409 { /* not */
7410 return -KEY_not;
7411 }
7412
7413 goto unknown;
7414
7415 case 'o':
7416 switch (name[1])
7417 {
7418 case 'c':
7419 if (name[2] == 't')
7420 { /* oct */
7421 return -KEY_oct;
7422 }
7423
7424 goto unknown;
7425
7426 case 'r':
7427 if (name[2] == 'd')
7428 { /* ord */
7429 return -KEY_ord;
7430 }
7431
7432 goto unknown;
7433
7434 case 'u':
7435 if (name[2] == 'r')
7436 { /* our */
7437 return KEY_our;
7438 }
7439
7440 goto unknown;
7441
7442 default:
7443 goto unknown;
7444 }
7445
7446 case 'p':
7447 if (name[1] == 'o')
7448 {
7449 switch (name[2])
7450 {
7451 case 'p':
7452 { /* pop */
7453 return -KEY_pop;
7454 }
7455
4c3bbe0f
MHM
7456 case 's':
7457 { /* pos */
7458 return KEY_pos;
7459 }
7460
4c3bbe0f
MHM
7461 default:
7462 goto unknown;
7463 }
7464 }
7465
7466 goto unknown;
7467
7468 case 'r':
7469 if (name[1] == 'e' &&
7470 name[2] == 'f')
7471 { /* ref */
7472 return -KEY_ref;
7473 }
7474
7475 goto unknown;
7476
7477 case 's':
7478 switch (name[1])
7479 {
0d863452
RH
7480 case 'a':
7481 if (name[2] == 'y')
7482 { /* say */
e3e804c9 7483 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
0d863452
RH
7484 }
7485
7486 goto unknown;
7487
4c3bbe0f
MHM
7488 case 'i':
7489 if (name[2] == 'n')
7490 { /* sin */
7491 return -KEY_sin;
7492 }
7493
7494 goto unknown;
7495
7496 case 'u':
7497 if (name[2] == 'b')
7498 { /* sub */
7499 return KEY_sub;
7500 }
7501
7502 goto unknown;
7503
7504 default:
7505 goto unknown;
7506 }
7507
7508 case 't':
7509 if (name[1] == 'i' &&
7510 name[2] == 'e')
7511 { /* tie */
7512 return KEY_tie;
7513 }
7514
7515 goto unknown;
7516
7517 case 'u':
7518 if (name[1] == 's' &&
7519 name[2] == 'e')
7520 { /* use */
7521 return KEY_use;
7522 }
7523
7524 goto unknown;
7525
7526 case 'v':
7527 if (name[1] == 'e' &&
7528 name[2] == 'c')
7529 { /* vec */
7530 return -KEY_vec;
7531 }
7532
7533 goto unknown;
7534
7535 case 'x':
7536 if (name[1] == 'o' &&
7537 name[2] == 'r')
7538 { /* xor */
7539 return -KEY_xor;
7540 }
7541
7542 goto unknown;
7543
7544 default:
7545 goto unknown;
e2e1dd5a 7546 }
4c3bbe0f 7547
0d863452 7548 case 4: /* 41 tokens of length 4 */
4c3bbe0f 7549 switch (name[0])
e2e1dd5a 7550 {
4c3bbe0f
MHM
7551 case 'C':
7552 if (name[1] == 'O' &&
7553 name[2] == 'R' &&
7554 name[3] == 'E')
7555 { /* CORE */
7556 return -KEY_CORE;
7557 }
7558
7559 goto unknown;
7560
7561 case 'I':
7562 if (name[1] == 'N' &&
7563 name[2] == 'I' &&
7564 name[3] == 'T')
7565 { /* INIT */
7566 return KEY_INIT;
7567 }
7568
7569 goto unknown;
7570
7571 case 'b':
7572 if (name[1] == 'i' &&
7573 name[2] == 'n' &&
7574 name[3] == 'd')
7575 { /* bind */
7576 return -KEY_bind;
7577 }
7578
7579 goto unknown;
7580
7581 case 'c':
7582 if (name[1] == 'h' &&
7583 name[2] == 'o' &&
7584 name[3] == 'p')
7585 { /* chop */
7586 return -KEY_chop;
7587 }
7588
7589 goto unknown;
7590
7591 case 'd':
7592 if (name[1] == 'u' &&
7593 name[2] == 'm' &&
7594 name[3] == 'p')
7595 { /* dump */
7596 return -KEY_dump;
7597 }
7598
7599 goto unknown;
7600
7601 case 'e':
7602 switch (name[1])
7603 {
7604 case 'a':
7605 if (name[2] == 'c' &&
7606 name[3] == 'h')
7607 { /* each */
7608 return -KEY_each;
7609 }
7610
7611 goto unknown;
7612
7613 case 'l':
7614 if (name[2] == 's' &&
7615 name[3] == 'e')
7616 { /* else */
7617 return KEY_else;
7618 }
7619
7620 goto unknown;
7621
7622 case 'v':
7623 if (name[2] == 'a' &&
7624 name[3] == 'l')
7625 { /* eval */
7626 return KEY_eval;
7627 }
7628
7629 goto unknown;
7630
7631 case 'x':
7632 switch (name[2])
7633 {
7634 case 'e':
7635 if (name[3] == 'c')
7636 { /* exec */
7637 return -KEY_exec;
7638 }
7639
7640 goto unknown;
7641
7642 case 'i':
7643 if (name[3] == 't')
7644 { /* exit */
7645 return -KEY_exit;
7646 }
7647
7648 goto unknown;
7649
7650 default:
7651 goto unknown;
7652 }
7653
7654 default:
7655 goto unknown;
7656 }
7657
7658 case 'f':
7659 if (name[1] == 'o' &&
7660 name[2] == 'r' &&
7661 name[3] == 'k')
7662 { /* fork */
7663 return -KEY_fork;
7664 }
7665
7666 goto unknown;
7667
7668 case 'g':
7669 switch (name[1])
7670 {
7671 case 'e':
7672 if (name[2] == 't' &&
7673 name[3] == 'c')
7674 { /* getc */
7675 return -KEY_getc;
7676 }
7677
7678 goto unknown;
7679
7680 case 'l':
7681 if (name[2] == 'o' &&
7682 name[3] == 'b')
7683 { /* glob */
7684 return KEY_glob;
7685 }
7686
7687 goto unknown;
7688
7689 case 'o':
7690 if (name[2] == 't' &&
7691 name[3] == 'o')
7692 { /* goto */
7693 return KEY_goto;
7694 }
7695
7696 goto unknown;
7697
7698 case 'r':
7699 if (name[2] == 'e' &&
7700 name[3] == 'p')
7701 { /* grep */
7702 return KEY_grep;
7703 }
7704
7705 goto unknown;
7706
7707 default:
7708 goto unknown;
7709 }
7710
7711 case 'j':
7712 if (name[1] == 'o' &&
7713 name[2] == 'i' &&
7714 name[3] == 'n')
7715 { /* join */
7716 return -KEY_join;
7717 }
7718
7719 goto unknown;
7720
7721 case 'k':
7722 switch (name[1])
7723 {
7724 case 'e':
7725 if (name[2] == 'y' &&
7726 name[3] == 's')
7727 { /* keys */
7728 return -KEY_keys;
7729 }
7730
7731 goto unknown;
7732
7733 case 'i':
7734 if (name[2] == 'l' &&
7735 name[3] == 'l')
7736 { /* kill */
7737 return -KEY_kill;
7738 }
7739
7740 goto unknown;
7741
7742 default:
7743 goto unknown;
7744 }
7745
7746 case 'l':
7747 switch (name[1])
7748 {
7749 case 'a':
7750 if (name[2] == 's' &&
7751 name[3] == 't')
7752 { /* last */
7753 return KEY_last;
7754 }
7755
7756 goto unknown;
7757
7758 case 'i':
7759 if (name[2] == 'n' &&
7760 name[3] == 'k')
7761 { /* link */
7762 return -KEY_link;
7763 }
7764
7765 goto unknown;
7766
7767 case 'o':
7768 if (name[2] == 'c' &&
7769 name[3] == 'k')
7770 { /* lock */
7771 return -KEY_lock;
7772 }
7773
7774 goto unknown;
7775
7776 default:
7777 goto unknown;
7778 }
7779
7780 case 'n':
7781 if (name[1] == 'e' &&
7782 name[2] == 'x' &&
7783 name[3] == 't')
7784 { /* next */
7785 return KEY_next;
7786 }
7787
7788 goto unknown;
7789
7790 case 'o':
7791 if (name[1] == 'p' &&
7792 name[2] == 'e' &&
7793 name[3] == 'n')
7794 { /* open */
7795 return -KEY_open;
7796 }
7797
7798 goto unknown;
7799
7800 case 'p':
7801 switch (name[1])
7802 {
7803 case 'a':
7804 if (name[2] == 'c' &&
7805 name[3] == 'k')
7806 { /* pack */
7807 return -KEY_pack;
7808 }
7809
7810 goto unknown;
7811
7812 case 'i':
7813 if (name[2] == 'p' &&
7814 name[3] == 'e')
7815 { /* pipe */
7816 return -KEY_pipe;
7817 }
7818
7819 goto unknown;
7820
7821 case 'u':
7822 if (name[2] == 's' &&
7823 name[3] == 'h')
7824 { /* push */
7825 return -KEY_push;
7826 }
7827
7828 goto unknown;
7829
7830 default:
7831 goto unknown;
7832 }
7833
7834 case 'r':
7835 switch (name[1])
7836 {
7837 case 'a':
7838 if (name[2] == 'n' &&
7839 name[3] == 'd')
7840 { /* rand */
7841 return -KEY_rand;
7842 }
7843
7844 goto unknown;
7845
7846 case 'e':
7847 switch (name[2])
7848 {
7849 case 'a':
7850 if (name[3] == 'd')
7851 { /* read */
7852 return -KEY_read;
7853 }
7854
7855 goto unknown;
7856
7857 case 'c':
7858 if (name[3] == 'v')
7859 { /* recv */
7860 return -KEY_recv;
7861 }
7862
7863 goto unknown;
7864
7865 case 'd':
7866 if (name[3] == 'o')
7867 { /* redo */
7868 return KEY_redo;
7869 }
7870
7871 goto unknown;
7872
7873 default:
7874 goto unknown;
7875 }
7876
7877 default:
7878 goto unknown;
7879 }
7880
7881 case 's':
7882 switch (name[1])
7883 {
7884 case 'e':
7885 switch (name[2])
7886 {
7887 case 'e':
7888 if (name[3] == 'k')
7889 { /* seek */
7890 return -KEY_seek;
7891 }
7892
7893 goto unknown;
7894
7895 case 'n':
7896 if (name[3] == 'd')
7897 { /* send */
7898 return -KEY_send;
7899 }
7900
7901 goto unknown;
7902
7903 default:
7904 goto unknown;
7905 }
7906
7907 case 'o':
7908 if (name[2] == 'r' &&
7909 name[3] == 't')
7910 { /* sort */
7911 return KEY_sort;
7912 }
7913
7914 goto unknown;
7915
7916 case 'q':
7917 if (name[2] == 'r' &&
7918 name[3] == 't')
7919 { /* sqrt */
7920 return -KEY_sqrt;
7921 }
7922
7923 goto unknown;
7924
7925 case 't':
7926 if (name[2] == 'a' &&
7927 name[3] == 't')
7928 { /* stat */
7929 return -KEY_stat;
7930 }
7931
7932 goto unknown;
7933
7934 default:
7935 goto unknown;
7936 }
7937
7938 case 't':
7939 switch (name[1])
7940 {
7941 case 'e':
7942 if (name[2] == 'l' &&
7943 name[3] == 'l')
7944 { /* tell */
7945 return -KEY_tell;
7946 }
7947
7948 goto unknown;
7949
7950 case 'i':
7951 switch (name[2])
7952 {
7953 case 'e':
7954 if (name[3] == 'd')
7955 { /* tied */
7956 return KEY_tied;
7957 }
7958
7959 goto unknown;
7960
7961 case 'm':
7962 if (name[3] == 'e')
7963 { /* time */
7964 return -KEY_time;
7965 }
7966
7967 goto unknown;
7968
7969 default:
7970 goto unknown;
7971 }
7972
7973 default:
7974 goto unknown;
7975 }
7976
7977 case 'w':
0d863452 7978 switch (name[1])
4c3bbe0f 7979 {
0d863452 7980 case 'a':
952306ac
RGS
7981 switch (name[2])
7982 {
7983 case 'i':
7984 if (name[3] == 't')
7985 { /* wait */
7986 return -KEY_wait;
7987 }
4c3bbe0f 7988
952306ac 7989 goto unknown;
4c3bbe0f 7990
952306ac
RGS
7991 case 'r':
7992 if (name[3] == 'n')
7993 { /* warn */
7994 return -KEY_warn;
7995 }
4c3bbe0f 7996
952306ac 7997 goto unknown;
4c3bbe0f 7998
952306ac
RGS
7999 default:
8000 goto unknown;
8001 }
0d863452
RH
8002
8003 case 'h':
8004 if (name[2] == 'e' &&
8005 name[3] == 'n')
8006 { /* when */
5458a98a 8007 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
952306ac 8008 }
4c3bbe0f 8009
952306ac 8010 goto unknown;
4c3bbe0f 8011
952306ac
RGS
8012 default:
8013 goto unknown;
8014 }
4c3bbe0f 8015
0d863452
RH
8016 default:
8017 goto unknown;
8018 }
8019
952306ac 8020 case 5: /* 39 tokens of length 5 */
4c3bbe0f 8021 switch (name[0])
e2e1dd5a 8022 {
4c3bbe0f
MHM
8023 case 'B':
8024 if (name[1] == 'E' &&
8025 name[2] == 'G' &&
8026 name[3] == 'I' &&
8027 name[4] == 'N')
8028 { /* BEGIN */
8029 return KEY_BEGIN;
8030 }
8031
8032 goto unknown;
8033
8034 case 'C':
8035 if (name[1] == 'H' &&
8036 name[2] == 'E' &&
8037 name[3] == 'C' &&
8038 name[4] == 'K')
8039 { /* CHECK */
8040 return KEY_CHECK;
8041 }
8042
8043 goto unknown;
8044
8045 case 'a':
8046 switch (name[1])
8047 {
8048 case 'l':
8049 if (name[2] == 'a' &&
8050 name[3] == 'r' &&
8051 name[4] == 'm')
8052 { /* alarm */
8053 return -KEY_alarm;
8054 }
8055
8056 goto unknown;
8057
8058 case 't':
8059 if (name[2] == 'a' &&
8060 name[3] == 'n' &&
8061 name[4] == '2')
8062 { /* atan2 */
8063 return -KEY_atan2;
8064 }
8065
8066 goto unknown;
8067
8068 default:
8069 goto unknown;
8070 }
8071
8072 case 'b':
0d863452
RH
8073 switch (name[1])
8074 {
8075 case 'l':
8076 if (name[2] == 'e' &&
952306ac
RGS
8077 name[3] == 's' &&
8078 name[4] == 's')
8079 { /* bless */
8080 return -KEY_bless;
8081 }
4c3bbe0f 8082
952306ac 8083 goto unknown;
4c3bbe0f 8084
0d863452
RH
8085 case 'r':
8086 if (name[2] == 'e' &&
8087 name[3] == 'a' &&
8088 name[4] == 'k')
8089 { /* break */
5458a98a 8090 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
0d863452
RH
8091 }
8092
8093 goto unknown;
8094
8095 default:
8096 goto unknown;
8097 }
8098
4c3bbe0f
MHM
8099 case 'c':
8100 switch (name[1])
8101 {
8102 case 'h':
8103 switch (name[2])
8104 {
8105 case 'd':
8106 if (name[3] == 'i' &&
8107 name[4] == 'r')
8108 { /* chdir */
8109 return -KEY_chdir;
8110 }
8111
8112 goto unknown;
8113
8114 case 'm':
8115 if (name[3] == 'o' &&
8116 name[4] == 'd')
8117 { /* chmod */
8118 return -KEY_chmod;
8119 }
8120
8121 goto unknown;
8122
8123 case 'o':
8124 switch (name[3])
8125 {
8126 case 'm':
8127 if (name[4] == 'p')
8128 { /* chomp */
8129 return -KEY_chomp;
8130 }
8131
8132 goto unknown;
8133
8134 case 'w':
8135 if (name[4] == 'n')
8136 { /* chown */
8137 return -KEY_chown;
8138 }
8139
8140 goto unknown;
8141
8142 default:
8143 goto unknown;
8144 }
8145
8146 default:
8147 goto unknown;
8148 }
8149
8150 case 'l':
8151 if (name[2] == 'o' &&
8152 name[3] == 's' &&
8153 name[4] == 'e')
8154 { /* close */
8155 return -KEY_close;
8156 }
8157
8158 goto unknown;
8159
8160 case 'r':
8161 if (name[2] == 'y' &&
8162 name[3] == 'p' &&
8163 name[4] == 't')
8164 { /* crypt */
8165 return -KEY_crypt;
8166 }
8167
8168 goto unknown;
8169
8170 default:
8171 goto unknown;
8172 }
8173
8174 case 'e':
8175 if (name[1] == 'l' &&
8176 name[2] == 's' &&
8177 name[3] == 'i' &&
8178 name[4] == 'f')
8179 { /* elsif */
8180 return KEY_elsif;
8181 }
8182
8183 goto unknown;
8184
8185 case 'f':
8186 switch (name[1])
8187 {
8188 case 'c':
8189 if (name[2] == 'n' &&
8190 name[3] == 't' &&
8191 name[4] == 'l')
8192 { /* fcntl */
8193 return -KEY_fcntl;
8194 }
8195
8196 goto unknown;
8197
8198 case 'l':
8199 if (name[2] == 'o' &&
8200 name[3] == 'c' &&
8201 name[4] == 'k')
8202 { /* flock */
8203 return -KEY_flock;
8204 }
8205
8206 goto unknown;
8207
8208 default:
8209 goto unknown;
8210 }
8211
0d863452
RH
8212 case 'g':
8213 if (name[1] == 'i' &&
8214 name[2] == 'v' &&
8215 name[3] == 'e' &&
8216 name[4] == 'n')
8217 { /* given */
5458a98a 8218 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
0d863452
RH
8219 }
8220
8221 goto unknown;
8222
4c3bbe0f
MHM
8223 case 'i':
8224 switch (name[1])
8225 {
8226 case 'n':
8227 if (name[2] == 'd' &&
8228 name[3] == 'e' &&
8229 name[4] == 'x')
8230 { /* index */
8231 return -KEY_index;
8232 }
8233
8234 goto unknown;
8235
8236 case 'o':
8237 if (name[2] == 'c' &&
8238 name[3] == 't' &&
8239 name[4] == 'l')
8240 { /* ioctl */
8241 return -KEY_ioctl;
8242 }
8243
8244 goto unknown;
8245
8246 default:
8247 goto unknown;
8248 }
8249
8250 case 'l':
8251 switch (name[1])
8252 {
8253 case 'o':
8254 if (name[2] == 'c' &&
8255 name[3] == 'a' &&
8256 name[4] == 'l')
8257 { /* local */
8258 return KEY_local;
8259 }
8260
8261 goto unknown;
8262
8263 case 's':
8264 if (name[2] == 't' &&
8265 name[3] == 'a' &&
8266 name[4] == 't')
8267 { /* lstat */
8268 return -KEY_lstat;
8269 }
8270
8271 goto unknown;
8272
8273 default:
8274 goto unknown;
8275 }
8276
8277 case 'm':
8278 if (name[1] == 'k' &&
8279 name[2] == 'd' &&
8280 name[3] == 'i' &&
8281 name[4] == 'r')
8282 { /* mkdir */
8283 return -KEY_mkdir;
8284 }
8285
8286 goto unknown;
8287
8288 case 'p':
8289 if (name[1] == 'r' &&
8290 name[2] == 'i' &&
8291 name[3] == 'n' &&
8292 name[4] == 't')
8293 { /* print */
8294 return KEY_print;
8295 }
8296
8297 goto unknown;
8298
8299 case 'r':
8300 switch (name[1])
8301 {
8302 case 'e':
8303 if (name[2] == 's' &&
8304 name[3] == 'e' &&
8305 name[4] == 't')
8306 { /* reset */
8307 return -KEY_reset;
8308 }
8309
8310 goto unknown;
8311
8312 case 'm':
8313 if (name[2] == 'd' &&
8314 name[3] == 'i' &&
8315 name[4] == 'r')
8316 { /* rmdir */
8317 return -KEY_rmdir;
8318 }
8319
8320 goto unknown;
8321
8322 default:
8323 goto unknown;
8324 }
8325
8326 case 's':
8327 switch (name[1])
8328 {
8329 case 'e':
8330 if (name[2] == 'm' &&
8331 name[3] == 'o' &&
8332 name[4] == 'p')
8333 { /* semop */
8334 return -KEY_semop;
8335 }
8336
8337 goto unknown;
8338
8339 case 'h':
8340 if (name[2] == 'i' &&
8341 name[3] == 'f' &&
8342 name[4] == 't')
8343 { /* shift */
8344 return -KEY_shift;
8345 }
8346
8347 goto unknown;
8348
8349 case 'l':
8350 if (name[2] == 'e' &&
8351 name[3] == 'e' &&
8352 name[4] == 'p')
8353 { /* sleep */
8354 return -KEY_sleep;
8355 }
8356
8357 goto unknown;
8358
8359 case 'p':
8360 if (name[2] == 'l' &&
8361 name[3] == 'i' &&
8362 name[4] == 't')
8363 { /* split */
8364 return KEY_split;
8365 }
8366
8367 goto unknown;
8368
8369 case 'r':
8370 if (name[2] == 'a' &&
8371 name[3] == 'n' &&
8372 name[4] == 'd')
8373 { /* srand */
8374 return -KEY_srand;
8375 }
8376
8377 goto unknown;
8378
8379 case 't':
952306ac
RGS
8380 switch (name[2])
8381 {
8382 case 'a':
8383 if (name[3] == 't' &&
8384 name[4] == 'e')
8385 { /* state */
5458a98a 8386 return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
952306ac 8387 }
4c3bbe0f 8388
952306ac
RGS
8389 goto unknown;
8390
8391 case 'u':
8392 if (name[3] == 'd' &&
8393 name[4] == 'y')
8394 { /* study */
8395 return KEY_study;
8396 }
8397
8398 goto unknown;
8399
8400 default:
8401 goto unknown;
8402 }
4c3bbe0f
MHM
8403
8404 default:
8405 goto unknown;
8406 }
8407
8408 case 't':
8409 if (name[1] == 'i' &&
8410 name[2] == 'm' &&
8411 name[3] == 'e' &&
8412 name[4] == 's')
8413 { /* times */
8414 return -KEY_times;
8415 }
8416
8417 goto unknown;
8418
8419 case 'u':
8420 switch (name[1])
8421 {
8422 case 'm':
8423 if (name[2] == 'a' &&
8424 name[3] == 's' &&
8425 name[4] == 'k')
8426 { /* umask */
8427 return -KEY_umask;
8428 }
8429
8430 goto unknown;
8431
8432 case 'n':
8433 switch (name[2])
8434 {
8435 case 'd':
8436 if (name[3] == 'e' &&
8437 name[4] == 'f')
8438 { /* undef */
8439 return KEY_undef;
8440 }
8441
8442 goto unknown;
8443
8444 case 't':
8445 if (name[3] == 'i')
8446 {
8447 switch (name[4])
8448 {
8449 case 'e':
8450 { /* untie */
8451 return KEY_untie;
8452 }
8453
4c3bbe0f
MHM
8454 case 'l':
8455 { /* until */
8456 return KEY_until;
8457 }
8458
4c3bbe0f
MHM
8459 default:
8460 goto unknown;
8461 }
8462 }
8463
8464 goto unknown;
8465
8466 default:
8467 goto unknown;
8468 }
8469
8470 case 't':
8471 if (name[2] == 'i' &&
8472 name[3] == 'm' &&
8473 name[4] == 'e')
8474 { /* utime */
8475 return -KEY_utime;
8476 }
8477
8478 goto unknown;
8479
8480 default:
8481 goto unknown;
8482 }
8483
8484 case 'w':
8485 switch (name[1])
8486 {
8487 case 'h':
8488 if (name[2] == 'i' &&
8489 name[3] == 'l' &&
8490 name[4] == 'e')
8491 { /* while */
8492 return KEY_while;
8493 }
8494
8495 goto unknown;
8496
8497 case 'r':
8498 if (name[2] == 'i' &&
8499 name[3] == 't' &&
8500 name[4] == 'e')
8501 { /* write */
8502 return -KEY_write;
8503 }
8504
8505 goto unknown;
8506
8507 default:
8508 goto unknown;
8509 }
8510
8511 default:
8512 goto unknown;
e2e1dd5a 8513 }
4c3bbe0f
MHM
8514
8515 case 6: /* 33 tokens of length 6 */
8516 switch (name[0])
8517 {
8518 case 'a':
8519 if (name[1] == 'c' &&
8520 name[2] == 'c' &&
8521 name[3] == 'e' &&
8522 name[4] == 'p' &&
8523 name[5] == 't')
8524 { /* accept */
8525 return -KEY_accept;
8526 }
8527
8528 goto unknown;
8529
8530 case 'c':
8531 switch (name[1])
8532 {
8533 case 'a':
8534 if (name[2] == 'l' &&
8535 name[3] == 'l' &&
8536 name[4] == 'e' &&
8537 name[5] == 'r')
8538 { /* caller */
8539 return -KEY_caller;
8540 }
8541
8542 goto unknown;
8543
8544 case 'h':
8545 if (name[2] == 'r' &&
8546 name[3] == 'o' &&
8547 name[4] == 'o' &&
8548 name[5] == 't')
8549 { /* chroot */
8550 return -KEY_chroot;
8551 }
8552
8553 goto unknown;
8554
8555 default:
8556 goto unknown;
8557 }
8558
8559 case 'd':
8560 if (name[1] == 'e' &&
8561 name[2] == 'l' &&
8562 name[3] == 'e' &&
8563 name[4] == 't' &&
8564 name[5] == 'e')
8565 { /* delete */
8566 return KEY_delete;
8567 }
8568
8569 goto unknown;
8570
8571 case 'e':
8572 switch (name[1])
8573 {
8574 case 'l':
8575 if (name[2] == 's' &&
8576 name[3] == 'e' &&
8577 name[4] == 'i' &&
8578 name[5] == 'f')
8579 { /* elseif */
8580 if(ckWARN_d(WARN_SYNTAX))
8581 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
8582 }
8583
8584 goto unknown;
8585
8586 case 'x':
8587 if (name[2] == 'i' &&
8588 name[3] == 's' &&
8589 name[4] == 't' &&
8590 name[5] == 's')
8591 { /* exists */
8592 return KEY_exists;
8593 }
8594
8595 goto unknown;
8596
8597 default:
8598 goto unknown;
8599 }
8600
8601 case 'f':
8602 switch (name[1])
8603 {
8604 case 'i':
8605 if (name[2] == 'l' &&
8606 name[3] == 'e' &&
8607 name[4] == 'n' &&
8608 name[5] == 'o')
8609 { /* fileno */
8610 return -KEY_fileno;
8611 }
8612
8613 goto unknown;
8614
8615 case 'o':
8616 if (name[2] == 'r' &&
8617 name[3] == 'm' &&
8618 name[4] == 'a' &&
8619 name[5] == 't')
8620 { /* format */
8621 return KEY_format;
8622 }
8623
8624 goto unknown;
8625
8626 default:
8627 goto unknown;
8628 }
8629
8630 case 'g':
8631 if (name[1] == 'm' &&
8632 name[2] == 't' &&
8633 name[3] == 'i' &&
8634 name[4] == 'm' &&
8635 name[5] == 'e')
8636 { /* gmtime */
8637 return -KEY_gmtime;
8638 }
8639
8640 goto unknown;
8641
8642 case 'l':
8643 switch (name[1])
8644 {
8645 case 'e':
8646 if (name[2] == 'n' &&
8647 name[3] == 'g' &&
8648 name[4] == 't' &&
8649 name[5] == 'h')
8650 { /* length */
8651 return -KEY_length;
8652 }
8653
8654 goto unknown;
8655
8656 case 'i':
8657 if (name[2] == 's' &&
8658 name[3] == 't' &&
8659 name[4] == 'e' &&
8660 name[5] == 'n')
8661 { /* listen */
8662 return -KEY_listen;
8663 }
8664
8665 goto unknown;
8666
8667 default:
8668 goto unknown;
8669 }
8670
8671 case 'm':
8672 if (name[1] == 's' &&
8673 name[2] == 'g')
8674 {
8675 switch (name[3])
8676 {
8677 case 'c':
8678 if (name[4] == 't' &&
8679 name[5] == 'l')
8680 { /* msgctl */
8681 return -KEY_msgctl;
8682 }
8683
8684 goto unknown;
8685
8686 case 'g':
8687 if (name[4] == 'e' &&
8688 name[5] == 't')
8689 { /* msgget */
8690 return -KEY_msgget;
8691 }
8692
8693 goto unknown;
8694
8695 case 'r':
8696 if (name[4] == 'c' &&
8697 name[5] == 'v')
8698 { /* msgrcv */
8699 return -KEY_msgrcv;
8700 }
8701
8702 goto unknown;
8703
8704 case 's':
8705 if (name[4] == 'n' &&
8706 name[5] == 'd')
8707 { /* msgsnd */
8708 return -KEY_msgsnd;
8709 }
8710
8711 goto unknown;
8712
8713 default:
8714 goto unknown;
8715 }
8716 }
8717
8718 goto unknown;
8719
8720 case 'p':
8721 if (name[1] == 'r' &&
8722 name[2] == 'i' &&
8723 name[3] == 'n' &&
8724 name[4] == 't' &&
8725 name[5] == 'f')
8726 { /* printf */
8727 return KEY_printf;
8728 }
8729
8730 goto unknown;
8731
8732 case 'r':
8733 switch (name[1])
8734 {
8735 case 'e':
8736 switch (name[2])
8737 {
8738 case 'n':
8739 if (name[3] == 'a' &&
8740 name[4] == 'm' &&
8741 name[5] == 'e')
8742 { /* rename */
8743 return -KEY_rename;
8744 }
8745
8746 goto unknown;
8747
8748 case 't':
8749 if (name[3] == 'u' &&
8750 name[4] == 'r' &&
8751 name[5] == 'n')
8752 { /* return */
8753 return KEY_return;
8754 }
8755
8756 goto unknown;
8757
8758 default:
8759 goto unknown;
8760 }
8761
8762 case 'i':
8763 if (name[2] == 'n' &&
8764 name[3] == 'd' &&
8765 name[4] == 'e' &&
8766 name[5] == 'x')
8767 { /* rindex */
8768 return -KEY_rindex;
8769 }
8770
8771 goto unknown;
8772
8773 default:
8774 goto unknown;
8775 }
8776
8777 case 's':
8778 switch (name[1])
8779 {
8780 case 'c':
8781 if (name[2] == 'a' &&
8782 name[3] == 'l' &&
8783 name[4] == 'a' &&
8784 name[5] == 'r')
8785 { /* scalar */
8786 return KEY_scalar;
8787 }
8788
8789 goto unknown;
8790
8791 case 'e':
8792 switch (name[2])
8793 {
8794 case 'l':
8795 if (name[3] == 'e' &&
8796 name[4] == 'c' &&
8797 name[5] == 't')
8798 { /* select */
8799 return -KEY_select;
8800 }
8801
8802 goto unknown;
8803
8804 case 'm':
8805 switch (name[3])
8806 {
8807 case 'c':
8808 if (name[4] == 't' &&
8809 name[5] == 'l')
8810 { /* semctl */
8811 return -KEY_semctl;
8812 }
8813
8814 goto unknown;
8815
8816 case 'g':
8817 if (name[4] == 'e' &&
8818 name[5] == 't')
8819 { /* semget */
8820 return -KEY_semget;
8821 }
8822
8823 goto unknown;
8824
8825 default:
8826 goto unknown;
8827 }
8828
8829 default:
8830 goto unknown;
8831 }
8832
8833 case 'h':
8834 if (name[2] == 'm')
8835 {
8836 switch (name[3])
8837 {
8838 case 'c':
8839 if (name[4] == 't' &&
8840 name[5] == 'l')
8841 { /* shmctl */
8842 return -KEY_shmctl;
8843 }
8844
8845 goto unknown;
8846
8847 case 'g':
8848 if (name[4] == 'e' &&
8849 name[5] == 't')
8850 { /* shmget */
8851 return -KEY_shmget;
8852 }
8853
8854 goto unknown;
8855
8856 default:
8857 goto unknown;
8858 }
8859 }
8860
8861 goto unknown;
8862
8863 case 'o':
8864 if (name[2] == 'c' &&
8865 name[3] == 'k' &&
8866 name[4] == 'e' &&
8867 name[5] == 't')
8868 { /* socket */
8869 return -KEY_socket;
8870 }
8871
8872 goto unknown;
8873
8874 case 'p':
8875 if (name[2] == 'l' &&
8876 name[3] == 'i' &&
8877 name[4] == 'c' &&
8878 name[5] == 'e')
8879 { /* splice */
8880 return -KEY_splice;
8881 }
8882
8883 goto unknown;
8884
8885 case 'u':
8886 if (name[2] == 'b' &&
8887 name[3] == 's' &&
8888 name[4] == 't' &&
8889 name[5] == 'r')
8890 { /* substr */
8891 return -KEY_substr;
8892 }
8893
8894 goto unknown;
8895
8896 case 'y':
8897 if (name[2] == 's' &&
8898 name[3] == 't' &&
8899 name[4] == 'e' &&
8900 name[5] == 'm')
8901 { /* system */
8902 return -KEY_system;
8903 }
8904
8905 goto unknown;
8906
8907 default:
8908 goto unknown;
8909 }
8910
8911 case 'u':
8912 if (name[1] == 'n')
8913 {
8914 switch (name[2])
8915 {
8916 case 'l':
8917 switch (name[3])
8918 {
8919 case 'e':
8920 if (name[4] == 's' &&
8921 name[5] == 's')
8922 { /* unless */
8923 return KEY_unless;
8924 }
8925
8926 goto unknown;
8927
8928 case 'i':
8929 if (name[4] == 'n' &&
8930 name[5] == 'k')
8931 { /* unlink */
8932 return -KEY_unlink;
8933 }
8934
8935 goto unknown;
8936
8937 default:
8938 goto unknown;
8939 }
8940
8941 case 'p':
8942 if (name[3] == 'a' &&
8943 name[4] == 'c' &&
8944 name[5] == 'k')
8945 { /* unpack */
8946 return -KEY_unpack;
8947 }
8948
8949 goto unknown;
8950
8951 default:
8952 goto unknown;
8953 }
8954 }
8955
8956 goto unknown;
8957
8958 case 'v':
8959 if (name[1] == 'a' &&
8960 name[2] == 'l' &&
8961 name[3] == 'u' &&
8962 name[4] == 'e' &&
8963 name[5] == 's')
8964 { /* values */
8965 return -KEY_values;
8966 }
8967
8968 goto unknown;
8969
8970 default:
8971 goto unknown;
e2e1dd5a 8972 }
4c3bbe0f 8973
0d863452 8974 case 7: /* 29 tokens of length 7 */
4c3bbe0f
MHM
8975 switch (name[0])
8976 {
8977 case 'D':
8978 if (name[1] == 'E' &&
8979 name[2] == 'S' &&
8980 name[3] == 'T' &&
8981 name[4] == 'R' &&
8982 name[5] == 'O' &&
8983 name[6] == 'Y')
8984 { /* DESTROY */
8985 return KEY_DESTROY;
8986 }
8987
8988 goto unknown;
8989
8990 case '_':
8991 if (name[1] == '_' &&
8992 name[2] == 'E' &&
8993 name[3] == 'N' &&
8994 name[4] == 'D' &&
8995 name[5] == '_' &&
8996 name[6] == '_')
8997 { /* __END__ */
8998 return KEY___END__;
8999 }
9000
9001 goto unknown;
9002
9003 case 'b':
9004 if (name[1] == 'i' &&
9005 name[2] == 'n' &&
9006 name[3] == 'm' &&
9007 name[4] == 'o' &&
9008 name[5] == 'd' &&
9009 name[6] == 'e')
9010 { /* binmode */
9011 return -KEY_binmode;
9012 }
9013
9014 goto unknown;
9015
9016 case 'c':
9017 if (name[1] == 'o' &&
9018 name[2] == 'n' &&
9019 name[3] == 'n' &&
9020 name[4] == 'e' &&
9021 name[5] == 'c' &&
9022 name[6] == 't')
9023 { /* connect */
9024 return -KEY_connect;
9025 }
9026
9027 goto unknown;
9028
9029 case 'd':
9030 switch (name[1])
9031 {
9032 case 'b':
9033 if (name[2] == 'm' &&
9034 name[3] == 'o' &&
9035 name[4] == 'p' &&
9036 name[5] == 'e' &&
9037 name[6] == 'n')
9038 { /* dbmopen */
9039 return -KEY_dbmopen;
9040 }
9041
9042 goto unknown;
9043
9044 case 'e':
0d863452
RH
9045 if (name[2] == 'f')
9046 {
9047 switch (name[3])
9048 {
9049 case 'a':
9050 if (name[4] == 'u' &&
9051 name[5] == 'l' &&
9052 name[6] == 't')
9053 { /* default */
5458a98a 9054 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
0d863452
RH
9055 }
9056
9057 goto unknown;
9058
9059 case 'i':
9060 if (name[4] == 'n' &&
952306ac
RGS
9061 name[5] == 'e' &&
9062 name[6] == 'd')
9063 { /* defined */
9064 return KEY_defined;
9065 }
4c3bbe0f 9066
952306ac 9067 goto unknown;
4c3bbe0f 9068
952306ac
RGS
9069 default:
9070 goto unknown;
9071 }
0d863452
RH
9072 }
9073
9074 goto unknown;
9075
9076 default:
9077 goto unknown;
9078 }
4c3bbe0f
MHM
9079
9080 case 'f':
9081 if (name[1] == 'o' &&
9082 name[2] == 'r' &&
9083 name[3] == 'e' &&
9084 name[4] == 'a' &&
9085 name[5] == 'c' &&
9086 name[6] == 'h')
9087 { /* foreach */
9088 return KEY_foreach;
9089 }
9090
9091 goto unknown;
9092
9093 case 'g':
9094 if (name[1] == 'e' &&
9095 name[2] == 't' &&
9096 name[3] == 'p')
9097 {
9098 switch (name[4])
9099 {
9100 case 'g':
9101 if (name[5] == 'r' &&
9102 name[6] == 'p')
9103 { /* getpgrp */
9104 return -KEY_getpgrp;
9105 }
9106
9107 goto unknown;
9108
9109 case 'p':
9110 if (name[5] == 'i' &&
9111 name[6] == 'd')
9112 { /* getppid */
9113 return -KEY_getppid;
9114 }
9115
9116 goto unknown;
9117
9118 default:
9119 goto unknown;
9120 }
9121 }
9122
9123 goto unknown;
9124
9125 case 'l':
9126 if (name[1] == 'c' &&
9127 name[2] == 'f' &&
9128 name[3] == 'i' &&
9129 name[4] == 'r' &&
9130 name[5] == 's' &&
9131 name[6] == 't')
9132 { /* lcfirst */
9133 return -KEY_lcfirst;
9134 }
9135
9136 goto unknown;
9137
9138 case 'o':
9139 if (name[1] == 'p' &&
9140 name[2] == 'e' &&
9141 name[3] == 'n' &&
9142 name[4] == 'd' &&
9143 name[5] == 'i' &&
9144 name[6] == 'r')
9145 { /* opendir */
9146 return -KEY_opendir;
9147 }
9148
9149 goto unknown;
9150
9151 case 'p':
9152 if (name[1] == 'a' &&
9153 name[2] == 'c' &&
9154 name[3] == 'k' &&
9155 name[4] == 'a' &&
9156 name[5] == 'g' &&
9157 name[6] == 'e')
9158 { /* package */
9159 return KEY_package;
9160 }
9161
9162 goto unknown;
9163
9164 case 'r':
9165 if (name[1] == 'e')
9166 {
9167 switch (name[2])
9168 {
9169 case 'a':
9170 if (name[3] == 'd' &&
9171 name[4] == 'd' &&
9172 name[5] == 'i' &&
9173 name[6] == 'r')
9174 { /* readdir */
9175 return -KEY_readdir;
9176 }
9177
9178 goto unknown;
9179
9180 case 'q':
9181 if (name[3] == 'u' &&
9182 name[4] == 'i' &&
9183 name[5] == 'r' &&
9184 name[6] == 'e')
9185 { /* require */
9186 return KEY_require;
9187 }
9188
9189 goto unknown;
9190
9191 case 'v':
9192 if (name[3] == 'e' &&
9193 name[4] == 'r' &&
9194 name[5] == 's' &&
9195 name[6] == 'e')
9196 { /* reverse */
9197 return -KEY_reverse;
9198 }
9199
9200 goto unknown;
9201
9202 default:
9203 goto unknown;
9204 }
9205 }
9206
9207 goto unknown;
9208
9209 case 's':
9210 switch (name[1])
9211 {
9212 case 'e':
9213 switch (name[2])
9214 {
9215 case 'e':
9216 if (name[3] == 'k' &&
9217 name[4] == 'd' &&
9218 name[5] == 'i' &&
9219 name[6] == 'r')
9220 { /* seekdir */
9221 return -KEY_seekdir;
9222 }
9223
9224 goto unknown;
9225
9226 case 't':
9227 if (name[3] == 'p' &&
9228 name[4] == 'g' &&
9229 name[5] == 'r' &&
9230 name[6] == 'p')
9231 { /* setpgrp */
9232 return -KEY_setpgrp;
9233 }
9234
9235 goto unknown;
9236
9237 default:
9238 goto unknown;
9239 }
9240
9241 case 'h':
9242 if (name[2] == 'm' &&
9243 name[3] == 'r' &&
9244 name[4] == 'e' &&
9245 name[5] == 'a' &&
9246 name[6] == 'd')
9247 { /* shmread */
9248 return -KEY_shmread;
9249 }
9250
9251 goto unknown;
9252
9253 case 'p':
9254 if (name[2] == 'r' &&
9255 name[3] == 'i' &&
9256 name[4] == 'n' &&
9257 name[5] == 't' &&
9258 name[6] == 'f')
9259 { /* sprintf */
9260 return -KEY_sprintf;
9261 }
9262
9263 goto unknown;
9264
9265 case 'y':
9266 switch (name[2])
9267 {
9268 case 'm':
9269 if (name[3] == 'l' &&
9270 name[4] == 'i' &&
9271 name[5] == 'n' &&
9272 name[6] == 'k')
9273 { /* symlink */
9274 return -KEY_symlink;
9275 }
9276
9277 goto unknown;
9278
9279 case 's':
9280 switch (name[3])
9281 {
9282 case 'c':
9283 if (name[4] == 'a' &&
9284 name[5] == 'l' &&
9285 name[6] == 'l')
9286 { /* syscall */
9287 return -KEY_syscall;
9288 }
9289
9290 goto unknown;
9291
9292 case 'o':
9293 if (name[4] == 'p' &&
9294 name[5] == 'e' &&
9295 name[6] == 'n')
9296 { /* sysopen */
9297 return -KEY_sysopen;
9298 }
9299
9300 goto unknown;
9301
9302 case 'r':
9303 if (name[4] == 'e' &&
9304 name[5] == 'a' &&
9305 name[6] == 'd')
9306 { /* sysread */
9307 return -KEY_sysread;
9308 }
9309
9310 goto unknown;
9311
9312 case 's':
9313 if (name[4] == 'e' &&
9314 name[5] == 'e' &&
9315 name[6] == 'k')
9316 { /* sysseek */
9317 return -KEY_sysseek;
9318 }
9319
9320 goto unknown;
9321
9322 default:
9323 goto unknown;
9324 }
9325
9326 default:
9327 goto unknown;
9328 }
9329
9330 default:
9331 goto unknown;
9332 }
9333
9334 case 't':
9335 if (name[1] == 'e' &&
9336 name[2] == 'l' &&
9337 name[3] == 'l' &&
9338 name[4] == 'd' &&
9339 name[5] == 'i' &&
9340 name[6] == 'r')
9341 { /* telldir */
9342 return -KEY_telldir;
9343 }
9344
9345 goto unknown;
9346
9347 case 'u':
9348 switch (name[1])
9349 {
9350 case 'c':
9351 if (name[2] == 'f' &&
9352 name[3] == 'i' &&
9353 name[4] == 'r' &&
9354 name[5] == 's' &&
9355 name[6] == 't')
9356 { /* ucfirst */
9357 return -KEY_ucfirst;
9358 }
9359
9360 goto unknown;
9361
9362 case 'n':
9363 if (name[2] == 's' &&
9364 name[3] == 'h' &&
9365 name[4] == 'i' &&
9366 name[5] == 'f' &&
9367 name[6] == 't')
9368 { /* unshift */
9369 return -KEY_unshift;
9370 }
9371
9372 goto unknown;
9373
9374 default:
9375 goto unknown;
9376 }
9377
9378 case 'w':
9379 if (name[1] == 'a' &&
9380 name[2] == 'i' &&
9381 name[3] == 't' &&
9382 name[4] == 'p' &&
9383 name[5] == 'i' &&
9384 name[6] == 'd')
9385 { /* waitpid */
9386 return -KEY_waitpid;
9387 }
9388
9389 goto unknown;
9390
9391 default:
9392 goto unknown;
9393 }
9394
9395 case 8: /* 26 tokens of length 8 */
9396 switch (name[0])
9397 {
9398 case 'A':
9399 if (name[1] == 'U' &&
9400 name[2] == 'T' &&
9401 name[3] == 'O' &&
9402 name[4] == 'L' &&
9403 name[5] == 'O' &&
9404 name[6] == 'A' &&
9405 name[7] == 'D')
9406 { /* AUTOLOAD */
9407 return KEY_AUTOLOAD;
9408 }
9409
9410 goto unknown;
9411
9412 case '_':
9413 if (name[1] == '_')
9414 {
9415 switch (name[2])
9416 {
9417 case 'D':
9418 if (name[3] == 'A' &&
9419 name[4] == 'T' &&
9420 name[5] == 'A' &&
9421 name[6] == '_' &&
9422 name[7] == '_')
9423 { /* __DATA__ */
9424 return KEY___DATA__;
9425 }
9426
9427 goto unknown;
9428
9429 case 'F':
9430 if (name[3] == 'I' &&
9431 name[4] == 'L' &&
9432 name[5] == 'E' &&
9433 name[6] == '_' &&
9434 name[7] == '_')
9435 { /* __FILE__ */
9436 return -KEY___FILE__;
9437 }
9438
9439 goto unknown;
9440
9441 case 'L':
9442 if (name[3] == 'I' &&
9443 name[4] == 'N' &&
9444 name[5] == 'E' &&
9445 name[6] == '_' &&
9446 name[7] == '_')
9447 { /* __LINE__ */
9448 return -KEY___LINE__;
9449 }
9450
9451 goto unknown;
9452
9453 default:
9454 goto unknown;
9455 }
9456 }
9457
9458 goto unknown;
9459
9460 case 'c':
9461 switch (name[1])
9462 {
9463 case 'l':
9464 if (name[2] == 'o' &&
9465 name[3] == 's' &&
9466 name[4] == 'e' &&
9467 name[5] == 'd' &&
9468 name[6] == 'i' &&
9469 name[7] == 'r')
9470 { /* closedir */
9471 return -KEY_closedir;
9472 }
9473
9474 goto unknown;
9475
9476 case 'o':
9477 if (name[2] == 'n' &&
9478 name[3] == 't' &&
9479 name[4] == 'i' &&
9480 name[5] == 'n' &&
9481 name[6] == 'u' &&
9482 name[7] == 'e')
9483 { /* continue */
9484 return -KEY_continue;
9485 }
9486
9487 goto unknown;
9488
9489 default:
9490 goto unknown;
9491 }
9492
9493 case 'd':
9494 if (name[1] == 'b' &&
9495 name[2] == 'm' &&
9496 name[3] == 'c' &&
9497 name[4] == 'l' &&
9498 name[5] == 'o' &&
9499 name[6] == 's' &&
9500 name[7] == 'e')
9501 { /* dbmclose */
9502 return -KEY_dbmclose;
9503 }
9504
9505 goto unknown;
9506
9507 case 'e':
9508 if (name[1] == 'n' &&
9509 name[2] == 'd')
9510 {
9511 switch (name[3])
9512 {
9513 case 'g':
9514 if (name[4] == 'r' &&
9515 name[5] == 'e' &&
9516 name[6] == 'n' &&
9517 name[7] == 't')
9518 { /* endgrent */
9519 return -KEY_endgrent;
9520 }
9521
9522 goto unknown;
9523
9524 case 'p':
9525 if (name[4] == 'w' &&
9526 name[5] == 'e' &&
9527 name[6] == 'n' &&
9528 name[7] == 't')
9529 { /* endpwent */
9530 return -KEY_endpwent;
9531 }
9532
9533 goto unknown;
9534
9535 default:
9536 goto unknown;
9537 }
9538 }
9539
9540 goto unknown;
9541
9542 case 'f':
9543 if (name[1] == 'o' &&
9544 name[2] == 'r' &&
9545 name[3] == 'm' &&
9546 name[4] == 'l' &&
9547 name[5] == 'i' &&
9548 name[6] == 'n' &&
9549 name[7] == 'e')
9550 { /* formline */
9551 return -KEY_formline;
9552 }
9553
9554 goto unknown;
9555
9556 case 'g':
9557 if (name[1] == 'e' &&
9558 name[2] == 't')
9559 {
9560 switch (name[3])
9561 {
9562 case 'g':
9563 if (name[4] == 'r')
9564 {
9565 switch (name[5])
9566 {
9567 case 'e':
9568 if (name[6] == 'n' &&
9569 name[7] == 't')
9570 { /* getgrent */
9571 return -KEY_getgrent;
9572 }
9573
9574 goto unknown;
9575
9576 case 'g':
9577 if (name[6] == 'i' &&
9578 name[7] == 'd')
9579 { /* getgrgid */
9580 return -KEY_getgrgid;
9581 }
9582
9583 goto unknown;
9584
9585 case 'n':
9586 if (name[6] == 'a' &&
9587 name[7] == 'm')
9588 { /* getgrnam */
9589 return -KEY_getgrnam;
9590 }
9591
9592 goto unknown;
9593
9594 default:
9595 goto unknown;
9596 }
9597 }
9598
9599 goto unknown;
9600
9601 case 'l':
9602 if (name[4] == 'o' &&
9603 name[5] == 'g' &&
9604 name[6] == 'i' &&
9605 name[7] == 'n')
9606 { /* getlogin */
9607 return -KEY_getlogin;
9608 }
9609
9610 goto unknown;
9611
9612 case 'p':
9613 if (name[4] == 'w')
9614 {
9615 switch (name[5])
9616 {
9617 case 'e':
9618 if (name[6] == 'n' &&
9619 name[7] == 't')
9620 { /* getpwent */
9621 return -KEY_getpwent;
9622 }
9623
9624 goto unknown;
9625
9626 case 'n':
9627 if (name[6] == 'a' &&
9628 name[7] == 'm')
9629 { /* getpwnam */
9630 return -KEY_getpwnam;
9631 }
9632
9633 goto unknown;
9634
9635 case 'u':
9636 if (name[6] == 'i' &&
9637 name[7] == 'd')
9638 { /* getpwuid */
9639 return -KEY_getpwuid;
9640 }
9641
9642 goto unknown;
9643
9644 default:
9645 goto unknown;
9646 }
9647 }
9648
9649 goto unknown;
9650
9651 default:
9652 goto unknown;
9653 }
9654 }
9655
9656 goto unknown;
9657
9658 case 'r':
9659 if (name[1] == 'e' &&
9660 name[2] == 'a' &&
9661 name[3] == 'd')
9662 {
9663 switch (name[4])
9664 {
9665 case 'l':
9666 if (name[5] == 'i' &&
9667 name[6] == 'n')
9668 {
9669 switch (name[7])
9670 {
9671 case 'e':
9672 { /* readline */
9673 return -KEY_readline;
9674 }
9675
4c3bbe0f
MHM
9676 case 'k':
9677 { /* readlink */
9678 return -KEY_readlink;
9679 }
9680
4c3bbe0f
MHM
9681 default:
9682 goto unknown;
9683 }
9684 }
9685
9686 goto unknown;
9687
9688 case 'p':
9689 if (name[5] == 'i' &&
9690 name[6] == 'p' &&
9691 name[7] == 'e')
9692 { /* readpipe */
9693 return -KEY_readpipe;
9694 }
9695
9696 goto unknown;
9697
9698 default:
9699 goto unknown;
9700 }
9701 }
9702
9703 goto unknown;
9704
9705 case 's':
9706 switch (name[1])
9707 {
9708 case 'e':
9709 if (name[2] == 't')
9710 {
9711 switch (name[3])
9712 {
9713 case 'g':
9714 if (name[4] == 'r' &&
9715 name[5] == 'e' &&
9716 name[6] == 'n' &&
9717 name[7] == 't')
9718 { /* setgrent */
9719 return -KEY_setgrent;
9720 }
9721
9722 goto unknown;
9723
9724 case 'p':
9725 if (name[4] == 'w' &&
9726 name[5] == 'e' &&
9727 name[6] == 'n' &&
9728 name[7] == 't')
9729 { /* setpwent */
9730 return -KEY_setpwent;
9731 }
9732
9733 goto unknown;
9734
9735 default:
9736 goto unknown;
9737 }
9738 }
9739
9740 goto unknown;
9741
9742 case 'h':
9743 switch (name[2])
9744 {
9745 case 'm':
9746 if (name[3] == 'w' &&
9747 name[4] == 'r' &&
9748 name[5] == 'i' &&
9749 name[6] == 't' &&
9750 name[7] == 'e')
9751 { /* shmwrite */
9752 return -KEY_shmwrite;
9753 }
9754
9755 goto unknown;
9756
9757 case 'u':
9758 if (name[3] == 't' &&
9759 name[4] == 'd' &&
9760 name[5] == 'o' &&
9761 name[6] == 'w' &&
9762 name[7] == 'n')
9763 { /* shutdown */
9764 return -KEY_shutdown;
9765 }
9766
9767 goto unknown;
9768
9769 default:
9770 goto unknown;
9771 }
9772
9773 case 'y':
9774 if (name[2] == 's' &&
9775 name[3] == 'w' &&
9776 name[4] == 'r' &&
9777 name[5] == 'i' &&
9778 name[6] == 't' &&
9779 name[7] == 'e')
9780 { /* syswrite */
9781 return -KEY_syswrite;
9782 }
9783
9784 goto unknown;
9785
9786 default:
9787 goto unknown;
9788 }
9789
9790 case 't':
9791 if (name[1] == 'r' &&
9792 name[2] == 'u' &&
9793 name[3] == 'n' &&
9794 name[4] == 'c' &&
9795 name[5] == 'a' &&
9796 name[6] == 't' &&
9797 name[7] == 'e')
9798 { /* truncate */
9799 return -KEY_truncate;
9800 }
9801
9802 goto unknown;
9803
9804 default:
9805 goto unknown;
9806 }
9807
3c10abe3 9808 case 9: /* 9 tokens of length 9 */
4c3bbe0f
MHM
9809 switch (name[0])
9810 {
3c10abe3
AG
9811 case 'U':
9812 if (name[1] == 'N' &&
9813 name[2] == 'I' &&
9814 name[3] == 'T' &&
9815 name[4] == 'C' &&
9816 name[5] == 'H' &&
9817 name[6] == 'E' &&
9818 name[7] == 'C' &&
9819 name[8] == 'K')
9820 { /* UNITCHECK */
9821 return KEY_UNITCHECK;
9822 }
9823
9824 goto unknown;
9825
4c3bbe0f
MHM
9826 case 'e':
9827 if (name[1] == 'n' &&
9828 name[2] == 'd' &&
9829 name[3] == 'n' &&
9830 name[4] == 'e' &&
9831 name[5] == 't' &&
9832 name[6] == 'e' &&
9833 name[7] == 'n' &&
9834 name[8] == 't')
9835 { /* endnetent */
9836 return -KEY_endnetent;
9837 }
9838
9839 goto unknown;
9840
9841 case 'g':
9842 if (name[1] == 'e' &&
9843 name[2] == 't' &&
9844 name[3] == 'n' &&
9845 name[4] == 'e' &&
9846 name[5] == 't' &&
9847 name[6] == 'e' &&
9848 name[7] == 'n' &&
9849 name[8] == 't')
9850 { /* getnetent */
9851 return -KEY_getnetent;
9852 }
9853
9854 goto unknown;
9855
9856 case 'l':
9857 if (name[1] == 'o' &&
9858 name[2] == 'c' &&
9859 name[3] == 'a' &&
9860 name[4] == 'l' &&
9861 name[5] == 't' &&
9862 name[6] == 'i' &&
9863 name[7] == 'm' &&
9864 name[8] == 'e')
9865 { /* localtime */
9866 return -KEY_localtime;
9867 }
9868
9869 goto unknown;
9870
9871 case 'p':
9872 if (name[1] == 'r' &&
9873 name[2] == 'o' &&
9874 name[3] == 't' &&
9875 name[4] == 'o' &&
9876 name[5] == 't' &&
9877 name[6] == 'y' &&
9878 name[7] == 'p' &&
9879 name[8] == 'e')
9880 { /* prototype */
9881 return KEY_prototype;
9882 }
9883
9884 goto unknown;
9885
9886 case 'q':
9887 if (name[1] == 'u' &&
9888 name[2] == 'o' &&
9889 name[3] == 't' &&
9890 name[4] == 'e' &&
9891 name[5] == 'm' &&
9892 name[6] == 'e' &&
9893 name[7] == 't' &&
9894 name[8] == 'a')
9895 { /* quotemeta */
9896 return -KEY_quotemeta;
9897 }
9898
9899 goto unknown;
9900
9901 case 'r':
9902 if (name[1] == 'e' &&
9903 name[2] == 'w' &&
9904 name[3] == 'i' &&
9905 name[4] == 'n' &&
9906 name[5] == 'd' &&
9907 name[6] == 'd' &&
9908 name[7] == 'i' &&
9909 name[8] == 'r')
9910 { /* rewinddir */
9911 return -KEY_rewinddir;
9912 }
9913
9914 goto unknown;
9915
9916 case 's':
9917 if (name[1] == 'e' &&
9918 name[2] == 't' &&
9919 name[3] == 'n' &&
9920 name[4] == 'e' &&
9921 name[5] == 't' &&
9922 name[6] == 'e' &&
9923 name[7] == 'n' &&
9924 name[8] == 't')
9925 { /* setnetent */
9926 return -KEY_setnetent;
9927 }
9928
9929 goto unknown;
9930
9931 case 'w':
9932 if (name[1] == 'a' &&
9933 name[2] == 'n' &&
9934 name[3] == 't' &&
9935 name[4] == 'a' &&
9936 name[5] == 'r' &&
9937 name[6] == 'r' &&
9938 name[7] == 'a' &&
9939 name[8] == 'y')
9940 { /* wantarray */
9941 return -KEY_wantarray;
9942 }
9943
9944 goto unknown;
9945
9946 default:
9947 goto unknown;
9948 }
9949
9950 case 10: /* 9 tokens of length 10 */
9951 switch (name[0])
9952 {
9953 case 'e':
9954 if (name[1] == 'n' &&
9955 name[2] == 'd')
9956 {
9957 switch (name[3])
9958 {
9959 case 'h':
9960 if (name[4] == 'o' &&
9961 name[5] == 's' &&
9962 name[6] == 't' &&
9963 name[7] == 'e' &&
9964 name[8] == 'n' &&
9965 name[9] == 't')
9966 { /* endhostent */
9967 return -KEY_endhostent;
9968 }
9969
9970 goto unknown;
9971
9972 case 's':
9973 if (name[4] == 'e' &&
9974 name[5] == 'r' &&
9975 name[6] == 'v' &&
9976 name[7] == 'e' &&
9977 name[8] == 'n' &&
9978 name[9] == 't')
9979 { /* endservent */
9980 return -KEY_endservent;
9981 }
9982
9983 goto unknown;
9984
9985 default:
9986 goto unknown;
9987 }
9988 }
9989
9990 goto unknown;
9991
9992 case 'g':
9993 if (name[1] == 'e' &&
9994 name[2] == 't')
9995 {
9996 switch (name[3])
9997 {
9998 case 'h':
9999 if (name[4] == 'o' &&
10000 name[5] == 's' &&
10001 name[6] == 't' &&
10002 name[7] == 'e' &&
10003 name[8] == 'n' &&
10004 name[9] == 't')
10005 { /* gethostent */
10006 return -KEY_gethostent;
10007 }
10008
10009 goto unknown;
10010
10011 case 's':
10012 switch (name[4])
10013 {
10014 case 'e':
10015 if (name[5] == 'r' &&
10016 name[6] == 'v' &&
10017 name[7] == 'e' &&
10018 name[8] == 'n' &&
10019 name[9] == 't')
10020 { /* getservent */
10021 return -KEY_getservent;
10022 }
10023
10024 goto unknown;
10025
10026 case 'o':
10027 if (name[5] == 'c' &&
10028 name[6] == 'k' &&
10029 name[7] == 'o' &&
10030 name[8] == 'p' &&
10031 name[9] == 't')
10032 { /* getsockopt */
10033 return -KEY_getsockopt;
10034 }
10035
10036 goto unknown;
10037
10038 default:
10039 goto unknown;
10040 }
10041
10042 default:
10043 goto unknown;
10044 }
10045 }
10046
10047 goto unknown;
10048
10049 case 's':
10050 switch (name[1])
10051 {
10052 case 'e':
10053 if (name[2] == 't')
10054 {
10055 switch (name[3])
10056 {
10057 case 'h':
10058 if (name[4] == 'o' &&
10059 name[5] == 's' &&
10060 name[6] == 't' &&
10061 name[7] == 'e' &&
10062 name[8] == 'n' &&
10063 name[9] == 't')
10064 { /* sethostent */
10065 return -KEY_sethostent;
10066 }
10067
10068 goto unknown;
10069
10070 case 's':
10071 switch (name[4])
10072 {
10073 case 'e':
10074 if (name[5] == 'r' &&
10075 name[6] == 'v' &&
10076 name[7] == 'e' &&
10077 name[8] == 'n' &&
10078 name[9] == 't')
10079 { /* setservent */
10080 return -KEY_setservent;
10081 }
10082
10083 goto unknown;
10084
10085 case 'o':
10086 if (name[5] == 'c' &&
10087 name[6] == 'k' &&
10088 name[7] == 'o' &&
10089 name[8] == 'p' &&
10090 name[9] == 't')
10091 { /* setsockopt */
10092 return -KEY_setsockopt;
10093 }
10094
10095 goto unknown;
10096
10097 default:
10098 goto unknown;
10099 }
10100
10101 default:
10102 goto unknown;
10103 }
10104 }
10105
10106 goto unknown;
10107
10108 case 'o':
10109 if (name[2] == 'c' &&
10110 name[3] == 'k' &&
10111 name[4] == 'e' &&
10112 name[5] == 't' &&
10113 name[6] == 'p' &&
10114 name[7] == 'a' &&
10115 name[8] == 'i' &&
10116 name[9] == 'r')
10117 { /* socketpair */
10118 return -KEY_socketpair;
10119 }
10120
10121 goto unknown;
10122
10123 default:
10124 goto unknown;
10125 }
10126
10127 default:
10128 goto unknown;
e2e1dd5a 10129 }
4c3bbe0f
MHM
10130
10131 case 11: /* 8 tokens of length 11 */
10132 switch (name[0])
10133 {
10134 case '_':
10135 if (name[1] == '_' &&
10136 name[2] == 'P' &&
10137 name[3] == 'A' &&
10138 name[4] == 'C' &&
10139 name[5] == 'K' &&
10140 name[6] == 'A' &&
10141 name[7] == 'G' &&
10142 name[8] == 'E' &&
10143 name[9] == '_' &&
10144 name[10] == '_')
10145 { /* __PACKAGE__ */
10146 return -KEY___PACKAGE__;
10147 }
10148
10149 goto unknown;
10150
10151 case 'e':
10152 if (name[1] == 'n' &&
10153 name[2] == 'd' &&
10154 name[3] == 'p' &&
10155 name[4] == 'r' &&
10156 name[5] == 'o' &&
10157 name[6] == 't' &&
10158 name[7] == 'o' &&
10159 name[8] == 'e' &&
10160 name[9] == 'n' &&
10161 name[10] == 't')
10162 { /* endprotoent */
10163 return -KEY_endprotoent;
10164 }
10165
10166 goto unknown;
10167
10168 case 'g':
10169 if (name[1] == 'e' &&
10170 name[2] == 't')
10171 {
10172 switch (name[3])
10173 {
10174 case 'p':
10175 switch (name[4])
10176 {
10177 case 'e':
10178 if (name[5] == 'e' &&
10179 name[6] == 'r' &&
10180 name[7] == 'n' &&
10181 name[8] == 'a' &&
10182 name[9] == 'm' &&
10183 name[10] == 'e')
10184 { /* getpeername */
10185 return -KEY_getpeername;
10186 }
10187
10188 goto unknown;
10189
10190 case 'r':
10191 switch (name[5])
10192 {
10193 case 'i':
10194 if (name[6] == 'o' &&
10195 name[7] == 'r' &&
10196 name[8] == 'i' &&
10197 name[9] == 't' &&
10198 name[10] == 'y')
10199 { /* getpriority */
10200 return -KEY_getpriority;
10201 }
10202
10203 goto unknown;
10204
10205 case 'o':
10206 if (name[6] == 't' &&
10207 name[7] == 'o' &&
10208 name[8] == 'e' &&
10209 name[9] == 'n' &&
10210 name[10] == 't')
10211 { /* getprotoent */
10212 return -KEY_getprotoent;
10213 }
10214
10215 goto unknown;
10216
10217 default:
10218 goto unknown;
10219 }
10220
10221 default:
10222 goto unknown;
10223 }
10224
10225 case 's':
10226 if (name[4] == 'o' &&
10227 name[5] == 'c' &&
10228 name[6] == 'k' &&
10229 name[7] == 'n' &&
10230 name[8] == 'a' &&
10231 name[9] == 'm' &&
10232 name[10] == 'e')
10233 { /* getsockname */
10234 return -KEY_getsockname;
10235 }
10236
10237 goto unknown;
10238
10239 default:
10240 goto unknown;
10241 }
10242 }
10243
10244 goto unknown;
10245
10246 case 's':
10247 if (name[1] == 'e' &&
10248 name[2] == 't' &&
10249 name[3] == 'p' &&
10250 name[4] == 'r')
10251 {
10252 switch (name[5])
10253 {
10254 case 'i':
10255 if (name[6] == 'o' &&
10256 name[7] == 'r' &&
10257 name[8] == 'i' &&
10258 name[9] == 't' &&
10259 name[10] == 'y')
10260 { /* setpriority */
10261 return -KEY_setpriority;
10262 }
10263
10264 goto unknown;
10265
10266 case 'o':
10267 if (name[6] == 't' &&
10268 name[7] == 'o' &&
10269 name[8] == 'e' &&
10270 name[9] == 'n' &&
10271 name[10] == 't')
10272 { /* setprotoent */
10273 return -KEY_setprotoent;
10274 }
10275
10276 goto unknown;
10277
10278 default:
10279 goto unknown;
10280 }
10281 }
10282
10283 goto unknown;
10284
10285 default:
10286 goto unknown;
e2e1dd5a 10287 }
4c3bbe0f
MHM
10288
10289 case 12: /* 2 tokens of length 12 */
10290 if (name[0] == 'g' &&
10291 name[1] == 'e' &&
10292 name[2] == 't' &&
10293 name[3] == 'n' &&
10294 name[4] == 'e' &&
10295 name[5] == 't' &&
10296 name[6] == 'b' &&
10297 name[7] == 'y')
10298 {
10299 switch (name[8])
10300 {
10301 case 'a':
10302 if (name[9] == 'd' &&
10303 name[10] == 'd' &&
10304 name[11] == 'r')
10305 { /* getnetbyaddr */
10306 return -KEY_getnetbyaddr;
10307 }
10308
10309 goto unknown;
10310
10311 case 'n':
10312 if (name[9] == 'a' &&
10313 name[10] == 'm' &&
10314 name[11] == 'e')
10315 { /* getnetbyname */
10316 return -KEY_getnetbyname;
10317 }
10318
10319 goto unknown;
10320
10321 default:
10322 goto unknown;
10323 }
e2e1dd5a 10324 }
4c3bbe0f
MHM
10325
10326 goto unknown;
10327
10328 case 13: /* 4 tokens of length 13 */
10329 if (name[0] == 'g' &&
10330 name[1] == 'e' &&
10331 name[2] == 't')
10332 {
10333 switch (name[3])
10334 {
10335 case 'h':
10336 if (name[4] == 'o' &&
10337 name[5] == 's' &&
10338 name[6] == 't' &&
10339 name[7] == 'b' &&
10340 name[8] == 'y')
10341 {
10342 switch (name[9])
10343 {
10344 case 'a':
10345 if (name[10] == 'd' &&
10346 name[11] == 'd' &&
10347 name[12] == 'r')
10348 { /* gethostbyaddr */
10349 return -KEY_gethostbyaddr;
10350 }
10351
10352 goto unknown;
10353
10354 case 'n':
10355 if (name[10] == 'a' &&
10356 name[11] == 'm' &&
10357 name[12] == 'e')
10358 { /* gethostbyname */
10359 return -KEY_gethostbyname;
10360 }
10361
10362 goto unknown;
10363
10364 default:
10365 goto unknown;
10366 }
10367 }
10368
10369 goto unknown;
10370
10371 case 's':
10372 if (name[4] == 'e' &&
10373 name[5] == 'r' &&
10374 name[6] == 'v' &&
10375 name[7] == 'b' &&
10376 name[8] == 'y')
10377 {
10378 switch (name[9])
10379 {
10380 case 'n':
10381 if (name[10] == 'a' &&
10382 name[11] == 'm' &&
10383 name[12] == 'e')
10384 { /* getservbyname */
10385 return -KEY_getservbyname;
10386 }
10387
10388 goto unknown;
10389
10390 case 'p':
10391 if (name[10] == 'o' &&
10392 name[11] == 'r' &&
10393 name[12] == 't')
10394 { /* getservbyport */
10395 return -KEY_getservbyport;
10396 }
10397
10398 goto unknown;
10399
10400 default:
10401 goto unknown;
10402 }
10403 }
10404
10405 goto unknown;
10406
10407 default:
10408 goto unknown;
10409 }
e2e1dd5a 10410 }
4c3bbe0f
MHM
10411
10412 goto unknown;
10413
10414 case 14: /* 1 tokens of length 14 */
10415 if (name[0] == 'g' &&
10416 name[1] == 'e' &&
10417 name[2] == 't' &&
10418 name[3] == 'p' &&
10419 name[4] == 'r' &&
10420 name[5] == 'o' &&
10421 name[6] == 't' &&
10422 name[7] == 'o' &&
10423 name[8] == 'b' &&
10424 name[9] == 'y' &&
10425 name[10] == 'n' &&
10426 name[11] == 'a' &&
10427 name[12] == 'm' &&
10428 name[13] == 'e')
10429 { /* getprotobyname */
10430 return -KEY_getprotobyname;
10431 }
10432
10433 goto unknown;
10434
10435 case 16: /* 1 tokens of length 16 */
10436 if (name[0] == 'g' &&
10437 name[1] == 'e' &&
10438 name[2] == 't' &&
10439 name[3] == 'p' &&
10440 name[4] == 'r' &&
10441 name[5] == 'o' &&
10442 name[6] == 't' &&
10443 name[7] == 'o' &&
10444 name[8] == 'b' &&
10445 name[9] == 'y' &&
10446 name[10] == 'n' &&
10447 name[11] == 'u' &&
10448 name[12] == 'm' &&
10449 name[13] == 'b' &&
10450 name[14] == 'e' &&
10451 name[15] == 'r')
10452 { /* getprotobynumber */
10453 return -KEY_getprotobynumber;
10454 }
10455
10456 goto unknown;
10457
10458 default:
10459 goto unknown;
e2e1dd5a 10460 }
4c3bbe0f
MHM
10461
10462unknown:
e2e1dd5a 10463 return 0;
a687059c
LW
10464}
10465
76e3520e 10466STATIC void
c94115d8 10467S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
a687059c 10468{
97aff369 10469 dVAR;
2f3197b3 10470
d008e5eb 10471 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
10472 if (ckWARN(WARN_SYNTAX)) {
10473 int level = 1;
26ff0806 10474 const char *w;
d008e5eb
GS
10475 for (w = s+2; *w && level; w++) {
10476 if (*w == '(')
10477 ++level;
10478 else if (*w == ')')
10479 --level;
10480 }
888fea98
NC
10481 while (isSPACE(*w))
10482 ++w;
b1439985
RGS
10483 /* the list of chars below is for end of statements or
10484 * block / parens, boolean operators (&&, ||, //) and branch
10485 * constructs (or, and, if, until, unless, while, err, for).
10486 * Not a very solid hack... */
10487 if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
9014280d 10488 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 10489 "%s (...) interpreted as function",name);
d008e5eb 10490 }
2f3197b3 10491 }
3280af22 10492 while (s < PL_bufend && isSPACE(*s))
2f3197b3 10493 s++;
a687059c
LW
10494 if (*s == '(')
10495 s++;
3280af22 10496 while (s < PL_bufend && isSPACE(*s))
a687059c 10497 s++;
7e2040f0 10498 if (isIDFIRST_lazy_if(s,UTF)) {
26ff0806 10499 const char * const w = s++;
7e2040f0 10500 while (isALNUM_lazy_if(s,UTF))
a687059c 10501 s++;
3280af22 10502 while (s < PL_bufend && isSPACE(*s))
a687059c 10503 s++;
e929a76b 10504 if (*s == ',') {
c94115d8 10505 GV* gv;
5458a98a 10506 if (keyword(w, s - w, 0))
e929a76b 10507 return;
c94115d8
NC
10508
10509 gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
10510 if (gv && GvCVu(gv))
abbb3198 10511 return;
cea2e8a9 10512 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
10513 }
10514 }
10515}
10516
423cee85
JH
10517/* Either returns sv, or mortalizes sv and returns a new SV*.
10518 Best used as sv=new_constant(..., sv, ...).
10519 If s, pv are NULL, calls subroutine with one argument,
10520 and type is used with error messages only. */
10521
b3ac6de7 10522STATIC SV *
7fc63493 10523S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9b0e499b 10524 const char *type)
b3ac6de7 10525{
27da23d5 10526 dVAR; dSP;
890ce7af 10527 HV * const table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 10528 SV *res;
b3ac6de7
IZ
10529 SV **cvp;
10530 SV *cv, *typesv;
89e33a05 10531 const char *why1 = "", *why2 = "", *why3 = "";
4e553d73 10532
f0af216f 10533 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
10534 SV *msg;
10535
10edeb5d
JH
10536 why2 = (const char *)
10537 (strEQ(key,"charnames")
10538 ? "(possibly a missing \"use charnames ...\")"
10539 : "");
4e553d73 10540 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
10541 (type ? type: "undef"), why2);
10542
10543 /* This is convoluted and evil ("goto considered harmful")
10544 * but I do not understand the intricacies of all the different
10545 * failure modes of %^H in here. The goal here is to make
10546 * the most probable error message user-friendly. --jhi */
10547
10548 goto msgdone;
10549
423cee85 10550 report:
4e553d73 10551 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 10552 (type ? type: "undef"), why1, why2, why3);
41ab332f 10553 msgdone:
95a20fc0 10554 yyerror(SvPVX_const(msg));
423cee85
JH
10555 SvREFCNT_dec(msg);
10556 return sv;
10557 }
b3ac6de7
IZ
10558 cvp = hv_fetch(table, key, strlen(key), FALSE);
10559 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
10560 why1 = "$^H{";
10561 why2 = key;
f0af216f 10562 why3 = "} is not defined";
423cee85 10563 goto report;
b3ac6de7
IZ
10564 }
10565 sv_2mortal(sv); /* Parent created it permanently */
10566 cv = *cvp;
423cee85
JH
10567 if (!pv && s)
10568 pv = sv_2mortal(newSVpvn(s, len));
10569 if (type && pv)
10570 typesv = sv_2mortal(newSVpv(type, 0));
b3ac6de7 10571 else
423cee85 10572 typesv = &PL_sv_undef;
4e553d73 10573
e788e7d3 10574 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
10575 ENTER ;
10576 SAVETMPS;
4e553d73 10577
423cee85 10578 PUSHMARK(SP) ;
a5845cb7 10579 EXTEND(sp, 3);
423cee85
JH
10580 if (pv)
10581 PUSHs(pv);
b3ac6de7 10582 PUSHs(sv);
423cee85
JH
10583 if (pv)
10584 PUSHs(typesv);
b3ac6de7 10585 PUTBACK;
423cee85 10586 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 10587
423cee85 10588 SPAGAIN ;
4e553d73 10589
423cee85 10590 /* Check the eval first */
9b0e499b 10591 if (!PL_in_eval && SvTRUE(ERRSV)) {
396482e1 10592 sv_catpvs(ERRSV, "Propagated");
8b6b16e7 10593 yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
e1f15930 10594 (void)POPs;
b37c2d43 10595 res = SvREFCNT_inc_simple(sv);
423cee85
JH
10596 }
10597 else {
10598 res = POPs;
b37c2d43 10599 SvREFCNT_inc_simple_void(res);
423cee85 10600 }
4e553d73 10601
423cee85
JH
10602 PUTBACK ;
10603 FREETMPS ;
10604 LEAVE ;
b3ac6de7 10605 POPSTACK;
4e553d73 10606
b3ac6de7 10607 if (!SvOK(res)) {
423cee85
JH
10608 why1 = "Call to &{$^H{";
10609 why2 = key;
f0af216f 10610 why3 = "}} did not return a defined value";
423cee85
JH
10611 sv = res;
10612 goto report;
9b0e499b 10613 }
423cee85 10614
9b0e499b 10615 return res;
b3ac6de7 10616}
4e553d73 10617
d0a148a6
NC
10618/* Returns a NUL terminated string, with the length of the string written to
10619 *slp
10620 */
76e3520e 10621STATIC char *
cea2e8a9 10622S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2 10623{
97aff369 10624 dVAR;
463ee0b2 10625 register char *d = dest;
890ce7af 10626 register char * const e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 10627 for (;;) {
8903cb82 10628 if (d >= e)
cea2e8a9 10629 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10630 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10631 *d++ = *s++;
c35e046a 10632 else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10633 *d++ = ':';
10634 *d++ = ':';
10635 s++;
10636 }
c35e046a 10637 else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
463ee0b2
LW
10638 *d++ = *s++;
10639 *d++ = *s++;
10640 }
fd400ab9 10641 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10642 char *t = s + UTF8SKIP(s);
c35e046a 10643 size_t len;
fd400ab9 10644 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3 10645 t += UTF8SKIP(t);
c35e046a
AL
10646 len = t - s;
10647 if (d + len > e)
cea2e8a9 10648 Perl_croak(aTHX_ ident_too_long);
c35e046a
AL
10649 Copy(s, d, len, char);
10650 d += len;
a0ed51b3
LW
10651 s = t;
10652 }
463ee0b2
LW
10653 else {
10654 *d = '\0';
10655 *slp = d - dest;
10656 return s;
e929a76b 10657 }
378cc40b
LW
10658 }
10659}
10660
76e3520e 10661STATIC char *
f54cb97a 10662S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b 10663{
97aff369 10664 dVAR;
6136c704 10665 char *bracket = NULL;
748a9306 10666 char funny = *s++;
6136c704
AL
10667 register char *d = dest;
10668 register char * const e = d + destlen + 3; /* two-character token, ending NUL */
378cc40b 10669
a0d0e21e 10670 if (isSPACE(*s))
29595ff2 10671 s = PEEKSPACE(s);
de3bb511 10672 if (isDIGIT(*s)) {
8903cb82 10673 while (isDIGIT(*s)) {
10674 if (d >= e)
cea2e8a9 10675 Perl_croak(aTHX_ ident_too_long);
378cc40b 10676 *d++ = *s++;
8903cb82 10677 }
378cc40b
LW
10678 }
10679 else {
463ee0b2 10680 for (;;) {
8903cb82 10681 if (d >= e)
cea2e8a9 10682 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10683 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10684 *d++ = *s++;
7e2040f0 10685 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10686 *d++ = ':';
10687 *d++ = ':';
10688 s++;
10689 }
a0d0e21e 10690 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
10691 *d++ = *s++;
10692 *d++ = *s++;
10693 }
fd400ab9 10694 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10695 char *t = s + UTF8SKIP(s);
fd400ab9 10696 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
10697 t += UTF8SKIP(t);
10698 if (d + (t - s) > e)
cea2e8a9 10699 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
10700 Copy(s, d, t - s, char);
10701 d += t - s;
10702 s = t;
10703 }
463ee0b2
LW
10704 else
10705 break;
10706 }
378cc40b
LW
10707 }
10708 *d = '\0';
10709 d = dest;
79072805 10710 if (*d) {
3280af22
NIS
10711 if (PL_lex_state != LEX_NORMAL)
10712 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 10713 return s;
378cc40b 10714 }
748a9306 10715 if (*s == '$' && s[1] &&
3792a11b 10716 (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
5cd24f17 10717 {
4810e5ec 10718 return s;
5cd24f17 10719 }
79072805
LW
10720 if (*s == '{') {
10721 bracket = s;
10722 s++;
10723 }
10724 else if (ck_uni)
10725 check_uni();
93a17b20 10726 if (s < send)
79072805
LW
10727 *d = *s++;
10728 d[1] = '\0';
2b92dfce 10729 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 10730 *d = toCTRL(*s);
10731 s++;
de3bb511 10732 }
79072805 10733 if (bracket) {
748a9306 10734 if (isSPACE(s[-1])) {
fa83b5b6 10735 while (s < send) {
f54cb97a 10736 const char ch = *s++;
bf4acbe4 10737 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 10738 *d = ch;
10739 break;
10740 }
10741 }
748a9306 10742 }
7e2040f0 10743 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 10744 d++;
a0ed51b3 10745 if (UTF) {
6136c704
AL
10746 char *end = s;
10747 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
10748 end += UTF8SKIP(end);
10749 while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
10750 end += UTF8SKIP(end);
a0ed51b3 10751 }
6136c704
AL
10752 Copy(s, d, end - s, char);
10753 d += end - s;
10754 s = end;
a0ed51b3
LW
10755 }
10756 else {
2b92dfce 10757 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 10758 *d++ = *s++;
2b92dfce 10759 if (d >= e)
cea2e8a9 10760 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 10761 }
79072805 10762 *d = '\0';
c35e046a
AL
10763 while (s < send && SPACE_OR_TAB(*s))
10764 s++;
ff68c719 10765 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
5458a98a 10766 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
10edeb5d
JH
10767 const char * const brack =
10768 (const char *)
10769 ((*s == '[') ? "[...]" : "{...}");
9014280d 10770 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 10771 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
10772 funny, dest, brack, funny, dest, brack);
10773 }
79072805 10774 bracket++;
a0be28da 10775 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
10776 return s;
10777 }
4e553d73
NIS
10778 }
10779 /* Handle extended ${^Foo} variables
2b92dfce
GS
10780 * 1999-02-27 mjd-perl-patch@plover.com */
10781 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
10782 && isALNUM(*s))
10783 {
10784 d++;
10785 while (isALNUM(*s) && d < e) {
10786 *d++ = *s++;
10787 }
10788 if (d >= e)
cea2e8a9 10789 Perl_croak(aTHX_ ident_too_long);
2b92dfce 10790 *d = '\0';
79072805
LW
10791 }
10792 if (*s == '}') {
10793 s++;
7df0d042 10794 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 10795 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
10796 PL_expect = XREF;
10797 }
d008e5eb 10798 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 10799 if (ckWARN(WARN_AMBIGUOUS) &&
780a5241
NC
10800 (keyword(dest, d - dest, 0)
10801 || get_cvn_flags(dest, d - dest, 0)))
d008e5eb 10802 {
c35e046a
AL
10803 if (funny == '#')
10804 funny = '@';
9014280d 10805 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
10806 "Ambiguous use of %c{%s} resolved to %c%s",
10807 funny, dest, funny, dest);
10808 }
10809 }
79072805
LW
10810 }
10811 else {
10812 s = bracket; /* let the parser handle it */
93a17b20 10813 *dest = '\0';
79072805
LW
10814 }
10815 }
3280af22
NIS
10816 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
10817 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
10818 return s;
10819}
10820
cea2e8a9 10821void
2b36a5a0 10822Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 10823{
96a5add6 10824 PERL_UNUSED_CONTEXT;
cde0cee5
YO
10825 if (ch<256) {
10826 char c = (char)ch;
10827 switch (c) {
10828 CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl);
a20207d7
YO
10829 case GLOBAL_PAT_MOD: *pmfl |= PMf_GLOBAL; break;
10830 case CONTINUE_PAT_MOD: *pmfl |= PMf_CONTINUE; break;
10831 case ONCE_PAT_MOD: *pmfl |= PMf_KEEP; break;
10832 case KEEPCOPY_PAT_MOD: *pmfl |= PMf_KEEPCOPY; break;
cde0cee5
YO
10833 }
10834 }
a0d0e21e 10835}
378cc40b 10836
76e3520e 10837STATIC char *
cea2e8a9 10838S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 10839{
97aff369 10840 dVAR;
79072805 10841 PMOP *pm;
5db06880 10842 char *s = scan_str(start,!!PL_madskills,FALSE);
10edeb5d 10843 const char * const valid_flags =
a20207d7 10844 (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
5db06880
NC
10845#ifdef PERL_MAD
10846 char *modstart;
10847#endif
10848
378cc40b 10849
25c09cbf 10850 if (!s) {
6136c704 10851 const char * const delimiter = skipspace(start);
10edeb5d
JH
10852 Perl_croak(aTHX_
10853 (const char *)
10854 (*delimiter == '?'
10855 ? "Search pattern not terminated or ternary operator parsed as search pattern"
10856 : "Search pattern not terminated" ));
25c09cbf 10857 }
bbce6d69 10858
8782bef2 10859 pm = (PMOP*)newPMOP(type, 0);
ad639bfb
NC
10860 if (PL_multi_open == '?') {
10861 /* This is the only point in the code that sets PMf_ONCE: */
79072805 10862 pm->op_pmflags |= PMf_ONCE;
ad639bfb
NC
10863
10864 /* Hence it's safe to do this bit of PMOP book-keeping here, which
10865 allows us to restrict the list needed by reset to just the ??
10866 matches. */
10867 assert(type != OP_TRANS);
10868 if (PL_curstash) {
10869 MAGIC *mg = mg_find((SV*)PL_curstash, PERL_MAGIC_symtab);
10870 U32 elements;
10871 if (!mg) {
10872 mg = sv_magicext((SV*)PL_curstash, 0, PERL_MAGIC_symtab, 0, 0,
10873 0);
10874 }
10875 elements = mg->mg_len / sizeof(PMOP**);
10876 Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
10877 ((PMOP**)mg->mg_ptr) [elements++] = pm;
10878 mg->mg_len = elements * sizeof(PMOP**);
10879 PmopSTASH_set(pm,PL_curstash);
10880 }
10881 }
5db06880
NC
10882#ifdef PERL_MAD
10883 modstart = s;
10884#endif
6136c704
AL
10885 while (*s && strchr(valid_flags, *s))
10886 pmflag(&pm->op_pmflags,*s++);
5db06880
NC
10887#ifdef PERL_MAD
10888 if (PL_madskills && modstart != s) {
10889 SV* tmptoken = newSVpvn(modstart, s - modstart);
10890 append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
10891 }
10892#endif
4ac733c9 10893 /* issue a warning if /c is specified,but /g is not */
041457d9
DM
10894 if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
10895 && ckWARN(WARN_REGEXP))
4ac733c9 10896 {
a20207d7
YO
10897 Perl_warner(aTHX_ packWARN(WARN_REGEXP),
10898 "Use of /c modifier is meaningless without /g" );
4ac733c9
MJD
10899 }
10900
3280af22 10901 PL_lex_op = (OP*)pm;
79072805 10902 yylval.ival = OP_MATCH;
378cc40b
LW
10903 return s;
10904}
10905
76e3520e 10906STATIC char *
cea2e8a9 10907S_scan_subst(pTHX_ char *start)
79072805 10908{
27da23d5 10909 dVAR;
a0d0e21e 10910 register char *s;
79072805 10911 register PMOP *pm;
4fdae800 10912 I32 first_start;
79072805 10913 I32 es = 0;
5db06880
NC
10914#ifdef PERL_MAD
10915 char *modstart;
10916#endif
79072805 10917
79072805
LW
10918 yylval.ival = OP_NULL;
10919
5db06880 10920 s = scan_str(start,!!PL_madskills,FALSE);
79072805 10921
37fd879b 10922 if (!s)
cea2e8a9 10923 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 10924
3280af22 10925 if (s[-1] == PL_multi_open)
79072805 10926 s--;
5db06880
NC
10927#ifdef PERL_MAD
10928 if (PL_madskills) {
cd81e915
NC
10929 CURMAD('q', PL_thisopen);
10930 CURMAD('_', PL_thiswhite);
10931 CURMAD('E', PL_thisstuff);
10932 CURMAD('Q', PL_thisclose);
10933 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
10934 }
10935#endif
79072805 10936
3280af22 10937 first_start = PL_multi_start;
5db06880 10938 s = scan_str(s,!!PL_madskills,FALSE);
79072805 10939 if (!s) {
37fd879b 10940 if (PL_lex_stuff) {
3280af22 10941 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 10942 PL_lex_stuff = NULL;
37fd879b 10943 }
cea2e8a9 10944 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 10945 }
3280af22 10946 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 10947
79072805 10948 pm = (PMOP*)newPMOP(OP_SUBST, 0);
5db06880
NC
10949
10950#ifdef PERL_MAD
10951 if (PL_madskills) {
cd81e915
NC
10952 CURMAD('z', PL_thisopen);
10953 CURMAD('R', PL_thisstuff);
10954 CURMAD('Z', PL_thisclose);
5db06880
NC
10955 }
10956 modstart = s;
10957#endif
10958
48c036b1 10959 while (*s) {
a20207d7 10960 if (*s == EXEC_PAT_MOD) {
a687059c 10961 s++;
2f3197b3 10962 es++;
a687059c 10963 }
a20207d7 10964 else if (strchr(S_PAT_MODS, *s))
a0d0e21e 10965 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
10966 else
10967 break;
378cc40b 10968 }
79072805 10969
5db06880
NC
10970#ifdef PERL_MAD
10971 if (PL_madskills) {
10972 if (modstart != s)
10973 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
10974 append_madprops(PL_thismad, (OP*)pm, 0);
10975 PL_thismad = 0;
5db06880
NC
10976 }
10977#endif
0bd48802
AL
10978 if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP)) {
10979 Perl_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
4ac733c9
MJD
10980 }
10981
79072805 10982 if (es) {
6136c704
AL
10983 SV * const repl = newSVpvs("");
10984
0244c3a4
GS
10985 PL_sublex_info.super_bufptr = s;
10986 PL_sublex_info.super_bufend = PL_bufend;
10987 PL_multi_end = 0;
79072805 10988 pm->op_pmflags |= PMf_EVAL;
463ee0b2 10989 while (es-- > 0)
10edeb5d 10990 sv_catpv(repl, (const char *)(es ? "eval " : "do "));
6f43d98f 10991 sv_catpvs(repl, "{");
3280af22 10992 sv_catsv(repl, PL_lex_repl);
9badc361
RGS
10993 if (strchr(SvPVX(PL_lex_repl), '#'))
10994 sv_catpvs(repl, "\n");
10995 sv_catpvs(repl, "}");
25da4f38 10996 SvEVALED_on(repl);
3280af22
NIS
10997 SvREFCNT_dec(PL_lex_repl);
10998 PL_lex_repl = repl;
378cc40b 10999 }
79072805 11000
3280af22 11001 PL_lex_op = (OP*)pm;
79072805 11002 yylval.ival = OP_SUBST;
378cc40b
LW
11003 return s;
11004}
11005
76e3520e 11006STATIC char *
cea2e8a9 11007S_scan_trans(pTHX_ char *start)
378cc40b 11008{
97aff369 11009 dVAR;
a0d0e21e 11010 register char* s;
11343788 11011 OP *o;
79072805
LW
11012 short *tbl;
11013 I32 squash;
a0ed51b3 11014 I32 del;
79072805 11015 I32 complement;
5db06880
NC
11016#ifdef PERL_MAD
11017 char *modstart;
11018#endif
79072805
LW
11019
11020 yylval.ival = OP_NULL;
11021
5db06880 11022 s = scan_str(start,!!PL_madskills,FALSE);
37fd879b 11023 if (!s)
cea2e8a9 11024 Perl_croak(aTHX_ "Transliteration pattern not terminated");
5db06880 11025
3280af22 11026 if (s[-1] == PL_multi_open)
2f3197b3 11027 s--;
5db06880
NC
11028#ifdef PERL_MAD
11029 if (PL_madskills) {
cd81e915
NC
11030 CURMAD('q', PL_thisopen);
11031 CURMAD('_', PL_thiswhite);
11032 CURMAD('E', PL_thisstuff);
11033 CURMAD('Q', PL_thisclose);
11034 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
11035 }
11036#endif
2f3197b3 11037
5db06880 11038 s = scan_str(s,!!PL_madskills,FALSE);
79072805 11039 if (!s) {
37fd879b 11040 if (PL_lex_stuff) {
3280af22 11041 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 11042 PL_lex_stuff = NULL;
37fd879b 11043 }
cea2e8a9 11044 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 11045 }
5db06880 11046 if (PL_madskills) {
cd81e915
NC
11047 CURMAD('z', PL_thisopen);
11048 CURMAD('R', PL_thisstuff);
11049 CURMAD('Z', PL_thisclose);
5db06880 11050 }
79072805 11051
a0ed51b3 11052 complement = del = squash = 0;
5db06880
NC
11053#ifdef PERL_MAD
11054 modstart = s;
11055#endif
7a1e2023
NC
11056 while (1) {
11057 switch (*s) {
11058 case 'c':
79072805 11059 complement = OPpTRANS_COMPLEMENT;
7a1e2023
NC
11060 break;
11061 case 'd':
a0ed51b3 11062 del = OPpTRANS_DELETE;
7a1e2023
NC
11063 break;
11064 case 's':
79072805 11065 squash = OPpTRANS_SQUASH;
7a1e2023
NC
11066 break;
11067 default:
11068 goto no_more;
11069 }
395c3793
LW
11070 s++;
11071 }
7a1e2023 11072 no_more:
8973db79 11073
aa1f7c5b 11074 tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
8973db79 11075 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
11076 o->op_private &= ~OPpTRANS_ALL;
11077 o->op_private |= del|squash|complement|
7948272d
NIS
11078 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
11079 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 11080
3280af22 11081 PL_lex_op = o;
79072805 11082 yylval.ival = OP_TRANS;
5db06880
NC
11083
11084#ifdef PERL_MAD
11085 if (PL_madskills) {
11086 if (modstart != s)
11087 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
11088 append_madprops(PL_thismad, o, 0);
11089 PL_thismad = 0;
5db06880
NC
11090 }
11091#endif
11092
79072805
LW
11093 return s;
11094}
11095
76e3520e 11096STATIC char *
cea2e8a9 11097S_scan_heredoc(pTHX_ register char *s)
79072805 11098{
97aff369 11099 dVAR;
79072805
LW
11100 SV *herewas;
11101 I32 op_type = OP_SCALAR;
11102 I32 len;
11103 SV *tmpstr;
11104 char term;
73d840c0 11105 const char *found_newline;
79072805 11106 register char *d;
fc36a67e 11107 register char *e;
4633a7c4 11108 char *peek;
f54cb97a 11109 const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
5db06880
NC
11110#ifdef PERL_MAD
11111 I32 stuffstart = s - SvPVX(PL_linestr);
11112 char *tstart;
11113
cd81e915 11114 PL_realtokenstart = -1;
5db06880 11115#endif
79072805
LW
11116
11117 s += 2;
3280af22
NIS
11118 d = PL_tokenbuf;
11119 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 11120 if (!outer)
79072805 11121 *d++ = '\n';
c35e046a
AL
11122 peek = s;
11123 while (SPACE_OR_TAB(*peek))
11124 peek++;
3792a11b 11125 if (*peek == '`' || *peek == '\'' || *peek =='"') {
4633a7c4 11126 s = peek;
79072805 11127 term = *s++;
3280af22 11128 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 11129 d += len;
3280af22 11130 if (s < PL_bufend)
79072805 11131 s++;
79072805
LW
11132 }
11133 else {
11134 if (*s == '\\')
11135 s++, term = '\'';
11136 else
11137 term = '"';
7e2040f0 11138 if (!isALNUM_lazy_if(s,UTF))
12bcd1a6 11139 deprecate_old("bare << to mean <<\"\"");
7e2040f0 11140 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 11141 if (d < e)
11142 *d++ = *s;
11143 }
11144 }
3280af22 11145 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 11146 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
11147 *d++ = '\n';
11148 *d = '\0';
3280af22 11149 len = d - PL_tokenbuf;
5db06880
NC
11150
11151#ifdef PERL_MAD
11152 if (PL_madskills) {
11153 tstart = PL_tokenbuf + !outer;
cd81e915 11154 PL_thisclose = newSVpvn(tstart, len - !outer);
5db06880 11155 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915 11156 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11157 stuffstart = s - SvPVX(PL_linestr);
11158 }
11159#endif
6a27c188 11160#ifndef PERL_STRICT_CR
f63a84b2
LW
11161 d = strchr(s, '\r');
11162 if (d) {
b464bac0 11163 char * const olds = s;
f63a84b2 11164 s = d;
3280af22 11165 while (s < PL_bufend) {
f63a84b2
LW
11166 if (*s == '\r') {
11167 *d++ = '\n';
11168 if (*++s == '\n')
11169 s++;
11170 }
11171 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
11172 *d++ = *s++;
11173 s++;
11174 }
11175 else
11176 *d++ = *s++;
11177 }
11178 *d = '\0';
3280af22 11179 PL_bufend = d;
95a20fc0 11180 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2
LW
11181 s = olds;
11182 }
11183#endif
5db06880
NC
11184#ifdef PERL_MAD
11185 found_newline = 0;
11186#endif
10edeb5d 11187 if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
73d840c0
AL
11188 herewas = newSVpvn(s,PL_bufend-s);
11189 }
11190 else {
5db06880
NC
11191#ifdef PERL_MAD
11192 herewas = newSVpvn(s-1,found_newline-s+1);
11193#else
73d840c0
AL
11194 s--;
11195 herewas = newSVpvn(s,found_newline-s);
5db06880 11196#endif
73d840c0 11197 }
5db06880
NC
11198#ifdef PERL_MAD
11199 if (PL_madskills) {
11200 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11201 if (PL_thisstuff)
11202 sv_catpvn(PL_thisstuff, tstart, s - tstart);
5db06880 11203 else
cd81e915 11204 PL_thisstuff = newSVpvn(tstart, s - tstart);
5db06880
NC
11205 }
11206#endif
79072805 11207 s += SvCUR(herewas);
748a9306 11208
5db06880
NC
11209#ifdef PERL_MAD
11210 stuffstart = s - SvPVX(PL_linestr);
11211
11212 if (found_newline)
11213 s--;
11214#endif
11215
7d0a29fe
NC
11216 tmpstr = newSV_type(SVt_PVIV);
11217 SvGROW(tmpstr, 80);
748a9306 11218 if (term == '\'') {
79072805 11219 op_type = OP_CONST;
45977657 11220 SvIV_set(tmpstr, -1);
748a9306
LW
11221 }
11222 else if (term == '`') {
79072805 11223 op_type = OP_BACKTICK;
45977657 11224 SvIV_set(tmpstr, '\\');
748a9306 11225 }
79072805
LW
11226
11227 CLINE;
57843af0 11228 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
11229 PL_multi_open = PL_multi_close = '<';
11230 term = *PL_tokenbuf;
0244c3a4 11231 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6136c704
AL
11232 char * const bufptr = PL_sublex_info.super_bufptr;
11233 char * const bufend = PL_sublex_info.super_bufend;
b464bac0 11234 char * const olds = s - SvCUR(herewas);
0244c3a4
GS
11235 s = strchr(bufptr, '\n');
11236 if (!s)
11237 s = bufend;
11238 d = s;
11239 while (s < bufend &&
11240 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
11241 if (*s++ == '\n')
57843af0 11242 CopLINE_inc(PL_curcop);
0244c3a4
GS
11243 }
11244 if (s >= bufend) {
eb160463 11245 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
11246 missingterm(PL_tokenbuf);
11247 }
11248 sv_setpvn(herewas,bufptr,d-bufptr+1);
11249 sv_setpvn(tmpstr,d+1,s-d);
11250 s += len - 1;
11251 sv_catpvn(herewas,s,bufend-s);
95a20fc0 11252 Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
0244c3a4
GS
11253
11254 s = olds;
11255 goto retval;
11256 }
11257 else if (!outer) {
79072805 11258 d = s;
3280af22
NIS
11259 while (s < PL_bufend &&
11260 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 11261 if (*s++ == '\n')
57843af0 11262 CopLINE_inc(PL_curcop);
79072805 11263 }
3280af22 11264 if (s >= PL_bufend) {
eb160463 11265 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11266 missingterm(PL_tokenbuf);
79072805
LW
11267 }
11268 sv_setpvn(tmpstr,d+1,s-d);
5db06880
NC
11269#ifdef PERL_MAD
11270 if (PL_madskills) {
cd81e915
NC
11271 if (PL_thisstuff)
11272 sv_catpvn(PL_thisstuff, d + 1, s - d);
5db06880 11273 else
cd81e915 11274 PL_thisstuff = newSVpvn(d + 1, s - d);
5db06880
NC
11275 stuffstart = s - SvPVX(PL_linestr);
11276 }
11277#endif
79072805 11278 s += len - 1;
57843af0 11279 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 11280
3280af22
NIS
11281 sv_catpvn(herewas,s,PL_bufend-s);
11282 sv_setsv(PL_linestr,herewas);
11283 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
11284 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11285 PL_last_lop = PL_last_uni = NULL;
79072805
LW
11286 }
11287 else
11288 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3280af22 11289 while (s >= PL_bufend) { /* multiple line string? */
5db06880
NC
11290#ifdef PERL_MAD
11291 if (PL_madskills) {
11292 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11293 if (PL_thisstuff)
11294 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11295 else
cd81e915 11296 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11297 }
11298#endif
fd2d0953 11299 if (!outer ||
3280af22 11300 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
eb160463 11301 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11302 missingterm(PL_tokenbuf);
79072805 11303 }
5db06880
NC
11304#ifdef PERL_MAD
11305 stuffstart = s - SvPVX(PL_linestr);
11306#endif
57843af0 11307 CopLINE_inc(PL_curcop);
3280af22 11308 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11309 PL_last_lop = PL_last_uni = NULL;
6a27c188 11310#ifndef PERL_STRICT_CR
3280af22 11311 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
11312 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
11313 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 11314 {
3280af22
NIS
11315 PL_bufend[-2] = '\n';
11316 PL_bufend--;
95a20fc0 11317 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2 11318 }
3280af22
NIS
11319 else if (PL_bufend[-1] == '\r')
11320 PL_bufend[-1] = '\n';
f63a84b2 11321 }
3280af22
NIS
11322 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
11323 PL_bufend[-1] = '\n';
f63a84b2 11324#endif
80a702cd 11325 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 11326 update_debugger_info(PL_linestr, NULL, 0);
3280af22 11327 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
95a20fc0 11328 STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
1de9afcd 11329 *(SvPVX(PL_linestr) + off ) = ' ';
3280af22
NIS
11330 sv_catsv(PL_linestr,herewas);
11331 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1de9afcd 11332 s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
79072805
LW
11333 }
11334 else {
3280af22
NIS
11335 s = PL_bufend;
11336 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
11337 }
11338 }
79072805 11339 s++;
0244c3a4 11340retval:
57843af0 11341 PL_multi_end = CopLINE(PL_curcop);
79072805 11342 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
1da4ca5f 11343 SvPV_shrink_to_cur(tmpstr);
79072805 11344 }
8990e307 11345 SvREFCNT_dec(herewas);
2f31ce75 11346 if (!IN_BYTES) {
95a20fc0 11347 if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
2f31ce75
JH
11348 SvUTF8_on(tmpstr);
11349 else if (PL_encoding)
11350 sv_recode_to_utf8(tmpstr, PL_encoding);
11351 }
3280af22 11352 PL_lex_stuff = tmpstr;
79072805
LW
11353 yylval.ival = op_type;
11354 return s;
11355}
11356
02aa26ce
NT
11357/* scan_inputsymbol
11358 takes: current position in input buffer
11359 returns: new position in input buffer
11360 side-effects: yylval and lex_op are set.
11361
11362 This code handles:
11363
11364 <> read from ARGV
11365 <FH> read from filehandle
11366 <pkg::FH> read from package qualified filehandle
11367 <pkg'FH> read from package qualified filehandle
11368 <$fh> read from filehandle in $fh
11369 <*.h> filename glob
11370
11371*/
11372
76e3520e 11373STATIC char *
cea2e8a9 11374S_scan_inputsymbol(pTHX_ char *start)
79072805 11375{
97aff369 11376 dVAR;
02aa26ce 11377 register char *s = start; /* current position in buffer */
1b420867 11378 char *end;
79072805
LW
11379 I32 len;
11380
6136c704
AL
11381 char *d = PL_tokenbuf; /* start of temp holding space */
11382 const char * const e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
11383
1b420867
GS
11384 end = strchr(s, '\n');
11385 if (!end)
11386 end = PL_bufend;
11387 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
11388
11389 /* die if we didn't have space for the contents of the <>,
1b420867 11390 or if it didn't end, or if we see a newline
02aa26ce
NT
11391 */
11392
bb7a0f54 11393 if (len >= (I32)sizeof PL_tokenbuf)
cea2e8a9 11394 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 11395 if (s >= end)
cea2e8a9 11396 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 11397
fc36a67e 11398 s++;
02aa26ce
NT
11399
11400 /* check for <$fh>
11401 Remember, only scalar variables are interpreted as filehandles by
11402 this code. Anything more complex (e.g., <$fh{$num}>) will be
11403 treated as a glob() call.
11404 This code makes use of the fact that except for the $ at the front,
11405 a scalar variable and a filehandle look the same.
11406 */
4633a7c4 11407 if (*d == '$' && d[1]) d++;
02aa26ce
NT
11408
11409 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 11410 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 11411 d++;
02aa26ce
NT
11412
11413 /* If we've tried to read what we allow filehandles to look like, and
11414 there's still text left, then it must be a glob() and not a getline.
11415 Use scan_str to pull out the stuff between the <> and treat it
11416 as nothing more than a string.
11417 */
11418
3280af22 11419 if (d - PL_tokenbuf != len) {
79072805
LW
11420 yylval.ival = OP_GLOB;
11421 set_csh();
5db06880 11422 s = scan_str(start,!!PL_madskills,FALSE);
79072805 11423 if (!s)
cea2e8a9 11424 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
11425 return s;
11426 }
395c3793 11427 else {
9b3023bc 11428 bool readline_overriden = FALSE;
6136c704 11429 GV *gv_readline;
9b3023bc 11430 GV **gvp;
02aa26ce 11431 /* we're in a filehandle read situation */
3280af22 11432 d = PL_tokenbuf;
02aa26ce
NT
11433
11434 /* turn <> into <ARGV> */
79072805 11435 if (!len)
689badd5 11436 Copy("ARGV",d,5,char);
02aa26ce 11437
9b3023bc 11438 /* Check whether readline() is overriden */
fafc274c 11439 gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
6136c704 11440 if ((gv_readline
ba979b31 11441 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 11442 ||
017a3ce5 11443 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
9e0d86f8 11444 && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
ba979b31 11445 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
11446 readline_overriden = TRUE;
11447
02aa26ce
NT
11448 /* if <$fh>, create the ops to turn the variable into a
11449 filehandle
11450 */
79072805 11451 if (*d == '$') {
02aa26ce
NT
11452 /* try to find it in the pad for this block, otherwise find
11453 add symbol table ops
11454 */
bbd11bfc
AL
11455 const PADOFFSET tmp = pad_findmy(d);
11456 if (tmp != NOT_IN_PAD) {
00b1698f 11457 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
6136c704
AL
11458 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
11459 HEK * const stashname = HvNAME_HEK(stash);
11460 SV * const sym = sv_2mortal(newSVhek(stashname));
396482e1 11461 sv_catpvs(sym, "::");
f558d5af
JH
11462 sv_catpv(sym, d+1);
11463 d = SvPVX(sym);
11464 goto intro_sym;
11465 }
11466 else {
6136c704 11467 OP * const o = newOP(OP_PADSV, 0);
f558d5af 11468 o->op_targ = tmp;
9b3023bc
RGS
11469 PL_lex_op = readline_overriden
11470 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11471 append_elem(OP_LIST, o,
11472 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
11473 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 11474 }
a0d0e21e
LW
11475 }
11476 else {
f558d5af
JH
11477 GV *gv;
11478 ++d;
11479intro_sym:
11480 gv = gv_fetchpv(d,
11481 (PL_in_eval
11482 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 11483 : GV_ADDMULTI),
f558d5af 11484 SVt_PV);
9b3023bc
RGS
11485 PL_lex_op = readline_overriden
11486 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11487 append_elem(OP_LIST,
11488 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
11489 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11490 : (OP*)newUNOP(OP_READLINE, 0,
11491 newUNOP(OP_RV2SV, 0,
11492 newGVOP(OP_GV, 0, gv)));
a0d0e21e 11493 }
7c6fadd6
RGS
11494 if (!readline_overriden)
11495 PL_lex_op->op_flags |= OPf_SPECIAL;
f5284f61 11496 /* we created the ops in PL_lex_op, so make yylval.ival a null op */
79072805
LW
11497 yylval.ival = OP_NULL;
11498 }
02aa26ce
NT
11499
11500 /* If it's none of the above, it must be a literal filehandle
11501 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 11502 else {
6136c704 11503 GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
9b3023bc
RGS
11504 PL_lex_op = readline_overriden
11505 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11506 append_elem(OP_LIST,
11507 newGVOP(OP_GV, 0, gv),
11508 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11509 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
79072805
LW
11510 yylval.ival = OP_NULL;
11511 }
11512 }
02aa26ce 11513
79072805
LW
11514 return s;
11515}
11516
02aa26ce
NT
11517
11518/* scan_str
11519 takes: start position in buffer
09bef843
SB
11520 keep_quoted preserve \ on the embedded delimiter(s)
11521 keep_delims preserve the delimiters around the string
02aa26ce
NT
11522 returns: position to continue reading from buffer
11523 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
11524 updates the read buffer.
11525
11526 This subroutine pulls a string out of the input. It is called for:
11527 q single quotes q(literal text)
11528 ' single quotes 'literal text'
11529 qq double quotes qq(interpolate $here please)
11530 " double quotes "interpolate $here please"
11531 qx backticks qx(/bin/ls -l)
11532 ` backticks `/bin/ls -l`
11533 qw quote words @EXPORT_OK = qw( func() $spam )
11534 m// regexp match m/this/
11535 s/// regexp substitute s/this/that/
11536 tr/// string transliterate tr/this/that/
11537 y/// string transliterate y/this/that/
11538 ($*@) sub prototypes sub foo ($)
09bef843 11539 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
11540 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
11541
11542 In most of these cases (all but <>, patterns and transliterate)
11543 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
11544 calls scan_str(). s/// makes yylex() call scan_subst() which calls
11545 scan_str(). tr/// and y/// make yylex() call scan_trans() which
11546 calls scan_str().
4e553d73 11547
02aa26ce
NT
11548 It skips whitespace before the string starts, and treats the first
11549 character as the delimiter. If the delimiter is one of ([{< then
11550 the corresponding "close" character )]}> is used as the closing
11551 delimiter. It allows quoting of delimiters, and if the string has
11552 balanced delimiters ([{<>}]) it allows nesting.
11553
37fd879b
HS
11554 On success, the SV with the resulting string is put into lex_stuff or,
11555 if that is already non-NULL, into lex_repl. The second case occurs only
11556 when parsing the RHS of the special constructs s/// and tr/// (y///).
11557 For convenience, the terminating delimiter character is stuffed into
11558 SvIVX of the SV.
02aa26ce
NT
11559*/
11560
76e3520e 11561STATIC char *
09bef843 11562S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 11563{
97aff369 11564 dVAR;
02aa26ce 11565 SV *sv; /* scalar value: string */
d3fcec1f 11566 const char *tmps; /* temp string, used for delimiter matching */
02aa26ce
NT
11567 register char *s = start; /* current position in the buffer */
11568 register char term; /* terminating character */
11569 register char *to; /* current position in the sv's data */
11570 I32 brackets = 1; /* bracket nesting level */
89491803 11571 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e 11572 I32 termcode; /* terminating char. code */
89ebb4a3 11573 U8 termstr[UTF8_MAXBYTES]; /* terminating string */
220e2d4e 11574 STRLEN termlen; /* length of terminating string */
0331ef07 11575 int last_off = 0; /* last position for nesting bracket */
5db06880
NC
11576#ifdef PERL_MAD
11577 int stuffstart;
11578 char *tstart;
11579#endif
02aa26ce
NT
11580
11581 /* skip space before the delimiter */
29595ff2
NC
11582 if (isSPACE(*s)) {
11583 s = PEEKSPACE(s);
11584 }
02aa26ce 11585
5db06880 11586#ifdef PERL_MAD
cd81e915
NC
11587 if (PL_realtokenstart >= 0) {
11588 stuffstart = PL_realtokenstart;
11589 PL_realtokenstart = -1;
5db06880
NC
11590 }
11591 else
11592 stuffstart = start - SvPVX(PL_linestr);
11593#endif
02aa26ce 11594 /* mark where we are, in case we need to report errors */
79072805 11595 CLINE;
02aa26ce
NT
11596
11597 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 11598 term = *s;
220e2d4e
IH
11599 if (!UTF) {
11600 termcode = termstr[0] = term;
11601 termlen = 1;
11602 }
11603 else {
f3b9ce0f 11604 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
11605 Copy(s, termstr, termlen, U8);
11606 if (!UTF8_IS_INVARIANT(term))
11607 has_utf8 = TRUE;
11608 }
b1c7b182 11609
02aa26ce 11610 /* mark where we are */
57843af0 11611 PL_multi_start = CopLINE(PL_curcop);
3280af22 11612 PL_multi_open = term;
02aa26ce
NT
11613
11614 /* find corresponding closing delimiter */
93a17b20 11615 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
11616 termcode = termstr[0] = term = tmps[5];
11617
3280af22 11618 PL_multi_close = term;
79072805 11619
561b68a9
SH
11620 /* create a new SV to hold the contents. 79 is the SV's initial length.
11621 What a random number. */
7d0a29fe
NC
11622 sv = newSV_type(SVt_PVIV);
11623 SvGROW(sv, 80);
45977657 11624 SvIV_set(sv, termcode);
a0d0e21e 11625 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
11626
11627 /* move past delimiter and try to read a complete string */
09bef843 11628 if (keep_delims)
220e2d4e
IH
11629 sv_catpvn(sv, s, termlen);
11630 s += termlen;
5db06880
NC
11631#ifdef PERL_MAD
11632 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11633 if (!PL_thisopen && !keep_delims) {
11634 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11635 stuffstart = s - SvPVX(PL_linestr);
11636 }
11637#endif
93a17b20 11638 for (;;) {
220e2d4e
IH
11639 if (PL_encoding && !UTF) {
11640 bool cont = TRUE;
11641
11642 while (cont) {
95a20fc0 11643 int offset = s - SvPVX_const(PL_linestr);
66a1b24b 11644 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 11645 &offset, (char*)termstr, termlen);
6136c704
AL
11646 const char * const ns = SvPVX_const(PL_linestr) + offset;
11647 char * const svlast = SvEND(sv) - 1;
220e2d4e
IH
11648
11649 for (; s < ns; s++) {
11650 if (*s == '\n' && !PL_rsfp)
11651 CopLINE_inc(PL_curcop);
11652 }
11653 if (!found)
11654 goto read_more_line;
11655 else {
11656 /* handle quoted delimiters */
52327caf 11657 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
f54cb97a 11658 const char *t;
95a20fc0 11659 for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
220e2d4e
IH
11660 t--;
11661 if ((svlast-1 - t) % 2) {
11662 if (!keep_quoted) {
11663 *(svlast-1) = term;
11664 *svlast = '\0';
11665 SvCUR_set(sv, SvCUR(sv) - 1);
11666 }
11667 continue;
11668 }
11669 }
11670 if (PL_multi_open == PL_multi_close) {
11671 cont = FALSE;
11672 }
11673 else {
f54cb97a
AL
11674 const char *t;
11675 char *w;
0331ef07 11676 for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
220e2d4e
IH
11677 /* At here, all closes are "was quoted" one,
11678 so we don't check PL_multi_close. */
11679 if (*t == '\\') {
11680 if (!keep_quoted && *(t+1) == PL_multi_open)
11681 t++;
11682 else
11683 *w++ = *t++;
11684 }
11685 else if (*t == PL_multi_open)
11686 brackets++;
11687
11688 *w = *t;
11689 }
11690 if (w < t) {
11691 *w++ = term;
11692 *w = '\0';
95a20fc0 11693 SvCUR_set(sv, w - SvPVX_const(sv));
220e2d4e 11694 }
0331ef07 11695 last_off = w - SvPVX(sv);
220e2d4e
IH
11696 if (--brackets <= 0)
11697 cont = FALSE;
11698 }
11699 }
11700 }
11701 if (!keep_delims) {
11702 SvCUR_set(sv, SvCUR(sv) - 1);
11703 *SvEND(sv) = '\0';
11704 }
11705 break;
11706 }
11707
02aa26ce 11708 /* extend sv if need be */
3280af22 11709 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 11710 /* set 'to' to the next character in the sv's string */
463ee0b2 11711 to = SvPVX(sv)+SvCUR(sv);
09bef843 11712
02aa26ce 11713 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
11714 if (PL_multi_open == PL_multi_close) {
11715 for (; s < PL_bufend; s++,to++) {
02aa26ce 11716 /* embedded newlines increment the current line number */
3280af22 11717 if (*s == '\n' && !PL_rsfp)
57843af0 11718 CopLINE_inc(PL_curcop);
02aa26ce 11719 /* handle quoted delimiters */
3280af22 11720 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 11721 if (!keep_quoted && s[1] == term)
a0d0e21e 11722 s++;
02aa26ce 11723 /* any other quotes are simply copied straight through */
a0d0e21e
LW
11724 else
11725 *to++ = *s++;
11726 }
02aa26ce
NT
11727 /* terminate when run out of buffer (the for() condition), or
11728 have found the terminator */
220e2d4e
IH
11729 else if (*s == term) {
11730 if (termlen == 1)
11731 break;
f3b9ce0f 11732 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
11733 break;
11734 }
63cd0674 11735 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11736 has_utf8 = TRUE;
93a17b20
LW
11737 *to = *s;
11738 }
11739 }
02aa26ce
NT
11740
11741 /* if the terminator isn't the same as the start character (e.g.,
11742 matched brackets), we have to allow more in the quoting, and
11743 be prepared for nested brackets.
11744 */
93a17b20 11745 else {
02aa26ce 11746 /* read until we run out of string, or we find the terminator */
3280af22 11747 for (; s < PL_bufend; s++,to++) {
02aa26ce 11748 /* embedded newlines increment the line count */
3280af22 11749 if (*s == '\n' && !PL_rsfp)
57843af0 11750 CopLINE_inc(PL_curcop);
02aa26ce 11751 /* backslashes can escape the open or closing characters */
3280af22 11752 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
11753 if (!keep_quoted &&
11754 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
11755 s++;
11756 else
11757 *to++ = *s++;
11758 }
02aa26ce 11759 /* allow nested opens and closes */
3280af22 11760 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 11761 break;
3280af22 11762 else if (*s == PL_multi_open)
93a17b20 11763 brackets++;
63cd0674 11764 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11765 has_utf8 = TRUE;
93a17b20
LW
11766 *to = *s;
11767 }
11768 }
02aa26ce 11769 /* terminate the copied string and update the sv's end-of-string */
93a17b20 11770 *to = '\0';
95a20fc0 11771 SvCUR_set(sv, to - SvPVX_const(sv));
93a17b20 11772
02aa26ce
NT
11773 /*
11774 * this next chunk reads more into the buffer if we're not done yet
11775 */
11776
b1c7b182
GS
11777 if (s < PL_bufend)
11778 break; /* handle case where we are done yet :-) */
79072805 11779
6a27c188 11780#ifndef PERL_STRICT_CR
95a20fc0 11781 if (to - SvPVX_const(sv) >= 2) {
c6f14548
GS
11782 if ((to[-2] == '\r' && to[-1] == '\n') ||
11783 (to[-2] == '\n' && to[-1] == '\r'))
11784 {
f63a84b2
LW
11785 to[-2] = '\n';
11786 to--;
95a20fc0 11787 SvCUR_set(sv, to - SvPVX_const(sv));
f63a84b2
LW
11788 }
11789 else if (to[-1] == '\r')
11790 to[-1] = '\n';
11791 }
95a20fc0 11792 else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
f63a84b2
LW
11793 to[-1] = '\n';
11794#endif
11795
220e2d4e 11796 read_more_line:
02aa26ce
NT
11797 /* if we're out of file, or a read fails, bail and reset the current
11798 line marker so we can report where the unterminated string began
11799 */
5db06880
NC
11800#ifdef PERL_MAD
11801 if (PL_madskills) {
c35e046a 11802 char * const tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11803 if (PL_thisstuff)
11804 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11805 else
cd81e915 11806 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11807 }
11808#endif
3280af22
NIS
11809 if (!PL_rsfp ||
11810 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 11811 sv_free(sv);
eb160463 11812 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
bd61b366 11813 return NULL;
79072805 11814 }
5db06880
NC
11815#ifdef PERL_MAD
11816 stuffstart = 0;
11817#endif
02aa26ce 11818 /* we read a line, so increment our line counter */
57843af0 11819 CopLINE_inc(PL_curcop);
a0ed51b3 11820
02aa26ce 11821 /* update debugger info */
80a702cd 11822 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 11823 update_debugger_info(PL_linestr, NULL, 0);
a0ed51b3 11824
3280af22
NIS
11825 /* having changed the buffer, we must update PL_bufend */
11826 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11827 PL_last_lop = PL_last_uni = NULL;
378cc40b 11828 }
4e553d73 11829
02aa26ce
NT
11830 /* at this point, we have successfully read the delimited string */
11831
220e2d4e 11832 if (!PL_encoding || UTF) {
5db06880
NC
11833#ifdef PERL_MAD
11834 if (PL_madskills) {
c35e046a 11835 char * const tstart = SvPVX(PL_linestr) + stuffstart;
29522234 11836 const int len = s - tstart;
cd81e915 11837 if (PL_thisstuff)
c35e046a 11838 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 11839 else
c35e046a 11840 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
11841 if (!PL_thisclose && !keep_delims)
11842 PL_thisclose = newSVpvn(s,termlen);
5db06880
NC
11843 }
11844#endif
11845
220e2d4e
IH
11846 if (keep_delims)
11847 sv_catpvn(sv, s, termlen);
11848 s += termlen;
11849 }
5db06880
NC
11850#ifdef PERL_MAD
11851 else {
11852 if (PL_madskills) {
c35e046a
AL
11853 char * const tstart = SvPVX(PL_linestr) + stuffstart;
11854 const int len = s - tstart - termlen;
cd81e915 11855 if (PL_thisstuff)
c35e046a 11856 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 11857 else
c35e046a 11858 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
11859 if (!PL_thisclose && !keep_delims)
11860 PL_thisclose = newSVpvn(s - termlen,termlen);
5db06880
NC
11861 }
11862 }
11863#endif
220e2d4e 11864 if (has_utf8 || PL_encoding)
b1c7b182 11865 SvUTF8_on(sv);
d0063567 11866
57843af0 11867 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
11868
11869 /* if we allocated too much space, give some back */
93a17b20
LW
11870 if (SvCUR(sv) + 5 < SvLEN(sv)) {
11871 SvLEN_set(sv, SvCUR(sv) + 1);
b7e9a5c2 11872 SvPV_renew(sv, SvLEN(sv));
79072805 11873 }
02aa26ce
NT
11874
11875 /* decide whether this is the first or second quoted string we've read
11876 for this op
11877 */
4e553d73 11878
3280af22
NIS
11879 if (PL_lex_stuff)
11880 PL_lex_repl = sv;
79072805 11881 else
3280af22 11882 PL_lex_stuff = sv;
378cc40b
LW
11883 return s;
11884}
11885
02aa26ce
NT
11886/*
11887 scan_num
11888 takes: pointer to position in buffer
11889 returns: pointer to new position in buffer
11890 side-effects: builds ops for the constant in yylval.op
11891
11892 Read a number in any of the formats that Perl accepts:
11893
7fd134d9
JH
11894 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
11895 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
11896 0b[01](_?[01])*
11897 0[0-7](_?[0-7])*
11898 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 11899
3280af22 11900 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
11901 thing it reads.
11902
11903 If it reads a number without a decimal point or an exponent, it will
11904 try converting the number to an integer and see if it can do so
11905 without loss of precision.
11906*/
4e553d73 11907
378cc40b 11908char *
bfed75c6 11909Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
378cc40b 11910{
97aff369 11911 dVAR;
bfed75c6 11912 register const char *s = start; /* current position in buffer */
02aa26ce
NT
11913 register char *d; /* destination in temp buffer */
11914 register char *e; /* end of temp buffer */
86554af2 11915 NV nv; /* number read, as a double */
a0714e2c 11916 SV *sv = NULL; /* place to put the converted number */
a86a20aa 11917 bool floatit; /* boolean: int or float? */
cbbf8932 11918 const char *lastub = NULL; /* position of last underbar */
bfed75c6 11919 static char const number_too_long[] = "Number too long";
378cc40b 11920
02aa26ce
NT
11921 /* We use the first character to decide what type of number this is */
11922
378cc40b 11923 switch (*s) {
79072805 11924 default:
cea2e8a9 11925 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 11926
02aa26ce 11927 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 11928 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
11929 case '0':
11930 {
02aa26ce
NT
11931 /* variables:
11932 u holds the "number so far"
4f19785b
WSI
11933 shift the power of 2 of the base
11934 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
11935 overflowed was the number more than we can hold?
11936
11937 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
11938 we in octal/hex/binary?" indicator to disallow hex characters
11939 when in octal mode.
02aa26ce 11940 */
9e24b6e2
JH
11941 NV n = 0.0;
11942 UV u = 0;
79072805 11943 I32 shift;
9e24b6e2 11944 bool overflowed = FALSE;
61f33854 11945 bool just_zero = TRUE; /* just plain 0 or binary number? */
27da23d5
JH
11946 static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
11947 static const char* const bases[5] =
11948 { "", "binary", "", "octal", "hexadecimal" };
11949 static const char* const Bases[5] =
11950 { "", "Binary", "", "Octal", "Hexadecimal" };
11951 static const char* const maxima[5] =
11952 { "",
11953 "0b11111111111111111111111111111111",
11954 "",
11955 "037777777777",
11956 "0xffffffff" };
bfed75c6 11957 const char *base, *Base, *max;
378cc40b 11958
02aa26ce 11959 /* check for hex */
378cc40b
LW
11960 if (s[1] == 'x') {
11961 shift = 4;
11962 s += 2;
61f33854 11963 just_zero = FALSE;
4f19785b
WSI
11964 } else if (s[1] == 'b') {
11965 shift = 1;
11966 s += 2;
61f33854 11967 just_zero = FALSE;
378cc40b 11968 }
02aa26ce 11969 /* check for a decimal in disguise */
b78218b7 11970 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 11971 goto decimal;
02aa26ce 11972 /* so it must be octal */
928753ea 11973 else {
378cc40b 11974 shift = 3;
928753ea
JH
11975 s++;
11976 }
11977
11978 if (*s == '_') {
11979 if (ckWARN(WARN_SYNTAX))
9014280d 11980 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
11981 "Misplaced _ in number");
11982 lastub = s++;
11983 }
9e24b6e2
JH
11984
11985 base = bases[shift];
11986 Base = Bases[shift];
11987 max = maxima[shift];
02aa26ce 11988
4f19785b 11989 /* read the rest of the number */
378cc40b 11990 for (;;) {
9e24b6e2 11991 /* x is used in the overflow test,
893fe2c2 11992 b is the digit we're adding on. */
9e24b6e2 11993 UV x, b;
55497cff 11994
378cc40b 11995 switch (*s) {
02aa26ce
NT
11996
11997 /* if we don't mention it, we're done */
378cc40b
LW
11998 default:
11999 goto out;
02aa26ce 12000
928753ea 12001 /* _ are ignored -- but warned about if consecutive */
de3bb511 12002 case '_':
041457d9 12003 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12004 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12005 "Misplaced _ in number");
12006 lastub = s++;
de3bb511 12007 break;
02aa26ce
NT
12008
12009 /* 8 and 9 are not octal */
378cc40b 12010 case '8': case '9':
4f19785b 12011 if (shift == 3)
cea2e8a9 12012 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 12013 /* FALL THROUGH */
02aa26ce
NT
12014
12015 /* octal digits */
4f19785b 12016 case '2': case '3': case '4':
378cc40b 12017 case '5': case '6': case '7':
4f19785b 12018 if (shift == 1)
cea2e8a9 12019 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
12020 /* FALL THROUGH */
12021
12022 case '0': case '1':
02aa26ce 12023 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 12024 goto digit;
02aa26ce
NT
12025
12026 /* hex digits */
378cc40b
LW
12027 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12028 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 12029 /* make sure they said 0x */
378cc40b
LW
12030 if (shift != 4)
12031 goto out;
55497cff 12032 b = (*s++ & 7) + 9;
02aa26ce
NT
12033
12034 /* Prepare to put the digit we have onto the end
12035 of the number so far. We check for overflows.
12036 */
12037
55497cff 12038 digit:
61f33854 12039 just_zero = FALSE;
9e24b6e2
JH
12040 if (!overflowed) {
12041 x = u << shift; /* make room for the digit */
12042
12043 if ((x >> shift) != u
12044 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
12045 overflowed = TRUE;
12046 n = (NV) u;
767a6a26 12047 if (ckWARN_d(WARN_OVERFLOW))
9014280d 12048 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
9e24b6e2
JH
12049 "Integer overflow in %s number",
12050 base);
12051 } else
12052 u = x | b; /* add the digit to the end */
12053 }
12054 if (overflowed) {
12055 n *= nvshift[shift];
12056 /* If an NV has not enough bits in its
12057 * mantissa to represent an UV this summing of
12058 * small low-order numbers is a waste of time
12059 * (because the NV cannot preserve the
12060 * low-order bits anyway): we could just
12061 * remember when did we overflow and in the
12062 * end just multiply n by the right
12063 * amount. */
12064 n += (NV) b;
55497cff 12065 }
378cc40b
LW
12066 break;
12067 }
12068 }
02aa26ce
NT
12069
12070 /* if we get here, we had success: make a scalar value from
12071 the number.
12072 */
378cc40b 12073 out:
928753ea
JH
12074
12075 /* final misplaced underbar check */
12076 if (s[-1] == '_') {
12077 if (ckWARN(WARN_SYNTAX))
9014280d 12078 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
12079 }
12080
561b68a9 12081 sv = newSV(0);
9e24b6e2 12082 if (overflowed) {
041457d9 12083 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
9014280d 12084 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12085 "%s number > %s non-portable",
12086 Base, max);
12087 sv_setnv(sv, n);
12088 }
12089 else {
15041a67 12090#if UVSIZE > 4
041457d9 12091 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
9014280d 12092 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12093 "%s number > %s non-portable",
12094 Base, max);
2cc4c2dc 12095#endif
9e24b6e2
JH
12096 sv_setuv(sv, u);
12097 }
61f33854 12098 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
bfed75c6 12099 sv = new_constant(start, s - start, "integer",
a0714e2c 12100 sv, NULL, NULL);
61f33854 12101 else if (PL_hints & HINT_NEW_BINARY)
a0714e2c 12102 sv = new_constant(start, s - start, "binary", sv, NULL, NULL);
378cc40b
LW
12103 }
12104 break;
02aa26ce
NT
12105
12106 /*
12107 handle decimal numbers.
12108 we're also sent here when we read a 0 as the first digit
12109 */
378cc40b
LW
12110 case '1': case '2': case '3': case '4': case '5':
12111 case '6': case '7': case '8': case '9': case '.':
12112 decimal:
3280af22
NIS
12113 d = PL_tokenbuf;
12114 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 12115 floatit = FALSE;
02aa26ce
NT
12116
12117 /* read next group of digits and _ and copy into d */
de3bb511 12118 while (isDIGIT(*s) || *s == '_') {
4e553d73 12119 /* skip underscores, checking for misplaced ones
02aa26ce
NT
12120 if -w is on
12121 */
93a17b20 12122 if (*s == '_') {
041457d9 12123 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12124 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12125 "Misplaced _ in number");
12126 lastub = s++;
93a17b20 12127 }
fc36a67e 12128 else {
02aa26ce 12129 /* check for end of fixed-length buffer */
fc36a67e 12130 if (d >= e)
cea2e8a9 12131 Perl_croak(aTHX_ number_too_long);
02aa26ce 12132 /* if we're ok, copy the character */
378cc40b 12133 *d++ = *s++;
fc36a67e 12134 }
378cc40b 12135 }
02aa26ce
NT
12136
12137 /* final misplaced underbar check */
928753ea 12138 if (lastub && s == lastub + 1) {
d008e5eb 12139 if (ckWARN(WARN_SYNTAX))
9014280d 12140 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 12141 }
02aa26ce
NT
12142
12143 /* read a decimal portion if there is one. avoid
12144 3..5 being interpreted as the number 3. followed
12145 by .5
12146 */
2f3197b3 12147 if (*s == '.' && s[1] != '.') {
79072805 12148 floatit = TRUE;
378cc40b 12149 *d++ = *s++;
02aa26ce 12150
928753ea
JH
12151 if (*s == '_') {
12152 if (ckWARN(WARN_SYNTAX))
9014280d 12153 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12154 "Misplaced _ in number");
12155 lastub = s;
12156 }
12157
12158 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 12159 */
fc36a67e 12160 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 12161 /* fixed length buffer check */
fc36a67e 12162 if (d >= e)
cea2e8a9 12163 Perl_croak(aTHX_ number_too_long);
928753ea 12164 if (*s == '_') {
041457d9 12165 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12166 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12167 "Misplaced _ in number");
12168 lastub = s;
12169 }
12170 else
fc36a67e 12171 *d++ = *s;
378cc40b 12172 }
928753ea
JH
12173 /* fractional part ending in underbar? */
12174 if (s[-1] == '_') {
12175 if (ckWARN(WARN_SYNTAX))
9014280d 12176 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12177 "Misplaced _ in number");
12178 }
dd629d5b
GS
12179 if (*s == '.' && isDIGIT(s[1])) {
12180 /* oops, it's really a v-string, but without the "v" */
f4758303 12181 s = start;
dd629d5b
GS
12182 goto vstring;
12183 }
378cc40b 12184 }
02aa26ce
NT
12185
12186 /* read exponent part, if present */
3792a11b 12187 if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
79072805
LW
12188 floatit = TRUE;
12189 s++;
02aa26ce
NT
12190
12191 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 12192 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 12193
7fd134d9
JH
12194 /* stray preinitial _ */
12195 if (*s == '_') {
12196 if (ckWARN(WARN_SYNTAX))
9014280d 12197 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12198 "Misplaced _ in number");
12199 lastub = s++;
12200 }
12201
02aa26ce 12202 /* allow positive or negative exponent */
378cc40b
LW
12203 if (*s == '+' || *s == '-')
12204 *d++ = *s++;
02aa26ce 12205
7fd134d9
JH
12206 /* stray initial _ */
12207 if (*s == '_') {
12208 if (ckWARN(WARN_SYNTAX))
9014280d 12209 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12210 "Misplaced _ in number");
12211 lastub = s++;
12212 }
12213
7fd134d9
JH
12214 /* read digits of exponent */
12215 while (isDIGIT(*s) || *s == '_') {
12216 if (isDIGIT(*s)) {
12217 if (d >= e)
12218 Perl_croak(aTHX_ number_too_long);
b3b48e3e 12219 *d++ = *s++;
7fd134d9
JH
12220 }
12221 else {
041457d9
DM
12222 if (((lastub && s == lastub + 1) ||
12223 (!isDIGIT(s[1]) && s[1] != '_'))
12224 && ckWARN(WARN_SYNTAX))
9014280d 12225 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9 12226 "Misplaced _ in number");
b3b48e3e 12227 lastub = s++;
7fd134d9 12228 }
7fd134d9 12229 }
378cc40b 12230 }
02aa26ce 12231
02aa26ce
NT
12232
12233 /* make an sv from the string */
561b68a9 12234 sv = newSV(0);
097ee67d 12235
0b7fceb9 12236 /*
58bb9ec3
NC
12237 We try to do an integer conversion first if no characters
12238 indicating "float" have been found.
0b7fceb9
MU
12239 */
12240
12241 if (!floatit) {
58bb9ec3 12242 UV uv;
6136c704 12243 const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
58bb9ec3
NC
12244
12245 if (flags == IS_NUMBER_IN_UV) {
12246 if (uv <= IV_MAX)
86554af2 12247 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 12248 else
c239479b 12249 sv_setuv(sv, uv);
58bb9ec3
NC
12250 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
12251 if (uv <= (UV) IV_MIN)
12252 sv_setiv(sv, -(IV)uv);
12253 else
12254 floatit = TRUE;
12255 } else
12256 floatit = TRUE;
12257 }
0b7fceb9 12258 if (floatit) {
58bb9ec3
NC
12259 /* terminate the string */
12260 *d = '\0';
86554af2
JH
12261 nv = Atof(PL_tokenbuf);
12262 sv_setnv(sv, nv);
12263 }
86554af2 12264
b8403495
JH
12265 if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
12266 (PL_hints & HINT_NEW_INTEGER) )
10edeb5d
JH
12267 sv = new_constant(PL_tokenbuf,
12268 d - PL_tokenbuf,
12269 (const char *)
b8403495 12270 (floatit ? "float" : "integer"),
a0714e2c 12271 sv, NULL, NULL);
378cc40b 12272 break;
0b7fceb9 12273
e312add1 12274 /* if it starts with a v, it could be a v-string */
a7cb1f99 12275 case 'v':
dd629d5b 12276vstring:
561b68a9 12277 sv = newSV(5); /* preallocate storage space */
65b06e02 12278 s = scan_vstring(s, PL_bufend, sv);
a7cb1f99 12279 break;
79072805 12280 }
a687059c 12281
02aa26ce
NT
12282 /* make the op for the constant and return */
12283
a86a20aa 12284 if (sv)
b73d6f50 12285 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 12286 else
5f66b61c 12287 lvalp->opval = NULL;
a687059c 12288
73d840c0 12289 return (char *)s;
378cc40b
LW
12290}
12291
76e3520e 12292STATIC char *
cea2e8a9 12293S_scan_formline(pTHX_ register char *s)
378cc40b 12294{
97aff369 12295 dVAR;
79072805 12296 register char *eol;
378cc40b 12297 register char *t;
6136c704 12298 SV * const stuff = newSVpvs("");
79072805 12299 bool needargs = FALSE;
c5ee2135 12300 bool eofmt = FALSE;
5db06880
NC
12301#ifdef PERL_MAD
12302 char *tokenstart = s;
12303 SV* savewhite;
12304
12305 if (PL_madskills) {
cd81e915
NC
12306 savewhite = PL_thiswhite;
12307 PL_thiswhite = 0;
5db06880
NC
12308 }
12309#endif
378cc40b 12310
79072805 12311 while (!needargs) {
a1b95068 12312 if (*s == '.') {
c35e046a 12313 t = s+1;
51882d45 12314#ifdef PERL_STRICT_CR
c35e046a
AL
12315 while (SPACE_OR_TAB(*t))
12316 t++;
51882d45 12317#else
c35e046a
AL
12318 while (SPACE_OR_TAB(*t) || *t == '\r')
12319 t++;
51882d45 12320#endif
c5ee2135
WL
12321 if (*t == '\n' || t == PL_bufend) {
12322 eofmt = TRUE;
79072805 12323 break;
c5ee2135 12324 }
79072805 12325 }
3280af22 12326 if (PL_in_eval && !PL_rsfp) {
07409e01 12327 eol = (char *) memchr(s,'\n',PL_bufend-s);
0f85fab0 12328 if (!eol++)
3280af22 12329 eol = PL_bufend;
0f85fab0
LW
12330 }
12331 else
3280af22 12332 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 12333 if (*s != '#') {
a0d0e21e
LW
12334 for (t = s; t < eol; t++) {
12335 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
12336 needargs = FALSE;
12337 goto enough; /* ~~ must be first line in formline */
378cc40b 12338 }
a0d0e21e
LW
12339 if (*t == '@' || *t == '^')
12340 needargs = TRUE;
378cc40b 12341 }
7121b347
MG
12342 if (eol > s) {
12343 sv_catpvn(stuff, s, eol-s);
2dc4c65b 12344#ifndef PERL_STRICT_CR
7121b347
MG
12345 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
12346 char *end = SvPVX(stuff) + SvCUR(stuff);
12347 end[-2] = '\n';
12348 end[-1] = '\0';
b162af07 12349 SvCUR_set(stuff, SvCUR(stuff) - 1);
7121b347 12350 }
2dc4c65b 12351#endif
7121b347
MG
12352 }
12353 else
12354 break;
79072805 12355 }
95a20fc0 12356 s = (char*)eol;
3280af22 12357 if (PL_rsfp) {
5db06880
NC
12358#ifdef PERL_MAD
12359 if (PL_madskills) {
cd81e915
NC
12360 if (PL_thistoken)
12361 sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
5db06880 12362 else
cd81e915 12363 PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
5db06880
NC
12364 }
12365#endif
3280af22 12366 s = filter_gets(PL_linestr, PL_rsfp, 0);
5db06880
NC
12367#ifdef PERL_MAD
12368 tokenstart = PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
12369#else
3280af22 12370 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
5db06880 12371#endif
3280af22 12372 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
bd61b366 12373 PL_last_lop = PL_last_uni = NULL;
79072805 12374 if (!s) {
3280af22 12375 s = PL_bufptr;
378cc40b
LW
12376 break;
12377 }
378cc40b 12378 }
463ee0b2 12379 incline(s);
79072805 12380 }
a0d0e21e
LW
12381 enough:
12382 if (SvCUR(stuff)) {
3280af22 12383 PL_expect = XTERM;
79072805 12384 if (needargs) {
3280af22 12385 PL_lex_state = LEX_NORMAL;
cd81e915 12386 start_force(PL_curforce);
9ded7720 12387 NEXTVAL_NEXTTOKE.ival = 0;
79072805
LW
12388 force_next(',');
12389 }
a0d0e21e 12390 else
3280af22 12391 PL_lex_state = LEX_FORMLINE;
1bd51a4c 12392 if (!IN_BYTES) {
95a20fc0 12393 if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
1bd51a4c
IH
12394 SvUTF8_on(stuff);
12395 else if (PL_encoding)
12396 sv_recode_to_utf8(stuff, PL_encoding);
12397 }
cd81e915 12398 start_force(PL_curforce);
9ded7720 12399 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 12400 force_next(THING);
cd81e915 12401 start_force(PL_curforce);
9ded7720 12402 NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
79072805 12403 force_next(LSTOP);
378cc40b 12404 }
79072805 12405 else {
8990e307 12406 SvREFCNT_dec(stuff);
c5ee2135
WL
12407 if (eofmt)
12408 PL_lex_formbrack = 0;
3280af22 12409 PL_bufptr = s;
79072805 12410 }
5db06880
NC
12411#ifdef PERL_MAD
12412 if (PL_madskills) {
cd81e915
NC
12413 if (PL_thistoken)
12414 sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
5db06880 12415 else
cd81e915
NC
12416 PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
12417 PL_thiswhite = savewhite;
5db06880
NC
12418 }
12419#endif
79072805 12420 return s;
378cc40b 12421}
a687059c 12422
76e3520e 12423STATIC void
cea2e8a9 12424S_set_csh(pTHX)
a687059c 12425{
ae986130 12426#ifdef CSH
97aff369 12427 dVAR;
3280af22
NIS
12428 if (!PL_cshlen)
12429 PL_cshlen = strlen(PL_cshname);
5f66b61c 12430#else
b2675967 12431#if defined(USE_ITHREADS)
96a5add6 12432 PERL_UNUSED_CONTEXT;
ae986130 12433#endif
b2675967 12434#endif
a687059c 12435}
463ee0b2 12436
ba6d6ac9 12437I32
864dbfa3 12438Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 12439{
97aff369 12440 dVAR;
a3b680e6 12441 const I32 oldsavestack_ix = PL_savestack_ix;
6136c704 12442 CV* const outsidecv = PL_compcv;
8990e307 12443
3280af22
NIS
12444 if (PL_compcv) {
12445 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 12446 }
7766f137 12447 SAVEI32(PL_subline);
3280af22 12448 save_item(PL_subname);
3280af22 12449 SAVESPTR(PL_compcv);
3280af22 12450
b9f83d2f 12451 PL_compcv = (CV*)newSV_type(is_format ? SVt_PVFM : SVt_PVCV);
3280af22
NIS
12452 CvFLAGS(PL_compcv) |= flags;
12453
57843af0 12454 PL_subline = CopLINE(PL_curcop);
dd2155a4 12455 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
b37c2d43 12456 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc_simple(outsidecv);
a3985cdc 12457 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 12458
8990e307
LW
12459 return oldsavestack_ix;
12460}
12461
084592ab
CN
12462#ifdef __SC__
12463#pragma segment Perl_yylex
12464#endif
8990e307 12465int
bfed75c6 12466Perl_yywarn(pTHX_ const char *s)
8990e307 12467{
97aff369 12468 dVAR;
faef0170 12469 PL_in_eval |= EVAL_WARNONLY;
748a9306 12470 yyerror(s);
faef0170 12471 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 12472 return 0;
8990e307
LW
12473}
12474
12475int
bfed75c6 12476Perl_yyerror(pTHX_ const char *s)
463ee0b2 12477{
97aff369 12478 dVAR;
bfed75c6
AL
12479 const char *where = NULL;
12480 const char *context = NULL;
68dc0745 12481 int contlen = -1;
46fc3d4c 12482 SV *msg;
5912531f 12483 int yychar = PL_parser->yychar;
463ee0b2 12484
3280af22 12485 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 12486 where = "at EOF";
8bcfe651
TM
12487 else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
12488 PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
12489 PL_oldbufptr != PL_bufptr) {
f355267c
JH
12490 /*
12491 Only for NetWare:
12492 The code below is removed for NetWare because it abends/crashes on NetWare
12493 when the script has error such as not having the closing quotes like:
12494 if ($var eq "value)
12495 Checking of white spaces is anyway done in NetWare code.
12496 */
12497#ifndef NETWARE
3280af22
NIS
12498 while (isSPACE(*PL_oldoldbufptr))
12499 PL_oldoldbufptr++;
f355267c 12500#endif
3280af22
NIS
12501 context = PL_oldoldbufptr;
12502 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 12503 }
8bcfe651
TM
12504 else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
12505 PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
f355267c
JH
12506 /*
12507 Only for NetWare:
12508 The code below is removed for NetWare because it abends/crashes on NetWare
12509 when the script has error such as not having the closing quotes like:
12510 if ($var eq "value)
12511 Checking of white spaces is anyway done in NetWare code.
12512 */
12513#ifndef NETWARE
3280af22
NIS
12514 while (isSPACE(*PL_oldbufptr))
12515 PL_oldbufptr++;
f355267c 12516#endif
3280af22
NIS
12517 context = PL_oldbufptr;
12518 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
12519 }
12520 else if (yychar > 255)
68dc0745 12521 where = "next token ???";
12fbd33b 12522 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
12523 if (PL_lex_state == LEX_NORMAL ||
12524 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 12525 where = "at end of line";
3280af22 12526 else if (PL_lex_inpat)
68dc0745 12527 where = "within pattern";
463ee0b2 12528 else
68dc0745 12529 where = "within string";
463ee0b2 12530 }
46fc3d4c 12531 else {
6136c704 12532 SV * const where_sv = sv_2mortal(newSVpvs("next char "));
46fc3d4c 12533 if (yychar < 32)
cea2e8a9 12534 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
46fc3d4c 12535 else if (isPRINT_LC(yychar))
cea2e8a9 12536 Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
463ee0b2 12537 else
cea2e8a9 12538 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
95a20fc0 12539 where = SvPVX_const(where_sv);
463ee0b2 12540 }
46fc3d4c 12541 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 12542 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 12543 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 12544 if (context)
cea2e8a9 12545 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 12546 else
cea2e8a9 12547 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 12548 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 12549 Perl_sv_catpvf(aTHX_ msg,
57def98f 12550 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 12551 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 12552 PL_multi_end = 0;
a0d0e21e 12553 }
56da5a46 12554 if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
be2597df 12555 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
463ee0b2 12556 else
5a844595 12557 qerror(msg);
c7d6bfb2
GS
12558 if (PL_error_count >= 10) {
12559 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 12560 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
be2597df 12561 SVfARG(ERRSV), OutCopFILE(PL_curcop));
c7d6bfb2
GS
12562 else
12563 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 12564 OutCopFILE(PL_curcop));
c7d6bfb2 12565 }
3280af22 12566 PL_in_my = 0;
5c284bb0 12567 PL_in_my_stash = NULL;
463ee0b2
LW
12568 return 0;
12569}
084592ab
CN
12570#ifdef __SC__
12571#pragma segment Main
12572#endif
4e35701f 12573
b250498f 12574STATIC char*
3ae08724 12575S_swallow_bom(pTHX_ U8 *s)
01ec43d0 12576{
97aff369 12577 dVAR;
f54cb97a 12578 const STRLEN slen = SvCUR(PL_linestr);
7aa207d6 12579 switch (s[0]) {
4e553d73
NIS
12580 case 0xFF:
12581 if (s[1] == 0xFE) {
7aa207d6 12582 /* UTF-16 little-endian? (or UTF32-LE?) */
3ae08724 12583 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
7aa207d6 12584 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
01ec43d0 12585#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12586 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
3ae08724 12587 s += 2;
7aa207d6 12588 utf16le:
dea0fc0b
JH
12589 if (PL_bufend > (char*)s) {
12590 U8 *news;
12591 I32 newlen;
12592
12593 filter_add(utf16rev_textfilter, NULL);
a02a5408 12594 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd 12595 utf16_to_utf8_reversed(s, news,
aed58286 12596 PL_bufend - (char*)s - 1,
1de9afcd 12597 &newlen);
7aa207d6 12598 sv_setpvn(PL_linestr, (const char*)news, newlen);
5db06880
NC
12599#ifdef PERL_MAD
12600 s = (U8*)SvPVX(PL_linestr);
12601 Copy(news, s, newlen, U8);
12602 s[newlen] = '\0';
12603#endif
dea0fc0b 12604 Safefree(news);
7aa207d6
JH
12605 SvUTF8_on(PL_linestr);
12606 s = (U8*)SvPVX(PL_linestr);
5db06880
NC
12607#ifdef PERL_MAD
12608 /* FIXME - is this a general bug fix? */
12609 s[newlen] = '\0';
12610#endif
7aa207d6 12611 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12612 }
b250498f 12613#else
7aa207d6 12614 Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
b250498f 12615#endif
01ec43d0
GS
12616 }
12617 break;
78ae23f5 12618 case 0xFE:
7aa207d6 12619 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 12620#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12621 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b 12622 s += 2;
7aa207d6 12623 utf16be:
dea0fc0b
JH
12624 if (PL_bufend > (char *)s) {
12625 U8 *news;
12626 I32 newlen;
12627
12628 filter_add(utf16_textfilter, NULL);
a02a5408 12629 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
12630 utf16_to_utf8(s, news,
12631 PL_bufend - (char*)s,
12632 &newlen);
7aa207d6 12633 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 12634 Safefree(news);
7aa207d6
JH
12635 SvUTF8_on(PL_linestr);
12636 s = (U8*)SvPVX(PL_linestr);
12637 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12638 }
b250498f 12639#else
7aa207d6 12640 Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
b250498f 12641#endif
01ec43d0
GS
12642 }
12643 break;
3ae08724
GS
12644 case 0xEF:
12645 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 12646 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
12647 s += 3; /* UTF-8 */
12648 }
12649 break;
12650 case 0:
7aa207d6
JH
12651 if (slen > 3) {
12652 if (s[1] == 0) {
12653 if (s[2] == 0xFE && s[3] == 0xFF) {
12654 /* UTF-32 big-endian */
12655 Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
12656 }
12657 }
12658 else if (s[2] == 0 && s[3] != 0) {
12659 /* Leading bytes
12660 * 00 xx 00 xx
12661 * are a good indicator of UTF-16BE. */
12662 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
12663 goto utf16be;
12664 }
01ec43d0 12665 }
e294cc5d
JH
12666#ifdef EBCDIC
12667 case 0xDD:
12668 if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
12669 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
12670 s += 4; /* UTF-8 */
12671 }
12672 break;
12673#endif
12674
7aa207d6
JH
12675 default:
12676 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
12677 /* Leading bytes
12678 * xx 00 xx 00
12679 * are a good indicator of UTF-16LE. */
12680 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
12681 goto utf16le;
12682 }
01ec43d0 12683 }
b8f84bb2 12684 return (char*)s;
b250498f 12685}
4755096e 12686
6e3aabd6
GS
12687
12688#ifndef PERL_NO_UTF16_FILTER
12689static I32
acfe0abc 12690utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12691{
97aff369 12692 dVAR;
f54cb97a
AL
12693 const STRLEN old = SvCUR(sv);
12694 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12695 DEBUG_P(PerlIO_printf(Perl_debug_log,
12696 "utf16_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12697 FPTR2DPTR(void *, utf16_textfilter),
12698 idx, maxlen, (int) count));
6e3aabd6
GS
12699 if (count) {
12700 U8* tmps;
dea0fc0b 12701 I32 newlen;
a02a5408 12702 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12703 Copy(SvPVX_const(sv), tmps, old, char);
12704 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12705 SvCUR(sv) - old, &newlen);
12706 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12707 }
1de9afcd
RGS
12708 DEBUG_P({sv_dump(sv);});
12709 return SvCUR(sv);
6e3aabd6
GS
12710}
12711
12712static I32
acfe0abc 12713utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12714{
97aff369 12715 dVAR;
f54cb97a
AL
12716 const STRLEN old = SvCUR(sv);
12717 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12718 DEBUG_P(PerlIO_printf(Perl_debug_log,
12719 "utf16rev_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12720 FPTR2DPTR(void *, utf16rev_textfilter),
12721 idx, maxlen, (int) count));
6e3aabd6
GS
12722 if (count) {
12723 U8* tmps;
dea0fc0b 12724 I32 newlen;
a02a5408 12725 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12726 Copy(SvPVX_const(sv), tmps, old, char);
12727 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12728 SvCUR(sv) - old, &newlen);
12729 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12730 }
1de9afcd 12731 DEBUG_P({ sv_dump(sv); });
6e3aabd6
GS
12732 return count;
12733}
12734#endif
9f4817db 12735
f333445c
JP
12736/*
12737Returns a pointer to the next character after the parsed
12738vstring, as well as updating the passed in sv.
12739
12740Function must be called like
12741
561b68a9 12742 sv = newSV(5);
65b06e02 12743 s = scan_vstring(s,e,sv);
f333445c 12744
65b06e02 12745where s and e are the start and end of the string.
f333445c
JP
12746The sv should already be large enough to store the vstring
12747passed in, for performance reasons.
12748
12749*/
12750
12751char *
65b06e02 12752Perl_scan_vstring(pTHX_ const char *s, const char *e, SV *sv)
f333445c 12753{
97aff369 12754 dVAR;
bfed75c6
AL
12755 const char *pos = s;
12756 const char *start = s;
f333445c 12757 if (*pos == 'v') pos++; /* get past 'v' */
65b06e02 12758 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
3e884cbf 12759 pos++;
f333445c
JP
12760 if ( *pos != '.') {
12761 /* this may not be a v-string if followed by => */
bfed75c6 12762 const char *next = pos;
65b06e02 12763 while (next < e && isSPACE(*next))
8fc7bb1c 12764 ++next;
65b06e02 12765 if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
12766 /* return string not v-string */
12767 sv_setpvn(sv,(char *)s,pos-s);
73d840c0 12768 return (char *)pos;
f333445c
JP
12769 }
12770 }
12771
12772 if (!isALPHA(*pos)) {
89ebb4a3 12773 U8 tmpbuf[UTF8_MAXBYTES+1];
f333445c 12774
d4c19fe8
AL
12775 if (*s == 'v')
12776 s++; /* get past 'v' */
f333445c
JP
12777
12778 sv_setpvn(sv, "", 0);
12779
12780 for (;;) {
d4c19fe8 12781 /* this is atoi() that tolerates underscores */
0bd48802
AL
12782 U8 *tmpend;
12783 UV rev = 0;
d4c19fe8
AL
12784 const char *end = pos;
12785 UV mult = 1;
12786 while (--end >= s) {
12787 if (*end != '_') {
12788 const UV orev = rev;
f333445c
JP
12789 rev += (*end - '0') * mult;
12790 mult *= 10;
12791 if (orev > rev && ckWARN_d(WARN_OVERFLOW))
12792 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
12793 "Integer overflow in decimal number");
12794 }
12795 }
12796#ifdef EBCDIC
12797 if (rev > 0x7FFFFFFF)
12798 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
12799#endif
12800 /* Append native character for the rev point */
12801 tmpend = uvchr_to_utf8(tmpbuf, rev);
12802 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
12803 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
12804 SvUTF8_on(sv);
65b06e02 12805 if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
12806 s = ++pos;
12807 else {
12808 s = pos;
12809 break;
12810 }
65b06e02 12811 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
12812 pos++;
12813 }
12814 SvPOK_on(sv);
12815 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
12816 SvRMAGICAL_on(sv);
12817 }
73d840c0 12818 return (char *)s;
f333445c
JP
12819}
12820
1da4ca5f
NC
12821/*
12822 * Local variables:
12823 * c-indentation-style: bsd
12824 * c-basic-offset: 4
12825 * indent-tabs-mode: t
12826 * End:
12827 *
37442d52
RGS
12828 * ex: set ts=8 sts=4 sw=4 noet:
12829 */