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