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