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