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