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