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