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