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