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