This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Generalised "how many in list context" would be useful
[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 }
7aa207d6
JH
2500 /* If it looks like the start of a BOM or raw UTF-16,
2501 * check if it in fact is. */
2502 else if (bof &&
2503 (*s == 0 ||
2504 *(U8*)s == 0xEF ||
2505 *(U8*)s >= 0xFE ||
2506 s[1] == 0)) {
226017aa 2507#ifdef PERLIO_IS_STDIO
e3f494f1
JH
2508# ifdef __GNU_LIBRARY__
2509# if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
226017aa
DD
2510# define FTELL_FOR_PIPE_IS_BROKEN
2511# endif
e3f494f1
JH
2512# else
2513# ifdef __GLIBC__
2514# if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
2515# define FTELL_FOR_PIPE_IS_BROKEN
2516# endif
2517# endif
226017aa
DD
2518# endif
2519#endif
2520#ifdef FTELL_FOR_PIPE_IS_BROKEN
2521 /* This loses the possibility to detect the bof
2522 * situation on perl -P when the libc5 is being used.
2523 * Workaround? Maybe attach some extra state to PL_rsfp?
2524 */
2525 if (!PL_preprocess)
7e28d3af 2526 bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
226017aa 2527#else
eb160463 2528 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
226017aa 2529#endif
7e28d3af 2530 if (bof) {
3280af22 2531 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 2532 s = swallow_bom((U8*)s);
e929a76b 2533 }
378cc40b 2534 }
3280af22 2535 if (PL_doextract) {
a0d0e21e
LW
2536 /* Incest with pod. */
2537 if (*s == '=' && strnEQ(s, "=cut", 4)) {
3280af22
NIS
2538 sv_setpv(PL_linestr, "");
2539 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2540 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2541 PL_last_lop = PL_last_uni = Nullch;
3280af22 2542 PL_doextract = FALSE;
a0d0e21e 2543 }
4e553d73 2544 }
463ee0b2 2545 incline(s);
3280af22
NIS
2546 } while (PL_doextract);
2547 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
2548 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805 2549 SV *sv = NEWSV(85,0);
a687059c 2550
93a17b20 2551 sv_upgrade(sv, SVt_PVMG);
3280af22 2552 sv_setsv(sv,PL_linestr);
0ac0412a
MJD
2553 (void)SvIOK_on(sv);
2554 SvIVX(sv) = 0;
57843af0 2555 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
a687059c 2556 }
3280af22 2557 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2558 PL_last_lop = PL_last_uni = Nullch;
57843af0 2559 if (CopLINE(PL_curcop) == 1) {
3280af22 2560 while (s < PL_bufend && isSPACE(*s))
79072805 2561 s++;
a0d0e21e 2562 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 2563 s++;
44a8e56a 2564 d = Nullch;
3280af22 2565 if (!PL_in_eval) {
44a8e56a 2566 if (*s == '#' && *(s+1) == '!')
2567 d = s + 2;
2568#ifdef ALTERNATE_SHEBANG
2569 else {
2570 static char as[] = ALTERNATE_SHEBANG;
2571 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
2572 d = s + (sizeof(as) - 1);
2573 }
2574#endif /* ALTERNATE_SHEBANG */
2575 }
2576 if (d) {
b8378b72 2577 char *ipath;
774d564b 2578 char *ipathend;
b8378b72 2579
774d564b 2580 while (isSPACE(*d))
b8378b72
CS
2581 d++;
2582 ipath = d;
774d564b 2583 while (*d && !isSPACE(*d))
2584 d++;
2585 ipathend = d;
2586
2587#ifdef ARG_ZERO_IS_SCRIPT
2588 if (ipathend > ipath) {
2589 /*
2590 * HP-UX (at least) sets argv[0] to the script name,
2591 * which makes $^X incorrect. And Digital UNIX and Linux,
2592 * at least, set argv[0] to the basename of the Perl
2593 * interpreter. So, having found "#!", we'll set it right.
2594 */
ee2f7564 2595 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV)); /* $^X */
774d564b 2596 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 2597 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 2598 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 2599 SvSETMAGIC(x);
2600 }
556c1dec
JH
2601 else {
2602 STRLEN blen;
2603 STRLEN llen;
2604 char *bstart = SvPV(CopFILESV(PL_curcop),blen);
2605 char *lstart = SvPV(x,llen);
2606 if (llen < blen) {
2607 bstart += blen - llen;
2608 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
2609 sv_setpvn(x, ipath, ipathend - ipath);
2610 SvSETMAGIC(x);
2611 }
2612 }
2613 }
774d564b 2614 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 2615 }
774d564b 2616#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
2617
2618 /*
2619 * Look for options.
2620 */
748a9306 2621 d = instr(s,"perl -");
84e30d1a 2622 if (!d) {
748a9306 2623 d = instr(s,"perl");
84e30d1a
GS
2624#if defined(DOSISH)
2625 /* avoid getting into infinite loops when shebang
2626 * line contains "Perl" rather than "perl" */
2627 if (!d) {
2628 for (d = ipathend-4; d >= ipath; --d) {
2629 if ((*d == 'p' || *d == 'P')
2630 && !ibcmp(d, "perl", 4))
2631 {
2632 break;
2633 }
2634 }
2635 if (d < ipath)
2636 d = Nullch;
2637 }
2638#endif
2639 }
44a8e56a 2640#ifdef ALTERNATE_SHEBANG
2641 /*
2642 * If the ALTERNATE_SHEBANG on this system starts with a
2643 * character that can be part of a Perl expression, then if
2644 * we see it but not "perl", we're probably looking at the
2645 * start of Perl code, not a request to hand off to some
2646 * other interpreter. Similarly, if "perl" is there, but
2647 * not in the first 'word' of the line, we assume the line
2648 * contains the start of the Perl program.
44a8e56a 2649 */
2650 if (d && *s != '#') {
774d564b 2651 char *c = ipath;
44a8e56a 2652 while (*c && !strchr("; \t\r\n\f\v#", *c))
2653 c++;
2654 if (c < d)
2655 d = Nullch; /* "perl" not in first word; ignore */
2656 else
2657 *s = '#'; /* Don't try to parse shebang line */
2658 }
774d564b 2659#endif /* ALTERNATE_SHEBANG */
bf4acbe4 2660#ifndef MACOS_TRADITIONAL
748a9306 2661 if (!d &&
44a8e56a 2662 *s == '#' &&
774d564b 2663 ipathend > ipath &&
3280af22 2664 !PL_minus_c &&
748a9306 2665 !instr(s,"indir") &&
3280af22 2666 instr(PL_origargv[0],"perl"))
748a9306 2667 {
9f68db38 2668 char **newargv;
9f68db38 2669
774d564b 2670 *ipathend = '\0';
2671 s = ipathend + 1;
3280af22 2672 while (s < PL_bufend && isSPACE(*s))
9f68db38 2673 s++;
3280af22
NIS
2674 if (s < PL_bufend) {
2675 Newz(899,newargv,PL_origargc+3,char*);
9f68db38 2676 newargv[1] = s;
3280af22 2677 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
2678 s++;
2679 *s = '\0';
3280af22 2680 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
2681 }
2682 else
3280af22 2683 newargv = PL_origargv;
774d564b 2684 newargv[0] = ipath;
b35112e7 2685 PERL_FPU_PRE_EXEC
b4748376 2686 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 2687 PERL_FPU_POST_EXEC
cea2e8a9 2688 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 2689 }
bf4acbe4 2690#endif
748a9306 2691 if (d) {
3280af22
NIS
2692 U32 oldpdb = PL_perldb;
2693 bool oldn = PL_minus_n;
2694 bool oldp = PL_minus_p;
748a9306
LW
2695
2696 while (*d && !isSPACE(*d)) d++;
bf4acbe4 2697 while (SPACE_OR_TAB(*d)) d++;
748a9306
LW
2698
2699 if (*d++ == '-') {
a11ec5a9 2700 bool switches_done = PL_doswitches;
8cc95fdb 2701 do {
2702 if (*d == 'M' || *d == 'm') {
2703 char *m = d;
2704 while (*d && !isSPACE(*d)) d++;
cea2e8a9 2705 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
8cc95fdb 2706 (int)(d - m), m);
2707 }
2708 d = moreswitches(d);
2709 } while (d);
f0b2cf55
YST
2710 if (PL_doswitches && !switches_done) {
2711 int argc = PL_origargc;
2712 char **argv = PL_origargv;
2713 do {
2714 argc--,argv++;
2715 } while (argc && argv[0][0] == '-' && argv[0][1]);
2716 init_argv_symbols(argc,argv);
2717 }
155aba94
GS
2718 if ((PERLDB_LINE && !oldpdb) ||
2719 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 2720 /* if we have already added "LINE: while (<>) {",
2721 we must not do it again */
748a9306 2722 {
3280af22
NIS
2723 sv_setpv(PL_linestr, "");
2724 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2725 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2726 PL_last_lop = PL_last_uni = Nullch;
3280af22 2727 PL_preambled = FALSE;
84902520 2728 if (PERLDB_LINE)
3280af22 2729 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
2730 goto retry;
2731 }
a11ec5a9
RGS
2732 if (PL_doswitches && !switches_done) {
2733 int argc = PL_origargc;
2734 char **argv = PL_origargv;
2735 do {
2736 argc--,argv++;
2737 } while (argc && argv[0][0] == '-' && argv[0][1]);
2738 init_argv_symbols(argc,argv);
2739 }
a0d0e21e 2740 }
79072805 2741 }
9f68db38 2742 }
79072805 2743 }
3280af22
NIS
2744 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2745 PL_bufptr = s;
2746 PL_lex_state = LEX_FORMLINE;
cea2e8a9 2747 return yylex();
ae986130 2748 }
378cc40b 2749 goto retry;
4fdae800 2750 case '\r':
6a27c188 2751#ifdef PERL_STRICT_CR
cea2e8a9 2752 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 2753 Perl_croak(aTHX_
cc507455 2754 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 2755#endif
4fdae800 2756 case ' ': case '\t': case '\f': case 013:
bf4acbe4
GS
2757#ifdef MACOS_TRADITIONAL
2758 case '\312':
2759#endif
378cc40b
LW
2760 s++;
2761 goto retry;
378cc40b 2762 case '#':
e929a76b 2763 case '\n':
3280af22 2764 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
2765 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
2766 /* handle eval qq[#line 1 "foo"\n ...] */
2767 CopLINE_dec(PL_curcop);
2768 incline(s);
2769 }
3280af22 2770 d = PL_bufend;
a687059c 2771 while (s < d && *s != '\n')
378cc40b 2772 s++;
0f85fab0 2773 if (s < d)
378cc40b 2774 s++;
78c267c1 2775 else if (s > d) /* Found by Ilya: feed random input to Perl. */
a8406387 2776 Perl_croak(aTHX_ "panic: input overflow");
463ee0b2 2777 incline(s);
3280af22
NIS
2778 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
2779 PL_bufptr = s;
2780 PL_lex_state = LEX_FORMLINE;
cea2e8a9 2781 return yylex();
a687059c 2782 }
378cc40b 2783 }
a687059c 2784 else {
378cc40b 2785 *s = '\0';
3280af22 2786 PL_bufend = s;
a687059c 2787 }
378cc40b
LW
2788 goto retry;
2789 case '-':
79072805 2790 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50
JH
2791 I32 ftst = 0;
2792
378cc40b 2793 s++;
3280af22 2794 PL_bufptr = s;
748a9306
LW
2795 tmp = *s++;
2796
bf4acbe4 2797 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
2798 s++;
2799
2800 if (strnEQ(s,"=>",2)) {
3280af22 2801 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
4e553d73 2802 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 2803 "### Saw unary minus before =>, forcing word '%s'\n", s);
5f80b19c 2804 } );
748a9306
LW
2805 OPERATOR('-'); /* unary minus */
2806 }
3280af22 2807 PL_last_uni = PL_oldbufptr;
748a9306 2808 switch (tmp) {
e5edeb50
JH
2809 case 'r': ftst = OP_FTEREAD; break;
2810 case 'w': ftst = OP_FTEWRITE; break;
2811 case 'x': ftst = OP_FTEEXEC; break;
2812 case 'o': ftst = OP_FTEOWNED; break;
2813 case 'R': ftst = OP_FTRREAD; break;
2814 case 'W': ftst = OP_FTRWRITE; break;
2815 case 'X': ftst = OP_FTREXEC; break;
2816 case 'O': ftst = OP_FTROWNED; break;
2817 case 'e': ftst = OP_FTIS; break;
2818 case 'z': ftst = OP_FTZERO; break;
2819 case 's': ftst = OP_FTSIZE; break;
2820 case 'f': ftst = OP_FTFILE; break;
2821 case 'd': ftst = OP_FTDIR; break;
2822 case 'l': ftst = OP_FTLINK; break;
2823 case 'p': ftst = OP_FTPIPE; break;
2824 case 'S': ftst = OP_FTSOCK; break;
2825 case 'u': ftst = OP_FTSUID; break;
2826 case 'g': ftst = OP_FTSGID; break;
2827 case 'k': ftst = OP_FTSVTX; break;
2828 case 'b': ftst = OP_FTBLK; break;
2829 case 'c': ftst = OP_FTCHR; break;
2830 case 't': ftst = OP_FTTTY; break;
2831 case 'T': ftst = OP_FTTEXT; break;
2832 case 'B': ftst = OP_FTBINARY; break;
2833 case 'M': case 'A': case 'C':
2834 gv_fetchpv("\024",TRUE, SVt_PV);
2835 switch (tmp) {
2836 case 'M': ftst = OP_FTMTIME; break;
2837 case 'A': ftst = OP_FTATIME; break;
2838 case 'C': ftst = OP_FTCTIME; break;
2839 default: break;
2840 }
2841 break;
378cc40b 2842 default:
378cc40b
LW
2843 break;
2844 }
e5edeb50 2845 if (ftst) {
eb160463 2846 PL_last_lop_op = (OPCODE)ftst;
4e553d73 2847 DEBUG_T( { PerlIO_printf(Perl_debug_log,
0844c848 2848 "### Saw file test %c\n", (int)ftst);
5f80b19c 2849 } );
e5edeb50
JH
2850 FTST(ftst);
2851 }
2852 else {
2853 /* Assume it was a minus followed by a one-letter named
2854 * subroutine call (or a -bareword), then. */
95c31fe3 2855 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0
RGS
2856 "### '-%c' looked like a file test but was not\n",
2857 tmp);
5f80b19c 2858 } );
3cf7b4c4 2859 s = --PL_bufptr;
e5edeb50 2860 }
378cc40b 2861 }
a687059c
LW
2862 tmp = *s++;
2863 if (*s == tmp) {
2864 s++;
3280af22 2865 if (PL_expect == XOPERATOR)
79072805
LW
2866 TERM(POSTDEC);
2867 else
2868 OPERATOR(PREDEC);
2869 }
2870 else if (*s == '>') {
2871 s++;
2872 s = skipspace(s);
7e2040f0 2873 if (isIDFIRST_lazy_if(s,UTF)) {
a0d0e21e 2874 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
463ee0b2 2875 TOKEN(ARROW);
79072805 2876 }
748a9306
LW
2877 else if (*s == '$')
2878 OPERATOR(ARROW);
463ee0b2 2879 else
748a9306 2880 TERM(ARROW);
a687059c 2881 }
3280af22 2882 if (PL_expect == XOPERATOR)
79072805
LW
2883 Aop(OP_SUBTRACT);
2884 else {
3280af22 2885 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2f3197b3 2886 check_uni();
79072805 2887 OPERATOR('-'); /* unary minus */
2f3197b3 2888 }
79072805 2889
378cc40b 2890 case '+':
a687059c
LW
2891 tmp = *s++;
2892 if (*s == tmp) {
378cc40b 2893 s++;
3280af22 2894 if (PL_expect == XOPERATOR)
79072805
LW
2895 TERM(POSTINC);
2896 else
2897 OPERATOR(PREINC);
378cc40b 2898 }
3280af22 2899 if (PL_expect == XOPERATOR)
79072805
LW
2900 Aop(OP_ADD);
2901 else {
3280af22 2902 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2f3197b3 2903 check_uni();
a687059c 2904 OPERATOR('+');
2f3197b3 2905 }
a687059c 2906
378cc40b 2907 case '*':
3280af22
NIS
2908 if (PL_expect != XOPERATOR) {
2909 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
2910 PL_expect = XOPERATOR;
2911 force_ident(PL_tokenbuf, '*');
2912 if (!*PL_tokenbuf)
a0d0e21e 2913 PREREF('*');
79072805 2914 TERM('*');
a687059c 2915 }
79072805
LW
2916 s++;
2917 if (*s == '*') {
a687059c 2918 s++;
79072805 2919 PWop(OP_POW);
a687059c 2920 }
79072805
LW
2921 Mop(OP_MULTIPLY);
2922
378cc40b 2923 case '%':
3280af22 2924 if (PL_expect == XOPERATOR) {
bbce6d69 2925 ++s;
2926 Mop(OP_MODULO);
a687059c 2927 }
3280af22
NIS
2928 PL_tokenbuf[0] = '%';
2929 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
2930 if (!PL_tokenbuf[1]) {
bbce6d69 2931 PREREF('%');
a687059c 2932 }
3280af22 2933 PL_pending_ident = '%';
bbce6d69 2934 TERM('%');
a687059c 2935
378cc40b 2936 case '^':
79072805 2937 s++;
a0d0e21e 2938 BOop(OP_BIT_XOR);
79072805 2939 case '[':
3280af22 2940 PL_lex_brackets++;
79072805 2941 /* FALL THROUGH */
378cc40b 2942 case '~':
378cc40b 2943 case ',':
378cc40b
LW
2944 tmp = *s++;
2945 OPERATOR(tmp);
a0d0e21e
LW
2946 case ':':
2947 if (s[1] == ':') {
2948 len = 0;
2949 goto just_a_word;
2950 }
2951 s++;
09bef843
SB
2952 switch (PL_expect) {
2953 OP *attrs;
2954 case XOPERATOR:
2955 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
2956 break;
2957 PL_bufptr = s; /* update in case we back off */
2958 goto grabattrs;
2959 case XATTRBLOCK:
2960 PL_expect = XBLOCK;
2961 goto grabattrs;
2962 case XATTRTERM:
2963 PL_expect = XTERMBLOCK;
2964 grabattrs:
2965 s = skipspace(s);
2966 attrs = Nullop;
7e2040f0 2967 while (isIDFIRST_lazy_if(s,UTF)) {
09bef843 2968 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
f9829d6b
GS
2969 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
2970 if (tmp < 0) tmp = -tmp;
2971 switch (tmp) {
2972 case KEY_or:
2973 case KEY_and:
c963b151 2974 case KEY_err:
f9829d6b
GS
2975 case KEY_for:
2976 case KEY_unless:
2977 case KEY_if:
2978 case KEY_while:
2979 case KEY_until:
2980 goto got_attrs;
2981 default:
2982 break;
2983 }
2984 }
09bef843
SB
2985 if (*d == '(') {
2986 d = scan_str(d,TRUE,TRUE);
2987 if (!d) {
09bef843
SB
2988 /* MUST advance bufptr here to avoid bogus
2989 "at end of line" context messages from yyerror().
2990 */
2991 PL_bufptr = s + len;
2992 yyerror("Unterminated attribute parameter in attribute list");
2993 if (attrs)
2994 op_free(attrs);
2995 return 0; /* EOF indicator */
2996 }
2997 }
2998 if (PL_lex_stuff) {
2999 SV *sv = newSVpvn(s, len);
3000 sv_catsv(sv, PL_lex_stuff);
3001 attrs = append_elem(OP_LIST, attrs,
3002 newSVOP(OP_CONST, 0, sv));
3003 SvREFCNT_dec(PL_lex_stuff);
3004 PL_lex_stuff = Nullsv;
3005 }
3006 else {
371fce9b
DM
3007 if (len == 6 && strnEQ(s, "unique", len)) {
3008 if (PL_in_my == KEY_our)
3009#ifdef USE_ITHREADS
3010 GvUNIQUE_on(cGVOPx_gv(yylval.opval));
3011#else
3012 ; /* skip to avoid loading attributes.pm */
3013#endif
3014 else
3015 Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
3016 }
3017
d3cea301
SB
3018 /* NOTE: any CV attrs applied here need to be part of
3019 the CVf_BUILTIN_ATTRS define in cv.h! */
371fce9b 3020 else if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
78f9721b
SM
3021 CvLVALUE_on(PL_compcv);
3022 else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
3023 CvLOCKED_on(PL_compcv);
3024 else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
3025 CvMETHOD_on(PL_compcv);
06492da6
SF
3026 else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
3027 CvASSERTION_on(PL_compcv);
78f9721b
SM
3028 /* After we've set the flags, it could be argued that
3029 we don't need to do the attributes.pm-based setting
3030 process, and shouldn't bother appending recognized
d3cea301
SB
3031 flags. To experiment with that, uncomment the
3032 following "else". (Note that's already been
3033 uncommented. That keeps the above-applied built-in
3034 attributes from being intercepted (and possibly
3035 rejected) by a package's attribute routines, but is
3036 justified by the performance win for the common case
3037 of applying only built-in attributes.) */
0256094b 3038 else
78f9721b
SM
3039 attrs = append_elem(OP_LIST, attrs,
3040 newSVOP(OP_CONST, 0,
3041 newSVpvn(s, len)));
09bef843
SB
3042 }
3043 s = skipspace(d);
0120eecf 3044 if (*s == ':' && s[1] != ':')
09bef843 3045 s = skipspace(s+1);
0120eecf
GS
3046 else if (s == d)
3047 break; /* require real whitespace or :'s */
09bef843 3048 }
f9829d6b 3049 tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
8e7ae056 3050 if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
09bef843
SB
3051 char q = ((*s == '\'') ? '"' : '\'');
3052 /* If here for an expression, and parsed no attrs, back off. */
3053 if (tmp == '=' && !attrs) {
3054 s = PL_bufptr;
3055 break;
3056 }
3057 /* MUST advance bufptr here to avoid bogus "at end of line"
3058 context messages from yyerror().
3059 */
3060 PL_bufptr = s;
3061 if (!*s)
3062 yyerror("Unterminated attribute list");
3063 else
3064 yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3065 q, *s, q));
3066 if (attrs)
3067 op_free(attrs);
3068 OPERATOR(':');
3069 }
f9829d6b 3070 got_attrs:
09bef843
SB
3071 if (attrs) {
3072 PL_nextval[PL_nexttoke].opval = attrs;
3073 force_next(THING);
3074 }
3075 TOKEN(COLONATTR);
3076 }
a0d0e21e 3077 OPERATOR(':');
8990e307
LW
3078 case '(':
3079 s++;
3280af22
NIS
3080 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3081 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 3082 else
3280af22 3083 PL_expect = XTERM;
4a202259 3084 s = skipspace(s);
a0d0e21e 3085 TOKEN('(');
378cc40b 3086 case ';':
f4dd75d9 3087 CLINE;
378cc40b
LW
3088 tmp = *s++;
3089 OPERATOR(tmp);
3090 case ')':
378cc40b 3091 tmp = *s++;
16d20bd9
AD
3092 s = skipspace(s);
3093 if (*s == '{')
3094 PREBLOCK(tmp);
378cc40b 3095 TERM(tmp);
79072805
LW
3096 case ']':
3097 s++;
3280af22 3098 if (PL_lex_brackets <= 0)
d98d5fff 3099 yyerror("Unmatched right square bracket");
463ee0b2 3100 else
3280af22
NIS
3101 --PL_lex_brackets;
3102 if (PL_lex_state == LEX_INTERPNORMAL) {
3103 if (PL_lex_brackets == 0) {
a0d0e21e 3104 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3280af22 3105 PL_lex_state = LEX_INTERPEND;
79072805
LW
3106 }
3107 }
4633a7c4 3108 TERM(']');
79072805
LW
3109 case '{':
3110 leftbracket:
79072805 3111 s++;
3280af22 3112 if (PL_lex_brackets > 100) {
8edd5f42 3113 Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
8990e307 3114 }
3280af22 3115 switch (PL_expect) {
a0d0e21e 3116 case XTERM:
3280af22 3117 if (PL_lex_formbrack) {
a0d0e21e
LW
3118 s--;
3119 PRETERMBLOCK(DO);
3120 }
3280af22
NIS
3121 if (PL_oldoldbufptr == PL_last_lop)
3122 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 3123 else
3280af22 3124 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 3125 OPERATOR(HASHBRACK);
a0d0e21e 3126 case XOPERATOR:
bf4acbe4 3127 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306 3128 s++;
44a8e56a 3129 d = s;
3280af22
NIS
3130 PL_tokenbuf[0] = '\0';
3131 if (d < PL_bufend && *d == '-') {
3132 PL_tokenbuf[0] = '-';
44a8e56a 3133 d++;
bf4acbe4 3134 while (d < PL_bufend && SPACE_OR_TAB(*d))
44a8e56a 3135 d++;
3136 }
7e2040f0 3137 if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3280af22 3138 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 3139 FALSE, &len);
bf4acbe4 3140 while (d < PL_bufend && SPACE_OR_TAB(*d))
748a9306
LW
3141 d++;
3142 if (*d == '}') {
3280af22 3143 char minus = (PL_tokenbuf[0] == '-');
44a8e56a 3144 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3145 if (minus)
3146 force_next('-');
748a9306
LW
3147 }
3148 }
3149 /* FALL THROUGH */
09bef843 3150 case XATTRBLOCK:
748a9306 3151 case XBLOCK:
3280af22
NIS
3152 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3153 PL_expect = XSTATE;
a0d0e21e 3154 break;
09bef843 3155 case XATTRTERM:
a0d0e21e 3156 case XTERMBLOCK:
3280af22
NIS
3157 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3158 PL_expect = XSTATE;
a0d0e21e
LW
3159 break;
3160 default: {
3161 char *t;
3280af22
NIS
3162 if (PL_oldoldbufptr == PL_last_lop)
3163 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 3164 else
3280af22 3165 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
a0d0e21e 3166 s = skipspace(s);
8452ff4b
SB
3167 if (*s == '}') {
3168 if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3169 PL_expect = XTERM;
3170 /* This hack is to get the ${} in the message. */
3171 PL_bufptr = s+1;
3172 yyerror("syntax error");
3173 break;
3174 }
a0d0e21e 3175 OPERATOR(HASHBRACK);
8452ff4b 3176 }
b8a4b1be
GS
3177 /* This hack serves to disambiguate a pair of curlies
3178 * as being a block or an anon hash. Normally, expectation
3179 * determines that, but in cases where we're not in a
3180 * position to expect anything in particular (like inside
3181 * eval"") we have to resolve the ambiguity. This code
3182 * covers the case where the first term in the curlies is a
3183 * quoted string. Most other cases need to be explicitly
3184 * disambiguated by prepending a `+' before the opening
3185 * curly in order to force resolution as an anon hash.
3186 *
3187 * XXX should probably propagate the outer expectation
3188 * into eval"" to rely less on this hack, but that could
3189 * potentially break current behavior of eval"".
3190 * GSAR 97-07-21
3191 */
3192 t = s;
3193 if (*s == '\'' || *s == '"' || *s == '`') {
3194 /* common case: get past first string, handling escapes */
3280af22 3195 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
3196 if (*t++ == '\\' && (*t == '\\' || *t == *s))
3197 t++;
3198 t++;
a0d0e21e 3199 }
b8a4b1be 3200 else if (*s == 'q') {
3280af22 3201 if (++t < PL_bufend
b8a4b1be 3202 && (!isALNUM(*t)
3280af22 3203 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
3204 && !isALNUM(*t))))
3205 {
abc667d1 3206 /* skip q//-like construct */
b8a4b1be
GS
3207 char *tmps;
3208 char open, close, term;
3209 I32 brackets = 1;
3210
3280af22 3211 while (t < PL_bufend && isSPACE(*t))
b8a4b1be 3212 t++;
abc667d1
DM
3213 /* check for q => */
3214 if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
3215 OPERATOR(HASHBRACK);
3216 }
b8a4b1be
GS
3217 term = *t;
3218 open = term;
3219 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3220 term = tmps[5];
3221 close = term;
3222 if (open == close)
3280af22
NIS
3223 for (t++; t < PL_bufend; t++) {
3224 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 3225 t++;
6d07e5e9 3226 else if (*t == open)
b8a4b1be
GS
3227 break;
3228 }
abc667d1 3229 else {
3280af22
NIS
3230 for (t++; t < PL_bufend; t++) {
3231 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 3232 t++;
6d07e5e9 3233 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
3234 break;
3235 else if (*t == open)
3236 brackets++;
3237 }
abc667d1
DM
3238 }
3239 t++;
b8a4b1be 3240 }
abc667d1
DM
3241 else
3242 /* skip plain q word */
3243 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3244 t += UTF8SKIP(t);
a0d0e21e 3245 }
7e2040f0 3246 else if (isALNUM_lazy_if(t,UTF)) {
0505442f 3247 t += UTF8SKIP(t);
7e2040f0 3248 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
0505442f 3249 t += UTF8SKIP(t);
a0d0e21e 3250 }
3280af22 3251 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 3252 t++;
b8a4b1be
GS
3253 /* if comma follows first term, call it an anon hash */
3254 /* XXX it could be a comma expression with loop modifiers */
3280af22 3255 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 3256 || (*t == '=' && t[1] == '>')))
a0d0e21e 3257 OPERATOR(HASHBRACK);
3280af22 3258 if (PL_expect == XREF)
4e4e412b 3259 PL_expect = XTERM;
a0d0e21e 3260 else {
3280af22
NIS
3261 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3262 PL_expect = XSTATE;
a0d0e21e 3263 }
8990e307 3264 }
a0d0e21e 3265 break;
463ee0b2 3266 }
57843af0 3267 yylval.ival = CopLINE(PL_curcop);
79072805 3268 if (isSPACE(*s) || *s == '#')
3280af22 3269 PL_copline = NOLINE; /* invalidate current command line number */
79072805 3270 TOKEN('{');
378cc40b 3271 case '}':
79072805
LW
3272 rightbracket:
3273 s++;
3280af22 3274 if (PL_lex_brackets <= 0)
d98d5fff 3275 yyerror("Unmatched right curly bracket");
463ee0b2 3276 else
3280af22 3277 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
c2e66d9e 3278 if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3280af22
NIS
3279 PL_lex_formbrack = 0;
3280 if (PL_lex_state == LEX_INTERPNORMAL) {
3281 if (PL_lex_brackets == 0) {
9059aa12
LW
3282 if (PL_expect & XFAKEBRACK) {
3283 PL_expect &= XENUMMASK;
3280af22
NIS
3284 PL_lex_state = LEX_INTERPEND;
3285 PL_bufptr = s;
cea2e8a9 3286 return yylex(); /* ignore fake brackets */
79072805 3287 }
fa83b5b6 3288 if (*s == '-' && s[1] == '>')
3280af22 3289 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 3290 else if (*s != '[' && *s != '{')
3280af22 3291 PL_lex_state = LEX_INTERPEND;
79072805
LW
3292 }
3293 }
9059aa12
LW
3294 if (PL_expect & XFAKEBRACK) {
3295 PL_expect &= XENUMMASK;
3280af22 3296 PL_bufptr = s;
cea2e8a9 3297 return yylex(); /* ignore fake brackets */
748a9306 3298 }
79072805
LW
3299 force_next('}');
3300 TOKEN(';');
378cc40b
LW
3301 case '&':
3302 s++;
3303 tmp = *s++;
3304 if (tmp == '&')
a0d0e21e 3305 AOPERATOR(ANDAND);
378cc40b 3306 s--;
3280af22 3307 if (PL_expect == XOPERATOR) {
7e2040f0
GS
3308 if (ckWARN(WARN_SEMICOLON)
3309 && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
3310 {
57843af0 3311 CopLINE_dec(PL_curcop);
9014280d 3312 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 3313 CopLINE_inc(PL_curcop);
463ee0b2 3314 }
79072805 3315 BAop(OP_BIT_AND);
463ee0b2 3316 }
79072805 3317
3280af22
NIS
3318 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3319 if (*PL_tokenbuf) {
3320 PL_expect = XOPERATOR;
3321 force_ident(PL_tokenbuf, '&');
463ee0b2 3322 }
79072805
LW
3323 else
3324 PREREF('&');
c07a80fd 3325 yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
3326 TERM('&');
3327
378cc40b
LW
3328 case '|':
3329 s++;
3330 tmp = *s++;
3331 if (tmp == '|')
a0d0e21e 3332 AOPERATOR(OROR);
378cc40b 3333 s--;
79072805 3334 BOop(OP_BIT_OR);
378cc40b
LW
3335 case '=':
3336 s++;
3337 tmp = *s++;
3338 if (tmp == '=')
79072805
LW
3339 Eop(OP_EQ);
3340 if (tmp == '>')
3341 OPERATOR(',');
378cc40b 3342 if (tmp == '~')
79072805 3343 PMop(OP_MATCH);
599cee73 3344 if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
9014280d 3345 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
378cc40b 3346 s--;
3280af22
NIS
3347 if (PL_expect == XSTATE && isALPHA(tmp) &&
3348 (s == PL_linestart+1 || s[-2] == '\n') )
748a9306 3349 {
3280af22
NIS
3350 if (PL_in_eval && !PL_rsfp) {
3351 d = PL_bufend;
a5f75d66
AD
3352 while (s < d) {
3353 if (*s++ == '\n') {
3354 incline(s);
3355 if (strnEQ(s,"=cut",4)) {
3356 s = strchr(s,'\n');
3357 if (s)
3358 s++;
3359 else
3360 s = d;
3361 incline(s);
3362 goto retry;
3363 }
3364 }
3365 }
3366 goto retry;
3367 }
3280af22
NIS
3368 s = PL_bufend;
3369 PL_doextract = TRUE;
a0d0e21e
LW
3370 goto retry;
3371 }
3280af22 3372 if (PL_lex_brackets < PL_lex_formbrack) {
a0d0e21e 3373 char *t;
51882d45 3374#ifdef PERL_STRICT_CR
bf4acbe4 3375 for (t = s; SPACE_OR_TAB(*t); t++) ;
51882d45 3376#else
bf4acbe4 3377 for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
51882d45 3378#endif
a0d0e21e
LW
3379 if (*t == '\n' || *t == '#') {
3380 s--;
3280af22 3381 PL_expect = XBLOCK;
a0d0e21e
LW
3382 goto leftbracket;
3383 }
79072805 3384 }
a0d0e21e
LW
3385 yylval.ival = 0;
3386 OPERATOR(ASSIGNOP);
378cc40b
LW
3387 case '!':
3388 s++;
3389 tmp = *s++;
984200d0 3390 if (tmp == '=') {
decca21c
YST
3391 /* was this !=~ where !~ was meant?
3392 * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
3393
984200d0
YST
3394 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
3395 char *t = s+1;
3396
3397 while (t < PL_bufend && isSPACE(*t))
3398 ++t;
3399
decca21c
YST
3400 if (*t == '/' || *t == '?' ||
3401 ((*t == 'm' || *t == 's' || *t == 'y') && !isALNUM(t[1])) ||
3402 (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
984200d0
YST
3403 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3404 "!=~ should be !~");
3405 }
79072805 3406 Eop(OP_NE);
984200d0 3407 }
378cc40b 3408 if (tmp == '~')
79072805 3409 PMop(OP_NOT);
378cc40b
LW
3410 s--;
3411 OPERATOR('!');
3412 case '<':
3280af22 3413 if (PL_expect != XOPERATOR) {
93a17b20 3414 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 3415 check_uni();
79072805
LW
3416 if (s[1] == '<')
3417 s = scan_heredoc(s);
3418 else
3419 s = scan_inputsymbol(s);
3420 TERM(sublex_start());
378cc40b
LW
3421 }
3422 s++;
3423 tmp = *s++;
3424 if (tmp == '<')
79072805 3425 SHop(OP_LEFT_SHIFT);
395c3793
LW
3426 if (tmp == '=') {
3427 tmp = *s++;
3428 if (tmp == '>')
79072805 3429 Eop(OP_NCMP);
395c3793 3430 s--;
79072805 3431 Rop(OP_LE);
395c3793 3432 }
378cc40b 3433 s--;
79072805 3434 Rop(OP_LT);
378cc40b
LW
3435 case '>':
3436 s++;
3437 tmp = *s++;
3438 if (tmp == '>')
79072805 3439 SHop(OP_RIGHT_SHIFT);
378cc40b 3440 if (tmp == '=')
79072805 3441 Rop(OP_GE);
378cc40b 3442 s--;
79072805 3443 Rop(OP_GT);
378cc40b
LW
3444
3445 case '$':
bbce6d69 3446 CLINE;
3447
3280af22
NIS
3448 if (PL_expect == XOPERATOR) {
3449 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3450 PL_expect = XTERM;
a0d0e21e 3451 depcom();
bbce6d69 3452 return ','; /* grandfather non-comma-format format */
a0d0e21e 3453 }
8990e307 3454 }
a0d0e21e 3455
7e2040f0 3456 if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3280af22 3457 PL_tokenbuf[0] = '@';
376b8730
SM
3458 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3459 sizeof PL_tokenbuf - 1, FALSE);
3460 if (PL_expect == XOPERATOR)
3461 no_op("Array length", s);
3280af22 3462 if (!PL_tokenbuf[1])
a0d0e21e 3463 PREREF(DOLSHARP);
3280af22
NIS
3464 PL_expect = XOPERATOR;
3465 PL_pending_ident = '#';
463ee0b2 3466 TOKEN(DOLSHARP);
79072805 3467 }
bbce6d69 3468
3280af22 3469 PL_tokenbuf[0] = '$';
376b8730
SM
3470 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3471 sizeof PL_tokenbuf - 1, FALSE);
3472 if (PL_expect == XOPERATOR)
3473 no_op("Scalar", s);
3280af22
NIS
3474 if (!PL_tokenbuf[1]) {
3475 if (s == PL_bufend)
bbce6d69 3476 yyerror("Final $ should be \\$ or $name");
3477 PREREF('$');
8990e307 3478 }
a0d0e21e 3479
bbce6d69 3480 /* This kludge not intended to be bulletproof. */
3280af22 3481 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
bbce6d69 3482 yylval.opval = newSVOP(OP_CONST, 0,
b448e4fe 3483 newSViv(PL_compiling.cop_arybase));
bbce6d69 3484 yylval.opval->op_private = OPpCONST_ARYBASE;
3485 TERM(THING);
3486 }
3487
ff68c719 3488 d = s;
69d2bceb 3489 tmp = (I32)*s;
3280af22 3490 if (PL_lex_state == LEX_NORMAL)
ff68c719 3491 s = skipspace(s);
3492
3280af22 3493 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3494 char *t;
3495 if (*s == '[') {
3280af22 3496 PL_tokenbuf[0] = '@';
599cee73 3497 if (ckWARN(WARN_SYNTAX)) {
bbce6d69 3498 for(t = s + 1;
7e2040f0 3499 isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
bbce6d69 3500 t++) ;
a0d0e21e 3501 if (*t++ == ',') {
3280af22
NIS
3502 PL_bufptr = skipspace(PL_bufptr);
3503 while (t < PL_bufend && *t != ']')
bbce6d69 3504 t++;
9014280d 3505 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73
PM
3506 "Multidimensional syntax %.*s not supported",
3507 (t - PL_bufptr) + 1, PL_bufptr);
a0d0e21e
LW
3508 }
3509 }
bbce6d69 3510 }
3511 else if (*s == '{') {
3280af22 3512 PL_tokenbuf[0] = '%';
599cee73 3513 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
bbce6d69 3514 (t = strchr(s, '}')) && (t = strchr(t, '=')))
3515 {
3280af22 3516 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
3517 STRLEN len;
3518 for (t++; isSPACE(*t); t++) ;
7e2040f0 3519 if (isIDFIRST_lazy_if(t,UTF)) {
8903cb82 3520 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
59a6d928 3521 for (; isSPACE(*t); t++) ;
864dbfa3 3522 if (*t == ';' && get_cv(tmpbuf, FALSE))
9014280d 3523 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 3524 "You need to quote \"%s\"", tmpbuf);
748a9306 3525 }
93a17b20
LW
3526 }
3527 }
2f3197b3 3528 }
bbce6d69 3529
3280af22 3530 PL_expect = XOPERATOR;
69d2bceb 3531 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3280af22
NIS
3532 bool islop = (PL_last_lop == PL_oldoldbufptr);
3533 if (!islop || PL_last_lop_op == OP_GREPSTART)
3534 PL_expect = XOPERATOR;
bbce6d69 3535 else if (strchr("$@\"'`q", *s))
3280af22 3536 PL_expect = XTERM; /* e.g. print $fh "foo" */
7e2040f0 3537 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3280af22 3538 PL_expect = XTERM; /* e.g. print $fh &sub */
7e2040f0 3539 else if (isIDFIRST_lazy_if(s,UTF)) {
3280af22 3540 char tmpbuf[sizeof PL_tokenbuf];
8903cb82 3541 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
155aba94 3542 if ((tmp = keyword(tmpbuf, len))) {
84902520
TB
3543 /* binary operators exclude handle interpretations */
3544 switch (tmp) {
3545 case -KEY_x:
3546 case -KEY_eq:
3547 case -KEY_ne:
3548 case -KEY_gt:
3549 case -KEY_lt:
3550 case -KEY_ge:
3551 case -KEY_le:
3552 case -KEY_cmp:
3553 break;
3554 default:
3280af22 3555 PL_expect = XTERM; /* e.g. print $fh length() */
84902520
TB
3556 break;
3557 }
3558 }
68dc0745 3559 else {
8a8635f0 3560 PL_expect = XTERM; /* e.g. print $fh subr() */
93a17b20 3561 }
93a17b20 3562 }
bbce6d69 3563 else if (isDIGIT(*s))
3280af22 3564 PL_expect = XTERM; /* e.g. print $fh 3 */
bbce6d69 3565 else if (*s == '.' && isDIGIT(s[1]))
3280af22 3566 PL_expect = XTERM; /* e.g. print $fh .3 */
c963b151
BD
3567 else if (strchr("?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
3568 PL_expect = XTERM; /* e.g. print $fh -1 */
7ce6e6b9
RGS
3569 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
3570 PL_expect = XTERM; /* e.g. print $fh /.../
3571 XXX except DORDOR operator */
e0587a03 3572 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3280af22 3573 PL_expect = XTERM; /* print $fh <<"EOF" */
bbce6d69 3574 }
3280af22 3575 PL_pending_ident = '$';
79072805 3576 TOKEN('$');
378cc40b
LW
3577
3578 case '@':
3280af22 3579 if (PL_expect == XOPERATOR)
bbce6d69 3580 no_op("Array", s);
3280af22
NIS
3581 PL_tokenbuf[0] = '@';
3582 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3583 if (!PL_tokenbuf[1]) {
bbce6d69 3584 PREREF('@');
3585 }
3280af22 3586 if (PL_lex_state == LEX_NORMAL)
ff68c719 3587 s = skipspace(s);
3280af22 3588 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3589 if (*s == '{')
3280af22 3590 PL_tokenbuf[0] = '%';
a0d0e21e
LW
3591
3592 /* Warn about @ where they meant $. */
599cee73 3593 if (ckWARN(WARN_SYNTAX)) {
a0d0e21e
LW
3594 if (*s == '[' || *s == '{') {
3595 char *t = s + 1;
7e2040f0 3596 while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
3597 t++;
3598 if (*t == '}' || *t == ']') {
3599 t++;
3280af22 3600 PL_bufptr = skipspace(PL_bufptr);
9014280d 3601 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 3602 "Scalar value %.*s better written as $%.*s",
3280af22 3603 t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
a0d0e21e 3604 }
93a17b20
LW
3605 }
3606 }
463ee0b2 3607 }
3280af22 3608 PL_pending_ident = '@';
79072805 3609 TERM('@');
378cc40b 3610
c963b151 3611 case '/': /* may be division, defined-or, or pattern */
6f33ba73
RGS
3612 if (PL_expect == XTERMORDORDOR && s[1] == '/') {
3613 s += 2;
3614 AOPERATOR(DORDOR);
3615 }
c963b151
BD
3616 case '?': /* may either be conditional or pattern */
3617 if(PL_expect == XOPERATOR) {
3618 tmp = *s++;
3619 if(tmp == '?') {
3620 OPERATOR('?');
3621 }
3622 else {
3623 tmp = *s++;
3624 if(tmp == '/') {
3625 /* A // operator. */
3626 AOPERATOR(DORDOR);
3627 }
3628 else {
3629 s--;
3630 Mop(OP_DIVIDE);
3631 }
3632 }
3633 }
3634 else {
3635 /* Disable warning on "study /blah/" */
3636 if (PL_oldoldbufptr == PL_last_uni
3637 && (*PL_last_uni != 's' || s - PL_last_uni < 5
3638 || memNE(PL_last_uni, "study", 5)
3639 || isALNUM_lazy_if(PL_last_uni+5,UTF)
3640 ))
3641 check_uni();
3642 s = scan_pat(s,OP_MATCH);
3643 TERM(sublex_start());
3644 }
378cc40b
LW
3645
3646 case '.':
51882d45
GS
3647 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3648#ifdef PERL_STRICT_CR
3649 && s[1] == '\n'
3650#else
3651 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3652#endif
3653 && (s == PL_linestart || s[-1] == '\n') )
3654 {
3280af22
NIS
3655 PL_lex_formbrack = 0;
3656 PL_expect = XSTATE;
79072805
LW
3657 goto rightbracket;
3658 }
3280af22 3659 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
378cc40b 3660 tmp = *s++;
a687059c
LW
3661 if (*s == tmp) {
3662 s++;
2f3197b3
LW
3663 if (*s == tmp) {
3664 s++;
79072805 3665 yylval.ival = OPf_SPECIAL;
2f3197b3
LW
3666 }
3667 else
79072805 3668 yylval.ival = 0;
378cc40b 3669 OPERATOR(DOTDOT);
a687059c 3670 }
3280af22 3671 if (PL_expect != XOPERATOR)
2f3197b3 3672 check_uni();
79072805 3673 Aop(OP_CONCAT);
378cc40b
LW
3674 }
3675 /* FALL THROUGH */
3676 case '0': case '1': case '2': case '3': case '4':
3677 case '5': case '6': case '7': case '8': case '9':
b73d6f50 3678 s = scan_num(s, &yylval);
4e553d73 3679 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 3680 "### Saw number in '%s'\n", s);
5f80b19c 3681 } );
3280af22 3682 if (PL_expect == XOPERATOR)
8990e307 3683 no_op("Number",s);
79072805
LW
3684 TERM(THING);
3685
3686 case '\'':
09bef843 3687 s = scan_str(s,FALSE,FALSE);
4e553d73 3688 DEBUG_T( { PerlIO_printf(Perl_debug_log,
207e3d1a 3689 "### Saw string before '%s'\n", s);
5f80b19c 3690 } );
3280af22
NIS
3691 if (PL_expect == XOPERATOR) {
3692 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3693 PL_expect = XTERM;
a0d0e21e
LW
3694 depcom();
3695 return ','; /* grandfather non-comma-format format */
3696 }
463ee0b2 3697 else
8990e307 3698 no_op("String",s);
463ee0b2 3699 }
79072805 3700 if (!s)
85e6fe83 3701 missingterm((char*)0);
79072805
LW
3702 yylval.ival = OP_CONST;
3703 TERM(sublex_start());
3704
3705 case '"':
09bef843 3706 s = scan_str(s,FALSE,FALSE);
4e553d73 3707 DEBUG_T( { PerlIO_printf(Perl_debug_log,
207e3d1a 3708 "### Saw string before '%s'\n", s);
5f80b19c 3709 } );
3280af22
NIS
3710 if (PL_expect == XOPERATOR) {
3711 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3712 PL_expect = XTERM;
a0d0e21e
LW
3713 depcom();
3714 return ','; /* grandfather non-comma-format format */
3715 }
463ee0b2 3716 else
8990e307 3717 no_op("String",s);
463ee0b2 3718 }
79072805 3719 if (!s)
85e6fe83 3720 missingterm((char*)0);
4633a7c4 3721 yylval.ival = OP_CONST;
3280af22 3722 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
63cd0674 3723 if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
4633a7c4
LW
3724 yylval.ival = OP_STRINGIFY;
3725 break;
3726 }
3727 }
79072805
LW
3728 TERM(sublex_start());
3729
3730 case '`':
09bef843 3731 s = scan_str(s,FALSE,FALSE);
4e553d73 3732 DEBUG_T( { PerlIO_printf(Perl_debug_log,
207e3d1a 3733 "### Saw backtick string before '%s'\n", s);
5f80b19c 3734 } );
3280af22 3735 if (PL_expect == XOPERATOR)
8990e307 3736 no_op("Backticks",s);
79072805 3737 if (!s)
85e6fe83 3738 missingterm((char*)0);
79072805
LW
3739 yylval.ival = OP_BACKTICK;
3740 set_csh();
3741 TERM(sublex_start());
3742
3743 case '\\':
3744 s++;
599cee73 3745 if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
9014280d 3746 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
599cee73 3747 *s, *s);
3280af22 3748 if (PL_expect == XOPERATOR)
8990e307 3749 no_op("Backslash",s);
79072805
LW
3750 OPERATOR(REFGEN);
3751
a7cb1f99 3752 case 'v':
e526c9e6 3753 if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
a7cb1f99
GS
3754 char *start = s;
3755 start++;
3756 start++;
dd629d5b 3757 while (isDIGIT(*start) || *start == '_')
a7cb1f99
GS
3758 start++;
3759 if (*start == '.' && isDIGIT(start[1])) {
b73d6f50 3760 s = scan_num(s, &yylval);
a7cb1f99
GS
3761 TERM(THING);
3762 }
e526c9e6 3763 /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6f33ba73
RGS
3764 else if (!isALPHA(*start) && (PL_expect == XTERM
3765 || PL_expect == XREF || PL_expect == XSTATE
3766 || PL_expect == XTERMORDORDOR)) {
e526c9e6
GS
3767 char c = *start;
3768 GV *gv;
3769 *start = '\0';
3770 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
3771 *start = c;
3772 if (!gv) {
b73d6f50 3773 s = scan_num(s, &yylval);
e526c9e6
GS
3774 TERM(THING);
3775 }
3776 }
a7cb1f99
GS
3777 }
3778 goto keylookup;
79072805 3779 case 'x':
3280af22 3780 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
3781 s++;
3782 Mop(OP_REPEAT);
2f3197b3 3783 }
79072805
LW
3784 goto keylookup;
3785
378cc40b 3786 case '_':
79072805
LW
3787 case 'a': case 'A':
3788 case 'b': case 'B':
3789 case 'c': case 'C':
3790 case 'd': case 'D':
3791 case 'e': case 'E':
3792 case 'f': case 'F':
3793 case 'g': case 'G':
3794 case 'h': case 'H':
3795 case 'i': case 'I':
3796 case 'j': case 'J':
3797 case 'k': case 'K':
3798 case 'l': case 'L':
3799 case 'm': case 'M':
3800 case 'n': case 'N':
3801 case 'o': case 'O':
3802 case 'p': case 'P':
3803 case 'q': case 'Q':
3804 case 'r': case 'R':
3805 case 's': case 'S':
3806 case 't': case 'T':
3807 case 'u': case 'U':
a7cb1f99 3808 case 'V':
79072805
LW
3809 case 'w': case 'W':
3810 case 'X':
3811 case 'y': case 'Y':
3812 case 'z': case 'Z':
3813
49dc05e3 3814 keylookup: {
1d239bbb 3815 orig_keyword = 0;
161b471a
NIS
3816 gv = Nullgv;
3817 gvp = 0;
49dc05e3 3818
3280af22
NIS
3819 PL_bufptr = s;
3820 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 3821
3822 /* Some keywords can be followed by any delimiter, including ':' */
155aba94
GS
3823 tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
3824 (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3825 (PL_tokenbuf[0] == 'q' &&
3826 strchr("qwxr", PL_tokenbuf[1])))));
8ebc5c01 3827
3828 /* x::* is just a word, unless x is "CORE" */
3280af22 3829 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
3830 goto just_a_word;
3831
3643fb5f 3832 d = s;
3280af22 3833 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
3834 d++; /* no comments skipped here, or s### is misparsed */
3835
3836 /* Is this a label? */
3280af22
NIS
3837 if (!tmp && PL_expect == XSTATE
3838 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
8ebc5c01 3839 s = d + 1;
3280af22 3840 yylval.pval = savepv(PL_tokenbuf);
8ebc5c01 3841 CLINE;
3842 TOKEN(LABEL);
3643fb5f
CS
3843 }
3844
3845 /* Check for keywords */
3280af22 3846 tmp = keyword(PL_tokenbuf, len);
748a9306
LW
3847
3848 /* Is this a word before a => operator? */
1c3923b3 3849 if (*d == '=' && d[1] == '>') {
748a9306 3850 CLINE;
3280af22 3851 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
748a9306 3852 yylval.opval->op_private = OPpCONST_BARE;
0064a8a9 3853 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
7948272d 3854 SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
748a9306
LW
3855 TERM(WORD);
3856 }
3857
a0d0e21e 3858 if (tmp < 0) { /* second-class keyword? */
56f7f34b
CS
3859 GV *ogv = Nullgv; /* override (winner) */
3860 GV *hgv = Nullgv; /* hidden (loser) */
3280af22 3861 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 3862 CV *cv;
3280af22 3863 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
56f7f34b
CS
3864 (cv = GvCVu(gv)))
3865 {
3866 if (GvIMPORTED_CV(gv))
3867 ogv = gv;
3868 else if (! CvMETHOD(cv))
3869 hgv = gv;
3870 }
3871 if (!ogv &&
3280af22
NIS
3872 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
3873 (gv = *gvp) != (GV*)&PL_sv_undef &&
56f7f34b
CS
3874 GvCVu(gv) && GvIMPORTED_CV(gv))
3875 {
3876 ogv = gv;
3877 }
3878 }
3879 if (ogv) {
30fe34ed 3880 orig_keyword = tmp;
56f7f34b 3881 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
3882 }
3883 else if (gv && !gvp
3884 && -tmp==KEY_lock /* XXX generalizable kludge */
d0456cad 3885 && GvCVu(gv)
3280af22 3886 && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
6e7b2336
GS
3887 {
3888 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 3889 }
56f7f34b
CS
3890 else { /* no override */
3891 tmp = -tmp;
ac206dc8 3892 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
9014280d 3893 Perl_warner(aTHX_ packWARN(WARN_MISC),
ac206dc8
RGS
3894 "dump() better written as CORE::dump()");
3895 }
56f7f34b
CS
3896 gv = Nullgv;
3897 gvp = 0;
4944e2f7
GS
3898 if (ckWARN(WARN_AMBIGUOUS) && hgv
3899 && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
9014280d 3900 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 3901 "Ambiguous call resolved as CORE::%s(), %s",
2f3ca594 3902 GvENAME(hgv), "qualify as such or use &");
49dc05e3 3903 }
a0d0e21e
LW
3904 }
3905
3906 reserved_word:
3907 switch (tmp) {
79072805
LW
3908
3909 default: /* not a keyword */
93a17b20 3910 just_a_word: {
96e4d5b1 3911 SV *sv;
ce29ac45 3912 int pkgname = 0;
3280af22 3913 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
8990e307
LW
3914
3915 /* Get the rest if it looks like a package qualifier */
3916
155aba94 3917 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
c3e0f903 3918 STRLEN morelen;
3280af22 3919 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
3920 TRUE, &morelen);
3921 if (!morelen)
cea2e8a9 3922 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 3923 *s == '\'' ? "'" : "::");
c3e0f903 3924 len += morelen;
ce29ac45 3925 pkgname = 1;
a0d0e21e 3926 }
8990e307 3927
3280af22
NIS
3928 if (PL_expect == XOPERATOR) {
3929 if (PL_bufptr == PL_linestart) {
57843af0 3930 CopLINE_dec(PL_curcop);
9014280d 3931 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 3932 CopLINE_inc(PL_curcop);
463ee0b2
LW
3933 }
3934 else
54310121 3935 no_op("Bareword",s);
463ee0b2 3936 }
8990e307 3937
c3e0f903
GS
3938 /* Look for a subroutine with this name in current package,
3939 unless name is "Foo::", in which case Foo is a bearword
3940 (and a package name). */
3941
3942 if (len > 2 &&
3280af22 3943 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 3944 {
e476b1b5 3945 if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
9014280d 3946 Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
599cee73 3947 "Bareword \"%s\" refers to nonexistent package",
3280af22 3948 PL_tokenbuf);
c3e0f903 3949 len -= 2;
3280af22 3950 PL_tokenbuf[len] = '\0';
c3e0f903
GS
3951 gv = Nullgv;
3952 gvp = 0;
3953 }
3954 else {
3955 len = 0;
3956 if (!gv)
3280af22 3957 gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
c3e0f903
GS
3958 }
3959
3960 /* if we saw a global override before, get the right name */
8990e307 3961
49dc05e3 3962 if (gvp) {
79cb57f6 3963 sv = newSVpvn("CORE::GLOBAL::",14);
3280af22 3964 sv_catpv(sv,PL_tokenbuf);
49dc05e3
GS
3965 }
3966 else
3280af22 3967 sv = newSVpv(PL_tokenbuf,0);
8990e307 3968
a0d0e21e
LW
3969 /* Presume this is going to be a bareword of some sort. */
3970
3971 CLINE;
49dc05e3 3972 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
a0d0e21e 3973 yylval.opval->op_private = OPpCONST_BARE;
8f8cf39c
JH
3974 /* UTF-8 package name? */
3975 if (UTF && !IN_BYTES &&
3976 is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
3977 SvUTF8_on(sv);
a0d0e21e 3978
c3e0f903
GS
3979 /* And if "Foo::", then that's what it certainly is. */
3980
3981 if (len)
3982 goto safe_bareword;
3983
8990e307
LW
3984 /* See if it's the indirect object for a list operator. */
3985
3280af22
NIS
3986 if (PL_oldoldbufptr &&
3987 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
3988 (PL_oldoldbufptr == PL_last_lop
3989 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 3990 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
3991 (PL_expect == XREF ||
3992 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 3993 {
748a9306
LW
3994 bool immediate_paren = *s == '(';
3995
a0d0e21e
LW
3996 /* (Now we can afford to cross potential line boundary.) */
3997 s = skipspace(s);
3998
3999 /* Two barewords in a row may indicate method call. */
4000
7e2040f0 4001 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
a0d0e21e
LW
4002 return tmp;
4003
4004 /* If not a declared subroutine, it's an indirect object. */
4005 /* (But it's an indir obj regardless for sort.) */
4006
7948272d 4007 if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
f0670693 4008 ((!gv || !GvCVu(gv)) &&
a9ef352a 4009 (PL_last_lop_op != OP_MAPSTART &&
f0670693 4010 PL_last_lop_op != OP_GREPSTART))))
a9ef352a 4011 {
3280af22 4012 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 4013 goto bareword;
93a17b20
LW
4014 }
4015 }
8990e307 4016
3280af22 4017 PL_expect = XOPERATOR;
8990e307 4018 s = skipspace(s);
1c3923b3
GS
4019
4020 /* Is this a word before a => operator? */
ce29ac45 4021 if (*s == '=' && s[1] == '>' && !pkgname) {
1c3923b3
GS
4022 CLINE;
4023 sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
0064a8a9 4024 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
7948272d 4025 SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
1c3923b3
GS
4026 TERM(WORD);
4027 }
4028
4029 /* If followed by a paren, it's certainly a subroutine. */
93a17b20 4030 if (*s == '(') {
79072805 4031 CLINE;
96e4d5b1 4032 if (gv && GvCVu(gv)) {
bf4acbe4 4033 for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
7a52d87a 4034 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
96e4d5b1 4035 s = d + 1;
4036 goto its_constant;
4037 }
4038 }
3280af22
NIS
4039 PL_nextval[PL_nexttoke].opval = yylval.opval;
4040 PL_expect = XOPERATOR;
93a17b20 4041 force_next(WORD);
c07a80fd 4042 yylval.ival = 0;
463ee0b2 4043 TOKEN('&');
79072805 4044 }
93a17b20 4045
a0d0e21e 4046 /* If followed by var or block, call it a method (unless sub) */
8990e307 4047
8ebc5c01 4048 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
3280af22
NIS
4049 PL_last_lop = PL_oldbufptr;
4050 PL_last_lop_op = OP_METHOD;
93a17b20 4051 PREBLOCK(METHOD);
463ee0b2
LW
4052 }
4053
8990e307
LW
4054 /* If followed by a bareword, see if it looks like indir obj. */
4055
30fe34ed
RGS
4056 if (!orig_keyword
4057 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
4058 && (tmp = intuit_method(s,gv)))
a0d0e21e 4059 return tmp;
93a17b20 4060
8990e307
LW
4061 /* Not a method, so call it a subroutine (if defined) */
4062
8ebc5c01 4063 if (gv && GvCVu(gv)) {
46fc3d4c 4064 CV* cv;
0453d815 4065 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
9014280d 4066 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4067 "Ambiguous use of -%s resolved as -&%s()",
3280af22 4068 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 4069 /* Check for a constant sub */
46fc3d4c 4070 cv = GvCV(gv);
96e4d5b1 4071 if ((sv = cv_const_sv(cv))) {
4072 its_constant:
4073 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4074 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4075 yylval.opval->op_private = 0;
4076 TOKEN(WORD);
89bfa8cd 4077 }
4078
a5f75d66
AD
4079 /* Resolve to GV now. */
4080 op_free(yylval.opval);
4081 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
9675f7ac 4082 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 4083 PL_last_lop = PL_oldbufptr;
bf848113 4084 PL_last_lop_op = OP_ENTERSUB;
4633a7c4
LW
4085 /* Is there a prototype? */
4086 if (SvPOK(cv)) {
4087 STRLEN len;
7a52d87a 4088 char *proto = SvPV((SV*)cv, len);
4633a7c4
LW
4089 if (!len)
4090 TERM(FUNC0SUB);
7a52d87a 4091 if (strEQ(proto, "$"))
4633a7c4 4092 OPERATOR(UNIOPSUB);
0f5d0394
AE
4093 while (*proto == ';')
4094 proto++;
7a52d87a 4095 if (*proto == '&' && *s == '{') {
c99da370
JH
4096 sv_setpv(PL_subname, PL_curstash ?
4097 "__ANON__" : "__ANON__::__ANON__");
4633a7c4
LW
4098 PREBLOCK(LSTOPSUB);
4099 }
a9ef352a 4100 }
3280af22
NIS
4101 PL_nextval[PL_nexttoke].opval = yylval.opval;
4102 PL_expect = XTERM;
8990e307
LW
4103 force_next(WORD);
4104 TOKEN(NOAMP);
4105 }
748a9306 4106
8990e307
LW
4107 /* Call it a bare word */
4108
5603f27d
GS
4109 if (PL_hints & HINT_STRICT_SUBS)
4110 yylval.opval->op_private |= OPpCONST_STRICT;
4111 else {
4112 bareword:
4113 if (ckWARN(WARN_RESERVED)) {
4114 if (lastchar != '-') {
4115 for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
238ae712 4116 if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
9014280d 4117 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
4118 PL_tokenbuf);
4119 }
748a9306
LW
4120 }
4121 }
c3e0f903
GS
4122
4123 safe_bareword:
f248d071 4124 if (lastchar && strchr("*%&", lastchar) && ckWARN_d(WARN_AMBIGUOUS)) {
9014280d 4125 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4126 "Operator or semicolon missing before %c%s",
3280af22 4127 lastchar, PL_tokenbuf);
9014280d 4128 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4129 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
4130 lastchar, lastchar);
4131 }
93a17b20 4132 TOKEN(WORD);
79072805 4133 }
79072805 4134
68dc0745 4135 case KEY___FILE__:
46fc3d4c 4136 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 4137 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 4138 TERM(THING);
4139
79072805 4140 case KEY___LINE__:
cf2093f6 4141 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 4142 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 4143 TERM(THING);
68dc0745 4144
4145 case KEY___PACKAGE__:
4146 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22
NIS
4147 (PL_curstash
4148 ? newSVsv(PL_curstname)
4149 : &PL_sv_undef));
79072805 4150 TERM(THING);
79072805 4151
e50aee73 4152 case KEY___DATA__:
79072805
LW
4153 case KEY___END__: {
4154 GV *gv;
79072805
LW
4155
4156 /*SUPPRESS 560*/
3280af22 4157 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
e50aee73 4158 char *pname = "main";
3280af22
NIS
4159 if (PL_tokenbuf[2] == 'D')
4160 pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
cea2e8a9 4161 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
a5f75d66 4162 GvMULTI_on(gv);
79072805 4163 if (!GvIO(gv))
a0d0e21e 4164 GvIOp(gv) = newIO();
3280af22 4165 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
4166#if defined(HAS_FCNTL) && defined(F_SETFD)
4167 {
3280af22 4168 int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
4169 fcntl(fd,F_SETFD,fd >= 3);
4170 }
79072805 4171#endif
fd049845 4172 /* Mark this internal pseudo-handle as clean */
4173 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3280af22 4174 if (PL_preprocess)
50952442 4175 IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
3280af22 4176 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 4177 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 4178 else
50952442 4179 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
4180#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4181 /* if the script was opened in binmode, we need to revert
53129d29 4182 * it to text mode for compatibility; but only iff it has CRs
c39cd008 4183 * XXX this is a questionable hack at best. */
53129d29
GS
4184 if (PL_bufend-PL_bufptr > 2
4185 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
4186 {
4187 Off_t loc = 0;
50952442 4188 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
4189 loc = PerlIO_tell(PL_rsfp);
4190 (void)PerlIO_seek(PL_rsfp, 0L, 0);
4191 }
2986a63f
JH
4192#ifdef NETWARE
4193 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4194#else
c39cd008 4195 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 4196#endif /* NETWARE */
1143fce0
JH
4197#ifdef PERLIO_IS_STDIO /* really? */
4198# if defined(__BORLANDC__)
cb359b41
JH
4199 /* XXX see note in do_binmode() */
4200 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
4201# endif
4202#endif
c39cd008
GS
4203 if (loc > 0)
4204 PerlIO_seek(PL_rsfp, loc, 0);
4205 }
4206 }
4207#endif
7948272d 4208#ifdef PERLIO_LAYERS
52d2e0f4
JH
4209 if (!IN_BYTES) {
4210 if (UTF)
4211 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4212 else if (PL_encoding) {
4213 SV *name;
4214 dSP;
4215 ENTER;
4216 SAVETMPS;
4217 PUSHMARK(sp);
4218 EXTEND(SP, 1);
4219 XPUSHs(PL_encoding);
4220 PUTBACK;
4221 call_method("name", G_SCALAR);
4222 SPAGAIN;
4223 name = POPs;
4224 PUTBACK;
4225 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
4226 Perl_form(aTHX_ ":encoding(%"SVf")",
4227 name));
4228 FREETMPS;
4229 LEAVE;
4230 }
4231 }
7948272d 4232#endif
3280af22 4233 PL_rsfp = Nullfp;
79072805
LW
4234 }
4235 goto fake_eof;
e929a76b 4236 }
de3bb511 4237
8990e307 4238 case KEY_AUTOLOAD:
ed6116ce 4239 case KEY_DESTROY:
79072805 4240 case KEY_BEGIN:
7d30b5c4 4241 case KEY_CHECK:
7d07dbc2 4242 case KEY_INIT:
7d30b5c4 4243 case KEY_END:
3280af22
NIS
4244 if (PL_expect == XSTATE) {
4245 s = PL_bufptr;
93a17b20 4246 goto really_sub;
79072805
LW
4247 }
4248 goto just_a_word;
4249
a0d0e21e
LW
4250 case KEY_CORE:
4251 if (*s == ':' && s[1] == ':') {
4252 s += 2;
748a9306 4253 d = s;
3280af22 4254 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6798c92b
GS
4255 if (!(tmp = keyword(PL_tokenbuf, len)))
4256 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
4257 if (tmp < 0)
4258 tmp = -tmp;
4259 goto reserved_word;
4260 }
4261 goto just_a_word;
4262
463ee0b2
LW
4263 case KEY_abs:
4264 UNI(OP_ABS);
4265
79072805
LW
4266 case KEY_alarm:
4267 UNI(OP_ALARM);
4268
4269 case KEY_accept:
a0d0e21e 4270 LOP(OP_ACCEPT,XTERM);
79072805 4271
463ee0b2
LW
4272 case KEY_and:
4273 OPERATOR(ANDOP);
4274
79072805 4275 case KEY_atan2:
a0d0e21e 4276 LOP(OP_ATAN2,XTERM);
85e6fe83 4277
79072805 4278 case KEY_bind:
a0d0e21e 4279 LOP(OP_BIND,XTERM);
79072805
LW
4280
4281 case KEY_binmode:
1c1fc3ea 4282 LOP(OP_BINMODE,XTERM);
79072805
LW
4283
4284 case KEY_bless:
a0d0e21e 4285 LOP(OP_BLESS,XTERM);
79072805
LW
4286
4287 case KEY_chop:
4288 UNI(OP_CHOP);
4289
4290 case KEY_continue:
4291 PREBLOCK(CONTINUE);
4292
4293 case KEY_chdir:
85e6fe83 4294 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
79072805
LW
4295 UNI(OP_CHDIR);
4296
4297 case KEY_close:
4298 UNI(OP_CLOSE);
4299
4300 case KEY_closedir:
4301 UNI(OP_CLOSEDIR);
4302
4303 case KEY_cmp:
4304 Eop(OP_SCMP);
4305
4306 case KEY_caller:
4307 UNI(OP_CALLER);
4308
4309 case KEY_crypt:
4310#ifdef FCRYPT
f4c556ac
GS
4311 if (!PL_cryptseen) {
4312 PL_cryptseen = TRUE;
de3bb511 4313 init_des();
f4c556ac 4314 }
a687059c 4315#endif
a0d0e21e 4316 LOP(OP_CRYPT,XTERM);
79072805
LW
4317
4318 case KEY_chmod:
a0d0e21e 4319 LOP(OP_CHMOD,XTERM);
79072805
LW
4320
4321 case KEY_chown:
a0d0e21e 4322 LOP(OP_CHOWN,XTERM);
79072805
LW
4323
4324 case KEY_connect:
a0d0e21e 4325 LOP(OP_CONNECT,XTERM);
79072805 4326
463ee0b2
LW
4327 case KEY_chr:
4328 UNI(OP_CHR);
4329
79072805
LW
4330 case KEY_cos:
4331 UNI(OP_COS);
4332
4333 case KEY_chroot:
4334 UNI(OP_CHROOT);
4335
4336 case KEY_do:
4337 s = skipspace(s);
4338 if (*s == '{')
a0d0e21e 4339 PRETERMBLOCK(DO);
79072805 4340 if (*s != '\'')
89c5585f 4341 s = force_word(s,WORD,TRUE,TRUE,FALSE);
378cc40b 4342 OPERATOR(DO);
79072805
LW
4343
4344 case KEY_die:
3280af22 4345 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 4346 LOP(OP_DIE,XTERM);
79072805
LW
4347
4348 case KEY_defined:
4349 UNI(OP_DEFINED);
4350
4351 case KEY_delete:
a0d0e21e 4352 UNI(OP_DELETE);
79072805
LW
4353
4354 case KEY_dbmopen:
a0d0e21e
LW
4355 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4356 LOP(OP_DBMOPEN,XTERM);
79072805
LW
4357
4358 case KEY_dbmclose:
4359 UNI(OP_DBMCLOSE);
4360
4361 case KEY_dump:
a0d0e21e 4362 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4363 LOOPX(OP_DUMP);
4364
4365 case KEY_else:
4366 PREBLOCK(ELSE);
4367
4368 case KEY_elsif:
57843af0 4369 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4370 OPERATOR(ELSIF);
4371
4372 case KEY_eq:
4373 Eop(OP_SEQ);
4374
a0d0e21e
LW
4375 case KEY_exists:
4376 UNI(OP_EXISTS);
4e553d73 4377
79072805
LW
4378 case KEY_exit:
4379 UNI(OP_EXIT);
4380
4381 case KEY_eval:
79072805 4382 s = skipspace(s);
3280af22 4383 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 4384 UNIBRACK(OP_ENTEREVAL);
79072805
LW
4385
4386 case KEY_eof:
4387 UNI(OP_EOF);
4388
c963b151
BD
4389 case KEY_err:
4390 OPERATOR(DOROP);
4391
79072805
LW
4392 case KEY_exp:
4393 UNI(OP_EXP);
4394
4395 case KEY_each:
4396 UNI(OP_EACH);
4397
4398 case KEY_exec:
4399 set_csh();
a0d0e21e 4400 LOP(OP_EXEC,XREF);
79072805
LW
4401
4402 case KEY_endhostent:
4403 FUN0(OP_EHOSTENT);
4404
4405 case KEY_endnetent:
4406 FUN0(OP_ENETENT);
4407
4408 case KEY_endservent:
4409 FUN0(OP_ESERVENT);
4410
4411 case KEY_endprotoent:
4412 FUN0(OP_EPROTOENT);
4413
4414 case KEY_endpwent:
4415 FUN0(OP_EPWENT);
4416
4417 case KEY_endgrent:
4418 FUN0(OP_EGRENT);
4419
4420 case KEY_for:
4421 case KEY_foreach:
57843af0 4422 yylval.ival = CopLINE(PL_curcop);
55497cff 4423 s = skipspace(s);
7e2040f0 4424 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 4425 char *p = s;
3280af22 4426 if ((PL_bufend - p) >= 3 &&
55497cff 4427 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4428 p += 2;
77ca0c92
LW
4429 else if ((PL_bufend - p) >= 4 &&
4430 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4431 p += 3;
55497cff 4432 p = skipspace(p);
7e2040f0 4433 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
4434 p = scan_ident(p, PL_bufend,
4435 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4436 p = skipspace(p);
4437 }
4438 if (*p != '$')
cea2e8a9 4439 Perl_croak(aTHX_ "Missing $ on loop variable");
55497cff 4440 }
79072805
LW
4441 OPERATOR(FOR);
4442
4443 case KEY_formline:
a0d0e21e 4444 LOP(OP_FORMLINE,XTERM);
79072805
LW
4445
4446 case KEY_fork:
4447 FUN0(OP_FORK);
4448
4449 case KEY_fcntl:
a0d0e21e 4450 LOP(OP_FCNTL,XTERM);
79072805
LW
4451
4452 case KEY_fileno:
4453 UNI(OP_FILENO);
4454
4455 case KEY_flock:
a0d0e21e 4456 LOP(OP_FLOCK,XTERM);
79072805
LW
4457
4458 case KEY_gt:
4459 Rop(OP_SGT);
4460
4461 case KEY_ge:
4462 Rop(OP_SGE);
4463
4464 case KEY_grep:
2c38e13d 4465 LOP(OP_GREPSTART, XREF);
79072805
LW
4466
4467 case KEY_goto:
a0d0e21e 4468 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4469 LOOPX(OP_GOTO);
4470
4471 case KEY_gmtime:
4472 UNI(OP_GMTIME);
4473
4474 case KEY_getc:
6f33ba73 4475 UNIDOR(OP_GETC);
79072805
LW
4476
4477 case KEY_getppid:
4478 FUN0(OP_GETPPID);
4479
4480 case KEY_getpgrp:
4481 UNI(OP_GETPGRP);
4482
4483 case KEY_getpriority:
a0d0e21e 4484 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
4485
4486 case KEY_getprotobyname:
4487 UNI(OP_GPBYNAME);
4488
4489 case KEY_getprotobynumber:
a0d0e21e 4490 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
4491
4492 case KEY_getprotoent:
4493 FUN0(OP_GPROTOENT);
4494
4495 case KEY_getpwent:
4496 FUN0(OP_GPWENT);
4497
4498 case KEY_getpwnam:
ff68c719 4499 UNI(OP_GPWNAM);
79072805
LW
4500
4501 case KEY_getpwuid:
ff68c719 4502 UNI(OP_GPWUID);
79072805
LW
4503
4504 case KEY_getpeername:
4505 UNI(OP_GETPEERNAME);
4506
4507 case KEY_gethostbyname:
4508 UNI(OP_GHBYNAME);
4509
4510 case KEY_gethostbyaddr:
a0d0e21e 4511 LOP(OP_GHBYADDR,XTERM);
79072805
LW
4512
4513 case KEY_gethostent:
4514 FUN0(OP_GHOSTENT);
4515
4516 case KEY_getnetbyname:
4517 UNI(OP_GNBYNAME);
4518
4519 case KEY_getnetbyaddr:
a0d0e21e 4520 LOP(OP_GNBYADDR,XTERM);
79072805
LW
4521
4522 case KEY_getnetent:
4523 FUN0(OP_GNETENT);
4524
4525 case KEY_getservbyname:
a0d0e21e 4526 LOP(OP_GSBYNAME,XTERM);
79072805
LW
4527
4528 case KEY_getservbyport:
a0d0e21e 4529 LOP(OP_GSBYPORT,XTERM);
79072805
LW
4530
4531 case KEY_getservent:
4532 FUN0(OP_GSERVENT);
4533
4534 case KEY_getsockname:
4535 UNI(OP_GETSOCKNAME);
4536
4537 case KEY_getsockopt:
a0d0e21e 4538 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
4539
4540 case KEY_getgrent:
4541 FUN0(OP_GGRENT);
4542
4543 case KEY_getgrnam:
ff68c719 4544 UNI(OP_GGRNAM);
79072805
LW
4545
4546 case KEY_getgrgid:
ff68c719 4547 UNI(OP_GGRGID);
79072805
LW
4548
4549 case KEY_getlogin:
4550 FUN0(OP_GETLOGIN);
4551
93a17b20 4552 case KEY_glob:
a0d0e21e
LW
4553 set_csh();
4554 LOP(OP_GLOB,XTERM);
93a17b20 4555
79072805
LW
4556 case KEY_hex:
4557 UNI(OP_HEX);
4558
4559 case KEY_if:
57843af0 4560 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4561 OPERATOR(IF);
4562
4563 case KEY_index:
a0d0e21e 4564 LOP(OP_INDEX,XTERM);
79072805
LW
4565
4566 case KEY_int:
4567 UNI(OP_INT);
4568
4569 case KEY_ioctl:
a0d0e21e 4570 LOP(OP_IOCTL,XTERM);
79072805
LW
4571
4572 case KEY_join:
a0d0e21e 4573 LOP(OP_JOIN,XTERM);
79072805
LW
4574
4575 case KEY_keys:
4576 UNI(OP_KEYS);
4577
4578 case KEY_kill:
a0d0e21e 4579 LOP(OP_KILL,XTERM);
79072805
LW
4580
4581 case KEY_last:
a0d0e21e 4582 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 4583 LOOPX(OP_LAST);
4e553d73 4584
79072805
LW
4585 case KEY_lc:
4586 UNI(OP_LC);
4587
4588 case KEY_lcfirst:
4589 UNI(OP_LCFIRST);
4590
4591 case KEY_local:
09bef843 4592 yylval.ival = 0;
79072805
LW
4593 OPERATOR(LOCAL);
4594
4595 case KEY_length:
4596 UNI(OP_LENGTH);
4597
4598 case KEY_lt:
4599 Rop(OP_SLT);
4600
4601 case KEY_le:
4602 Rop(OP_SLE);
4603
4604 case KEY_localtime:
4605 UNI(OP_LOCALTIME);
4606
4607 case KEY_log:
4608 UNI(OP_LOG);
4609
4610 case KEY_link:
a0d0e21e 4611 LOP(OP_LINK,XTERM);
79072805
LW
4612
4613 case KEY_listen:
a0d0e21e 4614 LOP(OP_LISTEN,XTERM);
79072805 4615
c0329465
MB
4616 case KEY_lock:
4617 UNI(OP_LOCK);
4618
79072805
LW
4619 case KEY_lstat:
4620 UNI(OP_LSTAT);
4621
4622 case KEY_m:
8782bef2 4623 s = scan_pat(s,OP_MATCH);
79072805
LW
4624 TERM(sublex_start());
4625
a0d0e21e 4626 case KEY_map:
2c38e13d 4627 LOP(OP_MAPSTART, XREF);
4e4e412b 4628
79072805 4629 case KEY_mkdir:
a0d0e21e 4630 LOP(OP_MKDIR,XTERM);
79072805
LW
4631
4632 case KEY_msgctl:
a0d0e21e 4633 LOP(OP_MSGCTL,XTERM);
79072805
LW
4634
4635 case KEY_msgget:
a0d0e21e 4636 LOP(OP_MSGGET,XTERM);
79072805
LW
4637
4638 case KEY_msgrcv:
a0d0e21e 4639 LOP(OP_MSGRCV,XTERM);
79072805
LW
4640
4641 case KEY_msgsnd:
a0d0e21e 4642 LOP(OP_MSGSND,XTERM);
79072805 4643
77ca0c92 4644 case KEY_our:
93a17b20 4645 case KEY_my:
77ca0c92 4646 PL_in_my = tmp;
c750a3ec 4647 s = skipspace(s);
7e2040f0 4648 if (isIDFIRST_lazy_if(s,UTF)) {
3280af22 4649 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
4650 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4651 goto really_sub;
def3634b 4652 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 4653 if (!PL_in_my_stash) {
c750a3ec 4654 char tmpbuf[1024];
3280af22
NIS
4655 PL_bufptr = s;
4656 sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
4657 yyerror(tmpbuf);
4658 }
4659 }
09bef843 4660 yylval.ival = 1;
55497cff 4661 OPERATOR(MY);
93a17b20 4662
79072805 4663 case KEY_next:
a0d0e21e 4664 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4665 LOOPX(OP_NEXT);
4666
4667 case KEY_ne:
4668 Eop(OP_SNE);
4669
a0d0e21e 4670 case KEY_no:
3280af22 4671 if (PL_expect != XSTATE)
a0d0e21e
LW
4672 yyerror("\"no\" not allowed in expression");
4673 s = force_word(s,WORD,FALSE,TRUE,FALSE);
e759cc13 4674 s = force_version(s, FALSE);
a0d0e21e
LW
4675 yylval.ival = 0;
4676 OPERATOR(USE);
4677
4678 case KEY_not:
2d2e263d
LW
4679 if (*s == '(' || (s = skipspace(s), *s == '('))
4680 FUN1(OP_NOT);
4681 else
4682 OPERATOR(NOTOP);
a0d0e21e 4683
79072805 4684 case KEY_open:
93a17b20 4685 s = skipspace(s);
7e2040f0 4686 if (isIDFIRST_lazy_if(s,UTF)) {
93a17b20 4687 char *t;
7e2040f0 4688 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
e2ab214b
DM
4689 for (t=d; *t && isSPACE(*t); t++) ;
4690 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
4691 /* [perl #16184] */
4692 && !(t[0] == '=' && t[1] == '>')
4693 ) {
9014280d 4694 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 4695 "Precedence problem: open %.*s should be open(%.*s)",
66fbe8fb
HS
4696 d - s, s, d - s, s);
4697 }
93a17b20 4698 }
a0d0e21e 4699 LOP(OP_OPEN,XTERM);
79072805 4700
463ee0b2 4701 case KEY_or:
a0d0e21e 4702 yylval.ival = OP_OR;
463ee0b2
LW
4703 OPERATOR(OROP);
4704
79072805
LW
4705 case KEY_ord:
4706 UNI(OP_ORD);
4707
4708 case KEY_oct:
4709 UNI(OP_OCT);
4710
4711 case KEY_opendir:
a0d0e21e 4712 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
4713
4714 case KEY_print:
3280af22 4715 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4716 LOP(OP_PRINT,XREF);
79072805
LW
4717
4718 case KEY_printf:
3280af22 4719 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4720 LOP(OP_PRTF,XREF);
79072805 4721
c07a80fd 4722 case KEY_prototype:
4723 UNI(OP_PROTOTYPE);
4724
79072805 4725 case KEY_push:
a0d0e21e 4726 LOP(OP_PUSH,XTERM);
79072805
LW
4727
4728 case KEY_pop:
6f33ba73 4729 UNIDOR(OP_POP);
79072805 4730
a0d0e21e 4731 case KEY_pos:
6f33ba73 4732 UNIDOR(OP_POS);
4e553d73 4733
79072805 4734 case KEY_pack:
a0d0e21e 4735 LOP(OP_PACK,XTERM);
79072805
LW
4736
4737 case KEY_package:
a0d0e21e 4738 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
4739 OPERATOR(PACKAGE);
4740
4741 case KEY_pipe:
a0d0e21e 4742 LOP(OP_PIPE_OP,XTERM);
79072805
LW
4743
4744 case KEY_q:
09bef843 4745 s = scan_str(s,FALSE,FALSE);
79072805 4746 if (!s)
85e6fe83 4747 missingterm((char*)0);
79072805
LW
4748 yylval.ival = OP_CONST;
4749 TERM(sublex_start());
4750
a0d0e21e
LW
4751 case KEY_quotemeta:
4752 UNI(OP_QUOTEMETA);
4753
8990e307 4754 case KEY_qw:
09bef843 4755 s = scan_str(s,FALSE,FALSE);
8990e307 4756 if (!s)
85e6fe83 4757 missingterm((char*)0);
8127e0e3
GS
4758 force_next(')');
4759 if (SvCUR(PL_lex_stuff)) {
4760 OP *words = Nullop;
4761 int warned = 0;
3280af22 4762 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 4763 while (len) {
7948272d 4764 SV *sv;
8127e0e3
GS
4765 for (; isSPACE(*d) && len; --len, ++d) ;
4766 if (len) {
4767 char *b = d;
e476b1b5 4768 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
4769 for (; !isSPACE(*d) && len; --len, ++d) {
4770 if (*d == ',') {
9014280d 4771 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
4772 "Possible attempt to separate words with commas");
4773 ++warned;
4774 }
4775 else if (*d == '#') {
9014280d 4776 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
4777 "Possible attempt to put comments in qw() list");
4778 ++warned;
4779 }
4780 }
4781 }
4782 else {
4783 for (; !isSPACE(*d) && len; --len, ++d) ;
4784 }
7948272d
NIS
4785 sv = newSVpvn(b, d-b);
4786 if (DO_UTF8(PL_lex_stuff))
4787 SvUTF8_on(sv);
8127e0e3 4788 words = append_elem(OP_LIST, words,
7948272d 4789 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 4790 }
4791 }
8127e0e3
GS
4792 if (words) {
4793 PL_nextval[PL_nexttoke].opval = words;
4794 force_next(THING);
4795 }
55497cff 4796 }
37fd879b 4797 if (PL_lex_stuff) {
8127e0e3 4798 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
4799 PL_lex_stuff = Nullsv;
4800 }
3280af22 4801 PL_expect = XTERM;
8127e0e3 4802 TOKEN('(');
8990e307 4803
79072805 4804 case KEY_qq:
09bef843 4805 s = scan_str(s,FALSE,FALSE);
79072805 4806 if (!s)
85e6fe83 4807 missingterm((char*)0);
a0d0e21e 4808 yylval.ival = OP_STRINGIFY;
3280af22
NIS
4809 if (SvIVX(PL_lex_stuff) == '\'')
4810 SvIVX(PL_lex_stuff) = 0; /* qq'$foo' should intepolate */
79072805
LW
4811 TERM(sublex_start());
4812
8782bef2
GB
4813 case KEY_qr:
4814 s = scan_pat(s,OP_QR);
4815 TERM(sublex_start());
4816
79072805 4817 case KEY_qx:
09bef843 4818 s = scan_str(s,FALSE,FALSE);
79072805 4819 if (!s)
85e6fe83 4820 missingterm((char*)0);
79072805
LW
4821 yylval.ival = OP_BACKTICK;
4822 set_csh();
4823 TERM(sublex_start());
4824
4825 case KEY_return:
4826 OLDLOP(OP_RETURN);
4827
4828 case KEY_require:
a7cb1f99 4829 s = skipspace(s);
e759cc13
RGS
4830 if (isDIGIT(*s)) {
4831 s = force_version(s, FALSE);
a7cb1f99 4832 }
e759cc13
RGS
4833 else if (*s != 'v' || !isDIGIT(s[1])
4834 || (s = force_version(s, TRUE), *s == 'v'))
4835 {
a7cb1f99
GS
4836 *PL_tokenbuf = '\0';
4837 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 4838 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
a7cb1f99
GS
4839 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
4840 else if (*s == '<')
4841 yyerror("<> should be quotes");
4842 }
463ee0b2 4843 UNI(OP_REQUIRE);
79072805
LW
4844
4845 case KEY_reset:
4846 UNI(OP_RESET);
4847
4848 case KEY_redo:
a0d0e21e 4849 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4850 LOOPX(OP_REDO);
4851
4852 case KEY_rename:
a0d0e21e 4853 LOP(OP_RENAME,XTERM);
79072805
LW
4854
4855 case KEY_rand:
4856 UNI(OP_RAND);
4857
4858 case KEY_rmdir:
4859 UNI(OP_RMDIR);
4860
4861 case KEY_rindex:
a0d0e21e 4862 LOP(OP_RINDEX,XTERM);
79072805
LW
4863
4864 case KEY_read:
a0d0e21e 4865 LOP(OP_READ,XTERM);
79072805
LW
4866
4867 case KEY_readdir:
4868 UNI(OP_READDIR);
4869
93a17b20
LW
4870 case KEY_readline:
4871 set_csh();
6f33ba73 4872 UNIDOR(OP_READLINE);
93a17b20
LW
4873
4874 case KEY_readpipe:
4875 set_csh();
4876 UNI(OP_BACKTICK);
4877
79072805
LW
4878 case KEY_rewinddir:
4879 UNI(OP_REWINDDIR);
4880
4881 case KEY_recv:
a0d0e21e 4882 LOP(OP_RECV,XTERM);
79072805
LW
4883
4884 case KEY_reverse:
a0d0e21e 4885 LOP(OP_REVERSE,XTERM);
79072805
LW
4886
4887 case KEY_readlink:
6f33ba73 4888 UNIDOR(OP_READLINK);
79072805
LW
4889
4890 case KEY_ref:
4891 UNI(OP_REF);
4892
4893 case KEY_s:
4894 s = scan_subst(s);
4895 if (yylval.opval)
4896 TERM(sublex_start());
4897 else
4898 TOKEN(1); /* force error */
4899
a0d0e21e
LW
4900 case KEY_chomp:
4901 UNI(OP_CHOMP);
4e553d73 4902
79072805
LW
4903 case KEY_scalar:
4904 UNI(OP_SCALAR);
4905
4906 case KEY_select:
a0d0e21e 4907 LOP(OP_SELECT,XTERM);
79072805
LW
4908
4909 case KEY_seek:
a0d0e21e 4910 LOP(OP_SEEK,XTERM);
79072805
LW
4911
4912 case KEY_semctl:
a0d0e21e 4913 LOP(OP_SEMCTL,XTERM);
79072805
LW
4914
4915 case KEY_semget:
a0d0e21e 4916 LOP(OP_SEMGET,XTERM);
79072805
LW
4917
4918 case KEY_semop:
a0d0e21e 4919 LOP(OP_SEMOP,XTERM);
79072805
LW
4920
4921 case KEY_send:
a0d0e21e 4922 LOP(OP_SEND,XTERM);
79072805
LW
4923
4924 case KEY_setpgrp:
a0d0e21e 4925 LOP(OP_SETPGRP,XTERM);
79072805
LW
4926
4927 case KEY_setpriority:
a0d0e21e 4928 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
4929
4930 case KEY_sethostent:
ff68c719 4931 UNI(OP_SHOSTENT);
79072805
LW
4932
4933 case KEY_setnetent:
ff68c719 4934 UNI(OP_SNETENT);
79072805
LW
4935
4936 case KEY_setservent:
ff68c719 4937 UNI(OP_SSERVENT);
79072805
LW
4938
4939 case KEY_setprotoent:
ff68c719 4940 UNI(OP_SPROTOENT);
79072805
LW
4941
4942 case KEY_setpwent:
4943 FUN0(OP_SPWENT);
4944
4945 case KEY_setgrent:
4946 FUN0(OP_SGRENT);
4947
4948 case KEY_seekdir:
a0d0e21e 4949 LOP(OP_SEEKDIR,XTERM);
79072805
LW
4950
4951 case KEY_setsockopt:
a0d0e21e 4952 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
4953
4954 case KEY_shift:
6f33ba73 4955 UNIDOR(OP_SHIFT);
79072805
LW
4956
4957 case KEY_shmctl:
a0d0e21e 4958 LOP(OP_SHMCTL,XTERM);
79072805
LW
4959
4960 case KEY_shmget:
a0d0e21e 4961 LOP(OP_SHMGET,XTERM);
79072805
LW
4962
4963 case KEY_shmread:
a0d0e21e 4964 LOP(OP_SHMREAD,XTERM);
79072805
LW
4965
4966 case KEY_shmwrite:
a0d0e21e 4967 LOP(OP_SHMWRITE,XTERM);
79072805
LW
4968
4969 case KEY_shutdown:
a0d0e21e 4970 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
4971
4972 case KEY_sin:
4973 UNI(OP_SIN);
4974
4975 case KEY_sleep:
4976 UNI(OP_SLEEP);
4977
4978 case KEY_socket:
a0d0e21e 4979 LOP(OP_SOCKET,XTERM);
79072805
LW
4980
4981 case KEY_socketpair:
a0d0e21e 4982 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
4983
4984 case KEY_sort:
3280af22 4985 checkcomma(s,PL_tokenbuf,"subroutine name");
79072805
LW
4986 s = skipspace(s);
4987 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 4988 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 4989 PL_expect = XTERM;
15f0808c 4990 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 4991 LOP(OP_SORT,XREF);
79072805
LW
4992
4993 case KEY_split:
a0d0e21e 4994 LOP(OP_SPLIT,XTERM);
79072805
LW
4995
4996 case KEY_sprintf:
a0d0e21e 4997 LOP(OP_SPRINTF,XTERM);
79072805
LW
4998
4999 case KEY_splice:
a0d0e21e 5000 LOP(OP_SPLICE,XTERM);
79072805
LW
5001
5002 case KEY_sqrt:
5003 UNI(OP_SQRT);
5004
5005 case KEY_srand:
5006 UNI(OP_SRAND);
5007
5008 case KEY_stat:
5009 UNI(OP_STAT);
5010
5011 case KEY_study:
79072805
LW
5012 UNI(OP_STUDY);
5013
5014 case KEY_substr:
a0d0e21e 5015 LOP(OP_SUBSTR,XTERM);
79072805
LW
5016
5017 case KEY_format:
5018 case KEY_sub:
93a17b20 5019 really_sub:
09bef843 5020 {
3280af22 5021 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 5022 SSize_t tboffset = 0;
09bef843 5023 expectation attrful;
d731386a 5024 bool have_name, have_proto, bad_proto;
09bef843
SB
5025 int key = tmp;
5026
5027 s = skipspace(s);
5028
7e2040f0 5029 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
5030 (*s == ':' && s[1] == ':'))
5031 {
5032 PL_expect = XBLOCK;
5033 attrful = XATTRBLOCK;
b1b65b59
JH
5034 /* remember buffer pos'n for later force_word */
5035 tboffset = s - PL_oldbufptr;
09bef843
SB
5036 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5037 if (strchr(tmpbuf, ':'))
5038 sv_setpv(PL_subname, tmpbuf);
5039 else {
5040 sv_setsv(PL_subname,PL_curstname);
5041 sv_catpvn(PL_subname,"::",2);
5042 sv_catpvn(PL_subname,tmpbuf,len);
5043 }
5044 s = skipspace(d);
5045 have_name = TRUE;
5046 }
463ee0b2 5047 else {
09bef843
SB
5048 if (key == KEY_my)
5049 Perl_croak(aTHX_ "Missing name in \"my sub\"");
5050 PL_expect = XTERMBLOCK;
5051 attrful = XATTRTERM;
5052 sv_setpv(PL_subname,"?");
5053 have_name = FALSE;
463ee0b2 5054 }
4633a7c4 5055
09bef843
SB
5056 if (key == KEY_format) {
5057 if (*s == '=')
5058 PL_lex_formbrack = PL_lex_brackets + 1;
5059 if (have_name)
b1b65b59
JH
5060 (void) force_word(PL_oldbufptr + tboffset, WORD,
5061 FALSE, TRUE, TRUE);
09bef843
SB
5062 OPERATOR(FORMAT);
5063 }
79072805 5064
09bef843
SB
5065 /* Look for a prototype */
5066 if (*s == '(') {
5067 char *p;
5068
5069 s = scan_str(s,FALSE,FALSE);
37fd879b 5070 if (!s)
09bef843 5071 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 5072 /* strip spaces and check for bad characters */
09bef843
SB
5073 d = SvPVX(PL_lex_stuff);
5074 tmp = 0;
d731386a 5075 bad_proto = FALSE;
09bef843 5076 for (p = d; *p; ++p) {
d37a9538 5077 if (!isSPACE(*p)) {
09bef843 5078 d[tmp++] = *p;
d37a9538
ST
5079 if (!strchr("$@%*;[]&\\", *p))
5080 bad_proto = TRUE;
5081 }
09bef843
SB
5082 }
5083 d[tmp] = '\0';
420cdfc1 5084 if (bad_proto && ckWARN(WARN_SYNTAX))
9014280d 5085 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
35c1215d
NC
5086 "Illegal character in prototype for %"SVf" : %s",
5087 PL_subname, d);
09bef843
SB
5088 SvCUR(PL_lex_stuff) = tmp;
5089 have_proto = TRUE;
68dc0745 5090
09bef843 5091 s = skipspace(s);
4633a7c4 5092 }
09bef843
SB
5093 else
5094 have_proto = FALSE;
5095
5096 if (*s == ':' && s[1] != ':')
5097 PL_expect = attrful;
8e742a20
MHM
5098 else if (*s != '{' && key == KEY_sub) {
5099 if (!have_name)
5100 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5101 else if (*s != ';')
5102 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
5103 }
09bef843
SB
5104
5105 if (have_proto) {
b1b65b59
JH
5106 PL_nextval[PL_nexttoke].opval =
5107 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
09bef843
SB
5108 PL_lex_stuff = Nullsv;
5109 force_next(THING);
68dc0745 5110 }
09bef843 5111 if (!have_name) {
c99da370
JH
5112 sv_setpv(PL_subname,
5113 PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
09bef843 5114 TOKEN(ANONSUB);
4633a7c4 5115 }
b1b65b59
JH
5116 (void) force_word(PL_oldbufptr + tboffset, WORD,
5117 FALSE, TRUE, TRUE);
09bef843
SB
5118 if (key == KEY_my)
5119 TOKEN(MYSUB);
5120 TOKEN(SUB);
4633a7c4 5121 }
79072805
LW
5122
5123 case KEY_system:
5124 set_csh();
a0d0e21e 5125 LOP(OP_SYSTEM,XREF);
79072805
LW
5126
5127 case KEY_symlink:
a0d0e21e 5128 LOP(OP_SYMLINK,XTERM);
79072805
LW
5129
5130 case KEY_syscall:
a0d0e21e 5131 LOP(OP_SYSCALL,XTERM);
79072805 5132
c07a80fd 5133 case KEY_sysopen:
5134 LOP(OP_SYSOPEN,XTERM);
5135
137443ea 5136 case KEY_sysseek:
5137 LOP(OP_SYSSEEK,XTERM);
5138
79072805 5139 case KEY_sysread:
a0d0e21e 5140 LOP(OP_SYSREAD,XTERM);
79072805
LW
5141
5142 case KEY_syswrite:
a0d0e21e 5143 LOP(OP_SYSWRITE,XTERM);
79072805
LW
5144
5145 case KEY_tr:
5146 s = scan_trans(s);
5147 TERM(sublex_start());
5148
5149 case KEY_tell:
5150 UNI(OP_TELL);
5151
5152 case KEY_telldir:
5153 UNI(OP_TELLDIR);
5154
463ee0b2 5155 case KEY_tie:
a0d0e21e 5156 LOP(OP_TIE,XTERM);
463ee0b2 5157
c07a80fd 5158 case KEY_tied:
5159 UNI(OP_TIED);
5160
79072805
LW
5161 case KEY_time:
5162 FUN0(OP_TIME);
5163
5164 case KEY_times:
5165 FUN0(OP_TMS);
5166
5167 case KEY_truncate:
a0d0e21e 5168 LOP(OP_TRUNCATE,XTERM);
79072805
LW
5169
5170 case KEY_uc:
5171 UNI(OP_UC);
5172
5173 case KEY_ucfirst:
5174 UNI(OP_UCFIRST);
5175
463ee0b2
LW
5176 case KEY_untie:
5177 UNI(OP_UNTIE);
5178
79072805 5179 case KEY_until:
57843af0 5180 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5181 OPERATOR(UNTIL);
5182
5183 case KEY_unless:
57843af0 5184 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5185 OPERATOR(UNLESS);
5186
5187 case KEY_unlink:
a0d0e21e 5188 LOP(OP_UNLINK,XTERM);
79072805
LW
5189
5190 case KEY_undef:
6f33ba73 5191 UNIDOR(OP_UNDEF);
79072805
LW
5192
5193 case KEY_unpack:
a0d0e21e 5194 LOP(OP_UNPACK,XTERM);
79072805
LW
5195
5196 case KEY_utime:
a0d0e21e 5197 LOP(OP_UTIME,XTERM);
79072805
LW
5198
5199 case KEY_umask:
6f33ba73 5200 UNIDOR(OP_UMASK);
79072805
LW
5201
5202 case KEY_unshift:
a0d0e21e
LW
5203 LOP(OP_UNSHIFT,XTERM);
5204
5205 case KEY_use:
3280af22 5206 if (PL_expect != XSTATE)
a0d0e21e 5207 yyerror("\"use\" not allowed in expression");
89bfa8cd 5208 s = skipspace(s);
a7cb1f99 5209 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
e759cc13 5210 s = force_version(s, TRUE);
a7cb1f99 5211 if (*s == ';' || (s = skipspace(s), *s == ';')) {
3280af22 5212 PL_nextval[PL_nexttoke].opval = Nullop;
89bfa8cd 5213 force_next(WORD);
5214 }
e759cc13
RGS
5215 else if (*s == 'v') {
5216 s = force_word(s,WORD,FALSE,TRUE,FALSE);
5217 s = force_version(s, FALSE);
5218 }
89bfa8cd 5219 }
5220 else {
5221 s = force_word(s,WORD,FALSE,TRUE,FALSE);
e759cc13 5222 s = force_version(s, FALSE);
89bfa8cd 5223 }
a0d0e21e
LW
5224 yylval.ival = 1;
5225 OPERATOR(USE);
79072805
LW
5226
5227 case KEY_values:
5228 UNI(OP_VALUES);
5229
5230 case KEY_vec:
a0d0e21e 5231 LOP(OP_VEC,XTERM);
79072805
LW
5232
5233 case KEY_while:
57843af0 5234 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5235 OPERATOR(WHILE);
5236
5237 case KEY_warn:
3280af22 5238 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 5239 LOP(OP_WARN,XTERM);
79072805
LW
5240
5241 case KEY_wait:
5242 FUN0(OP_WAIT);
5243
5244 case KEY_waitpid:
a0d0e21e 5245 LOP(OP_WAITPID,XTERM);
79072805
LW
5246
5247 case KEY_wantarray:
5248 FUN0(OP_WANTARRAY);
5249
5250 case KEY_write:
9d116dd7
JH
5251#ifdef EBCDIC
5252 {
df3728a2
JH
5253 char ctl_l[2];
5254 ctl_l[0] = toCTRL('L');
5255 ctl_l[1] = '\0';
9d116dd7
JH
5256 gv_fetchpv(ctl_l,TRUE, SVt_PV);
5257 }
5258#else
5259 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
5260#endif
79072805
LW
5261 UNI(OP_ENTERWRITE);
5262
5263 case KEY_x:
3280af22 5264 if (PL_expect == XOPERATOR)
79072805
LW
5265 Mop(OP_REPEAT);
5266 check_uni();
5267 goto just_a_word;
5268
a0d0e21e
LW
5269 case KEY_xor:
5270 yylval.ival = OP_XOR;
5271 OPERATOR(OROP);
5272
79072805
LW
5273 case KEY_y:
5274 s = scan_trans(s);
5275 TERM(sublex_start());
5276 }
49dc05e3 5277 }}
79072805 5278}
bf4acbe4
GS
5279#ifdef __SC__
5280#pragma segment Main
5281#endif
79072805 5282
e930465f
JH
5283static int
5284S_pending_ident(pTHX)
8eceec63
SC
5285{
5286 register char *d;
a55b55d8 5287 register I32 tmp = 0;
8eceec63
SC
5288 /* pit holds the identifier we read and pending_ident is reset */
5289 char pit = PL_pending_ident;
5290 PL_pending_ident = 0;
5291
5292 DEBUG_T({ PerlIO_printf(Perl_debug_log,
5293 "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
5294
5295 /* if we're in a my(), we can't allow dynamics here.
5296 $foo'bar has already been turned into $foo::bar, so
5297 just check for colons.
5298
5299 if it's a legal name, the OP is a PADANY.
5300 */
5301 if (PL_in_my) {
5302 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
5303 if (strchr(PL_tokenbuf,':'))
5304 yyerror(Perl_form(aTHX_ "No package name allowed for "
5305 "variable %s in \"our\"",
5306 PL_tokenbuf));
dd2155a4 5307 tmp = allocmy(PL_tokenbuf);
8eceec63
SC
5308 }
5309 else {
5310 if (strchr(PL_tokenbuf,':'))
5311 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5312
5313 yylval.opval = newOP(OP_PADANY, 0);
dd2155a4 5314 yylval.opval->op_targ = allocmy(PL_tokenbuf);
8eceec63
SC
5315 return PRIVATEREF;
5316 }
5317 }
5318
5319 /*
5320 build the ops for accesses to a my() variable.
5321
5322 Deny my($a) or my($b) in a sort block, *if* $a or $b is
5323 then used in a comparison. This catches most, but not
5324 all cases. For instance, it catches
5325 sort { my($a); $a <=> $b }
5326 but not
5327 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5328 (although why you'd do that is anyone's guess).
5329 */
5330
5331 if (!strchr(PL_tokenbuf,':')) {
8716503d
DM
5332 if (!PL_in_my)
5333 tmp = pad_findmy(PL_tokenbuf);
5334 if (tmp != NOT_IN_PAD) {
8eceec63 5335 /* might be an "our" variable" */
dd2155a4 5336 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
8eceec63 5337 /* build ops for a bareword */
dd2155a4 5338 SV *sym = newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)), 0);
8eceec63
SC
5339 sv_catpvn(sym, "::", 2);
5340 sv_catpv(sym, PL_tokenbuf+1);
5341 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5342 yylval.opval->op_private = OPpCONST_ENTERED;
5343 gv_fetchpv(SvPVX(sym),
5344 (PL_in_eval
5345 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 5346 : GV_ADDMULTI
8eceec63
SC
5347 ),
5348 ((PL_tokenbuf[0] == '$') ? SVt_PV
5349 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5350 : SVt_PVHV));
5351 return WORD;
5352 }
5353
5354 /* if it's a sort block and they're naming $a or $b */
5355 if (PL_last_lop_op == OP_SORT &&
5356 PL_tokenbuf[0] == '$' &&
5357 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5358 && !PL_tokenbuf[2])
5359 {
5360 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5361 d < PL_bufend && *d != '\n';
5362 d++)
5363 {
5364 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5365 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5366 PL_tokenbuf);
5367 }
5368 }
5369 }
5370
5371 yylval.opval = newOP(OP_PADANY, 0);
5372 yylval.opval->op_targ = tmp;
5373 return PRIVATEREF;
5374 }
5375 }
5376
5377 /*
5378 Whine if they've said @foo in a doublequoted string,
5379 and @foo isn't a variable we can find in the symbol
5380 table.
5381 */
5382 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5383 GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5384 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5385 && ckWARN(WARN_AMBIGUOUS))
5386 {
5387 /* Downgraded from fatal to warning 20000522 mjd */
9014280d 5388 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8eceec63
SC
5389 "Possible unintended interpolation of %s in string",
5390 PL_tokenbuf);
5391 }
5392 }
5393
5394 /* build ops for a bareword */
5395 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5396 yylval.opval->op_private = OPpCONST_ENTERED;
5397 gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5398 ((PL_tokenbuf[0] == '$') ? SVt_PV
5399 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5400 : SVt_PVHV));
5401 return WORD;
5402}
5403
79072805 5404I32
864dbfa3 5405Perl_keyword(pTHX_ register char *d, I32 len)
79072805
LW
5406{
5407 switch (*d) {
5408 case '_':
5409 if (d[1] == '_') {
a0d0e21e 5410 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
68dc0745 5411 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
5412 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
e50aee73 5413 if (strEQ(d,"__DATA__")) return KEY___DATA__;
79072805
LW
5414 if (strEQ(d,"__END__")) return KEY___END__;
5415 }
5416 break;
8990e307
LW
5417 case 'A':
5418 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
5419 break;
79072805 5420 case 'a':
463ee0b2
LW
5421 switch (len) {
5422 case 3:
a0d0e21e
LW
5423 if (strEQ(d,"and")) return -KEY_and;
5424 if (strEQ(d,"abs")) return -KEY_abs;
85e6fe83 5425 break;
463ee0b2 5426 case 5:
a0d0e21e
LW
5427 if (strEQ(d,"alarm")) return -KEY_alarm;
5428 if (strEQ(d,"atan2")) return -KEY_atan2;
463ee0b2
LW
5429 break;
5430 case 6:
a0d0e21e 5431 if (strEQ(d,"accept")) return -KEY_accept;
463ee0b2
LW
5432 break;
5433 }
79072805
LW
5434 break;
5435 case 'B':
5436 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
93a17b20 5437 break;
79072805 5438 case 'b':
a0d0e21e
LW
5439 if (strEQ(d,"bless")) return -KEY_bless;
5440 if (strEQ(d,"bind")) return -KEY_bind;
5441 if (strEQ(d,"binmode")) return -KEY_binmode;
5442 break;
5443 case 'C':
5444 if (strEQ(d,"CORE")) return -KEY_CORE;
7d30b5c4 5445 if (strEQ(d,"CHECK")) return KEY_CHECK;
79072805
LW
5446 break;
5447 case 'c':
5448 switch (len) {
5449 case 3:
a0d0e21e
LW
5450 if (strEQ(d,"cmp")) return -KEY_cmp;
5451 if (strEQ(d,"chr")) return -KEY_chr;
5452 if (strEQ(d,"cos")) return -KEY_cos;
79072805
LW
5453 break;
5454 case 4:
77bc9082 5455 if (strEQ(d,"chop")) return -KEY_chop;
79072805
LW
5456 break;
5457 case 5:
a0d0e21e
LW
5458 if (strEQ(d,"close")) return -KEY_close;
5459 if (strEQ(d,"chdir")) return -KEY_chdir;
77bc9082 5460 if (strEQ(d,"chomp")) return -KEY_chomp;
a0d0e21e
LW
5461 if (strEQ(d,"chmod")) return -KEY_chmod;
5462 if (strEQ(d,"chown")) return -KEY_chown;
5463 if (strEQ(d,"crypt")) return -KEY_crypt;
79072805
LW
5464 break;
5465 case 6:
a0d0e21e
LW
5466 if (strEQ(d,"chroot")) return -KEY_chroot;
5467 if (strEQ(d,"caller")) return -KEY_caller;
79072805
LW
5468 break;
5469 case 7:
a0d0e21e 5470 if (strEQ(d,"connect")) return -KEY_connect;
79072805
LW
5471 break;
5472 case 8:
a0d0e21e
LW
5473 if (strEQ(d,"closedir")) return -KEY_closedir;
5474 if (strEQ(d,"continue")) return -KEY_continue;
79072805
LW
5475 break;
5476 }
5477 break;
ed6116ce
LW
5478 case 'D':
5479 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
5480 break;
79072805
LW
5481 case 'd':
5482 switch (len) {
5483 case 2:
5484 if (strEQ(d,"do")) return KEY_do;
5485 break;
5486 case 3:
a0d0e21e 5487 if (strEQ(d,"die")) return -KEY_die;
79072805
LW
5488 break;
5489 case 4:
a0d0e21e 5490 if (strEQ(d,"dump")) return -KEY_dump;
79072805
LW
5491 break;
5492 case 6:
5493 if (strEQ(d,"delete")) return KEY_delete;
5494 break;
5495 case 7:
5496 if (strEQ(d,"defined")) return KEY_defined;
a0d0e21e 5497 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
79072805
LW
5498 break;
5499 case 8:
a0d0e21e 5500 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
79072805
LW
5501 break;
5502 }
5503 break;
5504 case 'E':
79072805
LW
5505 if (strEQ(d,"END")) return KEY_END;
5506 break;
5507 case 'e':
5508 switch (len) {
5509 case 2:
a0d0e21e 5510 if (strEQ(d,"eq")) return -KEY_eq;
79072805
LW
5511 break;
5512 case 3:
a0d0e21e 5513 if (strEQ(d,"eof")) return -KEY_eof;
c963b151 5514 if (strEQ(d,"err")) return -KEY_err;
a0d0e21e 5515 if (strEQ(d,"exp")) return -KEY_exp;
79072805
LW
5516 break;
5517 case 4:
5518 if (strEQ(d,"else")) return KEY_else;
a0d0e21e 5519 if (strEQ(d,"exit")) return -KEY_exit;
79072805 5520 if (strEQ(d,"eval")) return KEY_eval;
a0d0e21e 5521 if (strEQ(d,"exec")) return -KEY_exec;
3a6a8333 5522 if (strEQ(d,"each")) return -KEY_each;
79072805
LW
5523 break;
5524 case 5:
5525 if (strEQ(d,"elsif")) return KEY_elsif;
5526 break;
a0d0e21e
LW
5527 case 6:
5528 if (strEQ(d,"exists")) return KEY_exists;
56da5a46
RGS
5529 if (strEQ(d,"elseif") && ckWARN_d(WARN_SYNTAX))
5530 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
5531 "elseif should be elsif");
a0d0e21e 5532 break;
79072805 5533 case 8:
a0d0e21e
LW
5534 if (strEQ(d,"endgrent")) return -KEY_endgrent;
5535 if (strEQ(d,"endpwent")) return -KEY_endpwent;
79072805
LW
5536 break;
5537 case 9:
a0d0e21e 5538 if (strEQ(d,"endnetent")) return -KEY_endnetent;
79072805
LW
5539 break;
5540 case 10:
a0d0e21e
LW
5541 if (strEQ(d,"endhostent")) return -KEY_endhostent;
5542 if (strEQ(d,"endservent")) return -KEY_endservent;
79072805
LW
5543 break;
5544 case 11:
a0d0e21e 5545 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
79072805 5546 break;
a687059c 5547 }
a687059c 5548 break;
79072805
LW
5549 case 'f':
5550 switch (len) {
5551 case 3:
5552 if (strEQ(d,"for")) return KEY_for;
5553 break;
5554 case 4:
a0d0e21e 5555 if (strEQ(d,"fork")) return -KEY_fork;
79072805
LW
5556 break;
5557 case 5:
a0d0e21e
LW
5558 if (strEQ(d,"fcntl")) return -KEY_fcntl;
5559 if (strEQ(d,"flock")) return -KEY_flock;
79072805
LW
5560 break;
5561 case 6:
5562 if (strEQ(d,"format")) return KEY_format;
a0d0e21e 5563 if (strEQ(d,"fileno")) return -KEY_fileno;
79072805
LW
5564 break;
5565 case 7:
5566 if (strEQ(d,"foreach")) return KEY_foreach;
5567 break;
5568 case 8:
a0d0e21e 5569 if (strEQ(d,"formline")) return -KEY_formline;
79072805 5570 break;
378cc40b 5571 }
a687059c 5572 break;
79072805 5573 case 'g':
a687059c
LW
5574 if (strnEQ(d,"get",3)) {
5575 d += 3;
5576 if (*d == 'p') {
79072805
LW
5577 switch (len) {
5578 case 7:
a0d0e21e
LW
5579 if (strEQ(d,"ppid")) return -KEY_getppid;
5580 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
79072805
LW
5581 break;
5582 case 8:
a0d0e21e
LW
5583 if (strEQ(d,"pwent")) return -KEY_getpwent;
5584 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
5585 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
79072805
LW
5586 break;
5587 case 11:
a0d0e21e
LW
5588 if (strEQ(d,"peername")) return -KEY_getpeername;
5589 if (strEQ(d,"protoent")) return -KEY_getprotoent;
5590 if (strEQ(d,"priority")) return -KEY_getpriority;
79072805
LW
5591 break;
5592 case 14:
a0d0e21e 5593 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
79072805
LW
5594 break;
5595 case 16:
a0d0e21e 5596 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
79072805
LW
5597 break;
5598 }
a687059c
LW
5599 }
5600 else if (*d == 'h') {
a0d0e21e
LW
5601 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
5602 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
5603 if (strEQ(d,"hostent")) return -KEY_gethostent;
a687059c
LW
5604 }
5605 else if (*d == 'n') {
a0d0e21e
LW
5606 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
5607 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
5608 if (strEQ(d,"netent")) return -KEY_getnetent;
a687059c
LW
5609 }
5610 else if (*d == 's') {
a0d0e21e
LW
5611 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
5612 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
5613 if (strEQ(d,"servent")) return -KEY_getservent;
5614 if (strEQ(d,"sockname")) return -KEY_getsockname;
5615 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
a687059c
LW
5616 }
5617 else if (*d == 'g') {
a0d0e21e
LW
5618 if (strEQ(d,"grent")) return -KEY_getgrent;
5619 if (strEQ(d,"grnam")) return -KEY_getgrnam;
5620 if (strEQ(d,"grgid")) return -KEY_getgrgid;
a687059c
LW
5621 }
5622 else if (*d == 'l') {
a0d0e21e 5623 if (strEQ(d,"login")) return -KEY_getlogin;
a687059c 5624 }
a0d0e21e 5625 else if (strEQ(d,"c")) return -KEY_getc;
79072805 5626 break;
a687059c 5627 }
79072805
LW
5628 switch (len) {
5629 case 2:
a0d0e21e
LW
5630 if (strEQ(d,"gt")) return -KEY_gt;
5631 if (strEQ(d,"ge")) return -KEY_ge;
79072805
LW
5632 break;
5633 case 4:
5634 if (strEQ(d,"grep")) return KEY_grep;
5635 if (strEQ(d,"goto")) return KEY_goto;
fb73857a 5636 if (strEQ(d,"glob")) return KEY_glob;
79072805
LW
5637 break;
5638 case 6:
a0d0e21e 5639 if (strEQ(d,"gmtime")) return -KEY_gmtime;
79072805 5640 break;
378cc40b 5641 }
a687059c 5642 break;
79072805 5643 case 'h':
a0d0e21e 5644 if (strEQ(d,"hex")) return -KEY_hex;
a687059c 5645 break;
7d07dbc2
MB
5646 case 'I':
5647 if (strEQ(d,"INIT")) return KEY_INIT;
5648 break;
79072805
LW
5649 case 'i':
5650 switch (len) {
5651 case 2:
5652 if (strEQ(d,"if")) return KEY_if;
5653 break;
5654 case 3:
a0d0e21e 5655 if (strEQ(d,"int")) return -KEY_int;
79072805
LW
5656 break;
5657 case 5:
a0d0e21e
LW
5658 if (strEQ(d,"index")) return -KEY_index;
5659 if (strEQ(d,"ioctl")) return -KEY_ioctl;
79072805
LW
5660 break;
5661 }
a687059c 5662 break;
79072805 5663 case 'j':
a0d0e21e 5664 if (strEQ(d,"join")) return -KEY_join;
a687059c 5665 break;
79072805
LW
5666 case 'k':
5667 if (len == 4) {
3a6a8333 5668 if (strEQ(d,"keys")) return -KEY_keys;
a0d0e21e 5669 if (strEQ(d,"kill")) return -KEY_kill;
663a0e37 5670 }
79072805 5671 break;
79072805
LW
5672 case 'l':
5673 switch (len) {
5674 case 2:
a0d0e21e
LW
5675 if (strEQ(d,"lt")) return -KEY_lt;
5676 if (strEQ(d,"le")) return -KEY_le;
5677 if (strEQ(d,"lc")) return -KEY_lc;
79072805
LW
5678 break;
5679 case 3:
a0d0e21e 5680 if (strEQ(d,"log")) return -KEY_log;
79072805
LW
5681 break;
5682 case 4:
5683 if (strEQ(d,"last")) return KEY_last;
a0d0e21e 5684 if (strEQ(d,"link")) return -KEY_link;
c0329465 5685 if (strEQ(d,"lock")) return -KEY_lock;
395c3793 5686 break;
79072805
LW
5687 case 5:
5688 if (strEQ(d,"local")) return KEY_local;
a0d0e21e 5689 if (strEQ(d,"lstat")) return -KEY_lstat;
79072805
LW
5690 break;
5691 case 6:
a0d0e21e
LW
5692 if (strEQ(d,"length")) return -KEY_length;
5693 if (strEQ(d,"listen")) return -KEY_listen;
79072805
LW
5694 break;
5695 case 7:
a0d0e21e 5696 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
79072805
LW
5697 break;
5698 case 9:
a0d0e21e 5699 if (strEQ(d,"localtime")) return -KEY_localtime;
395c3793
LW
5700 break;
5701 }
a687059c 5702 break;
79072805
LW
5703 case 'm':
5704 switch (len) {
5705 case 1: return KEY_m;
93a17b20
LW
5706 case 2:
5707 if (strEQ(d,"my")) return KEY_my;
5708 break;
a0d0e21e
LW
5709 case 3:
5710 if (strEQ(d,"map")) return KEY_map;
5711 break;
79072805 5712 case 5:
a0d0e21e 5713 if (strEQ(d,"mkdir")) return -KEY_mkdir;
79072805
LW
5714 break;
5715 case 6:
a0d0e21e
LW
5716 if (strEQ(d,"msgctl")) return -KEY_msgctl;
5717 if (strEQ(d,"msgget")) return -KEY_msgget;
5718 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
5719 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
79072805
LW
5720 break;
5721 }
a687059c 5722 break;
79072805
LW
5723 case 'n':
5724 if (strEQ(d,"next")) return KEY_next;
a0d0e21e
LW
5725 if (strEQ(d,"ne")) return -KEY_ne;
5726 if (strEQ(d,"not")) return -KEY_not;
5727 if (strEQ(d,"no")) return KEY_no;
a687059c 5728 break;
79072805
LW
5729 case 'o':
5730 switch (len) {
463ee0b2 5731 case 2:
a0d0e21e 5732 if (strEQ(d,"or")) return -KEY_or;
463ee0b2 5733 break;
79072805 5734 case 3:
a0d0e21e
LW
5735 if (strEQ(d,"ord")) return -KEY_ord;
5736 if (strEQ(d,"oct")) return -KEY_oct;
77ca0c92 5737 if (strEQ(d,"our")) return KEY_our;
79072805
LW
5738 break;
5739 case 4:
a0d0e21e 5740 if (strEQ(d,"open")) return -KEY_open;
79072805
LW
5741 break;
5742 case 7:
a0d0e21e 5743 if (strEQ(d,"opendir")) return -KEY_opendir;
79072805 5744 break;
fe14fcc3 5745 }
a687059c 5746 break;
79072805
LW
5747 case 'p':
5748 switch (len) {
5749 case 3:
4e553d73 5750 if (strEQ(d,"pop")) return -KEY_pop;
a0d0e21e 5751 if (strEQ(d,"pos")) return KEY_pos;
79072805
LW
5752 break;
5753 case 4:
3a6a8333 5754 if (strEQ(d,"push")) return -KEY_push;
a0d0e21e
LW
5755 if (strEQ(d,"pack")) return -KEY_pack;
5756 if (strEQ(d,"pipe")) return -KEY_pipe;
79072805
LW
5757 break;
5758 case 5:
5759 if (strEQ(d,"print")) return KEY_print;
5760 break;
5761 case 6:
5762 if (strEQ(d,"printf")) return KEY_printf;
5763 break;
5764 case 7:
5765 if (strEQ(d,"package")) return KEY_package;
5766 break;
c07a80fd 5767 case 9:
5768 if (strEQ(d,"prototype")) return KEY_prototype;
663a0e37 5769 }
79072805
LW
5770 break;
5771 case 'q':
5772 if (len <= 2) {
5773 if (strEQ(d,"q")) return KEY_q;
8782bef2 5774 if (strEQ(d,"qr")) return KEY_qr;
79072805 5775 if (strEQ(d,"qq")) return KEY_qq;
8990e307 5776 if (strEQ(d,"qw")) return KEY_qw;
79072805 5777 if (strEQ(d,"qx")) return KEY_qx;
663a0e37 5778 }
a0d0e21e 5779 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
79072805
LW
5780 break;
5781 case 'r':
5782 switch (len) {
5783 case 3:
a0d0e21e 5784 if (strEQ(d,"ref")) return -KEY_ref;
79072805
LW
5785 break;
5786 case 4:
a0d0e21e
LW
5787 if (strEQ(d,"read")) return -KEY_read;
5788 if (strEQ(d,"rand")) return -KEY_rand;
5789 if (strEQ(d,"recv")) return -KEY_recv;
79072805
LW
5790 if (strEQ(d,"redo")) return KEY_redo;
5791 break;
5792 case 5:
a0d0e21e
LW
5793 if (strEQ(d,"rmdir")) return -KEY_rmdir;
5794 if (strEQ(d,"reset")) return -KEY_reset;
79072805
LW
5795 break;
5796 case 6:
5797 if (strEQ(d,"return")) return KEY_return;
a0d0e21e
LW
5798 if (strEQ(d,"rename")) return -KEY_rename;
5799 if (strEQ(d,"rindex")) return -KEY_rindex;
79072805
LW
5800 break;
5801 case 7:
ec4ab249 5802 if (strEQ(d,"require")) return KEY_require;
a0d0e21e
LW
5803 if (strEQ(d,"reverse")) return -KEY_reverse;
5804 if (strEQ(d,"readdir")) return -KEY_readdir;
79072805
LW
5805 break;
5806 case 8:
a0d0e21e
LW
5807 if (strEQ(d,"readlink")) return -KEY_readlink;
5808 if (strEQ(d,"readline")) return -KEY_readline;
5809 if (strEQ(d,"readpipe")) return -KEY_readpipe;
79072805
LW
5810 break;
5811 case 9:
a0d0e21e 5812 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
79072805 5813 break;
a687059c 5814 }
79072805
LW
5815 break;
5816 case 's':
a687059c 5817 switch (d[1]) {
79072805 5818 case 0: return KEY_s;
a687059c 5819 case 'c':
79072805 5820 if (strEQ(d,"scalar")) return KEY_scalar;
a687059c
LW
5821 break;
5822 case 'e':
79072805
LW
5823 switch (len) {
5824 case 4:
a0d0e21e
LW
5825 if (strEQ(d,"seek")) return -KEY_seek;
5826 if (strEQ(d,"send")) return -KEY_send;
79072805
LW
5827 break;
5828 case 5:
a0d0e21e 5829 if (strEQ(d,"semop")) return -KEY_semop;
79072805
LW
5830 break;
5831 case 6:
a0d0e21e
LW
5832 if (strEQ(d,"select")) return -KEY_select;
5833 if (strEQ(d,"semctl")) return -KEY_semctl;
5834 if (strEQ(d,"semget")) return -KEY_semget;
79072805
LW
5835 break;
5836 case 7:
a0d0e21e
LW
5837 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
5838 if (strEQ(d,"seekdir")) return -KEY_seekdir;
79072805
LW
5839 break;
5840 case 8:
a0d0e21e
LW
5841 if (strEQ(d,"setpwent")) return -KEY_setpwent;
5842 if (strEQ(d,"setgrent")) return -KEY_setgrent;
79072805
LW
5843 break;
5844 case 9:
a0d0e21e 5845 if (strEQ(d,"setnetent")) return -KEY_setnetent;
79072805
LW
5846 break;
5847 case 10:
a0d0e21e
LW
5848 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
5849 if (strEQ(d,"sethostent")) return -KEY_sethostent;
5850 if (strEQ(d,"setservent")) return -KEY_setservent;
79072805
LW
5851 break;
5852 case 11:
a0d0e21e
LW
5853 if (strEQ(d,"setpriority")) return -KEY_setpriority;
5854 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
79072805
LW
5855 break;
5856 }
a687059c
LW
5857 break;
5858 case 'h':
79072805
LW
5859 switch (len) {
5860 case 5:
3a6a8333 5861 if (strEQ(d,"shift")) return -KEY_shift;
79072805
LW
5862 break;
5863 case 6:
a0d0e21e
LW
5864 if (strEQ(d,"shmctl")) return -KEY_shmctl;
5865 if (strEQ(d,"shmget")) return -KEY_shmget;
79072805
LW
5866 break;
5867 case 7:
a0d0e21e 5868 if (strEQ(d,"shmread")) return -KEY_shmread;
79072805
LW
5869 break;
5870 case 8:
a0d0e21e
LW
5871 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
5872 if (strEQ(d,"shutdown")) return -KEY_shutdown;
79072805
LW
5873 break;
5874 }
a687059c
LW
5875 break;
5876 case 'i':
a0d0e21e 5877 if (strEQ(d,"sin")) return -KEY_sin;
a687059c
LW
5878 break;
5879 case 'l':
a0d0e21e 5880 if (strEQ(d,"sleep")) return -KEY_sleep;
a687059c
LW
5881 break;
5882 case 'o':
79072805 5883 if (strEQ(d,"sort")) return KEY_sort;
a0d0e21e
LW
5884 if (strEQ(d,"socket")) return -KEY_socket;
5885 if (strEQ(d,"socketpair")) return -KEY_socketpair;
a687059c
LW
5886 break;
5887 case 'p':
79072805 5888 if (strEQ(d,"split")) return KEY_split;
a0d0e21e 5889 if (strEQ(d,"sprintf")) return -KEY_sprintf;
3a6a8333 5890 if (strEQ(d,"splice")) return -KEY_splice;
a687059c
LW
5891 break;
5892 case 'q':
a0d0e21e 5893 if (strEQ(d,"sqrt")) return -KEY_sqrt;
a687059c
LW
5894 break;
5895 case 'r':
a0d0e21e 5896 if (strEQ(d,"srand")) return -KEY_srand;
a687059c
LW
5897 break;
5898 case 't':
a0d0e21e 5899 if (strEQ(d,"stat")) return -KEY_stat;
79072805 5900 if (strEQ(d,"study")) return KEY_study;
a687059c
LW
5901 break;
5902 case 'u':
a0d0e21e 5903 if (strEQ(d,"substr")) return -KEY_substr;
79072805 5904 if (strEQ(d,"sub")) return KEY_sub;
a687059c
LW
5905 break;
5906 case 'y':
79072805
LW
5907 switch (len) {
5908 case 6:
a0d0e21e 5909 if (strEQ(d,"system")) return -KEY_system;
79072805
LW
5910 break;
5911 case 7:
a0d0e21e
LW
5912 if (strEQ(d,"symlink")) return -KEY_symlink;
5913 if (strEQ(d,"syscall")) return -KEY_syscall;
137443ea 5914 if (strEQ(d,"sysopen")) return -KEY_sysopen;
5915 if (strEQ(d,"sysread")) return -KEY_sysread;
5916 if (strEQ(d,"sysseek")) return -KEY_sysseek;
79072805
LW
5917 break;
5918 case 8:
a0d0e21e 5919 if (strEQ(d,"syswrite")) return -KEY_syswrite;
79072805 5920 break;
a687059c 5921 }
a687059c
LW
5922 break;
5923 }
5924 break;
79072805
LW
5925 case 't':
5926 switch (len) {
5927 case 2:
5928 if (strEQ(d,"tr")) return KEY_tr;
5929 break;
463ee0b2
LW
5930 case 3:
5931 if (strEQ(d,"tie")) return KEY_tie;
5932 break;
79072805 5933 case 4:
a0d0e21e 5934 if (strEQ(d,"tell")) return -KEY_tell;
c07a80fd 5935 if (strEQ(d,"tied")) return KEY_tied;
a0d0e21e 5936 if (strEQ(d,"time")) return -KEY_time;
79072805
LW
5937 break;
5938 case 5:
a0d0e21e 5939 if (strEQ(d,"times")) return -KEY_times;
79072805
LW
5940 break;
5941 case 7:
a0d0e21e 5942 if (strEQ(d,"telldir")) return -KEY_telldir;
79072805
LW
5943 break;
5944 case 8:
a0d0e21e 5945 if (strEQ(d,"truncate")) return -KEY_truncate;
79072805 5946 break;
378cc40b 5947 }
a687059c 5948 break;
79072805
LW
5949 case 'u':
5950 switch (len) {
5951 case 2:
a0d0e21e
LW
5952 if (strEQ(d,"uc")) return -KEY_uc;
5953 break;
5954 case 3:
5955 if (strEQ(d,"use")) return KEY_use;
79072805
LW
5956 break;
5957 case 5:
5958 if (strEQ(d,"undef")) return KEY_undef;
5959 if (strEQ(d,"until")) return KEY_until;
463ee0b2 5960 if (strEQ(d,"untie")) return KEY_untie;
a0d0e21e
LW
5961 if (strEQ(d,"utime")) return -KEY_utime;
5962 if (strEQ(d,"umask")) return -KEY_umask;
79072805
LW
5963 break;
5964 case 6:
5965 if (strEQ(d,"unless")) return KEY_unless;
a0d0e21e
LW
5966 if (strEQ(d,"unpack")) return -KEY_unpack;
5967 if (strEQ(d,"unlink")) return -KEY_unlink;
79072805
LW
5968 break;
5969 case 7:
3a6a8333 5970 if (strEQ(d,"unshift")) return -KEY_unshift;
a0d0e21e 5971 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
79072805 5972 break;
a687059c
LW
5973 }
5974 break;
79072805 5975 case 'v':
a0d0e21e
LW
5976 if (strEQ(d,"values")) return -KEY_values;
5977 if (strEQ(d,"vec")) return -KEY_vec;
a687059c 5978 break;
79072805
LW
5979 case 'w':
5980 switch (len) {
5981 case 4:
a0d0e21e
LW
5982 if (strEQ(d,"warn")) return -KEY_warn;
5983 if (strEQ(d,"wait")) return -KEY_wait;
79072805
LW
5984 break;
5985 case 5:
5986 if (strEQ(d,"while")) return KEY_while;
a0d0e21e 5987 if (strEQ(d,"write")) return -KEY_write;
79072805
LW
5988 break;
5989 case 7:
a0d0e21e 5990 if (strEQ(d,"waitpid")) return -KEY_waitpid;
79072805
LW
5991 break;
5992 case 9:
a0d0e21e 5993 if (strEQ(d,"wantarray")) return -KEY_wantarray;
79072805 5994 break;
2f3197b3 5995 }
a687059c 5996 break;
79072805 5997 case 'x':
a0d0e21e
LW
5998 if (len == 1) return -KEY_x;
5999 if (strEQ(d,"xor")) return -KEY_xor;
a687059c 6000 break;
79072805
LW
6001 case 'y':
6002 if (len == 1) return KEY_y;
6003 break;
6004 case 'z':
a687059c
LW
6005 break;
6006 }
79072805 6007 return 0;
a687059c
LW
6008}
6009
76e3520e 6010STATIC void
cea2e8a9 6011S_checkcomma(pTHX_ register char *s, char *name, char *what)
a687059c 6012{
2f3197b3
LW
6013 char *w;
6014
d008e5eb 6015 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
6016 if (ckWARN(WARN_SYNTAX)) {
6017 int level = 1;
6018 for (w = s+2; *w && level; w++) {
6019 if (*w == '(')
6020 ++level;
6021 else if (*w == ')')
6022 --level;
6023 }
6024 if (*w)
6025 for (; *w && isSPACE(*w); w++) ;
6026 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
9014280d 6027 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 6028 "%s (...) interpreted as function",name);
d008e5eb 6029 }
2f3197b3 6030 }
3280af22 6031 while (s < PL_bufend && isSPACE(*s))
2f3197b3 6032 s++;
a687059c
LW
6033 if (*s == '(')
6034 s++;
3280af22 6035 while (s < PL_bufend && isSPACE(*s))
a687059c 6036 s++;
7e2040f0 6037 if (isIDFIRST_lazy_if(s,UTF)) {
2f3197b3 6038 w = s++;
7e2040f0 6039 while (isALNUM_lazy_if(s,UTF))
a687059c 6040 s++;
3280af22 6041 while (s < PL_bufend && isSPACE(*s))
a687059c 6042 s++;
e929a76b 6043 if (*s == ',') {
463ee0b2 6044 int kw;
e929a76b 6045 *s = '\0';
864dbfa3 6046 kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
e929a76b 6047 *s = ',';
463ee0b2 6048 if (kw)
e929a76b 6049 return;
cea2e8a9 6050 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
6051 }
6052 }
6053}
6054
423cee85
JH
6055/* Either returns sv, or mortalizes sv and returns a new SV*.
6056 Best used as sv=new_constant(..., sv, ...).
6057 If s, pv are NULL, calls subroutine with one argument,
6058 and type is used with error messages only. */
6059
b3ac6de7 6060STATIC SV *
dff6d3cd 6061S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9b0e499b 6062 const char *type)
b3ac6de7 6063{
b3ac6de7 6064 dSP;
3280af22 6065 HV *table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 6066 SV *res;
b3ac6de7
IZ
6067 SV **cvp;
6068 SV *cv, *typesv;
f0af216f 6069 const char *why1, *why2, *why3;
4e553d73 6070
f0af216f 6071 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
6072 SV *msg;
6073
f0af216f 6074 why2 = strEQ(key,"charnames")
41ab332f 6075 ? "(possibly a missing \"use charnames ...\")"
f0af216f 6076 : "";
4e553d73 6077 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
6078 (type ? type: "undef"), why2);
6079
6080 /* This is convoluted and evil ("goto considered harmful")
6081 * but I do not understand the intricacies of all the different
6082 * failure modes of %^H in here. The goal here is to make
6083 * the most probable error message user-friendly. --jhi */
6084
6085 goto msgdone;
6086
423cee85 6087 report:
4e553d73 6088 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 6089 (type ? type: "undef"), why1, why2, why3);
41ab332f 6090 msgdone:
423cee85
JH
6091 yyerror(SvPVX(msg));
6092 SvREFCNT_dec(msg);
6093 return sv;
6094 }
b3ac6de7
IZ
6095 cvp = hv_fetch(table, key, strlen(key), FALSE);
6096 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
6097 why1 = "$^H{";
6098 why2 = key;
f0af216f 6099 why3 = "} is not defined";
423cee85 6100 goto report;
b3ac6de7
IZ
6101 }
6102 sv_2mortal(sv); /* Parent created it permanently */
6103 cv = *cvp;
423cee85
JH
6104 if (!pv && s)
6105 pv = sv_2mortal(newSVpvn(s, len));
6106 if (type && pv)
6107 typesv = sv_2mortal(newSVpv(type, 0));
b3ac6de7 6108 else
423cee85 6109 typesv = &PL_sv_undef;
4e553d73 6110
e788e7d3 6111 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
6112 ENTER ;
6113 SAVETMPS;
4e553d73 6114
423cee85 6115 PUSHMARK(SP) ;
a5845cb7 6116 EXTEND(sp, 3);
423cee85
JH
6117 if (pv)
6118 PUSHs(pv);
b3ac6de7 6119 PUSHs(sv);
423cee85
JH
6120 if (pv)
6121 PUSHs(typesv);
b3ac6de7 6122 PUTBACK;
423cee85 6123 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 6124
423cee85 6125 SPAGAIN ;
4e553d73 6126
423cee85 6127 /* Check the eval first */
9b0e499b 6128 if (!PL_in_eval && SvTRUE(ERRSV)) {
423cee85
JH
6129 STRLEN n_a;
6130 sv_catpv(ERRSV, "Propagated");
6131 yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
e1f15930 6132 (void)POPs;
423cee85
JH
6133 res = SvREFCNT_inc(sv);
6134 }
6135 else {
6136 res = POPs;
e1f15930 6137 (void)SvREFCNT_inc(res);
423cee85 6138 }
4e553d73 6139
423cee85
JH
6140 PUTBACK ;
6141 FREETMPS ;
6142 LEAVE ;
b3ac6de7 6143 POPSTACK;
4e553d73 6144
b3ac6de7 6145 if (!SvOK(res)) {
423cee85
JH
6146 why1 = "Call to &{$^H{";
6147 why2 = key;
f0af216f 6148 why3 = "}} did not return a defined value";
423cee85
JH
6149 sv = res;
6150 goto report;
9b0e499b 6151 }
423cee85 6152
9b0e499b 6153 return res;
b3ac6de7 6154}
4e553d73 6155
76e3520e 6156STATIC char *
cea2e8a9 6157S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2
LW
6158{
6159 register char *d = dest;
8903cb82 6160 register char *e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 6161 for (;;) {
8903cb82 6162 if (d >= e)
cea2e8a9 6163 Perl_croak(aTHX_ ident_too_long);
834a4ddd 6164 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 6165 *d++ = *s++;
7e2040f0 6166 else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
6167 *d++ = ':';
6168 *d++ = ':';
6169 s++;
6170 }
c3e0f903 6171 else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
463ee0b2
LW
6172 *d++ = *s++;
6173 *d++ = *s++;
6174 }
fd400ab9 6175 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 6176 char *t = s + UTF8SKIP(s);
fd400ab9 6177 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
6178 t += UTF8SKIP(t);
6179 if (d + (t - s) > e)
cea2e8a9 6180 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
6181 Copy(s, d, t - s, char);
6182 d += t - s;
6183 s = t;
6184 }
463ee0b2
LW
6185 else {
6186 *d = '\0';
6187 *slp = d - dest;
6188 return s;
e929a76b 6189 }
378cc40b
LW
6190 }
6191}
6192
76e3520e 6193STATIC char *
cea2e8a9 6194S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b
LW
6195{
6196 register char *d;
8903cb82 6197 register char *e;
79072805 6198 char *bracket = 0;
748a9306 6199 char funny = *s++;
378cc40b 6200
a0d0e21e
LW
6201 if (isSPACE(*s))
6202 s = skipspace(s);
378cc40b 6203 d = dest;
8903cb82 6204 e = d + destlen - 3; /* two-character token, ending NUL */
de3bb511 6205 if (isDIGIT(*s)) {
8903cb82 6206 while (isDIGIT(*s)) {
6207 if (d >= e)
cea2e8a9 6208 Perl_croak(aTHX_ ident_too_long);
378cc40b 6209 *d++ = *s++;
8903cb82 6210 }
378cc40b
LW
6211 }
6212 else {
463ee0b2 6213 for (;;) {
8903cb82 6214 if (d >= e)
cea2e8a9 6215 Perl_croak(aTHX_ ident_too_long);
834a4ddd 6216 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 6217 *d++ = *s++;
7e2040f0 6218 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
6219 *d++ = ':';
6220 *d++ = ':';
6221 s++;
6222 }
a0d0e21e 6223 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
6224 *d++ = *s++;
6225 *d++ = *s++;
6226 }
fd400ab9 6227 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 6228 char *t = s + UTF8SKIP(s);
fd400ab9 6229 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
6230 t += UTF8SKIP(t);
6231 if (d + (t - s) > e)
cea2e8a9 6232 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
6233 Copy(s, d, t - s, char);
6234 d += t - s;
6235 s = t;
6236 }
463ee0b2
LW
6237 else
6238 break;
6239 }
378cc40b
LW
6240 }
6241 *d = '\0';
6242 d = dest;
79072805 6243 if (*d) {
3280af22
NIS
6244 if (PL_lex_state != LEX_NORMAL)
6245 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 6246 return s;
378cc40b 6247 }
748a9306 6248 if (*s == '$' && s[1] &&
7e2040f0 6249 (isALNUM_lazy_if(s+1,UTF) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
5cd24f17 6250 {
4810e5ec 6251 return s;
5cd24f17 6252 }
79072805
LW
6253 if (*s == '{') {
6254 bracket = s;
6255 s++;
6256 }
6257 else if (ck_uni)
6258 check_uni();
93a17b20 6259 if (s < send)
79072805
LW
6260 *d = *s++;
6261 d[1] = '\0';
2b92dfce 6262 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 6263 *d = toCTRL(*s);
6264 s++;
de3bb511 6265 }
79072805 6266 if (bracket) {
748a9306 6267 if (isSPACE(s[-1])) {
fa83b5b6 6268 while (s < send) {
6269 char ch = *s++;
bf4acbe4 6270 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 6271 *d = ch;
6272 break;
6273 }
6274 }
748a9306 6275 }
7e2040f0 6276 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 6277 d++;
a0ed51b3
LW
6278 if (UTF) {
6279 e = s;
155aba94 6280 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
a0ed51b3 6281 e += UTF8SKIP(e);
fd400ab9 6282 while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
a0ed51b3
LW
6283 e += UTF8SKIP(e);
6284 }
6285 Copy(s, d, e - s, char);
6286 d += e - s;
6287 s = e;
6288 }
6289 else {
2b92dfce 6290 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 6291 *d++ = *s++;
2b92dfce 6292 if (d >= e)
cea2e8a9 6293 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 6294 }
79072805 6295 *d = '\0';
bf4acbe4 6296 while (s < send && SPACE_OR_TAB(*s)) s++;
ff68c719 6297 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
599cee73 6298 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
dff6d3cd 6299 const char *brack = *s == '[' ? "[...]" : "{...}";
9014280d 6300 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 6301 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
6302 funny, dest, brack, funny, dest, brack);
6303 }
79072805 6304 bracket++;
a0be28da 6305 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
6306 return s;
6307 }
4e553d73
NIS
6308 }
6309 /* Handle extended ${^Foo} variables
2b92dfce
GS
6310 * 1999-02-27 mjd-perl-patch@plover.com */
6311 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
6312 && isALNUM(*s))
6313 {
6314 d++;
6315 while (isALNUM(*s) && d < e) {
6316 *d++ = *s++;
6317 }
6318 if (d >= e)
cea2e8a9 6319 Perl_croak(aTHX_ ident_too_long);
2b92dfce 6320 *d = '\0';
79072805
LW
6321 }
6322 if (*s == '}') {
6323 s++;
7df0d042 6324 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 6325 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
6326 PL_expect = XREF;
6327 }
748a9306
LW
6328 if (funny == '#')
6329 funny = '@';
d008e5eb 6330 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 6331 if (ckWARN(WARN_AMBIGUOUS) &&
864dbfa3 6332 (keyword(dest, d - dest) || get_cv(dest, FALSE)))
d008e5eb 6333 {
9014280d 6334 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
6335 "Ambiguous use of %c{%s} resolved to %c%s",
6336 funny, dest, funny, dest);
6337 }
6338 }
79072805
LW
6339 }
6340 else {
6341 s = bracket; /* let the parser handle it */
93a17b20 6342 *dest = '\0';
79072805
LW
6343 }
6344 }
3280af22
NIS
6345 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
6346 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
6347 return s;
6348}
6349
cea2e8a9 6350void
2b36a5a0 6351Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 6352{
bbce6d69 6353 if (ch == 'i')
a0d0e21e 6354 *pmfl |= PMf_FOLD;
a0d0e21e
LW
6355 else if (ch == 'g')
6356 *pmfl |= PMf_GLOBAL;
c90c0ff4 6357 else if (ch == 'c')
6358 *pmfl |= PMf_CONTINUE;
a0d0e21e
LW
6359 else if (ch == 'o')
6360 *pmfl |= PMf_KEEP;
6361 else if (ch == 'm')
6362 *pmfl |= PMf_MULTILINE;
6363 else if (ch == 's')
6364 *pmfl |= PMf_SINGLELINE;
6365 else if (ch == 'x')
6366 *pmfl |= PMf_EXTENDED;
6367}
378cc40b 6368
76e3520e 6369STATIC char *
cea2e8a9 6370S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 6371{
79072805
LW
6372 PMOP *pm;
6373 char *s;
378cc40b 6374
09bef843 6375 s = scan_str(start,FALSE,FALSE);
37fd879b 6376 if (!s)
cea2e8a9 6377 Perl_croak(aTHX_ "Search pattern not terminated");
bbce6d69 6378
8782bef2 6379 pm = (PMOP*)newPMOP(type, 0);
3280af22 6380 if (PL_multi_open == '?')
79072805 6381 pm->op_pmflags |= PMf_ONCE;
8782bef2
GB
6382 if(type == OP_QR) {
6383 while (*s && strchr("iomsx", *s))
6384 pmflag(&pm->op_pmflags,*s++);
6385 }
6386 else {
6387 while (*s && strchr("iogcmsx", *s))
6388 pmflag(&pm->op_pmflags,*s++);
6389 }
4ac733c9
MJD
6390 /* issue a warning if /c is specified,but /g is not */
6391 if (ckWARN(WARN_REGEXP) &&
6392 (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
6393 {
6394 Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
6395 }
6396
4633a7c4 6397 pm->op_pmpermflags = pm->op_pmflags;
bbce6d69 6398
3280af22 6399 PL_lex_op = (OP*)pm;
79072805 6400 yylval.ival = OP_MATCH;
378cc40b
LW
6401 return s;
6402}
6403
76e3520e 6404STATIC char *
cea2e8a9 6405S_scan_subst(pTHX_ char *start)
79072805 6406{
a0d0e21e 6407 register char *s;
79072805 6408 register PMOP *pm;
4fdae800 6409 I32 first_start;
79072805
LW
6410 I32 es = 0;
6411
79072805
LW
6412 yylval.ival = OP_NULL;
6413
09bef843 6414 s = scan_str(start,FALSE,FALSE);
79072805 6415
37fd879b 6416 if (!s)
cea2e8a9 6417 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 6418
3280af22 6419 if (s[-1] == PL_multi_open)
79072805
LW
6420 s--;
6421
3280af22 6422 first_start = PL_multi_start;
09bef843 6423 s = scan_str(s,FALSE,FALSE);
79072805 6424 if (!s) {
37fd879b 6425 if (PL_lex_stuff) {
3280af22 6426 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
6427 PL_lex_stuff = Nullsv;
6428 }
cea2e8a9 6429 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 6430 }
3280af22 6431 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 6432
79072805 6433 pm = (PMOP*)newPMOP(OP_SUBST, 0);
48c036b1 6434 while (*s) {
a687059c
LW
6435 if (*s == 'e') {
6436 s++;
2f3197b3 6437 es++;
a687059c 6438 }
b3eb6a9b 6439 else if (strchr("iogcmsx", *s))
a0d0e21e 6440 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
6441 else
6442 break;
378cc40b 6443 }
79072805 6444
64e578a2
MJD
6445 /* /c is not meaningful with s/// */
6446 if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
4ac733c9 6447 {
64e578a2 6448 Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
4ac733c9
MJD
6449 }
6450
79072805
LW
6451 if (es) {
6452 SV *repl;
0244c3a4
GS
6453 PL_sublex_info.super_bufptr = s;
6454 PL_sublex_info.super_bufend = PL_bufend;
6455 PL_multi_end = 0;
79072805 6456 pm->op_pmflags |= PMf_EVAL;
79cb57f6 6457 repl = newSVpvn("",0);
463ee0b2 6458 while (es-- > 0)
a0d0e21e 6459 sv_catpv(repl, es ? "eval " : "do ");
79072805 6460 sv_catpvn(repl, "{ ", 2);
3280af22 6461 sv_catsv(repl, PL_lex_repl);
79072805 6462 sv_catpvn(repl, " };", 2);
25da4f38 6463 SvEVALED_on(repl);
3280af22
NIS
6464 SvREFCNT_dec(PL_lex_repl);
6465 PL_lex_repl = repl;
378cc40b 6466 }
79072805 6467
4633a7c4 6468 pm->op_pmpermflags = pm->op_pmflags;
3280af22 6469 PL_lex_op = (OP*)pm;
79072805 6470 yylval.ival = OP_SUBST;
378cc40b
LW
6471 return s;
6472}
6473
76e3520e 6474STATIC char *
cea2e8a9 6475S_scan_trans(pTHX_ char *start)
378cc40b 6476{
a0d0e21e 6477 register char* s;
11343788 6478 OP *o;
79072805
LW
6479 short *tbl;
6480 I32 squash;
a0ed51b3 6481 I32 del;
79072805
LW
6482 I32 complement;
6483
6484 yylval.ival = OP_NULL;
6485
09bef843 6486 s = scan_str(start,FALSE,FALSE);
37fd879b 6487 if (!s)
cea2e8a9 6488 Perl_croak(aTHX_ "Transliteration pattern not terminated");
3280af22 6489 if (s[-1] == PL_multi_open)
2f3197b3
LW
6490 s--;
6491
09bef843 6492 s = scan_str(s,FALSE,FALSE);
79072805 6493 if (!s) {
37fd879b 6494 if (PL_lex_stuff) {
3280af22 6495 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
6496 PL_lex_stuff = Nullsv;
6497 }
cea2e8a9 6498 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 6499 }
79072805 6500
a0ed51b3 6501 complement = del = squash = 0;
6940069f 6502 while (strchr("cds", *s)) {
395c3793 6503 if (*s == 'c')
79072805 6504 complement = OPpTRANS_COMPLEMENT;
395c3793 6505 else if (*s == 'd')
a0ed51b3
LW
6506 del = OPpTRANS_DELETE;
6507 else if (*s == 's')
79072805 6508 squash = OPpTRANS_SQUASH;
395c3793
LW
6509 s++;
6510 }
8973db79
JH
6511
6512 New(803, tbl, complement&&!del?258:256, short);
6513 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
6514 o->op_private &= ~OPpTRANS_ALL;
6515 o->op_private |= del|squash|complement|
7948272d
NIS
6516 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
6517 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 6518
3280af22 6519 PL_lex_op = o;
79072805
LW
6520 yylval.ival = OP_TRANS;
6521 return s;
6522}
6523
76e3520e 6524STATIC char *
cea2e8a9 6525S_scan_heredoc(pTHX_ register char *s)
79072805
LW
6526{
6527 SV *herewas;
6528 I32 op_type = OP_SCALAR;
6529 I32 len;
6530 SV *tmpstr;
6531 char term;
6532 register char *d;
fc36a67e 6533 register char *e;
4633a7c4 6534 char *peek;
3280af22 6535 int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
79072805
LW
6536
6537 s += 2;
3280af22
NIS
6538 d = PL_tokenbuf;
6539 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 6540 if (!outer)
79072805 6541 *d++ = '\n';
bf4acbe4 6542 for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
4633a7c4
LW
6543 if (*peek && strchr("`'\"",*peek)) {
6544 s = peek;
79072805 6545 term = *s++;
3280af22 6546 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 6547 d += len;
3280af22 6548 if (s < PL_bufend)
79072805 6549 s++;
79072805
LW
6550 }
6551 else {
6552 if (*s == '\\')
6553 s++, term = '\'';
6554 else
6555 term = '"';
7e2040f0 6556 if (!isALNUM_lazy_if(s,UTF))
12bcd1a6 6557 deprecate_old("bare << to mean <<\"\"");
7e2040f0 6558 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 6559 if (d < e)
6560 *d++ = *s;
6561 }
6562 }
3280af22 6563 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 6564 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
6565 *d++ = '\n';
6566 *d = '\0';
3280af22 6567 len = d - PL_tokenbuf;
6a27c188 6568#ifndef PERL_STRICT_CR
f63a84b2
LW
6569 d = strchr(s, '\r');
6570 if (d) {
6571 char *olds = s;
6572 s = d;
3280af22 6573 while (s < PL_bufend) {
f63a84b2
LW
6574 if (*s == '\r') {
6575 *d++ = '\n';
6576 if (*++s == '\n')
6577 s++;
6578 }
6579 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
6580 *d++ = *s++;
6581 s++;
6582 }
6583 else
6584 *d++ = *s++;
6585 }
6586 *d = '\0';
3280af22
NIS
6587 PL_bufend = d;
6588 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
f63a84b2
LW
6589 s = olds;
6590 }
6591#endif
79072805 6592 d = "\n";
3280af22 6593 if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
79cb57f6 6594 herewas = newSVpvn(s,PL_bufend-s);
79072805 6595 else
79cb57f6 6596 s--, herewas = newSVpvn(s,d-s);
79072805 6597 s += SvCUR(herewas);
748a9306 6598
8d6dde3e 6599 tmpstr = NEWSV(87,79);
748a9306
LW
6600 sv_upgrade(tmpstr, SVt_PVIV);
6601 if (term == '\'') {
79072805 6602 op_type = OP_CONST;
748a9306
LW
6603 SvIVX(tmpstr) = -1;
6604 }
6605 else if (term == '`') {
79072805 6606 op_type = OP_BACKTICK;
748a9306
LW
6607 SvIVX(tmpstr) = '\\';
6608 }
79072805
LW
6609
6610 CLINE;
57843af0 6611 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
6612 PL_multi_open = PL_multi_close = '<';
6613 term = *PL_tokenbuf;
0244c3a4
GS
6614 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6615 char *bufptr = PL_sublex_info.super_bufptr;
6616 char *bufend = PL_sublex_info.super_bufend;
6617 char *olds = s - SvCUR(herewas);
6618 s = strchr(bufptr, '\n');
6619 if (!s)
6620 s = bufend;
6621 d = s;
6622 while (s < bufend &&
6623 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6624 if (*s++ == '\n')
57843af0 6625 CopLINE_inc(PL_curcop);
0244c3a4
GS
6626 }
6627 if (s >= bufend) {
eb160463 6628 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
6629 missingterm(PL_tokenbuf);
6630 }
6631 sv_setpvn(herewas,bufptr,d-bufptr+1);
6632 sv_setpvn(tmpstr,d+1,s-d);
6633 s += len - 1;
6634 sv_catpvn(herewas,s,bufend-s);
6635 (void)strcpy(bufptr,SvPVX(herewas));
6636
6637 s = olds;
6638 goto retval;
6639 }
6640 else if (!outer) {
79072805 6641 d = s;
3280af22
NIS
6642 while (s < PL_bufend &&
6643 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 6644 if (*s++ == '\n')
57843af0 6645 CopLINE_inc(PL_curcop);
79072805 6646 }
3280af22 6647 if (s >= PL_bufend) {
eb160463 6648 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 6649 missingterm(PL_tokenbuf);
79072805
LW
6650 }
6651 sv_setpvn(tmpstr,d+1,s-d);
6652 s += len - 1;
57843af0 6653 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 6654
3280af22
NIS
6655 sv_catpvn(herewas,s,PL_bufend-s);
6656 sv_setsv(PL_linestr,herewas);
6657 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6658 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 6659 PL_last_lop = PL_last_uni = Nullch;
79072805
LW
6660 }
6661 else
6662 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3280af22 6663 while (s >= PL_bufend) { /* multiple line string? */
fd2d0953 6664 if (!outer ||
3280af22 6665 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
eb160463 6666 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 6667 missingterm(PL_tokenbuf);
79072805 6668 }
57843af0 6669 CopLINE_inc(PL_curcop);
3280af22 6670 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 6671 PL_last_lop = PL_last_uni = Nullch;
6a27c188 6672#ifndef PERL_STRICT_CR
3280af22 6673 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
6674 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6675 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 6676 {
3280af22
NIS
6677 PL_bufend[-2] = '\n';
6678 PL_bufend--;
6679 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
f63a84b2 6680 }
3280af22
NIS
6681 else if (PL_bufend[-1] == '\r')
6682 PL_bufend[-1] = '\n';
f63a84b2 6683 }
3280af22
NIS
6684 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6685 PL_bufend[-1] = '\n';
f63a84b2 6686#endif
3280af22 6687 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
6688 SV *sv = NEWSV(88,0);
6689
93a17b20 6690 sv_upgrade(sv, SVt_PVMG);
3280af22 6691 sv_setsv(sv,PL_linestr);
0ac0412a
MJD
6692 (void)SvIOK_on(sv);
6693 SvIVX(sv) = 0;
57843af0 6694 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
79072805 6695 }
3280af22
NIS
6696 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
6697 s = PL_bufend - 1;
79072805 6698 *s = ' ';
3280af22
NIS
6699 sv_catsv(PL_linestr,herewas);
6700 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805
LW
6701 }
6702 else {
3280af22
NIS
6703 s = PL_bufend;
6704 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
6705 }
6706 }
79072805 6707 s++;
0244c3a4 6708retval:
57843af0 6709 PL_multi_end = CopLINE(PL_curcop);
79072805
LW
6710 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6711 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
463ee0b2 6712 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
79072805 6713 }
8990e307 6714 SvREFCNT_dec(herewas);
2f31ce75
JH
6715 if (!IN_BYTES) {
6716 if (UTF && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
6717 SvUTF8_on(tmpstr);
6718 else if (PL_encoding)
6719 sv_recode_to_utf8(tmpstr, PL_encoding);
6720 }
3280af22 6721 PL_lex_stuff = tmpstr;
79072805
LW
6722 yylval.ival = op_type;
6723 return s;
6724}
6725
02aa26ce
NT
6726/* scan_inputsymbol
6727 takes: current position in input buffer
6728 returns: new position in input buffer
6729 side-effects: yylval and lex_op are set.
6730
6731 This code handles:
6732
6733 <> read from ARGV
6734 <FH> read from filehandle
6735 <pkg::FH> read from package qualified filehandle
6736 <pkg'FH> read from package qualified filehandle
6737 <$fh> read from filehandle in $fh
6738 <*.h> filename glob
6739
6740*/
6741
76e3520e 6742STATIC char *
cea2e8a9 6743S_scan_inputsymbol(pTHX_ char *start)
79072805 6744{
02aa26ce 6745 register char *s = start; /* current position in buffer */
79072805 6746 register char *d;
fc36a67e 6747 register char *e;
1b420867 6748 char *end;
79072805
LW
6749 I32 len;
6750
3280af22
NIS
6751 d = PL_tokenbuf; /* start of temp holding space */
6752 e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
1b420867
GS
6753 end = strchr(s, '\n');
6754 if (!end)
6755 end = PL_bufend;
6756 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
6757
6758 /* die if we didn't have space for the contents of the <>,
1b420867 6759 or if it didn't end, or if we see a newline
02aa26ce
NT
6760 */
6761
3280af22 6762 if (len >= sizeof PL_tokenbuf)
cea2e8a9 6763 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 6764 if (s >= end)
cea2e8a9 6765 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 6766
fc36a67e 6767 s++;
02aa26ce
NT
6768
6769 /* check for <$fh>
6770 Remember, only scalar variables are interpreted as filehandles by
6771 this code. Anything more complex (e.g., <$fh{$num}>) will be
6772 treated as a glob() call.
6773 This code makes use of the fact that except for the $ at the front,
6774 a scalar variable and a filehandle look the same.
6775 */
4633a7c4 6776 if (*d == '$' && d[1]) d++;
02aa26ce
NT
6777
6778 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 6779 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 6780 d++;
02aa26ce
NT
6781
6782 /* If we've tried to read what we allow filehandles to look like, and
6783 there's still text left, then it must be a glob() and not a getline.
6784 Use scan_str to pull out the stuff between the <> and treat it
6785 as nothing more than a string.
6786 */
6787
3280af22 6788 if (d - PL_tokenbuf != len) {
79072805
LW
6789 yylval.ival = OP_GLOB;
6790 set_csh();
09bef843 6791 s = scan_str(start,FALSE,FALSE);
79072805 6792 if (!s)
cea2e8a9 6793 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
6794 return s;
6795 }
395c3793 6796 else {
9b3023bc
RGS
6797 bool readline_overriden = FALSE;
6798 GV *gv_readline = Nullgv;
6799 GV **gvp;
02aa26ce 6800 /* we're in a filehandle read situation */
3280af22 6801 d = PL_tokenbuf;
02aa26ce
NT
6802
6803 /* turn <> into <ARGV> */
79072805
LW
6804 if (!len)
6805 (void)strcpy(d,"ARGV");
02aa26ce 6806
9b3023bc 6807 /* Check whether readline() is overriden */
ba979b31
NIS
6808 if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
6809 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 6810 ||
ba979b31 6811 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
9b3023bc 6812 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
ba979b31 6813 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
6814 readline_overriden = TRUE;
6815
02aa26ce
NT
6816 /* if <$fh>, create the ops to turn the variable into a
6817 filehandle
6818 */
79072805 6819 if (*d == '$') {
a0d0e21e 6820 I32 tmp;
02aa26ce
NT
6821
6822 /* try to find it in the pad for this block, otherwise find
6823 add symbol table ops
6824 */
11343788 6825 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
dd2155a4
DM
6826 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
6827 SV *sym = sv_2mortal(
6828 newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)),0));
f558d5af
JH
6829 sv_catpvn(sym, "::", 2);
6830 sv_catpv(sym, d+1);
6831 d = SvPVX(sym);
6832 goto intro_sym;
6833 }
6834 else {
6835 OP *o = newOP(OP_PADSV, 0);
6836 o->op_targ = tmp;
9b3023bc
RGS
6837 PL_lex_op = readline_overriden
6838 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6839 append_elem(OP_LIST, o,
6840 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
6841 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 6842 }
a0d0e21e
LW
6843 }
6844 else {
f558d5af
JH
6845 GV *gv;
6846 ++d;
6847intro_sym:
6848 gv = gv_fetchpv(d,
6849 (PL_in_eval
6850 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 6851 : GV_ADDMULTI),
f558d5af 6852 SVt_PV);
9b3023bc
RGS
6853 PL_lex_op = readline_overriden
6854 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6855 append_elem(OP_LIST,
6856 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
6857 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6858 : (OP*)newUNOP(OP_READLINE, 0,
6859 newUNOP(OP_RV2SV, 0,
6860 newGVOP(OP_GV, 0, gv)));
a0d0e21e 6861 }
7c6fadd6
RGS
6862 if (!readline_overriden)
6863 PL_lex_op->op_flags |= OPf_SPECIAL;
f5284f61 6864 /* we created the ops in PL_lex_op, so make yylval.ival a null op */
79072805
LW
6865 yylval.ival = OP_NULL;
6866 }
02aa26ce
NT
6867
6868 /* If it's none of the above, it must be a literal filehandle
6869 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 6870 else {
85e6fe83 6871 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
9b3023bc
RGS
6872 PL_lex_op = readline_overriden
6873 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
6874 append_elem(OP_LIST,
6875 newGVOP(OP_GV, 0, gv),
6876 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
6877 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
79072805
LW
6878 yylval.ival = OP_NULL;
6879 }
6880 }
02aa26ce 6881
79072805
LW
6882 return s;
6883}
6884
02aa26ce
NT
6885
6886/* scan_str
6887 takes: start position in buffer
09bef843
SB
6888 keep_quoted preserve \ on the embedded delimiter(s)
6889 keep_delims preserve the delimiters around the string
02aa26ce
NT
6890 returns: position to continue reading from buffer
6891 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
6892 updates the read buffer.
6893
6894 This subroutine pulls a string out of the input. It is called for:
6895 q single quotes q(literal text)
6896 ' single quotes 'literal text'
6897 qq double quotes qq(interpolate $here please)
6898 " double quotes "interpolate $here please"
6899 qx backticks qx(/bin/ls -l)
6900 ` backticks `/bin/ls -l`
6901 qw quote words @EXPORT_OK = qw( func() $spam )
6902 m// regexp match m/this/
6903 s/// regexp substitute s/this/that/
6904 tr/// string transliterate tr/this/that/
6905 y/// string transliterate y/this/that/
6906 ($*@) sub prototypes sub foo ($)
09bef843 6907 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
6908 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
6909
6910 In most of these cases (all but <>, patterns and transliterate)
6911 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
6912 calls scan_str(). s/// makes yylex() call scan_subst() which calls
6913 scan_str(). tr/// and y/// make yylex() call scan_trans() which
6914 calls scan_str().
4e553d73 6915
02aa26ce
NT
6916 It skips whitespace before the string starts, and treats the first
6917 character as the delimiter. If the delimiter is one of ([{< then
6918 the corresponding "close" character )]}> is used as the closing
6919 delimiter. It allows quoting of delimiters, and if the string has
6920 balanced delimiters ([{<>}]) it allows nesting.
6921
37fd879b
HS
6922 On success, the SV with the resulting string is put into lex_stuff or,
6923 if that is already non-NULL, into lex_repl. The second case occurs only
6924 when parsing the RHS of the special constructs s/// and tr/// (y///).
6925 For convenience, the terminating delimiter character is stuffed into
6926 SvIVX of the SV.
02aa26ce
NT
6927*/
6928
76e3520e 6929STATIC char *
09bef843 6930S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 6931{
02aa26ce
NT
6932 SV *sv; /* scalar value: string */
6933 char *tmps; /* temp string, used for delimiter matching */
6934 register char *s = start; /* current position in the buffer */
6935 register char term; /* terminating character */
6936 register char *to; /* current position in the sv's data */
6937 I32 brackets = 1; /* bracket nesting level */
89491803 6938 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e
IH
6939 I32 termcode; /* terminating char. code */
6940 U8 termstr[UTF8_MAXLEN]; /* terminating string */
6941 STRLEN termlen; /* length of terminating string */
6942 char *last = NULL; /* last position for nesting bracket */
02aa26ce
NT
6943
6944 /* skip space before the delimiter */
fb73857a 6945 if (isSPACE(*s))
6946 s = skipspace(s);
02aa26ce
NT
6947
6948 /* mark where we are, in case we need to report errors */
79072805 6949 CLINE;
02aa26ce
NT
6950
6951 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 6952 term = *s;
220e2d4e
IH
6953 if (!UTF) {
6954 termcode = termstr[0] = term;
6955 termlen = 1;
6956 }
6957 else {
f3b9ce0f 6958 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
6959 Copy(s, termstr, termlen, U8);
6960 if (!UTF8_IS_INVARIANT(term))
6961 has_utf8 = TRUE;
6962 }
b1c7b182 6963
02aa26ce 6964 /* mark where we are */
57843af0 6965 PL_multi_start = CopLINE(PL_curcop);
3280af22 6966 PL_multi_open = term;
02aa26ce
NT
6967
6968 /* find corresponding closing delimiter */
93a17b20 6969 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
6970 termcode = termstr[0] = term = tmps[5];
6971
3280af22 6972 PL_multi_close = term;
79072805 6973
02aa26ce 6974 /* create a new SV to hold the contents. 87 is leak category, I'm
8d6dde3e
IZ
6975 assuming. 79 is the SV's initial length. What a random number. */
6976 sv = NEWSV(87,79);
ed6116ce 6977 sv_upgrade(sv, SVt_PVIV);
220e2d4e 6978 SvIVX(sv) = termcode;
a0d0e21e 6979 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
6980
6981 /* move past delimiter and try to read a complete string */
09bef843 6982 if (keep_delims)
220e2d4e
IH
6983 sv_catpvn(sv, s, termlen);
6984 s += termlen;
93a17b20 6985 for (;;) {
220e2d4e
IH
6986 if (PL_encoding && !UTF) {
6987 bool cont = TRUE;
6988
6989 while (cont) {
6990 int offset = s - SvPVX(PL_linestr);
6991 bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 6992 &offset, (char*)termstr, termlen);
220e2d4e
IH
6993 char *ns = SvPVX(PL_linestr) + offset;
6994 char *svlast = SvEND(sv) - 1;
6995
6996 for (; s < ns; s++) {
6997 if (*s == '\n' && !PL_rsfp)
6998 CopLINE_inc(PL_curcop);
6999 }
7000 if (!found)
7001 goto read_more_line;
7002 else {
7003 /* handle quoted delimiters */
52327caf 7004 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
220e2d4e
IH
7005 char *t;
7006 for (t = svlast-2; t >= SvPVX(sv) && *t == '\\';)
7007 t--;
7008 if ((svlast-1 - t) % 2) {
7009 if (!keep_quoted) {
7010 *(svlast-1) = term;
7011 *svlast = '\0';
7012 SvCUR_set(sv, SvCUR(sv) - 1);
7013 }
7014 continue;
7015 }
7016 }
7017 if (PL_multi_open == PL_multi_close) {
7018 cont = FALSE;
7019 }
7020 else {
7021 char *t, *w;
7022 if (!last)
7023 last = SvPVX(sv);
7024 for (w = t = last; t < svlast; w++, t++) {
7025 /* At here, all closes are "was quoted" one,
7026 so we don't check PL_multi_close. */
7027 if (*t == '\\') {
7028 if (!keep_quoted && *(t+1) == PL_multi_open)
7029 t++;
7030 else
7031 *w++ = *t++;
7032 }
7033 else if (*t == PL_multi_open)
7034 brackets++;
7035
7036 *w = *t;
7037 }
7038 if (w < t) {
7039 *w++ = term;
7040 *w = '\0';
7041 SvCUR_set(sv, w - SvPVX(sv));
7042 }
7043 last = w;
7044 if (--brackets <= 0)
7045 cont = FALSE;
7046 }
7047 }
7048 }
7049 if (!keep_delims) {
7050 SvCUR_set(sv, SvCUR(sv) - 1);
7051 *SvEND(sv) = '\0';
7052 }
7053 break;
7054 }
7055
02aa26ce 7056 /* extend sv if need be */
3280af22 7057 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 7058 /* set 'to' to the next character in the sv's string */
463ee0b2 7059 to = SvPVX(sv)+SvCUR(sv);
09bef843 7060
02aa26ce 7061 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
7062 if (PL_multi_open == PL_multi_close) {
7063 for (; s < PL_bufend; s++,to++) {
02aa26ce 7064 /* embedded newlines increment the current line number */
3280af22 7065 if (*s == '\n' && !PL_rsfp)
57843af0 7066 CopLINE_inc(PL_curcop);
02aa26ce 7067 /* handle quoted delimiters */
3280af22 7068 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 7069 if (!keep_quoted && s[1] == term)
a0d0e21e 7070 s++;
02aa26ce 7071 /* any other quotes are simply copied straight through */
a0d0e21e
LW
7072 else
7073 *to++ = *s++;
7074 }
02aa26ce
NT
7075 /* terminate when run out of buffer (the for() condition), or
7076 have found the terminator */
220e2d4e
IH
7077 else if (*s == term) {
7078 if (termlen == 1)
7079 break;
f3b9ce0f 7080 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
7081 break;
7082 }
63cd0674 7083 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 7084 has_utf8 = TRUE;
93a17b20
LW
7085 *to = *s;
7086 }
7087 }
02aa26ce
NT
7088
7089 /* if the terminator isn't the same as the start character (e.g.,
7090 matched brackets), we have to allow more in the quoting, and
7091 be prepared for nested brackets.
7092 */
93a17b20 7093 else {
02aa26ce 7094 /* read until we run out of string, or we find the terminator */
3280af22 7095 for (; s < PL_bufend; s++,to++) {
02aa26ce 7096 /* embedded newlines increment the line count */
3280af22 7097 if (*s == '\n' && !PL_rsfp)
57843af0 7098 CopLINE_inc(PL_curcop);
02aa26ce 7099 /* backslashes can escape the open or closing characters */
3280af22 7100 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
7101 if (!keep_quoted &&
7102 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
7103 s++;
7104 else
7105 *to++ = *s++;
7106 }
02aa26ce 7107 /* allow nested opens and closes */
3280af22 7108 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 7109 break;
3280af22 7110 else if (*s == PL_multi_open)
93a17b20 7111 brackets++;
63cd0674 7112 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 7113 has_utf8 = TRUE;
93a17b20
LW
7114 *to = *s;
7115 }
7116 }
02aa26ce 7117 /* terminate the copied string and update the sv's end-of-string */
93a17b20 7118 *to = '\0';
463ee0b2 7119 SvCUR_set(sv, to - SvPVX(sv));
93a17b20 7120
02aa26ce
NT
7121 /*
7122 * this next chunk reads more into the buffer if we're not done yet
7123 */
7124
b1c7b182
GS
7125 if (s < PL_bufend)
7126 break; /* handle case where we are done yet :-) */
79072805 7127
6a27c188 7128#ifndef PERL_STRICT_CR
f63a84b2 7129 if (to - SvPVX(sv) >= 2) {
c6f14548
GS
7130 if ((to[-2] == '\r' && to[-1] == '\n') ||
7131 (to[-2] == '\n' && to[-1] == '\r'))
7132 {
f63a84b2
LW
7133 to[-2] = '\n';
7134 to--;
7135 SvCUR_set(sv, to - SvPVX(sv));
7136 }
7137 else if (to[-1] == '\r')
7138 to[-1] = '\n';
7139 }
7140 else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
7141 to[-1] = '\n';
7142#endif
7143
220e2d4e 7144 read_more_line:
02aa26ce
NT
7145 /* if we're out of file, or a read fails, bail and reset the current
7146 line marker so we can report where the unterminated string began
7147 */
3280af22
NIS
7148 if (!PL_rsfp ||
7149 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 7150 sv_free(sv);
eb160463 7151 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
79072805
LW
7152 return Nullch;
7153 }
02aa26ce 7154 /* we read a line, so increment our line counter */
57843af0 7155 CopLINE_inc(PL_curcop);
a0ed51b3 7156
02aa26ce 7157 /* update debugger info */
3280af22 7158 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
7159 SV *sv = NEWSV(88,0);
7160
93a17b20 7161 sv_upgrade(sv, SVt_PVMG);
3280af22 7162 sv_setsv(sv,PL_linestr);
0ac0412a
MJD
7163 (void)SvIOK_on(sv);
7164 SvIVX(sv) = 0;
57843af0 7165 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
395c3793 7166 }
a0ed51b3 7167
3280af22
NIS
7168 /* having changed the buffer, we must update PL_bufend */
7169 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 7170 PL_last_lop = PL_last_uni = Nullch;
378cc40b 7171 }
4e553d73 7172
02aa26ce
NT
7173 /* at this point, we have successfully read the delimited string */
7174
220e2d4e
IH
7175 if (!PL_encoding || UTF) {
7176 if (keep_delims)
7177 sv_catpvn(sv, s, termlen);
7178 s += termlen;
7179 }
7180 if (has_utf8 || PL_encoding)
b1c7b182 7181 SvUTF8_on(sv);
d0063567 7182
57843af0 7183 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
7184
7185 /* if we allocated too much space, give some back */
93a17b20
LW
7186 if (SvCUR(sv) + 5 < SvLEN(sv)) {
7187 SvLEN_set(sv, SvCUR(sv) + 1);
463ee0b2 7188 Renew(SvPVX(sv), SvLEN(sv), char);
79072805 7189 }
02aa26ce
NT
7190
7191 /* decide whether this is the first or second quoted string we've read
7192 for this op
7193 */
4e553d73 7194
3280af22
NIS
7195 if (PL_lex_stuff)
7196 PL_lex_repl = sv;
79072805 7197 else
3280af22 7198 PL_lex_stuff = sv;
378cc40b
LW
7199 return s;
7200}
7201
02aa26ce
NT
7202/*
7203 scan_num
7204 takes: pointer to position in buffer
7205 returns: pointer to new position in buffer
7206 side-effects: builds ops for the constant in yylval.op
7207
7208 Read a number in any of the formats that Perl accepts:
7209
7fd134d9
JH
7210 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
7211 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
7212 0b[01](_?[01])*
7213 0[0-7](_?[0-7])*
7214 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 7215
3280af22 7216 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
7217 thing it reads.
7218
7219 If it reads a number without a decimal point or an exponent, it will
7220 try converting the number to an integer and see if it can do so
7221 without loss of precision.
7222*/
4e553d73 7223
378cc40b 7224char *
b73d6f50 7225Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
378cc40b 7226{
02aa26ce
NT
7227 register char *s = start; /* current position in buffer */
7228 register char *d; /* destination in temp buffer */
7229 register char *e; /* end of temp buffer */
86554af2 7230 NV nv; /* number read, as a double */
a7cb1f99 7231 SV *sv = Nullsv; /* place to put the converted number */
a86a20aa 7232 bool floatit; /* boolean: int or float? */
02aa26ce 7233 char *lastub = 0; /* position of last underbar */
fc36a67e 7234 static char number_too_long[] = "Number too long";
378cc40b 7235
02aa26ce
NT
7236 /* We use the first character to decide what type of number this is */
7237
378cc40b 7238 switch (*s) {
79072805 7239 default:
cea2e8a9 7240 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 7241
02aa26ce 7242 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 7243 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
7244 case '0':
7245 {
02aa26ce
NT
7246 /* variables:
7247 u holds the "number so far"
4f19785b
WSI
7248 shift the power of 2 of the base
7249 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
7250 overflowed was the number more than we can hold?
7251
7252 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
7253 we in octal/hex/binary?" indicator to disallow hex characters
7254 when in octal mode.
02aa26ce 7255 */
9e24b6e2
JH
7256 NV n = 0.0;
7257 UV u = 0;
79072805 7258 I32 shift;
9e24b6e2 7259 bool overflowed = FALSE;
61f33854 7260 bool just_zero = TRUE; /* just plain 0 or binary number? */
9e24b6e2
JH
7261 static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
7262 static char* bases[5] = { "", "binary", "", "octal",
7263 "hexadecimal" };
7264 static char* Bases[5] = { "", "Binary", "", "Octal",
7265 "Hexadecimal" };
7266 static char *maxima[5] = { "",
7267 "0b11111111111111111111111111111111",
7268 "",
893fe2c2 7269 "037777777777",
9e24b6e2
JH
7270 "0xffffffff" };
7271 char *base, *Base, *max;
378cc40b 7272
02aa26ce 7273 /* check for hex */
378cc40b
LW
7274 if (s[1] == 'x') {
7275 shift = 4;
7276 s += 2;
61f33854 7277 just_zero = FALSE;
4f19785b
WSI
7278 } else if (s[1] == 'b') {
7279 shift = 1;
7280 s += 2;
61f33854 7281 just_zero = FALSE;
378cc40b 7282 }
02aa26ce 7283 /* check for a decimal in disguise */
b78218b7 7284 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 7285 goto decimal;
02aa26ce 7286 /* so it must be octal */
928753ea 7287 else {
378cc40b 7288 shift = 3;
928753ea
JH
7289 s++;
7290 }
7291
7292 if (*s == '_') {
7293 if (ckWARN(WARN_SYNTAX))
9014280d 7294 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7295 "Misplaced _ in number");
7296 lastub = s++;
7297 }
9e24b6e2
JH
7298
7299 base = bases[shift];
7300 Base = Bases[shift];
7301 max = maxima[shift];
02aa26ce 7302
4f19785b 7303 /* read the rest of the number */
378cc40b 7304 for (;;) {
9e24b6e2 7305 /* x is used in the overflow test,
893fe2c2 7306 b is the digit we're adding on. */
9e24b6e2 7307 UV x, b;
55497cff 7308
378cc40b 7309 switch (*s) {
02aa26ce
NT
7310
7311 /* if we don't mention it, we're done */
378cc40b
LW
7312 default:
7313 goto out;
02aa26ce 7314
928753ea 7315 /* _ are ignored -- but warned about if consecutive */
de3bb511 7316 case '_':
928753ea 7317 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
9014280d 7318 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7319 "Misplaced _ in number");
7320 lastub = s++;
de3bb511 7321 break;
02aa26ce
NT
7322
7323 /* 8 and 9 are not octal */
378cc40b 7324 case '8': case '9':
4f19785b 7325 if (shift == 3)
cea2e8a9 7326 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 7327 /* FALL THROUGH */
02aa26ce
NT
7328
7329 /* octal digits */
4f19785b 7330 case '2': case '3': case '4':
378cc40b 7331 case '5': case '6': case '7':
4f19785b 7332 if (shift == 1)
cea2e8a9 7333 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
7334 /* FALL THROUGH */
7335
7336 case '0': case '1':
02aa26ce 7337 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 7338 goto digit;
02aa26ce
NT
7339
7340 /* hex digits */
378cc40b
LW
7341 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
7342 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 7343 /* make sure they said 0x */
378cc40b
LW
7344 if (shift != 4)
7345 goto out;
55497cff 7346 b = (*s++ & 7) + 9;
02aa26ce
NT
7347
7348 /* Prepare to put the digit we have onto the end
7349 of the number so far. We check for overflows.
7350 */
7351
55497cff 7352 digit:
61f33854 7353 just_zero = FALSE;
9e24b6e2
JH
7354 if (!overflowed) {
7355 x = u << shift; /* make room for the digit */
7356
7357 if ((x >> shift) != u
7358 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
7359 overflowed = TRUE;
7360 n = (NV) u;
767a6a26 7361 if (ckWARN_d(WARN_OVERFLOW))
9014280d 7362 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
9e24b6e2
JH
7363 "Integer overflow in %s number",
7364 base);
7365 } else
7366 u = x | b; /* add the digit to the end */
7367 }
7368 if (overflowed) {
7369 n *= nvshift[shift];
7370 /* If an NV has not enough bits in its
7371 * mantissa to represent an UV this summing of
7372 * small low-order numbers is a waste of time
7373 * (because the NV cannot preserve the
7374 * low-order bits anyway): we could just
7375 * remember when did we overflow and in the
7376 * end just multiply n by the right
7377 * amount. */
7378 n += (NV) b;
55497cff 7379 }
378cc40b
LW
7380 break;
7381 }
7382 }
02aa26ce
NT
7383
7384 /* if we get here, we had success: make a scalar value from
7385 the number.
7386 */
378cc40b 7387 out:
928753ea
JH
7388
7389 /* final misplaced underbar check */
7390 if (s[-1] == '_') {
7391 if (ckWARN(WARN_SYNTAX))
9014280d 7392 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
7393 }
7394
79072805 7395 sv = NEWSV(92,0);
9e24b6e2 7396 if (overflowed) {
767a6a26 7397 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
9014280d 7398 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
7399 "%s number > %s non-portable",
7400 Base, max);
7401 sv_setnv(sv, n);
7402 }
7403 else {
15041a67 7404#if UVSIZE > 4
767a6a26 7405 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
9014280d 7406 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
7407 "%s number > %s non-portable",
7408 Base, max);
2cc4c2dc 7409#endif
9e24b6e2
JH
7410 sv_setuv(sv, u);
7411 }
61f33854
RGS
7412 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
7413 sv = new_constant(start, s - start, "integer",
7414 sv, Nullsv, NULL);
7415 else if (PL_hints & HINT_NEW_BINARY)
b3ac6de7 7416 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
378cc40b
LW
7417 }
7418 break;
02aa26ce
NT
7419
7420 /*
7421 handle decimal numbers.
7422 we're also sent here when we read a 0 as the first digit
7423 */
378cc40b
LW
7424 case '1': case '2': case '3': case '4': case '5':
7425 case '6': case '7': case '8': case '9': case '.':
7426 decimal:
3280af22
NIS
7427 d = PL_tokenbuf;
7428 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 7429 floatit = FALSE;
02aa26ce
NT
7430
7431 /* read next group of digits and _ and copy into d */
de3bb511 7432 while (isDIGIT(*s) || *s == '_') {
4e553d73 7433 /* skip underscores, checking for misplaced ones
02aa26ce
NT
7434 if -w is on
7435 */
93a17b20 7436 if (*s == '_') {
928753ea 7437 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
9014280d 7438 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7439 "Misplaced _ in number");
7440 lastub = s++;
93a17b20 7441 }
fc36a67e 7442 else {
02aa26ce 7443 /* check for end of fixed-length buffer */
fc36a67e 7444 if (d >= e)
cea2e8a9 7445 Perl_croak(aTHX_ number_too_long);
02aa26ce 7446 /* if we're ok, copy the character */
378cc40b 7447 *d++ = *s++;
fc36a67e 7448 }
378cc40b 7449 }
02aa26ce
NT
7450
7451 /* final misplaced underbar check */
928753ea 7452 if (lastub && s == lastub + 1) {
d008e5eb 7453 if (ckWARN(WARN_SYNTAX))
9014280d 7454 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 7455 }
02aa26ce
NT
7456
7457 /* read a decimal portion if there is one. avoid
7458 3..5 being interpreted as the number 3. followed
7459 by .5
7460 */
2f3197b3 7461 if (*s == '.' && s[1] != '.') {
79072805 7462 floatit = TRUE;
378cc40b 7463 *d++ = *s++;
02aa26ce 7464
928753ea
JH
7465 if (*s == '_') {
7466 if (ckWARN(WARN_SYNTAX))
9014280d 7467 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7468 "Misplaced _ in number");
7469 lastub = s;
7470 }
7471
7472 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 7473 */
fc36a67e 7474 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 7475 /* fixed length buffer check */
fc36a67e 7476 if (d >= e)
cea2e8a9 7477 Perl_croak(aTHX_ number_too_long);
928753ea
JH
7478 if (*s == '_') {
7479 if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
9014280d 7480 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7481 "Misplaced _ in number");
7482 lastub = s;
7483 }
7484 else
fc36a67e 7485 *d++ = *s;
378cc40b 7486 }
928753ea
JH
7487 /* fractional part ending in underbar? */
7488 if (s[-1] == '_') {
7489 if (ckWARN(WARN_SYNTAX))
9014280d 7490 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
7491 "Misplaced _ in number");
7492 }
dd629d5b
GS
7493 if (*s == '.' && isDIGIT(s[1])) {
7494 /* oops, it's really a v-string, but without the "v" */
f4758303 7495 s = start;
dd629d5b
GS
7496 goto vstring;
7497 }
378cc40b 7498 }
02aa26ce
NT
7499
7500 /* read exponent part, if present */
7fd134d9 7501 if (*s && strchr("eE",*s) && strchr("+-0123456789_", s[1])) {
79072805
LW
7502 floatit = TRUE;
7503 s++;
02aa26ce
NT
7504
7505 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 7506 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 7507
7fd134d9
JH
7508 /* stray preinitial _ */
7509 if (*s == '_') {
7510 if (ckWARN(WARN_SYNTAX))
9014280d 7511 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
7512 "Misplaced _ in number");
7513 lastub = s++;
7514 }
7515
02aa26ce 7516 /* allow positive or negative exponent */
378cc40b
LW
7517 if (*s == '+' || *s == '-')
7518 *d++ = *s++;
02aa26ce 7519
7fd134d9
JH
7520 /* stray initial _ */
7521 if (*s == '_') {
7522 if (ckWARN(WARN_SYNTAX))
9014280d 7523 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
7524 "Misplaced _ in number");
7525 lastub = s++;
7526 }
7527
7fd134d9
JH
7528 /* read digits of exponent */
7529 while (isDIGIT(*s) || *s == '_') {
7530 if (isDIGIT(*s)) {
7531 if (d >= e)
7532 Perl_croak(aTHX_ number_too_long);
b3b48e3e 7533 *d++ = *s++;
7fd134d9
JH
7534 }
7535 else {
7536 if (ckWARN(WARN_SYNTAX) &&
7537 ((lastub && s == lastub + 1) ||
b3b48e3e 7538 (!isDIGIT(s[1]) && s[1] != '_')))
9014280d 7539 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9 7540 "Misplaced _ in number");
b3b48e3e 7541 lastub = s++;
7fd134d9 7542 }
7fd134d9 7543 }
378cc40b 7544 }
02aa26ce 7545
02aa26ce
NT
7546
7547 /* make an sv from the string */
79072805 7548 sv = NEWSV(92,0);
097ee67d 7549
0b7fceb9 7550 /*
58bb9ec3
NC
7551 We try to do an integer conversion first if no characters
7552 indicating "float" have been found.
0b7fceb9
MU
7553 */
7554
7555 if (!floatit) {
58bb9ec3
NC
7556 UV uv;
7557 int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
7558
7559 if (flags == IS_NUMBER_IN_UV) {
7560 if (uv <= IV_MAX)
86554af2 7561 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 7562 else
c239479b 7563 sv_setuv(sv, uv);
58bb9ec3
NC
7564 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
7565 if (uv <= (UV) IV_MIN)
7566 sv_setiv(sv, -(IV)uv);
7567 else
7568 floatit = TRUE;
7569 } else
7570 floatit = TRUE;
7571 }
0b7fceb9 7572 if (floatit) {
58bb9ec3
NC
7573 /* terminate the string */
7574 *d = '\0';
86554af2
JH
7575 nv = Atof(PL_tokenbuf);
7576 sv_setnv(sv, nv);
7577 }
86554af2 7578
b8403495
JH
7579 if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
7580 (PL_hints & HINT_NEW_INTEGER) )
4e553d73 7581 sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
b8403495
JH
7582 (floatit ? "float" : "integer"),
7583 sv, Nullsv, NULL);
378cc40b 7584 break;
0b7fceb9 7585
e312add1 7586 /* if it starts with a v, it could be a v-string */
a7cb1f99 7587 case 'v':
dd629d5b 7588vstring:
f4758303 7589 sv = NEWSV(92,5); /* preallocate storage space */
b0f01acb 7590 s = scan_vstring(s,sv);
a7cb1f99 7591 break;
79072805 7592 }
a687059c 7593
02aa26ce
NT
7594 /* make the op for the constant and return */
7595
a86a20aa 7596 if (sv)
b73d6f50 7597 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 7598 else
b73d6f50 7599 lvalp->opval = Nullop;
a687059c 7600
378cc40b
LW
7601 return s;
7602}
7603
76e3520e 7604STATIC char *
cea2e8a9 7605S_scan_formline(pTHX_ register char *s)
378cc40b 7606{
79072805 7607 register char *eol;
378cc40b 7608 register char *t;
79cb57f6 7609 SV *stuff = newSVpvn("",0);
79072805 7610 bool needargs = FALSE;
c5ee2135 7611 bool eofmt = FALSE;
378cc40b 7612
79072805 7613 while (!needargs) {
a1b95068 7614 if (*s == '.') {
79072805 7615 /*SUPPRESS 530*/
51882d45 7616#ifdef PERL_STRICT_CR
bf4acbe4 7617 for (t = s+1;SPACE_OR_TAB(*t); t++) ;
51882d45 7618#else
bf4acbe4 7619 for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
51882d45 7620#endif
c5ee2135
WL
7621 if (*t == '\n' || t == PL_bufend) {
7622 eofmt = TRUE;
79072805 7623 break;
c5ee2135 7624 }
79072805 7625 }
3280af22 7626 if (PL_in_eval && !PL_rsfp) {
a1b95068 7627 eol = memchr(s,'\n',PL_bufend-s);
0f85fab0 7628 if (!eol++)
3280af22 7629 eol = PL_bufend;
0f85fab0
LW
7630 }
7631 else
3280af22 7632 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 7633 if (*s != '#') {
a0d0e21e
LW
7634 for (t = s; t < eol; t++) {
7635 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
7636 needargs = FALSE;
7637 goto enough; /* ~~ must be first line in formline */
378cc40b 7638 }
a0d0e21e
LW
7639 if (*t == '@' || *t == '^')
7640 needargs = TRUE;
378cc40b 7641 }
7121b347
MG
7642 if (eol > s) {
7643 sv_catpvn(stuff, s, eol-s);
2dc4c65b 7644#ifndef PERL_STRICT_CR
7121b347
MG
7645 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
7646 char *end = SvPVX(stuff) + SvCUR(stuff);
7647 end[-2] = '\n';
7648 end[-1] = '\0';
7649 SvCUR(stuff)--;
7650 }
2dc4c65b 7651#endif
7121b347
MG
7652 }
7653 else
7654 break;
79072805
LW
7655 }
7656 s = eol;
3280af22
NIS
7657 if (PL_rsfp) {
7658 s = filter_gets(PL_linestr, PL_rsfp, 0);
7659 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
7660 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
207e3d1a 7661 PL_last_lop = PL_last_uni = Nullch;
79072805 7662 if (!s) {
3280af22 7663 s = PL_bufptr;
378cc40b
LW
7664 break;
7665 }
378cc40b 7666 }
463ee0b2 7667 incline(s);
79072805 7668 }
a0d0e21e
LW
7669 enough:
7670 if (SvCUR(stuff)) {
3280af22 7671 PL_expect = XTERM;
79072805 7672 if (needargs) {
3280af22
NIS
7673 PL_lex_state = LEX_NORMAL;
7674 PL_nextval[PL_nexttoke].ival = 0;
79072805
LW
7675 force_next(',');
7676 }
a0d0e21e 7677 else
3280af22 7678 PL_lex_state = LEX_FORMLINE;
1bd51a4c
IH
7679 if (!IN_BYTES) {
7680 if (UTF && is_utf8_string((U8*)SvPVX(stuff), SvCUR(stuff)))
7681 SvUTF8_on(stuff);
7682 else if (PL_encoding)
7683 sv_recode_to_utf8(stuff, PL_encoding);
7684 }
3280af22 7685 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 7686 force_next(THING);
3280af22 7687 PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
79072805 7688 force_next(LSTOP);
378cc40b 7689 }
79072805 7690 else {
8990e307 7691 SvREFCNT_dec(stuff);
c5ee2135
WL
7692 if (eofmt)
7693 PL_lex_formbrack = 0;
3280af22 7694 PL_bufptr = s;
79072805
LW
7695 }
7696 return s;
378cc40b 7697}
a687059c 7698
76e3520e 7699STATIC void
cea2e8a9 7700S_set_csh(pTHX)
a687059c 7701{
ae986130 7702#ifdef CSH
3280af22
NIS
7703 if (!PL_cshlen)
7704 PL_cshlen = strlen(PL_cshname);
ae986130 7705#endif
a687059c 7706}
463ee0b2 7707
ba6d6ac9 7708I32
864dbfa3 7709Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 7710{
3280af22
NIS
7711 I32 oldsavestack_ix = PL_savestack_ix;
7712 CV* outsidecv = PL_compcv;
8990e307 7713
3280af22
NIS
7714 if (PL_compcv) {
7715 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 7716 }
7766f137 7717 SAVEI32(PL_subline);
3280af22 7718 save_item(PL_subname);
3280af22 7719 SAVESPTR(PL_compcv);
3280af22
NIS
7720
7721 PL_compcv = (CV*)NEWSV(1104,0);
7722 sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7723 CvFLAGS(PL_compcv) |= flags;
7724
57843af0 7725 PL_subline = CopLINE(PL_curcop);
dd2155a4 7726 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
3280af22 7727 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
a3985cdc 7728 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 7729
8990e307
LW
7730 return oldsavestack_ix;
7731}
7732
084592ab
CN
7733#ifdef __SC__
7734#pragma segment Perl_yylex
7735#endif
8990e307 7736int
864dbfa3 7737Perl_yywarn(pTHX_ char *s)
8990e307 7738{
faef0170 7739 PL_in_eval |= EVAL_WARNONLY;
748a9306 7740 yyerror(s);
faef0170 7741 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 7742 return 0;
8990e307
LW
7743}
7744
7745int
864dbfa3 7746Perl_yyerror(pTHX_ char *s)
463ee0b2 7747{
68dc0745 7748 char *where = NULL;
7749 char *context = NULL;
7750 int contlen = -1;
46fc3d4c 7751 SV *msg;
463ee0b2 7752
3280af22 7753 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 7754 where = "at EOF";
3280af22
NIS
7755 else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7756 PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
f355267c
JH
7757 /*
7758 Only for NetWare:
7759 The code below is removed for NetWare because it abends/crashes on NetWare
7760 when the script has error such as not having the closing quotes like:
7761 if ($var eq "value)
7762 Checking of white spaces is anyway done in NetWare code.
7763 */
7764#ifndef NETWARE
3280af22
NIS
7765 while (isSPACE(*PL_oldoldbufptr))
7766 PL_oldoldbufptr++;
f355267c 7767#endif
3280af22
NIS
7768 context = PL_oldoldbufptr;
7769 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 7770 }
3280af22
NIS
7771 else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7772 PL_oldbufptr != PL_bufptr) {
f355267c
JH
7773 /*
7774 Only for NetWare:
7775 The code below is removed for NetWare because it abends/crashes on NetWare
7776 when the script has error such as not having the closing quotes like:
7777 if ($var eq "value)
7778 Checking of white spaces is anyway done in NetWare code.
7779 */
7780#ifndef NETWARE
3280af22
NIS
7781 while (isSPACE(*PL_oldbufptr))
7782 PL_oldbufptr++;
f355267c 7783#endif
3280af22
NIS
7784 context = PL_oldbufptr;
7785 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
7786 }
7787 else if (yychar > 255)
68dc0745 7788 where = "next token ???";
12fbd33b 7789 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
7790 if (PL_lex_state == LEX_NORMAL ||
7791 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 7792 where = "at end of line";
3280af22 7793 else if (PL_lex_inpat)
68dc0745 7794 where = "within pattern";
463ee0b2 7795 else
68dc0745 7796 where = "within string";
463ee0b2 7797 }
46fc3d4c 7798 else {
79cb57f6 7799 SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
46fc3d4c 7800 if (yychar < 32)
cea2e8a9 7801 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
46fc3d4c 7802 else if (isPRINT_LC(yychar))
cea2e8a9 7803 Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
463ee0b2 7804 else
cea2e8a9 7805 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
46fc3d4c 7806 where = SvPVX(where_sv);
463ee0b2 7807 }
46fc3d4c 7808 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 7809 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 7810 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 7811 if (context)
cea2e8a9 7812 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 7813 else
cea2e8a9 7814 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 7815 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 7816 Perl_sv_catpvf(aTHX_ msg,
57def98f 7817 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 7818 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 7819 PL_multi_end = 0;
a0d0e21e 7820 }
56da5a46
RGS
7821 if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
7822 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
463ee0b2 7823 else
5a844595 7824 qerror(msg);
c7d6bfb2
GS
7825 if (PL_error_count >= 10) {
7826 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 7827 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
248c2a4d 7828 ERRSV, OutCopFILE(PL_curcop));
c7d6bfb2
GS
7829 else
7830 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 7831 OutCopFILE(PL_curcop));
c7d6bfb2 7832 }
3280af22
NIS
7833 PL_in_my = 0;
7834 PL_in_my_stash = Nullhv;
463ee0b2
LW
7835 return 0;
7836}
084592ab
CN
7837#ifdef __SC__
7838#pragma segment Main
7839#endif
4e35701f 7840
b250498f 7841STATIC char*
3ae08724 7842S_swallow_bom(pTHX_ U8 *s)
01ec43d0 7843{
b250498f
GS
7844 STRLEN slen;
7845 slen = SvCUR(PL_linestr);
7aa207d6 7846 switch (s[0]) {
4e553d73
NIS
7847 case 0xFF:
7848 if (s[1] == 0xFE) {
7aa207d6 7849 /* UTF-16 little-endian? (or UTF32-LE?) */
3ae08724 7850 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
7aa207d6 7851 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
01ec43d0 7852#ifndef PERL_NO_UTF16_FILTER
7aa207d6 7853 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
3ae08724 7854 s += 2;
7aa207d6 7855 utf16le:
dea0fc0b
JH
7856 if (PL_bufend > (char*)s) {
7857 U8 *news;
7858 I32 newlen;
7859
7860 filter_add(utf16rev_textfilter, NULL);
7861 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7aa207d6
JH
7862 PL_bufend =
7863 (char*)utf16_to_utf8_reversed(s, news,
7864 PL_bufend - (char*)s - 1,
7865 &newlen);
7866 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 7867 Safefree(news);
7aa207d6
JH
7868 SvUTF8_on(PL_linestr);
7869 s = (U8*)SvPVX(PL_linestr);
7870 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 7871 }
b250498f 7872#else
7aa207d6 7873 Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
b250498f 7874#endif
01ec43d0
GS
7875 }
7876 break;
78ae23f5 7877 case 0xFE:
7aa207d6 7878 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 7879#ifndef PERL_NO_UTF16_FILTER
7aa207d6 7880 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b 7881 s += 2;
7aa207d6 7882 utf16be:
dea0fc0b
JH
7883 if (PL_bufend > (char *)s) {
7884 U8 *news;
7885 I32 newlen;
7886
7887 filter_add(utf16_textfilter, NULL);
7888 New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
7aa207d6
JH
7889 PL_bufend =
7890 (char*)utf16_to_utf8(s, news,
7891 PL_bufend - (char*)s,
7892 &newlen);
7893 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 7894 Safefree(news);
7aa207d6
JH
7895 SvUTF8_on(PL_linestr);
7896 s = (U8*)SvPVX(PL_linestr);
7897 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 7898 }
b250498f 7899#else
7aa207d6 7900 Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
b250498f 7901#endif
01ec43d0
GS
7902 }
7903 break;
3ae08724
GS
7904 case 0xEF:
7905 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 7906 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
7907 s += 3; /* UTF-8 */
7908 }
7909 break;
7910 case 0:
7aa207d6
JH
7911 if (slen > 3) {
7912 if (s[1] == 0) {
7913 if (s[2] == 0xFE && s[3] == 0xFF) {
7914 /* UTF-32 big-endian */
7915 Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
7916 }
7917 }
7918 else if (s[2] == 0 && s[3] != 0) {
7919 /* Leading bytes
7920 * 00 xx 00 xx
7921 * are a good indicator of UTF-16BE. */
7922 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
7923 goto utf16be;
7924 }
01ec43d0 7925 }
7aa207d6
JH
7926 default:
7927 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
7928 /* Leading bytes
7929 * xx 00 xx 00
7930 * are a good indicator of UTF-16LE. */
7931 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
7932 goto utf16le;
7933 }
01ec43d0 7934 }
b8f84bb2 7935 return (char*)s;
b250498f 7936}
4755096e 7937
4755096e
GS
7938/*
7939 * restore_rsfp
7940 * Restore a source filter.
7941 */
7942
7943static void
acfe0abc 7944restore_rsfp(pTHX_ void *f)
4755096e
GS
7945{
7946 PerlIO *fp = (PerlIO*)f;
7947
7948 if (PL_rsfp == PerlIO_stdin())
7949 PerlIO_clearerr(PL_rsfp);
7950 else if (PL_rsfp && (PL_rsfp != fp))
7951 PerlIO_close(PL_rsfp);
7952 PL_rsfp = fp;
7953}
6e3aabd6
GS
7954
7955#ifndef PERL_NO_UTF16_FILTER
7956static I32
acfe0abc 7957utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6
GS
7958{
7959 I32 count = FILTER_READ(idx+1, sv, maxlen);
7960 if (count) {
7961 U8* tmps;
7962 U8* tend;
dea0fc0b 7963 I32 newlen;
6e3aabd6 7964 New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
f72f5f89
JH
7965 if (!*SvPV_nolen(sv))
7966 /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7967 return count;
4e553d73 7968
dea0fc0b 7969 tend = utf16_to_utf8((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
6e3aabd6
GS
7970 sv_usepvn(sv, (char*)tmps, tend - tmps);
7971 }
7972 return count;
7973}
7974
7975static I32
acfe0abc 7976utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6
GS
7977{
7978 I32 count = FILTER_READ(idx+1, sv, maxlen);
7979 if (count) {
7980 U8* tmps;
7981 U8* tend;
dea0fc0b 7982 I32 newlen;
f72f5f89
JH
7983 if (!*SvPV_nolen(sv))
7984 /* Game over, but don't feed an odd-length string to utf16_to_utf8 */
7985 return count;
7986
6e3aabd6 7987 New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
dea0fc0b 7988 tend = utf16_to_utf8_reversed((U8*)SvPVX(sv), tmps, SvCUR(sv), &newlen);
6e3aabd6
GS
7989 sv_usepvn(sv, (char*)tmps, tend - tmps);
7990 }
7991 return count;
7992}
7993#endif
9f4817db 7994
f333445c
JP
7995/*
7996Returns a pointer to the next character after the parsed
7997vstring, as well as updating the passed in sv.
7998
7999Function must be called like
8000
8001 sv = NEWSV(92,5);
8002 s = scan_vstring(s,sv);
8003
8004The sv should already be large enough to store the vstring
8005passed in, for performance reasons.
8006
8007*/
8008
8009char *
8010Perl_scan_vstring(pTHX_ char *s, SV *sv)
8011{
8012 char *pos = s;
8013 char *start = s;
8014 if (*pos == 'v') pos++; /* get past 'v' */
3e884cbf
JH
8015 while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
8016 pos++;
f333445c
JP
8017 if ( *pos != '.') {
8018 /* this may not be a v-string if followed by => */
8fc7bb1c
SM
8019 char *next = pos;
8020 while (next < PL_bufend && isSPACE(*next))
8021 ++next;
8022 if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
8023 /* return string not v-string */
8024 sv_setpvn(sv,(char *)s,pos-s);
8025 return pos;
8026 }
8027 }
8028
8029 if (!isALPHA(*pos)) {
8030 UV rev;
8031 U8 tmpbuf[UTF8_MAXLEN+1];
8032 U8 *tmpend;
8033
8034 if (*s == 'v') s++; /* get past 'v' */
8035
8036 sv_setpvn(sv, "", 0);
8037
8038 for (;;) {
8039 rev = 0;
8040 {
8041 /* this is atoi() that tolerates underscores */
8042 char *end = pos;
8043 UV mult = 1;
8044 while (--end >= s) {
8045 UV orev;
8046 if (*end == '_')
8047 continue;
8048 orev = rev;
8049 rev += (*end - '0') * mult;
8050 mult *= 10;
8051 if (orev > rev && ckWARN_d(WARN_OVERFLOW))
8052 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
8053 "Integer overflow in decimal number");
8054 }
8055 }
8056#ifdef EBCDIC
8057 if (rev > 0x7FFFFFFF)
8058 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
8059#endif
8060 /* Append native character for the rev point */
8061 tmpend = uvchr_to_utf8(tmpbuf, rev);
8062 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
8063 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
8064 SvUTF8_on(sv);
3e884cbf 8065 if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
8066 s = ++pos;
8067 else {
8068 s = pos;
8069 break;
8070 }
3e884cbf 8071 while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
8072 pos++;
8073 }
8074 SvPOK_on(sv);
8075 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
8076 SvRMAGICAL_on(sv);
8077 }
8078 return s;
8079}
8080