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