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