This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
make lib/warnings.t use t/test.pl
[perl5.git] / toke.c
CommitLineData
a0d0e21e 1/* toke.c
a687059c 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
770526c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, 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
12fbd33b
DM
26#define yychar (*PL_yycharp)
27#define yylval (*PL_yylvalp)
d3b6f988 28
fc36a67e 29static char ident_too_long[] = "Identifier too long";
4ac733c9 30static char c_without_g[] = "Use of /c modifier is meaningless without /g";
64e578a2 31static char c_in_subst[] = "Use of /c modifier is meaningless in s///";
8903cb82 32
acfe0abc 33static void restore_rsfp(pTHX_ void *f);
6e3aabd6 34#ifndef PERL_NO_UTF16_FILTER
acfe0abc
GS
35static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
36static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
6e3aabd6 37#endif
51371543 38
9059aa12
LW
39#define XFAKEBRACK 128
40#define XENUMMASK 127
41
39e02b42
JH
42#ifdef USE_UTF8_SCRIPTS
43# define UTF (!IN_BYTES)
2b9d42f0 44#else
746b446a 45# define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
2b9d42f0 46#endif
a0ed51b3 47
61f0cdd9 48/* In variables named $^X, these are the legal values for X.
2b92dfce
GS
49 * 1999-02-27 mjd-perl-patch@plover.com */
50#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
51
bf4acbe4
GS
52/* On MacOS, respect nonbreaking spaces */
53#ifdef MACOS_TRADITIONAL
54#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
55#else
56#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
57#endif
58
ffb4593c
NT
59/* LEX_* are values for PL_lex_state, the state of the lexer.
60 * They are arranged oddly so that the guard on the switch statement
79072805
LW
61 * can get by with a single comparison (if the compiler is smart enough).
62 */
63
fb73857a 64/* #define LEX_NOTPARSING 11 is done in perl.h. */
65
55497cff 66#define LEX_NORMAL 10
67#define LEX_INTERPNORMAL 9
68#define LEX_INTERPCASEMOD 8
69#define LEX_INTERPPUSH 7
70#define LEX_INTERPSTART 6
71#define LEX_INTERPEND 5
72#define LEX_INTERPENDMAYBE 4
73#define LEX_INTERPCONCAT 3
74#define LEX_INTERPCONST 2
75#define LEX_FORMLINE 1
76#define LEX_KNOWNEXT 0
79072805 77
bbf60fe6
DM
78#ifdef DEBUGGING
79static char* lex_state_names[] = {
80 "KNOWNEXT",
81 "FORMLINE",
82 "INTERPCONST",
83 "INTERPCONCAT",
84 "INTERPENDMAYBE",
85 "INTERPEND",
86 "INTERPSTART",
87 "INTERPPUSH",
88 "INTERPCASEMOD",
89 "INTERPNORMAL",
90 "NORMAL"
91};
92#endif
93
79072805
LW
94#ifdef ff_next
95#undef ff_next
d48672a2
LW
96#endif
97
79072805 98#include "keywords.h"
fe14fcc3 99
ffb4593c
NT
100/* CLINE is a macro that ensures PL_copline has a sane value */
101
ae986130
LW
102#ifdef CLINE
103#undef CLINE
104#endif
57843af0 105#define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
3280af22 106
ffb4593c
NT
107/*
108 * Convenience functions to return different tokens and prime the
9cbb5ea2 109 * lexer for the next token. They all take an argument.
ffb4593c
NT
110 *
111 * TOKEN : generic token (used for '(', DOLSHARP, etc)
112 * OPERATOR : generic operator
113 * AOPERATOR : assignment operator
114 * PREBLOCK : beginning the block after an if, while, foreach, ...
115 * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
116 * PREREF : *EXPR where EXPR is not a simple identifier
117 * TERM : expression term
118 * LOOPX : loop exiting command (goto, last, dump, etc)
119 * FTST : file test operator
120 * FUN0 : zero-argument function
2d2e263d 121 * FUN1 : not used, except for not, which isn't a UNIOP
ffb4593c
NT
122 * BOop : bitwise or or xor
123 * BAop : bitwise and
124 * SHop : shift operator
125 * PWop : power operator
9cbb5ea2 126 * PMop : pattern-matching operator
ffb4593c
NT
127 * Aop : addition-level operator
128 * Mop : multiplication-level operator
129 * Eop : equality-testing operator
e5edeb50 130 * Rop : relational operator <= != gt
ffb4593c
NT
131 *
132 * Also see LOP and lop() below.
133 */
134
998054bd 135#ifdef DEBUGGING /* Serve -DT. */
bbf60fe6 136# define REPORT(retval) tokereport(s,(int)retval)
998054bd 137#else
bbf60fe6 138# define REPORT(retval) (retval)
998054bd
SC
139#endif
140
bbf60fe6
DM
141#define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
142#define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
143#define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
144#define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
145#define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
146#define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
147#define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
148#define LOOPX(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
149#define FTST(f) return (yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
150#define FUN0(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
151#define FUN1(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
152#define BOop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
153#define BAop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
154#define SHop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
155#define PWop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
156#define PMop(f) return(yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
157#define Aop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
158#define Mop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
159#define Eop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
160#define Rop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
2f3197b3 161
a687059c
LW
162/* This bit of chicanery makes a unary function followed by
163 * a parenthesis into a function with one argument, highest precedence.
6f33ba73
RGS
164 * The UNIDOR macro is for unary functions that can be followed by the //
165 * operator (such as C<shift // 0>).
a687059c 166 */
bbf60fe6
DM
167#define UNI2(f,x) return ( \
168 yylval.ival = f, \
6f33ba73 169 PL_expect = x, \
3280af22
NIS
170 PL_bufptr = s, \
171 PL_last_uni = PL_oldbufptr, \
172 PL_last_lop_op = f, \
bbf60fe6
DM
173 REPORT( \
174 (*s == '(' || (s = skipspace(s), *s == '(') \
175 ? (int)FUNC1 : (int)UNIOP)))
6f33ba73
RGS
176#define UNI(f) UNI2(f,XTERM)
177#define UNIDOR(f) UNI2(f,XTERMORDORDOR)
a687059c 178
bbf60fe6
DM
179#define UNIBRACK(f) return ( \
180 yylval.ival = f, \
3280af22
NIS
181 PL_bufptr = s, \
182 PL_last_uni = PL_oldbufptr, \
bbf60fe6
DM
183 REPORT( \
184 (*s == '(' || (s = skipspace(s), *s == '(') \
185 ? (int)FUNC1 : (int)UNIOP)))
79072805 186
9f68db38 187/* grandfather return to old style */
3280af22 188#define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
79072805 189
8fa7f367
JH
190#ifdef DEBUGGING
191
bbf60fe6
DM
192/* how to interpret the yylval associated with the token */
193enum token_type {
194 TOKENTYPE_NONE,
195 TOKENTYPE_IVAL,
196 TOKENTYPE_OPNUM, /* yylval.ival contains an opcode number */
197 TOKENTYPE_PVAL,
198 TOKENTYPE_OPVAL,
199 TOKENTYPE_GVVAL
200};
201
202static struct debug_tokens { int token, type; char *name;} debug_tokens[] =
9041c2e3 203{
bbf60fe6
DM
204 { ADDOP, TOKENTYPE_OPNUM, "ADDOP" },
205 { ANDAND, TOKENTYPE_NONE, "ANDAND" },
206 { ANDOP, TOKENTYPE_NONE, "ANDOP" },
207 { ANONSUB, TOKENTYPE_IVAL, "ANONSUB" },
208 { ARROW, TOKENTYPE_NONE, "ARROW" },
209 { ASSIGNOP, TOKENTYPE_OPNUM, "ASSIGNOP" },
210 { BITANDOP, TOKENTYPE_OPNUM, "BITANDOP" },
211 { BITOROP, TOKENTYPE_OPNUM, "BITOROP" },
212 { COLONATTR, TOKENTYPE_NONE, "COLONATTR" },
213 { CONTINUE, TOKENTYPE_NONE, "CONTINUE" },
214 { DO, TOKENTYPE_NONE, "DO" },
215 { DOLSHARP, TOKENTYPE_NONE, "DOLSHARP" },
216 { DORDOR, TOKENTYPE_NONE, "DORDOR" },
217 { DOROP, TOKENTYPE_OPNUM, "DOROP" },
218 { DOTDOT, TOKENTYPE_IVAL, "DOTDOT" },
219 { ELSE, TOKENTYPE_NONE, "ELSE" },
220 { ELSIF, TOKENTYPE_IVAL, "ELSIF" },
221 { EQOP, TOKENTYPE_OPNUM, "EQOP" },
222 { FOR, TOKENTYPE_IVAL, "FOR" },
223 { FORMAT, TOKENTYPE_NONE, "FORMAT" },
224 { FUNC, TOKENTYPE_OPNUM, "FUNC" },
225 { FUNC0, TOKENTYPE_OPNUM, "FUNC0" },
226 { FUNC0SUB, TOKENTYPE_OPVAL, "FUNC0SUB" },
227 { FUNC1, TOKENTYPE_OPNUM, "FUNC1" },
228 { FUNCMETH, TOKENTYPE_OPVAL, "FUNCMETH" },
229 { HASHBRACK, TOKENTYPE_NONE, "HASHBRACK" },
230 { IF, TOKENTYPE_IVAL, "IF" },
231 { LABEL, TOKENTYPE_PVAL, "LABEL" },
232 { LOCAL, TOKENTYPE_IVAL, "LOCAL" },
233 { LOOPEX, TOKENTYPE_OPNUM, "LOOPEX" },
234 { LSTOP, TOKENTYPE_OPNUM, "LSTOP" },
235 { LSTOPSUB, TOKENTYPE_OPVAL, "LSTOPSUB" },
236 { MATCHOP, TOKENTYPE_OPNUM, "MATCHOP" },
237 { METHOD, TOKENTYPE_OPVAL, "METHOD" },
238 { MULOP, TOKENTYPE_OPNUM, "MULOP" },
239 { MY, TOKENTYPE_IVAL, "MY" },
240 { MYSUB, TOKENTYPE_NONE, "MYSUB" },
241 { NOAMP, TOKENTYPE_NONE, "NOAMP" },
242 { NOTOP, TOKENTYPE_NONE, "NOTOP" },
243 { OROP, TOKENTYPE_IVAL, "OROP" },
244 { OROR, TOKENTYPE_NONE, "OROR" },
245 { PACKAGE, TOKENTYPE_NONE, "PACKAGE" },
246 { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" },
247 { POSTDEC, TOKENTYPE_NONE, "POSTDEC" },
248 { POSTINC, TOKENTYPE_NONE, "POSTINC" },
249 { POWOP, TOKENTYPE_OPNUM, "POWOP" },
250 { PREDEC, TOKENTYPE_NONE, "PREDEC" },
251 { PREINC, TOKENTYPE_NONE, "PREINC" },
252 { PRIVATEREF, TOKENTYPE_OPVAL, "PRIVATEREF" },
253 { REFGEN, TOKENTYPE_NONE, "REFGEN" },
254 { RELOP, TOKENTYPE_OPNUM, "RELOP" },
255 { SHIFTOP, TOKENTYPE_OPNUM, "SHIFTOP" },
256 { SUB, TOKENTYPE_NONE, "SUB" },
257 { THING, TOKENTYPE_OPVAL, "THING" },
258 { UMINUS, TOKENTYPE_NONE, "UMINUS" },
259 { UNIOP, TOKENTYPE_OPNUM, "UNIOP" },
260 { UNIOPSUB, TOKENTYPE_OPVAL, "UNIOPSUB" },
261 { UNLESS, TOKENTYPE_IVAL, "UNLESS" },
262 { UNTIL, TOKENTYPE_IVAL, "UNTIL" },
263 { USE, TOKENTYPE_IVAL, "USE" },
264 { WHILE, TOKENTYPE_IVAL, "WHILE" },
265 { WORD, TOKENTYPE_OPVAL, "WORD" },
266 { 0, TOKENTYPE_NONE, 0 }
267};
268
269/* dump the returned token in rv, plus any optional arg in yylval */
998054bd 270
bbf60fe6
DM
271STATIC int
272S_tokereport(pTHX_ char* s, I32 rv)
273{
274 if (DEBUG_T_TEST) {
275 char *name = Nullch;
276 enum token_type type = TOKENTYPE_NONE;
277 struct debug_tokens *p;
278 SV* report = NEWSV(0, 60);
279
280 Perl_sv_catpvf(aTHX_ report, "<== ");
281
282 for (p = debug_tokens; p->token; p++) {
283 if (p->token == (int)rv) {
284 name = p->name;
285 type = p->type;
286 break;
287 }
288 }
289 if (name)
290 Perl_sv_catpvf(aTHX_ report, "%s", name);
291 else if ((char)rv > ' ' && (char)rv < '~')
292 Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
293 else if (!rv)
294 Perl_sv_catpvf(aTHX_ report, "EOF");
295 else
296 Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
297 switch (type) {
298 case TOKENTYPE_NONE:
299 case TOKENTYPE_GVVAL: /* doesn't appear to be used */
300 break;
301 case TOKENTYPE_IVAL:
302 Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", yylval.ival);
303 break;
304 case TOKENTYPE_OPNUM:
305 Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
306 PL_op_name[yylval.ival]);
307 break;
308 case TOKENTYPE_PVAL:
309 Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", yylval.pval);
310 break;
311 case TOKENTYPE_OPVAL:
401441c0
RGS
312 if (yylval.opval)
313 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
bbf60fe6 314 PL_op_name[yylval.opval->op_type]);
401441c0
RGS
315 else
316 Perl_sv_catpv(aTHX_ report, "(opval=null)");
bbf60fe6
DM
317 break;
318 }
319 Perl_sv_catpvf(aTHX_ report, " at line %d [", CopLINE(PL_curcop));
998054bd
SC
320 if (s - PL_bufptr > 0)
321 sv_catpvn(report, PL_bufptr, s - PL_bufptr);
322 else {
323 if (PL_oldbufptr && *PL_oldbufptr)
324 sv_catpv(report, PL_tokenbuf);
325 }
bbf60fe6
DM
326 PerlIO_printf(Perl_debug_log, "### %s]\n", SvPV_nolen(report));
327 };
328 return (int)rv;
998054bd
SC
329}
330
8fa7f367
JH
331#endif
332
ffb4593c
NT
333/*
334 * S_ao
335 *
c963b151
BD
336 * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
337 * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
ffb4593c
NT
338 */
339
76e3520e 340STATIC int
cea2e8a9 341S_ao(pTHX_ int toketype)
a0d0e21e 342{
3280af22
NIS
343 if (*PL_bufptr == '=') {
344 PL_bufptr++;
a0d0e21e
LW
345 if (toketype == ANDAND)
346 yylval.ival = OP_ANDASSIGN;
347 else if (toketype == OROR)
348 yylval.ival = OP_ORASSIGN;
c963b151
BD
349 else if (toketype == DORDOR)
350 yylval.ival = OP_DORASSIGN;
a0d0e21e
LW
351 toketype = ASSIGNOP;
352 }
353 return toketype;
354}
355
ffb4593c
NT
356/*
357 * S_no_op
358 * When Perl expects an operator and finds something else, no_op
359 * prints the warning. It always prints "<something> found where
360 * operator expected. It prints "Missing semicolon on previous line?"
361 * if the surprise occurs at the start of the line. "do you need to
362 * predeclare ..." is printed out for code like "sub bar; foo bar $x"
363 * where the compiler doesn't know if foo is a method call or a function.
364 * It prints "Missing operator before end of line" if there's nothing
365 * after the missing operator, or "... before <...>" if there is something
366 * after the missing operator.
367 */
368
76e3520e 369STATIC void
cea2e8a9 370S_no_op(pTHX_ char *what, char *s)
463ee0b2 371{
3280af22
NIS
372 char *oldbp = PL_bufptr;
373 bool is_first = (PL_oldbufptr == PL_linestart);
68dc0745 374
1189a94a
GS
375 if (!s)
376 s = oldbp;
07c798fb 377 else
1189a94a 378 PL_bufptr = s;
cea2e8a9 379 yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
56da5a46
RGS
380 if (ckWARN_d(WARN_SYNTAX)) {
381 if (is_first)
382 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
383 "\t(Missing semicolon on previous line?)\n");
384 else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
385 char *t;
386 for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
387 if (t < PL_bufptr && isSPACE(*t))
388 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
389 "\t(Do you need to predeclare %.*s?)\n",
390 t - PL_oldoldbufptr, PL_oldoldbufptr);
391 }
392 else {
393 assert(s >= oldbp);
394 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
395 "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
396 }
07c798fb 397 }
3280af22 398 PL_bufptr = oldbp;
8990e307
LW
399}
400
ffb4593c
NT
401/*
402 * S_missingterm
403 * Complain about missing quote/regexp/heredoc terminator.
404 * If it's called with (char *)NULL then it cauterizes the line buffer.
405 * If we're in a delimited string and the delimiter is a control
406 * character, it's reformatted into a two-char sequence like ^C.
407 * This is fatal.
408 */
409
76e3520e 410STATIC void
cea2e8a9 411S_missingterm(pTHX_ char *s)
8990e307
LW
412{
413 char tmpbuf[3];
414 char q;
415 if (s) {
416 char *nl = strrchr(s,'\n');
d2719217 417 if (nl)
8990e307
LW
418 *nl = '\0';
419 }
9d116dd7
JH
420 else if (
421#ifdef EBCDIC
422 iscntrl(PL_multi_close)
423#else
424 PL_multi_close < 32 || PL_multi_close == 127
425#endif
426 ) {
8990e307 427 *tmpbuf = '^';
3280af22 428 tmpbuf[1] = toCTRL(PL_multi_close);
8990e307
LW
429 s = "\\n";
430 tmpbuf[2] = '\0';
431 s = tmpbuf;
432 }
433 else {
eb160463 434 *tmpbuf = (char)PL_multi_close;
8990e307
LW
435 tmpbuf[1] = '\0';
436 s = tmpbuf;
437 }
438 q = strchr(s,'"') ? '\'' : '"';
cea2e8a9 439 Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
463ee0b2 440}
79072805 441
ffb4593c
NT
442/*
443 * Perl_deprecate
ffb4593c
NT
444 */
445
79072805 446void
864dbfa3 447Perl_deprecate(pTHX_ char *s)
a0d0e21e 448{
599cee73 449 if (ckWARN(WARN_DEPRECATED))
9014280d 450 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
a0d0e21e
LW
451}
452
12bcd1a6
PM
453void
454Perl_deprecate_old(pTHX_ char *s)
455{
456 /* This function should NOT be called for any new deprecated warnings */
457 /* Use Perl_deprecate instead */
458 /* */
459 /* It is here to maintain backward compatibility with the pre-5.8 */
460 /* warnings category hierarchy. The "deprecated" category used to */
461 /* live under the "syntax" category. It is now a top-level category */
462 /* in its own right. */
463
464 if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
465 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
466 "Use of %s is deprecated", s);
467}
468
ffb4593c
NT
469/*
470 * depcom
9cbb5ea2 471 * Deprecate a comma-less variable list.
ffb4593c
NT
472 */
473
76e3520e 474STATIC void
cea2e8a9 475S_depcom(pTHX)
a0d0e21e 476{
12bcd1a6 477 deprecate_old("comma-less variable list");
a0d0e21e
LW
478}
479
ffb4593c 480/*
9cbb5ea2
GS
481 * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
482 * utf16-to-utf8-reversed.
ffb4593c
NT
483 */
484
c39cd008
GS
485#ifdef PERL_CR_FILTER
486static void
487strip_return(SV *sv)
488{
489 register char *s = SvPVX(sv);
490 register char *e = s + SvCUR(sv);
491 /* outer loop optimized to do nothing if there are no CR-LFs */
492 while (s < e) {
493 if (*s++ == '\r' && *s == '\n') {
494 /* hit a CR-LF, need to copy the rest */
495 register char *d = s - 1;
496 *d++ = *s++;
497 while (s < e) {
498 if (*s == '\r' && s[1] == '\n')
499 s++;
500 *d++ = *s++;
501 }
502 SvCUR(sv) -= s - d;
503 return;
504 }
505 }
506}
a868473f 507
76e3520e 508STATIC I32
c39cd008 509S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
a868473f 510{
c39cd008
GS
511 I32 count = FILTER_READ(idx+1, sv, maxlen);
512 if (count > 0 && !maxlen)
513 strip_return(sv);
514 return count;
a868473f
NIS
515}
516#endif
517
ffb4593c
NT
518/*
519 * Perl_lex_start
9cbb5ea2
GS
520 * Initialize variables. Uses the Perl save_stack to save its state (for
521 * recursive calls to the parser).
ffb4593c
NT
522 */
523
a0d0e21e 524void
864dbfa3 525Perl_lex_start(pTHX_ SV *line)
79072805 526{
8990e307
LW
527 char *s;
528 STRLEN len;
529
3280af22
NIS
530 SAVEI32(PL_lex_dojoin);
531 SAVEI32(PL_lex_brackets);
3280af22
NIS
532 SAVEI32(PL_lex_casemods);
533 SAVEI32(PL_lex_starts);
534 SAVEI32(PL_lex_state);
7766f137 535 SAVEVPTR(PL_lex_inpat);
3280af22 536 SAVEI32(PL_lex_inwhat);
18b09519
GS
537 if (PL_lex_state == LEX_KNOWNEXT) {
538 I32 toke = PL_nexttoke;
539 while (--toke >= 0) {
540 SAVEI32(PL_nexttype[toke]);
541 SAVEVPTR(PL_nextval[toke]);
542 }
543 SAVEI32(PL_nexttoke);
18b09519 544 }
57843af0 545 SAVECOPLINE(PL_curcop);
3280af22
NIS
546 SAVEPPTR(PL_bufptr);
547 SAVEPPTR(PL_bufend);
548 SAVEPPTR(PL_oldbufptr);
549 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
550 SAVEPPTR(PL_last_lop);
551 SAVEPPTR(PL_last_uni);
3280af22
NIS
552 SAVEPPTR(PL_linestart);
553 SAVESPTR(PL_linestr);
8edd5f42
RGS
554 SAVEGENERICPV(PL_lex_brackstack);
555 SAVEGENERICPV(PL_lex_casestack);
c76ac1ee 556 SAVEDESTRUCTOR_X(restore_rsfp, PL_rsfp);
3280af22
NIS
557 SAVESPTR(PL_lex_stuff);
558 SAVEI32(PL_lex_defer);
09bef843 559 SAVEI32(PL_sublex_info.sub_inwhat);
3280af22 560 SAVESPTR(PL_lex_repl);
bebdddfc
GS
561 SAVEINT(PL_expect);
562 SAVEINT(PL_lex_expect);
3280af22
NIS
563
564 PL_lex_state = LEX_NORMAL;
565 PL_lex_defer = 0;
566 PL_expect = XSTATE;
567 PL_lex_brackets = 0;
3280af22
NIS
568 New(899, PL_lex_brackstack, 120, char);
569 New(899, PL_lex_casestack, 12, char);
3280af22
NIS
570 PL_lex_casemods = 0;
571 *PL_lex_casestack = '\0';
572 PL_lex_dojoin = 0;
573 PL_lex_starts = 0;
574 PL_lex_stuff = Nullsv;
575 PL_lex_repl = Nullsv;
576 PL_lex_inpat = 0;
76be56bc 577 PL_nexttoke = 0;
3280af22 578 PL_lex_inwhat = 0;
09bef843 579 PL_sublex_info.sub_inwhat = 0;
3280af22
NIS
580 PL_linestr = line;
581 if (SvREADONLY(PL_linestr))
582 PL_linestr = sv_2mortal(newSVsv(PL_linestr));
583 s = SvPV(PL_linestr, len);
6f27f9a7 584 if (!len || s[len-1] != ';') {
3280af22
NIS
585 if (!(SvFLAGS(PL_linestr) & SVs_TEMP))
586 PL_linestr = sv_2mortal(newSVsv(PL_linestr));
587 sv_catpvn(PL_linestr, "\n;", 2);
8990e307 588 }
3280af22
NIS
589 SvTEMP_off(PL_linestr);
590 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
591 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
207e3d1a 592 PL_last_lop = PL_last_uni = Nullch;
3280af22 593 PL_rsfp = 0;
79072805 594}
a687059c 595
ffb4593c
NT
596/*
597 * Perl_lex_end
9cbb5ea2
GS
598 * Finalizer for lexing operations. Must be called when the parser is
599 * done with the lexer.
ffb4593c
NT
600 */
601
463ee0b2 602void
864dbfa3 603Perl_lex_end(pTHX)
463ee0b2 604{
3280af22 605 PL_doextract = FALSE;
463ee0b2
LW
606}
607
ffb4593c
NT
608/*
609 * S_incline
610 * This subroutine has nothing to do with tilting, whether at windmills
611 * or pinball tables. Its name is short for "increment line". It
57843af0 612 * increments the current line number in CopLINE(PL_curcop) and checks
ffb4593c 613 * to see whether the line starts with a comment of the form
9cbb5ea2
GS
614 * # line 500 "foo.pm"
615 * If so, it sets the current line number and file to the values in the comment.
ffb4593c
NT
616 */
617
76e3520e 618STATIC void
cea2e8a9 619S_incline(pTHX_ char *s)
463ee0b2
LW
620{
621 char *t;
622 char *n;
73659bf1 623 char *e;
463ee0b2 624 char ch;
463ee0b2 625
57843af0 626 CopLINE_inc(PL_curcop);
463ee0b2
LW
627 if (*s++ != '#')
628 return;
bf4acbe4 629 while (SPACE_OR_TAB(*s)) s++;
73659bf1
GS
630 if (strnEQ(s, "line", 4))
631 s += 4;
632 else
633 return;
084592ab 634 if (SPACE_OR_TAB(*s))
73659bf1 635 s++;
4e553d73 636 else
73659bf1 637 return;
bf4acbe4 638 while (SPACE_OR_TAB(*s)) s++;
463ee0b2
LW
639 if (!isDIGIT(*s))
640 return;
641 n = s;
642 while (isDIGIT(*s))
643 s++;
bf4acbe4 644 while (SPACE_OR_TAB(*s))
463ee0b2 645 s++;
73659bf1 646 if (*s == '"' && (t = strchr(s+1, '"'))) {
463ee0b2 647 s++;
73659bf1
GS
648 e = t + 1;
649 }
463ee0b2 650 else {
463ee0b2 651 for (t = s; !isSPACE(*t); t++) ;
73659bf1 652 e = t;
463ee0b2 653 }
bf4acbe4 654 while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
73659bf1
GS
655 e++;
656 if (*e != '\n' && *e != '\0')
657 return; /* false alarm */
658
463ee0b2
LW
659 ch = *t;
660 *t = '\0';
f4dd75d9 661 if (t - s > 0) {
05ec9bb3 662 CopFILE_free(PL_curcop);
57843af0 663 CopFILE_set(PL_curcop, s);
f4dd75d9 664 }
463ee0b2 665 *t = ch;
57843af0 666 CopLINE_set(PL_curcop, atoi(n)-1);
463ee0b2
LW
667}
668
ffb4593c
NT
669/*
670 * S_skipspace
671 * Called to gobble the appropriate amount and type of whitespace.
672 * Skips comments as well.
673 */
674
76e3520e 675STATIC char *
cea2e8a9 676S_skipspace(pTHX_ register char *s)
a687059c 677{
3280af22 678 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
bf4acbe4 679 while (s < PL_bufend && SPACE_OR_TAB(*s))
463ee0b2
LW
680 s++;
681 return s;
682 }
683 for (;;) {
fd049845 684 STRLEN prevlen;
09bef843 685 SSize_t oldprevlen, oldoldprevlen;
9c5ffd7c 686 SSize_t oldloplen = 0, oldunilen = 0;
60e6418e
GS
687 while (s < PL_bufend && isSPACE(*s)) {
688 if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
689 incline(s);
690 }
ffb4593c
NT
691
692 /* comment */
3280af22
NIS
693 if (s < PL_bufend && *s == '#') {
694 while (s < PL_bufend && *s != '\n')
463ee0b2 695 s++;
60e6418e 696 if (s < PL_bufend) {
463ee0b2 697 s++;
60e6418e
GS
698 if (PL_in_eval && !PL_rsfp) {
699 incline(s);
700 continue;
701 }
702 }
463ee0b2 703 }
ffb4593c
NT
704
705 /* only continue to recharge the buffer if we're at the end
706 * of the buffer, we're not reading from a source filter, and
707 * we're in normal lexing mode
708 */
09bef843
SB
709 if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
710 PL_lex_state == LEX_FORMLINE)
463ee0b2 711 return s;
ffb4593c
NT
712
713 /* try to recharge the buffer */
9cbb5ea2
GS
714 if ((s = filter_gets(PL_linestr, PL_rsfp,
715 (prevlen = SvCUR(PL_linestr)))) == Nullch)
716 {
717 /* end of file. Add on the -p or -n magic */
01a19ab0
NC
718 if (PL_minus_p) {
719 sv_setpv(PL_linestr,
720 ";}continue{print or die qq(-p destination: $!\\n);}");
3280af22 721 PL_minus_n = PL_minus_p = 0;
a0d0e21e 722 }
01a19ab0
NC
723 else if (PL_minus_n) {
724 sv_setpvn(PL_linestr, ";}", 2);
725 PL_minus_n = 0;
726 }
a0d0e21e 727 else
4147a61b 728 sv_setpvn(PL_linestr,";", 1);
ffb4593c
NT
729
730 /* reset variables for next time we lex */
9cbb5ea2
GS
731 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
732 = SvPVX(PL_linestr);
3280af22 733 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 734 PL_last_lop = PL_last_uni = Nullch;
ffb4593c
NT
735
736 /* Close the filehandle. Could be from -P preprocessor,
737 * STDIN, or a regular file. If we were reading code from
738 * STDIN (because the commandline held no -e or filename)
739 * then we don't close it, we reset it so the code can
740 * read from STDIN too.
741 */
742
3280af22
NIS
743 if (PL_preprocess && !PL_in_eval)
744 (void)PerlProc_pclose(PL_rsfp);
745 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
746 PerlIO_clearerr(PL_rsfp);
8990e307 747 else
3280af22
NIS
748 (void)PerlIO_close(PL_rsfp);
749 PL_rsfp = Nullfp;
463ee0b2
LW
750 return s;
751 }
ffb4593c
NT
752
753 /* not at end of file, so we only read another line */
09bef843
SB
754 /* make corresponding updates to old pointers, for yyerror() */
755 oldprevlen = PL_oldbufptr - PL_bufend;
756 oldoldprevlen = PL_oldoldbufptr - PL_bufend;
757 if (PL_last_uni)
758 oldunilen = PL_last_uni - PL_bufend;
759 if (PL_last_lop)
760 oldloplen = PL_last_lop - PL_bufend;
3280af22
NIS
761 PL_linestart = PL_bufptr = s + prevlen;
762 PL_bufend = s + SvCUR(PL_linestr);
763 s = PL_bufptr;
09bef843
SB
764 PL_oldbufptr = s + oldprevlen;
765 PL_oldoldbufptr = s + oldoldprevlen;
766 if (PL_last_uni)
767 PL_last_uni = s + oldunilen;
768 if (PL_last_lop)
769 PL_last_lop = s + oldloplen;
a0d0e21e 770 incline(s);
ffb4593c
NT
771
772 /* debugger active and we're not compiling the debugger code,
773 * so store the line into the debugger's array of lines
774 */
3280af22 775 if (PERLDB_LINE && PL_curstash != PL_debstash) {
8990e307
LW
776 SV *sv = NEWSV(85,0);
777
778 sv_upgrade(sv, SVt_PVMG);
3280af22 779 sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
0ac0412a
MJD
780 (void)SvIOK_on(sv);
781 SvIVX(sv) = 0;
57843af0 782 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
8990e307 783 }
463ee0b2 784 }
a687059c 785}
378cc40b 786
ffb4593c
NT
787/*
788 * S_check_uni
789 * Check the unary operators to ensure there's no ambiguity in how they're
790 * used. An ambiguous piece of code would be:
791 * rand + 5
792 * This doesn't mean rand() + 5. Because rand() is a unary operator,
793 * the +5 is its argument.
794 */
795
76e3520e 796STATIC void
cea2e8a9 797S_check_uni(pTHX)
ba106d47 798{
2f3197b3 799 char *s;
a0d0e21e 800 char *t;
2f3197b3 801
3280af22 802 if (PL_oldoldbufptr != PL_last_uni)
2f3197b3 803 return;
3280af22
NIS
804 while (isSPACE(*PL_last_uni))
805 PL_last_uni++;
7e2040f0 806 for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++) ;
3280af22 807 if ((t = strchr(s, '(')) && t < PL_bufptr)
a0d0e21e 808 return;
0453d815 809 if (ckWARN_d(WARN_AMBIGUOUS)){
f248d071 810 char ch = *s;
0453d815 811 *s = '\0';
9014280d 812 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2d5ccbba 813 "Warning: Use of \"%s\" without parentheses is ambiguous",
0453d815
PM
814 PL_last_uni);
815 *s = ch;
816 }
2f3197b3
LW
817}
818
ffb4593c
NT
819/*
820 * LOP : macro to build a list operator. Its behaviour has been replaced
821 * with a subroutine, S_lop() for which LOP is just another name.
822 */
823
a0d0e21e
LW
824#define LOP(f,x) return lop(f,x,s)
825
ffb4593c
NT
826/*
827 * S_lop
828 * Build a list operator (or something that might be one). The rules:
829 * - if we have a next token, then it's a list operator [why?]
830 * - if the next thing is an opening paren, then it's a function
831 * - else it's a list operator
832 */
833
76e3520e 834STATIC I32
a0be28da 835S_lop(pTHX_ I32 f, int x, char *s)
ffed7fef 836{
79072805 837 yylval.ival = f;
35c8bce7 838 CLINE;
3280af22
NIS
839 PL_expect = x;
840 PL_bufptr = s;
841 PL_last_lop = PL_oldbufptr;
eb160463 842 PL_last_lop_op = (OPCODE)f;
3280af22 843 if (PL_nexttoke)
bbf60fe6 844 return REPORT(LSTOP);
79072805 845 if (*s == '(')
bbf60fe6 846 return REPORT(FUNC);
79072805
LW
847 s = skipspace(s);
848 if (*s == '(')
bbf60fe6 849 return REPORT(FUNC);
79072805 850 else
bbf60fe6 851 return REPORT(LSTOP);
79072805
LW
852}
853
ffb4593c
NT
854/*
855 * S_force_next
9cbb5ea2 856 * When the lexer realizes it knows the next token (for instance,
ffb4593c 857 * it is reordering tokens for the parser) then it can call S_force_next
9cbb5ea2
GS
858 * to know what token to return the next time the lexer is called. Caller
859 * will need to set PL_nextval[], and possibly PL_expect to ensure the lexer
860 * handles the token correctly.
ffb4593c
NT
861 */
862
4e553d73 863STATIC void
cea2e8a9 864S_force_next(pTHX_ I32 type)
79072805 865{
3280af22
NIS
866 PL_nexttype[PL_nexttoke] = type;
867 PL_nexttoke++;
868 if (PL_lex_state != LEX_KNOWNEXT) {
869 PL_lex_defer = PL_lex_state;
870 PL_lex_expect = PL_expect;
871 PL_lex_state = LEX_KNOWNEXT;
79072805
LW
872 }
873}
874
ffb4593c
NT
875/*
876 * S_force_word
877 * When the lexer knows the next thing is a word (for instance, it has
878 * just seen -> and it knows that the next char is a word char, then
879 * it calls S_force_word to stick the next word into the PL_next lookahead.
880 *
881 * Arguments:
b1b65b59 882 * char *start : buffer position (must be within PL_linestr)
ffb4593c
NT
883 * int token : PL_next will be this type of bare word (e.g., METHOD,WORD)
884 * int check_keyword : if true, Perl checks to make sure the word isn't
885 * a keyword (do this if the word is a label, e.g. goto FOO)
886 * int allow_pack : if true, : characters will also be allowed (require,
887 * use, etc. do this)
9cbb5ea2 888 * int allow_initial_tick : used by the "sub" lexer only.
ffb4593c
NT
889 */
890
76e3520e 891STATIC char *
cea2e8a9 892S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
79072805 893{
463ee0b2
LW
894 register char *s;
895 STRLEN len;
4e553d73 896
463ee0b2
LW
897 start = skipspace(start);
898 s = start;
7e2040f0 899 if (isIDFIRST_lazy_if(s,UTF) ||
a0d0e21e 900 (allow_pack && *s == ':') ||
15f0808c 901 (allow_initial_tick && *s == '\'') )
a0d0e21e 902 {
3280af22
NIS
903 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
904 if (check_keyword && keyword(PL_tokenbuf, len))
463ee0b2
LW
905 return start;
906 if (token == METHOD) {
907 s = skipspace(s);
908 if (*s == '(')
3280af22 909 PL_expect = XTERM;
463ee0b2 910 else {
3280af22 911 PL_expect = XOPERATOR;
463ee0b2 912 }
79072805 913 }
3280af22
NIS
914 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
915 PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
5464dbd2
RGS
916 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
917 SvUTF8_on(((SVOP*)PL_nextval[PL_nexttoke].opval)->op_sv);
79072805
LW
918 force_next(token);
919 }
920 return s;
921}
922
ffb4593c
NT
923/*
924 * S_force_ident
9cbb5ea2 925 * Called when the lexer wants $foo *foo &foo etc, but the program
ffb4593c
NT
926 * text only contains the "foo" portion. The first argument is a pointer
927 * to the "foo", and the second argument is the type symbol to prefix.
928 * Forces the next token to be a "WORD".
9cbb5ea2 929 * Creates the symbol if it didn't already exist (via gv_fetchpv()).
ffb4593c
NT
930 */
931
76e3520e 932STATIC void
cea2e8a9 933S_force_ident(pTHX_ register char *s, int kind)
79072805
LW
934{
935 if (s && *s) {
11343788 936 OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
3280af22 937 PL_nextval[PL_nexttoke].opval = o;
79072805 938 force_next(WORD);
748a9306 939 if (kind) {
11343788 940 o->op_private = OPpCONST_ENTERED;
55497cff 941 /* XXX see note in pp_entereval() for why we forgo typo
942 warnings if the symbol must be introduced in an eval.
943 GSAR 96-10-12 */
3280af22 944 gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
a0d0e21e
LW
945 kind == '$' ? SVt_PV :
946 kind == '@' ? SVt_PVAV :
947 kind == '%' ? SVt_PVHV :
948 SVt_PVGV
949 );
748a9306 950 }
79072805
LW
951 }
952}
953
1571675a
GS
954NV
955Perl_str_to_version(pTHX_ SV *sv)
956{
957 NV retval = 0.0;
958 NV nshift = 1.0;
959 STRLEN len;
960 char *start = SvPVx(sv,len);
3aa33fe5 961 bool utf = SvUTF8(sv) ? TRUE : FALSE;
1571675a
GS
962 char *end = start + len;
963 while (start < end) {
ba210ebe 964 STRLEN skip;
1571675a
GS
965 UV n;
966 if (utf)
9041c2e3 967 n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1571675a
GS
968 else {
969 n = *(U8*)start;
970 skip = 1;
971 }
972 retval += ((NV)n)/nshift;
973 start += skip;
974 nshift *= 1000;
975 }
976 return retval;
977}
978
4e553d73 979/*
ffb4593c
NT
980 * S_force_version
981 * Forces the next token to be a version number.
e759cc13
RGS
982 * If the next token appears to be an invalid version number, (e.g. "v2b"),
983 * and if "guessing" is TRUE, then no new token is created (and the caller
984 * must use an alternative parsing method).
ffb4593c
NT
985 */
986
76e3520e 987STATIC char *
e759cc13 988S_force_version(pTHX_ char *s, int guessing)
89bfa8cd 989{
990 OP *version = Nullop;
44dcb63b 991 char *d;
89bfa8cd 992
993 s = skipspace(s);
994
44dcb63b 995 d = s;
dd629d5b 996 if (*d == 'v')
44dcb63b 997 d++;
44dcb63b 998 if (isDIGIT(*d)) {
e759cc13
RGS
999 while (isDIGIT(*d) || *d == '_' || *d == '.')
1000 d++;
9f3d182e 1001 if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
dd629d5b 1002 SV *ver;
b73d6f50 1003 s = scan_num(s, &yylval);
89bfa8cd 1004 version = yylval.opval;
dd629d5b
GS
1005 ver = cSVOPx(version)->op_sv;
1006 if (SvPOK(ver) && !SvNIOK(ver)) {
155aba94 1007 (void)SvUPGRADE(ver, SVt_PVNV);
1571675a
GS
1008 SvNVX(ver) = str_to_version(ver);
1009 SvNOK_on(ver); /* hint that it is a version */
44dcb63b 1010 }
89bfa8cd 1011 }
e759cc13
RGS
1012 else if (guessing)
1013 return s;
89bfa8cd 1014 }
1015
1016 /* NOTE: The parser sees the package name and the VERSION swapped */
3280af22 1017 PL_nextval[PL_nexttoke].opval = version;
4e553d73 1018 force_next(WORD);
89bfa8cd 1019
e759cc13 1020 return s;
89bfa8cd 1021}
1022
ffb4593c
NT
1023/*
1024 * S_tokeq
1025 * Tokenize a quoted string passed in as an SV. It finds the next
1026 * chunk, up to end of string or a backslash. It may make a new
1027 * SV containing that chunk (if HINT_NEW_STRING is on). It also
1028 * turns \\ into \.
1029 */
1030
76e3520e 1031STATIC SV *
cea2e8a9 1032S_tokeq(pTHX_ SV *sv)
79072805
LW
1033{
1034 register char *s;
1035 register char *send;
1036 register char *d;
b3ac6de7
IZ
1037 STRLEN len = 0;
1038 SV *pv = sv;
79072805
LW
1039
1040 if (!SvLEN(sv))
b3ac6de7 1041 goto finish;
79072805 1042
a0d0e21e 1043 s = SvPV_force(sv, len);
21a311ee 1044 if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
b3ac6de7 1045 goto finish;
463ee0b2 1046 send = s + len;
79072805
LW
1047 while (s < send && *s != '\\')
1048 s++;
1049 if (s == send)
b3ac6de7 1050 goto finish;
79072805 1051 d = s;
be4731d2 1052 if ( PL_hints & HINT_NEW_STRING ) {
79cb57f6 1053 pv = sv_2mortal(newSVpvn(SvPVX(pv), len));
be4731d2
NIS
1054 if (SvUTF8(sv))
1055 SvUTF8_on(pv);
1056 }
79072805
LW
1057 while (s < send) {
1058 if (*s == '\\') {
a0d0e21e 1059 if (s + 1 < send && (s[1] == '\\'))
79072805
LW
1060 s++; /* all that, just for this */
1061 }
1062 *d++ = *s++;
1063 }
1064 *d = '\0';
463ee0b2 1065 SvCUR_set(sv, d - SvPVX(sv));
b3ac6de7 1066 finish:
3280af22 1067 if ( PL_hints & HINT_NEW_STRING )
b3ac6de7 1068 return new_constant(NULL, 0, "q", sv, pv, "q");
79072805
LW
1069 return sv;
1070}
1071
ffb4593c
NT
1072/*
1073 * Now come three functions related to double-quote context,
1074 * S_sublex_start, S_sublex_push, and S_sublex_done. They're used when
1075 * converting things like "\u\Lgnat" into ucfirst(lc("gnat")). They
1076 * interact with PL_lex_state, and create fake ( ... ) argument lists
1077 * to handle functions and concatenation.
1078 * They assume that whoever calls them will be setting up a fake
1079 * join call, because each subthing puts a ',' after it. This lets
1080 * "lower \luPpEr"
1081 * become
1082 * join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1083 *
1084 * (I'm not sure whether the spurious commas at the end of lcfirst's
1085 * arguments and join's arguments are created or not).
1086 */
1087
1088/*
1089 * S_sublex_start
1090 * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
1091 *
1092 * Pattern matching will set PL_lex_op to the pattern-matching op to
1093 * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
1094 *
1095 * OP_CONST and OP_READLINE are easy--just make the new op and return.
1096 *
1097 * Everything else becomes a FUNC.
1098 *
1099 * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1100 * had an OP_CONST or OP_READLINE). This just sets us up for a
1101 * call to S_sublex_push().
1102 */
1103
76e3520e 1104STATIC I32
cea2e8a9 1105S_sublex_start(pTHX)
79072805
LW
1106{
1107 register I32 op_type = yylval.ival;
79072805
LW
1108
1109 if (op_type == OP_NULL) {
3280af22
NIS
1110 yylval.opval = PL_lex_op;
1111 PL_lex_op = Nullop;
79072805
LW
1112 return THING;
1113 }
1114 if (op_type == OP_CONST || op_type == OP_READLINE) {
3280af22 1115 SV *sv = tokeq(PL_lex_stuff);
b3ac6de7
IZ
1116
1117 if (SvTYPE(sv) == SVt_PVIV) {
1118 /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1119 STRLEN len;
1120 char *p;
1121 SV *nsv;
1122
1123 p = SvPV(sv, len);
79cb57f6 1124 nsv = newSVpvn(p, len);
01ec43d0
GS
1125 if (SvUTF8(sv))
1126 SvUTF8_on(nsv);
b3ac6de7
IZ
1127 SvREFCNT_dec(sv);
1128 sv = nsv;
4e553d73 1129 }
b3ac6de7 1130 yylval.opval = (OP*)newSVOP(op_type, 0, sv);
3280af22 1131 PL_lex_stuff = Nullsv;
6f33ba73
RGS
1132 /* Allow <FH> // "foo" */
1133 if (op_type == OP_READLINE)
1134 PL_expect = XTERMORDORDOR;
79072805
LW
1135 return THING;
1136 }
1137
3280af22
NIS
1138 PL_sublex_info.super_state = PL_lex_state;
1139 PL_sublex_info.sub_inwhat = op_type;
1140 PL_sublex_info.sub_op = PL_lex_op;
1141 PL_lex_state = LEX_INTERPPUSH;
55497cff 1142
3280af22
NIS
1143 PL_expect = XTERM;
1144 if (PL_lex_op) {
1145 yylval.opval = PL_lex_op;
1146 PL_lex_op = Nullop;
55497cff 1147 return PMFUNC;
1148 }
1149 else
1150 return FUNC;
1151}
1152
ffb4593c
NT
1153/*
1154 * S_sublex_push
1155 * Create a new scope to save the lexing state. The scope will be
1156 * ended in S_sublex_done. Returns a '(', starting the function arguments
1157 * to the uc, lc, etc. found before.
1158 * Sets PL_lex_state to LEX_INTERPCONCAT.
1159 */
1160
76e3520e 1161STATIC I32
cea2e8a9 1162S_sublex_push(pTHX)
55497cff 1163{
f46d017c 1164 ENTER;
55497cff 1165
3280af22
NIS
1166 PL_lex_state = PL_sublex_info.super_state;
1167 SAVEI32(PL_lex_dojoin);
1168 SAVEI32(PL_lex_brackets);
3280af22
NIS
1169 SAVEI32(PL_lex_casemods);
1170 SAVEI32(PL_lex_starts);
1171 SAVEI32(PL_lex_state);
7766f137 1172 SAVEVPTR(PL_lex_inpat);
3280af22 1173 SAVEI32(PL_lex_inwhat);
57843af0 1174 SAVECOPLINE(PL_curcop);
3280af22 1175 SAVEPPTR(PL_bufptr);
8452ff4b 1176 SAVEPPTR(PL_bufend);
3280af22
NIS
1177 SAVEPPTR(PL_oldbufptr);
1178 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
1179 SAVEPPTR(PL_last_lop);
1180 SAVEPPTR(PL_last_uni);
3280af22
NIS
1181 SAVEPPTR(PL_linestart);
1182 SAVESPTR(PL_linestr);
8edd5f42
RGS
1183 SAVEGENERICPV(PL_lex_brackstack);
1184 SAVEGENERICPV(PL_lex_casestack);
3280af22
NIS
1185
1186 PL_linestr = PL_lex_stuff;
1187 PL_lex_stuff = Nullsv;
1188
9cbb5ea2
GS
1189 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1190 = SvPVX(PL_linestr);
3280af22 1191 PL_bufend += SvCUR(PL_linestr);
207e3d1a 1192 PL_last_lop = PL_last_uni = Nullch;
3280af22
NIS
1193 SAVEFREESV(PL_linestr);
1194
1195 PL_lex_dojoin = FALSE;
1196 PL_lex_brackets = 0;
3280af22
NIS
1197 New(899, PL_lex_brackstack, 120, char);
1198 New(899, PL_lex_casestack, 12, char);
3280af22
NIS
1199 PL_lex_casemods = 0;
1200 *PL_lex_casestack = '\0';
1201 PL_lex_starts = 0;
1202 PL_lex_state = LEX_INTERPCONCAT;
eb160463 1203 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22
NIS
1204
1205 PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1206 if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1207 PL_lex_inpat = PL_sublex_info.sub_op;
79072805 1208 else
3280af22 1209 PL_lex_inpat = Nullop;
79072805 1210
55497cff 1211 return '(';
79072805
LW
1212}
1213
ffb4593c
NT
1214/*
1215 * S_sublex_done
1216 * Restores lexer state after a S_sublex_push.
1217 */
1218
76e3520e 1219STATIC I32
cea2e8a9 1220S_sublex_done(pTHX)
79072805 1221{
3280af22 1222 if (!PL_lex_starts++) {
9aa983d2
JH
1223 SV *sv = newSVpvn("",0);
1224 if (SvUTF8(PL_linestr))
1225 SvUTF8_on(sv);
3280af22 1226 PL_expect = XOPERATOR;
9aa983d2 1227 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
79072805
LW
1228 return THING;
1229 }
1230
3280af22
NIS
1231 if (PL_lex_casemods) { /* oops, we've got some unbalanced parens */
1232 PL_lex_state = LEX_INTERPCASEMOD;
cea2e8a9 1233 return yylex();
79072805
LW
1234 }
1235
ffb4593c 1236 /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
3280af22
NIS
1237 if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1238 PL_linestr = PL_lex_repl;
1239 PL_lex_inpat = 0;
1240 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1241 PL_bufend += SvCUR(PL_linestr);
207e3d1a 1242 PL_last_lop = PL_last_uni = Nullch;
3280af22
NIS
1243 SAVEFREESV(PL_linestr);
1244 PL_lex_dojoin = FALSE;
1245 PL_lex_brackets = 0;
3280af22
NIS
1246 PL_lex_casemods = 0;
1247 *PL_lex_casestack = '\0';
1248 PL_lex_starts = 0;
25da4f38 1249 if (SvEVALED(PL_lex_repl)) {
3280af22
NIS
1250 PL_lex_state = LEX_INTERPNORMAL;
1251 PL_lex_starts++;
e9fa98b2
HS
1252 /* we don't clear PL_lex_repl here, so that we can check later
1253 whether this is an evalled subst; that means we rely on the
1254 logic to ensure sublex_done() is called again only via the
1255 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
79072805 1256 }
e9fa98b2 1257 else {
3280af22 1258 PL_lex_state = LEX_INTERPCONCAT;
e9fa98b2
HS
1259 PL_lex_repl = Nullsv;
1260 }
79072805 1261 return ',';
ffed7fef
LW
1262 }
1263 else {
f46d017c 1264 LEAVE;
3280af22
NIS
1265 PL_bufend = SvPVX(PL_linestr);
1266 PL_bufend += SvCUR(PL_linestr);
1267 PL_expect = XOPERATOR;
09bef843 1268 PL_sublex_info.sub_inwhat = 0;
79072805 1269 return ')';
ffed7fef
LW
1270 }
1271}
1272
02aa26ce
NT
1273/*
1274 scan_const
1275
1276 Extracts a pattern, double-quoted string, or transliteration. This
1277 is terrifying code.
1278
3280af22
NIS
1279 It looks at lex_inwhat and PL_lex_inpat to find out whether it's
1280 processing a pattern (PL_lex_inpat is true), a transliteration
02aa26ce
NT
1281 (lex_inwhat & OP_TRANS is true), or a double-quoted string.
1282
9b599b2a
GS
1283 Returns a pointer to the character scanned up to. Iff this is
1284 advanced from the start pointer supplied (ie if anything was
1285 successfully parsed), will leave an OP for the substring scanned
1286 in yylval. Caller must intuit reason for not parsing further
1287 by looking at the next characters herself.
1288
02aa26ce
NT
1289 In patterns:
1290 backslashes:
1291 double-quoted style: \r and \n
1292 regexp special ones: \D \s
1293 constants: \x3
1294 backrefs: \1 (deprecated in substitution replacements)
1295 case and quoting: \U \Q \E
1296 stops on @ and $, but not for $ as tail anchor
1297
1298 In transliterations:
1299 characters are VERY literal, except for - not at the start or end
1300 of the string, which indicates a range. scan_const expands the
1301 range to the full set of intermediate characters.
1302
1303 In double-quoted strings:
1304 backslashes:
1305 double-quoted style: \r and \n
1306 constants: \x3
1307 backrefs: \1 (deprecated)
1308 case and quoting: \U \Q \E
1309 stops on @ and $
1310
1311 scan_const does *not* construct ops to handle interpolated strings.
1312 It stops processing as soon as it finds an embedded $ or @ variable
1313 and leaves it to the caller to work out what's going on.
1314
da6eedaa 1315 @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @::foo.
02aa26ce
NT
1316
1317 $ in pattern could be $foo or could be tail anchor. Assumption:
1318 it's a tail anchor if $ is the last thing in the string, or if it's
1319 followed by one of ")| \n\t"
1320
1321 \1 (backreferences) are turned into $1
1322
1323 The structure of the code is
1324 while (there's a character to process) {
1325 handle transliteration ranges
1326 skip regexp comments
1327 skip # initiated comments in //x patterns
1328 check for embedded @foo
1329 check for embedded scalars
1330 if (backslash) {
1331 leave intact backslashes from leave (below)
1332 deprecate \1 in strings and sub replacements
1333 handle string-changing backslashes \l \U \Q \E, etc.
1334 switch (what was escaped) {
1335 handle - in a transliteration (becomes a literal -)
1336 handle \132 octal characters
1337 handle 0x15 hex characters
1338 handle \cV (control V)
1339 handle printf backslashes (\f, \r, \n, etc)
1340 } (end switch)
1341 } (end if backslash)
1342 } (end while character to read)
4e553d73 1343
02aa26ce
NT
1344*/
1345
76e3520e 1346STATIC char *
cea2e8a9 1347S_scan_const(pTHX_ char *start)
79072805 1348{
3280af22 1349 register char *send = PL_bufend; /* end of the constant */
02aa26ce
NT
1350 SV *sv = NEWSV(93, send - start); /* sv for the constant */
1351 register char *s = start; /* start of the constant */
1352 register char *d = SvPVX(sv); /* destination for copies */
1353 bool dorange = FALSE; /* are we in a translit range? */
c2e66d9e 1354 bool didrange = FALSE; /* did we just finish a range? */
2b9d42f0
NIS
1355 I32 has_utf8 = FALSE; /* Output constant is UTF8 */
1356 I32 this_utf8 = UTF; /* The source string is assumed to be UTF8 */
012bcf8d
GS
1357 UV uv;
1358
dff6d3cd 1359 const char *leaveit = /* set of acceptably-backslashed characters */
3280af22 1360 PL_lex_inpat
b6d5fef8 1361 ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxz0123456789[{]} \t\n\r\f\v#"
9b599b2a 1362 : "";
79072805 1363
2b9d42f0
NIS
1364 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1365 /* If we are doing a trans and we know we want UTF8 set expectation */
1366 has_utf8 = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1367 this_utf8 = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1368 }
1369
1370
79072805 1371 while (s < send || dorange) {
02aa26ce 1372 /* get transliterations out of the way (they're most literal) */
3280af22 1373 if (PL_lex_inwhat == OP_TRANS) {
02aa26ce 1374 /* expand a range A-Z to the full set of characters. AIE! */
79072805 1375 if (dorange) {
1ba5c669
JH
1376 I32 i; /* current expanded character */
1377 I32 min; /* first character in range */
1378 I32 max; /* last character in range */
02aa26ce 1379
2b9d42f0 1380 if (has_utf8) {
8973db79
JH
1381 char *c = (char*)utf8_hop((U8*)d, -1);
1382 char *e = d++;
1383 while (e-- > c)
1384 *(e + 1) = *e;
25716404 1385 *c = (char)UTF_TO_NATIVE(0xff);
8973db79
JH
1386 /* mark the range as done, and continue */
1387 dorange = FALSE;
1388 didrange = TRUE;
1389 continue;
1390 }
2b9d42f0 1391
02aa26ce 1392 i = d - SvPVX(sv); /* remember current offset */
9cbb5ea2
GS
1393 SvGROW(sv, SvLEN(sv) + 256); /* never more than 256 chars in a range */
1394 d = SvPVX(sv) + i; /* refresh d after realloc */
02aa26ce
NT
1395 d -= 2; /* eat the first char and the - */
1396
8ada0baa
JH
1397 min = (U8)*d; /* first char in range */
1398 max = (U8)d[1]; /* last char in range */
1399
c2e66d9e 1400 if (min > max) {
01ec43d0 1401 Perl_croak(aTHX_
d1573ac7 1402 "Invalid range \"%c-%c\" in transliteration operator",
1ba5c669 1403 (char)min, (char)max);
c2e66d9e
GS
1404 }
1405
c7f1f016 1406#ifdef EBCDIC
8ada0baa
JH
1407 if ((isLOWER(min) && isLOWER(max)) ||
1408 (isUPPER(min) && isUPPER(max))) {
1409 if (isLOWER(min)) {
1410 for (i = min; i <= max; i++)
1411 if (isLOWER(i))
db42d148 1412 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1413 } else {
1414 for (i = min; i <= max; i++)
1415 if (isUPPER(i))
db42d148 1416 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1417 }
1418 }
1419 else
1420#endif
1421 for (i = min; i <= max; i++)
eb160463 1422 *d++ = (char)i;
02aa26ce
NT
1423
1424 /* mark the range as done, and continue */
79072805 1425 dorange = FALSE;
01ec43d0 1426 didrange = TRUE;
79072805 1427 continue;
4e553d73 1428 }
02aa26ce
NT
1429
1430 /* range begins (ignore - as first or last char) */
79072805 1431 else if (*s == '-' && s+1 < send && s != start) {
4e553d73 1432 if (didrange) {
1fafa243 1433 Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
01ec43d0 1434 }
2b9d42f0 1435 if (has_utf8) {
25716404 1436 *d++ = (char)UTF_TO_NATIVE(0xff); /* use illegal utf8 byte--see pmtrans */
a0ed51b3
LW
1437 s++;
1438 continue;
1439 }
79072805
LW
1440 dorange = TRUE;
1441 s++;
01ec43d0
GS
1442 }
1443 else {
1444 didrange = FALSE;
1445 }
79072805 1446 }
02aa26ce
NT
1447
1448 /* if we get here, we're not doing a transliteration */
1449
0f5d15d6
IZ
1450 /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
1451 except for the last char, which will be done separately. */
3280af22 1452 else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
cc6b7395 1453 if (s[2] == '#') {
e994fd66 1454 while (s+1 < send && *s != ')')
db42d148 1455 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
155aba94
GS
1456 }
1457 else if (s[2] == '{' /* This should match regcomp.c */
1458 || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
1459 {
cc6b7395 1460 I32 count = 1;
0f5d15d6 1461 char *regparse = s + (s[2] == '{' ? 3 : 4);
cc6b7395
IZ
1462 char c;
1463
d9f97599
GS
1464 while (count && (c = *regparse)) {
1465 if (c == '\\' && regparse[1])
1466 regparse++;
4e553d73 1467 else if (c == '{')
cc6b7395 1468 count++;
4e553d73 1469 else if (c == '}')
cc6b7395 1470 count--;
d9f97599 1471 regparse++;
cc6b7395 1472 }
e994fd66 1473 if (*regparse != ')')
5bdf89e7 1474 regparse--; /* Leave one char for continuation. */
0f5d15d6 1475 while (s < regparse)
db42d148 1476 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
cc6b7395 1477 }
748a9306 1478 }
02aa26ce
NT
1479
1480 /* likewise skip #-initiated comments in //x patterns */
3280af22
NIS
1481 else if (*s == '#' && PL_lex_inpat &&
1482 ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
748a9306 1483 while (s+1 < send && *s != '\n')
db42d148 1484 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
748a9306 1485 }
02aa26ce 1486
5d1d4326 1487 /* check for embedded arrays
da6eedaa 1488 (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
5d1d4326 1489 */
7e2040f0 1490 else if (*s == '@' && s[1]
5d1d4326 1491 && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$+-", s[1])))
79072805 1492 break;
02aa26ce
NT
1493
1494 /* check for embedded scalars. only stop if we're sure it's a
1495 variable.
1496 */
79072805 1497 else if (*s == '$') {
3280af22 1498 if (!PL_lex_inpat) /* not a regexp, so $ must be var */
79072805 1499 break;
6002328a 1500 if (s + 1 < send && !strchr("()| \r\n\t", s[1]))
79072805
LW
1501 break; /* in regexp, $ might be tail anchor */
1502 }
02aa26ce 1503
2b9d42f0
NIS
1504 /* End of else if chain - OP_TRANS rejoin rest */
1505
02aa26ce 1506 /* backslashes */
79072805
LW
1507 if (*s == '\\' && s+1 < send) {
1508 s++;
02aa26ce
NT
1509
1510 /* some backslashes we leave behind */
c9f97d15 1511 if (*leaveit && *s && strchr(leaveit, *s)) {
db42d148
NIS
1512 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
1513 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
79072805
LW
1514 continue;
1515 }
02aa26ce
NT
1516
1517 /* deprecate \1 in strings and substitution replacements */
3280af22 1518 if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
a0d0e21e 1519 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
79072805 1520 {
599cee73 1521 if (ckWARN(WARN_SYNTAX))
9014280d 1522 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
79072805
LW
1523 *--s = '$';
1524 break;
1525 }
02aa26ce
NT
1526
1527 /* string-change backslash escapes */
3280af22 1528 if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
79072805
LW
1529 --s;
1530 break;
1531 }
02aa26ce
NT
1532
1533 /* if we get here, it's either a quoted -, or a digit */
79072805 1534 switch (*s) {
02aa26ce
NT
1535
1536 /* quoted - in transliterations */
79072805 1537 case '-':
3280af22 1538 if (PL_lex_inwhat == OP_TRANS) {
79072805
LW
1539 *d++ = *s++;
1540 continue;
1541 }
1542 /* FALL THROUGH */
1543 default:
11b8faa4 1544 {
707afd92
MS
1545 if (ckWARN(WARN_MISC) &&
1546 isALNUM(*s) &&
1547 *s != '_')
9014280d 1548 Perl_warner(aTHX_ packWARN(WARN_MISC),
11b8faa4
JH
1549 "Unrecognized escape \\%c passed through",
1550 *s);
1551 /* default action is to copy the quoted character */
f9a63242 1552 goto default_action;
11b8faa4 1553 }
02aa26ce
NT
1554
1555 /* \132 indicates an octal constant */
79072805
LW
1556 case '0': case '1': case '2': case '3':
1557 case '4': case '5': case '6': case '7':
ba210ebe 1558 {
53305cf1
NC
1559 I32 flags = 0;
1560 STRLEN len = 3;
1561 uv = grok_oct(s, &len, &flags, NULL);
ba210ebe
JH
1562 s += len;
1563 }
012bcf8d 1564 goto NUM_ESCAPE_INSERT;
02aa26ce
NT
1565
1566 /* \x24 indicates a hex constant */
79072805 1567 case 'x':
a0ed51b3
LW
1568 ++s;
1569 if (*s == '{') {
1570 char* e = strchr(s, '}');
a4c04bdc
NC
1571 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1572 PERL_SCAN_DISALLOW_PREFIX;
53305cf1 1573 STRLEN len;
355860ce 1574
53305cf1 1575 ++s;
adaeee49 1576 if (!e) {
a0ed51b3 1577 yyerror("Missing right brace on \\x{}");
355860ce 1578 continue;
ba210ebe 1579 }
53305cf1
NC
1580 len = e - s;
1581 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe 1582 s = e + 1;
a0ed51b3
LW
1583 }
1584 else {
ba210ebe 1585 {
53305cf1 1586 STRLEN len = 2;
a4c04bdc 1587 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
53305cf1 1588 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe
JH
1589 s += len;
1590 }
012bcf8d
GS
1591 }
1592
1593 NUM_ESCAPE_INSERT:
1594 /* Insert oct or hex escaped character.
301d3d20 1595 * There will always enough room in sv since such
db42d148 1596 * escapes will be longer than any UTF-8 sequence
301d3d20 1597 * they can end up as. */
ba7cea30 1598
c7f1f016
NIS
1599 /* We need to map to chars to ASCII before doing the tests
1600 to cover EBCDIC
1601 */
c4d5f83a 1602 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
9aa983d2 1603 if (!has_utf8 && uv > 255) {
301d3d20
JH
1604 /* Might need to recode whatever we have
1605 * accumulated so far if it contains any
1606 * hibit chars.
1607 *
1608 * (Can't we keep track of that and avoid
1609 * this rescan? --jhi)
012bcf8d 1610 */
c7f1f016 1611 int hicount = 0;
63cd0674
NIS
1612 U8 *c;
1613 for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
c4d5f83a 1614 if (!NATIVE_IS_INVARIANT(*c)) {
012bcf8d 1615 hicount++;
db42d148 1616 }
012bcf8d 1617 }
63cd0674 1618 if (hicount) {
db42d148
NIS
1619 STRLEN offset = d - SvPVX(sv);
1620 U8 *src, *dst;
1621 d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
1622 src = (U8 *)d - 1;
1623 dst = src+hicount;
1624 d += hicount;
1625 while (src >= (U8 *)SvPVX(sv)) {
c4d5f83a 1626 if (!NATIVE_IS_INVARIANT(*src)) {
63cd0674 1627 U8 ch = NATIVE_TO_ASCII(*src);
eb160463
GS
1628 *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
1629 *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
012bcf8d
GS
1630 }
1631 else {
63cd0674 1632 *dst-- = *src;
012bcf8d 1633 }
c7f1f016 1634 src--;
012bcf8d
GS
1635 }
1636 }
1637 }
1638
9aa983d2 1639 if (has_utf8 || uv > 255) {
9041c2e3 1640 d = (char*)uvchr_to_utf8((U8*)d, uv);
4e553d73 1641 has_utf8 = TRUE;
f9a63242
JH
1642 if (PL_lex_inwhat == OP_TRANS &&
1643 PL_sublex_info.sub_op) {
1644 PL_sublex_info.sub_op->op_private |=
1645 (PL_lex_repl ? OPpTRANS_FROM_UTF
1646 : OPpTRANS_TO_UTF);
f9a63242 1647 }
012bcf8d 1648 }
a0ed51b3 1649 else {
012bcf8d 1650 *d++ = (char)uv;
a0ed51b3 1651 }
012bcf8d
GS
1652 }
1653 else {
c4d5f83a 1654 *d++ = (char) uv;
a0ed51b3 1655 }
79072805 1656 continue;
02aa26ce 1657
b239daa5 1658 /* \N{LATIN SMALL LETTER A} is a named character */
4a2d328f 1659 case 'N':
55eda711 1660 ++s;
423cee85
JH
1661 if (*s == '{') {
1662 char* e = strchr(s, '}');
155aba94 1663 SV *res;
423cee85
JH
1664 STRLEN len;
1665 char *str;
4e553d73 1666
423cee85 1667 if (!e) {
5777a3f7 1668 yyerror("Missing right brace on \\N{}");
423cee85
JH
1669 e = s - 1;
1670 goto cont_scan;
1671 }
dbc0d4f2
JH
1672 if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
1673 /* \N{U+...} */
1674 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1675 PERL_SCAN_DISALLOW_PREFIX;
1676 s += 3;
1677 len = e - s;
1678 uv = grok_hex(s, &len, &flags, NULL);
1679 s = e + 1;
1680 goto NUM_ESCAPE_INSERT;
1681 }
55eda711
JH
1682 res = newSVpvn(s + 1, e - s - 1);
1683 res = new_constant( Nullch, 0, "charnames",
1684 res, Nullsv, "\\N{...}" );
f9a63242
JH
1685 if (has_utf8)
1686 sv_utf8_upgrade(res);
423cee85 1687 str = SvPV(res,len);
1c47067b
JH
1688#ifdef EBCDIC_NEVER_MIND
1689 /* charnames uses pack U and that has been
1690 * recently changed to do the below uni->native
1691 * mapping, so this would be redundant (and wrong,
1692 * the code point would be doubly converted).
1693 * But leave this in just in case the pack U change
1694 * gets revoked, but the semantics is still
1695 * desireable for charnames. --jhi */
cddc7ef4
JH
1696 {
1697 UV uv = utf8_to_uvchr((U8*)str, 0);
1698
1699 if (uv < 0x100) {
1700 U8 tmpbuf[UTF8_MAXLEN+1], *d;
1701
1702 d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
1703 sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
1704 str = SvPV(res, len);
1705 }
1706 }
1707#endif
89491803 1708 if (!has_utf8 && SvUTF8(res)) {
f08d6ad9
GS
1709 char *ostart = SvPVX(sv);
1710 SvCUR_set(sv, d - ostart);
1711 SvPOK_on(sv);
e4f3eed8 1712 *d = '\0';
f08d6ad9 1713 sv_utf8_upgrade(sv);
d2f449dd 1714 /* this just broke our allocation above... */
eb160463 1715 SvGROW(sv, (STRLEN)(send - start));
f08d6ad9 1716 d = SvPVX(sv) + SvCUR(sv);
89491803 1717 has_utf8 = TRUE;
f08d6ad9 1718 }
eb160463 1719 if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
423cee85
JH
1720 char *odest = SvPVX(sv);
1721
8973db79 1722 SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
423cee85
JH
1723 d = SvPVX(sv) + (d - odest);
1724 }
1725 Copy(str, d, len, char);
1726 d += len;
1727 SvREFCNT_dec(res);
1728 cont_scan:
1729 s = e + 1;
1730 }
1731 else
5777a3f7 1732 yyerror("Missing braces on \\N{}");
423cee85
JH
1733 continue;
1734
02aa26ce 1735 /* \c is a control character */
79072805
LW
1736 case 'c':
1737 s++;
961ce445 1738 if (s < send) {
ba210ebe 1739 U8 c = *s++;
c7f1f016
NIS
1740#ifdef EBCDIC
1741 if (isLOWER(c))
1742 c = toUPPER(c);
1743#endif
db42d148 1744 *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
ba210ebe 1745 }
961ce445
RGS
1746 else {
1747 yyerror("Missing control char name in \\c");
1748 }
79072805 1749 continue;
02aa26ce
NT
1750
1751 /* printf-style backslashes, formfeeds, newlines, etc */
79072805 1752 case 'b':
db42d148 1753 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
79072805
LW
1754 break;
1755 case 'n':
db42d148 1756 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
79072805
LW
1757 break;
1758 case 'r':
db42d148 1759 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
79072805
LW
1760 break;
1761 case 'f':
db42d148 1762 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
79072805
LW
1763 break;
1764 case 't':
db42d148 1765 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
79072805 1766 break;
34a3fe2a 1767 case 'e':
db42d148 1768 *d++ = ASCII_TO_NEED(has_utf8,'\033');
34a3fe2a
PP
1769 break;
1770 case 'a':
db42d148 1771 *d++ = ASCII_TO_NEED(has_utf8,'\007');
79072805 1772 break;
02aa26ce
NT
1773 } /* end switch */
1774
79072805
LW
1775 s++;
1776 continue;
02aa26ce
NT
1777 } /* end if (backslash) */
1778
f9a63242 1779 default_action:
2b9d42f0
NIS
1780 /* If we started with encoded form, or already know we want it
1781 and then encode the next character */
1782 if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
1783 STRLEN len = 1;
1784 UV uv = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
1785 STRLEN need = UNISKIP(NATIVE_TO_UNI(uv));
1786 s += len;
1787 if (need > len) {
1788 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
1789 STRLEN off = d - SvPVX(sv);
1790 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
1791 }
1792 d = (char*)uvchr_to_utf8((U8*)d, uv);
1793 has_utf8 = TRUE;
1794 }
1795 else {
1796 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1797 }
02aa26ce
NT
1798 } /* while loop to process each character */
1799
1800 /* terminate the string and set up the sv */
79072805 1801 *d = '\0';
463ee0b2 1802 SvCUR_set(sv, d - SvPVX(sv));
2b9d42f0 1803 if (SvCUR(sv) >= SvLEN(sv))
d0063567 1804 Perl_croak(aTHX_ "panic: constant overflowed allocated space");
2b9d42f0 1805
79072805 1806 SvPOK_on(sv);
9f4817db 1807 if (PL_encoding && !has_utf8) {
d0063567
DK
1808 sv_recode_to_utf8(sv, PL_encoding);
1809 if (SvUTF8(sv))
1810 has_utf8 = TRUE;
9f4817db 1811 }
2b9d42f0 1812 if (has_utf8) {
7e2040f0 1813 SvUTF8_on(sv);
2b9d42f0 1814 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
d0063567 1815 PL_sublex_info.sub_op->op_private |=
2b9d42f0
NIS
1816 (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1817 }
1818 }
79072805 1819
02aa26ce 1820 /* shrink the sv if we allocated more than we used */
79072805
LW
1821 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1822 SvLEN_set(sv, SvCUR(sv) + 1);
463ee0b2 1823 Renew(SvPVX(sv), SvLEN(sv), char);
79072805 1824 }
02aa26ce 1825
9b599b2a 1826 /* return the substring (via yylval) only if we parsed anything */
3280af22
NIS
1827 if (s > PL_bufptr) {
1828 if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
4e553d73 1829 sv = new_constant(start, s - start, (PL_lex_inpat ? "qr" : "q"),
b3ac6de7 1830 sv, Nullsv,
4e553d73 1831 ( PL_lex_inwhat == OP_TRANS
b3ac6de7 1832 ? "tr"
3280af22 1833 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
b3ac6de7
IZ
1834 ? "s"
1835 : "qq")));
79072805 1836 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
b3ac6de7 1837 } else
8990e307 1838 SvREFCNT_dec(sv);
79072805
LW
1839 return s;
1840}
1841
ffb4593c
NT
1842/* S_intuit_more
1843 * Returns TRUE if there's more to the expression (e.g., a subscript),
1844 * FALSE otherwise.
ffb4593c
NT
1845 *
1846 * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
1847 *
1848 * ->[ and ->{ return TRUE
1849 * { and [ outside a pattern are always subscripts, so return TRUE
1850 * if we're outside a pattern and it's not { or [, then return FALSE
1851 * if we're in a pattern and the first char is a {
1852 * {4,5} (any digits around the comma) returns FALSE
1853 * if we're in a pattern and the first char is a [
1854 * [] returns FALSE
1855 * [SOMETHING] has a funky algorithm to decide whether it's a
1856 * character class or not. It has to deal with things like
1857 * /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
1858 * anything else returns TRUE
1859 */
1860
9cbb5ea2
GS
1861/* This is the one truly awful dwimmer necessary to conflate C and sed. */
1862
76e3520e 1863STATIC int
cea2e8a9 1864S_intuit_more(pTHX_ register char *s)
79072805 1865{
3280af22 1866 if (PL_lex_brackets)
79072805
LW
1867 return TRUE;
1868 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1869 return TRUE;
1870 if (*s != '{' && *s != '[')
1871 return FALSE;
3280af22 1872 if (!PL_lex_inpat)
79072805
LW
1873 return TRUE;
1874
1875 /* In a pattern, so maybe we have {n,m}. */
1876 if (*s == '{') {
1877 s++;
1878 if (!isDIGIT(*s))
1879 return TRUE;
1880 while (isDIGIT(*s))
1881 s++;
1882 if (*s == ',')
1883 s++;
1884 while (isDIGIT(*s))
1885 s++;
1886 if (*s == '}')
1887 return FALSE;
1888 return TRUE;
1889
1890 }
1891
1892 /* On the other hand, maybe we have a character class */
1893
1894 s++;
1895 if (*s == ']' || *s == '^')
1896 return FALSE;
1897 else {
ffb4593c 1898 /* this is terrifying, and it works */
79072805
LW
1899 int weight = 2; /* let's weigh the evidence */
1900 char seen[256];
f27ffc4a 1901 unsigned char un_char = 255, last_un_char;
93a17b20 1902 char *send = strchr(s,']');
3280af22 1903 char tmpbuf[sizeof PL_tokenbuf * 4];
79072805
LW
1904
1905 if (!send) /* has to be an expression */
1906 return TRUE;
1907
1908 Zero(seen,256,char);
1909 if (*s == '$')
1910 weight -= 3;
1911 else if (isDIGIT(*s)) {
1912 if (s[1] != ']') {
1913 if (isDIGIT(s[1]) && s[2] == ']')
1914 weight -= 10;
1915 }
1916 else
1917 weight -= 100;
1918 }
1919 for (; s < send; s++) {
1920 last_un_char = un_char;
1921 un_char = (unsigned char)*s;
1922 switch (*s) {
1923 case '@':
1924 case '&':
1925 case '$':
1926 weight -= seen[un_char] * 10;
7e2040f0 1927 if (isALNUM_lazy_if(s+1,UTF)) {
8903cb82 1928 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
a0d0e21e 1929 if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
79072805
LW
1930 weight -= 100;
1931 else
1932 weight -= 10;
1933 }
1934 else if (*s == '$' && s[1] &&
93a17b20
LW
1935 strchr("[#!%*<>()-=",s[1])) {
1936 if (/*{*/ strchr("])} =",s[2]))
79072805
LW
1937 weight -= 10;
1938 else
1939 weight -= 1;
1940 }
1941 break;
1942 case '\\':
1943 un_char = 254;
1944 if (s[1]) {
93a17b20 1945 if (strchr("wds]",s[1]))
79072805
LW
1946 weight += 100;
1947 else if (seen['\''] || seen['"'])
1948 weight += 1;
93a17b20 1949 else if (strchr("rnftbxcav",s[1]))
79072805
LW
1950 weight += 40;
1951 else if (isDIGIT(s[1])) {
1952 weight += 40;
1953 while (s[1] && isDIGIT(s[1]))
1954 s++;
1955 }
1956 }
1957 else
1958 weight += 100;
1959 break;
1960 case '-':
1961 if (s[1] == '\\')
1962 weight += 50;
93a17b20 1963 if (strchr("aA01! ",last_un_char))
79072805 1964 weight += 30;
93a17b20 1965 if (strchr("zZ79~",s[1]))
79072805 1966 weight += 30;
f27ffc4a
GS
1967 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
1968 weight -= 5; /* cope with negative subscript */
79072805
LW
1969 break;
1970 default:
3792a11b
NC
1971 if (!isALNUM(last_un_char)
1972 && !(last_un_char == '$' || last_un_char == '@'
1973 || last_un_char == '&')
1974 && isALPHA(*s) && s[1] && isALPHA(s[1])) {
79072805
LW
1975 char *d = tmpbuf;
1976 while (isALPHA(*s))
1977 *d++ = *s++;
1978 *d = '\0';
1979 if (keyword(tmpbuf, d - tmpbuf))
1980 weight -= 150;
1981 }
1982 if (un_char == last_un_char + 1)
1983 weight += 5;
1984 weight -= seen[un_char];
1985 break;
1986 }
1987 seen[un_char]++;
1988 }
1989 if (weight >= 0) /* probably a character class */
1990 return FALSE;
1991 }
1992
1993 return TRUE;
1994}
ffed7fef 1995
ffb4593c
NT
1996/*
1997 * S_intuit_method
1998 *
1999 * Does all the checking to disambiguate
2000 * foo bar
2001 * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise
2002 * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2003 *
2004 * First argument is the stuff after the first token, e.g. "bar".
2005 *
2006 * Not a method if bar is a filehandle.
2007 * Not a method if foo is a subroutine prototyped to take a filehandle.
2008 * Not a method if it's really "Foo $bar"
2009 * Method if it's "foo $bar"
2010 * Not a method if it's really "print foo $bar"
2011 * Method if it's really "foo package::" (interpreted as package->foo)
8f8cf39c 2012 * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3cb0bbe5 2013 * Not a method if bar is a filehandle or package, but is quoted with
ffb4593c
NT
2014 * =>
2015 */
2016
76e3520e 2017STATIC int
cea2e8a9 2018S_intuit_method(pTHX_ char *start, GV *gv)
a0d0e21e
LW
2019{
2020 char *s = start + (*start == '$');
3280af22 2021 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
2022 STRLEN len;
2023 GV* indirgv;
2024
2025 if (gv) {
b6c543e3 2026 CV *cv;
a0d0e21e
LW
2027 if (GvIO(gv))
2028 return 0;
b6c543e3
IZ
2029 if ((cv = GvCVu(gv))) {
2030 char *proto = SvPVX(cv);
2031 if (proto) {
2032 if (*proto == ';')
2033 proto++;
2034 if (*proto == '*')
2035 return 0;
2036 }
2037 } else
a0d0e21e
LW
2038 gv = 0;
2039 }
8903cb82 2040 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
ffb4593c
NT
2041 /* start is the beginning of the possible filehandle/object,
2042 * and s is the end of it
2043 * tmpbuf is a copy of it
2044 */
2045
a0d0e21e 2046 if (*start == '$') {
3280af22 2047 if (gv || PL_last_lop_op == OP_PRINT || isUPPER(*PL_tokenbuf))
a0d0e21e
LW
2048 return 0;
2049 s = skipspace(s);
3280af22
NIS
2050 PL_bufptr = start;
2051 PL_expect = XREF;
a0d0e21e
LW
2052 return *s == '(' ? FUNCMETH : METHOD;
2053 }
2054 if (!keyword(tmpbuf, len)) {
c3e0f903
GS
2055 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2056 len -= 2;
2057 tmpbuf[len] = '\0';
2058 goto bare_package;
2059 }
2060 indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
8ebc5c01 2061 if (indirgv && GvCVu(indirgv))
a0d0e21e
LW
2062 return 0;
2063 /* filehandle or package name makes it a method */
89bfa8cd 2064 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
a0d0e21e 2065 s = skipspace(s);
3280af22 2066 if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
55497cff 2067 return 0; /* no assumptions -- "=>" quotes bearword */
c3e0f903 2068 bare_package:
3280af22 2069 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
79cb57f6 2070 newSVpvn(tmpbuf,len));
3280af22
NIS
2071 PL_nextval[PL_nexttoke].opval->op_private = OPpCONST_BARE;
2072 PL_expect = XTERM;
a0d0e21e 2073 force_next(WORD);
3280af22 2074 PL_bufptr = s;
a0d0e21e
LW
2075 return *s == '(' ? FUNCMETH : METHOD;
2076 }
2077 }
2078 return 0;
2079}
2080
ffb4593c
NT
2081/*
2082 * S_incl_perldb
2083 * Return a string of Perl code to load the debugger. If PERL5DB
2084 * is set, it will return the contents of that, otherwise a
2085 * compile-time require of perl5db.pl.
2086 */
2087
76e3520e 2088STATIC char*
cea2e8a9 2089S_incl_perldb(pTHX)
a0d0e21e 2090{
3280af22 2091 if (PL_perldb) {
76e3520e 2092 char *pdb = PerlEnv_getenv("PERL5DB");
a0d0e21e
LW
2093
2094 if (pdb)
2095 return pdb;
93189314 2096 SETERRNO(0,SS_NORMAL);
a0d0e21e
LW
2097 return "BEGIN { require 'perl5db.pl' }";
2098 }
2099 return "";
2100}
2101
2102
16d20bd9 2103/* Encoded script support. filter_add() effectively inserts a
4e553d73 2104 * 'pre-processing' function into the current source input stream.
16d20bd9
AD
2105 * Note that the filter function only applies to the current source file
2106 * (e.g., it will not affect files 'require'd or 'use'd by this one).
2107 *
2108 * The datasv parameter (which may be NULL) can be used to pass
2109 * private data to this instance of the filter. The filter function
2110 * can recover the SV using the FILTER_DATA macro and use it to
2111 * store private buffers and state information.
2112 *
2113 * The supplied datasv parameter is upgraded to a PVIO type
4755096e 2114 * and the IoDIRP/IoANY field is used to store the function pointer,
e0c19803 2115 * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
16d20bd9
AD
2116 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2117 * private use must be set using malloc'd pointers.
2118 */
16d20bd9
AD
2119
2120SV *
864dbfa3 2121Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
16d20bd9 2122{
f4c556ac
GS
2123 if (!funcp)
2124 return Nullsv;
2125
3280af22
NIS
2126 if (!PL_rsfp_filters)
2127 PL_rsfp_filters = newAV();
16d20bd9 2128 if (!datasv)
8c52afec 2129 datasv = NEWSV(255,0);
16d20bd9 2130 if (!SvUPGRADE(datasv, SVt_PVIO))
cea2e8a9 2131 Perl_die(aTHX_ "Can't upgrade filter_add data to SVt_PVIO");
4755096e 2132 IoANY(datasv) = (void *)funcp; /* stash funcp into spare field */
e0c19803 2133 IoFLAGS(datasv) |= IOf_FAKE_DIRP;
f4c556ac 2134 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
fe5a182c 2135 (void*)funcp, SvPV_nolen(datasv)));
3280af22
NIS
2136 av_unshift(PL_rsfp_filters, 1);
2137 av_store(PL_rsfp_filters, 0, datasv) ;
16d20bd9
AD
2138 return(datasv);
2139}
4e553d73 2140
16d20bd9
AD
2141
2142/* Delete most recently added instance of this filter function. */
a0d0e21e 2143void
864dbfa3 2144Perl_filter_del(pTHX_ filter_t funcp)
16d20bd9 2145{
e0c19803 2146 SV *datasv;
fe5a182c 2147 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", (void*)funcp));
3280af22 2148 if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
16d20bd9
AD
2149 return;
2150 /* if filter is on top of stack (usual case) just pop it off */
e0c19803 2151 datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
4755096e 2152 if (IoANY(datasv) == (void *)funcp) {
e0c19803 2153 IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
4755096e 2154 IoANY(datasv) = (void *)NULL;
3280af22 2155 sv_free(av_pop(PL_rsfp_filters));
e50aee73 2156
16d20bd9
AD
2157 return;
2158 }
2159 /* we need to search for the correct entry and clear it */
cea2e8a9 2160 Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
16d20bd9
AD
2161}
2162
2163
1de9afcd
RGS
2164/* Invoke the idxth filter function for the current rsfp. */
2165/* maxlen 0 = read one text line */
16d20bd9 2166I32
864dbfa3 2167Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
a0d0e21e 2168{
16d20bd9
AD
2169 filter_t funcp;
2170 SV *datasv = NULL;
e50aee73 2171
3280af22 2172 if (!PL_rsfp_filters)
16d20bd9 2173 return -1;
1de9afcd 2174 if (idx > AvFILLp(PL_rsfp_filters)) { /* Any more filters? */
16d20bd9
AD
2175 /* Provide a default input filter to make life easy. */
2176 /* Note that we append to the line. This is handy. */
f4c556ac
GS
2177 DEBUG_P(PerlIO_printf(Perl_debug_log,
2178 "filter_read %d: from rsfp\n", idx));
4e553d73 2179 if (maxlen) {
16d20bd9
AD
2180 /* Want a block */
2181 int len ;
2182 int old_len = SvCUR(buf_sv) ;
2183
2184 /* ensure buf_sv is large enough */
eb160463 2185 SvGROW(buf_sv, (STRLEN)(old_len + maxlen)) ;
3280af22
NIS
2186 if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
2187 if (PerlIO_error(PL_rsfp))
37120919
AD
2188 return -1; /* error */
2189 else
2190 return 0 ; /* end of file */
2191 }
16d20bd9
AD
2192 SvCUR_set(buf_sv, old_len + len) ;
2193 } else {
2194 /* Want a line */
3280af22
NIS
2195 if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2196 if (PerlIO_error(PL_rsfp))
37120919
AD
2197 return -1; /* error */
2198 else
2199 return 0 ; /* end of file */
2200 }
16d20bd9
AD
2201 }
2202 return SvCUR(buf_sv);
2203 }
2204 /* Skip this filter slot if filter has been deleted */
1de9afcd 2205 if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
f4c556ac
GS
2206 DEBUG_P(PerlIO_printf(Perl_debug_log,
2207 "filter_read %d: skipped (filter deleted)\n",
2208 idx));
16d20bd9
AD
2209 return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
2210 }
2211 /* Get function pointer hidden within datasv */
4755096e 2212 funcp = (filter_t)IoANY(datasv);
f4c556ac
GS
2213 DEBUG_P(PerlIO_printf(Perl_debug_log,
2214 "filter_read %d: via function %p (%s)\n",
fe5a182c 2215 idx, (void*)funcp, SvPV_nolen(datasv)));
16d20bd9
AD
2216 /* Call function. The function is expected to */
2217 /* call "FILTER_READ(idx+1, buf_sv)" first. */
37120919 2218 /* Return: <0:error, =0:eof, >0:not eof */
acfe0abc 2219 return (*funcp)(aTHX_ idx, buf_sv, maxlen);
16d20bd9
AD
2220}
2221
76e3520e 2222STATIC char *
cea2e8a9 2223S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
16d20bd9 2224{
c39cd008 2225#ifdef PERL_CR_FILTER
3280af22 2226 if (!PL_rsfp_filters) {
c39cd008 2227 filter_add(S_cr_textfilter,NULL);
a868473f
NIS
2228 }
2229#endif
3280af22 2230 if (PL_rsfp_filters) {
55497cff 2231 if (!append)
2232 SvCUR_set(sv, 0); /* start with empty line */
16d20bd9
AD
2233 if (FILTER_READ(0, sv, 0) > 0)
2234 return ( SvPVX(sv) ) ;
2235 else
2236 return Nullch ;
2237 }
9d116dd7 2238 else
fd049845 2239 return (sv_gets(sv, fp, append));
a0d0e21e
LW
2240}
2241
01ec43d0
GS
2242STATIC HV *
2243S_find_in_my_stash(pTHX_ char *pkgname, I32 len)
def3634b
GS
2244{
2245 GV *gv;
2246
01ec43d0 2247 if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
def3634b
GS
2248 return PL_curstash;
2249
2250 if (len > 2 &&
2251 (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
01ec43d0
GS
2252 (gv = gv_fetchpv(pkgname, FALSE, SVt_PVHV)))
2253 {
2254 return GvHV(gv); /* Foo:: */
def3634b
GS
2255 }
2256
2257 /* use constant CLASS => 'MyClass' */
2258 if ((gv = gv_fetchpv(pkgname, FALSE, SVt_PVCV))) {
2259 SV *sv;
2260 if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
2261 pkgname = SvPV_nolen(sv);
2262 }
2263 }
2264
2265 return gv_stashpv(pkgname, FALSE);
2266}
a0d0e21e 2267
748a9306
LW
2268#ifdef DEBUGGING
2269 static char* exp_name[] =
09bef843 2270 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
27308ded 2271 "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
09bef843 2272 };
748a9306 2273#endif
463ee0b2 2274
02aa26ce
NT
2275/*
2276 yylex
2277
2278 Works out what to call the token just pulled out of the input
2279 stream. The yacc parser takes care of taking the ops we return and
2280 stitching them into a tree.
2281
2282 Returns:
2283 PRIVATEREF
2284
2285 Structure:
2286 if read an identifier
2287 if we're in a my declaration
2288 croak if they tried to say my($foo::bar)
2289 build the ops for a my() declaration
2290 if it's an access to a my() variable
2291 are we in a sort block?
2292 croak if my($a); $a <=> $b
2293 build ops for access to a my() variable
2294 if in a dq string, and they've said @foo and we can't find @foo
2295 croak
2296 build ops for a bareword
2297 if we already built the token before, use it.
2298*/
2299
20141f0e 2300
dba4d153
JH
2301#ifdef __SC__
2302#pragma segment Perl_yylex
2303#endif
dba4d153 2304int
dba4d153 2305Perl_yylex(pTHX)
20141f0e 2306{
3afc138a 2307 register char *s = PL_bufptr;
378cc40b 2308 register char *d;
79072805 2309 register I32 tmp;
463ee0b2 2310 STRLEN len;
161b471a
NIS
2311 GV *gv = Nullgv;
2312 GV **gvp = 0;
aa7440fb 2313 bool bof = FALSE;
1d239bbb 2314 I32 orig_keyword = 0;
a687059c 2315
bbf60fe6
DM
2316 DEBUG_T( {
2317 PerlIO_printf(Perl_debug_log, "### LEX_%s\n",
2318 lex_state_names[PL_lex_state]);
2319 } );
02aa26ce 2320 /* check if there's an identifier for us to look at */
ba979b31 2321 if (PL_pending_ident)
bbf60fe6 2322 return REPORT(S_pending_ident(aTHX));
bbce6d69 2323
02aa26ce
NT
2324 /* no identifier pending identification */
2325
3280af22 2326 switch (PL_lex_state) {
79072805
LW
2327#ifdef COMMENTARY
2328 case LEX_NORMAL: /* Some compilers will produce faster */
2329 case LEX_INTERPNORMAL: /* code if we comment these out. */
2330 break;
2331#endif
2332
09bef843 2333 /* when we've already built the next token, just pull it out of the queue */
79072805 2334 case LEX_KNOWNEXT:
3280af22
NIS
2335 PL_nexttoke--;
2336 yylval = PL_nextval[PL_nexttoke];
2337 if (!PL_nexttoke) {
2338 PL_lex_state = PL_lex_defer;
2339 PL_expect = PL_lex_expect;
2340 PL_lex_defer = LEX_NORMAL;
463ee0b2 2341 }
607df283 2342 DEBUG_T({ PerlIO_printf(Perl_debug_log,
4659c93f 2343 "### Next token after '%s' was known, type %"IVdf"\n", PL_bufptr,
5f80b19c 2344 (IV)PL_nexttype[PL_nexttoke]); });
607df283 2345
bbf60fe6 2346 return REPORT(PL_nexttype[PL_nexttoke]);
79072805 2347
02aa26ce 2348 /* interpolated case modifiers like \L \U, including \Q and \E.
3280af22 2349 when we get here, PL_bufptr is at the \
02aa26ce 2350 */
79072805
LW
2351 case LEX_INTERPCASEMOD:
2352#ifdef DEBUGGING
3280af22 2353 if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
cea2e8a9 2354 Perl_croak(aTHX_ "panic: INTERPCASEMOD");
79072805 2355#endif
02aa26ce 2356 /* handle \E or end of string */
3280af22 2357 if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
a0d0e21e 2358 char oldmod;
02aa26ce
NT
2359
2360 /* if at a \E */
3280af22
NIS
2361 if (PL_lex_casemods) {
2362 oldmod = PL_lex_casestack[--PL_lex_casemods];
2363 PL_lex_casestack[PL_lex_casemods] = '\0';
02aa26ce 2364
3792a11b
NC
2365 if (PL_bufptr != PL_bufend
2366 && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
3280af22
NIS
2367 PL_bufptr += 2;
2368 PL_lex_state = LEX_INTERPCONCAT;
a0d0e21e 2369 }
bbf60fe6 2370 return REPORT(')');
79072805 2371 }
3280af22
NIS
2372 if (PL_bufptr != PL_bufend)
2373 PL_bufptr += 2;
2374 PL_lex_state = LEX_INTERPCONCAT;
cea2e8a9 2375 return yylex();
79072805
LW
2376 }
2377 else {
607df283 2378 DEBUG_T({ PerlIO_printf(Perl_debug_log,
5f80b19c 2379 "### Saw case modifier at '%s'\n", PL_bufptr); });
3280af22 2380 s = PL_bufptr + 1;
6e909404
JH
2381 if (s[1] == '\\' && s[2] == 'E') {
2382 PL_bufptr = s + 3;
2383 PL_lex_state = LEX_INTERPCONCAT;
2384 return yylex();
a0d0e21e 2385 }
6e909404
JH
2386 else {
2387 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
2388 tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */
3792a11b 2389 if ((*s == 'L' || *s == 'U') &&
6e909404
JH
2390 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
2391 PL_lex_casestack[--PL_lex_casemods] = '\0';
bbf60fe6 2392 return REPORT(')');
6e909404
JH
2393 }
2394 if (PL_lex_casemods > 10)
2395 Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
2396 PL_lex_casestack[PL_lex_casemods++] = *s;
2397 PL_lex_casestack[PL_lex_casemods] = '\0';
2398 PL_lex_state = LEX_INTERPCONCAT;
2399 PL_nextval[PL_nexttoke].ival = 0;
2400 force_next('(');
2401 if (*s == 'l')
2402 PL_nextval[PL_nexttoke].ival = OP_LCFIRST;
2403 else if (*s == 'u')
2404 PL_nextval[PL_nexttoke].ival = OP_UCFIRST;
2405 else if (*s == 'L')
2406 PL_nextval[PL_nexttoke].ival = OP_LC;
2407 else if (*s == 'U')
2408 PL_nextval[PL_nexttoke].ival = OP_UC;
2409 else if (*s == 'Q')
2410 PL_nextval[PL_nexttoke].ival = OP_QUOTEMETA;
2411 else
2412 Perl_croak(aTHX_ "panic: yylex");
2413 PL_bufptr = s + 1;
a0d0e21e 2414 }
79072805 2415 force_next(FUNC);
3280af22
NIS
2416 if (PL_lex_starts) {
2417 s = PL_bufptr;
2418 PL_lex_starts = 0;
131b3ad0
DM
2419 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2420 if (PL_lex_casemods == 1 && PL_lex_inpat)
2421 OPERATOR(',');
2422 else
2423 Aop(OP_CONCAT);
79072805
LW
2424 }
2425 else
cea2e8a9 2426 return yylex();
79072805
LW
2427 }
2428
55497cff 2429 case LEX_INTERPPUSH:
bbf60fe6 2430 return REPORT(sublex_push());
55497cff 2431
79072805 2432 case LEX_INTERPSTART:
3280af22 2433 if (PL_bufptr == PL_bufend)
bbf60fe6 2434 return REPORT(sublex_done());
607df283 2435 DEBUG_T({ PerlIO_printf(Perl_debug_log,
5f80b19c 2436 "### Interpolated variable at '%s'\n", PL_bufptr); });
3280af22
NIS
2437 PL_expect = XTERM;
2438 PL_lex_dojoin = (*PL_bufptr == '@');
2439 PL_lex_state = LEX_INTERPNORMAL;
2440 if (PL_lex_dojoin) {
2441 PL_nextval[PL_nexttoke].ival = 0;
79072805 2442 force_next(',');
a0d0e21e 2443 force_ident("\"", '$');
3280af22 2444 PL_nextval[PL_nexttoke].ival = 0;
79072805 2445 force_next('$');
3280af22 2446 PL_nextval[PL_nexttoke].ival = 0;
79072805 2447 force_next('(');
3280af22 2448 PL_nextval[PL_nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
79072805
LW
2449 force_next(FUNC);
2450 }
3280af22
NIS
2451 if (PL_lex_starts++) {
2452 s = PL_bufptr;
131b3ad0
DM
2453 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2454 if (!PL_lex_casemods && PL_lex_inpat)
2455 OPERATOR(',');
2456 else
2457 Aop(OP_CONCAT);
79072805 2458 }
cea2e8a9 2459 return yylex();
79072805
LW
2460
2461 case LEX_INTERPENDMAYBE:
3280af22
NIS
2462 if (intuit_more(PL_bufptr)) {
2463 PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
79072805
LW
2464 break;
2465 }
2466 /* FALL THROUGH */
2467
2468 case LEX_INTERPEND:
3280af22
NIS
2469 if (PL_lex_dojoin) {
2470 PL_lex_dojoin = FALSE;
2471 PL_lex_state = LEX_INTERPCONCAT;
bbf60fe6 2472 return REPORT(')');
79072805 2473 }
43a16006 2474 if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
25da4f38 2475 && SvEVALED(PL_lex_repl))
43a16006 2476 {
e9fa98b2 2477 if (PL_bufptr != PL_bufend)
cea2e8a9 2478 Perl_croak(aTHX_ "Bad evalled substitution pattern");
e9fa98b2
HS
2479 PL_lex_repl = Nullsv;
2480 }
79072805
LW
2481 /* FALLTHROUGH */
2482 case LEX_INTERPCONCAT:
2483#ifdef DEBUGGING
3280af22 2484 if (PL_lex_brackets)
cea2e8a9 2485 Perl_croak(aTHX_ "panic: INTERPCONCAT");
79072805 2486#endif
3280af22 2487 if (PL_bufptr == PL_bufend)
bbf60fe6 2488 return REPORT(sublex_done());
79072805 2489
3280af22
NIS
2490 if (SvIVX(PL_linestr) == '\'') {
2491 SV *sv = newSVsv(PL_linestr);
2492 if (!PL_lex_inpat)
76e3520e 2493 sv = tokeq(sv);
3280af22 2494 else if ( PL_hints & HINT_NEW_RE )
b3ac6de7 2495 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
79072805 2496 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3280af22 2497 s = PL_bufend;
79072805
LW
2498 }
2499 else {
3280af22 2500 s = scan_const(PL_bufptr);
79072805 2501 if (*s == '\\')
3280af22 2502 PL_lex_state = LEX_INTERPCASEMOD;
79072805 2503 else
3280af22 2504 PL_lex_state = LEX_INTERPSTART;
79072805
LW
2505 }
2506
3280af22
NIS
2507 if (s != PL_bufptr) {
2508 PL_nextval[PL_nexttoke] = yylval;
2509 PL_expect = XTERM;
79072805 2510 force_next(THING);
131b3ad0
DM
2511 if (PL_lex_starts++) {
2512 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2513 if (!PL_lex_casemods && PL_lex_inpat)
2514 OPERATOR(',');
2515 else
2516 Aop(OP_CONCAT);
2517 }
79072805 2518 else {
3280af22 2519 PL_bufptr = s;
cea2e8a9 2520 return yylex();
79072805
LW
2521 }
2522 }
2523
cea2e8a9 2524 return yylex();
a0d0e21e 2525 case LEX_FORMLINE:
3280af22
NIS
2526 PL_lex_state = LEX_NORMAL;
2527 s = scan_formline(PL_bufptr);
2528 if (!PL_lex_formbrack)
a0d0e21e
LW
2529 goto rightbracket;
2530 OPERATOR(';');
79072805
LW
2531 }
2532
3280af22
NIS
2533 s = PL_bufptr;
2534 PL_oldoldbufptr = PL_oldbufptr;
2535 PL_oldbufptr = s;
607df283 2536 DEBUG_T( {
bbf60fe6 2537 PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at [%s]\n",
bf49b057 2538 exp_name[PL_expect], s);
5f80b19c 2539 } );
463ee0b2
LW
2540
2541 retry:
378cc40b
LW
2542 switch (*s) {
2543 default:
7e2040f0 2544 if (isIDFIRST_lazy_if(s,UTF))
834a4ddd 2545 goto keylookup;
cea2e8a9 2546 Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
e929a76b
LW
2547 case 4:
2548 case 26:
2549 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 2550 case 0:
3280af22
NIS
2551 if (!PL_rsfp) {
2552 PL_last_uni = 0;
2553 PL_last_lop = 0;
c5ee2135
WL
2554 if (PL_lex_brackets) {
2555 if (PL_lex_formbrack)
2556 yyerror("Format not terminated");
2557 else
2558 yyerror("Missing right curly or square bracket");
2559 }
4e553d73 2560 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 2561 "### Tokener got EOF\n");
5f80b19c 2562 } );
79072805 2563 TOKEN(0);
463ee0b2 2564 }
3280af22 2565 if (s++ < PL_bufend)
a687059c 2566 goto retry; /* ignore stray nulls */
3280af22
NIS
2567 PL_last_uni = 0;
2568 PL_last_lop = 0;
2569 if (!PL_in_eval && !PL_preambled) {
2570 PL_preambled = TRUE;
2571 sv_setpv(PL_linestr,incl_perldb());
2572 if (SvCUR(PL_linestr))
4147a61b 2573 sv_catpvn(PL_linestr,";", 1);
3280af22
NIS
2574 if (PL_preambleav){
2575 while(AvFILLp(PL_preambleav) >= 0) {
2576 SV *tmpsv = av_shift(PL_preambleav);
2577 sv_catsv(PL_linestr, tmpsv);
4147a61b 2578 sv_catpvn(PL_linestr, ";", 1);
91b7def8 2579 sv_free(tmpsv);
2580 }
3280af22
NIS
2581 sv_free((SV*)PL_preambleav);
2582 PL_preambleav = NULL;
91b7def8 2583 }
3280af22
NIS
2584 if (PL_minus_n || PL_minus_p) {
2585 sv_catpv(PL_linestr, "LINE: while (<>) {");
2586 if (PL_minus_l)
2587 sv_catpv(PL_linestr,"chomp;");
2588 if (PL_minus_a) {
3280af22 2589 if (PL_minus_F) {
3792a11b
NC
2590 if ((*PL_splitstr == '/' || *PL_splitstr == '\''
2591 || *PL_splitstr == '"')
3280af22 2592 && strchr(PL_splitstr + 1, *PL_splitstr))
3db68c4c 2593 Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
54310121 2594 else {
c8ef6a4b
NC
2595 /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
2596 bytes can be used as quoting characters. :-) */
48c4c863
NC
2597 /* The count here deliberately includes the NUL
2598 that terminates the C string constant. This
2599 embeds the opening NUL into the string. */
9a3fb652 2600 sv_catpvn(PL_linestr, "our @F=split(q", 15);
48c4c863
NC
2601 s = PL_splitstr;
2602 do {
2603 /* Need to \ \s */
2604 if (*s == '\\')
2605 sv_catpvn(PL_linestr, s, 1);
2606 sv_catpvn(PL_linestr, s, 1);
2607 } while (*s++);
2608 /* This loop will embed the trailing NUL of
2609 PL_linestr as the last thing it does before
2610 terminating. */
4fccd7c6 2611 sv_catpvn(PL_linestr, ");", 2);
54310121 2612 }
2304df62
AD
2613 }
2614 else
75c72d73 2615 sv_catpv(PL_linestr,"our @F=split(' ');");
2304df62 2616 }
79072805 2617 }
4147a61b 2618 sv_catpvn(PL_linestr, "\n", 1);
3280af22
NIS
2619 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2620 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2621 PL_last_lop = PL_last_uni = Nullch;
3280af22 2622 if (PERLDB_LINE && PL_curstash != PL_debstash) {
a0d0e21e
LW
2623 SV *sv = NEWSV(85,0);
2624
2625 sv_upgrade(sv, SVt_PVMG);
3280af22 2626 sv_setsv(sv,PL_linestr);
0ac0412a
MJD
2627 (void)SvIOK_on(sv);
2628 SvIVX(sv) = 0;
57843af0 2629 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
a0d0e21e 2630 }
79072805 2631 goto retry;
a687059c 2632 }
e929a76b 2633 do {
aa7440fb 2634 bof = PL_rsfp ? TRUE : FALSE;
7e28d3af
JH
2635 if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
2636 fake_eof:
2637 if (PL_rsfp) {
2638 if (PL_preprocess && !PL_in_eval)
2639 (void)PerlProc_pclose(PL_rsfp);
2640 else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
2641 PerlIO_clearerr(PL_rsfp);
2642 else
2643 (void)PerlIO_close(PL_rsfp);
2644 PL_rsfp = Nullfp;
2645 PL_doextract = FALSE;
2646 }
2647 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
a23c4656
NC
2648 sv_setpv(PL_linestr,PL_minus_p
2649 ? ";}continue{print;}" : ";}");
7e28d3af
JH
2650 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2651 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2652 PL_last_lop = PL_last_uni = Nullch;
7e28d3af
JH
2653 PL_minus_n = PL_minus_p = 0;
2654 goto retry;
2655 }
2656 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
207e3d1a 2657 PL_last_lop = PL_last_uni = Nullch;
7e28d3af
JH
2658 sv_setpv(PL_linestr,"");
2659 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
2660 }
7aa207d6
JH
2661 /* If it looks like the start of a BOM or raw UTF-16,
2662 * check if it in fact is. */
2663 else if (bof &&
2664 (*s == 0 ||
2665 *(U8*)s == 0xEF ||
2666 *(U8*)s >= 0xFE ||
2667 s[1] == 0)) {
226017aa 2668#ifdef PERLIO_IS_STDIO
e3f494f1
JH
2669# ifdef __GNU_LIBRARY__
2670# if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
226017aa
DD
2671# define FTELL_FOR_PIPE_IS_BROKEN
2672# endif
e3f494f1
JH
2673# else
2674# ifdef __GLIBC__
2675# if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
2676# define FTELL_FOR_PIPE_IS_BROKEN
2677# endif
2678# endif
226017aa
DD
2679# endif
2680#endif
2681#ifdef FTELL_FOR_PIPE_IS_BROKEN
2682 /* This loses the possibility to detect the bof
2683 * situation on perl -P when the libc5 is being used.
2684 * Workaround? Maybe attach some extra state to PL_rsfp?
2685 */
2686 if (!PL_preprocess)
7e28d3af 2687 bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
226017aa 2688#else
eb160463 2689 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
226017aa 2690#endif
7e28d3af 2691 if (bof) {
3280af22 2692 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 2693 s = swallow_bom((U8*)s);
e929a76b 2694 }
378cc40b 2695 }
3280af22 2696 if (PL_doextract) {
a0d0e21e
LW
2697 /* Incest with pod. */
2698 if (*s == '=' && strnEQ(s, "=cut", 4)) {
3280af22
NIS
2699 sv_setpv(PL_linestr, "");
2700 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2701 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2702 PL_last_lop = PL_last_uni = Nullch;
3280af22 2703 PL_doextract = FALSE;
a0d0e21e 2704 }
4e553d73 2705 }
463ee0b2 2706 incline(s);
3280af22
NIS
2707 } while (PL_doextract);
2708 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
2709 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805 2710 SV *sv = NEWSV(85,0);
a687059c 2711
93a17b20 2712 sv_upgrade(sv, SVt_PVMG);
3280af22 2713 sv_setsv(sv,PL_linestr);
0ac0412a
MJD
2714 (void)SvIOK_on(sv);
2715 SvIVX(sv) = 0;
57843af0 2716 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
a687059c 2717 }
3280af22 2718 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2719 PL_last_lop = PL_last_uni = Nullch;
57843af0 2720 if (CopLINE(PL_curcop) == 1) {
3280af22 2721 while (s < PL_bufend && isSPACE(*s))
79072805 2722 s++;
a0d0e21e 2723 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 2724 s++;
44a8e56a 2725 d = Nullch;
3280af22 2726 if (!PL_in_eval) {
44a8e56a 2727 if (*s == '#' && *(s+1) == '!')
2728 d = s + 2;
2729#ifdef ALTERNATE_SHEBANG
2730 else {
2731 static char as[] = ALTERNATE_SHEBANG;
2732 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
2733 d = s + (sizeof(as) - 1);
2734 }
2735#endif /* ALTERNATE_SHEBANG */
2736 }
2737 if (d) {
b8378b72 2738 char *ipath;
774d564b 2739 char *ipathend;
b8378b72 2740
774d564b 2741 while (isSPACE(*d))
b8378b72
CS
2742 d++;
2743 ipath = d;
774d564b 2744 while (*d && !isSPACE(*d))
2745 d++;
2746 ipathend = d;
2747
2748#ifdef ARG_ZERO_IS_SCRIPT
2749 if (ipathend > ipath) {
2750 /*
2751 * HP-UX (at least) sets argv[0] to the script name,
2752 * which makes $^X incorrect. And Digital UNIX and Linux,
2753 * at least, set argv[0] to the basename of the Perl
2754 * interpreter. So, having found "#!", we'll set it right.
2755 */
ee2f7564 2756 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV)); /* $^X */
774d564b 2757 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 2758 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 2759 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 2760 SvSETMAGIC(x);
2761 }
556c1dec
JH
2762 else {
2763 STRLEN blen;
2764 STRLEN llen;
2765 char *bstart = SvPV(CopFILESV(PL_curcop),blen);
2766 char *lstart = SvPV(x,llen);
2767 if (llen < blen) {
2768 bstart += blen - llen;
2769 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
2770 sv_setpvn(x, ipath, ipathend - ipath);
2771 SvSETMAGIC(x);
2772 }
2773 }
2774 }
774d564b 2775 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 2776 }
774d564b 2777#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
2778
2779 /*
2780 * Look for options.
2781 */
748a9306 2782 d = instr(s,"perl -");
84e30d1a 2783 if (!d) {
748a9306 2784 d = instr(s,"perl");
84e30d1a
GS
2785#if defined(DOSISH)
2786 /* avoid getting into infinite loops when shebang
2787 * line contains "Perl" rather than "perl" */
2788 if (!d) {
2789 for (d = ipathend-4; d >= ipath; --d) {
2790 if ((*d == 'p' || *d == 'P')
2791 && !ibcmp(d, "perl", 4))
2792 {
2793 break;
2794 }
2795 }
2796 if (d < ipath)
2797 d = Nullch;
2798 }
2799#endif
2800 }
44a8e56a 2801#ifdef ALTERNATE_SHEBANG
2802 /*
2803 * If the ALTERNATE_SHEBANG on this system starts with a
2804 * character that can be part of a Perl expression, then if
2805 * we see it but not "perl", we're probably looking at the
2806 * start of Perl code, not a request to hand off to some
2807 * other interpreter. Similarly, if "perl" is there, but
2808 * not in the first 'word' of the line, we assume the line
2809 * contains the start of the Perl program.
44a8e56a 2810 */
2811 if (d && *s != '#') {
774d564b 2812 char *c = ipath;
44a8e56a 2813 while (*c && !strchr("; \t\r\n\f\v#", *c))
2814 c++;
2815 if (c < d)
2816 d = Nullch; /* "perl" not in first word; ignore */
2817 else
2818 *s = '#'; /* Don't try to parse shebang line */
2819 }
774d564b 2820#endif /* ALTERNATE_SHEBANG */
bf4acbe4 2821#ifndef MACOS_TRADITIONAL
748a9306 2822 if (!d &&
44a8e56a 2823 *s == '#' &&
774d564b 2824 ipathend > ipath &&
3280af22 2825 !PL_minus_c &&
748a9306 2826 !instr(s,"indir") &&
3280af22 2827 instr(PL_origargv[0],"perl"))
748a9306 2828 {
9f68db38 2829 char **newargv;
9f68db38 2830
774d564b 2831 *ipathend = '\0';
2832 s = ipathend + 1;
3280af22 2833 while (s < PL_bufend && isSPACE(*s))
9f68db38 2834 s++;
3280af22
NIS
2835 if (s < PL_bufend) {
2836 Newz(899,newargv,PL_origargc+3,char*);
9f68db38 2837 newargv[1] = s;
3280af22 2838 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
2839 s++;
2840 *s = '\0';
3280af22 2841 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
2842 }
2843 else
3280af22 2844 newargv = PL_origargv;
774d564b 2845 newargv[0] = ipath;
b35112e7 2846 PERL_FPU_PRE_EXEC
b4748376 2847 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 2848 PERL_FPU_POST_EXEC
cea2e8a9 2849 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 2850 }
bf4acbe4 2851#endif
748a9306 2852 if (d) {
3280af22
NIS
2853 U32 oldpdb = PL_perldb;
2854 bool oldn = PL_minus_n;
2855 bool oldp = PL_minus_p;
748a9306
LW
2856
2857 while (*d && !isSPACE(*d)) d++;
bf4acbe4 2858 while (SPACE_OR_TAB(*d)) d++;
748a9306
LW
2859
2860 if (*d++ == '-') {
a11ec5a9 2861 bool switches_done = PL_doswitches;
8cc95fdb 2862 do {
2863 if (*d == 'M' || *d == 'm') {
2864 char *m = d;
2865 while (*d && !isSPACE(*d)) d++;
cea2e8a9 2866 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
8cc95fdb 2867 (int)(d - m), m);
2868 }
2869 d = moreswitches(d);
2870 } while (d);
f0b2cf55
YST
2871 if (PL_doswitches && !switches_done) {
2872 int argc = PL_origargc;
2873 char **argv = PL_origargv;
2874 do {
2875 argc--,argv++;
2876 } while (argc && argv[0][0] == '-' && argv[0][1]);
2877 init_argv_symbols(argc,argv);
2878 }
155aba94
GS
2879 if ((PERLDB_LINE && !oldpdb) ||
2880 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 2881 /* if we have already added "LINE: while (<>) {",
2882 we must not do it again */
748a9306 2883 {
3280af22
NIS
2884 sv_setpv(PL_linestr, "");
2885 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2886 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2887 PL_last_lop = PL_last_uni = Nullch;
3280af22 2888 PL_preambled = FALSE;
84902520 2889 if (PERLDB_LINE)
3280af22 2890 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
2891 goto retry;
2892 }
a11ec5a9
RGS
2893 if (PL_doswitches && !switches_done) {
2894 int argc = PL_origargc;
2895 char **argv = PL_origargv;
2896 do {
2897 argc--,argv++;
2898 } while (argc && argv[0][0] == '-' && argv[0][1]);
2899 init_argv_symbols(argc,argv);
2900 }
a0d0e21e 2901 }
79072805 2902 }
9f68db38 2903 }
79072805 2904 }
3280af22
NIS
2905 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2906 PL_bufptr = s;
2907 PL_lex_state = LEX_FORMLINE;
cea2e8a9 2908 return yylex();
ae986130 2909 }
378cc40b 2910 goto retry;
4fdae800 2911 case '\r':
6a27c188 2912#ifdef PERL_STRICT_CR
cea2e8a9 2913 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 2914 Perl_croak(aTHX_
cc507455 2915 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 2916#endif
4fdae800 2917 case ' ': case '\t': case '\f': case 013:
bf4acbe4
GS
2918#ifdef MACOS_TRADITIONAL
2919 case '\312':
2920#endif
378cc40b
LW
2921 s++;
2922 goto retry;
378cc40b 2923 case '#':
e929a76b 2924 case '\n':
3280af22 2925 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
2926 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
2927 /* handle eval qq[#line 1 "foo"\n ...] */
2928 CopLINE_dec(PL_curcop);
2929 incline(s);
2930 }
3280af22 2931 d = PL_bufend;
a687059c 2932 while (s < d && *s != '\n')
378cc40b 2933 s++;
0f85fab0 2934 if (s < d)
378cc40b 2935 s++;
78c267c1 2936 else if (s > d) /* Found by Ilya: feed random input to Perl. */
a8406387 2937 Perl_croak(aTHX_ "panic: input overflow");
463ee0b2 2938 incline(s);
3280af22
NIS
2939 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2940 PL_bufptr = s;
2941 PL_lex_state = LEX_FORMLINE;
cea2e8a9 2942 return yylex();
a687059c 2943 }
378cc40b 2944 }
a687059c 2945 else {
378cc40b 2946 *s = '\0';
3280af22 2947 PL_bufend = s;
a687059c 2948 }
378cc40b
LW
2949 goto retry;
2950 case '-':
79072805 2951 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50
JH
2952 I32 ftst = 0;
2953
378cc40b 2954 s++;
3280af22 2955 PL_bufptr = s;
748a9306
LW
2956 tmp = *s++;
2957
bf4acbe4 2958 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
2959 s++;
2960
2961 if (strnEQ(s,"=>",2)) {
3280af22 2962 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
4e553d73 2963 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 2964 "### Saw unary minus before =>, forcing word '%s'\n", s);
5f80b19c 2965 } );
748a9306
LW
2966 OPERATOR('-'); /* unary minus */
2967 }
3280af22 2968 PL_last_uni = PL_oldbufptr;
748a9306 2969 switch (tmp) {
e5edeb50
JH
2970 case 'r': ftst = OP_FTEREAD; break;
2971 case 'w': ftst = OP_FTEWRITE; break;
2972 case 'x': ftst = OP_FTEEXEC; break;
2973 case 'o': ftst = OP_FTEOWNED; break;
2974 case 'R': ftst = OP_FTRREAD; break;
2975 case 'W': ftst = OP_FTRWRITE; break;
2976 case 'X': ftst = OP_FTREXEC; break;
2977 case 'O': ftst = OP_FTROWNED; break;
2978 case 'e': ftst = OP_FTIS; break;
2979 case 'z': ftst = OP_FTZERO; break;
2980 case 's': ftst = OP_FTSIZE; break;
2981 case 'f': ftst = OP_FTFILE; break;
2982 case 'd': ftst = OP_FTDIR; break;
2983 case 'l': ftst = OP_FTLINK; break;
2984 case 'p': ftst = OP_FTPIPE; break;
2985 case 'S': ftst = OP_FTSOCK; break;
2986 case 'u': ftst = OP_FTSUID; break;
2987 case 'g': ftst = OP_FTSGID; break;
2988 case 'k': ftst = OP_FTSVTX; break;
2989 case 'b': ftst = OP_FTBLK; break;
2990 case 'c': ftst = OP_FTCHR; break;
2991 case 't': ftst = OP_FTTTY; break;
2992 case 'T': ftst = OP_FTTEXT; break;
2993 case 'B': ftst = OP_FTBINARY; break;
2994 case 'M': case 'A': case 'C':
2995 gv_fetchpv("\024",TRUE, SVt_PV);
2996 switch (tmp) {
2997 case 'M': ftst = OP_FTMTIME; break;
2998 case 'A': ftst = OP_FTATIME; break;
2999 case 'C': ftst = OP_FTCTIME; break;
3000 default: break;
3001 }
3002 break;
378cc40b 3003 default:
378cc40b
LW
3004 break;
3005 }
e5edeb50 3006 if (ftst) {
eb160463 3007 PL_last_lop_op = (OPCODE)ftst;
4e553d73 3008 DEBUG_T( { PerlIO_printf(Perl_debug_log,
0844c848 3009 "### Saw file test %c\n", (int)ftst);
5f80b19c 3010 } );
e5edeb50
JH
3011 FTST(ftst);
3012 }
3013 else {
3014 /* Assume it was a minus followed by a one-letter named
3015 * subroutine call (or a -bareword), then. */
95c31fe3 3016 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0 3017 "### '-%c' looked like a file test but was not\n",
4fccd7c6 3018 (int) tmp);
5f80b19c 3019 } );
3cf7b4c4 3020 s = --PL_bufptr;
e5edeb50 3021 }
378cc40b 3022 }
a687059c
LW
3023 tmp = *s++;
3024 if (*s == tmp) {
3025 s++;
3280af22 3026 if (PL_expect == XOPERATOR)
79072805
LW
3027 TERM(POSTDEC);
3028 else
3029 OPERATOR(PREDEC);
3030 }
3031 else if (*s == '>') {
3032 s++;
3033 s = skipspace(s);
7e2040f0 3034 if (isIDFIRST_lazy_if(s,UTF)) {
a0d0e21e 3035 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
463ee0b2 3036 TOKEN(ARROW);
79072805 3037 }
748a9306
LW
3038 else if (*s == '$')
3039 OPERATOR(ARROW);
463ee0b2 3040 else
748a9306 3041 TERM(ARROW);
a687059c 3042 }
3280af22 3043 if (PL_expect == XOPERATOR)
79072805
LW
3044 Aop(OP_SUBTRACT);
3045 else {
3280af22 3046 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2f3197b3 3047 check_uni();
79072805 3048 OPERATOR('-'); /* unary minus */
2f3197b3 3049 }
79072805 3050
378cc40b 3051 case '+':
a687059c
LW
3052 tmp = *s++;
3053 if (*s == tmp) {
378cc40b 3054 s++;
3280af22 3055 if (PL_expect == XOPERATOR)
79072805
LW
3056 TERM(POSTINC);
3057 else
3058 OPERATOR(PREINC);
378cc40b 3059 }
3280af22 3060 if (PL_expect == XOPERATOR)
79072805
LW
3061 Aop(OP_ADD);
3062 else {
3280af22 3063 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2f3197b3 3064 check_uni();
a687059c 3065 OPERATOR('+');
2f3197b3 3066 }
a687059c 3067
378cc40b 3068 case '*':
3280af22
NIS
3069 if (PL_expect != XOPERATOR) {
3070 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3071 PL_expect = XOPERATOR;
3072 force_ident(PL_tokenbuf, '*');
3073 if (!*PL_tokenbuf)
a0d0e21e 3074 PREREF('*');
79072805 3075 TERM('*');
a687059c 3076 }
79072805
LW
3077 s++;
3078 if (*s == '*') {
a687059c 3079 s++;
79072805 3080 PWop(OP_POW);
a687059c 3081 }
79072805
LW
3082 Mop(OP_MULTIPLY);
3083
378cc40b 3084 case '%':
3280af22 3085 if (PL_expect == XOPERATOR) {
bbce6d69 3086 ++s;
3087 Mop(OP_MODULO);
a687059c 3088 }
3280af22
NIS
3089 PL_tokenbuf[0] = '%';
3090 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
3091 if (!PL_tokenbuf[1]) {
bbce6d69 3092 PREREF('%');
a687059c 3093 }
3280af22 3094 PL_pending_ident = '%';
bbce6d69 3095 TERM('%');
a687059c 3096
378cc40b 3097 case '^':
79072805 3098 s++;
a0d0e21e 3099 BOop(OP_BIT_XOR);
79072805 3100 case '[':
3280af22 3101 PL_lex_brackets++;
79072805 3102 /* FALL THROUGH */
378cc40b 3103 case '~':
378cc40b 3104 case ',':
378cc40b
LW
3105 tmp = *s++;
3106 OPERATOR(tmp);
a0d0e21e
LW
3107 case ':':
3108 if (s[1] == ':') {
3109 len = 0;
3110 goto just_a_word;
3111 }
3112 s++;
09bef843
SB
3113 switch (PL_expect) {
3114 OP *attrs;
3115 case XOPERATOR:
3116 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
3117 break;
3118 PL_bufptr = s; /* update in case we back off */
3119 goto grabattrs;
3120 case XATTRBLOCK:
3121 PL_expect = XBLOCK;
3122 goto grabattrs;
3123 case XATTRTERM:
3124 PL_expect = XTERMBLOCK;
3125 grabattrs:
3126 s = skipspace(s);
3127 attrs = Nullop;
7e2040f0 3128 while (isIDFIRST_lazy_if(s,UTF)) {
09bef843 3129 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
f9829d6b
GS
3130 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
3131 if (tmp < 0) tmp = -tmp;
3132 switch (tmp) {
3133 case KEY_or:
3134 case KEY_and:
c963b151 3135 case KEY_err:
f9829d6b
GS
3136 case KEY_for:
3137 case KEY_unless:
3138 case KEY_if:
3139 case KEY_while:
3140 case KEY_until:
3141 goto got_attrs;
3142 default:
3143 break;
3144 }
3145 }
09bef843
SB
3146 if (*d == '(') {
3147 d = scan_str(d,TRUE,TRUE);
3148 if (!d) {
09bef843
SB
3149 /* MUST advance bufptr here to avoid bogus
3150 "at end of line" context messages from yyerror().
3151 */
3152 PL_bufptr = s + len;
3153 yyerror("Unterminated attribute parameter in attribute list");
3154 if (attrs)
3155 op_free(attrs);
bbf60fe6 3156 return REPORT(0); /* EOF indicator */
09bef843
SB
3157 }
3158 }
3159 if (PL_lex_stuff) {
3160 SV *sv = newSVpvn(s, len);
3161 sv_catsv(sv, PL_lex_stuff);
3162 attrs = append_elem(OP_LIST, attrs,
3163 newSVOP(OP_CONST, 0, sv));
3164 SvREFCNT_dec(PL_lex_stuff);
3165 PL_lex_stuff = Nullsv;
3166 }
3167 else {
371fce9b
DM
3168 if (len == 6 && strnEQ(s, "unique", len)) {
3169 if (PL_in_my == KEY_our)
3170#ifdef USE_ITHREADS
3171 GvUNIQUE_on(cGVOPx_gv(yylval.opval));
3172#else
3173 ; /* skip to avoid loading attributes.pm */
3174#endif
3175 else
3176 Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
3177 }
3178
d3cea301
SB
3179 /* NOTE: any CV attrs applied here need to be part of
3180 the CVf_BUILTIN_ATTRS define in cv.h! */
371fce9b 3181 else if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
78f9721b
SM
3182 CvLVALUE_on(PL_compcv);
3183 else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
3184 CvLOCKED_on(PL_compcv);
3185 else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
3186 CvMETHOD_on(PL_compcv);
06492da6
SF
3187 else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
3188 CvASSERTION_on(PL_compcv);
78f9721b
SM
3189 /* After we've set the flags, it could be argued that
3190 we don't need to do the attributes.pm-based setting
3191 process, and shouldn't bother appending recognized
d3cea301
SB
3192 flags. To experiment with that, uncomment the
3193 following "else". (Note that's already been
3194 uncommented. That keeps the above-applied built-in
3195 attributes from being intercepted (and possibly
3196 rejected) by a package's attribute routines, but is
3197 justified by the performance win for the common case
3198 of applying only built-in attributes.) */
0256094b 3199 else
78f9721b
SM
3200 attrs = append_elem(OP_LIST, attrs,
3201 newSVOP(OP_CONST, 0,
3202 newSVpvn(s, len)));
09bef843
SB
3203 }
3204 s = skipspace(d);
0120eecf 3205 if (*s == ':' && s[1] != ':')
09bef843 3206 s = skipspace(s+1);
0120eecf
GS
3207 else if (s == d)
3208 break; /* require real whitespace or :'s */
09bef843 3209 }
f9829d6b 3210 tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
8e7ae056 3211 if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
09bef843
SB
3212 char q = ((*s == '\'') ? '"' : '\'');
3213 /* If here for an expression, and parsed no attrs, back off. */
3214 if (tmp == '=' && !attrs) {
3215 s = PL_bufptr;
3216 break;
3217 }
3218 /* MUST advance bufptr here to avoid bogus "at end of line"
3219 context messages from yyerror().
3220 */
3221 PL_bufptr = s;
3222 if (!*s)
3223 yyerror("Unterminated attribute list");
3224 else
3225 yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3226 q, *s, q));
3227 if (attrs)
3228 op_free(attrs);
3229 OPERATOR(':');
3230 }
f9829d6b 3231 got_attrs:
09bef843
SB
3232 if (attrs) {
3233 PL_nextval[PL_nexttoke].opval = attrs;
3234 force_next(THING);
3235 }
3236 TOKEN(COLONATTR);
3237 }
a0d0e21e 3238 OPERATOR(':');
8990e307
LW
3239 case '(':
3240 s++;
3280af22
NIS
3241 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3242 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 3243 else
3280af22 3244 PL_expect = XTERM;
4a202259 3245 s = skipspace(s);
a0d0e21e 3246 TOKEN('(');
378cc40b 3247 case ';':
f4dd75d9 3248 CLINE;
378cc40b
LW
3249 tmp = *s++;
3250 OPERATOR(tmp);
3251 case ')':
378cc40b 3252 tmp = *s++;
16d20bd9
AD
3253 s = skipspace(s);
3254 if (*s == '{')
3255 PREBLOCK(tmp);
378cc40b 3256 TERM(tmp);
79072805
LW
3257 case ']':
3258 s++;
3280af22 3259 if (PL_lex_brackets <= 0)
d98d5fff 3260 yyerror("Unmatched right square bracket");
463ee0b2 3261 else
3280af22
NIS
3262 --PL_lex_brackets;
3263 if (PL_lex_state == LEX_INTERPNORMAL) {
3264 if (PL_lex_brackets == 0) {
a0d0e21e 3265 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3280af22 3266 PL_lex_state = LEX_INTERPEND;
79072805
LW
3267 }
3268 }
4633a7c4 3269 TERM(']');
79072805
LW
3270 case '{':
3271 leftbracket:
79072805 3272 s++;
3280af22 3273 if (PL_lex_brackets > 100) {
8edd5f42 3274 Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
8990e307 3275 }
3280af22 3276 switch (PL_expect) {
a0d0e21e 3277 case XTERM:
3280af22 3278 if (PL_lex_formbrack) {
a0d0e21e
LW
3279 s--;
3280 PRETERMBLOCK(DO);
3281 }
3280af22
NIS
3282 if (PL_oldoldbufptr == PL_last_lop)
3283 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 3284 else
3280af22 3285 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 3286 OPERATOR(HASHBRACK);
a0d0e21e 3287 case XOPERATOR:
bf4acbe4 3288 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306 3289 s++;
44a8e56a 3290 d = s;
3280af22
NIS
3291 PL_tokenbuf[0] = '\0';
3292 if (d < PL_bufend && *d == '-') {
3293 PL_tokenbuf[0] = '-';
44a8e56a 3294 d++;
bf4acbe4 3295 while (d < PL_bufend && SPACE_OR_TAB(*d))
44a8e56a 3296 d++;
3297 }
7e2040f0 3298 if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3280af22 3299 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 3300 FALSE, &len);
bf4acbe4 3301 while (d < PL_bufend && SPACE_OR_TAB(*d))
748a9306
LW
3302 d++;
3303 if (*d == '}') {
3280af22 3304 char minus = (PL_tokenbuf[0] == '-');
44a8e56a 3305 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3306 if (minus)
3307 force_next('-');
748a9306
LW
3308 }
3309 }
3310 /* FALL THROUGH */
09bef843 3311 case XATTRBLOCK:
748a9306 3312 case XBLOCK:
3280af22
NIS
3313 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3314 PL_expect = XSTATE;
a0d0e21e 3315 break;
09bef843 3316 case XATTRTERM:
a0d0e21e 3317 case XTERMBLOCK:
3280af22
NIS
3318 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3319 PL_expect = XSTATE;
a0d0e21e
LW
3320 break;
3321 default: {
3322 char *t;
3280af22
NIS
3323 if (PL_oldoldbufptr == PL_last_lop)
3324 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 3325 else
3280af22 3326 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
a0d0e21e 3327 s = skipspace(s);
8452ff4b
SB
3328 if (*s == '}') {
3329 if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3330 PL_expect = XTERM;
3331 /* This hack is to get the ${} in the message. */
3332 PL_bufptr = s+1;
3333 yyerror("syntax error");
3334 break;
3335 }
a0d0e21e 3336 OPERATOR(HASHBRACK);
8452ff4b 3337 }
b8a4b1be
GS
3338 /* This hack serves to disambiguate a pair of curlies
3339 * as being a block or an anon hash. Normally, expectation
3340 * determines that, but in cases where we're not in a
3341 * position to expect anything in particular (like inside
3342 * eval"") we have to resolve the ambiguity. This code
3343 * covers the case where the first term in the curlies is a
3344 * quoted string. Most other cases need to be explicitly
3345 * disambiguated by prepending a `+' before the opening
3346 * curly in order to force resolution as an anon hash.
3347 *
3348 * XXX should probably propagate the outer expectation
3349 * into eval"" to rely less on this hack, but that could
3350 * potentially break current behavior of eval"".
3351 * GSAR 97-07-21
3352 */
3353 t = s;
3354 if (*s == '\'' || *s == '"' || *s == '`') {
3355 /* common case: get past first string, handling escapes */
3280af22 3356 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
3357 if (*t++ == '\\' && (*t == '\\' || *t == *s))
3358 t++;
3359 t++;
a0d0e21e 3360 }
b8a4b1be 3361 else if (*s == 'q') {
3280af22 3362 if (++t < PL_bufend
b8a4b1be 3363 && (!isALNUM(*t)
3280af22 3364 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
3365 && !isALNUM(*t))))
3366 {
abc667d1 3367 /* skip q//-like construct */
b8a4b1be
GS
3368 char *tmps;
3369 char open, close, term;
3370 I32 brackets = 1;
3371
3280af22 3372 while (t < PL_bufend && isSPACE(*t))
b8a4b1be 3373 t++;
abc667d1
DM
3374 /* check for q => */
3375 if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
3376 OPERATOR(HASHBRACK);
3377 }
b8a4b1be
GS
3378 term = *t;
3379 open = term;
3380 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3381 term = tmps[5];
3382 close = term;
3383 if (open == close)
3280af22
NIS
3384 for (t++; t < PL_bufend; t++) {
3385 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 3386 t++;
6d07e5e9 3387 else if (*t == open)
b8a4b1be
GS
3388 break;
3389 }
abc667d1 3390 else {
3280af22
NIS
3391 for (t++; t < PL_bufend; t++) {
3392 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 3393 t++;
6d07e5e9 3394 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
3395 break;
3396 else if (*t == open)
3397 brackets++;
3398 }
abc667d1
DM
3399 }
3400 t++;
b8a4b1be 3401 }
abc667d1
DM
3402 else
3403 /* skip plain q word */
3404 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3405 t += UTF8SKIP(t);
a0d0e21e 3406 }
7e2040f0 3407 else if (isALNUM_lazy_if(t,UTF)) {
0505442f 3408 t += UTF8SKIP(t);
7e2040f0 3409 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
0505442f 3410 t += UTF8SKIP(t);
a0d0e21e 3411 }
3280af22 3412 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 3413 t++;
b8a4b1be
GS
3414 /* if comma follows first term, call it an anon hash */
3415 /* XXX it could be a comma expression with loop modifiers */
3280af22 3416 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 3417 || (*t == '=' && t[1] == '>')))
a0d0e21e 3418 OPERATOR(HASHBRACK);
3280af22 3419 if (PL_expect == XREF)
4e4e412b 3420 PL_expect = XTERM;
a0d0e21e 3421 else {
3280af22
NIS
3422 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3423 PL_expect = XSTATE;
a0d0e21e 3424 }
8990e307 3425 }
a0d0e21e 3426 break;
463ee0b2 3427 }
57843af0 3428 yylval.ival = CopLINE(PL_curcop);
79072805 3429 if (isSPACE(*s) || *s == '#')
3280af22 3430 PL_copline = NOLINE; /* invalidate current command line number */
79072805 3431 TOKEN('{');
378cc40b 3432 case '}':
79072805
LW
3433 rightbracket:
3434 s++;
3280af22 3435 if (PL_lex_brackets <= 0)
d98d5fff 3436 yyerror("Unmatched right curly bracket");
463ee0b2 3437 else
3280af22 3438 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
c2e66d9e 3439 if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3280af22
NIS
3440 PL_lex_formbrack = 0;
3441 if (PL_lex_state == LEX_INTERPNORMAL) {
3442 if (PL_lex_brackets == 0) {
9059aa12
LW
3443 if (PL_expect & XFAKEBRACK) {
3444 PL_expect &= XENUMMASK;
3280af22
NIS
3445 PL_lex_state = LEX_INTERPEND;
3446 PL_bufptr = s;
cea2e8a9 3447 return yylex(); /* ignore fake brackets */
79072805 3448 }
fa83b5b6 3449 if (*s == '-' && s[1] == '>')
3280af22 3450 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 3451 else if (*s != '[' && *s != '{')
3280af22 3452 PL_lex_state = LEX_INTERPEND;
79072805
LW
3453 }
3454 }
9059aa12
LW
3455 if (PL_expect & XFAKEBRACK) {
3456 PL_expect &= XENUMMASK;
3280af22 3457 PL_bufptr = s;
cea2e8a9 3458 return yylex(); /* ignore fake brackets */
748a9306 3459 }
79072805
LW
3460 force_next('}');
3461 TOKEN(';');
378cc40b
LW
3462 case '&':
3463 s++;
3464 tmp = *s++;
3465 if (tmp == '&')
a0d0e21e 3466 AOPERATOR(ANDAND);
378cc40b 3467 s--;
3280af22 3468 if (PL_expect == XOPERATOR) {
7e2040f0
GS
3469 if (ckWARN(WARN_SEMICOLON)
3470 && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
3471 {
57843af0 3472 CopLINE_dec(PL_curcop);
9014280d 3473 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 3474 CopLINE_inc(PL_curcop);
463ee0b2 3475 }
79072805 3476 BAop(OP_BIT_AND);
463ee0b2 3477 }
79072805 3478
3280af22
NIS
3479 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3480 if (*PL_tokenbuf) {
3481 PL_expect = XOPERATOR;
3482 force_ident(PL_tokenbuf, '&');
463ee0b2 3483 }
79072805
LW
3484 else
3485 PREREF('&');
c07a80fd 3486 yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
3487 TERM('&');
3488
378cc40b
LW
3489 case '|':
3490 s++;
3491 tmp = *s++;
3492 if (tmp == '|')
a0d0e21e 3493 AOPERATOR(OROR);
378cc40b 3494 s--;
79072805 3495 BOop(OP_BIT_OR);
378cc40b
LW
3496 case '=':
3497 s++;
3498 tmp = *s++;
3499 if (tmp == '=')
79072805
LW
3500 Eop(OP_EQ);
3501 if (tmp == '>')
3502 OPERATOR(',');
378cc40b 3503 if (tmp == '~')
79072805 3504 PMop(OP_MATCH);
599cee73 3505 if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
9014280d 3506 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
378cc40b 3507 s--;
3280af22
NIS
3508 if (PL_expect == XSTATE && isALPHA(tmp) &&
3509 (s == PL_linestart+1 || s[-2] == '\n') )
748a9306 3510 {
3280af22
NIS
3511 if (PL_in_eval && !PL_rsfp) {
3512 d = PL_bufend;
a5f75d66
AD
3513 while (s < d) {
3514 if (*s++ == '\n') {
3515 incline(s);
3516 if (strnEQ(s,"=cut",4)) {
3517 s = strchr(s,'\n');
3518 if (s)
3519 s++;
3520 else
3521 s = d;
3522 incline(s);
3523 goto retry;
3524 }
3525 }
3526 }
3527 goto retry;
3528 }
3280af22
NIS
3529 s = PL_bufend;
3530 PL_doextract = TRUE;
a0d0e21e
LW
3531 goto retry;
3532 }
3280af22 3533 if (PL_lex_brackets < PL_lex_formbrack) {
a0d0e21e 3534 char *t;
51882d45 3535#ifdef PERL_STRICT_CR
bf4acbe4 3536 for (t = s; SPACE_OR_TAB(*t); t++) ;
51882d45 3537#else
bf4acbe4 3538 for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
51882d45 3539#endif
a0d0e21e
LW
3540 if (*t == '\n' || *t == '#') {
3541 s--;
3280af22 3542 PL_expect = XBLOCK;
a0d0e21e
LW
3543 goto leftbracket;
3544 }
79072805 3545 }
a0d0e21e
LW
3546 yylval.ival = 0;
3547 OPERATOR(ASSIGNOP);
378cc40b
LW
3548 case '!':
3549 s++;
3550 tmp = *s++;
984200d0 3551 if (tmp == '=') {
decca21c
YST
3552 /* was this !=~ where !~ was meant?
3553 * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
3554
984200d0
YST
3555 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
3556 char *t = s+1;
3557
3558 while (t < PL_bufend && isSPACE(*t))
3559 ++t;
3560
decca21c
YST
3561 if (*t == '/' || *t == '?' ||
3562 ((*t == 'm' || *t == 's' || *t == 'y') && !isALNUM(t[1])) ||
3563 (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
984200d0
YST
3564 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3565 "!=~ should be !~");
3566 }
79072805 3567 Eop(OP_NE);
984200d0 3568 }
378cc40b 3569 if (tmp == '~')
79072805 3570 PMop(OP_NOT);
378cc40b
LW
3571 s--;
3572 OPERATOR('!');
3573 case '<':
3280af22 3574 if (PL_expect != XOPERATOR) {
93a17b20 3575 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 3576 check_uni();
79072805
LW
3577 if (s[1] == '<')
3578 s = scan_heredoc(s);
3579 else
3580 s = scan_inputsymbol(s);
3581 TERM(sublex_start());
378cc40b
LW
3582 }
3583 s++;
3584 tmp = *s++;
3585 if (tmp == '<')
79072805 3586 SHop(OP_LEFT_SHIFT);
395c3793
LW
3587 if (tmp == '=') {
3588 tmp = *s++;
3589 if (tmp == '>')
79072805 3590 Eop(OP_NCMP);
395c3793 3591 s--;
79072805 3592 Rop(OP_LE);
395c3793 3593 }
378cc40b 3594 s--;
79072805 3595 Rop(OP_LT);
378cc40b
LW
3596 case '>':
3597 s++;
3598 tmp = *s++;
3599 if (tmp == '>')
79072805 3600 SHop(OP_RIGHT_SHIFT);
378cc40b 3601 if (tmp == '=')
79072805 3602 Rop(OP_GE);
378cc40b 3603 s--;
79072805 3604 Rop(OP_GT);
378cc40b
LW
3605
3606 case '$':
bbce6d69 3607 CLINE;
3608
3280af22
NIS
3609 if (PL_expect == XOPERATOR) {
3610 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3611 PL_expect = XTERM;
a0d0e21e 3612 depcom();
bbf60fe6 3613 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 3614 }
8990e307 3615 }
a0d0e21e 3616
7e2040f0 3617 if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3280af22 3618 PL_tokenbuf[0] = '@';
376b8730
SM
3619 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3620 sizeof PL_tokenbuf - 1, FALSE);
3621 if (PL_expect == XOPERATOR)
3622 no_op("Array length", s);
3280af22 3623 if (!PL_tokenbuf[1])
a0d0e21e 3624 PREREF(DOLSHARP);
3280af22
NIS
3625 PL_expect = XOPERATOR;
3626 PL_pending_ident = '#';
463ee0b2 3627 TOKEN(DOLSHARP);
79072805 3628 }
bbce6d69 3629
3280af22 3630 PL_tokenbuf[0] = '$';
376b8730
SM
3631 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3632 sizeof PL_tokenbuf - 1, FALSE);
3633 if (PL_expect == XOPERATOR)
3634 no_op("Scalar", s);
3280af22
NIS
3635 if (!PL_tokenbuf[1]) {
3636 if (s == PL_bufend)
bbce6d69 3637 yyerror("Final $ should be \\$ or $name");
3638 PREREF('$');
8990e307 3639 }
a0d0e21e 3640
bbce6d69 3641 /* This kludge not intended to be bulletproof. */
3280af22 3642 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
bbce6d69 3643 yylval.opval = newSVOP(OP_CONST, 0,
b448e4fe 3644 newSViv(PL_compiling.cop_arybase));
bbce6d69 3645 yylval.opval->op_private = OPpCONST_ARYBASE;
3646 TERM(THING);
3647 }
3648
ff68c719 3649 d = s;
69d2bceb 3650 tmp = (I32)*s;
3280af22 3651 if (PL_lex_state == LEX_NORMAL)
ff68c719 3652 s = skipspace(s);
3653
3280af22 3654 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3655 char *t;
3656 if (*s == '[') {
3280af22 3657 PL_tokenbuf[0] = '@';
599cee73 3658 if (ckWARN(WARN_SYNTAX)) {
bbce6d69 3659 for(t = s + 1;
7e2040f0 3660 isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
bbce6d69 3661 t++) ;
a0d0e21e 3662 if (*t++ == ',') {
3280af22
NIS
3663 PL_bufptr = skipspace(PL_bufptr);
3664 while (t < PL_bufend && *t != ']')
bbce6d69 3665 t++;
9014280d 3666 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73
PM
3667 "Multidimensional syntax %.*s not supported",
3668 (t - PL_bufptr) + 1, PL_bufptr);
a0d0e21e
LW
3669 }
3670 }
bbce6d69 3671 }
3672 else if (*s == '{') {
3280af22 3673 PL_tokenbuf[0] = '%';
599cee73 3674 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
bbce6d69 3675 (t = strchr(s, '}')) && (t = strchr(t, '=')))
3676 {
3280af22 3677 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
3678 STRLEN len;
3679 for (t++; isSPACE(*t); t++) ;
7e2040f0 3680 if (isIDFIRST_lazy_if(t,UTF)) {
8903cb82 3681 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
59a6d928 3682 for (; isSPACE(*t); t++) ;
864dbfa3 3683 if (*t == ';' && get_cv(tmpbuf, FALSE))
9014280d 3684 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 3685 "You need to quote \"%s\"", tmpbuf);
748a9306 3686 }
93a17b20
LW
3687 }
3688 }
2f3197b3 3689 }
bbce6d69 3690
3280af22 3691 PL_expect = XOPERATOR;
69d2bceb 3692 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3280af22
NIS
3693 bool islop = (PL_last_lop == PL_oldoldbufptr);
3694 if (!islop || PL_last_lop_op == OP_GREPSTART)
3695 PL_expect = XOPERATOR;
bbce6d69 3696 else if (strchr("$@\"'`q", *s))
3280af22 3697 PL_expect = XTERM; /* e.g. print $fh "foo" */
7e2040f0 3698 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3280af22 3699 PL_expect = XTERM; /* e.g. print $fh &sub */
7e2040f0 3700 else if (isIDFIRST_lazy_if(s,UTF)) {
3280af22 3701 char tmpbuf[sizeof PL_tokenbuf];
8903cb82 3702 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
155aba94 3703 if ((tmp = keyword(tmpbuf, len))) {
84902520
TB
3704 /* binary operators exclude handle interpretations */
3705 switch (tmp) {
3706 case -KEY_x:
3707 case -KEY_eq:
3708 case -KEY_ne:
3709 case -KEY_gt:
3710 case -KEY_lt:
3711 case -KEY_ge:
3712 case -KEY_le:
3713 case -KEY_cmp:
3714 break;
3715 default:
3280af22 3716 PL_expect = XTERM; /* e.g. print $fh length() */
84902520
TB
3717 break;
3718 }
3719 }
68dc0745 3720 else {
8a8635f0 3721 PL_expect = XTERM; /* e.g. print $fh subr() */
93a17b20 3722 }
93a17b20 3723 }
bbce6d69 3724 else if (isDIGIT(*s))
3280af22 3725 PL_expect = XTERM; /* e.g. print $fh 3 */
bbce6d69 3726 else if (*s == '.' && isDIGIT(s[1]))
3280af22 3727 PL_expect = XTERM; /* e.g. print $fh .3 */
3792a11b
NC
3728 else if ((*s == '?' || *s == '-' || *s == '+')
3729 && !isSPACE(s[1]) && s[1] != '=')
c963b151 3730 PL_expect = XTERM; /* e.g. print $fh -1 */
7ce6e6b9
RGS
3731 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
3732 PL_expect = XTERM; /* e.g. print $fh /.../
3733 XXX except DORDOR operator */
e0587a03 3734 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3280af22 3735 PL_expect = XTERM; /* print $fh <<"EOF" */
bbce6d69 3736 }
3280af22 3737 PL_pending_ident = '$';
79072805 3738 TOKEN('$');
378cc40b
LW
3739
3740 case '@':
3280af22 3741 if (PL_expect == XOPERATOR)
bbce6d69 3742 no_op("Array", s);
3280af22
NIS
3743 PL_tokenbuf[0] = '@';
3744 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3745 if (!PL_tokenbuf[1]) {
bbce6d69 3746 PREREF('@');
3747 }
3280af22 3748 if (PL_lex_state == LEX_NORMAL)
ff68c719 3749 s = skipspace(s);
3280af22 3750 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3751 if (*s == '{')
3280af22 3752 PL_tokenbuf[0] = '%';
a0d0e21e
LW
3753
3754 /* Warn about @ where they meant $. */
599cee73 3755 if (ckWARN(WARN_SYNTAX)) {
a0d0e21e
LW
3756 if (*s == '[' || *s == '{') {
3757 char *t = s + 1;
7e2040f0 3758 while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
3759 t++;
3760 if (*t == '}' || *t == ']') {
3761 t++;
3280af22 3762 PL_bufptr = skipspace(PL_bufptr);
9014280d 3763 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 3764 "Scalar value %.*s better written as $%.*s",
3280af22 3765 t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
a0d0e21e 3766 }
93a17b20
LW
3767 }
3768 }
463ee0b2 3769 }
3280af22 3770 PL_pending_ident = '@';
79072805 3771 TERM('@');
378cc40b 3772
c963b151 3773 case '/': /* may be division, defined-or, or pattern */
6f33ba73
RGS
3774 if (PL_expect == XTERMORDORDOR && s[1] == '/') {
3775 s += 2;
3776 AOPERATOR(DORDOR);
3777 }
c963b151
BD
3778 case '?': /* may either be conditional or pattern */
3779 if(PL_expect == XOPERATOR) {
3780 tmp = *s++;
3781 if(tmp == '?') {
3782 OPERATOR('?');
3783 }
3784 else {
3785 tmp = *s++;
3786 if(tmp == '/') {
3787 /* A // operator. */
3788 AOPERATOR(DORDOR);
3789 }
3790 else {
3791 s--;
3792 Mop(OP_DIVIDE);
3793 }
3794 }
3795 }
3796 else {
3797 /* Disable warning on "study /blah/" */
3798 if (PL_oldoldbufptr == PL_last_uni
3799 && (*PL_last_uni != 's' || s - PL_last_uni < 5
3800 || memNE(PL_last_uni, "study", 5)
3801 || isALNUM_lazy_if(PL_last_uni+5,UTF)
3802 ))
3803 check_uni();
3804 s = scan_pat(s,OP_MATCH);
3805 TERM(sublex_start());
3806 }
378cc40b
LW
3807
3808 case '.':
51882d45
GS
3809 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3810#ifdef PERL_STRICT_CR
3811 && s[1] == '\n'
3812#else
3813 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3814#endif
3815 && (s == PL_linestart || s[-1] == '\n') )
3816 {
3280af22
NIS
3817 PL_lex_formbrack = 0;
3818 PL_expect = XSTATE;
79072805
LW
3819 goto rightbracket;
3820 }
3280af22 3821 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
378cc40b 3822 tmp = *s++;
a687059c
LW
3823 if (*s == tmp) {
3824 s++;
2f3197b3
LW
3825 if (*s == tmp) {
3826 s++;
79072805 3827 yylval.ival = OPf_SPECIAL;
2f3197b3
LW
3828 }
3829 else
79072805 3830 yylval.ival = 0;
378cc40b 3831 OPERATOR(DOTDOT);
a687059c 3832 }
3280af22 3833 if (PL_expect != XOPERATOR)
2f3197b3 3834 check_uni();
79072805 3835 Aop(OP_CONCAT);
378cc40b
LW
3836 }
3837 /* FALL THROUGH */
3838 case '0': case '1': case '2': case '3': case '4':
3839 case '5': case '6': case '7': case '8': case '9':
b73d6f50 3840 s = scan_num(s, &yylval);
4e553d73 3841 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 3842 "### Saw number in '%s'\n", s);
5f80b19c 3843 } );
3280af22 3844 if (PL_expect == XOPERATOR)
8990e307 3845 no_op("Number",s);
79072805
LW
3846 TERM(THING);
3847
3848 case '\'':
09bef843 3849 s = scan_str(s,FALSE,FALSE);
4e553d73 3850 DEBUG_T( { PerlIO_printf(Perl_debug_log,
207e3d1a 3851 "### Saw string before '%s'\n", s);
5f80b19c 3852 } );
3280af22
NIS
3853 if (PL_expect == XOPERATOR) {
3854 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3855 PL_expect = XTERM;
a0d0e21e 3856 depcom();
bbf60fe6 3857 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 3858 }
463ee0b2 3859 else
8990e307 3860 no_op("String",s);
463ee0b2 3861 }
79072805 3862 if (!s)
85e6fe83 3863 missingterm((char*)0);
79072805
LW
3864 yylval.ival = OP_CONST;
3865 TERM(sublex_start());
3866
3867 case '"':
09bef843 3868 s = scan_str(s,FALSE,FALSE);
4e553d73 3869 DEBUG_T( { PerlIO_printf(Perl_debug_log,
207e3d1a 3870 "### Saw string before '%s'\n", s);
5f80b19c 3871 } );
3280af22
NIS
3872 if (PL_expect == XOPERATOR) {
3873 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3874 PL_expect = XTERM;
a0d0e21e 3875 depcom();
bbf60fe6 3876 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 3877 }
463ee0b2 3878 else
8990e307 3879 no_op("String",s);
463ee0b2 3880 }
79072805 3881 if (!s)
85e6fe83 3882 missingterm((char*)0);
4633a7c4 3883 yylval.ival = OP_CONST;
3280af22 3884 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
63cd0674 3885 if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
4633a7c4
LW
3886 yylval.ival = OP_STRINGIFY;
3887 break;
3888 }
3889 }
79072805
LW
3890 TERM(sublex_start());
3891
3892 case '`':
09bef843 3893 s = scan_str(s,FALSE,FALSE);
4e553d73 3894 DEBUG_T( { PerlIO_printf(Perl_debug_log,
207e3d1a 3895 "### Saw backtick string before '%s'\n", s);
5f80b19c 3896 } );
3280af22 3897 if (PL_expect == XOPERATOR)
8990e307 3898 no_op("Backticks",s);
79072805 3899 if (!s)
85e6fe83 3900 missingterm((char*)0);
79072805
LW
3901 yylval.ival = OP_BACKTICK;
3902 set_csh();
3903 TERM(sublex_start());
3904
3905 case '\\':
3906 s++;
599cee73 3907 if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
9014280d 3908 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
599cee73 3909 *s, *s);
3280af22 3910 if (PL_expect == XOPERATOR)
8990e307 3911 no_op("Backslash",s);
79072805
LW
3912 OPERATOR(REFGEN);
3913
a7cb1f99 3914 case 'v':
e526c9e6 3915 if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
a7cb1f99
GS
3916 char *start = s;
3917 start++;
3918 start++;
dd629d5b 3919 while (isDIGIT(*start) || *start == '_')
a7cb1f99
GS
3920 start++;
3921 if (*start == '.' && isDIGIT(start[1])) {
b73d6f50 3922 s = scan_num(s, &yylval);
a7cb1f99
GS
3923 TERM(THING);
3924 }
e526c9e6 3925 /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6f33ba73
RGS
3926 else if (!isALPHA(*start) && (PL_expect == XTERM
3927 || PL_expect == XREF || PL_expect == XSTATE
3928 || PL_expect == XTERMORDORDOR)) {
e526c9e6
GS
3929 char c = *start;
3930 GV *gv;
3931 *start = '\0';
3932 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
3933 *start = c;
3934 if (!gv) {
b73d6f50 3935 s = scan_num(s, &yylval);
e526c9e6
GS
3936 TERM(THING);
3937 }
3938 }
a7cb1f99
GS
3939 }
3940 goto keylookup;
79072805 3941 case 'x':
3280af22 3942 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
3943 s++;
3944 Mop(OP_REPEAT);
2f3197b3 3945 }
79072805
LW
3946 goto keylookup;
3947
378cc40b 3948 case '_':
79072805
LW
3949 case 'a': case 'A':
3950 case 'b': case 'B':
3951 case 'c': case 'C':
3952 case 'd': case 'D':
3953 case 'e': case 'E':
3954 case 'f': case 'F':
3955 case 'g': case 'G':
3956 case 'h': case 'H':
3957 case 'i': case 'I':
3958 case 'j': case 'J':
3959 case 'k': case 'K':
3960 case 'l': case 'L':
3961 case 'm': case 'M':
3962 case 'n': case 'N':
3963 case 'o': case 'O':
3964 case 'p': case 'P':
3965 case 'q': case 'Q':
3966 case 'r': case 'R':
3967 case 's': case 'S':
3968 case 't': case 'T':
3969 case 'u': case 'U':
a7cb1f99 3970 case 'V':
79072805
LW
3971 case 'w': case 'W':
3972 case 'X':
3973 case 'y': case 'Y':
3974 case 'z': case 'Z':
3975
49dc05e3 3976 keylookup: {
1d239bbb 3977 orig_keyword = 0;
161b471a
NIS
3978 gv = Nullgv;
3979 gvp = 0;
49dc05e3 3980
3280af22
NIS
3981 PL_bufptr = s;
3982 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 3983
3984 /* Some keywords can be followed by any delimiter, including ':' */
155aba94
GS
3985 tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
3986 (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3987 (PL_tokenbuf[0] == 'q' &&
3988 strchr("qwxr", PL_tokenbuf[1])))));
8ebc5c01 3989
3990 /* x::* is just a word, unless x is "CORE" */
3280af22 3991 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
3992 goto just_a_word;
3993
3643fb5f 3994 d = s;
3280af22 3995 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
3996 d++; /* no comments skipped here, or s### is misparsed */
3997
3998 /* Is this a label? */
3280af22
NIS
3999 if (!tmp && PL_expect == XSTATE
4000 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
8ebc5c01 4001 s = d + 1;
3280af22 4002 yylval.pval = savepv(PL_tokenbuf);
8ebc5c01 4003 CLINE;
4004 TOKEN(LABEL);
3643fb5f
CS
4005 }
4006
4007 /* Check for keywords */
3280af22 4008 tmp = keyword(PL_tokenbuf, len);
748a9306
LW
4009
4010 /* Is this a word before a => operator? */
1c3923b3 4011 if (*d == '=' && d[1] == '>') {
748a9306 4012 CLINE;
3280af22 4013 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
748a9306 4014 yylval.opval->op_private = OPpCONST_BARE;
0064a8a9 4015 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
7948272d 4016 SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
748a9306
LW
4017 TERM(WORD);
4018 }
4019
a0d0e21e 4020 if (tmp < 0) { /* second-class keyword? */
56f7f34b
CS
4021 GV *ogv = Nullgv; /* override (winner) */
4022 GV *hgv = Nullgv; /* hidden (loser) */
3280af22 4023 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 4024 CV *cv;
3280af22 4025 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
56f7f34b
CS
4026 (cv = GvCVu(gv)))
4027 {
4028 if (GvIMPORTED_CV(gv))
4029 ogv = gv;
4030 else if (! CvMETHOD(cv))
4031 hgv = gv;
4032 }
4033 if (!ogv &&
3280af22
NIS
4034 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
4035 (gv = *gvp) != (GV*)&PL_sv_undef &&
56f7f34b
CS
4036 GvCVu(gv) && GvIMPORTED_CV(gv))
4037 {
4038 ogv = gv;
4039 }
4040 }
4041 if (ogv) {
30fe34ed 4042 orig_keyword = tmp;
56f7f34b 4043 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
4044 }
4045 else if (gv && !gvp
4046 && -tmp==KEY_lock /* XXX generalizable kludge */
d0456cad 4047 && GvCVu(gv)
3280af22 4048 && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
6e7b2336
GS
4049 {
4050 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 4051 }
7fc307b5
RGS
4052 else if (gv && !gvp
4053 && tmp == -KEY_err
4054 && GvCVu(gv)
4055 && PL_expect != XOPERATOR
4056 && PL_expect != XTERMORDORDOR)
4057 {
4058 /* any sub overrides the "err" keyword, except when really an
4059 * operator is expected */
4060 tmp = 0;
4061 }
56f7f34b
CS
4062 else { /* no override */
4063 tmp = -tmp;
ac206dc8 4064 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
9014280d 4065 Perl_warner(aTHX_ packWARN(WARN_MISC),
ac206dc8
RGS
4066 "dump() better written as CORE::dump()");
4067 }
56f7f34b
CS
4068 gv = Nullgv;
4069 gvp = 0;
4944e2f7
GS
4070 if (ckWARN(WARN_AMBIGUOUS) && hgv
4071 && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
9014280d 4072 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 4073 "Ambiguous call resolved as CORE::%s(), %s",
2f3ca594 4074 GvENAME(hgv), "qualify as such or use &");
49dc05e3 4075 }
a0d0e21e
LW
4076 }
4077
4078 reserved_word:
4079 switch (tmp) {
79072805
LW
4080
4081 default: /* not a keyword */
93a17b20 4082 just_a_word: {
96e4d5b1 4083 SV *sv;
ce29ac45 4084 int pkgname = 0;
3280af22 4085 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
8990e307
LW
4086
4087 /* Get the rest if it looks like a package qualifier */
4088
155aba94 4089 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
c3e0f903 4090 STRLEN morelen;
3280af22 4091 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
4092 TRUE, &morelen);
4093 if (!morelen)
cea2e8a9 4094 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 4095 *s == '\'' ? "'" : "::");
c3e0f903 4096 len += morelen;
ce29ac45 4097 pkgname = 1;
a0d0e21e 4098 }
8990e307 4099
3280af22
NIS
4100 if (PL_expect == XOPERATOR) {
4101 if (PL_bufptr == PL_linestart) {
57843af0 4102 CopLINE_dec(PL_curcop);
9014280d 4103 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 4104 CopLINE_inc(PL_curcop);
463ee0b2
LW
4105 }
4106 else
54310121 4107 no_op("Bareword",s);
463ee0b2 4108 }
8990e307 4109
c3e0f903
GS
4110 /* Look for a subroutine with this name in current package,
4111 unless name is "Foo::", in which case Foo is a bearword
4112 (and a package name). */
4113
4114 if (len > 2 &&
3280af22 4115 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 4116 {
e476b1b5 4117 if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
9014280d 4118 Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
599cee73 4119 "Bareword \"%s\" refers to nonexistent package",
3280af22 4120 PL_tokenbuf);
c3e0f903 4121 len -= 2;
3280af22 4122 PL_tokenbuf[len] = '\0';
c3e0f903
GS
4123 gv = Nullgv;
4124 gvp = 0;
4125 }
4126 else {
4127 len = 0;
4128 if (!gv)
3280af22 4129 gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
c3e0f903
GS
4130 }
4131
4132 /* if we saw a global override before, get the right name */
8990e307 4133
49dc05e3 4134 if (gvp) {
79cb57f6 4135 sv = newSVpvn("CORE::GLOBAL::",14);
3280af22 4136 sv_catpv(sv,PL_tokenbuf);
49dc05e3
GS
4137 }
4138 else
3280af22 4139 sv = newSVpv(PL_tokenbuf,0);
8990e307 4140
a0d0e21e
LW
4141 /* Presume this is going to be a bareword of some sort. */
4142
4143 CLINE;
49dc05e3 4144 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
a0d0e21e 4145 yylval.opval->op_private = OPpCONST_BARE;
8f8cf39c
JH
4146 /* UTF-8 package name? */
4147 if (UTF && !IN_BYTES &&
4148 is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
4149 SvUTF8_on(sv);
a0d0e21e 4150
c3e0f903
GS
4151 /* And if "Foo::", then that's what it certainly is. */
4152
4153 if (len)
4154 goto safe_bareword;
4155
8990e307
LW
4156 /* See if it's the indirect object for a list operator. */
4157
3280af22
NIS
4158 if (PL_oldoldbufptr &&
4159 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
4160 (PL_oldoldbufptr == PL_last_lop
4161 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 4162 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
4163 (PL_expect == XREF ||
4164 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 4165 {
748a9306
LW
4166 bool immediate_paren = *s == '(';
4167
a0d0e21e
LW
4168 /* (Now we can afford to cross potential line boundary.) */
4169 s = skipspace(s);
4170
4171 /* Two barewords in a row may indicate method call. */
4172
7e2040f0 4173 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
bbf60fe6 4174 return REPORT(tmp);
a0d0e21e
LW
4175
4176 /* If not a declared subroutine, it's an indirect object. */
4177 /* (But it's an indir obj regardless for sort.) */
4178
7948272d 4179 if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
f0670693 4180 ((!gv || !GvCVu(gv)) &&
a9ef352a 4181 (PL_last_lop_op != OP_MAPSTART &&
f0670693 4182 PL_last_lop_op != OP_GREPSTART))))
a9ef352a 4183 {
3280af22 4184 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 4185 goto bareword;
93a17b20
LW
4186 }
4187 }
8990e307 4188
3280af22 4189 PL_expect = XOPERATOR;
8990e307 4190 s = skipspace(s);
1c3923b3
GS
4191
4192 /* Is this a word before a => operator? */
ce29ac45 4193 if (*s == '=' && s[1] == '>' && !pkgname) {
1c3923b3
GS
4194 CLINE;
4195 sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
0064a8a9 4196 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
7948272d 4197 SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
1c3923b3
GS
4198 TERM(WORD);
4199 }
4200
4201 /* If followed by a paren, it's certainly a subroutine. */
93a17b20 4202 if (*s == '(') {
79072805 4203 CLINE;
96e4d5b1 4204 if (gv && GvCVu(gv)) {
bf4acbe4 4205 for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
7a52d87a 4206 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
96e4d5b1 4207 s = d + 1;
4208 goto its_constant;
4209 }
4210 }
3280af22
NIS
4211 PL_nextval[PL_nexttoke].opval = yylval.opval;
4212 PL_expect = XOPERATOR;
93a17b20 4213 force_next(WORD);
c07a80fd 4214 yylval.ival = 0;
463ee0b2 4215 TOKEN('&');
79072805 4216 }
93a17b20 4217
a0d0e21e 4218 /* If followed by var or block, call it a method (unless sub) */
8990e307 4219
8ebc5c01 4220 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
3280af22
NIS
4221 PL_last_lop = PL_oldbufptr;
4222 PL_last_lop_op = OP_METHOD;
93a17b20 4223 PREBLOCK(METHOD);
463ee0b2
LW
4224 }
4225
8990e307
LW
4226 /* If followed by a bareword, see if it looks like indir obj. */
4227
30fe34ed
RGS
4228 if (!orig_keyword
4229 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
4230 && (tmp = intuit_method(s,gv)))
bbf60fe6 4231 return REPORT(tmp);
93a17b20 4232
8990e307
LW
4233 /* Not a method, so call it a subroutine (if defined) */
4234
8ebc5c01 4235 if (gv && GvCVu(gv)) {
46fc3d4c 4236 CV* cv;
0453d815 4237 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
9014280d 4238 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4239 "Ambiguous use of -%s resolved as -&%s()",
3280af22 4240 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 4241 /* Check for a constant sub */
46fc3d4c 4242 cv = GvCV(gv);
96e4d5b1 4243 if ((sv = cv_const_sv(cv))) {
4244 its_constant:
4245 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4246 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4247 yylval.opval->op_private = 0;
4248 TOKEN(WORD);
89bfa8cd 4249 }
4250
a5f75d66
AD
4251 /* Resolve to GV now. */
4252 op_free(yylval.opval);
4253 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
9675f7ac 4254 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 4255 PL_last_lop = PL_oldbufptr;
bf848113 4256 PL_last_lop_op = OP_ENTERSUB;
4633a7c4
LW
4257 /* Is there a prototype? */
4258 if (SvPOK(cv)) {
4259 STRLEN len;
7a52d87a 4260 char *proto = SvPV((SV*)cv, len);
4633a7c4
LW
4261 if (!len)
4262 TERM(FUNC0SUB);
770526c1 4263 if (*proto == '$' && proto[1] == '\0')
4633a7c4 4264 OPERATOR(UNIOPSUB);
0f5d0394
AE
4265 while (*proto == ';')
4266 proto++;
7a52d87a 4267 if (*proto == '&' && *s == '{') {
c99da370
JH
4268 sv_setpv(PL_subname, PL_curstash ?
4269 "__ANON__" : "__ANON__::__ANON__");
4633a7c4
LW
4270 PREBLOCK(LSTOPSUB);
4271 }
a9ef352a 4272 }
3280af22
NIS
4273 PL_nextval[PL_nexttoke].opval = yylval.opval;
4274 PL_expect = XTERM;
8990e307
LW
4275 force_next(WORD);
4276 TOKEN(NOAMP);
4277 }
748a9306 4278
8990e307
LW
4279 /* Call it a bare word */
4280
5603f27d
GS
4281 if (PL_hints & HINT_STRICT_SUBS)
4282 yylval.opval->op_private |= OPpCONST_STRICT;
4283 else {
4284 bareword:
4285 if (ckWARN(WARN_RESERVED)) {
4286 if (lastchar != '-') {
4287 for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
238ae712 4288 if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
9014280d 4289 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
4290 PL_tokenbuf);
4291 }
748a9306
LW
4292 }
4293 }
c3e0f903
GS
4294
4295 safe_bareword:
3792a11b
NC
4296 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
4297 && ckWARN_d(WARN_AMBIGUOUS)) {
9014280d 4298 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4299 "Operator or semicolon missing before %c%s",
3280af22 4300 lastchar, PL_tokenbuf);
9014280d 4301 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4302 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
4303 lastchar, lastchar);
4304 }
93a17b20 4305 TOKEN(WORD);
79072805 4306 }
79072805 4307
68dc0745 4308 case KEY___FILE__:
46fc3d4c 4309 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 4310 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 4311 TERM(THING);
4312
79072805 4313 case KEY___LINE__:
cf2093f6 4314 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 4315 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 4316 TERM(THING);
68dc0745 4317
4318 case KEY___PACKAGE__:
4319 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22 4320 (PL_curstash
9508c957 4321 ? newSVpv(HvNAME(PL_curstash), 0)
3280af22 4322 : &PL_sv_undef));
79072805 4323 TERM(THING);
79072805 4324
e50aee73 4325 case KEY___DATA__:
79072805
LW
4326 case KEY___END__: {
4327 GV *gv;
79072805
LW
4328
4329 /*SUPPRESS 560*/
3280af22 4330 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
e50aee73 4331 char *pname = "main";
3280af22
NIS
4332 if (PL_tokenbuf[2] == 'D')
4333 pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
cea2e8a9 4334 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
a5f75d66 4335 GvMULTI_on(gv);
79072805 4336 if (!GvIO(gv))
a0d0e21e 4337 GvIOp(gv) = newIO();
3280af22 4338 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
4339#if defined(HAS_FCNTL) && defined(F_SETFD)
4340 {
3280af22 4341 int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
4342 fcntl(fd,F_SETFD,fd >= 3);
4343 }
79072805 4344#endif
fd049845 4345 /* Mark this internal pseudo-handle as clean */
4346 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3280af22 4347 if (PL_preprocess)
50952442 4348 IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
3280af22 4349 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 4350 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 4351 else
50952442 4352 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
4353#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4354 /* if the script was opened in binmode, we need to revert
53129d29 4355 * it to text mode for compatibility; but only iff it has CRs
c39cd008 4356 * XXX this is a questionable hack at best. */
53129d29
GS
4357 if (PL_bufend-PL_bufptr > 2
4358 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
4359 {
4360 Off_t loc = 0;
50952442 4361 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
4362 loc = PerlIO_tell(PL_rsfp);
4363 (void)PerlIO_seek(PL_rsfp, 0L, 0);
4364 }
2986a63f
JH
4365#ifdef NETWARE
4366 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4367#else
c39cd008 4368 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 4369#endif /* NETWARE */
1143fce0
JH
4370#ifdef PERLIO_IS_STDIO /* really? */
4371# if defined(__BORLANDC__)
cb359b41
JH
4372 /* XXX see note in do_binmode() */
4373 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
4374# endif
4375#endif
c39cd008
GS
4376 if (loc > 0)
4377 PerlIO_seek(PL_rsfp, loc, 0);
4378 }
4379 }
4380#endif
7948272d 4381#ifdef PERLIO_LAYERS
52d2e0f4
JH
4382 if (!IN_BYTES) {
4383 if (UTF)
4384 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4385 else if (PL_encoding) {
4386 SV *name;
4387 dSP;
4388 ENTER;
4389 SAVETMPS;
4390 PUSHMARK(sp);
4391 EXTEND(SP, 1);
4392 XPUSHs(PL_encoding);
4393 PUTBACK;
4394 call_method("name", G_SCALAR);
4395 SPAGAIN;
4396 name = POPs;
4397 PUTBACK;
4398 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
4399 Perl_form(aTHX_ ":encoding(%"SVf")",
4400 name));
4401 FREETMPS;
4402 LEAVE;
4403 }
4404 }
7948272d 4405#endif
3280af22 4406 PL_rsfp = Nullfp;
79072805
LW
4407 }
4408 goto fake_eof;
e929a76b 4409 }
de3bb511 4410
8990e307 4411 case KEY_AUTOLOAD:
ed6116ce 4412 case KEY_DESTROY:
79072805 4413 case KEY_BEGIN:
7d30b5c4 4414 case KEY_CHECK:
7d07dbc2 4415 case KEY_INIT:
7d30b5c4 4416 case KEY_END:
3280af22
NIS
4417 if (PL_expect == XSTATE) {
4418 s = PL_bufptr;
93a17b20 4419 goto really_sub;
79072805
LW
4420 }
4421 goto just_a_word;
4422
a0d0e21e
LW
4423 case KEY_CORE:
4424 if (*s == ':' && s[1] == ':') {
4425 s += 2;
748a9306 4426 d = s;
3280af22 4427 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6798c92b
GS
4428 if (!(tmp = keyword(PL_tokenbuf, len)))
4429 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
4430 if (tmp < 0)
4431 tmp = -tmp;
4432 goto reserved_word;
4433 }
4434 goto just_a_word;
4435
463ee0b2
LW
4436 case KEY_abs:
4437 UNI(OP_ABS);
4438
79072805
LW
4439 case KEY_alarm:
4440 UNI(OP_ALARM);
4441
4442 case KEY_accept:
a0d0e21e 4443 LOP(OP_ACCEPT,XTERM);
79072805 4444
463ee0b2
LW
4445 case KEY_and:
4446 OPERATOR(ANDOP);
4447
79072805 4448 case KEY_atan2:
a0d0e21e 4449 LOP(OP_ATAN2,XTERM);
85e6fe83 4450
79072805 4451 case KEY_bind:
a0d0e21e 4452 LOP(OP_BIND,XTERM);
79072805
LW
4453
4454 case KEY_binmode:
1c1fc3ea 4455 LOP(OP_BINMODE,XTERM);
79072805
LW
4456
4457 case KEY_bless:
a0d0e21e 4458 LOP(OP_BLESS,XTERM);
79072805
LW
4459
4460 case KEY_chop:
4461 UNI(OP_CHOP);
4462
4463 case KEY_continue:
4464 PREBLOCK(CONTINUE);
4465
4466 case KEY_chdir:
85e6fe83 4467 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
79072805
LW
4468 UNI(OP_CHDIR);
4469
4470 case KEY_close:
4471 UNI(OP_CLOSE);
4472
4473 case KEY_closedir:
4474 UNI(OP_CLOSEDIR);
4475
4476 case KEY_cmp:
4477 Eop(OP_SCMP);
4478
4479 case KEY_caller:
4480 UNI(OP_CALLER);
4481
4482 case KEY_crypt:
4483#ifdef FCRYPT
f4c556ac
GS
4484 if (!PL_cryptseen) {
4485 PL_cryptseen = TRUE;
de3bb511 4486 init_des();
f4c556ac 4487 }
a687059c 4488#endif
a0d0e21e 4489 LOP(OP_CRYPT,XTERM);
79072805
LW
4490
4491 case KEY_chmod:
a0d0e21e 4492 LOP(OP_CHMOD,XTERM);
79072805
LW
4493
4494 case KEY_chown:
a0d0e21e 4495 LOP(OP_CHOWN,XTERM);
79072805
LW
4496
4497 case KEY_connect:
a0d0e21e 4498 LOP(OP_CONNECT,XTERM);
79072805 4499
463ee0b2
LW
4500 case KEY_chr:
4501 UNI(OP_CHR);
4502
79072805
LW
4503 case KEY_cos:
4504 UNI(OP_COS);
4505
4506 case KEY_chroot:
4507 UNI(OP_CHROOT);
4508
4509 case KEY_do:
4510 s = skipspace(s);
4511 if (*s == '{')
a0d0e21e 4512 PRETERMBLOCK(DO);
79072805 4513 if (*s != '\'')
89c5585f 4514 s = force_word(s,WORD,TRUE,TRUE,FALSE);
378cc40b 4515 OPERATOR(DO);
79072805
LW
4516
4517 case KEY_die:
3280af22 4518 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 4519 LOP(OP_DIE,XTERM);
79072805
LW
4520
4521 case KEY_defined:
4522 UNI(OP_DEFINED);
4523
4524 case KEY_delete:
a0d0e21e 4525 UNI(OP_DELETE);
79072805
LW
4526
4527 case KEY_dbmopen:
a0d0e21e
LW
4528 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4529 LOP(OP_DBMOPEN,XTERM);
79072805
LW
4530
4531 case KEY_dbmclose:
4532 UNI(OP_DBMCLOSE);
4533
4534 case KEY_dump:
a0d0e21e 4535 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4536 LOOPX(OP_DUMP);
4537
4538 case KEY_else:
4539 PREBLOCK(ELSE);
4540
4541 case KEY_elsif:
57843af0 4542 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4543 OPERATOR(ELSIF);
4544
4545 case KEY_eq:
4546 Eop(OP_SEQ);
4547
a0d0e21e
LW
4548 case KEY_exists:
4549 UNI(OP_EXISTS);
4e553d73 4550
79072805
LW
4551 case KEY_exit:
4552 UNI(OP_EXIT);
4553
4554 case KEY_eval:
79072805 4555 s = skipspace(s);
3280af22 4556 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 4557 UNIBRACK(OP_ENTEREVAL);
79072805
LW
4558
4559 case KEY_eof:
4560 UNI(OP_EOF);
4561
c963b151
BD
4562 case KEY_err:
4563 OPERATOR(DOROP);
4564
79072805
LW
4565 case KEY_exp:
4566 UNI(OP_EXP);
4567
4568 case KEY_each:
4569 UNI(OP_EACH);
4570
4571 case KEY_exec:
4572 set_csh();
a0d0e21e 4573 LOP(OP_EXEC,XREF);
79072805
LW
4574
4575 case KEY_endhostent:
4576 FUN0(OP_EHOSTENT);
4577
4578 case KEY_endnetent:
4579 FUN0(OP_ENETENT);
4580
4581 case KEY_endservent:
4582 FUN0(OP_ESERVENT);
4583
4584 case KEY_endprotoent:
4585 FUN0(OP_EPROTOENT);
4586
4587 case KEY_endpwent:
4588 FUN0(OP_EPWENT);
4589
4590 case KEY_endgrent:
4591 FUN0(OP_EGRENT);
4592
4593 case KEY_for:
4594 case KEY_foreach:
57843af0 4595 yylval.ival = CopLINE(PL_curcop);
55497cff 4596 s = skipspace(s);
7e2040f0 4597 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 4598 char *p = s;
3280af22 4599 if ((PL_bufend - p) >= 3 &&
55497cff 4600 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4601 p += 2;
77ca0c92
LW
4602 else if ((PL_bufend - p) >= 4 &&
4603 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4604 p += 3;
55497cff 4605 p = skipspace(p);
7e2040f0 4606 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
4607 p = scan_ident(p, PL_bufend,
4608 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4609 p = skipspace(p);
4610 }
4611 if (*p != '$')
cea2e8a9 4612 Perl_croak(aTHX_ "Missing $ on loop variable");
55497cff 4613 }
79072805
LW
4614 OPERATOR(FOR);
4615
4616 case KEY_formline:
a0d0e21e 4617 LOP(OP_FORMLINE,XTERM);
79072805
LW
4618
4619 case KEY_fork:
4620 FUN0(OP_FORK);
4621
4622 case KEY_fcntl:
a0d0e21e 4623 LOP(OP_FCNTL,XTERM);
79072805
LW
4624
4625 case KEY_fileno:
4626 UNI(OP_FILENO);
4627
4628 case KEY_flock:
a0d0e21e 4629 LOP(OP_FLOCK,XTERM);
79072805
LW
4630
4631 case KEY_gt:
4632 Rop(OP_SGT);
4633
4634 case KEY_ge:
4635 Rop(OP_SGE);
4636
4637 case KEY_grep:
2c38e13d 4638 LOP(OP_GREPSTART, XREF);
79072805
LW
4639
4640 case KEY_goto:
a0d0e21e 4641 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4642 LOOPX(OP_GOTO);
4643
4644 case KEY_gmtime:
4645 UNI(OP_GMTIME);
4646
4647 case KEY_getc:
6f33ba73 4648 UNIDOR(OP_GETC);
79072805
LW
4649
4650 case KEY_getppid:
4651 FUN0(OP_GETPPID);
4652
4653 case KEY_getpgrp:
4654 UNI(OP_GETPGRP);
4655
4656 case KEY_getpriority:
a0d0e21e 4657 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
4658
4659 case KEY_getprotobyname:
4660 UNI(OP_GPBYNAME);
4661
4662 case KEY_getprotobynumber:
a0d0e21e 4663 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
4664
4665 case KEY_getprotoent:
4666 FUN0(OP_GPROTOENT);
4667
4668 case KEY_getpwent:
4669 FUN0(OP_GPWENT);
4670
4671 case KEY_getpwnam:
ff68c719 4672 UNI(OP_GPWNAM);
79072805
LW
4673
4674 case KEY_getpwuid:
ff68c719 4675 UNI(OP_GPWUID);
79072805
LW
4676
4677 case KEY_getpeername:
4678 UNI(OP_GETPEERNAME);
4679
4680 case KEY_gethostbyname:
4681 UNI(OP_GHBYNAME);
4682
4683 case KEY_gethostbyaddr:
a0d0e21e 4684 LOP(OP_GHBYADDR,XTERM);
79072805
LW
4685
4686 case KEY_gethostent:
4687 FUN0(OP_GHOSTENT);
4688
4689 case KEY_getnetbyname:
4690 UNI(OP_GNBYNAME);
4691
4692 case KEY_getnetbyaddr:
a0d0e21e 4693 LOP(OP_GNBYADDR,XTERM);
79072805
LW
4694
4695 case KEY_getnetent:
4696 FUN0(OP_GNETENT);
4697
4698 case KEY_getservbyname:
a0d0e21e 4699 LOP(OP_GSBYNAME,XTERM);
79072805
LW
4700
4701 case KEY_getservbyport:
a0d0e21e 4702 LOP(OP_GSBYPORT,XTERM);
79072805
LW
4703
4704 case KEY_getservent:
4705 FUN0(OP_GSERVENT);
4706
4707 case KEY_getsockname:
4708 UNI(OP_GETSOCKNAME);
4709
4710 case KEY_getsockopt:
a0d0e21e 4711 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
4712
4713 case KEY_getgrent:
4714 FUN0(OP_GGRENT);
4715
4716 case KEY_getgrnam:
ff68c719 4717 UNI(OP_GGRNAM);
79072805
LW
4718
4719 case KEY_getgrgid:
ff68c719 4720 UNI(OP_GGRGID);
79072805
LW
4721
4722 case KEY_getlogin:
4723 FUN0(OP_GETLOGIN);
4724
93a17b20 4725 case KEY_glob:
a0d0e21e
LW
4726 set_csh();
4727 LOP(OP_GLOB,XTERM);
93a17b20 4728
79072805
LW
4729 case KEY_hex:
4730 UNI(OP_HEX);
4731
4732 case KEY_if:
57843af0 4733 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4734 OPERATOR(IF);
4735
4736 case KEY_index:
a0d0e21e 4737 LOP(OP_INDEX,XTERM);
79072805
LW
4738
4739 case KEY_int:
4740 UNI(OP_INT);
4741
4742 case KEY_ioctl:
a0d0e21e 4743 LOP(OP_IOCTL,XTERM);
79072805
LW
4744
4745 case KEY_join:
a0d0e21e 4746 LOP(OP_JOIN,XTERM);
79072805
LW
4747
4748 case KEY_keys:
4749 UNI(OP_KEYS);
4750
4751 case KEY_kill:
a0d0e21e 4752 LOP(OP_KILL,XTERM);
79072805
LW
4753
4754 case KEY_last:
a0d0e21e 4755 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 4756 LOOPX(OP_LAST);
4e553d73 4757
79072805
LW
4758 case KEY_lc:
4759 UNI(OP_LC);
4760
4761 case KEY_lcfirst:
4762 UNI(OP_LCFIRST);
4763
4764 case KEY_local:
09bef843 4765 yylval.ival = 0;
79072805
LW
4766 OPERATOR(LOCAL);
4767
4768 case KEY_length:
4769 UNI(OP_LENGTH);
4770
4771 case KEY_lt:
4772 Rop(OP_SLT);
4773
4774 case KEY_le:
4775 Rop(OP_SLE);
4776
4777 case KEY_localtime:
4778 UNI(OP_LOCALTIME);
4779
4780 case KEY_log:
4781 UNI(OP_LOG);
4782
4783 case KEY_link:
a0d0e21e 4784 LOP(OP_LINK,XTERM);
79072805
LW
4785
4786 case KEY_listen:
a0d0e21e 4787 LOP(OP_LISTEN,XTERM);
79072805 4788
c0329465
MB
4789 case KEY_lock:
4790 UNI(OP_LOCK);
4791
79072805
LW
4792 case KEY_lstat:
4793 UNI(OP_LSTAT);
4794
4795 case KEY_m:
8782bef2 4796 s = scan_pat(s,OP_MATCH);
79072805
LW
4797 TERM(sublex_start());
4798
a0d0e21e 4799 case KEY_map:
2c38e13d 4800 LOP(OP_MAPSTART, XREF);
4e4e412b 4801
79072805 4802 case KEY_mkdir:
a0d0e21e 4803 LOP(OP_MKDIR,XTERM);
79072805
LW
4804
4805 case KEY_msgctl:
a0d0e21e 4806 LOP(OP_MSGCTL,XTERM);
79072805
LW
4807
4808 case KEY_msgget:
a0d0e21e 4809 LOP(OP_MSGGET,XTERM);
79072805
LW
4810
4811 case KEY_msgrcv:
a0d0e21e 4812 LOP(OP_MSGRCV,XTERM);
79072805
LW
4813
4814 case KEY_msgsnd:
a0d0e21e 4815 LOP(OP_MSGSND,XTERM);
79072805 4816
77ca0c92 4817 case KEY_our:
93a17b20 4818 case KEY_my:
77ca0c92 4819 PL_in_my = tmp;
c750a3ec 4820 s = skipspace(s);
7e2040f0 4821 if (isIDFIRST_lazy_if(s,UTF)) {
3280af22 4822 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
4823 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4824 goto really_sub;
def3634b 4825 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 4826 if (!PL_in_my_stash) {
c750a3ec 4827 char tmpbuf[1024];
3280af22
NIS
4828 PL_bufptr = s;
4829 sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
4830 yyerror(tmpbuf);
4831 }
4832 }
09bef843 4833 yylval.ival = 1;
55497cff 4834 OPERATOR(MY);
93a17b20 4835
79072805 4836 case KEY_next:
a0d0e21e 4837 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4838 LOOPX(OP_NEXT);
4839
4840 case KEY_ne:
4841 Eop(OP_SNE);
4842
a0d0e21e 4843 case KEY_no:
3280af22 4844 if (PL_expect != XSTATE)
a0d0e21e
LW
4845 yyerror("\"no\" not allowed in expression");
4846 s = force_word(s,WORD,FALSE,TRUE,FALSE);
e759cc13 4847 s = force_version(s, FALSE);
a0d0e21e
LW
4848 yylval.ival = 0;
4849 OPERATOR(USE);
4850
4851 case KEY_not:
2d2e263d
LW
4852 if (*s == '(' || (s = skipspace(s), *s == '('))
4853 FUN1(OP_NOT);
4854 else
4855 OPERATOR(NOTOP);
a0d0e21e 4856
79072805 4857 case KEY_open:
93a17b20 4858 s = skipspace(s);
7e2040f0 4859 if (isIDFIRST_lazy_if(s,UTF)) {
93a17b20 4860 char *t;
7e2040f0 4861 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
e2ab214b
DM
4862 for (t=d; *t && isSPACE(*t); t++) ;
4863 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
4864 /* [perl #16184] */
4865 && !(t[0] == '=' && t[1] == '>')
4866 ) {
9014280d 4867 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 4868 "Precedence problem: open %.*s should be open(%.*s)",
66fbe8fb
HS
4869 d - s, s, d - s, s);
4870 }
93a17b20 4871 }
a0d0e21e 4872 LOP(OP_OPEN,XTERM);
79072805 4873
463ee0b2 4874 case KEY_or:
a0d0e21e 4875 yylval.ival = OP_OR;
463ee0b2
LW
4876 OPERATOR(OROP);
4877
79072805
LW
4878 case KEY_ord:
4879 UNI(OP_ORD);
4880
4881 case KEY_oct:
4882 UNI(OP_OCT);
4883
4884 case KEY_opendir:
a0d0e21e 4885 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
4886
4887 case KEY_print:
3280af22 4888 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4889 LOP(OP_PRINT,XREF);
79072805
LW
4890
4891 case KEY_printf:
3280af22 4892 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4893 LOP(OP_PRTF,XREF);
79072805 4894
c07a80fd 4895 case KEY_prototype:
4896 UNI(OP_PROTOTYPE);
4897
79072805 4898 case KEY_push:
a0d0e21e 4899 LOP(OP_PUSH,XTERM);
79072805
LW
4900
4901 case KEY_pop:
6f33ba73 4902 UNIDOR(OP_POP);
79072805 4903
a0d0e21e 4904 case KEY_pos:
6f33ba73 4905 UNIDOR(OP_POS);
4e553d73 4906
79072805 4907 case KEY_pack:
a0d0e21e 4908 LOP(OP_PACK,XTERM);
79072805
LW
4909
4910 case KEY_package:
a0d0e21e 4911 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
4912 OPERATOR(PACKAGE);
4913
4914 case KEY_pipe:
a0d0e21e 4915 LOP(OP_PIPE_OP,XTERM);
79072805
LW
4916
4917 case KEY_q:
09bef843 4918 s = scan_str(s,FALSE,FALSE);
79072805 4919 if (!s)
85e6fe83 4920 missingterm((char*)0);
79072805
LW
4921 yylval.ival = OP_CONST;
4922 TERM(sublex_start());
4923
a0d0e21e
LW
4924 case KEY_quotemeta:
4925 UNI(OP_QUOTEMETA);
4926
8990e307 4927 case KEY_qw:
09bef843 4928 s = scan_str(s,FALSE,FALSE);
8990e307 4929 if (!s)
85e6fe83 4930 missingterm((char*)0);
8127e0e3
GS
4931 force_next(')');
4932 if (SvCUR(PL_lex_stuff)) {
4933 OP *words = Nullop;
4934 int warned = 0;
3280af22 4935 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 4936 while (len) {
7948272d 4937 SV *sv;
8127e0e3
GS
4938 for (; isSPACE(*d) && len; --len, ++d) ;
4939 if (len) {
4940 char *b = d;
e476b1b5 4941 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
4942 for (; !isSPACE(*d) && len; --len, ++d) {
4943 if (*d == ',') {
9014280d 4944 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
4945 "Possible attempt to separate words with commas");
4946 ++warned;
4947 }
4948 else if (*d == '#') {
9014280d 4949 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
4950 "Possible attempt to put comments in qw() list");
4951 ++warned;
4952 }
4953 }
4954 }
4955 else {
4956 for (; !isSPACE(*d) && len; --len, ++d) ;
4957 }
7948272d
NIS
4958 sv = newSVpvn(b, d-b);
4959 if (DO_UTF8(PL_lex_stuff))
4960 SvUTF8_on(sv);
8127e0e3 4961 words = append_elem(OP_LIST, words,
7948272d 4962 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 4963 }
4964 }
8127e0e3
GS
4965 if (words) {
4966 PL_nextval[PL_nexttoke].opval = words;
4967 force_next(THING);
4968 }
55497cff 4969 }
37fd879b 4970 if (PL_lex_stuff) {
8127e0e3 4971 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
4972 PL_lex_stuff = Nullsv;
4973 }
3280af22 4974 PL_expect = XTERM;
8127e0e3 4975 TOKEN('(');
8990e307 4976
79072805 4977 case KEY_qq:
09bef843 4978 s = scan_str(s,FALSE,FALSE);
79072805 4979 if (!s)
85e6fe83 4980 missingterm((char*)0);
a0d0e21e 4981 yylval.ival = OP_STRINGIFY;
3280af22
NIS
4982 if (SvIVX(PL_lex_stuff) == '\'')
4983 SvIVX(PL_lex_stuff) = 0; /* qq'$foo' should intepolate */
79072805
LW
4984 TERM(sublex_start());
4985
8782bef2
GB
4986 case KEY_qr:
4987 s = scan_pat(s,OP_QR);
4988 TERM(sublex_start());
4989
79072805 4990 case KEY_qx:
09bef843 4991 s = scan_str(s,FALSE,FALSE);
79072805 4992 if (!s)
85e6fe83 4993 missingterm((char*)0);
79072805
LW
4994 yylval.ival = OP_BACKTICK;
4995 set_csh();
4996 TERM(sublex_start());
4997
4998 case KEY_return:
4999 OLDLOP(OP_RETURN);
5000
5001 case KEY_require:
a7cb1f99 5002 s = skipspace(s);
e759cc13
RGS
5003 if (isDIGIT(*s)) {
5004 s = force_version(s, FALSE);
a7cb1f99 5005 }
e759cc13
RGS
5006 else if (*s != 'v' || !isDIGIT(s[1])
5007 || (s = force_version(s, TRUE), *s == 'v'))
5008 {
a7cb1f99
GS
5009 *PL_tokenbuf = '\0';
5010 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 5011 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
a7cb1f99
GS
5012 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
5013 else if (*s == '<')
5014 yyerror("<> should be quotes");
5015 }
463ee0b2 5016 UNI(OP_REQUIRE);
79072805
LW
5017
5018 case KEY_reset:
5019 UNI(OP_RESET);
5020
5021 case KEY_redo:
a0d0e21e 5022 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
5023 LOOPX(OP_REDO);
5024
5025 case KEY_rename:
a0d0e21e 5026 LOP(OP_RENAME,XTERM);
79072805
LW
5027
5028 case KEY_rand:
5029 UNI(OP_RAND);
5030
5031 case KEY_rmdir:
5032 UNI(OP_RMDIR);
5033
5034 case KEY_rindex:
a0d0e21e 5035 LOP(OP_RINDEX,XTERM);
79072805
LW
5036
5037 case KEY_read:
a0d0e21e 5038 LOP(OP_READ,XTERM);
79072805
LW
5039
5040 case KEY_readdir:
5041 UNI(OP_READDIR);
5042
93a17b20
LW
5043 case KEY_readline:
5044 set_csh();
6f33ba73 5045 UNIDOR(OP_READLINE);
93a17b20
LW
5046
5047 case KEY_readpipe:
5048 set_csh();
5049 UNI(OP_BACKTICK);
5050
79072805
LW
5051 case KEY_rewinddir:
5052 UNI(OP_REWINDDIR);
5053
5054 case KEY_recv:
a0d0e21e 5055 LOP(OP_RECV,XTERM);
79072805
LW
5056
5057 case KEY_reverse:
a0d0e21e 5058 LOP(OP_REVERSE,XTERM);
79072805
LW
5059
5060 case KEY_readlink:
6f33ba73 5061 UNIDOR(OP_READLINK);
79072805
LW
5062
5063 case KEY_ref:
5064 UNI(OP_REF);
5065
5066 case KEY_s:
5067 s = scan_subst(s);
5068 if (yylval.opval)
5069 TERM(sublex_start());
5070 else
5071 TOKEN(1); /* force error */
5072
a0d0e21e
LW
5073 case KEY_chomp:
5074 UNI(OP_CHOMP);
4e553d73 5075
79072805
LW
5076 case KEY_scalar:
5077 UNI(OP_SCALAR);
5078
5079 case KEY_select:
a0d0e21e 5080 LOP(OP_SELECT,XTERM);
79072805
LW
5081
5082 case KEY_seek:
a0d0e21e 5083 LOP(OP_SEEK,XTERM);
79072805
LW
5084
5085 case KEY_semctl:
a0d0e21e 5086 LOP(OP_SEMCTL,XTERM);
79072805
LW
5087
5088 case KEY_semget:
a0d0e21e 5089 LOP(OP_SEMGET,XTERM);
79072805
LW
5090
5091 case KEY_semop:
a0d0e21e 5092 LOP(OP_SEMOP,XTERM);
79072805
LW
5093
5094 case KEY_send:
a0d0e21e 5095 LOP(OP_SEND,XTERM);
79072805
LW
5096
5097 case KEY_setpgrp:
a0d0e21e 5098 LOP(OP_SETPGRP,XTERM);
79072805
LW
5099
5100 case KEY_setpriority:
a0d0e21e 5101 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
5102
5103 case KEY_sethostent:
ff68c719 5104 UNI(OP_SHOSTENT);
79072805
LW
5105
5106 case KEY_setnetent:
ff68c719 5107 UNI(OP_SNETENT);
79072805
LW
5108
5109 case KEY_setservent:
ff68c719 5110 UNI(OP_SSERVENT);
79072805
LW
5111
5112 case KEY_setprotoent:
ff68c719 5113 UNI(OP_SPROTOENT);
79072805
LW
5114
5115 case KEY_setpwent:
5116 FUN0(OP_SPWENT);
5117
5118 case KEY_setgrent:
5119 FUN0(OP_SGRENT);
5120
5121 case KEY_seekdir:
a0d0e21e 5122 LOP(OP_SEEKDIR,XTERM);
79072805
LW
5123
5124 case KEY_setsockopt:
a0d0e21e 5125 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
5126
5127 case KEY_shift:
6f33ba73 5128 UNIDOR(OP_SHIFT);
79072805
LW
5129
5130 case KEY_shmctl:
a0d0e21e 5131 LOP(OP_SHMCTL,XTERM);
79072805
LW
5132
5133 case KEY_shmget:
a0d0e21e 5134 LOP(OP_SHMGET,XTERM);
79072805
LW
5135
5136 case KEY_shmread:
a0d0e21e 5137 LOP(OP_SHMREAD,XTERM);
79072805
LW
5138
5139 case KEY_shmwrite:
a0d0e21e 5140 LOP(OP_SHMWRITE,XTERM);
79072805
LW
5141
5142 case KEY_shutdown:
a0d0e21e 5143 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
5144
5145 case KEY_sin:
5146 UNI(OP_SIN);
5147
5148 case KEY_sleep:
5149 UNI(OP_SLEEP);
5150
5151 case KEY_socket:
a0d0e21e 5152 LOP(OP_SOCKET,XTERM);
79072805
LW
5153
5154 case KEY_socketpair:
a0d0e21e 5155 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
5156
5157 case KEY_sort:
3280af22 5158 checkcomma(s,PL_tokenbuf,"subroutine name");
79072805
LW
5159 s = skipspace(s);
5160 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 5161 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 5162 PL_expect = XTERM;
15f0808c 5163 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 5164 LOP(OP_SORT,XREF);
79072805
LW
5165
5166 case KEY_split:
a0d0e21e 5167 LOP(OP_SPLIT,XTERM);
79072805
LW
5168
5169 case KEY_sprintf:
a0d0e21e 5170 LOP(OP_SPRINTF,XTERM);
79072805
LW
5171
5172 case KEY_splice:
a0d0e21e 5173 LOP(OP_SPLICE,XTERM);
79072805
LW
5174
5175 case KEY_sqrt:
5176 UNI(OP_SQRT);
5177
5178 case KEY_srand:
5179 UNI(OP_SRAND);
5180
5181 case KEY_stat:
5182 UNI(OP_STAT);
5183
5184 case KEY_study:
79072805
LW
5185 UNI(OP_STUDY);
5186
5187 case KEY_substr:
a0d0e21e 5188 LOP(OP_SUBSTR,XTERM);
79072805
LW
5189
5190 case KEY_format:
5191 case KEY_sub:
93a17b20 5192 really_sub:
09bef843 5193 {
3280af22 5194 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 5195 SSize_t tboffset = 0;
09bef843 5196 expectation attrful;
d731386a 5197 bool have_name, have_proto, bad_proto;
09bef843
SB
5198 int key = tmp;
5199
5200 s = skipspace(s);
5201
7e2040f0 5202 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
5203 (*s == ':' && s[1] == ':'))
5204 {
5205 PL_expect = XBLOCK;
5206 attrful = XATTRBLOCK;
b1b65b59
JH
5207 /* remember buffer pos'n for later force_word */
5208 tboffset = s - PL_oldbufptr;
09bef843
SB
5209 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5210 if (strchr(tmpbuf, ':'))
5211 sv_setpv(PL_subname, tmpbuf);
5212 else {
5213 sv_setsv(PL_subname,PL_curstname);
5214 sv_catpvn(PL_subname,"::",2);
5215 sv_catpvn(PL_subname,tmpbuf,len);
5216 }
5217 s = skipspace(d);
5218 have_name = TRUE;
5219 }
463ee0b2 5220 else {
09bef843
SB
5221 if (key == KEY_my)
5222 Perl_croak(aTHX_ "Missing name in \"my sub\"");
5223 PL_expect = XTERMBLOCK;
5224 attrful = XATTRTERM;
5225 sv_setpv(PL_subname,"?");
5226 have_name = FALSE;
463ee0b2 5227 }
4633a7c4 5228
09bef843
SB
5229 if (key == KEY_format) {
5230 if (*s == '=')
5231 PL_lex_formbrack = PL_lex_brackets + 1;
5232 if (have_name)
b1b65b59
JH
5233 (void) force_word(PL_oldbufptr + tboffset, WORD,
5234 FALSE, TRUE, TRUE);
09bef843
SB
5235 OPERATOR(FORMAT);
5236 }
79072805 5237
09bef843
SB
5238 /* Look for a prototype */
5239 if (*s == '(') {
5240 char *p;
5241
5242 s = scan_str(s,FALSE,FALSE);
37fd879b 5243 if (!s)
09bef843 5244 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 5245 /* strip spaces and check for bad characters */
09bef843
SB
5246 d = SvPVX(PL_lex_stuff);
5247 tmp = 0;
d731386a 5248 bad_proto = FALSE;
09bef843 5249 for (p = d; *p; ++p) {
d37a9538 5250 if (!isSPACE(*p)) {
09bef843 5251 d[tmp++] = *p;
d37a9538
ST
5252 if (!strchr("$@%*;[]&\\", *p))
5253 bad_proto = TRUE;
5254 }
09bef843
SB
5255 }
5256 d[tmp] = '\0';
420cdfc1 5257 if (bad_proto && ckWARN(WARN_SYNTAX))
9014280d 5258 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
35c1215d
NC
5259 "Illegal character in prototype for %"SVf" : %s",
5260 PL_subname, d);
09bef843
SB
5261 SvCUR(PL_lex_stuff) = tmp;
5262 have_proto = TRUE;
68dc0745 5263
09bef843 5264 s = skipspace(s);
4633a7c4 5265 }
09bef843
SB
5266 else
5267 have_proto = FALSE;
5268
5269 if (*s == ':' && s[1] != ':')
5270 PL_expect = attrful;
8e742a20
MHM
5271 else if (*s != '{' && key == KEY_sub) {
5272 if (!have_name)
5273 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5274 else if (*s != ';')
5275 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
5276 }
09bef843
SB
5277
5278 if (have_proto) {
b1b65b59
JH
5279 PL_nextval[PL_nexttoke].opval =
5280 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
09bef843
SB
5281 PL_lex_stuff = Nullsv;
5282 force_next(THING);
68dc0745 5283 }
09bef843 5284 if (!have_name) {
c99da370
JH
5285 sv_setpv(PL_subname,
5286 PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
09bef843 5287 TOKEN(ANONSUB);
4633a7c4 5288 }
b1b65b59
JH
5289 (void) force_word(PL_oldbufptr + tboffset, WORD,
5290 FALSE, TRUE, TRUE);
09bef843
SB
5291 if (key == KEY_my)
5292 TOKEN(MYSUB);
5293 TOKEN(SUB);
4633a7c4 5294 }
79072805
LW
5295
5296 case KEY_system:
5297 set_csh();
a0d0e21e 5298 LOP(OP_SYSTEM,XREF);
79072805
LW
5299
5300 case KEY_symlink:
a0d0e21e 5301 LOP(OP_SYMLINK,XTERM);
79072805
LW
5302
5303 case KEY_syscall:
a0d0e21e 5304 LOP(OP_SYSCALL,XTERM);
79072805 5305
c07a80fd 5306 case KEY_sysopen:
5307 LOP(OP_SYSOPEN,XTERM);
5308
137443ea 5309 case KEY_sysseek:
5310 LOP(OP_SYSSEEK,XTERM);
5311
79072805 5312 case KEY_sysread:
a0d0e21e 5313 LOP(OP_SYSREAD,XTERM);
79072805
LW
5314
5315 case KEY_syswrite:
a0d0e21e 5316 LOP(OP_SYSWRITE,XTERM);
79072805
LW
5317
5318 case KEY_tr:
5319 s = scan_trans(s);
5320 TERM(sublex_start());
5321
5322 case KEY_tell:
5323 UNI(OP_TELL);
5324
5325 case KEY_telldir:
5326 UNI(OP_TELLDIR);
5327
463ee0b2 5328 case KEY_tie:
a0d0e21e 5329 LOP(OP_TIE,XTERM);
463ee0b2 5330
c07a80fd 5331 case KEY_tied:
5332 UNI(OP_TIED);
5333
79072805
LW
5334 case KEY_time:
5335 FUN0(OP_TIME);
5336
5337 case KEY_times:
5338 FUN0(OP_TMS);
5339
5340 case KEY_truncate:
a0d0e21e 5341 LOP(OP_TRUNCATE,XTERM);
79072805
LW
5342
5343 case KEY_uc:
5344 UNI(OP_UC);
5345
5346 case KEY_ucfirst:
5347 UNI(OP_UCFIRST);
5348
463ee0b2
LW
5349 case KEY_untie:
5350 UNI(OP_UNTIE);
5351
79072805 5352 case KEY_until:
57843af0 5353 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5354 OPERATOR(UNTIL);
5355
5356 case KEY_unless:
57843af0 5357 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5358 OPERATOR(UNLESS);
5359
5360 case KEY_unlink:
a0d0e21e 5361 LOP(OP_UNLINK,XTERM);
79072805
LW
5362
5363 case KEY_undef:
6f33ba73 5364 UNIDOR(OP_UNDEF);
79072805
LW
5365
5366 case KEY_unpack:
a0d0e21e 5367 LOP(OP_UNPACK,XTERM);
79072805
LW
5368
5369 case KEY_utime:
a0d0e21e 5370 LOP(OP_UTIME,XTERM);
79072805
LW
5371
5372 case KEY_umask:
6f33ba73 5373 UNIDOR(OP_UMASK);
79072805
LW
5374
5375 case KEY_unshift:
a0d0e21e
LW
5376 LOP(OP_UNSHIFT,XTERM);
5377
5378 case KEY_use:
3280af22 5379 if (PL_expect != XSTATE)
a0d0e21e 5380 yyerror("\"use\" not allowed in expression");
89bfa8cd 5381 s = skipspace(s);
a7cb1f99 5382 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
e759cc13 5383 s = force_version(s, TRUE);
a7cb1f99 5384 if (*s == ';' || (s = skipspace(s), *s == ';')) {
3280af22 5385 PL_nextval[PL_nexttoke].opval = Nullop;
89bfa8cd 5386 force_next(WORD);
5387 }
e759cc13
RGS
5388 else if (*s == 'v') {
5389 s = force_word(s,WORD,FALSE,TRUE,FALSE);
5390 s = force_version(s, FALSE);
5391 }
89bfa8cd 5392 }
5393 else {
5394 s = force_word(s,WORD,FALSE,TRUE,FALSE);
e759cc13 5395 s = force_version(s, FALSE);
89bfa8cd 5396 }
a0d0e21e
LW
5397 yylval.ival = 1;
5398 OPERATOR(USE);
79072805
LW
5399
5400 case KEY_values:
5401 UNI(OP_VALUES);
5402
5403 case KEY_vec:
a0d0e21e 5404 LOP(OP_VEC,XTERM);
79072805
LW
5405
5406 case KEY_while:
57843af0 5407 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5408 OPERATOR(WHILE);
5409
5410 case KEY_warn:
3280af22 5411 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 5412 LOP(OP_WARN,XTERM);
79072805
LW
5413
5414 case KEY_wait:
5415 FUN0(OP_WAIT);
5416
5417 case KEY_waitpid:
a0d0e21e 5418 LOP(OP_WAITPID,XTERM);
79072805
LW
5419
5420 case KEY_wantarray:
5421 FUN0(OP_WANTARRAY);
5422
5423 case KEY_write:
9d116dd7
JH
5424#ifdef EBCDIC
5425 {
df3728a2
JH
5426 char ctl_l[2];
5427 ctl_l[0] = toCTRL('L');
5428 ctl_l[1] = '\0';
9d116dd7
JH
5429 gv_fetchpv(ctl_l,TRUE, SVt_PV);
5430 }
5431#else
5432 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
5433#endif
79072805
LW
5434 UNI(OP_ENTERWRITE);
5435
5436 case KEY_x:
3280af22 5437 if (PL_expect == XOPERATOR)
79072805
LW
5438 Mop(OP_REPEAT);
5439 check_uni();
5440 goto just_a_word;
5441
a0d0e21e
LW
5442 case KEY_xor:
5443 yylval.ival = OP_XOR;
5444 OPERATOR(OROP);
5445
79072805
LW
5446 case KEY_y:
5447 s = scan_trans(s);
5448 TERM(sublex_start());
5449 }
49dc05e3 5450 }}
79072805 5451}
bf4acbe4
GS
5452#ifdef __SC__
5453#pragma segment Main
5454#endif
79072805 5455
e930465f
JH
5456static int
5457S_pending_ident(pTHX)
8eceec63
SC
5458{
5459 register char *d;
a55b55d8 5460 register I32 tmp = 0;
8eceec63
SC
5461 /* pit holds the identifier we read and pending_ident is reset */
5462 char pit = PL_pending_ident;
5463 PL_pending_ident = 0;
5464
5465 DEBUG_T({ PerlIO_printf(Perl_debug_log,
5466 "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5467
5468 /* if we're in a my(), we can't allow dynamics here.
5469 $foo'bar has already been turned into $foo::bar, so
5470 just check for colons.
5471
5472 if it's a legal name, the OP is a PADANY.
5473 */
5474 if (PL_in_my) {
5475 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
5476 if (strchr(PL_tokenbuf,':'))
5477 yyerror(Perl_form(aTHX_ "No package name allowed for "
5478 "variable %s in \"our\"",
5479 PL_tokenbuf));
dd2155a4 5480 tmp = allocmy(PL_tokenbuf);
8eceec63
SC
5481 }
5482 else {
5483 if (strchr(PL_tokenbuf,':'))
5484 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5485
5486 yylval.opval = newOP(OP_PADANY, 0);
dd2155a4 5487 yylval.opval->op_targ = allocmy(PL_tokenbuf);
8eceec63
SC
5488 return PRIVATEREF;
5489 }
5490 }
5491
5492 /*
5493 build the ops for accesses to a my() variable.
5494
5495 Deny my($a) or my($b) in a sort block, *if* $a or $b is
5496 then used in a comparison. This catches most, but not
5497 all cases. For instance, it catches
5498 sort { my($a); $a <=> $b }
5499 but not
5500 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5501 (although why you'd do that is anyone's guess).
5502 */
5503
5504 if (!strchr(PL_tokenbuf,':')) {
8716503d
DM
5505 if (!PL_in_my)
5506 tmp = pad_findmy(PL_tokenbuf);
5507 if (tmp != NOT_IN_PAD) {
8eceec63 5508 /* might be an "our" variable" */
dd2155a4 5509 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
8eceec63 5510 /* build ops for a bareword */
dd2155a4 5511 SV *sym = newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)), 0);
8eceec63
SC
5512 sv_catpvn(sym, "::", 2);
5513 sv_catpv(sym, PL_tokenbuf+1);
5514 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5515 yylval.opval->op_private = OPpCONST_ENTERED;
5516 gv_fetchpv(SvPVX(sym),
5517 (PL_in_eval
5518 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 5519 : GV_ADDMULTI
8eceec63
SC
5520 ),
5521 ((PL_tokenbuf[0] == '$') ? SVt_PV
5522 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5523 : SVt_PVHV));
5524 return WORD;
5525 }
5526
5527 /* if it's a sort block and they're naming $a or $b */
5528 if (PL_last_lop_op == OP_SORT &&
5529 PL_tokenbuf[0] == '$' &&
5530 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5531 && !PL_tokenbuf[2])
5532 {
5533 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5534 d < PL_bufend && *d != '\n';
5535 d++)
5536 {
5537 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5538 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5539 PL_tokenbuf);
5540 }
5541 }
5542 }
5543
5544 yylval.opval = newOP(OP_PADANY, 0);
5545 yylval.opval->op_targ = tmp;
5546 return PRIVATEREF;
5547 }
5548 }
5549
5550 /*
5551 Whine if they've said @foo in a doublequoted string,
5552 and @foo isn't a variable we can find in the symbol
5553 table.
5554 */
5555 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5556 GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5557 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5558 && ckWARN(WARN_AMBIGUOUS))
5559 {
5560 /* Downgraded from fatal to warning 20000522 mjd */
9014280d 5561 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8eceec63
SC
5562 "Possible unintended interpolation of %s in string",
5563 PL_tokenbuf);
5564 }
5565 }
5566
5567 /* build ops for a bareword */
5568 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5569 yylval.opval->op_private = OPpCONST_ENTERED;
5570 gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5571 ((PL_tokenbuf[0] == '$') ? SVt_PV
5572 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5573 : SVt_PVHV));
5574 return WORD;
5575}
5576
79072805 5577I32
864dbfa3 5578Perl_keyword(pTHX_ register char *d, I32 len)
79072805
LW
5579{
5580 switch (*d) {
5581 case '_':
5582 if (d[1] == '_') {
a0d0e21e 5583 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
68dc0745 5584 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
5585 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
e50aee73 5586 if (strEQ(d,"__DATA__")) return KEY___DATA__;
79072805
LW
5587 if (strEQ(d,"__END__")) return KEY___END__;
5588 }
5589 break;
8990e307
LW
5590 case 'A':
5591 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
5592 break;
79072805 5593 case 'a':
463ee0b2
LW
5594 switch (len) {
5595 case 3:
a0d0e21e
LW
5596 if (strEQ(d,"and")) return -KEY_and;
5597 if (strEQ(d,"abs")) return -KEY_abs;
85e6fe83 5598 break;
463ee0b2 5599 case 5:
a0d0e21e
LW
5600 if (strEQ(d,"alarm")) return -KEY_alarm;
5601 if (strEQ(d,"atan2")) return -KEY_atan2;
463ee0b2
LW
5602 break;
5603 case 6:
a0d0e21e 5604 if (strEQ(d,"accept")) return -KEY_accept;
463ee0b2
LW
5605 break;
5606 }
79072805
LW
5607 break;
5608 case 'B':
5609 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
93a17b20 5610 break;
79072805 5611 case 'b':
a0d0e21e
LW
5612 if (strEQ(d,"bless")) return -KEY_bless;
5613 if (strEQ(d,"bind")) return -KEY_bind;
5614 if (strEQ(d,"binmode")) return -KEY_binmode;
5615 break;
5616 case 'C':
5617 if (strEQ(d,"CORE")) return -KEY_CORE;
7d30b5c4 5618 if (strEQ(d,"CHECK")) return KEY_CHECK;
79072805
LW
5619 break;
5620 case 'c':
5621 switch (len) {
5622 case 3:
a0d0e21e
LW
5623 if (strEQ(d,"cmp")) return -KEY_cmp;
5624 if (strEQ(d,"chr")) return -KEY_chr;
5625 if (strEQ(d,"cos")) return -KEY_cos;
79072805
LW
5626 break;
5627 case 4:
77bc9082 5628 if (strEQ(d,"chop")) return -KEY_chop;
79072805
LW
5629 break;
5630 case 5:
a0d0e21e
LW
5631 if (strEQ(d,"close")) return -KEY_close;
5632 if (strEQ(d,"chdir")) return -KEY_chdir;
77bc9082 5633 if (strEQ(d,"chomp")) return -KEY_chomp;
a0d0e21e
LW
5634 if (strEQ(d,"chmod")) return -KEY_chmod;
5635 if (strEQ(d,"chown")) return -KEY_chown;
5636 if (strEQ(d,"crypt")) return -KEY_crypt;
79072805
LW
5637 break;
5638 case 6:
a0d0e21e
LW
5639 if (strEQ(d,"chroot")) return -KEY_chroot;
5640 if (strEQ(d,"caller")) return -KEY_caller;
79072805
LW
5641 break;
5642 case 7:
a0d0e21e 5643 if (strEQ(d,"connect")) return -KEY_connect;
79072805
LW
5644 break;
5645 case 8:
a0d0e21e
LW
5646 if (strEQ(d,"closedir")) return -KEY_closedir;
5647 if (strEQ(d,"continue")) return -KEY_continue;
79072805
LW
5648 break;
5649 }
5650 break;
ed6116ce
LW
5651 case 'D':
5652 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
5653 break;
79072805
LW
5654 case 'd':
5655 switch (len) {
5656 case 2:
5657 if (strEQ(d,"do")) return KEY_do;
5658 break;
5659 case 3:
a0d0e21e 5660 if (strEQ(d,"die")) return -KEY_die;
79072805
LW
5661 break;
5662 case 4:
a0d0e21e 5663 if (strEQ(d,"dump")) return -KEY_dump;
79072805
LW
5664 break;
5665 case 6:
5666 if (strEQ(d,"delete")) return KEY_delete;
5667 break;
5668 case 7:
5669 if (strEQ(d,"defined")) return KEY_defined;
a0d0e21e 5670 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
79072805
LW
5671 break;
5672 case 8:
a0d0e21e 5673 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
79072805
LW
5674 break;
5675 }
5676 break;
5677 case 'E':
79072805
LW
5678 if (strEQ(d,"END")) return KEY_END;
5679 break;
5680 case 'e':
5681 switch (len) {
5682 case 2:
a0d0e21e 5683 if (strEQ(d,"eq")) return -KEY_eq;
79072805
LW
5684 break;
5685 case 3:
a0d0e21e 5686 if (strEQ(d,"eof")) return -KEY_eof;
c963b151 5687 if (strEQ(d,"err")) return -KEY_err;
a0d0e21e 5688 if (strEQ(d,"exp")) return -KEY_exp;
79072805
LW
5689 break;
5690 case 4:
5691 if (strEQ(d,"else")) return KEY_else;
a0d0e21e 5692 if (strEQ(d,"exit")) return -KEY_exit;
79072805 5693 if (strEQ(d,"eval")) return KEY_eval;
a0d0e21e 5694 if (strEQ(d,"exec")) return -KEY_exec;
3a6a8333 5695 if (strEQ(d,"each")) return -KEY_each;
79072805
LW
5696 break;
5697 case 5:
5698 if (strEQ(d,"elsif")) return KEY_elsif;
5699 break;
a0d0e21e
LW
5700 case 6:
5701 if (strEQ(d,"exists")) return KEY_exists;
56da5a46
RGS
5702 if (strEQ(d,"elseif") && ckWARN_d(WARN_SYNTAX))
5703 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5704 "elseif should be elsif");
a0d0e21e 5705 break;
79072805 5706 case 8:
a0d0e21e
LW
5707 if (strEQ(d,"endgrent")) return -KEY_endgrent;
5708 if (strEQ(d,"endpwent")) return -KEY_endpwent;
79072805
LW
5709 break;
5710 case 9:
a0d0e21e 5711 if (strEQ(d,"endnetent")) return -KEY_endnetent;
79072805
LW
5712 break;
5713 case 10:
a0d0e21e
LW
5714 if (strEQ(d,"endhostent")) return -KEY_endhostent;
5715 if (strEQ(d,"endservent")) return -KEY_endservent;
79072805
LW
5716 break;
5717 case 11:
a0d0e21e 5718 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
79072805 5719 break;
a687059c 5720 }
a687059c 5721 break;
79072805
LW
5722 case 'f':
5723 switch (len) {
5724 case 3:
5725 if (strEQ(d,"for")) return KEY_for;
5726 break;
5727 case 4:
a0d0e21e 5728 if (strEQ(d,"fork")) return -KEY_fork;
79072805
LW
5729 break;
5730 case 5:
a0d0e21e
LW
5731 if (strEQ(d,"fcntl")) return -KEY_fcntl;
5732 if (strEQ(d,"flock")) return -KEY_flock;
79072805
LW
5733 break;
5734 case 6:
5735 if (strEQ(d,"format")) return KEY_format;
a0d0e21e 5736 if (strEQ(d,"fileno")) return -KEY_fileno;
79072805
LW
5737 break;
5738 case 7:
5739 if (strEQ(d,"foreach")) return KEY_foreach;
5740 break;
5741 case 8:
a0d0e21e 5742 if (strEQ(d,"formline")) return -KEY_formline;
79072805 5743 break;
378cc40b 5744 }
a687059c 5745 break;
79072805 5746 case 'g':
a687059c
LW
5747 if (strnEQ(d,"get",3)) {
5748 d += 3;
5749 if (*d == 'p') {
79072805
LW
5750 switch (len) {
5751 case 7:
a0d0e21e
LW
5752 if (strEQ(d,"ppid")) return -KEY_getppid;
5753 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
79072805
LW
5754 break;
5755 case 8:
a0d0e21e
LW
5756 if (strEQ(d,"pwent")) return -KEY_getpwent;
5757 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
5758 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
79072805
LW
5759 break;
5760 case 11:
a0d0e21e
LW
5761 if (strEQ(d,"peername")) return -KEY_getpeername;
5762 if (strEQ(d,"protoent")) return -KEY_getprotoent;
5763 if (strEQ(d,"priority")) return -KEY_getpriority;
79072805
LW
5764 break;
5765 case 14:
a0d0e21e 5766 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
79072805
LW
5767 break;
5768 case 16:
a0d0e21e 5769 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
79072805
LW
5770 break;
5771 }
a687059c
LW
5772 }
5773 else if (*d == 'h') {
a0d0e21e
LW
5774 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
5775 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
5776 if (strEQ(d,"hostent")) return -KEY_gethostent;
a687059c
LW
5777 }
5778 else if (*d == 'n') {
a0d0e21e
LW
5779 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
5780 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
5781 if (strEQ(d,"netent")) return -KEY_getnetent;
a687059c
LW
5782 }
5783 else if (*d == 's') {
a0d0e21e
LW
5784 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
5785 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
5786 if (strEQ(d,"servent")) return -KEY_getservent;
5787 if (strEQ(d,"sockname")) return -KEY_getsockname;
5788 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
a687059c
LW
5789 }
5790 else if (*d == 'g') {
a0d0e21e
LW
5791 if (strEQ(d,"grent")) return -KEY_getgrent;
5792 if (strEQ(d,"grnam")) return -KEY_getgrnam;
5793 if (strEQ(d,"grgid")) return -KEY_getgrgid;
a687059c
LW
5794 }
5795 else if (*d == 'l') {
a0d0e21e 5796 if (strEQ(d,"login")) return -KEY_getlogin;
a687059c 5797 }
770526c1 5798 else if (*d == 'c' && d[1] == '\0') return -KEY_getc;
79072805 5799 break;
a687059c 5800 }
79072805
LW
5801 switch (len) {
5802 case 2:
a0d0e21e
LW
5803 if (strEQ(d,"gt")) return -KEY_gt;
5804 if (strEQ(d,"ge")) return -KEY_ge;
79072805
LW
5805 break;
5806 case 4:
5807 if (strEQ(d,"grep")) return KEY_grep;
5808 if (strEQ(d,"goto")) return KEY_goto;
fb73857a 5809 if (strEQ(d,"glob")) return KEY_glob;
79072805
LW
5810 break;
5811 case 6:
a0d0e21e 5812 if (strEQ(d,"gmtime")) return -KEY_gmtime;
79072805 5813 break;
378cc40b 5814 }
a687059c 5815 break;
79072805 5816 case 'h':
a0d0e21e 5817 if (strEQ(d,"hex")) return -KEY_hex;
a687059c 5818 break;
7d07dbc2
MB
5819 case 'I':
5820 if (strEQ(d,"INIT")) return KEY_INIT;
5821 break;
79072805
LW
5822 case 'i':
5823 switch (len) {
5824 case 2:
5825 if (strEQ(d,"if")) return KEY_if;
5826 break;
5827 case 3:
a0d0e21e 5828 if (strEQ(d,"int")) return -KEY_int;
79072805
LW
5829 break;
5830 case 5:
a0d0e21e
LW
5831 if (strEQ(d,"index")) return -KEY_index;
5832 if (strEQ(d,"ioctl")) return -KEY_ioctl;
79072805
LW
5833 break;
5834 }
a687059c 5835 break;
79072805 5836 case 'j':
a0d0e21e 5837 if (strEQ(d,"join")) return -KEY_join;
a687059c 5838 break;
79072805
LW
5839 case 'k':
5840 if (len == 4) {
3a6a8333 5841 if (strEQ(d,"keys")) return -KEY_keys;
a0d0e21e 5842 if (strEQ(d,"kill")) return -KEY_kill;
663a0e37 5843 }
79072805 5844 break;
79072805
LW
5845 case 'l':
5846 switch (len) {
5847 case 2:
a0d0e21e
LW
5848 if (strEQ(d,"lt")) return -KEY_lt;
5849 if (strEQ(d,"le")) return -KEY_le;
5850 if (strEQ(d,"lc")) return -KEY_lc;
79072805
LW
5851 break;
5852 case 3:
a0d0e21e 5853 if (strEQ(d,"log")) return -KEY_log;
79072805
LW
5854 break;
5855 case 4:
5856 if (strEQ(d,"last")) return KEY_last;
a0d0e21e 5857 if (strEQ(d,"link")) return -KEY_link;
c0329465 5858 if (strEQ(d,"lock")) return -KEY_lock;
395c3793 5859 break;
79072805
LW
5860 case 5:
5861 if (strEQ(d,"local")) return KEY_local;
a0d0e21e 5862 if (strEQ(d,"lstat")) return -KEY_lstat;
79072805
LW
5863 break;
5864 case 6:
a0d0e21e
LW
5865 if (strEQ(d,"length")) return -KEY_length;
5866 if (strEQ(d,"listen")) return -KEY_listen;
79072805
LW
5867 break;
5868 case 7:
a0d0e21e 5869 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
79072805
LW
5870 break;
5871 case 9:
a0d0e21e 5872 if (strEQ(d,"localtime")) return -KEY_localtime;
395c3793
LW
5873 break;
5874 }
a687059c 5875 break;
79072805
LW
5876 case 'm':
5877 switch (len) {
5878 case 1: return KEY_m;
93a17b20
LW
5879 case 2:
5880 if (strEQ(d,"my")) return KEY_my;
5881 break;
a0d0e21e
LW
5882 case 3:
5883 if (strEQ(d,"map")) return KEY_map;
5884 break;
79072805 5885 case 5:
a0d0e21e 5886 if (strEQ(d,"mkdir")) return -KEY_mkdir;
79072805
LW
5887 break;
5888 case 6:
a0d0e21e
LW
5889 if (strEQ(d,"msgctl")) return -KEY_msgctl;
5890 if (strEQ(d,"msgget")) return -KEY_msgget;
5891 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
5892 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
79072805
LW
5893 break;
5894 }
a687059c 5895 break;
79072805
LW
5896 case 'n':
5897 if (strEQ(d,"next")) return KEY_next;
a0d0e21e
LW
5898 if (strEQ(d,"ne")) return -KEY_ne;
5899 if (strEQ(d,"not")) return -KEY_not;
5900 if (strEQ(d,"no")) return KEY_no;
a687059c 5901 break;
79072805
LW
5902 case 'o':
5903 switch (len) {
463ee0b2 5904 case 2:
a0d0e21e 5905 if (strEQ(d,"or")) return -KEY_or;
463ee0b2 5906 break;
79072805 5907 case 3:
a0d0e21e
LW
5908 if (strEQ(d,"ord")) return -KEY_ord;
5909 if (strEQ(d,"oct")) return -KEY_oct;
77ca0c92 5910 if (strEQ(d,"our")) return KEY_our;
79072805
LW
5911 break;
5912 case 4:
a0d0e21e 5913 if (strEQ(d,"open")) return -KEY_open;
79072805
LW
5914 break;
5915 case 7:
a0d0e21e 5916 if (strEQ(d,"opendir")) return -KEY_opendir;
79072805 5917 break;
fe14fcc3 5918 }
a687059c 5919 break;
79072805
LW
5920 case 'p':
5921 switch (len) {
5922 case 3:
4e553d73 5923 if (strEQ(d,"pop")) return -KEY_pop;
a0d0e21e 5924 if (strEQ(d,"pos")) return KEY_pos;
79072805
LW
5925 break;
5926 case 4:
3a6a8333 5927 if (strEQ(d,"push")) return -KEY_push;
a0d0e21e
LW
5928 if (strEQ(d,"pack")) return -KEY_pack;
5929 if (strEQ(d,"pipe")) return -KEY_pipe;
79072805
LW
5930 break;
5931 case 5:
5932 if (strEQ(d,"print")) return KEY_print;
5933 break;
5934 case 6:
5935 if (strEQ(d,"printf")) return KEY_printf;
5936 break;
5937 case 7:
5938 if (strEQ(d,"package")) return KEY_package;
5939 break;
c07a80fd 5940 case 9:
5941 if (strEQ(d,"prototype")) return KEY_prototype;
663a0e37 5942 }
79072805
LW
5943 break;
5944 case 'q':
770526c1
NC
5945 if (len == 1) {
5946 return KEY_q;
5947 }
5948 else if (len == 2) {
5949 switch (d[1]) {
5950 case 'r': return KEY_qr;
5951 case 'q': return KEY_qq;
5952 case 'w': return KEY_qw;
5953 case 'x': return KEY_qx;
5954 };
663a0e37 5955 }
a0d0e21e 5956 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
79072805
LW
5957 break;
5958 case 'r':
5959 switch (len) {
5960 case 3:
a0d0e21e 5961 if (strEQ(d,"ref")) return -KEY_ref;
79072805
LW
5962 break;
5963 case 4:
a0d0e21e
LW
5964 if (strEQ(d,"read")) return -KEY_read;
5965 if (strEQ(d,"rand")) return -KEY_rand;
5966 if (strEQ(d,"recv")) return -KEY_recv;
79072805
LW
5967 if (strEQ(d,"redo")) return KEY_redo;
5968 break;
5969 case 5:
a0d0e21e
LW
5970 if (strEQ(d,"rmdir")) return -KEY_rmdir;
5971 if (strEQ(d,"reset")) return -KEY_reset;
79072805
LW
5972 break;
5973 case 6:
5974 if (strEQ(d,"return")) return KEY_return;
a0d0e21e
LW
5975 if (strEQ(d,"rename")) return -KEY_rename;
5976 if (strEQ(d,"rindex")) return -KEY_rindex;
79072805
LW
5977 break;
5978 case 7:
ec4ab249 5979 if (strEQ(d,"require")) return KEY_require;
a0d0e21e
LW
5980 if (strEQ(d,"reverse")) return -KEY_reverse;
5981 if (strEQ(d,"readdir")) return -KEY_readdir;
79072805
LW
5982 break;
5983 case 8:
a0d0e21e
LW
5984 if (strEQ(d,"readlink")) return -KEY_readlink;
5985 if (strEQ(d,"readline")) return -KEY_readline;
5986 if (strEQ(d,"readpipe")) return -KEY_readpipe;
79072805
LW
5987 break;
5988 case 9:
a0d0e21e 5989 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
79072805 5990 break;
a687059c 5991 }
79072805
LW
5992 break;
5993 case 's':
a687059c 5994 switch (d[1]) {
79072805 5995 case 0: return KEY_s;
a687059c 5996 case 'c':
79072805 5997 if (strEQ(d,"scalar")) return KEY_scalar;
a687059c
LW
5998 break;
5999 case 'e':
79072805
LW
6000 switch (len) {
6001 case 4:
a0d0e21e
LW
6002 if (strEQ(d,"seek")) return -KEY_seek;
6003 if (strEQ(d,"send")) return -KEY_send;
79072805
LW
6004 break;
6005 case 5:
a0d0e21e 6006 if (strEQ(d,"semop")) return -KEY_semop;
79072805
LW
6007 break;
6008 case 6:
a0d0e21e
LW
6009 if (strEQ(d,"select")) return -KEY_select;
6010 if (strEQ(d,"semctl")) return -KEY_semctl;
6011 if (strEQ(d,"semget")) return -KEY_semget;
79072805
LW
6012 break;
6013 case 7:
a0d0e21e
LW
6014 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
6015 if (strEQ(d,"seekdir")) return -KEY_seekdir;
79072805
LW
6016 break;
6017 case 8:
a0d0e21e
LW
6018 if (strEQ(d,"setpwent")) return -KEY_setpwent;
6019 if (strEQ(d,"setgrent")) return -KEY_setgrent;
79072805
LW
6020 break;
6021 case 9:
a0d0e21e 6022 if (strEQ(d,"setnetent")) return -KEY_setnetent;
79072805
LW
6023 break;
6024 case 10:
a0d0e21e
LW
6025 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
6026 if (strEQ(d,"sethostent")) return -KEY_sethostent;
6027 if (strEQ(d,"setservent")) return -KEY_setservent;
79072805
LW
6028 break;
6029 case 11:
a0d0e21e
LW
6030 if (strEQ(d,"setpriority")) return -KEY_setpriority;
6031 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
79072805
LW
6032 break;
6033 }
a687059c
LW
6034 break;
6035 case 'h':
79072805
LW
6036 switch (len) {
6037 case 5:
3a6a8333 6038 if (strEQ(d,"shift")) return -KEY_shift;
79072805
LW
6039 break;
6040 case 6:
a0d0e21e
LW
6041 if (strEQ(d,"shmctl")) return -KEY_shmctl;
6042 if (strEQ(d,"shmget")) return -KEY_shmget;
79072805
LW
6043 break;
6044 case 7:
a0d0e21e 6045 if (strEQ(d,"shmread")) return -KEY_shmread;
79072805
LW
6046 break;
6047 case 8:
a0d0e21e
LW
6048 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
6049 if (strEQ(d,"shutdown")) return -KEY_shutdown;
79072805
LW
6050 break;
6051 }
a687059c
LW
6052 break;
6053 case 'i':
a0d0e21e 6054 if (strEQ(d,"sin")) return -KEY_sin;
a687059c
LW
6055 break;
6056 case 'l':
a0d0e21e 6057 if (strEQ(d,"sleep")) return -KEY_sleep;
a687059c
LW
6058 break;
6059 case 'o':
79072805 6060 if (strEQ(d,"sort")) return KEY_sort;
a0d0e21e
LW
6061 if (strEQ(d,"socket")) return -KEY_socket;
6062 if (strEQ(d,"socketpair")) return -KEY_socketpair;
a687059c
LW
6063 break;
6064 case 'p':
79072805 6065 if (strEQ(d,"split")) return KEY_split;
a0d0e21e 6066 if (strEQ(d,"sprintf")) return -KEY_sprintf;
3a6a8333 6067 if (strEQ(d,"splice")) return -KEY_splice;
a687059c
LW
6068 break;
6069 case 'q':
a0d0e21e 6070 if (strEQ(d,"sqrt")) return -KEY_sqrt;
a687059c
LW
6071 break;
6072 case 'r':
a0d0e21e 6073 if (strEQ(d,"srand")) return -KEY_srand;
a687059c
LW
6074 break;
6075 case 't':
a0d0e21e 6076 if (strEQ(d,"stat")) return -KEY_stat;
79072805 6077 if (strEQ(d,"study")) return KEY_study;
a687059c
LW
6078 break;
6079 case 'u':
a0d0e21e 6080 if (strEQ(d,"substr")) return -KEY_substr;
79072805 6081 if (strEQ(d,"sub")) return KEY_sub;
a687059c
LW
6082 break;
6083 case 'y':
79072805
LW
6084 switch (len) {
6085 case 6:
a0d0e21e 6086 if (strEQ(d,"system")) return -KEY_system;
79072805
LW
6087 break;
6088 case 7:
a0d0e21e
LW
6089 if (strEQ(d,"symlink")) return -KEY_symlink;
6090 if (strEQ(d,"syscall")) return -KEY_syscall;
137443ea 6091 if (strEQ(d,"sysopen")) return -KEY_sysopen;
6092 if (strEQ(d,"sysread")) return -KEY_sysread;
6093 if (strEQ(d,"sysseek")) return -KEY_sysseek;
79072805
LW
6094 break;
6095 case 8:
a0d0e21e 6096 if (strEQ(d,"syswrite")) return -KEY_syswrite;
79072805 6097 break;
a687059c 6098 }
a687059c
LW
6099 break;
6100 }
6101 break;
79072805
LW
6102 case 't':
6103 switch (len) {
6104 case 2:
6105 if (strEQ(d,"tr")) return KEY_tr;
6106 break;
463ee0b2
LW
6107 case 3:
6108 if (strEQ(d,"tie")) return KEY_tie;
6109 break;
79072805 6110 case 4:
a0d0e21e 6111 if (strEQ(d,"tell")) return -KEY_tell;
c07a80fd 6112 if (strEQ(d,"tied")) return KEY_tied;
a0d0e21e 6113 if (strEQ(d,"time")) return -KEY_time;
79072805
LW
6114 break;
6115 case 5:
a0d0e21e 6116 if (strEQ(d,"times")) return -KEY_times;
79072805
LW
6117 break;
6118 case 7:
a0d0e21e 6119 if (strEQ(d,"telldir")) return -KEY_telldir;
79072805
LW
6120 break;
6121 case 8:
a0d0e21e 6122 if (strEQ(d,"truncate")) return -KEY_truncate;
79072805 6123 break;
378cc40b 6124 }
a687059c 6125 break;
79072805
LW
6126 case 'u':
6127 switch (len) {
6128 case 2:
a0d0e21e
LW
6129 if (strEQ(d,"uc")) return -KEY_uc;
6130 break;
6131 case 3:
6132 if (strEQ(d,"use")) return KEY_use;
79072805
LW
6133 break;
6134 case 5:
6135 if (strEQ(d,"undef")) return KEY_undef;
6136 if (strEQ(d,"until")) return KEY_until;
463ee0b2 6137 if (strEQ(d,"untie")) return KEY_untie;
a0d0e21e
LW
6138 if (strEQ(d,"utime")) return -KEY_utime;
6139 if (strEQ(d,"umask")) return -KEY_umask;
79072805
LW
6140 break;
6141 case 6:
6142 if (strEQ(d,"unless")) return KEY_unless;
a0d0e21e
LW
6143 if (strEQ(d,"unpack")) return -KEY_unpack;
6144 if (strEQ(d,"unlink")) return -KEY_unlink;
79072805
LW
6145 break;
6146 case 7:
3a6a8333 6147 if (strEQ(d,"unshift")) return -KEY_unshift;
a0d0e21e 6148 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
79072805 6149 break;
a687059c
LW
6150 }
6151 break;
79072805 6152 case 'v':
a0d0e21e
LW
6153 if (strEQ(d,"values")) return -KEY_values;
6154 if (strEQ(d,"vec")) return -KEY_vec;
a687059c 6155 break;
79072805
LW
6156 case 'w':
6157 switch (len) {
6158 case 4:
a0d0e21e
LW
6159 if (strEQ(d,"warn")) return -KEY_warn;
6160 if (strEQ(d,"wait")) return -KEY_wait;
79072805
LW
6161 break;
6162 case 5:
6163 if (strEQ(d,"while")) return KEY_while;
a0d0e21e 6164 if (strEQ(d,"write")) return -KEY_write;
79072805
LW
6165 break;
6166 case 7:
a0d0e21e 6167 if (strEQ(d,"waitpid")) return -KEY_waitpid;
79072805
LW
6168 break;
6169 case 9:
a0d0e21e 6170 if (strEQ(d,"wantarray")) return -KEY_wantarray;
79072805 6171 break;
2f3197b3 6172 }
a687059c 6173 break;
79072805 6174 case 'x':
a0d0e21e
LW
6175 if (len == 1) return -KEY_x;
6176 if (strEQ(d,"xor")) return -KEY_xor;
a687059c 6177 break;
79072805
LW
6178 case 'y':
6179 if (len == 1) return KEY_y;
6180 break;
6181 case 'z':
a687059c
LW
6182 break;
6183 }
79072805 6184 return 0;
a687059c
LW
6185}
6186
76e3520e 6187STATIC void
cea2e8a9 6188S_checkcomma(pTHX_ register char *s, char *name, char *what)
a687059c 6189{
2f3197b3
LW
6190 char *w;
6191
d008e5eb 6192 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
6193 if (ckWARN(WARN_SYNTAX)) {
6194 int level = 1;
6195 for (w = s+2; *w && level; w++) {
6196 if (*w == '(')
6197 ++level;
6198 else if (*w == ')')
6199 --level;
6200 }
6201 if (*w)
6202 for (; *w && isSPACE(*w); w++) ;
6203 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
9014280d 6204 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 6205 "%s (...) interpreted as function",name);
d008e5eb 6206 }
2f3197b3 6207 }
3280af22 6208 while (s < PL_bufend && isSPACE(*s))
2f3197b3 6209 s++;
a687059c
LW
6210 if (*s == '(')
6211 s++;
3280af22 6212 while (s < PL_bufend && isSPACE(*s))
a687059c 6213 s++;
7e2040f0 6214 if (isIDFIRST_lazy_if(s,UTF)) {
2f3197b3 6215 w = s++;
7e2040f0 6216 while (isALNUM_lazy_if(s,UTF))
a687059c 6217 s++;
3280af22 6218 while (s < PL_bufend && isSPACE(*s))
a687059c 6219 s++;
e929a76b 6220 if (*s == ',') {
463ee0b2 6221 int kw;
e929a76b 6222 *s = '\0';
864dbfa3 6223 kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
e929a76b 6224 *s = ',';
463ee0b2 6225 if (kw)
e929a76b 6226 return;
cea2e8a9 6227 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
6228 }
6229 }
6230}
6231
423cee85
JH
6232/* Either returns sv, or mortalizes sv and returns a new SV*.
6233 Best used as sv=new_constant(..., sv, ...).
6234 If s, pv are NULL, calls subroutine with one argument,
6235 and type is used with error messages only. */
6236
b3ac6de7 6237STATIC SV *
dff6d3cd 6238S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9b0e499b 6239 const char *type)
b3ac6de7 6240{
b3ac6de7 6241 dSP;
3280af22 6242 HV *table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 6243 SV *res;
b3ac6de7
IZ
6244 SV **cvp;
6245 SV *cv, *typesv;
f0af216f 6246 const char *why1, *why2, *why3;
4e553d73 6247
f0af216f 6248 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
6249 SV *msg;
6250
f0af216f 6251 why2 = strEQ(key,"charnames")
41ab332f 6252 ? "(possibly a missing \"use charnames ...\")"
f0af216f 6253 : "";
4e553d73 6254 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
6255 (type ? type: "undef"), why2);
6256
6257 /* This is convoluted and evil ("goto considered harmful")
6258 * but I do not understand the intricacies of all the different
6259 * failure modes of %^H in here. The goal here is to make
6260 * the most probable error message user-friendly. --jhi */
6261
6262 goto msgdone;
6263
423cee85 6264 report:
4e553d73 6265 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 6266 (type ? type: "undef"), why1, why2, why3);
41ab332f 6267 msgdone:
423cee85
JH
6268 yyerror(SvPVX(msg));
6269 SvREFCNT_dec(msg);
6270 return sv;
6271 }
b3ac6de7
IZ
6272 cvp = hv_fetch(table, key, strlen(key), FALSE);
6273 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
6274 why1 = "$^H{";
6275 why2 = key;
f0af216f 6276 why3 = "} is not defined";
423cee85 6277 goto report;
b3ac6de7
IZ
6278 }
6279 sv_2mortal(sv); /* Parent created it permanently */
6280 cv = *cvp;
423cee85
JH
6281 if (!pv && s)
6282 pv = sv_2mortal(newSVpvn(s, len));
6283 if (type && pv)
6284 typesv = sv_2mortal(newSVpv(type, 0));
b3ac6de7 6285 else
423cee85 6286 typesv = &PL_sv_undef;
4e553d73 6287
e788e7d3 6288 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
6289 ENTER ;
6290 SAVETMPS;
4e553d73 6291
423cee85 6292 PUSHMARK(SP) ;
a5845cb7 6293 EXTEND(sp, 3);
423cee85
JH
6294 if (pv)
6295 PUSHs(pv);
b3ac6de7 6296 PUSHs(sv);
423cee85
JH
6297 if (pv)
6298 PUSHs(typesv);
b3ac6de7 6299 PUTBACK;
423cee85 6300 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 6301
423cee85 6302 SPAGAIN ;
4e553d73 6303
423cee85 6304 /* Check the eval first */
9b0e499b 6305 if (!PL_in_eval && SvTRUE(ERRSV)) {
423cee85
JH
6306 STRLEN n_a;
6307 sv_catpv(ERRSV, "Propagated");
6308 yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
e1f15930 6309 (void)POPs;
423cee85
JH
6310 res = SvREFCNT_inc(sv);
6311 }
6312 else {
6313 res = POPs;
e1f15930 6314 (void)SvREFCNT_inc(res);
423cee85 6315 }
4e553d73 6316
423cee85
JH
6317 PUTBACK ;
6318 FREETMPS ;
6319 LEAVE ;
b3ac6de7 6320 POPSTACK;
4e553d73 6321
b3ac6de7 6322 if (!SvOK(res)) {
423cee85
JH
6323 why1 = "Call to &{$^H{";
6324 why2 = key;
f0af216f 6325 why3 = "}} did not return a defined value";
423cee85
JH
6326 sv = res;
6327 goto report;
9b0e499b 6328 }
423cee85 6329
9b0e499b 6330 return res;
b3ac6de7 6331}
4e553d73 6332
76e3520e 6333STATIC char *
cea2e8a9 6334S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2
LW
6335{
6336 register char *d = dest;
8903cb82 6337 register char *e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 6338 for (;;) {
8903cb82 6339 if (d >= e)
cea2e8a9 6340 Perl_croak(aTHX_ ident_too_long);
834a4ddd 6341 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 6342 *d++ = *s++;
7e2040f0 6343 else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
6344 *d++ = ':';
6345 *d++ = ':';
6346 s++;
6347 }
c3e0f903 6348 else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
463ee0b2
LW
6349 *d++ = *s++;
6350 *d++ = *s++;
6351 }
fd400ab9 6352 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 6353 char *t = s + UTF8SKIP(s);
fd400ab9 6354 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
6355 t += UTF8SKIP(t);
6356 if (d + (t - s) > e)
cea2e8a9 6357 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
6358 Copy(s, d, t - s, char);
6359 d += t - s;
6360 s = t;
6361 }
463ee0b2
LW
6362 else {
6363 *d = '\0';
6364 *slp = d - dest;
6365 return s;
e929a76b 6366 }
378cc40b
LW
6367 }
6368}
6369
76e3520e 6370STATIC char *
cea2e8a9 6371S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b
LW
6372{
6373 register char *d;
8903cb82 6374 register char *e;
79072805 6375 char *bracket = 0;
748a9306 6376 char funny = *s++;
378cc40b 6377
a0d0e21e
LW
6378 if (isSPACE(*s))
6379 s = skipspace(s);
378cc40b 6380 d = dest;
8903cb82 6381 e = d + destlen - 3; /* two-character token, ending NUL */
de3bb511 6382 if (isDIGIT(*s)) {
8903cb82 6383 while (isDIGIT(*s)) {
6384 if (d >= e)
cea2e8a9 6385 Perl_croak(aTHX_ ident_too_long);
378cc40b 6386 *d++ = *s++;
8903cb82 6387 }
378cc40b
LW
6388 }
6389 else {
463ee0b2 6390 for (;;) {
8903cb82 6391 if (d >= e)
cea2e8a9 6392 Perl_croak(aTHX_ ident_too_long);
834a4ddd 6393 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 6394 *d++ = *s++;
7e2040f0 6395 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
6396 *d++ = ':';
6397 *d++ = ':';
6398 s++;
6399 }
a0d0e21e 6400 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
6401 *d++ = *s++;
6402 *d++ = *s++;
6403 }
fd400ab9 6404 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 6405 char *t = s + UTF8SKIP(s);
fd400ab9 6406 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
6407 t += UTF8SKIP(t);
6408 if (d + (t - s) > e)
cea2e8a9 6409 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
6410 Copy(s, d, t - s, char);
6411 d += t - s;
6412 s = t;
6413 }
463ee0b2
LW
6414 else
6415 break;
6416 }
378cc40b
LW
6417 }
6418 *d = '\0';
6419 d = dest;
79072805 6420 if (*d) {
3280af22
NIS
6421 if (PL_lex_state != LEX_NORMAL)
6422 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 6423 return s;
378cc40b 6424 }
748a9306 6425 if (*s == '$' && s[1] &&
3792a11b 6426 (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
5cd24f17 6427 {
4810e5ec 6428 return s;
5cd24f17 6429 }
79072805
LW
6430 if (*s == '{') {
6431 bracket = s;
6432 s++;
6433 }
6434 else if (ck_uni)
6435 check_uni();
93a17b20 6436 if (s < send)
79072805
LW
6437 *d = *s++;
6438 d[1] = '\0';
2b92dfce 6439 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 6440 *d = toCTRL(*s);
6441 s++;
de3bb511 6442 }
79072805 6443 if (bracket) {
748a9306 6444 if (isSPACE(s[-1])) {
fa83b5b6 6445 while (s < send) {
6446 char ch = *s++;
bf4acbe4 6447 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 6448 *d = ch;
6449 break;
6450 }
6451 }
748a9306 6452 }
7e2040f0 6453 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 6454 d++;
a0ed51b3
LW
6455 if (UTF) {
6456 e = s;
155aba94 6457 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
a0ed51b3 6458 e += UTF8SKIP(e);
fd400ab9 6459 while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
a0ed51b3
LW
6460 e += UTF8SKIP(e);
6461 }
6462 Copy(s, d, e - s, char);
6463 d += e - s;
6464 s = e;
6465 }
6466 else {
2b92dfce 6467 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 6468 *d++ = *s++;
2b92dfce 6469 if (d >= e)
cea2e8a9 6470 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 6471 }
79072805 6472 *d = '\0';
bf4acbe4 6473 while (s < send && SPACE_OR_TAB(*s)) s++;
ff68c719 6474 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
599cee73 6475 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
dff6d3cd 6476 const char *brack = *s == '[' ? "[...]" : "{...}";
9014280d 6477 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 6478 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
6479 funny, dest, brack, funny, dest, brack);
6480 }
79072805 6481 bracket++;
a0be28da 6482 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
6483 return s;
6484 }
4e553d73
NIS
6485 }
6486 /* Handle extended ${^Foo} variables
2b92dfce
GS
6487 * 1999-02-27 mjd-perl-patch@plover.com */
6488 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
6489 && isALNUM(*s))
6490 {
6491 d++;
6492 while (isALNUM(*s) && d < e) {
6493 *d++ = *s++;
6494 }
6495 if (d >= e)
cea2e8a9 6496 Perl_croak(aTHX_ ident_too_long);
2b92dfce 6497 *d = '\0';
79072805
LW
6498 }
6499 if (*s == '}') {
6500 s++;
7df0d042 6501 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 6502 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
6503 PL_expect = XREF;
6504 }
748a9306
LW
6505 if (funny == '#')
6506 funny = '@';
d008e5eb 6507 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 6508 if (ckWARN(WARN_AMBIGUOUS) &&
864dbfa3 6509 (keyword(dest, d - dest) || get_cv(dest, FALSE)))
d008e5eb 6510 {
9014280d 6511 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
6512 "Ambiguous use of %c{%s} resolved to %c%s",
6513 funny, dest, funny, dest);
6514 }
6515 }
79072805
LW
6516 }
6517 else {
6518 s = bracket; /* let the parser handle it */
93a17b20 6519 *dest = '\0';
79072805
LW
6520 }
6521 }
3280af22
NIS
6522 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
6523 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
6524 return s;
6525}
6526
cea2e8a9 6527void
2b36a5a0 6528Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 6529{
bbce6d69 6530 if (ch == 'i')
a0d0e21e 6531 *pmfl |= PMf_FOLD;
a0d0e21e
LW
6532 else if (ch == 'g')
6533 *pmfl |= PMf_GLOBAL;
c90c0ff4 6534 else if (ch == 'c')
6535 *pmfl |= PMf_CONTINUE;
a0d0e21e
LW
6536 else if (ch == 'o')
6537 *pmfl |= PMf_KEEP;
6538 else if (ch == 'm')
6539 *pmfl |= PMf_MULTILINE;
6540 else if (ch == 's')
6541 *pmfl |= PMf_SINGLELINE;
6542 else if (ch == 'x')
6543 *pmfl |= PMf_EXTENDED;
6544}
378cc40b 6545
76e3520e 6546STATIC char *
cea2e8a9 6547S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 6548{
79072805
LW
6549 PMOP *pm;
6550 char *s;
378cc40b 6551
09bef843 6552 s = scan_str(start,FALSE,FALSE);
37fd879b 6553 if (!s)
cea2e8a9 6554 Perl_croak(aTHX_ "Search pattern not terminated");
bbce6d69 6555
8782bef2 6556 pm = (PMOP*)newPMOP(type, 0);
3280af22 6557 if (PL_multi_open == '?')
79072805 6558 pm->op_pmflags |= PMf_ONCE;
8782bef2
GB
6559 if(type == OP_QR) {
6560 while (*s && strchr("iomsx", *s))
6561 pmflag(&pm->op_pmflags,*s++);
6562 }
6563 else {
6564 while (*s && strchr("iogcmsx", *s))
6565 pmflag(&pm->op_pmflags,*s++);
6566 }
4ac733c9
MJD
6567 /* issue a warning if /c is specified,but /g is not */
6568 if (ckWARN(WARN_REGEXP) &&
6569 (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
6570 {
6571 Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
6572 }
6573
4633a7c4 6574 pm->op_pmpermflags = pm->op_pmflags;
bbce6d69 6575
3280af22 6576 PL_lex_op = (OP*)pm;
79072805 6577 yylval.ival = OP_MATCH;
378cc40b
LW
6578 return s;
6579}
6580
76e3520e 6581STATIC char *
cea2e8a9 6582S_scan_subst(pTHX_ char *start)
79072805 6583{
a0d0e21e 6584 register char *s;
79072805 6585 register PMOP *pm;
4fdae800 6586 I32 first_start;
79072805
LW
6587 I32 es = 0;
6588
79072805
LW
6589 yylval.ival = OP_NULL;
6590
09bef843 6591 s = scan_str(start,FALSE,FALSE);
79072805 6592
37fd879b 6593 if (!s)
cea2e8a9 6594 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 6595
3280af22 6596 if (s[-1] == PL_multi_open)
79072805
LW
6597 s--;
6598
3280af22 6599 first_start = PL_multi_start;
09bef843 6600 s = scan_str(s,FALSE,FALSE);
79072805 6601 if (!s) {
37fd879b 6602 if (PL_lex_stuff) {
3280af22 6603 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
6604 PL_lex_stuff = Nullsv;
6605 }
cea2e8a9 6606 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 6607 }
3280af22 6608 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 6609
79072805 6610 pm = (PMOP*)newPMOP(OP_SUBST, 0);
48c036b1 6611 while (*s) {
a687059c
LW
6612 if (*s == 'e') {
6613 s++;
2f3197b3 6614 es++;
a687059c 6615 }
b3eb6a9b 6616 else if (strchr("iogcmsx", *s))
a0d0e21e 6617 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
6618 else
6619 break;
378cc40b 6620 }
79072805 6621
64e578a2
MJD
6622 /* /c is not meaningful with s/// */
6623 if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
4ac733c9 6624 {
64e578a2 6625 Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
4ac733c9
MJD
6626 }
6627
79072805
LW
6628 if (es) {
6629 SV *repl;
0244c3a4
GS
6630 PL_sublex_info.super_bufptr = s;
6631 PL_sublex_info.super_bufend = PL_bufend;
6632 PL_multi_end = 0;
79072805 6633 pm->op_pmflags |= PMf_EVAL;
79cb57f6 6634 repl = newSVpvn("",0);
463ee0b2 6635 while (es-- > 0)
a0d0e21e 6636 sv_catpv(repl, es ? "eval " : "do ");
79072805 6637 sv_catpvn(repl, "{ ", 2);
3280af22 6638 sv_catsv(repl, PL_lex_repl);
79072805 6639 sv_catpvn(repl, " };", 2);
25da4f38 6640 SvEVALED_on(repl);
3280af22
NIS
6641 SvREFCNT_dec(PL_lex_repl);
6642 PL_lex_repl = repl;
378cc40b 6643 }
79072805 6644
4633a7c4 6645 pm->op_pmpermflags = pm->op_pmflags;
3280af22 6646 PL_lex_op = (OP*)pm;
79072805 6647 yylval.ival = OP_SUBST;
378cc40b
LW
6648 return s;
6649}
6650
76e3520e 6651STATIC char *
cea2e8a9 6652S_scan_trans(pTHX_ char *start)
378cc40b 6653{
a0d0e21e 6654 register char* s;
11343788 6655 OP *o;
79072805
LW
6656 short *tbl;
6657 I32 squash;
a0ed51b3 6658 I32 del;
79072805
LW
6659 I32 complement;
6660
6661 yylval.ival = OP_NULL;
6662
09bef843 6663 s = scan_str(start,FALSE,FALSE);
37fd879b 6664 if (!s)
cea2e8a9 6665 Perl_croak(aTHX_ "Transliteration pattern not terminated");
3280af22 6666 if (s[-1] == PL_multi_open)
2f3197b3
LW
6667 s--;
6668
09bef843 6669 s = scan_str(s,FALSE,FALSE);
79072805 6670 if (!s) {
37fd879b 6671 if (PL_lex_stuff) {
3280af22 6672 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
6673 PL_lex_stuff = Nullsv;
6674 }
cea2e8a9 6675 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 6676 }
79072805 6677
a0ed51b3 6678 complement = del = squash = 0;
7a1e2023
NC
6679 while (1) {
6680 switch (*s) {
6681 case 'c':
79072805 6682 complement = OPpTRANS_COMPLEMENT;
7a1e2023
NC
6683 break;
6684 case 'd':
a0ed51b3 6685 del = OPpTRANS_DELETE;
7a1e2023
NC
6686 break;
6687 case 's':
79072805 6688 squash = OPpTRANS_SQUASH;
7a1e2023
NC
6689 break;
6690 default:
6691 goto no_more;
6692 }
395c3793
LW
6693 s++;
6694 }
7a1e2023 6695 no_more:
8973db79
JH
6696
6697 New(803, tbl, complement&&!del?258:256, short);
6698 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
6699 o->op_private &= ~OPpTRANS_ALL;
6700 o->op_private |= del|squash|complement|
7948272d
NIS
6701 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
6702 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 6703
3280af22 6704 PL_lex_op = o;
79072805
LW
6705 yylval.ival = OP_TRANS;
6706 return s;
6707}
6708
76e3520e 6709STATIC char *
cea2e8a9 6710S_scan_heredoc(pTHX_ register char *s)
79072805
LW
6711{
6712 SV *herewas;
6713 I32 op_type = OP_SCALAR;
6714 I32 len;
6715 SV *tmpstr;
6716 char term;
6717 register char *d;
fc36a67e 6718 register char *e;
4633a7c4 6719 char *peek;
3280af22 6720 int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
79072805
LW
6721
6722 s += 2;
3280af22
NIS
6723 d = PL_tokenbuf;
6724 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 6725 if (!outer)
79072805 6726 *d++ = '\n';
bf4acbe4 6727 for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
3792a11b 6728 if (*peek == '`' || *peek == '\'' || *peek =='"') {
4633a7c4 6729 s = peek;
79072805 6730 term = *s++;
3280af22 6731 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 6732 d += len;
3280af22 6733 if (s < PL_bufend)
79072805 6734 s++;
79072805
LW
6735 }
6736 else {
6737 if (*s == '\\')
6738 s++, term = '\'';
6739 else
6740 term = '"';
7e2040f0 6741 if (!isALNUM_lazy_if(s,UTF))
12bcd1a6 6742 deprecate_old("bare << to mean <<\"\"");
7e2040f0 6743 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 6744 if (d < e)
6745 *d++ = *s;
6746 }
6747 }
3280af22 6748 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 6749 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
6750 *d++ = '\n';
6751 *d = '\0';
3280af22 6752 len = d - PL_tokenbuf;
6a27c188 6753#ifndef PERL_STRICT_CR
f63a84b2
LW
6754 d = strchr(s, '\r');
6755 if (d) {
6756 char *olds = s;
6757 s = d;
3280af22 6758 while (s < PL_bufend) {
f63a84b2
LW
6759 if (*s == '\r') {
6760 *d++ = '\n';
6761 if (*++s == '\n')
6762 s++;
6763 }
6764 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
6765 *d++ = *s++;
6766 s++;
6767 }
6768 else
6769 *d++ = *s++;
6770 }
6771 *d = '\0';
3280af22
NIS
6772 PL_bufend = d;
6773 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
f63a84b2
LW
6774 s = olds;
6775 }
6776#endif
79072805 6777 d = "\n";
3280af22 6778 if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
79cb57f6 6779 herewas = newSVpvn(s,PL_bufend-s);
79072805 6780 else
79cb57f6 6781 s--, herewas = newSVpvn(s,d-s);
79072805 6782 s += SvCUR(herewas);
748a9306 6783
8d6dde3e 6784 tmpstr = NEWSV(87,79);
748a9306
LW
6785 sv_upgrade(tmpstr, SVt_PVIV);
6786 if (term == '\'') {
79072805 6787 op_type = OP_CONST;
748a9306
LW
6788 SvIVX(tmpstr) = -1;
6789 }
6790 else if (term == '`') {
79072805 6791 op_type = OP_BACKTICK;
748a9306
LW
6792 SvIVX(tmpstr) = '\\';
6793 }
79072805
LW
6794
6795 CLINE;
57843af0 6796 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
6797 PL_multi_open = PL_multi_close = '<';
6798 term = *PL_tokenbuf;
0244c3a4
GS
6799 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6800 char *bufptr = PL_sublex_info.super_bufptr;
6801 char *bufend = PL_sublex_info.super_bufend;
6802 char *olds = s - SvCUR(herewas);
6803 s = strchr(bufptr, '\n');
6804 if (!s)
6805 s = bufend;
6806 d = s;
6807 while (s < bufend &&
6808 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6809 if (*s++ == '\n')
57843af0 6810 CopLINE_inc(PL_curcop);
0244c3a4
GS
6811 }
6812 if (s >= bufend) {
eb160463 6813 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
6814 missingterm(PL_tokenbuf);
6815 }
6816 sv_setpvn(herewas,bufptr,d-bufptr+1);
6817 sv_setpvn(tmpstr,d+1,s-d);
6818 s += len - 1;
6819 sv_catpvn(herewas,s,bufend-s);
689badd5 6820 Copy(SvPVX(herewas),bufptr,SvCUR(herewas) + 1,char);
0244c3a4
GS
6821
6822 s = olds;
6823 goto retval;
6824 }
6825 else if (!outer) {
79072805 6826 d = s;
3280af22
NIS
6827 while (s < PL_bufend &&
6828 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 6829 if (*s++ == '\n')
57843af0 6830 CopLINE_inc(PL_curcop);
79072805 6831 }
3280af22 6832 if (s >= PL_bufend) {
eb160463 6833 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 6834 missingterm(PL_tokenbuf);
79072805
LW
6835 }
6836 sv_setpvn(tmpstr,d+1,s-d);
6837 s += len - 1;
57843af0 6838 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 6839
3280af22
NIS
6840 sv_catpvn(herewas,s,PL_bufend-s);
6841 sv_setsv(PL_linestr,herewas);
6842 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6843 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 6844 PL_last_lop = PL_last_uni = Nullch;
79072805
LW
6845 }
6846 else
6847 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3280af22 6848 while (s >= PL_bufend) { /* multiple line string? */
fd2d0953 6849 if (!outer ||
3280af22 6850 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
eb160463 6851 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 6852 missingterm(PL_tokenbuf);
79072805 6853 }
57843af0 6854 CopLINE_inc(PL_curcop);
3280af22 6855 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 6856 PL_last_lop = PL_last_uni = Nullch;
6a27c188 6857#ifndef PERL_STRICT_CR
3280af22 6858 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
6859 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6860 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 6861 {
3280af22
NIS
6862 PL_bufend[-2] = '\n';
6863 PL_bufend--;
6864 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
f63a84b2 6865 }
3280af22
NIS
6866 else if (PL_bufend[-1] == '\r')
6867 PL_bufend[-1] = '\n';
f63a84b2 6868 }
3280af22
NIS
6869 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6870 PL_bufend[-1] = '\n';
f63a84b2 6871#endif
3280af22 6872 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
6873 SV *sv = NEWSV(88,0);
6874
93a17b20 6875 sv_upgrade(sv, SVt_PVMG);
3280af22 6876 sv_setsv(sv,PL_linestr);
0ac0412a
MJD
6877 (void)SvIOK_on(sv);
6878 SvIVX(sv) = 0;
57843af0 6879 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
79072805 6880 }
3280af22 6881 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
1de9afcd
RGS
6882 STRLEN off = PL_bufend - 1 - SvPVX(PL_linestr);
6883 *(SvPVX(PL_linestr) + off ) = ' ';
3280af22
NIS
6884 sv_catsv(PL_linestr,herewas);
6885 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1de9afcd 6886 s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
79072805
LW
6887 }
6888 else {
3280af22
NIS
6889 s = PL_bufend;
6890 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
6891 }
6892 }
79072805 6893 s++;
0244c3a4 6894retval:
57843af0 6895 PL_multi_end = CopLINE(PL_curcop);
79072805
LW
6896 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6897 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
463ee0b2 6898 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
79072805 6899 }
8990e307 6900 SvREFCNT_dec(herewas);
2f31ce75
JH
6901 if (!IN_BYTES) {
6902 if (UTF && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
6903 SvUTF8_on(tmpstr);
6904 else if (PL_encoding)
6905 sv_recode_to_utf8(tmpstr, PL_encoding);
6906 }
3280af22 6907 PL_lex_stuff = tmpstr;
79072805
LW
6908 yylval.ival = op_type;
6909 return s;
6910}
6911
02aa26ce
NT
6912/* scan_inputsymbol
6913 takes: current position in input buffer
6914 returns: new position in input buffer
6915 side-effects: yylval and lex_op are set.
6916
6917 This code handles:
6918
6919 <> read from ARGV
6920 <FH> read from filehandle
6921 <pkg::FH> read from package qualified filehandle
6922 <pkg'FH> read from package qualified filehandle
6923 <$fh> read from filehandle in $fh
6924 <*.h> filename glob
6925
6926*/
6927
76e3520e 6928STATIC char *
cea2e8a9 6929S_scan_inputsymbol(pTHX_ char *start)
79072805 6930{
02aa26ce 6931 register char *s = start; /* current position in buffer */
79072805 6932 register char *d;
fc36a67e 6933 register char *e;
1b420867 6934 char *end;
79072805
LW
6935 I32 len;
6936
3280af22
NIS
6937 d = PL_tokenbuf; /* start of temp holding space */
6938 e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
1b420867
GS
6939 end = strchr(s, '\n');
6940 if (!end)
6941 end = PL_bufend;
6942 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
6943
6944 /* die if we didn't have space for the contents of the <>,
1b420867 6945 or if it didn't end, or if we see a newline
02aa26ce
NT
6946 */
6947
3280af22 6948 if (len >= sizeof PL_tokenbuf)
cea2e8a9 6949 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 6950 if (s >= end)
cea2e8a9 6951 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 6952
fc36a67e 6953 s++;
02aa26ce
NT
6954
6955 /* check for <$fh>
6956 Remember, only scalar variables are interpreted as filehandles by
6957 this code. Anything more complex (e.g., <$fh{$num}>) will be
6958 treated as a glob() call.
6959 This code makes use of the fact that except for the $ at the front,
6960 a scalar variable and a filehandle look the same.
6961 */
4633a7c4 6962 if (*d == '$' && d[1]) d++;
02aa26ce
NT
6963
6964 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 6965 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 6966 d++;
02aa26ce
NT
6967
6968 /* If we've tried to read what we allow filehandles to look like, and
6969 there's still text left, then it must be a glob() and not a getline.
6970 Use scan_str to pull out the stuff between the <> and treat it
6971 as nothing more than a string.
6972 */
6973
3280af22 6974 if (d - PL_tokenbuf != len) {
79072805
LW
6975 yylval.ival = OP_GLOB;
6976 set_csh();
09bef843 6977 s = scan_str(start,FALSE,FALSE);
79072805 6978 if (!s)
cea2e8a9 6979 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
6980 return s;
6981 }
395c3793 6982 else {
9b3023bc
RGS
6983 bool readline_overriden = FALSE;
6984 GV *gv_readline = Nullgv;
6985 GV **gvp;
02aa26ce 6986 /* we're in a filehandle read situation */
3280af22 6987 d = PL_tokenbuf;
02aa26ce
NT
6988
6989 /* turn <> into <ARGV> */
79072805 6990 if (!len)
689badd5 6991 Copy("ARGV",d,5,char);
02aa26ce 6992
9b3023bc 6993 /* Check whether readline() is overriden */
ba979b31
NIS
6994 if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
6995 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 6996 ||
ba979b31 6997 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
9b3023bc 6998 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
ba979b31 6999 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
7000 readline_overriden = TRUE;
7001
02aa26ce
NT
7002 /* if <$fh>, create the ops to turn the variable into a
7003 filehandle
7004 */
79072805 7005 if (*d == '$') {
a0d0e21e 7006 I32 tmp;
02aa26ce
NT
7007
7008 /* try to find it in the pad for this block, otherwise find
7009 add symbol table ops
7010 */
11343788 7011 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
dd2155a4
DM
7012 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
7013 SV *sym = sv_2mortal(
7014 newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)),0));
f558d5af
JH
7015 sv_catpvn(sym, "::", 2);
7016 sv_catpv(sym, d+1);
7017 d = SvPVX(sym);
7018 goto intro_sym;
7019 }
7020 else {
7021 OP *o = newOP(OP_PADSV, 0);
7022 o->op_targ = tmp;
9b3023bc
RGS
7023 PL_lex_op = readline_overriden
7024 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7025 append_elem(OP_LIST, o,
7026 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
7027 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 7028 }
a0d0e21e
LW
7029 }
7030 else {
f558d5af
JH
7031 GV *gv;
7032 ++d;
7033intro_sym:
7034 gv = gv_fetchpv(d,
7035 (PL_in_eval
7036 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 7037 : GV_ADDMULTI),
f558d5af 7038 SVt_PV);
9b3023bc
RGS
7039 PL_lex_op = readline_overriden
7040 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7041 append_elem(OP_LIST,
7042 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
7043 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
7044 : (OP*)newUNOP(OP_READLINE, 0,
7045 newUNOP(OP_RV2SV, 0,
7046 newGVOP(OP_GV, 0, gv)));
a0d0e21e 7047 }
7c6fadd6
RGS
7048 if (!readline_overriden)
7049 PL_lex_op->op_flags |= OPf_SPECIAL;
f5284f61 7050 /* we created the ops in PL_lex_op, so make yylval.ival a null op */
79072805
LW
7051 yylval.ival = OP_NULL;
7052 }
02aa26ce
NT
7053
7054 /* If it's none of the above, it must be a literal filehandle
7055 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 7056 else {
85e6fe83 7057 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
9b3023bc
RGS
7058 PL_lex_op = readline_overriden
7059 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
7060 append_elem(OP_LIST,
7061 newGVOP(OP_GV, 0, gv),
7062 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
7063 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
79072805
LW
7064 yylval.ival = OP_NULL;
7065 }
7066 }
02aa26ce 7067
79072805
LW
7068 return s;
7069}
7070
02aa26ce
NT
7071
7072/* scan_str
7073 takes: start position in buffer
09bef843
SB
7074 keep_quoted preserve \ on the embedded delimiter(s)
7075 keep_delims preserve the delimiters around the string
02aa26ce
NT
7076 returns: position to continue reading from buffer
7077 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
7078 updates the read buffer.
7079
7080 This subroutine pulls a string out of the input. It is called for:
7081 q single quotes q(literal text)
7082 ' single quotes 'literal text'
7083 qq double quotes qq(interpolate $here please)
7084 " double quotes "interpolate $here please"
7085 qx backticks qx(/bin/ls -l)
7086 ` backticks `/bin/ls -l`
7087 qw quote words @EXPORT_OK = qw( func() $spam )
7088 m// regexp match m/this/
7089 s/// regexp substitute s/this/that/
7090 tr/// string transliterate tr/this/that/
7091 y/// string transliterate y/this/that/
7092 ($*@) sub prototypes sub foo ($)
09bef843 7093 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
7094 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
7095
7096 In most of these cases (all but <>, patterns and transliterate)
7097 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
7098 calls scan_str(). s/// makes yylex() call scan_subst() which calls
7099 scan_str(). tr/// and y/// make yylex() call scan_trans() which
7100 calls scan_str().
4e553d73 7101
02aa26ce
NT
7102 It skips whitespace before the string starts, and treats the first
7103 character as the delimiter. If the delimiter is one of ([{< then
7104 the corresponding "close" character )]}> is used as the closing
7105 delimiter. It allows quoting of delimiters, and if the string has
7106 balanced delimiters ([{<>}]) it allows nesting.
7107
37fd879b
HS
7108 On success, the SV with the resulting string is put into lex_stuff or,
7109 if that is already non-NULL, into lex_repl. The second case occurs only
7110 when parsing the RHS of the special constructs s/// and tr/// (y///).
7111 For convenience, the terminating delimiter character is stuffed into
7112 SvIVX of the SV.
02aa26ce
NT
7113*/
7114
76e3520e 7115STATIC char *
09bef843 7116S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 7117{
02aa26ce
NT
7118 SV *sv; /* scalar value: string */
7119 char *tmps; /* temp string, used for delimiter matching */
7120 register char *s = start; /* current position in the buffer */
7121 register char term; /* terminating character */
7122 register char *to; /* current position in the sv's data */
7123 I32 brackets = 1; /* bracket nesting level */
89491803 7124 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e
IH
7125 I32 termcode; /* terminating char. code */
7126 U8 termstr[UTF8_MAXLEN]; /* terminating string */
7127 STRLEN termlen; /* length of terminating string */
7128 char *last = NULL; /* last position for nesting bracket */
02aa26ce
NT
7129
7130 /* skip space before the delimiter */
fb73857a 7131 if (isSPACE(*s))
7132 s = skipspace(s);
02aa26ce
NT
7133
7134 /* mark where we are, in case we need to report errors */
79072805 7135 CLINE;
02aa26ce
NT
7136
7137 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 7138 term = *s;
220e2d4e
IH
7139 if (!UTF) {
7140 termcode = termstr[0] = term;
7141 termlen = 1;
7142 }
7143 else {
f3b9ce0f 7144 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
7145 Copy(s, termstr, termlen, U8);
7146 if (!UTF8_IS_INVARIANT(term))
7147 has_utf8 = TRUE;
7148 }
b1c7b182 7149
02aa26ce 7150 /* mark where we are */
57843af0 7151 PL_multi_start = CopLINE(PL_curcop);
3280af22 7152 PL_multi_open = term;
02aa26ce
NT
7153
7154 /* find corresponding closing delimiter */
93a17b20 7155 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
7156 termcode = termstr[0] = term = tmps[5];
7157
3280af22 7158 PL_multi_close = term;
79072805 7159
02aa26ce 7160 /* create a new SV to hold the contents. 87 is leak category, I'm
8d6dde3e
IZ
7161 assuming. 79 is the SV's initial length. What a random number. */
7162 sv = NEWSV(87,79);
ed6116ce 7163 sv_upgrade(sv, SVt_PVIV);
220e2d4e 7164 SvIVX(sv) = termcode;
a0d0e21e 7165 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
7166
7167 /* move past delimiter and try to read a complete string */
09bef843 7168 if (keep_delims)
220e2d4e
IH
7169 sv_catpvn(sv, s, termlen);
7170 s += termlen;
93a17b20 7171 for (;;) {
220e2d4e
IH
7172 if (PL_encoding && !UTF) {
7173 bool cont = TRUE;
7174
7175 while (cont) {
7176 int offset = s - SvPVX(PL_linestr);
7177 bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 7178 &offset, (char*)termstr, termlen);
220e2d4e
IH
7179 char *ns = SvPVX(PL_linestr) + offset;
7180 char *svlast = SvEND(sv) - 1;
7181
7182 for (; s < ns; s++) {
7183 if (*s == '\n' && !PL_rsfp)
7184 CopLINE_inc(PL_curcop);
7185 }
7186 if (!found)
7187 goto read_more_line;
7188 else {
7189 /* handle quoted delimiters */
52327caf 7190 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
220e2d4e
IH
7191 char *t;
7192 for (t = svlast-2; t >= SvPVX(sv) && *t == '\\';)
7193 t--;
7194 if ((svlast-1 - t) % 2) {
7195 if (!keep_quoted) {
7196 *(svlast-1) = term;
7197 *svlast = '\0';
7198 SvCUR_set(sv, SvCUR(sv) - 1);
7199 }
7200 continue;
7201 }
7202 }
7203 if (PL_multi_open == PL_multi_close) {
7204 cont = FALSE;
7205 }
7206 else {
7207 char *t, *w;
7208 if (!last)
7209 last = SvPVX(sv);
7210 for (w = t = last; t < svlast; w++, t++) {
7211 /* At here, all closes are "was quoted" one,
7212 so we don't check PL_multi_close. */
7213 if (*t == '\\') {
7214 if (!keep_quoted && *(t+1) == PL_multi_open)
7215 t++;
7216 else
7217 *w++ = *t++;
7218 }
7219 else if (*t == PL_multi_open)
7220 brackets++;
7221
7222 *w = *t;
7223 }
7224 if (w < t) {
7225 *w++ = term;
7226 *w = '\0';
7227 SvCUR_set(sv, w - SvPVX(sv));
7228 }
7229 last = w;
7230 if (--brackets <= 0)
7231 cont = FALSE;
7232 }
7233 }
7234 }
7235 if (!keep_delims) {
7236 SvCUR_set(sv, SvCUR(sv) - 1);
7237 *SvEND(sv) = '\0';
7238 }
7239 break;
7240 }
7241
02aa26ce 7242 /* extend sv if need be */
3280af22 7243 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 7244 /* set 'to' to the next character in the sv's string */
463ee0b2 7245 to = SvPVX(sv)+SvCUR(sv);
09bef843 7246
02aa26ce 7247 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
7248 if (PL_multi_open == PL_multi_close) {
7249 for (; s < PL_bufend; s++,to++) {
02aa26ce 7250 /* embedded newlines increment the current line number */
3280af22 7251 if (*s == '\n' && !PL_rsfp)
57843af0 7252 CopLINE_inc(PL_curcop);
02aa26ce 7253 /* handle quoted delimiters */
3280af22 7254 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 7255 if (!keep_quoted && s[1] == term)
a0d0e21e 7256 s++;
02aa26ce 7257 /* any other quotes are simply copied straight through */
a0d0e21e
LW
7258 else
7259 *to++ = *s++;
7260 }
02aa26ce
NT
7261 /* terminate when run out of buffer (the for() condition), or
7262 have found the terminator */
220e2d4e
IH
7263 else if (*s == term) {
7264 if (termlen == 1)
7265 break;
f3b9ce0f 7266 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
7267 break;
7268 }
63cd0674 7269 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 7270 has_utf8 = TRUE;
93a17b20
LW
7271 *to = *s;
7272 }
7273 }
02aa26ce
NT
7274
7275 /* if the terminator isn't the same as the start character (e.g.,
7276 matched brackets), we have to allow more in the quoting, and
7277 be prepared for nested brackets.
7278 */
93a17b20 7279 else {
02aa26ce 7280 /* read until we run out of string, or we find the terminator */
3280af22 7281 for (; s < PL_bufend; s++,to++) {
02aa26ce 7282 /* embedded newlines increment the line count */
3280af22 7283 if (*s == '\n' && !PL_rsfp)
57843af0 7284 CopLINE_inc(PL_curcop);
02aa26ce 7285 /* backslashes can escape the open or closing characters */
3280af22 7286 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
7287 if (!keep_quoted &&
7288 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
7289 s++;
7290 else
7291 *to++ = *s++;
7292 }
02aa26ce 7293 /* allow nested opens and closes */
3280af22 7294 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 7295 break;
3280af22 7296 else if (*s == PL_multi_open)
93a17b20 7297 brackets++;
63cd0674 7298 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 7299 has_utf8 = TRUE;
93a17b20
LW
7300 *to = *s;
7301 }
7302 }
02aa26ce 7303 /* terminate the copied string and update the sv's end-of-string */
93a17b20 7304 *to = '\0';
463ee0b2 7305 SvCUR_set(sv, to - SvPVX(sv));
93a17b20 7306
02aa26ce
NT
7307 /*
7308 * this next chunk reads more into the buffer if we're not done yet
7309 */
7310
b1c7b182
GS
7311 if (s < PL_bufend)
7312 break; /* handle case where we are done yet :-) */
79072805 7313
6a27c188 7314#ifndef PERL_STRICT_CR
f63a84b2 7315 if (to - SvPVX(sv) >= 2) {
c6f14548
GS
7316 if ((to[-2] == '\r' && to[-1] == '\n') ||
7317 (to[-2] == '\n' && to[-1] == '\r'))
7318 {
f63a84b2
LW
7319 to[-2] = '\n';
7320 to--;
7321 SvCUR_set(sv, to - SvPVX(sv));
7322 }
7323 else if (to[-1] == '\r')
7324 to[-1] = '\n';
7325 }
7326 else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
7327 to[-1] = '\n';
7328#endif
7329
220e2d4e 7330 read_more_line:
02aa26ce
NT
7331 /* if we're out of file, or a read fails, bail and reset the current
7332 line marker so we can report where the unterminated string began
7333 */
3280af22
NIS
7334 if (!PL_rsfp ||
7335 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 7336 sv_free(sv);
eb160463 7337 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
79072805
LW
7338 return Nullch;
7339 }
02aa26ce 7340 /* we read a line, so increment our line counter */
57843af0 7341 CopLINE_inc(PL_curcop);
a0ed51b3 7342
02aa26ce 7343 /* update debugger info */
3280af22 7344 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
7345 SV *sv = NEWSV(88,0);
7346
93a17b20 7347 sv_upgrade(sv, SVt_PVMG);
3280af22 7348 sv_setsv(sv,PL_linestr);
0ac0412a
MJD
7349 (void)SvIOK_on(sv);
7350 SvIVX(sv) = 0;
57843af0 7351 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
395c3793 7352 }
a0ed51b3 7353
3280af22
NIS
7354 /* having changed the buffer, we must update PL_bufend */
7355 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 7356 PL_last_lop = PL_last_uni = Nullch;
378cc40b 7357 }
4e553d73 7358
02aa26ce
NT
7359 /* at this point, we have successfully read the delimited string */
7360
220e2d4e
IH
7361 if (!PL_encoding || UTF) {
7362 if (keep_delims)
7363 sv_catpvn(sv, s, termlen);
7364 s += termlen;
7365 }
7366 if (has_utf8 || PL_encoding)
b1c7b182 7367 SvUTF8_on(sv);
d0063567 7368
57843af0 7369 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
7370
7371 /* if we allocated too much space, give some back */
93a17b20
LW
7372 if (SvCUR(sv) + 5 < SvLEN(sv)) {
7373 SvLEN_set(sv, SvCUR(sv) + 1);
463ee0b2 7374 Renew(SvPVX(sv), SvLEN(sv), char);
79072805 7375 }
02aa26ce
NT
7376
7377 /* decide whether this is the first or second quoted string we've read
7378 for this op
7379 */
4e553d73 7380
3280af22
NIS
7381 if (PL_lex_stuff)
7382 PL_lex_repl = sv;
79072805 7383 else
3280af22 7384 PL_lex_stuff = sv;
378cc40b
LW
7385 return s;
7386}
7387
02aa26ce
NT
7388/*
7389 scan_num
7390 takes: pointer to position in buffer
7391 returns: pointer to new position in buffer
7392 side-effects: builds ops for the constant in yylval.op
7393
7394 Read a number in any of the formats that Perl accepts:
7395
7fd134d9
JH
7396 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
7397 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
7398 0b[01](_?[01])*
7399 0[0-7](_?[0-7])*
7400 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 7401
3280af22 7402 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
7403 thing it reads.
7404
7405 If it reads a number without a decimal point or an exponent, it will
7406 try converting the number to an integer and see if it can do so
7407 without loss of precision.
7408*/
4e553d73 7409
378cc40b 7410char *
b73d6f50 7411Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
378cc40b 7412{
02aa26ce
NT
7413 register char *s = start; /* current position in buffer */
7414 register char *d; /* destination in temp buffer */
7415 register char *e; /* end of temp buffer */
86554af2 7416 NV nv; /* number read, as a double */
a7cb1f99 7417 SV *sv = Nullsv; /* place to put the converted number */
a86a20aa 7418 bool floatit; /* boolean: int or float? */
02aa26ce 7419 char *lastub = 0; /* position of last underbar */
fc36a67e 7420 static char number_too_long[] = "Number too long";
378cc40b 7421
02aa26ce
NT
7422 /* We use the first character to decide what type of number this is */
7423
378cc40b 7424 switch (*s) {
79072805 7425 default:
cea2e8a9 7426 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 7427
02aa26ce 7428 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 7429 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
7430 case '0':
7431 {
02aa26ce
NT
7432 /* variables:
7433 u holds the "number so far"
4f19785b
WSI
7434 shift the power of 2 of the base
7435 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
7436 overflowed was the number more than we can hold?
7437
7438 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
7439 we in octal/hex/binary?" indicator to disallow hex characters
7440 when in octal mode.
02aa26ce 7441 */
9e24b6e2
JH
7442 NV n = 0.0;
7443 UV u = 0;
79072805 7444 I32 shift;
9e24b6e2 7445 bool overflowed = FALSE;
61f33854 7446 bool just_zero = TRUE; /* just plain 0 or binary number? */
9e24b6e2
JH
7447 static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
7448 static char* bases[5] = { "", "binary", "", "octal",
7449 "hexadecimal" };
7450 static char* Bases[5] = { "", "Binary", "", "Octal",
7451 "Hexadecimal" };
7452 static char *maxima[5] = { "",
7453 "0b11111111111111111111111111111111",
7454 "",
893fe2c2 7455 "037777777777",
9e24b6e2
JH
7456 "0xffffffff" };
7457 char *base, *Base, *max;
378cc40b 7458
02aa26ce 7459 /* check for hex */
378cc40b
LW
7460 if (s[1] == 'x') {
7461 shift = 4;
7462 s += 2;
61f33854 7463 just_zero = FALSE;
4f19785b
WSI
7464 } else if (s[1] == 'b') {
7465 shift = 1;
7466 s += 2;
61f33854 7467 just_zero = FALSE;
378cc40b 7468 }
02aa26ce 7469 /* check for a decimal in disguise */
b78218b7 7470 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 7471 goto decimal;
02aa26ce 7472 /* so it must be octal */
928753ea 7473 else {
378cc40b 7474 shift = 3;
928753ea
JH
7475 s++;
7476 }
7477
7478 if (*s == '_') {
7479 if (ckWARN(WARN_SYNTAX))
9014280d 7480 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7481 "Misplaced _ in number");
7482 lastub = s++;
7483 }
9e24b6e2
JH
7484
7485 base = bases[shift];
7486 Base = Bases[shift];
7487 max = maxima[shift];
02aa26ce 7488
4f19785b 7489 /* read the rest of the number */
378cc40b 7490 for (;;) {
9e24b6e2 7491 /* x is used in the overflow test,
893fe2c2 7492 b is the digit we're adding on. */
9e24b6e2 7493 UV x, b;
55497cff 7494
378cc40b 7495 switch (*s) {
02aa26ce
NT
7496
7497 /* if we don't mention it, we're done */
378cc40b
LW
7498 default:
7499 goto out;
02aa26ce 7500
928753ea 7501 /* _ are ignored -- but warned about if consecutive */
de3bb511 7502 case '_':
928753ea 7503 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
9014280d 7504 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7505 "Misplaced _ in number");
7506 lastub = s++;
de3bb511 7507 break;
02aa26ce
NT
7508
7509 /* 8 and 9 are not octal */
378cc40b 7510 case '8': case '9':
4f19785b 7511 if (shift == 3)
cea2e8a9 7512 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 7513 /* FALL THROUGH */
02aa26ce
NT
7514
7515 /* octal digits */
4f19785b 7516 case '2': case '3': case '4':
378cc40b 7517 case '5': case '6': case '7':
4f19785b 7518 if (shift == 1)
cea2e8a9 7519 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
7520 /* FALL THROUGH */
7521
7522 case '0': case '1':
02aa26ce 7523 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 7524 goto digit;
02aa26ce
NT
7525
7526 /* hex digits */
378cc40b
LW
7527 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
7528 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 7529 /* make sure they said 0x */
378cc40b
LW
7530 if (shift != 4)
7531 goto out;
55497cff 7532 b = (*s++ & 7) + 9;
02aa26ce
NT
7533
7534 /* Prepare to put the digit we have onto the end
7535 of the number so far. We check for overflows.
7536 */
7537
55497cff 7538 digit:
61f33854 7539 just_zero = FALSE;
9e24b6e2
JH
7540 if (!overflowed) {
7541 x = u << shift; /* make room for the digit */
7542
7543 if ((x >> shift) != u
7544 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
7545 overflowed = TRUE;
7546 n = (NV) u;
767a6a26 7547 if (ckWARN_d(WARN_OVERFLOW))
9014280d 7548 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
9e24b6e2
JH
7549 "Integer overflow in %s number",
7550 base);
7551 } else
7552 u = x | b; /* add the digit to the end */
7553 }
7554 if (overflowed) {
7555 n *= nvshift[shift];
7556 /* If an NV has not enough bits in its
7557 * mantissa to represent an UV this summing of
7558 * small low-order numbers is a waste of time
7559 * (because the NV cannot preserve the
7560 * low-order bits anyway): we could just
7561 * remember when did we overflow and in the
7562 * end just multiply n by the right
7563 * amount. */
7564 n += (NV) b;
55497cff 7565 }
378cc40b
LW
7566 break;
7567 }
7568 }
02aa26ce
NT
7569
7570 /* if we get here, we had success: make a scalar value from
7571 the number.
7572 */
378cc40b 7573 out:
928753ea
JH
7574
7575 /* final misplaced underbar check */
7576 if (s[-1] == '_') {
7577 if (ckWARN(WARN_SYNTAX))
9014280d 7578 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
7579 }
7580
79072805 7581 sv = NEWSV(92,0);
9e24b6e2 7582 if (overflowed) {
767a6a26 7583 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
9014280d 7584 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
7585 "%s number > %s non-portable",
7586 Base, max);
7587 sv_setnv(sv, n);
7588 }
7589 else {
15041a67 7590#if UVSIZE > 4
767a6a26 7591 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
9014280d 7592 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
7593 "%s number > %s non-portable",
7594 Base, max);
2cc4c2dc 7595#endif
9e24b6e2
JH
7596 sv_setuv(sv, u);
7597 }
61f33854
RGS
7598 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
7599 sv = new_constant(start, s - start, "integer",
7600 sv, Nullsv, NULL);
7601 else if (PL_hints & HINT_NEW_BINARY)
b3ac6de7 7602 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
378cc40b
LW
7603 }
7604 break;
02aa26ce
NT
7605
7606 /*
7607 handle decimal numbers.
7608 we're also sent here when we read a 0 as the first digit
7609 */
378cc40b
LW
7610 case '1': case '2': case '3': case '4': case '5':
7611 case '6': case '7': case '8': case '9': case '.':
7612 decimal:
3280af22
NIS
7613 d = PL_tokenbuf;
7614 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 7615 floatit = FALSE;
02aa26ce
NT
7616
7617 /* read next group of digits and _ and copy into d */
de3bb511 7618 while (isDIGIT(*s) || *s == '_') {
4e553d73 7619 /* skip underscores, checking for misplaced ones
02aa26ce
NT
7620 if -w is on
7621 */
93a17b20 7622 if (*s == '_') {
928753ea 7623 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
9014280d 7624 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7625 "Misplaced _ in number");
7626 lastub = s++;
93a17b20 7627 }
fc36a67e 7628 else {
02aa26ce 7629 /* check for end of fixed-length buffer */
fc36a67e 7630 if (d >= e)
cea2e8a9 7631 Perl_croak(aTHX_ number_too_long);
02aa26ce 7632 /* if we're ok, copy the character */
378cc40b 7633 *d++ = *s++;
fc36a67e 7634 }
378cc40b 7635 }
02aa26ce
NT
7636
7637 /* final misplaced underbar check */
928753ea 7638 if (lastub && s == lastub + 1) {
d008e5eb 7639 if (ckWARN(WARN_SYNTAX))
9014280d 7640 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 7641 }
02aa26ce
NT
7642
7643 /* read a decimal portion if there is one. avoid
7644 3..5 being interpreted as the number 3. followed
7645 by .5
7646 */
2f3197b3 7647 if (*s == '.' && s[1] != '.') {
79072805 7648 floatit = TRUE;
378cc40b 7649 *d++ = *s++;
02aa26ce 7650
928753ea
JH
7651 if (*s == '_') {
7652 if (ckWARN(WARN_SYNTAX))
9014280d 7653 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7654 "Misplaced _ in number");
7655 lastub = s;
7656 }
7657
7658 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 7659 */
fc36a67e 7660 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 7661 /* fixed length buffer check */
fc36a67e 7662 if (d >= e)
cea2e8a9 7663 Perl_croak(aTHX_ number_too_long);
928753ea
JH
7664 if (*s == '_') {
7665 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
9014280d 7666 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7667 "Misplaced _ in number");
7668 lastub = s;
7669 }
7670 else
fc36a67e 7671 *d++ = *s;
378cc40b 7672 }
928753ea
JH
7673 /* fractional part ending in underbar? */
7674 if (s[-1] == '_') {
7675 if (ckWARN(WARN_SYNTAX))
9014280d 7676 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7677 "Misplaced _ in number");
7678 }
dd629d5b
GS
7679 if (*s == '.' && isDIGIT(s[1])) {
7680 /* oops, it's really a v-string, but without the "v" */
f4758303 7681 s = start;
dd629d5b
GS
7682 goto vstring;
7683 }
378cc40b 7684 }
02aa26ce
NT
7685
7686 /* read exponent part, if present */
3792a11b 7687 if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
79072805
LW
7688 floatit = TRUE;
7689 s++;
02aa26ce
NT
7690
7691 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 7692 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 7693
7fd134d9
JH
7694 /* stray preinitial _ */
7695 if (*s == '_') {
7696 if (ckWARN(WARN_SYNTAX))
9014280d 7697 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
7698 "Misplaced _ in number");
7699 lastub = s++;
7700 }
7701
02aa26ce 7702 /* allow positive or negative exponent */
378cc40b
LW
7703 if (*s == '+' || *s == '-')
7704 *d++ = *s++;
02aa26ce 7705
7fd134d9
JH
7706 /* stray initial _ */
7707 if (*s == '_') {
7708 if (ckWARN(WARN_SYNTAX))
9014280d 7709 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
7710 "Misplaced _ in number");
7711 lastub = s++;
7712 }
7713
7fd134d9
JH
7714 /* read digits of exponent */
7715 while (isDIGIT(*s) || *s == '_') {
7716 if (isDIGIT(*s)) {
7717 if (d >= e)
7718 Perl_croak(aTHX_ number_too_long);
b3b48e3e 7719 *d++ = *s++;
7fd134d9
JH
7720 }
7721 else {
7722 if (ckWARN(WARN_SYNTAX) &&
7723 ((lastub && s == lastub + 1) ||
b3b48e3e 7724 (!isDIGIT(s[1]) && s[1] != '_')))
9014280d 7725 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9 7726 "Misplaced _ in number");
b3b48e3e 7727 lastub = s++;
7fd134d9 7728 }
7fd134d9 7729 }
378cc40b 7730 }
02aa26ce 7731
02aa26ce
NT
7732
7733 /* make an sv from the string */
79072805 7734 sv = NEWSV(92,0);
097ee67d 7735
0b7fceb9 7736 /*
58bb9ec3
NC
7737 We try to do an integer conversion first if no characters
7738 indicating "float" have been found.
0b7fceb9
MU
7739 */
7740
7741 if (!floatit) {
58bb9ec3
NC
7742 UV uv;
7743 int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
7744
7745 if (flags == IS_NUMBER_IN_UV) {
7746 if (uv <= IV_MAX)
86554af2 7747 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 7748 else
c239479b 7749 sv_setuv(sv, uv);
58bb9ec3
NC
7750 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
7751 if (uv <= (UV) IV_MIN)
7752 sv_setiv(sv, -(IV)uv);
7753 else
7754 floatit = TRUE;
7755 } else
7756 floatit = TRUE;
7757 }
0b7fceb9 7758 if (floatit) {
58bb9ec3
NC
7759 /* terminate the string */
7760 *d = '\0';
86554af2
JH
7761 nv = Atof(PL_tokenbuf);
7762 sv_setnv(sv, nv);
7763 }
86554af2 7764
b8403495
JH
7765 if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
7766 (PL_hints & HINT_NEW_INTEGER) )
4e553d73 7767 sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
b8403495
JH
7768 (floatit ? "float" : "integer"),
7769 sv, Nullsv, NULL);
378cc40b 7770 break;
0b7fceb9 7771
e312add1 7772 /* if it starts with a v, it could be a v-string */
a7cb1f99 7773 case 'v':
dd629d5b 7774vstring:
f4758303 7775 sv = NEWSV(92,5); /* preallocate storage space */
b0f01acb 7776 s = scan_vstring(s,sv);
a7cb1f99 7777 break;
79072805 7778 }
a687059c 7779
02aa26ce
NT
7780 /* make the op for the constant and return */
7781
a86a20aa 7782 if (sv)
b73d6f50 7783 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 7784 else
b73d6f50 7785 lvalp->opval = Nullop;
a687059c 7786
378cc40b
LW
7787 return s;
7788}
7789
76e3520e 7790STATIC char *
cea2e8a9 7791S_scan_formline(pTHX_ register char *s)
378cc40b 7792{
79072805 7793 register char *eol;
378cc40b 7794 register char *t;
79cb57f6 7795 SV *stuff = newSVpvn("",0);
79072805 7796 bool needargs = FALSE;
c5ee2135 7797 bool eofmt = FALSE;
378cc40b 7798
79072805 7799 while (!needargs) {
a1b95068 7800 if (*s == '.') {
79072805 7801 /*SUPPRESS 530*/
51882d45 7802#ifdef PERL_STRICT_CR
bf4acbe4 7803 for (t = s+1;SPACE_OR_TAB(*t); t++) ;
51882d45 7804#else
bf4acbe4 7805 for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
51882d45 7806#endif
c5ee2135
WL
7807 if (*t == '\n' || t == PL_bufend) {
7808 eofmt = TRUE;
79072805 7809 break;
c5ee2135 7810 }
79072805 7811 }
3280af22 7812 if (PL_in_eval && !PL_rsfp) {
a1b95068 7813 eol = memchr(s,'\n',PL_bufend-s);
0f85fab0 7814 if (!eol++)
3280af22 7815 eol = PL_bufend;
0f85fab0
LW
7816 }
7817 else
3280af22 7818 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 7819 if (*s != '#') {
a0d0e21e
LW
7820 for (t = s; t < eol; t++) {
7821 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
7822 needargs = FALSE;
7823 goto enough; /* ~~ must be first line in formline */
378cc40b 7824 }
a0d0e21e
LW
7825 if (*t == '@' || *t == '^')
7826 needargs = TRUE;
378cc40b 7827 }
7121b347
MG
7828 if (eol > s) {
7829 sv_catpvn(stuff, s, eol-s);
2dc4c65b 7830#ifndef PERL_STRICT_CR
7121b347
MG
7831 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
7832 char *end = SvPVX(stuff) + SvCUR(stuff);
7833 end[-2] = '\n';
7834 end[-1] = '\0';
7835 SvCUR(stuff)--;
7836 }
2dc4c65b 7837#endif
7121b347
MG
7838 }
7839 else
7840 break;
79072805
LW
7841 }
7842 s = eol;
3280af22
NIS
7843 if (PL_rsfp) {
7844 s = filter_gets(PL_linestr, PL_rsfp, 0);
7845 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
7846 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
207e3d1a 7847 PL_last_lop = PL_last_uni = Nullch;
79072805 7848 if (!s) {
3280af22 7849 s = PL_bufptr;
378cc40b
LW
7850 break;
7851 }
378cc40b 7852 }
463ee0b2 7853 incline(s);
79072805 7854 }
a0d0e21e
LW
7855 enough:
7856 if (SvCUR(stuff)) {
3280af22 7857 PL_expect = XTERM;
79072805 7858 if (needargs) {
3280af22
NIS
7859 PL_lex_state = LEX_NORMAL;
7860 PL_nextval[PL_nexttoke].ival = 0;
79072805
LW
7861 force_next(',');
7862 }
a0d0e21e 7863 else
3280af22 7864 PL_lex_state = LEX_FORMLINE;
1bd51a4c
IH
7865 if (!IN_BYTES) {
7866 if (UTF && is_utf8_string((U8*)SvPVX(stuff), SvCUR(stuff)))
7867 SvUTF8_on(stuff);
7868 else if (PL_encoding)
7869 sv_recode_to_utf8(stuff, PL_encoding);
7870 }
3280af22 7871 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 7872 force_next(THING);
3280af22 7873 PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
79072805 7874 force_next(LSTOP);
378cc40b 7875 }
79072805 7876 else {
8990e307 7877 SvREFCNT_dec(stuff);
c5ee2135
WL
7878 if (eofmt)
7879 PL_lex_formbrack = 0;
3280af22 7880 PL_bufptr = s;
79072805
LW
7881 }
7882 return s;
378cc40b 7883}
a687059c 7884
76e3520e 7885STATIC void
cea2e8a9 7886S_set_csh(pTHX)
a687059c 7887{
ae986130 7888#ifdef CSH
3280af22
NIS
7889 if (!PL_cshlen)
7890 PL_cshlen = strlen(PL_cshname);
ae986130 7891#endif
a687059c 7892}
463ee0b2 7893
ba6d6ac9 7894I32
864dbfa3 7895Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 7896{
3280af22
NIS
7897 I32 oldsavestack_ix = PL_savestack_ix;
7898 CV* outsidecv = PL_compcv;
8990e307 7899
3280af22
NIS
7900 if (PL_compcv) {
7901 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 7902 }
7766f137 7903 SAVEI32(PL_subline);
3280af22 7904 save_item(PL_subname);
3280af22 7905 SAVESPTR(PL_compcv);
3280af22
NIS
7906
7907 PL_compcv = (CV*)NEWSV(1104,0);
7908 sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7909 CvFLAGS(PL_compcv) |= flags;
7910
57843af0 7911 PL_subline = CopLINE(PL_curcop);
dd2155a4 7912 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
3280af22 7913 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
a3985cdc 7914 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 7915
8990e307
LW
7916 return oldsavestack_ix;
7917}
7918
084592ab
CN
7919#ifdef __SC__
7920#pragma segment Perl_yylex
7921#endif
8990e307 7922int
864dbfa3 7923Perl_yywarn(pTHX_ char *s)
8990e307 7924{
faef0170 7925 PL_in_eval |= EVAL_WARNONLY;
748a9306 7926 yyerror(s);
faef0170 7927 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 7928 return 0;
8990e307
LW
7929}
7930
7931int
864dbfa3 7932Perl_yyerror(pTHX_ char *s)
463ee0b2 7933{
68dc0745 7934 char *where = NULL;
7935 char *context = NULL;
7936 int contlen = -1;
46fc3d4c 7937 SV *msg;
463ee0b2 7938
3280af22 7939 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 7940 where = "at EOF";
3280af22
NIS
7941 else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7942 PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
f355267c
JH
7943 /*
7944 Only for NetWare:
7945 The code below is removed for NetWare because it abends/crashes on NetWare
7946 when the script has error such as not having the closing quotes like:
7947 if ($var eq "value)
7948 Checking of white spaces is anyway done in NetWare code.
7949 */
7950#ifndef NETWARE
3280af22
NIS
7951 while (isSPACE(*PL_oldoldbufptr))
7952 PL_oldoldbufptr++;
f355267c 7953#endif
3280af22
NIS
7954 context = PL_oldoldbufptr;
7955 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 7956 }
3280af22
NIS
7957 else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7958 PL_oldbufptr != PL_bufptr) {
f355267c
JH
7959 /*
7960 Only for NetWare:
7961 The code below is removed for NetWare because it abends/crashes on NetWare
7962 when the script has error such as not having the closing quotes like:
7963 if ($var eq "value)
7964 Checking of white spaces is anyway done in NetWare code.
7965 */
7966#ifndef NETWARE
3280af22
NIS
7967 while (isSPACE(*PL_oldbufptr))
7968 PL_oldbufptr++;
f355267c 7969#endif
3280af22
NIS
7970 context = PL_oldbufptr;
7971 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
7972 }
7973 else if (yychar > 255)
68dc0745 7974 where = "next token ???";
12fbd33b 7975 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
7976 if (PL_lex_state == LEX_NORMAL ||
7977 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 7978 where = "at end of line";
3280af22 7979 else if (PL_lex_inpat)
68dc0745 7980 where = "within pattern";
463ee0b2 7981 else
68dc0745 7982 where = "within string";
463ee0b2 7983 }
46fc3d4c 7984 else {
79cb57f6 7985 SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
46fc3d4c 7986 if (yychar < 32)
cea2e8a9 7987 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
46fc3d4c 7988 else if (isPRINT_LC(yychar))
cea2e8a9 7989 Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
463ee0b2 7990 else
cea2e8a9 7991 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
46fc3d4c 7992 where = SvPVX(where_sv);
463ee0b2 7993 }
46fc3d4c 7994 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 7995 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 7996 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 7997 if (context)
cea2e8a9 7998 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 7999 else
cea2e8a9 8000 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 8001 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 8002 Perl_sv_catpvf(aTHX_ msg,
57def98f 8003 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 8004 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 8005 PL_multi_end = 0;
a0d0e21e 8006 }
56da5a46
RGS
8007 if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
8008 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
463ee0b2 8009 else
5a844595 8010 qerror(msg);
c7d6bfb2
GS
8011 if (PL_error_count >= 10) {
8012 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 8013 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
248c2a4d 8014 ERRSV, OutCopFILE(PL_curcop));
c7d6bfb2
GS
8015 else
8016 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 8017 OutCopFILE(PL_curcop));
c7d6bfb2 8018 }
3280af22
NIS
8019 PL_in_my = 0;
8020 PL_in_my_stash = Nullhv;
463ee0b2
LW
8021 return 0;
8022}
084592ab
CN
8023#ifdef __SC__
8024#pragma segment Main
8025#endif
4e35701f 8026
b250498f 8027STATIC char*
3ae08724 8028S_swallow_bom(pTHX_ U8 *s)
01ec43d0 8029{
b250498f
GS
8030 STRLEN slen;
8031 slen = SvCUR(PL_linestr);
7aa207d6 8032 switch (s[0]) {
4e553d73
NIS
8033 case 0xFF:
8034 if (s[1] == 0xFE) {
7aa207d6 8035 /* UTF-16 little-endian? (or UTF32-LE?) */
3ae08724 8036 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
7aa207d6 8037 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
01ec43d0 8038#ifndef PERL_NO_UTF16_FILTER
7aa207d6 8039 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
3ae08724 8040 s += 2;
7aa207d6 8041 utf16le:
dea0fc0b
JH
8042 if (PL_bufend > (char*)s) {
8043 U8 *news;
8044 I32 newlen;
8045
8046 filter_add(utf16rev_textfilter, NULL);
8047 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
8048 utf16_to_utf8_reversed(s, news,
8049 PL_bufend - (char*)s - 1,
8050 &newlen);
7aa207d6 8051 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 8052 Safefree(news);
7aa207d6
JH
8053 SvUTF8_on(PL_linestr);
8054 s = (U8*)SvPVX(PL_linestr);
8055 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 8056 }
b250498f 8057#else
7aa207d6 8058 Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
b250498f 8059#endif
01ec43d0
GS
8060 }
8061 break;
78ae23f5 8062 case 0xFE:
7aa207d6 8063 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 8064#ifndef PERL_NO_UTF16_FILTER
7aa207d6 8065 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b 8066 s += 2;
7aa207d6 8067 utf16be:
dea0fc0b
JH
8068 if (PL_bufend > (char *)s) {
8069 U8 *news;
8070 I32 newlen;
8071
8072 filter_add(utf16_textfilter, NULL);
8073 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
8074 utf16_to_utf8(s, news,
8075 PL_bufend - (char*)s,
8076 &newlen);
7aa207d6 8077 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 8078 Safefree(news);
7aa207d6
JH
8079 SvUTF8_on(PL_linestr);
8080 s = (U8*)SvPVX(PL_linestr);
8081 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 8082 }
b250498f 8083#else
7aa207d6 8084 Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
b250498f 8085#endif
01ec43d0
GS
8086 }
8087 break;
3ae08724
GS
8088 case 0xEF:
8089 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 8090 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
8091 s += 3; /* UTF-8 */
8092 }
8093 break;
8094 case 0:
7aa207d6
JH
8095 if (slen > 3) {
8096 if (s[1] == 0) {
8097 if (s[2] == 0xFE && s[3] == 0xFF) {
8098 /* UTF-32 big-endian */
8099 Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
8100 }
8101 }
8102 else if (s[2] == 0 && s[3] != 0) {
8103 /* Leading bytes
8104 * 00 xx 00 xx
8105 * are a good indicator of UTF-16BE. */
8106 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
8107 goto utf16be;
8108 }
01ec43d0 8109 }
7aa207d6
JH
8110 default:
8111 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
8112 /* Leading bytes
8113 * xx 00 xx 00
8114 * are a good indicator of UTF-16LE. */
8115 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
8116 goto utf16le;
8117 }
01ec43d0 8118 }
b8f84bb2 8119 return (char*)s;
b250498f 8120}
4755096e 8121
4755096e
GS
8122/*
8123 * restore_rsfp
8124 * Restore a source filter.
8125 */
8126
8127static void
acfe0abc 8128restore_rsfp(pTHX_ void *f)
4755096e
GS
8129{
8130 PerlIO *fp = (PerlIO*)f;
8131
8132 if (PL_rsfp == PerlIO_stdin())
8133 PerlIO_clearerr(PL_rsfp);
8134 else if (PL_rsfp && (PL_rsfp != fp))
8135 PerlIO_close(PL_rsfp);
8136 PL_rsfp = fp;
8137}
6e3aabd6
GS
8138
8139#ifndef PERL_NO_UTF16_FILTER
8140static I32
acfe0abc 8141utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 8142{
1de9afcd 8143 STRLEN old = SvCUR(sv);
6e3aabd6 8144 I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
8145 DEBUG_P(PerlIO_printf(Perl_debug_log,
8146 "utf16_textfilter(%p): %d %d (%d)\n",
4fccd7c6 8147 utf16_textfilter, idx, maxlen, (int) count));
6e3aabd6
GS
8148 if (count) {
8149 U8* tmps;
dea0fc0b 8150 I32 newlen;
6e3aabd6 8151 New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
1de9afcd
RGS
8152 Copy(SvPVX(sv), tmps, old, char);
8153 utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
8154 SvCUR(sv) - old, &newlen);
8155 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 8156 }
1de9afcd
RGS
8157 DEBUG_P({sv_dump(sv);});
8158 return SvCUR(sv);
6e3aabd6
GS
8159}
8160
8161static I32
acfe0abc 8162utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 8163{
1de9afcd 8164 STRLEN old = SvCUR(sv);
6e3aabd6 8165 I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
8166 DEBUG_P(PerlIO_printf(Perl_debug_log,
8167 "utf16rev_textfilter(%p): %d %d (%d)\n",
4fccd7c6 8168 utf16rev_textfilter, idx, maxlen, (int) count));
6e3aabd6
GS
8169 if (count) {
8170 U8* tmps;
dea0fc0b 8171 I32 newlen;
6e3aabd6 8172 New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
1de9afcd
RGS
8173 Copy(SvPVX(sv), tmps, old, char);
8174 utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
8175 SvCUR(sv) - old, &newlen);
8176 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 8177 }
1de9afcd 8178 DEBUG_P({ sv_dump(sv); });
6e3aabd6
GS
8179 return count;
8180}
8181#endif
9f4817db 8182
f333445c
JP
8183/*
8184Returns a pointer to the next character after the parsed
8185vstring, as well as updating the passed in sv.
8186
8187Function must be called like
8188
8189 sv = NEWSV(92,5);
8190 s = scan_vstring(s,sv);
8191
8192The sv should already be large enough to store the vstring
8193passed in, for performance reasons.
8194
8195*/
8196
8197char *
8198Perl_scan_vstring(pTHX_ char *s, SV *sv)
8199{
8200 char *pos = s;
8201 char *start = s;
8202 if (*pos == 'v') pos++; /* get past 'v' */
3e884cbf
JH
8203 while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
8204 pos++;
f333445c
JP
8205 if ( *pos != '.') {
8206 /* this may not be a v-string if followed by => */
8fc7bb1c
SM
8207 char *next = pos;
8208 while (next < PL_bufend && isSPACE(*next))
8209 ++next;
8210 if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
8211 /* return string not v-string */
8212 sv_setpvn(sv,(char *)s,pos-s);
8213 return pos;
8214 }
8215 }
8216
8217 if (!isALPHA(*pos)) {
8218 UV rev;
8219 U8 tmpbuf[UTF8_MAXLEN+1];
8220 U8 *tmpend;
8221
8222 if (*s == 'v') s++; /* get past 'v' */
8223
8224 sv_setpvn(sv, "", 0);
8225
8226 for (;;) {
8227 rev = 0;
8228 {
8229 /* this is atoi() that tolerates underscores */
8230 char *end = pos;
8231 UV mult = 1;
8232 while (--end >= s) {
8233 UV orev;
8234 if (*end == '_')
8235 continue;
8236 orev = rev;
8237 rev += (*end - '0') * mult;
8238 mult *= 10;
8239 if (orev > rev && ckWARN_d(WARN_OVERFLOW))
8240 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
8241 "Integer overflow in decimal number");
8242 }
8243 }
8244#ifdef EBCDIC
8245 if (rev > 0x7FFFFFFF)
8246 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
8247#endif
8248 /* Append native character for the rev point */
8249 tmpend = uvchr_to_utf8(tmpbuf, rev);
8250 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
8251 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
8252 SvUTF8_on(sv);
3e884cbf 8253 if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
8254 s = ++pos;
8255 else {
8256 s = pos;
8257 break;
8258 }
3e884cbf 8259 while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
8260 pos++;
8261 }
8262 SvPOK_on(sv);
8263 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
8264 SvRMAGICAL_on(sv);
8265 }
8266 return s;
8267}
8268