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