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