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