This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Eliminate most *printf-like calls that use a simple "%c" format,
[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;
987a03fc 3564 len = UTF ? Perl_utf8_length(aTHX_ (U8 *) PL_linestart, (U8 *) s) : (STRLEN) (s - PL_linestart);
356c7adf 3565 Perl_croak(aTHX_ "Unrecognized character \\x%02X in column %d", *s & 255, (int) len + 1);
e929a76b
LW
3566 case 4:
3567 case 26:
3568 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 3569 case 0:
5db06880
NC
3570#ifdef PERL_MAD
3571 if (PL_madskills)
cd81e915 3572 PL_faketokens = 0;
5db06880 3573#endif
3280af22
NIS
3574 if (!PL_rsfp) {
3575 PL_last_uni = 0;
3576 PL_last_lop = 0;
c5ee2135 3577 if (PL_lex_brackets) {
10edeb5d
JH
3578 yyerror((const char *)
3579 (PL_lex_formbrack
3580 ? "Format not terminated"
3581 : "Missing right curly or square bracket"));
c5ee2135 3582 }
4e553d73 3583 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 3584 "### Tokener got EOF\n");
5f80b19c 3585 } );
79072805 3586 TOKEN(0);
463ee0b2 3587 }
3280af22 3588 if (s++ < PL_bufend)
a687059c 3589 goto retry; /* ignore stray nulls */
3280af22
NIS
3590 PL_last_uni = 0;
3591 PL_last_lop = 0;
3592 if (!PL_in_eval && !PL_preambled) {
3593 PL_preambled = TRUE;
5db06880
NC
3594#ifdef PERL_MAD
3595 if (PL_madskills)
cd81e915 3596 PL_faketokens = 1;
5db06880 3597#endif
3280af22
NIS
3598 sv_setpv(PL_linestr,incl_perldb());
3599 if (SvCUR(PL_linestr))
396482e1 3600 sv_catpvs(PL_linestr,";");
3280af22
NIS
3601 if (PL_preambleav){
3602 while(AvFILLp(PL_preambleav) >= 0) {
3603 SV *tmpsv = av_shift(PL_preambleav);
3604 sv_catsv(PL_linestr, tmpsv);
396482e1 3605 sv_catpvs(PL_linestr, ";");
91b7def8 3606 sv_free(tmpsv);
3607 }
3280af22
NIS
3608 sv_free((SV*)PL_preambleav);
3609 PL_preambleav = NULL;
91b7def8 3610 }
3280af22 3611 if (PL_minus_n || PL_minus_p) {
396482e1 3612 sv_catpvs(PL_linestr, "LINE: while (<>) {");
3280af22 3613 if (PL_minus_l)
396482e1 3614 sv_catpvs(PL_linestr,"chomp;");
3280af22 3615 if (PL_minus_a) {
3280af22 3616 if (PL_minus_F) {
3792a11b
NC
3617 if ((*PL_splitstr == '/' || *PL_splitstr == '\''
3618 || *PL_splitstr == '"')
3280af22 3619 && strchr(PL_splitstr + 1, *PL_splitstr))
3db68c4c 3620 Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
54310121 3621 else {
c8ef6a4b
NC
3622 /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
3623 bytes can be used as quoting characters. :-) */
dd374669 3624 const char *splits = PL_splitstr;
91d456ae 3625 sv_catpvs(PL_linestr, "our @F=split(q\0");
48c4c863
NC
3626 do {
3627 /* Need to \ \s */
dd374669
AL
3628 if (*splits == '\\')
3629 sv_catpvn(PL_linestr, splits, 1);
3630 sv_catpvn(PL_linestr, splits, 1);
3631 } while (*splits++);
48c4c863
NC
3632 /* This loop will embed the trailing NUL of
3633 PL_linestr as the last thing it does before
3634 terminating. */
396482e1 3635 sv_catpvs(PL_linestr, ");");
54310121 3636 }
2304df62
AD
3637 }
3638 else
396482e1 3639 sv_catpvs(PL_linestr,"our @F=split(' ');");
2304df62 3640 }
79072805 3641 }
bc9b29db 3642 if (PL_minus_E)
396482e1
GA
3643 sv_catpvs(PL_linestr,"use feature ':5.10';");
3644 sv_catpvs(PL_linestr, "\n");
3280af22
NIS
3645 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3646 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3647 PL_last_lop = PL_last_uni = NULL;
80a702cd 3648 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 3649 update_debugger_info(PL_linestr, NULL, 0);
79072805 3650 goto retry;
a687059c 3651 }
e929a76b 3652 do {
aa7440fb 3653 bof = PL_rsfp ? TRUE : FALSE;
bd61b366 3654 if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == NULL) {
7e28d3af 3655 fake_eof:
5db06880 3656#ifdef PERL_MAD
cd81e915 3657 PL_realtokenstart = -1;
5db06880 3658#endif
7e28d3af
JH
3659 if (PL_rsfp) {
3660 if (PL_preprocess && !PL_in_eval)
3661 (void)PerlProc_pclose(PL_rsfp);
3662 else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
3663 PerlIO_clearerr(PL_rsfp);
3664 else
3665 (void)PerlIO_close(PL_rsfp);
4608196e 3666 PL_rsfp = NULL;
7e28d3af
JH
3667 PL_doextract = FALSE;
3668 }
3669 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
5db06880
NC
3670#ifdef PERL_MAD
3671 if (PL_madskills)
cd81e915 3672 PL_faketokens = 1;
5db06880 3673#endif
10edeb5d
JH
3674 sv_setpv(PL_linestr,
3675 (const char *)
3676 (PL_minus_p
3677 ? ";}continue{print;}" : ";}"));
7e28d3af
JH
3678 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3679 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3680 PL_last_lop = PL_last_uni = NULL;
7e28d3af
JH
3681 PL_minus_n = PL_minus_p = 0;
3682 goto retry;
3683 }
3684 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
bd61b366 3685 PL_last_lop = PL_last_uni = NULL;
c69006e4 3686 sv_setpvn(PL_linestr,"",0);
7e28d3af
JH
3687 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
3688 }
7aa207d6
JH
3689 /* If it looks like the start of a BOM or raw UTF-16,
3690 * check if it in fact is. */
3691 else if (bof &&
3692 (*s == 0 ||
3693 *(U8*)s == 0xEF ||
3694 *(U8*)s >= 0xFE ||
3695 s[1] == 0)) {
226017aa 3696#ifdef PERLIO_IS_STDIO
e3f494f1
JH
3697# ifdef __GNU_LIBRARY__
3698# if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
226017aa
DD
3699# define FTELL_FOR_PIPE_IS_BROKEN
3700# endif
e3f494f1
JH
3701# else
3702# ifdef __GLIBC__
3703# if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
3704# define FTELL_FOR_PIPE_IS_BROKEN
3705# endif
3706# endif
226017aa
DD
3707# endif
3708#endif
3709#ifdef FTELL_FOR_PIPE_IS_BROKEN
3710 /* This loses the possibility to detect the bof
3711 * situation on perl -P when the libc5 is being used.
3712 * Workaround? Maybe attach some extra state to PL_rsfp?
3713 */
3714 if (!PL_preprocess)
7e28d3af 3715 bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
226017aa 3716#else
eb160463 3717 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
226017aa 3718#endif
7e28d3af 3719 if (bof) {
3280af22 3720 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 3721 s = swallow_bom((U8*)s);
e929a76b 3722 }
378cc40b 3723 }
3280af22 3724 if (PL_doextract) {
a0d0e21e 3725 /* Incest with pod. */
5db06880
NC
3726#ifdef PERL_MAD
3727 if (PL_madskills)
cd81e915 3728 sv_catsv(PL_thiswhite, PL_linestr);
5db06880 3729#endif
01a57ef7 3730 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
c69006e4 3731 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
3732 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3733 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3734 PL_last_lop = PL_last_uni = NULL;
3280af22 3735 PL_doextract = FALSE;
a0d0e21e 3736 }
4e553d73 3737 }
463ee0b2 3738 incline(s);
3280af22
NIS
3739 } while (PL_doextract);
3740 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
80a702cd 3741 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 3742 update_debugger_info(PL_linestr, NULL, 0);
3280af22 3743 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3744 PL_last_lop = PL_last_uni = NULL;
57843af0 3745 if (CopLINE(PL_curcop) == 1) {
3280af22 3746 while (s < PL_bufend && isSPACE(*s))
79072805 3747 s++;
a0d0e21e 3748 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 3749 s++;
5db06880
NC
3750#ifdef PERL_MAD
3751 if (PL_madskills)
cd81e915 3752 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
5db06880 3753#endif
bd61b366 3754 d = NULL;
3280af22 3755 if (!PL_in_eval) {
44a8e56a 3756 if (*s == '#' && *(s+1) == '!')
3757 d = s + 2;
3758#ifdef ALTERNATE_SHEBANG
3759 else {
bfed75c6 3760 static char const as[] = ALTERNATE_SHEBANG;
44a8e56a 3761 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
3762 d = s + (sizeof(as) - 1);
3763 }
3764#endif /* ALTERNATE_SHEBANG */
3765 }
3766 if (d) {
b8378b72 3767 char *ipath;
774d564b 3768 char *ipathend;
b8378b72 3769
774d564b 3770 while (isSPACE(*d))
b8378b72
CS
3771 d++;
3772 ipath = d;
774d564b 3773 while (*d && !isSPACE(*d))
3774 d++;
3775 ipathend = d;
3776
3777#ifdef ARG_ZERO_IS_SCRIPT
3778 if (ipathend > ipath) {
3779 /*
3780 * HP-UX (at least) sets argv[0] to the script name,
3781 * which makes $^X incorrect. And Digital UNIX and Linux,
3782 * at least, set argv[0] to the basename of the Perl
3783 * interpreter. So, having found "#!", we'll set it right.
3784 */
fafc274c
NC
3785 SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
3786 SVt_PV)); /* $^X */
774d564b 3787 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 3788 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 3789 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 3790 SvSETMAGIC(x);
3791 }
556c1dec
JH
3792 else {
3793 STRLEN blen;
3794 STRLEN llen;
cfd0369c 3795 const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
9d4ba2ae 3796 const char * const lstart = SvPV_const(x,llen);
556c1dec
JH
3797 if (llen < blen) {
3798 bstart += blen - llen;
3799 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
3800 sv_setpvn(x, ipath, ipathend - ipath);
3801 SvSETMAGIC(x);
3802 }
3803 }
3804 }
774d564b 3805 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 3806 }
774d564b 3807#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
3808
3809 /*
3810 * Look for options.
3811 */
748a9306 3812 d = instr(s,"perl -");
84e30d1a 3813 if (!d) {
748a9306 3814 d = instr(s,"perl");
84e30d1a
GS
3815#if defined(DOSISH)
3816 /* avoid getting into infinite loops when shebang
3817 * line contains "Perl" rather than "perl" */
3818 if (!d) {
3819 for (d = ipathend-4; d >= ipath; --d) {
3820 if ((*d == 'p' || *d == 'P')
3821 && !ibcmp(d, "perl", 4))
3822 {
3823 break;
3824 }
3825 }
3826 if (d < ipath)
bd61b366 3827 d = NULL;
84e30d1a
GS
3828 }
3829#endif
3830 }
44a8e56a 3831#ifdef ALTERNATE_SHEBANG
3832 /*
3833 * If the ALTERNATE_SHEBANG on this system starts with a
3834 * character that can be part of a Perl expression, then if
3835 * we see it but not "perl", we're probably looking at the
3836 * start of Perl code, not a request to hand off to some
3837 * other interpreter. Similarly, if "perl" is there, but
3838 * not in the first 'word' of the line, we assume the line
3839 * contains the start of the Perl program.
44a8e56a 3840 */
3841 if (d && *s != '#') {
f54cb97a 3842 const char *c = ipath;
44a8e56a 3843 while (*c && !strchr("; \t\r\n\f\v#", *c))
3844 c++;
3845 if (c < d)
bd61b366 3846 d = NULL; /* "perl" not in first word; ignore */
44a8e56a 3847 else
3848 *s = '#'; /* Don't try to parse shebang line */
3849 }
774d564b 3850#endif /* ALTERNATE_SHEBANG */
bf4acbe4 3851#ifndef MACOS_TRADITIONAL
748a9306 3852 if (!d &&
44a8e56a 3853 *s == '#' &&
774d564b 3854 ipathend > ipath &&
3280af22 3855 !PL_minus_c &&
748a9306 3856 !instr(s,"indir") &&
3280af22 3857 instr(PL_origargv[0],"perl"))
748a9306 3858 {
27da23d5 3859 dVAR;
9f68db38 3860 char **newargv;
9f68db38 3861
774d564b 3862 *ipathend = '\0';
3863 s = ipathend + 1;
3280af22 3864 while (s < PL_bufend && isSPACE(*s))
9f68db38 3865 s++;
3280af22 3866 if (s < PL_bufend) {
a02a5408 3867 Newxz(newargv,PL_origargc+3,char*);
9f68db38 3868 newargv[1] = s;
3280af22 3869 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
3870 s++;
3871 *s = '\0';
3280af22 3872 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
3873 }
3874 else
3280af22 3875 newargv = PL_origargv;
774d564b 3876 newargv[0] = ipath;
b35112e7 3877 PERL_FPU_PRE_EXEC
b4748376 3878 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 3879 PERL_FPU_POST_EXEC
cea2e8a9 3880 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 3881 }
bf4acbe4 3882#endif
748a9306 3883 if (d) {
c35e046a
AL
3884 while (*d && !isSPACE(*d))
3885 d++;
3886 while (SPACE_OR_TAB(*d))
3887 d++;
748a9306
LW
3888
3889 if (*d++ == '-') {
f54cb97a 3890 const bool switches_done = PL_doswitches;
fb993905
GA
3891 const U32 oldpdb = PL_perldb;
3892 const bool oldn = PL_minus_n;
3893 const bool oldp = PL_minus_p;
3894
8cc95fdb 3895 do {
3ffe3ee4 3896 if (*d == 'M' || *d == 'm' || *d == 'C') {
9d4ba2ae 3897 const char * const m = d;
d4c19fe8
AL
3898 while (*d && !isSPACE(*d))
3899 d++;
cea2e8a9 3900 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
8cc95fdb 3901 (int)(d - m), m);
3902 }
97bd5664 3903 d = moreswitches(d);
8cc95fdb 3904 } while (d);
f0b2cf55
YST
3905 if (PL_doswitches && !switches_done) {
3906 int argc = PL_origargc;
3907 char **argv = PL_origargv;
3908 do {
3909 argc--,argv++;
3910 } while (argc && argv[0][0] == '-' && argv[0][1]);
3911 init_argv_symbols(argc,argv);
3912 }
155aba94
GS
3913 if ((PERLDB_LINE && !oldpdb) ||
3914 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 3915 /* if we have already added "LINE: while (<>) {",
3916 we must not do it again */
748a9306 3917 {
c69006e4 3918 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
3919 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3920 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3921 PL_last_lop = PL_last_uni = NULL;
3280af22 3922 PL_preambled = FALSE;
84902520 3923 if (PERLDB_LINE)
3280af22 3924 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
3925 goto retry;
3926 }
a0d0e21e 3927 }
79072805 3928 }
9f68db38 3929 }
79072805 3930 }
3280af22
NIS
3931 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3932 PL_bufptr = s;
3933 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3934 return yylex();
ae986130 3935 }
378cc40b 3936 goto retry;
4fdae800 3937 case '\r':
6a27c188 3938#ifdef PERL_STRICT_CR
cea2e8a9 3939 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 3940 Perl_croak(aTHX_
cc507455 3941 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 3942#endif
4fdae800 3943 case ' ': case '\t': case '\f': case 013:
bf4acbe4
GS
3944#ifdef MACOS_TRADITIONAL
3945 case '\312':
3946#endif
5db06880 3947#ifdef PERL_MAD
cd81e915 3948 PL_realtokenstart = -1;
ac372eb8
RD
3949 if (!PL_thiswhite)
3950 PL_thiswhite = newSVpvs("");
3951 sv_catpvn(PL_thiswhite, s, 1);
5db06880 3952#endif
ac372eb8 3953 s++;
378cc40b 3954 goto retry;
378cc40b 3955 case '#':
e929a76b 3956 case '\n':
5db06880 3957#ifdef PERL_MAD
cd81e915 3958 PL_realtokenstart = -1;
5db06880 3959 if (PL_madskills)
cd81e915 3960 PL_faketokens = 0;
5db06880 3961#endif
3280af22 3962 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
3963 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
3964 /* handle eval qq[#line 1 "foo"\n ...] */
3965 CopLINE_dec(PL_curcop);
3966 incline(s);
3967 }
5db06880
NC
3968 if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
3969 s = SKIPSPACE0(s);
3970 if (!PL_in_eval || PL_rsfp)
3971 incline(s);
3972 }
3973 else {
3974 d = s;
3975 while (d < PL_bufend && *d != '\n')
3976 d++;
3977 if (d < PL_bufend)
3978 d++;
3979 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
3980 Perl_croak(aTHX_ "panic: input overflow");
3981#ifdef PERL_MAD
3982 if (PL_madskills)
cd81e915 3983 PL_thiswhite = newSVpvn(s, d - s);
5db06880
NC
3984#endif
3985 s = d;
3986 incline(s);
3987 }
3280af22
NIS
3988 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3989 PL_bufptr = s;
3990 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3991 return yylex();
a687059c 3992 }
378cc40b 3993 }
a687059c 3994 else {
5db06880
NC
3995#ifdef PERL_MAD
3996 if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
3997 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
cd81e915 3998 PL_faketokens = 0;
5db06880
NC
3999 s = SKIPSPACE0(s);
4000 TOKEN(PEG); /* make sure any #! line is accessible */
4001 }
4002 s = SKIPSPACE0(s);
4003 }
4004 else {
4005/* if (PL_madskills && PL_lex_formbrack) { */
4006 d = s;
4007 while (d < PL_bufend && *d != '\n')
4008 d++;
4009 if (d < PL_bufend)
4010 d++;
4011 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
4012 Perl_croak(aTHX_ "panic: input overflow");
4013 if (PL_madskills && CopLINE(PL_curcop) >= 1) {
cd81e915 4014 if (!PL_thiswhite)
6b29d1f5 4015 PL_thiswhite = newSVpvs("");
5db06880 4016 if (CopLINE(PL_curcop) == 1) {
cd81e915
NC
4017 sv_setpvn(PL_thiswhite, "", 0);
4018 PL_faketokens = 0;
5db06880 4019 }
cd81e915 4020 sv_catpvn(PL_thiswhite, s, d - s);
5db06880
NC
4021 }
4022 s = d;
4023/* }
4024 *s = '\0';
4025 PL_bufend = s; */
4026 }
4027#else
378cc40b 4028 *s = '\0';
3280af22 4029 PL_bufend = s;
5db06880 4030#endif
a687059c 4031 }
378cc40b
LW
4032 goto retry;
4033 case '-':
79072805 4034 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50 4035 I32 ftst = 0;
90771dc0 4036 char tmp;
e5edeb50 4037
378cc40b 4038 s++;
3280af22 4039 PL_bufptr = s;
748a9306
LW
4040 tmp = *s++;
4041
bf4acbe4 4042 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
4043 s++;
4044
4045 if (strnEQ(s,"=>",2)) {
3280af22 4046 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
931e0695 4047 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
748a9306
LW
4048 OPERATOR('-'); /* unary minus */
4049 }
3280af22 4050 PL_last_uni = PL_oldbufptr;
748a9306 4051 switch (tmp) {
e5edeb50
JH
4052 case 'r': ftst = OP_FTEREAD; break;
4053 case 'w': ftst = OP_FTEWRITE; break;
4054 case 'x': ftst = OP_FTEEXEC; break;
4055 case 'o': ftst = OP_FTEOWNED; break;
4056 case 'R': ftst = OP_FTRREAD; break;
4057 case 'W': ftst = OP_FTRWRITE; break;
4058 case 'X': ftst = OP_FTREXEC; break;
4059 case 'O': ftst = OP_FTROWNED; break;
4060 case 'e': ftst = OP_FTIS; break;
4061 case 'z': ftst = OP_FTZERO; break;
4062 case 's': ftst = OP_FTSIZE; break;
4063 case 'f': ftst = OP_FTFILE; break;
4064 case 'd': ftst = OP_FTDIR; break;
4065 case 'l': ftst = OP_FTLINK; break;
4066 case 'p': ftst = OP_FTPIPE; break;
4067 case 'S': ftst = OP_FTSOCK; break;
4068 case 'u': ftst = OP_FTSUID; break;
4069 case 'g': ftst = OP_FTSGID; break;
4070 case 'k': ftst = OP_FTSVTX; break;
4071 case 'b': ftst = OP_FTBLK; break;
4072 case 'c': ftst = OP_FTCHR; break;
4073 case 't': ftst = OP_FTTTY; break;
4074 case 'T': ftst = OP_FTTEXT; break;
4075 case 'B': ftst = OP_FTBINARY; break;
4076 case 'M': case 'A': case 'C':
fafc274c 4077 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
e5edeb50
JH
4078 switch (tmp) {
4079 case 'M': ftst = OP_FTMTIME; break;
4080 case 'A': ftst = OP_FTATIME; break;
4081 case 'C': ftst = OP_FTCTIME; break;
4082 default: break;
4083 }
4084 break;
378cc40b 4085 default:
378cc40b
LW
4086 break;
4087 }
e5edeb50 4088 if (ftst) {
eb160463 4089 PL_last_lop_op = (OPCODE)ftst;
4e553d73 4090 DEBUG_T( { PerlIO_printf(Perl_debug_log,
a18d764d 4091 "### Saw file test %c\n", (int)tmp);
5f80b19c 4092 } );
e5edeb50
JH
4093 FTST(ftst);
4094 }
4095 else {
4096 /* Assume it was a minus followed by a one-letter named
4097 * subroutine call (or a -bareword), then. */
95c31fe3 4098 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0 4099 "### '-%c' looked like a file test but was not\n",
4fccd7c6 4100 (int) tmp);
5f80b19c 4101 } );
3cf7b4c4 4102 s = --PL_bufptr;
e5edeb50 4103 }
378cc40b 4104 }
90771dc0
NC
4105 {
4106 const char tmp = *s++;
4107 if (*s == tmp) {
4108 s++;
4109 if (PL_expect == XOPERATOR)
4110 TERM(POSTDEC);
4111 else
4112 OPERATOR(PREDEC);
4113 }
4114 else if (*s == '>') {
4115 s++;
29595ff2 4116 s = SKIPSPACE1(s);
90771dc0
NC
4117 if (isIDFIRST_lazy_if(s,UTF)) {
4118 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
4119 TOKEN(ARROW);
4120 }
4121 else if (*s == '$')
4122 OPERATOR(ARROW);
4123 else
4124 TERM(ARROW);
4125 }
3280af22 4126 if (PL_expect == XOPERATOR)
90771dc0
NC
4127 Aop(OP_SUBTRACT);
4128 else {
4129 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4130 check_uni();
4131 OPERATOR('-'); /* unary minus */
79072805 4132 }
2f3197b3 4133 }
79072805 4134
378cc40b 4135 case '+':
90771dc0
NC
4136 {
4137 const char tmp = *s++;
4138 if (*s == tmp) {
4139 s++;
4140 if (PL_expect == XOPERATOR)
4141 TERM(POSTINC);
4142 else
4143 OPERATOR(PREINC);
4144 }
3280af22 4145 if (PL_expect == XOPERATOR)
90771dc0
NC
4146 Aop(OP_ADD);
4147 else {
4148 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4149 check_uni();
4150 OPERATOR('+');
4151 }
2f3197b3 4152 }
a687059c 4153
378cc40b 4154 case '*':
3280af22
NIS
4155 if (PL_expect != XOPERATOR) {
4156 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4157 PL_expect = XOPERATOR;
4158 force_ident(PL_tokenbuf, '*');
4159 if (!*PL_tokenbuf)
a0d0e21e 4160 PREREF('*');
79072805 4161 TERM('*');
a687059c 4162 }
79072805
LW
4163 s++;
4164 if (*s == '*') {
a687059c 4165 s++;
79072805 4166 PWop(OP_POW);
a687059c 4167 }
79072805
LW
4168 Mop(OP_MULTIPLY);
4169
378cc40b 4170 case '%':
3280af22 4171 if (PL_expect == XOPERATOR) {
bbce6d69 4172 ++s;
4173 Mop(OP_MODULO);
a687059c 4174 }
3280af22 4175 PL_tokenbuf[0] = '%';
e8ae98db
RGS
4176 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4177 sizeof PL_tokenbuf - 1, FALSE);
3280af22 4178 if (!PL_tokenbuf[1]) {
bbce6d69 4179 PREREF('%');
a687059c 4180 }
3280af22 4181 PL_pending_ident = '%';
bbce6d69 4182 TERM('%');
a687059c 4183
378cc40b 4184 case '^':
79072805 4185 s++;
a0d0e21e 4186 BOop(OP_BIT_XOR);
79072805 4187 case '[':
3280af22 4188 PL_lex_brackets++;
79072805 4189 /* FALL THROUGH */
378cc40b 4190 case '~':
0d863452 4191 if (s[1] == '~'
3e7dd34d 4192 && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
0d863452
RH
4193 {
4194 s += 2;
4195 Eop(OP_SMARTMATCH);
4196 }
378cc40b 4197 case ',':
90771dc0
NC
4198 {
4199 const char tmp = *s++;
4200 OPERATOR(tmp);
4201 }
a0d0e21e
LW
4202 case ':':
4203 if (s[1] == ':') {
4204 len = 0;
0bfa2a8a 4205 goto just_a_word_zero_gv;
a0d0e21e
LW
4206 }
4207 s++;
09bef843
SB
4208 switch (PL_expect) {
4209 OP *attrs;
5db06880
NC
4210#ifdef PERL_MAD
4211 I32 stuffstart;
4212#endif
09bef843
SB
4213 case XOPERATOR:
4214 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
4215 break;
4216 PL_bufptr = s; /* update in case we back off */
4217 goto grabattrs;
4218 case XATTRBLOCK:
4219 PL_expect = XBLOCK;
4220 goto grabattrs;
4221 case XATTRTERM:
4222 PL_expect = XTERMBLOCK;
4223 grabattrs:
5db06880
NC
4224#ifdef PERL_MAD
4225 stuffstart = s - SvPVX(PL_linestr) - 1;
4226#endif
29595ff2 4227 s = PEEKSPACE(s);
5f66b61c 4228 attrs = NULL;
7e2040f0 4229 while (isIDFIRST_lazy_if(s,UTF)) {
90771dc0 4230 I32 tmp;
5cc237b8 4231 SV *sv;
09bef843 4232 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 4233 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
f9829d6b
GS
4234 if (tmp < 0) tmp = -tmp;
4235 switch (tmp) {
4236 case KEY_or:
4237 case KEY_and:
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;
c631f32b 5433 goto its_constant;
96e4d5b1 5434 }
5435 }
5db06880
NC
5436#ifdef PERL_MAD
5437 if (PL_madskills) {
cd81e915
NC
5438 PL_nextwhite = PL_thiswhite;
5439 PL_thiswhite = 0;
5db06880 5440 }
cd81e915 5441 start_force(PL_curforce);
5db06880 5442#endif
9ded7720 5443 NEXTVAL_NEXTTOKE.opval = yylval.opval;
3280af22 5444 PL_expect = XOPERATOR;
5db06880
NC
5445#ifdef PERL_MAD
5446 if (PL_madskills) {
cd81e915
NC
5447 PL_nextwhite = nextPL_nextwhite;
5448 curmad('X', PL_thistoken);
6b29d1f5 5449 PL_thistoken = newSVpvs("");
5db06880
NC
5450 }
5451#endif
93a17b20 5452 force_next(WORD);
c07a80fd 5453 yylval.ival = 0;
463ee0b2 5454 TOKEN('&');
79072805 5455 }
93a17b20 5456
a0d0e21e 5457 /* If followed by var or block, call it a method (unless sub) */
8990e307 5458
62d55b22 5459 if ((*s == '$' || *s == '{') && (!gv || !cv)) {
3280af22
NIS
5460 PL_last_lop = PL_oldbufptr;
5461 PL_last_lop_op = OP_METHOD;
93a17b20 5462 PREBLOCK(METHOD);
463ee0b2
LW
5463 }
5464
8990e307
LW
5465 /* If followed by a bareword, see if it looks like indir obj. */
5466
30fe34ed
RGS
5467 if (!orig_keyword
5468 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
62d55b22 5469 && (tmp = intuit_method(s, gv, cv)))
bbf60fe6 5470 return REPORT(tmp);
93a17b20 5471
8990e307
LW
5472 /* Not a method, so call it a subroutine (if defined) */
5473
5069cc75 5474 if (cv) {
0453d815 5475 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
9014280d 5476 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5477 "Ambiguous use of -%s resolved as -&%s()",
3280af22 5478 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 5479 /* Check for a constant sub */
c631f32b 5480 if ((sv = gv_const_sv(gv))) {
96e4d5b1 5481 its_constant:
5482 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
b37c2d43 5483 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
96e4d5b1 5484 yylval.opval->op_private = 0;
5485 TOKEN(WORD);
89bfa8cd 5486 }
5487
a5f75d66 5488 /* Resolve to GV now. */
62d55b22 5489 if (SvTYPE(gv) != SVt_PVGV) {
b3d904f3 5490 gv = gv_fetchpv(PL_tokenbuf, 0, SVt_PVCV);
62d55b22
NC
5491 assert (SvTYPE(gv) == SVt_PVGV);
5492 /* cv must have been some sort of placeholder, so
5493 now needs replacing with a real code reference. */
5494 cv = GvCV(gv);
5495 }
5496
a5f75d66
AD
5497 op_free(yylval.opval);
5498 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
9675f7ac 5499 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 5500 PL_last_lop = PL_oldbufptr;
bf848113 5501 PL_last_lop_op = OP_ENTERSUB;
4633a7c4 5502 /* Is there a prototype? */
5db06880
NC
5503 if (
5504#ifdef PERL_MAD
5505 cv &&
5506#endif
d9f2850e
RGS
5507 SvPOK(cv))
5508 {
5f66b61c
AL
5509 STRLEN protolen;
5510 const char *proto = SvPV_const((SV*)cv, protolen);
5511 if (!protolen)
4633a7c4 5512 TERM(FUNC0SUB);
8c28b960 5513 if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
4633a7c4 5514 OPERATOR(UNIOPSUB);
0f5d0394
AE
5515 while (*proto == ';')
5516 proto++;
7a52d87a 5517 if (*proto == '&' && *s == '{') {
10edeb5d
JH
5518 sv_setpv(PL_subname,
5519 (const char *)
5520 (PL_curstash ?
5521 "__ANON__" : "__ANON__::__ANON__"));
4633a7c4
LW
5522 PREBLOCK(LSTOPSUB);
5523 }
a9ef352a 5524 }
5db06880
NC
5525#ifdef PERL_MAD
5526 {
5527 if (PL_madskills) {
cd81e915
NC
5528 PL_nextwhite = PL_thiswhite;
5529 PL_thiswhite = 0;
5db06880 5530 }
cd81e915 5531 start_force(PL_curforce);
5db06880
NC
5532 NEXTVAL_NEXTTOKE.opval = yylval.opval;
5533 PL_expect = XTERM;
5534 if (PL_madskills) {
cd81e915
NC
5535 PL_nextwhite = nextPL_nextwhite;
5536 curmad('X', PL_thistoken);
6b29d1f5 5537 PL_thistoken = newSVpvs("");
5db06880
NC
5538 }
5539 force_next(WORD);
5540 TOKEN(NOAMP);
5541 }
5542 }
5543
5544 /* Guess harder when madskills require "best effort". */
5545 if (PL_madskills && (!gv || !GvCVu(gv))) {
5546 int probable_sub = 0;
5547 if (strchr("\"'`$@%0123456789!*+{[<", *s))
5548 probable_sub = 1;
5549 else if (isALPHA(*s)) {
5550 char tmpbuf[1024];
5551 STRLEN tmplen;
5552 d = s;
5553 d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
5458a98a 5554 if (!keyword(tmpbuf, tmplen, 0))
5db06880
NC
5555 probable_sub = 1;
5556 else {
5557 while (d < PL_bufend && isSPACE(*d))
5558 d++;
5559 if (*d == '=' && d[1] == '>')
5560 probable_sub = 1;
5561 }
5562 }
5563 if (probable_sub) {
7a6d04f4 5564 gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
5db06880
NC
5565 op_free(yylval.opval);
5566 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
5567 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
5568 PL_last_lop = PL_oldbufptr;
5569 PL_last_lop_op = OP_ENTERSUB;
cd81e915
NC
5570 PL_nextwhite = PL_thiswhite;
5571 PL_thiswhite = 0;
5572 start_force(PL_curforce);
5db06880
NC
5573 NEXTVAL_NEXTTOKE.opval = yylval.opval;
5574 PL_expect = XTERM;
cd81e915
NC
5575 PL_nextwhite = nextPL_nextwhite;
5576 curmad('X', PL_thistoken);
6b29d1f5 5577 PL_thistoken = newSVpvs("");
5db06880
NC
5578 force_next(WORD);
5579 TOKEN(NOAMP);
5580 }
5581#else
9ded7720 5582 NEXTVAL_NEXTTOKE.opval = yylval.opval;
3280af22 5583 PL_expect = XTERM;
8990e307
LW
5584 force_next(WORD);
5585 TOKEN(NOAMP);
5db06880 5586#endif
8990e307 5587 }
748a9306 5588
8990e307
LW
5589 /* Call it a bare word */
5590
5603f27d
GS
5591 if (PL_hints & HINT_STRICT_SUBS)
5592 yylval.opval->op_private |= OPpCONST_STRICT;
5593 else {
5594 bareword:
041457d9
DM
5595 if (lastchar != '-') {
5596 if (ckWARN(WARN_RESERVED)) {
c35e046a
AL
5597 d = PL_tokenbuf;
5598 while (isLOWER(*d))
5599 d++;
da51bb9b 5600 if (!*d && !gv_stashpv(PL_tokenbuf, 0))
9014280d 5601 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
5602 PL_tokenbuf);
5603 }
748a9306
LW
5604 }
5605 }
c3e0f903
GS
5606
5607 safe_bareword:
3792a11b
NC
5608 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
5609 && ckWARN_d(WARN_AMBIGUOUS)) {
9014280d 5610 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5611 "Operator or semicolon missing before %c%s",
3280af22 5612 lastchar, PL_tokenbuf);
9014280d 5613 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5614 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
5615 lastchar, lastchar);
5616 }
93a17b20 5617 TOKEN(WORD);
79072805 5618 }
79072805 5619
68dc0745 5620 case KEY___FILE__:
46fc3d4c 5621 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 5622 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 5623 TERM(THING);
5624
79072805 5625 case KEY___LINE__:
cf2093f6 5626 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 5627 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 5628 TERM(THING);
68dc0745 5629
5630 case KEY___PACKAGE__:
5631 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22 5632 (PL_curstash
5aaec2b4 5633 ? newSVhek(HvNAME_HEK(PL_curstash))
3280af22 5634 : &PL_sv_undef));
79072805 5635 TERM(THING);
79072805 5636
e50aee73 5637 case KEY___DATA__:
79072805
LW
5638 case KEY___END__: {
5639 GV *gv;
3280af22 5640 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
bfed75c6 5641 const char *pname = "main";
3280af22 5642 if (PL_tokenbuf[2] == 'D')
bfcb3514 5643 pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
f776e3cd
NC
5644 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
5645 SVt_PVIO);
a5f75d66 5646 GvMULTI_on(gv);
79072805 5647 if (!GvIO(gv))
a0d0e21e 5648 GvIOp(gv) = newIO();
3280af22 5649 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
5650#if defined(HAS_FCNTL) && defined(F_SETFD)
5651 {
f54cb97a 5652 const int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
5653 fcntl(fd,F_SETFD,fd >= 3);
5654 }
79072805 5655#endif
fd049845 5656 /* Mark this internal pseudo-handle as clean */
5657 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3280af22 5658 if (PL_preprocess)
50952442 5659 IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
3280af22 5660 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 5661 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 5662 else
50952442 5663 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
5664#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
5665 /* if the script was opened in binmode, we need to revert
53129d29 5666 * it to text mode for compatibility; but only iff it has CRs
c39cd008 5667 * XXX this is a questionable hack at best. */
53129d29
GS
5668 if (PL_bufend-PL_bufptr > 2
5669 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
5670 {
5671 Off_t loc = 0;
50952442 5672 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
5673 loc = PerlIO_tell(PL_rsfp);
5674 (void)PerlIO_seek(PL_rsfp, 0L, 0);
5675 }
2986a63f
JH
5676#ifdef NETWARE
5677 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
5678#else
c39cd008 5679 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 5680#endif /* NETWARE */
1143fce0
JH
5681#ifdef PERLIO_IS_STDIO /* really? */
5682# if defined(__BORLANDC__)
cb359b41
JH
5683 /* XXX see note in do_binmode() */
5684 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
5685# endif
5686#endif
c39cd008
GS
5687 if (loc > 0)
5688 PerlIO_seek(PL_rsfp, loc, 0);
5689 }
5690 }
5691#endif
7948272d 5692#ifdef PERLIO_LAYERS
52d2e0f4
JH
5693 if (!IN_BYTES) {
5694 if (UTF)
5695 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
5696 else if (PL_encoding) {
5697 SV *name;
5698 dSP;
5699 ENTER;
5700 SAVETMPS;
5701 PUSHMARK(sp);
5702 EXTEND(SP, 1);
5703 XPUSHs(PL_encoding);
5704 PUTBACK;
5705 call_method("name", G_SCALAR);
5706 SPAGAIN;
5707 name = POPs;
5708 PUTBACK;
bfed75c6 5709 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
52d2e0f4 5710 Perl_form(aTHX_ ":encoding(%"SVf")",
be2597df 5711 SVfARG(name)));
52d2e0f4
JH
5712 FREETMPS;
5713 LEAVE;
5714 }
5715 }
7948272d 5716#endif
5db06880
NC
5717#ifdef PERL_MAD
5718 if (PL_madskills) {
cd81e915
NC
5719 if (PL_realtokenstart >= 0) {
5720 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5721 if (!PL_endwhite)
6b29d1f5 5722 PL_endwhite = newSVpvs("");
cd81e915
NC
5723 sv_catsv(PL_endwhite, PL_thiswhite);
5724 PL_thiswhite = 0;
5725 sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
5726 PL_realtokenstart = -1;
5db06880 5727 }
cd81e915
NC
5728 while ((s = filter_gets(PL_endwhite, PL_rsfp,
5729 SvCUR(PL_endwhite))) != Nullch) ;
5db06880
NC
5730 }
5731#endif
4608196e 5732 PL_rsfp = NULL;
79072805
LW
5733 }
5734 goto fake_eof;
e929a76b 5735 }
de3bb511 5736
8990e307 5737 case KEY_AUTOLOAD:
ed6116ce 5738 case KEY_DESTROY:
79072805 5739 case KEY_BEGIN:
3c10abe3 5740 case KEY_UNITCHECK:
7d30b5c4 5741 case KEY_CHECK:
7d07dbc2 5742 case KEY_INIT:
7d30b5c4 5743 case KEY_END:
3280af22
NIS
5744 if (PL_expect == XSTATE) {
5745 s = PL_bufptr;
93a17b20 5746 goto really_sub;
79072805
LW
5747 }
5748 goto just_a_word;
5749
a0d0e21e
LW
5750 case KEY_CORE:
5751 if (*s == ':' && s[1] == ':') {
5752 s += 2;
748a9306 5753 d = s;
3280af22 5754 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 5755 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6798c92b 5756 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
5757 if (tmp < 0)
5758 tmp = -tmp;
850e8516 5759 else if (tmp == KEY_require || tmp == KEY_do)
a72a1c8b 5760 /* that's a way to remember we saw "CORE::" */
850e8516 5761 orig_keyword = tmp;
a0d0e21e
LW
5762 goto reserved_word;
5763 }
5764 goto just_a_word;
5765
463ee0b2
LW
5766 case KEY_abs:
5767 UNI(OP_ABS);
5768
79072805
LW
5769 case KEY_alarm:
5770 UNI(OP_ALARM);
5771
5772 case KEY_accept:
a0d0e21e 5773 LOP(OP_ACCEPT,XTERM);
79072805 5774
463ee0b2
LW
5775 case KEY_and:
5776 OPERATOR(ANDOP);
5777
79072805 5778 case KEY_atan2:
a0d0e21e 5779 LOP(OP_ATAN2,XTERM);
85e6fe83 5780
79072805 5781 case KEY_bind:
a0d0e21e 5782 LOP(OP_BIND,XTERM);
79072805
LW
5783
5784 case KEY_binmode:
1c1fc3ea 5785 LOP(OP_BINMODE,XTERM);
79072805
LW
5786
5787 case KEY_bless:
a0d0e21e 5788 LOP(OP_BLESS,XTERM);
79072805 5789
0d863452
RH
5790 case KEY_break:
5791 FUN0(OP_BREAK);
5792
79072805
LW
5793 case KEY_chop:
5794 UNI(OP_CHOP);
5795
5796 case KEY_continue:
0d863452
RH
5797 /* When 'use switch' is in effect, continue has a dual
5798 life as a control operator. */
5799 {
ef89dcc3 5800 if (!FEATURE_IS_ENABLED("switch"))
0d863452
RH
5801 PREBLOCK(CONTINUE);
5802 else {
5803 /* We have to disambiguate the two senses of
5804 "continue". If the next token is a '{' then
5805 treat it as the start of a continue block;
5806 otherwise treat it as a control operator.
5807 */
5808 s = skipspace(s);
5809 if (*s == '{')
79072805 5810 PREBLOCK(CONTINUE);
0d863452
RH
5811 else
5812 FUN0(OP_CONTINUE);
5813 }
5814 }
79072805
LW
5815
5816 case KEY_chdir:
fafc274c
NC
5817 /* may use HOME */
5818 (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
79072805
LW
5819 UNI(OP_CHDIR);
5820
5821 case KEY_close:
5822 UNI(OP_CLOSE);
5823
5824 case KEY_closedir:
5825 UNI(OP_CLOSEDIR);
5826
5827 case KEY_cmp:
5828 Eop(OP_SCMP);
5829
5830 case KEY_caller:
5831 UNI(OP_CALLER);
5832
5833 case KEY_crypt:
5834#ifdef FCRYPT
f4c556ac
GS
5835 if (!PL_cryptseen) {
5836 PL_cryptseen = TRUE;
de3bb511 5837 init_des();
f4c556ac 5838 }
a687059c 5839#endif
a0d0e21e 5840 LOP(OP_CRYPT,XTERM);
79072805
LW
5841
5842 case KEY_chmod:
a0d0e21e 5843 LOP(OP_CHMOD,XTERM);
79072805
LW
5844
5845 case KEY_chown:
a0d0e21e 5846 LOP(OP_CHOWN,XTERM);
79072805
LW
5847
5848 case KEY_connect:
a0d0e21e 5849 LOP(OP_CONNECT,XTERM);
79072805 5850
463ee0b2
LW
5851 case KEY_chr:
5852 UNI(OP_CHR);
5853
79072805
LW
5854 case KEY_cos:
5855 UNI(OP_COS);
5856
5857 case KEY_chroot:
5858 UNI(OP_CHROOT);
5859
0d863452
RH
5860 case KEY_default:
5861 PREBLOCK(DEFAULT);
5862
79072805 5863 case KEY_do:
29595ff2 5864 s = SKIPSPACE1(s);
79072805 5865 if (*s == '{')
a0d0e21e 5866 PRETERMBLOCK(DO);
79072805 5867 if (*s != '\'')
89c5585f 5868 s = force_word(s,WORD,TRUE,TRUE,FALSE);
850e8516
RGS
5869 if (orig_keyword == KEY_do) {
5870 orig_keyword = 0;
5871 yylval.ival = 1;
5872 }
5873 else
5874 yylval.ival = 0;
378cc40b 5875 OPERATOR(DO);
79072805
LW
5876
5877 case KEY_die:
3280af22 5878 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 5879 LOP(OP_DIE,XTERM);
79072805
LW
5880
5881 case KEY_defined:
5882 UNI(OP_DEFINED);
5883
5884 case KEY_delete:
a0d0e21e 5885 UNI(OP_DELETE);
79072805
LW
5886
5887 case KEY_dbmopen:
5c1737d1 5888 gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
a0d0e21e 5889 LOP(OP_DBMOPEN,XTERM);
79072805
LW
5890
5891 case KEY_dbmclose:
5892 UNI(OP_DBMCLOSE);
5893
5894 case KEY_dump:
a0d0e21e 5895 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
5896 LOOPX(OP_DUMP);
5897
5898 case KEY_else:
5899 PREBLOCK(ELSE);
5900
5901 case KEY_elsif:
57843af0 5902 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5903 OPERATOR(ELSIF);
5904
5905 case KEY_eq:
5906 Eop(OP_SEQ);
5907
a0d0e21e
LW
5908 case KEY_exists:
5909 UNI(OP_EXISTS);
4e553d73 5910
79072805 5911 case KEY_exit:
5db06880
NC
5912 if (PL_madskills)
5913 UNI(OP_INT);
79072805
LW
5914 UNI(OP_EXIT);
5915
5916 case KEY_eval:
29595ff2 5917 s = SKIPSPACE1(s);
3280af22 5918 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 5919 UNIBRACK(OP_ENTEREVAL);
79072805
LW
5920
5921 case KEY_eof:
5922 UNI(OP_EOF);
5923
5924 case KEY_exp:
5925 UNI(OP_EXP);
5926
5927 case KEY_each:
5928 UNI(OP_EACH);
5929
5930 case KEY_exec:
5931 set_csh();
a0d0e21e 5932 LOP(OP_EXEC,XREF);
79072805
LW
5933
5934 case KEY_endhostent:
5935 FUN0(OP_EHOSTENT);
5936
5937 case KEY_endnetent:
5938 FUN0(OP_ENETENT);
5939
5940 case KEY_endservent:
5941 FUN0(OP_ESERVENT);
5942
5943 case KEY_endprotoent:
5944 FUN0(OP_EPROTOENT);
5945
5946 case KEY_endpwent:
5947 FUN0(OP_EPWENT);
5948
5949 case KEY_endgrent:
5950 FUN0(OP_EGRENT);
5951
5952 case KEY_for:
5953 case KEY_foreach:
57843af0 5954 yylval.ival = CopLINE(PL_curcop);
29595ff2 5955 s = SKIPSPACE1(s);
7e2040f0 5956 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 5957 char *p = s;
5db06880
NC
5958#ifdef PERL_MAD
5959 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
5960#endif
5961
3280af22 5962 if ((PL_bufend - p) >= 3 &&
55497cff 5963 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
5964 p += 2;
77ca0c92
LW
5965 else if ((PL_bufend - p) >= 4 &&
5966 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
5967 p += 3;
29595ff2 5968 p = PEEKSPACE(p);
7e2040f0 5969 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
5970 p = scan_ident(p, PL_bufend,
5971 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
29595ff2 5972 p = PEEKSPACE(p);
77ca0c92
LW
5973 }
5974 if (*p != '$')
cea2e8a9 5975 Perl_croak(aTHX_ "Missing $ on loop variable");
5db06880
NC
5976#ifdef PERL_MAD
5977 s = SvPVX(PL_linestr) + soff;
5978#endif
55497cff 5979 }
79072805
LW
5980 OPERATOR(FOR);
5981
5982 case KEY_formline:
a0d0e21e 5983 LOP(OP_FORMLINE,XTERM);
79072805
LW
5984
5985 case KEY_fork:
5986 FUN0(OP_FORK);
5987
5988 case KEY_fcntl:
a0d0e21e 5989 LOP(OP_FCNTL,XTERM);
79072805
LW
5990
5991 case KEY_fileno:
5992 UNI(OP_FILENO);
5993
5994 case KEY_flock:
a0d0e21e 5995 LOP(OP_FLOCK,XTERM);
79072805
LW
5996
5997 case KEY_gt:
5998 Rop(OP_SGT);
5999
6000 case KEY_ge:
6001 Rop(OP_SGE);
6002
6003 case KEY_grep:
2c38e13d 6004 LOP(OP_GREPSTART, XREF);
79072805
LW
6005
6006 case KEY_goto:
a0d0e21e 6007 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6008 LOOPX(OP_GOTO);
6009
6010 case KEY_gmtime:
6011 UNI(OP_GMTIME);
6012
6013 case KEY_getc:
6f33ba73 6014 UNIDOR(OP_GETC);
79072805
LW
6015
6016 case KEY_getppid:
6017 FUN0(OP_GETPPID);
6018
6019 case KEY_getpgrp:
6020 UNI(OP_GETPGRP);
6021
6022 case KEY_getpriority:
a0d0e21e 6023 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
6024
6025 case KEY_getprotobyname:
6026 UNI(OP_GPBYNAME);
6027
6028 case KEY_getprotobynumber:
a0d0e21e 6029 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
6030
6031 case KEY_getprotoent:
6032 FUN0(OP_GPROTOENT);
6033
6034 case KEY_getpwent:
6035 FUN0(OP_GPWENT);
6036
6037 case KEY_getpwnam:
ff68c719 6038 UNI(OP_GPWNAM);
79072805
LW
6039
6040 case KEY_getpwuid:
ff68c719 6041 UNI(OP_GPWUID);
79072805
LW
6042
6043 case KEY_getpeername:
6044 UNI(OP_GETPEERNAME);
6045
6046 case KEY_gethostbyname:
6047 UNI(OP_GHBYNAME);
6048
6049 case KEY_gethostbyaddr:
a0d0e21e 6050 LOP(OP_GHBYADDR,XTERM);
79072805
LW
6051
6052 case KEY_gethostent:
6053 FUN0(OP_GHOSTENT);
6054
6055 case KEY_getnetbyname:
6056 UNI(OP_GNBYNAME);
6057
6058 case KEY_getnetbyaddr:
a0d0e21e 6059 LOP(OP_GNBYADDR,XTERM);
79072805
LW
6060
6061 case KEY_getnetent:
6062 FUN0(OP_GNETENT);
6063
6064 case KEY_getservbyname:
a0d0e21e 6065 LOP(OP_GSBYNAME,XTERM);
79072805
LW
6066
6067 case KEY_getservbyport:
a0d0e21e 6068 LOP(OP_GSBYPORT,XTERM);
79072805
LW
6069
6070 case KEY_getservent:
6071 FUN0(OP_GSERVENT);
6072
6073 case KEY_getsockname:
6074 UNI(OP_GETSOCKNAME);
6075
6076 case KEY_getsockopt:
a0d0e21e 6077 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
6078
6079 case KEY_getgrent:
6080 FUN0(OP_GGRENT);
6081
6082 case KEY_getgrnam:
ff68c719 6083 UNI(OP_GGRNAM);
79072805
LW
6084
6085 case KEY_getgrgid:
ff68c719 6086 UNI(OP_GGRGID);
79072805
LW
6087
6088 case KEY_getlogin:
6089 FUN0(OP_GETLOGIN);
6090
0d863452
RH
6091 case KEY_given:
6092 yylval.ival = CopLINE(PL_curcop);
6093 OPERATOR(GIVEN);
6094
93a17b20 6095 case KEY_glob:
a0d0e21e
LW
6096 set_csh();
6097 LOP(OP_GLOB,XTERM);
93a17b20 6098
79072805
LW
6099 case KEY_hex:
6100 UNI(OP_HEX);
6101
6102 case KEY_if:
57843af0 6103 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6104 OPERATOR(IF);
6105
6106 case KEY_index:
a0d0e21e 6107 LOP(OP_INDEX,XTERM);
79072805
LW
6108
6109 case KEY_int:
6110 UNI(OP_INT);
6111
6112 case KEY_ioctl:
a0d0e21e 6113 LOP(OP_IOCTL,XTERM);
79072805
LW
6114
6115 case KEY_join:
a0d0e21e 6116 LOP(OP_JOIN,XTERM);
79072805
LW
6117
6118 case KEY_keys:
6119 UNI(OP_KEYS);
6120
6121 case KEY_kill:
a0d0e21e 6122 LOP(OP_KILL,XTERM);
79072805
LW
6123
6124 case KEY_last:
a0d0e21e 6125 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 6126 LOOPX(OP_LAST);
4e553d73 6127
79072805
LW
6128 case KEY_lc:
6129 UNI(OP_LC);
6130
6131 case KEY_lcfirst:
6132 UNI(OP_LCFIRST);
6133
6134 case KEY_local:
09bef843 6135 yylval.ival = 0;
79072805
LW
6136 OPERATOR(LOCAL);
6137
6138 case KEY_length:
6139 UNI(OP_LENGTH);
6140
6141 case KEY_lt:
6142 Rop(OP_SLT);
6143
6144 case KEY_le:
6145 Rop(OP_SLE);
6146
6147 case KEY_localtime:
6148 UNI(OP_LOCALTIME);
6149
6150 case KEY_log:
6151 UNI(OP_LOG);
6152
6153 case KEY_link:
a0d0e21e 6154 LOP(OP_LINK,XTERM);
79072805
LW
6155
6156 case KEY_listen:
a0d0e21e 6157 LOP(OP_LISTEN,XTERM);
79072805 6158
c0329465
MB
6159 case KEY_lock:
6160 UNI(OP_LOCK);
6161
79072805
LW
6162 case KEY_lstat:
6163 UNI(OP_LSTAT);
6164
6165 case KEY_m:
8782bef2 6166 s = scan_pat(s,OP_MATCH);
79072805
LW
6167 TERM(sublex_start());
6168
a0d0e21e 6169 case KEY_map:
2c38e13d 6170 LOP(OP_MAPSTART, XREF);
4e4e412b 6171
79072805 6172 case KEY_mkdir:
a0d0e21e 6173 LOP(OP_MKDIR,XTERM);
79072805
LW
6174
6175 case KEY_msgctl:
a0d0e21e 6176 LOP(OP_MSGCTL,XTERM);
79072805
LW
6177
6178 case KEY_msgget:
a0d0e21e 6179 LOP(OP_MSGGET,XTERM);
79072805
LW
6180
6181 case KEY_msgrcv:
a0d0e21e 6182 LOP(OP_MSGRCV,XTERM);
79072805
LW
6183
6184 case KEY_msgsnd:
a0d0e21e 6185 LOP(OP_MSGSND,XTERM);
79072805 6186
77ca0c92 6187 case KEY_our:
93a17b20 6188 case KEY_my:
952306ac 6189 case KEY_state:
eac04b2e 6190 PL_in_my = (U16)tmp;
29595ff2 6191 s = SKIPSPACE1(s);
7e2040f0 6192 if (isIDFIRST_lazy_if(s,UTF)) {
5db06880
NC
6193#ifdef PERL_MAD
6194 char* start = s;
6195#endif
3280af22 6196 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
6197 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
6198 goto really_sub;
def3634b 6199 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 6200 if (!PL_in_my_stash) {
c750a3ec 6201 char tmpbuf[1024];
3280af22 6202 PL_bufptr = s;
d9fad198 6203 my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
6204 yyerror(tmpbuf);
6205 }
5db06880
NC
6206#ifdef PERL_MAD
6207 if (PL_madskills) { /* just add type to declarator token */
cd81e915
NC
6208 sv_catsv(PL_thistoken, PL_nextwhite);
6209 PL_nextwhite = 0;
6210 sv_catpvn(PL_thistoken, start, s - start);
5db06880
NC
6211 }
6212#endif
c750a3ec 6213 }
09bef843 6214 yylval.ival = 1;
55497cff 6215 OPERATOR(MY);
93a17b20 6216
79072805 6217 case KEY_next:
a0d0e21e 6218 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6219 LOOPX(OP_NEXT);
6220
6221 case KEY_ne:
6222 Eop(OP_SNE);
6223
a0d0e21e 6224 case KEY_no:
468aa647 6225 s = tokenize_use(0, s);
a0d0e21e
LW
6226 OPERATOR(USE);
6227
6228 case KEY_not:
29595ff2 6229 if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
2d2e263d
LW
6230 FUN1(OP_NOT);
6231 else
6232 OPERATOR(NOTOP);
a0d0e21e 6233
79072805 6234 case KEY_open:
29595ff2 6235 s = SKIPSPACE1(s);
7e2040f0 6236 if (isIDFIRST_lazy_if(s,UTF)) {
f54cb97a 6237 const char *t;
c35e046a
AL
6238 for (d = s; isALNUM_lazy_if(d,UTF);)
6239 d++;
6240 for (t=d; isSPACE(*t);)
6241 t++;
e2ab214b 6242 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
6243 /* [perl #16184] */
6244 && !(t[0] == '=' && t[1] == '>')
6245 ) {
5f66b61c 6246 int parms_len = (int)(d-s);
9014280d 6247 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 6248 "Precedence problem: open %.*s should be open(%.*s)",
5f66b61c 6249 parms_len, s, parms_len, s);
66fbe8fb 6250 }
93a17b20 6251 }
a0d0e21e 6252 LOP(OP_OPEN,XTERM);
79072805 6253
463ee0b2 6254 case KEY_or:
a0d0e21e 6255 yylval.ival = OP_OR;
463ee0b2
LW
6256 OPERATOR(OROP);
6257
79072805
LW
6258 case KEY_ord:
6259 UNI(OP_ORD);
6260
6261 case KEY_oct:
6262 UNI(OP_OCT);
6263
6264 case KEY_opendir:
a0d0e21e 6265 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
6266
6267 case KEY_print:
3280af22 6268 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6269 LOP(OP_PRINT,XREF);
79072805
LW
6270
6271 case KEY_printf:
3280af22 6272 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6273 LOP(OP_PRTF,XREF);
79072805 6274
c07a80fd 6275 case KEY_prototype:
6276 UNI(OP_PROTOTYPE);
6277
79072805 6278 case KEY_push:
a0d0e21e 6279 LOP(OP_PUSH,XTERM);
79072805
LW
6280
6281 case KEY_pop:
6f33ba73 6282 UNIDOR(OP_POP);
79072805 6283
a0d0e21e 6284 case KEY_pos:
6f33ba73 6285 UNIDOR(OP_POS);
4e553d73 6286
79072805 6287 case KEY_pack:
a0d0e21e 6288 LOP(OP_PACK,XTERM);
79072805
LW
6289
6290 case KEY_package:
a0d0e21e 6291 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
6292 OPERATOR(PACKAGE);
6293
6294 case KEY_pipe:
a0d0e21e 6295 LOP(OP_PIPE_OP,XTERM);
79072805
LW
6296
6297 case KEY_q:
5db06880 6298 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6299 if (!s)
d4c19fe8 6300 missingterm(NULL);
79072805
LW
6301 yylval.ival = OP_CONST;
6302 TERM(sublex_start());
6303
a0d0e21e
LW
6304 case KEY_quotemeta:
6305 UNI(OP_QUOTEMETA);
6306
8990e307 6307 case KEY_qw:
5db06880 6308 s = scan_str(s,!!PL_madskills,FALSE);
8990e307 6309 if (!s)
d4c19fe8 6310 missingterm(NULL);
3480a8d2 6311 PL_expect = XOPERATOR;
8127e0e3
GS
6312 force_next(')');
6313 if (SvCUR(PL_lex_stuff)) {
5f66b61c 6314 OP *words = NULL;
8127e0e3 6315 int warned = 0;
3280af22 6316 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 6317 while (len) {
d4c19fe8
AL
6318 for (; isSPACE(*d) && len; --len, ++d)
6319 /**/;
8127e0e3 6320 if (len) {
d4c19fe8 6321 SV *sv;
f54cb97a 6322 const char *b = d;
e476b1b5 6323 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
6324 for (; !isSPACE(*d) && len; --len, ++d) {
6325 if (*d == ',') {
9014280d 6326 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6327 "Possible attempt to separate words with commas");
6328 ++warned;
6329 }
6330 else if (*d == '#') {
9014280d 6331 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6332 "Possible attempt to put comments in qw() list");
6333 ++warned;
6334 }
6335 }
6336 }
6337 else {
d4c19fe8
AL
6338 for (; !isSPACE(*d) && len; --len, ++d)
6339 /**/;
8127e0e3 6340 }
7948272d
NIS
6341 sv = newSVpvn(b, d-b);
6342 if (DO_UTF8(PL_lex_stuff))
6343 SvUTF8_on(sv);
8127e0e3 6344 words = append_elem(OP_LIST, words,
7948272d 6345 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 6346 }
6347 }
8127e0e3 6348 if (words) {
cd81e915 6349 start_force(PL_curforce);
9ded7720 6350 NEXTVAL_NEXTTOKE.opval = words;
8127e0e3
GS
6351 force_next(THING);
6352 }
55497cff 6353 }
37fd879b 6354 if (PL_lex_stuff) {
8127e0e3 6355 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 6356 PL_lex_stuff = NULL;
37fd879b 6357 }
3280af22 6358 PL_expect = XTERM;
8127e0e3 6359 TOKEN('(');
8990e307 6360
79072805 6361 case KEY_qq:
5db06880 6362 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6363 if (!s)
d4c19fe8 6364 missingterm(NULL);
a0d0e21e 6365 yylval.ival = OP_STRINGIFY;
3280af22 6366 if (SvIVX(PL_lex_stuff) == '\'')
45977657 6367 SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should intepolate */
79072805
LW
6368 TERM(sublex_start());
6369
8782bef2
GB
6370 case KEY_qr:
6371 s = scan_pat(s,OP_QR);
6372 TERM(sublex_start());
6373
79072805 6374 case KEY_qx:
5db06880 6375 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6376 if (!s)
d4c19fe8 6377 missingterm(NULL);
9b201d7d 6378 readpipe_override();
79072805
LW
6379 TERM(sublex_start());
6380
6381 case KEY_return:
6382 OLDLOP(OP_RETURN);
6383
6384 case KEY_require:
29595ff2 6385 s = SKIPSPACE1(s);
e759cc13
RGS
6386 if (isDIGIT(*s)) {
6387 s = force_version(s, FALSE);
a7cb1f99 6388 }
e759cc13
RGS
6389 else if (*s != 'v' || !isDIGIT(s[1])
6390 || (s = force_version(s, TRUE), *s == 'v'))
6391 {
a7cb1f99
GS
6392 *PL_tokenbuf = '\0';
6393 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 6394 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
da51bb9b 6395 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
a7cb1f99
GS
6396 else if (*s == '<')
6397 yyerror("<> should be quotes");
6398 }
a72a1c8b
RGS
6399 if (orig_keyword == KEY_require) {
6400 orig_keyword = 0;
6401 yylval.ival = 1;
6402 }
6403 else
6404 yylval.ival = 0;
6405 PL_expect = XTERM;
6406 PL_bufptr = s;
6407 PL_last_uni = PL_oldbufptr;
6408 PL_last_lop_op = OP_REQUIRE;
6409 s = skipspace(s);
6410 return REPORT( (int)REQUIRE );
79072805
LW
6411
6412 case KEY_reset:
6413 UNI(OP_RESET);
6414
6415 case KEY_redo:
a0d0e21e 6416 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6417 LOOPX(OP_REDO);
6418
6419 case KEY_rename:
a0d0e21e 6420 LOP(OP_RENAME,XTERM);
79072805
LW
6421
6422 case KEY_rand:
6423 UNI(OP_RAND);
6424
6425 case KEY_rmdir:
6426 UNI(OP_RMDIR);
6427
6428 case KEY_rindex:
a0d0e21e 6429 LOP(OP_RINDEX,XTERM);
79072805
LW
6430
6431 case KEY_read:
a0d0e21e 6432 LOP(OP_READ,XTERM);
79072805
LW
6433
6434 case KEY_readdir:
6435 UNI(OP_READDIR);
6436
93a17b20
LW
6437 case KEY_readline:
6438 set_csh();
6f33ba73 6439 UNIDOR(OP_READLINE);
93a17b20
LW
6440
6441 case KEY_readpipe:
6442 set_csh();
0858480c 6443 UNIDOR(OP_BACKTICK);
93a17b20 6444
79072805
LW
6445 case KEY_rewinddir:
6446 UNI(OP_REWINDDIR);
6447
6448 case KEY_recv:
a0d0e21e 6449 LOP(OP_RECV,XTERM);
79072805
LW
6450
6451 case KEY_reverse:
a0d0e21e 6452 LOP(OP_REVERSE,XTERM);
79072805
LW
6453
6454 case KEY_readlink:
6f33ba73 6455 UNIDOR(OP_READLINK);
79072805
LW
6456
6457 case KEY_ref:
6458 UNI(OP_REF);
6459
6460 case KEY_s:
6461 s = scan_subst(s);
6462 if (yylval.opval)
6463 TERM(sublex_start());
6464 else
6465 TOKEN(1); /* force error */
6466
0d863452
RH
6467 case KEY_say:
6468 checkcomma(s,PL_tokenbuf,"filehandle");
6469 LOP(OP_SAY,XREF);
6470
a0d0e21e
LW
6471 case KEY_chomp:
6472 UNI(OP_CHOMP);
4e553d73 6473
79072805
LW
6474 case KEY_scalar:
6475 UNI(OP_SCALAR);
6476
6477 case KEY_select:
a0d0e21e 6478 LOP(OP_SELECT,XTERM);
79072805
LW
6479
6480 case KEY_seek:
a0d0e21e 6481 LOP(OP_SEEK,XTERM);
79072805
LW
6482
6483 case KEY_semctl:
a0d0e21e 6484 LOP(OP_SEMCTL,XTERM);
79072805
LW
6485
6486 case KEY_semget:
a0d0e21e 6487 LOP(OP_SEMGET,XTERM);
79072805
LW
6488
6489 case KEY_semop:
a0d0e21e 6490 LOP(OP_SEMOP,XTERM);
79072805
LW
6491
6492 case KEY_send:
a0d0e21e 6493 LOP(OP_SEND,XTERM);
79072805
LW
6494
6495 case KEY_setpgrp:
a0d0e21e 6496 LOP(OP_SETPGRP,XTERM);
79072805
LW
6497
6498 case KEY_setpriority:
a0d0e21e 6499 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
6500
6501 case KEY_sethostent:
ff68c719 6502 UNI(OP_SHOSTENT);
79072805
LW
6503
6504 case KEY_setnetent:
ff68c719 6505 UNI(OP_SNETENT);
79072805
LW
6506
6507 case KEY_setservent:
ff68c719 6508 UNI(OP_SSERVENT);
79072805
LW
6509
6510 case KEY_setprotoent:
ff68c719 6511 UNI(OP_SPROTOENT);
79072805
LW
6512
6513 case KEY_setpwent:
6514 FUN0(OP_SPWENT);
6515
6516 case KEY_setgrent:
6517 FUN0(OP_SGRENT);
6518
6519 case KEY_seekdir:
a0d0e21e 6520 LOP(OP_SEEKDIR,XTERM);
79072805
LW
6521
6522 case KEY_setsockopt:
a0d0e21e 6523 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
6524
6525 case KEY_shift:
6f33ba73 6526 UNIDOR(OP_SHIFT);
79072805
LW
6527
6528 case KEY_shmctl:
a0d0e21e 6529 LOP(OP_SHMCTL,XTERM);
79072805
LW
6530
6531 case KEY_shmget:
a0d0e21e 6532 LOP(OP_SHMGET,XTERM);
79072805
LW
6533
6534 case KEY_shmread:
a0d0e21e 6535 LOP(OP_SHMREAD,XTERM);
79072805
LW
6536
6537 case KEY_shmwrite:
a0d0e21e 6538 LOP(OP_SHMWRITE,XTERM);
79072805
LW
6539
6540 case KEY_shutdown:
a0d0e21e 6541 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
6542
6543 case KEY_sin:
6544 UNI(OP_SIN);
6545
6546 case KEY_sleep:
6547 UNI(OP_SLEEP);
6548
6549 case KEY_socket:
a0d0e21e 6550 LOP(OP_SOCKET,XTERM);
79072805
LW
6551
6552 case KEY_socketpair:
a0d0e21e 6553 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
6554
6555 case KEY_sort:
3280af22 6556 checkcomma(s,PL_tokenbuf,"subroutine name");
29595ff2 6557 s = SKIPSPACE1(s);
79072805 6558 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 6559 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 6560 PL_expect = XTERM;
15f0808c 6561 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 6562 LOP(OP_SORT,XREF);
79072805
LW
6563
6564 case KEY_split:
a0d0e21e 6565 LOP(OP_SPLIT,XTERM);
79072805
LW
6566
6567 case KEY_sprintf:
a0d0e21e 6568 LOP(OP_SPRINTF,XTERM);
79072805
LW
6569
6570 case KEY_splice:
a0d0e21e 6571 LOP(OP_SPLICE,XTERM);
79072805
LW
6572
6573 case KEY_sqrt:
6574 UNI(OP_SQRT);
6575
6576 case KEY_srand:
6577 UNI(OP_SRAND);
6578
6579 case KEY_stat:
6580 UNI(OP_STAT);
6581
6582 case KEY_study:
79072805
LW
6583 UNI(OP_STUDY);
6584
6585 case KEY_substr:
a0d0e21e 6586 LOP(OP_SUBSTR,XTERM);
79072805
LW
6587
6588 case KEY_format:
6589 case KEY_sub:
93a17b20 6590 really_sub:
09bef843 6591 {
3280af22 6592 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 6593 SSize_t tboffset = 0;
09bef843 6594 expectation attrful;
28cc6278 6595 bool have_name, have_proto;
f54cb97a 6596 const int key = tmp;
09bef843 6597
5db06880
NC
6598#ifdef PERL_MAD
6599 SV *tmpwhite = 0;
6600
cd81e915 6601 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5db06880 6602 SV *subtoken = newSVpvn(tstart, s - tstart);
cd81e915 6603 PL_thistoken = 0;
5db06880
NC
6604
6605 d = s;
6606 s = SKIPSPACE2(s,tmpwhite);
6607#else
09bef843 6608 s = skipspace(s);
5db06880 6609#endif
09bef843 6610
7e2040f0 6611 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
6612 (*s == ':' && s[1] == ':'))
6613 {
5db06880
NC
6614#ifdef PERL_MAD
6615 SV *nametoke;
6616#endif
6617
09bef843
SB
6618 PL_expect = XBLOCK;
6619 attrful = XATTRBLOCK;
b1b65b59
JH
6620 /* remember buffer pos'n for later force_word */
6621 tboffset = s - PL_oldbufptr;
09bef843 6622 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5db06880
NC
6623#ifdef PERL_MAD
6624 if (PL_madskills)
6625 nametoke = newSVpvn(s, d - s);
6626#endif
6502358f
NC
6627 if (memchr(tmpbuf, ':', len))
6628 sv_setpvn(PL_subname, tmpbuf, len);
09bef843
SB
6629 else {
6630 sv_setsv(PL_subname,PL_curstname);
396482e1 6631 sv_catpvs(PL_subname,"::");
09bef843
SB
6632 sv_catpvn(PL_subname,tmpbuf,len);
6633 }
09bef843 6634 have_name = TRUE;
5db06880
NC
6635
6636#ifdef PERL_MAD
6637
6638 start_force(0);
6639 CURMAD('X', nametoke);
6640 CURMAD('_', tmpwhite);
6641 (void) force_word(PL_oldbufptr + tboffset, WORD,
6642 FALSE, TRUE, TRUE);
6643
6644 s = SKIPSPACE2(d,tmpwhite);
6645#else
6646 s = skipspace(d);
6647#endif
09bef843 6648 }
463ee0b2 6649 else {
09bef843
SB
6650 if (key == KEY_my)
6651 Perl_croak(aTHX_ "Missing name in \"my sub\"");
6652 PL_expect = XTERMBLOCK;
6653 attrful = XATTRTERM;
c69006e4 6654 sv_setpvn(PL_subname,"?",1);
09bef843 6655 have_name = FALSE;
463ee0b2 6656 }
4633a7c4 6657
09bef843
SB
6658 if (key == KEY_format) {
6659 if (*s == '=')
6660 PL_lex_formbrack = PL_lex_brackets + 1;
5db06880 6661#ifdef PERL_MAD
cd81e915 6662 PL_thistoken = subtoken;
5db06880
NC
6663 s = d;
6664#else
09bef843 6665 if (have_name)
b1b65b59
JH
6666 (void) force_word(PL_oldbufptr + tboffset, WORD,
6667 FALSE, TRUE, TRUE);
5db06880 6668#endif
09bef843
SB
6669 OPERATOR(FORMAT);
6670 }
79072805 6671
09bef843
SB
6672 /* Look for a prototype */
6673 if (*s == '(') {
d9f2850e
RGS
6674 char *p;
6675 bool bad_proto = FALSE;
6676 const bool warnsyntax = ckWARN(WARN_SYNTAX);
09bef843 6677
5db06880 6678 s = scan_str(s,!!PL_madskills,FALSE);
37fd879b 6679 if (!s)
09bef843 6680 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 6681 /* strip spaces and check for bad characters */
09bef843
SB
6682 d = SvPVX(PL_lex_stuff);
6683 tmp = 0;
d9f2850e
RGS
6684 for (p = d; *p; ++p) {
6685 if (!isSPACE(*p)) {
6686 d[tmp++] = *p;
b13fd70a 6687 if (warnsyntax && !strchr("$@%*;[]&\\_", *p))
d9f2850e 6688 bad_proto = TRUE;
d37a9538 6689 }
09bef843 6690 }
d9f2850e
RGS
6691 d[tmp] = '\0';
6692 if (bad_proto)
6693 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6694 "Illegal character in prototype for %"SVf" : %s",
be2597df 6695 SVfARG(PL_subname), d);
b162af07 6696 SvCUR_set(PL_lex_stuff, tmp);
09bef843 6697 have_proto = TRUE;
68dc0745 6698
5db06880
NC
6699#ifdef PERL_MAD
6700 start_force(0);
cd81e915 6701 CURMAD('q', PL_thisopen);
5db06880 6702 CURMAD('_', tmpwhite);
cd81e915
NC
6703 CURMAD('=', PL_thisstuff);
6704 CURMAD('Q', PL_thisclose);
5db06880
NC
6705 NEXTVAL_NEXTTOKE.opval =
6706 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
6707 PL_lex_stuff = Nullsv;
6708 force_next(THING);
6709
6710 s = SKIPSPACE2(s,tmpwhite);
6711#else
09bef843 6712 s = skipspace(s);
5db06880 6713#endif
4633a7c4 6714 }
09bef843
SB
6715 else
6716 have_proto = FALSE;
6717
6718 if (*s == ':' && s[1] != ':')
6719 PL_expect = attrful;
8e742a20
MHM
6720 else if (*s != '{' && key == KEY_sub) {
6721 if (!have_name)
6722 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
6723 else if (*s != ';')
be2597df 6724 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
8e742a20 6725 }
09bef843 6726
5db06880
NC
6727#ifdef PERL_MAD
6728 start_force(0);
6729 if (tmpwhite) {
6730 if (PL_madskills)
6b29d1f5 6731 curmad('^', newSVpvs(""));
5db06880
NC
6732 CURMAD('_', tmpwhite);
6733 }
6734 force_next(0);
6735
cd81e915 6736 PL_thistoken = subtoken;
5db06880 6737#else
09bef843 6738 if (have_proto) {
9ded7720 6739 NEXTVAL_NEXTTOKE.opval =
b1b65b59 6740 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
a0714e2c 6741 PL_lex_stuff = NULL;
09bef843 6742 force_next(THING);
68dc0745 6743 }
5db06880 6744#endif
09bef843 6745 if (!have_name) {
c99da370 6746 sv_setpv(PL_subname,
10edeb5d
JH
6747 (const char *)
6748 (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"));
09bef843 6749 TOKEN(ANONSUB);
4633a7c4 6750 }
5db06880 6751#ifndef PERL_MAD
b1b65b59
JH
6752 (void) force_word(PL_oldbufptr + tboffset, WORD,
6753 FALSE, TRUE, TRUE);
5db06880 6754#endif
09bef843
SB
6755 if (key == KEY_my)
6756 TOKEN(MYSUB);
6757 TOKEN(SUB);
4633a7c4 6758 }
79072805
LW
6759
6760 case KEY_system:
6761 set_csh();
a0d0e21e 6762 LOP(OP_SYSTEM,XREF);
79072805
LW
6763
6764 case KEY_symlink:
a0d0e21e 6765 LOP(OP_SYMLINK,XTERM);
79072805
LW
6766
6767 case KEY_syscall:
a0d0e21e 6768 LOP(OP_SYSCALL,XTERM);
79072805 6769
c07a80fd 6770 case KEY_sysopen:
6771 LOP(OP_SYSOPEN,XTERM);
6772
137443ea 6773 case KEY_sysseek:
6774 LOP(OP_SYSSEEK,XTERM);
6775
79072805 6776 case KEY_sysread:
a0d0e21e 6777 LOP(OP_SYSREAD,XTERM);
79072805
LW
6778
6779 case KEY_syswrite:
a0d0e21e 6780 LOP(OP_SYSWRITE,XTERM);
79072805
LW
6781
6782 case KEY_tr:
6783 s = scan_trans(s);
6784 TERM(sublex_start());
6785
6786 case KEY_tell:
6787 UNI(OP_TELL);
6788
6789 case KEY_telldir:
6790 UNI(OP_TELLDIR);
6791
463ee0b2 6792 case KEY_tie:
a0d0e21e 6793 LOP(OP_TIE,XTERM);
463ee0b2 6794
c07a80fd 6795 case KEY_tied:
6796 UNI(OP_TIED);
6797
79072805
LW
6798 case KEY_time:
6799 FUN0(OP_TIME);
6800
6801 case KEY_times:
6802 FUN0(OP_TMS);
6803
6804 case KEY_truncate:
a0d0e21e 6805 LOP(OP_TRUNCATE,XTERM);
79072805
LW
6806
6807 case KEY_uc:
6808 UNI(OP_UC);
6809
6810 case KEY_ucfirst:
6811 UNI(OP_UCFIRST);
6812
463ee0b2
LW
6813 case KEY_untie:
6814 UNI(OP_UNTIE);
6815
79072805 6816 case KEY_until:
57843af0 6817 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6818 OPERATOR(UNTIL);
6819
6820 case KEY_unless:
57843af0 6821 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6822 OPERATOR(UNLESS);
6823
6824 case KEY_unlink:
a0d0e21e 6825 LOP(OP_UNLINK,XTERM);
79072805
LW
6826
6827 case KEY_undef:
6f33ba73 6828 UNIDOR(OP_UNDEF);
79072805
LW
6829
6830 case KEY_unpack:
a0d0e21e 6831 LOP(OP_UNPACK,XTERM);
79072805
LW
6832
6833 case KEY_utime:
a0d0e21e 6834 LOP(OP_UTIME,XTERM);
79072805
LW
6835
6836 case KEY_umask:
6f33ba73 6837 UNIDOR(OP_UMASK);
79072805
LW
6838
6839 case KEY_unshift:
a0d0e21e
LW
6840 LOP(OP_UNSHIFT,XTERM);
6841
6842 case KEY_use:
468aa647 6843 s = tokenize_use(1, s);
a0d0e21e 6844 OPERATOR(USE);
79072805
LW
6845
6846 case KEY_values:
6847 UNI(OP_VALUES);
6848
6849 case KEY_vec:
a0d0e21e 6850 LOP(OP_VEC,XTERM);
79072805 6851
0d863452
RH
6852 case KEY_when:
6853 yylval.ival = CopLINE(PL_curcop);
6854 OPERATOR(WHEN);
6855
79072805 6856 case KEY_while:
57843af0 6857 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6858 OPERATOR(WHILE);
6859
6860 case KEY_warn:
3280af22 6861 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 6862 LOP(OP_WARN,XTERM);
79072805
LW
6863
6864 case KEY_wait:
6865 FUN0(OP_WAIT);
6866
6867 case KEY_waitpid:
a0d0e21e 6868 LOP(OP_WAITPID,XTERM);
79072805
LW
6869
6870 case KEY_wantarray:
6871 FUN0(OP_WANTARRAY);
6872
6873 case KEY_write:
9d116dd7
JH
6874#ifdef EBCDIC
6875 {
df3728a2
JH
6876 char ctl_l[2];
6877 ctl_l[0] = toCTRL('L');
6878 ctl_l[1] = '\0';
fafc274c 6879 gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7
JH
6880 }
6881#else
fafc274c
NC
6882 /* Make sure $^L is defined */
6883 gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7 6884#endif
79072805
LW
6885 UNI(OP_ENTERWRITE);
6886
6887 case KEY_x:
3280af22 6888 if (PL_expect == XOPERATOR)
79072805
LW
6889 Mop(OP_REPEAT);
6890 check_uni();
6891 goto just_a_word;
6892
a0d0e21e
LW
6893 case KEY_xor:
6894 yylval.ival = OP_XOR;
6895 OPERATOR(OROP);
6896
79072805
LW
6897 case KEY_y:
6898 s = scan_trans(s);
6899 TERM(sublex_start());
6900 }
49dc05e3 6901 }}
79072805 6902}
bf4acbe4
GS
6903#ifdef __SC__
6904#pragma segment Main
6905#endif
79072805 6906
e930465f
JH
6907static int
6908S_pending_ident(pTHX)
8eceec63 6909{
97aff369 6910 dVAR;
8eceec63 6911 register char *d;
bbd11bfc 6912 PADOFFSET tmp = 0;
8eceec63
SC
6913 /* pit holds the identifier we read and pending_ident is reset */
6914 char pit = PL_pending_ident;
6915 PL_pending_ident = 0;
6916
cd81e915 6917 /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
8eceec63 6918 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 6919 "### Pending identifier '%s'\n", PL_tokenbuf); });
8eceec63
SC
6920
6921 /* if we're in a my(), we can't allow dynamics here.
6922 $foo'bar has already been turned into $foo::bar, so
6923 just check for colons.
6924
6925 if it's a legal name, the OP is a PADANY.
6926 */
6927 if (PL_in_my) {
6928 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
6929 if (strchr(PL_tokenbuf,':'))
6930 yyerror(Perl_form(aTHX_ "No package name allowed for "
6931 "variable %s in \"our\"",
6932 PL_tokenbuf));
dd2155a4 6933 tmp = allocmy(PL_tokenbuf);
8eceec63
SC
6934 }
6935 else {
6936 if (strchr(PL_tokenbuf,':'))
952306ac
RGS
6937 yyerror(Perl_form(aTHX_ PL_no_myglob,
6938 PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
8eceec63
SC
6939
6940 yylval.opval = newOP(OP_PADANY, 0);
dd2155a4 6941 yylval.opval->op_targ = allocmy(PL_tokenbuf);
8eceec63
SC
6942 return PRIVATEREF;
6943 }
6944 }
6945
6946 /*
6947 build the ops for accesses to a my() variable.
6948
6949 Deny my($a) or my($b) in a sort block, *if* $a or $b is
6950 then used in a comparison. This catches most, but not
6951 all cases. For instance, it catches
6952 sort { my($a); $a <=> $b }
6953 but not
6954 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
6955 (although why you'd do that is anyone's guess).
6956 */
6957
6958 if (!strchr(PL_tokenbuf,':')) {
8716503d
DM
6959 if (!PL_in_my)
6960 tmp = pad_findmy(PL_tokenbuf);
6961 if (tmp != NOT_IN_PAD) {
8eceec63 6962 /* might be an "our" variable" */
00b1698f 6963 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
8eceec63 6964 /* build ops for a bareword */
b64e5050
AL
6965 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
6966 HEK * const stashname = HvNAME_HEK(stash);
6967 SV * const sym = newSVhek(stashname);
396482e1 6968 sv_catpvs(sym, "::");
8eceec63
SC
6969 sv_catpv(sym, PL_tokenbuf+1);
6970 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
6971 yylval.opval->op_private = OPpCONST_ENTERED;
7a5fd60d 6972 gv_fetchsv(sym,
8eceec63
SC
6973 (PL_in_eval
6974 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 6975 : GV_ADDMULTI
8eceec63
SC
6976 ),
6977 ((PL_tokenbuf[0] == '$') ? SVt_PV
6978 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
6979 : SVt_PVHV));
6980 return WORD;
6981 }
6982
6983 /* if it's a sort block and they're naming $a or $b */
6984 if (PL_last_lop_op == OP_SORT &&
6985 PL_tokenbuf[0] == '$' &&
6986 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
6987 && !PL_tokenbuf[2])
6988 {
6989 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
6990 d < PL_bufend && *d != '\n';
6991 d++)
6992 {
6993 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
6994 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
6995 PL_tokenbuf);
6996 }
6997 }
6998 }
6999
7000 yylval.opval = newOP(OP_PADANY, 0);
7001 yylval.opval->op_targ = tmp;
7002 return PRIVATEREF;
7003 }
7004 }
7005
7006 /*
7007 Whine if they've said @foo in a doublequoted string,
7008 and @foo isn't a variable we can find in the symbol
7009 table.
7010 */
7011 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
f776e3cd 7012 GV *gv = gv_fetchpv(PL_tokenbuf+1, 0, SVt_PVAV);
8eceec63 7013 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
e879d94f
RGS
7014 && ckWARN(WARN_AMBIGUOUS)
7015 /* DO NOT warn for @- and @+ */
7016 && !( PL_tokenbuf[2] == '\0' &&
7017 ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7018 )
8eceec63
SC
7019 {
7020 /* Downgraded from fatal to warning 20000522 mjd */
9014280d 7021 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8eceec63
SC
7022 "Possible unintended interpolation of %s in string",
7023 PL_tokenbuf);
7024 }
7025 }
7026
7027 /* build ops for a bareword */
7028 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
7029 yylval.opval->op_private = OPpCONST_ENTERED;
adc51b97
RGS
7030 gv_fetchpv(
7031 PL_tokenbuf+1,
d6069db2
RGS
7032 /* If the identifier refers to a stash, don't autovivify it.
7033 * Change 24660 had the side effect of causing symbol table
7034 * hashes to always be defined, even if they were freshly
7035 * created and the only reference in the entire program was
7036 * the single statement with the defined %foo::bar:: test.
7037 * It appears that all code in the wild doing this actually
7038 * wants to know whether sub-packages have been loaded, so
7039 * by avoiding auto-vivifying symbol tables, we ensure that
7040 * defined %foo::bar:: continues to be false, and the existing
7041 * tests still give the expected answers, even though what
7042 * they're actually testing has now changed subtly.
7043 */
7044 (*PL_tokenbuf == '%' && *(d = PL_tokenbuf + strlen(PL_tokenbuf) - 1) == ':' && d[-1] == ':'
7045 ? 0
7046 : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
adc51b97
RGS
7047 ((PL_tokenbuf[0] == '$') ? SVt_PV
7048 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7049 : SVt_PVHV));
8eceec63
SC
7050 return WORD;
7051}
7052
4c3bbe0f
MHM
7053/*
7054 * The following code was generated by perl_keyword.pl.
7055 */
e2e1dd5a 7056
79072805 7057I32
5458a98a 7058Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
4c3bbe0f 7059{
952306ac 7060 dVAR;
4c3bbe0f
MHM
7061 switch (len)
7062 {
7063 case 1: /* 5 tokens of length 1 */
7064 switch (name[0])
e2e1dd5a 7065 {
4c3bbe0f
MHM
7066 case 'm':
7067 { /* m */
7068 return KEY_m;
7069 }
7070
4c3bbe0f
MHM
7071 case 'q':
7072 { /* q */
7073 return KEY_q;
7074 }
7075
4c3bbe0f
MHM
7076 case 's':
7077 { /* s */
7078 return KEY_s;
7079 }
7080
4c3bbe0f
MHM
7081 case 'x':
7082 { /* x */
7083 return -KEY_x;
7084 }
7085
4c3bbe0f
MHM
7086 case 'y':
7087 { /* y */
7088 return KEY_y;
7089 }
7090
4c3bbe0f
MHM
7091 default:
7092 goto unknown;
e2e1dd5a 7093 }
4c3bbe0f
MHM
7094
7095 case 2: /* 18 tokens of length 2 */
7096 switch (name[0])
e2e1dd5a 7097 {
4c3bbe0f
MHM
7098 case 'd':
7099 if (name[1] == 'o')
7100 { /* do */
7101 return KEY_do;
7102 }
7103
7104 goto unknown;
7105
7106 case 'e':
7107 if (name[1] == 'q')
7108 { /* eq */
7109 return -KEY_eq;
7110 }
7111
7112 goto unknown;
7113
7114 case 'g':
7115 switch (name[1])
7116 {
7117 case 'e':
7118 { /* ge */
7119 return -KEY_ge;
7120 }
7121
4c3bbe0f
MHM
7122 case 't':
7123 { /* gt */
7124 return -KEY_gt;
7125 }
7126
4c3bbe0f
MHM
7127 default:
7128 goto unknown;
7129 }
7130
7131 case 'i':
7132 if (name[1] == 'f')
7133 { /* if */
7134 return KEY_if;
7135 }
7136
7137 goto unknown;
7138
7139 case 'l':
7140 switch (name[1])
7141 {
7142 case 'c':
7143 { /* lc */
7144 return -KEY_lc;
7145 }
7146
4c3bbe0f
MHM
7147 case 'e':
7148 { /* le */
7149 return -KEY_le;
7150 }
7151
4c3bbe0f
MHM
7152 case 't':
7153 { /* lt */
7154 return -KEY_lt;
7155 }
7156
4c3bbe0f
MHM
7157 default:
7158 goto unknown;
7159 }
7160
7161 case 'm':
7162 if (name[1] == 'y')
7163 { /* my */
7164 return KEY_my;
7165 }
7166
7167 goto unknown;
7168
7169 case 'n':
7170 switch (name[1])
7171 {
7172 case 'e':
7173 { /* ne */
7174 return -KEY_ne;
7175 }
7176
4c3bbe0f
MHM
7177 case 'o':
7178 { /* no */
7179 return KEY_no;
7180 }
7181
4c3bbe0f
MHM
7182 default:
7183 goto unknown;
7184 }
7185
7186 case 'o':
7187 if (name[1] == 'r')
7188 { /* or */
7189 return -KEY_or;
7190 }
7191
7192 goto unknown;
7193
7194 case 'q':
7195 switch (name[1])
7196 {
7197 case 'q':
7198 { /* qq */
7199 return KEY_qq;
7200 }
7201
4c3bbe0f
MHM
7202 case 'r':
7203 { /* qr */
7204 return KEY_qr;
7205 }
7206
4c3bbe0f
MHM
7207 case 'w':
7208 { /* qw */
7209 return KEY_qw;
7210 }
7211
4c3bbe0f
MHM
7212 case 'x':
7213 { /* qx */
7214 return KEY_qx;
7215 }
7216
4c3bbe0f
MHM
7217 default:
7218 goto unknown;
7219 }
7220
7221 case 't':
7222 if (name[1] == 'r')
7223 { /* tr */
7224 return KEY_tr;
7225 }
7226
7227 goto unknown;
7228
7229 case 'u':
7230 if (name[1] == 'c')
7231 { /* uc */
7232 return -KEY_uc;
7233 }
7234
7235 goto unknown;
7236
7237 default:
7238 goto unknown;
e2e1dd5a 7239 }
4c3bbe0f 7240
0d863452 7241 case 3: /* 29 tokens of length 3 */
4c3bbe0f 7242 switch (name[0])
e2e1dd5a 7243 {
4c3bbe0f
MHM
7244 case 'E':
7245 if (name[1] == 'N' &&
7246 name[2] == 'D')
7247 { /* END */
7248 return KEY_END;
7249 }
7250
7251 goto unknown;
7252
7253 case 'a':
7254 switch (name[1])
7255 {
7256 case 'b':
7257 if (name[2] == 's')
7258 { /* abs */
7259 return -KEY_abs;
7260 }
7261
7262 goto unknown;
7263
7264 case 'n':
7265 if (name[2] == 'd')
7266 { /* and */
7267 return -KEY_and;
7268 }
7269
7270 goto unknown;
7271
7272 default:
7273 goto unknown;
7274 }
7275
7276 case 'c':
7277 switch (name[1])
7278 {
7279 case 'h':
7280 if (name[2] == 'r')
7281 { /* chr */
7282 return -KEY_chr;
7283 }
7284
7285 goto unknown;
7286
7287 case 'm':
7288 if (name[2] == 'p')
7289 { /* cmp */
7290 return -KEY_cmp;
7291 }
7292
7293 goto unknown;
7294
7295 case 'o':
7296 if (name[2] == 's')
7297 { /* cos */
7298 return -KEY_cos;
7299 }
7300
7301 goto unknown;
7302
7303 default:
7304 goto unknown;
7305 }
7306
7307 case 'd':
7308 if (name[1] == 'i' &&
7309 name[2] == 'e')
7310 { /* die */
7311 return -KEY_die;
7312 }
7313
7314 goto unknown;
7315
7316 case 'e':
7317 switch (name[1])
7318 {
7319 case 'o':
7320 if (name[2] == 'f')
7321 { /* eof */
7322 return -KEY_eof;
7323 }
7324
7325 goto unknown;
7326
4c3bbe0f
MHM
7327 case 'x':
7328 if (name[2] == 'p')
7329 { /* exp */
7330 return -KEY_exp;
7331 }
7332
7333 goto unknown;
7334
7335 default:
7336 goto unknown;
7337 }
7338
7339 case 'f':
7340 if (name[1] == 'o' &&
7341 name[2] == 'r')
7342 { /* for */
7343 return KEY_for;
7344 }
7345
7346 goto unknown;
7347
7348 case 'h':
7349 if (name[1] == 'e' &&
7350 name[2] == 'x')
7351 { /* hex */
7352 return -KEY_hex;
7353 }
7354
7355 goto unknown;
7356
7357 case 'i':
7358 if (name[1] == 'n' &&
7359 name[2] == 't')
7360 { /* int */
7361 return -KEY_int;
7362 }
7363
7364 goto unknown;
7365
7366 case 'l':
7367 if (name[1] == 'o' &&
7368 name[2] == 'g')
7369 { /* log */
7370 return -KEY_log;
7371 }
7372
7373 goto unknown;
7374
7375 case 'm':
7376 if (name[1] == 'a' &&
7377 name[2] == 'p')
7378 { /* map */
7379 return KEY_map;
7380 }
7381
7382 goto unknown;
7383
7384 case 'n':
7385 if (name[1] == 'o' &&
7386 name[2] == 't')
7387 { /* not */
7388 return -KEY_not;
7389 }
7390
7391 goto unknown;
7392
7393 case 'o':
7394 switch (name[1])
7395 {
7396 case 'c':
7397 if (name[2] == 't')
7398 { /* oct */
7399 return -KEY_oct;
7400 }
7401
7402 goto unknown;
7403
7404 case 'r':
7405 if (name[2] == 'd')
7406 { /* ord */
7407 return -KEY_ord;
7408 }
7409
7410 goto unknown;
7411
7412 case 'u':
7413 if (name[2] == 'r')
7414 { /* our */
7415 return KEY_our;
7416 }
7417
7418 goto unknown;
7419
7420 default:
7421 goto unknown;
7422 }
7423
7424 case 'p':
7425 if (name[1] == 'o')
7426 {
7427 switch (name[2])
7428 {
7429 case 'p':
7430 { /* pop */
7431 return -KEY_pop;
7432 }
7433
4c3bbe0f
MHM
7434 case 's':
7435 { /* pos */
7436 return KEY_pos;
7437 }
7438
4c3bbe0f
MHM
7439 default:
7440 goto unknown;
7441 }
7442 }
7443
7444 goto unknown;
7445
7446 case 'r':
7447 if (name[1] == 'e' &&
7448 name[2] == 'f')
7449 { /* ref */
7450 return -KEY_ref;
7451 }
7452
7453 goto unknown;
7454
7455 case 's':
7456 switch (name[1])
7457 {
0d863452
RH
7458 case 'a':
7459 if (name[2] == 'y')
7460 { /* say */
e3e804c9 7461 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
0d863452
RH
7462 }
7463
7464 goto unknown;
7465
4c3bbe0f
MHM
7466 case 'i':
7467 if (name[2] == 'n')
7468 { /* sin */
7469 return -KEY_sin;
7470 }
7471
7472 goto unknown;
7473
7474 case 'u':
7475 if (name[2] == 'b')
7476 { /* sub */
7477 return KEY_sub;
7478 }
7479
7480 goto unknown;
7481
7482 default:
7483 goto unknown;
7484 }
7485
7486 case 't':
7487 if (name[1] == 'i' &&
7488 name[2] == 'e')
7489 { /* tie */
7490 return KEY_tie;
7491 }
7492
7493 goto unknown;
7494
7495 case 'u':
7496 if (name[1] == 's' &&
7497 name[2] == 'e')
7498 { /* use */
7499 return KEY_use;
7500 }
7501
7502 goto unknown;
7503
7504 case 'v':
7505 if (name[1] == 'e' &&
7506 name[2] == 'c')
7507 { /* vec */
7508 return -KEY_vec;
7509 }
7510
7511 goto unknown;
7512
7513 case 'x':
7514 if (name[1] == 'o' &&
7515 name[2] == 'r')
7516 { /* xor */
7517 return -KEY_xor;
7518 }
7519
7520 goto unknown;
7521
7522 default:
7523 goto unknown;
e2e1dd5a 7524 }
4c3bbe0f 7525
0d863452 7526 case 4: /* 41 tokens of length 4 */
4c3bbe0f 7527 switch (name[0])
e2e1dd5a 7528 {
4c3bbe0f
MHM
7529 case 'C':
7530 if (name[1] == 'O' &&
7531 name[2] == 'R' &&
7532 name[3] == 'E')
7533 { /* CORE */
7534 return -KEY_CORE;
7535 }
7536
7537 goto unknown;
7538
7539 case 'I':
7540 if (name[1] == 'N' &&
7541 name[2] == 'I' &&
7542 name[3] == 'T')
7543 { /* INIT */
7544 return KEY_INIT;
7545 }
7546
7547 goto unknown;
7548
7549 case 'b':
7550 if (name[1] == 'i' &&
7551 name[2] == 'n' &&
7552 name[3] == 'd')
7553 { /* bind */
7554 return -KEY_bind;
7555 }
7556
7557 goto unknown;
7558
7559 case 'c':
7560 if (name[1] == 'h' &&
7561 name[2] == 'o' &&
7562 name[3] == 'p')
7563 { /* chop */
7564 return -KEY_chop;
7565 }
7566
7567 goto unknown;
7568
7569 case 'd':
7570 if (name[1] == 'u' &&
7571 name[2] == 'm' &&
7572 name[3] == 'p')
7573 { /* dump */
7574 return -KEY_dump;
7575 }
7576
7577 goto unknown;
7578
7579 case 'e':
7580 switch (name[1])
7581 {
7582 case 'a':
7583 if (name[2] == 'c' &&
7584 name[3] == 'h')
7585 { /* each */
7586 return -KEY_each;
7587 }
7588
7589 goto unknown;
7590
7591 case 'l':
7592 if (name[2] == 's' &&
7593 name[3] == 'e')
7594 { /* else */
7595 return KEY_else;
7596 }
7597
7598 goto unknown;
7599
7600 case 'v':
7601 if (name[2] == 'a' &&
7602 name[3] == 'l')
7603 { /* eval */
7604 return KEY_eval;
7605 }
7606
7607 goto unknown;
7608
7609 case 'x':
7610 switch (name[2])
7611 {
7612 case 'e':
7613 if (name[3] == 'c')
7614 { /* exec */
7615 return -KEY_exec;
7616 }
7617
7618 goto unknown;
7619
7620 case 'i':
7621 if (name[3] == 't')
7622 { /* exit */
7623 return -KEY_exit;
7624 }
7625
7626 goto unknown;
7627
7628 default:
7629 goto unknown;
7630 }
7631
7632 default:
7633 goto unknown;
7634 }
7635
7636 case 'f':
7637 if (name[1] == 'o' &&
7638 name[2] == 'r' &&
7639 name[3] == 'k')
7640 { /* fork */
7641 return -KEY_fork;
7642 }
7643
7644 goto unknown;
7645
7646 case 'g':
7647 switch (name[1])
7648 {
7649 case 'e':
7650 if (name[2] == 't' &&
7651 name[3] == 'c')
7652 { /* getc */
7653 return -KEY_getc;
7654 }
7655
7656 goto unknown;
7657
7658 case 'l':
7659 if (name[2] == 'o' &&
7660 name[3] == 'b')
7661 { /* glob */
7662 return KEY_glob;
7663 }
7664
7665 goto unknown;
7666
7667 case 'o':
7668 if (name[2] == 't' &&
7669 name[3] == 'o')
7670 { /* goto */
7671 return KEY_goto;
7672 }
7673
7674 goto unknown;
7675
7676 case 'r':
7677 if (name[2] == 'e' &&
7678 name[3] == 'p')
7679 { /* grep */
7680 return KEY_grep;
7681 }
7682
7683 goto unknown;
7684
7685 default:
7686 goto unknown;
7687 }
7688
7689 case 'j':
7690 if (name[1] == 'o' &&
7691 name[2] == 'i' &&
7692 name[3] == 'n')
7693 { /* join */
7694 return -KEY_join;
7695 }
7696
7697 goto unknown;
7698
7699 case 'k':
7700 switch (name[1])
7701 {
7702 case 'e':
7703 if (name[2] == 'y' &&
7704 name[3] == 's')
7705 { /* keys */
7706 return -KEY_keys;
7707 }
7708
7709 goto unknown;
7710
7711 case 'i':
7712 if (name[2] == 'l' &&
7713 name[3] == 'l')
7714 { /* kill */
7715 return -KEY_kill;
7716 }
7717
7718 goto unknown;
7719
7720 default:
7721 goto unknown;
7722 }
7723
7724 case 'l':
7725 switch (name[1])
7726 {
7727 case 'a':
7728 if (name[2] == 's' &&
7729 name[3] == 't')
7730 { /* last */
7731 return KEY_last;
7732 }
7733
7734 goto unknown;
7735
7736 case 'i':
7737 if (name[2] == 'n' &&
7738 name[3] == 'k')
7739 { /* link */
7740 return -KEY_link;
7741 }
7742
7743 goto unknown;
7744
7745 case 'o':
7746 if (name[2] == 'c' &&
7747 name[3] == 'k')
7748 { /* lock */
7749 return -KEY_lock;
7750 }
7751
7752 goto unknown;
7753
7754 default:
7755 goto unknown;
7756 }
7757
7758 case 'n':
7759 if (name[1] == 'e' &&
7760 name[2] == 'x' &&
7761 name[3] == 't')
7762 { /* next */
7763 return KEY_next;
7764 }
7765
7766 goto unknown;
7767
7768 case 'o':
7769 if (name[1] == 'p' &&
7770 name[2] == 'e' &&
7771 name[3] == 'n')
7772 { /* open */
7773 return -KEY_open;
7774 }
7775
7776 goto unknown;
7777
7778 case 'p':
7779 switch (name[1])
7780 {
7781 case 'a':
7782 if (name[2] == 'c' &&
7783 name[3] == 'k')
7784 { /* pack */
7785 return -KEY_pack;
7786 }
7787
7788 goto unknown;
7789
7790 case 'i':
7791 if (name[2] == 'p' &&
7792 name[3] == 'e')
7793 { /* pipe */
7794 return -KEY_pipe;
7795 }
7796
7797 goto unknown;
7798
7799 case 'u':
7800 if (name[2] == 's' &&
7801 name[3] == 'h')
7802 { /* push */
7803 return -KEY_push;
7804 }
7805
7806 goto unknown;
7807
7808 default:
7809 goto unknown;
7810 }
7811
7812 case 'r':
7813 switch (name[1])
7814 {
7815 case 'a':
7816 if (name[2] == 'n' &&
7817 name[3] == 'd')
7818 { /* rand */
7819 return -KEY_rand;
7820 }
7821
7822 goto unknown;
7823
7824 case 'e':
7825 switch (name[2])
7826 {
7827 case 'a':
7828 if (name[3] == 'd')
7829 { /* read */
7830 return -KEY_read;
7831 }
7832
7833 goto unknown;
7834
7835 case 'c':
7836 if (name[3] == 'v')
7837 { /* recv */
7838 return -KEY_recv;
7839 }
7840
7841 goto unknown;
7842
7843 case 'd':
7844 if (name[3] == 'o')
7845 { /* redo */
7846 return KEY_redo;
7847 }
7848
7849 goto unknown;
7850
7851 default:
7852 goto unknown;
7853 }
7854
7855 default:
7856 goto unknown;
7857 }
7858
7859 case 's':
7860 switch (name[1])
7861 {
7862 case 'e':
7863 switch (name[2])
7864 {
7865 case 'e':
7866 if (name[3] == 'k')
7867 { /* seek */
7868 return -KEY_seek;
7869 }
7870
7871 goto unknown;
7872
7873 case 'n':
7874 if (name[3] == 'd')
7875 { /* send */
7876 return -KEY_send;
7877 }
7878
7879 goto unknown;
7880
7881 default:
7882 goto unknown;
7883 }
7884
7885 case 'o':
7886 if (name[2] == 'r' &&
7887 name[3] == 't')
7888 { /* sort */
7889 return KEY_sort;
7890 }
7891
7892 goto unknown;
7893
7894 case 'q':
7895 if (name[2] == 'r' &&
7896 name[3] == 't')
7897 { /* sqrt */
7898 return -KEY_sqrt;
7899 }
7900
7901 goto unknown;
7902
7903 case 't':
7904 if (name[2] == 'a' &&
7905 name[3] == 't')
7906 { /* stat */
7907 return -KEY_stat;
7908 }
7909
7910 goto unknown;
7911
7912 default:
7913 goto unknown;
7914 }
7915
7916 case 't':
7917 switch (name[1])
7918 {
7919 case 'e':
7920 if (name[2] == 'l' &&
7921 name[3] == 'l')
7922 { /* tell */
7923 return -KEY_tell;
7924 }
7925
7926 goto unknown;
7927
7928 case 'i':
7929 switch (name[2])
7930 {
7931 case 'e':
7932 if (name[3] == 'd')
7933 { /* tied */
7934 return KEY_tied;
7935 }
7936
7937 goto unknown;
7938
7939 case 'm':
7940 if (name[3] == 'e')
7941 { /* time */
7942 return -KEY_time;
7943 }
7944
7945 goto unknown;
7946
7947 default:
7948 goto unknown;
7949 }
7950
7951 default:
7952 goto unknown;
7953 }
7954
7955 case 'w':
0d863452 7956 switch (name[1])
4c3bbe0f 7957 {
0d863452 7958 case 'a':
952306ac
RGS
7959 switch (name[2])
7960 {
7961 case 'i':
7962 if (name[3] == 't')
7963 { /* wait */
7964 return -KEY_wait;
7965 }
4c3bbe0f 7966
952306ac 7967 goto unknown;
4c3bbe0f 7968
952306ac
RGS
7969 case 'r':
7970 if (name[3] == 'n')
7971 { /* warn */
7972 return -KEY_warn;
7973 }
4c3bbe0f 7974
952306ac 7975 goto unknown;
4c3bbe0f 7976
952306ac
RGS
7977 default:
7978 goto unknown;
7979 }
0d863452
RH
7980
7981 case 'h':
7982 if (name[2] == 'e' &&
7983 name[3] == 'n')
7984 { /* when */
5458a98a 7985 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
952306ac 7986 }
4c3bbe0f 7987
952306ac 7988 goto unknown;
4c3bbe0f 7989
952306ac
RGS
7990 default:
7991 goto unknown;
7992 }
4c3bbe0f 7993
0d863452
RH
7994 default:
7995 goto unknown;
7996 }
7997
952306ac 7998 case 5: /* 39 tokens of length 5 */
4c3bbe0f 7999 switch (name[0])
e2e1dd5a 8000 {
4c3bbe0f
MHM
8001 case 'B':
8002 if (name[1] == 'E' &&
8003 name[2] == 'G' &&
8004 name[3] == 'I' &&
8005 name[4] == 'N')
8006 { /* BEGIN */
8007 return KEY_BEGIN;
8008 }
8009
8010 goto unknown;
8011
8012 case 'C':
8013 if (name[1] == 'H' &&
8014 name[2] == 'E' &&
8015 name[3] == 'C' &&
8016 name[4] == 'K')
8017 { /* CHECK */
8018 return KEY_CHECK;
8019 }
8020
8021 goto unknown;
8022
8023 case 'a':
8024 switch (name[1])
8025 {
8026 case 'l':
8027 if (name[2] == 'a' &&
8028 name[3] == 'r' &&
8029 name[4] == 'm')
8030 { /* alarm */
8031 return -KEY_alarm;
8032 }
8033
8034 goto unknown;
8035
8036 case 't':
8037 if (name[2] == 'a' &&
8038 name[3] == 'n' &&
8039 name[4] == '2')
8040 { /* atan2 */
8041 return -KEY_atan2;
8042 }
8043
8044 goto unknown;
8045
8046 default:
8047 goto unknown;
8048 }
8049
8050 case 'b':
0d863452
RH
8051 switch (name[1])
8052 {
8053 case 'l':
8054 if (name[2] == 'e' &&
952306ac
RGS
8055 name[3] == 's' &&
8056 name[4] == 's')
8057 { /* bless */
8058 return -KEY_bless;
8059 }
4c3bbe0f 8060
952306ac 8061 goto unknown;
4c3bbe0f 8062
0d863452
RH
8063 case 'r':
8064 if (name[2] == 'e' &&
8065 name[3] == 'a' &&
8066 name[4] == 'k')
8067 { /* break */
5458a98a 8068 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
0d863452
RH
8069 }
8070
8071 goto unknown;
8072
8073 default:
8074 goto unknown;
8075 }
8076
4c3bbe0f
MHM
8077 case 'c':
8078 switch (name[1])
8079 {
8080 case 'h':
8081 switch (name[2])
8082 {
8083 case 'd':
8084 if (name[3] == 'i' &&
8085 name[4] == 'r')
8086 { /* chdir */
8087 return -KEY_chdir;
8088 }
8089
8090 goto unknown;
8091
8092 case 'm':
8093 if (name[3] == 'o' &&
8094 name[4] == 'd')
8095 { /* chmod */
8096 return -KEY_chmod;
8097 }
8098
8099 goto unknown;
8100
8101 case 'o':
8102 switch (name[3])
8103 {
8104 case 'm':
8105 if (name[4] == 'p')
8106 { /* chomp */
8107 return -KEY_chomp;
8108 }
8109
8110 goto unknown;
8111
8112 case 'w':
8113 if (name[4] == 'n')
8114 { /* chown */
8115 return -KEY_chown;
8116 }
8117
8118 goto unknown;
8119
8120 default:
8121 goto unknown;
8122 }
8123
8124 default:
8125 goto unknown;
8126 }
8127
8128 case 'l':
8129 if (name[2] == 'o' &&
8130 name[3] == 's' &&
8131 name[4] == 'e')
8132 { /* close */
8133 return -KEY_close;
8134 }
8135
8136 goto unknown;
8137
8138 case 'r':
8139 if (name[2] == 'y' &&
8140 name[3] == 'p' &&
8141 name[4] == 't')
8142 { /* crypt */
8143 return -KEY_crypt;
8144 }
8145
8146 goto unknown;
8147
8148 default:
8149 goto unknown;
8150 }
8151
8152 case 'e':
8153 if (name[1] == 'l' &&
8154 name[2] == 's' &&
8155 name[3] == 'i' &&
8156 name[4] == 'f')
8157 { /* elsif */
8158 return KEY_elsif;
8159 }
8160
8161 goto unknown;
8162
8163 case 'f':
8164 switch (name[1])
8165 {
8166 case 'c':
8167 if (name[2] == 'n' &&
8168 name[3] == 't' &&
8169 name[4] == 'l')
8170 { /* fcntl */
8171 return -KEY_fcntl;
8172 }
8173
8174 goto unknown;
8175
8176 case 'l':
8177 if (name[2] == 'o' &&
8178 name[3] == 'c' &&
8179 name[4] == 'k')
8180 { /* flock */
8181 return -KEY_flock;
8182 }
8183
8184 goto unknown;
8185
8186 default:
8187 goto unknown;
8188 }
8189
0d863452
RH
8190 case 'g':
8191 if (name[1] == 'i' &&
8192 name[2] == 'v' &&
8193 name[3] == 'e' &&
8194 name[4] == 'n')
8195 { /* given */
5458a98a 8196 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
0d863452
RH
8197 }
8198
8199 goto unknown;
8200
4c3bbe0f
MHM
8201 case 'i':
8202 switch (name[1])
8203 {
8204 case 'n':
8205 if (name[2] == 'd' &&
8206 name[3] == 'e' &&
8207 name[4] == 'x')
8208 { /* index */
8209 return -KEY_index;
8210 }
8211
8212 goto unknown;
8213
8214 case 'o':
8215 if (name[2] == 'c' &&
8216 name[3] == 't' &&
8217 name[4] == 'l')
8218 { /* ioctl */
8219 return -KEY_ioctl;
8220 }
8221
8222 goto unknown;
8223
8224 default:
8225 goto unknown;
8226 }
8227
8228 case 'l':
8229 switch (name[1])
8230 {
8231 case 'o':
8232 if (name[2] == 'c' &&
8233 name[3] == 'a' &&
8234 name[4] == 'l')
8235 { /* local */
8236 return KEY_local;
8237 }
8238
8239 goto unknown;
8240
8241 case 's':
8242 if (name[2] == 't' &&
8243 name[3] == 'a' &&
8244 name[4] == 't')
8245 { /* lstat */
8246 return -KEY_lstat;
8247 }
8248
8249 goto unknown;
8250
8251 default:
8252 goto unknown;
8253 }
8254
8255 case 'm':
8256 if (name[1] == 'k' &&
8257 name[2] == 'd' &&
8258 name[3] == 'i' &&
8259 name[4] == 'r')
8260 { /* mkdir */
8261 return -KEY_mkdir;
8262 }
8263
8264 goto unknown;
8265
8266 case 'p':
8267 if (name[1] == 'r' &&
8268 name[2] == 'i' &&
8269 name[3] == 'n' &&
8270 name[4] == 't')
8271 { /* print */
8272 return KEY_print;
8273 }
8274
8275 goto unknown;
8276
8277 case 'r':
8278 switch (name[1])
8279 {
8280 case 'e':
8281 if (name[2] == 's' &&
8282 name[3] == 'e' &&
8283 name[4] == 't')
8284 { /* reset */
8285 return -KEY_reset;
8286 }
8287
8288 goto unknown;
8289
8290 case 'm':
8291 if (name[2] == 'd' &&
8292 name[3] == 'i' &&
8293 name[4] == 'r')
8294 { /* rmdir */
8295 return -KEY_rmdir;
8296 }
8297
8298 goto unknown;
8299
8300 default:
8301 goto unknown;
8302 }
8303
8304 case 's':
8305 switch (name[1])
8306 {
8307 case 'e':
8308 if (name[2] == 'm' &&
8309 name[3] == 'o' &&
8310 name[4] == 'p')
8311 { /* semop */
8312 return -KEY_semop;
8313 }
8314
8315 goto unknown;
8316
8317 case 'h':
8318 if (name[2] == 'i' &&
8319 name[3] == 'f' &&
8320 name[4] == 't')
8321 { /* shift */
8322 return -KEY_shift;
8323 }
8324
8325 goto unknown;
8326
8327 case 'l':
8328 if (name[2] == 'e' &&
8329 name[3] == 'e' &&
8330 name[4] == 'p')
8331 { /* sleep */
8332 return -KEY_sleep;
8333 }
8334
8335 goto unknown;
8336
8337 case 'p':
8338 if (name[2] == 'l' &&
8339 name[3] == 'i' &&
8340 name[4] == 't')
8341 { /* split */
8342 return KEY_split;
8343 }
8344
8345 goto unknown;
8346
8347 case 'r':
8348 if (name[2] == 'a' &&
8349 name[3] == 'n' &&
8350 name[4] == 'd')
8351 { /* srand */
8352 return -KEY_srand;
8353 }
8354
8355 goto unknown;
8356
8357 case 't':
952306ac
RGS
8358 switch (name[2])
8359 {
8360 case 'a':
8361 if (name[3] == 't' &&
8362 name[4] == 'e')
8363 { /* state */
5458a98a 8364 return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
952306ac 8365 }
4c3bbe0f 8366
952306ac
RGS
8367 goto unknown;
8368
8369 case 'u':
8370 if (name[3] == 'd' &&
8371 name[4] == 'y')
8372 { /* study */
8373 return KEY_study;
8374 }
8375
8376 goto unknown;
8377
8378 default:
8379 goto unknown;
8380 }
4c3bbe0f
MHM
8381
8382 default:
8383 goto unknown;
8384 }
8385
8386 case 't':
8387 if (name[1] == 'i' &&
8388 name[2] == 'm' &&
8389 name[3] == 'e' &&
8390 name[4] == 's')
8391 { /* times */
8392 return -KEY_times;
8393 }
8394
8395 goto unknown;
8396
8397 case 'u':
8398 switch (name[1])
8399 {
8400 case 'm':
8401 if (name[2] == 'a' &&
8402 name[3] == 's' &&
8403 name[4] == 'k')
8404 { /* umask */
8405 return -KEY_umask;
8406 }
8407
8408 goto unknown;
8409
8410 case 'n':
8411 switch (name[2])
8412 {
8413 case 'd':
8414 if (name[3] == 'e' &&
8415 name[4] == 'f')
8416 { /* undef */
8417 return KEY_undef;
8418 }
8419
8420 goto unknown;
8421
8422 case 't':
8423 if (name[3] == 'i')
8424 {
8425 switch (name[4])
8426 {
8427 case 'e':
8428 { /* untie */
8429 return KEY_untie;
8430 }
8431
4c3bbe0f
MHM
8432 case 'l':
8433 { /* until */
8434 return KEY_until;
8435 }
8436
4c3bbe0f
MHM
8437 default:
8438 goto unknown;
8439 }
8440 }
8441
8442 goto unknown;
8443
8444 default:
8445 goto unknown;
8446 }
8447
8448 case 't':
8449 if (name[2] == 'i' &&
8450 name[3] == 'm' &&
8451 name[4] == 'e')
8452 { /* utime */
8453 return -KEY_utime;
8454 }
8455
8456 goto unknown;
8457
8458 default:
8459 goto unknown;
8460 }
8461
8462 case 'w':
8463 switch (name[1])
8464 {
8465 case 'h':
8466 if (name[2] == 'i' &&
8467 name[3] == 'l' &&
8468 name[4] == 'e')
8469 { /* while */
8470 return KEY_while;
8471 }
8472
8473 goto unknown;
8474
8475 case 'r':
8476 if (name[2] == 'i' &&
8477 name[3] == 't' &&
8478 name[4] == 'e')
8479 { /* write */
8480 return -KEY_write;
8481 }
8482
8483 goto unknown;
8484
8485 default:
8486 goto unknown;
8487 }
8488
8489 default:
8490 goto unknown;
e2e1dd5a 8491 }
4c3bbe0f
MHM
8492
8493 case 6: /* 33 tokens of length 6 */
8494 switch (name[0])
8495 {
8496 case 'a':
8497 if (name[1] == 'c' &&
8498 name[2] == 'c' &&
8499 name[3] == 'e' &&
8500 name[4] == 'p' &&
8501 name[5] == 't')
8502 { /* accept */
8503 return -KEY_accept;
8504 }
8505
8506 goto unknown;
8507
8508 case 'c':
8509 switch (name[1])
8510 {
8511 case 'a':
8512 if (name[2] == 'l' &&
8513 name[3] == 'l' &&
8514 name[4] == 'e' &&
8515 name[5] == 'r')
8516 { /* caller */
8517 return -KEY_caller;
8518 }
8519
8520 goto unknown;
8521
8522 case 'h':
8523 if (name[2] == 'r' &&
8524 name[3] == 'o' &&
8525 name[4] == 'o' &&
8526 name[5] == 't')
8527 { /* chroot */
8528 return -KEY_chroot;
8529 }
8530
8531 goto unknown;
8532
8533 default:
8534 goto unknown;
8535 }
8536
8537 case 'd':
8538 if (name[1] == 'e' &&
8539 name[2] == 'l' &&
8540 name[3] == 'e' &&
8541 name[4] == 't' &&
8542 name[5] == 'e')
8543 { /* delete */
8544 return KEY_delete;
8545 }
8546
8547 goto unknown;
8548
8549 case 'e':
8550 switch (name[1])
8551 {
8552 case 'l':
8553 if (name[2] == 's' &&
8554 name[3] == 'e' &&
8555 name[4] == 'i' &&
8556 name[5] == 'f')
8557 { /* elseif */
8558 if(ckWARN_d(WARN_SYNTAX))
8559 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
8560 }
8561
8562 goto unknown;
8563
8564 case 'x':
8565 if (name[2] == 'i' &&
8566 name[3] == 's' &&
8567 name[4] == 't' &&
8568 name[5] == 's')
8569 { /* exists */
8570 return KEY_exists;
8571 }
8572
8573 goto unknown;
8574
8575 default:
8576 goto unknown;
8577 }
8578
8579 case 'f':
8580 switch (name[1])
8581 {
8582 case 'i':
8583 if (name[2] == 'l' &&
8584 name[3] == 'e' &&
8585 name[4] == 'n' &&
8586 name[5] == 'o')
8587 { /* fileno */
8588 return -KEY_fileno;
8589 }
8590
8591 goto unknown;
8592
8593 case 'o':
8594 if (name[2] == 'r' &&
8595 name[3] == 'm' &&
8596 name[4] == 'a' &&
8597 name[5] == 't')
8598 { /* format */
8599 return KEY_format;
8600 }
8601
8602 goto unknown;
8603
8604 default:
8605 goto unknown;
8606 }
8607
8608 case 'g':
8609 if (name[1] == 'm' &&
8610 name[2] == 't' &&
8611 name[3] == 'i' &&
8612 name[4] == 'm' &&
8613 name[5] == 'e')
8614 { /* gmtime */
8615 return -KEY_gmtime;
8616 }
8617
8618 goto unknown;
8619
8620 case 'l':
8621 switch (name[1])
8622 {
8623 case 'e':
8624 if (name[2] == 'n' &&
8625 name[3] == 'g' &&
8626 name[4] == 't' &&
8627 name[5] == 'h')
8628 { /* length */
8629 return -KEY_length;
8630 }
8631
8632 goto unknown;
8633
8634 case 'i':
8635 if (name[2] == 's' &&
8636 name[3] == 't' &&
8637 name[4] == 'e' &&
8638 name[5] == 'n')
8639 { /* listen */
8640 return -KEY_listen;
8641 }
8642
8643 goto unknown;
8644
8645 default:
8646 goto unknown;
8647 }
8648
8649 case 'm':
8650 if (name[1] == 's' &&
8651 name[2] == 'g')
8652 {
8653 switch (name[3])
8654 {
8655 case 'c':
8656 if (name[4] == 't' &&
8657 name[5] == 'l')
8658 { /* msgctl */
8659 return -KEY_msgctl;
8660 }
8661
8662 goto unknown;
8663
8664 case 'g':
8665 if (name[4] == 'e' &&
8666 name[5] == 't')
8667 { /* msgget */
8668 return -KEY_msgget;
8669 }
8670
8671 goto unknown;
8672
8673 case 'r':
8674 if (name[4] == 'c' &&
8675 name[5] == 'v')
8676 { /* msgrcv */
8677 return -KEY_msgrcv;
8678 }
8679
8680 goto unknown;
8681
8682 case 's':
8683 if (name[4] == 'n' &&
8684 name[5] == 'd')
8685 { /* msgsnd */
8686 return -KEY_msgsnd;
8687 }
8688
8689 goto unknown;
8690
8691 default:
8692 goto unknown;
8693 }
8694 }
8695
8696 goto unknown;
8697
8698 case 'p':
8699 if (name[1] == 'r' &&
8700 name[2] == 'i' &&
8701 name[3] == 'n' &&
8702 name[4] == 't' &&
8703 name[5] == 'f')
8704 { /* printf */
8705 return KEY_printf;
8706 }
8707
8708 goto unknown;
8709
8710 case 'r':
8711 switch (name[1])
8712 {
8713 case 'e':
8714 switch (name[2])
8715 {
8716 case 'n':
8717 if (name[3] == 'a' &&
8718 name[4] == 'm' &&
8719 name[5] == 'e')
8720 { /* rename */
8721 return -KEY_rename;
8722 }
8723
8724 goto unknown;
8725
8726 case 't':
8727 if (name[3] == 'u' &&
8728 name[4] == 'r' &&
8729 name[5] == 'n')
8730 { /* return */
8731 return KEY_return;
8732 }
8733
8734 goto unknown;
8735
8736 default:
8737 goto unknown;
8738 }
8739
8740 case 'i':
8741 if (name[2] == 'n' &&
8742 name[3] == 'd' &&
8743 name[4] == 'e' &&
8744 name[5] == 'x')
8745 { /* rindex */
8746 return -KEY_rindex;
8747 }
8748
8749 goto unknown;
8750
8751 default:
8752 goto unknown;
8753 }
8754
8755 case 's':
8756 switch (name[1])
8757 {
8758 case 'c':
8759 if (name[2] == 'a' &&
8760 name[3] == 'l' &&
8761 name[4] == 'a' &&
8762 name[5] == 'r')
8763 { /* scalar */
8764 return KEY_scalar;
8765 }
8766
8767 goto unknown;
8768
8769 case 'e':
8770 switch (name[2])
8771 {
8772 case 'l':
8773 if (name[3] == 'e' &&
8774 name[4] == 'c' &&
8775 name[5] == 't')
8776 { /* select */
8777 return -KEY_select;
8778 }
8779
8780 goto unknown;
8781
8782 case 'm':
8783 switch (name[3])
8784 {
8785 case 'c':
8786 if (name[4] == 't' &&
8787 name[5] == 'l')
8788 { /* semctl */
8789 return -KEY_semctl;
8790 }
8791
8792 goto unknown;
8793
8794 case 'g':
8795 if (name[4] == 'e' &&
8796 name[5] == 't')
8797 { /* semget */
8798 return -KEY_semget;
8799 }
8800
8801 goto unknown;
8802
8803 default:
8804 goto unknown;
8805 }
8806
8807 default:
8808 goto unknown;
8809 }
8810
8811 case 'h':
8812 if (name[2] == 'm')
8813 {
8814 switch (name[3])
8815 {
8816 case 'c':
8817 if (name[4] == 't' &&
8818 name[5] == 'l')
8819 { /* shmctl */
8820 return -KEY_shmctl;
8821 }
8822
8823 goto unknown;
8824
8825 case 'g':
8826 if (name[4] == 'e' &&
8827 name[5] == 't')
8828 { /* shmget */
8829 return -KEY_shmget;
8830 }
8831
8832 goto unknown;
8833
8834 default:
8835 goto unknown;
8836 }
8837 }
8838
8839 goto unknown;
8840
8841 case 'o':
8842 if (name[2] == 'c' &&
8843 name[3] == 'k' &&
8844 name[4] == 'e' &&
8845 name[5] == 't')
8846 { /* socket */
8847 return -KEY_socket;
8848 }
8849
8850 goto unknown;
8851
8852 case 'p':
8853 if (name[2] == 'l' &&
8854 name[3] == 'i' &&
8855 name[4] == 'c' &&
8856 name[5] == 'e')
8857 { /* splice */
8858 return -KEY_splice;
8859 }
8860
8861 goto unknown;
8862
8863 case 'u':
8864 if (name[2] == 'b' &&
8865 name[3] == 's' &&
8866 name[4] == 't' &&
8867 name[5] == 'r')
8868 { /* substr */
8869 return -KEY_substr;
8870 }
8871
8872 goto unknown;
8873
8874 case 'y':
8875 if (name[2] == 's' &&
8876 name[3] == 't' &&
8877 name[4] == 'e' &&
8878 name[5] == 'm')
8879 { /* system */
8880 return -KEY_system;
8881 }
8882
8883 goto unknown;
8884
8885 default:
8886 goto unknown;
8887 }
8888
8889 case 'u':
8890 if (name[1] == 'n')
8891 {
8892 switch (name[2])
8893 {
8894 case 'l':
8895 switch (name[3])
8896 {
8897 case 'e':
8898 if (name[4] == 's' &&
8899 name[5] == 's')
8900 { /* unless */
8901 return KEY_unless;
8902 }
8903
8904 goto unknown;
8905
8906 case 'i':
8907 if (name[4] == 'n' &&
8908 name[5] == 'k')
8909 { /* unlink */
8910 return -KEY_unlink;
8911 }
8912
8913 goto unknown;
8914
8915 default:
8916 goto unknown;
8917 }
8918
8919 case 'p':
8920 if (name[3] == 'a' &&
8921 name[4] == 'c' &&
8922 name[5] == 'k')
8923 { /* unpack */
8924 return -KEY_unpack;
8925 }
8926
8927 goto unknown;
8928
8929 default:
8930 goto unknown;
8931 }
8932 }
8933
8934 goto unknown;
8935
8936 case 'v':
8937 if (name[1] == 'a' &&
8938 name[2] == 'l' &&
8939 name[3] == 'u' &&
8940 name[4] == 'e' &&
8941 name[5] == 's')
8942 { /* values */
8943 return -KEY_values;
8944 }
8945
8946 goto unknown;
8947
8948 default:
8949 goto unknown;
e2e1dd5a 8950 }
4c3bbe0f 8951
0d863452 8952 case 7: /* 29 tokens of length 7 */
4c3bbe0f
MHM
8953 switch (name[0])
8954 {
8955 case 'D':
8956 if (name[1] == 'E' &&
8957 name[2] == 'S' &&
8958 name[3] == 'T' &&
8959 name[4] == 'R' &&
8960 name[5] == 'O' &&
8961 name[6] == 'Y')
8962 { /* DESTROY */
8963 return KEY_DESTROY;
8964 }
8965
8966 goto unknown;
8967
8968 case '_':
8969 if (name[1] == '_' &&
8970 name[2] == 'E' &&
8971 name[3] == 'N' &&
8972 name[4] == 'D' &&
8973 name[5] == '_' &&
8974 name[6] == '_')
8975 { /* __END__ */
8976 return KEY___END__;
8977 }
8978
8979 goto unknown;
8980
8981 case 'b':
8982 if (name[1] == 'i' &&
8983 name[2] == 'n' &&
8984 name[3] == 'm' &&
8985 name[4] == 'o' &&
8986 name[5] == 'd' &&
8987 name[6] == 'e')
8988 { /* binmode */
8989 return -KEY_binmode;
8990 }
8991
8992 goto unknown;
8993
8994 case 'c':
8995 if (name[1] == 'o' &&
8996 name[2] == 'n' &&
8997 name[3] == 'n' &&
8998 name[4] == 'e' &&
8999 name[5] == 'c' &&
9000 name[6] == 't')
9001 { /* connect */
9002 return -KEY_connect;
9003 }
9004
9005 goto unknown;
9006
9007 case 'd':
9008 switch (name[1])
9009 {
9010 case 'b':
9011 if (name[2] == 'm' &&
9012 name[3] == 'o' &&
9013 name[4] == 'p' &&
9014 name[5] == 'e' &&
9015 name[6] == 'n')
9016 { /* dbmopen */
9017 return -KEY_dbmopen;
9018 }
9019
9020 goto unknown;
9021
9022 case 'e':
0d863452
RH
9023 if (name[2] == 'f')
9024 {
9025 switch (name[3])
9026 {
9027 case 'a':
9028 if (name[4] == 'u' &&
9029 name[5] == 'l' &&
9030 name[6] == 't')
9031 { /* default */
5458a98a 9032 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
0d863452
RH
9033 }
9034
9035 goto unknown;
9036
9037 case 'i':
9038 if (name[4] == 'n' &&
952306ac
RGS
9039 name[5] == 'e' &&
9040 name[6] == 'd')
9041 { /* defined */
9042 return KEY_defined;
9043 }
4c3bbe0f 9044
952306ac 9045 goto unknown;
4c3bbe0f 9046
952306ac
RGS
9047 default:
9048 goto unknown;
9049 }
0d863452
RH
9050 }
9051
9052 goto unknown;
9053
9054 default:
9055 goto unknown;
9056 }
4c3bbe0f
MHM
9057
9058 case 'f':
9059 if (name[1] == 'o' &&
9060 name[2] == 'r' &&
9061 name[3] == 'e' &&
9062 name[4] == 'a' &&
9063 name[5] == 'c' &&
9064 name[6] == 'h')
9065 { /* foreach */
9066 return KEY_foreach;
9067 }
9068
9069 goto unknown;
9070
9071 case 'g':
9072 if (name[1] == 'e' &&
9073 name[2] == 't' &&
9074 name[3] == 'p')
9075 {
9076 switch (name[4])
9077 {
9078 case 'g':
9079 if (name[5] == 'r' &&
9080 name[6] == 'p')
9081 { /* getpgrp */
9082 return -KEY_getpgrp;
9083 }
9084
9085 goto unknown;
9086
9087 case 'p':
9088 if (name[5] == 'i' &&
9089 name[6] == 'd')
9090 { /* getppid */
9091 return -KEY_getppid;
9092 }
9093
9094 goto unknown;
9095
9096 default:
9097 goto unknown;
9098 }
9099 }
9100
9101 goto unknown;
9102
9103 case 'l':
9104 if (name[1] == 'c' &&
9105 name[2] == 'f' &&
9106 name[3] == 'i' &&
9107 name[4] == 'r' &&
9108 name[5] == 's' &&
9109 name[6] == 't')
9110 { /* lcfirst */
9111 return -KEY_lcfirst;
9112 }
9113
9114 goto unknown;
9115
9116 case 'o':
9117 if (name[1] == 'p' &&
9118 name[2] == 'e' &&
9119 name[3] == 'n' &&
9120 name[4] == 'd' &&
9121 name[5] == 'i' &&
9122 name[6] == 'r')
9123 { /* opendir */
9124 return -KEY_opendir;
9125 }
9126
9127 goto unknown;
9128
9129 case 'p':
9130 if (name[1] == 'a' &&
9131 name[2] == 'c' &&
9132 name[3] == 'k' &&
9133 name[4] == 'a' &&
9134 name[5] == 'g' &&
9135 name[6] == 'e')
9136 { /* package */
9137 return KEY_package;
9138 }
9139
9140 goto unknown;
9141
9142 case 'r':
9143 if (name[1] == 'e')
9144 {
9145 switch (name[2])
9146 {
9147 case 'a':
9148 if (name[3] == 'd' &&
9149 name[4] == 'd' &&
9150 name[5] == 'i' &&
9151 name[6] == 'r')
9152 { /* readdir */
9153 return -KEY_readdir;
9154 }
9155
9156 goto unknown;
9157
9158 case 'q':
9159 if (name[3] == 'u' &&
9160 name[4] == 'i' &&
9161 name[5] == 'r' &&
9162 name[6] == 'e')
9163 { /* require */
9164 return KEY_require;
9165 }
9166
9167 goto unknown;
9168
9169 case 'v':
9170 if (name[3] == 'e' &&
9171 name[4] == 'r' &&
9172 name[5] == 's' &&
9173 name[6] == 'e')
9174 { /* reverse */
9175 return -KEY_reverse;
9176 }
9177
9178 goto unknown;
9179
9180 default:
9181 goto unknown;
9182 }
9183 }
9184
9185 goto unknown;
9186
9187 case 's':
9188 switch (name[1])
9189 {
9190 case 'e':
9191 switch (name[2])
9192 {
9193 case 'e':
9194 if (name[3] == 'k' &&
9195 name[4] == 'd' &&
9196 name[5] == 'i' &&
9197 name[6] == 'r')
9198 { /* seekdir */
9199 return -KEY_seekdir;
9200 }
9201
9202 goto unknown;
9203
9204 case 't':
9205 if (name[3] == 'p' &&
9206 name[4] == 'g' &&
9207 name[5] == 'r' &&
9208 name[6] == 'p')
9209 { /* setpgrp */
9210 return -KEY_setpgrp;
9211 }
9212
9213 goto unknown;
9214
9215 default:
9216 goto unknown;
9217 }
9218
9219 case 'h':
9220 if (name[2] == 'm' &&
9221 name[3] == 'r' &&
9222 name[4] == 'e' &&
9223 name[5] == 'a' &&
9224 name[6] == 'd')
9225 { /* shmread */
9226 return -KEY_shmread;
9227 }
9228
9229 goto unknown;
9230
9231 case 'p':
9232 if (name[2] == 'r' &&
9233 name[3] == 'i' &&
9234 name[4] == 'n' &&
9235 name[5] == 't' &&
9236 name[6] == 'f')
9237 { /* sprintf */
9238 return -KEY_sprintf;
9239 }
9240
9241 goto unknown;
9242
9243 case 'y':
9244 switch (name[2])
9245 {
9246 case 'm':
9247 if (name[3] == 'l' &&
9248 name[4] == 'i' &&
9249 name[5] == 'n' &&
9250 name[6] == 'k')
9251 { /* symlink */
9252 return -KEY_symlink;
9253 }
9254
9255 goto unknown;
9256
9257 case 's':
9258 switch (name[3])
9259 {
9260 case 'c':
9261 if (name[4] == 'a' &&
9262 name[5] == 'l' &&
9263 name[6] == 'l')
9264 { /* syscall */
9265 return -KEY_syscall;
9266 }
9267
9268 goto unknown;
9269
9270 case 'o':
9271 if (name[4] == 'p' &&
9272 name[5] == 'e' &&
9273 name[6] == 'n')
9274 { /* sysopen */
9275 return -KEY_sysopen;
9276 }
9277
9278 goto unknown;
9279
9280 case 'r':
9281 if (name[4] == 'e' &&
9282 name[5] == 'a' &&
9283 name[6] == 'd')
9284 { /* sysread */
9285 return -KEY_sysread;
9286 }
9287
9288 goto unknown;
9289
9290 case 's':
9291 if (name[4] == 'e' &&
9292 name[5] == 'e' &&
9293 name[6] == 'k')
9294 { /* sysseek */
9295 return -KEY_sysseek;
9296 }
9297
9298 goto unknown;
9299
9300 default:
9301 goto unknown;
9302 }
9303
9304 default:
9305 goto unknown;
9306 }
9307
9308 default:
9309 goto unknown;
9310 }
9311
9312 case 't':
9313 if (name[1] == 'e' &&
9314 name[2] == 'l' &&
9315 name[3] == 'l' &&
9316 name[4] == 'd' &&
9317 name[5] == 'i' &&
9318 name[6] == 'r')
9319 { /* telldir */
9320 return -KEY_telldir;
9321 }
9322
9323 goto unknown;
9324
9325 case 'u':
9326 switch (name[1])
9327 {
9328 case 'c':
9329 if (name[2] == 'f' &&
9330 name[3] == 'i' &&
9331 name[4] == 'r' &&
9332 name[5] == 's' &&
9333 name[6] == 't')
9334 { /* ucfirst */
9335 return -KEY_ucfirst;
9336 }
9337
9338 goto unknown;
9339
9340 case 'n':
9341 if (name[2] == 's' &&
9342 name[3] == 'h' &&
9343 name[4] == 'i' &&
9344 name[5] == 'f' &&
9345 name[6] == 't')
9346 { /* unshift */
9347 return -KEY_unshift;
9348 }
9349
9350 goto unknown;
9351
9352 default:
9353 goto unknown;
9354 }
9355
9356 case 'w':
9357 if (name[1] == 'a' &&
9358 name[2] == 'i' &&
9359 name[3] == 't' &&
9360 name[4] == 'p' &&
9361 name[5] == 'i' &&
9362 name[6] == 'd')
9363 { /* waitpid */
9364 return -KEY_waitpid;
9365 }
9366
9367 goto unknown;
9368
9369 default:
9370 goto unknown;
9371 }
9372
9373 case 8: /* 26 tokens of length 8 */
9374 switch (name[0])
9375 {
9376 case 'A':
9377 if (name[1] == 'U' &&
9378 name[2] == 'T' &&
9379 name[3] == 'O' &&
9380 name[4] == 'L' &&
9381 name[5] == 'O' &&
9382 name[6] == 'A' &&
9383 name[7] == 'D')
9384 { /* AUTOLOAD */
9385 return KEY_AUTOLOAD;
9386 }
9387
9388 goto unknown;
9389
9390 case '_':
9391 if (name[1] == '_')
9392 {
9393 switch (name[2])
9394 {
9395 case 'D':
9396 if (name[3] == 'A' &&
9397 name[4] == 'T' &&
9398 name[5] == 'A' &&
9399 name[6] == '_' &&
9400 name[7] == '_')
9401 { /* __DATA__ */
9402 return KEY___DATA__;
9403 }
9404
9405 goto unknown;
9406
9407 case 'F':
9408 if (name[3] == 'I' &&
9409 name[4] == 'L' &&
9410 name[5] == 'E' &&
9411 name[6] == '_' &&
9412 name[7] == '_')
9413 { /* __FILE__ */
9414 return -KEY___FILE__;
9415 }
9416
9417 goto unknown;
9418
9419 case 'L':
9420 if (name[3] == 'I' &&
9421 name[4] == 'N' &&
9422 name[5] == 'E' &&
9423 name[6] == '_' &&
9424 name[7] == '_')
9425 { /* __LINE__ */
9426 return -KEY___LINE__;
9427 }
9428
9429 goto unknown;
9430
9431 default:
9432 goto unknown;
9433 }
9434 }
9435
9436 goto unknown;
9437
9438 case 'c':
9439 switch (name[1])
9440 {
9441 case 'l':
9442 if (name[2] == 'o' &&
9443 name[3] == 's' &&
9444 name[4] == 'e' &&
9445 name[5] == 'd' &&
9446 name[6] == 'i' &&
9447 name[7] == 'r')
9448 { /* closedir */
9449 return -KEY_closedir;
9450 }
9451
9452 goto unknown;
9453
9454 case 'o':
9455 if (name[2] == 'n' &&
9456 name[3] == 't' &&
9457 name[4] == 'i' &&
9458 name[5] == 'n' &&
9459 name[6] == 'u' &&
9460 name[7] == 'e')
9461 { /* continue */
9462 return -KEY_continue;
9463 }
9464
9465 goto unknown;
9466
9467 default:
9468 goto unknown;
9469 }
9470
9471 case 'd':
9472 if (name[1] == 'b' &&
9473 name[2] == 'm' &&
9474 name[3] == 'c' &&
9475 name[4] == 'l' &&
9476 name[5] == 'o' &&
9477 name[6] == 's' &&
9478 name[7] == 'e')
9479 { /* dbmclose */
9480 return -KEY_dbmclose;
9481 }
9482
9483 goto unknown;
9484
9485 case 'e':
9486 if (name[1] == 'n' &&
9487 name[2] == 'd')
9488 {
9489 switch (name[3])
9490 {
9491 case 'g':
9492 if (name[4] == 'r' &&
9493 name[5] == 'e' &&
9494 name[6] == 'n' &&
9495 name[7] == 't')
9496 { /* endgrent */
9497 return -KEY_endgrent;
9498 }
9499
9500 goto unknown;
9501
9502 case 'p':
9503 if (name[4] == 'w' &&
9504 name[5] == 'e' &&
9505 name[6] == 'n' &&
9506 name[7] == 't')
9507 { /* endpwent */
9508 return -KEY_endpwent;
9509 }
9510
9511 goto unknown;
9512
9513 default:
9514 goto unknown;
9515 }
9516 }
9517
9518 goto unknown;
9519
9520 case 'f':
9521 if (name[1] == 'o' &&
9522 name[2] == 'r' &&
9523 name[3] == 'm' &&
9524 name[4] == 'l' &&
9525 name[5] == 'i' &&
9526 name[6] == 'n' &&
9527 name[7] == 'e')
9528 { /* formline */
9529 return -KEY_formline;
9530 }
9531
9532 goto unknown;
9533
9534 case 'g':
9535 if (name[1] == 'e' &&
9536 name[2] == 't')
9537 {
9538 switch (name[3])
9539 {
9540 case 'g':
9541 if (name[4] == 'r')
9542 {
9543 switch (name[5])
9544 {
9545 case 'e':
9546 if (name[6] == 'n' &&
9547 name[7] == 't')
9548 { /* getgrent */
9549 return -KEY_getgrent;
9550 }
9551
9552 goto unknown;
9553
9554 case 'g':
9555 if (name[6] == 'i' &&
9556 name[7] == 'd')
9557 { /* getgrgid */
9558 return -KEY_getgrgid;
9559 }
9560
9561 goto unknown;
9562
9563 case 'n':
9564 if (name[6] == 'a' &&
9565 name[7] == 'm')
9566 { /* getgrnam */
9567 return -KEY_getgrnam;
9568 }
9569
9570 goto unknown;
9571
9572 default:
9573 goto unknown;
9574 }
9575 }
9576
9577 goto unknown;
9578
9579 case 'l':
9580 if (name[4] == 'o' &&
9581 name[5] == 'g' &&
9582 name[6] == 'i' &&
9583 name[7] == 'n')
9584 { /* getlogin */
9585 return -KEY_getlogin;
9586 }
9587
9588 goto unknown;
9589
9590 case 'p':
9591 if (name[4] == 'w')
9592 {
9593 switch (name[5])
9594 {
9595 case 'e':
9596 if (name[6] == 'n' &&
9597 name[7] == 't')
9598 { /* getpwent */
9599 return -KEY_getpwent;
9600 }
9601
9602 goto unknown;
9603
9604 case 'n':
9605 if (name[6] == 'a' &&
9606 name[7] == 'm')
9607 { /* getpwnam */
9608 return -KEY_getpwnam;
9609 }
9610
9611 goto unknown;
9612
9613 case 'u':
9614 if (name[6] == 'i' &&
9615 name[7] == 'd')
9616 { /* getpwuid */
9617 return -KEY_getpwuid;
9618 }
9619
9620 goto unknown;
9621
9622 default:
9623 goto unknown;
9624 }
9625 }
9626
9627 goto unknown;
9628
9629 default:
9630 goto unknown;
9631 }
9632 }
9633
9634 goto unknown;
9635
9636 case 'r':
9637 if (name[1] == 'e' &&
9638 name[2] == 'a' &&
9639 name[3] == 'd')
9640 {
9641 switch (name[4])
9642 {
9643 case 'l':
9644 if (name[5] == 'i' &&
9645 name[6] == 'n')
9646 {
9647 switch (name[7])
9648 {
9649 case 'e':
9650 { /* readline */
9651 return -KEY_readline;
9652 }
9653
4c3bbe0f
MHM
9654 case 'k':
9655 { /* readlink */
9656 return -KEY_readlink;
9657 }
9658
4c3bbe0f
MHM
9659 default:
9660 goto unknown;
9661 }
9662 }
9663
9664 goto unknown;
9665
9666 case 'p':
9667 if (name[5] == 'i' &&
9668 name[6] == 'p' &&
9669 name[7] == 'e')
9670 { /* readpipe */
9671 return -KEY_readpipe;
9672 }
9673
9674 goto unknown;
9675
9676 default:
9677 goto unknown;
9678 }
9679 }
9680
9681 goto unknown;
9682
9683 case 's':
9684 switch (name[1])
9685 {
9686 case 'e':
9687 if (name[2] == 't')
9688 {
9689 switch (name[3])
9690 {
9691 case 'g':
9692 if (name[4] == 'r' &&
9693 name[5] == 'e' &&
9694 name[6] == 'n' &&
9695 name[7] == 't')
9696 { /* setgrent */
9697 return -KEY_setgrent;
9698 }
9699
9700 goto unknown;
9701
9702 case 'p':
9703 if (name[4] == 'w' &&
9704 name[5] == 'e' &&
9705 name[6] == 'n' &&
9706 name[7] == 't')
9707 { /* setpwent */
9708 return -KEY_setpwent;
9709 }
9710
9711 goto unknown;
9712
9713 default:
9714 goto unknown;
9715 }
9716 }
9717
9718 goto unknown;
9719
9720 case 'h':
9721 switch (name[2])
9722 {
9723 case 'm':
9724 if (name[3] == 'w' &&
9725 name[4] == 'r' &&
9726 name[5] == 'i' &&
9727 name[6] == 't' &&
9728 name[7] == 'e')
9729 { /* shmwrite */
9730 return -KEY_shmwrite;
9731 }
9732
9733 goto unknown;
9734
9735 case 'u':
9736 if (name[3] == 't' &&
9737 name[4] == 'd' &&
9738 name[5] == 'o' &&
9739 name[6] == 'w' &&
9740 name[7] == 'n')
9741 { /* shutdown */
9742 return -KEY_shutdown;
9743 }
9744
9745 goto unknown;
9746
9747 default:
9748 goto unknown;
9749 }
9750
9751 case 'y':
9752 if (name[2] == 's' &&
9753 name[3] == 'w' &&
9754 name[4] == 'r' &&
9755 name[5] == 'i' &&
9756 name[6] == 't' &&
9757 name[7] == 'e')
9758 { /* syswrite */
9759 return -KEY_syswrite;
9760 }
9761
9762 goto unknown;
9763
9764 default:
9765 goto unknown;
9766 }
9767
9768 case 't':
9769 if (name[1] == 'r' &&
9770 name[2] == 'u' &&
9771 name[3] == 'n' &&
9772 name[4] == 'c' &&
9773 name[5] == 'a' &&
9774 name[6] == 't' &&
9775 name[7] == 'e')
9776 { /* truncate */
9777 return -KEY_truncate;
9778 }
9779
9780 goto unknown;
9781
9782 default:
9783 goto unknown;
9784 }
9785
3c10abe3 9786 case 9: /* 9 tokens of length 9 */
4c3bbe0f
MHM
9787 switch (name[0])
9788 {
3c10abe3
AG
9789 case 'U':
9790 if (name[1] == 'N' &&
9791 name[2] == 'I' &&
9792 name[3] == 'T' &&
9793 name[4] == 'C' &&
9794 name[5] == 'H' &&
9795 name[6] == 'E' &&
9796 name[7] == 'C' &&
9797 name[8] == 'K')
9798 { /* UNITCHECK */
9799 return KEY_UNITCHECK;
9800 }
9801
9802 goto unknown;
9803
4c3bbe0f
MHM
9804 case 'e':
9805 if (name[1] == 'n' &&
9806 name[2] == 'd' &&
9807 name[3] == 'n' &&
9808 name[4] == 'e' &&
9809 name[5] == 't' &&
9810 name[6] == 'e' &&
9811 name[7] == 'n' &&
9812 name[8] == 't')
9813 { /* endnetent */
9814 return -KEY_endnetent;
9815 }
9816
9817 goto unknown;
9818
9819 case 'g':
9820 if (name[1] == 'e' &&
9821 name[2] == 't' &&
9822 name[3] == 'n' &&
9823 name[4] == 'e' &&
9824 name[5] == 't' &&
9825 name[6] == 'e' &&
9826 name[7] == 'n' &&
9827 name[8] == 't')
9828 { /* getnetent */
9829 return -KEY_getnetent;
9830 }
9831
9832 goto unknown;
9833
9834 case 'l':
9835 if (name[1] == 'o' &&
9836 name[2] == 'c' &&
9837 name[3] == 'a' &&
9838 name[4] == 'l' &&
9839 name[5] == 't' &&
9840 name[6] == 'i' &&
9841 name[7] == 'm' &&
9842 name[8] == 'e')
9843 { /* localtime */
9844 return -KEY_localtime;
9845 }
9846
9847 goto unknown;
9848
9849 case 'p':
9850 if (name[1] == 'r' &&
9851 name[2] == 'o' &&
9852 name[3] == 't' &&
9853 name[4] == 'o' &&
9854 name[5] == 't' &&
9855 name[6] == 'y' &&
9856 name[7] == 'p' &&
9857 name[8] == 'e')
9858 { /* prototype */
9859 return KEY_prototype;
9860 }
9861
9862 goto unknown;
9863
9864 case 'q':
9865 if (name[1] == 'u' &&
9866 name[2] == 'o' &&
9867 name[3] == 't' &&
9868 name[4] == 'e' &&
9869 name[5] == 'm' &&
9870 name[6] == 'e' &&
9871 name[7] == 't' &&
9872 name[8] == 'a')
9873 { /* quotemeta */
9874 return -KEY_quotemeta;
9875 }
9876
9877 goto unknown;
9878
9879 case 'r':
9880 if (name[1] == 'e' &&
9881 name[2] == 'w' &&
9882 name[3] == 'i' &&
9883 name[4] == 'n' &&
9884 name[5] == 'd' &&
9885 name[6] == 'd' &&
9886 name[7] == 'i' &&
9887 name[8] == 'r')
9888 { /* rewinddir */
9889 return -KEY_rewinddir;
9890 }
9891
9892 goto unknown;
9893
9894 case 's':
9895 if (name[1] == 'e' &&
9896 name[2] == 't' &&
9897 name[3] == 'n' &&
9898 name[4] == 'e' &&
9899 name[5] == 't' &&
9900 name[6] == 'e' &&
9901 name[7] == 'n' &&
9902 name[8] == 't')
9903 { /* setnetent */
9904 return -KEY_setnetent;
9905 }
9906
9907 goto unknown;
9908
9909 case 'w':
9910 if (name[1] == 'a' &&
9911 name[2] == 'n' &&
9912 name[3] == 't' &&
9913 name[4] == 'a' &&
9914 name[5] == 'r' &&
9915 name[6] == 'r' &&
9916 name[7] == 'a' &&
9917 name[8] == 'y')
9918 { /* wantarray */
9919 return -KEY_wantarray;
9920 }
9921
9922 goto unknown;
9923
9924 default:
9925 goto unknown;
9926 }
9927
9928 case 10: /* 9 tokens of length 10 */
9929 switch (name[0])
9930 {
9931 case 'e':
9932 if (name[1] == 'n' &&
9933 name[2] == 'd')
9934 {
9935 switch (name[3])
9936 {
9937 case 'h':
9938 if (name[4] == 'o' &&
9939 name[5] == 's' &&
9940 name[6] == 't' &&
9941 name[7] == 'e' &&
9942 name[8] == 'n' &&
9943 name[9] == 't')
9944 { /* endhostent */
9945 return -KEY_endhostent;
9946 }
9947
9948 goto unknown;
9949
9950 case 's':
9951 if (name[4] == 'e' &&
9952 name[5] == 'r' &&
9953 name[6] == 'v' &&
9954 name[7] == 'e' &&
9955 name[8] == 'n' &&
9956 name[9] == 't')
9957 { /* endservent */
9958 return -KEY_endservent;
9959 }
9960
9961 goto unknown;
9962
9963 default:
9964 goto unknown;
9965 }
9966 }
9967
9968 goto unknown;
9969
9970 case 'g':
9971 if (name[1] == 'e' &&
9972 name[2] == 't')
9973 {
9974 switch (name[3])
9975 {
9976 case 'h':
9977 if (name[4] == 'o' &&
9978 name[5] == 's' &&
9979 name[6] == 't' &&
9980 name[7] == 'e' &&
9981 name[8] == 'n' &&
9982 name[9] == 't')
9983 { /* gethostent */
9984 return -KEY_gethostent;
9985 }
9986
9987 goto unknown;
9988
9989 case 's':
9990 switch (name[4])
9991 {
9992 case 'e':
9993 if (name[5] == 'r' &&
9994 name[6] == 'v' &&
9995 name[7] == 'e' &&
9996 name[8] == 'n' &&
9997 name[9] == 't')
9998 { /* getservent */
9999 return -KEY_getservent;
10000 }
10001
10002 goto unknown;
10003
10004 case 'o':
10005 if (name[5] == 'c' &&
10006 name[6] == 'k' &&
10007 name[7] == 'o' &&
10008 name[8] == 'p' &&
10009 name[9] == 't')
10010 { /* getsockopt */
10011 return -KEY_getsockopt;
10012 }
10013
10014 goto unknown;
10015
10016 default:
10017 goto unknown;
10018 }
10019
10020 default:
10021 goto unknown;
10022 }
10023 }
10024
10025 goto unknown;
10026
10027 case 's':
10028 switch (name[1])
10029 {
10030 case 'e':
10031 if (name[2] == 't')
10032 {
10033 switch (name[3])
10034 {
10035 case 'h':
10036 if (name[4] == 'o' &&
10037 name[5] == 's' &&
10038 name[6] == 't' &&
10039 name[7] == 'e' &&
10040 name[8] == 'n' &&
10041 name[9] == 't')
10042 { /* sethostent */
10043 return -KEY_sethostent;
10044 }
10045
10046 goto unknown;
10047
10048 case 's':
10049 switch (name[4])
10050 {
10051 case 'e':
10052 if (name[5] == 'r' &&
10053 name[6] == 'v' &&
10054 name[7] == 'e' &&
10055 name[8] == 'n' &&
10056 name[9] == 't')
10057 { /* setservent */
10058 return -KEY_setservent;
10059 }
10060
10061 goto unknown;
10062
10063 case 'o':
10064 if (name[5] == 'c' &&
10065 name[6] == 'k' &&
10066 name[7] == 'o' &&
10067 name[8] == 'p' &&
10068 name[9] == 't')
10069 { /* setsockopt */
10070 return -KEY_setsockopt;
10071 }
10072
10073 goto unknown;
10074
10075 default:
10076 goto unknown;
10077 }
10078
10079 default:
10080 goto unknown;
10081 }
10082 }
10083
10084 goto unknown;
10085
10086 case 'o':
10087 if (name[2] == 'c' &&
10088 name[3] == 'k' &&
10089 name[4] == 'e' &&
10090 name[5] == 't' &&
10091 name[6] == 'p' &&
10092 name[7] == 'a' &&
10093 name[8] == 'i' &&
10094 name[9] == 'r')
10095 { /* socketpair */
10096 return -KEY_socketpair;
10097 }
10098
10099 goto unknown;
10100
10101 default:
10102 goto unknown;
10103 }
10104
10105 default:
10106 goto unknown;
e2e1dd5a 10107 }
4c3bbe0f
MHM
10108
10109 case 11: /* 8 tokens of length 11 */
10110 switch (name[0])
10111 {
10112 case '_':
10113 if (name[1] == '_' &&
10114 name[2] == 'P' &&
10115 name[3] == 'A' &&
10116 name[4] == 'C' &&
10117 name[5] == 'K' &&
10118 name[6] == 'A' &&
10119 name[7] == 'G' &&
10120 name[8] == 'E' &&
10121 name[9] == '_' &&
10122 name[10] == '_')
10123 { /* __PACKAGE__ */
10124 return -KEY___PACKAGE__;
10125 }
10126
10127 goto unknown;
10128
10129 case 'e':
10130 if (name[1] == 'n' &&
10131 name[2] == 'd' &&
10132 name[3] == 'p' &&
10133 name[4] == 'r' &&
10134 name[5] == 'o' &&
10135 name[6] == 't' &&
10136 name[7] == 'o' &&
10137 name[8] == 'e' &&
10138 name[9] == 'n' &&
10139 name[10] == 't')
10140 { /* endprotoent */
10141 return -KEY_endprotoent;
10142 }
10143
10144 goto unknown;
10145
10146 case 'g':
10147 if (name[1] == 'e' &&
10148 name[2] == 't')
10149 {
10150 switch (name[3])
10151 {
10152 case 'p':
10153 switch (name[4])
10154 {
10155 case 'e':
10156 if (name[5] == 'e' &&
10157 name[6] == 'r' &&
10158 name[7] == 'n' &&
10159 name[8] == 'a' &&
10160 name[9] == 'm' &&
10161 name[10] == 'e')
10162 { /* getpeername */
10163 return -KEY_getpeername;
10164 }
10165
10166 goto unknown;
10167
10168 case 'r':
10169 switch (name[5])
10170 {
10171 case 'i':
10172 if (name[6] == 'o' &&
10173 name[7] == 'r' &&
10174 name[8] == 'i' &&
10175 name[9] == 't' &&
10176 name[10] == 'y')
10177 { /* getpriority */
10178 return -KEY_getpriority;
10179 }
10180
10181 goto unknown;
10182
10183 case 'o':
10184 if (name[6] == 't' &&
10185 name[7] == 'o' &&
10186 name[8] == 'e' &&
10187 name[9] == 'n' &&
10188 name[10] == 't')
10189 { /* getprotoent */
10190 return -KEY_getprotoent;
10191 }
10192
10193 goto unknown;
10194
10195 default:
10196 goto unknown;
10197 }
10198
10199 default:
10200 goto unknown;
10201 }
10202
10203 case 's':
10204 if (name[4] == 'o' &&
10205 name[5] == 'c' &&
10206 name[6] == 'k' &&
10207 name[7] == 'n' &&
10208 name[8] == 'a' &&
10209 name[9] == 'm' &&
10210 name[10] == 'e')
10211 { /* getsockname */
10212 return -KEY_getsockname;
10213 }
10214
10215 goto unknown;
10216
10217 default:
10218 goto unknown;
10219 }
10220 }
10221
10222 goto unknown;
10223
10224 case 's':
10225 if (name[1] == 'e' &&
10226 name[2] == 't' &&
10227 name[3] == 'p' &&
10228 name[4] == 'r')
10229 {
10230 switch (name[5])
10231 {
10232 case 'i':
10233 if (name[6] == 'o' &&
10234 name[7] == 'r' &&
10235 name[8] == 'i' &&
10236 name[9] == 't' &&
10237 name[10] == 'y')
10238 { /* setpriority */
10239 return -KEY_setpriority;
10240 }
10241
10242 goto unknown;
10243
10244 case 'o':
10245 if (name[6] == 't' &&
10246 name[7] == 'o' &&
10247 name[8] == 'e' &&
10248 name[9] == 'n' &&
10249 name[10] == 't')
10250 { /* setprotoent */
10251 return -KEY_setprotoent;
10252 }
10253
10254 goto unknown;
10255
10256 default:
10257 goto unknown;
10258 }
10259 }
10260
10261 goto unknown;
10262
10263 default:
10264 goto unknown;
e2e1dd5a 10265 }
4c3bbe0f
MHM
10266
10267 case 12: /* 2 tokens of length 12 */
10268 if (name[0] == 'g' &&
10269 name[1] == 'e' &&
10270 name[2] == 't' &&
10271 name[3] == 'n' &&
10272 name[4] == 'e' &&
10273 name[5] == 't' &&
10274 name[6] == 'b' &&
10275 name[7] == 'y')
10276 {
10277 switch (name[8])
10278 {
10279 case 'a':
10280 if (name[9] == 'd' &&
10281 name[10] == 'd' &&
10282 name[11] == 'r')
10283 { /* getnetbyaddr */
10284 return -KEY_getnetbyaddr;
10285 }
10286
10287 goto unknown;
10288
10289 case 'n':
10290 if (name[9] == 'a' &&
10291 name[10] == 'm' &&
10292 name[11] == 'e')
10293 { /* getnetbyname */
10294 return -KEY_getnetbyname;
10295 }
10296
10297 goto unknown;
10298
10299 default:
10300 goto unknown;
10301 }
e2e1dd5a 10302 }
4c3bbe0f
MHM
10303
10304 goto unknown;
10305
10306 case 13: /* 4 tokens of length 13 */
10307 if (name[0] == 'g' &&
10308 name[1] == 'e' &&
10309 name[2] == 't')
10310 {
10311 switch (name[3])
10312 {
10313 case 'h':
10314 if (name[4] == 'o' &&
10315 name[5] == 's' &&
10316 name[6] == 't' &&
10317 name[7] == 'b' &&
10318 name[8] == 'y')
10319 {
10320 switch (name[9])
10321 {
10322 case 'a':
10323 if (name[10] == 'd' &&
10324 name[11] == 'd' &&
10325 name[12] == 'r')
10326 { /* gethostbyaddr */
10327 return -KEY_gethostbyaddr;
10328 }
10329
10330 goto unknown;
10331
10332 case 'n':
10333 if (name[10] == 'a' &&
10334 name[11] == 'm' &&
10335 name[12] == 'e')
10336 { /* gethostbyname */
10337 return -KEY_gethostbyname;
10338 }
10339
10340 goto unknown;
10341
10342 default:
10343 goto unknown;
10344 }
10345 }
10346
10347 goto unknown;
10348
10349 case 's':
10350 if (name[4] == 'e' &&
10351 name[5] == 'r' &&
10352 name[6] == 'v' &&
10353 name[7] == 'b' &&
10354 name[8] == 'y')
10355 {
10356 switch (name[9])
10357 {
10358 case 'n':
10359 if (name[10] == 'a' &&
10360 name[11] == 'm' &&
10361 name[12] == 'e')
10362 { /* getservbyname */
10363 return -KEY_getservbyname;
10364 }
10365
10366 goto unknown;
10367
10368 case 'p':
10369 if (name[10] == 'o' &&
10370 name[11] == 'r' &&
10371 name[12] == 't')
10372 { /* getservbyport */
10373 return -KEY_getservbyport;
10374 }
10375
10376 goto unknown;
10377
10378 default:
10379 goto unknown;
10380 }
10381 }
10382
10383 goto unknown;
10384
10385 default:
10386 goto unknown;
10387 }
e2e1dd5a 10388 }
4c3bbe0f
MHM
10389
10390 goto unknown;
10391
10392 case 14: /* 1 tokens of length 14 */
10393 if (name[0] == 'g' &&
10394 name[1] == 'e' &&
10395 name[2] == 't' &&
10396 name[3] == 'p' &&
10397 name[4] == 'r' &&
10398 name[5] == 'o' &&
10399 name[6] == 't' &&
10400 name[7] == 'o' &&
10401 name[8] == 'b' &&
10402 name[9] == 'y' &&
10403 name[10] == 'n' &&
10404 name[11] == 'a' &&
10405 name[12] == 'm' &&
10406 name[13] == 'e')
10407 { /* getprotobyname */
10408 return -KEY_getprotobyname;
10409 }
10410
10411 goto unknown;
10412
10413 case 16: /* 1 tokens of length 16 */
10414 if (name[0] == 'g' &&
10415 name[1] == 'e' &&
10416 name[2] == 't' &&
10417 name[3] == 'p' &&
10418 name[4] == 'r' &&
10419 name[5] == 'o' &&
10420 name[6] == 't' &&
10421 name[7] == 'o' &&
10422 name[8] == 'b' &&
10423 name[9] == 'y' &&
10424 name[10] == 'n' &&
10425 name[11] == 'u' &&
10426 name[12] == 'm' &&
10427 name[13] == 'b' &&
10428 name[14] == 'e' &&
10429 name[15] == 'r')
10430 { /* getprotobynumber */
10431 return -KEY_getprotobynumber;
10432 }
10433
10434 goto unknown;
10435
10436 default:
10437 goto unknown;
e2e1dd5a 10438 }
4c3bbe0f
MHM
10439
10440unknown:
e2e1dd5a 10441 return 0;
a687059c
LW
10442}
10443
76e3520e 10444STATIC void
c94115d8 10445S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
a687059c 10446{
97aff369 10447 dVAR;
2f3197b3 10448
d008e5eb 10449 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
10450 if (ckWARN(WARN_SYNTAX)) {
10451 int level = 1;
26ff0806 10452 const char *w;
d008e5eb
GS
10453 for (w = s+2; *w && level; w++) {
10454 if (*w == '(')
10455 ++level;
10456 else if (*w == ')')
10457 --level;
10458 }
888fea98
NC
10459 while (isSPACE(*w))
10460 ++w;
b1439985
RGS
10461 /* the list of chars below is for end of statements or
10462 * block / parens, boolean operators (&&, ||, //) and branch
10463 * constructs (or, and, if, until, unless, while, err, for).
10464 * Not a very solid hack... */
10465 if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
9014280d 10466 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 10467 "%s (...) interpreted as function",name);
d008e5eb 10468 }
2f3197b3 10469 }
3280af22 10470 while (s < PL_bufend && isSPACE(*s))
2f3197b3 10471 s++;
a687059c
LW
10472 if (*s == '(')
10473 s++;
3280af22 10474 while (s < PL_bufend && isSPACE(*s))
a687059c 10475 s++;
7e2040f0 10476 if (isIDFIRST_lazy_if(s,UTF)) {
26ff0806 10477 const char * const w = s++;
7e2040f0 10478 while (isALNUM_lazy_if(s,UTF))
a687059c 10479 s++;
3280af22 10480 while (s < PL_bufend && isSPACE(*s))
a687059c 10481 s++;
e929a76b 10482 if (*s == ',') {
c94115d8 10483 GV* gv;
5458a98a 10484 if (keyword(w, s - w, 0))
e929a76b 10485 return;
c94115d8
NC
10486
10487 gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
10488 if (gv && GvCVu(gv))
abbb3198 10489 return;
cea2e8a9 10490 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
10491 }
10492 }
10493}
10494
423cee85
JH
10495/* Either returns sv, or mortalizes sv and returns a new SV*.
10496 Best used as sv=new_constant(..., sv, ...).
10497 If s, pv are NULL, calls subroutine with one argument,
10498 and type is used with error messages only. */
10499
b3ac6de7 10500STATIC SV *
7fc63493 10501S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9b0e499b 10502 const char *type)
b3ac6de7 10503{
27da23d5 10504 dVAR; dSP;
890ce7af 10505 HV * const table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 10506 SV *res;
b3ac6de7
IZ
10507 SV **cvp;
10508 SV *cv, *typesv;
89e33a05 10509 const char *why1 = "", *why2 = "", *why3 = "";
4e553d73 10510
f0af216f 10511 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
10512 SV *msg;
10513
10edeb5d
JH
10514 why2 = (const char *)
10515 (strEQ(key,"charnames")
10516 ? "(possibly a missing \"use charnames ...\")"
10517 : "");
4e553d73 10518 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
10519 (type ? type: "undef"), why2);
10520
10521 /* This is convoluted and evil ("goto considered harmful")
10522 * but I do not understand the intricacies of all the different
10523 * failure modes of %^H in here. The goal here is to make
10524 * the most probable error message user-friendly. --jhi */
10525
10526 goto msgdone;
10527
423cee85 10528 report:
4e553d73 10529 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 10530 (type ? type: "undef"), why1, why2, why3);
41ab332f 10531 msgdone:
95a20fc0 10532 yyerror(SvPVX_const(msg));
423cee85
JH
10533 SvREFCNT_dec(msg);
10534 return sv;
10535 }
b3ac6de7
IZ
10536 cvp = hv_fetch(table, key, strlen(key), FALSE);
10537 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
10538 why1 = "$^H{";
10539 why2 = key;
f0af216f 10540 why3 = "} is not defined";
423cee85 10541 goto report;
b3ac6de7
IZ
10542 }
10543 sv_2mortal(sv); /* Parent created it permanently */
10544 cv = *cvp;
423cee85
JH
10545 if (!pv && s)
10546 pv = sv_2mortal(newSVpvn(s, len));
10547 if (type && pv)
10548 typesv = sv_2mortal(newSVpv(type, 0));
b3ac6de7 10549 else
423cee85 10550 typesv = &PL_sv_undef;
4e553d73 10551
e788e7d3 10552 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
10553 ENTER ;
10554 SAVETMPS;
4e553d73 10555
423cee85 10556 PUSHMARK(SP) ;
a5845cb7 10557 EXTEND(sp, 3);
423cee85
JH
10558 if (pv)
10559 PUSHs(pv);
b3ac6de7 10560 PUSHs(sv);
423cee85
JH
10561 if (pv)
10562 PUSHs(typesv);
b3ac6de7 10563 PUTBACK;
423cee85 10564 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 10565
423cee85 10566 SPAGAIN ;
4e553d73 10567
423cee85 10568 /* Check the eval first */
9b0e499b 10569 if (!PL_in_eval && SvTRUE(ERRSV)) {
396482e1 10570 sv_catpvs(ERRSV, "Propagated");
8b6b16e7 10571 yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
e1f15930 10572 (void)POPs;
b37c2d43 10573 res = SvREFCNT_inc_simple(sv);
423cee85
JH
10574 }
10575 else {
10576 res = POPs;
b37c2d43 10577 SvREFCNT_inc_simple_void(res);
423cee85 10578 }
4e553d73 10579
423cee85
JH
10580 PUTBACK ;
10581 FREETMPS ;
10582 LEAVE ;
b3ac6de7 10583 POPSTACK;
4e553d73 10584
b3ac6de7 10585 if (!SvOK(res)) {
423cee85
JH
10586 why1 = "Call to &{$^H{";
10587 why2 = key;
f0af216f 10588 why3 = "}} did not return a defined value";
423cee85
JH
10589 sv = res;
10590 goto report;
9b0e499b 10591 }
423cee85 10592
9b0e499b 10593 return res;
b3ac6de7 10594}
4e553d73 10595
d0a148a6
NC
10596/* Returns a NUL terminated string, with the length of the string written to
10597 *slp
10598 */
76e3520e 10599STATIC char *
cea2e8a9 10600S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2 10601{
97aff369 10602 dVAR;
463ee0b2 10603 register char *d = dest;
890ce7af 10604 register char * const e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 10605 for (;;) {
8903cb82 10606 if (d >= e)
cea2e8a9 10607 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10608 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10609 *d++ = *s++;
c35e046a 10610 else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10611 *d++ = ':';
10612 *d++ = ':';
10613 s++;
10614 }
c35e046a 10615 else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
463ee0b2
LW
10616 *d++ = *s++;
10617 *d++ = *s++;
10618 }
fd400ab9 10619 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10620 char *t = s + UTF8SKIP(s);
c35e046a 10621 size_t len;
fd400ab9 10622 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3 10623 t += UTF8SKIP(t);
c35e046a
AL
10624 len = t - s;
10625 if (d + len > e)
cea2e8a9 10626 Perl_croak(aTHX_ ident_too_long);
c35e046a
AL
10627 Copy(s, d, len, char);
10628 d += len;
a0ed51b3
LW
10629 s = t;
10630 }
463ee0b2
LW
10631 else {
10632 *d = '\0';
10633 *slp = d - dest;
10634 return s;
e929a76b 10635 }
378cc40b
LW
10636 }
10637}
10638
76e3520e 10639STATIC char *
f54cb97a 10640S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b 10641{
97aff369 10642 dVAR;
6136c704 10643 char *bracket = NULL;
748a9306 10644 char funny = *s++;
6136c704
AL
10645 register char *d = dest;
10646 register char * const e = d + destlen + 3; /* two-character token, ending NUL */
378cc40b 10647
a0d0e21e 10648 if (isSPACE(*s))
29595ff2 10649 s = PEEKSPACE(s);
de3bb511 10650 if (isDIGIT(*s)) {
8903cb82 10651 while (isDIGIT(*s)) {
10652 if (d >= e)
cea2e8a9 10653 Perl_croak(aTHX_ ident_too_long);
378cc40b 10654 *d++ = *s++;
8903cb82 10655 }
378cc40b
LW
10656 }
10657 else {
463ee0b2 10658 for (;;) {
8903cb82 10659 if (d >= e)
cea2e8a9 10660 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10661 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10662 *d++ = *s++;
7e2040f0 10663 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10664 *d++ = ':';
10665 *d++ = ':';
10666 s++;
10667 }
a0d0e21e 10668 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
10669 *d++ = *s++;
10670 *d++ = *s++;
10671 }
fd400ab9 10672 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10673 char *t = s + UTF8SKIP(s);
fd400ab9 10674 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
10675 t += UTF8SKIP(t);
10676 if (d + (t - s) > e)
cea2e8a9 10677 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
10678 Copy(s, d, t - s, char);
10679 d += t - s;
10680 s = t;
10681 }
463ee0b2
LW
10682 else
10683 break;
10684 }
378cc40b
LW
10685 }
10686 *d = '\0';
10687 d = dest;
79072805 10688 if (*d) {
3280af22
NIS
10689 if (PL_lex_state != LEX_NORMAL)
10690 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 10691 return s;
378cc40b 10692 }
748a9306 10693 if (*s == '$' && s[1] &&
3792a11b 10694 (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
5cd24f17 10695 {
4810e5ec 10696 return s;
5cd24f17 10697 }
79072805
LW
10698 if (*s == '{') {
10699 bracket = s;
10700 s++;
10701 }
10702 else if (ck_uni)
10703 check_uni();
93a17b20 10704 if (s < send)
79072805
LW
10705 *d = *s++;
10706 d[1] = '\0';
2b92dfce 10707 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 10708 *d = toCTRL(*s);
10709 s++;
de3bb511 10710 }
79072805 10711 if (bracket) {
748a9306 10712 if (isSPACE(s[-1])) {
fa83b5b6 10713 while (s < send) {
f54cb97a 10714 const char ch = *s++;
bf4acbe4 10715 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 10716 *d = ch;
10717 break;
10718 }
10719 }
748a9306 10720 }
7e2040f0 10721 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 10722 d++;
a0ed51b3 10723 if (UTF) {
6136c704
AL
10724 char *end = s;
10725 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
10726 end += UTF8SKIP(end);
10727 while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
10728 end += UTF8SKIP(end);
a0ed51b3 10729 }
6136c704
AL
10730 Copy(s, d, end - s, char);
10731 d += end - s;
10732 s = end;
a0ed51b3
LW
10733 }
10734 else {
2b92dfce 10735 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 10736 *d++ = *s++;
2b92dfce 10737 if (d >= e)
cea2e8a9 10738 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 10739 }
79072805 10740 *d = '\0';
c35e046a
AL
10741 while (s < send && SPACE_OR_TAB(*s))
10742 s++;
ff68c719 10743 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
5458a98a 10744 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
10edeb5d
JH
10745 const char * const brack =
10746 (const char *)
10747 ((*s == '[') ? "[...]" : "{...}");
9014280d 10748 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 10749 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
10750 funny, dest, brack, funny, dest, brack);
10751 }
79072805 10752 bracket++;
a0be28da 10753 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
10754 return s;
10755 }
4e553d73
NIS
10756 }
10757 /* Handle extended ${^Foo} variables
2b92dfce
GS
10758 * 1999-02-27 mjd-perl-patch@plover.com */
10759 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
10760 && isALNUM(*s))
10761 {
10762 d++;
10763 while (isALNUM(*s) && d < e) {
10764 *d++ = *s++;
10765 }
10766 if (d >= e)
cea2e8a9 10767 Perl_croak(aTHX_ ident_too_long);
2b92dfce 10768 *d = '\0';
79072805
LW
10769 }
10770 if (*s == '}') {
10771 s++;
7df0d042 10772 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 10773 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
10774 PL_expect = XREF;
10775 }
d008e5eb 10776 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 10777 if (ckWARN(WARN_AMBIGUOUS) &&
780a5241
NC
10778 (keyword(dest, d - dest, 0)
10779 || get_cvn_flags(dest, d - dest, 0)))
d008e5eb 10780 {
c35e046a
AL
10781 if (funny == '#')
10782 funny = '@';
9014280d 10783 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
10784 "Ambiguous use of %c{%s} resolved to %c%s",
10785 funny, dest, funny, dest);
10786 }
10787 }
79072805
LW
10788 }
10789 else {
10790 s = bracket; /* let the parser handle it */
93a17b20 10791 *dest = '\0';
79072805
LW
10792 }
10793 }
3280af22
NIS
10794 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
10795 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
10796 return s;
10797}
10798
cea2e8a9 10799void
2b36a5a0 10800Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 10801{
96a5add6 10802 PERL_UNUSED_CONTEXT;
cde0cee5
YO
10803 if (ch<256) {
10804 char c = (char)ch;
10805 switch (c) {
10806 CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl);
a20207d7
YO
10807 case GLOBAL_PAT_MOD: *pmfl |= PMf_GLOBAL; break;
10808 case CONTINUE_PAT_MOD: *pmfl |= PMf_CONTINUE; break;
10809 case ONCE_PAT_MOD: *pmfl |= PMf_KEEP; break;
10810 case KEEPCOPY_PAT_MOD: *pmfl |= PMf_KEEPCOPY; break;
cde0cee5
YO
10811 }
10812 }
a0d0e21e 10813}
378cc40b 10814
76e3520e 10815STATIC char *
cea2e8a9 10816S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 10817{
97aff369 10818 dVAR;
79072805 10819 PMOP *pm;
5db06880 10820 char *s = scan_str(start,!!PL_madskills,FALSE);
10edeb5d 10821 const char * const valid_flags =
a20207d7 10822 (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
5db06880
NC
10823#ifdef PERL_MAD
10824 char *modstart;
10825#endif
10826
378cc40b 10827
25c09cbf 10828 if (!s) {
6136c704 10829 const char * const delimiter = skipspace(start);
10edeb5d
JH
10830 Perl_croak(aTHX_
10831 (const char *)
10832 (*delimiter == '?'
10833 ? "Search pattern not terminated or ternary operator parsed as search pattern"
10834 : "Search pattern not terminated" ));
25c09cbf 10835 }
bbce6d69 10836
8782bef2 10837 pm = (PMOP*)newPMOP(type, 0);
ad639bfb
NC
10838 if (PL_multi_open == '?') {
10839 /* This is the only point in the code that sets PMf_ONCE: */
79072805 10840 pm->op_pmflags |= PMf_ONCE;
ad639bfb
NC
10841
10842 /* Hence it's safe to do this bit of PMOP book-keeping here, which
10843 allows us to restrict the list needed by reset to just the ??
10844 matches. */
10845 assert(type != OP_TRANS);
10846 if (PL_curstash) {
10847 MAGIC *mg = mg_find((SV*)PL_curstash, PERL_MAGIC_symtab);
10848 U32 elements;
10849 if (!mg) {
10850 mg = sv_magicext((SV*)PL_curstash, 0, PERL_MAGIC_symtab, 0, 0,
10851 0);
10852 }
10853 elements = mg->mg_len / sizeof(PMOP**);
10854 Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
10855 ((PMOP**)mg->mg_ptr) [elements++] = pm;
10856 mg->mg_len = elements * sizeof(PMOP**);
10857 PmopSTASH_set(pm,PL_curstash);
10858 }
10859 }
5db06880
NC
10860#ifdef PERL_MAD
10861 modstart = s;
10862#endif
6136c704
AL
10863 while (*s && strchr(valid_flags, *s))
10864 pmflag(&pm->op_pmflags,*s++);
5db06880
NC
10865#ifdef PERL_MAD
10866 if (PL_madskills && modstart != s) {
10867 SV* tmptoken = newSVpvn(modstart, s - modstart);
10868 append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
10869 }
10870#endif
4ac733c9 10871 /* issue a warning if /c is specified,but /g is not */
041457d9
DM
10872 if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
10873 && ckWARN(WARN_REGEXP))
4ac733c9 10874 {
a20207d7
YO
10875 Perl_warner(aTHX_ packWARN(WARN_REGEXP),
10876 "Use of /c modifier is meaningless without /g" );
4ac733c9
MJD
10877 }
10878
3280af22 10879 PL_lex_op = (OP*)pm;
79072805 10880 yylval.ival = OP_MATCH;
378cc40b
LW
10881 return s;
10882}
10883
76e3520e 10884STATIC char *
cea2e8a9 10885S_scan_subst(pTHX_ char *start)
79072805 10886{
27da23d5 10887 dVAR;
a0d0e21e 10888 register char *s;
79072805 10889 register PMOP *pm;
4fdae800 10890 I32 first_start;
79072805 10891 I32 es = 0;
5db06880
NC
10892#ifdef PERL_MAD
10893 char *modstart;
10894#endif
79072805 10895
79072805
LW
10896 yylval.ival = OP_NULL;
10897
5db06880 10898 s = scan_str(start,!!PL_madskills,FALSE);
79072805 10899
37fd879b 10900 if (!s)
cea2e8a9 10901 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 10902
3280af22 10903 if (s[-1] == PL_multi_open)
79072805 10904 s--;
5db06880
NC
10905#ifdef PERL_MAD
10906 if (PL_madskills) {
cd81e915
NC
10907 CURMAD('q', PL_thisopen);
10908 CURMAD('_', PL_thiswhite);
10909 CURMAD('E', PL_thisstuff);
10910 CURMAD('Q', PL_thisclose);
10911 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
10912 }
10913#endif
79072805 10914
3280af22 10915 first_start = PL_multi_start;
5db06880 10916 s = scan_str(s,!!PL_madskills,FALSE);
79072805 10917 if (!s) {
37fd879b 10918 if (PL_lex_stuff) {
3280af22 10919 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 10920 PL_lex_stuff = NULL;
37fd879b 10921 }
cea2e8a9 10922 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 10923 }
3280af22 10924 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 10925
79072805 10926 pm = (PMOP*)newPMOP(OP_SUBST, 0);
5db06880
NC
10927
10928#ifdef PERL_MAD
10929 if (PL_madskills) {
cd81e915
NC
10930 CURMAD('z', PL_thisopen);
10931 CURMAD('R', PL_thisstuff);
10932 CURMAD('Z', PL_thisclose);
5db06880
NC
10933 }
10934 modstart = s;
10935#endif
10936
48c036b1 10937 while (*s) {
a20207d7 10938 if (*s == EXEC_PAT_MOD) {
a687059c 10939 s++;
2f3197b3 10940 es++;
a687059c 10941 }
a20207d7 10942 else if (strchr(S_PAT_MODS, *s))
a0d0e21e 10943 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
10944 else
10945 break;
378cc40b 10946 }
79072805 10947
5db06880
NC
10948#ifdef PERL_MAD
10949 if (PL_madskills) {
10950 if (modstart != s)
10951 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
10952 append_madprops(PL_thismad, (OP*)pm, 0);
10953 PL_thismad = 0;
5db06880
NC
10954 }
10955#endif
0bd48802
AL
10956 if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP)) {
10957 Perl_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
4ac733c9
MJD
10958 }
10959
79072805 10960 if (es) {
6136c704
AL
10961 SV * const repl = newSVpvs("");
10962
0244c3a4
GS
10963 PL_sublex_info.super_bufptr = s;
10964 PL_sublex_info.super_bufend = PL_bufend;
10965 PL_multi_end = 0;
79072805 10966 pm->op_pmflags |= PMf_EVAL;
463ee0b2 10967 while (es-- > 0)
10edeb5d 10968 sv_catpv(repl, (const char *)(es ? "eval " : "do "));
6f43d98f 10969 sv_catpvs(repl, "{");
3280af22 10970 sv_catsv(repl, PL_lex_repl);
9badc361
RGS
10971 if (strchr(SvPVX(PL_lex_repl), '#'))
10972 sv_catpvs(repl, "\n");
10973 sv_catpvs(repl, "}");
25da4f38 10974 SvEVALED_on(repl);
3280af22
NIS
10975 SvREFCNT_dec(PL_lex_repl);
10976 PL_lex_repl = repl;
378cc40b 10977 }
79072805 10978
3280af22 10979 PL_lex_op = (OP*)pm;
79072805 10980 yylval.ival = OP_SUBST;
378cc40b
LW
10981 return s;
10982}
10983
76e3520e 10984STATIC char *
cea2e8a9 10985S_scan_trans(pTHX_ char *start)
378cc40b 10986{
97aff369 10987 dVAR;
a0d0e21e 10988 register char* s;
11343788 10989 OP *o;
79072805
LW
10990 short *tbl;
10991 I32 squash;
a0ed51b3 10992 I32 del;
79072805 10993 I32 complement;
5db06880
NC
10994#ifdef PERL_MAD
10995 char *modstart;
10996#endif
79072805
LW
10997
10998 yylval.ival = OP_NULL;
10999
5db06880 11000 s = scan_str(start,!!PL_madskills,FALSE);
37fd879b 11001 if (!s)
cea2e8a9 11002 Perl_croak(aTHX_ "Transliteration pattern not terminated");
5db06880 11003
3280af22 11004 if (s[-1] == PL_multi_open)
2f3197b3 11005 s--;
5db06880
NC
11006#ifdef PERL_MAD
11007 if (PL_madskills) {
cd81e915
NC
11008 CURMAD('q', PL_thisopen);
11009 CURMAD('_', PL_thiswhite);
11010 CURMAD('E', PL_thisstuff);
11011 CURMAD('Q', PL_thisclose);
11012 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
11013 }
11014#endif
2f3197b3 11015
5db06880 11016 s = scan_str(s,!!PL_madskills,FALSE);
79072805 11017 if (!s) {
37fd879b 11018 if (PL_lex_stuff) {
3280af22 11019 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 11020 PL_lex_stuff = NULL;
37fd879b 11021 }
cea2e8a9 11022 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 11023 }
5db06880 11024 if (PL_madskills) {
cd81e915
NC
11025 CURMAD('z', PL_thisopen);
11026 CURMAD('R', PL_thisstuff);
11027 CURMAD('Z', PL_thisclose);
5db06880 11028 }
79072805 11029
a0ed51b3 11030 complement = del = squash = 0;
5db06880
NC
11031#ifdef PERL_MAD
11032 modstart = s;
11033#endif
7a1e2023
NC
11034 while (1) {
11035 switch (*s) {
11036 case 'c':
79072805 11037 complement = OPpTRANS_COMPLEMENT;
7a1e2023
NC
11038 break;
11039 case 'd':
a0ed51b3 11040 del = OPpTRANS_DELETE;
7a1e2023
NC
11041 break;
11042 case 's':
79072805 11043 squash = OPpTRANS_SQUASH;
7a1e2023
NC
11044 break;
11045 default:
11046 goto no_more;
11047 }
395c3793
LW
11048 s++;
11049 }
7a1e2023 11050 no_more:
8973db79 11051
aa1f7c5b 11052 tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
8973db79 11053 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
11054 o->op_private &= ~OPpTRANS_ALL;
11055 o->op_private |= del|squash|complement|
7948272d
NIS
11056 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
11057 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 11058
3280af22 11059 PL_lex_op = o;
79072805 11060 yylval.ival = OP_TRANS;
5db06880
NC
11061
11062#ifdef PERL_MAD
11063 if (PL_madskills) {
11064 if (modstart != s)
11065 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
11066 append_madprops(PL_thismad, o, 0);
11067 PL_thismad = 0;
5db06880
NC
11068 }
11069#endif
11070
79072805
LW
11071 return s;
11072}
11073
76e3520e 11074STATIC char *
cea2e8a9 11075S_scan_heredoc(pTHX_ register char *s)
79072805 11076{
97aff369 11077 dVAR;
79072805
LW
11078 SV *herewas;
11079 I32 op_type = OP_SCALAR;
11080 I32 len;
11081 SV *tmpstr;
11082 char term;
73d840c0 11083 const char *found_newline;
79072805 11084 register char *d;
fc36a67e 11085 register char *e;
4633a7c4 11086 char *peek;
f54cb97a 11087 const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
5db06880
NC
11088#ifdef PERL_MAD
11089 I32 stuffstart = s - SvPVX(PL_linestr);
11090 char *tstart;
11091
cd81e915 11092 PL_realtokenstart = -1;
5db06880 11093#endif
79072805
LW
11094
11095 s += 2;
3280af22
NIS
11096 d = PL_tokenbuf;
11097 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 11098 if (!outer)
79072805 11099 *d++ = '\n';
c35e046a
AL
11100 peek = s;
11101 while (SPACE_OR_TAB(*peek))
11102 peek++;
3792a11b 11103 if (*peek == '`' || *peek == '\'' || *peek =='"') {
4633a7c4 11104 s = peek;
79072805 11105 term = *s++;
3280af22 11106 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 11107 d += len;
3280af22 11108 if (s < PL_bufend)
79072805 11109 s++;
79072805
LW
11110 }
11111 else {
11112 if (*s == '\\')
11113 s++, term = '\'';
11114 else
11115 term = '"';
7e2040f0 11116 if (!isALNUM_lazy_if(s,UTF))
12bcd1a6 11117 deprecate_old("bare << to mean <<\"\"");
7e2040f0 11118 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 11119 if (d < e)
11120 *d++ = *s;
11121 }
11122 }
3280af22 11123 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 11124 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
11125 *d++ = '\n';
11126 *d = '\0';
3280af22 11127 len = d - PL_tokenbuf;
5db06880
NC
11128
11129#ifdef PERL_MAD
11130 if (PL_madskills) {
11131 tstart = PL_tokenbuf + !outer;
cd81e915 11132 PL_thisclose = newSVpvn(tstart, len - !outer);
5db06880 11133 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915 11134 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11135 stuffstart = s - SvPVX(PL_linestr);
11136 }
11137#endif
6a27c188 11138#ifndef PERL_STRICT_CR
f63a84b2
LW
11139 d = strchr(s, '\r');
11140 if (d) {
b464bac0 11141 char * const olds = s;
f63a84b2 11142 s = d;
3280af22 11143 while (s < PL_bufend) {
f63a84b2
LW
11144 if (*s == '\r') {
11145 *d++ = '\n';
11146 if (*++s == '\n')
11147 s++;
11148 }
11149 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
11150 *d++ = *s++;
11151 s++;
11152 }
11153 else
11154 *d++ = *s++;
11155 }
11156 *d = '\0';
3280af22 11157 PL_bufend = d;
95a20fc0 11158 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2
LW
11159 s = olds;
11160 }
11161#endif
5db06880
NC
11162#ifdef PERL_MAD
11163 found_newline = 0;
11164#endif
10edeb5d 11165 if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
73d840c0
AL
11166 herewas = newSVpvn(s,PL_bufend-s);
11167 }
11168 else {
5db06880
NC
11169#ifdef PERL_MAD
11170 herewas = newSVpvn(s-1,found_newline-s+1);
11171#else
73d840c0
AL
11172 s--;
11173 herewas = newSVpvn(s,found_newline-s);
5db06880 11174#endif
73d840c0 11175 }
5db06880
NC
11176#ifdef PERL_MAD
11177 if (PL_madskills) {
11178 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11179 if (PL_thisstuff)
11180 sv_catpvn(PL_thisstuff, tstart, s - tstart);
5db06880 11181 else
cd81e915 11182 PL_thisstuff = newSVpvn(tstart, s - tstart);
5db06880
NC
11183 }
11184#endif
79072805 11185 s += SvCUR(herewas);
748a9306 11186
5db06880
NC
11187#ifdef PERL_MAD
11188 stuffstart = s - SvPVX(PL_linestr);
11189
11190 if (found_newline)
11191 s--;
11192#endif
11193
7d0a29fe
NC
11194 tmpstr = newSV_type(SVt_PVIV);
11195 SvGROW(tmpstr, 80);
748a9306 11196 if (term == '\'') {
79072805 11197 op_type = OP_CONST;
45977657 11198 SvIV_set(tmpstr, -1);
748a9306
LW
11199 }
11200 else if (term == '`') {
79072805 11201 op_type = OP_BACKTICK;
45977657 11202 SvIV_set(tmpstr, '\\');
748a9306 11203 }
79072805
LW
11204
11205 CLINE;
57843af0 11206 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
11207 PL_multi_open = PL_multi_close = '<';
11208 term = *PL_tokenbuf;
0244c3a4 11209 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6136c704
AL
11210 char * const bufptr = PL_sublex_info.super_bufptr;
11211 char * const bufend = PL_sublex_info.super_bufend;
b464bac0 11212 char * const olds = s - SvCUR(herewas);
0244c3a4
GS
11213 s = strchr(bufptr, '\n');
11214 if (!s)
11215 s = bufend;
11216 d = s;
11217 while (s < bufend &&
11218 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
11219 if (*s++ == '\n')
57843af0 11220 CopLINE_inc(PL_curcop);
0244c3a4
GS
11221 }
11222 if (s >= bufend) {
eb160463 11223 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
11224 missingterm(PL_tokenbuf);
11225 }
11226 sv_setpvn(herewas,bufptr,d-bufptr+1);
11227 sv_setpvn(tmpstr,d+1,s-d);
11228 s += len - 1;
11229 sv_catpvn(herewas,s,bufend-s);
95a20fc0 11230 Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
0244c3a4
GS
11231
11232 s = olds;
11233 goto retval;
11234 }
11235 else if (!outer) {
79072805 11236 d = s;
3280af22
NIS
11237 while (s < PL_bufend &&
11238 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 11239 if (*s++ == '\n')
57843af0 11240 CopLINE_inc(PL_curcop);
79072805 11241 }
3280af22 11242 if (s >= PL_bufend) {
eb160463 11243 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11244 missingterm(PL_tokenbuf);
79072805
LW
11245 }
11246 sv_setpvn(tmpstr,d+1,s-d);
5db06880
NC
11247#ifdef PERL_MAD
11248 if (PL_madskills) {
cd81e915
NC
11249 if (PL_thisstuff)
11250 sv_catpvn(PL_thisstuff, d + 1, s - d);
5db06880 11251 else
cd81e915 11252 PL_thisstuff = newSVpvn(d + 1, s - d);
5db06880
NC
11253 stuffstart = s - SvPVX(PL_linestr);
11254 }
11255#endif
79072805 11256 s += len - 1;
57843af0 11257 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 11258
3280af22
NIS
11259 sv_catpvn(herewas,s,PL_bufend-s);
11260 sv_setsv(PL_linestr,herewas);
11261 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
11262 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11263 PL_last_lop = PL_last_uni = NULL;
79072805
LW
11264 }
11265 else
11266 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3280af22 11267 while (s >= PL_bufend) { /* multiple line string? */
5db06880
NC
11268#ifdef PERL_MAD
11269 if (PL_madskills) {
11270 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11271 if (PL_thisstuff)
11272 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11273 else
cd81e915 11274 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11275 }
11276#endif
fd2d0953 11277 if (!outer ||
3280af22 11278 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
eb160463 11279 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11280 missingterm(PL_tokenbuf);
79072805 11281 }
5db06880
NC
11282#ifdef PERL_MAD
11283 stuffstart = s - SvPVX(PL_linestr);
11284#endif
57843af0 11285 CopLINE_inc(PL_curcop);
3280af22 11286 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11287 PL_last_lop = PL_last_uni = NULL;
6a27c188 11288#ifndef PERL_STRICT_CR
3280af22 11289 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
11290 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
11291 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 11292 {
3280af22
NIS
11293 PL_bufend[-2] = '\n';
11294 PL_bufend--;
95a20fc0 11295 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2 11296 }
3280af22
NIS
11297 else if (PL_bufend[-1] == '\r')
11298 PL_bufend[-1] = '\n';
f63a84b2 11299 }
3280af22
NIS
11300 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
11301 PL_bufend[-1] = '\n';
f63a84b2 11302#endif
80a702cd 11303 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 11304 update_debugger_info(PL_linestr, NULL, 0);
3280af22 11305 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
95a20fc0 11306 STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
1de9afcd 11307 *(SvPVX(PL_linestr) + off ) = ' ';
3280af22
NIS
11308 sv_catsv(PL_linestr,herewas);
11309 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1de9afcd 11310 s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
79072805
LW
11311 }
11312 else {
3280af22
NIS
11313 s = PL_bufend;
11314 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
11315 }
11316 }
79072805 11317 s++;
0244c3a4 11318retval:
57843af0 11319 PL_multi_end = CopLINE(PL_curcop);
79072805 11320 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
1da4ca5f 11321 SvPV_shrink_to_cur(tmpstr);
79072805 11322 }
8990e307 11323 SvREFCNT_dec(herewas);
2f31ce75 11324 if (!IN_BYTES) {
95a20fc0 11325 if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
2f31ce75
JH
11326 SvUTF8_on(tmpstr);
11327 else if (PL_encoding)
11328 sv_recode_to_utf8(tmpstr, PL_encoding);
11329 }
3280af22 11330 PL_lex_stuff = tmpstr;
79072805
LW
11331 yylval.ival = op_type;
11332 return s;
11333}
11334
02aa26ce
NT
11335/* scan_inputsymbol
11336 takes: current position in input buffer
11337 returns: new position in input buffer
11338 side-effects: yylval and lex_op are set.
11339
11340 This code handles:
11341
11342 <> read from ARGV
11343 <FH> read from filehandle
11344 <pkg::FH> read from package qualified filehandle
11345 <pkg'FH> read from package qualified filehandle
11346 <$fh> read from filehandle in $fh
11347 <*.h> filename glob
11348
11349*/
11350
76e3520e 11351STATIC char *
cea2e8a9 11352S_scan_inputsymbol(pTHX_ char *start)
79072805 11353{
97aff369 11354 dVAR;
02aa26ce 11355 register char *s = start; /* current position in buffer */
1b420867 11356 char *end;
79072805
LW
11357 I32 len;
11358
6136c704
AL
11359 char *d = PL_tokenbuf; /* start of temp holding space */
11360 const char * const e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
11361
1b420867
GS
11362 end = strchr(s, '\n');
11363 if (!end)
11364 end = PL_bufend;
11365 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
11366
11367 /* die if we didn't have space for the contents of the <>,
1b420867 11368 or if it didn't end, or if we see a newline
02aa26ce
NT
11369 */
11370
bb7a0f54 11371 if (len >= (I32)sizeof PL_tokenbuf)
cea2e8a9 11372 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 11373 if (s >= end)
cea2e8a9 11374 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 11375
fc36a67e 11376 s++;
02aa26ce
NT
11377
11378 /* check for <$fh>
11379 Remember, only scalar variables are interpreted as filehandles by
11380 this code. Anything more complex (e.g., <$fh{$num}>) will be
11381 treated as a glob() call.
11382 This code makes use of the fact that except for the $ at the front,
11383 a scalar variable and a filehandle look the same.
11384 */
4633a7c4 11385 if (*d == '$' && d[1]) d++;
02aa26ce
NT
11386
11387 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 11388 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 11389 d++;
02aa26ce
NT
11390
11391 /* If we've tried to read what we allow filehandles to look like, and
11392 there's still text left, then it must be a glob() and not a getline.
11393 Use scan_str to pull out the stuff between the <> and treat it
11394 as nothing more than a string.
11395 */
11396
3280af22 11397 if (d - PL_tokenbuf != len) {
79072805
LW
11398 yylval.ival = OP_GLOB;
11399 set_csh();
5db06880 11400 s = scan_str(start,!!PL_madskills,FALSE);
79072805 11401 if (!s)
cea2e8a9 11402 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
11403 return s;
11404 }
395c3793 11405 else {
9b3023bc 11406 bool readline_overriden = FALSE;
6136c704 11407 GV *gv_readline;
9b3023bc 11408 GV **gvp;
02aa26ce 11409 /* we're in a filehandle read situation */
3280af22 11410 d = PL_tokenbuf;
02aa26ce
NT
11411
11412 /* turn <> into <ARGV> */
79072805 11413 if (!len)
689badd5 11414 Copy("ARGV",d,5,char);
02aa26ce 11415
9b3023bc 11416 /* Check whether readline() is overriden */
fafc274c 11417 gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
6136c704 11418 if ((gv_readline
ba979b31 11419 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 11420 ||
017a3ce5 11421 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
9e0d86f8 11422 && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
ba979b31 11423 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
11424 readline_overriden = TRUE;
11425
02aa26ce
NT
11426 /* if <$fh>, create the ops to turn the variable into a
11427 filehandle
11428 */
79072805 11429 if (*d == '$') {
02aa26ce
NT
11430 /* try to find it in the pad for this block, otherwise find
11431 add symbol table ops
11432 */
bbd11bfc
AL
11433 const PADOFFSET tmp = pad_findmy(d);
11434 if (tmp != NOT_IN_PAD) {
00b1698f 11435 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
6136c704
AL
11436 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
11437 HEK * const stashname = HvNAME_HEK(stash);
11438 SV * const sym = sv_2mortal(newSVhek(stashname));
396482e1 11439 sv_catpvs(sym, "::");
f558d5af
JH
11440 sv_catpv(sym, d+1);
11441 d = SvPVX(sym);
11442 goto intro_sym;
11443 }
11444 else {
6136c704 11445 OP * const o = newOP(OP_PADSV, 0);
f558d5af 11446 o->op_targ = tmp;
9b3023bc
RGS
11447 PL_lex_op = readline_overriden
11448 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11449 append_elem(OP_LIST, o,
11450 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
11451 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 11452 }
a0d0e21e
LW
11453 }
11454 else {
f558d5af
JH
11455 GV *gv;
11456 ++d;
11457intro_sym:
11458 gv = gv_fetchpv(d,
11459 (PL_in_eval
11460 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 11461 : GV_ADDMULTI),
f558d5af 11462 SVt_PV);
9b3023bc
RGS
11463 PL_lex_op = readline_overriden
11464 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11465 append_elem(OP_LIST,
11466 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
11467 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11468 : (OP*)newUNOP(OP_READLINE, 0,
11469 newUNOP(OP_RV2SV, 0,
11470 newGVOP(OP_GV, 0, gv)));
a0d0e21e 11471 }
7c6fadd6
RGS
11472 if (!readline_overriden)
11473 PL_lex_op->op_flags |= OPf_SPECIAL;
f5284f61 11474 /* we created the ops in PL_lex_op, so make yylval.ival a null op */
79072805
LW
11475 yylval.ival = OP_NULL;
11476 }
02aa26ce
NT
11477
11478 /* If it's none of the above, it must be a literal filehandle
11479 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 11480 else {
6136c704 11481 GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
9b3023bc
RGS
11482 PL_lex_op = readline_overriden
11483 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11484 append_elem(OP_LIST,
11485 newGVOP(OP_GV, 0, gv),
11486 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11487 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
79072805
LW
11488 yylval.ival = OP_NULL;
11489 }
11490 }
02aa26ce 11491
79072805
LW
11492 return s;
11493}
11494
02aa26ce
NT
11495
11496/* scan_str
11497 takes: start position in buffer
09bef843
SB
11498 keep_quoted preserve \ on the embedded delimiter(s)
11499 keep_delims preserve the delimiters around the string
02aa26ce
NT
11500 returns: position to continue reading from buffer
11501 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
11502 updates the read buffer.
11503
11504 This subroutine pulls a string out of the input. It is called for:
11505 q single quotes q(literal text)
11506 ' single quotes 'literal text'
11507 qq double quotes qq(interpolate $here please)
11508 " double quotes "interpolate $here please"
11509 qx backticks qx(/bin/ls -l)
11510 ` backticks `/bin/ls -l`
11511 qw quote words @EXPORT_OK = qw( func() $spam )
11512 m// regexp match m/this/
11513 s/// regexp substitute s/this/that/
11514 tr/// string transliterate tr/this/that/
11515 y/// string transliterate y/this/that/
11516 ($*@) sub prototypes sub foo ($)
09bef843 11517 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
11518 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
11519
11520 In most of these cases (all but <>, patterns and transliterate)
11521 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
11522 calls scan_str(). s/// makes yylex() call scan_subst() which calls
11523 scan_str(). tr/// and y/// make yylex() call scan_trans() which
11524 calls scan_str().
4e553d73 11525
02aa26ce
NT
11526 It skips whitespace before the string starts, and treats the first
11527 character as the delimiter. If the delimiter is one of ([{< then
11528 the corresponding "close" character )]}> is used as the closing
11529 delimiter. It allows quoting of delimiters, and if the string has
11530 balanced delimiters ([{<>}]) it allows nesting.
11531
37fd879b
HS
11532 On success, the SV with the resulting string is put into lex_stuff or,
11533 if that is already non-NULL, into lex_repl. The second case occurs only
11534 when parsing the RHS of the special constructs s/// and tr/// (y///).
11535 For convenience, the terminating delimiter character is stuffed into
11536 SvIVX of the SV.
02aa26ce
NT
11537*/
11538
76e3520e 11539STATIC char *
09bef843 11540S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 11541{
97aff369 11542 dVAR;
02aa26ce 11543 SV *sv; /* scalar value: string */
d3fcec1f 11544 const char *tmps; /* temp string, used for delimiter matching */
02aa26ce
NT
11545 register char *s = start; /* current position in the buffer */
11546 register char term; /* terminating character */
11547 register char *to; /* current position in the sv's data */
11548 I32 brackets = 1; /* bracket nesting level */
89491803 11549 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e 11550 I32 termcode; /* terminating char. code */
89ebb4a3 11551 U8 termstr[UTF8_MAXBYTES]; /* terminating string */
220e2d4e 11552 STRLEN termlen; /* length of terminating string */
0331ef07 11553 int last_off = 0; /* last position for nesting bracket */
5db06880
NC
11554#ifdef PERL_MAD
11555 int stuffstart;
11556 char *tstart;
11557#endif
02aa26ce
NT
11558
11559 /* skip space before the delimiter */
29595ff2
NC
11560 if (isSPACE(*s)) {
11561 s = PEEKSPACE(s);
11562 }
02aa26ce 11563
5db06880 11564#ifdef PERL_MAD
cd81e915
NC
11565 if (PL_realtokenstart >= 0) {
11566 stuffstart = PL_realtokenstart;
11567 PL_realtokenstart = -1;
5db06880
NC
11568 }
11569 else
11570 stuffstart = start - SvPVX(PL_linestr);
11571#endif
02aa26ce 11572 /* mark where we are, in case we need to report errors */
79072805 11573 CLINE;
02aa26ce
NT
11574
11575 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 11576 term = *s;
220e2d4e
IH
11577 if (!UTF) {
11578 termcode = termstr[0] = term;
11579 termlen = 1;
11580 }
11581 else {
f3b9ce0f 11582 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
11583 Copy(s, termstr, termlen, U8);
11584 if (!UTF8_IS_INVARIANT(term))
11585 has_utf8 = TRUE;
11586 }
b1c7b182 11587
02aa26ce 11588 /* mark where we are */
57843af0 11589 PL_multi_start = CopLINE(PL_curcop);
3280af22 11590 PL_multi_open = term;
02aa26ce
NT
11591
11592 /* find corresponding closing delimiter */
93a17b20 11593 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
11594 termcode = termstr[0] = term = tmps[5];
11595
3280af22 11596 PL_multi_close = term;
79072805 11597
561b68a9
SH
11598 /* create a new SV to hold the contents. 79 is the SV's initial length.
11599 What a random number. */
7d0a29fe
NC
11600 sv = newSV_type(SVt_PVIV);
11601 SvGROW(sv, 80);
45977657 11602 SvIV_set(sv, termcode);
a0d0e21e 11603 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
11604
11605 /* move past delimiter and try to read a complete string */
09bef843 11606 if (keep_delims)
220e2d4e
IH
11607 sv_catpvn(sv, s, termlen);
11608 s += termlen;
5db06880
NC
11609#ifdef PERL_MAD
11610 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11611 if (!PL_thisopen && !keep_delims) {
11612 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11613 stuffstart = s - SvPVX(PL_linestr);
11614 }
11615#endif
93a17b20 11616 for (;;) {
220e2d4e
IH
11617 if (PL_encoding && !UTF) {
11618 bool cont = TRUE;
11619
11620 while (cont) {
95a20fc0 11621 int offset = s - SvPVX_const(PL_linestr);
66a1b24b 11622 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 11623 &offset, (char*)termstr, termlen);
6136c704
AL
11624 const char * const ns = SvPVX_const(PL_linestr) + offset;
11625 char * const svlast = SvEND(sv) - 1;
220e2d4e
IH
11626
11627 for (; s < ns; s++) {
11628 if (*s == '\n' && !PL_rsfp)
11629 CopLINE_inc(PL_curcop);
11630 }
11631 if (!found)
11632 goto read_more_line;
11633 else {
11634 /* handle quoted delimiters */
52327caf 11635 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
f54cb97a 11636 const char *t;
95a20fc0 11637 for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
220e2d4e
IH
11638 t--;
11639 if ((svlast-1 - t) % 2) {
11640 if (!keep_quoted) {
11641 *(svlast-1) = term;
11642 *svlast = '\0';
11643 SvCUR_set(sv, SvCUR(sv) - 1);
11644 }
11645 continue;
11646 }
11647 }
11648 if (PL_multi_open == PL_multi_close) {
11649 cont = FALSE;
11650 }
11651 else {
f54cb97a
AL
11652 const char *t;
11653 char *w;
0331ef07 11654 for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
220e2d4e
IH
11655 /* At here, all closes are "was quoted" one,
11656 so we don't check PL_multi_close. */
11657 if (*t == '\\') {
11658 if (!keep_quoted && *(t+1) == PL_multi_open)
11659 t++;
11660 else
11661 *w++ = *t++;
11662 }
11663 else if (*t == PL_multi_open)
11664 brackets++;
11665
11666 *w = *t;
11667 }
11668 if (w < t) {
11669 *w++ = term;
11670 *w = '\0';
95a20fc0 11671 SvCUR_set(sv, w - SvPVX_const(sv));
220e2d4e 11672 }
0331ef07 11673 last_off = w - SvPVX(sv);
220e2d4e
IH
11674 if (--brackets <= 0)
11675 cont = FALSE;
11676 }
11677 }
11678 }
11679 if (!keep_delims) {
11680 SvCUR_set(sv, SvCUR(sv) - 1);
11681 *SvEND(sv) = '\0';
11682 }
11683 break;
11684 }
11685
02aa26ce 11686 /* extend sv if need be */
3280af22 11687 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 11688 /* set 'to' to the next character in the sv's string */
463ee0b2 11689 to = SvPVX(sv)+SvCUR(sv);
09bef843 11690
02aa26ce 11691 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
11692 if (PL_multi_open == PL_multi_close) {
11693 for (; s < PL_bufend; s++,to++) {
02aa26ce 11694 /* embedded newlines increment the current line number */
3280af22 11695 if (*s == '\n' && !PL_rsfp)
57843af0 11696 CopLINE_inc(PL_curcop);
02aa26ce 11697 /* handle quoted delimiters */
3280af22 11698 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 11699 if (!keep_quoted && s[1] == term)
a0d0e21e 11700 s++;
02aa26ce 11701 /* any other quotes are simply copied straight through */
a0d0e21e
LW
11702 else
11703 *to++ = *s++;
11704 }
02aa26ce
NT
11705 /* terminate when run out of buffer (the for() condition), or
11706 have found the terminator */
220e2d4e
IH
11707 else if (*s == term) {
11708 if (termlen == 1)
11709 break;
f3b9ce0f 11710 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
11711 break;
11712 }
63cd0674 11713 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11714 has_utf8 = TRUE;
93a17b20
LW
11715 *to = *s;
11716 }
11717 }
02aa26ce
NT
11718
11719 /* if the terminator isn't the same as the start character (e.g.,
11720 matched brackets), we have to allow more in the quoting, and
11721 be prepared for nested brackets.
11722 */
93a17b20 11723 else {
02aa26ce 11724 /* read until we run out of string, or we find the terminator */
3280af22 11725 for (; s < PL_bufend; s++,to++) {
02aa26ce 11726 /* embedded newlines increment the line count */
3280af22 11727 if (*s == '\n' && !PL_rsfp)
57843af0 11728 CopLINE_inc(PL_curcop);
02aa26ce 11729 /* backslashes can escape the open or closing characters */
3280af22 11730 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
11731 if (!keep_quoted &&
11732 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
11733 s++;
11734 else
11735 *to++ = *s++;
11736 }
02aa26ce 11737 /* allow nested opens and closes */
3280af22 11738 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 11739 break;
3280af22 11740 else if (*s == PL_multi_open)
93a17b20 11741 brackets++;
63cd0674 11742 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11743 has_utf8 = TRUE;
93a17b20
LW
11744 *to = *s;
11745 }
11746 }
02aa26ce 11747 /* terminate the copied string and update the sv's end-of-string */
93a17b20 11748 *to = '\0';
95a20fc0 11749 SvCUR_set(sv, to - SvPVX_const(sv));
93a17b20 11750
02aa26ce
NT
11751 /*
11752 * this next chunk reads more into the buffer if we're not done yet
11753 */
11754
b1c7b182
GS
11755 if (s < PL_bufend)
11756 break; /* handle case where we are done yet :-) */
79072805 11757
6a27c188 11758#ifndef PERL_STRICT_CR
95a20fc0 11759 if (to - SvPVX_const(sv) >= 2) {
c6f14548
GS
11760 if ((to[-2] == '\r' && to[-1] == '\n') ||
11761 (to[-2] == '\n' && to[-1] == '\r'))
11762 {
f63a84b2
LW
11763 to[-2] = '\n';
11764 to--;
95a20fc0 11765 SvCUR_set(sv, to - SvPVX_const(sv));
f63a84b2
LW
11766 }
11767 else if (to[-1] == '\r')
11768 to[-1] = '\n';
11769 }
95a20fc0 11770 else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
f63a84b2
LW
11771 to[-1] = '\n';
11772#endif
11773
220e2d4e 11774 read_more_line:
02aa26ce
NT
11775 /* if we're out of file, or a read fails, bail and reset the current
11776 line marker so we can report where the unterminated string began
11777 */
5db06880
NC
11778#ifdef PERL_MAD
11779 if (PL_madskills) {
c35e046a 11780 char * const tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11781 if (PL_thisstuff)
11782 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11783 else
cd81e915 11784 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11785 }
11786#endif
3280af22
NIS
11787 if (!PL_rsfp ||
11788 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 11789 sv_free(sv);
eb160463 11790 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
bd61b366 11791 return NULL;
79072805 11792 }
5db06880
NC
11793#ifdef PERL_MAD
11794 stuffstart = 0;
11795#endif
02aa26ce 11796 /* we read a line, so increment our line counter */
57843af0 11797 CopLINE_inc(PL_curcop);
a0ed51b3 11798
02aa26ce 11799 /* update debugger info */
80a702cd 11800 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 11801 update_debugger_info(PL_linestr, NULL, 0);
a0ed51b3 11802
3280af22
NIS
11803 /* having changed the buffer, we must update PL_bufend */
11804 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11805 PL_last_lop = PL_last_uni = NULL;
378cc40b 11806 }
4e553d73 11807
02aa26ce
NT
11808 /* at this point, we have successfully read the delimited string */
11809
220e2d4e 11810 if (!PL_encoding || UTF) {
5db06880
NC
11811#ifdef PERL_MAD
11812 if (PL_madskills) {
c35e046a 11813 char * const tstart = SvPVX(PL_linestr) + stuffstart;
29522234 11814 const int len = s - tstart;
cd81e915 11815 if (PL_thisstuff)
c35e046a 11816 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 11817 else
c35e046a 11818 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
11819 if (!PL_thisclose && !keep_delims)
11820 PL_thisclose = newSVpvn(s,termlen);
5db06880
NC
11821 }
11822#endif
11823
220e2d4e
IH
11824 if (keep_delims)
11825 sv_catpvn(sv, s, termlen);
11826 s += termlen;
11827 }
5db06880
NC
11828#ifdef PERL_MAD
11829 else {
11830 if (PL_madskills) {
c35e046a
AL
11831 char * const tstart = SvPVX(PL_linestr) + stuffstart;
11832 const int len = s - tstart - termlen;
cd81e915 11833 if (PL_thisstuff)
c35e046a 11834 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 11835 else
c35e046a 11836 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
11837 if (!PL_thisclose && !keep_delims)
11838 PL_thisclose = newSVpvn(s - termlen,termlen);
5db06880
NC
11839 }
11840 }
11841#endif
220e2d4e 11842 if (has_utf8 || PL_encoding)
b1c7b182 11843 SvUTF8_on(sv);
d0063567 11844
57843af0 11845 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
11846
11847 /* if we allocated too much space, give some back */
93a17b20
LW
11848 if (SvCUR(sv) + 5 < SvLEN(sv)) {
11849 SvLEN_set(sv, SvCUR(sv) + 1);
b7e9a5c2 11850 SvPV_renew(sv, SvLEN(sv));
79072805 11851 }
02aa26ce
NT
11852
11853 /* decide whether this is the first or second quoted string we've read
11854 for this op
11855 */
4e553d73 11856
3280af22
NIS
11857 if (PL_lex_stuff)
11858 PL_lex_repl = sv;
79072805 11859 else
3280af22 11860 PL_lex_stuff = sv;
378cc40b
LW
11861 return s;
11862}
11863
02aa26ce
NT
11864/*
11865 scan_num
11866 takes: pointer to position in buffer
11867 returns: pointer to new position in buffer
11868 side-effects: builds ops for the constant in yylval.op
11869
11870 Read a number in any of the formats that Perl accepts:
11871
7fd134d9
JH
11872 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
11873 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
11874 0b[01](_?[01])*
11875 0[0-7](_?[0-7])*
11876 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 11877
3280af22 11878 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
11879 thing it reads.
11880
11881 If it reads a number without a decimal point or an exponent, it will
11882 try converting the number to an integer and see if it can do so
11883 without loss of precision.
11884*/
4e553d73 11885
378cc40b 11886char *
bfed75c6 11887Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
378cc40b 11888{
97aff369 11889 dVAR;
bfed75c6 11890 register const char *s = start; /* current position in buffer */
02aa26ce
NT
11891 register char *d; /* destination in temp buffer */
11892 register char *e; /* end of temp buffer */
86554af2 11893 NV nv; /* number read, as a double */
a0714e2c 11894 SV *sv = NULL; /* place to put the converted number */
a86a20aa 11895 bool floatit; /* boolean: int or float? */
cbbf8932 11896 const char *lastub = NULL; /* position of last underbar */
bfed75c6 11897 static char const number_too_long[] = "Number too long";
378cc40b 11898
02aa26ce
NT
11899 /* We use the first character to decide what type of number this is */
11900
378cc40b 11901 switch (*s) {
79072805 11902 default:
cea2e8a9 11903 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 11904
02aa26ce 11905 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 11906 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
11907 case '0':
11908 {
02aa26ce
NT
11909 /* variables:
11910 u holds the "number so far"
4f19785b
WSI
11911 shift the power of 2 of the base
11912 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
11913 overflowed was the number more than we can hold?
11914
11915 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
11916 we in octal/hex/binary?" indicator to disallow hex characters
11917 when in octal mode.
02aa26ce 11918 */
9e24b6e2
JH
11919 NV n = 0.0;
11920 UV u = 0;
79072805 11921 I32 shift;
9e24b6e2 11922 bool overflowed = FALSE;
61f33854 11923 bool just_zero = TRUE; /* just plain 0 or binary number? */
27da23d5
JH
11924 static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
11925 static const char* const bases[5] =
11926 { "", "binary", "", "octal", "hexadecimal" };
11927 static const char* const Bases[5] =
11928 { "", "Binary", "", "Octal", "Hexadecimal" };
11929 static const char* const maxima[5] =
11930 { "",
11931 "0b11111111111111111111111111111111",
11932 "",
11933 "037777777777",
11934 "0xffffffff" };
bfed75c6 11935 const char *base, *Base, *max;
378cc40b 11936
02aa26ce 11937 /* check for hex */
378cc40b
LW
11938 if (s[1] == 'x') {
11939 shift = 4;
11940 s += 2;
61f33854 11941 just_zero = FALSE;
4f19785b
WSI
11942 } else if (s[1] == 'b') {
11943 shift = 1;
11944 s += 2;
61f33854 11945 just_zero = FALSE;
378cc40b 11946 }
02aa26ce 11947 /* check for a decimal in disguise */
b78218b7 11948 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 11949 goto decimal;
02aa26ce 11950 /* so it must be octal */
928753ea 11951 else {
378cc40b 11952 shift = 3;
928753ea
JH
11953 s++;
11954 }
11955
11956 if (*s == '_') {
11957 if (ckWARN(WARN_SYNTAX))
9014280d 11958 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
11959 "Misplaced _ in number");
11960 lastub = s++;
11961 }
9e24b6e2
JH
11962
11963 base = bases[shift];
11964 Base = Bases[shift];
11965 max = maxima[shift];
02aa26ce 11966
4f19785b 11967 /* read the rest of the number */
378cc40b 11968 for (;;) {
9e24b6e2 11969 /* x is used in the overflow test,
893fe2c2 11970 b is the digit we're adding on. */
9e24b6e2 11971 UV x, b;
55497cff 11972
378cc40b 11973 switch (*s) {
02aa26ce
NT
11974
11975 /* if we don't mention it, we're done */
378cc40b
LW
11976 default:
11977 goto out;
02aa26ce 11978
928753ea 11979 /* _ are ignored -- but warned about if consecutive */
de3bb511 11980 case '_':
041457d9 11981 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 11982 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
11983 "Misplaced _ in number");
11984 lastub = s++;
de3bb511 11985 break;
02aa26ce
NT
11986
11987 /* 8 and 9 are not octal */
378cc40b 11988 case '8': case '9':
4f19785b 11989 if (shift == 3)
cea2e8a9 11990 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 11991 /* FALL THROUGH */
02aa26ce
NT
11992
11993 /* octal digits */
4f19785b 11994 case '2': case '3': case '4':
378cc40b 11995 case '5': case '6': case '7':
4f19785b 11996 if (shift == 1)
cea2e8a9 11997 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
11998 /* FALL THROUGH */
11999
12000 case '0': case '1':
02aa26ce 12001 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 12002 goto digit;
02aa26ce
NT
12003
12004 /* hex digits */
378cc40b
LW
12005 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12006 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 12007 /* make sure they said 0x */
378cc40b
LW
12008 if (shift != 4)
12009 goto out;
55497cff 12010 b = (*s++ & 7) + 9;
02aa26ce
NT
12011
12012 /* Prepare to put the digit we have onto the end
12013 of the number so far. We check for overflows.
12014 */
12015
55497cff 12016 digit:
61f33854 12017 just_zero = FALSE;
9e24b6e2
JH
12018 if (!overflowed) {
12019 x = u << shift; /* make room for the digit */
12020
12021 if ((x >> shift) != u
12022 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
12023 overflowed = TRUE;
12024 n = (NV) u;
767a6a26 12025 if (ckWARN_d(WARN_OVERFLOW))
9014280d 12026 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
9e24b6e2
JH
12027 "Integer overflow in %s number",
12028 base);
12029 } else
12030 u = x | b; /* add the digit to the end */
12031 }
12032 if (overflowed) {
12033 n *= nvshift[shift];
12034 /* If an NV has not enough bits in its
12035 * mantissa to represent an UV this summing of
12036 * small low-order numbers is a waste of time
12037 * (because the NV cannot preserve the
12038 * low-order bits anyway): we could just
12039 * remember when did we overflow and in the
12040 * end just multiply n by the right
12041 * amount. */
12042 n += (NV) b;
55497cff 12043 }
378cc40b
LW
12044 break;
12045 }
12046 }
02aa26ce
NT
12047
12048 /* if we get here, we had success: make a scalar value from
12049 the number.
12050 */
378cc40b 12051 out:
928753ea
JH
12052
12053 /* final misplaced underbar check */
12054 if (s[-1] == '_') {
12055 if (ckWARN(WARN_SYNTAX))
9014280d 12056 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
12057 }
12058
561b68a9 12059 sv = newSV(0);
9e24b6e2 12060 if (overflowed) {
041457d9 12061 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
9014280d 12062 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12063 "%s number > %s non-portable",
12064 Base, max);
12065 sv_setnv(sv, n);
12066 }
12067 else {
15041a67 12068#if UVSIZE > 4
041457d9 12069 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
9014280d 12070 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12071 "%s number > %s non-portable",
12072 Base, max);
2cc4c2dc 12073#endif
9e24b6e2
JH
12074 sv_setuv(sv, u);
12075 }
61f33854 12076 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
bfed75c6 12077 sv = new_constant(start, s - start, "integer",
a0714e2c 12078 sv, NULL, NULL);
61f33854 12079 else if (PL_hints & HINT_NEW_BINARY)
a0714e2c 12080 sv = new_constant(start, s - start, "binary", sv, NULL, NULL);
378cc40b
LW
12081 }
12082 break;
02aa26ce
NT
12083
12084 /*
12085 handle decimal numbers.
12086 we're also sent here when we read a 0 as the first digit
12087 */
378cc40b
LW
12088 case '1': case '2': case '3': case '4': case '5':
12089 case '6': case '7': case '8': case '9': case '.':
12090 decimal:
3280af22
NIS
12091 d = PL_tokenbuf;
12092 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 12093 floatit = FALSE;
02aa26ce
NT
12094
12095 /* read next group of digits and _ and copy into d */
de3bb511 12096 while (isDIGIT(*s) || *s == '_') {
4e553d73 12097 /* skip underscores, checking for misplaced ones
02aa26ce
NT
12098 if -w is on
12099 */
93a17b20 12100 if (*s == '_') {
041457d9 12101 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12102 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12103 "Misplaced _ in number");
12104 lastub = s++;
93a17b20 12105 }
fc36a67e 12106 else {
02aa26ce 12107 /* check for end of fixed-length buffer */
fc36a67e 12108 if (d >= e)
cea2e8a9 12109 Perl_croak(aTHX_ number_too_long);
02aa26ce 12110 /* if we're ok, copy the character */
378cc40b 12111 *d++ = *s++;
fc36a67e 12112 }
378cc40b 12113 }
02aa26ce
NT
12114
12115 /* final misplaced underbar check */
928753ea 12116 if (lastub && s == lastub + 1) {
d008e5eb 12117 if (ckWARN(WARN_SYNTAX))
9014280d 12118 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 12119 }
02aa26ce
NT
12120
12121 /* read a decimal portion if there is one. avoid
12122 3..5 being interpreted as the number 3. followed
12123 by .5
12124 */
2f3197b3 12125 if (*s == '.' && s[1] != '.') {
79072805 12126 floatit = TRUE;
378cc40b 12127 *d++ = *s++;
02aa26ce 12128
928753ea
JH
12129 if (*s == '_') {
12130 if (ckWARN(WARN_SYNTAX))
9014280d 12131 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12132 "Misplaced _ in number");
12133 lastub = s;
12134 }
12135
12136 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 12137 */
fc36a67e 12138 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 12139 /* fixed length buffer check */
fc36a67e 12140 if (d >= e)
cea2e8a9 12141 Perl_croak(aTHX_ number_too_long);
928753ea 12142 if (*s == '_') {
041457d9 12143 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12144 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12145 "Misplaced _ in number");
12146 lastub = s;
12147 }
12148 else
fc36a67e 12149 *d++ = *s;
378cc40b 12150 }
928753ea
JH
12151 /* fractional part ending in underbar? */
12152 if (s[-1] == '_') {
12153 if (ckWARN(WARN_SYNTAX))
9014280d 12154 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12155 "Misplaced _ in number");
12156 }
dd629d5b
GS
12157 if (*s == '.' && isDIGIT(s[1])) {
12158 /* oops, it's really a v-string, but without the "v" */
f4758303 12159 s = start;
dd629d5b
GS
12160 goto vstring;
12161 }
378cc40b 12162 }
02aa26ce
NT
12163
12164 /* read exponent part, if present */
3792a11b 12165 if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
79072805
LW
12166 floatit = TRUE;
12167 s++;
02aa26ce
NT
12168
12169 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 12170 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 12171
7fd134d9
JH
12172 /* stray preinitial _ */
12173 if (*s == '_') {
12174 if (ckWARN(WARN_SYNTAX))
9014280d 12175 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12176 "Misplaced _ in number");
12177 lastub = s++;
12178 }
12179
02aa26ce 12180 /* allow positive or negative exponent */
378cc40b
LW
12181 if (*s == '+' || *s == '-')
12182 *d++ = *s++;
02aa26ce 12183
7fd134d9
JH
12184 /* stray initial _ */
12185 if (*s == '_') {
12186 if (ckWARN(WARN_SYNTAX))
9014280d 12187 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12188 "Misplaced _ in number");
12189 lastub = s++;
12190 }
12191
7fd134d9
JH
12192 /* read digits of exponent */
12193 while (isDIGIT(*s) || *s == '_') {
12194 if (isDIGIT(*s)) {
12195 if (d >= e)
12196 Perl_croak(aTHX_ number_too_long);
b3b48e3e 12197 *d++ = *s++;
7fd134d9
JH
12198 }
12199 else {
041457d9
DM
12200 if (((lastub && s == lastub + 1) ||
12201 (!isDIGIT(s[1]) && s[1] != '_'))
12202 && ckWARN(WARN_SYNTAX))
9014280d 12203 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9 12204 "Misplaced _ in number");
b3b48e3e 12205 lastub = s++;
7fd134d9 12206 }
7fd134d9 12207 }
378cc40b 12208 }
02aa26ce 12209
02aa26ce
NT
12210
12211 /* make an sv from the string */
561b68a9 12212 sv = newSV(0);
097ee67d 12213
0b7fceb9 12214 /*
58bb9ec3
NC
12215 We try to do an integer conversion first if no characters
12216 indicating "float" have been found.
0b7fceb9
MU
12217 */
12218
12219 if (!floatit) {
58bb9ec3 12220 UV uv;
6136c704 12221 const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
58bb9ec3
NC
12222
12223 if (flags == IS_NUMBER_IN_UV) {
12224 if (uv <= IV_MAX)
86554af2 12225 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 12226 else
c239479b 12227 sv_setuv(sv, uv);
58bb9ec3
NC
12228 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
12229 if (uv <= (UV) IV_MIN)
12230 sv_setiv(sv, -(IV)uv);
12231 else
12232 floatit = TRUE;
12233 } else
12234 floatit = TRUE;
12235 }
0b7fceb9 12236 if (floatit) {
58bb9ec3
NC
12237 /* terminate the string */
12238 *d = '\0';
86554af2
JH
12239 nv = Atof(PL_tokenbuf);
12240 sv_setnv(sv, nv);
12241 }
86554af2 12242
b8403495
JH
12243 if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
12244 (PL_hints & HINT_NEW_INTEGER) )
10edeb5d
JH
12245 sv = new_constant(PL_tokenbuf,
12246 d - PL_tokenbuf,
12247 (const char *)
b8403495 12248 (floatit ? "float" : "integer"),
a0714e2c 12249 sv, NULL, NULL);
378cc40b 12250 break;
0b7fceb9 12251
e312add1 12252 /* if it starts with a v, it could be a v-string */
a7cb1f99 12253 case 'v':
dd629d5b 12254vstring:
561b68a9 12255 sv = newSV(5); /* preallocate storage space */
65b06e02 12256 s = scan_vstring(s, PL_bufend, sv);
a7cb1f99 12257 break;
79072805 12258 }
a687059c 12259
02aa26ce
NT
12260 /* make the op for the constant and return */
12261
a86a20aa 12262 if (sv)
b73d6f50 12263 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 12264 else
5f66b61c 12265 lvalp->opval = NULL;
a687059c 12266
73d840c0 12267 return (char *)s;
378cc40b
LW
12268}
12269
76e3520e 12270STATIC char *
cea2e8a9 12271S_scan_formline(pTHX_ register char *s)
378cc40b 12272{
97aff369 12273 dVAR;
79072805 12274 register char *eol;
378cc40b 12275 register char *t;
6136c704 12276 SV * const stuff = newSVpvs("");
79072805 12277 bool needargs = FALSE;
c5ee2135 12278 bool eofmt = FALSE;
5db06880
NC
12279#ifdef PERL_MAD
12280 char *tokenstart = s;
12281 SV* savewhite;
12282
12283 if (PL_madskills) {
cd81e915
NC
12284 savewhite = PL_thiswhite;
12285 PL_thiswhite = 0;
5db06880
NC
12286 }
12287#endif
378cc40b 12288
79072805 12289 while (!needargs) {
a1b95068 12290 if (*s == '.') {
c35e046a 12291 t = s+1;
51882d45 12292#ifdef PERL_STRICT_CR
c35e046a
AL
12293 while (SPACE_OR_TAB(*t))
12294 t++;
51882d45 12295#else
c35e046a
AL
12296 while (SPACE_OR_TAB(*t) || *t == '\r')
12297 t++;
51882d45 12298#endif
c5ee2135
WL
12299 if (*t == '\n' || t == PL_bufend) {
12300 eofmt = TRUE;
79072805 12301 break;
c5ee2135 12302 }
79072805 12303 }
3280af22 12304 if (PL_in_eval && !PL_rsfp) {
07409e01 12305 eol = (char *) memchr(s,'\n',PL_bufend-s);
0f85fab0 12306 if (!eol++)
3280af22 12307 eol = PL_bufend;
0f85fab0
LW
12308 }
12309 else
3280af22 12310 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 12311 if (*s != '#') {
a0d0e21e
LW
12312 for (t = s; t < eol; t++) {
12313 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
12314 needargs = FALSE;
12315 goto enough; /* ~~ must be first line in formline */
378cc40b 12316 }
a0d0e21e
LW
12317 if (*t == '@' || *t == '^')
12318 needargs = TRUE;
378cc40b 12319 }
7121b347
MG
12320 if (eol > s) {
12321 sv_catpvn(stuff, s, eol-s);
2dc4c65b 12322#ifndef PERL_STRICT_CR
7121b347
MG
12323 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
12324 char *end = SvPVX(stuff) + SvCUR(stuff);
12325 end[-2] = '\n';
12326 end[-1] = '\0';
b162af07 12327 SvCUR_set(stuff, SvCUR(stuff) - 1);
7121b347 12328 }
2dc4c65b 12329#endif
7121b347
MG
12330 }
12331 else
12332 break;
79072805 12333 }
95a20fc0 12334 s = (char*)eol;
3280af22 12335 if (PL_rsfp) {
5db06880
NC
12336#ifdef PERL_MAD
12337 if (PL_madskills) {
cd81e915
NC
12338 if (PL_thistoken)
12339 sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
5db06880 12340 else
cd81e915 12341 PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
5db06880
NC
12342 }
12343#endif
3280af22 12344 s = filter_gets(PL_linestr, PL_rsfp, 0);
5db06880
NC
12345#ifdef PERL_MAD
12346 tokenstart = PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
12347#else
3280af22 12348 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
5db06880 12349#endif
3280af22 12350 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
bd61b366 12351 PL_last_lop = PL_last_uni = NULL;
79072805 12352 if (!s) {
3280af22 12353 s = PL_bufptr;
378cc40b
LW
12354 break;
12355 }
378cc40b 12356 }
463ee0b2 12357 incline(s);
79072805 12358 }
a0d0e21e
LW
12359 enough:
12360 if (SvCUR(stuff)) {
3280af22 12361 PL_expect = XTERM;
79072805 12362 if (needargs) {
3280af22 12363 PL_lex_state = LEX_NORMAL;
cd81e915 12364 start_force(PL_curforce);
9ded7720 12365 NEXTVAL_NEXTTOKE.ival = 0;
79072805
LW
12366 force_next(',');
12367 }
a0d0e21e 12368 else
3280af22 12369 PL_lex_state = LEX_FORMLINE;
1bd51a4c 12370 if (!IN_BYTES) {
95a20fc0 12371 if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
1bd51a4c
IH
12372 SvUTF8_on(stuff);
12373 else if (PL_encoding)
12374 sv_recode_to_utf8(stuff, PL_encoding);
12375 }
cd81e915 12376 start_force(PL_curforce);
9ded7720 12377 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 12378 force_next(THING);
cd81e915 12379 start_force(PL_curforce);
9ded7720 12380 NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
79072805 12381 force_next(LSTOP);
378cc40b 12382 }
79072805 12383 else {
8990e307 12384 SvREFCNT_dec(stuff);
c5ee2135
WL
12385 if (eofmt)
12386 PL_lex_formbrack = 0;
3280af22 12387 PL_bufptr = s;
79072805 12388 }
5db06880
NC
12389#ifdef PERL_MAD
12390 if (PL_madskills) {
cd81e915
NC
12391 if (PL_thistoken)
12392 sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
5db06880 12393 else
cd81e915
NC
12394 PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
12395 PL_thiswhite = savewhite;
5db06880
NC
12396 }
12397#endif
79072805 12398 return s;
378cc40b 12399}
a687059c 12400
76e3520e 12401STATIC void
cea2e8a9 12402S_set_csh(pTHX)
a687059c 12403{
ae986130 12404#ifdef CSH
97aff369 12405 dVAR;
3280af22
NIS
12406 if (!PL_cshlen)
12407 PL_cshlen = strlen(PL_cshname);
5f66b61c 12408#else
b2675967 12409#if defined(USE_ITHREADS)
96a5add6 12410 PERL_UNUSED_CONTEXT;
ae986130 12411#endif
b2675967 12412#endif
a687059c 12413}
463ee0b2 12414
ba6d6ac9 12415I32
864dbfa3 12416Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 12417{
97aff369 12418 dVAR;
a3b680e6 12419 const I32 oldsavestack_ix = PL_savestack_ix;
6136c704 12420 CV* const outsidecv = PL_compcv;
8990e307 12421
3280af22
NIS
12422 if (PL_compcv) {
12423 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 12424 }
7766f137 12425 SAVEI32(PL_subline);
3280af22 12426 save_item(PL_subname);
3280af22 12427 SAVESPTR(PL_compcv);
3280af22 12428
b9f83d2f 12429 PL_compcv = (CV*)newSV_type(is_format ? SVt_PVFM : SVt_PVCV);
3280af22
NIS
12430 CvFLAGS(PL_compcv) |= flags;
12431
57843af0 12432 PL_subline = CopLINE(PL_curcop);
dd2155a4 12433 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
b37c2d43 12434 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc_simple(outsidecv);
a3985cdc 12435 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 12436
8990e307
LW
12437 return oldsavestack_ix;
12438}
12439
084592ab
CN
12440#ifdef __SC__
12441#pragma segment Perl_yylex
12442#endif
8990e307 12443int
bfed75c6 12444Perl_yywarn(pTHX_ const char *s)
8990e307 12445{
97aff369 12446 dVAR;
faef0170 12447 PL_in_eval |= EVAL_WARNONLY;
748a9306 12448 yyerror(s);
faef0170 12449 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 12450 return 0;
8990e307
LW
12451}
12452
12453int
bfed75c6 12454Perl_yyerror(pTHX_ const char *s)
463ee0b2 12455{
97aff369 12456 dVAR;
bfed75c6
AL
12457 const char *where = NULL;
12458 const char *context = NULL;
68dc0745 12459 int contlen = -1;
46fc3d4c 12460 SV *msg;
5912531f 12461 int yychar = PL_parser->yychar;
463ee0b2 12462
3280af22 12463 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 12464 where = "at EOF";
8bcfe651
TM
12465 else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
12466 PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
12467 PL_oldbufptr != PL_bufptr) {
f355267c
JH
12468 /*
12469 Only for NetWare:
12470 The code below is removed for NetWare because it abends/crashes on NetWare
12471 when the script has error such as not having the closing quotes like:
12472 if ($var eq "value)
12473 Checking of white spaces is anyway done in NetWare code.
12474 */
12475#ifndef NETWARE
3280af22
NIS
12476 while (isSPACE(*PL_oldoldbufptr))
12477 PL_oldoldbufptr++;
f355267c 12478#endif
3280af22
NIS
12479 context = PL_oldoldbufptr;
12480 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 12481 }
8bcfe651
TM
12482 else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
12483 PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
f355267c
JH
12484 /*
12485 Only for NetWare:
12486 The code below is removed for NetWare because it abends/crashes on NetWare
12487 when the script has error such as not having the closing quotes like:
12488 if ($var eq "value)
12489 Checking of white spaces is anyway done in NetWare code.
12490 */
12491#ifndef NETWARE
3280af22
NIS
12492 while (isSPACE(*PL_oldbufptr))
12493 PL_oldbufptr++;
f355267c 12494#endif
3280af22
NIS
12495 context = PL_oldbufptr;
12496 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
12497 }
12498 else if (yychar > 255)
68dc0745 12499 where = "next token ???";
12fbd33b 12500 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
12501 if (PL_lex_state == LEX_NORMAL ||
12502 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 12503 where = "at end of line";
3280af22 12504 else if (PL_lex_inpat)
68dc0745 12505 where = "within pattern";
463ee0b2 12506 else
68dc0745 12507 where = "within string";
463ee0b2 12508 }
46fc3d4c 12509 else {
6136c704 12510 SV * const where_sv = sv_2mortal(newSVpvs("next char "));
46fc3d4c 12511 if (yychar < 32)
cea2e8a9 12512 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
5e7aa789
NC
12513 else if (isPRINT_LC(yychar)) {
12514 const unsigned char string = (unsigned char) yychar;
12515 sv_catpvn(where_sv, &string, 1);
12516 }
463ee0b2 12517 else
cea2e8a9 12518 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
95a20fc0 12519 where = SvPVX_const(where_sv);
463ee0b2 12520 }
46fc3d4c 12521 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 12522 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 12523 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 12524 if (context)
cea2e8a9 12525 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 12526 else
cea2e8a9 12527 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 12528 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 12529 Perl_sv_catpvf(aTHX_ msg,
57def98f 12530 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 12531 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 12532 PL_multi_end = 0;
a0d0e21e 12533 }
500960a6
RD
12534 if (PL_in_eval & EVAL_WARNONLY) {
12535 if (ckWARN_d(WARN_SYNTAX))
12536 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
12537 }
463ee0b2 12538 else
5a844595 12539 qerror(msg);
c7d6bfb2
GS
12540 if (PL_error_count >= 10) {
12541 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 12542 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
be2597df 12543 SVfARG(ERRSV), OutCopFILE(PL_curcop));
c7d6bfb2
GS
12544 else
12545 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 12546 OutCopFILE(PL_curcop));
c7d6bfb2 12547 }
3280af22 12548 PL_in_my = 0;
5c284bb0 12549 PL_in_my_stash = NULL;
463ee0b2
LW
12550 return 0;
12551}
084592ab
CN
12552#ifdef __SC__
12553#pragma segment Main
12554#endif
4e35701f 12555
b250498f 12556STATIC char*
3ae08724 12557S_swallow_bom(pTHX_ U8 *s)
01ec43d0 12558{
97aff369 12559 dVAR;
f54cb97a 12560 const STRLEN slen = SvCUR(PL_linestr);
7aa207d6 12561 switch (s[0]) {
4e553d73
NIS
12562 case 0xFF:
12563 if (s[1] == 0xFE) {
7aa207d6 12564 /* UTF-16 little-endian? (or UTF32-LE?) */
3ae08724 12565 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
7aa207d6 12566 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
01ec43d0 12567#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12568 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
3ae08724 12569 s += 2;
7aa207d6 12570 utf16le:
dea0fc0b
JH
12571 if (PL_bufend > (char*)s) {
12572 U8 *news;
12573 I32 newlen;
12574
12575 filter_add(utf16rev_textfilter, NULL);
a02a5408 12576 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd 12577 utf16_to_utf8_reversed(s, news,
aed58286 12578 PL_bufend - (char*)s - 1,
1de9afcd 12579 &newlen);
7aa207d6 12580 sv_setpvn(PL_linestr, (const char*)news, newlen);
5db06880
NC
12581#ifdef PERL_MAD
12582 s = (U8*)SvPVX(PL_linestr);
12583 Copy(news, s, newlen, U8);
12584 s[newlen] = '\0';
12585#endif
dea0fc0b 12586 Safefree(news);
7aa207d6
JH
12587 SvUTF8_on(PL_linestr);
12588 s = (U8*)SvPVX(PL_linestr);
5db06880
NC
12589#ifdef PERL_MAD
12590 /* FIXME - is this a general bug fix? */
12591 s[newlen] = '\0';
12592#endif
7aa207d6 12593 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12594 }
b250498f 12595#else
7aa207d6 12596 Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
b250498f 12597#endif
01ec43d0
GS
12598 }
12599 break;
78ae23f5 12600 case 0xFE:
7aa207d6 12601 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 12602#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12603 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b 12604 s += 2;
7aa207d6 12605 utf16be:
dea0fc0b
JH
12606 if (PL_bufend > (char *)s) {
12607 U8 *news;
12608 I32 newlen;
12609
12610 filter_add(utf16_textfilter, NULL);
a02a5408 12611 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
12612 utf16_to_utf8(s, news,
12613 PL_bufend - (char*)s,
12614 &newlen);
7aa207d6 12615 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 12616 Safefree(news);
7aa207d6
JH
12617 SvUTF8_on(PL_linestr);
12618 s = (U8*)SvPVX(PL_linestr);
12619 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12620 }
b250498f 12621#else
7aa207d6 12622 Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
b250498f 12623#endif
01ec43d0
GS
12624 }
12625 break;
3ae08724
GS
12626 case 0xEF:
12627 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 12628 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
12629 s += 3; /* UTF-8 */
12630 }
12631 break;
12632 case 0:
7aa207d6
JH
12633 if (slen > 3) {
12634 if (s[1] == 0) {
12635 if (s[2] == 0xFE && s[3] == 0xFF) {
12636 /* UTF-32 big-endian */
12637 Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
12638 }
12639 }
12640 else if (s[2] == 0 && s[3] != 0) {
12641 /* Leading bytes
12642 * 00 xx 00 xx
12643 * are a good indicator of UTF-16BE. */
12644 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
12645 goto utf16be;
12646 }
01ec43d0 12647 }
e294cc5d
JH
12648#ifdef EBCDIC
12649 case 0xDD:
12650 if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
12651 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
12652 s += 4; /* UTF-8 */
12653 }
12654 break;
12655#endif
12656
7aa207d6
JH
12657 default:
12658 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
12659 /* Leading bytes
12660 * xx 00 xx 00
12661 * are a good indicator of UTF-16LE. */
12662 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
12663 goto utf16le;
12664 }
01ec43d0 12665 }
b8f84bb2 12666 return (char*)s;
b250498f 12667}
4755096e 12668
6e3aabd6
GS
12669
12670#ifndef PERL_NO_UTF16_FILTER
12671static I32
acfe0abc 12672utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12673{
97aff369 12674 dVAR;
f54cb97a
AL
12675 const STRLEN old = SvCUR(sv);
12676 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12677 DEBUG_P(PerlIO_printf(Perl_debug_log,
12678 "utf16_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12679 FPTR2DPTR(void *, utf16_textfilter),
12680 idx, maxlen, (int) count));
6e3aabd6
GS
12681 if (count) {
12682 U8* tmps;
dea0fc0b 12683 I32 newlen;
a02a5408 12684 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12685 Copy(SvPVX_const(sv), tmps, old, char);
12686 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12687 SvCUR(sv) - old, &newlen);
12688 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12689 }
1de9afcd
RGS
12690 DEBUG_P({sv_dump(sv);});
12691 return SvCUR(sv);
6e3aabd6
GS
12692}
12693
12694static I32
acfe0abc 12695utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12696{
97aff369 12697 dVAR;
f54cb97a
AL
12698 const STRLEN old = SvCUR(sv);
12699 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12700 DEBUG_P(PerlIO_printf(Perl_debug_log,
12701 "utf16rev_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12702 FPTR2DPTR(void *, utf16rev_textfilter),
12703 idx, maxlen, (int) count));
6e3aabd6
GS
12704 if (count) {
12705 U8* tmps;
dea0fc0b 12706 I32 newlen;
a02a5408 12707 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12708 Copy(SvPVX_const(sv), tmps, old, char);
12709 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12710 SvCUR(sv) - old, &newlen);
12711 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12712 }
1de9afcd 12713 DEBUG_P({ sv_dump(sv); });
6e3aabd6
GS
12714 return count;
12715}
12716#endif
9f4817db 12717
f333445c
JP
12718/*
12719Returns a pointer to the next character after the parsed
12720vstring, as well as updating the passed in sv.
12721
12722Function must be called like
12723
561b68a9 12724 sv = newSV(5);
65b06e02 12725 s = scan_vstring(s,e,sv);
f333445c 12726
65b06e02 12727where s and e are the start and end of the string.
f333445c
JP
12728The sv should already be large enough to store the vstring
12729passed in, for performance reasons.
12730
12731*/
12732
12733char *
65b06e02 12734Perl_scan_vstring(pTHX_ const char *s, const char *e, SV *sv)
f333445c 12735{
97aff369 12736 dVAR;
bfed75c6
AL
12737 const char *pos = s;
12738 const char *start = s;
f333445c 12739 if (*pos == 'v') pos++; /* get past 'v' */
65b06e02 12740 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
3e884cbf 12741 pos++;
f333445c
JP
12742 if ( *pos != '.') {
12743 /* this may not be a v-string if followed by => */
bfed75c6 12744 const char *next = pos;
65b06e02 12745 while (next < e && isSPACE(*next))
8fc7bb1c 12746 ++next;
65b06e02 12747 if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
12748 /* return string not v-string */
12749 sv_setpvn(sv,(char *)s,pos-s);
73d840c0 12750 return (char *)pos;
f333445c
JP
12751 }
12752 }
12753
12754 if (!isALPHA(*pos)) {
89ebb4a3 12755 U8 tmpbuf[UTF8_MAXBYTES+1];
f333445c 12756
d4c19fe8
AL
12757 if (*s == 'v')
12758 s++; /* get past 'v' */
f333445c
JP
12759
12760 sv_setpvn(sv, "", 0);
12761
12762 for (;;) {
d4c19fe8 12763 /* this is atoi() that tolerates underscores */
0bd48802
AL
12764 U8 *tmpend;
12765 UV rev = 0;
d4c19fe8
AL
12766 const char *end = pos;
12767 UV mult = 1;
12768 while (--end >= s) {
12769 if (*end != '_') {
12770 const UV orev = rev;
f333445c
JP
12771 rev += (*end - '0') * mult;
12772 mult *= 10;
12773 if (orev > rev && ckWARN_d(WARN_OVERFLOW))
12774 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
12775 "Integer overflow in decimal number");
12776 }
12777 }
12778#ifdef EBCDIC
12779 if (rev > 0x7FFFFFFF)
12780 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
12781#endif
12782 /* Append native character for the rev point */
12783 tmpend = uvchr_to_utf8(tmpbuf, rev);
12784 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
12785 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
12786 SvUTF8_on(sv);
65b06e02 12787 if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
12788 s = ++pos;
12789 else {
12790 s = pos;
12791 break;
12792 }
65b06e02 12793 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
12794 pos++;
12795 }
12796 SvPOK_on(sv);
12797 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
12798 SvRMAGICAL_on(sv);
12799 }
73d840c0 12800 return (char *)s;
f333445c
JP
12801}
12802
1da4ca5f
NC
12803/*
12804 * Local variables:
12805 * c-indentation-style: bsd
12806 * c-basic-offset: 4
12807 * indent-tabs-mode: t
12808 * End:
12809 *
37442d52
RGS
12810 * ex: set ts=8 sts=4 sw=4 noet:
12811 */