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