This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
DB_File 1.72 update from Paul Marquess <paul.marquess@bt.com>
[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);
2754 if (*d == '(') {
2755 d = scan_str(d,TRUE,TRUE);
2756 if (!d) {
2757 if (PL_lex_stuff) {
2758 SvREFCNT_dec(PL_lex_stuff);
2759 PL_lex_stuff = Nullsv;
2760 }
2761 /* MUST advance bufptr here to avoid bogus
2762 "at end of line" context messages from yyerror().
2763 */
2764 PL_bufptr = s + len;
2765 yyerror("Unterminated attribute parameter in attribute list");
2766 if (attrs)
2767 op_free(attrs);
2768 return 0; /* EOF indicator */
2769 }
2770 }
2771 if (PL_lex_stuff) {
2772 SV *sv = newSVpvn(s, len);
2773 sv_catsv(sv, PL_lex_stuff);
2774 attrs = append_elem(OP_LIST, attrs,
2775 newSVOP(OP_CONST, 0, sv));
2776 SvREFCNT_dec(PL_lex_stuff);
2777 PL_lex_stuff = Nullsv;
2778 }
2779 else {
2780 attrs = append_elem(OP_LIST, attrs,
2781 newSVOP(OP_CONST, 0,
2782 newSVpvn(s, len)));
2783 }
2784 s = skipspace(d);
2785 while (*s == ',')
2786 s = skipspace(s+1);
2787 }
2788 tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}' for vi */
2789 if (*s != ';' && *s != tmp) {
2790 char q = ((*s == '\'') ? '"' : '\'');
2791 /* If here for an expression, and parsed no attrs, back off. */
2792 if (tmp == '=' && !attrs) {
2793 s = PL_bufptr;
2794 break;
2795 }
2796 /* MUST advance bufptr here to avoid bogus "at end of line"
2797 context messages from yyerror().
2798 */
2799 PL_bufptr = s;
2800 if (!*s)
2801 yyerror("Unterminated attribute list");
2802 else
2803 yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
2804 q, *s, q));
2805 if (attrs)
2806 op_free(attrs);
2807 OPERATOR(':');
2808 }
2809 if (attrs) {
2810 PL_nextval[PL_nexttoke].opval = attrs;
2811 force_next(THING);
2812 }
2813 TOKEN(COLONATTR);
2814 }
a0d0e21e 2815 OPERATOR(':');
8990e307
LW
2816 case '(':
2817 s++;
3280af22
NIS
2818 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
2819 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 2820 else
3280af22 2821 PL_expect = XTERM;
a0d0e21e 2822 TOKEN('(');
378cc40b 2823 case ';':
57843af0
GS
2824 if (CopLINE(PL_curcop) < PL_copline)
2825 PL_copline = CopLINE(PL_curcop);
378cc40b
LW
2826 tmp = *s++;
2827 OPERATOR(tmp);
2828 case ')':
378cc40b 2829 tmp = *s++;
16d20bd9
AD
2830 s = skipspace(s);
2831 if (*s == '{')
2832 PREBLOCK(tmp);
378cc40b 2833 TERM(tmp);
79072805
LW
2834 case ']':
2835 s++;
3280af22 2836 if (PL_lex_brackets <= 0)
d98d5fff 2837 yyerror("Unmatched right square bracket");
463ee0b2 2838 else
3280af22
NIS
2839 --PL_lex_brackets;
2840 if (PL_lex_state == LEX_INTERPNORMAL) {
2841 if (PL_lex_brackets == 0) {
a0d0e21e 2842 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3280af22 2843 PL_lex_state = LEX_INTERPEND;
79072805
LW
2844 }
2845 }
4633a7c4 2846 TERM(']');
79072805
LW
2847 case '{':
2848 leftbracket:
79072805 2849 s++;
3280af22
NIS
2850 if (PL_lex_brackets > 100) {
2851 char* newlb = Renew(PL_lex_brackstack, PL_lex_brackets + 1, char);
2852 if (newlb != PL_lex_brackstack) {
8990e307 2853 SAVEFREEPV(newlb);
3280af22 2854 PL_lex_brackstack = newlb;
8990e307
LW
2855 }
2856 }
3280af22 2857 switch (PL_expect) {
a0d0e21e 2858 case XTERM:
3280af22 2859 if (PL_lex_formbrack) {
a0d0e21e
LW
2860 s--;
2861 PRETERMBLOCK(DO);
2862 }
3280af22
NIS
2863 if (PL_oldoldbufptr == PL_last_lop)
2864 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 2865 else
3280af22 2866 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 2867 OPERATOR(HASHBRACK);
a0d0e21e 2868 case XOPERATOR:
3280af22 2869 while (s < PL_bufend && (*s == ' ' || *s == '\t'))
748a9306 2870 s++;
44a8e56a 2871 d = s;
3280af22
NIS
2872 PL_tokenbuf[0] = '\0';
2873 if (d < PL_bufend && *d == '-') {
2874 PL_tokenbuf[0] = '-';
44a8e56a 2875 d++;
3280af22 2876 while (d < PL_bufend && (*d == ' ' || *d == '\t'))
44a8e56a 2877 d++;
2878 }
834a4ddd 2879 if (d < PL_bufend && isIDFIRST_lazy(d)) {
3280af22 2880 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 2881 FALSE, &len);
3280af22 2882 while (d < PL_bufend && (*d == ' ' || *d == '\t'))
748a9306
LW
2883 d++;
2884 if (*d == '}') {
3280af22 2885 char minus = (PL_tokenbuf[0] == '-');
44a8e56a 2886 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
2887 if (minus)
2888 force_next('-');
748a9306
LW
2889 }
2890 }
2891 /* FALL THROUGH */
09bef843 2892 case XATTRBLOCK:
748a9306 2893 case XBLOCK:
3280af22
NIS
2894 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
2895 PL_expect = XSTATE;
a0d0e21e 2896 break;
09bef843 2897 case XATTRTERM:
a0d0e21e 2898 case XTERMBLOCK:
3280af22
NIS
2899 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
2900 PL_expect = XSTATE;
a0d0e21e
LW
2901 break;
2902 default: {
2903 char *t;
3280af22
NIS
2904 if (PL_oldoldbufptr == PL_last_lop)
2905 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 2906 else
3280af22 2907 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
a0d0e21e 2908 s = skipspace(s);
09ecc4b6 2909 if (*s == '}')
a0d0e21e 2910 OPERATOR(HASHBRACK);
b8a4b1be
GS
2911 /* This hack serves to disambiguate a pair of curlies
2912 * as being a block or an anon hash. Normally, expectation
2913 * determines that, but in cases where we're not in a
2914 * position to expect anything in particular (like inside
2915 * eval"") we have to resolve the ambiguity. This code
2916 * covers the case where the first term in the curlies is a
2917 * quoted string. Most other cases need to be explicitly
2918 * disambiguated by prepending a `+' before the opening
2919 * curly in order to force resolution as an anon hash.
2920 *
2921 * XXX should probably propagate the outer expectation
2922 * into eval"" to rely less on this hack, but that could
2923 * potentially break current behavior of eval"".
2924 * GSAR 97-07-21
2925 */
2926 t = s;
2927 if (*s == '\'' || *s == '"' || *s == '`') {
2928 /* common case: get past first string, handling escapes */
3280af22 2929 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
2930 if (*t++ == '\\' && (*t == '\\' || *t == *s))
2931 t++;
2932 t++;
a0d0e21e 2933 }
b8a4b1be 2934 else if (*s == 'q') {
3280af22 2935 if (++t < PL_bufend
b8a4b1be 2936 && (!isALNUM(*t)
3280af22 2937 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
2938 && !isALNUM(*t))))
2939 {
b8a4b1be
GS
2940 char *tmps;
2941 char open, close, term;
2942 I32 brackets = 1;
2943
3280af22 2944 while (t < PL_bufend && isSPACE(*t))
b8a4b1be
GS
2945 t++;
2946 term = *t;
2947 open = term;
2948 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
2949 term = tmps[5];
2950 close = term;
2951 if (open == close)
3280af22
NIS
2952 for (t++; t < PL_bufend; t++) {
2953 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 2954 t++;
6d07e5e9 2955 else if (*t == open)
b8a4b1be
GS
2956 break;
2957 }
2958 else
3280af22
NIS
2959 for (t++; t < PL_bufend; t++) {
2960 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 2961 t++;
6d07e5e9 2962 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
2963 break;
2964 else if (*t == open)
2965 brackets++;
2966 }
2967 }
2968 t++;
a0d0e21e 2969 }
0505442f
GS
2970 else if (isALNUM_lazy(t)) {
2971 t += UTF8SKIP(t);
2972 while (t < PL_bufend && isALNUM_lazy(t))
2973 t += UTF8SKIP(t);
a0d0e21e 2974 }
3280af22 2975 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 2976 t++;
b8a4b1be
GS
2977 /* if comma follows first term, call it an anon hash */
2978 /* XXX it could be a comma expression with loop modifiers */
3280af22 2979 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 2980 || (*t == '=' && t[1] == '>')))
a0d0e21e 2981 OPERATOR(HASHBRACK);
3280af22 2982 if (PL_expect == XREF)
4e4e412b 2983 PL_expect = XTERM;
a0d0e21e 2984 else {
3280af22
NIS
2985 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
2986 PL_expect = XSTATE;
a0d0e21e 2987 }
8990e307 2988 }
a0d0e21e 2989 break;
463ee0b2 2990 }
57843af0 2991 yylval.ival = CopLINE(PL_curcop);
79072805 2992 if (isSPACE(*s) || *s == '#')
3280af22 2993 PL_copline = NOLINE; /* invalidate current command line number */
79072805 2994 TOKEN('{');
378cc40b 2995 case '}':
79072805
LW
2996 rightbracket:
2997 s++;
3280af22 2998 if (PL_lex_brackets <= 0)
d98d5fff 2999 yyerror("Unmatched right curly bracket");
463ee0b2 3000 else
3280af22
NIS
3001 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
3002 if (PL_lex_brackets < PL_lex_formbrack)
3003 PL_lex_formbrack = 0;
3004 if (PL_lex_state == LEX_INTERPNORMAL) {
3005 if (PL_lex_brackets == 0) {
9059aa12
LW
3006 if (PL_expect & XFAKEBRACK) {
3007 PL_expect &= XENUMMASK;
3280af22
NIS
3008 PL_lex_state = LEX_INTERPEND;
3009 PL_bufptr = s;
cea2e8a9 3010 return yylex(); /* ignore fake brackets */
79072805 3011 }
fa83b5b6 3012 if (*s == '-' && s[1] == '>')
3280af22 3013 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 3014 else if (*s != '[' && *s != '{')
3280af22 3015 PL_lex_state = LEX_INTERPEND;
79072805
LW
3016 }
3017 }
9059aa12
LW
3018 if (PL_expect & XFAKEBRACK) {
3019 PL_expect &= XENUMMASK;
3280af22 3020 PL_bufptr = s;
cea2e8a9 3021 return yylex(); /* ignore fake brackets */
748a9306 3022 }
79072805
LW
3023 force_next('}');
3024 TOKEN(';');
378cc40b
LW
3025 case '&':
3026 s++;
3027 tmp = *s++;
3028 if (tmp == '&')
a0d0e21e 3029 AOPERATOR(ANDAND);
378cc40b 3030 s--;
3280af22 3031 if (PL_expect == XOPERATOR) {
834a4ddd 3032 if (ckWARN(WARN_SEMICOLON) && isIDFIRST_lazy(s) && PL_bufptr == PL_linestart) {
57843af0 3033 CopLINE_dec(PL_curcop);
cea2e8a9 3034 Perl_warner(aTHX_ WARN_SEMICOLON, PL_warn_nosemi);
57843af0 3035 CopLINE_inc(PL_curcop);
463ee0b2 3036 }
79072805 3037 BAop(OP_BIT_AND);
463ee0b2 3038 }
79072805 3039
3280af22
NIS
3040 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3041 if (*PL_tokenbuf) {
3042 PL_expect = XOPERATOR;
3043 force_ident(PL_tokenbuf, '&');
463ee0b2 3044 }
79072805
LW
3045 else
3046 PREREF('&');
c07a80fd 3047 yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
3048 TERM('&');
3049
378cc40b
LW
3050 case '|':
3051 s++;
3052 tmp = *s++;
3053 if (tmp == '|')
a0d0e21e 3054 AOPERATOR(OROR);
378cc40b 3055 s--;
79072805 3056 BOop(OP_BIT_OR);
378cc40b
LW
3057 case '=':
3058 s++;
3059 tmp = *s++;
3060 if (tmp == '=')
79072805
LW
3061 Eop(OP_EQ);
3062 if (tmp == '>')
3063 OPERATOR(',');
378cc40b 3064 if (tmp == '~')
79072805 3065 PMop(OP_MATCH);
599cee73 3066 if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
cea2e8a9 3067 Perl_warner(aTHX_ WARN_SYNTAX, "Reversed %c= operator",(int)tmp);
378cc40b 3068 s--;
3280af22
NIS
3069 if (PL_expect == XSTATE && isALPHA(tmp) &&
3070 (s == PL_linestart+1 || s[-2] == '\n') )
748a9306 3071 {
3280af22
NIS
3072 if (PL_in_eval && !PL_rsfp) {
3073 d = PL_bufend;
a5f75d66
AD
3074 while (s < d) {
3075 if (*s++ == '\n') {
3076 incline(s);
3077 if (strnEQ(s,"=cut",4)) {
3078 s = strchr(s,'\n');
3079 if (s)
3080 s++;
3081 else
3082 s = d;
3083 incline(s);
3084 goto retry;
3085 }
3086 }
3087 }
3088 goto retry;
3089 }
3280af22
NIS
3090 s = PL_bufend;
3091 PL_doextract = TRUE;
a0d0e21e
LW
3092 goto retry;
3093 }
3280af22 3094 if (PL_lex_brackets < PL_lex_formbrack) {
a0d0e21e 3095 char *t;
51882d45 3096#ifdef PERL_STRICT_CR
a0d0e21e 3097 for (t = s; *t == ' ' || *t == '\t'; t++) ;
51882d45
GS
3098#else
3099 for (t = s; *t == ' ' || *t == '\t' || *t == '\r'; t++) ;
3100#endif
a0d0e21e
LW
3101 if (*t == '\n' || *t == '#') {
3102 s--;
3280af22 3103 PL_expect = XBLOCK;
a0d0e21e
LW
3104 goto leftbracket;
3105 }
79072805 3106 }
a0d0e21e
LW
3107 yylval.ival = 0;
3108 OPERATOR(ASSIGNOP);
378cc40b
LW
3109 case '!':
3110 s++;
3111 tmp = *s++;
3112 if (tmp == '=')
79072805 3113 Eop(OP_NE);
378cc40b 3114 if (tmp == '~')
79072805 3115 PMop(OP_NOT);
378cc40b
LW
3116 s--;
3117 OPERATOR('!');
3118 case '<':
3280af22 3119 if (PL_expect != XOPERATOR) {
93a17b20 3120 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 3121 check_uni();
79072805
LW
3122 if (s[1] == '<')
3123 s = scan_heredoc(s);
3124 else
3125 s = scan_inputsymbol(s);
3126 TERM(sublex_start());
378cc40b
LW
3127 }
3128 s++;
3129 tmp = *s++;
3130 if (tmp == '<')
79072805 3131 SHop(OP_LEFT_SHIFT);
395c3793
LW
3132 if (tmp == '=') {
3133 tmp = *s++;
3134 if (tmp == '>')
79072805 3135 Eop(OP_NCMP);
395c3793 3136 s--;
79072805 3137 Rop(OP_LE);
395c3793 3138 }
378cc40b 3139 s--;
79072805 3140 Rop(OP_LT);
378cc40b
LW
3141 case '>':
3142 s++;
3143 tmp = *s++;
3144 if (tmp == '>')
79072805 3145 SHop(OP_RIGHT_SHIFT);
378cc40b 3146 if (tmp == '=')
79072805 3147 Rop(OP_GE);
378cc40b 3148 s--;
79072805 3149 Rop(OP_GT);
378cc40b
LW
3150
3151 case '$':
bbce6d69 3152 CLINE;
3153
3280af22
NIS
3154 if (PL_expect == XOPERATOR) {
3155 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3156 PL_expect = XTERM;
a0d0e21e 3157 depcom();
bbce6d69 3158 return ','; /* grandfather non-comma-format format */
a0d0e21e 3159 }
8990e307 3160 }
a0d0e21e 3161
834a4ddd 3162 if (s[1] == '#' && (isIDFIRST_lazy(s+2) || strchr("{$:+-", s[2]))) {
3280af22 3163 PL_tokenbuf[0] = '@';
376b8730
SM
3164 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3165 sizeof PL_tokenbuf - 1, FALSE);
3166 if (PL_expect == XOPERATOR)
3167 no_op("Array length", s);
3280af22 3168 if (!PL_tokenbuf[1])
a0d0e21e 3169 PREREF(DOLSHARP);
3280af22
NIS
3170 PL_expect = XOPERATOR;
3171 PL_pending_ident = '#';
463ee0b2 3172 TOKEN(DOLSHARP);
79072805 3173 }
bbce6d69 3174
3280af22 3175 PL_tokenbuf[0] = '$';
376b8730
SM
3176 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3177 sizeof PL_tokenbuf - 1, FALSE);
3178 if (PL_expect == XOPERATOR)
3179 no_op("Scalar", s);
3280af22
NIS
3180 if (!PL_tokenbuf[1]) {
3181 if (s == PL_bufend)
bbce6d69 3182 yyerror("Final $ should be \\$ or $name");
3183 PREREF('$');
8990e307 3184 }
a0d0e21e 3185
bbce6d69 3186 /* This kludge not intended to be bulletproof. */
3280af22 3187 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
bbce6d69 3188 yylval.opval = newSVOP(OP_CONST, 0,
3280af22 3189 newSViv((IV)PL_compiling.cop_arybase));
bbce6d69 3190 yylval.opval->op_private = OPpCONST_ARYBASE;
3191 TERM(THING);
3192 }
3193
ff68c719 3194 d = s;
69d2bceb 3195 tmp = (I32)*s;
3280af22 3196 if (PL_lex_state == LEX_NORMAL)
ff68c719 3197 s = skipspace(s);
3198
3280af22 3199 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3200 char *t;
3201 if (*s == '[') {
3280af22 3202 PL_tokenbuf[0] = '@';
599cee73 3203 if (ckWARN(WARN_SYNTAX)) {
bbce6d69 3204 for(t = s + 1;
834a4ddd 3205 isSPACE(*t) || isALNUM_lazy(t) || *t == '$';
bbce6d69 3206 t++) ;
a0d0e21e 3207 if (*t++ == ',') {
3280af22
NIS
3208 PL_bufptr = skipspace(PL_bufptr);
3209 while (t < PL_bufend && *t != ']')
bbce6d69 3210 t++;
cea2e8a9 3211 Perl_warner(aTHX_ WARN_SYNTAX,
599cee73
PM
3212 "Multidimensional syntax %.*s not supported",
3213 (t - PL_bufptr) + 1, PL_bufptr);
a0d0e21e
LW
3214 }
3215 }
bbce6d69 3216 }
3217 else if (*s == '{') {
3280af22 3218 PL_tokenbuf[0] = '%';
599cee73 3219 if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
bbce6d69 3220 (t = strchr(s, '}')) && (t = strchr(t, '=')))
3221 {
3280af22 3222 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
3223 STRLEN len;
3224 for (t++; isSPACE(*t); t++) ;
834a4ddd 3225 if (isIDFIRST_lazy(t)) {
8903cb82 3226 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
59a6d928 3227 for (; isSPACE(*t); t++) ;
864dbfa3 3228 if (*t == ';' && get_cv(tmpbuf, FALSE))
cea2e8a9 3229 Perl_warner(aTHX_ WARN_SYNTAX,
599cee73 3230 "You need to quote \"%s\"", tmpbuf);
748a9306 3231 }
93a17b20
LW
3232 }
3233 }
2f3197b3 3234 }
bbce6d69 3235
3280af22 3236 PL_expect = XOPERATOR;
69d2bceb 3237 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
3280af22
NIS
3238 bool islop = (PL_last_lop == PL_oldoldbufptr);
3239 if (!islop || PL_last_lop_op == OP_GREPSTART)
3240 PL_expect = XOPERATOR;
bbce6d69 3241 else if (strchr("$@\"'`q", *s))
3280af22 3242 PL_expect = XTERM; /* e.g. print $fh "foo" */
834a4ddd 3243 else if (strchr("&*<%", *s) && isIDFIRST_lazy(s+1))
3280af22 3244 PL_expect = XTERM; /* e.g. print $fh &sub */
834a4ddd 3245 else if (isIDFIRST_lazy(s)) {
3280af22 3246 char tmpbuf[sizeof PL_tokenbuf];
8903cb82 3247 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
84902520
TB
3248 if (tmp = keyword(tmpbuf, len)) {
3249 /* binary operators exclude handle interpretations */
3250 switch (tmp) {
3251 case -KEY_x:
3252 case -KEY_eq:
3253 case -KEY_ne:
3254 case -KEY_gt:
3255 case -KEY_lt:
3256 case -KEY_ge:
3257 case -KEY_le:
3258 case -KEY_cmp:
3259 break;
3260 default:
3280af22 3261 PL_expect = XTERM; /* e.g. print $fh length() */
84902520
TB
3262 break;
3263 }
3264 }
68dc0745 3265 else {
3266 GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
3267 if (gv && GvCVu(gv))
3280af22 3268 PL_expect = XTERM; /* e.g. print $fh subr() */
93a17b20 3269 }
93a17b20 3270 }
bbce6d69 3271 else if (isDIGIT(*s))
3280af22 3272 PL_expect = XTERM; /* e.g. print $fh 3 */
bbce6d69 3273 else if (*s == '.' && isDIGIT(s[1]))
3280af22 3274 PL_expect = XTERM; /* e.g. print $fh .3 */
e0587a03 3275 else if (strchr("/?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
3280af22 3276 PL_expect = XTERM; /* e.g. print $fh -1 */
e0587a03 3277 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3280af22 3278 PL_expect = XTERM; /* print $fh <<"EOF" */
bbce6d69 3279 }
3280af22 3280 PL_pending_ident = '$';
79072805 3281 TOKEN('$');
378cc40b
LW
3282
3283 case '@':
3280af22 3284 if (PL_expect == XOPERATOR)
bbce6d69 3285 no_op("Array", s);
3280af22
NIS
3286 PL_tokenbuf[0] = '@';
3287 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3288 if (!PL_tokenbuf[1]) {
3289 if (s == PL_bufend)
bbce6d69 3290 yyerror("Final @ should be \\@ or @name");
3291 PREREF('@');
3292 }
3280af22 3293 if (PL_lex_state == LEX_NORMAL)
ff68c719 3294 s = skipspace(s);
3280af22 3295 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3296 if (*s == '{')
3280af22 3297 PL_tokenbuf[0] = '%';
a0d0e21e
LW
3298
3299 /* Warn about @ where they meant $. */
599cee73 3300 if (ckWARN(WARN_SYNTAX)) {
a0d0e21e
LW
3301 if (*s == '[' || *s == '{') {
3302 char *t = s + 1;
834a4ddd 3303 while (*t && (isALNUM_lazy(t) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
3304 t++;
3305 if (*t == '}' || *t == ']') {
3306 t++;
3280af22 3307 PL_bufptr = skipspace(PL_bufptr);
cea2e8a9 3308 Perl_warner(aTHX_ WARN_SYNTAX,
599cee73 3309 "Scalar value %.*s better written as $%.*s",
3280af22 3310 t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
a0d0e21e 3311 }
93a17b20
LW
3312 }
3313 }
463ee0b2 3314 }
3280af22 3315 PL_pending_ident = '@';
79072805 3316 TERM('@');
378cc40b
LW
3317
3318 case '/': /* may either be division or pattern */
3319 case '?': /* may either be conditional or pattern */
3280af22 3320 if (PL_expect != XOPERATOR) {
c277df42 3321 /* Disable warning on "study /blah/" */
3280af22
NIS
3322 if (PL_oldoldbufptr == PL_last_uni
3323 && (*PL_last_uni != 's' || s - PL_last_uni < 5
834a4ddd 3324 || memNE(PL_last_uni, "study", 5) || isALNUM_lazy(PL_last_uni+5)))
c277df42 3325 check_uni();
8782bef2 3326 s = scan_pat(s,OP_MATCH);
79072805 3327 TERM(sublex_start());
378cc40b
LW
3328 }
3329 tmp = *s++;
a687059c 3330 if (tmp == '/')
79072805 3331 Mop(OP_DIVIDE);
378cc40b
LW
3332 OPERATOR(tmp);
3333
3334 case '.':
51882d45
GS
3335 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3336#ifdef PERL_STRICT_CR
3337 && s[1] == '\n'
3338#else
3339 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3340#endif
3341 && (s == PL_linestart || s[-1] == '\n') )
3342 {
3280af22
NIS
3343 PL_lex_formbrack = 0;
3344 PL_expect = XSTATE;
79072805
LW
3345 goto rightbracket;
3346 }
3280af22 3347 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
378cc40b 3348 tmp = *s++;
a687059c
LW
3349 if (*s == tmp) {
3350 s++;
2f3197b3
LW
3351 if (*s == tmp) {
3352 s++;
79072805 3353 yylval.ival = OPf_SPECIAL;
2f3197b3
LW
3354 }
3355 else
79072805 3356 yylval.ival = 0;
378cc40b 3357 OPERATOR(DOTDOT);
a687059c 3358 }
3280af22 3359 if (PL_expect != XOPERATOR)
2f3197b3 3360 check_uni();
79072805 3361 Aop(OP_CONCAT);
378cc40b
LW
3362 }
3363 /* FALL THROUGH */
3364 case '0': case '1': case '2': case '3': case '4':
3365 case '5': case '6': case '7': case '8': case '9':
79072805 3366 s = scan_num(s);
3280af22 3367 if (PL_expect == XOPERATOR)
8990e307 3368 no_op("Number",s);
79072805
LW
3369 TERM(THING);
3370
3371 case '\'':
09bef843 3372 s = scan_str(s,FALSE,FALSE);
3280af22
NIS
3373 if (PL_expect == XOPERATOR) {
3374 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3375 PL_expect = XTERM;
a0d0e21e
LW
3376 depcom();
3377 return ','; /* grandfather non-comma-format format */
3378 }
463ee0b2 3379 else
8990e307 3380 no_op("String",s);
463ee0b2 3381 }
79072805 3382 if (!s)
85e6fe83 3383 missingterm((char*)0);
79072805
LW
3384 yylval.ival = OP_CONST;
3385 TERM(sublex_start());
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);
4633a7c4 3400 yylval.ival = OP_CONST;
3280af22 3401 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
a0ed51b3 3402 if (*d == '$' || *d == '@' || *d == '\\' || *d & 0x80) {
4633a7c4
LW
3403 yylval.ival = OP_STRINGIFY;
3404 break;
3405 }
3406 }
79072805
LW
3407 TERM(sublex_start());
3408
3409 case '`':
09bef843 3410 s = scan_str(s,FALSE,FALSE);
3280af22 3411 if (PL_expect == XOPERATOR)
8990e307 3412 no_op("Backticks",s);
79072805 3413 if (!s)
85e6fe83 3414 missingterm((char*)0);
79072805
LW
3415 yylval.ival = OP_BACKTICK;
3416 set_csh();
3417 TERM(sublex_start());
3418
3419 case '\\':
3420 s++;
599cee73 3421 if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
cea2e8a9 3422 Perl_warner(aTHX_ WARN_SYNTAX,"Can't use \\%c to mean $%c in expression",
599cee73 3423 *s, *s);
3280af22 3424 if (PL_expect == XOPERATOR)
8990e307 3425 no_op("Backslash",s);
79072805
LW
3426 OPERATOR(REFGEN);
3427
a7cb1f99
GS
3428 case 'v':
3429 if (isDIGIT(s[1]) && PL_expect == XTERM) {
3430 char *start = s;
3431 start++;
3432 start++;
3433 while (isDIGIT(*start))
3434 start++;
3435 if (*start == '.' && isDIGIT(start[1])) {
3436 s = scan_num(s);
3437 TERM(THING);
3438 }
3439 }
3440 goto keylookup;
79072805 3441 case 'x':
3280af22 3442 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
3443 s++;
3444 Mop(OP_REPEAT);
2f3197b3 3445 }
79072805
LW
3446 goto keylookup;
3447
378cc40b 3448 case '_':
79072805
LW
3449 case 'a': case 'A':
3450 case 'b': case 'B':
3451 case 'c': case 'C':
3452 case 'd': case 'D':
3453 case 'e': case 'E':
3454 case 'f': case 'F':
3455 case 'g': case 'G':
3456 case 'h': case 'H':
3457 case 'i': case 'I':
3458 case 'j': case 'J':
3459 case 'k': case 'K':
3460 case 'l': case 'L':
3461 case 'm': case 'M':
3462 case 'n': case 'N':
3463 case 'o': case 'O':
3464 case 'p': case 'P':
3465 case 'q': case 'Q':
3466 case 'r': case 'R':
3467 case 's': case 'S':
3468 case 't': case 'T':
3469 case 'u': case 'U':
a7cb1f99 3470 case 'V':
79072805
LW
3471 case 'w': case 'W':
3472 case 'X':
3473 case 'y': case 'Y':
3474 case 'z': case 'Z':
3475
49dc05e3 3476 keylookup: {
2d8e6c8d 3477 STRLEN n_a;
161b471a
NIS
3478 gv = Nullgv;
3479 gvp = 0;
49dc05e3 3480
3280af22
NIS
3481 PL_bufptr = s;
3482 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 3483
3484 /* Some keywords can be followed by any delimiter, including ':' */
3280af22
NIS
3485 tmp = (len == 1 && strchr("msyq", PL_tokenbuf[0]) ||
3486 len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
3487 (PL_tokenbuf[0] == 'q' &&
3488 strchr("qwxr", PL_tokenbuf[1]))));
8ebc5c01 3489
3490 /* x::* is just a word, unless x is "CORE" */
3280af22 3491 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
3492 goto just_a_word;
3493
3643fb5f 3494 d = s;
3280af22 3495 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
3496 d++; /* no comments skipped here, or s### is misparsed */
3497
3498 /* Is this a label? */
3280af22
NIS
3499 if (!tmp && PL_expect == XSTATE
3500 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
8ebc5c01 3501 s = d + 1;
3280af22 3502 yylval.pval = savepv(PL_tokenbuf);
8ebc5c01 3503 CLINE;
3504 TOKEN(LABEL);
3643fb5f
CS
3505 }
3506
3507 /* Check for keywords */
3280af22 3508 tmp = keyword(PL_tokenbuf, len);
748a9306
LW
3509
3510 /* Is this a word before a => operator? */
748a9306
LW
3511 if (strnEQ(d,"=>",2)) {
3512 CLINE;
3280af22 3513 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
748a9306
LW
3514 yylval.opval->op_private = OPpCONST_BARE;
3515 TERM(WORD);
3516 }
3517
a0d0e21e 3518 if (tmp < 0) { /* second-class keyword? */
56f7f34b
CS
3519 GV *ogv = Nullgv; /* override (winner) */
3520 GV *hgv = Nullgv; /* hidden (loser) */
3280af22 3521 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 3522 CV *cv;
3280af22 3523 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
56f7f34b
CS
3524 (cv = GvCVu(gv)))
3525 {
3526 if (GvIMPORTED_CV(gv))
3527 ogv = gv;
3528 else if (! CvMETHOD(cv))
3529 hgv = gv;
3530 }
3531 if (!ogv &&
3280af22
NIS
3532 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
3533 (gv = *gvp) != (GV*)&PL_sv_undef &&
56f7f34b
CS
3534 GvCVu(gv) && GvIMPORTED_CV(gv))
3535 {
3536 ogv = gv;
3537 }
3538 }
3539 if (ogv) {
3540 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
3541 }
3542 else if (gv && !gvp
3543 && -tmp==KEY_lock /* XXX generalizable kludge */
d0456cad 3544 && GvCVu(gv)
3280af22 3545 && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
6e7b2336
GS
3546 {
3547 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 3548 }
56f7f34b
CS
3549 else { /* no override */
3550 tmp = -tmp;
3551 gv = Nullgv;
3552 gvp = 0;
4944e2f7
GS
3553 if (ckWARN(WARN_AMBIGUOUS) && hgv
3554 && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
cea2e8a9 3555 Perl_warner(aTHX_ WARN_AMBIGUOUS,
599cee73 3556 "Ambiguous call resolved as CORE::%s(), %s",
2f3ca594 3557 GvENAME(hgv), "qualify as such or use &");
49dc05e3 3558 }
a0d0e21e
LW
3559 }
3560
3561 reserved_word:
3562 switch (tmp) {
79072805
LW
3563
3564 default: /* not a keyword */
93a17b20 3565 just_a_word: {
96e4d5b1 3566 SV *sv;
3280af22 3567 char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
8990e307
LW
3568
3569 /* Get the rest if it looks like a package qualifier */
3570
a0d0e21e 3571 if (*s == '\'' || *s == ':' && s[1] == ':') {
c3e0f903 3572 STRLEN morelen;
3280af22 3573 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
3574 TRUE, &morelen);
3575 if (!morelen)
cea2e8a9 3576 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 3577 *s == '\'' ? "'" : "::");
c3e0f903 3578 len += morelen;
a0d0e21e 3579 }
8990e307 3580
3280af22
NIS
3581 if (PL_expect == XOPERATOR) {
3582 if (PL_bufptr == PL_linestart) {
57843af0 3583 CopLINE_dec(PL_curcop);
cea2e8a9 3584 Perl_warner(aTHX_ WARN_SEMICOLON, PL_warn_nosemi);
57843af0 3585 CopLINE_inc(PL_curcop);
463ee0b2
LW
3586 }
3587 else
54310121 3588 no_op("Bareword",s);
463ee0b2 3589 }
8990e307 3590
c3e0f903
GS
3591 /* Look for a subroutine with this name in current package,
3592 unless name is "Foo::", in which case Foo is a bearword
3593 (and a package name). */
3594
3595 if (len > 2 &&
3280af22 3596 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 3597 {
599cee73 3598 if (ckWARN(WARN_UNSAFE) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
cea2e8a9 3599 Perl_warner(aTHX_ WARN_UNSAFE,
599cee73 3600 "Bareword \"%s\" refers to nonexistent package",
3280af22 3601 PL_tokenbuf);
c3e0f903 3602 len -= 2;
3280af22 3603 PL_tokenbuf[len] = '\0';
c3e0f903
GS
3604 gv = Nullgv;
3605 gvp = 0;
3606 }
3607 else {
3608 len = 0;
3609 if (!gv)
3280af22 3610 gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
c3e0f903
GS
3611 }
3612
3613 /* if we saw a global override before, get the right name */
8990e307 3614
49dc05e3 3615 if (gvp) {
79cb57f6 3616 sv = newSVpvn("CORE::GLOBAL::",14);
3280af22 3617 sv_catpv(sv,PL_tokenbuf);
49dc05e3
GS
3618 }
3619 else
3280af22 3620 sv = newSVpv(PL_tokenbuf,0);
8990e307 3621
a0d0e21e
LW
3622 /* Presume this is going to be a bareword of some sort. */
3623
3624 CLINE;
49dc05e3 3625 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
a0d0e21e
LW
3626 yylval.opval->op_private = OPpCONST_BARE;
3627
c3e0f903
GS
3628 /* And if "Foo::", then that's what it certainly is. */
3629
3630 if (len)
3631 goto safe_bareword;
3632
8990e307
LW
3633 /* See if it's the indirect object for a list operator. */
3634
3280af22
NIS
3635 if (PL_oldoldbufptr &&
3636 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
3637 (PL_oldoldbufptr == PL_last_lop
3638 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 3639 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
3640 (PL_expect == XREF ||
3641 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 3642 {
748a9306
LW
3643 bool immediate_paren = *s == '(';
3644
a0d0e21e
LW
3645 /* (Now we can afford to cross potential line boundary.) */
3646 s = skipspace(s);
3647
3648 /* Two barewords in a row may indicate method call. */
3649
834a4ddd 3650 if ((isIDFIRST_lazy(s) || *s == '$') && (tmp=intuit_method(s,gv)))
a0d0e21e
LW
3651 return tmp;
3652
3653 /* If not a declared subroutine, it's an indirect object. */
3654 /* (But it's an indir obj regardless for sort.) */
3655
3280af22 3656 if ((PL_last_lop_op == OP_SORT ||
a9ef352a
GS
3657 (!immediate_paren && (!gv || !GvCVu(gv)))) &&
3658 (PL_last_lop_op != OP_MAPSTART &&
3659 PL_last_lop_op != OP_GREPSTART))
3660 {
3280af22 3661 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 3662 goto bareword;
93a17b20
LW
3663 }
3664 }
8990e307
LW
3665
3666 /* If followed by a paren, it's certainly a subroutine. */
3667
3280af22 3668 PL_expect = XOPERATOR;
8990e307 3669 s = skipspace(s);
93a17b20 3670 if (*s == '(') {
79072805 3671 CLINE;
96e4d5b1 3672 if (gv && GvCVu(gv)) {
3673 for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
7a52d87a 3674 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
96e4d5b1 3675 s = d + 1;
3676 goto its_constant;
3677 }
3678 }
3280af22
NIS
3679 PL_nextval[PL_nexttoke].opval = yylval.opval;
3680 PL_expect = XOPERATOR;
93a17b20 3681 force_next(WORD);
c07a80fd 3682 yylval.ival = 0;
463ee0b2 3683 TOKEN('&');
79072805 3684 }
93a17b20 3685
a0d0e21e 3686 /* If followed by var or block, call it a method (unless sub) */
8990e307 3687
8ebc5c01 3688 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
3280af22
NIS
3689 PL_last_lop = PL_oldbufptr;
3690 PL_last_lop_op = OP_METHOD;
93a17b20 3691 PREBLOCK(METHOD);
463ee0b2
LW
3692 }
3693
8990e307
LW
3694 /* If followed by a bareword, see if it looks like indir obj. */
3695
834a4ddd 3696 if ((isIDFIRST_lazy(s) || *s == '$') && (tmp = intuit_method(s,gv)))
a0d0e21e 3697 return tmp;
93a17b20 3698
8990e307
LW
3699 /* Not a method, so call it a subroutine (if defined) */
3700
8ebc5c01 3701 if (gv && GvCVu(gv)) {
46fc3d4c 3702 CV* cv;
0453d815
PM
3703 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
3704 Perl_warner(aTHX_ WARN_AMBIGUOUS,
3705 "Ambiguous use of -%s resolved as -&%s()",
3280af22 3706 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 3707 /* Check for a constant sub */
46fc3d4c 3708 cv = GvCV(gv);
96e4d5b1 3709 if ((sv = cv_const_sv(cv))) {
3710 its_constant:
3711 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
3712 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
3713 yylval.opval->op_private = 0;
3714 TOKEN(WORD);
89bfa8cd 3715 }
3716
a5f75d66
AD
3717 /* Resolve to GV now. */
3718 op_free(yylval.opval);
3719 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
9675f7ac 3720 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 3721 PL_last_lop = PL_oldbufptr;
bf848113 3722 PL_last_lop_op = OP_ENTERSUB;
4633a7c4
LW
3723 /* Is there a prototype? */
3724 if (SvPOK(cv)) {
3725 STRLEN len;
7a52d87a 3726 char *proto = SvPV((SV*)cv, len);
4633a7c4
LW
3727 if (!len)
3728 TERM(FUNC0SUB);
7a52d87a 3729 if (strEQ(proto, "$"))
4633a7c4 3730 OPERATOR(UNIOPSUB);
7a52d87a 3731 if (*proto == '&' && *s == '{') {
3280af22 3732 sv_setpv(PL_subname,"__ANON__");
4633a7c4
LW
3733 PREBLOCK(LSTOPSUB);
3734 }
a9ef352a 3735 }
3280af22
NIS
3736 PL_nextval[PL_nexttoke].opval = yylval.opval;
3737 PL_expect = XTERM;
8990e307
LW
3738 force_next(WORD);
3739 TOKEN(NOAMP);
3740 }
748a9306 3741
8990e307
LW
3742 /* Call it a bare word */
3743
5603f27d
GS
3744 if (PL_hints & HINT_STRICT_SUBS)
3745 yylval.opval->op_private |= OPpCONST_STRICT;
3746 else {
3747 bareword:
3748 if (ckWARN(WARN_RESERVED)) {
3749 if (lastchar != '-') {
3750 for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
3751 if (!*d)
cea2e8a9 3752 Perl_warner(aTHX_ WARN_RESERVED, PL_warn_reserved,
5603f27d
GS
3753 PL_tokenbuf);
3754 }
748a9306
LW
3755 }
3756 }
c3e0f903
GS
3757
3758 safe_bareword:
f248d071 3759 if (lastchar && strchr("*%&", lastchar) && ckWARN_d(WARN_AMBIGUOUS)) {
0453d815
PM
3760 Perl_warner(aTHX_ WARN_AMBIGUOUS,
3761 "Operator or semicolon missing before %c%s",
3280af22 3762 lastchar, PL_tokenbuf);
0453d815
PM
3763 Perl_warner(aTHX_ WARN_AMBIGUOUS,
3764 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
3765 lastchar, lastchar);
3766 }
93a17b20 3767 TOKEN(WORD);
79072805 3768 }
79072805 3769
68dc0745 3770 case KEY___FILE__:
46fc3d4c 3771 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 3772 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 3773 TERM(THING);
3774
79072805 3775 case KEY___LINE__:
cf2093f6 3776 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 3777 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 3778 TERM(THING);
68dc0745 3779
3780 case KEY___PACKAGE__:
3781 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22
NIS
3782 (PL_curstash
3783 ? newSVsv(PL_curstname)
3784 : &PL_sv_undef));
79072805 3785 TERM(THING);
79072805 3786
e50aee73 3787 case KEY___DATA__:
79072805
LW
3788 case KEY___END__: {
3789 GV *gv;
79072805
LW
3790
3791 /*SUPPRESS 560*/
3280af22 3792 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
e50aee73 3793 char *pname = "main";
3280af22
NIS
3794 if (PL_tokenbuf[2] == 'D')
3795 pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
cea2e8a9 3796 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
a5f75d66 3797 GvMULTI_on(gv);
79072805 3798 if (!GvIO(gv))
a0d0e21e 3799 GvIOp(gv) = newIO();
3280af22 3800 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
3801#if defined(HAS_FCNTL) && defined(F_SETFD)
3802 {
3280af22 3803 int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
3804 fcntl(fd,F_SETFD,fd >= 3);
3805 }
79072805 3806#endif
fd049845 3807 /* Mark this internal pseudo-handle as clean */
3808 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3280af22 3809 if (PL_preprocess)
a0d0e21e 3810 IoTYPE(GvIOp(gv)) = '|';
3280af22 3811 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
a0d0e21e 3812 IoTYPE(GvIOp(gv)) = '-';
79072805 3813 else
a0d0e21e 3814 IoTYPE(GvIOp(gv)) = '<';
c39cd008
GS
3815#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
3816 /* if the script was opened in binmode, we need to revert
53129d29 3817 * it to text mode for compatibility; but only iff it has CRs
c39cd008 3818 * XXX this is a questionable hack at best. */
53129d29
GS
3819 if (PL_bufend-PL_bufptr > 2
3820 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
3821 {
3822 Off_t loc = 0;
3823 if (IoTYPE(GvIOp(gv)) == '<') {
3824 loc = PerlIO_tell(PL_rsfp);
3825 (void)PerlIO_seek(PL_rsfp, 0L, 0);
3826 }
3827 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
3828#if defined(__BORLANDC__)
3829 /* XXX see note in do_binmode() */
3830 ((FILE*)PL_rsfp)->flags |= _F_BIN;
3831#endif
3832 if (loc > 0)
3833 PerlIO_seek(PL_rsfp, loc, 0);
3834 }
3835 }
3836#endif
3280af22 3837 PL_rsfp = Nullfp;
79072805
LW
3838 }
3839 goto fake_eof;
e929a76b 3840 }
de3bb511 3841
8990e307 3842 case KEY_AUTOLOAD:
ed6116ce 3843 case KEY_DESTROY:
79072805
LW
3844 case KEY_BEGIN:
3845 case KEY_END:
4f25aa18 3846 case KEY_STOP:
7d07dbc2 3847 case KEY_INIT:
3280af22
NIS
3848 if (PL_expect == XSTATE) {
3849 s = PL_bufptr;
93a17b20 3850 goto really_sub;
79072805
LW
3851 }
3852 goto just_a_word;
3853
a0d0e21e
LW
3854 case KEY_CORE:
3855 if (*s == ':' && s[1] == ':') {
3856 s += 2;
748a9306 3857 d = s;
3280af22
NIS
3858 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
3859 tmp = keyword(PL_tokenbuf, len);
a0d0e21e
LW
3860 if (tmp < 0)
3861 tmp = -tmp;
3862 goto reserved_word;
3863 }
3864 goto just_a_word;
3865
463ee0b2
LW
3866 case KEY_abs:
3867 UNI(OP_ABS);
3868
79072805
LW
3869 case KEY_alarm:
3870 UNI(OP_ALARM);
3871
3872 case KEY_accept:
a0d0e21e 3873 LOP(OP_ACCEPT,XTERM);
79072805 3874
463ee0b2
LW
3875 case KEY_and:
3876 OPERATOR(ANDOP);
3877
79072805 3878 case KEY_atan2:
a0d0e21e 3879 LOP(OP_ATAN2,XTERM);
85e6fe83 3880
79072805 3881 case KEY_bind:
a0d0e21e 3882 LOP(OP_BIND,XTERM);
79072805
LW
3883
3884 case KEY_binmode:
3885 UNI(OP_BINMODE);
3886
3887 case KEY_bless:
a0d0e21e 3888 LOP(OP_BLESS,XTERM);
79072805
LW
3889
3890 case KEY_chop:
3891 UNI(OP_CHOP);
3892
3893 case KEY_continue:
3894 PREBLOCK(CONTINUE);
3895
3896 case KEY_chdir:
85e6fe83 3897 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
79072805
LW
3898 UNI(OP_CHDIR);
3899
3900 case KEY_close:
3901 UNI(OP_CLOSE);
3902
3903 case KEY_closedir:
3904 UNI(OP_CLOSEDIR);
3905
3906 case KEY_cmp:
3907 Eop(OP_SCMP);
3908
3909 case KEY_caller:
3910 UNI(OP_CALLER);
3911
3912 case KEY_crypt:
3913#ifdef FCRYPT
f4c556ac
GS
3914 if (!PL_cryptseen) {
3915 PL_cryptseen = TRUE;
de3bb511 3916 init_des();
f4c556ac 3917 }
a687059c 3918#endif
a0d0e21e 3919 LOP(OP_CRYPT,XTERM);
79072805
LW
3920
3921 case KEY_chmod:
599cee73 3922 if (ckWARN(WARN_OCTAL)) {
3280af22 3923 for (d = s; d < PL_bufend && (isSPACE(*d) || *d == '('); d++) ;
748a9306 3924 if (*d != '0' && isDIGIT(*d))
4438c4b7
JH
3925 Perl_warner(aTHX_ WARN_OCTAL,
3926 "chmod: mode argument is missing initial 0");
748a9306 3927 }
a0d0e21e 3928 LOP(OP_CHMOD,XTERM);
79072805
LW
3929
3930 case KEY_chown:
a0d0e21e 3931 LOP(OP_CHOWN,XTERM);
79072805
LW
3932
3933 case KEY_connect:
a0d0e21e 3934 LOP(OP_CONNECT,XTERM);
79072805 3935
463ee0b2
LW
3936 case KEY_chr:
3937 UNI(OP_CHR);
3938
79072805
LW
3939 case KEY_cos:
3940 UNI(OP_COS);
3941
3942 case KEY_chroot:
3943 UNI(OP_CHROOT);
3944
3945 case KEY_do:
3946 s = skipspace(s);
3947 if (*s == '{')
a0d0e21e 3948 PRETERMBLOCK(DO);
79072805 3949 if (*s != '\'')
a0d0e21e 3950 s = force_word(s,WORD,FALSE,TRUE,FALSE);
378cc40b 3951 OPERATOR(DO);
79072805
LW
3952
3953 case KEY_die:
3280af22 3954 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 3955 LOP(OP_DIE,XTERM);
79072805
LW
3956
3957 case KEY_defined:
3958 UNI(OP_DEFINED);
3959
3960 case KEY_delete:
a0d0e21e 3961 UNI(OP_DELETE);
79072805
LW
3962
3963 case KEY_dbmopen:
a0d0e21e
LW
3964 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
3965 LOP(OP_DBMOPEN,XTERM);
79072805
LW
3966
3967 case KEY_dbmclose:
3968 UNI(OP_DBMCLOSE);
3969
3970 case KEY_dump:
a0d0e21e 3971 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
3972 LOOPX(OP_DUMP);
3973
3974 case KEY_else:
3975 PREBLOCK(ELSE);
3976
3977 case KEY_elsif:
57843af0 3978 yylval.ival = CopLINE(PL_curcop);
79072805
LW
3979 OPERATOR(ELSIF);
3980
3981 case KEY_eq:
3982 Eop(OP_SEQ);
3983
a0d0e21e
LW
3984 case KEY_exists:
3985 UNI(OP_EXISTS);
3986
79072805
LW
3987 case KEY_exit:
3988 UNI(OP_EXIT);
3989
3990 case KEY_eval:
79072805 3991 s = skipspace(s);
3280af22 3992 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 3993 UNIBRACK(OP_ENTEREVAL);
79072805
LW
3994
3995 case KEY_eof:
3996 UNI(OP_EOF);
3997
3998 case KEY_exp:
3999 UNI(OP_EXP);
4000
4001 case KEY_each:
4002 UNI(OP_EACH);
4003
4004 case KEY_exec:
4005 set_csh();
a0d0e21e 4006 LOP(OP_EXEC,XREF);
79072805
LW
4007
4008 case KEY_endhostent:
4009 FUN0(OP_EHOSTENT);
4010
4011 case KEY_endnetent:
4012 FUN0(OP_ENETENT);
4013
4014 case KEY_endservent:
4015 FUN0(OP_ESERVENT);
4016
4017 case KEY_endprotoent:
4018 FUN0(OP_EPROTOENT);
4019
4020 case KEY_endpwent:
4021 FUN0(OP_EPWENT);
4022
4023 case KEY_endgrent:
4024 FUN0(OP_EGRENT);
4025
4026 case KEY_for:
4027 case KEY_foreach:
57843af0 4028 yylval.ival = CopLINE(PL_curcop);
55497cff 4029 s = skipspace(s);
834a4ddd 4030 if (PL_expect == XSTATE && isIDFIRST_lazy(s)) {
55497cff 4031 char *p = s;
3280af22 4032 if ((PL_bufend - p) >= 3 &&
55497cff 4033 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4034 p += 2;
77ca0c92
LW
4035 else if ((PL_bufend - p) >= 4 &&
4036 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4037 p += 3;
55497cff 4038 p = skipspace(p);
77ca0c92
LW
4039 if (isIDFIRST_lazy(p)) {
4040 p = scan_ident(p, PL_bufend,
4041 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4042 p = skipspace(p);
4043 }
4044 if (*p != '$')
cea2e8a9 4045 Perl_croak(aTHX_ "Missing $ on loop variable");
55497cff 4046 }
79072805
LW
4047 OPERATOR(FOR);
4048
4049 case KEY_formline:
a0d0e21e 4050 LOP(OP_FORMLINE,XTERM);
79072805
LW
4051
4052 case KEY_fork:
4053 FUN0(OP_FORK);
4054
4055 case KEY_fcntl:
a0d0e21e 4056 LOP(OP_FCNTL,XTERM);
79072805
LW
4057
4058 case KEY_fileno:
4059 UNI(OP_FILENO);
4060
4061 case KEY_flock:
a0d0e21e 4062 LOP(OP_FLOCK,XTERM);
79072805
LW
4063
4064 case KEY_gt:
4065 Rop(OP_SGT);
4066
4067 case KEY_ge:
4068 Rop(OP_SGE);
4069
4070 case KEY_grep:
a0d0e21e 4071 LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
79072805
LW
4072
4073 case KEY_goto:
a0d0e21e 4074 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4075 LOOPX(OP_GOTO);
4076
4077 case KEY_gmtime:
4078 UNI(OP_GMTIME);
4079
4080 case KEY_getc:
4081 UNI(OP_GETC);
4082
4083 case KEY_getppid:
4084 FUN0(OP_GETPPID);
4085
4086 case KEY_getpgrp:
4087 UNI(OP_GETPGRP);
4088
4089 case KEY_getpriority:
a0d0e21e 4090 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
4091
4092 case KEY_getprotobyname:
4093 UNI(OP_GPBYNAME);
4094
4095 case KEY_getprotobynumber:
a0d0e21e 4096 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
4097
4098 case KEY_getprotoent:
4099 FUN0(OP_GPROTOENT);
4100
4101 case KEY_getpwent:
4102 FUN0(OP_GPWENT);
4103
4104 case KEY_getpwnam:
ff68c719 4105 UNI(OP_GPWNAM);
79072805
LW
4106
4107 case KEY_getpwuid:
ff68c719 4108 UNI(OP_GPWUID);
79072805
LW
4109
4110 case KEY_getpeername:
4111 UNI(OP_GETPEERNAME);
4112
4113 case KEY_gethostbyname:
4114 UNI(OP_GHBYNAME);
4115
4116 case KEY_gethostbyaddr:
a0d0e21e 4117 LOP(OP_GHBYADDR,XTERM);
79072805
LW
4118
4119 case KEY_gethostent:
4120 FUN0(OP_GHOSTENT);
4121
4122 case KEY_getnetbyname:
4123 UNI(OP_GNBYNAME);
4124
4125 case KEY_getnetbyaddr:
a0d0e21e 4126 LOP(OP_GNBYADDR,XTERM);
79072805
LW
4127
4128 case KEY_getnetent:
4129 FUN0(OP_GNETENT);
4130
4131 case KEY_getservbyname:
a0d0e21e 4132 LOP(OP_GSBYNAME,XTERM);
79072805
LW
4133
4134 case KEY_getservbyport:
a0d0e21e 4135 LOP(OP_GSBYPORT,XTERM);
79072805
LW
4136
4137 case KEY_getservent:
4138 FUN0(OP_GSERVENT);
4139
4140 case KEY_getsockname:
4141 UNI(OP_GETSOCKNAME);
4142
4143 case KEY_getsockopt:
a0d0e21e 4144 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
4145
4146 case KEY_getgrent:
4147 FUN0(OP_GGRENT);
4148
4149 case KEY_getgrnam:
ff68c719 4150 UNI(OP_GGRNAM);
79072805
LW
4151
4152 case KEY_getgrgid:
ff68c719 4153 UNI(OP_GGRGID);
79072805
LW
4154
4155 case KEY_getlogin:
4156 FUN0(OP_GETLOGIN);
4157
93a17b20 4158 case KEY_glob:
a0d0e21e
LW
4159 set_csh();
4160 LOP(OP_GLOB,XTERM);
93a17b20 4161
79072805
LW
4162 case KEY_hex:
4163 UNI(OP_HEX);
4164
4165 case KEY_if:
57843af0 4166 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4167 OPERATOR(IF);
4168
4169 case KEY_index:
a0d0e21e 4170 LOP(OP_INDEX,XTERM);
79072805
LW
4171
4172 case KEY_int:
4173 UNI(OP_INT);
4174
4175 case KEY_ioctl:
a0d0e21e 4176 LOP(OP_IOCTL,XTERM);
79072805
LW
4177
4178 case KEY_join:
a0d0e21e 4179 LOP(OP_JOIN,XTERM);
79072805
LW
4180
4181 case KEY_keys:
4182 UNI(OP_KEYS);
4183
4184 case KEY_kill:
a0d0e21e 4185 LOP(OP_KILL,XTERM);
79072805
LW
4186
4187 case KEY_last:
a0d0e21e 4188 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 4189 LOOPX(OP_LAST);
a0d0e21e 4190
79072805
LW
4191 case KEY_lc:
4192 UNI(OP_LC);
4193
4194 case KEY_lcfirst:
4195 UNI(OP_LCFIRST);
4196
4197 case KEY_local:
09bef843 4198 yylval.ival = 0;
79072805
LW
4199 OPERATOR(LOCAL);
4200
4201 case KEY_length:
4202 UNI(OP_LENGTH);
4203
4204 case KEY_lt:
4205 Rop(OP_SLT);
4206
4207 case KEY_le:
4208 Rop(OP_SLE);
4209
4210 case KEY_localtime:
4211 UNI(OP_LOCALTIME);
4212
4213 case KEY_log:
4214 UNI(OP_LOG);
4215
4216 case KEY_link:
a0d0e21e 4217 LOP(OP_LINK,XTERM);
79072805
LW
4218
4219 case KEY_listen:
a0d0e21e 4220 LOP(OP_LISTEN,XTERM);
79072805 4221
c0329465
MB
4222 case KEY_lock:
4223 UNI(OP_LOCK);
4224
79072805
LW
4225 case KEY_lstat:
4226 UNI(OP_LSTAT);
4227
4228 case KEY_m:
8782bef2 4229 s = scan_pat(s,OP_MATCH);
79072805
LW
4230 TERM(sublex_start());
4231
a0d0e21e 4232 case KEY_map:
4e4e412b
GS
4233 LOP(OP_MAPSTART, *s == '(' ? XTERM : XREF);
4234
79072805 4235 case KEY_mkdir:
a0d0e21e 4236 LOP(OP_MKDIR,XTERM);
79072805
LW
4237
4238 case KEY_msgctl:
a0d0e21e 4239 LOP(OP_MSGCTL,XTERM);
79072805
LW
4240
4241 case KEY_msgget:
a0d0e21e 4242 LOP(OP_MSGGET,XTERM);
79072805
LW
4243
4244 case KEY_msgrcv:
a0d0e21e 4245 LOP(OP_MSGRCV,XTERM);
79072805
LW
4246
4247 case KEY_msgsnd:
a0d0e21e 4248 LOP(OP_MSGSND,XTERM);
79072805 4249
77ca0c92 4250 case KEY_our:
93a17b20 4251 case KEY_my:
77ca0c92 4252 PL_in_my = tmp;
c750a3ec 4253 s = skipspace(s);
834a4ddd 4254 if (isIDFIRST_lazy(s)) {
3280af22 4255 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
4256 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4257 goto really_sub;
3280af22
NIS
4258 PL_in_my_stash = gv_stashpv(PL_tokenbuf, FALSE);
4259 if (!PL_in_my_stash) {
c750a3ec 4260 char tmpbuf[1024];
3280af22
NIS
4261 PL_bufptr = s;
4262 sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
4263 yyerror(tmpbuf);
4264 }
4265 }
09bef843 4266 yylval.ival = 1;
55497cff 4267 OPERATOR(MY);
93a17b20 4268
79072805 4269 case KEY_next:
a0d0e21e 4270 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4271 LOOPX(OP_NEXT);
4272
4273 case KEY_ne:
4274 Eop(OP_SNE);
4275
a0d0e21e 4276 case KEY_no:
3280af22 4277 if (PL_expect != XSTATE)
a0d0e21e
LW
4278 yyerror("\"no\" not allowed in expression");
4279 s = force_word(s,WORD,FALSE,TRUE,FALSE);
89bfa8cd 4280 s = force_version(s);
a0d0e21e
LW
4281 yylval.ival = 0;
4282 OPERATOR(USE);
4283
4284 case KEY_not:
2d2e263d
LW
4285 if (*s == '(' || (s = skipspace(s), *s == '('))
4286 FUN1(OP_NOT);
4287 else
4288 OPERATOR(NOTOP);
a0d0e21e 4289
79072805 4290 case KEY_open:
93a17b20 4291 s = skipspace(s);
834a4ddd 4292 if (isIDFIRST_lazy(s)) {
93a17b20 4293 char *t;
834a4ddd 4294 for (d = s; isALNUM_lazy(d); d++) ;
93a17b20 4295 t = skipspace(d);
0453d815
PM
4296 if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_AMBIGUOUS))
4297 Perl_warner(aTHX_ WARN_AMBIGUOUS,
4298 "Precedence problem: open %.*s should be open(%.*s)",
4299 d-s,s, d-s,s);
93a17b20 4300 }
a0d0e21e 4301 LOP(OP_OPEN,XTERM);
79072805 4302
463ee0b2 4303 case KEY_or:
a0d0e21e 4304 yylval.ival = OP_OR;
463ee0b2
LW
4305 OPERATOR(OROP);
4306
79072805
LW
4307 case KEY_ord:
4308 UNI(OP_ORD);
4309
4310 case KEY_oct:
4311 UNI(OP_OCT);
4312
4313 case KEY_opendir:
a0d0e21e 4314 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
4315
4316 case KEY_print:
3280af22 4317 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4318 LOP(OP_PRINT,XREF);
79072805
LW
4319
4320 case KEY_printf:
3280af22 4321 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4322 LOP(OP_PRTF,XREF);
79072805 4323
c07a80fd 4324 case KEY_prototype:
4325 UNI(OP_PROTOTYPE);
4326
79072805 4327 case KEY_push:
a0d0e21e 4328 LOP(OP_PUSH,XTERM);
79072805
LW
4329
4330 case KEY_pop:
4331 UNI(OP_POP);
4332
a0d0e21e
LW
4333 case KEY_pos:
4334 UNI(OP_POS);
4335
79072805 4336 case KEY_pack:
a0d0e21e 4337 LOP(OP_PACK,XTERM);
79072805
LW
4338
4339 case KEY_package:
a0d0e21e 4340 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
4341 OPERATOR(PACKAGE);
4342
4343 case KEY_pipe:
a0d0e21e 4344 LOP(OP_PIPE_OP,XTERM);
79072805
LW
4345
4346 case KEY_q:
09bef843 4347 s = scan_str(s,FALSE,FALSE);
79072805 4348 if (!s)
85e6fe83 4349 missingterm((char*)0);
79072805
LW
4350 yylval.ival = OP_CONST;
4351 TERM(sublex_start());
4352
a0d0e21e
LW
4353 case KEY_quotemeta:
4354 UNI(OP_QUOTEMETA);
4355
8990e307 4356 case KEY_qw:
09bef843 4357 s = scan_str(s,FALSE,FALSE);
8990e307 4358 if (!s)
85e6fe83 4359 missingterm((char*)0);
8127e0e3
GS
4360 force_next(')');
4361 if (SvCUR(PL_lex_stuff)) {
4362 OP *words = Nullop;
4363 int warned = 0;
3280af22 4364 d = SvPV_force(PL_lex_stuff, len);
8127e0e3
GS
4365 while (len) {
4366 for (; isSPACE(*d) && len; --len, ++d) ;
4367 if (len) {
4368 char *b = d;
4369 if (!warned && ckWARN(WARN_SYNTAX)) {
4370 for (; !isSPACE(*d) && len; --len, ++d) {
4371 if (*d == ',') {
cea2e8a9 4372 Perl_warner(aTHX_ WARN_SYNTAX,
8127e0e3
GS
4373 "Possible attempt to separate words with commas");
4374 ++warned;
4375 }
4376 else if (*d == '#') {
cea2e8a9 4377 Perl_warner(aTHX_ WARN_SYNTAX,
8127e0e3
GS
4378 "Possible attempt to put comments in qw() list");
4379 ++warned;
4380 }
4381 }
4382 }
4383 else {
4384 for (; !isSPACE(*d) && len; --len, ++d) ;
4385 }
4386 words = append_elem(OP_LIST, words,
4387 newSVOP(OP_CONST, 0, newSVpvn(b, d-b)));
55497cff 4388 }
4389 }
8127e0e3
GS
4390 if (words) {
4391 PL_nextval[PL_nexttoke].opval = words;
4392 force_next(THING);
4393 }
55497cff 4394 }
8127e0e3
GS
4395 if (PL_lex_stuff)
4396 SvREFCNT_dec(PL_lex_stuff);
3280af22 4397 PL_lex_stuff = Nullsv;
3280af22 4398 PL_expect = XTERM;
8127e0e3 4399 TOKEN('(');
8990e307 4400
79072805 4401 case KEY_qq:
09bef843 4402 s = scan_str(s,FALSE,FALSE);
79072805 4403 if (!s)
85e6fe83 4404 missingterm((char*)0);
a0d0e21e 4405 yylval.ival = OP_STRINGIFY;
3280af22
NIS
4406 if (SvIVX(PL_lex_stuff) == '\'')
4407 SvIVX(PL_lex_stuff) = 0; /* qq'$foo' should intepolate */
79072805
LW
4408 TERM(sublex_start());
4409
8782bef2
GB
4410 case KEY_qr:
4411 s = scan_pat(s,OP_QR);
4412 TERM(sublex_start());
4413
79072805 4414 case KEY_qx:
09bef843 4415 s = scan_str(s,FALSE,FALSE);
79072805 4416 if (!s)
85e6fe83 4417 missingterm((char*)0);
79072805
LW
4418 yylval.ival = OP_BACKTICK;
4419 set_csh();
4420 TERM(sublex_start());
4421
4422 case KEY_return:
4423 OLDLOP(OP_RETURN);
4424
4425 case KEY_require:
a7cb1f99
GS
4426 s = skipspace(s);
4427 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
4428 s = force_version(s);
4429 }
4430 else {
4431 *PL_tokenbuf = '\0';
4432 s = force_word(s,WORD,TRUE,TRUE,FALSE);
4433 if (isIDFIRST_lazy(PL_tokenbuf))
4434 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
4435 else if (*s == '<')
4436 yyerror("<> should be quotes");
4437 }
463ee0b2 4438 UNI(OP_REQUIRE);
79072805
LW
4439
4440 case KEY_reset:
4441 UNI(OP_RESET);
4442
4443 case KEY_redo:
a0d0e21e 4444 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4445 LOOPX(OP_REDO);
4446
4447 case KEY_rename:
a0d0e21e 4448 LOP(OP_RENAME,XTERM);
79072805
LW
4449
4450 case KEY_rand:
4451 UNI(OP_RAND);
4452
4453 case KEY_rmdir:
4454 UNI(OP_RMDIR);
4455
4456 case KEY_rindex:
a0d0e21e 4457 LOP(OP_RINDEX,XTERM);
79072805
LW
4458
4459 case KEY_read:
a0d0e21e 4460 LOP(OP_READ,XTERM);
79072805
LW
4461
4462 case KEY_readdir:
4463 UNI(OP_READDIR);
4464
93a17b20
LW
4465 case KEY_readline:
4466 set_csh();
4467 UNI(OP_READLINE);
4468
4469 case KEY_readpipe:
4470 set_csh();
4471 UNI(OP_BACKTICK);
4472
79072805
LW
4473 case KEY_rewinddir:
4474 UNI(OP_REWINDDIR);
4475
4476 case KEY_recv:
a0d0e21e 4477 LOP(OP_RECV,XTERM);
79072805
LW
4478
4479 case KEY_reverse:
a0d0e21e 4480 LOP(OP_REVERSE,XTERM);
79072805
LW
4481
4482 case KEY_readlink:
4483 UNI(OP_READLINK);
4484
4485 case KEY_ref:
4486 UNI(OP_REF);
4487
4488 case KEY_s:
4489 s = scan_subst(s);
4490 if (yylval.opval)
4491 TERM(sublex_start());
4492 else
4493 TOKEN(1); /* force error */
4494
a0d0e21e
LW
4495 case KEY_chomp:
4496 UNI(OP_CHOMP);
4497
79072805
LW
4498 case KEY_scalar:
4499 UNI(OP_SCALAR);
4500
4501 case KEY_select:
a0d0e21e 4502 LOP(OP_SELECT,XTERM);
79072805
LW
4503
4504 case KEY_seek:
a0d0e21e 4505 LOP(OP_SEEK,XTERM);
79072805
LW
4506
4507 case KEY_semctl:
a0d0e21e 4508 LOP(OP_SEMCTL,XTERM);
79072805
LW
4509
4510 case KEY_semget:
a0d0e21e 4511 LOP(OP_SEMGET,XTERM);
79072805
LW
4512
4513 case KEY_semop:
a0d0e21e 4514 LOP(OP_SEMOP,XTERM);
79072805
LW
4515
4516 case KEY_send:
a0d0e21e 4517 LOP(OP_SEND,XTERM);
79072805
LW
4518
4519 case KEY_setpgrp:
a0d0e21e 4520 LOP(OP_SETPGRP,XTERM);
79072805
LW
4521
4522 case KEY_setpriority:
a0d0e21e 4523 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
4524
4525 case KEY_sethostent:
ff68c719 4526 UNI(OP_SHOSTENT);
79072805
LW
4527
4528 case KEY_setnetent:
ff68c719 4529 UNI(OP_SNETENT);
79072805
LW
4530
4531 case KEY_setservent:
ff68c719 4532 UNI(OP_SSERVENT);
79072805
LW
4533
4534 case KEY_setprotoent:
ff68c719 4535 UNI(OP_SPROTOENT);
79072805
LW
4536
4537 case KEY_setpwent:
4538 FUN0(OP_SPWENT);
4539
4540 case KEY_setgrent:
4541 FUN0(OP_SGRENT);
4542
4543 case KEY_seekdir:
a0d0e21e 4544 LOP(OP_SEEKDIR,XTERM);
79072805
LW
4545
4546 case KEY_setsockopt:
a0d0e21e 4547 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
4548
4549 case KEY_shift:
4550 UNI(OP_SHIFT);
4551
4552 case KEY_shmctl:
a0d0e21e 4553 LOP(OP_SHMCTL,XTERM);
79072805
LW
4554
4555 case KEY_shmget:
a0d0e21e 4556 LOP(OP_SHMGET,XTERM);
79072805
LW
4557
4558 case KEY_shmread:
a0d0e21e 4559 LOP(OP_SHMREAD,XTERM);
79072805
LW
4560
4561 case KEY_shmwrite:
a0d0e21e 4562 LOP(OP_SHMWRITE,XTERM);
79072805
LW
4563
4564 case KEY_shutdown:
a0d0e21e 4565 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
4566
4567 case KEY_sin:
4568 UNI(OP_SIN);
4569
4570 case KEY_sleep:
4571 UNI(OP_SLEEP);
4572
4573 case KEY_socket:
a0d0e21e 4574 LOP(OP_SOCKET,XTERM);
79072805
LW
4575
4576 case KEY_socketpair:
a0d0e21e 4577 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
4578
4579 case KEY_sort:
3280af22 4580 checkcomma(s,PL_tokenbuf,"subroutine name");
79072805
LW
4581 s = skipspace(s);
4582 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 4583 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 4584 PL_expect = XTERM;
15f0808c 4585 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 4586 LOP(OP_SORT,XREF);
79072805
LW
4587
4588 case KEY_split:
a0d0e21e 4589 LOP(OP_SPLIT,XTERM);
79072805
LW
4590
4591 case KEY_sprintf:
a0d0e21e 4592 LOP(OP_SPRINTF,XTERM);
79072805
LW
4593
4594 case KEY_splice:
a0d0e21e 4595 LOP(OP_SPLICE,XTERM);
79072805
LW
4596
4597 case KEY_sqrt:
4598 UNI(OP_SQRT);
4599
4600 case KEY_srand:
4601 UNI(OP_SRAND);
4602
4603 case KEY_stat:
4604 UNI(OP_STAT);
4605
4606 case KEY_study:
79072805
LW
4607 UNI(OP_STUDY);
4608
4609 case KEY_substr:
a0d0e21e 4610 LOP(OP_SUBSTR,XTERM);
79072805
LW
4611
4612 case KEY_format:
4613 case KEY_sub:
93a17b20 4614 really_sub:
09bef843 4615 {
3280af22 4616 char tmpbuf[sizeof PL_tokenbuf];
b1b65b59 4617 SSize_t tboffset;
09bef843
SB
4618 expectation attrful;
4619 bool have_name, have_proto;
4620 int key = tmp;
4621
4622 s = skipspace(s);
4623
4624 if (isIDFIRST_lazy(s) || *s == '\'' ||
4625 (*s == ':' && s[1] == ':'))
4626 {
4627 PL_expect = XBLOCK;
4628 attrful = XATTRBLOCK;
b1b65b59
JH
4629 /* remember buffer pos'n for later force_word */
4630 tboffset = s - PL_oldbufptr;
09bef843
SB
4631 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
4632 if (strchr(tmpbuf, ':'))
4633 sv_setpv(PL_subname, tmpbuf);
4634 else {
4635 sv_setsv(PL_subname,PL_curstname);
4636 sv_catpvn(PL_subname,"::",2);
4637 sv_catpvn(PL_subname,tmpbuf,len);
4638 }
4639 s = skipspace(d);
4640 have_name = TRUE;
4641 }
463ee0b2 4642 else {
09bef843
SB
4643 if (key == KEY_my)
4644 Perl_croak(aTHX_ "Missing name in \"my sub\"");
4645 PL_expect = XTERMBLOCK;
4646 attrful = XATTRTERM;
4647 sv_setpv(PL_subname,"?");
4648 have_name = FALSE;
463ee0b2 4649 }
4633a7c4 4650
09bef843
SB
4651 if (key == KEY_format) {
4652 if (*s == '=')
4653 PL_lex_formbrack = PL_lex_brackets + 1;
4654 if (have_name)
b1b65b59
JH
4655 (void) force_word(PL_oldbufptr + tboffset, WORD,
4656 FALSE, TRUE, TRUE);
09bef843
SB
4657 OPERATOR(FORMAT);
4658 }
79072805 4659
09bef843
SB
4660 /* Look for a prototype */
4661 if (*s == '(') {
4662 char *p;
4663
4664 s = scan_str(s,FALSE,FALSE);
4665 if (!s) {
4666 if (PL_lex_stuff)
4667 SvREFCNT_dec(PL_lex_stuff);
4668 PL_lex_stuff = Nullsv;
4669 Perl_croak(aTHX_ "Prototype not terminated");
4670 }
4671 /* strip spaces */
4672 d = SvPVX(PL_lex_stuff);
4673 tmp = 0;
4674 for (p = d; *p; ++p) {
4675 if (!isSPACE(*p))
4676 d[tmp++] = *p;
4677 }
4678 d[tmp] = '\0';
4679 SvCUR(PL_lex_stuff) = tmp;
4680 have_proto = TRUE;
68dc0745 4681
09bef843 4682 s = skipspace(s);
4633a7c4 4683 }
09bef843
SB
4684 else
4685 have_proto = FALSE;
4686
4687 if (*s == ':' && s[1] != ':')
4688 PL_expect = attrful;
4689
4690 if (have_proto) {
b1b65b59
JH
4691 PL_nextval[PL_nexttoke].opval =
4692 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
09bef843
SB
4693 PL_lex_stuff = Nullsv;
4694 force_next(THING);
68dc0745 4695 }
09bef843
SB
4696 if (!have_name) {
4697 sv_setpv(PL_subname,"__ANON__");
4698 TOKEN(ANONSUB);
4633a7c4 4699 }
b1b65b59
JH
4700 (void) force_word(PL_oldbufptr + tboffset, WORD,
4701 FALSE, TRUE, TRUE);
09bef843
SB
4702 if (key == KEY_my)
4703 TOKEN(MYSUB);
4704 TOKEN(SUB);
4633a7c4 4705 }
79072805
LW
4706
4707 case KEY_system:
4708 set_csh();
a0d0e21e 4709 LOP(OP_SYSTEM,XREF);
79072805
LW
4710
4711 case KEY_symlink:
a0d0e21e 4712 LOP(OP_SYMLINK,XTERM);
79072805
LW
4713
4714 case KEY_syscall:
a0d0e21e 4715 LOP(OP_SYSCALL,XTERM);
79072805 4716
c07a80fd 4717 case KEY_sysopen:
4718 LOP(OP_SYSOPEN,XTERM);
4719
137443ea 4720 case KEY_sysseek:
4721 LOP(OP_SYSSEEK,XTERM);
4722
79072805 4723 case KEY_sysread:
a0d0e21e 4724 LOP(OP_SYSREAD,XTERM);
79072805
LW
4725
4726 case KEY_syswrite:
a0d0e21e 4727 LOP(OP_SYSWRITE,XTERM);
79072805
LW
4728
4729 case KEY_tr:
4730 s = scan_trans(s);
4731 TERM(sublex_start());
4732
4733 case KEY_tell:
4734 UNI(OP_TELL);
4735
4736 case KEY_telldir:
4737 UNI(OP_TELLDIR);
4738
463ee0b2 4739 case KEY_tie:
a0d0e21e 4740 LOP(OP_TIE,XTERM);
463ee0b2 4741
c07a80fd 4742 case KEY_tied:
4743 UNI(OP_TIED);
4744
79072805
LW
4745 case KEY_time:
4746 FUN0(OP_TIME);
4747
4748 case KEY_times:
4749 FUN0(OP_TMS);
4750
4751 case KEY_truncate:
a0d0e21e 4752 LOP(OP_TRUNCATE,XTERM);
79072805
LW
4753
4754 case KEY_uc:
4755 UNI(OP_UC);
4756
4757 case KEY_ucfirst:
4758 UNI(OP_UCFIRST);
4759
463ee0b2
LW
4760 case KEY_untie:
4761 UNI(OP_UNTIE);
4762
79072805 4763 case KEY_until:
57843af0 4764 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4765 OPERATOR(UNTIL);
4766
4767 case KEY_unless:
57843af0 4768 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4769 OPERATOR(UNLESS);
4770
4771 case KEY_unlink:
a0d0e21e 4772 LOP(OP_UNLINK,XTERM);
79072805
LW
4773
4774 case KEY_undef:
4775 UNI(OP_UNDEF);
4776
4777 case KEY_unpack:
a0d0e21e 4778 LOP(OP_UNPACK,XTERM);
79072805
LW
4779
4780 case KEY_utime:
a0d0e21e 4781 LOP(OP_UTIME,XTERM);
79072805
LW
4782
4783 case KEY_umask:
599cee73 4784 if (ckWARN(WARN_OCTAL)) {
3280af22 4785 for (d = s; d < PL_bufend && (isSPACE(*d) || *d == '('); d++) ;
4438c4b7
JH
4786 if (*d != '0' && isDIGIT(*d))
4787 Perl_warner(aTHX_ WARN_OCTAL,
4788 "umask: argument is missing initial 0");
748a9306 4789 }
79072805
LW
4790 UNI(OP_UMASK);
4791
4792 case KEY_unshift:
a0d0e21e
LW
4793 LOP(OP_UNSHIFT,XTERM);
4794
4795 case KEY_use:
3280af22 4796 if (PL_expect != XSTATE)
a0d0e21e 4797 yyerror("\"use\" not allowed in expression");
89bfa8cd 4798 s = skipspace(s);
a7cb1f99 4799 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
89bfa8cd 4800 s = force_version(s);
a7cb1f99 4801 if (*s == ';' || (s = skipspace(s), *s == ';')) {
3280af22 4802 PL_nextval[PL_nexttoke].opval = Nullop;
89bfa8cd 4803 force_next(WORD);
4804 }
4805 }
4806 else {
4807 s = force_word(s,WORD,FALSE,TRUE,FALSE);
4808 s = force_version(s);
4809 }
a0d0e21e
LW
4810 yylval.ival = 1;
4811 OPERATOR(USE);
79072805
LW
4812
4813 case KEY_values:
4814 UNI(OP_VALUES);
4815
4816 case KEY_vec:
a0d0e21e 4817 LOP(OP_VEC,XTERM);
79072805
LW
4818
4819 case KEY_while:
57843af0 4820 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4821 OPERATOR(WHILE);
4822
4823 case KEY_warn:
3280af22 4824 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 4825 LOP(OP_WARN,XTERM);
79072805
LW
4826
4827 case KEY_wait:
4828 FUN0(OP_WAIT);
4829
4830 case KEY_waitpid:
a0d0e21e 4831 LOP(OP_WAITPID,XTERM);
79072805
LW
4832
4833 case KEY_wantarray:
4834 FUN0(OP_WANTARRAY);
4835
4836 case KEY_write:
9d116dd7
JH
4837#ifdef EBCDIC
4838 {
4839 static char ctl_l[2];
4840
4841 if (ctl_l[0] == '\0')
4842 ctl_l[0] = toCTRL('L');
4843 gv_fetchpv(ctl_l,TRUE, SVt_PV);
4844 }
4845#else
4846 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
4847#endif
79072805
LW
4848 UNI(OP_ENTERWRITE);
4849
4850 case KEY_x:
3280af22 4851 if (PL_expect == XOPERATOR)
79072805
LW
4852 Mop(OP_REPEAT);
4853 check_uni();
4854 goto just_a_word;
4855
a0d0e21e
LW
4856 case KEY_xor:
4857 yylval.ival = OP_XOR;
4858 OPERATOR(OROP);
4859
79072805
LW
4860 case KEY_y:
4861 s = scan_trans(s);
4862 TERM(sublex_start());
4863 }
49dc05e3 4864 }}
79072805
LW
4865}
4866
4867I32
864dbfa3 4868Perl_keyword(pTHX_ register char *d, I32 len)
79072805
LW
4869{
4870 switch (*d) {
4871 case '_':
4872 if (d[1] == '_') {
a0d0e21e 4873 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
68dc0745 4874 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
4875 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
e50aee73 4876 if (strEQ(d,"__DATA__")) return KEY___DATA__;
79072805
LW
4877 if (strEQ(d,"__END__")) return KEY___END__;
4878 }
4879 break;
8990e307
LW
4880 case 'A':
4881 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
4882 break;
79072805 4883 case 'a':
463ee0b2
LW
4884 switch (len) {
4885 case 3:
a0d0e21e
LW
4886 if (strEQ(d,"and")) return -KEY_and;
4887 if (strEQ(d,"abs")) return -KEY_abs;
85e6fe83 4888 break;
463ee0b2 4889 case 5:
a0d0e21e
LW
4890 if (strEQ(d,"alarm")) return -KEY_alarm;
4891 if (strEQ(d,"atan2")) return -KEY_atan2;
463ee0b2
LW
4892 break;
4893 case 6:
a0d0e21e 4894 if (strEQ(d,"accept")) return -KEY_accept;
463ee0b2
LW
4895 break;
4896 }
79072805
LW
4897 break;
4898 case 'B':
4899 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
93a17b20 4900 break;
79072805 4901 case 'b':
a0d0e21e
LW
4902 if (strEQ(d,"bless")) return -KEY_bless;
4903 if (strEQ(d,"bind")) return -KEY_bind;
4904 if (strEQ(d,"binmode")) return -KEY_binmode;
4905 break;
4906 case 'C':
4907 if (strEQ(d,"CORE")) return -KEY_CORE;
79072805
LW
4908 break;
4909 case 'c':
4910 switch (len) {
4911 case 3:
a0d0e21e
LW
4912 if (strEQ(d,"cmp")) return -KEY_cmp;
4913 if (strEQ(d,"chr")) return -KEY_chr;
4914 if (strEQ(d,"cos")) return -KEY_cos;
79072805
LW
4915 break;
4916 case 4:
4917 if (strEQ(d,"chop")) return KEY_chop;
4918 break;
4919 case 5:
a0d0e21e
LW
4920 if (strEQ(d,"close")) return -KEY_close;
4921 if (strEQ(d,"chdir")) return -KEY_chdir;
4922 if (strEQ(d,"chomp")) return KEY_chomp;
4923 if (strEQ(d,"chmod")) return -KEY_chmod;
4924 if (strEQ(d,"chown")) return -KEY_chown;
4925 if (strEQ(d,"crypt")) return -KEY_crypt;
79072805
LW
4926 break;
4927 case 6:
a0d0e21e
LW
4928 if (strEQ(d,"chroot")) return -KEY_chroot;
4929 if (strEQ(d,"caller")) return -KEY_caller;
79072805
LW
4930 break;
4931 case 7:
a0d0e21e 4932 if (strEQ(d,"connect")) return -KEY_connect;
79072805
LW
4933 break;
4934 case 8:
a0d0e21e
LW
4935 if (strEQ(d,"closedir")) return -KEY_closedir;
4936 if (strEQ(d,"continue")) return -KEY_continue;
79072805
LW
4937 break;
4938 }
4939 break;
ed6116ce
LW
4940 case 'D':
4941 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
4942 break;
79072805
LW
4943 case 'd':
4944 switch (len) {
4945 case 2:
4946 if (strEQ(d,"do")) return KEY_do;
4947 break;
4948 case 3:
a0d0e21e 4949 if (strEQ(d,"die")) return -KEY_die;
79072805
LW
4950 break;
4951 case 4:
a0d0e21e 4952 if (strEQ(d,"dump")) return -KEY_dump;
79072805
LW
4953 break;
4954 case 6:
4955 if (strEQ(d,"delete")) return KEY_delete;
4956 break;
4957 case 7:
4958 if (strEQ(d,"defined")) return KEY_defined;
a0d0e21e 4959 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
79072805
LW
4960 break;
4961 case 8:
a0d0e21e 4962 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
79072805
LW
4963 break;
4964 }
4965 break;
4966 case 'E':
a0d0e21e 4967 if (strEQ(d,"EQ")) { deprecate(d); return -KEY_eq;}
79072805
LW
4968 if (strEQ(d,"END")) return KEY_END;
4969 break;
4970 case 'e':
4971 switch (len) {
4972 case 2:
a0d0e21e 4973 if (strEQ(d,"eq")) return -KEY_eq;
79072805
LW
4974 break;
4975 case 3:
a0d0e21e
LW
4976 if (strEQ(d,"eof")) return -KEY_eof;
4977 if (strEQ(d,"exp")) return -KEY_exp;
79072805
LW
4978 break;
4979 case 4:
4980 if (strEQ(d,"else")) return KEY_else;
a0d0e21e 4981 if (strEQ(d,"exit")) return -KEY_exit;
79072805 4982 if (strEQ(d,"eval")) return KEY_eval;
a0d0e21e 4983 if (strEQ(d,"exec")) return -KEY_exec;
79072805
LW
4984 if (strEQ(d,"each")) return KEY_each;
4985 break;
4986 case 5:
4987 if (strEQ(d,"elsif")) return KEY_elsif;
4988 break;
a0d0e21e
LW
4989 case 6:
4990 if (strEQ(d,"exists")) return KEY_exists;
cea2e8a9 4991 if (strEQ(d,"elseif")) Perl_warn(aTHX_ "elseif should be elsif");
a0d0e21e 4992 break;
79072805 4993 case 8:
a0d0e21e
LW
4994 if (strEQ(d,"endgrent")) return -KEY_endgrent;
4995 if (strEQ(d,"endpwent")) return -KEY_endpwent;
79072805
LW
4996 break;
4997 case 9:
a0d0e21e 4998 if (strEQ(d,"endnetent")) return -KEY_endnetent;
79072805
LW
4999 break;
5000 case 10:
a0d0e21e
LW
5001 if (strEQ(d,"endhostent")) return -KEY_endhostent;
5002 if (strEQ(d,"endservent")) return -KEY_endservent;
79072805
LW
5003 break;
5004 case 11:
a0d0e21e 5005 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
79072805 5006 break;
a687059c 5007 }
a687059c 5008 break;
79072805
LW
5009 case 'f':
5010 switch (len) {
5011 case 3:
5012 if (strEQ(d,"for")) return KEY_for;
5013 break;
5014 case 4:
a0d0e21e 5015 if (strEQ(d,"fork")) return -KEY_fork;
79072805
LW
5016 break;
5017 case 5:
a0d0e21e
LW
5018 if (strEQ(d,"fcntl")) return -KEY_fcntl;
5019 if (strEQ(d,"flock")) return -KEY_flock;
79072805
LW
5020 break;
5021 case 6:
5022 if (strEQ(d,"format")) return KEY_format;
a0d0e21e 5023 if (strEQ(d,"fileno")) return -KEY_fileno;
79072805
LW
5024 break;
5025 case 7:
5026 if (strEQ(d,"foreach")) return KEY_foreach;
5027 break;
5028 case 8:
a0d0e21e 5029 if (strEQ(d,"formline")) return -KEY_formline;
79072805 5030 break;
378cc40b 5031 }
a687059c 5032 break;
79072805
LW
5033 case 'G':
5034 if (len == 2) {
a0d0e21e
LW
5035 if (strEQ(d,"GT")) { deprecate(d); return -KEY_gt;}
5036 if (strEQ(d,"GE")) { deprecate(d); return -KEY_ge;}
9f68db38 5037 }
a687059c 5038 break;
79072805 5039 case 'g':
a687059c
LW
5040 if (strnEQ(d,"get",3)) {
5041 d += 3;
5042 if (*d == 'p') {
79072805
LW
5043 switch (len) {
5044 case 7:
a0d0e21e
LW
5045 if (strEQ(d,"ppid")) return -KEY_getppid;
5046 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
79072805
LW
5047 break;
5048 case 8:
a0d0e21e
LW
5049 if (strEQ(d,"pwent")) return -KEY_getpwent;
5050 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
5051 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
79072805
LW
5052 break;
5053 case 11:
a0d0e21e
LW
5054 if (strEQ(d,"peername")) return -KEY_getpeername;
5055 if (strEQ(d,"protoent")) return -KEY_getprotoent;
5056 if (strEQ(d,"priority")) return -KEY_getpriority;
79072805
LW
5057 break;
5058 case 14:
a0d0e21e 5059 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
79072805
LW
5060 break;
5061 case 16:
a0d0e21e 5062 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
79072805
LW
5063 break;
5064 }
a687059c
LW
5065 }
5066 else if (*d == 'h') {
a0d0e21e
LW
5067 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
5068 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
5069 if (strEQ(d,"hostent")) return -KEY_gethostent;
a687059c
LW
5070 }
5071 else if (*d == 'n') {
a0d0e21e
LW
5072 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
5073 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
5074 if (strEQ(d,"netent")) return -KEY_getnetent;
a687059c
LW
5075 }
5076 else if (*d == 's') {
a0d0e21e
LW
5077 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
5078 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
5079 if (strEQ(d,"servent")) return -KEY_getservent;
5080 if (strEQ(d,"sockname")) return -KEY_getsockname;
5081 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
a687059c
LW
5082 }
5083 else if (*d == 'g') {
a0d0e21e
LW
5084 if (strEQ(d,"grent")) return -KEY_getgrent;
5085 if (strEQ(d,"grnam")) return -KEY_getgrnam;
5086 if (strEQ(d,"grgid")) return -KEY_getgrgid;
a687059c
LW
5087 }
5088 else if (*d == 'l') {
a0d0e21e 5089 if (strEQ(d,"login")) return -KEY_getlogin;
a687059c 5090 }
a0d0e21e 5091 else if (strEQ(d,"c")) return -KEY_getc;
79072805 5092 break;
a687059c 5093 }
79072805
LW
5094 switch (len) {
5095 case 2:
a0d0e21e
LW
5096 if (strEQ(d,"gt")) return -KEY_gt;
5097 if (strEQ(d,"ge")) return -KEY_ge;
79072805
LW
5098 break;
5099 case 4:
5100 if (strEQ(d,"grep")) return KEY_grep;
5101 if (strEQ(d,"goto")) return KEY_goto;
fb73857a 5102 if (strEQ(d,"glob")) return KEY_glob;
79072805
LW
5103 break;
5104 case 6:
a0d0e21e 5105 if (strEQ(d,"gmtime")) return -KEY_gmtime;
79072805 5106 break;
378cc40b 5107 }
a687059c 5108 break;
79072805 5109 case 'h':
a0d0e21e 5110 if (strEQ(d,"hex")) return -KEY_hex;
a687059c 5111 break;
7d07dbc2
MB
5112 case 'I':
5113 if (strEQ(d,"INIT")) return KEY_INIT;
5114 break;
79072805
LW
5115 case 'i':
5116 switch (len) {
5117 case 2:
5118 if (strEQ(d,"if")) return KEY_if;
5119 break;
5120 case 3:
a0d0e21e 5121 if (strEQ(d,"int")) return -KEY_int;
79072805
LW
5122 break;
5123 case 5:
a0d0e21e
LW
5124 if (strEQ(d,"index")) return -KEY_index;
5125 if (strEQ(d,"ioctl")) return -KEY_ioctl;
79072805
LW
5126 break;
5127 }
a687059c 5128 break;
79072805 5129 case 'j':
a0d0e21e 5130 if (strEQ(d,"join")) return -KEY_join;
a687059c 5131 break;
79072805
LW
5132 case 'k':
5133 if (len == 4) {
5134 if (strEQ(d,"keys")) return KEY_keys;
a0d0e21e 5135 if (strEQ(d,"kill")) return -KEY_kill;
663a0e37 5136 }
79072805
LW
5137 break;
5138 case 'L':
5139 if (len == 2) {
a0d0e21e
LW
5140 if (strEQ(d,"LT")) { deprecate(d); return -KEY_lt;}
5141 if (strEQ(d,"LE")) { deprecate(d); return -KEY_le;}
378cc40b 5142 }
79072805
LW
5143 break;
5144 case 'l':
5145 switch (len) {
5146 case 2:
a0d0e21e
LW
5147 if (strEQ(d,"lt")) return -KEY_lt;
5148 if (strEQ(d,"le")) return -KEY_le;
5149 if (strEQ(d,"lc")) return -KEY_lc;
79072805
LW
5150 break;
5151 case 3:
a0d0e21e 5152 if (strEQ(d,"log")) return -KEY_log;
79072805
LW
5153 break;
5154 case 4:
5155 if (strEQ(d,"last")) return KEY_last;
a0d0e21e 5156 if (strEQ(d,"link")) return -KEY_link;
c0329465 5157 if (strEQ(d,"lock")) return -KEY_lock;
395c3793 5158 break;
79072805
LW
5159 case 5:
5160 if (strEQ(d,"local")) return KEY_local;
a0d0e21e 5161 if (strEQ(d,"lstat")) return -KEY_lstat;
79072805
LW
5162 break;
5163 case 6:
a0d0e21e
LW
5164 if (strEQ(d,"length")) return -KEY_length;
5165 if (strEQ(d,"listen")) return -KEY_listen;
79072805
LW
5166 break;
5167 case 7:
a0d0e21e 5168 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
79072805
LW
5169 break;
5170 case 9:
a0d0e21e 5171 if (strEQ(d,"localtime")) return -KEY_localtime;
395c3793
LW
5172 break;
5173 }
a687059c 5174 break;
79072805
LW
5175 case 'm':
5176 switch (len) {
5177 case 1: return KEY_m;
93a17b20
LW
5178 case 2:
5179 if (strEQ(d,"my")) return KEY_my;
5180 break;
a0d0e21e
LW
5181 case 3:
5182 if (strEQ(d,"map")) return KEY_map;
5183 break;
79072805 5184 case 5:
a0d0e21e 5185 if (strEQ(d,"mkdir")) return -KEY_mkdir;
79072805
LW
5186 break;
5187 case 6:
a0d0e21e
LW
5188 if (strEQ(d,"msgctl")) return -KEY_msgctl;
5189 if (strEQ(d,"msgget")) return -KEY_msgget;
5190 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
5191 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
79072805
LW
5192 break;
5193 }
a687059c 5194 break;
79072805 5195 case 'N':
a0d0e21e 5196 if (strEQ(d,"NE")) { deprecate(d); return -KEY_ne;}
a687059c 5197 break;
79072805
LW
5198 case 'n':
5199 if (strEQ(d,"next")) return KEY_next;
a0d0e21e
LW
5200 if (strEQ(d,"ne")) return -KEY_ne;
5201 if (strEQ(d,"not")) return -KEY_not;
5202 if (strEQ(d,"no")) return KEY_no;
a687059c 5203 break;
79072805
LW
5204 case 'o':
5205 switch (len) {
463ee0b2 5206 case 2:
a0d0e21e 5207 if (strEQ(d,"or")) return -KEY_or;
463ee0b2 5208 break;
79072805 5209 case 3:
a0d0e21e
LW
5210 if (strEQ(d,"ord")) return -KEY_ord;
5211 if (strEQ(d,"oct")) return -KEY_oct;
77ca0c92 5212 if (strEQ(d,"our")) return KEY_our;
79072805
LW
5213 break;
5214 case 4:
a0d0e21e 5215 if (strEQ(d,"open")) return -KEY_open;
79072805
LW
5216 break;
5217 case 7:
a0d0e21e 5218 if (strEQ(d,"opendir")) return -KEY_opendir;
79072805 5219 break;
fe14fcc3 5220 }
a687059c 5221 break;
79072805
LW
5222 case 'p':
5223 switch (len) {
5224 case 3:
5225 if (strEQ(d,"pop")) return KEY_pop;
a0d0e21e 5226 if (strEQ(d,"pos")) return KEY_pos;
79072805
LW
5227 break;
5228 case 4:
5229 if (strEQ(d,"push")) return KEY_push;
a0d0e21e
LW
5230 if (strEQ(d,"pack")) return -KEY_pack;
5231 if (strEQ(d,"pipe")) return -KEY_pipe;
79072805
LW
5232 break;
5233 case 5:
5234 if (strEQ(d,"print")) return KEY_print;
5235 break;
5236 case 6:
5237 if (strEQ(d,"printf")) return KEY_printf;
5238 break;
5239 case 7:
5240 if (strEQ(d,"package")) return KEY_package;
5241 break;
c07a80fd 5242 case 9:
5243 if (strEQ(d,"prototype")) return KEY_prototype;
663a0e37 5244 }
79072805
LW
5245 break;
5246 case 'q':
5247 if (len <= 2) {
5248 if (strEQ(d,"q")) return KEY_q;
8782bef2 5249 if (strEQ(d,"qr")) return KEY_qr;
79072805 5250 if (strEQ(d,"qq")) return KEY_qq;
8990e307 5251 if (strEQ(d,"qw")) return KEY_qw;
79072805 5252 if (strEQ(d,"qx")) return KEY_qx;
663a0e37 5253 }
a0d0e21e 5254 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
79072805
LW
5255 break;
5256 case 'r':
5257 switch (len) {
5258 case 3:
a0d0e21e 5259 if (strEQ(d,"ref")) return -KEY_ref;
79072805
LW
5260 break;
5261 case 4:
a0d0e21e
LW
5262 if (strEQ(d,"read")) return -KEY_read;
5263 if (strEQ(d,"rand")) return -KEY_rand;
5264 if (strEQ(d,"recv")) return -KEY_recv;
79072805
LW
5265 if (strEQ(d,"redo")) return KEY_redo;
5266 break;
5267 case 5:
a0d0e21e
LW
5268 if (strEQ(d,"rmdir")) return -KEY_rmdir;
5269 if (strEQ(d,"reset")) return -KEY_reset;
79072805
LW
5270 break;
5271 case 6:
5272 if (strEQ(d,"return")) return KEY_return;
a0d0e21e
LW
5273 if (strEQ(d,"rename")) return -KEY_rename;
5274 if (strEQ(d,"rindex")) return -KEY_rindex;
79072805
LW
5275 break;
5276 case 7:
a0d0e21e
LW
5277 if (strEQ(d,"require")) return -KEY_require;
5278 if (strEQ(d,"reverse")) return -KEY_reverse;
5279 if (strEQ(d,"readdir")) return -KEY_readdir;
79072805
LW
5280 break;
5281 case 8:
a0d0e21e
LW
5282 if (strEQ(d,"readlink")) return -KEY_readlink;
5283 if (strEQ(d,"readline")) return -KEY_readline;
5284 if (strEQ(d,"readpipe")) return -KEY_readpipe;
79072805
LW
5285 break;
5286 case 9:
a0d0e21e 5287 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
79072805 5288 break;
a687059c 5289 }
79072805 5290 break;
4f25aa18
GS
5291 case 'S':
5292 if (strEQ(d,"STOP")) return KEY_STOP;
5293 break;
79072805 5294 case 's':
a687059c 5295 switch (d[1]) {
79072805 5296 case 0: return KEY_s;
a687059c 5297 case 'c':
79072805 5298 if (strEQ(d,"scalar")) return KEY_scalar;
a687059c
LW
5299 break;
5300 case 'e':
79072805
LW
5301 switch (len) {
5302 case 4:
a0d0e21e
LW
5303 if (strEQ(d,"seek")) return -KEY_seek;
5304 if (strEQ(d,"send")) return -KEY_send;
79072805
LW
5305 break;
5306 case 5:
a0d0e21e 5307 if (strEQ(d,"semop")) return -KEY_semop;
79072805
LW
5308 break;
5309 case 6:
a0d0e21e
LW
5310 if (strEQ(d,"select")) return -KEY_select;
5311 if (strEQ(d,"semctl")) return -KEY_semctl;
5312 if (strEQ(d,"semget")) return -KEY_semget;
79072805
LW
5313 break;
5314 case 7:
a0d0e21e
LW
5315 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
5316 if (strEQ(d,"seekdir")) return -KEY_seekdir;
79072805
LW
5317 break;
5318 case 8:
a0d0e21e
LW
5319 if (strEQ(d,"setpwent")) return -KEY_setpwent;
5320 if (strEQ(d,"setgrent")) return -KEY_setgrent;
79072805
LW
5321 break;
5322 case 9:
a0d0e21e 5323 if (strEQ(d,"setnetent")) return -KEY_setnetent;
79072805
LW
5324 break;
5325 case 10:
a0d0e21e
LW
5326 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
5327 if (strEQ(d,"sethostent")) return -KEY_sethostent;
5328 if (strEQ(d,"setservent")) return -KEY_setservent;
79072805
LW
5329 break;
5330 case 11:
a0d0e21e
LW
5331 if (strEQ(d,"setpriority")) return -KEY_setpriority;
5332 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
79072805
LW
5333 break;
5334 }
a687059c
LW
5335 break;
5336 case 'h':
79072805
LW
5337 switch (len) {
5338 case 5:
5339 if (strEQ(d,"shift")) return KEY_shift;
5340 break;
5341 case 6:
a0d0e21e
LW
5342 if (strEQ(d,"shmctl")) return -KEY_shmctl;
5343 if (strEQ(d,"shmget")) return -KEY_shmget;
79072805
LW
5344 break;
5345 case 7:
a0d0e21e 5346 if (strEQ(d,"shmread")) return -KEY_shmread;
79072805
LW
5347 break;
5348 case 8:
a0d0e21e
LW
5349 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
5350 if (strEQ(d,"shutdown")) return -KEY_shutdown;
79072805
LW
5351 break;
5352 }
a687059c
LW
5353 break;
5354 case 'i':
a0d0e21e 5355 if (strEQ(d,"sin")) return -KEY_sin;
a687059c
LW
5356 break;
5357 case 'l':
a0d0e21e 5358 if (strEQ(d,"sleep")) return -KEY_sleep;
a687059c
LW
5359 break;
5360 case 'o':
79072805 5361 if (strEQ(d,"sort")) return KEY_sort;
a0d0e21e
LW
5362 if (strEQ(d,"socket")) return -KEY_socket;
5363 if (strEQ(d,"socketpair")) return -KEY_socketpair;
a687059c
LW
5364 break;
5365 case 'p':
79072805 5366 if (strEQ(d,"split")) return KEY_split;
a0d0e21e 5367 if (strEQ(d,"sprintf")) return -KEY_sprintf;
79072805 5368 if (strEQ(d,"splice")) return KEY_splice;
a687059c
LW
5369 break;
5370 case 'q':
a0d0e21e 5371 if (strEQ(d,"sqrt")) return -KEY_sqrt;
a687059c
LW
5372 break;
5373 case 'r':
a0d0e21e 5374 if (strEQ(d,"srand")) return -KEY_srand;
a687059c
LW
5375 break;
5376 case 't':
a0d0e21e 5377 if (strEQ(d,"stat")) return -KEY_stat;
79072805 5378 if (strEQ(d,"study")) return KEY_study;
a687059c
LW
5379 break;
5380 case 'u':
a0d0e21e 5381 if (strEQ(d,"substr")) return -KEY_substr;
79072805 5382 if (strEQ(d,"sub")) return KEY_sub;
a687059c
LW
5383 break;
5384 case 'y':
79072805
LW
5385 switch (len) {
5386 case 6:
a0d0e21e 5387 if (strEQ(d,"system")) return -KEY_system;
79072805
LW
5388 break;
5389 case 7:
a0d0e21e
LW
5390 if (strEQ(d,"symlink")) return -KEY_symlink;
5391 if (strEQ(d,"syscall")) return -KEY_syscall;
137443ea 5392 if (strEQ(d,"sysopen")) return -KEY_sysopen;
5393 if (strEQ(d,"sysread")) return -KEY_sysread;
5394 if (strEQ(d,"sysseek")) return -KEY_sysseek;
79072805
LW
5395 break;
5396 case 8:
a0d0e21e 5397 if (strEQ(d,"syswrite")) return -KEY_syswrite;
79072805 5398 break;
a687059c 5399 }
a687059c
LW
5400 break;
5401 }
5402 break;
79072805
LW
5403 case 't':
5404 switch (len) {
5405 case 2:
5406 if (strEQ(d,"tr")) return KEY_tr;
5407 break;
463ee0b2
LW
5408 case 3:
5409 if (strEQ(d,"tie")) return KEY_tie;
5410 break;
79072805 5411 case 4:
a0d0e21e 5412 if (strEQ(d,"tell")) return -KEY_tell;
c07a80fd 5413 if (strEQ(d,"tied")) return KEY_tied;
a0d0e21e 5414 if (strEQ(d,"time")) return -KEY_time;
79072805
LW
5415 break;
5416 case 5:
a0d0e21e 5417 if (strEQ(d,"times")) return -KEY_times;
79072805
LW
5418 break;
5419 case 7:
a0d0e21e 5420 if (strEQ(d,"telldir")) return -KEY_telldir;
79072805
LW
5421 break;
5422 case 8:
a0d0e21e 5423 if (strEQ(d,"truncate")) return -KEY_truncate;
79072805 5424 break;
378cc40b 5425 }
a687059c 5426 break;
79072805
LW
5427 case 'u':
5428 switch (len) {
5429 case 2:
a0d0e21e
LW
5430 if (strEQ(d,"uc")) return -KEY_uc;
5431 break;
5432 case 3:
5433 if (strEQ(d,"use")) return KEY_use;
79072805
LW
5434 break;
5435 case 5:
5436 if (strEQ(d,"undef")) return KEY_undef;
5437 if (strEQ(d,"until")) return KEY_until;
463ee0b2 5438 if (strEQ(d,"untie")) return KEY_untie;
a0d0e21e
LW
5439 if (strEQ(d,"utime")) return -KEY_utime;
5440 if (strEQ(d,"umask")) return -KEY_umask;
79072805
LW
5441 break;
5442 case 6:
5443 if (strEQ(d,"unless")) return KEY_unless;
a0d0e21e
LW
5444 if (strEQ(d,"unpack")) return -KEY_unpack;
5445 if (strEQ(d,"unlink")) return -KEY_unlink;
79072805
LW
5446 break;
5447 case 7:
5448 if (strEQ(d,"unshift")) return KEY_unshift;
a0d0e21e 5449 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
79072805 5450 break;
a687059c
LW
5451 }
5452 break;
79072805 5453 case 'v':
a0d0e21e
LW
5454 if (strEQ(d,"values")) return -KEY_values;
5455 if (strEQ(d,"vec")) return -KEY_vec;
a687059c 5456 break;
79072805
LW
5457 case 'w':
5458 switch (len) {
5459 case 4:
a0d0e21e
LW
5460 if (strEQ(d,"warn")) return -KEY_warn;
5461 if (strEQ(d,"wait")) return -KEY_wait;
79072805
LW
5462 break;
5463 case 5:
5464 if (strEQ(d,"while")) return KEY_while;
a0d0e21e 5465 if (strEQ(d,"write")) return -KEY_write;
79072805
LW
5466 break;
5467 case 7:
a0d0e21e 5468 if (strEQ(d,"waitpid")) return -KEY_waitpid;
79072805
LW
5469 break;
5470 case 9:
a0d0e21e 5471 if (strEQ(d,"wantarray")) return -KEY_wantarray;
79072805 5472 break;
2f3197b3 5473 }
a687059c 5474 break;
79072805 5475 case 'x':
a0d0e21e
LW
5476 if (len == 1) return -KEY_x;
5477 if (strEQ(d,"xor")) return -KEY_xor;
a687059c 5478 break;
79072805
LW
5479 case 'y':
5480 if (len == 1) return KEY_y;
5481 break;
5482 case 'z':
a687059c
LW
5483 break;
5484 }
79072805 5485 return 0;
a687059c
LW
5486}
5487
76e3520e 5488STATIC void
cea2e8a9 5489S_checkcomma(pTHX_ register char *s, char *name, char *what)
a687059c 5490{
2f3197b3
LW
5491 char *w;
5492
d008e5eb
GS
5493 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
5494 dTHR; /* only for ckWARN */
5495 if (ckWARN(WARN_SYNTAX)) {
5496 int level = 1;
5497 for (w = s+2; *w && level; w++) {
5498 if (*w == '(')
5499 ++level;
5500 else if (*w == ')')
5501 --level;
5502 }
5503 if (*w)
5504 for (; *w && isSPACE(*w); w++) ;
5505 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
65cec589
GS
5506 Perl_warner(aTHX_ WARN_SYNTAX,
5507 "%s (...) interpreted as function",name);
d008e5eb 5508 }
2f3197b3 5509 }
3280af22 5510 while (s < PL_bufend && isSPACE(*s))
2f3197b3 5511 s++;
a687059c
LW
5512 if (*s == '(')
5513 s++;
3280af22 5514 while (s < PL_bufend && isSPACE(*s))
a687059c 5515 s++;
834a4ddd 5516 if (isIDFIRST_lazy(s)) {
2f3197b3 5517 w = s++;
834a4ddd 5518 while (isALNUM_lazy(s))
a687059c 5519 s++;
3280af22 5520 while (s < PL_bufend && isSPACE(*s))
a687059c 5521 s++;
e929a76b 5522 if (*s == ',') {
463ee0b2 5523 int kw;
e929a76b 5524 *s = '\0';
864dbfa3 5525 kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
e929a76b 5526 *s = ',';
463ee0b2 5527 if (kw)
e929a76b 5528 return;
cea2e8a9 5529 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
5530 }
5531 }
5532}
5533
423cee85
JH
5534/* Either returns sv, or mortalizes sv and returns a new SV*.
5535 Best used as sv=new_constant(..., sv, ...).
5536 If s, pv are NULL, calls subroutine with one argument,
5537 and type is used with error messages only. */
5538
b3ac6de7 5539STATIC SV *
dff6d3cd
GS
5540S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
5541 const char *type)
b3ac6de7 5542{
b3ac6de7 5543 dSP;
3280af22 5544 HV *table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 5545 SV *res;
b3ac6de7
IZ
5546 SV **cvp;
5547 SV *cv, *typesv;
dff6d3cd 5548 const char *why, *why1, *why2;
423cee85
JH
5549
5550 if (!(PL_hints & HINT_LOCALIZE_HH)) {
5551 SV *msg;
5552
5553 why = "%^H is not localized";
5554 report_short:
5555 why1 = why2 = "";
5556 report:
5557 msg = Perl_newSVpvf(aTHX_ "constant(%s): %s%s%s",
5558 (type ? type: "undef"), why1, why2, why);
5559 yyerror(SvPVX(msg));
5560 SvREFCNT_dec(msg);
5561 return sv;
5562 }
b3ac6de7 5563 if (!table) {
423cee85
JH
5564 why = "%^H is not defined";
5565 goto report_short;
b3ac6de7
IZ
5566 }
5567 cvp = hv_fetch(table, key, strlen(key), FALSE);
5568 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
5569 why = "} is not defined";
5570 why1 = "$^H{";
5571 why2 = key;
5572 goto report;
b3ac6de7
IZ
5573 }
5574 sv_2mortal(sv); /* Parent created it permanently */
5575 cv = *cvp;
423cee85
JH
5576 if (!pv && s)
5577 pv = sv_2mortal(newSVpvn(s, len));
5578 if (type && pv)
5579 typesv = sv_2mortal(newSVpv(type, 0));
b3ac6de7 5580 else
423cee85
JH
5581 typesv = &PL_sv_undef;
5582
e788e7d3 5583 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
5584 ENTER ;
5585 SAVETMPS;
5586
5587 PUSHMARK(SP) ;
25eaa213 5588 EXTEND(sp, 4);
423cee85
JH
5589 if (pv)
5590 PUSHs(pv);
b3ac6de7 5591 PUSHs(sv);
423cee85
JH
5592 if (pv)
5593 PUSHs(typesv);
b3ac6de7
IZ
5594 PUSHs(cv);
5595 PUTBACK;
423cee85
JH
5596 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
5597
5598 SPAGAIN ;
5599
5600 /* Check the eval first */
5601 if (!PL_in_eval && SvTRUE(ERRSV))
5602 {
5603 STRLEN n_a;
5604 sv_catpv(ERRSV, "Propagated");
5605 yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
e1f15930 5606 (void)POPs;
423cee85
JH
5607 res = SvREFCNT_inc(sv);
5608 }
5609 else {
5610 res = POPs;
e1f15930 5611 (void)SvREFCNT_inc(res);
423cee85
JH
5612 }
5613
5614 PUTBACK ;
5615 FREETMPS ;
5616 LEAVE ;
b3ac6de7 5617 POPSTACK;
423cee85 5618
b3ac6de7 5619 if (!SvOK(res)) {
423cee85
JH
5620 why = "}} did not return a defined value";
5621 why1 = "Call to &{$^H{";
5622 why2 = key;
5623 sv = res;
5624 goto report;
5625 }
5626
5627 return res;
b3ac6de7 5628}
423cee85 5629
76e3520e 5630STATIC char *
cea2e8a9 5631S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2
LW
5632{
5633 register char *d = dest;
8903cb82 5634 register char *e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 5635 for (;;) {
8903cb82 5636 if (d >= e)
cea2e8a9 5637 Perl_croak(aTHX_ ident_too_long);
834a4ddd 5638 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 5639 *d++ = *s++;
834a4ddd 5640 else if (*s == '\'' && allow_package && isIDFIRST_lazy(s+1)) {
463ee0b2
LW
5641 *d++ = ':';
5642 *d++ = ':';
5643 s++;
5644 }
c3e0f903 5645 else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
463ee0b2
LW
5646 *d++ = *s++;
5647 *d++ = *s++;
5648 }
834a4ddd 5649 else if (UTF && *(U8*)s >= 0xc0 && isALNUM_utf8((U8*)s)) {
a0ed51b3 5650 char *t = s + UTF8SKIP(s);
dfe13c55 5651 while (*t & 0x80 && is_utf8_mark((U8*)t))
a0ed51b3
LW
5652 t += UTF8SKIP(t);
5653 if (d + (t - s) > e)
cea2e8a9 5654 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
5655 Copy(s, d, t - s, char);
5656 d += t - s;
5657 s = t;
5658 }
463ee0b2
LW
5659 else {
5660 *d = '\0';
5661 *slp = d - dest;
5662 return s;
e929a76b 5663 }
378cc40b
LW
5664 }
5665}
5666
76e3520e 5667STATIC char *
cea2e8a9 5668S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b
LW
5669{
5670 register char *d;
8903cb82 5671 register char *e;
79072805 5672 char *bracket = 0;
748a9306 5673 char funny = *s++;
378cc40b 5674
a0d0e21e
LW
5675 if (isSPACE(*s))
5676 s = skipspace(s);
378cc40b 5677 d = dest;
8903cb82 5678 e = d + destlen - 3; /* two-character token, ending NUL */
de3bb511 5679 if (isDIGIT(*s)) {
8903cb82 5680 while (isDIGIT(*s)) {
5681 if (d >= e)
cea2e8a9 5682 Perl_croak(aTHX_ ident_too_long);
378cc40b 5683 *d++ = *s++;
8903cb82 5684 }
378cc40b
LW
5685 }
5686 else {
463ee0b2 5687 for (;;) {
8903cb82 5688 if (d >= e)
cea2e8a9 5689 Perl_croak(aTHX_ ident_too_long);
834a4ddd 5690 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 5691 *d++ = *s++;
834a4ddd 5692 else if (*s == '\'' && isIDFIRST_lazy(s+1)) {
463ee0b2
LW
5693 *d++ = ':';
5694 *d++ = ':';
5695 s++;
5696 }
a0d0e21e 5697 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
5698 *d++ = *s++;
5699 *d++ = *s++;
5700 }
834a4ddd 5701 else if (UTF && *(U8*)s >= 0xc0 && isALNUM_utf8((U8*)s)) {
a0ed51b3 5702 char *t = s + UTF8SKIP(s);
dfe13c55 5703 while (*t & 0x80 && is_utf8_mark((U8*)t))
a0ed51b3
LW
5704 t += UTF8SKIP(t);
5705 if (d + (t - s) > e)
cea2e8a9 5706 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
5707 Copy(s, d, t - s, char);
5708 d += t - s;
5709 s = t;
5710 }
463ee0b2
LW
5711 else
5712 break;
5713 }
378cc40b
LW
5714 }
5715 *d = '\0';
5716 d = dest;
79072805 5717 if (*d) {
3280af22
NIS
5718 if (PL_lex_state != LEX_NORMAL)
5719 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 5720 return s;
378cc40b 5721 }
748a9306 5722 if (*s == '$' && s[1] &&
834a4ddd 5723 (isALNUM_lazy(s+1) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
5cd24f17 5724 {
4810e5ec 5725 return s;
5cd24f17 5726 }
79072805
LW
5727 if (*s == '{') {
5728 bracket = s;
5729 s++;
5730 }
5731 else if (ck_uni)
5732 check_uni();
93a17b20 5733 if (s < send)
79072805
LW
5734 *d = *s++;
5735 d[1] = '\0';
2b92dfce 5736 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 5737 *d = toCTRL(*s);
5738 s++;
de3bb511 5739 }
79072805 5740 if (bracket) {
748a9306 5741 if (isSPACE(s[-1])) {
fa83b5b6 5742 while (s < send) {
5743 char ch = *s++;
5744 if (ch != ' ' && ch != '\t') {
5745 *d = ch;
5746 break;
5747 }
5748 }
748a9306 5749 }
834a4ddd 5750 if (isIDFIRST_lazy(d)) {
79072805 5751 d++;
a0ed51b3
LW
5752 if (UTF) {
5753 e = s;
834a4ddd 5754 while (e < send && isALNUM_lazy(e) || *e == ':') {
a0ed51b3 5755 e += UTF8SKIP(e);
dfe13c55 5756 while (e < send && *e & 0x80 && is_utf8_mark((U8*)e))
a0ed51b3
LW
5757 e += UTF8SKIP(e);
5758 }
5759 Copy(s, d, e - s, char);
5760 d += e - s;
5761 s = e;
5762 }
5763 else {
2b92dfce 5764 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 5765 *d++ = *s++;
2b92dfce 5766 if (d >= e)
cea2e8a9 5767 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 5768 }
79072805 5769 *d = '\0';
748a9306 5770 while (s < send && (*s == ' ' || *s == '\t')) s++;
ff68c719 5771 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
d008e5eb 5772 dTHR; /* only for ckWARN */
599cee73 5773 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
dff6d3cd 5774 const char *brack = *s == '[' ? "[...]" : "{...}";
cea2e8a9 5775 Perl_warner(aTHX_ WARN_AMBIGUOUS,
599cee73 5776 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
5777 funny, dest, brack, funny, dest, brack);
5778 }
79072805 5779 bracket++;
a0be28da 5780 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
5781 return s;
5782 }
2b92dfce
GS
5783 }
5784 /* Handle extended ${^Foo} variables
5785 * 1999-02-27 mjd-perl-patch@plover.com */
5786 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
5787 && isALNUM(*s))
5788 {
5789 d++;
5790 while (isALNUM(*s) && d < e) {
5791 *d++ = *s++;
5792 }
5793 if (d >= e)
cea2e8a9 5794 Perl_croak(aTHX_ ident_too_long);
2b92dfce 5795 *d = '\0';
79072805
LW
5796 }
5797 if (*s == '}') {
5798 s++;
3280af22
NIS
5799 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets)
5800 PL_lex_state = LEX_INTERPEND;
748a9306
LW
5801 if (funny == '#')
5802 funny = '@';
d008e5eb
GS
5803 if (PL_lex_state == LEX_NORMAL) {
5804 dTHR; /* only for ckWARN */
5805 if (ckWARN(WARN_AMBIGUOUS) &&
864dbfa3 5806 (keyword(dest, d - dest) || get_cv(dest, FALSE)))
d008e5eb 5807 {
cea2e8a9 5808 Perl_warner(aTHX_ WARN_AMBIGUOUS,
d008e5eb
GS
5809 "Ambiguous use of %c{%s} resolved to %c%s",
5810 funny, dest, funny, dest);
5811 }
5812 }
79072805
LW
5813 }
5814 else {
5815 s = bracket; /* let the parser handle it */
93a17b20 5816 *dest = '\0';
79072805
LW
5817 }
5818 }
3280af22
NIS
5819 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
5820 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
5821 return s;
5822}
5823
cea2e8a9
GS
5824void
5825Perl_pmflag(pTHX_ U16 *pmfl, int ch)
a0d0e21e 5826{
bbce6d69 5827 if (ch == 'i')
a0d0e21e 5828 *pmfl |= PMf_FOLD;
a0d0e21e
LW
5829 else if (ch == 'g')
5830 *pmfl |= PMf_GLOBAL;
c90c0ff4 5831 else if (ch == 'c')
5832 *pmfl |= PMf_CONTINUE;
a0d0e21e
LW
5833 else if (ch == 'o')
5834 *pmfl |= PMf_KEEP;
5835 else if (ch == 'm')
5836 *pmfl |= PMf_MULTILINE;
5837 else if (ch == 's')
5838 *pmfl |= PMf_SINGLELINE;
5839 else if (ch == 'x')
5840 *pmfl |= PMf_EXTENDED;
5841}
378cc40b 5842
76e3520e 5843STATIC char *
cea2e8a9 5844S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 5845{
79072805
LW
5846 PMOP *pm;
5847 char *s;
378cc40b 5848
09bef843 5849 s = scan_str(start,FALSE,FALSE);
79072805 5850 if (!s) {
3280af22
NIS
5851 if (PL_lex_stuff)
5852 SvREFCNT_dec(PL_lex_stuff);
5853 PL_lex_stuff = Nullsv;
cea2e8a9 5854 Perl_croak(aTHX_ "Search pattern not terminated");
378cc40b 5855 }
bbce6d69 5856
8782bef2 5857 pm = (PMOP*)newPMOP(type, 0);
3280af22 5858 if (PL_multi_open == '?')
79072805 5859 pm->op_pmflags |= PMf_ONCE;
8782bef2
GB
5860 if(type == OP_QR) {
5861 while (*s && strchr("iomsx", *s))
5862 pmflag(&pm->op_pmflags,*s++);
5863 }
5864 else {
5865 while (*s && strchr("iogcmsx", *s))
5866 pmflag(&pm->op_pmflags,*s++);
5867 }
4633a7c4 5868 pm->op_pmpermflags = pm->op_pmflags;
bbce6d69 5869
3280af22 5870 PL_lex_op = (OP*)pm;
79072805 5871 yylval.ival = OP_MATCH;
378cc40b
LW
5872 return s;
5873}
5874
76e3520e 5875STATIC char *
cea2e8a9 5876S_scan_subst(pTHX_ char *start)
79072805 5877{
a0d0e21e 5878 register char *s;
79072805 5879 register PMOP *pm;
4fdae800 5880 I32 first_start;
79072805
LW
5881 I32 es = 0;
5882
79072805
LW
5883 yylval.ival = OP_NULL;
5884
09bef843 5885 s = scan_str(start,FALSE,FALSE);
79072805
LW
5886
5887 if (!s) {
3280af22
NIS
5888 if (PL_lex_stuff)
5889 SvREFCNT_dec(PL_lex_stuff);
5890 PL_lex_stuff = Nullsv;
cea2e8a9 5891 Perl_croak(aTHX_ "Substitution pattern not terminated");
a687059c 5892 }
79072805 5893
3280af22 5894 if (s[-1] == PL_multi_open)
79072805
LW
5895 s--;
5896
3280af22 5897 first_start = PL_multi_start;
09bef843 5898 s = scan_str(s,FALSE,FALSE);
79072805 5899 if (!s) {
3280af22
NIS
5900 if (PL_lex_stuff)
5901 SvREFCNT_dec(PL_lex_stuff);
5902 PL_lex_stuff = Nullsv;
5903 if (PL_lex_repl)
5904 SvREFCNT_dec(PL_lex_repl);
5905 PL_lex_repl = Nullsv;
cea2e8a9 5906 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 5907 }
3280af22 5908 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 5909
79072805 5910 pm = (PMOP*)newPMOP(OP_SUBST, 0);
48c036b1 5911 while (*s) {
a687059c
LW
5912 if (*s == 'e') {
5913 s++;
2f3197b3 5914 es++;
a687059c 5915 }
b3eb6a9b 5916 else if (strchr("iogcmsx", *s))
a0d0e21e 5917 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
5918 else
5919 break;
378cc40b 5920 }
79072805
LW
5921
5922 if (es) {
5923 SV *repl;
0244c3a4
GS
5924 PL_sublex_info.super_bufptr = s;
5925 PL_sublex_info.super_bufend = PL_bufend;
5926 PL_multi_end = 0;
79072805 5927 pm->op_pmflags |= PMf_EVAL;
79cb57f6 5928 repl = newSVpvn("",0);
463ee0b2 5929 while (es-- > 0)
a0d0e21e 5930 sv_catpv(repl, es ? "eval " : "do ");
79072805 5931 sv_catpvn(repl, "{ ", 2);
3280af22 5932 sv_catsv(repl, PL_lex_repl);
79072805 5933 sv_catpvn(repl, " };", 2);
25da4f38 5934 SvEVALED_on(repl);
3280af22
NIS
5935 SvREFCNT_dec(PL_lex_repl);
5936 PL_lex_repl = repl;
378cc40b 5937 }
79072805 5938
4633a7c4 5939 pm->op_pmpermflags = pm->op_pmflags;
3280af22 5940 PL_lex_op = (OP*)pm;
79072805 5941 yylval.ival = OP_SUBST;
378cc40b
LW
5942 return s;
5943}
5944
76e3520e 5945STATIC char *
cea2e8a9 5946S_scan_trans(pTHX_ char *start)
378cc40b 5947{
a0d0e21e 5948 register char* s;
11343788 5949 OP *o;
79072805
LW
5950 short *tbl;
5951 I32 squash;
a0ed51b3 5952 I32 del;
79072805 5953 I32 complement;
a0ed51b3
LW
5954 I32 utf8;
5955 I32 count = 0;
79072805
LW
5956
5957 yylval.ival = OP_NULL;
5958
09bef843 5959 s = scan_str(start,FALSE,FALSE);
79072805 5960 if (!s) {
3280af22
NIS
5961 if (PL_lex_stuff)
5962 SvREFCNT_dec(PL_lex_stuff);
5963 PL_lex_stuff = Nullsv;
cea2e8a9 5964 Perl_croak(aTHX_ "Transliteration pattern not terminated");
a687059c 5965 }
3280af22 5966 if (s[-1] == PL_multi_open)
2f3197b3
LW
5967 s--;
5968
09bef843 5969 s = scan_str(s,FALSE,FALSE);
79072805 5970 if (!s) {
3280af22
NIS
5971 if (PL_lex_stuff)
5972 SvREFCNT_dec(PL_lex_stuff);
5973 PL_lex_stuff = Nullsv;
5974 if (PL_lex_repl)
5975 SvREFCNT_dec(PL_lex_repl);
5976 PL_lex_repl = Nullsv;
cea2e8a9 5977 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 5978 }
79072805 5979
a0ed51b3
LW
5980 if (UTF) {
5981 o = newSVOP(OP_TRANS, 0, 0);
5982 utf8 = OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF;
5983 }
5984 else {
5985 New(803,tbl,256,short);
5986 o = newPVOP(OP_TRANS, 0, (char*)tbl);
5987 utf8 = 0;
5988 }
2f3197b3 5989
a0ed51b3
LW
5990 complement = del = squash = 0;
5991 while (strchr("cdsCU", *s)) {
395c3793 5992 if (*s == 'c')
79072805 5993 complement = OPpTRANS_COMPLEMENT;
395c3793 5994 else if (*s == 'd')
a0ed51b3
LW
5995 del = OPpTRANS_DELETE;
5996 else if (*s == 's')
79072805 5997 squash = OPpTRANS_SQUASH;
a0ed51b3
LW
5998 else {
5999 switch (count++) {
6000 case 0:
6001 if (*s == 'C')
6002 utf8 &= ~OPpTRANS_FROM_UTF;
6003 else
6004 utf8 |= OPpTRANS_FROM_UTF;
6005 break;
6006 case 1:
6007 if (*s == 'C')
6008 utf8 &= ~OPpTRANS_TO_UTF;
6009 else
6010 utf8 |= OPpTRANS_TO_UTF;
6011 break;
6012 default:
cea2e8a9 6013 Perl_croak(aTHX_ "Too many /C and /U options");
a0ed51b3
LW
6014 }
6015 }
395c3793
LW
6016 s++;
6017 }
a0ed51b3 6018 o->op_private = del|squash|complement|utf8;
79072805 6019
3280af22 6020 PL_lex_op = o;
79072805
LW
6021 yylval.ival = OP_TRANS;
6022 return s;
6023}
6024
76e3520e 6025STATIC char *
cea2e8a9 6026S_scan_heredoc(pTHX_ register char *s)
79072805 6027{
11343788 6028 dTHR;
79072805
LW
6029 SV *herewas;
6030 I32 op_type = OP_SCALAR;
6031 I32 len;
6032 SV *tmpstr;
6033 char term;
6034 register char *d;
fc36a67e 6035 register char *e;
4633a7c4 6036 char *peek;
3280af22 6037 int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
79072805
LW
6038
6039 s += 2;
3280af22
NIS
6040 d = PL_tokenbuf;
6041 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 6042 if (!outer)
79072805 6043 *d++ = '\n';
4633a7c4
LW
6044 for (peek = s; *peek == ' ' || *peek == '\t'; peek++) ;
6045 if (*peek && strchr("`'\"",*peek)) {
6046 s = peek;
79072805 6047 term = *s++;
3280af22 6048 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 6049 d += len;
3280af22 6050 if (s < PL_bufend)
79072805 6051 s++;
79072805
LW
6052 }
6053 else {
6054 if (*s == '\\')
6055 s++, term = '\'';
6056 else
6057 term = '"';
834a4ddd 6058 if (!isALNUM_lazy(s))
4633a7c4 6059 deprecate("bare << to mean <<\"\"");
834a4ddd 6060 for (; isALNUM_lazy(s); s++) {
fc36a67e 6061 if (d < e)
6062 *d++ = *s;
6063 }
6064 }
3280af22 6065 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 6066 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
6067 *d++ = '\n';
6068 *d = '\0';
3280af22 6069 len = d - PL_tokenbuf;
6a27c188 6070#ifndef PERL_STRICT_CR
f63a84b2
LW
6071 d = strchr(s, '\r');
6072 if (d) {
6073 char *olds = s;
6074 s = d;
3280af22 6075 while (s < PL_bufend) {
f63a84b2
LW
6076 if (*s == '\r') {
6077 *d++ = '\n';
6078 if (*++s == '\n')
6079 s++;
6080 }
6081 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
6082 *d++ = *s++;
6083 s++;
6084 }
6085 else
6086 *d++ = *s++;
6087 }
6088 *d = '\0';
3280af22
NIS
6089 PL_bufend = d;
6090 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
f63a84b2
LW
6091 s = olds;
6092 }
6093#endif
79072805 6094 d = "\n";
3280af22 6095 if (outer || !(d=ninstr(s,PL_bufend,d,d+1)))
79cb57f6 6096 herewas = newSVpvn(s,PL_bufend-s);
79072805 6097 else
79cb57f6 6098 s--, herewas = newSVpvn(s,d-s);
79072805 6099 s += SvCUR(herewas);
748a9306 6100
8d6dde3e 6101 tmpstr = NEWSV(87,79);
748a9306
LW
6102 sv_upgrade(tmpstr, SVt_PVIV);
6103 if (term == '\'') {
79072805 6104 op_type = OP_CONST;
748a9306
LW
6105 SvIVX(tmpstr) = -1;
6106 }
6107 else if (term == '`') {
79072805 6108 op_type = OP_BACKTICK;
748a9306
LW
6109 SvIVX(tmpstr) = '\\';
6110 }
79072805
LW
6111
6112 CLINE;
57843af0 6113 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
6114 PL_multi_open = PL_multi_close = '<';
6115 term = *PL_tokenbuf;
0244c3a4
GS
6116 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
6117 char *bufptr = PL_sublex_info.super_bufptr;
6118 char *bufend = PL_sublex_info.super_bufend;
6119 char *olds = s - SvCUR(herewas);
6120 s = strchr(bufptr, '\n');
6121 if (!s)
6122 s = bufend;
6123 d = s;
6124 while (s < bufend &&
6125 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
6126 if (*s++ == '\n')
57843af0 6127 CopLINE_inc(PL_curcop);
0244c3a4
GS
6128 }
6129 if (s >= bufend) {
57843af0 6130 CopLINE_set(PL_curcop, PL_multi_start);
0244c3a4
GS
6131 missingterm(PL_tokenbuf);
6132 }
6133 sv_setpvn(herewas,bufptr,d-bufptr+1);
6134 sv_setpvn(tmpstr,d+1,s-d);
6135 s += len - 1;
6136 sv_catpvn(herewas,s,bufend-s);
6137 (void)strcpy(bufptr,SvPVX(herewas));
6138
6139 s = olds;
6140 goto retval;
6141 }
6142 else if (!outer) {
79072805 6143 d = s;
3280af22
NIS
6144 while (s < PL_bufend &&
6145 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 6146 if (*s++ == '\n')
57843af0 6147 CopLINE_inc(PL_curcop);
79072805 6148 }
3280af22 6149 if (s >= PL_bufend) {
57843af0 6150 CopLINE_set(PL_curcop, PL_multi_start);
3280af22 6151 missingterm(PL_tokenbuf);
79072805
LW
6152 }
6153 sv_setpvn(tmpstr,d+1,s-d);
6154 s += len - 1;
57843af0 6155 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 6156
3280af22
NIS
6157 sv_catpvn(herewas,s,PL_bufend-s);
6158 sv_setsv(PL_linestr,herewas);
6159 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
6160 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805
LW
6161 }
6162 else
6163 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3280af22 6164 while (s >= PL_bufend) { /* multiple line string? */
fd2d0953 6165 if (!outer ||
3280af22 6166 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
57843af0 6167 CopLINE_set(PL_curcop, PL_multi_start);
3280af22 6168 missingterm(PL_tokenbuf);
79072805 6169 }
57843af0 6170 CopLINE_inc(PL_curcop);
3280af22 6171 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6a27c188 6172#ifndef PERL_STRICT_CR
3280af22 6173 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
6174 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
6175 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 6176 {
3280af22
NIS
6177 PL_bufend[-2] = '\n';
6178 PL_bufend--;
6179 SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
f63a84b2 6180 }
3280af22
NIS
6181 else if (PL_bufend[-1] == '\r')
6182 PL_bufend[-1] = '\n';
f63a84b2 6183 }
3280af22
NIS
6184 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
6185 PL_bufend[-1] = '\n';
f63a84b2 6186#endif
3280af22 6187 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
6188 SV *sv = NEWSV(88,0);
6189
93a17b20 6190 sv_upgrade(sv, SVt_PVMG);
3280af22 6191 sv_setsv(sv,PL_linestr);
57843af0 6192 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
79072805 6193 }
3280af22
NIS
6194 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
6195 s = PL_bufend - 1;
79072805 6196 *s = ' ';
3280af22
NIS
6197 sv_catsv(PL_linestr,herewas);
6198 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805
LW
6199 }
6200 else {
3280af22
NIS
6201 s = PL_bufend;
6202 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
6203 }
6204 }
79072805 6205 s++;
0244c3a4 6206retval:
57843af0 6207 PL_multi_end = CopLINE(PL_curcop);
79072805
LW
6208 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
6209 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
463ee0b2 6210 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
79072805 6211 }
8990e307 6212 SvREFCNT_dec(herewas);
3280af22 6213 PL_lex_stuff = tmpstr;
79072805
LW
6214 yylval.ival = op_type;
6215 return s;
6216}
6217
02aa26ce
NT
6218/* scan_inputsymbol
6219 takes: current position in input buffer
6220 returns: new position in input buffer
6221 side-effects: yylval and lex_op are set.
6222
6223 This code handles:
6224
6225 <> read from ARGV
6226 <FH> read from filehandle
6227 <pkg::FH> read from package qualified filehandle
6228 <pkg'FH> read from package qualified filehandle
6229 <$fh> read from filehandle in $fh
6230 <*.h> filename glob
6231
6232*/
6233
76e3520e 6234STATIC char *
cea2e8a9 6235S_scan_inputsymbol(pTHX_ char *start)
79072805 6236{
02aa26ce 6237 register char *s = start; /* current position in buffer */
79072805 6238 register char *d;
fc36a67e 6239 register char *e;
1b420867 6240 char *end;
79072805
LW
6241 I32 len;
6242
3280af22
NIS
6243 d = PL_tokenbuf; /* start of temp holding space */
6244 e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
1b420867
GS
6245 end = strchr(s, '\n');
6246 if (!end)
6247 end = PL_bufend;
6248 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
6249
6250 /* die if we didn't have space for the contents of the <>,
1b420867 6251 or if it didn't end, or if we see a newline
02aa26ce
NT
6252 */
6253
3280af22 6254 if (len >= sizeof PL_tokenbuf)
cea2e8a9 6255 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 6256 if (s >= end)
cea2e8a9 6257 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 6258
fc36a67e 6259 s++;
02aa26ce
NT
6260
6261 /* check for <$fh>
6262 Remember, only scalar variables are interpreted as filehandles by
6263 this code. Anything more complex (e.g., <$fh{$num}>) will be
6264 treated as a glob() call.
6265 This code makes use of the fact that except for the $ at the front,
6266 a scalar variable and a filehandle look the same.
6267 */
4633a7c4 6268 if (*d == '$' && d[1]) d++;
02aa26ce
NT
6269
6270 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
834a4ddd 6271 while (*d && (isALNUM_lazy(d) || *d == '\'' || *d == ':'))
79072805 6272 d++;
02aa26ce
NT
6273
6274 /* If we've tried to read what we allow filehandles to look like, and
6275 there's still text left, then it must be a glob() and not a getline.
6276 Use scan_str to pull out the stuff between the <> and treat it
6277 as nothing more than a string.
6278 */
6279
3280af22 6280 if (d - PL_tokenbuf != len) {
79072805
LW
6281 yylval.ival = OP_GLOB;
6282 set_csh();
09bef843 6283 s = scan_str(start,FALSE,FALSE);
79072805 6284 if (!s)
cea2e8a9 6285 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
6286 return s;
6287 }
395c3793 6288 else {
02aa26ce 6289 /* we're in a filehandle read situation */
3280af22 6290 d = PL_tokenbuf;
02aa26ce
NT
6291
6292 /* turn <> into <ARGV> */
79072805
LW
6293 if (!len)
6294 (void)strcpy(d,"ARGV");
02aa26ce
NT
6295
6296 /* if <$fh>, create the ops to turn the variable into a
6297 filehandle
6298 */
79072805 6299 if (*d == '$') {
a0d0e21e 6300 I32 tmp;
02aa26ce
NT
6301
6302 /* try to find it in the pad for this block, otherwise find
6303 add symbol table ops
6304 */
11343788
MB
6305 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
6306 OP *o = newOP(OP_PADSV, 0);
6307 o->op_targ = tmp;
f5284f61 6308 PL_lex_op = (OP*)newUNOP(OP_READLINE, 0, o);
a0d0e21e
LW
6309 }
6310 else {
6311 GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
3280af22 6312 PL_lex_op = (OP*)newUNOP(OP_READLINE, 0,
a0d0e21e 6313 newUNOP(OP_RV2SV, 0,
f5284f61 6314 newGVOP(OP_GV, 0, gv)));
a0d0e21e 6315 }
f5284f61
IZ
6316 PL_lex_op->op_flags |= OPf_SPECIAL;
6317 /* we created the ops in PL_lex_op, so make yylval.ival a null op */
79072805
LW
6318 yylval.ival = OP_NULL;
6319 }
02aa26ce
NT
6320
6321 /* If it's none of the above, it must be a literal filehandle
6322 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 6323 else {
85e6fe83 6324 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
3280af22 6325 PL_lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
79072805
LW
6326 yylval.ival = OP_NULL;
6327 }
6328 }
02aa26ce 6329
79072805
LW
6330 return s;
6331}
6332
02aa26ce
NT
6333
6334/* scan_str
6335 takes: start position in buffer
09bef843
SB
6336 keep_quoted preserve \ on the embedded delimiter(s)
6337 keep_delims preserve the delimiters around the string
02aa26ce
NT
6338 returns: position to continue reading from buffer
6339 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
6340 updates the read buffer.
6341
6342 This subroutine pulls a string out of the input. It is called for:
6343 q single quotes q(literal text)
6344 ' single quotes 'literal text'
6345 qq double quotes qq(interpolate $here please)
6346 " double quotes "interpolate $here please"
6347 qx backticks qx(/bin/ls -l)
6348 ` backticks `/bin/ls -l`
6349 qw quote words @EXPORT_OK = qw( func() $spam )
6350 m// regexp match m/this/
6351 s/// regexp substitute s/this/that/
6352 tr/// string transliterate tr/this/that/
6353 y/// string transliterate y/this/that/
6354 ($*@) sub prototypes sub foo ($)
09bef843 6355 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
6356 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
6357
6358 In most of these cases (all but <>, patterns and transliterate)
6359 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
6360 calls scan_str(). s/// makes yylex() call scan_subst() which calls
6361 scan_str(). tr/// and y/// make yylex() call scan_trans() which
6362 calls scan_str().
6363
6364 It skips whitespace before the string starts, and treats the first
6365 character as the delimiter. If the delimiter is one of ([{< then
6366 the corresponding "close" character )]}> is used as the closing
6367 delimiter. It allows quoting of delimiters, and if the string has
6368 balanced delimiters ([{<>}]) it allows nesting.
6369
6370 The lexer always reads these strings into lex_stuff, except in the
6371 case of the operators which take *two* arguments (s/// and tr///)
6372 when it checks to see if lex_stuff is full (presumably with the 1st
6373 arg to s or tr) and if so puts the string into lex_repl.
6374
6375*/
6376
76e3520e 6377STATIC char *
09bef843 6378S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 6379{
11343788 6380 dTHR;
02aa26ce
NT
6381 SV *sv; /* scalar value: string */
6382 char *tmps; /* temp string, used for delimiter matching */
6383 register char *s = start; /* current position in the buffer */
6384 register char term; /* terminating character */
6385 register char *to; /* current position in the sv's data */
6386 I32 brackets = 1; /* bracket nesting level */
6387
6388 /* skip space before the delimiter */
fb73857a 6389 if (isSPACE(*s))
6390 s = skipspace(s);
02aa26ce
NT
6391
6392 /* mark where we are, in case we need to report errors */
79072805 6393 CLINE;
02aa26ce
NT
6394
6395 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 6396 term = *s;
02aa26ce 6397 /* mark where we are */
57843af0 6398 PL_multi_start = CopLINE(PL_curcop);
3280af22 6399 PL_multi_open = term;
02aa26ce
NT
6400
6401 /* find corresponding closing delimiter */
93a17b20 6402 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
79072805 6403 term = tmps[5];
3280af22 6404 PL_multi_close = term;
79072805 6405
02aa26ce 6406 /* create a new SV to hold the contents. 87 is leak category, I'm
8d6dde3e
IZ
6407 assuming. 79 is the SV's initial length. What a random number. */
6408 sv = NEWSV(87,79);
ed6116ce
LW
6409 sv_upgrade(sv, SVt_PVIV);
6410 SvIVX(sv) = term;
a0d0e21e 6411 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
6412
6413 /* move past delimiter and try to read a complete string */
09bef843
SB
6414 if (keep_delims)
6415 sv_catpvn(sv, s, 1);
93a17b20
LW
6416 s++;
6417 for (;;) {
02aa26ce 6418 /* extend sv if need be */
3280af22 6419 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 6420 /* set 'to' to the next character in the sv's string */
463ee0b2 6421 to = SvPVX(sv)+SvCUR(sv);
09bef843 6422
02aa26ce 6423 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
6424 if (PL_multi_open == PL_multi_close) {
6425 for (; s < PL_bufend; s++,to++) {
02aa26ce 6426 /* embedded newlines increment the current line number */
3280af22 6427 if (*s == '\n' && !PL_rsfp)
57843af0 6428 CopLINE_inc(PL_curcop);
02aa26ce 6429 /* handle quoted delimiters */
3280af22 6430 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 6431 if (!keep_quoted && s[1] == term)
a0d0e21e 6432 s++;
02aa26ce 6433 /* any other quotes are simply copied straight through */
a0d0e21e
LW
6434 else
6435 *to++ = *s++;
6436 }
02aa26ce
NT
6437 /* terminate when run out of buffer (the for() condition), or
6438 have found the terminator */
93a17b20
LW
6439 else if (*s == term)
6440 break;
6441 *to = *s;
6442 }
6443 }
02aa26ce
NT
6444
6445 /* if the terminator isn't the same as the start character (e.g.,
6446 matched brackets), we have to allow more in the quoting, and
6447 be prepared for nested brackets.
6448 */
93a17b20 6449 else {
02aa26ce 6450 /* read until we run out of string, or we find the terminator */
3280af22 6451 for (; s < PL_bufend; s++,to++) {
02aa26ce 6452 /* embedded newlines increment the line count */
3280af22 6453 if (*s == '\n' && !PL_rsfp)
57843af0 6454 CopLINE_inc(PL_curcop);
02aa26ce 6455 /* backslashes can escape the open or closing characters */
3280af22 6456 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
6457 if (!keep_quoted &&
6458 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
6459 s++;
6460 else
6461 *to++ = *s++;
6462 }
02aa26ce 6463 /* allow nested opens and closes */
3280af22 6464 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 6465 break;
3280af22 6466 else if (*s == PL_multi_open)
93a17b20
LW
6467 brackets++;
6468 *to = *s;
6469 }
6470 }
02aa26ce 6471 /* terminate the copied string and update the sv's end-of-string */
93a17b20 6472 *to = '\0';
463ee0b2 6473 SvCUR_set(sv, to - SvPVX(sv));
93a17b20 6474
02aa26ce
NT
6475 /*
6476 * this next chunk reads more into the buffer if we're not done yet
6477 */
6478
3280af22 6479 if (s < PL_bufend) break; /* handle case where we are done yet :-) */
79072805 6480
6a27c188 6481#ifndef PERL_STRICT_CR
f63a84b2 6482 if (to - SvPVX(sv) >= 2) {
c6f14548
GS
6483 if ((to[-2] == '\r' && to[-1] == '\n') ||
6484 (to[-2] == '\n' && to[-1] == '\r'))
6485 {
f63a84b2
LW
6486 to[-2] = '\n';
6487 to--;
6488 SvCUR_set(sv, to - SvPVX(sv));
6489 }
6490 else if (to[-1] == '\r')
6491 to[-1] = '\n';
6492 }
6493 else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
6494 to[-1] = '\n';
6495#endif
6496
02aa26ce
NT
6497 /* if we're out of file, or a read fails, bail and reset the current
6498 line marker so we can report where the unterminated string began
6499 */
3280af22
NIS
6500 if (!PL_rsfp ||
6501 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 6502 sv_free(sv);
57843af0 6503 CopLINE_set(PL_curcop, PL_multi_start);
79072805
LW
6504 return Nullch;
6505 }
02aa26ce 6506 /* we read a line, so increment our line counter */
57843af0 6507 CopLINE_inc(PL_curcop);
a0ed51b3 6508
02aa26ce 6509 /* update debugger info */
3280af22 6510 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
6511 SV *sv = NEWSV(88,0);
6512
93a17b20 6513 sv_upgrade(sv, SVt_PVMG);
3280af22 6514 sv_setsv(sv,PL_linestr);
57843af0 6515 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
395c3793 6516 }
a0ed51b3 6517
3280af22
NIS
6518 /* having changed the buffer, we must update PL_bufend */
6519 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
378cc40b 6520 }
02aa26ce
NT
6521
6522 /* at this point, we have successfully read the delimited string */
6523
09bef843
SB
6524 if (keep_delims)
6525 sv_catpvn(sv, s, 1);
57843af0 6526 PL_multi_end = CopLINE(PL_curcop);
79072805 6527 s++;
02aa26ce
NT
6528
6529 /* if we allocated too much space, give some back */
93a17b20
LW
6530 if (SvCUR(sv) + 5 < SvLEN(sv)) {
6531 SvLEN_set(sv, SvCUR(sv) + 1);
463ee0b2 6532 Renew(SvPVX(sv), SvLEN(sv), char);
79072805 6533 }
02aa26ce
NT
6534
6535 /* decide whether this is the first or second quoted string we've read
6536 for this op
6537 */
6538
3280af22
NIS
6539 if (PL_lex_stuff)
6540 PL_lex_repl = sv;
79072805 6541 else
3280af22 6542 PL_lex_stuff = sv;
378cc40b
LW
6543 return s;
6544}
6545
02aa26ce
NT
6546/*
6547 scan_num
6548 takes: pointer to position in buffer
6549 returns: pointer to new position in buffer
6550 side-effects: builds ops for the constant in yylval.op
6551
6552 Read a number in any of the formats that Perl accepts:
6553
4f19785b 6554 0(x[0-7A-F]+)|([0-7]+)|(b[01])
02aa26ce
NT
6555 [\d_]+(\.[\d_]*)?[Ee](\d+)
6556
6557 Underbars (_) are allowed in decimal numbers. If -w is on,
6558 underbars before a decimal point must be at three digit intervals.
6559
3280af22 6560 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
6561 thing it reads.
6562
6563 If it reads a number without a decimal point or an exponent, it will
6564 try converting the number to an integer and see if it can do so
6565 without loss of precision.
6566*/
6567
378cc40b 6568char *
864dbfa3 6569Perl_scan_num(pTHX_ char *start)
378cc40b 6570{
02aa26ce
NT
6571 register char *s = start; /* current position in buffer */
6572 register char *d; /* destination in temp buffer */
6573 register char *e; /* end of temp buffer */
b8403495 6574 IV tryiv; /* used to see if it can be an IV */
65202027 6575 NV value; /* number read, as a double */
a7cb1f99 6576 SV *sv = Nullsv; /* place to put the converted number */
b8403495 6577 bool floatit; /* boolean: int or float? */
02aa26ce 6578 char *lastub = 0; /* position of last underbar */
fc36a67e 6579 static char number_too_long[] = "Number too long";
378cc40b 6580
02aa26ce
NT
6581 /* We use the first character to decide what type of number this is */
6582
378cc40b 6583 switch (*s) {
79072805 6584 default:
cea2e8a9 6585 Perl_croak(aTHX_ "panic: scan_num");
02aa26ce
NT
6586
6587 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 6588 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
6589 case '0':
6590 {
02aa26ce
NT
6591 /* variables:
6592 u holds the "number so far"
4f19785b
WSI
6593 shift the power of 2 of the base
6594 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
6595 overflowed was the number more than we can hold?
6596
6597 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
6598 we in octal/hex/binary?" indicator to disallow hex characters
6599 when in octal mode.
02aa26ce 6600 */
f248d071 6601 dTHR;
9e24b6e2
JH
6602 NV n = 0.0;
6603 UV u = 0;
79072805 6604 I32 shift;
9e24b6e2
JH
6605 bool overflowed = FALSE;
6606 static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
6607 static char* bases[5] = { "", "binary", "", "octal",
6608 "hexadecimal" };
6609 static char* Bases[5] = { "", "Binary", "", "Octal",
6610 "Hexadecimal" };
6611 static char *maxima[5] = { "",
6612 "0b11111111111111111111111111111111",
6613 "",
893fe2c2 6614 "037777777777",
9e24b6e2
JH
6615 "0xffffffff" };
6616 char *base, *Base, *max;
378cc40b 6617
02aa26ce 6618 /* check for hex */
378cc40b
LW
6619 if (s[1] == 'x') {
6620 shift = 4;
6621 s += 2;
4f19785b
WSI
6622 } else if (s[1] == 'b') {
6623 shift = 1;
6624 s += 2;
378cc40b 6625 }
02aa26ce 6626 /* check for a decimal in disguise */
b78218b7 6627 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 6628 goto decimal;
02aa26ce 6629 /* so it must be octal */
378cc40b
LW
6630 else
6631 shift = 3;
9e24b6e2
JH
6632
6633 base = bases[shift];
6634 Base = Bases[shift];
6635 max = maxima[shift];
02aa26ce 6636
4f19785b 6637 /* read the rest of the number */
378cc40b 6638 for (;;) {
9e24b6e2 6639 /* x is used in the overflow test,
893fe2c2 6640 b is the digit we're adding on. */
9e24b6e2 6641 UV x, b;
55497cff 6642
378cc40b 6643 switch (*s) {
02aa26ce
NT
6644
6645 /* if we don't mention it, we're done */
378cc40b
LW
6646 default:
6647 goto out;
02aa26ce
NT
6648
6649 /* _ are ignored */
de3bb511
LW
6650 case '_':
6651 s++;
6652 break;
02aa26ce
NT
6653
6654 /* 8 and 9 are not octal */
378cc40b 6655 case '8': case '9':
4f19785b 6656 if (shift == 3)
cea2e8a9 6657 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 6658 /* FALL THROUGH */
02aa26ce
NT
6659
6660 /* octal digits */
4f19785b 6661 case '2': case '3': case '4':
378cc40b 6662 case '5': case '6': case '7':
4f19785b 6663 if (shift == 1)
cea2e8a9 6664 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
6665 /* FALL THROUGH */
6666
6667 case '0': case '1':
02aa26ce 6668 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 6669 goto digit;
02aa26ce
NT
6670
6671 /* hex digits */
378cc40b
LW
6672 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
6673 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 6674 /* make sure they said 0x */
378cc40b
LW
6675 if (shift != 4)
6676 goto out;
55497cff 6677 b = (*s++ & 7) + 9;
02aa26ce
NT
6678
6679 /* Prepare to put the digit we have onto the end
6680 of the number so far. We check for overflows.
6681 */
6682
55497cff 6683 digit:
9e24b6e2
JH
6684 if (!overflowed) {
6685 x = u << shift; /* make room for the digit */
6686
6687 if ((x >> shift) != u
6688 && !(PL_hints & HINT_NEW_BINARY)) {
6689 dTHR;
6690 overflowed = TRUE;
6691 n = (NV) u;
767a6a26
PM
6692 if (ckWARN_d(WARN_OVERFLOW))
6693 Perl_warner(aTHX_ WARN_OVERFLOW,
9e24b6e2
JH
6694 "Integer overflow in %s number",
6695 base);
6696 } else
6697 u = x | b; /* add the digit to the end */
6698 }
6699 if (overflowed) {
6700 n *= nvshift[shift];
6701 /* If an NV has not enough bits in its
6702 * mantissa to represent an UV this summing of
6703 * small low-order numbers is a waste of time
6704 * (because the NV cannot preserve the
6705 * low-order bits anyway): we could just
6706 * remember when did we overflow and in the
6707 * end just multiply n by the right
6708 * amount. */
6709 n += (NV) b;
55497cff 6710 }
378cc40b
LW
6711 break;
6712 }
6713 }
02aa26ce
NT
6714
6715 /* if we get here, we had success: make a scalar value from
6716 the number.
6717 */
378cc40b 6718 out:
79072805 6719 sv = NEWSV(92,0);
9e24b6e2
JH
6720 if (overflowed) {
6721 dTHR;
767a6a26
PM
6722 if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
6723 Perl_warner(aTHX_ WARN_PORTABLE,
9e24b6e2
JH
6724 "%s number > %s non-portable",
6725 Base, max);
6726 sv_setnv(sv, n);
6727 }
6728 else {
15041a67 6729#if UVSIZE > 4
9e24b6e2 6730 dTHR;
767a6a26
PM
6731 if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
6732 Perl_warner(aTHX_ WARN_PORTABLE,
9e24b6e2
JH
6733 "%s number > %s non-portable",
6734 Base, max);
2cc4c2dc 6735#endif
9e24b6e2
JH
6736 sv_setuv(sv, u);
6737 }
2cc4c2dc 6738 if (PL_hints & HINT_NEW_BINARY)
b3ac6de7 6739 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
378cc40b
LW
6740 }
6741 break;
02aa26ce
NT
6742
6743 /*
6744 handle decimal numbers.
6745 we're also sent here when we read a 0 as the first digit
6746 */
378cc40b
LW
6747 case '1': case '2': case '3': case '4': case '5':
6748 case '6': case '7': case '8': case '9': case '.':
6749 decimal:
3280af22
NIS
6750 d = PL_tokenbuf;
6751 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 6752 floatit = FALSE;
02aa26ce
NT
6753
6754 /* read next group of digits and _ and copy into d */
de3bb511 6755 while (isDIGIT(*s) || *s == '_') {
02aa26ce
NT
6756 /* skip underscores, checking for misplaced ones
6757 if -w is on
6758 */
93a17b20 6759 if (*s == '_') {
d008e5eb 6760 dTHR; /* only for ckWARN */
599cee73 6761 if (ckWARN(WARN_SYNTAX) && lastub && s - lastub != 3)
cea2e8a9 6762 Perl_warner(aTHX_ WARN_SYNTAX, "Misplaced _ in number");
93a17b20
LW
6763 lastub = ++s;
6764 }
fc36a67e 6765 else {
02aa26ce 6766 /* check for end of fixed-length buffer */
fc36a67e 6767 if (d >= e)
cea2e8a9 6768 Perl_croak(aTHX_ number_too_long);
02aa26ce 6769 /* if we're ok, copy the character */
378cc40b 6770 *d++ = *s++;
fc36a67e 6771 }
378cc40b 6772 }
02aa26ce
NT
6773
6774 /* final misplaced underbar check */
d008e5eb
GS
6775 if (lastub && s - lastub != 3) {
6776 dTHR;
6777 if (ckWARN(WARN_SYNTAX))
cea2e8a9 6778 Perl_warner(aTHX_ WARN_SYNTAX, "Misplaced _ in number");
d008e5eb 6779 }
02aa26ce
NT
6780
6781 /* read a decimal portion if there is one. avoid
6782 3..5 being interpreted as the number 3. followed
6783 by .5
6784 */
2f3197b3 6785 if (*s == '.' && s[1] != '.') {
79072805 6786 floatit = TRUE;
378cc40b 6787 *d++ = *s++;
02aa26ce
NT
6788
6789 /* copy, ignoring underbars, until we run out of
6790 digits. Note: no misplaced underbar checks!
6791 */
fc36a67e 6792 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 6793 /* fixed length buffer check */
fc36a67e 6794 if (d >= e)
cea2e8a9 6795 Perl_croak(aTHX_ number_too_long);
fc36a67e 6796 if (*s != '_')
6797 *d++ = *s;
378cc40b
LW
6798 }
6799 }
02aa26ce
NT
6800
6801 /* read exponent part, if present */
93a17b20 6802 if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
79072805
LW
6803 floatit = TRUE;
6804 s++;
02aa26ce
NT
6805
6806 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 6807 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce
NT
6808
6809 /* allow positive or negative exponent */
378cc40b
LW
6810 if (*s == '+' || *s == '-')
6811 *d++ = *s++;
02aa26ce
NT
6812
6813 /* read digits of exponent (no underbars :-) */
fc36a67e 6814 while (isDIGIT(*s)) {
6815 if (d >= e)
cea2e8a9 6816 Perl_croak(aTHX_ number_too_long);
378cc40b 6817 *d++ = *s++;
fc36a67e 6818 }
378cc40b 6819 }
02aa26ce
NT
6820
6821 /* terminate the string */
378cc40b 6822 *d = '\0';
02aa26ce
NT
6823
6824 /* make an sv from the string */
79072805 6825 sv = NEWSV(92,0);
097ee67d
JH
6826
6827 value = Atof(PL_tokenbuf);
02aa26ce
NT
6828
6829 /*
6830 See if we can make do with an integer value without loss of
6831 precision. We use I_V to cast to an int, because some
6832 compilers have issues. Then we try casting it back and see
6833 if it was the same. We only do this if we know we
6834 specifically read an integer.
6835
6836 Note: if floatit is true, then we don't need to do the
6837 conversion at all.
6838 */
1e422769 6839 tryiv = I_V(value);
65202027 6840 if (!floatit && (NV)tryiv == value)
1e422769 6841 sv_setiv(sv, tryiv);
2f3197b3 6842 else
1e422769 6843 sv_setnv(sv, value);
b8403495
JH
6844 if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
6845 (PL_hints & HINT_NEW_INTEGER) )
3280af22 6846 sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
b8403495
JH
6847 (floatit ? "float" : "integer"),
6848 sv, Nullsv, NULL);
378cc40b 6849 break;
a7cb1f99
GS
6850 /* if it starts with a v, it could be a version number */
6851 case 'v':
6852 {
a7cb1f99
GS
6853 char *pos = s;
6854 pos++;
6855 while (isDIGIT(*pos))
6856 pos++;
6857 if (*pos == '.' && isDIGIT(pos[1])) {
f83ee824 6858 UV rev;
a7cb1f99
GS
6859 U8 tmpbuf[10];
6860 U8 *tmpend;
6861 NV nshift = 1.0;
6862 s++; /* get past 'v' */
6863
6864 sv = NEWSV(92,5);
6865 SvUPGRADE(sv, SVt_PVNV);
6866 sv_setpvn(sv, "", 0);
6867
6868 do {
6869 rev = atoi(s);
6870 s = ++pos;
6871 while (isDIGIT(*pos))
6872 pos++;
6873
6874 tmpend = uv_to_utf8(tmpbuf, rev);
6875 *tmpend = '\0';
33079e28 6876 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
a7cb1f99
GS
6877 if (rev > 0)
6878 SvNVX(sv) += (NV)rev/nshift;
6879 nshift *= 1000;
6880 } while (*pos == '.' && isDIGIT(pos[1]));
6881
6882 rev = atoi(s);
6883 s = pos;
6884 tmpend = uv_to_utf8(tmpbuf, rev);
6885 *tmpend = '\0';
33079e28 6886 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
a7cb1f99
GS
6887 if (rev > 0)
6888 SvNVX(sv) += (NV)rev/nshift;
6889
6890 SvPOK_on(sv);
6891 SvNOK_on(sv);
6892 SvREADONLY_on(sv);
6893 SvUTF8_on(sv);
6894 }
6895 }
6896 break;
79072805 6897 }
a687059c 6898
02aa26ce
NT
6899 /* make the op for the constant and return */
6900
a7cb1f99
GS
6901 if (sv)
6902 yylval.opval = newSVOP(OP_CONST, 0, sv);
6903 else
6904 yylval.opval = Nullop;
a687059c 6905
378cc40b
LW
6906 return s;
6907}
6908
76e3520e 6909STATIC char *
cea2e8a9 6910S_scan_formline(pTHX_ register char *s)
378cc40b 6911{
11343788 6912 dTHR;
79072805 6913 register char *eol;
378cc40b 6914 register char *t;
79cb57f6 6915 SV *stuff = newSVpvn("",0);
79072805 6916 bool needargs = FALSE;
378cc40b 6917
79072805 6918 while (!needargs) {
85e6fe83 6919 if (*s == '.' || *s == '}') {
79072805 6920 /*SUPPRESS 530*/
51882d45
GS
6921#ifdef PERL_STRICT_CR
6922 for (t = s+1;*t == ' ' || *t == '\t'; t++) ;
6923#else
6924 for (t = s+1;*t == ' ' || *t == '\t' || *t == '\r'; t++) ;
6925#endif
6a65c6a0 6926 if (*t == '\n' || t == PL_bufend)
79072805
LW
6927 break;
6928 }
3280af22 6929 if (PL_in_eval && !PL_rsfp) {
93a17b20 6930 eol = strchr(s,'\n');
0f85fab0 6931 if (!eol++)
3280af22 6932 eol = PL_bufend;
0f85fab0
LW
6933 }
6934 else
3280af22 6935 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 6936 if (*s != '#') {
a0d0e21e
LW
6937 for (t = s; t < eol; t++) {
6938 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
6939 needargs = FALSE;
6940 goto enough; /* ~~ must be first line in formline */
378cc40b 6941 }
a0d0e21e
LW
6942 if (*t == '@' || *t == '^')
6943 needargs = TRUE;
378cc40b 6944 }
a0d0e21e 6945 sv_catpvn(stuff, s, eol-s);
2dc4c65b
GS
6946#ifndef PERL_STRICT_CR
6947 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
6948 char *end = SvPVX(stuff) + SvCUR(stuff);
6949 end[-2] = '\n';
6950 end[-1] = '\0';
6951 SvCUR(stuff)--;
6952 }
6953#endif
79072805
LW
6954 }
6955 s = eol;
3280af22
NIS
6956 if (PL_rsfp) {
6957 s = filter_gets(PL_linestr, PL_rsfp, 0);
6958 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
6959 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
79072805 6960 if (!s) {
3280af22 6961 s = PL_bufptr;
79072805 6962 yyerror("Format not terminated");
378cc40b
LW
6963 break;
6964 }
378cc40b 6965 }
463ee0b2 6966 incline(s);
79072805 6967 }
a0d0e21e
LW
6968 enough:
6969 if (SvCUR(stuff)) {
3280af22 6970 PL_expect = XTERM;
79072805 6971 if (needargs) {
3280af22
NIS
6972 PL_lex_state = LEX_NORMAL;
6973 PL_nextval[PL_nexttoke].ival = 0;
79072805
LW
6974 force_next(',');
6975 }
a0d0e21e 6976 else
3280af22
NIS
6977 PL_lex_state = LEX_FORMLINE;
6978 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 6979 force_next(THING);
3280af22 6980 PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
79072805 6981 force_next(LSTOP);
378cc40b 6982 }
79072805 6983 else {
8990e307 6984 SvREFCNT_dec(stuff);
3280af22
NIS
6985 PL_lex_formbrack = 0;
6986 PL_bufptr = s;
79072805
LW
6987 }
6988 return s;
378cc40b 6989}
a687059c 6990
76e3520e 6991STATIC void
cea2e8a9 6992S_set_csh(pTHX)
a687059c 6993{
ae986130 6994#ifdef CSH
3280af22
NIS
6995 if (!PL_cshlen)
6996 PL_cshlen = strlen(PL_cshname);
ae986130 6997#endif
a687059c 6998}
463ee0b2 6999
ba6d6ac9 7000I32
864dbfa3 7001Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 7002{
11343788 7003 dTHR;
3280af22
NIS
7004 I32 oldsavestack_ix = PL_savestack_ix;
7005 CV* outsidecv = PL_compcv;
748a9306 7006 AV* comppadlist;
8990e307 7007
3280af22
NIS
7008 if (PL_compcv) {
7009 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 7010 }
7766f137 7011 SAVEI32(PL_subline);
3280af22
NIS
7012 save_item(PL_subname);
7013 SAVEI32(PL_padix);
7766f137 7014 SAVEVPTR(PL_curpad);
3280af22
NIS
7015 SAVESPTR(PL_comppad);
7016 SAVESPTR(PL_comppad_name);
7017 SAVESPTR(PL_compcv);
7018 SAVEI32(PL_comppad_name_fill);
7019 SAVEI32(PL_min_intro_pending);
7020 SAVEI32(PL_max_intro_pending);
7021 SAVEI32(PL_pad_reset_pending);
7022
7023 PL_compcv = (CV*)NEWSV(1104,0);
7024 sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
7025 CvFLAGS(PL_compcv) |= flags;
7026
7027 PL_comppad = newAV();
7028 av_push(PL_comppad, Nullsv);
7029 PL_curpad = AvARRAY(PL_comppad);
7030 PL_comppad_name = newAV();
7031 PL_comppad_name_fill = 0;
7032 PL_min_intro_pending = 0;
7033 PL_padix = 0;
57843af0 7034 PL_subline = CopLINE(PL_curcop);
6d4ff0d2 7035#ifdef USE_THREADS
79cb57f6 7036 av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
533c011a
NIS
7037 PL_curpad[0] = (SV*)newAV();
7038 SvPADMY_on(PL_curpad[0]); /* XXX Needed? */
6d4ff0d2 7039#endif /* USE_THREADS */
748a9306
LW
7040
7041 comppadlist = newAV();
7042 AvREAL_off(comppadlist);
3280af22
NIS
7043 av_store(comppadlist, 0, (SV*)PL_comppad_name);
7044 av_store(comppadlist, 1, (SV*)PL_comppad);
748a9306 7045
3280af22
NIS
7046 CvPADLIST(PL_compcv) = comppadlist;
7047 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
11343788 7048#ifdef USE_THREADS
533c011a
NIS
7049 CvOWNER(PL_compcv) = 0;
7050 New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
7051 MUTEX_INIT(CvMUTEXP(PL_compcv));
11343788 7052#endif /* USE_THREADS */
748a9306 7053
8990e307
LW
7054 return oldsavestack_ix;
7055}
7056
7057int
864dbfa3 7058Perl_yywarn(pTHX_ char *s)
8990e307 7059{
11343788 7060 dTHR;
faef0170 7061 PL_in_eval |= EVAL_WARNONLY;
748a9306 7062 yyerror(s);
faef0170 7063 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 7064 return 0;
8990e307
LW
7065}
7066
7067int
864dbfa3 7068Perl_yyerror(pTHX_ char *s)
463ee0b2 7069{
11343788 7070 dTHR;
68dc0745 7071 char *where = NULL;
7072 char *context = NULL;
7073 int contlen = -1;
46fc3d4c 7074 SV *msg;
463ee0b2 7075
3280af22 7076 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 7077 where = "at EOF";
3280af22
NIS
7078 else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
7079 PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
7080 while (isSPACE(*PL_oldoldbufptr))
7081 PL_oldoldbufptr++;
7082 context = PL_oldoldbufptr;
7083 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 7084 }
3280af22
NIS
7085 else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
7086 PL_oldbufptr != PL_bufptr) {
7087 while (isSPACE(*PL_oldbufptr))
7088 PL_oldbufptr++;
7089 context = PL_oldbufptr;
7090 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
7091 }
7092 else if (yychar > 255)
68dc0745 7093 where = "next token ???";
463ee0b2 7094 else if ((yychar & 127) == 127) {
3280af22
NIS
7095 if (PL_lex_state == LEX_NORMAL ||
7096 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 7097 where = "at end of line";
3280af22 7098 else if (PL_lex_inpat)
68dc0745 7099 where = "within pattern";
463ee0b2 7100 else
68dc0745 7101 where = "within string";
463ee0b2 7102 }
46fc3d4c 7103 else {
79cb57f6 7104 SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
46fc3d4c 7105 if (yychar < 32)
cea2e8a9 7106 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
46fc3d4c 7107 else if (isPRINT_LC(yychar))
cea2e8a9 7108 Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
463ee0b2 7109 else
cea2e8a9 7110 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
46fc3d4c 7111 where = SvPVX(where_sv);
463ee0b2 7112 }
46fc3d4c 7113 msg = sv_2mortal(newSVpv(s, 0));
ed094faf
GS
7114 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
7115 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 7116 if (context)
cea2e8a9 7117 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 7118 else
cea2e8a9 7119 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 7120 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 7121 Perl_sv_catpvf(aTHX_ msg,
57def98f 7122 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 7123 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 7124 PL_multi_end = 0;
a0d0e21e 7125 }
faef0170 7126 if (PL_in_eval & EVAL_WARNONLY)
894356b3 7127 Perl_warn(aTHX_ "%"SVf, msg);
463ee0b2 7128 else
5a844595
GS
7129 qerror(msg);
7130 if (PL_error_count >= 10)
ed094faf 7131 Perl_croak(aTHX_ "%s has too many errors.\n", CopFILE(PL_curcop));
3280af22
NIS
7132 PL_in_my = 0;
7133 PL_in_my_stash = Nullhv;
463ee0b2
LW
7134 return 0;
7135}
4e35701f 7136
161b471a 7137
51371543 7138#ifdef PERL_OBJECT
51371543
GS
7139#include "XSUB.h"
7140#endif
7141
ffb4593c
NT
7142/*
7143 * restore_rsfp
7144 * Restore a source filter.
7145 */
7146
51371543
GS
7147static void
7148restore_rsfp(pTHXo_ void *f)
7149{
7150 PerlIO *fp = (PerlIO*)f;
7151
7152 if (PL_rsfp == PerlIO_stdin())
7153 PerlIO_clearerr(PL_rsfp);
7154 else if (PL_rsfp && (PL_rsfp != fp))
7155 PerlIO_close(PL_rsfp);
7156 PL_rsfp = fp;
7157}