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