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