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