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