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