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