This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix two errors in the OP debugging code. Now all test errors relate
[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)
52
53#ifdef PERL_MAD
54# define PL_endwhite (PL_parser->endwhite)
55# define PL_faketokens (PL_parser->faketokens)
56# define PL_lasttoke (PL_parser->lasttoke)
57# define PL_nextwhite (PL_parser->nextwhite)
58# define PL_realtokenstart (PL_parser->realtokenstart)
59# define PL_skipwhite (PL_parser->skipwhite)
60# define PL_thisclose (PL_parser->thisclose)
61# define PL_thismad (PL_parser->thismad)
62# define PL_thisopen (PL_parser->thisopen)
63# define PL_thisstuff (PL_parser->thisstuff)
64# define PL_thistoken (PL_parser->thistoken)
65# define PL_thiswhite (PL_parser->thiswhite)
66#endif
67
3cbf51f5
DM
68static int
69S_pending_ident(pTHX);
199e78b7 70
0bd48802 71static const char ident_too_long[] = "Identifier too long";
c445ea15 72static const char commaless_variable_list[] = "comma-less variable list";
8903cb82 73
acfe0abc 74static void restore_rsfp(pTHX_ void *f);
6e3aabd6 75#ifndef PERL_NO_UTF16_FILTER
acfe0abc
GS
76static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
77static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
6e3aabd6 78#endif
51371543 79
29595ff2 80#ifdef PERL_MAD
29595ff2 81# define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
cd81e915 82# define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
9ded7720 83#else
5db06880 84# define CURMAD(slot,sv)
9ded7720 85# define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
29595ff2
NC
86#endif
87
9059aa12
LW
88#define XFAKEBRACK 128
89#define XENUMMASK 127
90
39e02b42
JH
91#ifdef USE_UTF8_SCRIPTS
92# define UTF (!IN_BYTES)
2b9d42f0 93#else
746b446a 94# define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
2b9d42f0 95#endif
a0ed51b3 96
61f0cdd9 97/* In variables named $^X, these are the legal values for X.
2b92dfce
GS
98 * 1999-02-27 mjd-perl-patch@plover.com */
99#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
100
bf4acbe4
GS
101/* On MacOS, respect nonbreaking spaces */
102#ifdef MACOS_TRADITIONAL
103#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
104#else
105#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
106#endif
107
ffb4593c
NT
108/* LEX_* are values for PL_lex_state, the state of the lexer.
109 * They are arranged oddly so that the guard on the switch statement
79072805
LW
110 * can get by with a single comparison (if the compiler is smart enough).
111 */
112
fb73857a 113/* #define LEX_NOTPARSING 11 is done in perl.h. */
114
b6007c36
DM
115#define LEX_NORMAL 10 /* normal code (ie not within "...") */
116#define LEX_INTERPNORMAL 9 /* code within a string, eg "$foo[$x+1]" */
117#define LEX_INTERPCASEMOD 8 /* expecting a \U, \Q or \E etc */
118#define LEX_INTERPPUSH 7 /* starting a new sublex parse level */
119#define LEX_INTERPSTART 6 /* expecting the start of a $var */
120
121 /* at end of code, eg "$x" followed by: */
122#define LEX_INTERPEND 5 /* ... eg not one of [, { or -> */
123#define LEX_INTERPENDMAYBE 4 /* ... eg one of [, { or -> */
124
125#define LEX_INTERPCONCAT 3 /* expecting anything, eg at start of
126 string or after \E, $foo, etc */
127#define LEX_INTERPCONST 2 /* NOT USED */
128#define LEX_FORMLINE 1 /* expecting a format line */
129#define LEX_KNOWNEXT 0 /* next token known; just return it */
130
79072805 131
bbf60fe6 132#ifdef DEBUGGING
27da23d5 133static const char* const lex_state_names[] = {
bbf60fe6
DM
134 "KNOWNEXT",
135 "FORMLINE",
136 "INTERPCONST",
137 "INTERPCONCAT",
138 "INTERPENDMAYBE",
139 "INTERPEND",
140 "INTERPSTART",
141 "INTERPPUSH",
142 "INTERPCASEMOD",
143 "INTERPNORMAL",
144 "NORMAL"
145};
146#endif
147
79072805
LW
148#ifdef ff_next
149#undef ff_next
d48672a2
LW
150#endif
151
79072805 152#include "keywords.h"
fe14fcc3 153
ffb4593c
NT
154/* CLINE is a macro that ensures PL_copline has a sane value */
155
ae986130
LW
156#ifdef CLINE
157#undef CLINE
158#endif
57843af0 159#define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
3280af22 160
5db06880 161#ifdef PERL_MAD
29595ff2
NC
162# define SKIPSPACE0(s) skipspace0(s)
163# define SKIPSPACE1(s) skipspace1(s)
164# define SKIPSPACE2(s,tsv) skipspace2(s,&tsv)
165# define PEEKSPACE(s) skipspace2(s,0)
166#else
167# define SKIPSPACE0(s) skipspace(s)
168# define SKIPSPACE1(s) skipspace(s)
169# define SKIPSPACE2(s,tsv) skipspace(s)
170# define PEEKSPACE(s) skipspace(s)
171#endif
172
ffb4593c
NT
173/*
174 * Convenience functions to return different tokens and prime the
9cbb5ea2 175 * lexer for the next token. They all take an argument.
ffb4593c
NT
176 *
177 * TOKEN : generic token (used for '(', DOLSHARP, etc)
178 * OPERATOR : generic operator
179 * AOPERATOR : assignment operator
180 * PREBLOCK : beginning the block after an if, while, foreach, ...
181 * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
182 * PREREF : *EXPR where EXPR is not a simple identifier
183 * TERM : expression term
184 * LOOPX : loop exiting command (goto, last, dump, etc)
185 * FTST : file test operator
186 * FUN0 : zero-argument function
2d2e263d 187 * FUN1 : not used, except for not, which isn't a UNIOP
ffb4593c
NT
188 * BOop : bitwise or or xor
189 * BAop : bitwise and
190 * SHop : shift operator
191 * PWop : power operator
9cbb5ea2 192 * PMop : pattern-matching operator
ffb4593c
NT
193 * Aop : addition-level operator
194 * Mop : multiplication-level operator
195 * Eop : equality-testing operator
e5edeb50 196 * Rop : relational operator <= != gt
ffb4593c
NT
197 *
198 * Also see LOP and lop() below.
199 */
200
998054bd 201#ifdef DEBUGGING /* Serve -DT. */
f5bd084c 202# define REPORT(retval) tokereport((I32)retval)
998054bd 203#else
bbf60fe6 204# define REPORT(retval) (retval)
998054bd
SC
205#endif
206
bbf60fe6
DM
207#define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
208#define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
209#define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
210#define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
211#define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
212#define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
213#define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
214#define LOOPX(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
215#define FTST(f) return (yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
216#define FUN0(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
217#define FUN1(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
218#define BOop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
219#define BAop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
220#define SHop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
221#define PWop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
222#define PMop(f) return(yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
223#define Aop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
224#define Mop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
225#define Eop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
226#define Rop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
2f3197b3 227
a687059c
LW
228/* This bit of chicanery makes a unary function followed by
229 * a parenthesis into a function with one argument, highest precedence.
6f33ba73
RGS
230 * The UNIDOR macro is for unary functions that can be followed by the //
231 * operator (such as C<shift // 0>).
a687059c 232 */
376fcdbf
AL
233#define UNI2(f,x) { \
234 yylval.ival = f; \
235 PL_expect = x; \
236 PL_bufptr = s; \
237 PL_last_uni = PL_oldbufptr; \
238 PL_last_lop_op = f; \
239 if (*s == '(') \
240 return REPORT( (int)FUNC1 ); \
29595ff2 241 s = PEEKSPACE(s); \
376fcdbf
AL
242 return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
243 }
6f33ba73
RGS
244#define UNI(f) UNI2(f,XTERM)
245#define UNIDOR(f) UNI2(f,XTERMORDORDOR)
a687059c 246
376fcdbf
AL
247#define UNIBRACK(f) { \
248 yylval.ival = f; \
249 PL_bufptr = s; \
250 PL_last_uni = PL_oldbufptr; \
251 if (*s == '(') \
252 return REPORT( (int)FUNC1 ); \
29595ff2 253 s = PEEKSPACE(s); \
376fcdbf
AL
254 return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
255 }
79072805 256
9f68db38 257/* grandfather return to old style */
3280af22 258#define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
79072805 259
8fa7f367
JH
260#ifdef DEBUGGING
261
bbf60fe6
DM
262/* how to interpret the yylval associated with the token */
263enum token_type {
264 TOKENTYPE_NONE,
265 TOKENTYPE_IVAL,
266 TOKENTYPE_OPNUM, /* yylval.ival contains an opcode number */
267 TOKENTYPE_PVAL,
268 TOKENTYPE_OPVAL,
269 TOKENTYPE_GVVAL
270};
271
6d4a66ac
NC
272static struct debug_tokens {
273 const int token;
274 enum token_type type;
275 const char *name;
276} const debug_tokens[] =
9041c2e3 277{
bbf60fe6
DM
278 { ADDOP, TOKENTYPE_OPNUM, "ADDOP" },
279 { ANDAND, TOKENTYPE_NONE, "ANDAND" },
280 { ANDOP, TOKENTYPE_NONE, "ANDOP" },
281 { ANONSUB, TOKENTYPE_IVAL, "ANONSUB" },
282 { ARROW, TOKENTYPE_NONE, "ARROW" },
283 { ASSIGNOP, TOKENTYPE_OPNUM, "ASSIGNOP" },
284 { BITANDOP, TOKENTYPE_OPNUM, "BITANDOP" },
285 { BITOROP, TOKENTYPE_OPNUM, "BITOROP" },
286 { COLONATTR, TOKENTYPE_NONE, "COLONATTR" },
287 { CONTINUE, TOKENTYPE_NONE, "CONTINUE" },
0d863452 288 { DEFAULT, TOKENTYPE_NONE, "DEFAULT" },
bbf60fe6
DM
289 { DO, TOKENTYPE_NONE, "DO" },
290 { DOLSHARP, TOKENTYPE_NONE, "DOLSHARP" },
291 { DORDOR, TOKENTYPE_NONE, "DORDOR" },
292 { DOROP, TOKENTYPE_OPNUM, "DOROP" },
293 { DOTDOT, TOKENTYPE_IVAL, "DOTDOT" },
294 { ELSE, TOKENTYPE_NONE, "ELSE" },
295 { ELSIF, TOKENTYPE_IVAL, "ELSIF" },
296 { EQOP, TOKENTYPE_OPNUM, "EQOP" },
297 { FOR, TOKENTYPE_IVAL, "FOR" },
298 { FORMAT, TOKENTYPE_NONE, "FORMAT" },
299 { FUNC, TOKENTYPE_OPNUM, "FUNC" },
300 { FUNC0, TOKENTYPE_OPNUM, "FUNC0" },
301 { FUNC0SUB, TOKENTYPE_OPVAL, "FUNC0SUB" },
302 { FUNC1, TOKENTYPE_OPNUM, "FUNC1" },
303 { FUNCMETH, TOKENTYPE_OPVAL, "FUNCMETH" },
0d863452 304 { GIVEN, TOKENTYPE_IVAL, "GIVEN" },
bbf60fe6
DM
305 { HASHBRACK, TOKENTYPE_NONE, "HASHBRACK" },
306 { IF, TOKENTYPE_IVAL, "IF" },
307 { LABEL, TOKENTYPE_PVAL, "LABEL" },
308 { LOCAL, TOKENTYPE_IVAL, "LOCAL" },
309 { LOOPEX, TOKENTYPE_OPNUM, "LOOPEX" },
310 { LSTOP, TOKENTYPE_OPNUM, "LSTOP" },
311 { LSTOPSUB, TOKENTYPE_OPVAL, "LSTOPSUB" },
312 { MATCHOP, TOKENTYPE_OPNUM, "MATCHOP" },
313 { METHOD, TOKENTYPE_OPVAL, "METHOD" },
314 { MULOP, TOKENTYPE_OPNUM, "MULOP" },
315 { MY, TOKENTYPE_IVAL, "MY" },
316 { MYSUB, TOKENTYPE_NONE, "MYSUB" },
317 { NOAMP, TOKENTYPE_NONE, "NOAMP" },
318 { NOTOP, TOKENTYPE_NONE, "NOTOP" },
319 { OROP, TOKENTYPE_IVAL, "OROP" },
320 { OROR, TOKENTYPE_NONE, "OROR" },
321 { PACKAGE, TOKENTYPE_NONE, "PACKAGE" },
322 { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" },
323 { POSTDEC, TOKENTYPE_NONE, "POSTDEC" },
324 { POSTINC, TOKENTYPE_NONE, "POSTINC" },
325 { POWOP, TOKENTYPE_OPNUM, "POWOP" },
326 { PREDEC, TOKENTYPE_NONE, "PREDEC" },
327 { PREINC, TOKENTYPE_NONE, "PREINC" },
328 { PRIVATEREF, TOKENTYPE_OPVAL, "PRIVATEREF" },
329 { REFGEN, TOKENTYPE_NONE, "REFGEN" },
330 { RELOP, TOKENTYPE_OPNUM, "RELOP" },
331 { SHIFTOP, TOKENTYPE_OPNUM, "SHIFTOP" },
332 { SUB, TOKENTYPE_NONE, "SUB" },
333 { THING, TOKENTYPE_OPVAL, "THING" },
334 { UMINUS, TOKENTYPE_NONE, "UMINUS" },
335 { UNIOP, TOKENTYPE_OPNUM, "UNIOP" },
336 { UNIOPSUB, TOKENTYPE_OPVAL, "UNIOPSUB" },
337 { UNLESS, TOKENTYPE_IVAL, "UNLESS" },
338 { UNTIL, TOKENTYPE_IVAL, "UNTIL" },
339 { USE, TOKENTYPE_IVAL, "USE" },
0d863452 340 { WHEN, TOKENTYPE_IVAL, "WHEN" },
bbf60fe6
DM
341 { WHILE, TOKENTYPE_IVAL, "WHILE" },
342 { WORD, TOKENTYPE_OPVAL, "WORD" },
c35e046a 343 { 0, TOKENTYPE_NONE, NULL }
bbf60fe6
DM
344};
345
346/* dump the returned token in rv, plus any optional arg in yylval */
998054bd 347
bbf60fe6 348STATIC int
f5bd084c 349S_tokereport(pTHX_ I32 rv)
bbf60fe6 350{
97aff369 351 dVAR;
bbf60fe6 352 if (DEBUG_T_TEST) {
bd61b366 353 const char *name = NULL;
bbf60fe6 354 enum token_type type = TOKENTYPE_NONE;
f54cb97a 355 const struct debug_tokens *p;
396482e1 356 SV* const report = newSVpvs("<== ");
bbf60fe6 357
f54cb97a 358 for (p = debug_tokens; p->token; p++) {
bbf60fe6
DM
359 if (p->token == (int)rv) {
360 name = p->name;
361 type = p->type;
362 break;
363 }
364 }
365 if (name)
54667de8 366 Perl_sv_catpv(aTHX_ report, name);
bbf60fe6
DM
367 else if ((char)rv > ' ' && (char)rv < '~')
368 Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
369 else if (!rv)
396482e1 370 sv_catpvs(report, "EOF");
bbf60fe6
DM
371 else
372 Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
373 switch (type) {
374 case TOKENTYPE_NONE:
375 case TOKENTYPE_GVVAL: /* doesn't appear to be used */
376 break;
377 case TOKENTYPE_IVAL:
e4584336 378 Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)yylval.ival);
bbf60fe6
DM
379 break;
380 case TOKENTYPE_OPNUM:
381 Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
382 PL_op_name[yylval.ival]);
383 break;
384 case TOKENTYPE_PVAL:
385 Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", yylval.pval);
386 break;
387 case TOKENTYPE_OPVAL:
b6007c36 388 if (yylval.opval) {
401441c0 389 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
bbf60fe6 390 PL_op_name[yylval.opval->op_type]);
b6007c36
DM
391 if (yylval.opval->op_type == OP_CONST) {
392 Perl_sv_catpvf(aTHX_ report, " %s",
393 SvPEEK(cSVOPx_sv(yylval.opval)));
394 }
395
396 }
401441c0 397 else
396482e1 398 sv_catpvs(report, "(opval=null)");
bbf60fe6
DM
399 break;
400 }
b6007c36 401 PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
bbf60fe6
DM
402 };
403 return (int)rv;
998054bd
SC
404}
405
b6007c36
DM
406
407/* print the buffer with suitable escapes */
408
409STATIC void
410S_printbuf(pTHX_ const char* fmt, const char* s)
411{
396482e1 412 SV* const tmp = newSVpvs("");
b6007c36
DM
413 PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
414 SvREFCNT_dec(tmp);
415}
416
8fa7f367
JH
417#endif
418
ffb4593c
NT
419/*
420 * S_ao
421 *
c963b151
BD
422 * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
423 * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
ffb4593c
NT
424 */
425
76e3520e 426STATIC int
cea2e8a9 427S_ao(pTHX_ int toketype)
a0d0e21e 428{
97aff369 429 dVAR;
3280af22
NIS
430 if (*PL_bufptr == '=') {
431 PL_bufptr++;
a0d0e21e
LW
432 if (toketype == ANDAND)
433 yylval.ival = OP_ANDASSIGN;
434 else if (toketype == OROR)
435 yylval.ival = OP_ORASSIGN;
c963b151
BD
436 else if (toketype == DORDOR)
437 yylval.ival = OP_DORASSIGN;
a0d0e21e
LW
438 toketype = ASSIGNOP;
439 }
440 return toketype;
441}
442
ffb4593c
NT
443/*
444 * S_no_op
445 * When Perl expects an operator and finds something else, no_op
446 * prints the warning. It always prints "<something> found where
447 * operator expected. It prints "Missing semicolon on previous line?"
448 * if the surprise occurs at the start of the line. "do you need to
449 * predeclare ..." is printed out for code like "sub bar; foo bar $x"
450 * where the compiler doesn't know if foo is a method call or a function.
451 * It prints "Missing operator before end of line" if there's nothing
452 * after the missing operator, or "... before <...>" if there is something
453 * after the missing operator.
454 */
455
76e3520e 456STATIC void
bfed75c6 457S_no_op(pTHX_ const char *what, char *s)
463ee0b2 458{
97aff369 459 dVAR;
9d4ba2ae
AL
460 char * const oldbp = PL_bufptr;
461 const bool is_first = (PL_oldbufptr == PL_linestart);
68dc0745 462
1189a94a
GS
463 if (!s)
464 s = oldbp;
07c798fb 465 else
1189a94a 466 PL_bufptr = s;
cea2e8a9 467 yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
56da5a46
RGS
468 if (ckWARN_d(WARN_SYNTAX)) {
469 if (is_first)
470 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
471 "\t(Missing semicolon on previous line?)\n");
472 else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
f54cb97a 473 const char *t;
c35e046a
AL
474 for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
475 NOOP;
56da5a46
RGS
476 if (t < PL_bufptr && isSPACE(*t))
477 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
478 "\t(Do you need to predeclare %.*s?)\n",
551405c4 479 (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
56da5a46
RGS
480 }
481 else {
482 assert(s >= oldbp);
483 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
551405c4 484 "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
56da5a46 485 }
07c798fb 486 }
3280af22 487 PL_bufptr = oldbp;
8990e307
LW
488}
489
ffb4593c
NT
490/*
491 * S_missingterm
492 * Complain about missing quote/regexp/heredoc terminator.
d4c19fe8 493 * If it's called with NULL then it cauterizes the line buffer.
ffb4593c
NT
494 * If we're in a delimited string and the delimiter is a control
495 * character, it's reformatted into a two-char sequence like ^C.
496 * This is fatal.
497 */
498
76e3520e 499STATIC void
cea2e8a9 500S_missingterm(pTHX_ char *s)
8990e307 501{
97aff369 502 dVAR;
8990e307
LW
503 char tmpbuf[3];
504 char q;
505 if (s) {
9d4ba2ae 506 char * const nl = strrchr(s,'\n');
d2719217 507 if (nl)
8990e307
LW
508 *nl = '\0';
509 }
9d116dd7
JH
510 else if (
511#ifdef EBCDIC
512 iscntrl(PL_multi_close)
513#else
514 PL_multi_close < 32 || PL_multi_close == 127
515#endif
516 ) {
8990e307 517 *tmpbuf = '^';
585ec06d 518 tmpbuf[1] = (char)toCTRL(PL_multi_close);
8990e307
LW
519 tmpbuf[2] = '\0';
520 s = tmpbuf;
521 }
522 else {
eb160463 523 *tmpbuf = (char)PL_multi_close;
8990e307
LW
524 tmpbuf[1] = '\0';
525 s = tmpbuf;
526 }
527 q = strchr(s,'"') ? '\'' : '"';
cea2e8a9 528 Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
463ee0b2 529}
79072805 530
ef89dcc3 531#define FEATURE_IS_ENABLED(name) \
0d863452 532 ((0 != (PL_hints & HINT_LOCALIZE_HH)) \
89529cee 533 && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name)))
0d863452
RH
534/*
535 * S_feature_is_enabled
536 * Check whether the named feature is enabled.
537 */
538STATIC bool
d4c19fe8 539S_feature_is_enabled(pTHX_ const char *name, STRLEN namelen)
0d863452 540{
97aff369 541 dVAR;
0d863452 542 HV * const hinthv = GvHV(PL_hintgv);
7b9ef140 543 char he_name[32] = "feature_";
6fca0082 544 (void) my_strlcpy(&he_name[8], name, 24);
d4c19fe8 545
7b9ef140 546 return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
0d863452
RH
547}
548
ffb4593c
NT
549/*
550 * Perl_deprecate
ffb4593c
NT
551 */
552
79072805 553void
bfed75c6 554Perl_deprecate(pTHX_ const char *s)
a0d0e21e 555{
599cee73 556 if (ckWARN(WARN_DEPRECATED))
9014280d 557 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
a0d0e21e
LW
558}
559
12bcd1a6 560void
bfed75c6 561Perl_deprecate_old(pTHX_ const char *s)
12bcd1a6
PM
562{
563 /* This function should NOT be called for any new deprecated warnings */
564 /* Use Perl_deprecate instead */
565 /* */
566 /* It is here to maintain backward compatibility with the pre-5.8 */
567 /* warnings category hierarchy. The "deprecated" category used to */
568 /* live under the "syntax" category. It is now a top-level category */
569 /* in its own right. */
570
571 if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
bfed75c6 572 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
12bcd1a6
PM
573 "Use of %s is deprecated", s);
574}
575
ffb4593c 576/*
9cbb5ea2
GS
577 * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
578 * utf16-to-utf8-reversed.
ffb4593c
NT
579 */
580
c39cd008
GS
581#ifdef PERL_CR_FILTER
582static void
583strip_return(SV *sv)
584{
95a20fc0 585 register const char *s = SvPVX_const(sv);
9d4ba2ae 586 register const char * const e = s + SvCUR(sv);
c39cd008
GS
587 /* outer loop optimized to do nothing if there are no CR-LFs */
588 while (s < e) {
589 if (*s++ == '\r' && *s == '\n') {
590 /* hit a CR-LF, need to copy the rest */
591 register char *d = s - 1;
592 *d++ = *s++;
593 while (s < e) {
594 if (*s == '\r' && s[1] == '\n')
595 s++;
596 *d++ = *s++;
597 }
598 SvCUR(sv) -= s - d;
599 return;
600 }
601 }
602}
a868473f 603
76e3520e 604STATIC I32
c39cd008 605S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
a868473f 606{
f54cb97a 607 const I32 count = FILTER_READ(idx+1, sv, maxlen);
c39cd008
GS
608 if (count > 0 && !maxlen)
609 strip_return(sv);
610 return count;
a868473f
NIS
611}
612#endif
613
199e78b7
DM
614
615
ffb4593c
NT
616/*
617 * Perl_lex_start
e3abe207 618 * Create a parser object and initialise its parser and lexer fields
ffb4593c
NT
619 */
620
a0d0e21e 621void
864dbfa3 622Perl_lex_start(pTHX_ SV *line)
79072805 623{
97aff369 624 dVAR;
6ef55633 625 const char *s = NULL;
8990e307 626 STRLEN len;
acdf0a21
DM
627 yy_parser *parser;
628
629 /* create and initialise a parser */
630
199e78b7 631 Newxz(parser, 1, yy_parser);
acdf0a21
DM
632 parser->old_parser = PL_parser;
633 PL_parser = parser;
634
635 Newx(parser->stack, YYINITDEPTH, yy_stack_frame);
636 parser->ps = parser->stack;
637 parser->stack_size = YYINITDEPTH;
638
639 parser->stack->state = 0;
640 parser->yyerrstatus = 0;
641 parser->yychar = YYEMPTY; /* Cause a token to be read. */
642
e3abe207
DM
643 /* on scope exit, free this parser and restore any outer one */
644 SAVEPARSER(parser);
645
acdf0a21 646 /* initialise lexer state */
8990e307 647
3280af22 648 SAVEI32(PL_lex_state);
5db06880
NC
649#ifdef PERL_MAD
650 if (PL_lex_state == LEX_KNOWNEXT) {
199e78b7 651 I32 toke = parser->old_parser->lasttoke;
5db06880
NC
652 while (--toke >= 0) {
653 SAVEI32(PL_nexttoke[toke].next_type);
654 SAVEVPTR(PL_nexttoke[toke].next_val);
655 if (PL_madskills)
656 SAVEVPTR(PL_nexttoke[toke].next_mad);
657 }
5db06880 658 }
cd81e915 659 SAVEI32(PL_curforce);
90e3715f 660 PL_curforce = -1;
5db06880 661#else
18b09519
GS
662 if (PL_lex_state == LEX_KNOWNEXT) {
663 I32 toke = PL_nexttoke;
664 while (--toke >= 0) {
665 SAVEI32(PL_nexttype[toke]);
666 SAVEVPTR(PL_nextval[toke]);
667 }
668 SAVEI32(PL_nexttoke);
18b09519 669 }
5db06880 670#endif
57843af0 671 SAVECOPLINE(PL_curcop);
3280af22
NIS
672 SAVEPPTR(PL_bufptr);
673 SAVEPPTR(PL_bufend);
674 SAVEPPTR(PL_oldbufptr);
675 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
676 SAVEPPTR(PL_last_lop);
677 SAVEPPTR(PL_last_uni);
3280af22
NIS
678 SAVEPPTR(PL_linestart);
679 SAVESPTR(PL_linestr);
c76ac1ee 680 SAVEDESTRUCTOR_X(restore_rsfp, PL_rsfp);
bebdddfc 681 SAVEINT(PL_expect);
3280af22 682
ebca63ee 683 PL_copline = NOLINE;
3280af22 684 PL_lex_state = LEX_NORMAL;
3280af22 685 PL_expect = XSTATE;
199e78b7
DM
686 Newx(parser->lex_brackstack, 120, char);
687 Newx(parser->lex_casestack, 12, char);
688 *parser->lex_casestack = '\0';
689#ifndef PERL_MAD
76be56bc 690 PL_nexttoke = 0;
5db06880 691#endif
02b34bbe 692
10efb74f
NC
693 if (line) {
694 s = SvPV_const(line, len);
695 } else {
696 len = 0;
697 }
698 if (!len) {
699 PL_linestr = newSVpvs("\n;");
700 } else if (SvREADONLY(line) || s[len-1] != ';') {
701 PL_linestr = newSVsv(line);
702 if (s[len-1] != ';')
0eb20fa2 703 sv_catpvs(PL_linestr, "\n;");
6c5ce11d
NC
704 } else {
705 SvTEMP_off(line);
706 SvREFCNT_inc_simple_void_NN(line);
707 PL_linestr = line;
8990e307 708 }
db4997f0
NC
709 /* PL_linestr needs to survive until end of scope, not just the next
710 FREETMPS. See changes 17505 and 17546 which fixed the symptoms only. */
db4997f0 711 SAVEFREESV(PL_linestr);
3280af22
NIS
712 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
713 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
bd61b366 714 PL_last_lop = PL_last_uni = NULL;
3280af22 715 PL_rsfp = 0;
79072805 716}
a687059c 717
e3abe207
DM
718
719/* delete a parser object */
720
721void
722Perl_parser_free(pTHX_ const yy_parser *parser)
723{
724 Safefree(parser->stack);
725 Safefree(parser->lex_brackstack);
726 Safefree(parser->lex_casestack);
727 PL_parser = parser->old_parser;
728 Safefree(parser);
729}
730
731
ffb4593c
NT
732/*
733 * Perl_lex_end
9cbb5ea2
GS
734 * Finalizer for lexing operations. Must be called when the parser is
735 * done with the lexer.
ffb4593c
NT
736 */
737
463ee0b2 738void
864dbfa3 739Perl_lex_end(pTHX)
463ee0b2 740{
97aff369 741 dVAR;
3280af22 742 PL_doextract = FALSE;
463ee0b2
LW
743}
744
ffb4593c
NT
745/*
746 * S_incline
747 * This subroutine has nothing to do with tilting, whether at windmills
748 * or pinball tables. Its name is short for "increment line". It
57843af0 749 * increments the current line number in CopLINE(PL_curcop) and checks
ffb4593c 750 * to see whether the line starts with a comment of the form
9cbb5ea2
GS
751 * # line 500 "foo.pm"
752 * If so, it sets the current line number and file to the values in the comment.
ffb4593c
NT
753 */
754
76e3520e 755STATIC void
d9095cec 756S_incline(pTHX_ const char *s)
463ee0b2 757{
97aff369 758 dVAR;
d9095cec
NC
759 const char *t;
760 const char *n;
761 const char *e;
463ee0b2 762
57843af0 763 CopLINE_inc(PL_curcop);
463ee0b2
LW
764 if (*s++ != '#')
765 return;
d4c19fe8
AL
766 while (SPACE_OR_TAB(*s))
767 s++;
73659bf1
GS
768 if (strnEQ(s, "line", 4))
769 s += 4;
770 else
771 return;
084592ab 772 if (SPACE_OR_TAB(*s))
73659bf1 773 s++;
4e553d73 774 else
73659bf1 775 return;
d4c19fe8
AL
776 while (SPACE_OR_TAB(*s))
777 s++;
463ee0b2
LW
778 if (!isDIGIT(*s))
779 return;
d4c19fe8 780
463ee0b2
LW
781 n = s;
782 while (isDIGIT(*s))
783 s++;
bf4acbe4 784 while (SPACE_OR_TAB(*s))
463ee0b2 785 s++;
73659bf1 786 if (*s == '"' && (t = strchr(s+1, '"'))) {
463ee0b2 787 s++;
73659bf1
GS
788 e = t + 1;
789 }
463ee0b2 790 else {
c35e046a
AL
791 t = s;
792 while (!isSPACE(*t))
793 t++;
73659bf1 794 e = t;
463ee0b2 795 }
bf4acbe4 796 while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
73659bf1
GS
797 e++;
798 if (*e != '\n' && *e != '\0')
799 return; /* false alarm */
800
f4dd75d9 801 if (t - s > 0) {
d9095cec 802 const STRLEN len = t - s;
8a5ee598 803#ifndef USE_ITHREADS
c4420975 804 const char * const cf = CopFILE(PL_curcop);
42d9b98d
NC
805 STRLEN tmplen = cf ? strlen(cf) : 0;
806 if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
e66cf94c
RGS
807 /* must copy *{"::_<(eval N)[oldfilename:L]"}
808 * to *{"::_<newfilename"} */
44867030
NC
809 /* However, the long form of evals is only turned on by the
810 debugger - usually they're "(eval %lu)" */
811 char smallbuf[128];
812 char *tmpbuf;
813 GV **gvp;
d9095cec 814 STRLEN tmplen2 = len;
798b63bc 815 if (tmplen + 2 <= sizeof smallbuf)
e66cf94c
RGS
816 tmpbuf = smallbuf;
817 else
2ae0db35 818 Newx(tmpbuf, tmplen + 2, char);
44867030
NC
819 tmpbuf[0] = '_';
820 tmpbuf[1] = '<';
2ae0db35 821 memcpy(tmpbuf + 2, cf, tmplen);
44867030 822 tmplen += 2;
8a5ee598
RGS
823 gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
824 if (gvp) {
44867030
NC
825 char *tmpbuf2;
826 GV *gv2;
827
828 if (tmplen2 + 2 <= sizeof smallbuf)
829 tmpbuf2 = smallbuf;
830 else
831 Newx(tmpbuf2, tmplen2 + 2, char);
832
833 if (tmpbuf2 != smallbuf || tmpbuf != smallbuf) {
834 /* Either they malloc'd it, or we malloc'd it,
835 so no prefix is present in ours. */
836 tmpbuf2[0] = '_';
837 tmpbuf2[1] = '<';
838 }
839
840 memcpy(tmpbuf2 + 2, s, tmplen2);
841 tmplen2 += 2;
842
8a5ee598 843 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
e5527e4b 844 if (!isGV(gv2)) {
8a5ee598 845 gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
e5527e4b
RGS
846 /* adjust ${"::_<newfilename"} to store the new file name */
847 GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
848 GvHV(gv2) = (HV*)SvREFCNT_inc(GvHV(*gvp));
849 GvAV(gv2) = (AV*)SvREFCNT_inc(GvAV(*gvp));
850 }
44867030
NC
851
852 if (tmpbuf2 != smallbuf) Safefree(tmpbuf2);
8a5ee598 853 }
e66cf94c 854 if (tmpbuf != smallbuf) Safefree(tmpbuf);
e66cf94c 855 }
8a5ee598 856#endif
05ec9bb3 857 CopFILE_free(PL_curcop);
d9095cec 858 CopFILE_setn(PL_curcop, s, len);
f4dd75d9 859 }
57843af0 860 CopLINE_set(PL_curcop, atoi(n)-1);
463ee0b2
LW
861}
862
29595ff2 863#ifdef PERL_MAD
cd81e915 864/* skip space before PL_thistoken */
29595ff2
NC
865
866STATIC char *
867S_skipspace0(pTHX_ register char *s)
868{
869 s = skipspace(s);
870 if (!PL_madskills)
871 return s;
cd81e915
NC
872 if (PL_skipwhite) {
873 if (!PL_thiswhite)
6b29d1f5 874 PL_thiswhite = newSVpvs("");
cd81e915
NC
875 sv_catsv(PL_thiswhite, PL_skipwhite);
876 sv_free(PL_skipwhite);
877 PL_skipwhite = 0;
878 }
879 PL_realtokenstart = s - SvPVX(PL_linestr);
29595ff2
NC
880 return s;
881}
882
cd81e915 883/* skip space after PL_thistoken */
29595ff2
NC
884
885STATIC char *
886S_skipspace1(pTHX_ register char *s)
887{
d4c19fe8 888 const char *start = s;
29595ff2
NC
889 I32 startoff = start - SvPVX(PL_linestr);
890
891 s = skipspace(s);
892 if (!PL_madskills)
893 return s;
894 start = SvPVX(PL_linestr) + startoff;
cd81e915 895 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 896 const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
897 PL_thistoken = newSVpvn(tstart, start - tstart);
898 }
899 PL_realtokenstart = -1;
900 if (PL_skipwhite) {
901 if (!PL_nextwhite)
6b29d1f5 902 PL_nextwhite = newSVpvs("");
cd81e915
NC
903 sv_catsv(PL_nextwhite, PL_skipwhite);
904 sv_free(PL_skipwhite);
905 PL_skipwhite = 0;
29595ff2
NC
906 }
907 return s;
908}
909
910STATIC char *
911S_skipspace2(pTHX_ register char *s, SV **svp)
912{
c35e046a
AL
913 char *start;
914 const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
915 const I32 startoff = s - SvPVX(PL_linestr);
916
29595ff2
NC
917 s = skipspace(s);
918 PL_bufptr = SvPVX(PL_linestr) + bufptroff;
919 if (!PL_madskills || !svp)
920 return s;
921 start = SvPVX(PL_linestr) + startoff;
cd81e915 922 if (!PL_thistoken && PL_realtokenstart >= 0) {
d4c19fe8 923 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915
NC
924 PL_thistoken = newSVpvn(tstart, start - tstart);
925 PL_realtokenstart = -1;
29595ff2 926 }
cd81e915 927 if (PL_skipwhite) {
29595ff2 928 if (!*svp)
6b29d1f5 929 *svp = newSVpvs("");
cd81e915
NC
930 sv_setsv(*svp, PL_skipwhite);
931 sv_free(PL_skipwhite);
932 PL_skipwhite = 0;
29595ff2
NC
933 }
934
935 return s;
936}
937#endif
938
80a702cd 939STATIC void
5fa550fb 940S_update_debugger_info(pTHX_ SV *orig_sv, const char *buf, STRLEN len)
80a702cd
RGS
941{
942 AV *av = CopFILEAVx(PL_curcop);
943 if (av) {
b9f83d2f 944 SV * const sv = newSV_type(SVt_PVMG);
5fa550fb
NC
945 if (orig_sv)
946 sv_setsv(sv, orig_sv);
947 else
948 sv_setpvn(sv, buf, len);
80a702cd
RGS
949 (void)SvIOK_on(sv);
950 SvIV_set(sv, 0);
951 av_store(av, (I32)CopLINE(PL_curcop), sv);
952 }
953}
954
ffb4593c
NT
955/*
956 * S_skipspace
957 * Called to gobble the appropriate amount and type of whitespace.
958 * Skips comments as well.
959 */
960
76e3520e 961STATIC char *
cea2e8a9 962S_skipspace(pTHX_ register char *s)
a687059c 963{
97aff369 964 dVAR;
5db06880
NC
965#ifdef PERL_MAD
966 int curoff;
967 int startoff = s - SvPVX(PL_linestr);
968
cd81e915
NC
969 if (PL_skipwhite) {
970 sv_free(PL_skipwhite);
971 PL_skipwhite = 0;
5db06880
NC
972 }
973#endif
974
3280af22 975 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
bf4acbe4 976 while (s < PL_bufend && SPACE_OR_TAB(*s))
463ee0b2 977 s++;
5db06880
NC
978#ifdef PERL_MAD
979 goto done;
980#else
463ee0b2 981 return s;
5db06880 982#endif
463ee0b2
LW
983 }
984 for (;;) {
fd049845 985 STRLEN prevlen;
09bef843 986 SSize_t oldprevlen, oldoldprevlen;
9c5ffd7c 987 SSize_t oldloplen = 0, oldunilen = 0;
60e6418e
GS
988 while (s < PL_bufend && isSPACE(*s)) {
989 if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
990 incline(s);
991 }
ffb4593c
NT
992
993 /* comment */
3280af22
NIS
994 if (s < PL_bufend && *s == '#') {
995 while (s < PL_bufend && *s != '\n')
463ee0b2 996 s++;
60e6418e 997 if (s < PL_bufend) {
463ee0b2 998 s++;
60e6418e
GS
999 if (PL_in_eval && !PL_rsfp) {
1000 incline(s);
1001 continue;
1002 }
1003 }
463ee0b2 1004 }
ffb4593c
NT
1005
1006 /* only continue to recharge the buffer if we're at the end
1007 * of the buffer, we're not reading from a source filter, and
1008 * we're in normal lexing mode
1009 */
09bef843
SB
1010 if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
1011 PL_lex_state == LEX_FORMLINE)
5db06880
NC
1012#ifdef PERL_MAD
1013 goto done;
1014#else
463ee0b2 1015 return s;
5db06880 1016#endif
ffb4593c
NT
1017
1018 /* try to recharge the buffer */
5db06880
NC
1019#ifdef PERL_MAD
1020 curoff = s - SvPVX(PL_linestr);
1021#endif
1022
9cbb5ea2 1023 if ((s = filter_gets(PL_linestr, PL_rsfp,
bd61b366 1024 (prevlen = SvCUR(PL_linestr)))) == NULL)
9cbb5ea2 1025 {
5db06880
NC
1026#ifdef PERL_MAD
1027 if (PL_madskills && curoff != startoff) {
cd81e915 1028 if (!PL_skipwhite)
6b29d1f5 1029 PL_skipwhite = newSVpvs("");
cd81e915 1030 sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
5db06880
NC
1031 curoff - startoff);
1032 }
1033
1034 /* mustn't throw out old stuff yet if madpropping */
1035 SvCUR(PL_linestr) = curoff;
1036 s = SvPVX(PL_linestr) + curoff;
1037 *s = 0;
1038 if (curoff && s[-1] == '\n')
1039 s[-1] = ' ';
1040#endif
1041
9cbb5ea2 1042 /* end of file. Add on the -p or -n magic */
cd81e915 1043 /* XXX these shouldn't really be added here, can't set PL_faketokens */
01a19ab0 1044 if (PL_minus_p) {
5db06880 1045#ifdef PERL_MAD
6502358f 1046 sv_catpvs(PL_linestr,
5db06880
NC
1047 ";}continue{print or die qq(-p destination: $!\\n);}");
1048#else
6502358f 1049 sv_setpvs(PL_linestr,
01a19ab0 1050 ";}continue{print or die qq(-p destination: $!\\n);}");
5db06880 1051#endif
3280af22 1052 PL_minus_n = PL_minus_p = 0;
a0d0e21e 1053 }
01a19ab0 1054 else if (PL_minus_n) {
5db06880
NC
1055#ifdef PERL_MAD
1056 sv_catpvn(PL_linestr, ";}", 2);
1057#else
01a19ab0 1058 sv_setpvn(PL_linestr, ";}", 2);
5db06880 1059#endif
01a19ab0
NC
1060 PL_minus_n = 0;
1061 }
a0d0e21e 1062 else
5db06880
NC
1063#ifdef PERL_MAD
1064 sv_catpvn(PL_linestr,";", 1);
1065#else
4147a61b 1066 sv_setpvn(PL_linestr,";", 1);
5db06880 1067#endif
ffb4593c
NT
1068
1069 /* reset variables for next time we lex */
9cbb5ea2 1070 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
89122651
NC
1071 = SvPVX(PL_linestr)
1072#ifdef PERL_MAD
1073 + curoff
1074#endif
1075 ;
3280af22 1076 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 1077 PL_last_lop = PL_last_uni = NULL;
ffb4593c
NT
1078
1079 /* Close the filehandle. Could be from -P preprocessor,
1080 * STDIN, or a regular file. If we were reading code from
1081 * STDIN (because the commandline held no -e or filename)
1082 * then we don't close it, we reset it so the code can
1083 * read from STDIN too.
1084 */
1085
3280af22
NIS
1086 if (PL_preprocess && !PL_in_eval)
1087 (void)PerlProc_pclose(PL_rsfp);
1088 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
1089 PerlIO_clearerr(PL_rsfp);
8990e307 1090 else
3280af22 1091 (void)PerlIO_close(PL_rsfp);
4608196e 1092 PL_rsfp = NULL;
463ee0b2
LW
1093 return s;
1094 }
ffb4593c
NT
1095
1096 /* not at end of file, so we only read another line */
09bef843
SB
1097 /* make corresponding updates to old pointers, for yyerror() */
1098 oldprevlen = PL_oldbufptr - PL_bufend;
1099 oldoldprevlen = PL_oldoldbufptr - PL_bufend;
1100 if (PL_last_uni)
1101 oldunilen = PL_last_uni - PL_bufend;
1102 if (PL_last_lop)
1103 oldloplen = PL_last_lop - PL_bufend;
3280af22
NIS
1104 PL_linestart = PL_bufptr = s + prevlen;
1105 PL_bufend = s + SvCUR(PL_linestr);
1106 s = PL_bufptr;
09bef843
SB
1107 PL_oldbufptr = s + oldprevlen;
1108 PL_oldoldbufptr = s + oldoldprevlen;
1109 if (PL_last_uni)
1110 PL_last_uni = s + oldunilen;
1111 if (PL_last_lop)
1112 PL_last_lop = s + oldloplen;
a0d0e21e 1113 incline(s);
ffb4593c
NT
1114
1115 /* debugger active and we're not compiling the debugger code,
1116 * so store the line into the debugger's array of lines
1117 */
80a702cd 1118 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 1119 update_debugger_info(NULL, PL_bufptr, PL_bufend - PL_bufptr);
463ee0b2 1120 }
5db06880
NC
1121
1122#ifdef PERL_MAD
1123 done:
1124 if (PL_madskills) {
cd81e915 1125 if (!PL_skipwhite)
6b29d1f5 1126 PL_skipwhite = newSVpvs("");
5db06880
NC
1127 curoff = s - SvPVX(PL_linestr);
1128 if (curoff - startoff)
cd81e915 1129 sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
5db06880
NC
1130 curoff - startoff);
1131 }
1132 return s;
1133#endif
a687059c 1134}
378cc40b 1135
ffb4593c
NT
1136/*
1137 * S_check_uni
1138 * Check the unary operators to ensure there's no ambiguity in how they're
1139 * used. An ambiguous piece of code would be:
1140 * rand + 5
1141 * This doesn't mean rand() + 5. Because rand() is a unary operator,
1142 * the +5 is its argument.
1143 */
1144
76e3520e 1145STATIC void
cea2e8a9 1146S_check_uni(pTHX)
ba106d47 1147{
97aff369 1148 dVAR;
d4c19fe8
AL
1149 const char *s;
1150 const char *t;
2f3197b3 1151
3280af22 1152 if (PL_oldoldbufptr != PL_last_uni)
2f3197b3 1153 return;
3280af22
NIS
1154 while (isSPACE(*PL_last_uni))
1155 PL_last_uni++;
c35e046a
AL
1156 s = PL_last_uni;
1157 while (isALNUM_lazy_if(s,UTF) || *s == '-')
1158 s++;
3280af22 1159 if ((t = strchr(s, '(')) && t < PL_bufptr)
a0d0e21e 1160 return;
6136c704 1161
0453d815 1162 if (ckWARN_d(WARN_AMBIGUOUS)){
9014280d 1163 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
32d45c1d
NC
1164 "Warning: Use of \"%.*s\" without parentheses is ambiguous",
1165 (int)(s - PL_last_uni), PL_last_uni);
0453d815 1166 }
2f3197b3
LW
1167}
1168
ffb4593c
NT
1169/*
1170 * LOP : macro to build a list operator. Its behaviour has been replaced
1171 * with a subroutine, S_lop() for which LOP is just another name.
1172 */
1173
a0d0e21e
LW
1174#define LOP(f,x) return lop(f,x,s)
1175
ffb4593c
NT
1176/*
1177 * S_lop
1178 * Build a list operator (or something that might be one). The rules:
1179 * - if we have a next token, then it's a list operator [why?]
1180 * - if the next thing is an opening paren, then it's a function
1181 * - else it's a list operator
1182 */
1183
76e3520e 1184STATIC I32
a0be28da 1185S_lop(pTHX_ I32 f, int x, char *s)
ffed7fef 1186{
97aff369 1187 dVAR;
79072805 1188 yylval.ival = f;
35c8bce7 1189 CLINE;
3280af22
NIS
1190 PL_expect = x;
1191 PL_bufptr = s;
1192 PL_last_lop = PL_oldbufptr;
eb160463 1193 PL_last_lop_op = (OPCODE)f;
5db06880
NC
1194#ifdef PERL_MAD
1195 if (PL_lasttoke)
1196 return REPORT(LSTOP);
1197#else
3280af22 1198 if (PL_nexttoke)
bbf60fe6 1199 return REPORT(LSTOP);
5db06880 1200#endif
79072805 1201 if (*s == '(')
bbf60fe6 1202 return REPORT(FUNC);
29595ff2 1203 s = PEEKSPACE(s);
79072805 1204 if (*s == '(')
bbf60fe6 1205 return REPORT(FUNC);
79072805 1206 else
bbf60fe6 1207 return REPORT(LSTOP);
79072805
LW
1208}
1209
5db06880
NC
1210#ifdef PERL_MAD
1211 /*
1212 * S_start_force
1213 * Sets up for an eventual force_next(). start_force(0) basically does
1214 * an unshift, while start_force(-1) does a push. yylex removes items
1215 * on the "pop" end.
1216 */
1217
1218STATIC void
1219S_start_force(pTHX_ int where)
1220{
1221 int i;
1222
cd81e915 1223 if (where < 0) /* so people can duplicate start_force(PL_curforce) */
5db06880 1224 where = PL_lasttoke;
cd81e915
NC
1225 assert(PL_curforce < 0 || PL_curforce == where);
1226 if (PL_curforce != where) {
5db06880
NC
1227 for (i = PL_lasttoke; i > where; --i) {
1228 PL_nexttoke[i] = PL_nexttoke[i-1];
1229 }
1230 PL_lasttoke++;
1231 }
cd81e915 1232 if (PL_curforce < 0) /* in case of duplicate start_force() */
5db06880 1233 Zero(&PL_nexttoke[where], 1, NEXTTOKE);
cd81e915
NC
1234 PL_curforce = where;
1235 if (PL_nextwhite) {
5db06880 1236 if (PL_madskills)
6b29d1f5 1237 curmad('^', newSVpvs(""));
cd81e915 1238 CURMAD('_', PL_nextwhite);
5db06880
NC
1239 }
1240}
1241
1242STATIC void
1243S_curmad(pTHX_ char slot, SV *sv)
1244{
1245 MADPROP **where;
1246
1247 if (!sv)
1248 return;
cd81e915
NC
1249 if (PL_curforce < 0)
1250 where = &PL_thismad;
5db06880 1251 else
cd81e915 1252 where = &PL_nexttoke[PL_curforce].next_mad;
5db06880 1253
cd81e915 1254 if (PL_faketokens)
5db06880
NC
1255 sv_setpvn(sv, "", 0);
1256 else {
1257 if (!IN_BYTES) {
1258 if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
1259 SvUTF8_on(sv);
1260 else if (PL_encoding) {
1261 sv_recode_to_utf8(sv, PL_encoding);
1262 }
1263 }
1264 }
1265
1266 /* keep a slot open for the head of the list? */
1267 if (slot != '_' && *where && (*where)->mad_key == '^') {
1268 (*where)->mad_key = slot;
1269 sv_free((*where)->mad_val);
1270 (*where)->mad_val = (void*)sv;
1271 }
1272 else
1273 addmad(newMADsv(slot, sv), where, 0);
1274}
1275#else
b3f24c00
MHM
1276# define start_force(where) NOOP
1277# define curmad(slot, sv) NOOP
5db06880
NC
1278#endif
1279
ffb4593c
NT
1280/*
1281 * S_force_next
9cbb5ea2 1282 * When the lexer realizes it knows the next token (for instance,
ffb4593c 1283 * it is reordering tokens for the parser) then it can call S_force_next
9cbb5ea2 1284 * to know what token to return the next time the lexer is called. Caller
5db06880
NC
1285 * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD),
1286 * and possibly PL_expect to ensure the lexer handles the token correctly.
ffb4593c
NT
1287 */
1288
4e553d73 1289STATIC void
cea2e8a9 1290S_force_next(pTHX_ I32 type)
79072805 1291{
97aff369 1292 dVAR;
5db06880 1293#ifdef PERL_MAD
cd81e915 1294 if (PL_curforce < 0)
5db06880 1295 start_force(PL_lasttoke);
cd81e915 1296 PL_nexttoke[PL_curforce].next_type = type;
5db06880
NC
1297 if (PL_lex_state != LEX_KNOWNEXT)
1298 PL_lex_defer = PL_lex_state;
1299 PL_lex_state = LEX_KNOWNEXT;
1300 PL_lex_expect = PL_expect;
cd81e915 1301 PL_curforce = -1;
5db06880 1302#else
3280af22
NIS
1303 PL_nexttype[PL_nexttoke] = type;
1304 PL_nexttoke++;
1305 if (PL_lex_state != LEX_KNOWNEXT) {
1306 PL_lex_defer = PL_lex_state;
1307 PL_lex_expect = PL_expect;
1308 PL_lex_state = LEX_KNOWNEXT;
79072805 1309 }
5db06880 1310#endif
79072805
LW
1311}
1312
d0a148a6
NC
1313STATIC SV *
1314S_newSV_maybe_utf8(pTHX_ const char *start, STRLEN len)
1315{
97aff369 1316 dVAR;
9d4ba2ae 1317 SV * const sv = newSVpvn(start,len);
bfed75c6 1318 if (UTF && !IN_BYTES && is_utf8_string((const U8*)start, len))
d0a148a6
NC
1319 SvUTF8_on(sv);
1320 return sv;
1321}
1322
ffb4593c
NT
1323/*
1324 * S_force_word
1325 * When the lexer knows the next thing is a word (for instance, it has
1326 * just seen -> and it knows that the next char is a word char, then
02b34bbe
DM
1327 * it calls S_force_word to stick the next word into the PL_nexttoke/val
1328 * lookahead.
ffb4593c
NT
1329 *
1330 * Arguments:
b1b65b59 1331 * char *start : buffer position (must be within PL_linestr)
02b34bbe 1332 * int token : PL_next* will be this type of bare word (e.g., METHOD,WORD)
ffb4593c
NT
1333 * int check_keyword : if true, Perl checks to make sure the word isn't
1334 * a keyword (do this if the word is a label, e.g. goto FOO)
1335 * int allow_pack : if true, : characters will also be allowed (require,
1336 * use, etc. do this)
9cbb5ea2 1337 * int allow_initial_tick : used by the "sub" lexer only.
ffb4593c
NT
1338 */
1339
76e3520e 1340STATIC char *
cea2e8a9 1341S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
79072805 1342{
97aff369 1343 dVAR;
463ee0b2
LW
1344 register char *s;
1345 STRLEN len;
4e553d73 1346
29595ff2 1347 start = SKIPSPACE1(start);
463ee0b2 1348 s = start;
7e2040f0 1349 if (isIDFIRST_lazy_if(s,UTF) ||
a0d0e21e 1350 (allow_pack && *s == ':') ||
15f0808c 1351 (allow_initial_tick && *s == '\'') )
a0d0e21e 1352 {
3280af22 1353 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
5458a98a 1354 if (check_keyword && keyword(PL_tokenbuf, len, 0))
463ee0b2 1355 return start;
cd81e915 1356 start_force(PL_curforce);
5db06880
NC
1357 if (PL_madskills)
1358 curmad('X', newSVpvn(start,s-start));
463ee0b2 1359 if (token == METHOD) {
29595ff2 1360 s = SKIPSPACE1(s);
463ee0b2 1361 if (*s == '(')
3280af22 1362 PL_expect = XTERM;
463ee0b2 1363 else {
3280af22 1364 PL_expect = XOPERATOR;
463ee0b2 1365 }
79072805 1366 }
e74e6b3d
GG
1367 if (PL_madskills)
1368 curmad('B', newSVpvs( "forced" ));
9ded7720 1369 NEXTVAL_NEXTTOKE.opval
d0a148a6
NC
1370 = (OP*)newSVOP(OP_CONST,0,
1371 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
9ded7720 1372 NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE;
79072805
LW
1373 force_next(token);
1374 }
1375 return s;
1376}
1377
ffb4593c
NT
1378/*
1379 * S_force_ident
9cbb5ea2 1380 * Called when the lexer wants $foo *foo &foo etc, but the program
ffb4593c
NT
1381 * text only contains the "foo" portion. The first argument is a pointer
1382 * to the "foo", and the second argument is the type symbol to prefix.
1383 * Forces the next token to be a "WORD".
9cbb5ea2 1384 * Creates the symbol if it didn't already exist (via gv_fetchpv()).
ffb4593c
NT
1385 */
1386
76e3520e 1387STATIC void
bfed75c6 1388S_force_ident(pTHX_ register const char *s, int kind)
79072805 1389{
97aff369 1390 dVAR;
c35e046a 1391 if (*s) {
90e5519e
NC
1392 const STRLEN len = strlen(s);
1393 OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
cd81e915 1394 start_force(PL_curforce);
9ded7720 1395 NEXTVAL_NEXTTOKE.opval = o;
79072805 1396 force_next(WORD);
748a9306 1397 if (kind) {
11343788 1398 o->op_private = OPpCONST_ENTERED;
55497cff 1399 /* XXX see note in pp_entereval() for why we forgo typo
1400 warnings if the symbol must be introduced in an eval.
1401 GSAR 96-10-12 */
90e5519e
NC
1402 gv_fetchpvn_flags(s, len,
1403 PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL)
1404 : GV_ADD,
1405 kind == '$' ? SVt_PV :
1406 kind == '@' ? SVt_PVAV :
1407 kind == '%' ? SVt_PVHV :
a0d0e21e 1408 SVt_PVGV
90e5519e 1409 );
748a9306 1410 }
79072805
LW
1411 }
1412}
1413
1571675a
GS
1414NV
1415Perl_str_to_version(pTHX_ SV *sv)
1416{
1417 NV retval = 0.0;
1418 NV nshift = 1.0;
1419 STRLEN len;
cfd0369c 1420 const char *start = SvPV_const(sv,len);
9d4ba2ae 1421 const char * const end = start + len;
504618e9 1422 const bool utf = SvUTF8(sv) ? TRUE : FALSE;
1571675a 1423 while (start < end) {
ba210ebe 1424 STRLEN skip;
1571675a
GS
1425 UV n;
1426 if (utf)
9041c2e3 1427 n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1571675a
GS
1428 else {
1429 n = *(U8*)start;
1430 skip = 1;
1431 }
1432 retval += ((NV)n)/nshift;
1433 start += skip;
1434 nshift *= 1000;
1435 }
1436 return retval;
1437}
1438
4e553d73 1439/*
ffb4593c
NT
1440 * S_force_version
1441 * Forces the next token to be a version number.
e759cc13
RGS
1442 * If the next token appears to be an invalid version number, (e.g. "v2b"),
1443 * and if "guessing" is TRUE, then no new token is created (and the caller
1444 * must use an alternative parsing method).
ffb4593c
NT
1445 */
1446
76e3520e 1447STATIC char *
e759cc13 1448S_force_version(pTHX_ char *s, int guessing)
89bfa8cd 1449{
97aff369 1450 dVAR;
5f66b61c 1451 OP *version = NULL;
44dcb63b 1452 char *d;
5db06880
NC
1453#ifdef PERL_MAD
1454 I32 startoff = s - SvPVX(PL_linestr);
1455#endif
89bfa8cd 1456
29595ff2 1457 s = SKIPSPACE1(s);
89bfa8cd 1458
44dcb63b 1459 d = s;
dd629d5b 1460 if (*d == 'v')
44dcb63b 1461 d++;
44dcb63b 1462 if (isDIGIT(*d)) {
e759cc13
RGS
1463 while (isDIGIT(*d) || *d == '_' || *d == '.')
1464 d++;
5db06880
NC
1465#ifdef PERL_MAD
1466 if (PL_madskills) {
cd81e915 1467 start_force(PL_curforce);
5db06880
NC
1468 curmad('X', newSVpvn(s,d-s));
1469 }
1470#endif
9f3d182e 1471 if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
dd629d5b 1472 SV *ver;
b73d6f50 1473 s = scan_num(s, &yylval);
89bfa8cd 1474 version = yylval.opval;
dd629d5b
GS
1475 ver = cSVOPx(version)->op_sv;
1476 if (SvPOK(ver) && !SvNIOK(ver)) {
862a34c6 1477 SvUPGRADE(ver, SVt_PVNV);
9d6ce603 1478 SvNV_set(ver, str_to_version(ver));
1571675a 1479 SvNOK_on(ver); /* hint that it is a version */
44dcb63b 1480 }
89bfa8cd 1481 }
5db06880
NC
1482 else if (guessing) {
1483#ifdef PERL_MAD
1484 if (PL_madskills) {
cd81e915
NC
1485 sv_free(PL_nextwhite); /* let next token collect whitespace */
1486 PL_nextwhite = 0;
5db06880
NC
1487 s = SvPVX(PL_linestr) + startoff;
1488 }
1489#endif
e759cc13 1490 return s;
5db06880 1491 }
89bfa8cd 1492 }
1493
5db06880
NC
1494#ifdef PERL_MAD
1495 if (PL_madskills && !version) {
cd81e915
NC
1496 sv_free(PL_nextwhite); /* let next token collect whitespace */
1497 PL_nextwhite = 0;
5db06880
NC
1498 s = SvPVX(PL_linestr) + startoff;
1499 }
1500#endif
89bfa8cd 1501 /* NOTE: The parser sees the package name and the VERSION swapped */
cd81e915 1502 start_force(PL_curforce);
9ded7720 1503 NEXTVAL_NEXTTOKE.opval = version;
4e553d73 1504 force_next(WORD);
89bfa8cd 1505
e759cc13 1506 return s;
89bfa8cd 1507}
1508
ffb4593c
NT
1509/*
1510 * S_tokeq
1511 * Tokenize a quoted string passed in as an SV. It finds the next
1512 * chunk, up to end of string or a backslash. It may make a new
1513 * SV containing that chunk (if HINT_NEW_STRING is on). It also
1514 * turns \\ into \.
1515 */
1516
76e3520e 1517STATIC SV *
cea2e8a9 1518S_tokeq(pTHX_ SV *sv)
79072805 1519{
97aff369 1520 dVAR;
79072805
LW
1521 register char *s;
1522 register char *send;
1523 register char *d;
b3ac6de7
IZ
1524 STRLEN len = 0;
1525 SV *pv = sv;
79072805
LW
1526
1527 if (!SvLEN(sv))
b3ac6de7 1528 goto finish;
79072805 1529
a0d0e21e 1530 s = SvPV_force(sv, len);
21a311ee 1531 if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
b3ac6de7 1532 goto finish;
463ee0b2 1533 send = s + len;
79072805
LW
1534 while (s < send && *s != '\\')
1535 s++;
1536 if (s == send)
b3ac6de7 1537 goto finish;
79072805 1538 d = s;
be4731d2 1539 if ( PL_hints & HINT_NEW_STRING ) {
95a20fc0 1540 pv = sv_2mortal(newSVpvn(SvPVX_const(pv), len));
be4731d2
NIS
1541 if (SvUTF8(sv))
1542 SvUTF8_on(pv);
1543 }
79072805
LW
1544 while (s < send) {
1545 if (*s == '\\') {
a0d0e21e 1546 if (s + 1 < send && (s[1] == '\\'))
79072805
LW
1547 s++; /* all that, just for this */
1548 }
1549 *d++ = *s++;
1550 }
1551 *d = '\0';
95a20fc0 1552 SvCUR_set(sv, d - SvPVX_const(sv));
b3ac6de7 1553 finish:
3280af22 1554 if ( PL_hints & HINT_NEW_STRING )
b3ac6de7 1555 return new_constant(NULL, 0, "q", sv, pv, "q");
79072805
LW
1556 return sv;
1557}
1558
ffb4593c
NT
1559/*
1560 * Now come three functions related to double-quote context,
1561 * S_sublex_start, S_sublex_push, and S_sublex_done. They're used when
1562 * converting things like "\u\Lgnat" into ucfirst(lc("gnat")). They
1563 * interact with PL_lex_state, and create fake ( ... ) argument lists
1564 * to handle functions and concatenation.
1565 * They assume that whoever calls them will be setting up a fake
1566 * join call, because each subthing puts a ',' after it. This lets
1567 * "lower \luPpEr"
1568 * become
1569 * join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1570 *
1571 * (I'm not sure whether the spurious commas at the end of lcfirst's
1572 * arguments and join's arguments are created or not).
1573 */
1574
1575/*
1576 * S_sublex_start
1577 * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
1578 *
1579 * Pattern matching will set PL_lex_op to the pattern-matching op to
1580 * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
1581 *
1582 * OP_CONST and OP_READLINE are easy--just make the new op and return.
1583 *
1584 * Everything else becomes a FUNC.
1585 *
1586 * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1587 * had an OP_CONST or OP_READLINE). This just sets us up for a
1588 * call to S_sublex_push().
1589 */
1590
76e3520e 1591STATIC I32
cea2e8a9 1592S_sublex_start(pTHX)
79072805 1593{
97aff369 1594 dVAR;
0d46e09a 1595 register const I32 op_type = yylval.ival;
79072805
LW
1596
1597 if (op_type == OP_NULL) {
3280af22 1598 yylval.opval = PL_lex_op;
5f66b61c 1599 PL_lex_op = NULL;
79072805
LW
1600 return THING;
1601 }
1602 if (op_type == OP_CONST || op_type == OP_READLINE) {
3280af22 1603 SV *sv = tokeq(PL_lex_stuff);
b3ac6de7
IZ
1604
1605 if (SvTYPE(sv) == SVt_PVIV) {
1606 /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1607 STRLEN len;
96a5add6 1608 const char * const p = SvPV_const(sv, len);
f54cb97a 1609 SV * const nsv = newSVpvn(p, len);
01ec43d0
GS
1610 if (SvUTF8(sv))
1611 SvUTF8_on(nsv);
b3ac6de7
IZ
1612 SvREFCNT_dec(sv);
1613 sv = nsv;
4e553d73 1614 }
b3ac6de7 1615 yylval.opval = (OP*)newSVOP(op_type, 0, sv);
a0714e2c 1616 PL_lex_stuff = NULL;
6f33ba73
RGS
1617 /* Allow <FH> // "foo" */
1618 if (op_type == OP_READLINE)
1619 PL_expect = XTERMORDORDOR;
79072805
LW
1620 return THING;
1621 }
e3f73d4e
RGS
1622 else if (op_type == OP_BACKTICK && PL_lex_op) {
1623 /* readpipe() vas overriden */
1624 cSVOPx(cLISTOPx(cUNOPx(PL_lex_op)->op_first)->op_first->op_sibling)->op_sv = tokeq(PL_lex_stuff);
1625 yylval.opval = PL_lex_op;
9b201d7d 1626 PL_lex_op = NULL;
e3f73d4e
RGS
1627 PL_lex_stuff = NULL;
1628 return THING;
1629 }
79072805 1630
3280af22
NIS
1631 PL_sublex_info.super_state = PL_lex_state;
1632 PL_sublex_info.sub_inwhat = op_type;
1633 PL_sublex_info.sub_op = PL_lex_op;
1634 PL_lex_state = LEX_INTERPPUSH;
55497cff 1635
3280af22
NIS
1636 PL_expect = XTERM;
1637 if (PL_lex_op) {
1638 yylval.opval = PL_lex_op;
5f66b61c 1639 PL_lex_op = NULL;
55497cff 1640 return PMFUNC;
1641 }
1642 else
1643 return FUNC;
1644}
1645
ffb4593c
NT
1646/*
1647 * S_sublex_push
1648 * Create a new scope to save the lexing state. The scope will be
1649 * ended in S_sublex_done. Returns a '(', starting the function arguments
1650 * to the uc, lc, etc. found before.
1651 * Sets PL_lex_state to LEX_INTERPCONCAT.
1652 */
1653
76e3520e 1654STATIC I32
cea2e8a9 1655S_sublex_push(pTHX)
55497cff 1656{
27da23d5 1657 dVAR;
f46d017c 1658 ENTER;
55497cff 1659
3280af22
NIS
1660 PL_lex_state = PL_sublex_info.super_state;
1661 SAVEI32(PL_lex_dojoin);
1662 SAVEI32(PL_lex_brackets);
3280af22
NIS
1663 SAVEI32(PL_lex_casemods);
1664 SAVEI32(PL_lex_starts);
1665 SAVEI32(PL_lex_state);
7766f137 1666 SAVEVPTR(PL_lex_inpat);
3280af22 1667 SAVEI32(PL_lex_inwhat);
57843af0 1668 SAVECOPLINE(PL_curcop);
3280af22 1669 SAVEPPTR(PL_bufptr);
8452ff4b 1670 SAVEPPTR(PL_bufend);
3280af22
NIS
1671 SAVEPPTR(PL_oldbufptr);
1672 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
1673 SAVEPPTR(PL_last_lop);
1674 SAVEPPTR(PL_last_uni);
3280af22
NIS
1675 SAVEPPTR(PL_linestart);
1676 SAVESPTR(PL_linestr);
8edd5f42
RGS
1677 SAVEGENERICPV(PL_lex_brackstack);
1678 SAVEGENERICPV(PL_lex_casestack);
3280af22
NIS
1679
1680 PL_linestr = PL_lex_stuff;
a0714e2c 1681 PL_lex_stuff = NULL;
3280af22 1682
9cbb5ea2
GS
1683 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1684 = SvPVX(PL_linestr);
3280af22 1685 PL_bufend += SvCUR(PL_linestr);
bd61b366 1686 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
1687 SAVEFREESV(PL_linestr);
1688
1689 PL_lex_dojoin = FALSE;
1690 PL_lex_brackets = 0;
a02a5408
JC
1691 Newx(PL_lex_brackstack, 120, char);
1692 Newx(PL_lex_casestack, 12, char);
3280af22
NIS
1693 PL_lex_casemods = 0;
1694 *PL_lex_casestack = '\0';
1695 PL_lex_starts = 0;
1696 PL_lex_state = LEX_INTERPCONCAT;
eb160463 1697 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22
NIS
1698
1699 PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1700 if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1701 PL_lex_inpat = PL_sublex_info.sub_op;
79072805 1702 else
5f66b61c 1703 PL_lex_inpat = NULL;
79072805 1704
55497cff 1705 return '(';
79072805
LW
1706}
1707
ffb4593c
NT
1708/*
1709 * S_sublex_done
1710 * Restores lexer state after a S_sublex_push.
1711 */
1712
76e3520e 1713STATIC I32
cea2e8a9 1714S_sublex_done(pTHX)
79072805 1715{
27da23d5 1716 dVAR;
3280af22 1717 if (!PL_lex_starts++) {
396482e1 1718 SV * const sv = newSVpvs("");
9aa983d2
JH
1719 if (SvUTF8(PL_linestr))
1720 SvUTF8_on(sv);
3280af22 1721 PL_expect = XOPERATOR;
9aa983d2 1722 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
79072805
LW
1723 return THING;
1724 }
1725
3280af22
NIS
1726 if (PL_lex_casemods) { /* oops, we've got some unbalanced parens */
1727 PL_lex_state = LEX_INTERPCASEMOD;
cea2e8a9 1728 return yylex();
79072805
LW
1729 }
1730
ffb4593c 1731 /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
3280af22
NIS
1732 if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1733 PL_linestr = PL_lex_repl;
1734 PL_lex_inpat = 0;
1735 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1736 PL_bufend += SvCUR(PL_linestr);
bd61b366 1737 PL_last_lop = PL_last_uni = NULL;
3280af22
NIS
1738 SAVEFREESV(PL_linestr);
1739 PL_lex_dojoin = FALSE;
1740 PL_lex_brackets = 0;
3280af22
NIS
1741 PL_lex_casemods = 0;
1742 *PL_lex_casestack = '\0';
1743 PL_lex_starts = 0;
25da4f38 1744 if (SvEVALED(PL_lex_repl)) {
3280af22
NIS
1745 PL_lex_state = LEX_INTERPNORMAL;
1746 PL_lex_starts++;
e9fa98b2
HS
1747 /* we don't clear PL_lex_repl here, so that we can check later
1748 whether this is an evalled subst; that means we rely on the
1749 logic to ensure sublex_done() is called again only via the
1750 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
79072805 1751 }
e9fa98b2 1752 else {
3280af22 1753 PL_lex_state = LEX_INTERPCONCAT;
a0714e2c 1754 PL_lex_repl = NULL;
e9fa98b2 1755 }
79072805 1756 return ',';
ffed7fef
LW
1757 }
1758 else {
5db06880
NC
1759#ifdef PERL_MAD
1760 if (PL_madskills) {
cd81e915
NC
1761 if (PL_thiswhite) {
1762 if (!PL_endwhite)
6b29d1f5 1763 PL_endwhite = newSVpvs("");
cd81e915
NC
1764 sv_catsv(PL_endwhite, PL_thiswhite);
1765 PL_thiswhite = 0;
1766 }
1767 if (PL_thistoken)
1768 sv_setpvn(PL_thistoken,"",0);
5db06880 1769 else
cd81e915 1770 PL_realtokenstart = -1;
5db06880
NC
1771 }
1772#endif
f46d017c 1773 LEAVE;
3280af22
NIS
1774 PL_bufend = SvPVX(PL_linestr);
1775 PL_bufend += SvCUR(PL_linestr);
1776 PL_expect = XOPERATOR;
09bef843 1777 PL_sublex_info.sub_inwhat = 0;
79072805 1778 return ')';
ffed7fef
LW
1779 }
1780}
1781
02aa26ce
NT
1782/*
1783 scan_const
1784
1785 Extracts a pattern, double-quoted string, or transliteration. This
1786 is terrifying code.
1787
94def140 1788 It looks at PL_lex_inwhat and PL_lex_inpat to find out whether it's
3280af22 1789 processing a pattern (PL_lex_inpat is true), a transliteration
94def140 1790 (PL_lex_inwhat == OP_TRANS is true), or a double-quoted string.
02aa26ce 1791
94def140
TS
1792 Returns a pointer to the character scanned up to. If this is
1793 advanced from the start pointer supplied (i.e. if anything was
9b599b2a
GS
1794 successfully parsed), will leave an OP for the substring scanned
1795 in yylval. Caller must intuit reason for not parsing further
1796 by looking at the next characters herself.
1797
02aa26ce
NT
1798 In patterns:
1799 backslashes:
1800 double-quoted style: \r and \n
1801 regexp special ones: \D \s
94def140
TS
1802 constants: \x31
1803 backrefs: \1
02aa26ce
NT
1804 case and quoting: \U \Q \E
1805 stops on @ and $, but not for $ as tail anchor
1806
1807 In transliterations:
1808 characters are VERY literal, except for - not at the start or end
94def140
TS
1809 of the string, which indicates a range. If the range is in bytes,
1810 scan_const expands the range to the full set of intermediate
1811 characters. If the range is in utf8, the hyphen is replaced with
1812 a certain range mark which will be handled by pmtrans() in op.c.
02aa26ce
NT
1813
1814 In double-quoted strings:
1815 backslashes:
1816 double-quoted style: \r and \n
94def140
TS
1817 constants: \x31
1818 deprecated backrefs: \1 (in substitution replacements)
02aa26ce
NT
1819 case and quoting: \U \Q \E
1820 stops on @ and $
1821
1822 scan_const does *not* construct ops to handle interpolated strings.
1823 It stops processing as soon as it finds an embedded $ or @ variable
1824 and leaves it to the caller to work out what's going on.
1825
94def140
TS
1826 embedded arrays (whether in pattern or not) could be:
1827 @foo, @::foo, @'foo, @{foo}, @$foo, @+, @-.
1828
1829 $ in double-quoted strings must be the symbol of an embedded scalar.
02aa26ce
NT
1830
1831 $ in pattern could be $foo or could be tail anchor. Assumption:
1832 it's a tail anchor if $ is the last thing in the string, or if it's
94def140 1833 followed by one of "()| \r\n\t"
02aa26ce
NT
1834
1835 \1 (backreferences) are turned into $1
1836
1837 The structure of the code is
1838 while (there's a character to process) {
94def140
TS
1839 handle transliteration ranges
1840 skip regexp comments /(?#comment)/ and codes /(?{code})/
1841 skip #-initiated comments in //x patterns
1842 check for embedded arrays
02aa26ce
NT
1843 check for embedded scalars
1844 if (backslash) {
94def140
TS
1845 leave intact backslashes from leaveit (below)
1846 deprecate \1 in substitution replacements
02aa26ce
NT
1847 handle string-changing backslashes \l \U \Q \E, etc.
1848 switch (what was escaped) {
94def140
TS
1849 handle \- in a transliteration (becomes a literal -)
1850 handle \132 (octal characters)
1851 handle \x15 and \x{1234} (hex characters)
1852 handle \N{name} (named characters)
1853 handle \cV (control characters)
1854 handle printf-style backslashes (\f, \r, \n, etc)
02aa26ce
NT
1855 } (end switch)
1856 } (end if backslash)
1857 } (end while character to read)
4e553d73 1858
02aa26ce
NT
1859*/
1860
76e3520e 1861STATIC char *
cea2e8a9 1862S_scan_const(pTHX_ char *start)
79072805 1863{
97aff369 1864 dVAR;
3280af22 1865 register char *send = PL_bufend; /* end of the constant */
561b68a9 1866 SV *sv = newSV(send - start); /* sv for the constant */
02aa26ce
NT
1867 register char *s = start; /* start of the constant */
1868 register char *d = SvPVX(sv); /* destination for copies */
1869 bool dorange = FALSE; /* are we in a translit range? */
c2e66d9e 1870 bool didrange = FALSE; /* did we just finish a range? */
2b9d42f0
NIS
1871 I32 has_utf8 = FALSE; /* Output constant is UTF8 */
1872 I32 this_utf8 = UTF; /* The source string is assumed to be UTF8 */
012bcf8d 1873 UV uv;
4c3a8340
TS
1874#ifdef EBCDIC
1875 UV literal_endpoint = 0;
e294cc5d 1876 bool native_range = TRUE; /* turned to FALSE if the first endpoint is Unicode. */
4c3a8340 1877#endif
012bcf8d 1878
2b9d42f0
NIS
1879 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1880 /* If we are doing a trans and we know we want UTF8 set expectation */
1881 has_utf8 = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1882 this_utf8 = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1883 }
1884
1885
79072805 1886 while (s < send || dorange) {
02aa26ce 1887 /* get transliterations out of the way (they're most literal) */
3280af22 1888 if (PL_lex_inwhat == OP_TRANS) {
02aa26ce 1889 /* expand a range A-Z to the full set of characters. AIE! */
79072805 1890 if (dorange) {
1ba5c669
JH
1891 I32 i; /* current expanded character */
1892 I32 min; /* first character in range */
1893 I32 max; /* last character in range */
02aa26ce 1894
e294cc5d
JH
1895#ifdef EBCDIC
1896 UV uvmax = 0;
1897#endif
1898
1899 if (has_utf8
1900#ifdef EBCDIC
1901 && !native_range
1902#endif
1903 ) {
9d4ba2ae 1904 char * const c = (char*)utf8_hop((U8*)d, -1);
8973db79
JH
1905 char *e = d++;
1906 while (e-- > c)
1907 *(e + 1) = *e;
25716404 1908 *c = (char)UTF_TO_NATIVE(0xff);
8973db79
JH
1909 /* mark the range as done, and continue */
1910 dorange = FALSE;
1911 didrange = TRUE;
1912 continue;
1913 }
2b9d42f0 1914
95a20fc0 1915 i = d - SvPVX_const(sv); /* remember current offset */
e294cc5d
JH
1916#ifdef EBCDIC
1917 SvGROW(sv,
1918 SvLEN(sv) + (has_utf8 ?
1919 (512 - UTF_CONTINUATION_MARK +
1920 UNISKIP(0x100))
1921 : 256));
1922 /* How many two-byte within 0..255: 128 in UTF-8,
1923 * 96 in UTF-8-mod. */
1924#else
9cbb5ea2 1925 SvGROW(sv, SvLEN(sv) + 256); /* never more than 256 chars in a range */
e294cc5d 1926#endif
9cbb5ea2 1927 d = SvPVX(sv) + i; /* refresh d after realloc */
e294cc5d
JH
1928#ifdef EBCDIC
1929 if (has_utf8) {
1930 int j;
1931 for (j = 0; j <= 1; j++) {
1932 char * const c = (char*)utf8_hop((U8*)d, -1);
1933 const UV uv = utf8n_to_uvchr((U8*)c, d - c, NULL, 0);
1934 if (j)
1935 min = (U8)uv;
1936 else if (uv < 256)
1937 max = (U8)uv;
1938 else {
1939 max = (U8)0xff; /* only to \xff */
1940 uvmax = uv; /* \x{100} to uvmax */
1941 }
1942 d = c; /* eat endpoint chars */
1943 }
1944 }
1945 else {
1946#endif
1947 d -= 2; /* eat the first char and the - */
1948 min = (U8)*d; /* first char in range */
1949 max = (U8)d[1]; /* last char in range */
1950#ifdef EBCDIC
1951 }
1952#endif
8ada0baa 1953
c2e66d9e 1954 if (min > max) {
01ec43d0 1955 Perl_croak(aTHX_
d1573ac7 1956 "Invalid range \"%c-%c\" in transliteration operator",
1ba5c669 1957 (char)min, (char)max);
c2e66d9e
GS
1958 }
1959
c7f1f016 1960#ifdef EBCDIC
4c3a8340
TS
1961 if (literal_endpoint == 2 &&
1962 ((isLOWER(min) && isLOWER(max)) ||
1963 (isUPPER(min) && isUPPER(max)))) {
8ada0baa
JH
1964 if (isLOWER(min)) {
1965 for (i = min; i <= max; i++)
1966 if (isLOWER(i))
db42d148 1967 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1968 } else {
1969 for (i = min; i <= max; i++)
1970 if (isUPPER(i))
db42d148 1971 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1972 }
1973 }
1974 else
1975#endif
1976 for (i = min; i <= max; i++)
e294cc5d
JH
1977#ifdef EBCDIC
1978 if (has_utf8) {
1979 const U8 ch = (U8)NATIVE_TO_UTF(i);
1980 if (UNI_IS_INVARIANT(ch))
1981 *d++ = (U8)i;
1982 else {
1983 *d++ = (U8)UTF8_EIGHT_BIT_HI(ch);
1984 *d++ = (U8)UTF8_EIGHT_BIT_LO(ch);
1985 }
1986 }
1987 else
1988#endif
1989 *d++ = (char)i;
1990
1991#ifdef EBCDIC
1992 if (uvmax) {
1993 d = (char*)uvchr_to_utf8((U8*)d, 0x100);
1994 if (uvmax > 0x101)
1995 *d++ = (char)UTF_TO_NATIVE(0xff);
1996 if (uvmax > 0x100)
1997 d = (char*)uvchr_to_utf8((U8*)d, uvmax);
1998 }
1999#endif
02aa26ce
NT
2000
2001 /* mark the range as done, and continue */
79072805 2002 dorange = FALSE;
01ec43d0 2003 didrange = TRUE;
4c3a8340
TS
2004#ifdef EBCDIC
2005 literal_endpoint = 0;
2006#endif
79072805 2007 continue;
4e553d73 2008 }
02aa26ce
NT
2009
2010 /* range begins (ignore - as first or last char) */
79072805 2011 else if (*s == '-' && s+1 < send && s != start) {
4e553d73 2012 if (didrange) {
1fafa243 2013 Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
01ec43d0 2014 }
e294cc5d
JH
2015 if (has_utf8
2016#ifdef EBCDIC
2017 && !native_range
2018#endif
2019 ) {
25716404 2020 *d++ = (char)UTF_TO_NATIVE(0xff); /* use illegal utf8 byte--see pmtrans */
a0ed51b3
LW
2021 s++;
2022 continue;
2023 }
79072805
LW
2024 dorange = TRUE;
2025 s++;
01ec43d0
GS
2026 }
2027 else {
2028 didrange = FALSE;
4c3a8340
TS
2029#ifdef EBCDIC
2030 literal_endpoint = 0;
e294cc5d 2031 native_range = TRUE;
4c3a8340 2032#endif
01ec43d0 2033 }
79072805 2034 }
02aa26ce
NT
2035
2036 /* if we get here, we're not doing a transliteration */
2037
0f5d15d6
IZ
2038 /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
2039 except for the last char, which will be done separately. */
3280af22 2040 else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
cc6b7395 2041 if (s[2] == '#') {
e994fd66 2042 while (s+1 < send && *s != ')')
db42d148 2043 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
155aba94
GS
2044 }
2045 else if (s[2] == '{' /* This should match regcomp.c */
67edc0c9 2046 || (s[2] == '?' && s[3] == '{'))
155aba94 2047 {
cc6b7395 2048 I32 count = 1;
0f5d15d6 2049 char *regparse = s + (s[2] == '{' ? 3 : 4);
cc6b7395
IZ
2050 char c;
2051
d9f97599
GS
2052 while (count && (c = *regparse)) {
2053 if (c == '\\' && regparse[1])
2054 regparse++;
4e553d73 2055 else if (c == '{')
cc6b7395 2056 count++;
4e553d73 2057 else if (c == '}')
cc6b7395 2058 count--;
d9f97599 2059 regparse++;
cc6b7395 2060 }
e994fd66 2061 if (*regparse != ')')
5bdf89e7 2062 regparse--; /* Leave one char for continuation. */
0f5d15d6 2063 while (s < regparse)
db42d148 2064 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
cc6b7395 2065 }
748a9306 2066 }
02aa26ce
NT
2067
2068 /* likewise skip #-initiated comments in //x patterns */
3280af22
NIS
2069 else if (*s == '#' && PL_lex_inpat &&
2070 ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
748a9306 2071 while (s+1 < send && *s != '\n')
db42d148 2072 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
748a9306 2073 }
02aa26ce 2074
5d1d4326 2075 /* check for embedded arrays
da6eedaa 2076 (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
5d1d4326 2077 */
1749ea0d
TS
2078 else if (*s == '@' && s[1]) {
2079 if (isALNUM_lazy_if(s+1,UTF))
2080 break;
2081 if (strchr(":'{$", s[1]))
2082 break;
2083 if (!PL_lex_inpat && (s[1] == '+' || s[1] == '-'))
2084 break; /* in regexp, neither @+ nor @- are interpolated */
2085 }
02aa26ce
NT
2086
2087 /* check for embedded scalars. only stop if we're sure it's a
2088 variable.
2089 */
79072805 2090 else if (*s == '$') {
3280af22 2091 if (!PL_lex_inpat) /* not a regexp, so $ must be var */
79072805 2092 break;
6002328a 2093 if (s + 1 < send && !strchr("()| \r\n\t", s[1]))
79072805
LW
2094 break; /* in regexp, $ might be tail anchor */
2095 }
02aa26ce 2096
2b9d42f0
NIS
2097 /* End of else if chain - OP_TRANS rejoin rest */
2098
02aa26ce 2099 /* backslashes */
79072805
LW
2100 if (*s == '\\' && s+1 < send) {
2101 s++;
02aa26ce 2102
02aa26ce 2103 /* deprecate \1 in strings and substitution replacements */
3280af22 2104 if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
a0d0e21e 2105 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
79072805 2106 {
599cee73 2107 if (ckWARN(WARN_SYNTAX))
9014280d 2108 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
79072805
LW
2109 *--s = '$';
2110 break;
2111 }
02aa26ce
NT
2112
2113 /* string-change backslash escapes */
3280af22 2114 if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
79072805
LW
2115 --s;
2116 break;
2117 }
cc74c5bd
TS
2118 /* skip any other backslash escapes in a pattern */
2119 else if (PL_lex_inpat) {
2120 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
2121 goto default_action;
2122 }
02aa26ce
NT
2123
2124 /* if we get here, it's either a quoted -, or a digit */
79072805 2125 switch (*s) {
02aa26ce
NT
2126
2127 /* quoted - in transliterations */
79072805 2128 case '-':
3280af22 2129 if (PL_lex_inwhat == OP_TRANS) {
79072805
LW
2130 *d++ = *s++;
2131 continue;
2132 }
2133 /* FALL THROUGH */
2134 default:
11b8faa4 2135 {
86f97054 2136 if ((isALPHA(*s) || isDIGIT(*s)) &&
041457d9 2137 ckWARN(WARN_MISC))
9014280d 2138 Perl_warner(aTHX_ packWARN(WARN_MISC),
e294cc5d
JH
2139 "Unrecognized escape \\%c passed through",
2140 *s);
11b8faa4 2141 /* default action is to copy the quoted character */
f9a63242 2142 goto default_action;
11b8faa4 2143 }
02aa26ce
NT
2144
2145 /* \132 indicates an octal constant */
79072805
LW
2146 case '0': case '1': case '2': case '3':
2147 case '4': case '5': case '6': case '7':
ba210ebe 2148 {
53305cf1
NC
2149 I32 flags = 0;
2150 STRLEN len = 3;
2151 uv = grok_oct(s, &len, &flags, NULL);
ba210ebe
JH
2152 s += len;
2153 }
012bcf8d 2154 goto NUM_ESCAPE_INSERT;
02aa26ce
NT
2155
2156 /* \x24 indicates a hex constant */
79072805 2157 case 'x':
a0ed51b3
LW
2158 ++s;
2159 if (*s == '{') {
9d4ba2ae 2160 char* const e = strchr(s, '}');
a4c04bdc
NC
2161 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2162 PERL_SCAN_DISALLOW_PREFIX;
53305cf1 2163 STRLEN len;
355860ce 2164
53305cf1 2165 ++s;
adaeee49 2166 if (!e) {
a0ed51b3 2167 yyerror("Missing right brace on \\x{}");
355860ce 2168 continue;
ba210ebe 2169 }
53305cf1
NC
2170 len = e - s;
2171 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe 2172 s = e + 1;
a0ed51b3
LW
2173 }
2174 else {
ba210ebe 2175 {
53305cf1 2176 STRLEN len = 2;
a4c04bdc 2177 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
53305cf1 2178 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe
JH
2179 s += len;
2180 }
012bcf8d
GS
2181 }
2182
2183 NUM_ESCAPE_INSERT:
2184 /* Insert oct or hex escaped character.
301d3d20 2185 * There will always enough room in sv since such
db42d148 2186 * escapes will be longer than any UTF-8 sequence
301d3d20 2187 * they can end up as. */
ba7cea30 2188
c7f1f016
NIS
2189 /* We need to map to chars to ASCII before doing the tests
2190 to cover EBCDIC
2191 */
c4d5f83a 2192 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
9aa983d2 2193 if (!has_utf8 && uv > 255) {
301d3d20
JH
2194 /* Might need to recode whatever we have
2195 * accumulated so far if it contains any
2196 * hibit chars.
2197 *
2198 * (Can't we keep track of that and avoid
2199 * this rescan? --jhi)
012bcf8d 2200 */
c7f1f016 2201 int hicount = 0;
63cd0674
NIS
2202 U8 *c;
2203 for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
c4d5f83a 2204 if (!NATIVE_IS_INVARIANT(*c)) {
012bcf8d 2205 hicount++;
db42d148 2206 }
012bcf8d 2207 }
63cd0674 2208 if (hicount) {
9d4ba2ae 2209 const STRLEN offset = d - SvPVX_const(sv);
db42d148
NIS
2210 U8 *src, *dst;
2211 d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
2212 src = (U8 *)d - 1;
2213 dst = src+hicount;
2214 d += hicount;
cfd0369c 2215 while (src >= (const U8 *)SvPVX_const(sv)) {
c4d5f83a 2216 if (!NATIVE_IS_INVARIANT(*src)) {
9d4ba2ae 2217 const U8 ch = NATIVE_TO_ASCII(*src);
eb160463
GS
2218 *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
2219 *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
012bcf8d
GS
2220 }
2221 else {
63cd0674 2222 *dst-- = *src;
012bcf8d 2223 }
c7f1f016 2224 src--;
012bcf8d
GS
2225 }
2226 }
2227 }
2228
9aa983d2 2229 if (has_utf8 || uv > 255) {
9041c2e3 2230 d = (char*)uvchr_to_utf8((U8*)d, uv);
4e553d73 2231 has_utf8 = TRUE;
f9a63242
JH
2232 if (PL_lex_inwhat == OP_TRANS &&
2233 PL_sublex_info.sub_op) {
2234 PL_sublex_info.sub_op->op_private |=
2235 (PL_lex_repl ? OPpTRANS_FROM_UTF
2236 : OPpTRANS_TO_UTF);
f9a63242 2237 }
e294cc5d
JH
2238#ifdef EBCDIC
2239 if (uv > 255 && !dorange)
2240 native_range = FALSE;
2241#endif
012bcf8d 2242 }
a0ed51b3 2243 else {
012bcf8d 2244 *d++ = (char)uv;
a0ed51b3 2245 }
012bcf8d
GS
2246 }
2247 else {
c4d5f83a 2248 *d++ = (char) uv;
a0ed51b3 2249 }
79072805 2250 continue;
02aa26ce 2251
b239daa5 2252 /* \N{LATIN SMALL LETTER A} is a named character */
4a2d328f 2253 case 'N':
55eda711 2254 ++s;
423cee85
JH
2255 if (*s == '{') {
2256 char* e = strchr(s, '}');
155aba94 2257 SV *res;
423cee85 2258 STRLEN len;
cfd0369c 2259 const char *str;
fc8cd66c 2260 SV *type;
4e553d73 2261
423cee85 2262 if (!e) {
5777a3f7 2263 yyerror("Missing right brace on \\N{}");
423cee85
JH
2264 e = s - 1;
2265 goto cont_scan;
2266 }
dbc0d4f2
JH
2267 if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
2268 /* \N{U+...} */
2269 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
2270 PERL_SCAN_DISALLOW_PREFIX;
2271 s += 3;
2272 len = e - s;
2273 uv = grok_hex(s, &len, &flags, NULL);
b57a0404
JH
2274 if ( e > s && len != (STRLEN)(e - s) ) {
2275 uv = 0xFFFD;
fc8cd66c 2276 }
dbc0d4f2
JH
2277 s = e + 1;
2278 goto NUM_ESCAPE_INSERT;
2279 }
55eda711 2280 res = newSVpvn(s + 1, e - s - 1);
fc8cd66c 2281 type = newSVpvn(s - 2,e - s + 3);
bd61b366 2282 res = new_constant( NULL, 0, "charnames",
fc8cd66c
YO
2283 res, NULL, SvPVX(type) );
2284 SvREFCNT_dec(type);
f9a63242
JH
2285 if (has_utf8)
2286 sv_utf8_upgrade(res);
cfd0369c 2287 str = SvPV_const(res,len);
1c47067b
JH
2288#ifdef EBCDIC_NEVER_MIND
2289 /* charnames uses pack U and that has been
2290 * recently changed to do the below uni->native
2291 * mapping, so this would be redundant (and wrong,
2292 * the code point would be doubly converted).
2293 * But leave this in just in case the pack U change
2294 * gets revoked, but the semantics is still
2295 * desireable for charnames. --jhi */
cddc7ef4 2296 {
cfd0369c 2297 UV uv = utf8_to_uvchr((const U8*)str, 0);
cddc7ef4
JH
2298
2299 if (uv < 0x100) {
89ebb4a3 2300 U8 tmpbuf[UTF8_MAXBYTES+1], *d;
cddc7ef4
JH
2301
2302 d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
2303 sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
cfd0369c 2304 str = SvPV_const(res, len);
cddc7ef4
JH
2305 }
2306 }
2307#endif
89491803 2308 if (!has_utf8 && SvUTF8(res)) {
9d4ba2ae 2309 const char * const ostart = SvPVX_const(sv);
f08d6ad9
GS
2310 SvCUR_set(sv, d - ostart);
2311 SvPOK_on(sv);
e4f3eed8 2312 *d = '\0';
f08d6ad9 2313 sv_utf8_upgrade(sv);
d2f449dd 2314 /* this just broke our allocation above... */
eb160463 2315 SvGROW(sv, (STRLEN)(send - start));
f08d6ad9 2316 d = SvPVX(sv) + SvCUR(sv);
89491803 2317 has_utf8 = TRUE;
f08d6ad9 2318 }
eb160463 2319 if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
9d4ba2ae 2320 const char * const odest = SvPVX_const(sv);
423cee85 2321
8973db79 2322 SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
423cee85
JH
2323 d = SvPVX(sv) + (d - odest);
2324 }
e294cc5d
JH
2325#ifdef EBCDIC
2326 if (!dorange)
2327 native_range = FALSE; /* \N{} is guessed to be Unicode */
2328#endif
423cee85
JH
2329 Copy(str, d, len, char);
2330 d += len;
2331 SvREFCNT_dec(res);
2332 cont_scan:
2333 s = e + 1;
2334 }
2335 else
5777a3f7 2336 yyerror("Missing braces on \\N{}");
423cee85
JH
2337 continue;
2338
02aa26ce 2339 /* \c is a control character */
79072805
LW
2340 case 'c':
2341 s++;
961ce445 2342 if (s < send) {
ba210ebe 2343 U8 c = *s++;
c7f1f016
NIS
2344#ifdef EBCDIC
2345 if (isLOWER(c))
2346 c = toUPPER(c);
2347#endif
db42d148 2348 *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
ba210ebe 2349 }
961ce445
RGS
2350 else {
2351 yyerror("Missing control char name in \\c");
2352 }
79072805 2353 continue;
02aa26ce
NT
2354
2355 /* printf-style backslashes, formfeeds, newlines, etc */
79072805 2356 case 'b':
db42d148 2357 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
79072805
LW
2358 break;
2359 case 'n':
db42d148 2360 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
79072805
LW
2361 break;
2362 case 'r':
db42d148 2363 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
79072805
LW
2364 break;
2365 case 'f':
db42d148 2366 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
79072805
LW
2367 break;
2368 case 't':
db42d148 2369 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
79072805 2370 break;
34a3fe2a 2371 case 'e':
db42d148 2372 *d++ = ASCII_TO_NEED(has_utf8,'\033');
34a3fe2a
PP
2373 break;
2374 case 'a':
db42d148 2375 *d++ = ASCII_TO_NEED(has_utf8,'\007');
79072805 2376 break;
02aa26ce
NT
2377 } /* end switch */
2378
79072805
LW
2379 s++;
2380 continue;
02aa26ce 2381 } /* end if (backslash) */
4c3a8340
TS
2382#ifdef EBCDIC
2383 else
2384 literal_endpoint++;
2385#endif
02aa26ce 2386
f9a63242 2387 default_action:
2b9d42f0
NIS
2388 /* If we started with encoded form, or already know we want it
2389 and then encode the next character */
2390 if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
2391 STRLEN len = 1;
5f66b61c
AL
2392 const UV nextuv = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
2393 const STRLEN need = UNISKIP(NATIVE_TO_UNI(nextuv));
2b9d42f0
NIS
2394 s += len;
2395 if (need > len) {
2396 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
9d4ba2ae 2397 const STRLEN off = d - SvPVX_const(sv);
2b9d42f0
NIS
2398 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
2399 }
5f66b61c 2400 d = (char*)uvchr_to_utf8((U8*)d, nextuv);
2b9d42f0 2401 has_utf8 = TRUE;
e294cc5d
JH
2402#ifdef EBCDIC
2403 if (uv > 255 && !dorange)
2404 native_range = FALSE;
2405#endif
2b9d42f0
NIS
2406 }
2407 else {
2408 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
2409 }
02aa26ce
NT
2410 } /* while loop to process each character */
2411
2412 /* terminate the string and set up the sv */
79072805 2413 *d = '\0';
95a20fc0 2414 SvCUR_set(sv, d - SvPVX_const(sv));
2b9d42f0 2415 if (SvCUR(sv) >= SvLEN(sv))
d0063567 2416 Perl_croak(aTHX_ "panic: constant overflowed allocated space");
2b9d42f0 2417
79072805 2418 SvPOK_on(sv);
9f4817db 2419 if (PL_encoding && !has_utf8) {
d0063567
DK
2420 sv_recode_to_utf8(sv, PL_encoding);
2421 if (SvUTF8(sv))
2422 has_utf8 = TRUE;
9f4817db 2423 }
2b9d42f0 2424 if (has_utf8) {
7e2040f0 2425 SvUTF8_on(sv);
2b9d42f0 2426 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
d0063567 2427 PL_sublex_info.sub_op->op_private |=
2b9d42f0
NIS
2428 (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
2429 }
2430 }
79072805 2431
02aa26ce 2432 /* shrink the sv if we allocated more than we used */
79072805 2433 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1da4ca5f 2434 SvPV_shrink_to_cur(sv);
79072805 2435 }
02aa26ce 2436
9b599b2a 2437 /* return the substring (via yylval) only if we parsed anything */
3280af22
NIS
2438 if (s > PL_bufptr) {
2439 if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
10edeb5d
JH
2440 sv = new_constant(start, s - start,
2441 (const char *)(PL_lex_inpat ? "qr" : "q"),
a0714e2c 2442 sv, NULL,
10edeb5d
JH
2443 (const char *)
2444 (( PL_lex_inwhat == OP_TRANS
2445 ? "tr"
2446 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
2447 ? "s"
2448 : "qq"))));
79072805 2449 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
b3ac6de7 2450 } else
8990e307 2451 SvREFCNT_dec(sv);
79072805
LW
2452 return s;
2453}
2454
ffb4593c
NT
2455/* S_intuit_more
2456 * Returns TRUE if there's more to the expression (e.g., a subscript),
2457 * FALSE otherwise.
ffb4593c
NT
2458 *
2459 * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
2460 *
2461 * ->[ and ->{ return TRUE
2462 * { and [ outside a pattern are always subscripts, so return TRUE
2463 * if we're outside a pattern and it's not { or [, then return FALSE
2464 * if we're in a pattern and the first char is a {
2465 * {4,5} (any digits around the comma) returns FALSE
2466 * if we're in a pattern and the first char is a [
2467 * [] returns FALSE
2468 * [SOMETHING] has a funky algorithm to decide whether it's a
2469 * character class or not. It has to deal with things like
2470 * /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
2471 * anything else returns TRUE
2472 */
2473
9cbb5ea2
GS
2474/* This is the one truly awful dwimmer necessary to conflate C and sed. */
2475
76e3520e 2476STATIC int
cea2e8a9 2477S_intuit_more(pTHX_ register char *s)
79072805 2478{
97aff369 2479 dVAR;
3280af22 2480 if (PL_lex_brackets)
79072805
LW
2481 return TRUE;
2482 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
2483 return TRUE;
2484 if (*s != '{' && *s != '[')
2485 return FALSE;
3280af22 2486 if (!PL_lex_inpat)
79072805
LW
2487 return TRUE;
2488
2489 /* In a pattern, so maybe we have {n,m}. */
2490 if (*s == '{') {
2491 s++;
2492 if (!isDIGIT(*s))
2493 return TRUE;
2494 while (isDIGIT(*s))
2495 s++;
2496 if (*s == ',')
2497 s++;
2498 while (isDIGIT(*s))
2499 s++;
2500 if (*s == '}')
2501 return FALSE;
2502 return TRUE;
2503
2504 }
2505
2506 /* On the other hand, maybe we have a character class */
2507
2508 s++;
2509 if (*s == ']' || *s == '^')
2510 return FALSE;
2511 else {
ffb4593c 2512 /* this is terrifying, and it works */
79072805
LW
2513 int weight = 2; /* let's weigh the evidence */
2514 char seen[256];
f27ffc4a 2515 unsigned char un_char = 255, last_un_char;
9d4ba2ae 2516 const char * const send = strchr(s,']');
3280af22 2517 char tmpbuf[sizeof PL_tokenbuf * 4];
79072805
LW
2518
2519 if (!send) /* has to be an expression */
2520 return TRUE;
2521
2522 Zero(seen,256,char);
2523 if (*s == '$')
2524 weight -= 3;
2525 else if (isDIGIT(*s)) {
2526 if (s[1] != ']') {
2527 if (isDIGIT(s[1]) && s[2] == ']')
2528 weight -= 10;
2529 }
2530 else
2531 weight -= 100;
2532 }
2533 for (; s < send; s++) {
2534 last_un_char = un_char;
2535 un_char = (unsigned char)*s;
2536 switch (*s) {
2537 case '@':
2538 case '&':
2539 case '$':
2540 weight -= seen[un_char] * 10;
7e2040f0 2541 if (isALNUM_lazy_if(s+1,UTF)) {
90e5519e 2542 int len;
8903cb82 2543 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
90e5519e
NC
2544 len = (int)strlen(tmpbuf);
2545 if (len > 1 && gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PV))
79072805
LW
2546 weight -= 100;
2547 else
2548 weight -= 10;
2549 }
2550 else if (*s == '$' && s[1] &&
93a17b20
LW
2551 strchr("[#!%*<>()-=",s[1])) {
2552 if (/*{*/ strchr("])} =",s[2]))
79072805
LW
2553 weight -= 10;
2554 else
2555 weight -= 1;
2556 }
2557 break;
2558 case '\\':
2559 un_char = 254;
2560 if (s[1]) {
93a17b20 2561 if (strchr("wds]",s[1]))
79072805 2562 weight += 100;
10edeb5d 2563 else if (seen[(U8)'\''] || seen[(U8)'"'])
79072805 2564 weight += 1;
93a17b20 2565 else if (strchr("rnftbxcav",s[1]))
79072805
LW
2566 weight += 40;
2567 else if (isDIGIT(s[1])) {
2568 weight += 40;
2569 while (s[1] && isDIGIT(s[1]))
2570 s++;
2571 }
2572 }
2573 else
2574 weight += 100;
2575 break;
2576 case '-':
2577 if (s[1] == '\\')
2578 weight += 50;
93a17b20 2579 if (strchr("aA01! ",last_un_char))
79072805 2580 weight += 30;
93a17b20 2581 if (strchr("zZ79~",s[1]))
79072805 2582 weight += 30;
f27ffc4a
GS
2583 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
2584 weight -= 5; /* cope with negative subscript */
79072805
LW
2585 break;
2586 default:
3792a11b
NC
2587 if (!isALNUM(last_un_char)
2588 && !(last_un_char == '$' || last_un_char == '@'
2589 || last_un_char == '&')
2590 && isALPHA(*s) && s[1] && isALPHA(s[1])) {
79072805
LW
2591 char *d = tmpbuf;
2592 while (isALPHA(*s))
2593 *d++ = *s++;
2594 *d = '\0';
5458a98a 2595 if (keyword(tmpbuf, d - tmpbuf, 0))
79072805
LW
2596 weight -= 150;
2597 }
2598 if (un_char == last_un_char + 1)
2599 weight += 5;
2600 weight -= seen[un_char];
2601 break;
2602 }
2603 seen[un_char]++;
2604 }
2605 if (weight >= 0) /* probably a character class */
2606 return FALSE;
2607 }
2608
2609 return TRUE;
2610}
ffed7fef 2611
ffb4593c
NT
2612/*
2613 * S_intuit_method
2614 *
2615 * Does all the checking to disambiguate
2616 * foo bar
2617 * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise
2618 * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2619 *
2620 * First argument is the stuff after the first token, e.g. "bar".
2621 *
2622 * Not a method if bar is a filehandle.
2623 * Not a method if foo is a subroutine prototyped to take a filehandle.
2624 * Not a method if it's really "Foo $bar"
2625 * Method if it's "foo $bar"
2626 * Not a method if it's really "print foo $bar"
2627 * Method if it's really "foo package::" (interpreted as package->foo)
8f8cf39c 2628 * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3cb0bbe5 2629 * Not a method if bar is a filehandle or package, but is quoted with
ffb4593c
NT
2630 * =>
2631 */
2632
76e3520e 2633STATIC int
62d55b22 2634S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
a0d0e21e 2635{
97aff369 2636 dVAR;
a0d0e21e 2637 char *s = start + (*start == '$');
3280af22 2638 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
2639 STRLEN len;
2640 GV* indirgv;
5db06880
NC
2641#ifdef PERL_MAD
2642 int soff;
2643#endif
a0d0e21e
LW
2644
2645 if (gv) {
62d55b22 2646 if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
a0d0e21e 2647 return 0;
62d55b22
NC
2648 if (cv) {
2649 if (SvPOK(cv)) {
2650 const char *proto = SvPVX_const(cv);
2651 if (proto) {
2652 if (*proto == ';')
2653 proto++;
2654 if (*proto == '*')
2655 return 0;
2656 }
b6c543e3
IZ
2657 }
2658 } else
c35e046a 2659 gv = NULL;
a0d0e21e 2660 }
8903cb82 2661 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
ffb4593c
NT
2662 /* start is the beginning of the possible filehandle/object,
2663 * and s is the end of it
2664 * tmpbuf is a copy of it
2665 */
2666
a0d0e21e 2667 if (*start == '$') {
3ef1310e
RGS
2668 if (gv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY ||
2669 isUPPER(*PL_tokenbuf))
a0d0e21e 2670 return 0;
5db06880
NC
2671#ifdef PERL_MAD
2672 len = start - SvPVX(PL_linestr);
2673#endif
29595ff2 2674 s = PEEKSPACE(s);
f0092767 2675#ifdef PERL_MAD
5db06880
NC
2676 start = SvPVX(PL_linestr) + len;
2677#endif
3280af22
NIS
2678 PL_bufptr = start;
2679 PL_expect = XREF;
a0d0e21e
LW
2680 return *s == '(' ? FUNCMETH : METHOD;
2681 }
5458a98a 2682 if (!keyword(tmpbuf, len, 0)) {
c3e0f903
GS
2683 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2684 len -= 2;
2685 tmpbuf[len] = '\0';
5db06880
NC
2686#ifdef PERL_MAD
2687 soff = s - SvPVX(PL_linestr);
2688#endif
c3e0f903
GS
2689 goto bare_package;
2690 }
90e5519e 2691 indirgv = gv_fetchpvn_flags(tmpbuf, len, 0, SVt_PVCV);
8ebc5c01 2692 if (indirgv && GvCVu(indirgv))
a0d0e21e
LW
2693 return 0;
2694 /* filehandle or package name makes it a method */
da51bb9b 2695 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, 0)) {
5db06880
NC
2696#ifdef PERL_MAD
2697 soff = s - SvPVX(PL_linestr);
2698#endif
29595ff2 2699 s = PEEKSPACE(s);
3280af22 2700 if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
55497cff 2701 return 0; /* no assumptions -- "=>" quotes bearword */
c3e0f903 2702 bare_package:
cd81e915 2703 start_force(PL_curforce);
9ded7720 2704 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
79cb57f6 2705 newSVpvn(tmpbuf,len));
9ded7720 2706 NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
5db06880
NC
2707 if (PL_madskills)
2708 curmad('X', newSVpvn(start,SvPVX(PL_linestr) + soff - start));
3280af22 2709 PL_expect = XTERM;
a0d0e21e 2710 force_next(WORD);
3280af22 2711 PL_bufptr = s;
5db06880
NC
2712#ifdef PERL_MAD
2713 PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */
2714#endif
a0d0e21e
LW
2715 return *s == '(' ? FUNCMETH : METHOD;
2716 }
2717 }
2718 return 0;
2719}
2720
ffb4593c
NT
2721/*
2722 * S_incl_perldb
2723 * Return a string of Perl code to load the debugger. If PERL5DB
2724 * is set, it will return the contents of that, otherwise a
2725 * compile-time require of perl5db.pl.
2726 */
2727
bfed75c6 2728STATIC const char*
cea2e8a9 2729S_incl_perldb(pTHX)
a0d0e21e 2730{
97aff369 2731 dVAR;
3280af22 2732 if (PL_perldb) {
9d4ba2ae 2733 const char * const pdb = PerlEnv_getenv("PERL5DB");
a0d0e21e
LW
2734
2735 if (pdb)
2736 return pdb;
93189314 2737 SETERRNO(0,SS_NORMAL);
a0d0e21e
LW
2738 return "BEGIN { require 'perl5db.pl' }";
2739 }
2740 return "";
2741}
2742
2743
16d20bd9 2744/* Encoded script support. filter_add() effectively inserts a
4e553d73 2745 * 'pre-processing' function into the current source input stream.
16d20bd9
AD
2746 * Note that the filter function only applies to the current source file
2747 * (e.g., it will not affect files 'require'd or 'use'd by this one).
2748 *
2749 * The datasv parameter (which may be NULL) can be used to pass
2750 * private data to this instance of the filter. The filter function
2751 * can recover the SV using the FILTER_DATA macro and use it to
2752 * store private buffers and state information.
2753 *
2754 * The supplied datasv parameter is upgraded to a PVIO type
4755096e 2755 * and the IoDIRP/IoANY field is used to store the function pointer,
e0c19803 2756 * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
16d20bd9
AD
2757 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2758 * private use must be set using malloc'd pointers.
2759 */
16d20bd9
AD
2760
2761SV *
864dbfa3 2762Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
16d20bd9 2763{
97aff369 2764 dVAR;
f4c556ac 2765 if (!funcp)
a0714e2c 2766 return NULL;
f4c556ac 2767
3280af22
NIS
2768 if (!PL_rsfp_filters)
2769 PL_rsfp_filters = newAV();
16d20bd9 2770 if (!datasv)
561b68a9 2771 datasv = newSV(0);
862a34c6 2772 SvUPGRADE(datasv, SVt_PVIO);
8141890a 2773 IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
e0c19803 2774 IoFLAGS(datasv) |= IOf_FAKE_DIRP;
f4c556ac 2775 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
55662e27
JH
2776 FPTR2DPTR(void *, IoANY(datasv)),
2777 SvPV_nolen(datasv)));
3280af22
NIS
2778 av_unshift(PL_rsfp_filters, 1);
2779 av_store(PL_rsfp_filters, 0, datasv) ;
16d20bd9
AD
2780 return(datasv);
2781}
4e553d73 2782
16d20bd9
AD
2783
2784/* Delete most recently added instance of this filter function. */
a0d0e21e 2785void
864dbfa3 2786Perl_filter_del(pTHX_ filter_t funcp)
16d20bd9 2787{
97aff369 2788 dVAR;
e0c19803 2789 SV *datasv;
24801a4b 2790
33073adb 2791#ifdef DEBUGGING
55662e27
JH
2792 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
2793 FPTR2DPTR(void*, funcp)));
33073adb 2794#endif
3280af22 2795 if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
16d20bd9
AD
2796 return;
2797 /* if filter is on top of stack (usual case) just pop it off */
e0c19803 2798 datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
8141890a 2799 if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
e0c19803 2800 IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
4755096e 2801 IoANY(datasv) = (void *)NULL;
3280af22 2802 sv_free(av_pop(PL_rsfp_filters));
e50aee73 2803
16d20bd9
AD
2804 return;
2805 }
2806 /* we need to search for the correct entry and clear it */
cea2e8a9 2807 Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
16d20bd9
AD
2808}
2809
2810
1de9afcd
RGS
2811/* Invoke the idxth filter function for the current rsfp. */
2812/* maxlen 0 = read one text line */
16d20bd9 2813I32
864dbfa3 2814Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
a0d0e21e 2815{
97aff369 2816 dVAR;
16d20bd9
AD
2817 filter_t funcp;
2818 SV *datasv = NULL;
f482118e
NC
2819 /* This API is bad. It should have been using unsigned int for maxlen.
2820 Not sure if we want to change the API, but if not we should sanity
2821 check the value here. */
39cd7a59
NC
2822 const unsigned int correct_length
2823 = maxlen < 0 ?
2824#ifdef PERL_MICRO
2825 0x7FFFFFFF
2826#else
2827 INT_MAX
2828#endif
2829 : maxlen;
e50aee73 2830
3280af22 2831 if (!PL_rsfp_filters)
16d20bd9 2832 return -1;
1de9afcd 2833 if (idx > AvFILLp(PL_rsfp_filters)) { /* Any more filters? */
16d20bd9
AD
2834 /* Provide a default input filter to make life easy. */
2835 /* Note that we append to the line. This is handy. */
f4c556ac
GS
2836 DEBUG_P(PerlIO_printf(Perl_debug_log,
2837 "filter_read %d: from rsfp\n", idx));
f482118e 2838 if (correct_length) {
16d20bd9
AD
2839 /* Want a block */
2840 int len ;
f54cb97a 2841 const int old_len = SvCUR(buf_sv);
16d20bd9
AD
2842
2843 /* ensure buf_sv is large enough */
f482118e
NC
2844 SvGROW(buf_sv, (STRLEN)(old_len + correct_length)) ;
2845 if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len,
2846 correct_length)) <= 0) {
3280af22 2847 if (PerlIO_error(PL_rsfp))
37120919
AD
2848 return -1; /* error */
2849 else
2850 return 0 ; /* end of file */
2851 }
16d20bd9
AD
2852 SvCUR_set(buf_sv, old_len + len) ;
2853 } else {
2854 /* Want a line */
3280af22
NIS
2855 if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2856 if (PerlIO_error(PL_rsfp))
37120919
AD
2857 return -1; /* error */
2858 else
2859 return 0 ; /* end of file */
2860 }
16d20bd9
AD
2861 }
2862 return SvCUR(buf_sv);
2863 }
2864 /* Skip this filter slot if filter has been deleted */
1de9afcd 2865 if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
f4c556ac
GS
2866 DEBUG_P(PerlIO_printf(Perl_debug_log,
2867 "filter_read %d: skipped (filter deleted)\n",
2868 idx));
f482118e 2869 return FILTER_READ(idx+1, buf_sv, correct_length); /* recurse */
16d20bd9
AD
2870 }
2871 /* Get function pointer hidden within datasv */
8141890a 2872 funcp = DPTR2FPTR(filter_t, IoANY(datasv));
f4c556ac
GS
2873 DEBUG_P(PerlIO_printf(Perl_debug_log,
2874 "filter_read %d: via function %p (%s)\n",
ca0270c4 2875 idx, (void*)datasv, SvPV_nolen_const(datasv)));
16d20bd9
AD
2876 /* Call function. The function is expected to */
2877 /* call "FILTER_READ(idx+1, buf_sv)" first. */
37120919 2878 /* Return: <0:error, =0:eof, >0:not eof */
f482118e 2879 return (*funcp)(aTHX_ idx, buf_sv, correct_length);
16d20bd9
AD
2880}
2881
76e3520e 2882STATIC char *
cea2e8a9 2883S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
16d20bd9 2884{
97aff369 2885 dVAR;
c39cd008 2886#ifdef PERL_CR_FILTER
3280af22 2887 if (!PL_rsfp_filters) {
c39cd008 2888 filter_add(S_cr_textfilter,NULL);
a868473f
NIS
2889 }
2890#endif
3280af22 2891 if (PL_rsfp_filters) {
55497cff 2892 if (!append)
2893 SvCUR_set(sv, 0); /* start with empty line */
16d20bd9
AD
2894 if (FILTER_READ(0, sv, 0) > 0)
2895 return ( SvPVX(sv) ) ;
2896 else
bd61b366 2897 return NULL ;
16d20bd9 2898 }
9d116dd7 2899 else
fd049845 2900 return (sv_gets(sv, fp, append));
a0d0e21e
LW
2901}
2902
01ec43d0 2903STATIC HV *
7fc63493 2904S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
def3634b 2905{
97aff369 2906 dVAR;
def3634b
GS
2907 GV *gv;
2908
01ec43d0 2909 if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
def3634b
GS
2910 return PL_curstash;
2911
2912 if (len > 2 &&
2913 (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
90e5519e 2914 (gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVHV)))
01ec43d0
GS
2915 {
2916 return GvHV(gv); /* Foo:: */
def3634b
GS
2917 }
2918
2919 /* use constant CLASS => 'MyClass' */
c35e046a
AL
2920 gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
2921 if (gv && GvCV(gv)) {
2922 SV * const sv = cv_const_sv(GvCV(gv));
2923 if (sv)
83003860 2924 pkgname = SvPV_nolen_const(sv);
def3634b
GS
2925 }
2926
da51bb9b 2927 return gv_stashpv(pkgname, 0);
def3634b 2928}
a0d0e21e 2929
e3f73d4e
RGS
2930/*
2931 * S_readpipe_override
2932 * Check whether readpipe() is overriden, and generates the appropriate
2933 * optree, provided sublex_start() is called afterwards.
2934 */
2935STATIC void
1d51329b 2936S_readpipe_override(pTHX)
e3f73d4e
RGS
2937{
2938 GV **gvp;
2939 GV *gv_readpipe = gv_fetchpvs("readpipe", GV_NOTQUAL, SVt_PVCV);
2940 yylval.ival = OP_BACKTICK;
2941 if ((gv_readpipe
2942 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe))
2943 ||
2944 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readpipe", FALSE))
d5e716f5 2945 && (gv_readpipe = *gvp) && isGV_with_GP(gv_readpipe)
e3f73d4e
RGS
2946 && GvCVu(gv_readpipe) && GvIMPORTED_CV(gv_readpipe)))
2947 {
2948 PL_lex_op = (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
2949 append_elem(OP_LIST,
2950 newSVOP(OP_CONST, 0, &PL_sv_undef), /* value will be read later */
2951 newCVREF(0, newGVOP(OP_GV, 0, gv_readpipe))));
2952 }
2953 else {
2954 set_csh();
2955 }
2956}
2957
5db06880
NC
2958#ifdef PERL_MAD
2959 /*
2960 * Perl_madlex
2961 * The intent of this yylex wrapper is to minimize the changes to the
2962 * tokener when we aren't interested in collecting madprops. It remains
2963 * to be seen how successful this strategy will be...
2964 */
2965
2966int
2967Perl_madlex(pTHX)
2968{
2969 int optype;
2970 char *s = PL_bufptr;
2971
cd81e915
NC
2972 /* make sure PL_thiswhite is initialized */
2973 PL_thiswhite = 0;
2974 PL_thismad = 0;
5db06880 2975
cd81e915 2976 /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
5db06880
NC
2977 if (PL_pending_ident)
2978 return S_pending_ident(aTHX);
2979
2980 /* previous token ate up our whitespace? */
cd81e915
NC
2981 if (!PL_lasttoke && PL_nextwhite) {
2982 PL_thiswhite = PL_nextwhite;
2983 PL_nextwhite = 0;
5db06880
NC
2984 }
2985
2986 /* isolate the token, and figure out where it is without whitespace */
cd81e915
NC
2987 PL_realtokenstart = -1;
2988 PL_thistoken = 0;
5db06880
NC
2989 optype = yylex();
2990 s = PL_bufptr;
cd81e915 2991 assert(PL_curforce < 0);
5db06880 2992
cd81e915
NC
2993 if (!PL_thismad || PL_thismad->mad_key == '^') { /* not forced already? */
2994 if (!PL_thistoken) {
2995 if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
6b29d1f5 2996 PL_thistoken = newSVpvs("");
5db06880 2997 else {
c35e046a 2998 char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
cd81e915 2999 PL_thistoken = newSVpvn(tstart, s - tstart);
5db06880
NC
3000 }
3001 }
cd81e915
NC
3002 if (PL_thismad) /* install head */
3003 CURMAD('X', PL_thistoken);
5db06880
NC
3004 }
3005
3006 /* last whitespace of a sublex? */
cd81e915
NC
3007 if (optype == ')' && PL_endwhite) {
3008 CURMAD('X', PL_endwhite);
5db06880
NC
3009 }
3010
cd81e915 3011 if (!PL_thismad) {
5db06880
NC
3012
3013 /* if no whitespace and we're at EOF, bail. Otherwise fake EOF below. */
cd81e915
NC
3014 if (!PL_thiswhite && !PL_endwhite && !optype) {
3015 sv_free(PL_thistoken);
3016 PL_thistoken = 0;
5db06880
NC
3017 return 0;
3018 }
3019
3020 /* put off final whitespace till peg */
3021 if (optype == ';' && !PL_rsfp) {
cd81e915
NC
3022 PL_nextwhite = PL_thiswhite;
3023 PL_thiswhite = 0;
5db06880 3024 }
cd81e915
NC
3025 else if (PL_thisopen) {
3026 CURMAD('q', PL_thisopen);
3027 if (PL_thistoken)
3028 sv_free(PL_thistoken);
3029 PL_thistoken = 0;
5db06880
NC
3030 }
3031 else {
3032 /* Store actual token text as madprop X */
cd81e915 3033 CURMAD('X', PL_thistoken);
5db06880
NC
3034 }
3035
cd81e915 3036 if (PL_thiswhite) {
5db06880 3037 /* add preceding whitespace as madprop _ */
cd81e915 3038 CURMAD('_', PL_thiswhite);
5db06880
NC
3039 }
3040
cd81e915 3041 if (PL_thisstuff) {
5db06880 3042 /* add quoted material as madprop = */
cd81e915 3043 CURMAD('=', PL_thisstuff);
5db06880
NC
3044 }
3045
cd81e915 3046 if (PL_thisclose) {
5db06880 3047 /* add terminating quote as madprop Q */
cd81e915 3048 CURMAD('Q', PL_thisclose);
5db06880
NC
3049 }
3050 }
3051
3052 /* special processing based on optype */
3053
3054 switch (optype) {
3055
3056 /* opval doesn't need a TOKEN since it can already store mp */
3057 case WORD:
3058 case METHOD:
3059 case FUNCMETH:
3060 case THING:
3061 case PMFUNC:
3062 case PRIVATEREF:
3063 case FUNC0SUB:
3064 case UNIOPSUB:
3065 case LSTOPSUB:
3066 if (yylval.opval)
cd81e915
NC
3067 append_madprops(PL_thismad, yylval.opval, 0);
3068 PL_thismad = 0;
5db06880
NC
3069 return optype;
3070
3071 /* fake EOF */
3072 case 0:
3073 optype = PEG;
cd81e915
NC
3074 if (PL_endwhite) {
3075 addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
3076 PL_endwhite = 0;
5db06880
NC
3077 }
3078 break;
3079
3080 case ']':
3081 case '}':
cd81e915 3082 if (PL_faketokens)
5db06880
NC
3083 break;
3084 /* remember any fake bracket that lexer is about to discard */
3085 if (PL_lex_brackets == 1 &&
3086 ((expectation)PL_lex_brackstack[0] & XFAKEBRACK))
3087 {
3088 s = PL_bufptr;
3089 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3090 s++;
3091 if (*s == '}') {
cd81e915
NC
3092 PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
3093 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3094 PL_thiswhite = 0;
5db06880
NC
3095 PL_bufptr = s - 1;
3096 break; /* don't bother looking for trailing comment */
3097 }
3098 else
3099 s = PL_bufptr;
3100 }
3101 if (optype == ']')
3102 break;
3103 /* FALLTHROUGH */
3104
3105 /* attach a trailing comment to its statement instead of next token */
3106 case ';':
cd81e915 3107 if (PL_faketokens)
5db06880
NC
3108 break;
3109 if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
3110 s = PL_bufptr;
3111 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
3112 s++;
3113 if (*s == '\n' || *s == '#') {
3114 while (s < PL_bufend && *s != '\n')
3115 s++;
3116 if (s < PL_bufend)
3117 s++;
cd81e915
NC
3118 PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
3119 addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
3120 PL_thiswhite = 0;
5db06880
NC
3121 PL_bufptr = s;
3122 }
3123 }
3124 break;
3125
3126 /* pval */
3127 case LABEL:
3128 break;
3129
3130 /* ival */
3131 default:
3132 break;
3133
3134 }
3135
3136 /* Create new token struct. Note: opvals return early above. */
cd81e915
NC
3137 yylval.tkval = newTOKEN(optype, yylval, PL_thismad);
3138 PL_thismad = 0;
5db06880
NC
3139 return optype;
3140}
3141#endif
3142
468aa647 3143STATIC char *
cc6ed77d 3144S_tokenize_use(pTHX_ int is_use, char *s) {
97aff369 3145 dVAR;
468aa647
RGS
3146 if (PL_expect != XSTATE)
3147 yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
3148 is_use ? "use" : "no"));
29595ff2 3149 s = SKIPSPACE1(s);
468aa647
RGS
3150 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
3151 s = force_version(s, TRUE);
29595ff2 3152 if (*s == ';' || (s = SKIPSPACE1(s), *s == ';')) {
cd81e915 3153 start_force(PL_curforce);
9ded7720 3154 NEXTVAL_NEXTTOKE.opval = NULL;
468aa647
RGS
3155 force_next(WORD);
3156 }
3157 else if (*s == 'v') {
3158 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3159 s = force_version(s, FALSE);
3160 }
3161 }
3162 else {
3163 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3164 s = force_version(s, FALSE);
3165 }
3166 yylval.ival = is_use;
3167 return s;
3168}
748a9306 3169#ifdef DEBUGGING
27da23d5 3170 static const char* const exp_name[] =
09bef843 3171 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
27308ded 3172 "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
09bef843 3173 };
748a9306 3174#endif
463ee0b2 3175
02aa26ce
NT
3176/*
3177 yylex
3178
3179 Works out what to call the token just pulled out of the input
3180 stream. The yacc parser takes care of taking the ops we return and
3181 stitching them into a tree.
3182
3183 Returns:
3184 PRIVATEREF
3185
3186 Structure:
3187 if read an identifier
3188 if we're in a my declaration
3189 croak if they tried to say my($foo::bar)
3190 build the ops for a my() declaration
3191 if it's an access to a my() variable
3192 are we in a sort block?
3193 croak if my($a); $a <=> $b
3194 build ops for access to a my() variable
3195 if in a dq string, and they've said @foo and we can't find @foo
3196 croak
3197 build ops for a bareword
3198 if we already built the token before, use it.
3199*/
3200
20141f0e 3201
dba4d153
JH
3202#ifdef __SC__
3203#pragma segment Perl_yylex
3204#endif
dba4d153 3205int
dba4d153 3206Perl_yylex(pTHX)
20141f0e 3207{
97aff369 3208 dVAR;
3afc138a 3209 register char *s = PL_bufptr;
378cc40b 3210 register char *d;
463ee0b2 3211 STRLEN len;
aa7440fb 3212 bool bof = FALSE;
a687059c 3213
10edeb5d
JH
3214 /* orig_keyword, gvp, and gv are initialized here because
3215 * jump to the label just_a_word_zero can bypass their
3216 * initialization later. */
3217 I32 orig_keyword = 0;
3218 GV *gv = NULL;
3219 GV **gvp = NULL;
3220
bbf60fe6 3221 DEBUG_T( {
396482e1 3222 SV* tmp = newSVpvs("");
b6007c36
DM
3223 PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
3224 (IV)CopLINE(PL_curcop),
3225 lex_state_names[PL_lex_state],
3226 exp_name[PL_expect],
3227 pv_display(tmp, s, strlen(s), 0, 60));
3228 SvREFCNT_dec(tmp);
bbf60fe6 3229 } );
02aa26ce 3230 /* check if there's an identifier for us to look at */
ba979b31 3231 if (PL_pending_ident)
bbf60fe6 3232 return REPORT(S_pending_ident(aTHX));
bbce6d69 3233
02aa26ce
NT
3234 /* no identifier pending identification */
3235
3280af22 3236 switch (PL_lex_state) {
79072805
LW
3237#ifdef COMMENTARY
3238 case LEX_NORMAL: /* Some compilers will produce faster */
3239 case LEX_INTERPNORMAL: /* code if we comment these out. */
3240 break;
3241#endif
3242
09bef843 3243 /* when we've already built the next token, just pull it out of the queue */
79072805 3244 case LEX_KNOWNEXT:
5db06880
NC
3245#ifdef PERL_MAD
3246 PL_lasttoke--;
3247 yylval = PL_nexttoke[PL_lasttoke].next_val;
3248 if (PL_madskills) {
cd81e915 3249 PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
5db06880 3250 PL_nexttoke[PL_lasttoke].next_mad = 0;
cd81e915
NC
3251 if (PL_thismad && PL_thismad->mad_key == '_') {
3252 PL_thiswhite = (SV*)PL_thismad->mad_val;
3253 PL_thismad->mad_val = 0;
3254 mad_free(PL_thismad);
3255 PL_thismad = 0;
5db06880
NC
3256 }
3257 }
3258 if (!PL_lasttoke) {
3259 PL_lex_state = PL_lex_defer;
3260 PL_expect = PL_lex_expect;
3261 PL_lex_defer = LEX_NORMAL;
3262 if (!PL_nexttoke[PL_lasttoke].next_type)
3263 return yylex();
3264 }
3265#else
3280af22 3266 PL_nexttoke--;
5db06880 3267 yylval = PL_nextval[PL_nexttoke];
3280af22
NIS
3268 if (!PL_nexttoke) {
3269 PL_lex_state = PL_lex_defer;
3270 PL_expect = PL_lex_expect;
3271 PL_lex_defer = LEX_NORMAL;
463ee0b2 3272 }
5db06880
NC
3273#endif
3274#ifdef PERL_MAD
3275 /* FIXME - can these be merged? */
3276 return(PL_nexttoke[PL_lasttoke].next_type);
3277#else
bbf60fe6 3278 return REPORT(PL_nexttype[PL_nexttoke]);
5db06880 3279#endif
79072805 3280
02aa26ce 3281 /* interpolated case modifiers like \L \U, including \Q and \E.
3280af22 3282 when we get here, PL_bufptr is at the \
02aa26ce 3283 */
79072805
LW
3284 case LEX_INTERPCASEMOD:
3285#ifdef DEBUGGING
3280af22 3286 if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
cea2e8a9 3287 Perl_croak(aTHX_ "panic: INTERPCASEMOD");
79072805 3288#endif
02aa26ce 3289 /* handle \E or end of string */
3280af22 3290 if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
02aa26ce 3291 /* if at a \E */
3280af22 3292 if (PL_lex_casemods) {
f54cb97a 3293 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
3280af22 3294 PL_lex_casestack[PL_lex_casemods] = '\0';
02aa26ce 3295
3792a11b
NC
3296 if (PL_bufptr != PL_bufend
3297 && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
3280af22
NIS
3298 PL_bufptr += 2;
3299 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
3300#ifdef PERL_MAD
3301 if (PL_madskills)
6b29d1f5 3302 PL_thistoken = newSVpvs("\\E");
5db06880 3303#endif
a0d0e21e 3304 }
bbf60fe6 3305 return REPORT(')');
79072805 3306 }
5db06880
NC
3307#ifdef PERL_MAD
3308 while (PL_bufptr != PL_bufend &&
3309 PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
cd81e915 3310 if (!PL_thiswhite)
6b29d1f5 3311 PL_thiswhite = newSVpvs("");
cd81e915 3312 sv_catpvn(PL_thiswhite, PL_bufptr, 2);
5db06880
NC
3313 PL_bufptr += 2;
3314 }
3315#else
3280af22
NIS
3316 if (PL_bufptr != PL_bufend)
3317 PL_bufptr += 2;
5db06880 3318#endif
3280af22 3319 PL_lex_state = LEX_INTERPCONCAT;
cea2e8a9 3320 return yylex();
79072805
LW
3321 }
3322 else {
607df283 3323 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 3324 "### Saw case modifier\n"); });
3280af22 3325 s = PL_bufptr + 1;
6e909404 3326 if (s[1] == '\\' && s[2] == 'E') {
5db06880 3327#ifdef PERL_MAD
cd81e915 3328 if (!PL_thiswhite)
6b29d1f5 3329 PL_thiswhite = newSVpvs("");
cd81e915 3330 sv_catpvn(PL_thiswhite, PL_bufptr, 4);
5db06880 3331#endif
89122651 3332 PL_bufptr = s + 3;
6e909404
JH
3333 PL_lex_state = LEX_INTERPCONCAT;
3334 return yylex();
a0d0e21e 3335 }
6e909404 3336 else {
90771dc0 3337 I32 tmp;
5db06880
NC
3338 if (!PL_madskills) /* when just compiling don't need correct */
3339 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
3340 tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */
3792a11b 3341 if ((*s == 'L' || *s == 'U') &&
6e909404
JH
3342 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
3343 PL_lex_casestack[--PL_lex_casemods] = '\0';
bbf60fe6 3344 return REPORT(')');
6e909404
JH
3345 }
3346 if (PL_lex_casemods > 10)
3347 Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
3348 PL_lex_casestack[PL_lex_casemods++] = *s;
3349 PL_lex_casestack[PL_lex_casemods] = '\0';
3350 PL_lex_state = LEX_INTERPCONCAT;
cd81e915 3351 start_force(PL_curforce);
9ded7720 3352 NEXTVAL_NEXTTOKE.ival = 0;
6e909404 3353 force_next('(');
cd81e915 3354 start_force(PL_curforce);
6e909404 3355 if (*s == 'l')
9ded7720 3356 NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
6e909404 3357 else if (*s == 'u')
9ded7720 3358 NEXTVAL_NEXTTOKE.ival = OP_UCFIRST;
6e909404 3359 else if (*s == 'L')
9ded7720 3360 NEXTVAL_NEXTTOKE.ival = OP_LC;
6e909404 3361 else if (*s == 'U')
9ded7720 3362 NEXTVAL_NEXTTOKE.ival = OP_UC;
6e909404 3363 else if (*s == 'Q')
9ded7720 3364 NEXTVAL_NEXTTOKE.ival = OP_QUOTEMETA;
6e909404
JH
3365 else
3366 Perl_croak(aTHX_ "panic: yylex");
5db06880 3367 if (PL_madskills) {
6b29d1f5 3368 SV* const tmpsv = newSVpvs("");
5db06880
NC
3369 Perl_sv_catpvf(aTHX_ tmpsv, "\\%c", *s);
3370 curmad('_', tmpsv);
3371 }
6e909404 3372 PL_bufptr = s + 1;
a0d0e21e 3373 }
79072805 3374 force_next(FUNC);
3280af22
NIS
3375 if (PL_lex_starts) {
3376 s = PL_bufptr;
3377 PL_lex_starts = 0;
5db06880
NC
3378#ifdef PERL_MAD
3379 if (PL_madskills) {
cd81e915
NC
3380 if (PL_thistoken)
3381 sv_free(PL_thistoken);
6b29d1f5 3382 PL_thistoken = newSVpvs("");
5db06880
NC
3383 }
3384#endif
131b3ad0
DM
3385 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3386 if (PL_lex_casemods == 1 && PL_lex_inpat)
3387 OPERATOR(',');
3388 else
3389 Aop(OP_CONCAT);
79072805
LW
3390 }
3391 else
cea2e8a9 3392 return yylex();
79072805
LW
3393 }
3394
55497cff 3395 case LEX_INTERPPUSH:
bbf60fe6 3396 return REPORT(sublex_push());
55497cff 3397
79072805 3398 case LEX_INTERPSTART:
3280af22 3399 if (PL_bufptr == PL_bufend)
bbf60fe6 3400 return REPORT(sublex_done());
607df283 3401 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 3402 "### Interpolated variable\n"); });
3280af22
NIS
3403 PL_expect = XTERM;
3404 PL_lex_dojoin = (*PL_bufptr == '@');
3405 PL_lex_state = LEX_INTERPNORMAL;
3406 if (PL_lex_dojoin) {
cd81e915 3407 start_force(PL_curforce);
9ded7720 3408 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3409 force_next(',');
cd81e915 3410 start_force(PL_curforce);
a0d0e21e 3411 force_ident("\"", '$');
cd81e915 3412 start_force(PL_curforce);
9ded7720 3413 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3414 force_next('$');
cd81e915 3415 start_force(PL_curforce);
9ded7720 3416 NEXTVAL_NEXTTOKE.ival = 0;
79072805 3417 force_next('(');
cd81e915 3418 start_force(PL_curforce);
9ded7720 3419 NEXTVAL_NEXTTOKE.ival = OP_JOIN; /* emulate join($", ...) */
79072805
LW
3420 force_next(FUNC);
3421 }
3280af22
NIS
3422 if (PL_lex_starts++) {
3423 s = PL_bufptr;
5db06880
NC
3424#ifdef PERL_MAD
3425 if (PL_madskills) {
cd81e915
NC
3426 if (PL_thistoken)
3427 sv_free(PL_thistoken);
6b29d1f5 3428 PL_thistoken = newSVpvs("");
5db06880
NC
3429 }
3430#endif
131b3ad0
DM
3431 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3432 if (!PL_lex_casemods && PL_lex_inpat)
3433 OPERATOR(',');
3434 else
3435 Aop(OP_CONCAT);
79072805 3436 }
cea2e8a9 3437 return yylex();
79072805
LW
3438
3439 case LEX_INTERPENDMAYBE:
3280af22
NIS
3440 if (intuit_more(PL_bufptr)) {
3441 PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
79072805
LW
3442 break;
3443 }
3444 /* FALL THROUGH */
3445
3446 case LEX_INTERPEND:
3280af22
NIS
3447 if (PL_lex_dojoin) {
3448 PL_lex_dojoin = FALSE;
3449 PL_lex_state = LEX_INTERPCONCAT;
5db06880
NC
3450#ifdef PERL_MAD
3451 if (PL_madskills) {
cd81e915
NC
3452 if (PL_thistoken)
3453 sv_free(PL_thistoken);
6b29d1f5 3454 PL_thistoken = newSVpvs("");
5db06880
NC
3455 }
3456#endif
bbf60fe6 3457 return REPORT(')');
79072805 3458 }
43a16006 3459 if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
25da4f38 3460 && SvEVALED(PL_lex_repl))
43a16006 3461 {
e9fa98b2 3462 if (PL_bufptr != PL_bufend)
cea2e8a9 3463 Perl_croak(aTHX_ "Bad evalled substitution pattern");
a0714e2c 3464 PL_lex_repl = NULL;
e9fa98b2 3465 }
79072805
LW
3466 /* FALLTHROUGH */
3467 case LEX_INTERPCONCAT:
3468#ifdef DEBUGGING
3280af22 3469 if (PL_lex_brackets)
cea2e8a9 3470 Perl_croak(aTHX_ "panic: INTERPCONCAT");
79072805 3471#endif
3280af22 3472 if (PL_bufptr == PL_bufend)
bbf60fe6 3473 return REPORT(sublex_done());
79072805 3474
3280af22
NIS
3475 if (SvIVX(PL_linestr) == '\'') {
3476 SV *sv = newSVsv(PL_linestr);
3477 if (!PL_lex_inpat)
76e3520e 3478 sv = tokeq(sv);
3280af22 3479 else if ( PL_hints & HINT_NEW_RE )
b3ac6de7 3480 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
79072805 3481 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3280af22 3482 s = PL_bufend;
79072805
LW
3483 }
3484 else {
3280af22 3485 s = scan_const(PL_bufptr);
79072805 3486 if (*s == '\\')
3280af22 3487 PL_lex_state = LEX_INTERPCASEMOD;
79072805 3488 else
3280af22 3489 PL_lex_state = LEX_INTERPSTART;
79072805
LW
3490 }
3491
3280af22 3492 if (s != PL_bufptr) {
cd81e915 3493 start_force(PL_curforce);
5db06880
NC
3494 if (PL_madskills) {
3495 curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
3496 }
9ded7720 3497 NEXTVAL_NEXTTOKE = yylval;
3280af22 3498 PL_expect = XTERM;
79072805 3499 force_next(THING);
131b3ad0 3500 if (PL_lex_starts++) {
5db06880
NC
3501#ifdef PERL_MAD
3502 if (PL_madskills) {
cd81e915
NC
3503 if (PL_thistoken)
3504 sv_free(PL_thistoken);
6b29d1f5 3505 PL_thistoken = newSVpvs("");
5db06880
NC
3506 }
3507#endif
131b3ad0
DM
3508 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
3509 if (!PL_lex_casemods && PL_lex_inpat)
3510 OPERATOR(',');
3511 else
3512 Aop(OP_CONCAT);
3513 }
79072805 3514 else {
3280af22 3515 PL_bufptr = s;
cea2e8a9 3516 return yylex();
79072805
LW
3517 }
3518 }
3519
cea2e8a9 3520 return yylex();
a0d0e21e 3521 case LEX_FORMLINE:
3280af22
NIS
3522 PL_lex_state = LEX_NORMAL;
3523 s = scan_formline(PL_bufptr);
3524 if (!PL_lex_formbrack)
a0d0e21e
LW
3525 goto rightbracket;
3526 OPERATOR(';');
79072805
LW
3527 }
3528
3280af22
NIS
3529 s = PL_bufptr;
3530 PL_oldoldbufptr = PL_oldbufptr;
3531 PL_oldbufptr = s;
463ee0b2
LW
3532
3533 retry:
5db06880 3534#ifdef PERL_MAD
cd81e915
NC
3535 if (PL_thistoken) {
3536 sv_free(PL_thistoken);
3537 PL_thistoken = 0;
5db06880 3538 }
cd81e915 3539 PL_realtokenstart = s - SvPVX(PL_linestr); /* assume but undo on ws */
5db06880 3540#endif
378cc40b
LW
3541 switch (*s) {
3542 default:
7e2040f0 3543 if (isIDFIRST_lazy_if(s,UTF))
834a4ddd 3544 goto keylookup;
cea2e8a9 3545 Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
e929a76b
LW
3546 case 4:
3547 case 26:
3548 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 3549 case 0:
5db06880
NC
3550#ifdef PERL_MAD
3551 if (PL_madskills)
cd81e915 3552 PL_faketokens = 0;
5db06880 3553#endif
3280af22
NIS
3554 if (!PL_rsfp) {
3555 PL_last_uni = 0;
3556 PL_last_lop = 0;
c5ee2135 3557 if (PL_lex_brackets) {
10edeb5d
JH
3558 yyerror((const char *)
3559 (PL_lex_formbrack
3560 ? "Format not terminated"
3561 : "Missing right curly or square bracket"));
c5ee2135 3562 }
4e553d73 3563 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 3564 "### Tokener got EOF\n");
5f80b19c 3565 } );
79072805 3566 TOKEN(0);
463ee0b2 3567 }
3280af22 3568 if (s++ < PL_bufend)
a687059c 3569 goto retry; /* ignore stray nulls */
3280af22
NIS
3570 PL_last_uni = 0;
3571 PL_last_lop = 0;
3572 if (!PL_in_eval && !PL_preambled) {
3573 PL_preambled = TRUE;
5db06880
NC
3574#ifdef PERL_MAD
3575 if (PL_madskills)
cd81e915 3576 PL_faketokens = 1;
5db06880 3577#endif
3280af22
NIS
3578 sv_setpv(PL_linestr,incl_perldb());
3579 if (SvCUR(PL_linestr))
396482e1 3580 sv_catpvs(PL_linestr,";");
3280af22
NIS
3581 if (PL_preambleav){
3582 while(AvFILLp(PL_preambleav) >= 0) {
3583 SV *tmpsv = av_shift(PL_preambleav);
3584 sv_catsv(PL_linestr, tmpsv);
396482e1 3585 sv_catpvs(PL_linestr, ";");
91b7def8 3586 sv_free(tmpsv);
3587 }
3280af22
NIS
3588 sv_free((SV*)PL_preambleav);
3589 PL_preambleav = NULL;
91b7def8 3590 }
3280af22 3591 if (PL_minus_n || PL_minus_p) {
396482e1 3592 sv_catpvs(PL_linestr, "LINE: while (<>) {");
3280af22 3593 if (PL_minus_l)
396482e1 3594 sv_catpvs(PL_linestr,"chomp;");
3280af22 3595 if (PL_minus_a) {
3280af22 3596 if (PL_minus_F) {
3792a11b
NC
3597 if ((*PL_splitstr == '/' || *PL_splitstr == '\''
3598 || *PL_splitstr == '"')
3280af22 3599 && strchr(PL_splitstr + 1, *PL_splitstr))
3db68c4c 3600 Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
54310121 3601 else {
c8ef6a4b
NC
3602 /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
3603 bytes can be used as quoting characters. :-) */
dd374669 3604 const char *splits = PL_splitstr;
91d456ae 3605 sv_catpvs(PL_linestr, "our @F=split(q\0");
48c4c863
NC
3606 do {
3607 /* Need to \ \s */
dd374669
AL
3608 if (*splits == '\\')
3609 sv_catpvn(PL_linestr, splits, 1);
3610 sv_catpvn(PL_linestr, splits, 1);
3611 } while (*splits++);
48c4c863
NC
3612 /* This loop will embed the trailing NUL of
3613 PL_linestr as the last thing it does before
3614 terminating. */
396482e1 3615 sv_catpvs(PL_linestr, ");");
54310121 3616 }
2304df62
AD
3617 }
3618 else
396482e1 3619 sv_catpvs(PL_linestr,"our @F=split(' ');");
2304df62 3620 }
79072805 3621 }
bc9b29db 3622 if (PL_minus_E)
396482e1
GA
3623 sv_catpvs(PL_linestr,"use feature ':5.10';");
3624 sv_catpvs(PL_linestr, "\n");
3280af22
NIS
3625 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3626 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3627 PL_last_lop = PL_last_uni = NULL;
80a702cd 3628 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 3629 update_debugger_info(PL_linestr, NULL, 0);
79072805 3630 goto retry;
a687059c 3631 }
e929a76b 3632 do {
aa7440fb 3633 bof = PL_rsfp ? TRUE : FALSE;
bd61b366 3634 if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == NULL) {
7e28d3af 3635 fake_eof:
5db06880 3636#ifdef PERL_MAD
cd81e915 3637 PL_realtokenstart = -1;
5db06880 3638#endif
7e28d3af
JH
3639 if (PL_rsfp) {
3640 if (PL_preprocess && !PL_in_eval)
3641 (void)PerlProc_pclose(PL_rsfp);
3642 else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
3643 PerlIO_clearerr(PL_rsfp);
3644 else
3645 (void)PerlIO_close(PL_rsfp);
4608196e 3646 PL_rsfp = NULL;
7e28d3af
JH
3647 PL_doextract = FALSE;
3648 }
3649 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
5db06880
NC
3650#ifdef PERL_MAD
3651 if (PL_madskills)
cd81e915 3652 PL_faketokens = 1;
5db06880 3653#endif
10edeb5d
JH
3654 sv_setpv(PL_linestr,
3655 (const char *)
3656 (PL_minus_p
3657 ? ";}continue{print;}" : ";}"));
7e28d3af
JH
3658 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3659 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3660 PL_last_lop = PL_last_uni = NULL;
7e28d3af
JH
3661 PL_minus_n = PL_minus_p = 0;
3662 goto retry;
3663 }
3664 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
bd61b366 3665 PL_last_lop = PL_last_uni = NULL;
c69006e4 3666 sv_setpvn(PL_linestr,"",0);
7e28d3af
JH
3667 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
3668 }
7aa207d6
JH
3669 /* If it looks like the start of a BOM or raw UTF-16,
3670 * check if it in fact is. */
3671 else if (bof &&
3672 (*s == 0 ||
3673 *(U8*)s == 0xEF ||
3674 *(U8*)s >= 0xFE ||
3675 s[1] == 0)) {
226017aa 3676#ifdef PERLIO_IS_STDIO
e3f494f1
JH
3677# ifdef __GNU_LIBRARY__
3678# if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
226017aa
DD
3679# define FTELL_FOR_PIPE_IS_BROKEN
3680# endif
e3f494f1
JH
3681# else
3682# ifdef __GLIBC__
3683# if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
3684# define FTELL_FOR_PIPE_IS_BROKEN
3685# endif
3686# endif
226017aa
DD
3687# endif
3688#endif
3689#ifdef FTELL_FOR_PIPE_IS_BROKEN
3690 /* This loses the possibility to detect the bof
3691 * situation on perl -P when the libc5 is being used.
3692 * Workaround? Maybe attach some extra state to PL_rsfp?
3693 */
3694 if (!PL_preprocess)
7e28d3af 3695 bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
226017aa 3696#else
eb160463 3697 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
226017aa 3698#endif
7e28d3af 3699 if (bof) {
3280af22 3700 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 3701 s = swallow_bom((U8*)s);
e929a76b 3702 }
378cc40b 3703 }
3280af22 3704 if (PL_doextract) {
a0d0e21e 3705 /* Incest with pod. */
5db06880
NC
3706#ifdef PERL_MAD
3707 if (PL_madskills)
cd81e915 3708 sv_catsv(PL_thiswhite, PL_linestr);
5db06880 3709#endif
01a57ef7 3710 if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) {
c69006e4 3711 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
3712 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3713 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3714 PL_last_lop = PL_last_uni = NULL;
3280af22 3715 PL_doextract = FALSE;
a0d0e21e 3716 }
4e553d73 3717 }
463ee0b2 3718 incline(s);
3280af22
NIS
3719 } while (PL_doextract);
3720 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
80a702cd 3721 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 3722 update_debugger_info(PL_linestr, NULL, 0);
3280af22 3723 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3724 PL_last_lop = PL_last_uni = NULL;
57843af0 3725 if (CopLINE(PL_curcop) == 1) {
3280af22 3726 while (s < PL_bufend && isSPACE(*s))
79072805 3727 s++;
a0d0e21e 3728 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 3729 s++;
5db06880
NC
3730#ifdef PERL_MAD
3731 if (PL_madskills)
cd81e915 3732 PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
5db06880 3733#endif
bd61b366 3734 d = NULL;
3280af22 3735 if (!PL_in_eval) {
44a8e56a 3736 if (*s == '#' && *(s+1) == '!')
3737 d = s + 2;
3738#ifdef ALTERNATE_SHEBANG
3739 else {
bfed75c6 3740 static char const as[] = ALTERNATE_SHEBANG;
44a8e56a 3741 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
3742 d = s + (sizeof(as) - 1);
3743 }
3744#endif /* ALTERNATE_SHEBANG */
3745 }
3746 if (d) {
b8378b72 3747 char *ipath;
774d564b 3748 char *ipathend;
b8378b72 3749
774d564b 3750 while (isSPACE(*d))
b8378b72
CS
3751 d++;
3752 ipath = d;
774d564b 3753 while (*d && !isSPACE(*d))
3754 d++;
3755 ipathend = d;
3756
3757#ifdef ARG_ZERO_IS_SCRIPT
3758 if (ipathend > ipath) {
3759 /*
3760 * HP-UX (at least) sets argv[0] to the script name,
3761 * which makes $^X incorrect. And Digital UNIX and Linux,
3762 * at least, set argv[0] to the basename of the Perl
3763 * interpreter. So, having found "#!", we'll set it right.
3764 */
fafc274c
NC
3765 SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
3766 SVt_PV)); /* $^X */
774d564b 3767 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 3768 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 3769 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 3770 SvSETMAGIC(x);
3771 }
556c1dec
JH
3772 else {
3773 STRLEN blen;
3774 STRLEN llen;
cfd0369c 3775 const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
9d4ba2ae 3776 const char * const lstart = SvPV_const(x,llen);
556c1dec
JH
3777 if (llen < blen) {
3778 bstart += blen - llen;
3779 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
3780 sv_setpvn(x, ipath, ipathend - ipath);
3781 SvSETMAGIC(x);
3782 }
3783 }
3784 }
774d564b 3785 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 3786 }
774d564b 3787#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
3788
3789 /*
3790 * Look for options.
3791 */
748a9306 3792 d = instr(s,"perl -");
84e30d1a 3793 if (!d) {
748a9306 3794 d = instr(s,"perl");
84e30d1a
GS
3795#if defined(DOSISH)
3796 /* avoid getting into infinite loops when shebang
3797 * line contains "Perl" rather than "perl" */
3798 if (!d) {
3799 for (d = ipathend-4; d >= ipath; --d) {
3800 if ((*d == 'p' || *d == 'P')
3801 && !ibcmp(d, "perl", 4))
3802 {
3803 break;
3804 }
3805 }
3806 if (d < ipath)
bd61b366 3807 d = NULL;
84e30d1a
GS
3808 }
3809#endif
3810 }
44a8e56a 3811#ifdef ALTERNATE_SHEBANG
3812 /*
3813 * If the ALTERNATE_SHEBANG on this system starts with a
3814 * character that can be part of a Perl expression, then if
3815 * we see it but not "perl", we're probably looking at the
3816 * start of Perl code, not a request to hand off to some
3817 * other interpreter. Similarly, if "perl" is there, but
3818 * not in the first 'word' of the line, we assume the line
3819 * contains the start of the Perl program.
44a8e56a 3820 */
3821 if (d && *s != '#') {
f54cb97a 3822 const char *c = ipath;
44a8e56a 3823 while (*c && !strchr("; \t\r\n\f\v#", *c))
3824 c++;
3825 if (c < d)
bd61b366 3826 d = NULL; /* "perl" not in first word; ignore */
44a8e56a 3827 else
3828 *s = '#'; /* Don't try to parse shebang line */
3829 }
774d564b 3830#endif /* ALTERNATE_SHEBANG */
bf4acbe4 3831#ifndef MACOS_TRADITIONAL
748a9306 3832 if (!d &&
44a8e56a 3833 *s == '#' &&
774d564b 3834 ipathend > ipath &&
3280af22 3835 !PL_minus_c &&
748a9306 3836 !instr(s,"indir") &&
3280af22 3837 instr(PL_origargv[0],"perl"))
748a9306 3838 {
27da23d5 3839 dVAR;
9f68db38 3840 char **newargv;
9f68db38 3841
774d564b 3842 *ipathend = '\0';
3843 s = ipathend + 1;
3280af22 3844 while (s < PL_bufend && isSPACE(*s))
9f68db38 3845 s++;
3280af22 3846 if (s < PL_bufend) {
a02a5408 3847 Newxz(newargv,PL_origargc+3,char*);
9f68db38 3848 newargv[1] = s;
3280af22 3849 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
3850 s++;
3851 *s = '\0';
3280af22 3852 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
3853 }
3854 else
3280af22 3855 newargv = PL_origargv;
774d564b 3856 newargv[0] = ipath;
b35112e7 3857 PERL_FPU_PRE_EXEC
b4748376 3858 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 3859 PERL_FPU_POST_EXEC
cea2e8a9 3860 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 3861 }
bf4acbe4 3862#endif
748a9306 3863 if (d) {
c35e046a
AL
3864 while (*d && !isSPACE(*d))
3865 d++;
3866 while (SPACE_OR_TAB(*d))
3867 d++;
748a9306
LW
3868
3869 if (*d++ == '-') {
f54cb97a 3870 const bool switches_done = PL_doswitches;
fb993905
GA
3871 const U32 oldpdb = PL_perldb;
3872 const bool oldn = PL_minus_n;
3873 const bool oldp = PL_minus_p;
3874
8cc95fdb 3875 do {
3ffe3ee4 3876 if (*d == 'M' || *d == 'm' || *d == 'C') {
9d4ba2ae 3877 const char * const m = d;
d4c19fe8
AL
3878 while (*d && !isSPACE(*d))
3879 d++;
cea2e8a9 3880 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
8cc95fdb 3881 (int)(d - m), m);
3882 }
97bd5664 3883 d = moreswitches(d);
8cc95fdb 3884 } while (d);
f0b2cf55
YST
3885 if (PL_doswitches && !switches_done) {
3886 int argc = PL_origargc;
3887 char **argv = PL_origargv;
3888 do {
3889 argc--,argv++;
3890 } while (argc && argv[0][0] == '-' && argv[0][1]);
3891 init_argv_symbols(argc,argv);
3892 }
155aba94
GS
3893 if ((PERLDB_LINE && !oldpdb) ||
3894 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 3895 /* if we have already added "LINE: while (<>) {",
3896 we must not do it again */
748a9306 3897 {
c69006e4 3898 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
3899 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
3900 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 3901 PL_last_lop = PL_last_uni = NULL;
3280af22 3902 PL_preambled = FALSE;
84902520 3903 if (PERLDB_LINE)
3280af22 3904 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
3905 goto retry;
3906 }
a0d0e21e 3907 }
79072805 3908 }
9f68db38 3909 }
79072805 3910 }
3280af22
NIS
3911 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3912 PL_bufptr = s;
3913 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3914 return yylex();
ae986130 3915 }
378cc40b 3916 goto retry;
4fdae800 3917 case '\r':
6a27c188 3918#ifdef PERL_STRICT_CR
cea2e8a9 3919 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 3920 Perl_croak(aTHX_
cc507455 3921 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 3922#endif
4fdae800 3923 case ' ': case '\t': case '\f': case 013:
bf4acbe4
GS
3924#ifdef MACOS_TRADITIONAL
3925 case '\312':
3926#endif
5db06880 3927#ifdef PERL_MAD
cd81e915 3928 PL_realtokenstart = -1;
ac372eb8
RD
3929 if (!PL_thiswhite)
3930 PL_thiswhite = newSVpvs("");
3931 sv_catpvn(PL_thiswhite, s, 1);
5db06880 3932#endif
ac372eb8 3933 s++;
378cc40b 3934 goto retry;
378cc40b 3935 case '#':
e929a76b 3936 case '\n':
5db06880 3937#ifdef PERL_MAD
cd81e915 3938 PL_realtokenstart = -1;
5db06880 3939 if (PL_madskills)
cd81e915 3940 PL_faketokens = 0;
5db06880 3941#endif
3280af22 3942 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
3943 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
3944 /* handle eval qq[#line 1 "foo"\n ...] */
3945 CopLINE_dec(PL_curcop);
3946 incline(s);
3947 }
5db06880
NC
3948 if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) {
3949 s = SKIPSPACE0(s);
3950 if (!PL_in_eval || PL_rsfp)
3951 incline(s);
3952 }
3953 else {
3954 d = s;
3955 while (d < PL_bufend && *d != '\n')
3956 d++;
3957 if (d < PL_bufend)
3958 d++;
3959 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
3960 Perl_croak(aTHX_ "panic: input overflow");
3961#ifdef PERL_MAD
3962 if (PL_madskills)
cd81e915 3963 PL_thiswhite = newSVpvn(s, d - s);
5db06880
NC
3964#endif
3965 s = d;
3966 incline(s);
3967 }
3280af22
NIS
3968 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3969 PL_bufptr = s;
3970 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3971 return yylex();
a687059c 3972 }
378cc40b 3973 }
a687059c 3974 else {
5db06880
NC
3975#ifdef PERL_MAD
3976 if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
3977 if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
cd81e915 3978 PL_faketokens = 0;
5db06880
NC
3979 s = SKIPSPACE0(s);
3980 TOKEN(PEG); /* make sure any #! line is accessible */
3981 }
3982 s = SKIPSPACE0(s);
3983 }
3984 else {
3985/* if (PL_madskills && PL_lex_formbrack) { */
3986 d = s;
3987 while (d < PL_bufend && *d != '\n')
3988 d++;
3989 if (d < PL_bufend)
3990 d++;
3991 else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
3992 Perl_croak(aTHX_ "panic: input overflow");
3993 if (PL_madskills && CopLINE(PL_curcop) >= 1) {
cd81e915 3994 if (!PL_thiswhite)
6b29d1f5 3995 PL_thiswhite = newSVpvs("");
5db06880 3996 if (CopLINE(PL_curcop) == 1) {
cd81e915
NC
3997 sv_setpvn(PL_thiswhite, "", 0);
3998 PL_faketokens = 0;
5db06880 3999 }
cd81e915 4000 sv_catpvn(PL_thiswhite, s, d - s);
5db06880
NC
4001 }
4002 s = d;
4003/* }
4004 *s = '\0';
4005 PL_bufend = s; */
4006 }
4007#else
378cc40b 4008 *s = '\0';
3280af22 4009 PL_bufend = s;
5db06880 4010#endif
a687059c 4011 }
378cc40b
LW
4012 goto retry;
4013 case '-':
79072805 4014 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50 4015 I32 ftst = 0;
90771dc0 4016 char tmp;
e5edeb50 4017
378cc40b 4018 s++;
3280af22 4019 PL_bufptr = s;
748a9306
LW
4020 tmp = *s++;
4021
bf4acbe4 4022 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
4023 s++;
4024
4025 if (strnEQ(s,"=>",2)) {
3280af22 4026 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
931e0695 4027 DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
748a9306
LW
4028 OPERATOR('-'); /* unary minus */
4029 }
3280af22 4030 PL_last_uni = PL_oldbufptr;
748a9306 4031 switch (tmp) {
e5edeb50
JH
4032 case 'r': ftst = OP_FTEREAD; break;
4033 case 'w': ftst = OP_FTEWRITE; break;
4034 case 'x': ftst = OP_FTEEXEC; break;
4035 case 'o': ftst = OP_FTEOWNED; break;
4036 case 'R': ftst = OP_FTRREAD; break;
4037 case 'W': ftst = OP_FTRWRITE; break;
4038 case 'X': ftst = OP_FTREXEC; break;
4039 case 'O': ftst = OP_FTROWNED; break;
4040 case 'e': ftst = OP_FTIS; break;
4041 case 'z': ftst = OP_FTZERO; break;
4042 case 's': ftst = OP_FTSIZE; break;
4043 case 'f': ftst = OP_FTFILE; break;
4044 case 'd': ftst = OP_FTDIR; break;
4045 case 'l': ftst = OP_FTLINK; break;
4046 case 'p': ftst = OP_FTPIPE; break;
4047 case 'S': ftst = OP_FTSOCK; break;
4048 case 'u': ftst = OP_FTSUID; break;
4049 case 'g': ftst = OP_FTSGID; break;
4050 case 'k': ftst = OP_FTSVTX; break;
4051 case 'b': ftst = OP_FTBLK; break;
4052 case 'c': ftst = OP_FTCHR; break;
4053 case 't': ftst = OP_FTTTY; break;
4054 case 'T': ftst = OP_FTTEXT; break;
4055 case 'B': ftst = OP_FTBINARY; break;
4056 case 'M': case 'A': case 'C':
fafc274c 4057 gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
e5edeb50
JH
4058 switch (tmp) {
4059 case 'M': ftst = OP_FTMTIME; break;
4060 case 'A': ftst = OP_FTATIME; break;
4061 case 'C': ftst = OP_FTCTIME; break;
4062 default: break;
4063 }
4064 break;
378cc40b 4065 default:
378cc40b
LW
4066 break;
4067 }
e5edeb50 4068 if (ftst) {
eb160463 4069 PL_last_lop_op = (OPCODE)ftst;
4e553d73 4070 DEBUG_T( { PerlIO_printf(Perl_debug_log,
a18d764d 4071 "### Saw file test %c\n", (int)tmp);
5f80b19c 4072 } );
e5edeb50
JH
4073 FTST(ftst);
4074 }
4075 else {
4076 /* Assume it was a minus followed by a one-letter named
4077 * subroutine call (or a -bareword), then. */
95c31fe3 4078 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0 4079 "### '-%c' looked like a file test but was not\n",
4fccd7c6 4080 (int) tmp);
5f80b19c 4081 } );
3cf7b4c4 4082 s = --PL_bufptr;
e5edeb50 4083 }
378cc40b 4084 }
90771dc0
NC
4085 {
4086 const char tmp = *s++;
4087 if (*s == tmp) {
4088 s++;
4089 if (PL_expect == XOPERATOR)
4090 TERM(POSTDEC);
4091 else
4092 OPERATOR(PREDEC);
4093 }
4094 else if (*s == '>') {
4095 s++;
29595ff2 4096 s = SKIPSPACE1(s);
90771dc0
NC
4097 if (isIDFIRST_lazy_if(s,UTF)) {
4098 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
4099 TOKEN(ARROW);
4100 }
4101 else if (*s == '$')
4102 OPERATOR(ARROW);
4103 else
4104 TERM(ARROW);
4105 }
3280af22 4106 if (PL_expect == XOPERATOR)
90771dc0
NC
4107 Aop(OP_SUBTRACT);
4108 else {
4109 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4110 check_uni();
4111 OPERATOR('-'); /* unary minus */
79072805 4112 }
2f3197b3 4113 }
79072805 4114
378cc40b 4115 case '+':
90771dc0
NC
4116 {
4117 const char tmp = *s++;
4118 if (*s == tmp) {
4119 s++;
4120 if (PL_expect == XOPERATOR)
4121 TERM(POSTINC);
4122 else
4123 OPERATOR(PREINC);
4124 }
3280af22 4125 if (PL_expect == XOPERATOR)
90771dc0
NC
4126 Aop(OP_ADD);
4127 else {
4128 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
4129 check_uni();
4130 OPERATOR('+');
4131 }
2f3197b3 4132 }
a687059c 4133
378cc40b 4134 case '*':
3280af22
NIS
4135 if (PL_expect != XOPERATOR) {
4136 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4137 PL_expect = XOPERATOR;
4138 force_ident(PL_tokenbuf, '*');
4139 if (!*PL_tokenbuf)
a0d0e21e 4140 PREREF('*');
79072805 4141 TERM('*');
a687059c 4142 }
79072805
LW
4143 s++;
4144 if (*s == '*') {
a687059c 4145 s++;
79072805 4146 PWop(OP_POW);
a687059c 4147 }
79072805
LW
4148 Mop(OP_MULTIPLY);
4149
378cc40b 4150 case '%':
3280af22 4151 if (PL_expect == XOPERATOR) {
bbce6d69 4152 ++s;
4153 Mop(OP_MODULO);
a687059c 4154 }
3280af22 4155 PL_tokenbuf[0] = '%';
e8ae98db
RGS
4156 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4157 sizeof PL_tokenbuf - 1, FALSE);
3280af22 4158 if (!PL_tokenbuf[1]) {
bbce6d69 4159 PREREF('%');
a687059c 4160 }
3280af22 4161 PL_pending_ident = '%';
bbce6d69 4162 TERM('%');
a687059c 4163
378cc40b 4164 case '^':
79072805 4165 s++;
a0d0e21e 4166 BOop(OP_BIT_XOR);
79072805 4167 case '[':
3280af22 4168 PL_lex_brackets++;
79072805 4169 /* FALL THROUGH */
378cc40b 4170 case '~':
0d863452 4171 if (s[1] == '~'
3e7dd34d 4172 && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
0d863452
RH
4173 {
4174 s += 2;
4175 Eop(OP_SMARTMATCH);
4176 }
378cc40b 4177 case ',':
90771dc0
NC
4178 {
4179 const char tmp = *s++;
4180 OPERATOR(tmp);
4181 }
a0d0e21e
LW
4182 case ':':
4183 if (s[1] == ':') {
4184 len = 0;
0bfa2a8a 4185 goto just_a_word_zero_gv;
a0d0e21e
LW
4186 }
4187 s++;
09bef843
SB
4188 switch (PL_expect) {
4189 OP *attrs;
5db06880
NC
4190#ifdef PERL_MAD
4191 I32 stuffstart;
4192#endif
09bef843
SB
4193 case XOPERATOR:
4194 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
4195 break;
4196 PL_bufptr = s; /* update in case we back off */
4197 goto grabattrs;
4198 case XATTRBLOCK:
4199 PL_expect = XBLOCK;
4200 goto grabattrs;
4201 case XATTRTERM:
4202 PL_expect = XTERMBLOCK;
4203 grabattrs:
5db06880
NC
4204#ifdef PERL_MAD
4205 stuffstart = s - SvPVX(PL_linestr) - 1;
4206#endif
29595ff2 4207 s = PEEKSPACE(s);
5f66b61c 4208 attrs = NULL;
7e2040f0 4209 while (isIDFIRST_lazy_if(s,UTF)) {
90771dc0 4210 I32 tmp;
5cc237b8 4211 SV *sv;
09bef843 4212 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 4213 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) {
f9829d6b
GS
4214 if (tmp < 0) tmp = -tmp;
4215 switch (tmp) {
4216 case KEY_or:
4217 case KEY_and:
c963b151 4218 case KEY_err:
f9829d6b
GS
4219 case KEY_for:
4220 case KEY_unless:
4221 case KEY_if:
4222 case KEY_while:
4223 case KEY_until:
4224 goto got_attrs;
4225 default:
4226 break;
4227 }
4228 }
5cc237b8 4229 sv = newSVpvn(s, len);
09bef843
SB
4230 if (*d == '(') {
4231 d = scan_str(d,TRUE,TRUE);
4232 if (!d) {
09bef843
SB
4233 /* MUST advance bufptr here to avoid bogus
4234 "at end of line" context messages from yyerror().
4235 */
4236 PL_bufptr = s + len;
4237 yyerror("Unterminated attribute parameter in attribute list");
4238 if (attrs)
4239 op_free(attrs);
5cc237b8 4240 sv_free(sv);
bbf60fe6 4241 return REPORT(0); /* EOF indicator */
09bef843
SB
4242 }
4243 }
4244 if (PL_lex_stuff) {
09bef843
SB
4245 sv_catsv(sv, PL_lex_stuff);
4246 attrs = append_elem(OP_LIST, attrs,
4247 newSVOP(OP_CONST, 0, sv));
4248 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 4249 PL_lex_stuff = NULL;
09bef843
SB
4250 }
4251 else {
5cc237b8
BS
4252 if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
4253 sv_free(sv);
1108974d 4254 if (PL_in_my == KEY_our) {
371fce9b
DM
4255#ifdef USE_ITHREADS
4256 GvUNIQUE_on(cGVOPx_gv(yylval.opval));
4257#else
1108974d 4258 /* skip to avoid loading attributes.pm */
371fce9b 4259#endif
df9a6019 4260 deprecate(":unique");
1108974d 4261 }
bfed75c6 4262 else
371fce9b
DM
4263 Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
4264 }
4265
d3cea301
SB
4266 /* NOTE: any CV attrs applied here need to be part of
4267 the CVf_BUILTIN_ATTRS define in cv.h! */
5cc237b8
BS
4268 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
4269 sv_free(sv);
78f9721b 4270 CvLVALUE_on(PL_compcv);
5cc237b8
BS
4271 }
4272 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
4273 sv_free(sv);
78f9721b 4274 CvLOCKED_on(PL_compcv);
5cc237b8
BS
4275 }
4276 else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
4277 sv_free(sv);
78f9721b 4278 CvMETHOD_on(PL_compcv);
5cc237b8
BS
4279 }
4280 else if (!PL_in_my && len == 9 && strnEQ(SvPVX(sv), "assertion", len)) {
4281 sv_free(sv);
06492da6 4282 CvASSERTION_on(PL_compcv);
5cc237b8 4283 }
78f9721b
SM
4284 /* After we've set the flags, it could be argued that
4285 we don't need to do the attributes.pm-based setting
4286 process, and shouldn't bother appending recognized
d3cea301
SB
4287 flags. To experiment with that, uncomment the
4288 following "else". (Note that's already been
4289 uncommented. That keeps the above-applied built-in
4290 attributes from being intercepted (and possibly
4291 rejected) by a package's attribute routines, but is
4292 justified by the performance win for the common case
4293 of applying only built-in attributes.) */
0256094b 4294 else
78f9721b
SM
4295 attrs = append_elem(OP_LIST, attrs,
4296 newSVOP(OP_CONST, 0,
5cc237b8 4297 sv));
09bef843 4298 }
29595ff2 4299 s = PEEKSPACE(d);
0120eecf 4300 if (*s == ':' && s[1] != ':')
29595ff2 4301 s = PEEKSPACE(s+1);
0120eecf
GS
4302 else if (s == d)
4303 break; /* require real whitespace or :'s */
29595ff2 4304 /* XXX losing whitespace on sequential attributes here */
09bef843 4305 }
90771dc0
NC
4306 {
4307 const char tmp
4308 = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
4309 if (*s != ';' && *s != '}' && *s != tmp
4310 && (tmp != '=' || *s != ')')) {
4311 const char q = ((*s == '\'') ? '"' : '\'');
4312 /* If here for an expression, and parsed no attrs, back
4313 off. */
4314 if (tmp == '=' && !attrs) {
4315 s = PL_bufptr;
4316 break;
4317 }
4318 /* MUST advance bufptr here to avoid bogus "at end of line"
4319 context messages from yyerror().
4320 */
4321 PL_bufptr = s;
10edeb5d
JH
4322 yyerror( (const char *)
4323 (*s
4324 ? Perl_form(aTHX_ "Invalid separator character "
4325 "%c%c%c in attribute list", q, *s, q)
4326 : "Unterminated attribute list" ) );
90771dc0
NC
4327 if (attrs)
4328 op_free(attrs);
4329 OPERATOR(':');
09bef843 4330 }
09bef843 4331 }
f9829d6b 4332 got_attrs:
09bef843 4333 if (attrs) {
cd81e915 4334 start_force(PL_curforce);
9ded7720 4335 NEXTVAL_NEXTTOKE.opval = attrs;
cd81e915 4336 CURMAD('_', PL_nextwhite);
89122651 4337 force_next(THING);
5db06880
NC
4338 }
4339#ifdef PERL_MAD
4340 if (PL_madskills) {
cd81e915 4341 PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
5db06880 4342 (s - SvPVX(PL_linestr)) - stuffstart);
09bef843 4343 }
5db06880 4344#endif
09bef843
SB
4345 TOKEN(COLONATTR);
4346 }
a0d0e21e 4347 OPERATOR(':');
8990e307
LW
4348 case '(':
4349 s++;
3280af22
NIS
4350 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
4351 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 4352 else
3280af22 4353 PL_expect = XTERM;
29595ff2 4354 s = SKIPSPACE1(s);
a0d0e21e 4355 TOKEN('(');
378cc40b 4356 case ';':
f4dd75d9 4357 CLINE;
90771dc0
NC
4358 {
4359 const char tmp = *s++;
4360 OPERATOR(tmp);
4361 }
378cc40b 4362 case ')':
90771dc0
NC
4363 {
4364 const char tmp = *s++;
29595ff2 4365 s = SKIPSPACE1(s);
90771dc0
NC
4366 if (*s == '{')
4367 PREBLOCK(tmp);
4368 TERM(tmp);
4369 }
79072805
LW
4370 case ']':
4371 s++;
3280af22 4372 if (PL_lex_brackets <= 0)
d98d5fff 4373 yyerror("Unmatched right square bracket");
463ee0b2 4374 else
3280af22
NIS
4375 --PL_lex_brackets;
4376 if (PL_lex_state == LEX_INTERPNORMAL) {
4377 if (PL_lex_brackets == 0) {
a0d0e21e 4378 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3280af22 4379 PL_lex_state = LEX_INTERPEND;
79072805
LW
4380 }
4381 }
4633a7c4 4382 TERM(']');
79072805
LW
4383 case '{':
4384 leftbracket:
79072805 4385 s++;
3280af22 4386 if (PL_lex_brackets > 100) {
8edd5f42 4387 Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
8990e307 4388 }
3280af22 4389 switch (PL_expect) {
a0d0e21e 4390 case XTERM:
3280af22 4391 if (PL_lex_formbrack) {
a0d0e21e
LW
4392 s--;
4393 PRETERMBLOCK(DO);
4394 }
3280af22
NIS
4395 if (PL_oldoldbufptr == PL_last_lop)
4396 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 4397 else
3280af22 4398 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 4399 OPERATOR(HASHBRACK);
a0d0e21e 4400 case XOPERATOR:
bf4acbe4 4401 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306 4402 s++;
44a8e56a 4403 d = s;
3280af22
NIS
4404 PL_tokenbuf[0] = '\0';
4405 if (d < PL_bufend && *d == '-') {
4406 PL_tokenbuf[0] = '-';
44a8e56a 4407 d++;
bf4acbe4 4408 while (d < PL_bufend && SPACE_OR_TAB(*d))
44a8e56a 4409 d++;
4410 }
7e2040f0 4411 if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3280af22 4412 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 4413 FALSE, &len);
bf4acbe4 4414 while (d < PL_bufend && SPACE_OR_TAB(*d))
748a9306
LW
4415 d++;
4416 if (*d == '}') {
f54cb97a 4417 const char minus = (PL_tokenbuf[0] == '-');
44a8e56a 4418 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
4419 if (minus)
4420 force_next('-');
748a9306
LW
4421 }
4422 }
4423 /* FALL THROUGH */
09bef843 4424 case XATTRBLOCK:
748a9306 4425 case XBLOCK:
3280af22
NIS
4426 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
4427 PL_expect = XSTATE;
a0d0e21e 4428 break;
09bef843 4429 case XATTRTERM:
a0d0e21e 4430 case XTERMBLOCK:
3280af22
NIS
4431 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
4432 PL_expect = XSTATE;
a0d0e21e
LW
4433 break;
4434 default: {
f54cb97a 4435 const char *t;
3280af22
NIS
4436 if (PL_oldoldbufptr == PL_last_lop)
4437 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 4438 else
3280af22 4439 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
29595ff2 4440 s = SKIPSPACE1(s);
8452ff4b
SB
4441 if (*s == '}') {
4442 if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
4443 PL_expect = XTERM;
4444 /* This hack is to get the ${} in the message. */
4445 PL_bufptr = s+1;
4446 yyerror("syntax error");
4447 break;
4448 }
a0d0e21e 4449 OPERATOR(HASHBRACK);
8452ff4b 4450 }
b8a4b1be
GS
4451 /* This hack serves to disambiguate a pair of curlies
4452 * as being a block or an anon hash. Normally, expectation
4453 * determines that, but in cases where we're not in a
4454 * position to expect anything in particular (like inside
4455 * eval"") we have to resolve the ambiguity. This code
4456 * covers the case where the first term in the curlies is a
4457 * quoted string. Most other cases need to be explicitly
a0288114 4458 * disambiguated by prepending a "+" before the opening
b8a4b1be
GS
4459 * curly in order to force resolution as an anon hash.
4460 *
4461 * XXX should probably propagate the outer expectation
4462 * into eval"" to rely less on this hack, but that could
4463 * potentially break current behavior of eval"".
4464 * GSAR 97-07-21
4465 */
4466 t = s;
4467 if (*s == '\'' || *s == '"' || *s == '`') {
4468 /* common case: get past first string, handling escapes */
3280af22 4469 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
4470 if (*t++ == '\\' && (*t == '\\' || *t == *s))
4471 t++;
4472 t++;
a0d0e21e 4473 }
b8a4b1be 4474 else if (*s == 'q') {
3280af22 4475 if (++t < PL_bufend
b8a4b1be 4476 && (!isALNUM(*t)
3280af22 4477 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
4478 && !isALNUM(*t))))
4479 {
abc667d1 4480 /* skip q//-like construct */
f54cb97a 4481 const char *tmps;
b8a4b1be
GS
4482 char open, close, term;
4483 I32 brackets = 1;
4484
3280af22 4485 while (t < PL_bufend && isSPACE(*t))
b8a4b1be 4486 t++;
abc667d1
DM
4487 /* check for q => */
4488 if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
4489 OPERATOR(HASHBRACK);
4490 }
b8a4b1be
GS
4491 term = *t;
4492 open = term;
4493 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
4494 term = tmps[5];
4495 close = term;
4496 if (open == close)
3280af22
NIS
4497 for (t++; t < PL_bufend; t++) {
4498 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 4499 t++;
6d07e5e9 4500 else if (*t == open)
b8a4b1be
GS
4501 break;
4502 }
abc667d1 4503 else {
3280af22
NIS
4504 for (t++; t < PL_bufend; t++) {
4505 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 4506 t++;
6d07e5e9 4507 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
4508 break;
4509 else if (*t == open)
4510 brackets++;
4511 }
abc667d1
DM
4512 }
4513 t++;
b8a4b1be 4514 }
abc667d1
DM
4515 else
4516 /* skip plain q word */
4517 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
4518 t += UTF8SKIP(t);
a0d0e21e 4519 }
7e2040f0 4520 else if (isALNUM_lazy_if(t,UTF)) {
0505442f 4521 t += UTF8SKIP(t);
7e2040f0 4522 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
0505442f 4523 t += UTF8SKIP(t);
a0d0e21e 4524 }
3280af22 4525 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 4526 t++;
b8a4b1be
GS
4527 /* if comma follows first term, call it an anon hash */
4528 /* XXX it could be a comma expression with loop modifiers */
3280af22 4529 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 4530 || (*t == '=' && t[1] == '>')))
a0d0e21e 4531 OPERATOR(HASHBRACK);
3280af22 4532 if (PL_expect == XREF)
4e4e412b 4533 PL_expect = XTERM;
a0d0e21e 4534 else {
3280af22
NIS
4535 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
4536 PL_expect = XSTATE;
a0d0e21e 4537 }
8990e307 4538 }
a0d0e21e 4539 break;
463ee0b2 4540 }
57843af0 4541 yylval.ival = CopLINE(PL_curcop);
79072805 4542 if (isSPACE(*s) || *s == '#')
3280af22 4543 PL_copline = NOLINE; /* invalidate current command line number */
79072805 4544 TOKEN('{');
378cc40b 4545 case '}':
79072805
LW
4546 rightbracket:
4547 s++;
3280af22 4548 if (PL_lex_brackets <= 0)
d98d5fff 4549 yyerror("Unmatched right curly bracket");
463ee0b2 4550 else
3280af22 4551 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
c2e66d9e 4552 if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3280af22
NIS
4553 PL_lex_formbrack = 0;
4554 if (PL_lex_state == LEX_INTERPNORMAL) {
4555 if (PL_lex_brackets == 0) {
9059aa12
LW
4556 if (PL_expect & XFAKEBRACK) {
4557 PL_expect &= XENUMMASK;
3280af22
NIS
4558 PL_lex_state = LEX_INTERPEND;
4559 PL_bufptr = s;
5db06880
NC
4560#if 0
4561 if (PL_madskills) {
cd81e915 4562 if (!PL_thiswhite)
6b29d1f5 4563 PL_thiswhite = newSVpvs("");
cd81e915 4564 sv_catpvn(PL_thiswhite,"}",1);
5db06880
NC
4565 }
4566#endif
cea2e8a9 4567 return yylex(); /* ignore fake brackets */
79072805 4568 }
fa83b5b6 4569 if (*s == '-' && s[1] == '>')
3280af22 4570 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 4571 else if (*s != '[' && *s != '{')
3280af22 4572 PL_lex_state = LEX_INTERPEND;
79072805
LW
4573 }
4574 }
9059aa12
LW
4575 if (PL_expect & XFAKEBRACK) {
4576 PL_expect &= XENUMMASK;
3280af22 4577 PL_bufptr = s;
cea2e8a9 4578 return yylex(); /* ignore fake brackets */
748a9306 4579 }
cd81e915 4580 start_force(PL_curforce);
5db06880
NC
4581 if (PL_madskills) {
4582 curmad('X', newSVpvn(s-1,1));
cd81e915 4583 CURMAD('_', PL_thiswhite);
5db06880 4584 }
79072805 4585 force_next('}');
5db06880 4586#ifdef PERL_MAD
cd81e915 4587 if (!PL_thistoken)
6b29d1f5 4588 PL_thistoken = newSVpvs("");
5db06880 4589#endif
79072805 4590 TOKEN(';');
378cc40b
LW
4591 case '&':
4592 s++;
90771dc0 4593 if (*s++ == '&')
a0d0e21e 4594 AOPERATOR(ANDAND);
378cc40b 4595 s--;
3280af22 4596 if (PL_expect == XOPERATOR) {
041457d9
DM
4597 if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
4598 && isIDFIRST_lazy_if(s,UTF))
7e2040f0 4599 {
57843af0 4600 CopLINE_dec(PL_curcop);
9014280d 4601 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 4602 CopLINE_inc(PL_curcop);
463ee0b2 4603 }
79072805 4604 BAop(OP_BIT_AND);
463ee0b2 4605 }
79072805 4606
3280af22
NIS
4607 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4608 if (*PL_tokenbuf) {
4609 PL_expect = XOPERATOR;
4610 force_ident(PL_tokenbuf, '&');
463ee0b2 4611 }
79072805
LW
4612 else
4613 PREREF('&');
c07a80fd 4614 yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
4615 TERM('&');
4616
378cc40b
LW
4617 case '|':
4618 s++;
90771dc0 4619 if (*s++ == '|')
a0d0e21e 4620 AOPERATOR(OROR);
378cc40b 4621 s--;
79072805 4622 BOop(OP_BIT_OR);
378cc40b
LW
4623 case '=':
4624 s++;
748a9306 4625 {
90771dc0
NC
4626 const char tmp = *s++;
4627 if (tmp == '=')
4628 Eop(OP_EQ);
4629 if (tmp == '>')
4630 OPERATOR(',');
4631 if (tmp == '~')
4632 PMop(OP_MATCH);
4633 if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
4634 && strchr("+-*/%.^&|<",tmp))
4635 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4636 "Reversed %c= operator",(int)tmp);
4637 s--;
4638 if (PL_expect == XSTATE && isALPHA(tmp) &&
4639 (s == PL_linestart+1 || s[-2] == '\n') )
4640 {
4641 if (PL_in_eval && !PL_rsfp) {
4642 d = PL_bufend;
4643 while (s < d) {
4644 if (*s++ == '\n') {
4645 incline(s);
4646 if (strnEQ(s,"=cut",4)) {
4647 s = strchr(s,'\n');
4648 if (s)
4649 s++;
4650 else
4651 s = d;
4652 incline(s);
4653 goto retry;
4654 }
4655 }
a5f75d66 4656 }
90771dc0 4657 goto retry;
a5f75d66 4658 }
5db06880
NC
4659#ifdef PERL_MAD
4660 if (PL_madskills) {
cd81e915 4661 if (!PL_thiswhite)
6b29d1f5 4662 PL_thiswhite = newSVpvs("");
cd81e915 4663 sv_catpvn(PL_thiswhite, PL_linestart,
5db06880
NC
4664 PL_bufend - PL_linestart);
4665 }
4666#endif
90771dc0
NC
4667 s = PL_bufend;
4668 PL_doextract = TRUE;
4669 goto retry;
a5f75d66 4670 }
a0d0e21e 4671 }
3280af22 4672 if (PL_lex_brackets < PL_lex_formbrack) {
c35e046a 4673 const char *t = s;
51882d45 4674#ifdef PERL_STRICT_CR
c35e046a 4675 while (SPACE_OR_TAB(*t))
51882d45 4676#else
c35e046a 4677 while (SPACE_OR_TAB(*t) || *t == '\r')
51882d45 4678#endif
c35e046a 4679 t++;
a0d0e21e
LW
4680 if (*t == '\n' || *t == '#') {
4681 s--;
3280af22 4682 PL_expect = XBLOCK;
a0d0e21e
LW
4683 goto leftbracket;
4684 }
79072805 4685 }
a0d0e21e
LW
4686 yylval.ival = 0;
4687 OPERATOR(ASSIGNOP);
378cc40b
LW
4688 case '!':
4689 s++;
90771dc0
NC
4690 {
4691 const char tmp = *s++;
4692 if (tmp == '=') {
4693 /* was this !=~ where !~ was meant?
4694 * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
4695
4696 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
4697 const char *t = s+1;
4698
4699 while (t < PL_bufend && isSPACE(*t))
4700 ++t;
4701
4702 if (*t == '/' || *t == '?' ||
4703 ((*t == 'm' || *t == 's' || *t == 'y')
4704 && !isALNUM(t[1])) ||
4705 (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
4706 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4707 "!=~ should be !~");
4708 }
4709 Eop(OP_NE);
4710 }
4711 if (tmp == '~')
4712 PMop(OP_NOT);
4713 }
378cc40b
LW
4714 s--;
4715 OPERATOR('!');
4716 case '<':
3280af22 4717 if (PL_expect != XOPERATOR) {
93a17b20 4718 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 4719 check_uni();
79072805
LW
4720 if (s[1] == '<')
4721 s = scan_heredoc(s);
4722 else
4723 s = scan_inputsymbol(s);
4724 TERM(sublex_start());
378cc40b
LW
4725 }
4726 s++;
90771dc0
NC
4727 {
4728 char tmp = *s++;
4729 if (tmp == '<')
4730 SHop(OP_LEFT_SHIFT);
4731 if (tmp == '=') {
4732 tmp = *s++;
4733 if (tmp == '>')
4734 Eop(OP_NCMP);
4735 s--;
4736 Rop(OP_LE);
4737 }
395c3793 4738 }
378cc40b 4739 s--;
79072805 4740 Rop(OP_LT);
378cc40b
LW
4741 case '>':
4742 s++;
90771dc0
NC
4743 {
4744 const char tmp = *s++;
4745 if (tmp == '>')
4746 SHop(OP_RIGHT_SHIFT);
d4c19fe8 4747 else if (tmp == '=')
90771dc0
NC
4748 Rop(OP_GE);
4749 }
378cc40b 4750 s--;
79072805 4751 Rop(OP_GT);
378cc40b
LW
4752
4753 case '$':
bbce6d69 4754 CLINE;
4755
3280af22
NIS
4756 if (PL_expect == XOPERATOR) {
4757 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
4758 PL_expect = XTERM;
c445ea15 4759 deprecate_old(commaless_variable_list);
bbf60fe6 4760 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 4761 }
8990e307 4762 }
a0d0e21e 4763
7e2040f0 4764 if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3280af22 4765 PL_tokenbuf[0] = '@';
376b8730
SM
4766 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
4767 sizeof PL_tokenbuf - 1, FALSE);
4768 if (PL_expect == XOPERATOR)
4769 no_op("Array length", s);
3280af22 4770 if (!PL_tokenbuf[1])
a0d0e21e 4771 PREREF(DOLSHARP);
3280af22
NIS
4772 PL_expect = XOPERATOR;
4773 PL_pending_ident = '#';
463ee0b2 4774 TOKEN(DOLSHARP);
79072805 4775 }
bbce6d69 4776
3280af22 4777 PL_tokenbuf[0] = '$';
376b8730
SM
4778 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
4779 sizeof PL_tokenbuf - 1, FALSE);
4780 if (PL_expect == XOPERATOR)
4781 no_op("Scalar", s);
3280af22
NIS
4782 if (!PL_tokenbuf[1]) {
4783 if (s == PL_bufend)
bbce6d69 4784 yyerror("Final $ should be \\$ or $name");
4785 PREREF('$');
8990e307 4786 }
a0d0e21e 4787
bbce6d69 4788 /* This kludge not intended to be bulletproof. */
3280af22 4789 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
bbce6d69 4790 yylval.opval = newSVOP(OP_CONST, 0,
fc15ae8f 4791 newSViv(CopARYBASE_get(&PL_compiling)));
bbce6d69 4792 yylval.opval->op_private = OPpCONST_ARYBASE;
4793 TERM(THING);
4794 }
4795
ff68c719 4796 d = s;
90771dc0
NC
4797 {
4798 const char tmp = *s;
4799 if (PL_lex_state == LEX_NORMAL)
29595ff2 4800 s = SKIPSPACE1(s);
ff68c719 4801
90771dc0
NC
4802 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
4803 && intuit_more(s)) {
4804 if (*s == '[') {
4805 PL_tokenbuf[0] = '@';
4806 if (ckWARN(WARN_SYNTAX)) {
c35e046a
AL
4807 char *t = s+1;
4808
4809 while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
4810 t++;
90771dc0 4811 if (*t++ == ',') {
29595ff2 4812 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
90771dc0
NC
4813 while (t < PL_bufend && *t != ']')
4814 t++;
9014280d 4815 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
90771dc0 4816 "Multidimensional syntax %.*s not supported",
36c7798d 4817 (int)((t - PL_bufptr) + 1), PL_bufptr);
90771dc0 4818 }
748a9306 4819 }
93a17b20 4820 }
90771dc0
NC
4821 else if (*s == '{') {
4822 char *t;
4823 PL_tokenbuf[0] = '%';
4824 if (strEQ(PL_tokenbuf+1, "SIG") && ckWARN(WARN_SYNTAX)
4825 && (t = strchr(s, '}')) && (t = strchr(t, '=')))
4826 {
4827 char tmpbuf[sizeof PL_tokenbuf];
c35e046a
AL
4828 do {
4829 t++;
4830 } while (isSPACE(*t));
90771dc0 4831 if (isIDFIRST_lazy_if(t,UTF)) {
780a5241 4832 STRLEN len;
90771dc0 4833 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
780a5241 4834 &len);
c35e046a
AL
4835 while (isSPACE(*t))
4836 t++;
780a5241 4837 if (*t == ';' && get_cvn_flags(tmpbuf, len, 0))
90771dc0
NC
4838 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
4839 "You need to quote \"%s\"",
4840 tmpbuf);
4841 }
4842 }
4843 }
93a17b20 4844 }
bbce6d69 4845
90771dc0
NC
4846 PL_expect = XOPERATOR;
4847 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
4848 const bool islop = (PL_last_lop == PL_oldoldbufptr);
4849 if (!islop || PL_last_lop_op == OP_GREPSTART)
4850 PL_expect = XOPERATOR;
4851 else if (strchr("$@\"'`q", *s))
4852 PL_expect = XTERM; /* e.g. print $fh "foo" */
4853 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
4854 PL_expect = XTERM; /* e.g. print $fh &sub */
4855 else if (isIDFIRST_lazy_if(s,UTF)) {
4856 char tmpbuf[sizeof PL_tokenbuf];
4857 int t2;
4858 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5458a98a 4859 if ((t2 = keyword(tmpbuf, len, 0))) {
90771dc0
NC
4860 /* binary operators exclude handle interpretations */
4861 switch (t2) {
4862 case -KEY_x:
4863 case -KEY_eq:
4864 case -KEY_ne:
4865 case -KEY_gt:
4866 case -KEY_lt:
4867 case -KEY_ge:
4868 case -KEY_le:
4869 case -KEY_cmp:
4870 break;
4871 default:
4872 PL_expect = XTERM; /* e.g. print $fh length() */
4873 break;
4874 }
4875 }
4876 else {
4877 PL_expect = XTERM; /* e.g. print $fh subr() */
84902520
TB
4878 }
4879 }
90771dc0
NC
4880 else if (isDIGIT(*s))
4881 PL_expect = XTERM; /* e.g. print $fh 3 */
4882 else if (*s == '.' && isDIGIT(s[1]))
4883 PL_expect = XTERM; /* e.g. print $fh .3 */
4884 else if ((*s == '?' || *s == '-' || *s == '+')
4885 && !isSPACE(s[1]) && s[1] != '=')
4886 PL_expect = XTERM; /* e.g. print $fh -1 */
4887 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '='
4888 && s[1] != '/')
4889 PL_expect = XTERM; /* e.g. print $fh /.../
4890 XXX except DORDOR operator
4891 */
4892 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
4893 && s[2] != '=')
4894 PL_expect = XTERM; /* print $fh <<"EOF" */
93a17b20 4895 }
bbce6d69 4896 }
3280af22 4897 PL_pending_ident = '$';
79072805 4898 TOKEN('$');
378cc40b
LW
4899
4900 case '@':
3280af22 4901 if (PL_expect == XOPERATOR)
bbce6d69 4902 no_op("Array", s);
3280af22
NIS
4903 PL_tokenbuf[0] = '@';
4904 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
4905 if (!PL_tokenbuf[1]) {
bbce6d69 4906 PREREF('@');
4907 }
3280af22 4908 if (PL_lex_state == LEX_NORMAL)
29595ff2 4909 s = SKIPSPACE1(s);
3280af22 4910 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 4911 if (*s == '{')
3280af22 4912 PL_tokenbuf[0] = '%';
a0d0e21e
LW
4913
4914 /* Warn about @ where they meant $. */
041457d9
DM
4915 if (*s == '[' || *s == '{') {
4916 if (ckWARN(WARN_SYNTAX)) {
f54cb97a 4917 const char *t = s + 1;
7e2040f0 4918 while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
4919 t++;
4920 if (*t == '}' || *t == ']') {
4921 t++;
29595ff2 4922 PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
9014280d 4923 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 4924 "Scalar value %.*s better written as $%.*s",
36c7798d
DM
4925 (int)(t-PL_bufptr), PL_bufptr,
4926 (int)(t-PL_bufptr-1), PL_bufptr+1);
a0d0e21e 4927 }
93a17b20
LW
4928 }
4929 }
463ee0b2 4930 }
3280af22 4931 PL_pending_ident = '@';
79072805 4932 TERM('@');
378cc40b 4933
c963b151 4934 case '/': /* may be division, defined-or, or pattern */
6f33ba73
RGS
4935 if (PL_expect == XTERMORDORDOR && s[1] == '/') {
4936 s += 2;
4937 AOPERATOR(DORDOR);
4938 }
c963b151
BD
4939 case '?': /* may either be conditional or pattern */
4940 if(PL_expect == XOPERATOR) {
90771dc0 4941 char tmp = *s++;
c963b151
BD
4942 if(tmp == '?') {
4943 OPERATOR('?');
4944 }
4945 else {
4946 tmp = *s++;
4947 if(tmp == '/') {
4948 /* A // operator. */
4949 AOPERATOR(DORDOR);
4950 }
4951 else {
4952 s--;
4953 Mop(OP_DIVIDE);
4954 }
4955 }
4956 }
4957 else {
4958 /* Disable warning on "study /blah/" */
4959 if (PL_oldoldbufptr == PL_last_uni
4960 && (*PL_last_uni != 's' || s - PL_last_uni < 5
4961 || memNE(PL_last_uni, "study", 5)
4962 || isALNUM_lazy_if(PL_last_uni+5,UTF)
4963 ))
4964 check_uni();
4965 s = scan_pat(s,OP_MATCH);
4966 TERM(sublex_start());
4967 }
378cc40b
LW
4968
4969 case '.':
51882d45
GS
4970 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
4971#ifdef PERL_STRICT_CR
4972 && s[1] == '\n'
4973#else
4974 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
4975#endif
4976 && (s == PL_linestart || s[-1] == '\n') )
4977 {
3280af22
NIS
4978 PL_lex_formbrack = 0;
4979 PL_expect = XSTATE;
79072805
LW
4980 goto rightbracket;
4981 }
3280af22 4982 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
90771dc0 4983 char tmp = *s++;
a687059c
LW
4984 if (*s == tmp) {
4985 s++;
2f3197b3
LW
4986 if (*s == tmp) {
4987 s++;
79072805 4988 yylval.ival = OPf_SPECIAL;
2f3197b3
LW
4989 }
4990 else
79072805 4991 yylval.ival = 0;
378cc40b 4992 OPERATOR(DOTDOT);
a687059c 4993 }
3280af22 4994 if (PL_expect != XOPERATOR)
2f3197b3 4995 check_uni();
79072805 4996 Aop(OP_CONCAT);
378cc40b
LW
4997 }
4998 /* FALL THROUGH */
4999 case '0': case '1': case '2': case '3': case '4':
5000 case '5': case '6': case '7': case '8': case '9':
b73d6f50 5001 s = scan_num(s, &yylval);
931e0695 5002 DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
3280af22 5003 if (PL_expect == XOPERATOR)
8990e307 5004 no_op("Number",s);
79072805
LW
5005 TERM(THING);
5006
5007 case '\'':
5db06880 5008 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5009 DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
3280af22
NIS
5010 if (PL_expect == XOPERATOR) {
5011 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
5012 PL_expect = XTERM;
c445ea15 5013 deprecate_old(commaless_variable_list);
bbf60fe6 5014 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 5015 }
463ee0b2 5016 else
8990e307 5017 no_op("String",s);
463ee0b2 5018 }
79072805 5019 if (!s)
d4c19fe8 5020 missingterm(NULL);
79072805
LW
5021 yylval.ival = OP_CONST;
5022 TERM(sublex_start());
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);
4633a7c4 5038 yylval.ival = OP_CONST;
cfd0369c
NC
5039 /* FIXME. I think that this can be const if char *d is replaced by
5040 more localised variables. */
3280af22 5041 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
63cd0674 5042 if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
4633a7c4
LW
5043 yylval.ival = OP_STRINGIFY;
5044 break;
5045 }
5046 }
79072805
LW
5047 TERM(sublex_start());
5048
5049 case '`':
5db06880 5050 s = scan_str(s,!!PL_madskills,FALSE);
931e0695 5051 DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
3280af22 5052 if (PL_expect == XOPERATOR)
8990e307 5053 no_op("Backticks",s);
79072805 5054 if (!s)
d4c19fe8 5055 missingterm(NULL);
9b201d7d 5056 readpipe_override();
79072805
LW
5057 TERM(sublex_start());
5058
5059 case '\\':
5060 s++;
041457d9 5061 if (PL_lex_inwhat && isDIGIT(*s) && ckWARN(WARN_SYNTAX))
9014280d 5062 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
599cee73 5063 *s, *s);
3280af22 5064 if (PL_expect == XOPERATOR)
8990e307 5065 no_op("Backslash",s);
79072805
LW
5066 OPERATOR(REFGEN);
5067
a7cb1f99 5068 case 'v':
e526c9e6 5069 if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
f54cb97a 5070 char *start = s + 2;
dd629d5b 5071 while (isDIGIT(*start) || *start == '_')
a7cb1f99
GS
5072 start++;
5073 if (*start == '.' && isDIGIT(start[1])) {
b73d6f50 5074 s = scan_num(s, &yylval);
a7cb1f99
GS
5075 TERM(THING);
5076 }
e526c9e6 5077 /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6f33ba73
RGS
5078 else if (!isALPHA(*start) && (PL_expect == XTERM
5079 || PL_expect == XREF || PL_expect == XSTATE
5080 || PL_expect == XTERMORDORDOR)) {
d4c19fe8 5081 /* XXX Use gv_fetchpvn rather than stomping on a const string */
f54cb97a 5082 const char c = *start;
e526c9e6
GS
5083 GV *gv;
5084 *start = '\0';
f776e3cd 5085 gv = gv_fetchpv(s, 0, SVt_PVCV);
e526c9e6
GS
5086 *start = c;
5087 if (!gv) {
b73d6f50 5088 s = scan_num(s, &yylval);
e526c9e6
GS
5089 TERM(THING);
5090 }
5091 }
a7cb1f99
GS
5092 }
5093 goto keylookup;
79072805 5094 case 'x':
3280af22 5095 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
5096 s++;
5097 Mop(OP_REPEAT);
2f3197b3 5098 }
79072805
LW
5099 goto keylookup;
5100
378cc40b 5101 case '_':
79072805
LW
5102 case 'a': case 'A':
5103 case 'b': case 'B':
5104 case 'c': case 'C':
5105 case 'd': case 'D':
5106 case 'e': case 'E':
5107 case 'f': case 'F':
5108 case 'g': case 'G':
5109 case 'h': case 'H':
5110 case 'i': case 'I':
5111 case 'j': case 'J':
5112 case 'k': case 'K':
5113 case 'l': case 'L':
5114 case 'm': case 'M':
5115 case 'n': case 'N':
5116 case 'o': case 'O':
5117 case 'p': case 'P':
5118 case 'q': case 'Q':
5119 case 'r': case 'R':
5120 case 's': case 'S':
5121 case 't': case 'T':
5122 case 'u': case 'U':
a7cb1f99 5123 case 'V':
79072805
LW
5124 case 'w': case 'W':
5125 case 'X':
5126 case 'y': case 'Y':
5127 case 'z': case 'Z':
5128
49dc05e3 5129 keylookup: {
90771dc0 5130 I32 tmp;
10edeb5d
JH
5131
5132 orig_keyword = 0;
5133 gv = NULL;
5134 gvp = NULL;
49dc05e3 5135
3280af22
NIS
5136 PL_bufptr = s;
5137 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 5138
5139 /* Some keywords can be followed by any delimiter, including ':' */
155aba94
GS
5140 tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
5141 (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
5142 (PL_tokenbuf[0] == 'q' &&
5143 strchr("qwxr", PL_tokenbuf[1])))));
8ebc5c01 5144
5145 /* x::* is just a word, unless x is "CORE" */
3280af22 5146 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
5147 goto just_a_word;
5148
3643fb5f 5149 d = s;
3280af22 5150 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
5151 d++; /* no comments skipped here, or s### is misparsed */
5152
5153 /* Is this a label? */
3280af22
NIS
5154 if (!tmp && PL_expect == XSTATE
5155 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
8ebc5c01 5156 s = d + 1;
63031daf 5157 yylval.pval = CopLABEL_alloc(PL_tokenbuf);
8ebc5c01 5158 CLINE;
5159 TOKEN(LABEL);
3643fb5f
CS
5160 }
5161
5162 /* Check for keywords */
5458a98a 5163 tmp = keyword(PL_tokenbuf, len, 0);
748a9306
LW
5164
5165 /* Is this a word before a => operator? */
1c3923b3 5166 if (*d == '=' && d[1] == '>') {
748a9306 5167 CLINE;
d0a148a6
NC
5168 yylval.opval
5169 = (OP*)newSVOP(OP_CONST, 0,
5170 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
748a9306
LW
5171 yylval.opval->op_private = OPpCONST_BARE;
5172 TERM(WORD);
5173 }
5174
a0d0e21e 5175 if (tmp < 0) { /* second-class keyword? */
cbbf8932
AL
5176 GV *ogv = NULL; /* override (winner) */
5177 GV *hgv = NULL; /* hidden (loser) */
3280af22 5178 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 5179 CV *cv;
90e5519e 5180 if ((gv = gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVCV)) &&
56f7f34b
CS
5181 (cv = GvCVu(gv)))
5182 {
5183 if (GvIMPORTED_CV(gv))
5184 ogv = gv;
5185 else if (! CvMETHOD(cv))
5186 hgv = gv;
5187 }
5188 if (!ogv &&
3280af22 5189 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
9e0d86f8 5190 (gv = *gvp) && isGV_with_GP(gv) &&
56f7f34b
CS
5191 GvCVu(gv) && GvIMPORTED_CV(gv))
5192 {
5193 ogv = gv;
5194 }
5195 }
5196 if (ogv) {
30fe34ed 5197 orig_keyword = tmp;
56f7f34b 5198 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
5199 }
5200 else if (gv && !gvp
5201 && -tmp==KEY_lock /* XXX generalizable kludge */
d0456cad 5202 && GvCVu(gv)
017a3ce5 5203 && !hv_fetchs(GvHVn(PL_incgv), "Thread.pm", FALSE))
6e7b2336
GS
5204 {
5205 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 5206 }
56f7f34b
CS
5207 else { /* no override */
5208 tmp = -tmp;
ac206dc8 5209 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
9014280d 5210 Perl_warner(aTHX_ packWARN(WARN_MISC),
ac206dc8
RGS
5211 "dump() better written as CORE::dump()");
5212 }
a0714e2c 5213 gv = NULL;
56f7f34b 5214 gvp = 0;
041457d9
DM
5215 if (hgv && tmp != KEY_x && tmp != KEY_CORE
5216 && ckWARN(WARN_AMBIGUOUS)) /* never ambiguous */
9014280d 5217 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 5218 "Ambiguous call resolved as CORE::%s(), %s",
2f3ca594 5219 GvENAME(hgv), "qualify as such or use &");
49dc05e3 5220 }
a0d0e21e
LW
5221 }
5222
5223 reserved_word:
5224 switch (tmp) {
79072805
LW
5225
5226 default: /* not a keyword */
0bfa2a8a
NC
5227 /* Trade off - by using this evil construction we can pull the
5228 variable gv into the block labelled keylookup. If not, then
5229 we have to give it function scope so that the goto from the
5230 earlier ':' case doesn't bypass the initialisation. */
5231 if (0) {
5232 just_a_word_zero_gv:
5233 gv = NULL;
5234 gvp = NULL;
8bee0991 5235 orig_keyword = 0;
0bfa2a8a 5236 }
93a17b20 5237 just_a_word: {
96e4d5b1 5238 SV *sv;
ce29ac45 5239 int pkgname = 0;
f54cb97a 5240 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
5069cc75 5241 CV *cv;
5db06880 5242#ifdef PERL_MAD
cd81e915 5243 SV *nextPL_nextwhite = 0;
5db06880
NC
5244#endif
5245
8990e307
LW
5246
5247 /* Get the rest if it looks like a package qualifier */
5248
155aba94 5249 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
c3e0f903 5250 STRLEN morelen;
3280af22 5251 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
5252 TRUE, &morelen);
5253 if (!morelen)
cea2e8a9 5254 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 5255 *s == '\'' ? "'" : "::");
c3e0f903 5256 len += morelen;
ce29ac45 5257 pkgname = 1;
a0d0e21e 5258 }
8990e307 5259
3280af22
NIS
5260 if (PL_expect == XOPERATOR) {
5261 if (PL_bufptr == PL_linestart) {
57843af0 5262 CopLINE_dec(PL_curcop);
9014280d 5263 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 5264 CopLINE_inc(PL_curcop);
463ee0b2
LW
5265 }
5266 else
54310121 5267 no_op("Bareword",s);
463ee0b2 5268 }
8990e307 5269
c3e0f903
GS
5270 /* Look for a subroutine with this name in current package,
5271 unless name is "Foo::", in which case Foo is a bearword
5272 (and a package name). */
5273
5db06880 5274 if (len > 2 && !PL_madskills &&
3280af22 5275 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 5276 {
f776e3cd 5277 if (ckWARN(WARN_BAREWORD)
90e5519e 5278 && ! gv_fetchpvn_flags(PL_tokenbuf, len, 0, SVt_PVHV))
9014280d 5279 Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
599cee73 5280 "Bareword \"%s\" refers to nonexistent package",
3280af22 5281 PL_tokenbuf);
c3e0f903 5282 len -= 2;
3280af22 5283 PL_tokenbuf[len] = '\0';
a0714e2c 5284 gv = NULL;
c3e0f903
GS
5285 gvp = 0;
5286 }
5287 else {
62d55b22
NC
5288 if (!gv) {
5289 /* Mustn't actually add anything to a symbol table.
5290 But also don't want to "initialise" any placeholder
5291 constants that might already be there into full
5292 blown PVGVs with attached PVCV. */
90e5519e
NC
5293 gv = gv_fetchpvn_flags(PL_tokenbuf, len,
5294 GV_NOADD_NOINIT, SVt_PVCV);
62d55b22 5295 }
b3d904f3 5296 len = 0;
c3e0f903
GS
5297 }
5298
5299 /* if we saw a global override before, get the right name */
8990e307 5300
49dc05e3 5301 if (gvp) {
396482e1 5302 sv = newSVpvs("CORE::GLOBAL::");
3280af22 5303 sv_catpv(sv,PL_tokenbuf);
49dc05e3 5304 }
8a7a129d
NC
5305 else {
5306 /* If len is 0, newSVpv does strlen(), which is correct.
5307 If len is non-zero, then it will be the true length,
5308 and so the scalar will be created correctly. */
5309 sv = newSVpv(PL_tokenbuf,len);
5310 }
5db06880 5311#ifdef PERL_MAD
cd81e915
NC
5312 if (PL_madskills && !PL_thistoken) {
5313 char *start = SvPVX(PL_linestr) + PL_realtokenstart;
5314 PL_thistoken = newSVpv(start,s - start);
5315 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
5316 }
5317#endif
8990e307 5318
a0d0e21e
LW
5319 /* Presume this is going to be a bareword of some sort. */
5320
5321 CLINE;
49dc05e3 5322 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
a0d0e21e 5323 yylval.opval->op_private = OPpCONST_BARE;
8f8cf39c
JH
5324 /* UTF-8 package name? */
5325 if (UTF && !IN_BYTES &&
95a20fc0 5326 is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
8f8cf39c 5327 SvUTF8_on(sv);
a0d0e21e 5328
c3e0f903
GS
5329 /* And if "Foo::", then that's what it certainly is. */
5330
5331 if (len)
5332 goto safe_bareword;
5333
5069cc75
NC
5334 /* Do the explicit type check so that we don't need to force
5335 the initialisation of the symbol table to have a real GV.
5336 Beware - gv may not really be a PVGV, cv may not really be
5337 a PVCV, (because of the space optimisations that gv_init
5338 understands) But they're true if for this symbol there is
5339 respectively a typeglob and a subroutine.
5340 */
5341 cv = gv ? ((SvTYPE(gv) == SVt_PVGV)
5342 /* Real typeglob, so get the real subroutine: */
5343 ? GvCVu(gv)
5344 /* A proxy for a subroutine in this package? */
5345 : SvOK(gv) ? (CV *) gv : NULL)
5346 : NULL;
5347
8990e307
LW
5348 /* See if it's the indirect object for a list operator. */
5349
3280af22
NIS
5350 if (PL_oldoldbufptr &&
5351 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
5352 (PL_oldoldbufptr == PL_last_lop
5353 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 5354 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
5355 (PL_expect == XREF ||
5356 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 5357 {
748a9306
LW
5358 bool immediate_paren = *s == '(';
5359
a0d0e21e 5360 /* (Now we can afford to cross potential line boundary.) */
cd81e915 5361 s = SKIPSPACE2(s,nextPL_nextwhite);
5db06880 5362#ifdef PERL_MAD
cd81e915 5363 PL_nextwhite = nextPL_nextwhite; /* assume no & deception */
5db06880 5364#endif
a0d0e21e
LW
5365
5366 /* Two barewords in a row may indicate method call. */
5367
62d55b22
NC
5368 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
5369 (tmp = intuit_method(s, gv, cv)))
bbf60fe6 5370 return REPORT(tmp);
a0d0e21e
LW
5371
5372 /* If not a declared subroutine, it's an indirect object. */
5373 /* (But it's an indir obj regardless for sort.) */
7294df96 5374 /* Also, if "_" follows a filetest operator, it's a bareword */
a0d0e21e 5375
7294df96
RGS
5376 if (
5377 ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
5069cc75 5378 ((!gv || !cv) &&
a9ef352a 5379 (PL_last_lop_op != OP_MAPSTART &&
f0670693 5380 PL_last_lop_op != OP_GREPSTART))))
7294df96
RGS
5381 || (PL_tokenbuf[0] == '_' && PL_tokenbuf[1] == '\0'
5382 && ((PL_opargs[PL_last_lop_op] & OA_CLASS_MASK) == OA_FILESTATOP))
5383 )
a9ef352a 5384 {
3280af22 5385 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 5386 goto bareword;
93a17b20
LW
5387 }
5388 }
8990e307 5389
3280af22 5390 PL_expect = XOPERATOR;
5db06880
NC
5391#ifdef PERL_MAD
5392 if (isSPACE(*s))
cd81e915
NC
5393 s = SKIPSPACE2(s,nextPL_nextwhite);
5394 PL_nextwhite = nextPL_nextwhite;
5db06880 5395#else
8990e307 5396 s = skipspace(s);
5db06880 5397#endif
1c3923b3
GS
5398
5399 /* Is this a word before a => operator? */
ce29ac45 5400 if (*s == '=' && s[1] == '>' && !pkgname) {
1c3923b3
GS
5401 CLINE;
5402 sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
0064a8a9 5403 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
7948272d 5404 SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
1c3923b3
GS
5405 TERM(WORD);
5406 }
5407
5408 /* If followed by a paren, it's certainly a subroutine. */
93a17b20 5409 if (*s == '(') {
79072805 5410 CLINE;
5069cc75 5411 if (cv) {
c35e046a
AL
5412 d = s + 1;
5413 while (SPACE_OR_TAB(*d))
5414 d++;
62d55b22 5415 if (*d == ')' && (sv = gv_const_sv(gv))) {
96e4d5b1 5416 s = d + 1;
5db06880
NC
5417#ifdef PERL_MAD
5418 if (PL_madskills) {
cd81e915
NC
5419 char *par = SvPVX(PL_linestr) + PL_realtokenstart;
5420 sv_catpvn(PL_thistoken, par, s - par);
5421 if (PL_nextwhite) {
5422 sv_free(PL_nextwhite);
5423 PL_nextwhite = 0;
5db06880
NC
5424 }
5425 }
36dee510 5426 else
5db06880 5427#endif
36dee510 5428 goto its_constant;
96e4d5b1 5429 }
5430 }
5db06880
NC
5431#ifdef PERL_MAD
5432 if (PL_madskills) {
cd81e915
NC
5433 PL_nextwhite = PL_thiswhite;
5434 PL_thiswhite = 0;
5db06880 5435 }
cd81e915 5436 start_force(PL_curforce);
5db06880 5437#endif
9ded7720 5438 NEXTVAL_NEXTTOKE.opval = yylval.opval;
3280af22 5439 PL_expect = XOPERATOR;
5db06880
NC
5440#ifdef PERL_MAD
5441 if (PL_madskills) {
cd81e915
NC
5442 PL_nextwhite = nextPL_nextwhite;
5443 curmad('X', PL_thistoken);
6b29d1f5 5444 PL_thistoken = newSVpvs("");
5db06880
NC
5445 }
5446#endif
93a17b20 5447 force_next(WORD);
c07a80fd 5448 yylval.ival = 0;
463ee0b2 5449 TOKEN('&');
79072805 5450 }
93a17b20 5451
a0d0e21e 5452 /* If followed by var or block, call it a method (unless sub) */
8990e307 5453
62d55b22 5454 if ((*s == '$' || *s == '{') && (!gv || !cv)) {
3280af22
NIS
5455 PL_last_lop = PL_oldbufptr;
5456 PL_last_lop_op = OP_METHOD;
93a17b20 5457 PREBLOCK(METHOD);
463ee0b2
LW
5458 }
5459
8990e307
LW
5460 /* If followed by a bareword, see if it looks like indir obj. */
5461
30fe34ed
RGS
5462 if (!orig_keyword
5463 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
62d55b22 5464 && (tmp = intuit_method(s, gv, cv)))
bbf60fe6 5465 return REPORT(tmp);
93a17b20 5466
8990e307
LW
5467 /* Not a method, so call it a subroutine (if defined) */
5468
5069cc75 5469 if (cv) {
0453d815 5470 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
9014280d 5471 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5472 "Ambiguous use of -%s resolved as -&%s()",
3280af22 5473 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 5474 /* Check for a constant sub */
36dee510 5475 if ((sv = gv_const_sv(gv)) && !PL_madskills) {
96e4d5b1 5476 its_constant:
5477 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
b37c2d43 5478 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
96e4d5b1 5479 yylval.opval->op_private = 0;
5480 TOKEN(WORD);
89bfa8cd 5481 }
5482
a5f75d66 5483 /* Resolve to GV now. */
62d55b22 5484 if (SvTYPE(gv) != SVt_PVGV) {
b3d904f3 5485 gv = gv_fetchpv(PL_tokenbuf, 0, SVt_PVCV);
62d55b22
NC
5486 assert (SvTYPE(gv) == SVt_PVGV);
5487 /* cv must have been some sort of placeholder, so
5488 now needs replacing with a real code reference. */
5489 cv = GvCV(gv);
5490 }
5491
a5f75d66
AD
5492 op_free(yylval.opval);
5493 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
9675f7ac 5494 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 5495 PL_last_lop = PL_oldbufptr;
bf848113 5496 PL_last_lop_op = OP_ENTERSUB;
4633a7c4 5497 /* Is there a prototype? */
5db06880
NC
5498 if (
5499#ifdef PERL_MAD
5500 cv &&
5501#endif
d9f2850e
RGS
5502 SvPOK(cv))
5503 {
5f66b61c
AL
5504 STRLEN protolen;
5505 const char *proto = SvPV_const((SV*)cv, protolen);
5506 if (!protolen)
4633a7c4 5507 TERM(FUNC0SUB);
8c28b960 5508 if ((*proto == '$' || *proto == '_') && proto[1] == '\0')
4633a7c4 5509 OPERATOR(UNIOPSUB);
0f5d0394
AE
5510 while (*proto == ';')
5511 proto++;
7a52d87a 5512 if (*proto == '&' && *s == '{') {
10edeb5d
JH
5513 sv_setpv(PL_subname,
5514 (const char *)
5515 (PL_curstash ?
5516 "__ANON__" : "__ANON__::__ANON__"));
4633a7c4
LW
5517 PREBLOCK(LSTOPSUB);
5518 }
a9ef352a 5519 }
5db06880
NC
5520#ifdef PERL_MAD
5521 {
5522 if (PL_madskills) {
cd81e915
NC
5523 PL_nextwhite = PL_thiswhite;
5524 PL_thiswhite = 0;
5db06880 5525 }
cd81e915 5526 start_force(PL_curforce);
5db06880
NC
5527 NEXTVAL_NEXTTOKE.opval = yylval.opval;
5528 PL_expect = XTERM;
5529 if (PL_madskills) {
cd81e915
NC
5530 PL_nextwhite = nextPL_nextwhite;
5531 curmad('X', PL_thistoken);
6b29d1f5 5532 PL_thistoken = newSVpvs("");
5db06880
NC
5533 }
5534 force_next(WORD);
5535 TOKEN(NOAMP);
5536 }
5537 }
5538
5539 /* Guess harder when madskills require "best effort". */
5540 if (PL_madskills && (!gv || !GvCVu(gv))) {
5541 int probable_sub = 0;
5542 if (strchr("\"'`$@%0123456789!*+{[<", *s))
5543 probable_sub = 1;
5544 else if (isALPHA(*s)) {
5545 char tmpbuf[1024];
5546 STRLEN tmplen;
5547 d = s;
5548 d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen);
5458a98a 5549 if (!keyword(tmpbuf, tmplen, 0))
5db06880
NC
5550 probable_sub = 1;
5551 else {
5552 while (d < PL_bufend && isSPACE(*d))
5553 d++;
5554 if (*d == '=' && d[1] == '>')
5555 probable_sub = 1;
5556 }
5557 }
5558 if (probable_sub) {
7a6d04f4 5559 gv = gv_fetchpv(PL_tokenbuf, GV_ADD, SVt_PVCV);
5db06880
NC
5560 op_free(yylval.opval);
5561 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
5562 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
5563 PL_last_lop = PL_oldbufptr;
5564 PL_last_lop_op = OP_ENTERSUB;
cd81e915
NC
5565 PL_nextwhite = PL_thiswhite;
5566 PL_thiswhite = 0;
5567 start_force(PL_curforce);
5db06880
NC
5568 NEXTVAL_NEXTTOKE.opval = yylval.opval;
5569 PL_expect = XTERM;
cd81e915
NC
5570 PL_nextwhite = nextPL_nextwhite;
5571 curmad('X', PL_thistoken);
6b29d1f5 5572 PL_thistoken = newSVpvs("");
5db06880
NC
5573 force_next(WORD);
5574 TOKEN(NOAMP);
5575 }
5576#else
9ded7720 5577 NEXTVAL_NEXTTOKE.opval = yylval.opval;
3280af22 5578 PL_expect = XTERM;
8990e307
LW
5579 force_next(WORD);
5580 TOKEN(NOAMP);
5db06880 5581#endif
8990e307 5582 }
748a9306 5583
8990e307
LW
5584 /* Call it a bare word */
5585
5603f27d
GS
5586 if (PL_hints & HINT_STRICT_SUBS)
5587 yylval.opval->op_private |= OPpCONST_STRICT;
5588 else {
5589 bareword:
041457d9
DM
5590 if (lastchar != '-') {
5591 if (ckWARN(WARN_RESERVED)) {
c35e046a
AL
5592 d = PL_tokenbuf;
5593 while (isLOWER(*d))
5594 d++;
da51bb9b 5595 if (!*d && !gv_stashpv(PL_tokenbuf, 0))
9014280d 5596 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
5597 PL_tokenbuf);
5598 }
748a9306
LW
5599 }
5600 }
c3e0f903
GS
5601
5602 safe_bareword:
3792a11b
NC
5603 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
5604 && ckWARN_d(WARN_AMBIGUOUS)) {
9014280d 5605 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5606 "Operator or semicolon missing before %c%s",
3280af22 5607 lastchar, PL_tokenbuf);
9014280d 5608 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 5609 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
5610 lastchar, lastchar);
5611 }
93a17b20 5612 TOKEN(WORD);
79072805 5613 }
79072805 5614
68dc0745 5615 case KEY___FILE__:
46fc3d4c 5616 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 5617 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 5618 TERM(THING);
5619
79072805 5620 case KEY___LINE__:
cf2093f6 5621 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 5622 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 5623 TERM(THING);
68dc0745 5624
5625 case KEY___PACKAGE__:
5626 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22 5627 (PL_curstash
5aaec2b4 5628 ? newSVhek(HvNAME_HEK(PL_curstash))
3280af22 5629 : &PL_sv_undef));
79072805 5630 TERM(THING);
79072805 5631
e50aee73 5632 case KEY___DATA__:
79072805
LW
5633 case KEY___END__: {
5634 GV *gv;
3280af22 5635 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
bfed75c6 5636 const char *pname = "main";
3280af22 5637 if (PL_tokenbuf[2] == 'D')
bfcb3514 5638 pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
f776e3cd
NC
5639 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
5640 SVt_PVIO);
a5f75d66 5641 GvMULTI_on(gv);
79072805 5642 if (!GvIO(gv))
a0d0e21e 5643 GvIOp(gv) = newIO();
3280af22 5644 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
5645#if defined(HAS_FCNTL) && defined(F_SETFD)
5646 {
f54cb97a 5647 const int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
5648 fcntl(fd,F_SETFD,fd >= 3);
5649 }
79072805 5650#endif
fd049845 5651 /* Mark this internal pseudo-handle as clean */
5652 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3280af22 5653 if (PL_preprocess)
50952442 5654 IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
3280af22 5655 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 5656 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 5657 else
50952442 5658 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
5659#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
5660 /* if the script was opened in binmode, we need to revert
53129d29 5661 * it to text mode for compatibility; but only iff it has CRs
c39cd008 5662 * XXX this is a questionable hack at best. */
53129d29
GS
5663 if (PL_bufend-PL_bufptr > 2
5664 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
5665 {
5666 Off_t loc = 0;
50952442 5667 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
5668 loc = PerlIO_tell(PL_rsfp);
5669 (void)PerlIO_seek(PL_rsfp, 0L, 0);
5670 }
2986a63f
JH
5671#ifdef NETWARE
5672 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
5673#else
c39cd008 5674 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 5675#endif /* NETWARE */
1143fce0
JH
5676#ifdef PERLIO_IS_STDIO /* really? */
5677# if defined(__BORLANDC__)
cb359b41
JH
5678 /* XXX see note in do_binmode() */
5679 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
5680# endif
5681#endif
c39cd008
GS
5682 if (loc > 0)
5683 PerlIO_seek(PL_rsfp, loc, 0);
5684 }
5685 }
5686#endif
7948272d 5687#ifdef PERLIO_LAYERS
52d2e0f4
JH
5688 if (!IN_BYTES) {
5689 if (UTF)
5690 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
5691 else if (PL_encoding) {
5692 SV *name;
5693 dSP;
5694 ENTER;
5695 SAVETMPS;
5696 PUSHMARK(sp);
5697 EXTEND(SP, 1);
5698 XPUSHs(PL_encoding);
5699 PUTBACK;
5700 call_method("name", G_SCALAR);
5701 SPAGAIN;
5702 name = POPs;
5703 PUTBACK;
bfed75c6 5704 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
52d2e0f4 5705 Perl_form(aTHX_ ":encoding(%"SVf")",
be2597df 5706 SVfARG(name)));
52d2e0f4
JH
5707 FREETMPS;
5708 LEAVE;
5709 }
5710 }
7948272d 5711#endif
5db06880
NC
5712#ifdef PERL_MAD
5713 if (PL_madskills) {
cd81e915
NC
5714 if (PL_realtokenstart >= 0) {
5715 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5716 if (!PL_endwhite)
6b29d1f5 5717 PL_endwhite = newSVpvs("");
cd81e915
NC
5718 sv_catsv(PL_endwhite, PL_thiswhite);
5719 PL_thiswhite = 0;
5720 sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
5721 PL_realtokenstart = -1;
5db06880 5722 }
cd81e915
NC
5723 while ((s = filter_gets(PL_endwhite, PL_rsfp,
5724 SvCUR(PL_endwhite))) != Nullch) ;
5db06880
NC
5725 }
5726#endif
4608196e 5727 PL_rsfp = NULL;
79072805
LW
5728 }
5729 goto fake_eof;
e929a76b 5730 }
de3bb511 5731
8990e307 5732 case KEY_AUTOLOAD:
ed6116ce 5733 case KEY_DESTROY:
79072805 5734 case KEY_BEGIN:
3c10abe3 5735 case KEY_UNITCHECK:
7d30b5c4 5736 case KEY_CHECK:
7d07dbc2 5737 case KEY_INIT:
7d30b5c4 5738 case KEY_END:
3280af22
NIS
5739 if (PL_expect == XSTATE) {
5740 s = PL_bufptr;
93a17b20 5741 goto really_sub;
79072805
LW
5742 }
5743 goto just_a_word;
5744
a0d0e21e
LW
5745 case KEY_CORE:
5746 if (*s == ':' && s[1] == ':') {
5747 s += 2;
748a9306 5748 d = s;
3280af22 5749 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
5458a98a 5750 if (!(tmp = keyword(PL_tokenbuf, len, 0)))
6798c92b 5751 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
5752 if (tmp < 0)
5753 tmp = -tmp;
850e8516 5754 else if (tmp == KEY_require || tmp == KEY_do)
a72a1c8b 5755 /* that's a way to remember we saw "CORE::" */
850e8516 5756 orig_keyword = tmp;
a0d0e21e
LW
5757 goto reserved_word;
5758 }
5759 goto just_a_word;
5760
463ee0b2
LW
5761 case KEY_abs:
5762 UNI(OP_ABS);
5763
79072805
LW
5764 case KEY_alarm:
5765 UNI(OP_ALARM);
5766
5767 case KEY_accept:
a0d0e21e 5768 LOP(OP_ACCEPT,XTERM);
79072805 5769
463ee0b2
LW
5770 case KEY_and:
5771 OPERATOR(ANDOP);
5772
79072805 5773 case KEY_atan2:
a0d0e21e 5774 LOP(OP_ATAN2,XTERM);
85e6fe83 5775
79072805 5776 case KEY_bind:
a0d0e21e 5777 LOP(OP_BIND,XTERM);
79072805
LW
5778
5779 case KEY_binmode:
1c1fc3ea 5780 LOP(OP_BINMODE,XTERM);
79072805
LW
5781
5782 case KEY_bless:
a0d0e21e 5783 LOP(OP_BLESS,XTERM);
79072805 5784
0d863452
RH
5785 case KEY_break:
5786 FUN0(OP_BREAK);
5787
79072805
LW
5788 case KEY_chop:
5789 UNI(OP_CHOP);
5790
5791 case KEY_continue:
0d863452
RH
5792 /* When 'use switch' is in effect, continue has a dual
5793 life as a control operator. */
5794 {
ef89dcc3 5795 if (!FEATURE_IS_ENABLED("switch"))
0d863452
RH
5796 PREBLOCK(CONTINUE);
5797 else {
5798 /* We have to disambiguate the two senses of
5799 "continue". If the next token is a '{' then
5800 treat it as the start of a continue block;
5801 otherwise treat it as a control operator.
5802 */
5803 s = skipspace(s);
5804 if (*s == '{')
79072805 5805 PREBLOCK(CONTINUE);
0d863452
RH
5806 else
5807 FUN0(OP_CONTINUE);
5808 }
5809 }
79072805
LW
5810
5811 case KEY_chdir:
fafc274c
NC
5812 /* may use HOME */
5813 (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
79072805
LW
5814 UNI(OP_CHDIR);
5815
5816 case KEY_close:
5817 UNI(OP_CLOSE);
5818
5819 case KEY_closedir:
5820 UNI(OP_CLOSEDIR);
5821
5822 case KEY_cmp:
5823 Eop(OP_SCMP);
5824
5825 case KEY_caller:
5826 UNI(OP_CALLER);
5827
5828 case KEY_crypt:
5829#ifdef FCRYPT
f4c556ac
GS
5830 if (!PL_cryptseen) {
5831 PL_cryptseen = TRUE;
de3bb511 5832 init_des();
f4c556ac 5833 }
a687059c 5834#endif
a0d0e21e 5835 LOP(OP_CRYPT,XTERM);
79072805
LW
5836
5837 case KEY_chmod:
a0d0e21e 5838 LOP(OP_CHMOD,XTERM);
79072805
LW
5839
5840 case KEY_chown:
a0d0e21e 5841 LOP(OP_CHOWN,XTERM);
79072805
LW
5842
5843 case KEY_connect:
a0d0e21e 5844 LOP(OP_CONNECT,XTERM);
79072805 5845
463ee0b2
LW
5846 case KEY_chr:
5847 UNI(OP_CHR);
5848
79072805
LW
5849 case KEY_cos:
5850 UNI(OP_COS);
5851
5852 case KEY_chroot:
5853 UNI(OP_CHROOT);
5854
0d863452
RH
5855 case KEY_default:
5856 PREBLOCK(DEFAULT);
5857
79072805 5858 case KEY_do:
29595ff2 5859 s = SKIPSPACE1(s);
79072805 5860 if (*s == '{')
a0d0e21e 5861 PRETERMBLOCK(DO);
79072805 5862 if (*s != '\'')
89c5585f 5863 s = force_word(s,WORD,TRUE,TRUE,FALSE);
850e8516
RGS
5864 if (orig_keyword == KEY_do) {
5865 orig_keyword = 0;
5866 yylval.ival = 1;
5867 }
5868 else
5869 yylval.ival = 0;
378cc40b 5870 OPERATOR(DO);
79072805
LW
5871
5872 case KEY_die:
3280af22 5873 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 5874 LOP(OP_DIE,XTERM);
79072805
LW
5875
5876 case KEY_defined:
5877 UNI(OP_DEFINED);
5878
5879 case KEY_delete:
a0d0e21e 5880 UNI(OP_DELETE);
79072805
LW
5881
5882 case KEY_dbmopen:
5c1737d1 5883 gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
a0d0e21e 5884 LOP(OP_DBMOPEN,XTERM);
79072805
LW
5885
5886 case KEY_dbmclose:
5887 UNI(OP_DBMCLOSE);
5888
5889 case KEY_dump:
a0d0e21e 5890 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
5891 LOOPX(OP_DUMP);
5892
5893 case KEY_else:
5894 PREBLOCK(ELSE);
5895
5896 case KEY_elsif:
57843af0 5897 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5898 OPERATOR(ELSIF);
5899
5900 case KEY_eq:
5901 Eop(OP_SEQ);
5902
a0d0e21e
LW
5903 case KEY_exists:
5904 UNI(OP_EXISTS);
4e553d73 5905
79072805 5906 case KEY_exit:
5db06880
NC
5907 if (PL_madskills)
5908 UNI(OP_INT);
79072805
LW
5909 UNI(OP_EXIT);
5910
5911 case KEY_eval:
29595ff2 5912 s = SKIPSPACE1(s);
3280af22 5913 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 5914 UNIBRACK(OP_ENTEREVAL);
79072805
LW
5915
5916 case KEY_eof:
5917 UNI(OP_EOF);
5918
c963b151
BD
5919 case KEY_err:
5920 OPERATOR(DOROP);
5921
79072805
LW
5922 case KEY_exp:
5923 UNI(OP_EXP);
5924
5925 case KEY_each:
5926 UNI(OP_EACH);
5927
5928 case KEY_exec:
5929 set_csh();
a0d0e21e 5930 LOP(OP_EXEC,XREF);
79072805
LW
5931
5932 case KEY_endhostent:
5933 FUN0(OP_EHOSTENT);
5934
5935 case KEY_endnetent:
5936 FUN0(OP_ENETENT);
5937
5938 case KEY_endservent:
5939 FUN0(OP_ESERVENT);
5940
5941 case KEY_endprotoent:
5942 FUN0(OP_EPROTOENT);
5943
5944 case KEY_endpwent:
5945 FUN0(OP_EPWENT);
5946
5947 case KEY_endgrent:
5948 FUN0(OP_EGRENT);
5949
5950 case KEY_for:
5951 case KEY_foreach:
57843af0 5952 yylval.ival = CopLINE(PL_curcop);
29595ff2 5953 s = SKIPSPACE1(s);
7e2040f0 5954 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 5955 char *p = s;
5db06880
NC
5956#ifdef PERL_MAD
5957 int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */
5958#endif
5959
3280af22 5960 if ((PL_bufend - p) >= 3 &&
55497cff 5961 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
5962 p += 2;
77ca0c92
LW
5963 else if ((PL_bufend - p) >= 4 &&
5964 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
5965 p += 3;
29595ff2 5966 p = PEEKSPACE(p);
7e2040f0 5967 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
5968 p = scan_ident(p, PL_bufend,
5969 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
29595ff2 5970 p = PEEKSPACE(p);
77ca0c92
LW
5971 }
5972 if (*p != '$')
cea2e8a9 5973 Perl_croak(aTHX_ "Missing $ on loop variable");
5db06880
NC
5974#ifdef PERL_MAD
5975 s = SvPVX(PL_linestr) + soff;
5976#endif
55497cff 5977 }
79072805
LW
5978 OPERATOR(FOR);
5979
5980 case KEY_formline:
a0d0e21e 5981 LOP(OP_FORMLINE,XTERM);
79072805
LW
5982
5983 case KEY_fork:
5984 FUN0(OP_FORK);
5985
5986 case KEY_fcntl:
a0d0e21e 5987 LOP(OP_FCNTL,XTERM);
79072805
LW
5988
5989 case KEY_fileno:
5990 UNI(OP_FILENO);
5991
5992 case KEY_flock:
a0d0e21e 5993 LOP(OP_FLOCK,XTERM);
79072805
LW
5994
5995 case KEY_gt:
5996 Rop(OP_SGT);
5997
5998 case KEY_ge:
5999 Rop(OP_SGE);
6000
6001 case KEY_grep:
2c38e13d 6002 LOP(OP_GREPSTART, XREF);
79072805
LW
6003
6004 case KEY_goto:
a0d0e21e 6005 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6006 LOOPX(OP_GOTO);
6007
6008 case KEY_gmtime:
6009 UNI(OP_GMTIME);
6010
6011 case KEY_getc:
6f33ba73 6012 UNIDOR(OP_GETC);
79072805
LW
6013
6014 case KEY_getppid:
6015 FUN0(OP_GETPPID);
6016
6017 case KEY_getpgrp:
6018 UNI(OP_GETPGRP);
6019
6020 case KEY_getpriority:
a0d0e21e 6021 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
6022
6023 case KEY_getprotobyname:
6024 UNI(OP_GPBYNAME);
6025
6026 case KEY_getprotobynumber:
a0d0e21e 6027 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
6028
6029 case KEY_getprotoent:
6030 FUN0(OP_GPROTOENT);
6031
6032 case KEY_getpwent:
6033 FUN0(OP_GPWENT);
6034
6035 case KEY_getpwnam:
ff68c719 6036 UNI(OP_GPWNAM);
79072805
LW
6037
6038 case KEY_getpwuid:
ff68c719 6039 UNI(OP_GPWUID);
79072805
LW
6040
6041 case KEY_getpeername:
6042 UNI(OP_GETPEERNAME);
6043
6044 case KEY_gethostbyname:
6045 UNI(OP_GHBYNAME);
6046
6047 case KEY_gethostbyaddr:
a0d0e21e 6048 LOP(OP_GHBYADDR,XTERM);
79072805
LW
6049
6050 case KEY_gethostent:
6051 FUN0(OP_GHOSTENT);
6052
6053 case KEY_getnetbyname:
6054 UNI(OP_GNBYNAME);
6055
6056 case KEY_getnetbyaddr:
a0d0e21e 6057 LOP(OP_GNBYADDR,XTERM);
79072805
LW
6058
6059 case KEY_getnetent:
6060 FUN0(OP_GNETENT);
6061
6062 case KEY_getservbyname:
a0d0e21e 6063 LOP(OP_GSBYNAME,XTERM);
79072805
LW
6064
6065 case KEY_getservbyport:
a0d0e21e 6066 LOP(OP_GSBYPORT,XTERM);
79072805
LW
6067
6068 case KEY_getservent:
6069 FUN0(OP_GSERVENT);
6070
6071 case KEY_getsockname:
6072 UNI(OP_GETSOCKNAME);
6073
6074 case KEY_getsockopt:
a0d0e21e 6075 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
6076
6077 case KEY_getgrent:
6078 FUN0(OP_GGRENT);
6079
6080 case KEY_getgrnam:
ff68c719 6081 UNI(OP_GGRNAM);
79072805
LW
6082
6083 case KEY_getgrgid:
ff68c719 6084 UNI(OP_GGRGID);
79072805
LW
6085
6086 case KEY_getlogin:
6087 FUN0(OP_GETLOGIN);
6088
0d863452
RH
6089 case KEY_given:
6090 yylval.ival = CopLINE(PL_curcop);
6091 OPERATOR(GIVEN);
6092
93a17b20 6093 case KEY_glob:
a0d0e21e
LW
6094 set_csh();
6095 LOP(OP_GLOB,XTERM);
93a17b20 6096
79072805
LW
6097 case KEY_hex:
6098 UNI(OP_HEX);
6099
6100 case KEY_if:
57843af0 6101 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6102 OPERATOR(IF);
6103
6104 case KEY_index:
a0d0e21e 6105 LOP(OP_INDEX,XTERM);
79072805
LW
6106
6107 case KEY_int:
6108 UNI(OP_INT);
6109
6110 case KEY_ioctl:
a0d0e21e 6111 LOP(OP_IOCTL,XTERM);
79072805
LW
6112
6113 case KEY_join:
a0d0e21e 6114 LOP(OP_JOIN,XTERM);
79072805
LW
6115
6116 case KEY_keys:
6117 UNI(OP_KEYS);
6118
6119 case KEY_kill:
a0d0e21e 6120 LOP(OP_KILL,XTERM);
79072805
LW
6121
6122 case KEY_last:
a0d0e21e 6123 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 6124 LOOPX(OP_LAST);
4e553d73 6125
79072805
LW
6126 case KEY_lc:
6127 UNI(OP_LC);
6128
6129 case KEY_lcfirst:
6130 UNI(OP_LCFIRST);
6131
6132 case KEY_local:
09bef843 6133 yylval.ival = 0;
79072805
LW
6134 OPERATOR(LOCAL);
6135
6136 case KEY_length:
6137 UNI(OP_LENGTH);
6138
6139 case KEY_lt:
6140 Rop(OP_SLT);
6141
6142 case KEY_le:
6143 Rop(OP_SLE);
6144
6145 case KEY_localtime:
6146 UNI(OP_LOCALTIME);
6147
6148 case KEY_log:
6149 UNI(OP_LOG);
6150
6151 case KEY_link:
a0d0e21e 6152 LOP(OP_LINK,XTERM);
79072805
LW
6153
6154 case KEY_listen:
a0d0e21e 6155 LOP(OP_LISTEN,XTERM);
79072805 6156
c0329465
MB
6157 case KEY_lock:
6158 UNI(OP_LOCK);
6159
79072805
LW
6160 case KEY_lstat:
6161 UNI(OP_LSTAT);
6162
6163 case KEY_m:
8782bef2 6164 s = scan_pat(s,OP_MATCH);
79072805
LW
6165 TERM(sublex_start());
6166
a0d0e21e 6167 case KEY_map:
2c38e13d 6168 LOP(OP_MAPSTART, XREF);
4e4e412b 6169
79072805 6170 case KEY_mkdir:
a0d0e21e 6171 LOP(OP_MKDIR,XTERM);
79072805
LW
6172
6173 case KEY_msgctl:
a0d0e21e 6174 LOP(OP_MSGCTL,XTERM);
79072805
LW
6175
6176 case KEY_msgget:
a0d0e21e 6177 LOP(OP_MSGGET,XTERM);
79072805
LW
6178
6179 case KEY_msgrcv:
a0d0e21e 6180 LOP(OP_MSGRCV,XTERM);
79072805
LW
6181
6182 case KEY_msgsnd:
a0d0e21e 6183 LOP(OP_MSGSND,XTERM);
79072805 6184
77ca0c92 6185 case KEY_our:
93a17b20 6186 case KEY_my:
952306ac 6187 case KEY_state:
77ca0c92 6188 PL_in_my = tmp;
29595ff2 6189 s = SKIPSPACE1(s);
7e2040f0 6190 if (isIDFIRST_lazy_if(s,UTF)) {
5db06880
NC
6191#ifdef PERL_MAD
6192 char* start = s;
6193#endif
3280af22 6194 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
6195 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
6196 goto really_sub;
def3634b 6197 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 6198 if (!PL_in_my_stash) {
c750a3ec 6199 char tmpbuf[1024];
3280af22 6200 PL_bufptr = s;
d9fad198 6201 my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
6202 yyerror(tmpbuf);
6203 }
5db06880
NC
6204#ifdef PERL_MAD
6205 if (PL_madskills) { /* just add type to declarator token */
cd81e915
NC
6206 sv_catsv(PL_thistoken, PL_nextwhite);
6207 PL_nextwhite = 0;
6208 sv_catpvn(PL_thistoken, start, s - start);
5db06880
NC
6209 }
6210#endif
c750a3ec 6211 }
09bef843 6212 yylval.ival = 1;
55497cff 6213 OPERATOR(MY);
93a17b20 6214
79072805 6215 case KEY_next:
a0d0e21e 6216 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6217 LOOPX(OP_NEXT);
6218
6219 case KEY_ne:
6220 Eop(OP_SNE);
6221
a0d0e21e 6222 case KEY_no:
468aa647 6223 s = tokenize_use(0, s);
a0d0e21e
LW
6224 OPERATOR(USE);
6225
6226 case KEY_not:
29595ff2 6227 if (*s == '(' || (s = SKIPSPACE1(s), *s == '('))
2d2e263d
LW
6228 FUN1(OP_NOT);
6229 else
6230 OPERATOR(NOTOP);
a0d0e21e 6231
79072805 6232 case KEY_open:
29595ff2 6233 s = SKIPSPACE1(s);
7e2040f0 6234 if (isIDFIRST_lazy_if(s,UTF)) {
f54cb97a 6235 const char *t;
c35e046a
AL
6236 for (d = s; isALNUM_lazy_if(d,UTF);)
6237 d++;
6238 for (t=d; isSPACE(*t);)
6239 t++;
e2ab214b 6240 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
6241 /* [perl #16184] */
6242 && !(t[0] == '=' && t[1] == '>')
6243 ) {
5f66b61c 6244 int parms_len = (int)(d-s);
9014280d 6245 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 6246 "Precedence problem: open %.*s should be open(%.*s)",
5f66b61c 6247 parms_len, s, parms_len, s);
66fbe8fb 6248 }
93a17b20 6249 }
a0d0e21e 6250 LOP(OP_OPEN,XTERM);
79072805 6251
463ee0b2 6252 case KEY_or:
a0d0e21e 6253 yylval.ival = OP_OR;
463ee0b2
LW
6254 OPERATOR(OROP);
6255
79072805
LW
6256 case KEY_ord:
6257 UNI(OP_ORD);
6258
6259 case KEY_oct:
6260 UNI(OP_OCT);
6261
6262 case KEY_opendir:
a0d0e21e 6263 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
6264
6265 case KEY_print:
3280af22 6266 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6267 LOP(OP_PRINT,XREF);
79072805
LW
6268
6269 case KEY_printf:
3280af22 6270 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 6271 LOP(OP_PRTF,XREF);
79072805 6272
c07a80fd 6273 case KEY_prototype:
6274 UNI(OP_PROTOTYPE);
6275
79072805 6276 case KEY_push:
a0d0e21e 6277 LOP(OP_PUSH,XTERM);
79072805
LW
6278
6279 case KEY_pop:
6f33ba73 6280 UNIDOR(OP_POP);
79072805 6281
a0d0e21e 6282 case KEY_pos:
6f33ba73 6283 UNIDOR(OP_POS);
4e553d73 6284
79072805 6285 case KEY_pack:
a0d0e21e 6286 LOP(OP_PACK,XTERM);
79072805
LW
6287
6288 case KEY_package:
a0d0e21e 6289 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
6290 OPERATOR(PACKAGE);
6291
6292 case KEY_pipe:
a0d0e21e 6293 LOP(OP_PIPE_OP,XTERM);
79072805
LW
6294
6295 case KEY_q:
5db06880 6296 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6297 if (!s)
d4c19fe8 6298 missingterm(NULL);
79072805
LW
6299 yylval.ival = OP_CONST;
6300 TERM(sublex_start());
6301
a0d0e21e
LW
6302 case KEY_quotemeta:
6303 UNI(OP_QUOTEMETA);
6304
8990e307 6305 case KEY_qw:
5db06880 6306 s = scan_str(s,!!PL_madskills,FALSE);
8990e307 6307 if (!s)
d4c19fe8 6308 missingterm(NULL);
3480a8d2 6309 PL_expect = XOPERATOR;
8127e0e3
GS
6310 force_next(')');
6311 if (SvCUR(PL_lex_stuff)) {
5f66b61c 6312 OP *words = NULL;
8127e0e3 6313 int warned = 0;
3280af22 6314 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 6315 while (len) {
d4c19fe8
AL
6316 for (; isSPACE(*d) && len; --len, ++d)
6317 /**/;
8127e0e3 6318 if (len) {
d4c19fe8 6319 SV *sv;
f54cb97a 6320 const char *b = d;
e476b1b5 6321 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
6322 for (; !isSPACE(*d) && len; --len, ++d) {
6323 if (*d == ',') {
9014280d 6324 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6325 "Possible attempt to separate words with commas");
6326 ++warned;
6327 }
6328 else if (*d == '#') {
9014280d 6329 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
6330 "Possible attempt to put comments in qw() list");
6331 ++warned;
6332 }
6333 }
6334 }
6335 else {
d4c19fe8
AL
6336 for (; !isSPACE(*d) && len; --len, ++d)
6337 /**/;
8127e0e3 6338 }
7948272d
NIS
6339 sv = newSVpvn(b, d-b);
6340 if (DO_UTF8(PL_lex_stuff))
6341 SvUTF8_on(sv);
8127e0e3 6342 words = append_elem(OP_LIST, words,
7948272d 6343 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 6344 }
6345 }
8127e0e3 6346 if (words) {
cd81e915 6347 start_force(PL_curforce);
9ded7720 6348 NEXTVAL_NEXTTOKE.opval = words;
8127e0e3
GS
6349 force_next(THING);
6350 }
55497cff 6351 }
37fd879b 6352 if (PL_lex_stuff) {
8127e0e3 6353 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 6354 PL_lex_stuff = NULL;
37fd879b 6355 }
3280af22 6356 PL_expect = XTERM;
8127e0e3 6357 TOKEN('(');
8990e307 6358
79072805 6359 case KEY_qq:
5db06880 6360 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6361 if (!s)
d4c19fe8 6362 missingterm(NULL);
a0d0e21e 6363 yylval.ival = OP_STRINGIFY;
3280af22 6364 if (SvIVX(PL_lex_stuff) == '\'')
45977657 6365 SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should intepolate */
79072805
LW
6366 TERM(sublex_start());
6367
8782bef2
GB
6368 case KEY_qr:
6369 s = scan_pat(s,OP_QR);
6370 TERM(sublex_start());
6371
79072805 6372 case KEY_qx:
5db06880 6373 s = scan_str(s,!!PL_madskills,FALSE);
79072805 6374 if (!s)
d4c19fe8 6375 missingterm(NULL);
9b201d7d 6376 readpipe_override();
79072805
LW
6377 TERM(sublex_start());
6378
6379 case KEY_return:
6380 OLDLOP(OP_RETURN);
6381
6382 case KEY_require:
29595ff2 6383 s = SKIPSPACE1(s);
e759cc13
RGS
6384 if (isDIGIT(*s)) {
6385 s = force_version(s, FALSE);
a7cb1f99 6386 }
e759cc13
RGS
6387 else if (*s != 'v' || !isDIGIT(s[1])
6388 || (s = force_version(s, TRUE), *s == 'v'))
6389 {
a7cb1f99
GS
6390 *PL_tokenbuf = '\0';
6391 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 6392 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
da51bb9b 6393 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), GV_ADD);
a7cb1f99
GS
6394 else if (*s == '<')
6395 yyerror("<> should be quotes");
6396 }
a72a1c8b
RGS
6397 if (orig_keyword == KEY_require) {
6398 orig_keyword = 0;
6399 yylval.ival = 1;
6400 }
6401 else
6402 yylval.ival = 0;
6403 PL_expect = XTERM;
6404 PL_bufptr = s;
6405 PL_last_uni = PL_oldbufptr;
6406 PL_last_lop_op = OP_REQUIRE;
6407 s = skipspace(s);
6408 return REPORT( (int)REQUIRE );
79072805
LW
6409
6410 case KEY_reset:
6411 UNI(OP_RESET);
6412
6413 case KEY_redo:
a0d0e21e 6414 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
6415 LOOPX(OP_REDO);
6416
6417 case KEY_rename:
a0d0e21e 6418 LOP(OP_RENAME,XTERM);
79072805
LW
6419
6420 case KEY_rand:
6421 UNI(OP_RAND);
6422
6423 case KEY_rmdir:
6424 UNI(OP_RMDIR);
6425
6426 case KEY_rindex:
a0d0e21e 6427 LOP(OP_RINDEX,XTERM);
79072805
LW
6428
6429 case KEY_read:
a0d0e21e 6430 LOP(OP_READ,XTERM);
79072805
LW
6431
6432 case KEY_readdir:
6433 UNI(OP_READDIR);
6434
93a17b20
LW
6435 case KEY_readline:
6436 set_csh();
6f33ba73 6437 UNIDOR(OP_READLINE);
93a17b20
LW
6438
6439 case KEY_readpipe:
6440 set_csh();
0858480c 6441 UNIDOR(OP_BACKTICK);
93a17b20 6442
79072805
LW
6443 case KEY_rewinddir:
6444 UNI(OP_REWINDDIR);
6445
6446 case KEY_recv:
a0d0e21e 6447 LOP(OP_RECV,XTERM);
79072805
LW
6448
6449 case KEY_reverse:
a0d0e21e 6450 LOP(OP_REVERSE,XTERM);
79072805
LW
6451
6452 case KEY_readlink:
6f33ba73 6453 UNIDOR(OP_READLINK);
79072805
LW
6454
6455 case KEY_ref:
6456 UNI(OP_REF);
6457
6458 case KEY_s:
6459 s = scan_subst(s);
6460 if (yylval.opval)
6461 TERM(sublex_start());
6462 else
6463 TOKEN(1); /* force error */
6464
0d863452
RH
6465 case KEY_say:
6466 checkcomma(s,PL_tokenbuf,"filehandle");
6467 LOP(OP_SAY,XREF);
6468
a0d0e21e
LW
6469 case KEY_chomp:
6470 UNI(OP_CHOMP);
4e553d73 6471
79072805
LW
6472 case KEY_scalar:
6473 UNI(OP_SCALAR);
6474
6475 case KEY_select:
a0d0e21e 6476 LOP(OP_SELECT,XTERM);
79072805
LW
6477
6478 case KEY_seek:
a0d0e21e 6479 LOP(OP_SEEK,XTERM);
79072805
LW
6480
6481 case KEY_semctl:
a0d0e21e 6482 LOP(OP_SEMCTL,XTERM);
79072805
LW
6483
6484 case KEY_semget:
a0d0e21e 6485 LOP(OP_SEMGET,XTERM);
79072805
LW
6486
6487 case KEY_semop:
a0d0e21e 6488 LOP(OP_SEMOP,XTERM);
79072805
LW
6489
6490 case KEY_send:
a0d0e21e 6491 LOP(OP_SEND,XTERM);
79072805
LW
6492
6493 case KEY_setpgrp:
a0d0e21e 6494 LOP(OP_SETPGRP,XTERM);
79072805
LW
6495
6496 case KEY_setpriority:
a0d0e21e 6497 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
6498
6499 case KEY_sethostent:
ff68c719 6500 UNI(OP_SHOSTENT);
79072805
LW
6501
6502 case KEY_setnetent:
ff68c719 6503 UNI(OP_SNETENT);
79072805
LW
6504
6505 case KEY_setservent:
ff68c719 6506 UNI(OP_SSERVENT);
79072805
LW
6507
6508 case KEY_setprotoent:
ff68c719 6509 UNI(OP_SPROTOENT);
79072805
LW
6510
6511 case KEY_setpwent:
6512 FUN0(OP_SPWENT);
6513
6514 case KEY_setgrent:
6515 FUN0(OP_SGRENT);
6516
6517 case KEY_seekdir:
a0d0e21e 6518 LOP(OP_SEEKDIR,XTERM);
79072805
LW
6519
6520 case KEY_setsockopt:
a0d0e21e 6521 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
6522
6523 case KEY_shift:
6f33ba73 6524 UNIDOR(OP_SHIFT);
79072805
LW
6525
6526 case KEY_shmctl:
a0d0e21e 6527 LOP(OP_SHMCTL,XTERM);
79072805
LW
6528
6529 case KEY_shmget:
a0d0e21e 6530 LOP(OP_SHMGET,XTERM);
79072805
LW
6531
6532 case KEY_shmread:
a0d0e21e 6533 LOP(OP_SHMREAD,XTERM);
79072805
LW
6534
6535 case KEY_shmwrite:
a0d0e21e 6536 LOP(OP_SHMWRITE,XTERM);
79072805
LW
6537
6538 case KEY_shutdown:
a0d0e21e 6539 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
6540
6541 case KEY_sin:
6542 UNI(OP_SIN);
6543
6544 case KEY_sleep:
6545 UNI(OP_SLEEP);
6546
6547 case KEY_socket:
a0d0e21e 6548 LOP(OP_SOCKET,XTERM);
79072805
LW
6549
6550 case KEY_socketpair:
a0d0e21e 6551 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
6552
6553 case KEY_sort:
3280af22 6554 checkcomma(s,PL_tokenbuf,"subroutine name");
29595ff2 6555 s = SKIPSPACE1(s);
79072805 6556 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 6557 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 6558 PL_expect = XTERM;
15f0808c 6559 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 6560 LOP(OP_SORT,XREF);
79072805
LW
6561
6562 case KEY_split:
a0d0e21e 6563 LOP(OP_SPLIT,XTERM);
79072805
LW
6564
6565 case KEY_sprintf:
a0d0e21e 6566 LOP(OP_SPRINTF,XTERM);
79072805
LW
6567
6568 case KEY_splice:
a0d0e21e 6569 LOP(OP_SPLICE,XTERM);
79072805
LW
6570
6571 case KEY_sqrt:
6572 UNI(OP_SQRT);
6573
6574 case KEY_srand:
6575 UNI(OP_SRAND);
6576
6577 case KEY_stat:
6578 UNI(OP_STAT);
6579
6580 case KEY_study:
79072805
LW
6581 UNI(OP_STUDY);
6582
6583 case KEY_substr:
a0d0e21e 6584 LOP(OP_SUBSTR,XTERM);
79072805
LW
6585
6586 case KEY_format:
6587 case KEY_sub:
93a17b20 6588 really_sub:
09bef843 6589 {
3280af22 6590 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 6591 SSize_t tboffset = 0;
09bef843 6592 expectation attrful;
28cc6278 6593 bool have_name, have_proto;
f54cb97a 6594 const int key = tmp;
09bef843 6595
5db06880
NC
6596#ifdef PERL_MAD
6597 SV *tmpwhite = 0;
6598
cd81e915 6599 char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
5db06880 6600 SV *subtoken = newSVpvn(tstart, s - tstart);
cd81e915 6601 PL_thistoken = 0;
5db06880
NC
6602
6603 d = s;
6604 s = SKIPSPACE2(s,tmpwhite);
6605#else
09bef843 6606 s = skipspace(s);
5db06880 6607#endif
09bef843 6608
7e2040f0 6609 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
6610 (*s == ':' && s[1] == ':'))
6611 {
5db06880
NC
6612#ifdef PERL_MAD
6613 SV *nametoke;
6614#endif
6615
09bef843
SB
6616 PL_expect = XBLOCK;
6617 attrful = XATTRBLOCK;
b1b65b59
JH
6618 /* remember buffer pos'n for later force_word */
6619 tboffset = s - PL_oldbufptr;
09bef843 6620 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5db06880
NC
6621#ifdef PERL_MAD
6622 if (PL_madskills)
6623 nametoke = newSVpvn(s, d - s);
6624#endif
6502358f
NC
6625 if (memchr(tmpbuf, ':', len))
6626 sv_setpvn(PL_subname, tmpbuf, len);
09bef843
SB
6627 else {
6628 sv_setsv(PL_subname,PL_curstname);
396482e1 6629 sv_catpvs(PL_subname,"::");
09bef843
SB
6630 sv_catpvn(PL_subname,tmpbuf,len);
6631 }
09bef843 6632 have_name = TRUE;
5db06880
NC
6633
6634#ifdef PERL_MAD
6635
6636 start_force(0);
6637 CURMAD('X', nametoke);
6638 CURMAD('_', tmpwhite);
6639 (void) force_word(PL_oldbufptr + tboffset, WORD,
6640 FALSE, TRUE, TRUE);
6641
6642 s = SKIPSPACE2(d,tmpwhite);
6643#else
6644 s = skipspace(d);
6645#endif
09bef843 6646 }
463ee0b2 6647 else {
09bef843
SB
6648 if (key == KEY_my)
6649 Perl_croak(aTHX_ "Missing name in \"my sub\"");
6650 PL_expect = XTERMBLOCK;
6651 attrful = XATTRTERM;
c69006e4 6652 sv_setpvn(PL_subname,"?",1);
09bef843 6653 have_name = FALSE;
463ee0b2 6654 }
4633a7c4 6655
09bef843
SB
6656 if (key == KEY_format) {
6657 if (*s == '=')
6658 PL_lex_formbrack = PL_lex_brackets + 1;
5db06880 6659#ifdef PERL_MAD
cd81e915 6660 PL_thistoken = subtoken;
5db06880
NC
6661 s = d;
6662#else
09bef843 6663 if (have_name)
b1b65b59
JH
6664 (void) force_word(PL_oldbufptr + tboffset, WORD,
6665 FALSE, TRUE, TRUE);
5db06880 6666#endif
09bef843
SB
6667 OPERATOR(FORMAT);
6668 }
79072805 6669
09bef843
SB
6670 /* Look for a prototype */
6671 if (*s == '(') {
d9f2850e
RGS
6672 char *p;
6673 bool bad_proto = FALSE;
6674 const bool warnsyntax = ckWARN(WARN_SYNTAX);
09bef843 6675
5db06880 6676 s = scan_str(s,!!PL_madskills,FALSE);
37fd879b 6677 if (!s)
09bef843 6678 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 6679 /* strip spaces and check for bad characters */
09bef843
SB
6680 d = SvPVX(PL_lex_stuff);
6681 tmp = 0;
d9f2850e
RGS
6682 for (p = d; *p; ++p) {
6683 if (!isSPACE(*p)) {
6684 d[tmp++] = *p;
b13fd70a 6685 if (warnsyntax && !strchr("$@%*;[]&\\_", *p))
d9f2850e 6686 bad_proto = TRUE;
d37a9538 6687 }
09bef843 6688 }
d9f2850e
RGS
6689 d[tmp] = '\0';
6690 if (bad_proto)
6691 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
6692 "Illegal character in prototype for %"SVf" : %s",
be2597df 6693 SVfARG(PL_subname), d);
b162af07 6694 SvCUR_set(PL_lex_stuff, tmp);
09bef843 6695 have_proto = TRUE;
68dc0745 6696
5db06880
NC
6697#ifdef PERL_MAD
6698 start_force(0);
cd81e915 6699 CURMAD('q', PL_thisopen);
5db06880 6700 CURMAD('_', tmpwhite);
cd81e915
NC
6701 CURMAD('=', PL_thisstuff);
6702 CURMAD('Q', PL_thisclose);
5db06880
NC
6703 NEXTVAL_NEXTTOKE.opval =
6704 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
6705 PL_lex_stuff = Nullsv;
6706 force_next(THING);
6707
6708 s = SKIPSPACE2(s,tmpwhite);
6709#else
09bef843 6710 s = skipspace(s);
5db06880 6711#endif
4633a7c4 6712 }
09bef843
SB
6713 else
6714 have_proto = FALSE;
6715
6716 if (*s == ':' && s[1] != ':')
6717 PL_expect = attrful;
8e742a20
MHM
6718 else if (*s != '{' && key == KEY_sub) {
6719 if (!have_name)
6720 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
6721 else if (*s != ';')
be2597df 6722 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname));
8e742a20 6723 }
09bef843 6724
5db06880
NC
6725#ifdef PERL_MAD
6726 start_force(0);
6727 if (tmpwhite) {
6728 if (PL_madskills)
6b29d1f5 6729 curmad('^', newSVpvs(""));
5db06880
NC
6730 CURMAD('_', tmpwhite);
6731 }
6732 force_next(0);
6733
cd81e915 6734 PL_thistoken = subtoken;
5db06880 6735#else
09bef843 6736 if (have_proto) {
9ded7720 6737 NEXTVAL_NEXTTOKE.opval =
b1b65b59 6738 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
a0714e2c 6739 PL_lex_stuff = NULL;
09bef843 6740 force_next(THING);
68dc0745 6741 }
5db06880 6742#endif
09bef843 6743 if (!have_name) {
c99da370 6744 sv_setpv(PL_subname,
10edeb5d
JH
6745 (const char *)
6746 (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"));
09bef843 6747 TOKEN(ANONSUB);
4633a7c4 6748 }
5db06880 6749#ifndef PERL_MAD
b1b65b59
JH
6750 (void) force_word(PL_oldbufptr + tboffset, WORD,
6751 FALSE, TRUE, TRUE);
5db06880 6752#endif
09bef843
SB
6753 if (key == KEY_my)
6754 TOKEN(MYSUB);
6755 TOKEN(SUB);
4633a7c4 6756 }
79072805
LW
6757
6758 case KEY_system:
6759 set_csh();
a0d0e21e 6760 LOP(OP_SYSTEM,XREF);
79072805
LW
6761
6762 case KEY_symlink:
a0d0e21e 6763 LOP(OP_SYMLINK,XTERM);
79072805
LW
6764
6765 case KEY_syscall:
a0d0e21e 6766 LOP(OP_SYSCALL,XTERM);
79072805 6767
c07a80fd 6768 case KEY_sysopen:
6769 LOP(OP_SYSOPEN,XTERM);
6770
137443ea 6771 case KEY_sysseek:
6772 LOP(OP_SYSSEEK,XTERM);
6773
79072805 6774 case KEY_sysread:
a0d0e21e 6775 LOP(OP_SYSREAD,XTERM);
79072805
LW
6776
6777 case KEY_syswrite:
a0d0e21e 6778 LOP(OP_SYSWRITE,XTERM);
79072805
LW
6779
6780 case KEY_tr:
6781 s = scan_trans(s);
6782 TERM(sublex_start());
6783
6784 case KEY_tell:
6785 UNI(OP_TELL);
6786
6787 case KEY_telldir:
6788 UNI(OP_TELLDIR);
6789
463ee0b2 6790 case KEY_tie:
a0d0e21e 6791 LOP(OP_TIE,XTERM);
463ee0b2 6792
c07a80fd 6793 case KEY_tied:
6794 UNI(OP_TIED);
6795
79072805
LW
6796 case KEY_time:
6797 FUN0(OP_TIME);
6798
6799 case KEY_times:
6800 FUN0(OP_TMS);
6801
6802 case KEY_truncate:
a0d0e21e 6803 LOP(OP_TRUNCATE,XTERM);
79072805
LW
6804
6805 case KEY_uc:
6806 UNI(OP_UC);
6807
6808 case KEY_ucfirst:
6809 UNI(OP_UCFIRST);
6810
463ee0b2
LW
6811 case KEY_untie:
6812 UNI(OP_UNTIE);
6813
79072805 6814 case KEY_until:
57843af0 6815 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6816 OPERATOR(UNTIL);
6817
6818 case KEY_unless:
57843af0 6819 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6820 OPERATOR(UNLESS);
6821
6822 case KEY_unlink:
a0d0e21e 6823 LOP(OP_UNLINK,XTERM);
79072805
LW
6824
6825 case KEY_undef:
6f33ba73 6826 UNIDOR(OP_UNDEF);
79072805
LW
6827
6828 case KEY_unpack:
a0d0e21e 6829 LOP(OP_UNPACK,XTERM);
79072805
LW
6830
6831 case KEY_utime:
a0d0e21e 6832 LOP(OP_UTIME,XTERM);
79072805
LW
6833
6834 case KEY_umask:
6f33ba73 6835 UNIDOR(OP_UMASK);
79072805
LW
6836
6837 case KEY_unshift:
a0d0e21e
LW
6838 LOP(OP_UNSHIFT,XTERM);
6839
6840 case KEY_use:
468aa647 6841 s = tokenize_use(1, s);
a0d0e21e 6842 OPERATOR(USE);
79072805
LW
6843
6844 case KEY_values:
6845 UNI(OP_VALUES);
6846
6847 case KEY_vec:
a0d0e21e 6848 LOP(OP_VEC,XTERM);
79072805 6849
0d863452
RH
6850 case KEY_when:
6851 yylval.ival = CopLINE(PL_curcop);
6852 OPERATOR(WHEN);
6853
79072805 6854 case KEY_while:
57843af0 6855 yylval.ival = CopLINE(PL_curcop);
79072805
LW
6856 OPERATOR(WHILE);
6857
6858 case KEY_warn:
3280af22 6859 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 6860 LOP(OP_WARN,XTERM);
79072805
LW
6861
6862 case KEY_wait:
6863 FUN0(OP_WAIT);
6864
6865 case KEY_waitpid:
a0d0e21e 6866 LOP(OP_WAITPID,XTERM);
79072805
LW
6867
6868 case KEY_wantarray:
6869 FUN0(OP_WANTARRAY);
6870
6871 case KEY_write:
9d116dd7
JH
6872#ifdef EBCDIC
6873 {
df3728a2
JH
6874 char ctl_l[2];
6875 ctl_l[0] = toCTRL('L');
6876 ctl_l[1] = '\0';
fafc274c 6877 gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7
JH
6878 }
6879#else
fafc274c
NC
6880 /* Make sure $^L is defined */
6881 gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
9d116dd7 6882#endif
79072805
LW
6883 UNI(OP_ENTERWRITE);
6884
6885 case KEY_x:
3280af22 6886 if (PL_expect == XOPERATOR)
79072805
LW
6887 Mop(OP_REPEAT);
6888 check_uni();
6889 goto just_a_word;
6890
a0d0e21e
LW
6891 case KEY_xor:
6892 yylval.ival = OP_XOR;
6893 OPERATOR(OROP);
6894
79072805
LW
6895 case KEY_y:
6896 s = scan_trans(s);
6897 TERM(sublex_start());
6898 }
49dc05e3 6899 }}
79072805 6900}
bf4acbe4
GS
6901#ifdef __SC__
6902#pragma segment Main
6903#endif
79072805 6904
e930465f
JH
6905static int
6906S_pending_ident(pTHX)
8eceec63 6907{
97aff369 6908 dVAR;
8eceec63 6909 register char *d;
bbd11bfc 6910 PADOFFSET tmp = 0;
8eceec63
SC
6911 /* pit holds the identifier we read and pending_ident is reset */
6912 char pit = PL_pending_ident;
6913 PL_pending_ident = 0;
6914
cd81e915 6915 /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
8eceec63 6916 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 6917 "### Pending identifier '%s'\n", PL_tokenbuf); });
8eceec63
SC
6918
6919 /* if we're in a my(), we can't allow dynamics here.
6920 $foo'bar has already been turned into $foo::bar, so
6921 just check for colons.
6922
6923 if it's a legal name, the OP is a PADANY.
6924 */
6925 if (PL_in_my) {
6926 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
6927 if (strchr(PL_tokenbuf,':'))
6928 yyerror(Perl_form(aTHX_ "No package name allowed for "
6929 "variable %s in \"our\"",
6930 PL_tokenbuf));
dd2155a4 6931 tmp = allocmy(PL_tokenbuf);
8eceec63
SC
6932 }
6933 else {
6934 if (strchr(PL_tokenbuf,':'))
952306ac
RGS
6935 yyerror(Perl_form(aTHX_ PL_no_myglob,
6936 PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
8eceec63
SC
6937
6938 yylval.opval = newOP(OP_PADANY, 0);
dd2155a4 6939 yylval.opval->op_targ = allocmy(PL_tokenbuf);
8eceec63
SC
6940 return PRIVATEREF;
6941 }
6942 }
6943
6944 /*
6945 build the ops for accesses to a my() variable.
6946
6947 Deny my($a) or my($b) in a sort block, *if* $a or $b is
6948 then used in a comparison. This catches most, but not
6949 all cases. For instance, it catches
6950 sort { my($a); $a <=> $b }
6951 but not
6952 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
6953 (although why you'd do that is anyone's guess).
6954 */
6955
6956 if (!strchr(PL_tokenbuf,':')) {
8716503d
DM
6957 if (!PL_in_my)
6958 tmp = pad_findmy(PL_tokenbuf);
6959 if (tmp != NOT_IN_PAD) {
8eceec63 6960 /* might be an "our" variable" */
00b1698f 6961 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
8eceec63 6962 /* build ops for a bareword */
b64e5050
AL
6963 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
6964 HEK * const stashname = HvNAME_HEK(stash);
6965 SV * const sym = newSVhek(stashname);
396482e1 6966 sv_catpvs(sym, "::");
8eceec63
SC
6967 sv_catpv(sym, PL_tokenbuf+1);
6968 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
6969 yylval.opval->op_private = OPpCONST_ENTERED;
7a5fd60d 6970 gv_fetchsv(sym,
8eceec63
SC
6971 (PL_in_eval
6972 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 6973 : GV_ADDMULTI
8eceec63
SC
6974 ),
6975 ((PL_tokenbuf[0] == '$') ? SVt_PV
6976 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
6977 : SVt_PVHV));
6978 return WORD;
6979 }
6980
6981 /* if it's a sort block and they're naming $a or $b */
6982 if (PL_last_lop_op == OP_SORT &&
6983 PL_tokenbuf[0] == '$' &&
6984 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
6985 && !PL_tokenbuf[2])
6986 {
6987 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
6988 d < PL_bufend && *d != '\n';
6989 d++)
6990 {
6991 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
6992 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
6993 PL_tokenbuf);
6994 }
6995 }
6996 }
6997
6998 yylval.opval = newOP(OP_PADANY, 0);
6999 yylval.opval->op_targ = tmp;
7000 return PRIVATEREF;
7001 }
7002 }
7003
7004 /*
7005 Whine if they've said @foo in a doublequoted string,
7006 and @foo isn't a variable we can find in the symbol
7007 table.
7008 */
7009 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
f776e3cd 7010 GV *gv = gv_fetchpv(PL_tokenbuf+1, 0, SVt_PVAV);
8eceec63 7011 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
e879d94f
RGS
7012 && ckWARN(WARN_AMBIGUOUS)
7013 /* DO NOT warn for @- and @+ */
7014 && !( PL_tokenbuf[2] == '\0' &&
7015 ( PL_tokenbuf[1] == '-' || PL_tokenbuf[1] == '+' ))
7016 )
8eceec63
SC
7017 {
7018 /* Downgraded from fatal to warning 20000522 mjd */
9014280d 7019 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8eceec63
SC
7020 "Possible unintended interpolation of %s in string",
7021 PL_tokenbuf);
7022 }
7023 }
7024
7025 /* build ops for a bareword */
7026 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
7027 yylval.opval->op_private = OPpCONST_ENTERED;
adc51b97
RGS
7028 gv_fetchpv(
7029 PL_tokenbuf+1,
d6069db2
RGS
7030 /* If the identifier refers to a stash, don't autovivify it.
7031 * Change 24660 had the side effect of causing symbol table
7032 * hashes to always be defined, even if they were freshly
7033 * created and the only reference in the entire program was
7034 * the single statement with the defined %foo::bar:: test.
7035 * It appears that all code in the wild doing this actually
7036 * wants to know whether sub-packages have been loaded, so
7037 * by avoiding auto-vivifying symbol tables, we ensure that
7038 * defined %foo::bar:: continues to be false, and the existing
7039 * tests still give the expected answers, even though what
7040 * they're actually testing has now changed subtly.
7041 */
7042 (*PL_tokenbuf == '%' && *(d = PL_tokenbuf + strlen(PL_tokenbuf) - 1) == ':' && d[-1] == ':'
7043 ? 0
7044 : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
adc51b97
RGS
7045 ((PL_tokenbuf[0] == '$') ? SVt_PV
7046 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
7047 : SVt_PVHV));
8eceec63
SC
7048 return WORD;
7049}
7050
4c3bbe0f
MHM
7051/*
7052 * The following code was generated by perl_keyword.pl.
7053 */
e2e1dd5a 7054
79072805 7055I32
5458a98a 7056Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords)
4c3bbe0f 7057{
952306ac 7058 dVAR;
4c3bbe0f
MHM
7059 switch (len)
7060 {
7061 case 1: /* 5 tokens of length 1 */
7062 switch (name[0])
e2e1dd5a 7063 {
4c3bbe0f
MHM
7064 case 'm':
7065 { /* m */
7066 return KEY_m;
7067 }
7068
4c3bbe0f
MHM
7069 case 'q':
7070 { /* q */
7071 return KEY_q;
7072 }
7073
4c3bbe0f
MHM
7074 case 's':
7075 { /* s */
7076 return KEY_s;
7077 }
7078
4c3bbe0f
MHM
7079 case 'x':
7080 { /* x */
7081 return -KEY_x;
7082 }
7083
4c3bbe0f
MHM
7084 case 'y':
7085 { /* y */
7086 return KEY_y;
7087 }
7088
4c3bbe0f
MHM
7089 default:
7090 goto unknown;
e2e1dd5a 7091 }
4c3bbe0f
MHM
7092
7093 case 2: /* 18 tokens of length 2 */
7094 switch (name[0])
e2e1dd5a 7095 {
4c3bbe0f
MHM
7096 case 'd':
7097 if (name[1] == 'o')
7098 { /* do */
7099 return KEY_do;
7100 }
7101
7102 goto unknown;
7103
7104 case 'e':
7105 if (name[1] == 'q')
7106 { /* eq */
7107 return -KEY_eq;
7108 }
7109
7110 goto unknown;
7111
7112 case 'g':
7113 switch (name[1])
7114 {
7115 case 'e':
7116 { /* ge */
7117 return -KEY_ge;
7118 }
7119
4c3bbe0f
MHM
7120 case 't':
7121 { /* gt */
7122 return -KEY_gt;
7123 }
7124
4c3bbe0f
MHM
7125 default:
7126 goto unknown;
7127 }
7128
7129 case 'i':
7130 if (name[1] == 'f')
7131 { /* if */
7132 return KEY_if;
7133 }
7134
7135 goto unknown;
7136
7137 case 'l':
7138 switch (name[1])
7139 {
7140 case 'c':
7141 { /* lc */
7142 return -KEY_lc;
7143 }
7144
4c3bbe0f
MHM
7145 case 'e':
7146 { /* le */
7147 return -KEY_le;
7148 }
7149
4c3bbe0f
MHM
7150 case 't':
7151 { /* lt */
7152 return -KEY_lt;
7153 }
7154
4c3bbe0f
MHM
7155 default:
7156 goto unknown;
7157 }
7158
7159 case 'm':
7160 if (name[1] == 'y')
7161 { /* my */
7162 return KEY_my;
7163 }
7164
7165 goto unknown;
7166
7167 case 'n':
7168 switch (name[1])
7169 {
7170 case 'e':
7171 { /* ne */
7172 return -KEY_ne;
7173 }
7174
4c3bbe0f
MHM
7175 case 'o':
7176 { /* no */
7177 return KEY_no;
7178 }
7179
4c3bbe0f
MHM
7180 default:
7181 goto unknown;
7182 }
7183
7184 case 'o':
7185 if (name[1] == 'r')
7186 { /* or */
7187 return -KEY_or;
7188 }
7189
7190 goto unknown;
7191
7192 case 'q':
7193 switch (name[1])
7194 {
7195 case 'q':
7196 { /* qq */
7197 return KEY_qq;
7198 }
7199
4c3bbe0f
MHM
7200 case 'r':
7201 { /* qr */
7202 return KEY_qr;
7203 }
7204
4c3bbe0f
MHM
7205 case 'w':
7206 { /* qw */
7207 return KEY_qw;
7208 }
7209
4c3bbe0f
MHM
7210 case 'x':
7211 { /* qx */
7212 return KEY_qx;
7213 }
7214
4c3bbe0f
MHM
7215 default:
7216 goto unknown;
7217 }
7218
7219 case 't':
7220 if (name[1] == 'r')
7221 { /* tr */
7222 return KEY_tr;
7223 }
7224
7225 goto unknown;
7226
7227 case 'u':
7228 if (name[1] == 'c')
7229 { /* uc */
7230 return -KEY_uc;
7231 }
7232
7233 goto unknown;
7234
7235 default:
7236 goto unknown;
e2e1dd5a 7237 }
4c3bbe0f 7238
0d863452 7239 case 3: /* 29 tokens of length 3 */
4c3bbe0f 7240 switch (name[0])
e2e1dd5a 7241 {
4c3bbe0f
MHM
7242 case 'E':
7243 if (name[1] == 'N' &&
7244 name[2] == 'D')
7245 { /* END */
7246 return KEY_END;
7247 }
7248
7249 goto unknown;
7250
7251 case 'a':
7252 switch (name[1])
7253 {
7254 case 'b':
7255 if (name[2] == 's')
7256 { /* abs */
7257 return -KEY_abs;
7258 }
7259
7260 goto unknown;
7261
7262 case 'n':
7263 if (name[2] == 'd')
7264 { /* and */
7265 return -KEY_and;
7266 }
7267
7268 goto unknown;
7269
7270 default:
7271 goto unknown;
7272 }
7273
7274 case 'c':
7275 switch (name[1])
7276 {
7277 case 'h':
7278 if (name[2] == 'r')
7279 { /* chr */
7280 return -KEY_chr;
7281 }
7282
7283 goto unknown;
7284
7285 case 'm':
7286 if (name[2] == 'p')
7287 { /* cmp */
7288 return -KEY_cmp;
7289 }
7290
7291 goto unknown;
7292
7293 case 'o':
7294 if (name[2] == 's')
7295 { /* cos */
7296 return -KEY_cos;
7297 }
7298
7299 goto unknown;
7300
7301 default:
7302 goto unknown;
7303 }
7304
7305 case 'd':
7306 if (name[1] == 'i' &&
7307 name[2] == 'e')
7308 { /* die */
7309 return -KEY_die;
7310 }
7311
7312 goto unknown;
7313
7314 case 'e':
7315 switch (name[1])
7316 {
7317 case 'o':
7318 if (name[2] == 'f')
7319 { /* eof */
7320 return -KEY_eof;
7321 }
7322
7323 goto unknown;
7324
7325 case 'r':
7326 if (name[2] == 'r')
7327 { /* err */
5458a98a 7328 return (all_keywords || FEATURE_IS_ENABLED("err") ? -KEY_err : 0);
4c3bbe0f
MHM
7329 }
7330
7331 goto unknown;
7332
7333 case 'x':
7334 if (name[2] == 'p')
7335 { /* exp */
7336 return -KEY_exp;
7337 }
7338
7339 goto unknown;
7340
7341 default:
7342 goto unknown;
7343 }
7344
7345 case 'f':
7346 if (name[1] == 'o' &&
7347 name[2] == 'r')
7348 { /* for */
7349 return KEY_for;
7350 }
7351
7352 goto unknown;
7353
7354 case 'h':
7355 if (name[1] == 'e' &&
7356 name[2] == 'x')
7357 { /* hex */
7358 return -KEY_hex;
7359 }
7360
7361 goto unknown;
7362
7363 case 'i':
7364 if (name[1] == 'n' &&
7365 name[2] == 't')
7366 { /* int */
7367 return -KEY_int;
7368 }
7369
7370 goto unknown;
7371
7372 case 'l':
7373 if (name[1] == 'o' &&
7374 name[2] == 'g')
7375 { /* log */
7376 return -KEY_log;
7377 }
7378
7379 goto unknown;
7380
7381 case 'm':
7382 if (name[1] == 'a' &&
7383 name[2] == 'p')
7384 { /* map */
7385 return KEY_map;
7386 }
7387
7388 goto unknown;
7389
7390 case 'n':
7391 if (name[1] == 'o' &&
7392 name[2] == 't')
7393 { /* not */
7394 return -KEY_not;
7395 }
7396
7397 goto unknown;
7398
7399 case 'o':
7400 switch (name[1])
7401 {
7402 case 'c':
7403 if (name[2] == 't')
7404 { /* oct */
7405 return -KEY_oct;
7406 }
7407
7408 goto unknown;
7409
7410 case 'r':
7411 if (name[2] == 'd')
7412 { /* ord */
7413 return -KEY_ord;
7414 }
7415
7416 goto unknown;
7417
7418 case 'u':
7419 if (name[2] == 'r')
7420 { /* our */
7421 return KEY_our;
7422 }
7423
7424 goto unknown;
7425
7426 default:
7427 goto unknown;
7428 }
7429
7430 case 'p':
7431 if (name[1] == 'o')
7432 {
7433 switch (name[2])
7434 {
7435 case 'p':
7436 { /* pop */
7437 return -KEY_pop;
7438 }
7439
4c3bbe0f
MHM
7440 case 's':
7441 { /* pos */
7442 return KEY_pos;
7443 }
7444
4c3bbe0f
MHM
7445 default:
7446 goto unknown;
7447 }
7448 }
7449
7450 goto unknown;
7451
7452 case 'r':
7453 if (name[1] == 'e' &&
7454 name[2] == 'f')
7455 { /* ref */
7456 return -KEY_ref;
7457 }
7458
7459 goto unknown;
7460
7461 case 's':
7462 switch (name[1])
7463 {
0d863452
RH
7464 case 'a':
7465 if (name[2] == 'y')
7466 { /* say */
e3e804c9 7467 return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0);
0d863452
RH
7468 }
7469
7470 goto unknown;
7471
4c3bbe0f
MHM
7472 case 'i':
7473 if (name[2] == 'n')
7474 { /* sin */
7475 return -KEY_sin;
7476 }
7477
7478 goto unknown;
7479
7480 case 'u':
7481 if (name[2] == 'b')
7482 { /* sub */
7483 return KEY_sub;
7484 }
7485
7486 goto unknown;
7487
7488 default:
7489 goto unknown;
7490 }
7491
7492 case 't':
7493 if (name[1] == 'i' &&
7494 name[2] == 'e')
7495 { /* tie */
7496 return KEY_tie;
7497 }
7498
7499 goto unknown;
7500
7501 case 'u':
7502 if (name[1] == 's' &&
7503 name[2] == 'e')
7504 { /* use */
7505 return KEY_use;
7506 }
7507
7508 goto unknown;
7509
7510 case 'v':
7511 if (name[1] == 'e' &&
7512 name[2] == 'c')
7513 { /* vec */
7514 return -KEY_vec;
7515 }
7516
7517 goto unknown;
7518
7519 case 'x':
7520 if (name[1] == 'o' &&
7521 name[2] == 'r')
7522 { /* xor */
7523 return -KEY_xor;
7524 }
7525
7526 goto unknown;
7527
7528 default:
7529 goto unknown;
e2e1dd5a 7530 }
4c3bbe0f 7531
0d863452 7532 case 4: /* 41 tokens of length 4 */
4c3bbe0f 7533 switch (name[0])
e2e1dd5a 7534 {
4c3bbe0f
MHM
7535 case 'C':
7536 if (name[1] == 'O' &&
7537 name[2] == 'R' &&
7538 name[3] == 'E')
7539 { /* CORE */
7540 return -KEY_CORE;
7541 }
7542
7543 goto unknown;
7544
7545 case 'I':
7546 if (name[1] == 'N' &&
7547 name[2] == 'I' &&
7548 name[3] == 'T')
7549 { /* INIT */
7550 return KEY_INIT;
7551 }
7552
7553 goto unknown;
7554
7555 case 'b':
7556 if (name[1] == 'i' &&
7557 name[2] == 'n' &&
7558 name[3] == 'd')
7559 { /* bind */
7560 return -KEY_bind;
7561 }
7562
7563 goto unknown;
7564
7565 case 'c':
7566 if (name[1] == 'h' &&
7567 name[2] == 'o' &&
7568 name[3] == 'p')
7569 { /* chop */
7570 return -KEY_chop;
7571 }
7572
7573 goto unknown;
7574
7575 case 'd':
7576 if (name[1] == 'u' &&
7577 name[2] == 'm' &&
7578 name[3] == 'p')
7579 { /* dump */
7580 return -KEY_dump;
7581 }
7582
7583 goto unknown;
7584
7585 case 'e':
7586 switch (name[1])
7587 {
7588 case 'a':
7589 if (name[2] == 'c' &&
7590 name[3] == 'h')
7591 { /* each */
7592 return -KEY_each;
7593 }
7594
7595 goto unknown;
7596
7597 case 'l':
7598 if (name[2] == 's' &&
7599 name[3] == 'e')
7600 { /* else */
7601 return KEY_else;
7602 }
7603
7604 goto unknown;
7605
7606 case 'v':
7607 if (name[2] == 'a' &&
7608 name[3] == 'l')
7609 { /* eval */
7610 return KEY_eval;
7611 }
7612
7613 goto unknown;
7614
7615 case 'x':
7616 switch (name[2])
7617 {
7618 case 'e':
7619 if (name[3] == 'c')
7620 { /* exec */
7621 return -KEY_exec;
7622 }
7623
7624 goto unknown;
7625
7626 case 'i':
7627 if (name[3] == 't')
7628 { /* exit */
7629 return -KEY_exit;
7630 }
7631
7632 goto unknown;
7633
7634 default:
7635 goto unknown;
7636 }
7637
7638 default:
7639 goto unknown;
7640 }
7641
7642 case 'f':
7643 if (name[1] == 'o' &&
7644 name[2] == 'r' &&
7645 name[3] == 'k')
7646 { /* fork */
7647 return -KEY_fork;
7648 }
7649
7650 goto unknown;
7651
7652 case 'g':
7653 switch (name[1])
7654 {
7655 case 'e':
7656 if (name[2] == 't' &&
7657 name[3] == 'c')
7658 { /* getc */
7659 return -KEY_getc;
7660 }
7661
7662 goto unknown;
7663
7664 case 'l':
7665 if (name[2] == 'o' &&
7666 name[3] == 'b')
7667 { /* glob */
7668 return KEY_glob;
7669 }
7670
7671 goto unknown;
7672
7673 case 'o':
7674 if (name[2] == 't' &&
7675 name[3] == 'o')
7676 { /* goto */
7677 return KEY_goto;
7678 }
7679
7680 goto unknown;
7681
7682 case 'r':
7683 if (name[2] == 'e' &&
7684 name[3] == 'p')
7685 { /* grep */
7686 return KEY_grep;
7687 }
7688
7689 goto unknown;
7690
7691 default:
7692 goto unknown;
7693 }
7694
7695 case 'j':
7696 if (name[1] == 'o' &&
7697 name[2] == 'i' &&
7698 name[3] == 'n')
7699 { /* join */
7700 return -KEY_join;
7701 }
7702
7703 goto unknown;
7704
7705 case 'k':
7706 switch (name[1])
7707 {
7708 case 'e':
7709 if (name[2] == 'y' &&
7710 name[3] == 's')
7711 { /* keys */
7712 return -KEY_keys;
7713 }
7714
7715 goto unknown;
7716
7717 case 'i':
7718 if (name[2] == 'l' &&
7719 name[3] == 'l')
7720 { /* kill */
7721 return -KEY_kill;
7722 }
7723
7724 goto unknown;
7725
7726 default:
7727 goto unknown;
7728 }
7729
7730 case 'l':
7731 switch (name[1])
7732 {
7733 case 'a':
7734 if (name[2] == 's' &&
7735 name[3] == 't')
7736 { /* last */
7737 return KEY_last;
7738 }
7739
7740 goto unknown;
7741
7742 case 'i':
7743 if (name[2] == 'n' &&
7744 name[3] == 'k')
7745 { /* link */
7746 return -KEY_link;
7747 }
7748
7749 goto unknown;
7750
7751 case 'o':
7752 if (name[2] == 'c' &&
7753 name[3] == 'k')
7754 { /* lock */
7755 return -KEY_lock;
7756 }
7757
7758 goto unknown;
7759
7760 default:
7761 goto unknown;
7762 }
7763
7764 case 'n':
7765 if (name[1] == 'e' &&
7766 name[2] == 'x' &&
7767 name[3] == 't')
7768 { /* next */
7769 return KEY_next;
7770 }
7771
7772 goto unknown;
7773
7774 case 'o':
7775 if (name[1] == 'p' &&
7776 name[2] == 'e' &&
7777 name[3] == 'n')
7778 { /* open */
7779 return -KEY_open;
7780 }
7781
7782 goto unknown;
7783
7784 case 'p':
7785 switch (name[1])
7786 {
7787 case 'a':
7788 if (name[2] == 'c' &&
7789 name[3] == 'k')
7790 { /* pack */
7791 return -KEY_pack;
7792 }
7793
7794 goto unknown;
7795
7796 case 'i':
7797 if (name[2] == 'p' &&
7798 name[3] == 'e')
7799 { /* pipe */
7800 return -KEY_pipe;
7801 }
7802
7803 goto unknown;
7804
7805 case 'u':
7806 if (name[2] == 's' &&
7807 name[3] == 'h')
7808 { /* push */
7809 return -KEY_push;
7810 }
7811
7812 goto unknown;
7813
7814 default:
7815 goto unknown;
7816 }
7817
7818 case 'r':
7819 switch (name[1])
7820 {
7821 case 'a':
7822 if (name[2] == 'n' &&
7823 name[3] == 'd')
7824 { /* rand */
7825 return -KEY_rand;
7826 }
7827
7828 goto unknown;
7829
7830 case 'e':
7831 switch (name[2])
7832 {
7833 case 'a':
7834 if (name[3] == 'd')
7835 { /* read */
7836 return -KEY_read;
7837 }
7838
7839 goto unknown;
7840
7841 case 'c':
7842 if (name[3] == 'v')
7843 { /* recv */
7844 return -KEY_recv;
7845 }
7846
7847 goto unknown;
7848
7849 case 'd':
7850 if (name[3] == 'o')
7851 { /* redo */
7852 return KEY_redo;
7853 }
7854
7855 goto unknown;
7856
7857 default:
7858 goto unknown;
7859 }
7860
7861 default:
7862 goto unknown;
7863 }
7864
7865 case 's':
7866 switch (name[1])
7867 {
7868 case 'e':
7869 switch (name[2])
7870 {
7871 case 'e':
7872 if (name[3] == 'k')
7873 { /* seek */
7874 return -KEY_seek;
7875 }
7876
7877 goto unknown;
7878
7879 case 'n':
7880 if (name[3] == 'd')
7881 { /* send */
7882 return -KEY_send;
7883 }
7884
7885 goto unknown;
7886
7887 default:
7888 goto unknown;
7889 }
7890
7891 case 'o':
7892 if (name[2] == 'r' &&
7893 name[3] == 't')
7894 { /* sort */
7895 return KEY_sort;
7896 }
7897
7898 goto unknown;
7899
7900 case 'q':
7901 if (name[2] == 'r' &&
7902 name[3] == 't')
7903 { /* sqrt */
7904 return -KEY_sqrt;
7905 }
7906
7907 goto unknown;
7908
7909 case 't':
7910 if (name[2] == 'a' &&
7911 name[3] == 't')
7912 { /* stat */
7913 return -KEY_stat;
7914 }
7915
7916 goto unknown;
7917
7918 default:
7919 goto unknown;
7920 }
7921
7922 case 't':
7923 switch (name[1])
7924 {
7925 case 'e':
7926 if (name[2] == 'l' &&
7927 name[3] == 'l')
7928 { /* tell */
7929 return -KEY_tell;
7930 }
7931
7932 goto unknown;
7933
7934 case 'i':
7935 switch (name[2])
7936 {
7937 case 'e':
7938 if (name[3] == 'd')
7939 { /* tied */
7940 return KEY_tied;
7941 }
7942
7943 goto unknown;
7944
7945 case 'm':
7946 if (name[3] == 'e')
7947 { /* time */
7948 return -KEY_time;
7949 }
7950
7951 goto unknown;
7952
7953 default:
7954 goto unknown;
7955 }
7956
7957 default:
7958 goto unknown;
7959 }
7960
7961 case 'w':
0d863452 7962 switch (name[1])
4c3bbe0f 7963 {
0d863452 7964 case 'a':
952306ac
RGS
7965 switch (name[2])
7966 {
7967 case 'i':
7968 if (name[3] == 't')
7969 { /* wait */
7970 return -KEY_wait;
7971 }
4c3bbe0f 7972
952306ac 7973 goto unknown;
4c3bbe0f 7974
952306ac
RGS
7975 case 'r':
7976 if (name[3] == 'n')
7977 { /* warn */
7978 return -KEY_warn;
7979 }
4c3bbe0f 7980
952306ac 7981 goto unknown;
4c3bbe0f 7982
952306ac
RGS
7983 default:
7984 goto unknown;
7985 }
0d863452
RH
7986
7987 case 'h':
7988 if (name[2] == 'e' &&
7989 name[3] == 'n')
7990 { /* when */
5458a98a 7991 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
952306ac 7992 }
4c3bbe0f 7993
952306ac 7994 goto unknown;
4c3bbe0f 7995
952306ac
RGS
7996 default:
7997 goto unknown;
7998 }
4c3bbe0f 7999
0d863452
RH
8000 default:
8001 goto unknown;
8002 }
8003
952306ac 8004 case 5: /* 39 tokens of length 5 */
4c3bbe0f 8005 switch (name[0])
e2e1dd5a 8006 {
4c3bbe0f
MHM
8007 case 'B':
8008 if (name[1] == 'E' &&
8009 name[2] == 'G' &&
8010 name[3] == 'I' &&
8011 name[4] == 'N')
8012 { /* BEGIN */
8013 return KEY_BEGIN;
8014 }
8015
8016 goto unknown;
8017
8018 case 'C':
8019 if (name[1] == 'H' &&
8020 name[2] == 'E' &&
8021 name[3] == 'C' &&
8022 name[4] == 'K')
8023 { /* CHECK */
8024 return KEY_CHECK;
8025 }
8026
8027 goto unknown;
8028
8029 case 'a':
8030 switch (name[1])
8031 {
8032 case 'l':
8033 if (name[2] == 'a' &&
8034 name[3] == 'r' &&
8035 name[4] == 'm')
8036 { /* alarm */
8037 return -KEY_alarm;
8038 }
8039
8040 goto unknown;
8041
8042 case 't':
8043 if (name[2] == 'a' &&
8044 name[3] == 'n' &&
8045 name[4] == '2')
8046 { /* atan2 */
8047 return -KEY_atan2;
8048 }
8049
8050 goto unknown;
8051
8052 default:
8053 goto unknown;
8054 }
8055
8056 case 'b':
0d863452
RH
8057 switch (name[1])
8058 {
8059 case 'l':
8060 if (name[2] == 'e' &&
952306ac
RGS
8061 name[3] == 's' &&
8062 name[4] == 's')
8063 { /* bless */
8064 return -KEY_bless;
8065 }
4c3bbe0f 8066
952306ac 8067 goto unknown;
4c3bbe0f 8068
0d863452
RH
8069 case 'r':
8070 if (name[2] == 'e' &&
8071 name[3] == 'a' &&
8072 name[4] == 'k')
8073 { /* break */
5458a98a 8074 return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0);
0d863452
RH
8075 }
8076
8077 goto unknown;
8078
8079 default:
8080 goto unknown;
8081 }
8082
4c3bbe0f
MHM
8083 case 'c':
8084 switch (name[1])
8085 {
8086 case 'h':
8087 switch (name[2])
8088 {
8089 case 'd':
8090 if (name[3] == 'i' &&
8091 name[4] == 'r')
8092 { /* chdir */
8093 return -KEY_chdir;
8094 }
8095
8096 goto unknown;
8097
8098 case 'm':
8099 if (name[3] == 'o' &&
8100 name[4] == 'd')
8101 { /* chmod */
8102 return -KEY_chmod;
8103 }
8104
8105 goto unknown;
8106
8107 case 'o':
8108 switch (name[3])
8109 {
8110 case 'm':
8111 if (name[4] == 'p')
8112 { /* chomp */
8113 return -KEY_chomp;
8114 }
8115
8116 goto unknown;
8117
8118 case 'w':
8119 if (name[4] == 'n')
8120 { /* chown */
8121 return -KEY_chown;
8122 }
8123
8124 goto unknown;
8125
8126 default:
8127 goto unknown;
8128 }
8129
8130 default:
8131 goto unknown;
8132 }
8133
8134 case 'l':
8135 if (name[2] == 'o' &&
8136 name[3] == 's' &&
8137 name[4] == 'e')
8138 { /* close */
8139 return -KEY_close;
8140 }
8141
8142 goto unknown;
8143
8144 case 'r':
8145 if (name[2] == 'y' &&
8146 name[3] == 'p' &&
8147 name[4] == 't')
8148 { /* crypt */
8149 return -KEY_crypt;
8150 }
8151
8152 goto unknown;
8153
8154 default:
8155 goto unknown;
8156 }
8157
8158 case 'e':
8159 if (name[1] == 'l' &&
8160 name[2] == 's' &&
8161 name[3] == 'i' &&
8162 name[4] == 'f')
8163 { /* elsif */
8164 return KEY_elsif;
8165 }
8166
8167 goto unknown;
8168
8169 case 'f':
8170 switch (name[1])
8171 {
8172 case 'c':
8173 if (name[2] == 'n' &&
8174 name[3] == 't' &&
8175 name[4] == 'l')
8176 { /* fcntl */
8177 return -KEY_fcntl;
8178 }
8179
8180 goto unknown;
8181
8182 case 'l':
8183 if (name[2] == 'o' &&
8184 name[3] == 'c' &&
8185 name[4] == 'k')
8186 { /* flock */
8187 return -KEY_flock;
8188 }
8189
8190 goto unknown;
8191
8192 default:
8193 goto unknown;
8194 }
8195
0d863452
RH
8196 case 'g':
8197 if (name[1] == 'i' &&
8198 name[2] == 'v' &&
8199 name[3] == 'e' &&
8200 name[4] == 'n')
8201 { /* given */
5458a98a 8202 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0);
0d863452
RH
8203 }
8204
8205 goto unknown;
8206
4c3bbe0f
MHM
8207 case 'i':
8208 switch (name[1])
8209 {
8210 case 'n':
8211 if (name[2] == 'd' &&
8212 name[3] == 'e' &&
8213 name[4] == 'x')
8214 { /* index */
8215 return -KEY_index;
8216 }
8217
8218 goto unknown;
8219
8220 case 'o':
8221 if (name[2] == 'c' &&
8222 name[3] == 't' &&
8223 name[4] == 'l')
8224 { /* ioctl */
8225 return -KEY_ioctl;
8226 }
8227
8228 goto unknown;
8229
8230 default:
8231 goto unknown;
8232 }
8233
8234 case 'l':
8235 switch (name[1])
8236 {
8237 case 'o':
8238 if (name[2] == 'c' &&
8239 name[3] == 'a' &&
8240 name[4] == 'l')
8241 { /* local */
8242 return KEY_local;
8243 }
8244
8245 goto unknown;
8246
8247 case 's':
8248 if (name[2] == 't' &&
8249 name[3] == 'a' &&
8250 name[4] == 't')
8251 { /* lstat */
8252 return -KEY_lstat;
8253 }
8254
8255 goto unknown;
8256
8257 default:
8258 goto unknown;
8259 }
8260
8261 case 'm':
8262 if (name[1] == 'k' &&
8263 name[2] == 'd' &&
8264 name[3] == 'i' &&
8265 name[4] == 'r')
8266 { /* mkdir */
8267 return -KEY_mkdir;
8268 }
8269
8270 goto unknown;
8271
8272 case 'p':
8273 if (name[1] == 'r' &&
8274 name[2] == 'i' &&
8275 name[3] == 'n' &&
8276 name[4] == 't')
8277 { /* print */
8278 return KEY_print;
8279 }
8280
8281 goto unknown;
8282
8283 case 'r':
8284 switch (name[1])
8285 {
8286 case 'e':
8287 if (name[2] == 's' &&
8288 name[3] == 'e' &&
8289 name[4] == 't')
8290 { /* reset */
8291 return -KEY_reset;
8292 }
8293
8294 goto unknown;
8295
8296 case 'm':
8297 if (name[2] == 'd' &&
8298 name[3] == 'i' &&
8299 name[4] == 'r')
8300 { /* rmdir */
8301 return -KEY_rmdir;
8302 }
8303
8304 goto unknown;
8305
8306 default:
8307 goto unknown;
8308 }
8309
8310 case 's':
8311 switch (name[1])
8312 {
8313 case 'e':
8314 if (name[2] == 'm' &&
8315 name[3] == 'o' &&
8316 name[4] == 'p')
8317 { /* semop */
8318 return -KEY_semop;
8319 }
8320
8321 goto unknown;
8322
8323 case 'h':
8324 if (name[2] == 'i' &&
8325 name[3] == 'f' &&
8326 name[4] == 't')
8327 { /* shift */
8328 return -KEY_shift;
8329 }
8330
8331 goto unknown;
8332
8333 case 'l':
8334 if (name[2] == 'e' &&
8335 name[3] == 'e' &&
8336 name[4] == 'p')
8337 { /* sleep */
8338 return -KEY_sleep;
8339 }
8340
8341 goto unknown;
8342
8343 case 'p':
8344 if (name[2] == 'l' &&
8345 name[3] == 'i' &&
8346 name[4] == 't')
8347 { /* split */
8348 return KEY_split;
8349 }
8350
8351 goto unknown;
8352
8353 case 'r':
8354 if (name[2] == 'a' &&
8355 name[3] == 'n' &&
8356 name[4] == 'd')
8357 { /* srand */
8358 return -KEY_srand;
8359 }
8360
8361 goto unknown;
8362
8363 case 't':
952306ac
RGS
8364 switch (name[2])
8365 {
8366 case 'a':
8367 if (name[3] == 't' &&
8368 name[4] == 'e')
8369 { /* state */
5458a98a 8370 return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0);
952306ac 8371 }
4c3bbe0f 8372
952306ac
RGS
8373 goto unknown;
8374
8375 case 'u':
8376 if (name[3] == 'd' &&
8377 name[4] == 'y')
8378 { /* study */
8379 return KEY_study;
8380 }
8381
8382 goto unknown;
8383
8384 default:
8385 goto unknown;
8386 }
4c3bbe0f
MHM
8387
8388 default:
8389 goto unknown;
8390 }
8391
8392 case 't':
8393 if (name[1] == 'i' &&
8394 name[2] == 'm' &&
8395 name[3] == 'e' &&
8396 name[4] == 's')
8397 { /* times */
8398 return -KEY_times;
8399 }
8400
8401 goto unknown;
8402
8403 case 'u':
8404 switch (name[1])
8405 {
8406 case 'm':
8407 if (name[2] == 'a' &&
8408 name[3] == 's' &&
8409 name[4] == 'k')
8410 { /* umask */
8411 return -KEY_umask;
8412 }
8413
8414 goto unknown;
8415
8416 case 'n':
8417 switch (name[2])
8418 {
8419 case 'd':
8420 if (name[3] == 'e' &&
8421 name[4] == 'f')
8422 { /* undef */
8423 return KEY_undef;
8424 }
8425
8426 goto unknown;
8427
8428 case 't':
8429 if (name[3] == 'i')
8430 {
8431 switch (name[4])
8432 {
8433 case 'e':
8434 { /* untie */
8435 return KEY_untie;
8436 }
8437
4c3bbe0f
MHM
8438 case 'l':
8439 { /* until */
8440 return KEY_until;
8441 }
8442
4c3bbe0f
MHM
8443 default:
8444 goto unknown;
8445 }
8446 }
8447
8448 goto unknown;
8449
8450 default:
8451 goto unknown;
8452 }
8453
8454 case 't':
8455 if (name[2] == 'i' &&
8456 name[3] == 'm' &&
8457 name[4] == 'e')
8458 { /* utime */
8459 return -KEY_utime;
8460 }
8461
8462 goto unknown;
8463
8464 default:
8465 goto unknown;
8466 }
8467
8468 case 'w':
8469 switch (name[1])
8470 {
8471 case 'h':
8472 if (name[2] == 'i' &&
8473 name[3] == 'l' &&
8474 name[4] == 'e')
8475 { /* while */
8476 return KEY_while;
8477 }
8478
8479 goto unknown;
8480
8481 case 'r':
8482 if (name[2] == 'i' &&
8483 name[3] == 't' &&
8484 name[4] == 'e')
8485 { /* write */
8486 return -KEY_write;
8487 }
8488
8489 goto unknown;
8490
8491 default:
8492 goto unknown;
8493 }
8494
8495 default:
8496 goto unknown;
e2e1dd5a 8497 }
4c3bbe0f
MHM
8498
8499 case 6: /* 33 tokens of length 6 */
8500 switch (name[0])
8501 {
8502 case 'a':
8503 if (name[1] == 'c' &&
8504 name[2] == 'c' &&
8505 name[3] == 'e' &&
8506 name[4] == 'p' &&
8507 name[5] == 't')
8508 { /* accept */
8509 return -KEY_accept;
8510 }
8511
8512 goto unknown;
8513
8514 case 'c':
8515 switch (name[1])
8516 {
8517 case 'a':
8518 if (name[2] == 'l' &&
8519 name[3] == 'l' &&
8520 name[4] == 'e' &&
8521 name[5] == 'r')
8522 { /* caller */
8523 return -KEY_caller;
8524 }
8525
8526 goto unknown;
8527
8528 case 'h':
8529 if (name[2] == 'r' &&
8530 name[3] == 'o' &&
8531 name[4] == 'o' &&
8532 name[5] == 't')
8533 { /* chroot */
8534 return -KEY_chroot;
8535 }
8536
8537 goto unknown;
8538
8539 default:
8540 goto unknown;
8541 }
8542
8543 case 'd':
8544 if (name[1] == 'e' &&
8545 name[2] == 'l' &&
8546 name[3] == 'e' &&
8547 name[4] == 't' &&
8548 name[5] == 'e')
8549 { /* delete */
8550 return KEY_delete;
8551 }
8552
8553 goto unknown;
8554
8555 case 'e':
8556 switch (name[1])
8557 {
8558 case 'l':
8559 if (name[2] == 's' &&
8560 name[3] == 'e' &&
8561 name[4] == 'i' &&
8562 name[5] == 'f')
8563 { /* elseif */
8564 if(ckWARN_d(WARN_SYNTAX))
8565 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
8566 }
8567
8568 goto unknown;
8569
8570 case 'x':
8571 if (name[2] == 'i' &&
8572 name[3] == 's' &&
8573 name[4] == 't' &&
8574 name[5] == 's')
8575 { /* exists */
8576 return KEY_exists;
8577 }
8578
8579 goto unknown;
8580
8581 default:
8582 goto unknown;
8583 }
8584
8585 case 'f':
8586 switch (name[1])
8587 {
8588 case 'i':
8589 if (name[2] == 'l' &&
8590 name[3] == 'e' &&
8591 name[4] == 'n' &&
8592 name[5] == 'o')
8593 { /* fileno */
8594 return -KEY_fileno;
8595 }
8596
8597 goto unknown;
8598
8599 case 'o':
8600 if (name[2] == 'r' &&
8601 name[3] == 'm' &&
8602 name[4] == 'a' &&
8603 name[5] == 't')
8604 { /* format */
8605 return KEY_format;
8606 }
8607
8608 goto unknown;
8609
8610 default:
8611 goto unknown;
8612 }
8613
8614 case 'g':
8615 if (name[1] == 'm' &&
8616 name[2] == 't' &&
8617 name[3] == 'i' &&
8618 name[4] == 'm' &&
8619 name[5] == 'e')
8620 { /* gmtime */
8621 return -KEY_gmtime;
8622 }
8623
8624 goto unknown;
8625
8626 case 'l':
8627 switch (name[1])
8628 {
8629 case 'e':
8630 if (name[2] == 'n' &&
8631 name[3] == 'g' &&
8632 name[4] == 't' &&
8633 name[5] == 'h')
8634 { /* length */
8635 return -KEY_length;
8636 }
8637
8638 goto unknown;
8639
8640 case 'i':
8641 if (name[2] == 's' &&
8642 name[3] == 't' &&
8643 name[4] == 'e' &&
8644 name[5] == 'n')
8645 { /* listen */
8646 return -KEY_listen;
8647 }
8648
8649 goto unknown;
8650
8651 default:
8652 goto unknown;
8653 }
8654
8655 case 'm':
8656 if (name[1] == 's' &&
8657 name[2] == 'g')
8658 {
8659 switch (name[3])
8660 {
8661 case 'c':
8662 if (name[4] == 't' &&
8663 name[5] == 'l')
8664 { /* msgctl */
8665 return -KEY_msgctl;
8666 }
8667
8668 goto unknown;
8669
8670 case 'g':
8671 if (name[4] == 'e' &&
8672 name[5] == 't')
8673 { /* msgget */
8674 return -KEY_msgget;
8675 }
8676
8677 goto unknown;
8678
8679 case 'r':
8680 if (name[4] == 'c' &&
8681 name[5] == 'v')
8682 { /* msgrcv */
8683 return -KEY_msgrcv;
8684 }
8685
8686 goto unknown;
8687
8688 case 's':
8689 if (name[4] == 'n' &&
8690 name[5] == 'd')
8691 { /* msgsnd */
8692 return -KEY_msgsnd;
8693 }
8694
8695 goto unknown;
8696
8697 default:
8698 goto unknown;
8699 }
8700 }
8701
8702 goto unknown;
8703
8704 case 'p':
8705 if (name[1] == 'r' &&
8706 name[2] == 'i' &&
8707 name[3] == 'n' &&
8708 name[4] == 't' &&
8709 name[5] == 'f')
8710 { /* printf */
8711 return KEY_printf;
8712 }
8713
8714 goto unknown;
8715
8716 case 'r':
8717 switch (name[1])
8718 {
8719 case 'e':
8720 switch (name[2])
8721 {
8722 case 'n':
8723 if (name[3] == 'a' &&
8724 name[4] == 'm' &&
8725 name[5] == 'e')
8726 { /* rename */
8727 return -KEY_rename;
8728 }
8729
8730 goto unknown;
8731
8732 case 't':
8733 if (name[3] == 'u' &&
8734 name[4] == 'r' &&
8735 name[5] == 'n')
8736 { /* return */
8737 return KEY_return;
8738 }
8739
8740 goto unknown;
8741
8742 default:
8743 goto unknown;
8744 }
8745
8746 case 'i':
8747 if (name[2] == 'n' &&
8748 name[3] == 'd' &&
8749 name[4] == 'e' &&
8750 name[5] == 'x')
8751 { /* rindex */
8752 return -KEY_rindex;
8753 }
8754
8755 goto unknown;
8756
8757 default:
8758 goto unknown;
8759 }
8760
8761 case 's':
8762 switch (name[1])
8763 {
8764 case 'c':
8765 if (name[2] == 'a' &&
8766 name[3] == 'l' &&
8767 name[4] == 'a' &&
8768 name[5] == 'r')
8769 { /* scalar */
8770 return KEY_scalar;
8771 }
8772
8773 goto unknown;
8774
8775 case 'e':
8776 switch (name[2])
8777 {
8778 case 'l':
8779 if (name[3] == 'e' &&
8780 name[4] == 'c' &&
8781 name[5] == 't')
8782 { /* select */
8783 return -KEY_select;
8784 }
8785
8786 goto unknown;
8787
8788 case 'm':
8789 switch (name[3])
8790 {
8791 case 'c':
8792 if (name[4] == 't' &&
8793 name[5] == 'l')
8794 { /* semctl */
8795 return -KEY_semctl;
8796 }
8797
8798 goto unknown;
8799
8800 case 'g':
8801 if (name[4] == 'e' &&
8802 name[5] == 't')
8803 { /* semget */
8804 return -KEY_semget;
8805 }
8806
8807 goto unknown;
8808
8809 default:
8810 goto unknown;
8811 }
8812
8813 default:
8814 goto unknown;
8815 }
8816
8817 case 'h':
8818 if (name[2] == 'm')
8819 {
8820 switch (name[3])
8821 {
8822 case 'c':
8823 if (name[4] == 't' &&
8824 name[5] == 'l')
8825 { /* shmctl */
8826 return -KEY_shmctl;
8827 }
8828
8829 goto unknown;
8830
8831 case 'g':
8832 if (name[4] == 'e' &&
8833 name[5] == 't')
8834 { /* shmget */
8835 return -KEY_shmget;
8836 }
8837
8838 goto unknown;
8839
8840 default:
8841 goto unknown;
8842 }
8843 }
8844
8845 goto unknown;
8846
8847 case 'o':
8848 if (name[2] == 'c' &&
8849 name[3] == 'k' &&
8850 name[4] == 'e' &&
8851 name[5] == 't')
8852 { /* socket */
8853 return -KEY_socket;
8854 }
8855
8856 goto unknown;
8857
8858 case 'p':
8859 if (name[2] == 'l' &&
8860 name[3] == 'i' &&
8861 name[4] == 'c' &&
8862 name[5] == 'e')
8863 { /* splice */
8864 return -KEY_splice;
8865 }
8866
8867 goto unknown;
8868
8869 case 'u':
8870 if (name[2] == 'b' &&
8871 name[3] == 's' &&
8872 name[4] == 't' &&
8873 name[5] == 'r')
8874 { /* substr */
8875 return -KEY_substr;
8876 }
8877
8878 goto unknown;
8879
8880 case 'y':
8881 if (name[2] == 's' &&
8882 name[3] == 't' &&
8883 name[4] == 'e' &&
8884 name[5] == 'm')
8885 { /* system */
8886 return -KEY_system;
8887 }
8888
8889 goto unknown;
8890
8891 default:
8892 goto unknown;
8893 }
8894
8895 case 'u':
8896 if (name[1] == 'n')
8897 {
8898 switch (name[2])
8899 {
8900 case 'l':
8901 switch (name[3])
8902 {
8903 case 'e':
8904 if (name[4] == 's' &&
8905 name[5] == 's')
8906 { /* unless */
8907 return KEY_unless;
8908 }
8909
8910 goto unknown;
8911
8912 case 'i':
8913 if (name[4] == 'n' &&
8914 name[5] == 'k')
8915 { /* unlink */
8916 return -KEY_unlink;
8917 }
8918
8919 goto unknown;
8920
8921 default:
8922 goto unknown;
8923 }
8924
8925 case 'p':
8926 if (name[3] == 'a' &&
8927 name[4] == 'c' &&
8928 name[5] == 'k')
8929 { /* unpack */
8930 return -KEY_unpack;
8931 }
8932
8933 goto unknown;
8934
8935 default:
8936 goto unknown;
8937 }
8938 }
8939
8940 goto unknown;
8941
8942 case 'v':
8943 if (name[1] == 'a' &&
8944 name[2] == 'l' &&
8945 name[3] == 'u' &&
8946 name[4] == 'e' &&
8947 name[5] == 's')
8948 { /* values */
8949 return -KEY_values;
8950 }
8951
8952 goto unknown;
8953
8954 default:
8955 goto unknown;
e2e1dd5a 8956 }
4c3bbe0f 8957
0d863452 8958 case 7: /* 29 tokens of length 7 */
4c3bbe0f
MHM
8959 switch (name[0])
8960 {
8961 case 'D':
8962 if (name[1] == 'E' &&
8963 name[2] == 'S' &&
8964 name[3] == 'T' &&
8965 name[4] == 'R' &&
8966 name[5] == 'O' &&
8967 name[6] == 'Y')
8968 { /* DESTROY */
8969 return KEY_DESTROY;
8970 }
8971
8972 goto unknown;
8973
8974 case '_':
8975 if (name[1] == '_' &&
8976 name[2] == 'E' &&
8977 name[3] == 'N' &&
8978 name[4] == 'D' &&
8979 name[5] == '_' &&
8980 name[6] == '_')
8981 { /* __END__ */
8982 return KEY___END__;
8983 }
8984
8985 goto unknown;
8986
8987 case 'b':
8988 if (name[1] == 'i' &&
8989 name[2] == 'n' &&
8990 name[3] == 'm' &&
8991 name[4] == 'o' &&
8992 name[5] == 'd' &&
8993 name[6] == 'e')
8994 { /* binmode */
8995 return -KEY_binmode;
8996 }
8997
8998 goto unknown;
8999
9000 case 'c':
9001 if (name[1] == 'o' &&
9002 name[2] == 'n' &&
9003 name[3] == 'n' &&
9004 name[4] == 'e' &&
9005 name[5] == 'c' &&
9006 name[6] == 't')
9007 { /* connect */
9008 return -KEY_connect;
9009 }
9010
9011 goto unknown;
9012
9013 case 'd':
9014 switch (name[1])
9015 {
9016 case 'b':
9017 if (name[2] == 'm' &&
9018 name[3] == 'o' &&
9019 name[4] == 'p' &&
9020 name[5] == 'e' &&
9021 name[6] == 'n')
9022 { /* dbmopen */
9023 return -KEY_dbmopen;
9024 }
9025
9026 goto unknown;
9027
9028 case 'e':
0d863452
RH
9029 if (name[2] == 'f')
9030 {
9031 switch (name[3])
9032 {
9033 case 'a':
9034 if (name[4] == 'u' &&
9035 name[5] == 'l' &&
9036 name[6] == 't')
9037 { /* default */
5458a98a 9038 return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0);
0d863452
RH
9039 }
9040
9041 goto unknown;
9042
9043 case 'i':
9044 if (name[4] == 'n' &&
952306ac
RGS
9045 name[5] == 'e' &&
9046 name[6] == 'd')
9047 { /* defined */
9048 return KEY_defined;
9049 }
4c3bbe0f 9050
952306ac 9051 goto unknown;
4c3bbe0f 9052
952306ac
RGS
9053 default:
9054 goto unknown;
9055 }
0d863452
RH
9056 }
9057
9058 goto unknown;
9059
9060 default:
9061 goto unknown;
9062 }
4c3bbe0f
MHM
9063
9064 case 'f':
9065 if (name[1] == 'o' &&
9066 name[2] == 'r' &&
9067 name[3] == 'e' &&
9068 name[4] == 'a' &&
9069 name[5] == 'c' &&
9070 name[6] == 'h')
9071 { /* foreach */
9072 return KEY_foreach;
9073 }
9074
9075 goto unknown;
9076
9077 case 'g':
9078 if (name[1] == 'e' &&
9079 name[2] == 't' &&
9080 name[3] == 'p')
9081 {
9082 switch (name[4])
9083 {
9084 case 'g':
9085 if (name[5] == 'r' &&
9086 name[6] == 'p')
9087 { /* getpgrp */
9088 return -KEY_getpgrp;
9089 }
9090
9091 goto unknown;
9092
9093 case 'p':
9094 if (name[5] == 'i' &&
9095 name[6] == 'd')
9096 { /* getppid */
9097 return -KEY_getppid;
9098 }
9099
9100 goto unknown;
9101
9102 default:
9103 goto unknown;
9104 }
9105 }
9106
9107 goto unknown;
9108
9109 case 'l':
9110 if (name[1] == 'c' &&
9111 name[2] == 'f' &&
9112 name[3] == 'i' &&
9113 name[4] == 'r' &&
9114 name[5] == 's' &&
9115 name[6] == 't')
9116 { /* lcfirst */
9117 return -KEY_lcfirst;
9118 }
9119
9120 goto unknown;
9121
9122 case 'o':
9123 if (name[1] == 'p' &&
9124 name[2] == 'e' &&
9125 name[3] == 'n' &&
9126 name[4] == 'd' &&
9127 name[5] == 'i' &&
9128 name[6] == 'r')
9129 { /* opendir */
9130 return -KEY_opendir;
9131 }
9132
9133 goto unknown;
9134
9135 case 'p':
9136 if (name[1] == 'a' &&
9137 name[2] == 'c' &&
9138 name[3] == 'k' &&
9139 name[4] == 'a' &&
9140 name[5] == 'g' &&
9141 name[6] == 'e')
9142 { /* package */
9143 return KEY_package;
9144 }
9145
9146 goto unknown;
9147
9148 case 'r':
9149 if (name[1] == 'e')
9150 {
9151 switch (name[2])
9152 {
9153 case 'a':
9154 if (name[3] == 'd' &&
9155 name[4] == 'd' &&
9156 name[5] == 'i' &&
9157 name[6] == 'r')
9158 { /* readdir */
9159 return -KEY_readdir;
9160 }
9161
9162 goto unknown;
9163
9164 case 'q':
9165 if (name[3] == 'u' &&
9166 name[4] == 'i' &&
9167 name[5] == 'r' &&
9168 name[6] == 'e')
9169 { /* require */
9170 return KEY_require;
9171 }
9172
9173 goto unknown;
9174
9175 case 'v':
9176 if (name[3] == 'e' &&
9177 name[4] == 'r' &&
9178 name[5] == 's' &&
9179 name[6] == 'e')
9180 { /* reverse */
9181 return -KEY_reverse;
9182 }
9183
9184 goto unknown;
9185
9186 default:
9187 goto unknown;
9188 }
9189 }
9190
9191 goto unknown;
9192
9193 case 's':
9194 switch (name[1])
9195 {
9196 case 'e':
9197 switch (name[2])
9198 {
9199 case 'e':
9200 if (name[3] == 'k' &&
9201 name[4] == 'd' &&
9202 name[5] == 'i' &&
9203 name[6] == 'r')
9204 { /* seekdir */
9205 return -KEY_seekdir;
9206 }
9207
9208 goto unknown;
9209
9210 case 't':
9211 if (name[3] == 'p' &&
9212 name[4] == 'g' &&
9213 name[5] == 'r' &&
9214 name[6] == 'p')
9215 { /* setpgrp */
9216 return -KEY_setpgrp;
9217 }
9218
9219 goto unknown;
9220
9221 default:
9222 goto unknown;
9223 }
9224
9225 case 'h':
9226 if (name[2] == 'm' &&
9227 name[3] == 'r' &&
9228 name[4] == 'e' &&
9229 name[5] == 'a' &&
9230 name[6] == 'd')
9231 { /* shmread */
9232 return -KEY_shmread;
9233 }
9234
9235 goto unknown;
9236
9237 case 'p':
9238 if (name[2] == 'r' &&
9239 name[3] == 'i' &&
9240 name[4] == 'n' &&
9241 name[5] == 't' &&
9242 name[6] == 'f')
9243 { /* sprintf */
9244 return -KEY_sprintf;
9245 }
9246
9247 goto unknown;
9248
9249 case 'y':
9250 switch (name[2])
9251 {
9252 case 'm':
9253 if (name[3] == 'l' &&
9254 name[4] == 'i' &&
9255 name[5] == 'n' &&
9256 name[6] == 'k')
9257 { /* symlink */
9258 return -KEY_symlink;
9259 }
9260
9261 goto unknown;
9262
9263 case 's':
9264 switch (name[3])
9265 {
9266 case 'c':
9267 if (name[4] == 'a' &&
9268 name[5] == 'l' &&
9269 name[6] == 'l')
9270 { /* syscall */
9271 return -KEY_syscall;
9272 }
9273
9274 goto unknown;
9275
9276 case 'o':
9277 if (name[4] == 'p' &&
9278 name[5] == 'e' &&
9279 name[6] == 'n')
9280 { /* sysopen */
9281 return -KEY_sysopen;
9282 }
9283
9284 goto unknown;
9285
9286 case 'r':
9287 if (name[4] == 'e' &&
9288 name[5] == 'a' &&
9289 name[6] == 'd')
9290 { /* sysread */
9291 return -KEY_sysread;
9292 }
9293
9294 goto unknown;
9295
9296 case 's':
9297 if (name[4] == 'e' &&
9298 name[5] == 'e' &&
9299 name[6] == 'k')
9300 { /* sysseek */
9301 return -KEY_sysseek;
9302 }
9303
9304 goto unknown;
9305
9306 default:
9307 goto unknown;
9308 }
9309
9310 default:
9311 goto unknown;
9312 }
9313
9314 default:
9315 goto unknown;
9316 }
9317
9318 case 't':
9319 if (name[1] == 'e' &&
9320 name[2] == 'l' &&
9321 name[3] == 'l' &&
9322 name[4] == 'd' &&
9323 name[5] == 'i' &&
9324 name[6] == 'r')
9325 { /* telldir */
9326 return -KEY_telldir;
9327 }
9328
9329 goto unknown;
9330
9331 case 'u':
9332 switch (name[1])
9333 {
9334 case 'c':
9335 if (name[2] == 'f' &&
9336 name[3] == 'i' &&
9337 name[4] == 'r' &&
9338 name[5] == 's' &&
9339 name[6] == 't')
9340 { /* ucfirst */
9341 return -KEY_ucfirst;
9342 }
9343
9344 goto unknown;
9345
9346 case 'n':
9347 if (name[2] == 's' &&
9348 name[3] == 'h' &&
9349 name[4] == 'i' &&
9350 name[5] == 'f' &&
9351 name[6] == 't')
9352 { /* unshift */
9353 return -KEY_unshift;
9354 }
9355
9356 goto unknown;
9357
9358 default:
9359 goto unknown;
9360 }
9361
9362 case 'w':
9363 if (name[1] == 'a' &&
9364 name[2] == 'i' &&
9365 name[3] == 't' &&
9366 name[4] == 'p' &&
9367 name[5] == 'i' &&
9368 name[6] == 'd')
9369 { /* waitpid */
9370 return -KEY_waitpid;
9371 }
9372
9373 goto unknown;
9374
9375 default:
9376 goto unknown;
9377 }
9378
9379 case 8: /* 26 tokens of length 8 */
9380 switch (name[0])
9381 {
9382 case 'A':
9383 if (name[1] == 'U' &&
9384 name[2] == 'T' &&
9385 name[3] == 'O' &&
9386 name[4] == 'L' &&
9387 name[5] == 'O' &&
9388 name[6] == 'A' &&
9389 name[7] == 'D')
9390 { /* AUTOLOAD */
9391 return KEY_AUTOLOAD;
9392 }
9393
9394 goto unknown;
9395
9396 case '_':
9397 if (name[1] == '_')
9398 {
9399 switch (name[2])
9400 {
9401 case 'D':
9402 if (name[3] == 'A' &&
9403 name[4] == 'T' &&
9404 name[5] == 'A' &&
9405 name[6] == '_' &&
9406 name[7] == '_')
9407 { /* __DATA__ */
9408 return KEY___DATA__;
9409 }
9410
9411 goto unknown;
9412
9413 case 'F':
9414 if (name[3] == 'I' &&
9415 name[4] == 'L' &&
9416 name[5] == 'E' &&
9417 name[6] == '_' &&
9418 name[7] == '_')
9419 { /* __FILE__ */
9420 return -KEY___FILE__;
9421 }
9422
9423 goto unknown;
9424
9425 case 'L':
9426 if (name[3] == 'I' &&
9427 name[4] == 'N' &&
9428 name[5] == 'E' &&
9429 name[6] == '_' &&
9430 name[7] == '_')
9431 { /* __LINE__ */
9432 return -KEY___LINE__;
9433 }
9434
9435 goto unknown;
9436
9437 default:
9438 goto unknown;
9439 }
9440 }
9441
9442 goto unknown;
9443
9444 case 'c':
9445 switch (name[1])
9446 {
9447 case 'l':
9448 if (name[2] == 'o' &&
9449 name[3] == 's' &&
9450 name[4] == 'e' &&
9451 name[5] == 'd' &&
9452 name[6] == 'i' &&
9453 name[7] == 'r')
9454 { /* closedir */
9455 return -KEY_closedir;
9456 }
9457
9458 goto unknown;
9459
9460 case 'o':
9461 if (name[2] == 'n' &&
9462 name[3] == 't' &&
9463 name[4] == 'i' &&
9464 name[5] == 'n' &&
9465 name[6] == 'u' &&
9466 name[7] == 'e')
9467 { /* continue */
9468 return -KEY_continue;
9469 }
9470
9471 goto unknown;
9472
9473 default:
9474 goto unknown;
9475 }
9476
9477 case 'd':
9478 if (name[1] == 'b' &&
9479 name[2] == 'm' &&
9480 name[3] == 'c' &&
9481 name[4] == 'l' &&
9482 name[5] == 'o' &&
9483 name[6] == 's' &&
9484 name[7] == 'e')
9485 { /* dbmclose */
9486 return -KEY_dbmclose;
9487 }
9488
9489 goto unknown;
9490
9491 case 'e':
9492 if (name[1] == 'n' &&
9493 name[2] == 'd')
9494 {
9495 switch (name[3])
9496 {
9497 case 'g':
9498 if (name[4] == 'r' &&
9499 name[5] == 'e' &&
9500 name[6] == 'n' &&
9501 name[7] == 't')
9502 { /* endgrent */
9503 return -KEY_endgrent;
9504 }
9505
9506 goto unknown;
9507
9508 case 'p':
9509 if (name[4] == 'w' &&
9510 name[5] == 'e' &&
9511 name[6] == 'n' &&
9512 name[7] == 't')
9513 { /* endpwent */
9514 return -KEY_endpwent;
9515 }
9516
9517 goto unknown;
9518
9519 default:
9520 goto unknown;
9521 }
9522 }
9523
9524 goto unknown;
9525
9526 case 'f':
9527 if (name[1] == 'o' &&
9528 name[2] == 'r' &&
9529 name[3] == 'm' &&
9530 name[4] == 'l' &&
9531 name[5] == 'i' &&
9532 name[6] == 'n' &&
9533 name[7] == 'e')
9534 { /* formline */
9535 return -KEY_formline;
9536 }
9537
9538 goto unknown;
9539
9540 case 'g':
9541 if (name[1] == 'e' &&
9542 name[2] == 't')
9543 {
9544 switch (name[3])
9545 {
9546 case 'g':
9547 if (name[4] == 'r')
9548 {
9549 switch (name[5])
9550 {
9551 case 'e':
9552 if (name[6] == 'n' &&
9553 name[7] == 't')
9554 { /* getgrent */
9555 return -KEY_getgrent;
9556 }
9557
9558 goto unknown;
9559
9560 case 'g':
9561 if (name[6] == 'i' &&
9562 name[7] == 'd')
9563 { /* getgrgid */
9564 return -KEY_getgrgid;
9565 }
9566
9567 goto unknown;
9568
9569 case 'n':
9570 if (name[6] == 'a' &&
9571 name[7] == 'm')
9572 { /* getgrnam */
9573 return -KEY_getgrnam;
9574 }
9575
9576 goto unknown;
9577
9578 default:
9579 goto unknown;
9580 }
9581 }
9582
9583 goto unknown;
9584
9585 case 'l':
9586 if (name[4] == 'o' &&
9587 name[5] == 'g' &&
9588 name[6] == 'i' &&
9589 name[7] == 'n')
9590 { /* getlogin */
9591 return -KEY_getlogin;
9592 }
9593
9594 goto unknown;
9595
9596 case 'p':
9597 if (name[4] == 'w')
9598 {
9599 switch (name[5])
9600 {
9601 case 'e':
9602 if (name[6] == 'n' &&
9603 name[7] == 't')
9604 { /* getpwent */
9605 return -KEY_getpwent;
9606 }
9607
9608 goto unknown;
9609
9610 case 'n':
9611 if (name[6] == 'a' &&
9612 name[7] == 'm')
9613 { /* getpwnam */
9614 return -KEY_getpwnam;
9615 }
9616
9617 goto unknown;
9618
9619 case 'u':
9620 if (name[6] == 'i' &&
9621 name[7] == 'd')
9622 { /* getpwuid */
9623 return -KEY_getpwuid;
9624 }
9625
9626 goto unknown;
9627
9628 default:
9629 goto unknown;
9630 }
9631 }
9632
9633 goto unknown;
9634
9635 default:
9636 goto unknown;
9637 }
9638 }
9639
9640 goto unknown;
9641
9642 case 'r':
9643 if (name[1] == 'e' &&
9644 name[2] == 'a' &&
9645 name[3] == 'd')
9646 {
9647 switch (name[4])
9648 {
9649 case 'l':
9650 if (name[5] == 'i' &&
9651 name[6] == 'n')
9652 {
9653 switch (name[7])
9654 {
9655 case 'e':
9656 { /* readline */
9657 return -KEY_readline;
9658 }
9659
4c3bbe0f
MHM
9660 case 'k':
9661 { /* readlink */
9662 return -KEY_readlink;
9663 }
9664
4c3bbe0f
MHM
9665 default:
9666 goto unknown;
9667 }
9668 }
9669
9670 goto unknown;
9671
9672 case 'p':
9673 if (name[5] == 'i' &&
9674 name[6] == 'p' &&
9675 name[7] == 'e')
9676 { /* readpipe */
9677 return -KEY_readpipe;
9678 }
9679
9680 goto unknown;
9681
9682 default:
9683 goto unknown;
9684 }
9685 }
9686
9687 goto unknown;
9688
9689 case 's':
9690 switch (name[1])
9691 {
9692 case 'e':
9693 if (name[2] == 't')
9694 {
9695 switch (name[3])
9696 {
9697 case 'g':
9698 if (name[4] == 'r' &&
9699 name[5] == 'e' &&
9700 name[6] == 'n' &&
9701 name[7] == 't')
9702 { /* setgrent */
9703 return -KEY_setgrent;
9704 }
9705
9706 goto unknown;
9707
9708 case 'p':
9709 if (name[4] == 'w' &&
9710 name[5] == 'e' &&
9711 name[6] == 'n' &&
9712 name[7] == 't')
9713 { /* setpwent */
9714 return -KEY_setpwent;
9715 }
9716
9717 goto unknown;
9718
9719 default:
9720 goto unknown;
9721 }
9722 }
9723
9724 goto unknown;
9725
9726 case 'h':
9727 switch (name[2])
9728 {
9729 case 'm':
9730 if (name[3] == 'w' &&
9731 name[4] == 'r' &&
9732 name[5] == 'i' &&
9733 name[6] == 't' &&
9734 name[7] == 'e')
9735 { /* shmwrite */
9736 return -KEY_shmwrite;
9737 }
9738
9739 goto unknown;
9740
9741 case 'u':
9742 if (name[3] == 't' &&
9743 name[4] == 'd' &&
9744 name[5] == 'o' &&
9745 name[6] == 'w' &&
9746 name[7] == 'n')
9747 { /* shutdown */
9748 return -KEY_shutdown;
9749 }
9750
9751 goto unknown;
9752
9753 default:
9754 goto unknown;
9755 }
9756
9757 case 'y':
9758 if (name[2] == 's' &&
9759 name[3] == 'w' &&
9760 name[4] == 'r' &&
9761 name[5] == 'i' &&
9762 name[6] == 't' &&
9763 name[7] == 'e')
9764 { /* syswrite */
9765 return -KEY_syswrite;
9766 }
9767
9768 goto unknown;
9769
9770 default:
9771 goto unknown;
9772 }
9773
9774 case 't':
9775 if (name[1] == 'r' &&
9776 name[2] == 'u' &&
9777 name[3] == 'n' &&
9778 name[4] == 'c' &&
9779 name[5] == 'a' &&
9780 name[6] == 't' &&
9781 name[7] == 'e')
9782 { /* truncate */
9783 return -KEY_truncate;
9784 }
9785
9786 goto unknown;
9787
9788 default:
9789 goto unknown;
9790 }
9791
3c10abe3 9792 case 9: /* 9 tokens of length 9 */
4c3bbe0f
MHM
9793 switch (name[0])
9794 {
3c10abe3
AG
9795 case 'U':
9796 if (name[1] == 'N' &&
9797 name[2] == 'I' &&
9798 name[3] == 'T' &&
9799 name[4] == 'C' &&
9800 name[5] == 'H' &&
9801 name[6] == 'E' &&
9802 name[7] == 'C' &&
9803 name[8] == 'K')
9804 { /* UNITCHECK */
9805 return KEY_UNITCHECK;
9806 }
9807
9808 goto unknown;
9809
4c3bbe0f
MHM
9810 case 'e':
9811 if (name[1] == 'n' &&
9812 name[2] == 'd' &&
9813 name[3] == 'n' &&
9814 name[4] == 'e' &&
9815 name[5] == 't' &&
9816 name[6] == 'e' &&
9817 name[7] == 'n' &&
9818 name[8] == 't')
9819 { /* endnetent */
9820 return -KEY_endnetent;
9821 }
9822
9823 goto unknown;
9824
9825 case 'g':
9826 if (name[1] == 'e' &&
9827 name[2] == 't' &&
9828 name[3] == 'n' &&
9829 name[4] == 'e' &&
9830 name[5] == 't' &&
9831 name[6] == 'e' &&
9832 name[7] == 'n' &&
9833 name[8] == 't')
9834 { /* getnetent */
9835 return -KEY_getnetent;
9836 }
9837
9838 goto unknown;
9839
9840 case 'l':
9841 if (name[1] == 'o' &&
9842 name[2] == 'c' &&
9843 name[3] == 'a' &&
9844 name[4] == 'l' &&
9845 name[5] == 't' &&
9846 name[6] == 'i' &&
9847 name[7] == 'm' &&
9848 name[8] == 'e')
9849 { /* localtime */
9850 return -KEY_localtime;
9851 }
9852
9853 goto unknown;
9854
9855 case 'p':
9856 if (name[1] == 'r' &&
9857 name[2] == 'o' &&
9858 name[3] == 't' &&
9859 name[4] == 'o' &&
9860 name[5] == 't' &&
9861 name[6] == 'y' &&
9862 name[7] == 'p' &&
9863 name[8] == 'e')
9864 { /* prototype */
9865 return KEY_prototype;
9866 }
9867
9868 goto unknown;
9869
9870 case 'q':
9871 if (name[1] == 'u' &&
9872 name[2] == 'o' &&
9873 name[3] == 't' &&
9874 name[4] == 'e' &&
9875 name[5] == 'm' &&
9876 name[6] == 'e' &&
9877 name[7] == 't' &&
9878 name[8] == 'a')
9879 { /* quotemeta */
9880 return -KEY_quotemeta;
9881 }
9882
9883 goto unknown;
9884
9885 case 'r':
9886 if (name[1] == 'e' &&
9887 name[2] == 'w' &&
9888 name[3] == 'i' &&
9889 name[4] == 'n' &&
9890 name[5] == 'd' &&
9891 name[6] == 'd' &&
9892 name[7] == 'i' &&
9893 name[8] == 'r')
9894 { /* rewinddir */
9895 return -KEY_rewinddir;
9896 }
9897
9898 goto unknown;
9899
9900 case 's':
9901 if (name[1] == 'e' &&
9902 name[2] == 't' &&
9903 name[3] == 'n' &&
9904 name[4] == 'e' &&
9905 name[5] == 't' &&
9906 name[6] == 'e' &&
9907 name[7] == 'n' &&
9908 name[8] == 't')
9909 { /* setnetent */
9910 return -KEY_setnetent;
9911 }
9912
9913 goto unknown;
9914
9915 case 'w':
9916 if (name[1] == 'a' &&
9917 name[2] == 'n' &&
9918 name[3] == 't' &&
9919 name[4] == 'a' &&
9920 name[5] == 'r' &&
9921 name[6] == 'r' &&
9922 name[7] == 'a' &&
9923 name[8] == 'y')
9924 { /* wantarray */
9925 return -KEY_wantarray;
9926 }
9927
9928 goto unknown;
9929
9930 default:
9931 goto unknown;
9932 }
9933
9934 case 10: /* 9 tokens of length 10 */
9935 switch (name[0])
9936 {
9937 case 'e':
9938 if (name[1] == 'n' &&
9939 name[2] == 'd')
9940 {
9941 switch (name[3])
9942 {
9943 case 'h':
9944 if (name[4] == 'o' &&
9945 name[5] == 's' &&
9946 name[6] == 't' &&
9947 name[7] == 'e' &&
9948 name[8] == 'n' &&
9949 name[9] == 't')
9950 { /* endhostent */
9951 return -KEY_endhostent;
9952 }
9953
9954 goto unknown;
9955
9956 case 's':
9957 if (name[4] == 'e' &&
9958 name[5] == 'r' &&
9959 name[6] == 'v' &&
9960 name[7] == 'e' &&
9961 name[8] == 'n' &&
9962 name[9] == 't')
9963 { /* endservent */
9964 return -KEY_endservent;
9965 }
9966
9967 goto unknown;
9968
9969 default:
9970 goto unknown;
9971 }
9972 }
9973
9974 goto unknown;
9975
9976 case 'g':
9977 if (name[1] == 'e' &&
9978 name[2] == 't')
9979 {
9980 switch (name[3])
9981 {
9982 case 'h':
9983 if (name[4] == 'o' &&
9984 name[5] == 's' &&
9985 name[6] == 't' &&
9986 name[7] == 'e' &&
9987 name[8] == 'n' &&
9988 name[9] == 't')
9989 { /* gethostent */
9990 return -KEY_gethostent;
9991 }
9992
9993 goto unknown;
9994
9995 case 's':
9996 switch (name[4])
9997 {
9998 case 'e':
9999 if (name[5] == 'r' &&
10000 name[6] == 'v' &&
10001 name[7] == 'e' &&
10002 name[8] == 'n' &&
10003 name[9] == 't')
10004 { /* getservent */
10005 return -KEY_getservent;
10006 }
10007
10008 goto unknown;
10009
10010 case 'o':
10011 if (name[5] == 'c' &&
10012 name[6] == 'k' &&
10013 name[7] == 'o' &&
10014 name[8] == 'p' &&
10015 name[9] == 't')
10016 { /* getsockopt */
10017 return -KEY_getsockopt;
10018 }
10019
10020 goto unknown;
10021
10022 default:
10023 goto unknown;
10024 }
10025
10026 default:
10027 goto unknown;
10028 }
10029 }
10030
10031 goto unknown;
10032
10033 case 's':
10034 switch (name[1])
10035 {
10036 case 'e':
10037 if (name[2] == 't')
10038 {
10039 switch (name[3])
10040 {
10041 case 'h':
10042 if (name[4] == 'o' &&
10043 name[5] == 's' &&
10044 name[6] == 't' &&
10045 name[7] == 'e' &&
10046 name[8] == 'n' &&
10047 name[9] == 't')
10048 { /* sethostent */
10049 return -KEY_sethostent;
10050 }
10051
10052 goto unknown;
10053
10054 case 's':
10055 switch (name[4])
10056 {
10057 case 'e':
10058 if (name[5] == 'r' &&
10059 name[6] == 'v' &&
10060 name[7] == 'e' &&
10061 name[8] == 'n' &&
10062 name[9] == 't')
10063 { /* setservent */
10064 return -KEY_setservent;
10065 }
10066
10067 goto unknown;
10068
10069 case 'o':
10070 if (name[5] == 'c' &&
10071 name[6] == 'k' &&
10072 name[7] == 'o' &&
10073 name[8] == 'p' &&
10074 name[9] == 't')
10075 { /* setsockopt */
10076 return -KEY_setsockopt;
10077 }
10078
10079 goto unknown;
10080
10081 default:
10082 goto unknown;
10083 }
10084
10085 default:
10086 goto unknown;
10087 }
10088 }
10089
10090 goto unknown;
10091
10092 case 'o':
10093 if (name[2] == 'c' &&
10094 name[3] == 'k' &&
10095 name[4] == 'e' &&
10096 name[5] == 't' &&
10097 name[6] == 'p' &&
10098 name[7] == 'a' &&
10099 name[8] == 'i' &&
10100 name[9] == 'r')
10101 { /* socketpair */
10102 return -KEY_socketpair;
10103 }
10104
10105 goto unknown;
10106
10107 default:
10108 goto unknown;
10109 }
10110
10111 default:
10112 goto unknown;
e2e1dd5a 10113 }
4c3bbe0f
MHM
10114
10115 case 11: /* 8 tokens of length 11 */
10116 switch (name[0])
10117 {
10118 case '_':
10119 if (name[1] == '_' &&
10120 name[2] == 'P' &&
10121 name[3] == 'A' &&
10122 name[4] == 'C' &&
10123 name[5] == 'K' &&
10124 name[6] == 'A' &&
10125 name[7] == 'G' &&
10126 name[8] == 'E' &&
10127 name[9] == '_' &&
10128 name[10] == '_')
10129 { /* __PACKAGE__ */
10130 return -KEY___PACKAGE__;
10131 }
10132
10133 goto unknown;
10134
10135 case 'e':
10136 if (name[1] == 'n' &&
10137 name[2] == 'd' &&
10138 name[3] == 'p' &&
10139 name[4] == 'r' &&
10140 name[5] == 'o' &&
10141 name[6] == 't' &&
10142 name[7] == 'o' &&
10143 name[8] == 'e' &&
10144 name[9] == 'n' &&
10145 name[10] == 't')
10146 { /* endprotoent */
10147 return -KEY_endprotoent;
10148 }
10149
10150 goto unknown;
10151
10152 case 'g':
10153 if (name[1] == 'e' &&
10154 name[2] == 't')
10155 {
10156 switch (name[3])
10157 {
10158 case 'p':
10159 switch (name[4])
10160 {
10161 case 'e':
10162 if (name[5] == 'e' &&
10163 name[6] == 'r' &&
10164 name[7] == 'n' &&
10165 name[8] == 'a' &&
10166 name[9] == 'm' &&
10167 name[10] == 'e')
10168 { /* getpeername */
10169 return -KEY_getpeername;
10170 }
10171
10172 goto unknown;
10173
10174 case 'r':
10175 switch (name[5])
10176 {
10177 case 'i':
10178 if (name[6] == 'o' &&
10179 name[7] == 'r' &&
10180 name[8] == 'i' &&
10181 name[9] == 't' &&
10182 name[10] == 'y')
10183 { /* getpriority */
10184 return -KEY_getpriority;
10185 }
10186
10187 goto unknown;
10188
10189 case 'o':
10190 if (name[6] == 't' &&
10191 name[7] == 'o' &&
10192 name[8] == 'e' &&
10193 name[9] == 'n' &&
10194 name[10] == 't')
10195 { /* getprotoent */
10196 return -KEY_getprotoent;
10197 }
10198
10199 goto unknown;
10200
10201 default:
10202 goto unknown;
10203 }
10204
10205 default:
10206 goto unknown;
10207 }
10208
10209 case 's':
10210 if (name[4] == 'o' &&
10211 name[5] == 'c' &&
10212 name[6] == 'k' &&
10213 name[7] == 'n' &&
10214 name[8] == 'a' &&
10215 name[9] == 'm' &&
10216 name[10] == 'e')
10217 { /* getsockname */
10218 return -KEY_getsockname;
10219 }
10220
10221 goto unknown;
10222
10223 default:
10224 goto unknown;
10225 }
10226 }
10227
10228 goto unknown;
10229
10230 case 's':
10231 if (name[1] == 'e' &&
10232 name[2] == 't' &&
10233 name[3] == 'p' &&
10234 name[4] == 'r')
10235 {
10236 switch (name[5])
10237 {
10238 case 'i':
10239 if (name[6] == 'o' &&
10240 name[7] == 'r' &&
10241 name[8] == 'i' &&
10242 name[9] == 't' &&
10243 name[10] == 'y')
10244 { /* setpriority */
10245 return -KEY_setpriority;
10246 }
10247
10248 goto unknown;
10249
10250 case 'o':
10251 if (name[6] == 't' &&
10252 name[7] == 'o' &&
10253 name[8] == 'e' &&
10254 name[9] == 'n' &&
10255 name[10] == 't')
10256 { /* setprotoent */
10257 return -KEY_setprotoent;
10258 }
10259
10260 goto unknown;
10261
10262 default:
10263 goto unknown;
10264 }
10265 }
10266
10267 goto unknown;
10268
10269 default:
10270 goto unknown;
e2e1dd5a 10271 }
4c3bbe0f
MHM
10272
10273 case 12: /* 2 tokens of length 12 */
10274 if (name[0] == 'g' &&
10275 name[1] == 'e' &&
10276 name[2] == 't' &&
10277 name[3] == 'n' &&
10278 name[4] == 'e' &&
10279 name[5] == 't' &&
10280 name[6] == 'b' &&
10281 name[7] == 'y')
10282 {
10283 switch (name[8])
10284 {
10285 case 'a':
10286 if (name[9] == 'd' &&
10287 name[10] == 'd' &&
10288 name[11] == 'r')
10289 { /* getnetbyaddr */
10290 return -KEY_getnetbyaddr;
10291 }
10292
10293 goto unknown;
10294
10295 case 'n':
10296 if (name[9] == 'a' &&
10297 name[10] == 'm' &&
10298 name[11] == 'e')
10299 { /* getnetbyname */
10300 return -KEY_getnetbyname;
10301 }
10302
10303 goto unknown;
10304
10305 default:
10306 goto unknown;
10307 }
e2e1dd5a 10308 }
4c3bbe0f
MHM
10309
10310 goto unknown;
10311
10312 case 13: /* 4 tokens of length 13 */
10313 if (name[0] == 'g' &&
10314 name[1] == 'e' &&
10315 name[2] == 't')
10316 {
10317 switch (name[3])
10318 {
10319 case 'h':
10320 if (name[4] == 'o' &&
10321 name[5] == 's' &&
10322 name[6] == 't' &&
10323 name[7] == 'b' &&
10324 name[8] == 'y')
10325 {
10326 switch (name[9])
10327 {
10328 case 'a':
10329 if (name[10] == 'd' &&
10330 name[11] == 'd' &&
10331 name[12] == 'r')
10332 { /* gethostbyaddr */
10333 return -KEY_gethostbyaddr;
10334 }
10335
10336 goto unknown;
10337
10338 case 'n':
10339 if (name[10] == 'a' &&
10340 name[11] == 'm' &&
10341 name[12] == 'e')
10342 { /* gethostbyname */
10343 return -KEY_gethostbyname;
10344 }
10345
10346 goto unknown;
10347
10348 default:
10349 goto unknown;
10350 }
10351 }
10352
10353 goto unknown;
10354
10355 case 's':
10356 if (name[4] == 'e' &&
10357 name[5] == 'r' &&
10358 name[6] == 'v' &&
10359 name[7] == 'b' &&
10360 name[8] == 'y')
10361 {
10362 switch (name[9])
10363 {
10364 case 'n':
10365 if (name[10] == 'a' &&
10366 name[11] == 'm' &&
10367 name[12] == 'e')
10368 { /* getservbyname */
10369 return -KEY_getservbyname;
10370 }
10371
10372 goto unknown;
10373
10374 case 'p':
10375 if (name[10] == 'o' &&
10376 name[11] == 'r' &&
10377 name[12] == 't')
10378 { /* getservbyport */
10379 return -KEY_getservbyport;
10380 }
10381
10382 goto unknown;
10383
10384 default:
10385 goto unknown;
10386 }
10387 }
10388
10389 goto unknown;
10390
10391 default:
10392 goto unknown;
10393 }
e2e1dd5a 10394 }
4c3bbe0f
MHM
10395
10396 goto unknown;
10397
10398 case 14: /* 1 tokens of length 14 */
10399 if (name[0] == 'g' &&
10400 name[1] == 'e' &&
10401 name[2] == 't' &&
10402 name[3] == 'p' &&
10403 name[4] == 'r' &&
10404 name[5] == 'o' &&
10405 name[6] == 't' &&
10406 name[7] == 'o' &&
10407 name[8] == 'b' &&
10408 name[9] == 'y' &&
10409 name[10] == 'n' &&
10410 name[11] == 'a' &&
10411 name[12] == 'm' &&
10412 name[13] == 'e')
10413 { /* getprotobyname */
10414 return -KEY_getprotobyname;
10415 }
10416
10417 goto unknown;
10418
10419 case 16: /* 1 tokens of length 16 */
10420 if (name[0] == 'g' &&
10421 name[1] == 'e' &&
10422 name[2] == 't' &&
10423 name[3] == 'p' &&
10424 name[4] == 'r' &&
10425 name[5] == 'o' &&
10426 name[6] == 't' &&
10427 name[7] == 'o' &&
10428 name[8] == 'b' &&
10429 name[9] == 'y' &&
10430 name[10] == 'n' &&
10431 name[11] == 'u' &&
10432 name[12] == 'm' &&
10433 name[13] == 'b' &&
10434 name[14] == 'e' &&
10435 name[15] == 'r')
10436 { /* getprotobynumber */
10437 return -KEY_getprotobynumber;
10438 }
10439
10440 goto unknown;
10441
10442 default:
10443 goto unknown;
e2e1dd5a 10444 }
4c3bbe0f
MHM
10445
10446unknown:
e2e1dd5a 10447 return 0;
a687059c
LW
10448}
10449
76e3520e 10450STATIC void
c94115d8 10451S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
a687059c 10452{
97aff369 10453 dVAR;
2f3197b3 10454
d008e5eb 10455 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
10456 if (ckWARN(WARN_SYNTAX)) {
10457 int level = 1;
26ff0806 10458 const char *w;
d008e5eb
GS
10459 for (w = s+2; *w && level; w++) {
10460 if (*w == '(')
10461 ++level;
10462 else if (*w == ')')
10463 --level;
10464 }
888fea98
NC
10465 while (isSPACE(*w))
10466 ++w;
b1439985
RGS
10467 /* the list of chars below is for end of statements or
10468 * block / parens, boolean operators (&&, ||, //) and branch
10469 * constructs (or, and, if, until, unless, while, err, for).
10470 * Not a very solid hack... */
10471 if (!*w || !strchr(";&/|})]oaiuwef!=", *w))
9014280d 10472 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 10473 "%s (...) interpreted as function",name);
d008e5eb 10474 }
2f3197b3 10475 }
3280af22 10476 while (s < PL_bufend && isSPACE(*s))
2f3197b3 10477 s++;
a687059c
LW
10478 if (*s == '(')
10479 s++;
3280af22 10480 while (s < PL_bufend && isSPACE(*s))
a687059c 10481 s++;
7e2040f0 10482 if (isIDFIRST_lazy_if(s,UTF)) {
26ff0806 10483 const char * const w = s++;
7e2040f0 10484 while (isALNUM_lazy_if(s,UTF))
a687059c 10485 s++;
3280af22 10486 while (s < PL_bufend && isSPACE(*s))
a687059c 10487 s++;
e929a76b 10488 if (*s == ',') {
c94115d8 10489 GV* gv;
5458a98a 10490 if (keyword(w, s - w, 0))
e929a76b 10491 return;
c94115d8
NC
10492
10493 gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
10494 if (gv && GvCVu(gv))
abbb3198 10495 return;
cea2e8a9 10496 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
10497 }
10498 }
10499}
10500
423cee85
JH
10501/* Either returns sv, or mortalizes sv and returns a new SV*.
10502 Best used as sv=new_constant(..., sv, ...).
10503 If s, pv are NULL, calls subroutine with one argument,
10504 and type is used with error messages only. */
10505
b3ac6de7 10506STATIC SV *
7fc63493 10507S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9b0e499b 10508 const char *type)
b3ac6de7 10509{
27da23d5 10510 dVAR; dSP;
890ce7af 10511 HV * const table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 10512 SV *res;
b3ac6de7
IZ
10513 SV **cvp;
10514 SV *cv, *typesv;
89e33a05 10515 const char *why1 = "", *why2 = "", *why3 = "";
4e553d73 10516
f0af216f 10517 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
10518 SV *msg;
10519
10edeb5d
JH
10520 why2 = (const char *)
10521 (strEQ(key,"charnames")
10522 ? "(possibly a missing \"use charnames ...\")"
10523 : "");
4e553d73 10524 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
10525 (type ? type: "undef"), why2);
10526
10527 /* This is convoluted and evil ("goto considered harmful")
10528 * but I do not understand the intricacies of all the different
10529 * failure modes of %^H in here. The goal here is to make
10530 * the most probable error message user-friendly. --jhi */
10531
10532 goto msgdone;
10533
423cee85 10534 report:
4e553d73 10535 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 10536 (type ? type: "undef"), why1, why2, why3);
41ab332f 10537 msgdone:
95a20fc0 10538 yyerror(SvPVX_const(msg));
423cee85
JH
10539 SvREFCNT_dec(msg);
10540 return sv;
10541 }
b3ac6de7
IZ
10542 cvp = hv_fetch(table, key, strlen(key), FALSE);
10543 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
10544 why1 = "$^H{";
10545 why2 = key;
f0af216f 10546 why3 = "} is not defined";
423cee85 10547 goto report;
b3ac6de7
IZ
10548 }
10549 sv_2mortal(sv); /* Parent created it permanently */
10550 cv = *cvp;
423cee85
JH
10551 if (!pv && s)
10552 pv = sv_2mortal(newSVpvn(s, len));
10553 if (type && pv)
10554 typesv = sv_2mortal(newSVpv(type, 0));
b3ac6de7 10555 else
423cee85 10556 typesv = &PL_sv_undef;
4e553d73 10557
e788e7d3 10558 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
10559 ENTER ;
10560 SAVETMPS;
4e553d73 10561
423cee85 10562 PUSHMARK(SP) ;
a5845cb7 10563 EXTEND(sp, 3);
423cee85
JH
10564 if (pv)
10565 PUSHs(pv);
b3ac6de7 10566 PUSHs(sv);
423cee85
JH
10567 if (pv)
10568 PUSHs(typesv);
b3ac6de7 10569 PUTBACK;
423cee85 10570 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 10571
423cee85 10572 SPAGAIN ;
4e553d73 10573
423cee85 10574 /* Check the eval first */
9b0e499b 10575 if (!PL_in_eval && SvTRUE(ERRSV)) {
396482e1 10576 sv_catpvs(ERRSV, "Propagated");
8b6b16e7 10577 yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
e1f15930 10578 (void)POPs;
b37c2d43 10579 res = SvREFCNT_inc_simple(sv);
423cee85
JH
10580 }
10581 else {
10582 res = POPs;
b37c2d43 10583 SvREFCNT_inc_simple_void(res);
423cee85 10584 }
4e553d73 10585
423cee85
JH
10586 PUTBACK ;
10587 FREETMPS ;
10588 LEAVE ;
b3ac6de7 10589 POPSTACK;
4e553d73 10590
b3ac6de7 10591 if (!SvOK(res)) {
423cee85
JH
10592 why1 = "Call to &{$^H{";
10593 why2 = key;
f0af216f 10594 why3 = "}} did not return a defined value";
423cee85
JH
10595 sv = res;
10596 goto report;
9b0e499b 10597 }
423cee85 10598
9b0e499b 10599 return res;
b3ac6de7 10600}
4e553d73 10601
d0a148a6
NC
10602/* Returns a NUL terminated string, with the length of the string written to
10603 *slp
10604 */
76e3520e 10605STATIC char *
cea2e8a9 10606S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2 10607{
97aff369 10608 dVAR;
463ee0b2 10609 register char *d = dest;
890ce7af 10610 register char * const e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 10611 for (;;) {
8903cb82 10612 if (d >= e)
cea2e8a9 10613 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10614 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10615 *d++ = *s++;
c35e046a 10616 else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10617 *d++ = ':';
10618 *d++ = ':';
10619 s++;
10620 }
c35e046a 10621 else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
463ee0b2
LW
10622 *d++ = *s++;
10623 *d++ = *s++;
10624 }
fd400ab9 10625 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10626 char *t = s + UTF8SKIP(s);
c35e046a 10627 size_t len;
fd400ab9 10628 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3 10629 t += UTF8SKIP(t);
c35e046a
AL
10630 len = t - s;
10631 if (d + len > e)
cea2e8a9 10632 Perl_croak(aTHX_ ident_too_long);
c35e046a
AL
10633 Copy(s, d, len, char);
10634 d += len;
a0ed51b3
LW
10635 s = t;
10636 }
463ee0b2
LW
10637 else {
10638 *d = '\0';
10639 *slp = d - dest;
10640 return s;
e929a76b 10641 }
378cc40b
LW
10642 }
10643}
10644
76e3520e 10645STATIC char *
f54cb97a 10646S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b 10647{
97aff369 10648 dVAR;
6136c704 10649 char *bracket = NULL;
748a9306 10650 char funny = *s++;
6136c704
AL
10651 register char *d = dest;
10652 register char * const e = d + destlen + 3; /* two-character token, ending NUL */
378cc40b 10653
a0d0e21e 10654 if (isSPACE(*s))
29595ff2 10655 s = PEEKSPACE(s);
de3bb511 10656 if (isDIGIT(*s)) {
8903cb82 10657 while (isDIGIT(*s)) {
10658 if (d >= e)
cea2e8a9 10659 Perl_croak(aTHX_ ident_too_long);
378cc40b 10660 *d++ = *s++;
8903cb82 10661 }
378cc40b
LW
10662 }
10663 else {
463ee0b2 10664 for (;;) {
8903cb82 10665 if (d >= e)
cea2e8a9 10666 Perl_croak(aTHX_ ident_too_long);
834a4ddd 10667 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 10668 *d++ = *s++;
7e2040f0 10669 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
10670 *d++ = ':';
10671 *d++ = ':';
10672 s++;
10673 }
a0d0e21e 10674 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
10675 *d++ = *s++;
10676 *d++ = *s++;
10677 }
fd400ab9 10678 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 10679 char *t = s + UTF8SKIP(s);
fd400ab9 10680 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
10681 t += UTF8SKIP(t);
10682 if (d + (t - s) > e)
cea2e8a9 10683 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
10684 Copy(s, d, t - s, char);
10685 d += t - s;
10686 s = t;
10687 }
463ee0b2
LW
10688 else
10689 break;
10690 }
378cc40b
LW
10691 }
10692 *d = '\0';
10693 d = dest;
79072805 10694 if (*d) {
3280af22
NIS
10695 if (PL_lex_state != LEX_NORMAL)
10696 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 10697 return s;
378cc40b 10698 }
748a9306 10699 if (*s == '$' && s[1] &&
3792a11b 10700 (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
5cd24f17 10701 {
4810e5ec 10702 return s;
5cd24f17 10703 }
79072805
LW
10704 if (*s == '{') {
10705 bracket = s;
10706 s++;
10707 }
10708 else if (ck_uni)
10709 check_uni();
93a17b20 10710 if (s < send)
79072805
LW
10711 *d = *s++;
10712 d[1] = '\0';
2b92dfce 10713 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 10714 *d = toCTRL(*s);
10715 s++;
de3bb511 10716 }
79072805 10717 if (bracket) {
748a9306 10718 if (isSPACE(s[-1])) {
fa83b5b6 10719 while (s < send) {
f54cb97a 10720 const char ch = *s++;
bf4acbe4 10721 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 10722 *d = ch;
10723 break;
10724 }
10725 }
748a9306 10726 }
7e2040f0 10727 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 10728 d++;
a0ed51b3 10729 if (UTF) {
6136c704
AL
10730 char *end = s;
10731 while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
10732 end += UTF8SKIP(end);
10733 while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
10734 end += UTF8SKIP(end);
a0ed51b3 10735 }
6136c704
AL
10736 Copy(s, d, end - s, char);
10737 d += end - s;
10738 s = end;
a0ed51b3
LW
10739 }
10740 else {
2b92dfce 10741 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 10742 *d++ = *s++;
2b92dfce 10743 if (d >= e)
cea2e8a9 10744 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 10745 }
79072805 10746 *d = '\0';
c35e046a
AL
10747 while (s < send && SPACE_OR_TAB(*s))
10748 s++;
ff68c719 10749 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
5458a98a 10750 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest, 0)) {
10edeb5d
JH
10751 const char * const brack =
10752 (const char *)
10753 ((*s == '[') ? "[...]" : "{...}");
9014280d 10754 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 10755 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
10756 funny, dest, brack, funny, dest, brack);
10757 }
79072805 10758 bracket++;
a0be28da 10759 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
10760 return s;
10761 }
4e553d73
NIS
10762 }
10763 /* Handle extended ${^Foo} variables
2b92dfce
GS
10764 * 1999-02-27 mjd-perl-patch@plover.com */
10765 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
10766 && isALNUM(*s))
10767 {
10768 d++;
10769 while (isALNUM(*s) && d < e) {
10770 *d++ = *s++;
10771 }
10772 if (d >= e)
cea2e8a9 10773 Perl_croak(aTHX_ ident_too_long);
2b92dfce 10774 *d = '\0';
79072805
LW
10775 }
10776 if (*s == '}') {
10777 s++;
7df0d042 10778 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 10779 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
10780 PL_expect = XREF;
10781 }
d008e5eb 10782 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 10783 if (ckWARN(WARN_AMBIGUOUS) &&
780a5241
NC
10784 (keyword(dest, d - dest, 0)
10785 || get_cvn_flags(dest, d - dest, 0)))
d008e5eb 10786 {
c35e046a
AL
10787 if (funny == '#')
10788 funny = '@';
9014280d 10789 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
10790 "Ambiguous use of %c{%s} resolved to %c%s",
10791 funny, dest, funny, dest);
10792 }
10793 }
79072805
LW
10794 }
10795 else {
10796 s = bracket; /* let the parser handle it */
93a17b20 10797 *dest = '\0';
79072805
LW
10798 }
10799 }
3280af22
NIS
10800 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
10801 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
10802 return s;
10803}
10804
cea2e8a9 10805void
2b36a5a0 10806Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 10807{
96a5add6 10808 PERL_UNUSED_CONTEXT;
cde0cee5
YO
10809 if (ch<256) {
10810 char c = (char)ch;
10811 switch (c) {
10812 CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl);
a20207d7
YO
10813 case GLOBAL_PAT_MOD: *pmfl |= PMf_GLOBAL; break;
10814 case CONTINUE_PAT_MOD: *pmfl |= PMf_CONTINUE; break;
10815 case ONCE_PAT_MOD: *pmfl |= PMf_KEEP; break;
10816 case KEEPCOPY_PAT_MOD: *pmfl |= PMf_KEEPCOPY; break;
cde0cee5
YO
10817 }
10818 }
a0d0e21e 10819}
378cc40b 10820
76e3520e 10821STATIC char *
cea2e8a9 10822S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 10823{
97aff369 10824 dVAR;
79072805 10825 PMOP *pm;
5db06880 10826 char *s = scan_str(start,!!PL_madskills,FALSE);
10edeb5d 10827 const char * const valid_flags =
a20207d7 10828 (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS);
5db06880
NC
10829#ifdef PERL_MAD
10830 char *modstart;
10831#endif
10832
378cc40b 10833
25c09cbf 10834 if (!s) {
6136c704 10835 const char * const delimiter = skipspace(start);
10edeb5d
JH
10836 Perl_croak(aTHX_
10837 (const char *)
10838 (*delimiter == '?'
10839 ? "Search pattern not terminated or ternary operator parsed as search pattern"
10840 : "Search pattern not terminated" ));
25c09cbf 10841 }
bbce6d69 10842
8782bef2 10843 pm = (PMOP*)newPMOP(type, 0);
ad639bfb
NC
10844 if (PL_multi_open == '?') {
10845 /* This is the only point in the code that sets PMf_ONCE: */
79072805 10846 pm->op_pmflags |= PMf_ONCE;
ad639bfb
NC
10847
10848 /* Hence it's safe to do this bit of PMOP book-keeping here, which
10849 allows us to restrict the list needed by reset to just the ??
10850 matches. */
10851 assert(type != OP_TRANS);
10852 if (PL_curstash) {
10853 MAGIC *mg = mg_find((SV*)PL_curstash, PERL_MAGIC_symtab);
10854 U32 elements;
10855 if (!mg) {
10856 mg = sv_magicext((SV*)PL_curstash, 0, PERL_MAGIC_symtab, 0, 0,
10857 0);
10858 }
10859 elements = mg->mg_len / sizeof(PMOP**);
10860 Renewc(mg->mg_ptr, elements + 1, PMOP*, char);
10861 ((PMOP**)mg->mg_ptr) [elements++] = pm;
10862 mg->mg_len = elements * sizeof(PMOP**);
10863 PmopSTASH_set(pm,PL_curstash);
10864 }
10865 }
5db06880
NC
10866#ifdef PERL_MAD
10867 modstart = s;
10868#endif
6136c704
AL
10869 while (*s && strchr(valid_flags, *s))
10870 pmflag(&pm->op_pmflags,*s++);
5db06880
NC
10871#ifdef PERL_MAD
10872 if (PL_madskills && modstart != s) {
10873 SV* tmptoken = newSVpvn(modstart, s - modstart);
10874 append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0);
10875 }
10876#endif
4ac733c9 10877 /* issue a warning if /c is specified,but /g is not */
041457d9
DM
10878 if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
10879 && ckWARN(WARN_REGEXP))
4ac733c9 10880 {
a20207d7
YO
10881 Perl_warner(aTHX_ packWARN(WARN_REGEXP),
10882 "Use of /c modifier is meaningless without /g" );
4ac733c9
MJD
10883 }
10884
3280af22 10885 PL_lex_op = (OP*)pm;
79072805 10886 yylval.ival = OP_MATCH;
378cc40b
LW
10887 return s;
10888}
10889
76e3520e 10890STATIC char *
cea2e8a9 10891S_scan_subst(pTHX_ char *start)
79072805 10892{
27da23d5 10893 dVAR;
a0d0e21e 10894 register char *s;
79072805 10895 register PMOP *pm;
4fdae800 10896 I32 first_start;
79072805 10897 I32 es = 0;
5db06880
NC
10898#ifdef PERL_MAD
10899 char *modstart;
10900#endif
79072805 10901
79072805
LW
10902 yylval.ival = OP_NULL;
10903
5db06880 10904 s = scan_str(start,!!PL_madskills,FALSE);
79072805 10905
37fd879b 10906 if (!s)
cea2e8a9 10907 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 10908
3280af22 10909 if (s[-1] == PL_multi_open)
79072805 10910 s--;
5db06880
NC
10911#ifdef PERL_MAD
10912 if (PL_madskills) {
cd81e915
NC
10913 CURMAD('q', PL_thisopen);
10914 CURMAD('_', PL_thiswhite);
10915 CURMAD('E', PL_thisstuff);
10916 CURMAD('Q', PL_thisclose);
10917 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
10918 }
10919#endif
79072805 10920
3280af22 10921 first_start = PL_multi_start;
5db06880 10922 s = scan_str(s,!!PL_madskills,FALSE);
79072805 10923 if (!s) {
37fd879b 10924 if (PL_lex_stuff) {
3280af22 10925 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 10926 PL_lex_stuff = NULL;
37fd879b 10927 }
cea2e8a9 10928 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 10929 }
3280af22 10930 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 10931
79072805 10932 pm = (PMOP*)newPMOP(OP_SUBST, 0);
5db06880
NC
10933
10934#ifdef PERL_MAD
10935 if (PL_madskills) {
cd81e915
NC
10936 CURMAD('z', PL_thisopen);
10937 CURMAD('R', PL_thisstuff);
10938 CURMAD('Z', PL_thisclose);
5db06880
NC
10939 }
10940 modstart = s;
10941#endif
10942
48c036b1 10943 while (*s) {
a20207d7 10944 if (*s == EXEC_PAT_MOD) {
a687059c 10945 s++;
2f3197b3 10946 es++;
a687059c 10947 }
a20207d7 10948 else if (strchr(S_PAT_MODS, *s))
a0d0e21e 10949 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
10950 else
10951 break;
378cc40b 10952 }
79072805 10953
5db06880
NC
10954#ifdef PERL_MAD
10955 if (PL_madskills) {
10956 if (modstart != s)
10957 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
10958 append_madprops(PL_thismad, (OP*)pm, 0);
10959 PL_thismad = 0;
5db06880
NC
10960 }
10961#endif
0bd48802
AL
10962 if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP)) {
10963 Perl_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
4ac733c9
MJD
10964 }
10965
79072805 10966 if (es) {
6136c704
AL
10967 SV * const repl = newSVpvs("");
10968
0244c3a4
GS
10969 PL_sublex_info.super_bufptr = s;
10970 PL_sublex_info.super_bufend = PL_bufend;
10971 PL_multi_end = 0;
79072805 10972 pm->op_pmflags |= PMf_EVAL;
463ee0b2 10973 while (es-- > 0)
10edeb5d 10974 sv_catpv(repl, (const char *)(es ? "eval " : "do "));
6f43d98f 10975 sv_catpvs(repl, "{");
3280af22 10976 sv_catsv(repl, PL_lex_repl);
9badc361
RGS
10977 if (strchr(SvPVX(PL_lex_repl), '#'))
10978 sv_catpvs(repl, "\n");
10979 sv_catpvs(repl, "}");
25da4f38 10980 SvEVALED_on(repl);
3280af22
NIS
10981 SvREFCNT_dec(PL_lex_repl);
10982 PL_lex_repl = repl;
378cc40b 10983 }
79072805 10984
3280af22 10985 PL_lex_op = (OP*)pm;
79072805 10986 yylval.ival = OP_SUBST;
378cc40b
LW
10987 return s;
10988}
10989
76e3520e 10990STATIC char *
cea2e8a9 10991S_scan_trans(pTHX_ char *start)
378cc40b 10992{
97aff369 10993 dVAR;
a0d0e21e 10994 register char* s;
11343788 10995 OP *o;
79072805
LW
10996 short *tbl;
10997 I32 squash;
a0ed51b3 10998 I32 del;
79072805 10999 I32 complement;
5db06880
NC
11000#ifdef PERL_MAD
11001 char *modstart;
11002#endif
79072805
LW
11003
11004 yylval.ival = OP_NULL;
11005
5db06880 11006 s = scan_str(start,!!PL_madskills,FALSE);
37fd879b 11007 if (!s)
cea2e8a9 11008 Perl_croak(aTHX_ "Transliteration pattern not terminated");
5db06880 11009
3280af22 11010 if (s[-1] == PL_multi_open)
2f3197b3 11011 s--;
5db06880
NC
11012#ifdef PERL_MAD
11013 if (PL_madskills) {
cd81e915
NC
11014 CURMAD('q', PL_thisopen);
11015 CURMAD('_', PL_thiswhite);
11016 CURMAD('E', PL_thisstuff);
11017 CURMAD('Q', PL_thisclose);
11018 PL_realtokenstart = s - SvPVX(PL_linestr);
5db06880
NC
11019 }
11020#endif
2f3197b3 11021
5db06880 11022 s = scan_str(s,!!PL_madskills,FALSE);
79072805 11023 if (!s) {
37fd879b 11024 if (PL_lex_stuff) {
3280af22 11025 SvREFCNT_dec(PL_lex_stuff);
a0714e2c 11026 PL_lex_stuff = NULL;
37fd879b 11027 }
cea2e8a9 11028 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 11029 }
5db06880 11030 if (PL_madskills) {
cd81e915
NC
11031 CURMAD('z', PL_thisopen);
11032 CURMAD('R', PL_thisstuff);
11033 CURMAD('Z', PL_thisclose);
5db06880 11034 }
79072805 11035
a0ed51b3 11036 complement = del = squash = 0;
5db06880
NC
11037#ifdef PERL_MAD
11038 modstart = s;
11039#endif
7a1e2023
NC
11040 while (1) {
11041 switch (*s) {
11042 case 'c':
79072805 11043 complement = OPpTRANS_COMPLEMENT;
7a1e2023
NC
11044 break;
11045 case 'd':
a0ed51b3 11046 del = OPpTRANS_DELETE;
7a1e2023
NC
11047 break;
11048 case 's':
79072805 11049 squash = OPpTRANS_SQUASH;
7a1e2023
NC
11050 break;
11051 default:
11052 goto no_more;
11053 }
395c3793
LW
11054 s++;
11055 }
7a1e2023 11056 no_more:
8973db79 11057
aa1f7c5b 11058 tbl = (short *)PerlMemShared_calloc(complement&&!del?258:256, sizeof(short));
8973db79 11059 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
11060 o->op_private &= ~OPpTRANS_ALL;
11061 o->op_private |= del|squash|complement|
7948272d
NIS
11062 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
11063 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 11064
3280af22 11065 PL_lex_op = o;
79072805 11066 yylval.ival = OP_TRANS;
5db06880
NC
11067
11068#ifdef PERL_MAD
11069 if (PL_madskills) {
11070 if (modstart != s)
11071 curmad('m', newSVpvn(modstart, s - modstart));
cd81e915
NC
11072 append_madprops(PL_thismad, o, 0);
11073 PL_thismad = 0;
5db06880
NC
11074 }
11075#endif
11076
79072805
LW
11077 return s;
11078}
11079
76e3520e 11080STATIC char *
cea2e8a9 11081S_scan_heredoc(pTHX_ register char *s)
79072805 11082{
97aff369 11083 dVAR;
79072805
LW
11084 SV *herewas;
11085 I32 op_type = OP_SCALAR;
11086 I32 len;
11087 SV *tmpstr;
11088 char term;
73d840c0 11089 const char *found_newline;
79072805 11090 register char *d;
fc36a67e 11091 register char *e;
4633a7c4 11092 char *peek;
f54cb97a 11093 const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
5db06880
NC
11094#ifdef PERL_MAD
11095 I32 stuffstart = s - SvPVX(PL_linestr);
11096 char *tstart;
11097
cd81e915 11098 PL_realtokenstart = -1;
5db06880 11099#endif
79072805
LW
11100
11101 s += 2;
3280af22
NIS
11102 d = PL_tokenbuf;
11103 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 11104 if (!outer)
79072805 11105 *d++ = '\n';
c35e046a
AL
11106 peek = s;
11107 while (SPACE_OR_TAB(*peek))
11108 peek++;
3792a11b 11109 if (*peek == '`' || *peek == '\'' || *peek =='"') {
4633a7c4 11110 s = peek;
79072805 11111 term = *s++;
3280af22 11112 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 11113 d += len;
3280af22 11114 if (s < PL_bufend)
79072805 11115 s++;
79072805
LW
11116 }
11117 else {
11118 if (*s == '\\')
11119 s++, term = '\'';
11120 else
11121 term = '"';
7e2040f0 11122 if (!isALNUM_lazy_if(s,UTF))
12bcd1a6 11123 deprecate_old("bare << to mean <<\"\"");
7e2040f0 11124 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 11125 if (d < e)
11126 *d++ = *s;
11127 }
11128 }
3280af22 11129 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 11130 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
11131 *d++ = '\n';
11132 *d = '\0';
3280af22 11133 len = d - PL_tokenbuf;
5db06880
NC
11134
11135#ifdef PERL_MAD
11136 if (PL_madskills) {
11137 tstart = PL_tokenbuf + !outer;
cd81e915 11138 PL_thisclose = newSVpvn(tstart, len - !outer);
5db06880 11139 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915 11140 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11141 stuffstart = s - SvPVX(PL_linestr);
11142 }
11143#endif
6a27c188 11144#ifndef PERL_STRICT_CR
f63a84b2
LW
11145 d = strchr(s, '\r');
11146 if (d) {
b464bac0 11147 char * const olds = s;
f63a84b2 11148 s = d;
3280af22 11149 while (s < PL_bufend) {
f63a84b2
LW
11150 if (*s == '\r') {
11151 *d++ = '\n';
11152 if (*++s == '\n')
11153 s++;
11154 }
11155 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
11156 *d++ = *s++;
11157 s++;
11158 }
11159 else
11160 *d++ = *s++;
11161 }
11162 *d = '\0';
3280af22 11163 PL_bufend = d;
95a20fc0 11164 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2
LW
11165 s = olds;
11166 }
11167#endif
5db06880
NC
11168#ifdef PERL_MAD
11169 found_newline = 0;
11170#endif
10edeb5d 11171 if ( outer || !(found_newline = (char*)memchr((void*)s, '\n', PL_bufend - s)) ) {
73d840c0
AL
11172 herewas = newSVpvn(s,PL_bufend-s);
11173 }
11174 else {
5db06880
NC
11175#ifdef PERL_MAD
11176 herewas = newSVpvn(s-1,found_newline-s+1);
11177#else
73d840c0
AL
11178 s--;
11179 herewas = newSVpvn(s,found_newline-s);
5db06880 11180#endif
73d840c0 11181 }
5db06880
NC
11182#ifdef PERL_MAD
11183 if (PL_madskills) {
11184 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11185 if (PL_thisstuff)
11186 sv_catpvn(PL_thisstuff, tstart, s - tstart);
5db06880 11187 else
cd81e915 11188 PL_thisstuff = newSVpvn(tstart, s - tstart);
5db06880
NC
11189 }
11190#endif
79072805 11191 s += SvCUR(herewas);
748a9306 11192
5db06880
NC
11193#ifdef PERL_MAD
11194 stuffstart = s - SvPVX(PL_linestr);
11195
11196 if (found_newline)
11197 s--;
11198#endif
11199
7d0a29fe
NC
11200 tmpstr = newSV_type(SVt_PVIV);
11201 SvGROW(tmpstr, 80);
748a9306 11202 if (term == '\'') {
79072805 11203 op_type = OP_CONST;
45977657 11204 SvIV_set(tmpstr, -1);
748a9306
LW
11205 }
11206 else if (term == '`') {
79072805 11207 op_type = OP_BACKTICK;
45977657 11208 SvIV_set(tmpstr, '\\');
748a9306 11209 }
79072805
LW
11210
11211 CLINE;
57843af0 11212 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
11213 PL_multi_open = PL_multi_close = '<';
11214 term = *PL_tokenbuf;
0244c3a4 11215 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6136c704
AL
11216 char * const bufptr = PL_sublex_info.super_bufptr;
11217 char * const bufend = PL_sublex_info.super_bufend;
b464bac0 11218 char * const olds = s - SvCUR(herewas);
0244c3a4
GS
11219 s = strchr(bufptr, '\n');
11220 if (!s)
11221 s = bufend;
11222 d = s;
11223 while (s < bufend &&
11224 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
11225 if (*s++ == '\n')
57843af0 11226 CopLINE_inc(PL_curcop);
0244c3a4
GS
11227 }
11228 if (s >= bufend) {
eb160463 11229 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
11230 missingterm(PL_tokenbuf);
11231 }
11232 sv_setpvn(herewas,bufptr,d-bufptr+1);
11233 sv_setpvn(tmpstr,d+1,s-d);
11234 s += len - 1;
11235 sv_catpvn(herewas,s,bufend-s);
95a20fc0 11236 Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
0244c3a4
GS
11237
11238 s = olds;
11239 goto retval;
11240 }
11241 else if (!outer) {
79072805 11242 d = s;
3280af22
NIS
11243 while (s < PL_bufend &&
11244 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 11245 if (*s++ == '\n')
57843af0 11246 CopLINE_inc(PL_curcop);
79072805 11247 }
3280af22 11248 if (s >= PL_bufend) {
eb160463 11249 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11250 missingterm(PL_tokenbuf);
79072805
LW
11251 }
11252 sv_setpvn(tmpstr,d+1,s-d);
5db06880
NC
11253#ifdef PERL_MAD
11254 if (PL_madskills) {
cd81e915
NC
11255 if (PL_thisstuff)
11256 sv_catpvn(PL_thisstuff, d + 1, s - d);
5db06880 11257 else
cd81e915 11258 PL_thisstuff = newSVpvn(d + 1, s - d);
5db06880
NC
11259 stuffstart = s - SvPVX(PL_linestr);
11260 }
11261#endif
79072805 11262 s += len - 1;
57843af0 11263 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 11264
3280af22
NIS
11265 sv_catpvn(herewas,s,PL_bufend-s);
11266 sv_setsv(PL_linestr,herewas);
11267 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
11268 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11269 PL_last_lop = PL_last_uni = NULL;
79072805
LW
11270 }
11271 else
11272 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3280af22 11273 while (s >= PL_bufend) { /* multiple line string? */
5db06880
NC
11274#ifdef PERL_MAD
11275 if (PL_madskills) {
11276 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11277 if (PL_thisstuff)
11278 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11279 else
cd81e915 11280 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11281 }
11282#endif
fd2d0953 11283 if (!outer ||
3280af22 11284 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
eb160463 11285 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 11286 missingterm(PL_tokenbuf);
79072805 11287 }
5db06880
NC
11288#ifdef PERL_MAD
11289 stuffstart = s - SvPVX(PL_linestr);
11290#endif
57843af0 11291 CopLINE_inc(PL_curcop);
3280af22 11292 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11293 PL_last_lop = PL_last_uni = NULL;
6a27c188 11294#ifndef PERL_STRICT_CR
3280af22 11295 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
11296 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
11297 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 11298 {
3280af22
NIS
11299 PL_bufend[-2] = '\n';
11300 PL_bufend--;
95a20fc0 11301 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2 11302 }
3280af22
NIS
11303 else if (PL_bufend[-1] == '\r')
11304 PL_bufend[-1] = '\n';
f63a84b2 11305 }
3280af22
NIS
11306 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
11307 PL_bufend[-1] = '\n';
f63a84b2 11308#endif
80a702cd 11309 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 11310 update_debugger_info(PL_linestr, NULL, 0);
3280af22 11311 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
95a20fc0 11312 STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
1de9afcd 11313 *(SvPVX(PL_linestr) + off ) = ' ';
3280af22
NIS
11314 sv_catsv(PL_linestr,herewas);
11315 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1de9afcd 11316 s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
79072805
LW
11317 }
11318 else {
3280af22
NIS
11319 s = PL_bufend;
11320 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
11321 }
11322 }
79072805 11323 s++;
0244c3a4 11324retval:
57843af0 11325 PL_multi_end = CopLINE(PL_curcop);
79072805 11326 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
1da4ca5f 11327 SvPV_shrink_to_cur(tmpstr);
79072805 11328 }
8990e307 11329 SvREFCNT_dec(herewas);
2f31ce75 11330 if (!IN_BYTES) {
95a20fc0 11331 if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
2f31ce75
JH
11332 SvUTF8_on(tmpstr);
11333 else if (PL_encoding)
11334 sv_recode_to_utf8(tmpstr, PL_encoding);
11335 }
3280af22 11336 PL_lex_stuff = tmpstr;
79072805
LW
11337 yylval.ival = op_type;
11338 return s;
11339}
11340
02aa26ce
NT
11341/* scan_inputsymbol
11342 takes: current position in input buffer
11343 returns: new position in input buffer
11344 side-effects: yylval and lex_op are set.
11345
11346 This code handles:
11347
11348 <> read from ARGV
11349 <FH> read from filehandle
11350 <pkg::FH> read from package qualified filehandle
11351 <pkg'FH> read from package qualified filehandle
11352 <$fh> read from filehandle in $fh
11353 <*.h> filename glob
11354
11355*/
11356
76e3520e 11357STATIC char *
cea2e8a9 11358S_scan_inputsymbol(pTHX_ char *start)
79072805 11359{
97aff369 11360 dVAR;
02aa26ce 11361 register char *s = start; /* current position in buffer */
1b420867 11362 char *end;
79072805
LW
11363 I32 len;
11364
6136c704
AL
11365 char *d = PL_tokenbuf; /* start of temp holding space */
11366 const char * const e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
11367
1b420867
GS
11368 end = strchr(s, '\n');
11369 if (!end)
11370 end = PL_bufend;
11371 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
11372
11373 /* die if we didn't have space for the contents of the <>,
1b420867 11374 or if it didn't end, or if we see a newline
02aa26ce
NT
11375 */
11376
bb7a0f54 11377 if (len >= (I32)sizeof PL_tokenbuf)
cea2e8a9 11378 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 11379 if (s >= end)
cea2e8a9 11380 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 11381
fc36a67e 11382 s++;
02aa26ce
NT
11383
11384 /* check for <$fh>
11385 Remember, only scalar variables are interpreted as filehandles by
11386 this code. Anything more complex (e.g., <$fh{$num}>) will be
11387 treated as a glob() call.
11388 This code makes use of the fact that except for the $ at the front,
11389 a scalar variable and a filehandle look the same.
11390 */
4633a7c4 11391 if (*d == '$' && d[1]) d++;
02aa26ce
NT
11392
11393 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 11394 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 11395 d++;
02aa26ce
NT
11396
11397 /* If we've tried to read what we allow filehandles to look like, and
11398 there's still text left, then it must be a glob() and not a getline.
11399 Use scan_str to pull out the stuff between the <> and treat it
11400 as nothing more than a string.
11401 */
11402
3280af22 11403 if (d - PL_tokenbuf != len) {
79072805
LW
11404 yylval.ival = OP_GLOB;
11405 set_csh();
5db06880 11406 s = scan_str(start,!!PL_madskills,FALSE);
79072805 11407 if (!s)
cea2e8a9 11408 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
11409 return s;
11410 }
395c3793 11411 else {
9b3023bc 11412 bool readline_overriden = FALSE;
6136c704 11413 GV *gv_readline;
9b3023bc 11414 GV **gvp;
02aa26ce 11415 /* we're in a filehandle read situation */
3280af22 11416 d = PL_tokenbuf;
02aa26ce
NT
11417
11418 /* turn <> into <ARGV> */
79072805 11419 if (!len)
689badd5 11420 Copy("ARGV",d,5,char);
02aa26ce 11421
9b3023bc 11422 /* Check whether readline() is overriden */
fafc274c 11423 gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
6136c704 11424 if ((gv_readline
ba979b31 11425 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 11426 ||
017a3ce5 11427 ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
9e0d86f8 11428 && (gv_readline = *gvp) && isGV_with_GP(gv_readline)
ba979b31 11429 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
11430 readline_overriden = TRUE;
11431
02aa26ce
NT
11432 /* if <$fh>, create the ops to turn the variable into a
11433 filehandle
11434 */
79072805 11435 if (*d == '$') {
02aa26ce
NT
11436 /* try to find it in the pad for this block, otherwise find
11437 add symbol table ops
11438 */
bbd11bfc
AL
11439 const PADOFFSET tmp = pad_findmy(d);
11440 if (tmp != NOT_IN_PAD) {
00b1698f 11441 if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
6136c704
AL
11442 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
11443 HEK * const stashname = HvNAME_HEK(stash);
11444 SV * const sym = sv_2mortal(newSVhek(stashname));
396482e1 11445 sv_catpvs(sym, "::");
f558d5af
JH
11446 sv_catpv(sym, d+1);
11447 d = SvPVX(sym);
11448 goto intro_sym;
11449 }
11450 else {
6136c704 11451 OP * const o = newOP(OP_PADSV, 0);
f558d5af 11452 o->op_targ = tmp;
9b3023bc
RGS
11453 PL_lex_op = readline_overriden
11454 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11455 append_elem(OP_LIST, o,
11456 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
11457 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 11458 }
a0d0e21e
LW
11459 }
11460 else {
f558d5af
JH
11461 GV *gv;
11462 ++d;
11463intro_sym:
11464 gv = gv_fetchpv(d,
11465 (PL_in_eval
11466 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 11467 : GV_ADDMULTI),
f558d5af 11468 SVt_PV);
9b3023bc
RGS
11469 PL_lex_op = readline_overriden
11470 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11471 append_elem(OP_LIST,
11472 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
11473 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11474 : (OP*)newUNOP(OP_READLINE, 0,
11475 newUNOP(OP_RV2SV, 0,
11476 newGVOP(OP_GV, 0, gv)));
a0d0e21e 11477 }
7c6fadd6
RGS
11478 if (!readline_overriden)
11479 PL_lex_op->op_flags |= OPf_SPECIAL;
f5284f61 11480 /* we created the ops in PL_lex_op, so make yylval.ival a null op */
79072805
LW
11481 yylval.ival = OP_NULL;
11482 }
02aa26ce
NT
11483
11484 /* If it's none of the above, it must be a literal filehandle
11485 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 11486 else {
6136c704 11487 GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
9b3023bc
RGS
11488 PL_lex_op = readline_overriden
11489 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
11490 append_elem(OP_LIST,
11491 newGVOP(OP_GV, 0, gv),
11492 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
11493 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
79072805
LW
11494 yylval.ival = OP_NULL;
11495 }
11496 }
02aa26ce 11497
79072805
LW
11498 return s;
11499}
11500
02aa26ce
NT
11501
11502/* scan_str
11503 takes: start position in buffer
09bef843
SB
11504 keep_quoted preserve \ on the embedded delimiter(s)
11505 keep_delims preserve the delimiters around the string
02aa26ce
NT
11506 returns: position to continue reading from buffer
11507 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
11508 updates the read buffer.
11509
11510 This subroutine pulls a string out of the input. It is called for:
11511 q single quotes q(literal text)
11512 ' single quotes 'literal text'
11513 qq double quotes qq(interpolate $here please)
11514 " double quotes "interpolate $here please"
11515 qx backticks qx(/bin/ls -l)
11516 ` backticks `/bin/ls -l`
11517 qw quote words @EXPORT_OK = qw( func() $spam )
11518 m// regexp match m/this/
11519 s/// regexp substitute s/this/that/
11520 tr/// string transliterate tr/this/that/
11521 y/// string transliterate y/this/that/
11522 ($*@) sub prototypes sub foo ($)
09bef843 11523 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
11524 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
11525
11526 In most of these cases (all but <>, patterns and transliterate)
11527 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
11528 calls scan_str(). s/// makes yylex() call scan_subst() which calls
11529 scan_str(). tr/// and y/// make yylex() call scan_trans() which
11530 calls scan_str().
4e553d73 11531
02aa26ce
NT
11532 It skips whitespace before the string starts, and treats the first
11533 character as the delimiter. If the delimiter is one of ([{< then
11534 the corresponding "close" character )]}> is used as the closing
11535 delimiter. It allows quoting of delimiters, and if the string has
11536 balanced delimiters ([{<>}]) it allows nesting.
11537
37fd879b
HS
11538 On success, the SV with the resulting string is put into lex_stuff or,
11539 if that is already non-NULL, into lex_repl. The second case occurs only
11540 when parsing the RHS of the special constructs s/// and tr/// (y///).
11541 For convenience, the terminating delimiter character is stuffed into
11542 SvIVX of the SV.
02aa26ce
NT
11543*/
11544
76e3520e 11545STATIC char *
09bef843 11546S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 11547{
97aff369 11548 dVAR;
02aa26ce 11549 SV *sv; /* scalar value: string */
d3fcec1f 11550 const char *tmps; /* temp string, used for delimiter matching */
02aa26ce
NT
11551 register char *s = start; /* current position in the buffer */
11552 register char term; /* terminating character */
11553 register char *to; /* current position in the sv's data */
11554 I32 brackets = 1; /* bracket nesting level */
89491803 11555 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e 11556 I32 termcode; /* terminating char. code */
89ebb4a3 11557 U8 termstr[UTF8_MAXBYTES]; /* terminating string */
220e2d4e 11558 STRLEN termlen; /* length of terminating string */
0331ef07 11559 int last_off = 0; /* last position for nesting bracket */
5db06880
NC
11560#ifdef PERL_MAD
11561 int stuffstart;
11562 char *tstart;
11563#endif
02aa26ce
NT
11564
11565 /* skip space before the delimiter */
29595ff2
NC
11566 if (isSPACE(*s)) {
11567 s = PEEKSPACE(s);
11568 }
02aa26ce 11569
5db06880 11570#ifdef PERL_MAD
cd81e915
NC
11571 if (PL_realtokenstart >= 0) {
11572 stuffstart = PL_realtokenstart;
11573 PL_realtokenstart = -1;
5db06880
NC
11574 }
11575 else
11576 stuffstart = start - SvPVX(PL_linestr);
11577#endif
02aa26ce 11578 /* mark where we are, in case we need to report errors */
79072805 11579 CLINE;
02aa26ce
NT
11580
11581 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 11582 term = *s;
220e2d4e
IH
11583 if (!UTF) {
11584 termcode = termstr[0] = term;
11585 termlen = 1;
11586 }
11587 else {
f3b9ce0f 11588 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
11589 Copy(s, termstr, termlen, U8);
11590 if (!UTF8_IS_INVARIANT(term))
11591 has_utf8 = TRUE;
11592 }
b1c7b182 11593
02aa26ce 11594 /* mark where we are */
57843af0 11595 PL_multi_start = CopLINE(PL_curcop);
3280af22 11596 PL_multi_open = term;
02aa26ce
NT
11597
11598 /* find corresponding closing delimiter */
93a17b20 11599 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
11600 termcode = termstr[0] = term = tmps[5];
11601
3280af22 11602 PL_multi_close = term;
79072805 11603
561b68a9
SH
11604 /* create a new SV to hold the contents. 79 is the SV's initial length.
11605 What a random number. */
7d0a29fe
NC
11606 sv = newSV_type(SVt_PVIV);
11607 SvGROW(sv, 80);
45977657 11608 SvIV_set(sv, termcode);
a0d0e21e 11609 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
11610
11611 /* move past delimiter and try to read a complete string */
09bef843 11612 if (keep_delims)
220e2d4e
IH
11613 sv_catpvn(sv, s, termlen);
11614 s += termlen;
5db06880
NC
11615#ifdef PERL_MAD
11616 tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11617 if (!PL_thisopen && !keep_delims) {
11618 PL_thisopen = newSVpvn(tstart, s - tstart);
5db06880
NC
11619 stuffstart = s - SvPVX(PL_linestr);
11620 }
11621#endif
93a17b20 11622 for (;;) {
220e2d4e
IH
11623 if (PL_encoding && !UTF) {
11624 bool cont = TRUE;
11625
11626 while (cont) {
95a20fc0 11627 int offset = s - SvPVX_const(PL_linestr);
66a1b24b 11628 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 11629 &offset, (char*)termstr, termlen);
6136c704
AL
11630 const char * const ns = SvPVX_const(PL_linestr) + offset;
11631 char * const svlast = SvEND(sv) - 1;
220e2d4e
IH
11632
11633 for (; s < ns; s++) {
11634 if (*s == '\n' && !PL_rsfp)
11635 CopLINE_inc(PL_curcop);
11636 }
11637 if (!found)
11638 goto read_more_line;
11639 else {
11640 /* handle quoted delimiters */
52327caf 11641 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
f54cb97a 11642 const char *t;
95a20fc0 11643 for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
220e2d4e
IH
11644 t--;
11645 if ((svlast-1 - t) % 2) {
11646 if (!keep_quoted) {
11647 *(svlast-1) = term;
11648 *svlast = '\0';
11649 SvCUR_set(sv, SvCUR(sv) - 1);
11650 }
11651 continue;
11652 }
11653 }
11654 if (PL_multi_open == PL_multi_close) {
11655 cont = FALSE;
11656 }
11657 else {
f54cb97a
AL
11658 const char *t;
11659 char *w;
0331ef07 11660 for (t = w = SvPVX(sv)+last_off; t < svlast; w++, t++) {
220e2d4e
IH
11661 /* At here, all closes are "was quoted" one,
11662 so we don't check PL_multi_close. */
11663 if (*t == '\\') {
11664 if (!keep_quoted && *(t+1) == PL_multi_open)
11665 t++;
11666 else
11667 *w++ = *t++;
11668 }
11669 else if (*t == PL_multi_open)
11670 brackets++;
11671
11672 *w = *t;
11673 }
11674 if (w < t) {
11675 *w++ = term;
11676 *w = '\0';
95a20fc0 11677 SvCUR_set(sv, w - SvPVX_const(sv));
220e2d4e 11678 }
0331ef07 11679 last_off = w - SvPVX(sv);
220e2d4e
IH
11680 if (--brackets <= 0)
11681 cont = FALSE;
11682 }
11683 }
11684 }
11685 if (!keep_delims) {
11686 SvCUR_set(sv, SvCUR(sv) - 1);
11687 *SvEND(sv) = '\0';
11688 }
11689 break;
11690 }
11691
02aa26ce 11692 /* extend sv if need be */
3280af22 11693 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 11694 /* set 'to' to the next character in the sv's string */
463ee0b2 11695 to = SvPVX(sv)+SvCUR(sv);
09bef843 11696
02aa26ce 11697 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
11698 if (PL_multi_open == PL_multi_close) {
11699 for (; s < PL_bufend; s++,to++) {
02aa26ce 11700 /* embedded newlines increment the current line number */
3280af22 11701 if (*s == '\n' && !PL_rsfp)
57843af0 11702 CopLINE_inc(PL_curcop);
02aa26ce 11703 /* handle quoted delimiters */
3280af22 11704 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 11705 if (!keep_quoted && s[1] == term)
a0d0e21e 11706 s++;
02aa26ce 11707 /* any other quotes are simply copied straight through */
a0d0e21e
LW
11708 else
11709 *to++ = *s++;
11710 }
02aa26ce
NT
11711 /* terminate when run out of buffer (the for() condition), or
11712 have found the terminator */
220e2d4e
IH
11713 else if (*s == term) {
11714 if (termlen == 1)
11715 break;
f3b9ce0f 11716 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
11717 break;
11718 }
63cd0674 11719 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11720 has_utf8 = TRUE;
93a17b20
LW
11721 *to = *s;
11722 }
11723 }
02aa26ce
NT
11724
11725 /* if the terminator isn't the same as the start character (e.g.,
11726 matched brackets), we have to allow more in the quoting, and
11727 be prepared for nested brackets.
11728 */
93a17b20 11729 else {
02aa26ce 11730 /* read until we run out of string, or we find the terminator */
3280af22 11731 for (; s < PL_bufend; s++,to++) {
02aa26ce 11732 /* embedded newlines increment the line count */
3280af22 11733 if (*s == '\n' && !PL_rsfp)
57843af0 11734 CopLINE_inc(PL_curcop);
02aa26ce 11735 /* backslashes can escape the open or closing characters */
3280af22 11736 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
11737 if (!keep_quoted &&
11738 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
11739 s++;
11740 else
11741 *to++ = *s++;
11742 }
02aa26ce 11743 /* allow nested opens and closes */
3280af22 11744 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 11745 break;
3280af22 11746 else if (*s == PL_multi_open)
93a17b20 11747 brackets++;
63cd0674 11748 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 11749 has_utf8 = TRUE;
93a17b20
LW
11750 *to = *s;
11751 }
11752 }
02aa26ce 11753 /* terminate the copied string and update the sv's end-of-string */
93a17b20 11754 *to = '\0';
95a20fc0 11755 SvCUR_set(sv, to - SvPVX_const(sv));
93a17b20 11756
02aa26ce
NT
11757 /*
11758 * this next chunk reads more into the buffer if we're not done yet
11759 */
11760
b1c7b182
GS
11761 if (s < PL_bufend)
11762 break; /* handle case where we are done yet :-) */
79072805 11763
6a27c188 11764#ifndef PERL_STRICT_CR
95a20fc0 11765 if (to - SvPVX_const(sv) >= 2) {
c6f14548
GS
11766 if ((to[-2] == '\r' && to[-1] == '\n') ||
11767 (to[-2] == '\n' && to[-1] == '\r'))
11768 {
f63a84b2
LW
11769 to[-2] = '\n';
11770 to--;
95a20fc0 11771 SvCUR_set(sv, to - SvPVX_const(sv));
f63a84b2
LW
11772 }
11773 else if (to[-1] == '\r')
11774 to[-1] = '\n';
11775 }
95a20fc0 11776 else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
f63a84b2
LW
11777 to[-1] = '\n';
11778#endif
11779
220e2d4e 11780 read_more_line:
02aa26ce
NT
11781 /* if we're out of file, or a read fails, bail and reset the current
11782 line marker so we can report where the unterminated string began
11783 */
5db06880
NC
11784#ifdef PERL_MAD
11785 if (PL_madskills) {
c35e046a 11786 char * const tstart = SvPVX(PL_linestr) + stuffstart;
cd81e915
NC
11787 if (PL_thisstuff)
11788 sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
5db06880 11789 else
cd81e915 11790 PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
5db06880
NC
11791 }
11792#endif
3280af22
NIS
11793 if (!PL_rsfp ||
11794 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 11795 sv_free(sv);
eb160463 11796 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
bd61b366 11797 return NULL;
79072805 11798 }
5db06880
NC
11799#ifdef PERL_MAD
11800 stuffstart = 0;
11801#endif
02aa26ce 11802 /* we read a line, so increment our line counter */
57843af0 11803 CopLINE_inc(PL_curcop);
a0ed51b3 11804
02aa26ce 11805 /* update debugger info */
80a702cd 11806 if (PERLDB_LINE && PL_curstash != PL_debstash)
5fa550fb 11807 update_debugger_info(PL_linestr, NULL, 0);
a0ed51b3 11808
3280af22
NIS
11809 /* having changed the buffer, we must update PL_bufend */
11810 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
bd61b366 11811 PL_last_lop = PL_last_uni = NULL;
378cc40b 11812 }
4e553d73 11813
02aa26ce
NT
11814 /* at this point, we have successfully read the delimited string */
11815
220e2d4e 11816 if (!PL_encoding || UTF) {
5db06880
NC
11817#ifdef PERL_MAD
11818 if (PL_madskills) {
c35e046a 11819 char * const tstart = SvPVX(PL_linestr) + stuffstart;
29522234 11820 const int len = s - tstart;
cd81e915 11821 if (PL_thisstuff)
c35e046a 11822 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 11823 else
c35e046a 11824 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
11825 if (!PL_thisclose && !keep_delims)
11826 PL_thisclose = newSVpvn(s,termlen);
5db06880
NC
11827 }
11828#endif
11829
220e2d4e
IH
11830 if (keep_delims)
11831 sv_catpvn(sv, s, termlen);
11832 s += termlen;
11833 }
5db06880
NC
11834#ifdef PERL_MAD
11835 else {
11836 if (PL_madskills) {
c35e046a
AL
11837 char * const tstart = SvPVX(PL_linestr) + stuffstart;
11838 const int len = s - tstart - termlen;
cd81e915 11839 if (PL_thisstuff)
c35e046a 11840 sv_catpvn(PL_thisstuff, tstart, len);
5db06880 11841 else
c35e046a 11842 PL_thisstuff = newSVpvn(tstart, len);
cd81e915
NC
11843 if (!PL_thisclose && !keep_delims)
11844 PL_thisclose = newSVpvn(s - termlen,termlen);
5db06880
NC
11845 }
11846 }
11847#endif
220e2d4e 11848 if (has_utf8 || PL_encoding)
b1c7b182 11849 SvUTF8_on(sv);
d0063567 11850
57843af0 11851 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
11852
11853 /* if we allocated too much space, give some back */
93a17b20
LW
11854 if (SvCUR(sv) + 5 < SvLEN(sv)) {
11855 SvLEN_set(sv, SvCUR(sv) + 1);
b7e9a5c2 11856 SvPV_renew(sv, SvLEN(sv));
79072805 11857 }
02aa26ce
NT
11858
11859 /* decide whether this is the first or second quoted string we've read
11860 for this op
11861 */
4e553d73 11862
3280af22
NIS
11863 if (PL_lex_stuff)
11864 PL_lex_repl = sv;
79072805 11865 else
3280af22 11866 PL_lex_stuff = sv;
378cc40b
LW
11867 return s;
11868}
11869
02aa26ce
NT
11870/*
11871 scan_num
11872 takes: pointer to position in buffer
11873 returns: pointer to new position in buffer
11874 side-effects: builds ops for the constant in yylval.op
11875
11876 Read a number in any of the formats that Perl accepts:
11877
7fd134d9
JH
11878 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
11879 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
11880 0b[01](_?[01])*
11881 0[0-7](_?[0-7])*
11882 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 11883
3280af22 11884 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
11885 thing it reads.
11886
11887 If it reads a number without a decimal point or an exponent, it will
11888 try converting the number to an integer and see if it can do so
11889 without loss of precision.
11890*/
4e553d73 11891
378cc40b 11892char *
bfed75c6 11893Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
378cc40b 11894{
97aff369 11895 dVAR;
bfed75c6 11896 register const char *s = start; /* current position in buffer */
02aa26ce
NT
11897 register char *d; /* destination in temp buffer */
11898 register char *e; /* end of temp buffer */
86554af2 11899 NV nv; /* number read, as a double */
a0714e2c 11900 SV *sv = NULL; /* place to put the converted number */
a86a20aa 11901 bool floatit; /* boolean: int or float? */
cbbf8932 11902 const char *lastub = NULL; /* position of last underbar */
bfed75c6 11903 static char const number_too_long[] = "Number too long";
378cc40b 11904
02aa26ce
NT
11905 /* We use the first character to decide what type of number this is */
11906
378cc40b 11907 switch (*s) {
79072805 11908 default:
cea2e8a9 11909 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 11910
02aa26ce 11911 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 11912 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
11913 case '0':
11914 {
02aa26ce
NT
11915 /* variables:
11916 u holds the "number so far"
4f19785b
WSI
11917 shift the power of 2 of the base
11918 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
11919 overflowed was the number more than we can hold?
11920
11921 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
11922 we in octal/hex/binary?" indicator to disallow hex characters
11923 when in octal mode.
02aa26ce 11924 */
9e24b6e2
JH
11925 NV n = 0.0;
11926 UV u = 0;
79072805 11927 I32 shift;
9e24b6e2 11928 bool overflowed = FALSE;
61f33854 11929 bool just_zero = TRUE; /* just plain 0 or binary number? */
27da23d5
JH
11930 static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
11931 static const char* const bases[5] =
11932 { "", "binary", "", "octal", "hexadecimal" };
11933 static const char* const Bases[5] =
11934 { "", "Binary", "", "Octal", "Hexadecimal" };
11935 static const char* const maxima[5] =
11936 { "",
11937 "0b11111111111111111111111111111111",
11938 "",
11939 "037777777777",
11940 "0xffffffff" };
bfed75c6 11941 const char *base, *Base, *max;
378cc40b 11942
02aa26ce 11943 /* check for hex */
378cc40b
LW
11944 if (s[1] == 'x') {
11945 shift = 4;
11946 s += 2;
61f33854 11947 just_zero = FALSE;
4f19785b
WSI
11948 } else if (s[1] == 'b') {
11949 shift = 1;
11950 s += 2;
61f33854 11951 just_zero = FALSE;
378cc40b 11952 }
02aa26ce 11953 /* check for a decimal in disguise */
b78218b7 11954 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 11955 goto decimal;
02aa26ce 11956 /* so it must be octal */
928753ea 11957 else {
378cc40b 11958 shift = 3;
928753ea
JH
11959 s++;
11960 }
11961
11962 if (*s == '_') {
11963 if (ckWARN(WARN_SYNTAX))
9014280d 11964 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
11965 "Misplaced _ in number");
11966 lastub = s++;
11967 }
9e24b6e2
JH
11968
11969 base = bases[shift];
11970 Base = Bases[shift];
11971 max = maxima[shift];
02aa26ce 11972
4f19785b 11973 /* read the rest of the number */
378cc40b 11974 for (;;) {
9e24b6e2 11975 /* x is used in the overflow test,
893fe2c2 11976 b is the digit we're adding on. */
9e24b6e2 11977 UV x, b;
55497cff 11978
378cc40b 11979 switch (*s) {
02aa26ce
NT
11980
11981 /* if we don't mention it, we're done */
378cc40b
LW
11982 default:
11983 goto out;
02aa26ce 11984
928753ea 11985 /* _ are ignored -- but warned about if consecutive */
de3bb511 11986 case '_':
041457d9 11987 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 11988 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
11989 "Misplaced _ in number");
11990 lastub = s++;
de3bb511 11991 break;
02aa26ce
NT
11992
11993 /* 8 and 9 are not octal */
378cc40b 11994 case '8': case '9':
4f19785b 11995 if (shift == 3)
cea2e8a9 11996 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 11997 /* FALL THROUGH */
02aa26ce
NT
11998
11999 /* octal digits */
4f19785b 12000 case '2': case '3': case '4':
378cc40b 12001 case '5': case '6': case '7':
4f19785b 12002 if (shift == 1)
cea2e8a9 12003 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
12004 /* FALL THROUGH */
12005
12006 case '0': case '1':
02aa26ce 12007 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 12008 goto digit;
02aa26ce
NT
12009
12010 /* hex digits */
378cc40b
LW
12011 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
12012 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 12013 /* make sure they said 0x */
378cc40b
LW
12014 if (shift != 4)
12015 goto out;
55497cff 12016 b = (*s++ & 7) + 9;
02aa26ce
NT
12017
12018 /* Prepare to put the digit we have onto the end
12019 of the number so far. We check for overflows.
12020 */
12021
55497cff 12022 digit:
61f33854 12023 just_zero = FALSE;
9e24b6e2
JH
12024 if (!overflowed) {
12025 x = u << shift; /* make room for the digit */
12026
12027 if ((x >> shift) != u
12028 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
12029 overflowed = TRUE;
12030 n = (NV) u;
767a6a26 12031 if (ckWARN_d(WARN_OVERFLOW))
9014280d 12032 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
9e24b6e2
JH
12033 "Integer overflow in %s number",
12034 base);
12035 } else
12036 u = x | b; /* add the digit to the end */
12037 }
12038 if (overflowed) {
12039 n *= nvshift[shift];
12040 /* If an NV has not enough bits in its
12041 * mantissa to represent an UV this summing of
12042 * small low-order numbers is a waste of time
12043 * (because the NV cannot preserve the
12044 * low-order bits anyway): we could just
12045 * remember when did we overflow and in the
12046 * end just multiply n by the right
12047 * amount. */
12048 n += (NV) b;
55497cff 12049 }
378cc40b
LW
12050 break;
12051 }
12052 }
02aa26ce
NT
12053
12054 /* if we get here, we had success: make a scalar value from
12055 the number.
12056 */
378cc40b 12057 out:
928753ea
JH
12058
12059 /* final misplaced underbar check */
12060 if (s[-1] == '_') {
12061 if (ckWARN(WARN_SYNTAX))
9014280d 12062 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
12063 }
12064
561b68a9 12065 sv = newSV(0);
9e24b6e2 12066 if (overflowed) {
041457d9 12067 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
9014280d 12068 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12069 "%s number > %s non-portable",
12070 Base, max);
12071 sv_setnv(sv, n);
12072 }
12073 else {
15041a67 12074#if UVSIZE > 4
041457d9 12075 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
9014280d 12076 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
12077 "%s number > %s non-portable",
12078 Base, max);
2cc4c2dc 12079#endif
9e24b6e2
JH
12080 sv_setuv(sv, u);
12081 }
61f33854 12082 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
bfed75c6 12083 sv = new_constant(start, s - start, "integer",
a0714e2c 12084 sv, NULL, NULL);
61f33854 12085 else if (PL_hints & HINT_NEW_BINARY)
a0714e2c 12086 sv = new_constant(start, s - start, "binary", sv, NULL, NULL);
378cc40b
LW
12087 }
12088 break;
02aa26ce
NT
12089
12090 /*
12091 handle decimal numbers.
12092 we're also sent here when we read a 0 as the first digit
12093 */
378cc40b
LW
12094 case '1': case '2': case '3': case '4': case '5':
12095 case '6': case '7': case '8': case '9': case '.':
12096 decimal:
3280af22
NIS
12097 d = PL_tokenbuf;
12098 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 12099 floatit = FALSE;
02aa26ce
NT
12100
12101 /* read next group of digits and _ and copy into d */
de3bb511 12102 while (isDIGIT(*s) || *s == '_') {
4e553d73 12103 /* skip underscores, checking for misplaced ones
02aa26ce
NT
12104 if -w is on
12105 */
93a17b20 12106 if (*s == '_') {
041457d9 12107 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12108 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12109 "Misplaced _ in number");
12110 lastub = s++;
93a17b20 12111 }
fc36a67e 12112 else {
02aa26ce 12113 /* check for end of fixed-length buffer */
fc36a67e 12114 if (d >= e)
cea2e8a9 12115 Perl_croak(aTHX_ number_too_long);
02aa26ce 12116 /* if we're ok, copy the character */
378cc40b 12117 *d++ = *s++;
fc36a67e 12118 }
378cc40b 12119 }
02aa26ce
NT
12120
12121 /* final misplaced underbar check */
928753ea 12122 if (lastub && s == lastub + 1) {
d008e5eb 12123 if (ckWARN(WARN_SYNTAX))
9014280d 12124 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 12125 }
02aa26ce
NT
12126
12127 /* read a decimal portion if there is one. avoid
12128 3..5 being interpreted as the number 3. followed
12129 by .5
12130 */
2f3197b3 12131 if (*s == '.' && s[1] != '.') {
79072805 12132 floatit = TRUE;
378cc40b 12133 *d++ = *s++;
02aa26ce 12134
928753ea
JH
12135 if (*s == '_') {
12136 if (ckWARN(WARN_SYNTAX))
9014280d 12137 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12138 "Misplaced _ in number");
12139 lastub = s;
12140 }
12141
12142 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 12143 */
fc36a67e 12144 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 12145 /* fixed length buffer check */
fc36a67e 12146 if (d >= e)
cea2e8a9 12147 Perl_croak(aTHX_ number_too_long);
928753ea 12148 if (*s == '_') {
041457d9 12149 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 12150 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12151 "Misplaced _ in number");
12152 lastub = s;
12153 }
12154 else
fc36a67e 12155 *d++ = *s;
378cc40b 12156 }
928753ea
JH
12157 /* fractional part ending in underbar? */
12158 if (s[-1] == '_') {
12159 if (ckWARN(WARN_SYNTAX))
9014280d 12160 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
12161 "Misplaced _ in number");
12162 }
dd629d5b
GS
12163 if (*s == '.' && isDIGIT(s[1])) {
12164 /* oops, it's really a v-string, but without the "v" */
f4758303 12165 s = start;
dd629d5b
GS
12166 goto vstring;
12167 }
378cc40b 12168 }
02aa26ce
NT
12169
12170 /* read exponent part, if present */
3792a11b 12171 if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
79072805
LW
12172 floatit = TRUE;
12173 s++;
02aa26ce
NT
12174
12175 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 12176 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 12177
7fd134d9
JH
12178 /* stray preinitial _ */
12179 if (*s == '_') {
12180 if (ckWARN(WARN_SYNTAX))
9014280d 12181 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12182 "Misplaced _ in number");
12183 lastub = s++;
12184 }
12185
02aa26ce 12186 /* allow positive or negative exponent */
378cc40b
LW
12187 if (*s == '+' || *s == '-')
12188 *d++ = *s++;
02aa26ce 12189
7fd134d9
JH
12190 /* stray initial _ */
12191 if (*s == '_') {
12192 if (ckWARN(WARN_SYNTAX))
9014280d 12193 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
12194 "Misplaced _ in number");
12195 lastub = s++;
12196 }
12197
7fd134d9
JH
12198 /* read digits of exponent */
12199 while (isDIGIT(*s) || *s == '_') {
12200 if (isDIGIT(*s)) {
12201 if (d >= e)
12202 Perl_croak(aTHX_ number_too_long);
b3b48e3e 12203 *d++ = *s++;
7fd134d9
JH
12204 }
12205 else {
041457d9
DM
12206 if (((lastub && s == lastub + 1) ||
12207 (!isDIGIT(s[1]) && s[1] != '_'))
12208 && ckWARN(WARN_SYNTAX))
9014280d 12209 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9 12210 "Misplaced _ in number");
b3b48e3e 12211 lastub = s++;
7fd134d9 12212 }
7fd134d9 12213 }
378cc40b 12214 }
02aa26ce 12215
02aa26ce
NT
12216
12217 /* make an sv from the string */
561b68a9 12218 sv = newSV(0);
097ee67d 12219
0b7fceb9 12220 /*
58bb9ec3
NC
12221 We try to do an integer conversion first if no characters
12222 indicating "float" have been found.
0b7fceb9
MU
12223 */
12224
12225 if (!floatit) {
58bb9ec3 12226 UV uv;
6136c704 12227 const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
58bb9ec3
NC
12228
12229 if (flags == IS_NUMBER_IN_UV) {
12230 if (uv <= IV_MAX)
86554af2 12231 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 12232 else
c239479b 12233 sv_setuv(sv, uv);
58bb9ec3
NC
12234 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
12235 if (uv <= (UV) IV_MIN)
12236 sv_setiv(sv, -(IV)uv);
12237 else
12238 floatit = TRUE;
12239 } else
12240 floatit = TRUE;
12241 }
0b7fceb9 12242 if (floatit) {
58bb9ec3
NC
12243 /* terminate the string */
12244 *d = '\0';
86554af2
JH
12245 nv = Atof(PL_tokenbuf);
12246 sv_setnv(sv, nv);
12247 }
86554af2 12248
b8403495
JH
12249 if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
12250 (PL_hints & HINT_NEW_INTEGER) )
10edeb5d
JH
12251 sv = new_constant(PL_tokenbuf,
12252 d - PL_tokenbuf,
12253 (const char *)
b8403495 12254 (floatit ? "float" : "integer"),
a0714e2c 12255 sv, NULL, NULL);
378cc40b 12256 break;
0b7fceb9 12257
e312add1 12258 /* if it starts with a v, it could be a v-string */
a7cb1f99 12259 case 'v':
dd629d5b 12260vstring:
561b68a9 12261 sv = newSV(5); /* preallocate storage space */
65b06e02 12262 s = scan_vstring(s, PL_bufend, sv);
a7cb1f99 12263 break;
79072805 12264 }
a687059c 12265
02aa26ce
NT
12266 /* make the op for the constant and return */
12267
a86a20aa 12268 if (sv)
b73d6f50 12269 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 12270 else
5f66b61c 12271 lvalp->opval = NULL;
a687059c 12272
73d840c0 12273 return (char *)s;
378cc40b
LW
12274}
12275
76e3520e 12276STATIC char *
cea2e8a9 12277S_scan_formline(pTHX_ register char *s)
378cc40b 12278{
97aff369 12279 dVAR;
79072805 12280 register char *eol;
378cc40b 12281 register char *t;
6136c704 12282 SV * const stuff = newSVpvs("");
79072805 12283 bool needargs = FALSE;
c5ee2135 12284 bool eofmt = FALSE;
5db06880
NC
12285#ifdef PERL_MAD
12286 char *tokenstart = s;
12287 SV* savewhite;
12288
12289 if (PL_madskills) {
cd81e915
NC
12290 savewhite = PL_thiswhite;
12291 PL_thiswhite = 0;
5db06880
NC
12292 }
12293#endif
378cc40b 12294
79072805 12295 while (!needargs) {
a1b95068 12296 if (*s == '.') {
c35e046a 12297 t = s+1;
51882d45 12298#ifdef PERL_STRICT_CR
c35e046a
AL
12299 while (SPACE_OR_TAB(*t))
12300 t++;
51882d45 12301#else
c35e046a
AL
12302 while (SPACE_OR_TAB(*t) || *t == '\r')
12303 t++;
51882d45 12304#endif
c5ee2135
WL
12305 if (*t == '\n' || t == PL_bufend) {
12306 eofmt = TRUE;
79072805 12307 break;
c5ee2135 12308 }
79072805 12309 }
3280af22 12310 if (PL_in_eval && !PL_rsfp) {
07409e01 12311 eol = (char *) memchr(s,'\n',PL_bufend-s);
0f85fab0 12312 if (!eol++)
3280af22 12313 eol = PL_bufend;
0f85fab0
LW
12314 }
12315 else
3280af22 12316 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 12317 if (*s != '#') {
a0d0e21e
LW
12318 for (t = s; t < eol; t++) {
12319 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
12320 needargs = FALSE;
12321 goto enough; /* ~~ must be first line in formline */
378cc40b 12322 }
a0d0e21e
LW
12323 if (*t == '@' || *t == '^')
12324 needargs = TRUE;
378cc40b 12325 }
7121b347
MG
12326 if (eol > s) {
12327 sv_catpvn(stuff, s, eol-s);
2dc4c65b 12328#ifndef PERL_STRICT_CR
7121b347
MG
12329 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
12330 char *end = SvPVX(stuff) + SvCUR(stuff);
12331 end[-2] = '\n';
12332 end[-1] = '\0';
b162af07 12333 SvCUR_set(stuff, SvCUR(stuff) - 1);
7121b347 12334 }
2dc4c65b 12335#endif
7121b347
MG
12336 }
12337 else
12338 break;
79072805 12339 }
95a20fc0 12340 s = (char*)eol;
3280af22 12341 if (PL_rsfp) {
5db06880
NC
12342#ifdef PERL_MAD
12343 if (PL_madskills) {
cd81e915
NC
12344 if (PL_thistoken)
12345 sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
5db06880 12346 else
cd81e915 12347 PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
5db06880
NC
12348 }
12349#endif
3280af22 12350 s = filter_gets(PL_linestr, PL_rsfp, 0);
5db06880
NC
12351#ifdef PERL_MAD
12352 tokenstart = PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
12353#else
3280af22 12354 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
5db06880 12355#endif
3280af22 12356 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
bd61b366 12357 PL_last_lop = PL_last_uni = NULL;
79072805 12358 if (!s) {
3280af22 12359 s = PL_bufptr;
378cc40b
LW
12360 break;
12361 }
378cc40b 12362 }
463ee0b2 12363 incline(s);
79072805 12364 }
a0d0e21e
LW
12365 enough:
12366 if (SvCUR(stuff)) {
3280af22 12367 PL_expect = XTERM;
79072805 12368 if (needargs) {
3280af22 12369 PL_lex_state = LEX_NORMAL;
cd81e915 12370 start_force(PL_curforce);
9ded7720 12371 NEXTVAL_NEXTTOKE.ival = 0;
79072805
LW
12372 force_next(',');
12373 }
a0d0e21e 12374 else
3280af22 12375 PL_lex_state = LEX_FORMLINE;
1bd51a4c 12376 if (!IN_BYTES) {
95a20fc0 12377 if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
1bd51a4c
IH
12378 SvUTF8_on(stuff);
12379 else if (PL_encoding)
12380 sv_recode_to_utf8(stuff, PL_encoding);
12381 }
cd81e915 12382 start_force(PL_curforce);
9ded7720 12383 NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 12384 force_next(THING);
cd81e915 12385 start_force(PL_curforce);
9ded7720 12386 NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
79072805 12387 force_next(LSTOP);
378cc40b 12388 }
79072805 12389 else {
8990e307 12390 SvREFCNT_dec(stuff);
c5ee2135
WL
12391 if (eofmt)
12392 PL_lex_formbrack = 0;
3280af22 12393 PL_bufptr = s;
79072805 12394 }
5db06880
NC
12395#ifdef PERL_MAD
12396 if (PL_madskills) {
cd81e915
NC
12397 if (PL_thistoken)
12398 sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
5db06880 12399 else
cd81e915
NC
12400 PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
12401 PL_thiswhite = savewhite;
5db06880
NC
12402 }
12403#endif
79072805 12404 return s;
378cc40b 12405}
a687059c 12406
76e3520e 12407STATIC void
cea2e8a9 12408S_set_csh(pTHX)
a687059c 12409{
ae986130 12410#ifdef CSH
97aff369 12411 dVAR;
3280af22
NIS
12412 if (!PL_cshlen)
12413 PL_cshlen = strlen(PL_cshname);
5f66b61c 12414#else
b2675967 12415#if defined(USE_ITHREADS)
96a5add6 12416 PERL_UNUSED_CONTEXT;
ae986130 12417#endif
b2675967 12418#endif
a687059c 12419}
463ee0b2 12420
ba6d6ac9 12421I32
864dbfa3 12422Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 12423{
97aff369 12424 dVAR;
a3b680e6 12425 const I32 oldsavestack_ix = PL_savestack_ix;
6136c704 12426 CV* const outsidecv = PL_compcv;
8990e307 12427
3280af22
NIS
12428 if (PL_compcv) {
12429 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 12430 }
7766f137 12431 SAVEI32(PL_subline);
3280af22 12432 save_item(PL_subname);
3280af22 12433 SAVESPTR(PL_compcv);
3280af22 12434
b9f83d2f 12435 PL_compcv = (CV*)newSV_type(is_format ? SVt_PVFM : SVt_PVCV);
3280af22
NIS
12436 CvFLAGS(PL_compcv) |= flags;
12437
57843af0 12438 PL_subline = CopLINE(PL_curcop);
dd2155a4 12439 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
b37c2d43 12440 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc_simple(outsidecv);
a3985cdc 12441 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 12442
8990e307
LW
12443 return oldsavestack_ix;
12444}
12445
084592ab
CN
12446#ifdef __SC__
12447#pragma segment Perl_yylex
12448#endif
8990e307 12449int
bfed75c6 12450Perl_yywarn(pTHX_ const char *s)
8990e307 12451{
97aff369 12452 dVAR;
faef0170 12453 PL_in_eval |= EVAL_WARNONLY;
748a9306 12454 yyerror(s);
faef0170 12455 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 12456 return 0;
8990e307
LW
12457}
12458
12459int
bfed75c6 12460Perl_yyerror(pTHX_ const char *s)
463ee0b2 12461{
97aff369 12462 dVAR;
bfed75c6
AL
12463 const char *where = NULL;
12464 const char *context = NULL;
68dc0745 12465 int contlen = -1;
46fc3d4c 12466 SV *msg;
5912531f 12467 int yychar = PL_parser->yychar;
463ee0b2 12468
3280af22 12469 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 12470 where = "at EOF";
8bcfe651
TM
12471 else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
12472 PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
12473 PL_oldbufptr != PL_bufptr) {
f355267c
JH
12474 /*
12475 Only for NetWare:
12476 The code below is removed for NetWare because it abends/crashes on NetWare
12477 when the script has error such as not having the closing quotes like:
12478 if ($var eq "value)
12479 Checking of white spaces is anyway done in NetWare code.
12480 */
12481#ifndef NETWARE
3280af22
NIS
12482 while (isSPACE(*PL_oldoldbufptr))
12483 PL_oldoldbufptr++;
f355267c 12484#endif
3280af22
NIS
12485 context = PL_oldoldbufptr;
12486 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 12487 }
8bcfe651
TM
12488 else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
12489 PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
f355267c
JH
12490 /*
12491 Only for NetWare:
12492 The code below is removed for NetWare because it abends/crashes on NetWare
12493 when the script has error such as not having the closing quotes like:
12494 if ($var eq "value)
12495 Checking of white spaces is anyway done in NetWare code.
12496 */
12497#ifndef NETWARE
3280af22
NIS
12498 while (isSPACE(*PL_oldbufptr))
12499 PL_oldbufptr++;
f355267c 12500#endif
3280af22
NIS
12501 context = PL_oldbufptr;
12502 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
12503 }
12504 else if (yychar > 255)
68dc0745 12505 where = "next token ???";
12fbd33b 12506 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
12507 if (PL_lex_state == LEX_NORMAL ||
12508 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 12509 where = "at end of line";
3280af22 12510 else if (PL_lex_inpat)
68dc0745 12511 where = "within pattern";
463ee0b2 12512 else
68dc0745 12513 where = "within string";
463ee0b2 12514 }
46fc3d4c 12515 else {
6136c704 12516 SV * const where_sv = sv_2mortal(newSVpvs("next char "));
46fc3d4c 12517 if (yychar < 32)
cea2e8a9 12518 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
46fc3d4c 12519 else if (isPRINT_LC(yychar))
cea2e8a9 12520 Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
463ee0b2 12521 else
cea2e8a9 12522 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
95a20fc0 12523 where = SvPVX_const(where_sv);
463ee0b2 12524 }
46fc3d4c 12525 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 12526 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 12527 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 12528 if (context)
cea2e8a9 12529 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 12530 else
cea2e8a9 12531 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 12532 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 12533 Perl_sv_catpvf(aTHX_ msg,
57def98f 12534 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 12535 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 12536 PL_multi_end = 0;
a0d0e21e 12537 }
56da5a46 12538 if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
be2597df 12539 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, SVfARG(msg));
463ee0b2 12540 else
5a844595 12541 qerror(msg);
c7d6bfb2
GS
12542 if (PL_error_count >= 10) {
12543 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 12544 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
be2597df 12545 SVfARG(ERRSV), OutCopFILE(PL_curcop));
c7d6bfb2
GS
12546 else
12547 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 12548 OutCopFILE(PL_curcop));
c7d6bfb2 12549 }
3280af22 12550 PL_in_my = 0;
5c284bb0 12551 PL_in_my_stash = NULL;
463ee0b2
LW
12552 return 0;
12553}
084592ab
CN
12554#ifdef __SC__
12555#pragma segment Main
12556#endif
4e35701f 12557
b250498f 12558STATIC char*
3ae08724 12559S_swallow_bom(pTHX_ U8 *s)
01ec43d0 12560{
97aff369 12561 dVAR;
f54cb97a 12562 const STRLEN slen = SvCUR(PL_linestr);
7aa207d6 12563 switch (s[0]) {
4e553d73
NIS
12564 case 0xFF:
12565 if (s[1] == 0xFE) {
7aa207d6 12566 /* UTF-16 little-endian? (or UTF32-LE?) */
3ae08724 12567 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
7aa207d6 12568 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
01ec43d0 12569#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12570 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
3ae08724 12571 s += 2;
7aa207d6 12572 utf16le:
dea0fc0b
JH
12573 if (PL_bufend > (char*)s) {
12574 U8 *news;
12575 I32 newlen;
12576
12577 filter_add(utf16rev_textfilter, NULL);
a02a5408 12578 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd 12579 utf16_to_utf8_reversed(s, news,
aed58286 12580 PL_bufend - (char*)s - 1,
1de9afcd 12581 &newlen);
7aa207d6 12582 sv_setpvn(PL_linestr, (const char*)news, newlen);
5db06880
NC
12583#ifdef PERL_MAD
12584 s = (U8*)SvPVX(PL_linestr);
12585 Copy(news, s, newlen, U8);
12586 s[newlen] = '\0';
12587#endif
dea0fc0b 12588 Safefree(news);
7aa207d6
JH
12589 SvUTF8_on(PL_linestr);
12590 s = (U8*)SvPVX(PL_linestr);
5db06880
NC
12591#ifdef PERL_MAD
12592 /* FIXME - is this a general bug fix? */
12593 s[newlen] = '\0';
12594#endif
7aa207d6 12595 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12596 }
b250498f 12597#else
7aa207d6 12598 Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
b250498f 12599#endif
01ec43d0
GS
12600 }
12601 break;
78ae23f5 12602 case 0xFE:
7aa207d6 12603 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 12604#ifndef PERL_NO_UTF16_FILTER
7aa207d6 12605 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b 12606 s += 2;
7aa207d6 12607 utf16be:
dea0fc0b
JH
12608 if (PL_bufend > (char *)s) {
12609 U8 *news;
12610 I32 newlen;
12611
12612 filter_add(utf16_textfilter, NULL);
a02a5408 12613 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
12614 utf16_to_utf8(s, news,
12615 PL_bufend - (char*)s,
12616 &newlen);
7aa207d6 12617 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 12618 Safefree(news);
7aa207d6
JH
12619 SvUTF8_on(PL_linestr);
12620 s = (U8*)SvPVX(PL_linestr);
12621 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 12622 }
b250498f 12623#else
7aa207d6 12624 Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
b250498f 12625#endif
01ec43d0
GS
12626 }
12627 break;
3ae08724
GS
12628 case 0xEF:
12629 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 12630 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
12631 s += 3; /* UTF-8 */
12632 }
12633 break;
12634 case 0:
7aa207d6
JH
12635 if (slen > 3) {
12636 if (s[1] == 0) {
12637 if (s[2] == 0xFE && s[3] == 0xFF) {
12638 /* UTF-32 big-endian */
12639 Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
12640 }
12641 }
12642 else if (s[2] == 0 && s[3] != 0) {
12643 /* Leading bytes
12644 * 00 xx 00 xx
12645 * are a good indicator of UTF-16BE. */
12646 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
12647 goto utf16be;
12648 }
01ec43d0 12649 }
e294cc5d
JH
12650#ifdef EBCDIC
12651 case 0xDD:
12652 if (slen > 3 && s[1] == 0x73 && s[2] == 0x66 && s[3] == 0x73) {
12653 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
12654 s += 4; /* UTF-8 */
12655 }
12656 break;
12657#endif
12658
7aa207d6
JH
12659 default:
12660 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
12661 /* Leading bytes
12662 * xx 00 xx 00
12663 * are a good indicator of UTF-16LE. */
12664 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
12665 goto utf16le;
12666 }
01ec43d0 12667 }
b8f84bb2 12668 return (char*)s;
b250498f 12669}
4755096e 12670
4755096e
GS
12671/*
12672 * restore_rsfp
12673 * Restore a source filter.
12674 */
12675
12676static void
acfe0abc 12677restore_rsfp(pTHX_ void *f)
4755096e 12678{
97aff369 12679 dVAR;
0bd48802 12680 PerlIO * const fp = (PerlIO*)f;
4755096e
GS
12681
12682 if (PL_rsfp == PerlIO_stdin())
12683 PerlIO_clearerr(PL_rsfp);
12684 else if (PL_rsfp && (PL_rsfp != fp))
12685 PerlIO_close(PL_rsfp);
12686 PL_rsfp = fp;
12687}
6e3aabd6
GS
12688
12689#ifndef PERL_NO_UTF16_FILTER
12690static I32
acfe0abc 12691utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12692{
97aff369 12693 dVAR;
f54cb97a
AL
12694 const STRLEN old = SvCUR(sv);
12695 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12696 DEBUG_P(PerlIO_printf(Perl_debug_log,
12697 "utf16_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12698 FPTR2DPTR(void *, utf16_textfilter),
12699 idx, maxlen, (int) count));
6e3aabd6
GS
12700 if (count) {
12701 U8* tmps;
dea0fc0b 12702 I32 newlen;
a02a5408 12703 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12704 Copy(SvPVX_const(sv), tmps, old, char);
12705 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12706 SvCUR(sv) - old, &newlen);
12707 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12708 }
1de9afcd
RGS
12709 DEBUG_P({sv_dump(sv);});
12710 return SvCUR(sv);
6e3aabd6
GS
12711}
12712
12713static I32
acfe0abc 12714utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 12715{
97aff369 12716 dVAR;
f54cb97a
AL
12717 const STRLEN old = SvCUR(sv);
12718 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
12719 DEBUG_P(PerlIO_printf(Perl_debug_log,
12720 "utf16rev_textfilter(%p): %d %d (%d)\n",
55662e27
JH
12721 FPTR2DPTR(void *, utf16rev_textfilter),
12722 idx, maxlen, (int) count));
6e3aabd6
GS
12723 if (count) {
12724 U8* tmps;
dea0fc0b 12725 I32 newlen;
a02a5408 12726 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
12727 Copy(SvPVX_const(sv), tmps, old, char);
12728 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
12729 SvCUR(sv) - old, &newlen);
12730 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 12731 }
1de9afcd 12732 DEBUG_P({ sv_dump(sv); });
6e3aabd6
GS
12733 return count;
12734}
12735#endif
9f4817db 12736
f333445c
JP
12737/*
12738Returns a pointer to the next character after the parsed
12739vstring, as well as updating the passed in sv.
12740
12741Function must be called like
12742
561b68a9 12743 sv = newSV(5);
65b06e02 12744 s = scan_vstring(s,e,sv);
f333445c 12745
65b06e02 12746where s and e are the start and end of the string.
f333445c
JP
12747The sv should already be large enough to store the vstring
12748passed in, for performance reasons.
12749
12750*/
12751
12752char *
65b06e02 12753Perl_scan_vstring(pTHX_ const char *s, const char *e, SV *sv)
f333445c 12754{
97aff369 12755 dVAR;
bfed75c6
AL
12756 const char *pos = s;
12757 const char *start = s;
f333445c 12758 if (*pos == 'v') pos++; /* get past 'v' */
65b06e02 12759 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
3e884cbf 12760 pos++;
f333445c
JP
12761 if ( *pos != '.') {
12762 /* this may not be a v-string if followed by => */
bfed75c6 12763 const char *next = pos;
65b06e02 12764 while (next < e && isSPACE(*next))
8fc7bb1c 12765 ++next;
65b06e02 12766 if ((e - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
12767 /* return string not v-string */
12768 sv_setpvn(sv,(char *)s,pos-s);
73d840c0 12769 return (char *)pos;
f333445c
JP
12770 }
12771 }
12772
12773 if (!isALPHA(*pos)) {
89ebb4a3 12774 U8 tmpbuf[UTF8_MAXBYTES+1];
f333445c 12775
d4c19fe8
AL
12776 if (*s == 'v')
12777 s++; /* get past 'v' */
f333445c
JP
12778
12779 sv_setpvn(sv, "", 0);
12780
12781 for (;;) {
d4c19fe8 12782 /* this is atoi() that tolerates underscores */
0bd48802
AL
12783 U8 *tmpend;
12784 UV rev = 0;
d4c19fe8
AL
12785 const char *end = pos;
12786 UV mult = 1;
12787 while (--end >= s) {
12788 if (*end != '_') {
12789 const UV orev = rev;
f333445c
JP
12790 rev += (*end - '0') * mult;
12791 mult *= 10;
12792 if (orev > rev && ckWARN_d(WARN_OVERFLOW))
12793 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
12794 "Integer overflow in decimal number");
12795 }
12796 }
12797#ifdef EBCDIC
12798 if (rev > 0x7FFFFFFF)
12799 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
12800#endif
12801 /* Append native character for the rev point */
12802 tmpend = uvchr_to_utf8(tmpbuf, rev);
12803 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
12804 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
12805 SvUTF8_on(sv);
65b06e02 12806 if (pos + 1 < e && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
12807 s = ++pos;
12808 else {
12809 s = pos;
12810 break;
12811 }
65b06e02 12812 while (pos < e && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
12813 pos++;
12814 }
12815 SvPOK_on(sv);
12816 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
12817 SvRMAGICAL_on(sv);
12818 }
73d840c0 12819 return (char *)s;
f333445c
JP
12820}
12821
1da4ca5f
NC
12822/*
12823 * Local variables:
12824 * c-indentation-style: bsd
12825 * c-basic-offset: 4
12826 * indent-tabs-mode: t
12827 * End:
12828 *
37442d52
RGS
12829 * ex: set ts=8 sts=4 sw=4 noet:
12830 */