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