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