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