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