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