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