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