This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Typo in comment.
[perl5.git] / toke.c
CommitLineData
a0d0e21e 1/* toke.c
a687059c 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
770526c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
a687059c 5 *
d48672a2
LW
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
378cc40b 8 *
a0d0e21e
LW
9 */
10
11/*
12 * "It all comes from here, the stench and the peril." --Frodo
378cc40b
LW
13 */
14
9cbb5ea2
GS
15/*
16 * This file is the lexer for Perl. It's closely linked to the
4e553d73 17 * parser, perly.y.
ffb4593c
NT
18 *
19 * The main routine is yylex(), which returns the next token.
20 */
21
378cc40b 22#include "EXTERN.h"
864dbfa3 23#define PERL_IN_TOKE_C
378cc40b 24#include "perl.h"
378cc40b 25
12fbd33b
DM
26#define yychar (*PL_yycharp)
27#define yylval (*PL_yylvalp)
d3b6f988 28
27da23d5
JH
29static const char ident_too_long[] =
30 "Identifier too long";
31static const char c_without_g[] =
32 "Use of /c modifier is meaningless without /g";
33static const char c_in_subst[] =
34 "Use of /c modifier is meaningless in s///";
8903cb82 35
acfe0abc 36static void restore_rsfp(pTHX_ void *f);
6e3aabd6 37#ifndef PERL_NO_UTF16_FILTER
acfe0abc
GS
38static I32 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen);
39static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
6e3aabd6 40#endif
51371543 41
9059aa12
LW
42#define XFAKEBRACK 128
43#define XENUMMASK 127
44
39e02b42
JH
45#ifdef USE_UTF8_SCRIPTS
46# define UTF (!IN_BYTES)
2b9d42f0 47#else
746b446a 48# define UTF ((PL_linestr && DO_UTF8(PL_linestr)) || (PL_hints & HINT_UTF8))
2b9d42f0 49#endif
a0ed51b3 50
61f0cdd9 51/* In variables named $^X, these are the legal values for X.
2b92dfce
GS
52 * 1999-02-27 mjd-perl-patch@plover.com */
53#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
54
bf4acbe4
GS
55/* On MacOS, respect nonbreaking spaces */
56#ifdef MACOS_TRADITIONAL
57#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
58#else
59#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
60#endif
61
ffb4593c
NT
62/* LEX_* are values for PL_lex_state, the state of the lexer.
63 * They are arranged oddly so that the guard on the switch statement
79072805
LW
64 * can get by with a single comparison (if the compiler is smart enough).
65 */
66
fb73857a 67/* #define LEX_NOTPARSING 11 is done in perl.h. */
68
b6007c36
DM
69#define LEX_NORMAL 10 /* normal code (ie not within "...") */
70#define LEX_INTERPNORMAL 9 /* code within a string, eg "$foo[$x+1]" */
71#define LEX_INTERPCASEMOD 8 /* expecting a \U, \Q or \E etc */
72#define LEX_INTERPPUSH 7 /* starting a new sublex parse level */
73#define LEX_INTERPSTART 6 /* expecting the start of a $var */
74
75 /* at end of code, eg "$x" followed by: */
76#define LEX_INTERPEND 5 /* ... eg not one of [, { or -> */
77#define LEX_INTERPENDMAYBE 4 /* ... eg one of [, { or -> */
78
79#define LEX_INTERPCONCAT 3 /* expecting anything, eg at start of
80 string or after \E, $foo, etc */
81#define LEX_INTERPCONST 2 /* NOT USED */
82#define LEX_FORMLINE 1 /* expecting a format line */
83#define LEX_KNOWNEXT 0 /* next token known; just return it */
84
79072805 85
bbf60fe6 86#ifdef DEBUGGING
27da23d5 87static const char* const lex_state_names[] = {
bbf60fe6
DM
88 "KNOWNEXT",
89 "FORMLINE",
90 "INTERPCONST",
91 "INTERPCONCAT",
92 "INTERPENDMAYBE",
93 "INTERPEND",
94 "INTERPSTART",
95 "INTERPPUSH",
96 "INTERPCASEMOD",
97 "INTERPNORMAL",
98 "NORMAL"
99};
100#endif
101
79072805
LW
102#ifdef ff_next
103#undef ff_next
d48672a2
LW
104#endif
105
79072805 106#include "keywords.h"
fe14fcc3 107
ffb4593c
NT
108/* CLINE is a macro that ensures PL_copline has a sane value */
109
ae986130
LW
110#ifdef CLINE
111#undef CLINE
112#endif
57843af0 113#define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
3280af22 114
ffb4593c
NT
115/*
116 * Convenience functions to return different tokens and prime the
9cbb5ea2 117 * lexer for the next token. They all take an argument.
ffb4593c
NT
118 *
119 * TOKEN : generic token (used for '(', DOLSHARP, etc)
120 * OPERATOR : generic operator
121 * AOPERATOR : assignment operator
122 * PREBLOCK : beginning the block after an if, while, foreach, ...
123 * PRETERMBLOCK : beginning a non-code-defining {} block (eg, hash ref)
124 * PREREF : *EXPR where EXPR is not a simple identifier
125 * TERM : expression term
126 * LOOPX : loop exiting command (goto, last, dump, etc)
127 * FTST : file test operator
128 * FUN0 : zero-argument function
2d2e263d 129 * FUN1 : not used, except for not, which isn't a UNIOP
ffb4593c
NT
130 * BOop : bitwise or or xor
131 * BAop : bitwise and
132 * SHop : shift operator
133 * PWop : power operator
9cbb5ea2 134 * PMop : pattern-matching operator
ffb4593c
NT
135 * Aop : addition-level operator
136 * Mop : multiplication-level operator
137 * Eop : equality-testing operator
e5edeb50 138 * Rop : relational operator <= != gt
ffb4593c
NT
139 *
140 * Also see LOP and lop() below.
141 */
142
998054bd 143#ifdef DEBUGGING /* Serve -DT. */
bbf60fe6 144# define REPORT(retval) tokereport(s,(int)retval)
998054bd 145#else
bbf60fe6 146# define REPORT(retval) (retval)
998054bd
SC
147#endif
148
bbf60fe6
DM
149#define TOKEN(retval) return ( PL_bufptr = s, REPORT(retval))
150#define OPERATOR(retval) return (PL_expect = XTERM, PL_bufptr = s, REPORT(retval))
151#define AOPERATOR(retval) return ao((PL_expect = XTERM, PL_bufptr = s, REPORT(retval)))
152#define PREBLOCK(retval) return (PL_expect = XBLOCK,PL_bufptr = s, REPORT(retval))
153#define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval))
154#define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval))
155#define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval))
156#define LOOPX(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)LOOPEX))
157#define FTST(f) return (yylval.ival=f, PL_expect=XTERMORDORDOR, PL_bufptr=s, REPORT((int)UNIOP))
158#define FUN0(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC0))
159#define FUN1(f) return (yylval.ival=f, PL_expect=XOPERATOR, PL_bufptr=s, REPORT((int)FUNC1))
160#define BOop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITOROP)))
161#define BAop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)BITANDOP)))
162#define SHop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)SHIFTOP)))
163#define PWop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)POWOP)))
164#define PMop(f) return(yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MATCHOP))
165#define Aop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)ADDOP)))
166#define Mop(f) return ao((yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)MULOP)))
167#define Eop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)EQOP))
168#define Rop(f) return (yylval.ival=f, PL_expect=XTERM, PL_bufptr=s, REPORT((int)RELOP))
2f3197b3 169
a687059c
LW
170/* This bit of chicanery makes a unary function followed by
171 * a parenthesis into a function with one argument, highest precedence.
6f33ba73
RGS
172 * The UNIDOR macro is for unary functions that can be followed by the //
173 * operator (such as C<shift // 0>).
a687059c 174 */
376fcdbf
AL
175#define UNI2(f,x) { \
176 yylval.ival = f; \
177 PL_expect = x; \
178 PL_bufptr = s; \
179 PL_last_uni = PL_oldbufptr; \
180 PL_last_lop_op = f; \
181 if (*s == '(') \
182 return REPORT( (int)FUNC1 ); \
183 s = skipspace(s); \
184 return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
185 }
6f33ba73
RGS
186#define UNI(f) UNI2(f,XTERM)
187#define UNIDOR(f) UNI2(f,XTERMORDORDOR)
a687059c 188
376fcdbf
AL
189#define UNIBRACK(f) { \
190 yylval.ival = f; \
191 PL_bufptr = s; \
192 PL_last_uni = PL_oldbufptr; \
193 if (*s == '(') \
194 return REPORT( (int)FUNC1 ); \
195 s = skipspace(s); \
196 return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
197 }
79072805 198
9f68db38 199/* grandfather return to old style */
3280af22 200#define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
79072805 201
8fa7f367
JH
202#ifdef DEBUGGING
203
bbf60fe6
DM
204/* how to interpret the yylval associated with the token */
205enum token_type {
206 TOKENTYPE_NONE,
207 TOKENTYPE_IVAL,
208 TOKENTYPE_OPNUM, /* yylval.ival contains an opcode number */
209 TOKENTYPE_PVAL,
210 TOKENTYPE_OPVAL,
211 TOKENTYPE_GVVAL
212};
213
27da23d5
JH
214static struct debug_tokens { const int token, type; const char *name; }
215 const debug_tokens[] =
9041c2e3 216{
bbf60fe6
DM
217 { ADDOP, TOKENTYPE_OPNUM, "ADDOP" },
218 { ANDAND, TOKENTYPE_NONE, "ANDAND" },
219 { ANDOP, TOKENTYPE_NONE, "ANDOP" },
220 { ANONSUB, TOKENTYPE_IVAL, "ANONSUB" },
221 { ARROW, TOKENTYPE_NONE, "ARROW" },
222 { ASSIGNOP, TOKENTYPE_OPNUM, "ASSIGNOP" },
223 { BITANDOP, TOKENTYPE_OPNUM, "BITANDOP" },
224 { BITOROP, TOKENTYPE_OPNUM, "BITOROP" },
225 { COLONATTR, TOKENTYPE_NONE, "COLONATTR" },
226 { CONTINUE, TOKENTYPE_NONE, "CONTINUE" },
227 { DO, TOKENTYPE_NONE, "DO" },
228 { DOLSHARP, TOKENTYPE_NONE, "DOLSHARP" },
229 { DORDOR, TOKENTYPE_NONE, "DORDOR" },
230 { DOROP, TOKENTYPE_OPNUM, "DOROP" },
231 { DOTDOT, TOKENTYPE_IVAL, "DOTDOT" },
232 { ELSE, TOKENTYPE_NONE, "ELSE" },
233 { ELSIF, TOKENTYPE_IVAL, "ELSIF" },
234 { EQOP, TOKENTYPE_OPNUM, "EQOP" },
235 { FOR, TOKENTYPE_IVAL, "FOR" },
236 { FORMAT, TOKENTYPE_NONE, "FORMAT" },
237 { FUNC, TOKENTYPE_OPNUM, "FUNC" },
238 { FUNC0, TOKENTYPE_OPNUM, "FUNC0" },
239 { FUNC0SUB, TOKENTYPE_OPVAL, "FUNC0SUB" },
240 { FUNC1, TOKENTYPE_OPNUM, "FUNC1" },
241 { FUNCMETH, TOKENTYPE_OPVAL, "FUNCMETH" },
242 { HASHBRACK, TOKENTYPE_NONE, "HASHBRACK" },
243 { IF, TOKENTYPE_IVAL, "IF" },
244 { LABEL, TOKENTYPE_PVAL, "LABEL" },
245 { LOCAL, TOKENTYPE_IVAL, "LOCAL" },
246 { LOOPEX, TOKENTYPE_OPNUM, "LOOPEX" },
247 { LSTOP, TOKENTYPE_OPNUM, "LSTOP" },
248 { LSTOPSUB, TOKENTYPE_OPVAL, "LSTOPSUB" },
249 { MATCHOP, TOKENTYPE_OPNUM, "MATCHOP" },
250 { METHOD, TOKENTYPE_OPVAL, "METHOD" },
251 { MULOP, TOKENTYPE_OPNUM, "MULOP" },
252 { MY, TOKENTYPE_IVAL, "MY" },
253 { MYSUB, TOKENTYPE_NONE, "MYSUB" },
254 { NOAMP, TOKENTYPE_NONE, "NOAMP" },
255 { NOTOP, TOKENTYPE_NONE, "NOTOP" },
256 { OROP, TOKENTYPE_IVAL, "OROP" },
257 { OROR, TOKENTYPE_NONE, "OROR" },
258 { PACKAGE, TOKENTYPE_NONE, "PACKAGE" },
259 { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" },
260 { POSTDEC, TOKENTYPE_NONE, "POSTDEC" },
261 { POSTINC, TOKENTYPE_NONE, "POSTINC" },
262 { POWOP, TOKENTYPE_OPNUM, "POWOP" },
263 { PREDEC, TOKENTYPE_NONE, "PREDEC" },
264 { PREINC, TOKENTYPE_NONE, "PREINC" },
265 { PRIVATEREF, TOKENTYPE_OPVAL, "PRIVATEREF" },
266 { REFGEN, TOKENTYPE_NONE, "REFGEN" },
267 { RELOP, TOKENTYPE_OPNUM, "RELOP" },
268 { SHIFTOP, TOKENTYPE_OPNUM, "SHIFTOP" },
269 { SUB, TOKENTYPE_NONE, "SUB" },
270 { THING, TOKENTYPE_OPVAL, "THING" },
271 { UMINUS, TOKENTYPE_NONE, "UMINUS" },
272 { UNIOP, TOKENTYPE_OPNUM, "UNIOP" },
273 { UNIOPSUB, TOKENTYPE_OPVAL, "UNIOPSUB" },
274 { UNLESS, TOKENTYPE_IVAL, "UNLESS" },
275 { UNTIL, TOKENTYPE_IVAL, "UNTIL" },
276 { USE, TOKENTYPE_IVAL, "USE" },
277 { WHILE, TOKENTYPE_IVAL, "WHILE" },
278 { WORD, TOKENTYPE_OPVAL, "WORD" },
279 { 0, TOKENTYPE_NONE, 0 }
280};
281
282/* dump the returned token in rv, plus any optional arg in yylval */
998054bd 283
bbf60fe6 284STATIC int
bfed75c6 285S_tokereport(pTHX_ const char* s, I32 rv)
bbf60fe6
DM
286{
287 if (DEBUG_T_TEST) {
bfed75c6 288 const char *name = Nullch;
bbf60fe6 289 enum token_type type = TOKENTYPE_NONE;
f54cb97a 290 const struct debug_tokens *p;
9d4ba2ae 291 SV* const report = newSVpvn("<== ", 4);
bbf60fe6 292
f54cb97a 293 for (p = debug_tokens; p->token; p++) {
bbf60fe6
DM
294 if (p->token == (int)rv) {
295 name = p->name;
296 type = p->type;
297 break;
298 }
299 }
300 if (name)
54667de8 301 Perl_sv_catpv(aTHX_ report, name);
bbf60fe6
DM
302 else if ((char)rv > ' ' && (char)rv < '~')
303 Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
304 else if (!rv)
54667de8 305 Perl_sv_catpv(aTHX_ report, "EOF");
bbf60fe6
DM
306 else
307 Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
308 switch (type) {
309 case TOKENTYPE_NONE:
310 case TOKENTYPE_GVVAL: /* doesn't appear to be used */
311 break;
312 case TOKENTYPE_IVAL:
e4584336 313 Perl_sv_catpvf(aTHX_ report, "(ival=%"IVdf")", (IV)yylval.ival);
bbf60fe6
DM
314 break;
315 case TOKENTYPE_OPNUM:
316 Perl_sv_catpvf(aTHX_ report, "(ival=op_%s)",
317 PL_op_name[yylval.ival]);
318 break;
319 case TOKENTYPE_PVAL:
320 Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", yylval.pval);
321 break;
322 case TOKENTYPE_OPVAL:
b6007c36 323 if (yylval.opval) {
401441c0 324 Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
bbf60fe6 325 PL_op_name[yylval.opval->op_type]);
b6007c36
DM
326 if (yylval.opval->op_type == OP_CONST) {
327 Perl_sv_catpvf(aTHX_ report, " %s",
328 SvPEEK(cSVOPx_sv(yylval.opval)));
329 }
330
331 }
401441c0
RGS
332 else
333 Perl_sv_catpv(aTHX_ report, "(opval=null)");
bbf60fe6
DM
334 break;
335 }
b6007c36 336 PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
bbf60fe6
DM
337 };
338 return (int)rv;
998054bd
SC
339}
340
b6007c36
DM
341
342/* print the buffer with suitable escapes */
343
344STATIC void
345S_printbuf(pTHX_ const char* fmt, const char* s)
346{
347 SV* tmp = newSVpvn("", 0);
348 PerlIO_printf(Perl_debug_log, fmt, pv_display(tmp, s, strlen(s), 0, 60));
349 SvREFCNT_dec(tmp);
350}
351
8fa7f367
JH
352#endif
353
ffb4593c
NT
354/*
355 * S_ao
356 *
c963b151
BD
357 * This subroutine detects &&=, ||=, and //= and turns an ANDAND, OROR or DORDOR
358 * into an OP_ANDASSIGN, OP_ORASSIGN, or OP_DORASSIGN
ffb4593c
NT
359 */
360
76e3520e 361STATIC int
cea2e8a9 362S_ao(pTHX_ int toketype)
a0d0e21e 363{
3280af22
NIS
364 if (*PL_bufptr == '=') {
365 PL_bufptr++;
a0d0e21e
LW
366 if (toketype == ANDAND)
367 yylval.ival = OP_ANDASSIGN;
368 else if (toketype == OROR)
369 yylval.ival = OP_ORASSIGN;
c963b151
BD
370 else if (toketype == DORDOR)
371 yylval.ival = OP_DORASSIGN;
a0d0e21e
LW
372 toketype = ASSIGNOP;
373 }
374 return toketype;
375}
376
ffb4593c
NT
377/*
378 * S_no_op
379 * When Perl expects an operator and finds something else, no_op
380 * prints the warning. It always prints "<something> found where
381 * operator expected. It prints "Missing semicolon on previous line?"
382 * if the surprise occurs at the start of the line. "do you need to
383 * predeclare ..." is printed out for code like "sub bar; foo bar $x"
384 * where the compiler doesn't know if foo is a method call or a function.
385 * It prints "Missing operator before end of line" if there's nothing
386 * after the missing operator, or "... before <...>" if there is something
387 * after the missing operator.
388 */
389
76e3520e 390STATIC void
bfed75c6 391S_no_op(pTHX_ const char *what, char *s)
463ee0b2 392{
9d4ba2ae
AL
393 char * const oldbp = PL_bufptr;
394 const bool is_first = (PL_oldbufptr == PL_linestart);
68dc0745 395
1189a94a
GS
396 if (!s)
397 s = oldbp;
07c798fb 398 else
1189a94a 399 PL_bufptr = s;
cea2e8a9 400 yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
56da5a46
RGS
401 if (ckWARN_d(WARN_SYNTAX)) {
402 if (is_first)
403 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
404 "\t(Missing semicolon on previous line?)\n");
405 else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
f54cb97a 406 const char *t;
56da5a46
RGS
407 for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
408 if (t < PL_bufptr && isSPACE(*t))
409 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
410 "\t(Do you need to predeclare %.*s?)\n",
411 t - PL_oldoldbufptr, PL_oldoldbufptr);
412 }
413 else {
414 assert(s >= oldbp);
415 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
416 "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
417 }
07c798fb 418 }
3280af22 419 PL_bufptr = oldbp;
8990e307
LW
420}
421
ffb4593c
NT
422/*
423 * S_missingterm
424 * Complain about missing quote/regexp/heredoc terminator.
425 * If it's called with (char *)NULL then it cauterizes the line buffer.
426 * If we're in a delimited string and the delimiter is a control
427 * character, it's reformatted into a two-char sequence like ^C.
428 * This is fatal.
429 */
430
76e3520e 431STATIC void
cea2e8a9 432S_missingterm(pTHX_ char *s)
8990e307
LW
433{
434 char tmpbuf[3];
435 char q;
436 if (s) {
9d4ba2ae 437 char * const nl = strrchr(s,'\n');
d2719217 438 if (nl)
8990e307
LW
439 *nl = '\0';
440 }
9d116dd7
JH
441 else if (
442#ifdef EBCDIC
443 iscntrl(PL_multi_close)
444#else
445 PL_multi_close < 32 || PL_multi_close == 127
446#endif
447 ) {
8990e307 448 *tmpbuf = '^';
3280af22 449 tmpbuf[1] = toCTRL(PL_multi_close);
8990e307
LW
450 tmpbuf[2] = '\0';
451 s = tmpbuf;
452 }
453 else {
eb160463 454 *tmpbuf = (char)PL_multi_close;
8990e307
LW
455 tmpbuf[1] = '\0';
456 s = tmpbuf;
457 }
458 q = strchr(s,'"') ? '\'' : '"';
cea2e8a9 459 Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
463ee0b2 460}
79072805 461
ffb4593c
NT
462/*
463 * Perl_deprecate
ffb4593c
NT
464 */
465
79072805 466void
bfed75c6 467Perl_deprecate(pTHX_ const char *s)
a0d0e21e 468{
599cee73 469 if (ckWARN(WARN_DEPRECATED))
9014280d 470 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), "Use of %s is deprecated", s);
a0d0e21e
LW
471}
472
12bcd1a6 473void
bfed75c6 474Perl_deprecate_old(pTHX_ const char *s)
12bcd1a6
PM
475{
476 /* This function should NOT be called for any new deprecated warnings */
477 /* Use Perl_deprecate instead */
478 /* */
479 /* It is here to maintain backward compatibility with the pre-5.8 */
480 /* warnings category hierarchy. The "deprecated" category used to */
481 /* live under the "syntax" category. It is now a top-level category */
482 /* in its own right. */
483
484 if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
bfed75c6 485 Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
12bcd1a6
PM
486 "Use of %s is deprecated", s);
487}
488
ffb4593c
NT
489/*
490 * depcom
9cbb5ea2 491 * Deprecate a comma-less variable list.
ffb4593c
NT
492 */
493
76e3520e 494STATIC void
cea2e8a9 495S_depcom(pTHX)
a0d0e21e 496{
12bcd1a6 497 deprecate_old("comma-less variable list");
a0d0e21e
LW
498}
499
ffb4593c 500/*
9cbb5ea2
GS
501 * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
502 * utf16-to-utf8-reversed.
ffb4593c
NT
503 */
504
c39cd008
GS
505#ifdef PERL_CR_FILTER
506static void
507strip_return(SV *sv)
508{
95a20fc0 509 register const char *s = SvPVX_const(sv);
9d4ba2ae 510 register const char * const e = s + SvCUR(sv);
c39cd008
GS
511 /* outer loop optimized to do nothing if there are no CR-LFs */
512 while (s < e) {
513 if (*s++ == '\r' && *s == '\n') {
514 /* hit a CR-LF, need to copy the rest */
515 register char *d = s - 1;
516 *d++ = *s++;
517 while (s < e) {
518 if (*s == '\r' && s[1] == '\n')
519 s++;
520 *d++ = *s++;
521 }
522 SvCUR(sv) -= s - d;
523 return;
524 }
525 }
526}
a868473f 527
76e3520e 528STATIC I32
c39cd008 529S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
a868473f 530{
f54cb97a 531 const I32 count = FILTER_READ(idx+1, sv, maxlen);
c39cd008
GS
532 if (count > 0 && !maxlen)
533 strip_return(sv);
534 return count;
a868473f
NIS
535}
536#endif
537
ffb4593c
NT
538/*
539 * Perl_lex_start
9cbb5ea2
GS
540 * Initialize variables. Uses the Perl save_stack to save its state (for
541 * recursive calls to the parser).
ffb4593c
NT
542 */
543
a0d0e21e 544void
864dbfa3 545Perl_lex_start(pTHX_ SV *line)
79072805 546{
cfd0369c 547 const char *s;
8990e307
LW
548 STRLEN len;
549
3280af22
NIS
550 SAVEI32(PL_lex_dojoin);
551 SAVEI32(PL_lex_brackets);
3280af22
NIS
552 SAVEI32(PL_lex_casemods);
553 SAVEI32(PL_lex_starts);
554 SAVEI32(PL_lex_state);
7766f137 555 SAVEVPTR(PL_lex_inpat);
3280af22 556 SAVEI32(PL_lex_inwhat);
18b09519
GS
557 if (PL_lex_state == LEX_KNOWNEXT) {
558 I32 toke = PL_nexttoke;
559 while (--toke >= 0) {
560 SAVEI32(PL_nexttype[toke]);
561 SAVEVPTR(PL_nextval[toke]);
562 }
563 SAVEI32(PL_nexttoke);
18b09519 564 }
57843af0 565 SAVECOPLINE(PL_curcop);
3280af22
NIS
566 SAVEPPTR(PL_bufptr);
567 SAVEPPTR(PL_bufend);
568 SAVEPPTR(PL_oldbufptr);
569 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
570 SAVEPPTR(PL_last_lop);
571 SAVEPPTR(PL_last_uni);
3280af22
NIS
572 SAVEPPTR(PL_linestart);
573 SAVESPTR(PL_linestr);
8edd5f42
RGS
574 SAVEGENERICPV(PL_lex_brackstack);
575 SAVEGENERICPV(PL_lex_casestack);
c76ac1ee 576 SAVEDESTRUCTOR_X(restore_rsfp, PL_rsfp);
3280af22
NIS
577 SAVESPTR(PL_lex_stuff);
578 SAVEI32(PL_lex_defer);
09bef843 579 SAVEI32(PL_sublex_info.sub_inwhat);
3280af22 580 SAVESPTR(PL_lex_repl);
bebdddfc
GS
581 SAVEINT(PL_expect);
582 SAVEINT(PL_lex_expect);
3280af22
NIS
583
584 PL_lex_state = LEX_NORMAL;
585 PL_lex_defer = 0;
586 PL_expect = XSTATE;
587 PL_lex_brackets = 0;
a02a5408
JC
588 Newx(PL_lex_brackstack, 120, char);
589 Newx(PL_lex_casestack, 12, char);
3280af22
NIS
590 PL_lex_casemods = 0;
591 *PL_lex_casestack = '\0';
592 PL_lex_dojoin = 0;
593 PL_lex_starts = 0;
594 PL_lex_stuff = Nullsv;
595 PL_lex_repl = Nullsv;
596 PL_lex_inpat = 0;
76be56bc 597 PL_nexttoke = 0;
3280af22 598 PL_lex_inwhat = 0;
09bef843 599 PL_sublex_info.sub_inwhat = 0;
3280af22
NIS
600 PL_linestr = line;
601 if (SvREADONLY(PL_linestr))
602 PL_linestr = sv_2mortal(newSVsv(PL_linestr));
cfd0369c 603 s = SvPV_const(PL_linestr, len);
6f27f9a7 604 if (!len || s[len-1] != ';') {
3280af22
NIS
605 if (!(SvFLAGS(PL_linestr) & SVs_TEMP))
606 PL_linestr = sv_2mortal(newSVsv(PL_linestr));
607 sv_catpvn(PL_linestr, "\n;", 2);
8990e307 608 }
3280af22
NIS
609 SvTEMP_off(PL_linestr);
610 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
611 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
207e3d1a 612 PL_last_lop = PL_last_uni = Nullch;
3280af22 613 PL_rsfp = 0;
79072805 614}
a687059c 615
ffb4593c
NT
616/*
617 * Perl_lex_end
9cbb5ea2
GS
618 * Finalizer for lexing operations. Must be called when the parser is
619 * done with the lexer.
ffb4593c
NT
620 */
621
463ee0b2 622void
864dbfa3 623Perl_lex_end(pTHX)
463ee0b2 624{
3280af22 625 PL_doextract = FALSE;
463ee0b2
LW
626}
627
ffb4593c
NT
628/*
629 * S_incline
630 * This subroutine has nothing to do with tilting, whether at windmills
631 * or pinball tables. Its name is short for "increment line". It
57843af0 632 * increments the current line number in CopLINE(PL_curcop) and checks
ffb4593c 633 * to see whether the line starts with a comment of the form
9cbb5ea2
GS
634 * # line 500 "foo.pm"
635 * If so, it sets the current line number and file to the values in the comment.
ffb4593c
NT
636 */
637
76e3520e 638STATIC void
cea2e8a9 639S_incline(pTHX_ char *s)
463ee0b2
LW
640{
641 char *t;
642 char *n;
73659bf1 643 char *e;
463ee0b2 644 char ch;
463ee0b2 645
57843af0 646 CopLINE_inc(PL_curcop);
463ee0b2
LW
647 if (*s++ != '#')
648 return;
bf4acbe4 649 while (SPACE_OR_TAB(*s)) s++;
73659bf1
GS
650 if (strnEQ(s, "line", 4))
651 s += 4;
652 else
653 return;
084592ab 654 if (SPACE_OR_TAB(*s))
73659bf1 655 s++;
4e553d73 656 else
73659bf1 657 return;
bf4acbe4 658 while (SPACE_OR_TAB(*s)) s++;
463ee0b2
LW
659 if (!isDIGIT(*s))
660 return;
661 n = s;
662 while (isDIGIT(*s))
663 s++;
bf4acbe4 664 while (SPACE_OR_TAB(*s))
463ee0b2 665 s++;
73659bf1 666 if (*s == '"' && (t = strchr(s+1, '"'))) {
463ee0b2 667 s++;
73659bf1
GS
668 e = t + 1;
669 }
463ee0b2 670 else {
463ee0b2 671 for (t = s; !isSPACE(*t); t++) ;
73659bf1 672 e = t;
463ee0b2 673 }
bf4acbe4 674 while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
73659bf1
GS
675 e++;
676 if (*e != '\n' && *e != '\0')
677 return; /* false alarm */
678
463ee0b2
LW
679 ch = *t;
680 *t = '\0';
f4dd75d9 681 if (t - s > 0) {
8a5ee598 682#ifndef USE_ITHREADS
e66cf94c
RGS
683 const char *cf = CopFILE(PL_curcop);
684 if (cf && strlen(cf) > 7 && strnEQ(cf, "(eval ", 6)) {
685 /* must copy *{"::_<(eval N)[oldfilename:L]"}
686 * to *{"::_<newfilename"} */
687 char smallbuf[256], smallbuf2[256];
688 char *tmpbuf, *tmpbuf2;
8a5ee598 689 GV **gvp, *gv2;
e66cf94c
RGS
690 STRLEN tmplen = strlen(cf);
691 STRLEN tmplen2 = strlen(s);
692 if (tmplen + 3 < sizeof smallbuf)
693 tmpbuf = smallbuf;
694 else
695 Newx(tmpbuf, tmplen + 3, char);
696 if (tmplen2 + 3 < sizeof smallbuf2)
697 tmpbuf2 = smallbuf2;
698 else
699 Newx(tmpbuf2, tmplen2 + 3, char);
700 tmpbuf[0] = tmpbuf2[0] = '_';
701 tmpbuf[1] = tmpbuf2[1] = '<';
702 memcpy(tmpbuf + 2, cf, ++tmplen);
703 memcpy(tmpbuf2 + 2, s, ++tmplen2);
704 ++tmplen; ++tmplen2;
8a5ee598
RGS
705 gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
706 if (gvp) {
707 gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
708 if (!isGV(gv2))
709 gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
710 /* adjust ${"::_<newfilename"} to store the new file name */
711 GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
712 GvHV(gv2) = (HV*)SvREFCNT_inc(GvHV(*gvp));
713 GvAV(gv2) = (AV*)SvREFCNT_inc(GvAV(*gvp));
714 }
e66cf94c
RGS
715 if (tmpbuf != smallbuf) Safefree(tmpbuf);
716 if (tmpbuf2 != smallbuf2) Safefree(tmpbuf2);
717 }
8a5ee598 718#endif
05ec9bb3 719 CopFILE_free(PL_curcop);
57843af0 720 CopFILE_set(PL_curcop, s);
f4dd75d9 721 }
463ee0b2 722 *t = ch;
57843af0 723 CopLINE_set(PL_curcop, atoi(n)-1);
463ee0b2
LW
724}
725
ffb4593c
NT
726/*
727 * S_skipspace
728 * Called to gobble the appropriate amount and type of whitespace.
729 * Skips comments as well.
730 */
731
76e3520e 732STATIC char *
cea2e8a9 733S_skipspace(pTHX_ register char *s)
a687059c 734{
3280af22 735 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
bf4acbe4 736 while (s < PL_bufend && SPACE_OR_TAB(*s))
463ee0b2
LW
737 s++;
738 return s;
739 }
740 for (;;) {
fd049845 741 STRLEN prevlen;
09bef843 742 SSize_t oldprevlen, oldoldprevlen;
9c5ffd7c 743 SSize_t oldloplen = 0, oldunilen = 0;
60e6418e
GS
744 while (s < PL_bufend && isSPACE(*s)) {
745 if (*s++ == '\n' && PL_in_eval && !PL_rsfp)
746 incline(s);
747 }
ffb4593c
NT
748
749 /* comment */
3280af22
NIS
750 if (s < PL_bufend && *s == '#') {
751 while (s < PL_bufend && *s != '\n')
463ee0b2 752 s++;
60e6418e 753 if (s < PL_bufend) {
463ee0b2 754 s++;
60e6418e
GS
755 if (PL_in_eval && !PL_rsfp) {
756 incline(s);
757 continue;
758 }
759 }
463ee0b2 760 }
ffb4593c
NT
761
762 /* only continue to recharge the buffer if we're at the end
763 * of the buffer, we're not reading from a source filter, and
764 * we're in normal lexing mode
765 */
09bef843
SB
766 if (s < PL_bufend || !PL_rsfp || PL_sublex_info.sub_inwhat ||
767 PL_lex_state == LEX_FORMLINE)
463ee0b2 768 return s;
ffb4593c
NT
769
770 /* try to recharge the buffer */
9cbb5ea2
GS
771 if ((s = filter_gets(PL_linestr, PL_rsfp,
772 (prevlen = SvCUR(PL_linestr)))) == Nullch)
773 {
774 /* end of file. Add on the -p or -n magic */
01a19ab0
NC
775 if (PL_minus_p) {
776 sv_setpv(PL_linestr,
777 ";}continue{print or die qq(-p destination: $!\\n);}");
3280af22 778 PL_minus_n = PL_minus_p = 0;
a0d0e21e 779 }
01a19ab0
NC
780 else if (PL_minus_n) {
781 sv_setpvn(PL_linestr, ";}", 2);
782 PL_minus_n = 0;
783 }
a0d0e21e 784 else
4147a61b 785 sv_setpvn(PL_linestr,";", 1);
ffb4593c
NT
786
787 /* reset variables for next time we lex */
9cbb5ea2
GS
788 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
789 = SvPVX(PL_linestr);
3280af22 790 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 791 PL_last_lop = PL_last_uni = Nullch;
ffb4593c
NT
792
793 /* Close the filehandle. Could be from -P preprocessor,
794 * STDIN, or a regular file. If we were reading code from
795 * STDIN (because the commandline held no -e or filename)
796 * then we don't close it, we reset it so the code can
797 * read from STDIN too.
798 */
799
3280af22
NIS
800 if (PL_preprocess && !PL_in_eval)
801 (void)PerlProc_pclose(PL_rsfp);
802 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
803 PerlIO_clearerr(PL_rsfp);
8990e307 804 else
3280af22
NIS
805 (void)PerlIO_close(PL_rsfp);
806 PL_rsfp = Nullfp;
463ee0b2
LW
807 return s;
808 }
ffb4593c
NT
809
810 /* not at end of file, so we only read another line */
09bef843
SB
811 /* make corresponding updates to old pointers, for yyerror() */
812 oldprevlen = PL_oldbufptr - PL_bufend;
813 oldoldprevlen = PL_oldoldbufptr - PL_bufend;
814 if (PL_last_uni)
815 oldunilen = PL_last_uni - PL_bufend;
816 if (PL_last_lop)
817 oldloplen = PL_last_lop - PL_bufend;
3280af22
NIS
818 PL_linestart = PL_bufptr = s + prevlen;
819 PL_bufend = s + SvCUR(PL_linestr);
820 s = PL_bufptr;
09bef843
SB
821 PL_oldbufptr = s + oldprevlen;
822 PL_oldoldbufptr = s + oldoldprevlen;
823 if (PL_last_uni)
824 PL_last_uni = s + oldunilen;
825 if (PL_last_lop)
826 PL_last_lop = s + oldloplen;
a0d0e21e 827 incline(s);
ffb4593c
NT
828
829 /* debugger active and we're not compiling the debugger code,
830 * so store the line into the debugger's array of lines
831 */
3280af22 832 if (PERLDB_LINE && PL_curstash != PL_debstash) {
9d4ba2ae 833 SV * const sv = NEWSV(85,0);
8990e307
LW
834
835 sv_upgrade(sv, SVt_PVMG);
3280af22 836 sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
0ac0412a 837 (void)SvIOK_on(sv);
45977657 838 SvIV_set(sv, 0);
57843af0 839 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
8990e307 840 }
463ee0b2 841 }
a687059c 842}
378cc40b 843
ffb4593c
NT
844/*
845 * S_check_uni
846 * Check the unary operators to ensure there's no ambiguity in how they're
847 * used. An ambiguous piece of code would be:
848 * rand + 5
849 * This doesn't mean rand() + 5. Because rand() is a unary operator,
850 * the +5 is its argument.
851 */
852
76e3520e 853STATIC void
cea2e8a9 854S_check_uni(pTHX)
ba106d47 855{
2f3197b3 856 char *s;
a0d0e21e 857 char *t;
2f3197b3 858
3280af22 859 if (PL_oldoldbufptr != PL_last_uni)
2f3197b3 860 return;
3280af22
NIS
861 while (isSPACE(*PL_last_uni))
862 PL_last_uni++;
7e2040f0 863 for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++) ;
3280af22 864 if ((t = strchr(s, '(')) && t < PL_bufptr)
a0d0e21e 865 return;
0453d815 866 if (ckWARN_d(WARN_AMBIGUOUS)){
9d4ba2ae 867 const char ch = *s;
0453d815 868 *s = '\0';
9014280d 869 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
2d5ccbba 870 "Warning: Use of \"%s\" without parentheses is ambiguous",
0453d815
PM
871 PL_last_uni);
872 *s = ch;
873 }
2f3197b3
LW
874}
875
ffb4593c
NT
876/*
877 * LOP : macro to build a list operator. Its behaviour has been replaced
878 * with a subroutine, S_lop() for which LOP is just another name.
879 */
880
a0d0e21e
LW
881#define LOP(f,x) return lop(f,x,s)
882
ffb4593c
NT
883/*
884 * S_lop
885 * Build a list operator (or something that might be one). The rules:
886 * - if we have a next token, then it's a list operator [why?]
887 * - if the next thing is an opening paren, then it's a function
888 * - else it's a list operator
889 */
890
76e3520e 891STATIC I32
a0be28da 892S_lop(pTHX_ I32 f, int x, char *s)
ffed7fef 893{
79072805 894 yylval.ival = f;
35c8bce7 895 CLINE;
3280af22
NIS
896 PL_expect = x;
897 PL_bufptr = s;
898 PL_last_lop = PL_oldbufptr;
eb160463 899 PL_last_lop_op = (OPCODE)f;
3280af22 900 if (PL_nexttoke)
bbf60fe6 901 return REPORT(LSTOP);
79072805 902 if (*s == '(')
bbf60fe6 903 return REPORT(FUNC);
79072805
LW
904 s = skipspace(s);
905 if (*s == '(')
bbf60fe6 906 return REPORT(FUNC);
79072805 907 else
bbf60fe6 908 return REPORT(LSTOP);
79072805
LW
909}
910
ffb4593c
NT
911/*
912 * S_force_next
9cbb5ea2 913 * When the lexer realizes it knows the next token (for instance,
ffb4593c 914 * it is reordering tokens for the parser) then it can call S_force_next
9cbb5ea2
GS
915 * to know what token to return the next time the lexer is called. Caller
916 * will need to set PL_nextval[], and possibly PL_expect to ensure the lexer
917 * handles the token correctly.
ffb4593c
NT
918 */
919
4e553d73 920STATIC void
cea2e8a9 921S_force_next(pTHX_ I32 type)
79072805 922{
3280af22
NIS
923 PL_nexttype[PL_nexttoke] = type;
924 PL_nexttoke++;
925 if (PL_lex_state != LEX_KNOWNEXT) {
926 PL_lex_defer = PL_lex_state;
927 PL_lex_expect = PL_expect;
928 PL_lex_state = LEX_KNOWNEXT;
79072805
LW
929 }
930}
931
d0a148a6
NC
932STATIC SV *
933S_newSV_maybe_utf8(pTHX_ const char *start, STRLEN len)
934{
9d4ba2ae 935 SV * const sv = newSVpvn(start,len);
bfed75c6 936 if (UTF && !IN_BYTES && is_utf8_string((const U8*)start, len))
d0a148a6
NC
937 SvUTF8_on(sv);
938 return sv;
939}
940
ffb4593c
NT
941/*
942 * S_force_word
943 * When the lexer knows the next thing is a word (for instance, it has
944 * just seen -> and it knows that the next char is a word char, then
945 * it calls S_force_word to stick the next word into the PL_next lookahead.
946 *
947 * Arguments:
b1b65b59 948 * char *start : buffer position (must be within PL_linestr)
ffb4593c
NT
949 * int token : PL_next will be this type of bare word (e.g., METHOD,WORD)
950 * int check_keyword : if true, Perl checks to make sure the word isn't
951 * a keyword (do this if the word is a label, e.g. goto FOO)
952 * int allow_pack : if true, : characters will also be allowed (require,
953 * use, etc. do this)
9cbb5ea2 954 * int allow_initial_tick : used by the "sub" lexer only.
ffb4593c
NT
955 */
956
76e3520e 957STATIC char *
cea2e8a9 958S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
79072805 959{
463ee0b2
LW
960 register char *s;
961 STRLEN len;
4e553d73 962
463ee0b2
LW
963 start = skipspace(start);
964 s = start;
7e2040f0 965 if (isIDFIRST_lazy_if(s,UTF) ||
a0d0e21e 966 (allow_pack && *s == ':') ||
15f0808c 967 (allow_initial_tick && *s == '\'') )
a0d0e21e 968 {
3280af22
NIS
969 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
970 if (check_keyword && keyword(PL_tokenbuf, len))
463ee0b2
LW
971 return start;
972 if (token == METHOD) {
973 s = skipspace(s);
974 if (*s == '(')
3280af22 975 PL_expect = XTERM;
463ee0b2 976 else {
3280af22 977 PL_expect = XOPERATOR;
463ee0b2 978 }
79072805 979 }
d0a148a6
NC
980 PL_nextval[PL_nexttoke].opval
981 = (OP*)newSVOP(OP_CONST,0,
982 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
3280af22 983 PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
79072805
LW
984 force_next(token);
985 }
986 return s;
987}
988
ffb4593c
NT
989/*
990 * S_force_ident
9cbb5ea2 991 * Called when the lexer wants $foo *foo &foo etc, but the program
ffb4593c
NT
992 * text only contains the "foo" portion. The first argument is a pointer
993 * to the "foo", and the second argument is the type symbol to prefix.
994 * Forces the next token to be a "WORD".
9cbb5ea2 995 * Creates the symbol if it didn't already exist (via gv_fetchpv()).
ffb4593c
NT
996 */
997
76e3520e 998STATIC void
bfed75c6 999S_force_ident(pTHX_ register const char *s, int kind)
79072805
LW
1000{
1001 if (s && *s) {
bfed75c6 1002 OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
3280af22 1003 PL_nextval[PL_nexttoke].opval = o;
79072805 1004 force_next(WORD);
748a9306 1005 if (kind) {
11343788 1006 o->op_private = OPpCONST_ENTERED;
55497cff 1007 /* XXX see note in pp_entereval() for why we forgo typo
1008 warnings if the symbol must be introduced in an eval.
1009 GSAR 96-10-12 */
3280af22 1010 gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
a0d0e21e
LW
1011 kind == '$' ? SVt_PV :
1012 kind == '@' ? SVt_PVAV :
1013 kind == '%' ? SVt_PVHV :
1014 SVt_PVGV
1015 );
748a9306 1016 }
79072805
LW
1017 }
1018}
1019
1571675a
GS
1020NV
1021Perl_str_to_version(pTHX_ SV *sv)
1022{
1023 NV retval = 0.0;
1024 NV nshift = 1.0;
1025 STRLEN len;
cfd0369c 1026 const char *start = SvPV_const(sv,len);
9d4ba2ae 1027 const char * const end = start + len;
504618e9 1028 const bool utf = SvUTF8(sv) ? TRUE : FALSE;
1571675a 1029 while (start < end) {
ba210ebe 1030 STRLEN skip;
1571675a
GS
1031 UV n;
1032 if (utf)
9041c2e3 1033 n = utf8n_to_uvchr((U8*)start, len, &skip, 0);
1571675a
GS
1034 else {
1035 n = *(U8*)start;
1036 skip = 1;
1037 }
1038 retval += ((NV)n)/nshift;
1039 start += skip;
1040 nshift *= 1000;
1041 }
1042 return retval;
1043}
1044
4e553d73 1045/*
ffb4593c
NT
1046 * S_force_version
1047 * Forces the next token to be a version number.
e759cc13
RGS
1048 * If the next token appears to be an invalid version number, (e.g. "v2b"),
1049 * and if "guessing" is TRUE, then no new token is created (and the caller
1050 * must use an alternative parsing method).
ffb4593c
NT
1051 */
1052
76e3520e 1053STATIC char *
e759cc13 1054S_force_version(pTHX_ char *s, int guessing)
89bfa8cd 1055{
1056 OP *version = Nullop;
44dcb63b 1057 char *d;
89bfa8cd 1058
1059 s = skipspace(s);
1060
44dcb63b 1061 d = s;
dd629d5b 1062 if (*d == 'v')
44dcb63b 1063 d++;
44dcb63b 1064 if (isDIGIT(*d)) {
e759cc13
RGS
1065 while (isDIGIT(*d) || *d == '_' || *d == '.')
1066 d++;
9f3d182e 1067 if (*d == ';' || isSPACE(*d) || *d == '}' || !*d) {
dd629d5b 1068 SV *ver;
b73d6f50 1069 s = scan_num(s, &yylval);
89bfa8cd 1070 version = yylval.opval;
dd629d5b
GS
1071 ver = cSVOPx(version)->op_sv;
1072 if (SvPOK(ver) && !SvNIOK(ver)) {
862a34c6 1073 SvUPGRADE(ver, SVt_PVNV);
9d6ce603 1074 SvNV_set(ver, str_to_version(ver));
1571675a 1075 SvNOK_on(ver); /* hint that it is a version */
44dcb63b 1076 }
89bfa8cd 1077 }
e759cc13
RGS
1078 else if (guessing)
1079 return s;
89bfa8cd 1080 }
1081
1082 /* NOTE: The parser sees the package name and the VERSION swapped */
3280af22 1083 PL_nextval[PL_nexttoke].opval = version;
4e553d73 1084 force_next(WORD);
89bfa8cd 1085
e759cc13 1086 return s;
89bfa8cd 1087}
1088
ffb4593c
NT
1089/*
1090 * S_tokeq
1091 * Tokenize a quoted string passed in as an SV. It finds the next
1092 * chunk, up to end of string or a backslash. It may make a new
1093 * SV containing that chunk (if HINT_NEW_STRING is on). It also
1094 * turns \\ into \.
1095 */
1096
76e3520e 1097STATIC SV *
cea2e8a9 1098S_tokeq(pTHX_ SV *sv)
79072805
LW
1099{
1100 register char *s;
1101 register char *send;
1102 register char *d;
b3ac6de7
IZ
1103 STRLEN len = 0;
1104 SV *pv = sv;
79072805
LW
1105
1106 if (!SvLEN(sv))
b3ac6de7 1107 goto finish;
79072805 1108
a0d0e21e 1109 s = SvPV_force(sv, len);
21a311ee 1110 if (SvTYPE(sv) >= SVt_PVIV && SvIVX(sv) == -1)
b3ac6de7 1111 goto finish;
463ee0b2 1112 send = s + len;
79072805
LW
1113 while (s < send && *s != '\\')
1114 s++;
1115 if (s == send)
b3ac6de7 1116 goto finish;
79072805 1117 d = s;
be4731d2 1118 if ( PL_hints & HINT_NEW_STRING ) {
95a20fc0 1119 pv = sv_2mortal(newSVpvn(SvPVX_const(pv), len));
be4731d2
NIS
1120 if (SvUTF8(sv))
1121 SvUTF8_on(pv);
1122 }
79072805
LW
1123 while (s < send) {
1124 if (*s == '\\') {
a0d0e21e 1125 if (s + 1 < send && (s[1] == '\\'))
79072805
LW
1126 s++; /* all that, just for this */
1127 }
1128 *d++ = *s++;
1129 }
1130 *d = '\0';
95a20fc0 1131 SvCUR_set(sv, d - SvPVX_const(sv));
b3ac6de7 1132 finish:
3280af22 1133 if ( PL_hints & HINT_NEW_STRING )
b3ac6de7 1134 return new_constant(NULL, 0, "q", sv, pv, "q");
79072805
LW
1135 return sv;
1136}
1137
ffb4593c
NT
1138/*
1139 * Now come three functions related to double-quote context,
1140 * S_sublex_start, S_sublex_push, and S_sublex_done. They're used when
1141 * converting things like "\u\Lgnat" into ucfirst(lc("gnat")). They
1142 * interact with PL_lex_state, and create fake ( ... ) argument lists
1143 * to handle functions and concatenation.
1144 * They assume that whoever calls them will be setting up a fake
1145 * join call, because each subthing puts a ',' after it. This lets
1146 * "lower \luPpEr"
1147 * become
1148 * join($, , 'lower ', lcfirst( 'uPpEr', ) ,)
1149 *
1150 * (I'm not sure whether the spurious commas at the end of lcfirst's
1151 * arguments and join's arguments are created or not).
1152 */
1153
1154/*
1155 * S_sublex_start
1156 * Assumes that yylval.ival is the op we're creating (e.g. OP_LCFIRST).
1157 *
1158 * Pattern matching will set PL_lex_op to the pattern-matching op to
1159 * make (we return THING if yylval.ival is OP_NULL, PMFUNC otherwise).
1160 *
1161 * OP_CONST and OP_READLINE are easy--just make the new op and return.
1162 *
1163 * Everything else becomes a FUNC.
1164 *
1165 * Sets PL_lex_state to LEX_INTERPPUSH unless (ival was OP_NULL or we
1166 * had an OP_CONST or OP_READLINE). This just sets us up for a
1167 * call to S_sublex_push().
1168 */
1169
76e3520e 1170STATIC I32
cea2e8a9 1171S_sublex_start(pTHX)
79072805 1172{
f54cb97a 1173 const register I32 op_type = yylval.ival;
79072805
LW
1174
1175 if (op_type == OP_NULL) {
3280af22
NIS
1176 yylval.opval = PL_lex_op;
1177 PL_lex_op = Nullop;
79072805
LW
1178 return THING;
1179 }
1180 if (op_type == OP_CONST || op_type == OP_READLINE) {
3280af22 1181 SV *sv = tokeq(PL_lex_stuff);
b3ac6de7
IZ
1182
1183 if (SvTYPE(sv) == SVt_PVIV) {
1184 /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
1185 STRLEN len;
cfd0369c 1186 const char *p = SvPV_const(sv, len);
f54cb97a 1187 SV * const nsv = newSVpvn(p, len);
01ec43d0
GS
1188 if (SvUTF8(sv))
1189 SvUTF8_on(nsv);
b3ac6de7
IZ
1190 SvREFCNT_dec(sv);
1191 sv = nsv;
4e553d73 1192 }
b3ac6de7 1193 yylval.opval = (OP*)newSVOP(op_type, 0, sv);
3280af22 1194 PL_lex_stuff = Nullsv;
6f33ba73
RGS
1195 /* Allow <FH> // "foo" */
1196 if (op_type == OP_READLINE)
1197 PL_expect = XTERMORDORDOR;
79072805
LW
1198 return THING;
1199 }
1200
3280af22
NIS
1201 PL_sublex_info.super_state = PL_lex_state;
1202 PL_sublex_info.sub_inwhat = op_type;
1203 PL_sublex_info.sub_op = PL_lex_op;
1204 PL_lex_state = LEX_INTERPPUSH;
55497cff 1205
3280af22
NIS
1206 PL_expect = XTERM;
1207 if (PL_lex_op) {
1208 yylval.opval = PL_lex_op;
1209 PL_lex_op = Nullop;
55497cff 1210 return PMFUNC;
1211 }
1212 else
1213 return FUNC;
1214}
1215
ffb4593c
NT
1216/*
1217 * S_sublex_push
1218 * Create a new scope to save the lexing state. The scope will be
1219 * ended in S_sublex_done. Returns a '(', starting the function arguments
1220 * to the uc, lc, etc. found before.
1221 * Sets PL_lex_state to LEX_INTERPCONCAT.
1222 */
1223
76e3520e 1224STATIC I32
cea2e8a9 1225S_sublex_push(pTHX)
55497cff 1226{
27da23d5 1227 dVAR;
f46d017c 1228 ENTER;
55497cff 1229
3280af22
NIS
1230 PL_lex_state = PL_sublex_info.super_state;
1231 SAVEI32(PL_lex_dojoin);
1232 SAVEI32(PL_lex_brackets);
3280af22
NIS
1233 SAVEI32(PL_lex_casemods);
1234 SAVEI32(PL_lex_starts);
1235 SAVEI32(PL_lex_state);
7766f137 1236 SAVEVPTR(PL_lex_inpat);
3280af22 1237 SAVEI32(PL_lex_inwhat);
57843af0 1238 SAVECOPLINE(PL_curcop);
3280af22 1239 SAVEPPTR(PL_bufptr);
8452ff4b 1240 SAVEPPTR(PL_bufend);
3280af22
NIS
1241 SAVEPPTR(PL_oldbufptr);
1242 SAVEPPTR(PL_oldoldbufptr);
207e3d1a
JH
1243 SAVEPPTR(PL_last_lop);
1244 SAVEPPTR(PL_last_uni);
3280af22
NIS
1245 SAVEPPTR(PL_linestart);
1246 SAVESPTR(PL_linestr);
8edd5f42
RGS
1247 SAVEGENERICPV(PL_lex_brackstack);
1248 SAVEGENERICPV(PL_lex_casestack);
3280af22
NIS
1249
1250 PL_linestr = PL_lex_stuff;
1251 PL_lex_stuff = Nullsv;
1252
9cbb5ea2
GS
1253 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
1254 = SvPVX(PL_linestr);
3280af22 1255 PL_bufend += SvCUR(PL_linestr);
207e3d1a 1256 PL_last_lop = PL_last_uni = Nullch;
3280af22
NIS
1257 SAVEFREESV(PL_linestr);
1258
1259 PL_lex_dojoin = FALSE;
1260 PL_lex_brackets = 0;
a02a5408
JC
1261 Newx(PL_lex_brackstack, 120, char);
1262 Newx(PL_lex_casestack, 12, char);
3280af22
NIS
1263 PL_lex_casemods = 0;
1264 *PL_lex_casestack = '\0';
1265 PL_lex_starts = 0;
1266 PL_lex_state = LEX_INTERPCONCAT;
eb160463 1267 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22
NIS
1268
1269 PL_lex_inwhat = PL_sublex_info.sub_inwhat;
1270 if (PL_lex_inwhat == OP_MATCH || PL_lex_inwhat == OP_QR || PL_lex_inwhat == OP_SUBST)
1271 PL_lex_inpat = PL_sublex_info.sub_op;
79072805 1272 else
3280af22 1273 PL_lex_inpat = Nullop;
79072805 1274
55497cff 1275 return '(';
79072805
LW
1276}
1277
ffb4593c
NT
1278/*
1279 * S_sublex_done
1280 * Restores lexer state after a S_sublex_push.
1281 */
1282
76e3520e 1283STATIC I32
cea2e8a9 1284S_sublex_done(pTHX)
79072805 1285{
27da23d5 1286 dVAR;
3280af22 1287 if (!PL_lex_starts++) {
9d4ba2ae 1288 SV * const sv = newSVpvn("",0);
9aa983d2
JH
1289 if (SvUTF8(PL_linestr))
1290 SvUTF8_on(sv);
3280af22 1291 PL_expect = XOPERATOR;
9aa983d2 1292 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
79072805
LW
1293 return THING;
1294 }
1295
3280af22
NIS
1296 if (PL_lex_casemods) { /* oops, we've got some unbalanced parens */
1297 PL_lex_state = LEX_INTERPCASEMOD;
cea2e8a9 1298 return yylex();
79072805
LW
1299 }
1300
ffb4593c 1301 /* Is there a right-hand side to take care of? (s//RHS/ or tr//RHS/) */
3280af22
NIS
1302 if (PL_lex_repl && (PL_lex_inwhat == OP_SUBST || PL_lex_inwhat == OP_TRANS)) {
1303 PL_linestr = PL_lex_repl;
1304 PL_lex_inpat = 0;
1305 PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
1306 PL_bufend += SvCUR(PL_linestr);
207e3d1a 1307 PL_last_lop = PL_last_uni = Nullch;
3280af22
NIS
1308 SAVEFREESV(PL_linestr);
1309 PL_lex_dojoin = FALSE;
1310 PL_lex_brackets = 0;
3280af22
NIS
1311 PL_lex_casemods = 0;
1312 *PL_lex_casestack = '\0';
1313 PL_lex_starts = 0;
25da4f38 1314 if (SvEVALED(PL_lex_repl)) {
3280af22
NIS
1315 PL_lex_state = LEX_INTERPNORMAL;
1316 PL_lex_starts++;
e9fa98b2
HS
1317 /* we don't clear PL_lex_repl here, so that we can check later
1318 whether this is an evalled subst; that means we rely on the
1319 logic to ensure sublex_done() is called again only via the
1320 branch (in yylex()) that clears PL_lex_repl, else we'll loop */
79072805 1321 }
e9fa98b2 1322 else {
3280af22 1323 PL_lex_state = LEX_INTERPCONCAT;
e9fa98b2
HS
1324 PL_lex_repl = Nullsv;
1325 }
79072805 1326 return ',';
ffed7fef
LW
1327 }
1328 else {
f46d017c 1329 LEAVE;
3280af22
NIS
1330 PL_bufend = SvPVX(PL_linestr);
1331 PL_bufend += SvCUR(PL_linestr);
1332 PL_expect = XOPERATOR;
09bef843 1333 PL_sublex_info.sub_inwhat = 0;
79072805 1334 return ')';
ffed7fef
LW
1335 }
1336}
1337
02aa26ce
NT
1338/*
1339 scan_const
1340
1341 Extracts a pattern, double-quoted string, or transliteration. This
1342 is terrifying code.
1343
3280af22
NIS
1344 It looks at lex_inwhat and PL_lex_inpat to find out whether it's
1345 processing a pattern (PL_lex_inpat is true), a transliteration
02aa26ce
NT
1346 (lex_inwhat & OP_TRANS is true), or a double-quoted string.
1347
9b599b2a
GS
1348 Returns a pointer to the character scanned up to. Iff this is
1349 advanced from the start pointer supplied (ie if anything was
1350 successfully parsed), will leave an OP for the substring scanned
1351 in yylval. Caller must intuit reason for not parsing further
1352 by looking at the next characters herself.
1353
02aa26ce
NT
1354 In patterns:
1355 backslashes:
1356 double-quoted style: \r and \n
1357 regexp special ones: \D \s
1358 constants: \x3
1359 backrefs: \1 (deprecated in substitution replacements)
1360 case and quoting: \U \Q \E
1361 stops on @ and $, but not for $ as tail anchor
1362
1363 In transliterations:
1364 characters are VERY literal, except for - not at the start or end
1365 of the string, which indicates a range. scan_const expands the
1366 range to the full set of intermediate characters.
1367
1368 In double-quoted strings:
1369 backslashes:
1370 double-quoted style: \r and \n
1371 constants: \x3
1372 backrefs: \1 (deprecated)
1373 case and quoting: \U \Q \E
1374 stops on @ and $
1375
1376 scan_const does *not* construct ops to handle interpolated strings.
1377 It stops processing as soon as it finds an embedded $ or @ variable
1378 and leaves it to the caller to work out what's going on.
1379
da6eedaa 1380 @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @::foo.
02aa26ce
NT
1381
1382 $ in pattern could be $foo or could be tail anchor. Assumption:
1383 it's a tail anchor if $ is the last thing in the string, or if it's
1384 followed by one of ")| \n\t"
1385
1386 \1 (backreferences) are turned into $1
1387
1388 The structure of the code is
1389 while (there's a character to process) {
1390 handle transliteration ranges
1391 skip regexp comments
1392 skip # initiated comments in //x patterns
1393 check for embedded @foo
1394 check for embedded scalars
1395 if (backslash) {
1396 leave intact backslashes from leave (below)
1397 deprecate \1 in strings and sub replacements
1398 handle string-changing backslashes \l \U \Q \E, etc.
1399 switch (what was escaped) {
1400 handle - in a transliteration (becomes a literal -)
1401 handle \132 octal characters
1402 handle 0x15 hex characters
1403 handle \cV (control V)
1404 handle printf backslashes (\f, \r, \n, etc)
1405 } (end switch)
1406 } (end if backslash)
1407 } (end while character to read)
4e553d73 1408
02aa26ce
NT
1409*/
1410
76e3520e 1411STATIC char *
cea2e8a9 1412S_scan_const(pTHX_ char *start)
79072805 1413{
3280af22 1414 register char *send = PL_bufend; /* end of the constant */
02aa26ce
NT
1415 SV *sv = NEWSV(93, send - start); /* sv for the constant */
1416 register char *s = start; /* start of the constant */
1417 register char *d = SvPVX(sv); /* destination for copies */
1418 bool dorange = FALSE; /* are we in a translit range? */
c2e66d9e 1419 bool didrange = FALSE; /* did we just finish a range? */
2b9d42f0
NIS
1420 I32 has_utf8 = FALSE; /* Output constant is UTF8 */
1421 I32 this_utf8 = UTF; /* The source string is assumed to be UTF8 */
012bcf8d 1422 UV uv;
4c3a8340
TS
1423#ifdef EBCDIC
1424 UV literal_endpoint = 0;
1425#endif
012bcf8d 1426
dff6d3cd 1427 const char *leaveit = /* set of acceptably-backslashed characters */
3280af22 1428 PL_lex_inpat
b6d5fef8 1429 ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxz0123456789[{]} \t\n\r\f\v#"
9b599b2a 1430 : "";
79072805 1431
2b9d42f0
NIS
1432 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
1433 /* If we are doing a trans and we know we want UTF8 set expectation */
1434 has_utf8 = PL_sublex_info.sub_op->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF);
1435 this_utf8 = PL_sublex_info.sub_op->op_private & (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1436 }
1437
1438
79072805 1439 while (s < send || dorange) {
02aa26ce 1440 /* get transliterations out of the way (they're most literal) */
3280af22 1441 if (PL_lex_inwhat == OP_TRANS) {
02aa26ce 1442 /* expand a range A-Z to the full set of characters. AIE! */
79072805 1443 if (dorange) {
1ba5c669
JH
1444 I32 i; /* current expanded character */
1445 I32 min; /* first character in range */
1446 I32 max; /* last character in range */
02aa26ce 1447
2b9d42f0 1448 if (has_utf8) {
9d4ba2ae 1449 char * const c = (char*)utf8_hop((U8*)d, -1);
8973db79
JH
1450 char *e = d++;
1451 while (e-- > c)
1452 *(e + 1) = *e;
25716404 1453 *c = (char)UTF_TO_NATIVE(0xff);
8973db79
JH
1454 /* mark the range as done, and continue */
1455 dorange = FALSE;
1456 didrange = TRUE;
1457 continue;
1458 }
2b9d42f0 1459
95a20fc0 1460 i = d - SvPVX_const(sv); /* remember current offset */
9cbb5ea2
GS
1461 SvGROW(sv, SvLEN(sv) + 256); /* never more than 256 chars in a range */
1462 d = SvPVX(sv) + i; /* refresh d after realloc */
02aa26ce
NT
1463 d -= 2; /* eat the first char and the - */
1464
8ada0baa
JH
1465 min = (U8)*d; /* first char in range */
1466 max = (U8)d[1]; /* last char in range */
1467
c2e66d9e 1468 if (min > max) {
01ec43d0 1469 Perl_croak(aTHX_
d1573ac7 1470 "Invalid range \"%c-%c\" in transliteration operator",
1ba5c669 1471 (char)min, (char)max);
c2e66d9e
GS
1472 }
1473
c7f1f016 1474#ifdef EBCDIC
4c3a8340
TS
1475 if (literal_endpoint == 2 &&
1476 ((isLOWER(min) && isLOWER(max)) ||
1477 (isUPPER(min) && isUPPER(max)))) {
8ada0baa
JH
1478 if (isLOWER(min)) {
1479 for (i = min; i <= max; i++)
1480 if (isLOWER(i))
db42d148 1481 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1482 } else {
1483 for (i = min; i <= max; i++)
1484 if (isUPPER(i))
db42d148 1485 *d++ = NATIVE_TO_NEED(has_utf8,i);
8ada0baa
JH
1486 }
1487 }
1488 else
1489#endif
1490 for (i = min; i <= max; i++)
eb160463 1491 *d++ = (char)i;
02aa26ce
NT
1492
1493 /* mark the range as done, and continue */
79072805 1494 dorange = FALSE;
01ec43d0 1495 didrange = TRUE;
4c3a8340
TS
1496#ifdef EBCDIC
1497 literal_endpoint = 0;
1498#endif
79072805 1499 continue;
4e553d73 1500 }
02aa26ce
NT
1501
1502 /* range begins (ignore - as first or last char) */
79072805 1503 else if (*s == '-' && s+1 < send && s != start) {
4e553d73 1504 if (didrange) {
1fafa243 1505 Perl_croak(aTHX_ "Ambiguous range in transliteration operator");
01ec43d0 1506 }
2b9d42f0 1507 if (has_utf8) {
25716404 1508 *d++ = (char)UTF_TO_NATIVE(0xff); /* use illegal utf8 byte--see pmtrans */
a0ed51b3
LW
1509 s++;
1510 continue;
1511 }
79072805
LW
1512 dorange = TRUE;
1513 s++;
01ec43d0
GS
1514 }
1515 else {
1516 didrange = FALSE;
4c3a8340
TS
1517#ifdef EBCDIC
1518 literal_endpoint = 0;
1519#endif
01ec43d0 1520 }
79072805 1521 }
02aa26ce
NT
1522
1523 /* if we get here, we're not doing a transliteration */
1524
0f5d15d6
IZ
1525 /* skip for regexp comments /(?#comment)/ and code /(?{code})/,
1526 except for the last char, which will be done separately. */
3280af22 1527 else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
cc6b7395 1528 if (s[2] == '#') {
e994fd66 1529 while (s+1 < send && *s != ')')
db42d148 1530 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
155aba94
GS
1531 }
1532 else if (s[2] == '{' /* This should match regcomp.c */
1533 || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
1534 {
cc6b7395 1535 I32 count = 1;
0f5d15d6 1536 char *regparse = s + (s[2] == '{' ? 3 : 4);
cc6b7395
IZ
1537 char c;
1538
d9f97599
GS
1539 while (count && (c = *regparse)) {
1540 if (c == '\\' && regparse[1])
1541 regparse++;
4e553d73 1542 else if (c == '{')
cc6b7395 1543 count++;
4e553d73 1544 else if (c == '}')
cc6b7395 1545 count--;
d9f97599 1546 regparse++;
cc6b7395 1547 }
e994fd66 1548 if (*regparse != ')')
5bdf89e7 1549 regparse--; /* Leave one char for continuation. */
0f5d15d6 1550 while (s < regparse)
db42d148 1551 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
cc6b7395 1552 }
748a9306 1553 }
02aa26ce
NT
1554
1555 /* likewise skip #-initiated comments in //x patterns */
3280af22
NIS
1556 else if (*s == '#' && PL_lex_inpat &&
1557 ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) {
748a9306 1558 while (s+1 < send && *s != '\n')
db42d148 1559 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
748a9306 1560 }
02aa26ce 1561
5d1d4326 1562 /* check for embedded arrays
da6eedaa 1563 (@foo, @::foo, @'foo, @{foo}, @$foo, @+, @-)
5d1d4326 1564 */
7e2040f0 1565 else if (*s == '@' && s[1]
5d1d4326 1566 && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$+-", s[1])))
79072805 1567 break;
02aa26ce
NT
1568
1569 /* check for embedded scalars. only stop if we're sure it's a
1570 variable.
1571 */
79072805 1572 else if (*s == '$') {
3280af22 1573 if (!PL_lex_inpat) /* not a regexp, so $ must be var */
79072805 1574 break;
6002328a 1575 if (s + 1 < send && !strchr("()| \r\n\t", s[1]))
79072805
LW
1576 break; /* in regexp, $ might be tail anchor */
1577 }
02aa26ce 1578
2b9d42f0
NIS
1579 /* End of else if chain - OP_TRANS rejoin rest */
1580
02aa26ce 1581 /* backslashes */
79072805
LW
1582 if (*s == '\\' && s+1 < send) {
1583 s++;
02aa26ce
NT
1584
1585 /* some backslashes we leave behind */
c9f97d15 1586 if (*leaveit && *s && strchr(leaveit, *s)) {
db42d148
NIS
1587 *d++ = NATIVE_TO_NEED(has_utf8,'\\');
1588 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
79072805
LW
1589 continue;
1590 }
02aa26ce
NT
1591
1592 /* deprecate \1 in strings and substitution replacements */
3280af22 1593 if (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat &&
a0d0e21e 1594 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
79072805 1595 {
599cee73 1596 if (ckWARN(WARN_SYNTAX))
9014280d 1597 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "\\%c better written as $%c", *s, *s);
79072805
LW
1598 *--s = '$';
1599 break;
1600 }
02aa26ce
NT
1601
1602 /* string-change backslash escapes */
3280af22 1603 if (PL_lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
79072805
LW
1604 --s;
1605 break;
1606 }
02aa26ce
NT
1607
1608 /* if we get here, it's either a quoted -, or a digit */
79072805 1609 switch (*s) {
02aa26ce
NT
1610
1611 /* quoted - in transliterations */
79072805 1612 case '-':
3280af22 1613 if (PL_lex_inwhat == OP_TRANS) {
79072805
LW
1614 *d++ = *s++;
1615 continue;
1616 }
1617 /* FALL THROUGH */
1618 default:
11b8faa4 1619 {
041457d9
DM
1620 if (isALNUM(*s) &&
1621 *s != '_' &&
1622 ckWARN(WARN_MISC))
9014280d 1623 Perl_warner(aTHX_ packWARN(WARN_MISC),
11b8faa4
JH
1624 "Unrecognized escape \\%c passed through",
1625 *s);
1626 /* default action is to copy the quoted character */
f9a63242 1627 goto default_action;
11b8faa4 1628 }
02aa26ce
NT
1629
1630 /* \132 indicates an octal constant */
79072805
LW
1631 case '0': case '1': case '2': case '3':
1632 case '4': case '5': case '6': case '7':
ba210ebe 1633 {
53305cf1
NC
1634 I32 flags = 0;
1635 STRLEN len = 3;
1636 uv = grok_oct(s, &len, &flags, NULL);
ba210ebe
JH
1637 s += len;
1638 }
012bcf8d 1639 goto NUM_ESCAPE_INSERT;
02aa26ce
NT
1640
1641 /* \x24 indicates a hex constant */
79072805 1642 case 'x':
a0ed51b3
LW
1643 ++s;
1644 if (*s == '{') {
9d4ba2ae 1645 char* const e = strchr(s, '}');
a4c04bdc
NC
1646 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1647 PERL_SCAN_DISALLOW_PREFIX;
53305cf1 1648 STRLEN len;
355860ce 1649
53305cf1 1650 ++s;
adaeee49 1651 if (!e) {
a0ed51b3 1652 yyerror("Missing right brace on \\x{}");
355860ce 1653 continue;
ba210ebe 1654 }
53305cf1
NC
1655 len = e - s;
1656 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe 1657 s = e + 1;
a0ed51b3
LW
1658 }
1659 else {
ba210ebe 1660 {
53305cf1 1661 STRLEN len = 2;
a4c04bdc 1662 I32 flags = PERL_SCAN_DISALLOW_PREFIX;
53305cf1 1663 uv = grok_hex(s, &len, &flags, NULL);
ba210ebe
JH
1664 s += len;
1665 }
012bcf8d
GS
1666 }
1667
1668 NUM_ESCAPE_INSERT:
1669 /* Insert oct or hex escaped character.
301d3d20 1670 * There will always enough room in sv since such
db42d148 1671 * escapes will be longer than any UTF-8 sequence
301d3d20 1672 * they can end up as. */
ba7cea30 1673
c7f1f016
NIS
1674 /* We need to map to chars to ASCII before doing the tests
1675 to cover EBCDIC
1676 */
c4d5f83a 1677 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(uv))) {
9aa983d2 1678 if (!has_utf8 && uv > 255) {
301d3d20
JH
1679 /* Might need to recode whatever we have
1680 * accumulated so far if it contains any
1681 * hibit chars.
1682 *
1683 * (Can't we keep track of that and avoid
1684 * this rescan? --jhi)
012bcf8d 1685 */
c7f1f016 1686 int hicount = 0;
63cd0674
NIS
1687 U8 *c;
1688 for (c = (U8 *) SvPVX(sv); c < (U8 *)d; c++) {
c4d5f83a 1689 if (!NATIVE_IS_INVARIANT(*c)) {
012bcf8d 1690 hicount++;
db42d148 1691 }
012bcf8d 1692 }
63cd0674 1693 if (hicount) {
9d4ba2ae 1694 const STRLEN offset = d - SvPVX_const(sv);
db42d148
NIS
1695 U8 *src, *dst;
1696 d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
1697 src = (U8 *)d - 1;
1698 dst = src+hicount;
1699 d += hicount;
cfd0369c 1700 while (src >= (const U8 *)SvPVX_const(sv)) {
c4d5f83a 1701 if (!NATIVE_IS_INVARIANT(*src)) {
9d4ba2ae 1702 const U8 ch = NATIVE_TO_ASCII(*src);
eb160463
GS
1703 *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
1704 *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
012bcf8d
GS
1705 }
1706 else {
63cd0674 1707 *dst-- = *src;
012bcf8d 1708 }
c7f1f016 1709 src--;
012bcf8d
GS
1710 }
1711 }
1712 }
1713
9aa983d2 1714 if (has_utf8 || uv > 255) {
9041c2e3 1715 d = (char*)uvchr_to_utf8((U8*)d, uv);
4e553d73 1716 has_utf8 = TRUE;
f9a63242
JH
1717 if (PL_lex_inwhat == OP_TRANS &&
1718 PL_sublex_info.sub_op) {
1719 PL_sublex_info.sub_op->op_private |=
1720 (PL_lex_repl ? OPpTRANS_FROM_UTF
1721 : OPpTRANS_TO_UTF);
f9a63242 1722 }
012bcf8d 1723 }
a0ed51b3 1724 else {
012bcf8d 1725 *d++ = (char)uv;
a0ed51b3 1726 }
012bcf8d
GS
1727 }
1728 else {
c4d5f83a 1729 *d++ = (char) uv;
a0ed51b3 1730 }
79072805 1731 continue;
02aa26ce 1732
b239daa5 1733 /* \N{LATIN SMALL LETTER A} is a named character */
4a2d328f 1734 case 'N':
55eda711 1735 ++s;
423cee85
JH
1736 if (*s == '{') {
1737 char* e = strchr(s, '}');
155aba94 1738 SV *res;
423cee85 1739 STRLEN len;
cfd0369c 1740 const char *str;
4e553d73 1741
423cee85 1742 if (!e) {
5777a3f7 1743 yyerror("Missing right brace on \\N{}");
423cee85
JH
1744 e = s - 1;
1745 goto cont_scan;
1746 }
dbc0d4f2
JH
1747 if (e > s + 2 && s[1] == 'U' && s[2] == '+') {
1748 /* \N{U+...} */
1749 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
1750 PERL_SCAN_DISALLOW_PREFIX;
1751 s += 3;
1752 len = e - s;
1753 uv = grok_hex(s, &len, &flags, NULL);
1754 s = e + 1;
1755 goto NUM_ESCAPE_INSERT;
1756 }
55eda711
JH
1757 res = newSVpvn(s + 1, e - s - 1);
1758 res = new_constant( Nullch, 0, "charnames",
1759 res, Nullsv, "\\N{...}" );
f9a63242
JH
1760 if (has_utf8)
1761 sv_utf8_upgrade(res);
cfd0369c 1762 str = SvPV_const(res,len);
1c47067b
JH
1763#ifdef EBCDIC_NEVER_MIND
1764 /* charnames uses pack U and that has been
1765 * recently changed to do the below uni->native
1766 * mapping, so this would be redundant (and wrong,
1767 * the code point would be doubly converted).
1768 * But leave this in just in case the pack U change
1769 * gets revoked, but the semantics is still
1770 * desireable for charnames. --jhi */
cddc7ef4 1771 {
cfd0369c 1772 UV uv = utf8_to_uvchr((const U8*)str, 0);
cddc7ef4
JH
1773
1774 if (uv < 0x100) {
89ebb4a3 1775 U8 tmpbuf[UTF8_MAXBYTES+1], *d;
cddc7ef4
JH
1776
1777 d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
1778 sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
cfd0369c 1779 str = SvPV_const(res, len);
cddc7ef4
JH
1780 }
1781 }
1782#endif
89491803 1783 if (!has_utf8 && SvUTF8(res)) {
9d4ba2ae 1784 const char * const ostart = SvPVX_const(sv);
f08d6ad9
GS
1785 SvCUR_set(sv, d - ostart);
1786 SvPOK_on(sv);
e4f3eed8 1787 *d = '\0';
f08d6ad9 1788 sv_utf8_upgrade(sv);
d2f449dd 1789 /* this just broke our allocation above... */
eb160463 1790 SvGROW(sv, (STRLEN)(send - start));
f08d6ad9 1791 d = SvPVX(sv) + SvCUR(sv);
89491803 1792 has_utf8 = TRUE;
f08d6ad9 1793 }
eb160463 1794 if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
9d4ba2ae 1795 const char * const odest = SvPVX_const(sv);
423cee85 1796
8973db79 1797 SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
423cee85
JH
1798 d = SvPVX(sv) + (d - odest);
1799 }
1800 Copy(str, d, len, char);
1801 d += len;
1802 SvREFCNT_dec(res);
1803 cont_scan:
1804 s = e + 1;
1805 }
1806 else
5777a3f7 1807 yyerror("Missing braces on \\N{}");
423cee85
JH
1808 continue;
1809
02aa26ce 1810 /* \c is a control character */
79072805
LW
1811 case 'c':
1812 s++;
961ce445 1813 if (s < send) {
ba210ebe 1814 U8 c = *s++;
c7f1f016
NIS
1815#ifdef EBCDIC
1816 if (isLOWER(c))
1817 c = toUPPER(c);
1818#endif
db42d148 1819 *d++ = NATIVE_TO_NEED(has_utf8,toCTRL(c));
ba210ebe 1820 }
961ce445
RGS
1821 else {
1822 yyerror("Missing control char name in \\c");
1823 }
79072805 1824 continue;
02aa26ce
NT
1825
1826 /* printf-style backslashes, formfeeds, newlines, etc */
79072805 1827 case 'b':
db42d148 1828 *d++ = NATIVE_TO_NEED(has_utf8,'\b');
79072805
LW
1829 break;
1830 case 'n':
db42d148 1831 *d++ = NATIVE_TO_NEED(has_utf8,'\n');
79072805
LW
1832 break;
1833 case 'r':
db42d148 1834 *d++ = NATIVE_TO_NEED(has_utf8,'\r');
79072805
LW
1835 break;
1836 case 'f':
db42d148 1837 *d++ = NATIVE_TO_NEED(has_utf8,'\f');
79072805
LW
1838 break;
1839 case 't':
db42d148 1840 *d++ = NATIVE_TO_NEED(has_utf8,'\t');
79072805 1841 break;
34a3fe2a 1842 case 'e':
db42d148 1843 *d++ = ASCII_TO_NEED(has_utf8,'\033');
34a3fe2a
PP
1844 break;
1845 case 'a':
db42d148 1846 *d++ = ASCII_TO_NEED(has_utf8,'\007');
79072805 1847 break;
02aa26ce
NT
1848 } /* end switch */
1849
79072805
LW
1850 s++;
1851 continue;
02aa26ce 1852 } /* end if (backslash) */
4c3a8340
TS
1853#ifdef EBCDIC
1854 else
1855 literal_endpoint++;
1856#endif
02aa26ce 1857
f9a63242 1858 default_action:
2b9d42f0
NIS
1859 /* If we started with encoded form, or already know we want it
1860 and then encode the next character */
1861 if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
1862 STRLEN len = 1;
9d4ba2ae
AL
1863 const UV uv = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
1864 const STRLEN need = UNISKIP(NATIVE_TO_UNI(uv));
2b9d42f0
NIS
1865 s += len;
1866 if (need > len) {
1867 /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
9d4ba2ae 1868 const STRLEN off = d - SvPVX_const(sv);
2b9d42f0
NIS
1869 d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
1870 }
1871 d = (char*)uvchr_to_utf8((U8*)d, uv);
1872 has_utf8 = TRUE;
1873 }
1874 else {
1875 *d++ = NATIVE_TO_NEED(has_utf8,*s++);
1876 }
02aa26ce
NT
1877 } /* while loop to process each character */
1878
1879 /* terminate the string and set up the sv */
79072805 1880 *d = '\0';
95a20fc0 1881 SvCUR_set(sv, d - SvPVX_const(sv));
2b9d42f0 1882 if (SvCUR(sv) >= SvLEN(sv))
d0063567 1883 Perl_croak(aTHX_ "panic: constant overflowed allocated space");
2b9d42f0 1884
79072805 1885 SvPOK_on(sv);
9f4817db 1886 if (PL_encoding && !has_utf8) {
d0063567
DK
1887 sv_recode_to_utf8(sv, PL_encoding);
1888 if (SvUTF8(sv))
1889 has_utf8 = TRUE;
9f4817db 1890 }
2b9d42f0 1891 if (has_utf8) {
7e2040f0 1892 SvUTF8_on(sv);
2b9d42f0 1893 if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) {
d0063567 1894 PL_sublex_info.sub_op->op_private |=
2b9d42f0
NIS
1895 (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF);
1896 }
1897 }
79072805 1898
02aa26ce 1899 /* shrink the sv if we allocated more than we used */
79072805 1900 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1da4ca5f 1901 SvPV_shrink_to_cur(sv);
79072805 1902 }
02aa26ce 1903
9b599b2a 1904 /* return the substring (via yylval) only if we parsed anything */
3280af22
NIS
1905 if (s > PL_bufptr) {
1906 if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
4e553d73 1907 sv = new_constant(start, s - start, (PL_lex_inpat ? "qr" : "q"),
b3ac6de7 1908 sv, Nullsv,
4e553d73 1909 ( PL_lex_inwhat == OP_TRANS
b3ac6de7 1910 ? "tr"
3280af22 1911 : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
b3ac6de7
IZ
1912 ? "s"
1913 : "qq")));
79072805 1914 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
b3ac6de7 1915 } else
8990e307 1916 SvREFCNT_dec(sv);
79072805
LW
1917 return s;
1918}
1919
ffb4593c
NT
1920/* S_intuit_more
1921 * Returns TRUE if there's more to the expression (e.g., a subscript),
1922 * FALSE otherwise.
ffb4593c
NT
1923 *
1924 * It deals with "$foo[3]" and /$foo[3]/ and /$foo[0123456789$]+/
1925 *
1926 * ->[ and ->{ return TRUE
1927 * { and [ outside a pattern are always subscripts, so return TRUE
1928 * if we're outside a pattern and it's not { or [, then return FALSE
1929 * if we're in a pattern and the first char is a {
1930 * {4,5} (any digits around the comma) returns FALSE
1931 * if we're in a pattern and the first char is a [
1932 * [] returns FALSE
1933 * [SOMETHING] has a funky algorithm to decide whether it's a
1934 * character class or not. It has to deal with things like
1935 * /$foo[-3]/ and /$foo[$bar]/ as well as /$foo[$\d]+/
1936 * anything else returns TRUE
1937 */
1938
9cbb5ea2
GS
1939/* This is the one truly awful dwimmer necessary to conflate C and sed. */
1940
76e3520e 1941STATIC int
cea2e8a9 1942S_intuit_more(pTHX_ register char *s)
79072805 1943{
3280af22 1944 if (PL_lex_brackets)
79072805
LW
1945 return TRUE;
1946 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1947 return TRUE;
1948 if (*s != '{' && *s != '[')
1949 return FALSE;
3280af22 1950 if (!PL_lex_inpat)
79072805
LW
1951 return TRUE;
1952
1953 /* In a pattern, so maybe we have {n,m}. */
1954 if (*s == '{') {
1955 s++;
1956 if (!isDIGIT(*s))
1957 return TRUE;
1958 while (isDIGIT(*s))
1959 s++;
1960 if (*s == ',')
1961 s++;
1962 while (isDIGIT(*s))
1963 s++;
1964 if (*s == '}')
1965 return FALSE;
1966 return TRUE;
1967
1968 }
1969
1970 /* On the other hand, maybe we have a character class */
1971
1972 s++;
1973 if (*s == ']' || *s == '^')
1974 return FALSE;
1975 else {
ffb4593c 1976 /* this is terrifying, and it works */
79072805
LW
1977 int weight = 2; /* let's weigh the evidence */
1978 char seen[256];
f27ffc4a 1979 unsigned char un_char = 255, last_un_char;
9d4ba2ae 1980 const char * const send = strchr(s,']');
3280af22 1981 char tmpbuf[sizeof PL_tokenbuf * 4];
79072805
LW
1982
1983 if (!send) /* has to be an expression */
1984 return TRUE;
1985
1986 Zero(seen,256,char);
1987 if (*s == '$')
1988 weight -= 3;
1989 else if (isDIGIT(*s)) {
1990 if (s[1] != ']') {
1991 if (isDIGIT(s[1]) && s[2] == ']')
1992 weight -= 10;
1993 }
1994 else
1995 weight -= 100;
1996 }
1997 for (; s < send; s++) {
1998 last_un_char = un_char;
1999 un_char = (unsigned char)*s;
2000 switch (*s) {
2001 case '@':
2002 case '&':
2003 case '$':
2004 weight -= seen[un_char] * 10;
7e2040f0 2005 if (isALNUM_lazy_if(s+1,UTF)) {
8903cb82 2006 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
a0d0e21e 2007 if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
79072805
LW
2008 weight -= 100;
2009 else
2010 weight -= 10;
2011 }
2012 else if (*s == '$' && s[1] &&
93a17b20
LW
2013 strchr("[#!%*<>()-=",s[1])) {
2014 if (/*{*/ strchr("])} =",s[2]))
79072805
LW
2015 weight -= 10;
2016 else
2017 weight -= 1;
2018 }
2019 break;
2020 case '\\':
2021 un_char = 254;
2022 if (s[1]) {
93a17b20 2023 if (strchr("wds]",s[1]))
79072805
LW
2024 weight += 100;
2025 else if (seen['\''] || seen['"'])
2026 weight += 1;
93a17b20 2027 else if (strchr("rnftbxcav",s[1]))
79072805
LW
2028 weight += 40;
2029 else if (isDIGIT(s[1])) {
2030 weight += 40;
2031 while (s[1] && isDIGIT(s[1]))
2032 s++;
2033 }
2034 }
2035 else
2036 weight += 100;
2037 break;
2038 case '-':
2039 if (s[1] == '\\')
2040 weight += 50;
93a17b20 2041 if (strchr("aA01! ",last_un_char))
79072805 2042 weight += 30;
93a17b20 2043 if (strchr("zZ79~",s[1]))
79072805 2044 weight += 30;
f27ffc4a
GS
2045 if (last_un_char == 255 && (isDIGIT(s[1]) || s[1] == '$'))
2046 weight -= 5; /* cope with negative subscript */
79072805
LW
2047 break;
2048 default:
3792a11b
NC
2049 if (!isALNUM(last_un_char)
2050 && !(last_un_char == '$' || last_un_char == '@'
2051 || last_un_char == '&')
2052 && isALPHA(*s) && s[1] && isALPHA(s[1])) {
79072805
LW
2053 char *d = tmpbuf;
2054 while (isALPHA(*s))
2055 *d++ = *s++;
2056 *d = '\0';
2057 if (keyword(tmpbuf, d - tmpbuf))
2058 weight -= 150;
2059 }
2060 if (un_char == last_un_char + 1)
2061 weight += 5;
2062 weight -= seen[un_char];
2063 break;
2064 }
2065 seen[un_char]++;
2066 }
2067 if (weight >= 0) /* probably a character class */
2068 return FALSE;
2069 }
2070
2071 return TRUE;
2072}
ffed7fef 2073
ffb4593c
NT
2074/*
2075 * S_intuit_method
2076 *
2077 * Does all the checking to disambiguate
2078 * foo bar
2079 * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise
2080 * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args).
2081 *
2082 * First argument is the stuff after the first token, e.g. "bar".
2083 *
2084 * Not a method if bar is a filehandle.
2085 * Not a method if foo is a subroutine prototyped to take a filehandle.
2086 * Not a method if it's really "Foo $bar"
2087 * Method if it's "foo $bar"
2088 * Not a method if it's really "print foo $bar"
2089 * Method if it's really "foo package::" (interpreted as package->foo)
8f8cf39c 2090 * Not a method if bar is known to be a subroutine ("sub bar; foo bar")
3cb0bbe5 2091 * Not a method if bar is a filehandle or package, but is quoted with
ffb4593c
NT
2092 * =>
2093 */
2094
76e3520e 2095STATIC int
cea2e8a9 2096S_intuit_method(pTHX_ char *start, GV *gv)
a0d0e21e
LW
2097{
2098 char *s = start + (*start == '$');
3280af22 2099 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e
LW
2100 STRLEN len;
2101 GV* indirgv;
2102
2103 if (gv) {
b6c543e3 2104 CV *cv;
a0d0e21e
LW
2105 if (GvIO(gv))
2106 return 0;
b6c543e3 2107 if ((cv = GvCVu(gv))) {
95a20fc0 2108 const char *proto = SvPVX_const(cv);
b6c543e3
IZ
2109 if (proto) {
2110 if (*proto == ';')
2111 proto++;
2112 if (*proto == '*')
2113 return 0;
2114 }
2115 } else
a0d0e21e
LW
2116 gv = 0;
2117 }
8903cb82 2118 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
ffb4593c
NT
2119 /* start is the beginning of the possible filehandle/object,
2120 * and s is the end of it
2121 * tmpbuf is a copy of it
2122 */
2123
a0d0e21e 2124 if (*start == '$') {
3280af22 2125 if (gv || PL_last_lop_op == OP_PRINT || isUPPER(*PL_tokenbuf))
a0d0e21e
LW
2126 return 0;
2127 s = skipspace(s);
3280af22
NIS
2128 PL_bufptr = start;
2129 PL_expect = XREF;
a0d0e21e
LW
2130 return *s == '(' ? FUNCMETH : METHOD;
2131 }
2132 if (!keyword(tmpbuf, len)) {
c3e0f903
GS
2133 if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') {
2134 len -= 2;
2135 tmpbuf[len] = '\0';
2136 goto bare_package;
2137 }
2138 indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
8ebc5c01 2139 if (indirgv && GvCVu(indirgv))
a0d0e21e
LW
2140 return 0;
2141 /* filehandle or package name makes it a method */
89bfa8cd 2142 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
a0d0e21e 2143 s = skipspace(s);
3280af22 2144 if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
55497cff 2145 return 0; /* no assumptions -- "=>" quotes bearword */
c3e0f903 2146 bare_package:
3280af22 2147 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0,
79cb57f6 2148 newSVpvn(tmpbuf,len));
3280af22
NIS
2149 PL_nextval[PL_nexttoke].opval->op_private = OPpCONST_BARE;
2150 PL_expect = XTERM;
a0d0e21e 2151 force_next(WORD);
3280af22 2152 PL_bufptr = s;
a0d0e21e
LW
2153 return *s == '(' ? FUNCMETH : METHOD;
2154 }
2155 }
2156 return 0;
2157}
2158
ffb4593c
NT
2159/*
2160 * S_incl_perldb
2161 * Return a string of Perl code to load the debugger. If PERL5DB
2162 * is set, it will return the contents of that, otherwise a
2163 * compile-time require of perl5db.pl.
2164 */
2165
bfed75c6 2166STATIC const char*
cea2e8a9 2167S_incl_perldb(pTHX)
a0d0e21e 2168{
3280af22 2169 if (PL_perldb) {
9d4ba2ae 2170 const char * const pdb = PerlEnv_getenv("PERL5DB");
a0d0e21e
LW
2171
2172 if (pdb)
2173 return pdb;
93189314 2174 SETERRNO(0,SS_NORMAL);
a0d0e21e
LW
2175 return "BEGIN { require 'perl5db.pl' }";
2176 }
2177 return "";
2178}
2179
2180
16d20bd9 2181/* Encoded script support. filter_add() effectively inserts a
4e553d73 2182 * 'pre-processing' function into the current source input stream.
16d20bd9
AD
2183 * Note that the filter function only applies to the current source file
2184 * (e.g., it will not affect files 'require'd or 'use'd by this one).
2185 *
2186 * The datasv parameter (which may be NULL) can be used to pass
2187 * private data to this instance of the filter. The filter function
2188 * can recover the SV using the FILTER_DATA macro and use it to
2189 * store private buffers and state information.
2190 *
2191 * The supplied datasv parameter is upgraded to a PVIO type
4755096e 2192 * and the IoDIRP/IoANY field is used to store the function pointer,
e0c19803 2193 * and IOf_FAKE_DIRP is enabled on datasv to mark this as such.
16d20bd9
AD
2194 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
2195 * private use must be set using malloc'd pointers.
2196 */
16d20bd9
AD
2197
2198SV *
864dbfa3 2199Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
16d20bd9 2200{
f4c556ac
GS
2201 if (!funcp)
2202 return Nullsv;
2203
3280af22
NIS
2204 if (!PL_rsfp_filters)
2205 PL_rsfp_filters = newAV();
16d20bd9 2206 if (!datasv)
8c52afec 2207 datasv = NEWSV(255,0);
862a34c6 2208 SvUPGRADE(datasv, SVt_PVIO);
8141890a 2209 IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
e0c19803 2210 IoFLAGS(datasv) |= IOf_FAKE_DIRP;
f4c556ac 2211 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
8141890a 2212 IoANY(datasv), SvPV_nolen(datasv)));
3280af22
NIS
2213 av_unshift(PL_rsfp_filters, 1);
2214 av_store(PL_rsfp_filters, 0, datasv) ;
16d20bd9
AD
2215 return(datasv);
2216}
4e553d73 2217
16d20bd9
AD
2218
2219/* Delete most recently added instance of this filter function. */
a0d0e21e 2220void
864dbfa3 2221Perl_filter_del(pTHX_ filter_t funcp)
16d20bd9 2222{
e0c19803 2223 SV *datasv;
24801a4b 2224
33073adb 2225#ifdef DEBUGGING
8141890a 2226 DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", FPTR2DPTR(XPVIO *, funcp)));
33073adb 2227#endif
3280af22 2228 if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
16d20bd9
AD
2229 return;
2230 /* if filter is on top of stack (usual case) just pop it off */
e0c19803 2231 datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
8141890a 2232 if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
e0c19803 2233 IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
4755096e 2234 IoANY(datasv) = (void *)NULL;
3280af22 2235 sv_free(av_pop(PL_rsfp_filters));
e50aee73 2236
16d20bd9
AD
2237 return;
2238 }
2239 /* we need to search for the correct entry and clear it */
cea2e8a9 2240 Perl_die(aTHX_ "filter_del can only delete in reverse order (currently)");
16d20bd9
AD
2241}
2242
2243
1de9afcd
RGS
2244/* Invoke the idxth filter function for the current rsfp. */
2245/* maxlen 0 = read one text line */
16d20bd9 2246I32
864dbfa3 2247Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
a0d0e21e 2248{
16d20bd9
AD
2249 filter_t funcp;
2250 SV *datasv = NULL;
e50aee73 2251
3280af22 2252 if (!PL_rsfp_filters)
16d20bd9 2253 return -1;
1de9afcd 2254 if (idx > AvFILLp(PL_rsfp_filters)) { /* Any more filters? */
16d20bd9
AD
2255 /* Provide a default input filter to make life easy. */
2256 /* Note that we append to the line. This is handy. */
f4c556ac
GS
2257 DEBUG_P(PerlIO_printf(Perl_debug_log,
2258 "filter_read %d: from rsfp\n", idx));
4e553d73 2259 if (maxlen) {
16d20bd9
AD
2260 /* Want a block */
2261 int len ;
f54cb97a 2262 const int old_len = SvCUR(buf_sv);
16d20bd9
AD
2263
2264 /* ensure buf_sv is large enough */
eb160463 2265 SvGROW(buf_sv, (STRLEN)(old_len + maxlen)) ;
3280af22
NIS
2266 if ((len = PerlIO_read(PL_rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
2267 if (PerlIO_error(PL_rsfp))
37120919
AD
2268 return -1; /* error */
2269 else
2270 return 0 ; /* end of file */
2271 }
16d20bd9
AD
2272 SvCUR_set(buf_sv, old_len + len) ;
2273 } else {
2274 /* Want a line */
3280af22
NIS
2275 if (sv_gets(buf_sv, PL_rsfp, SvCUR(buf_sv)) == NULL) {
2276 if (PerlIO_error(PL_rsfp))
37120919
AD
2277 return -1; /* error */
2278 else
2279 return 0 ; /* end of file */
2280 }
16d20bd9
AD
2281 }
2282 return SvCUR(buf_sv);
2283 }
2284 /* Skip this filter slot if filter has been deleted */
1de9afcd 2285 if ( (datasv = FILTER_DATA(idx)) == &PL_sv_undef) {
f4c556ac
GS
2286 DEBUG_P(PerlIO_printf(Perl_debug_log,
2287 "filter_read %d: skipped (filter deleted)\n",
2288 idx));
16d20bd9
AD
2289 return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
2290 }
2291 /* Get function pointer hidden within datasv */
8141890a 2292 funcp = DPTR2FPTR(filter_t, IoANY(datasv));
f4c556ac
GS
2293 DEBUG_P(PerlIO_printf(Perl_debug_log,
2294 "filter_read %d: via function %p (%s)\n",
cfd0369c 2295 idx, datasv, SvPV_nolen_const(datasv)));
16d20bd9
AD
2296 /* Call function. The function is expected to */
2297 /* call "FILTER_READ(idx+1, buf_sv)" first. */
37120919 2298 /* Return: <0:error, =0:eof, >0:not eof */
acfe0abc 2299 return (*funcp)(aTHX_ idx, buf_sv, maxlen);
16d20bd9
AD
2300}
2301
76e3520e 2302STATIC char *
cea2e8a9 2303S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
16d20bd9 2304{
c39cd008 2305#ifdef PERL_CR_FILTER
3280af22 2306 if (!PL_rsfp_filters) {
c39cd008 2307 filter_add(S_cr_textfilter,NULL);
a868473f
NIS
2308 }
2309#endif
3280af22 2310 if (PL_rsfp_filters) {
55497cff 2311 if (!append)
2312 SvCUR_set(sv, 0); /* start with empty line */
16d20bd9
AD
2313 if (FILTER_READ(0, sv, 0) > 0)
2314 return ( SvPVX(sv) ) ;
2315 else
2316 return Nullch ;
2317 }
9d116dd7 2318 else
fd049845 2319 return (sv_gets(sv, fp, append));
a0d0e21e
LW
2320}
2321
01ec43d0 2322STATIC HV *
7fc63493 2323S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
def3634b
GS
2324{
2325 GV *gv;
2326
01ec43d0 2327 if (len == 11 && *pkgname == '_' && strEQ(pkgname, "__PACKAGE__"))
def3634b
GS
2328 return PL_curstash;
2329
2330 if (len > 2 &&
2331 (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
01ec43d0
GS
2332 (gv = gv_fetchpv(pkgname, FALSE, SVt_PVHV)))
2333 {
2334 return GvHV(gv); /* Foo:: */
def3634b
GS
2335 }
2336
2337 /* use constant CLASS => 'MyClass' */
2338 if ((gv = gv_fetchpv(pkgname, FALSE, SVt_PVCV))) {
2339 SV *sv;
2340 if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
83003860 2341 pkgname = SvPV_nolen_const(sv);
def3634b
GS
2342 }
2343 }
2344
2345 return gv_stashpv(pkgname, FALSE);
2346}
a0d0e21e 2347
468aa647 2348STATIC char *
cc6ed77d 2349S_tokenize_use(pTHX_ int is_use, char *s) {
468aa647
RGS
2350 if (PL_expect != XSTATE)
2351 yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
2352 is_use ? "use" : "no"));
2353 s = skipspace(s);
2354 if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
2355 s = force_version(s, TRUE);
2356 if (*s == ';' || (s = skipspace(s), *s == ';')) {
2357 PL_nextval[PL_nexttoke].opval = Nullop;
2358 force_next(WORD);
2359 }
2360 else if (*s == 'v') {
2361 s = force_word(s,WORD,FALSE,TRUE,FALSE);
2362 s = force_version(s, FALSE);
2363 }
2364 }
2365 else {
2366 s = force_word(s,WORD,FALSE,TRUE,FALSE);
2367 s = force_version(s, FALSE);
2368 }
2369 yylval.ival = is_use;
2370 return s;
2371}
748a9306 2372#ifdef DEBUGGING
27da23d5 2373 static const char* const exp_name[] =
09bef843 2374 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
27308ded 2375 "ATTRTERM", "TERMBLOCK", "TERMORDORDOR"
09bef843 2376 };
748a9306 2377#endif
463ee0b2 2378
02aa26ce
NT
2379/*
2380 yylex
2381
2382 Works out what to call the token just pulled out of the input
2383 stream. The yacc parser takes care of taking the ops we return and
2384 stitching them into a tree.
2385
2386 Returns:
2387 PRIVATEREF
2388
2389 Structure:
2390 if read an identifier
2391 if we're in a my declaration
2392 croak if they tried to say my($foo::bar)
2393 build the ops for a my() declaration
2394 if it's an access to a my() variable
2395 are we in a sort block?
2396 croak if my($a); $a <=> $b
2397 build ops for access to a my() variable
2398 if in a dq string, and they've said @foo and we can't find @foo
2399 croak
2400 build ops for a bareword
2401 if we already built the token before, use it.
2402*/
2403
20141f0e 2404
dba4d153
JH
2405#ifdef __SC__
2406#pragma segment Perl_yylex
2407#endif
dba4d153 2408int
dba4d153 2409Perl_yylex(pTHX)
20141f0e 2410{
3afc138a 2411 register char *s = PL_bufptr;
378cc40b 2412 register char *d;
79072805 2413 register I32 tmp;
463ee0b2 2414 STRLEN len;
161b471a
NIS
2415 GV *gv = Nullgv;
2416 GV **gvp = 0;
aa7440fb 2417 bool bof = FALSE;
1d239bbb 2418 I32 orig_keyword = 0;
a687059c 2419
bbf60fe6 2420 DEBUG_T( {
b6007c36
DM
2421 SV* tmp = newSVpvn("", 0);
2422 PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
2423 (IV)CopLINE(PL_curcop),
2424 lex_state_names[PL_lex_state],
2425 exp_name[PL_expect],
2426 pv_display(tmp, s, strlen(s), 0, 60));
2427 SvREFCNT_dec(tmp);
bbf60fe6 2428 } );
02aa26ce 2429 /* check if there's an identifier for us to look at */
ba979b31 2430 if (PL_pending_ident)
bbf60fe6 2431 return REPORT(S_pending_ident(aTHX));
bbce6d69 2432
02aa26ce
NT
2433 /* no identifier pending identification */
2434
3280af22 2435 switch (PL_lex_state) {
79072805
LW
2436#ifdef COMMENTARY
2437 case LEX_NORMAL: /* Some compilers will produce faster */
2438 case LEX_INTERPNORMAL: /* code if we comment these out. */
2439 break;
2440#endif
2441
09bef843 2442 /* when we've already built the next token, just pull it out of the queue */
79072805 2443 case LEX_KNOWNEXT:
3280af22
NIS
2444 PL_nexttoke--;
2445 yylval = PL_nextval[PL_nexttoke];
2446 if (!PL_nexttoke) {
2447 PL_lex_state = PL_lex_defer;
2448 PL_expect = PL_lex_expect;
2449 PL_lex_defer = LEX_NORMAL;
463ee0b2 2450 }
bbf60fe6 2451 return REPORT(PL_nexttype[PL_nexttoke]);
79072805 2452
02aa26ce 2453 /* interpolated case modifiers like \L \U, including \Q and \E.
3280af22 2454 when we get here, PL_bufptr is at the \
02aa26ce 2455 */
79072805
LW
2456 case LEX_INTERPCASEMOD:
2457#ifdef DEBUGGING
3280af22 2458 if (PL_bufptr != PL_bufend && *PL_bufptr != '\\')
cea2e8a9 2459 Perl_croak(aTHX_ "panic: INTERPCASEMOD");
79072805 2460#endif
02aa26ce 2461 /* handle \E or end of string */
3280af22 2462 if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
02aa26ce 2463 /* if at a \E */
3280af22 2464 if (PL_lex_casemods) {
f54cb97a 2465 const char oldmod = PL_lex_casestack[--PL_lex_casemods];
3280af22 2466 PL_lex_casestack[PL_lex_casemods] = '\0';
02aa26ce 2467
3792a11b
NC
2468 if (PL_bufptr != PL_bufend
2469 && (oldmod == 'L' || oldmod == 'U' || oldmod == 'Q')) {
3280af22
NIS
2470 PL_bufptr += 2;
2471 PL_lex_state = LEX_INTERPCONCAT;
a0d0e21e 2472 }
bbf60fe6 2473 return REPORT(')');
79072805 2474 }
3280af22
NIS
2475 if (PL_bufptr != PL_bufend)
2476 PL_bufptr += 2;
2477 PL_lex_state = LEX_INTERPCONCAT;
cea2e8a9 2478 return yylex();
79072805
LW
2479 }
2480 else {
607df283 2481 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 2482 "### Saw case modifier\n"); });
3280af22 2483 s = PL_bufptr + 1;
6e909404
JH
2484 if (s[1] == '\\' && s[2] == 'E') {
2485 PL_bufptr = s + 3;
2486 PL_lex_state = LEX_INTERPCONCAT;
2487 return yylex();
a0d0e21e 2488 }
6e909404
JH
2489 else {
2490 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
2491 tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */
3792a11b 2492 if ((*s == 'L' || *s == 'U') &&
6e909404
JH
2493 (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) {
2494 PL_lex_casestack[--PL_lex_casemods] = '\0';
bbf60fe6 2495 return REPORT(')');
6e909404
JH
2496 }
2497 if (PL_lex_casemods > 10)
2498 Renew(PL_lex_casestack, PL_lex_casemods + 2, char);
2499 PL_lex_casestack[PL_lex_casemods++] = *s;
2500 PL_lex_casestack[PL_lex_casemods] = '\0';
2501 PL_lex_state = LEX_INTERPCONCAT;
2502 PL_nextval[PL_nexttoke].ival = 0;
2503 force_next('(');
2504 if (*s == 'l')
2505 PL_nextval[PL_nexttoke].ival = OP_LCFIRST;
2506 else if (*s == 'u')
2507 PL_nextval[PL_nexttoke].ival = OP_UCFIRST;
2508 else if (*s == 'L')
2509 PL_nextval[PL_nexttoke].ival = OP_LC;
2510 else if (*s == 'U')
2511 PL_nextval[PL_nexttoke].ival = OP_UC;
2512 else if (*s == 'Q')
2513 PL_nextval[PL_nexttoke].ival = OP_QUOTEMETA;
2514 else
2515 Perl_croak(aTHX_ "panic: yylex");
2516 PL_bufptr = s + 1;
a0d0e21e 2517 }
79072805 2518 force_next(FUNC);
3280af22
NIS
2519 if (PL_lex_starts) {
2520 s = PL_bufptr;
2521 PL_lex_starts = 0;
131b3ad0
DM
2522 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2523 if (PL_lex_casemods == 1 && PL_lex_inpat)
2524 OPERATOR(',');
2525 else
2526 Aop(OP_CONCAT);
79072805
LW
2527 }
2528 else
cea2e8a9 2529 return yylex();
79072805
LW
2530 }
2531
55497cff 2532 case LEX_INTERPPUSH:
bbf60fe6 2533 return REPORT(sublex_push());
55497cff 2534
79072805 2535 case LEX_INTERPSTART:
3280af22 2536 if (PL_bufptr == PL_bufend)
bbf60fe6 2537 return REPORT(sublex_done());
607df283 2538 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 2539 "### Interpolated variable\n"); });
3280af22
NIS
2540 PL_expect = XTERM;
2541 PL_lex_dojoin = (*PL_bufptr == '@');
2542 PL_lex_state = LEX_INTERPNORMAL;
2543 if (PL_lex_dojoin) {
2544 PL_nextval[PL_nexttoke].ival = 0;
79072805 2545 force_next(',');
a0d0e21e 2546 force_ident("\"", '$');
3280af22 2547 PL_nextval[PL_nexttoke].ival = 0;
79072805 2548 force_next('$');
3280af22 2549 PL_nextval[PL_nexttoke].ival = 0;
79072805 2550 force_next('(');
3280af22 2551 PL_nextval[PL_nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
79072805
LW
2552 force_next(FUNC);
2553 }
3280af22
NIS
2554 if (PL_lex_starts++) {
2555 s = PL_bufptr;
131b3ad0
DM
2556 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2557 if (!PL_lex_casemods && PL_lex_inpat)
2558 OPERATOR(',');
2559 else
2560 Aop(OP_CONCAT);
79072805 2561 }
cea2e8a9 2562 return yylex();
79072805
LW
2563
2564 case LEX_INTERPENDMAYBE:
3280af22
NIS
2565 if (intuit_more(PL_bufptr)) {
2566 PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
79072805
LW
2567 break;
2568 }
2569 /* FALL THROUGH */
2570
2571 case LEX_INTERPEND:
3280af22
NIS
2572 if (PL_lex_dojoin) {
2573 PL_lex_dojoin = FALSE;
2574 PL_lex_state = LEX_INTERPCONCAT;
bbf60fe6 2575 return REPORT(')');
79072805 2576 }
43a16006 2577 if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl
25da4f38 2578 && SvEVALED(PL_lex_repl))
43a16006 2579 {
e9fa98b2 2580 if (PL_bufptr != PL_bufend)
cea2e8a9 2581 Perl_croak(aTHX_ "Bad evalled substitution pattern");
e9fa98b2
HS
2582 PL_lex_repl = Nullsv;
2583 }
79072805
LW
2584 /* FALLTHROUGH */
2585 case LEX_INTERPCONCAT:
2586#ifdef DEBUGGING
3280af22 2587 if (PL_lex_brackets)
cea2e8a9 2588 Perl_croak(aTHX_ "panic: INTERPCONCAT");
79072805 2589#endif
3280af22 2590 if (PL_bufptr == PL_bufend)
bbf60fe6 2591 return REPORT(sublex_done());
79072805 2592
3280af22
NIS
2593 if (SvIVX(PL_linestr) == '\'') {
2594 SV *sv = newSVsv(PL_linestr);
2595 if (!PL_lex_inpat)
76e3520e 2596 sv = tokeq(sv);
3280af22 2597 else if ( PL_hints & HINT_NEW_RE )
b3ac6de7 2598 sv = new_constant(NULL, 0, "qr", sv, sv, "q");
79072805 2599 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
3280af22 2600 s = PL_bufend;
79072805
LW
2601 }
2602 else {
3280af22 2603 s = scan_const(PL_bufptr);
79072805 2604 if (*s == '\\')
3280af22 2605 PL_lex_state = LEX_INTERPCASEMOD;
79072805 2606 else
3280af22 2607 PL_lex_state = LEX_INTERPSTART;
79072805
LW
2608 }
2609
3280af22
NIS
2610 if (s != PL_bufptr) {
2611 PL_nextval[PL_nexttoke] = yylval;
2612 PL_expect = XTERM;
79072805 2613 force_next(THING);
131b3ad0
DM
2614 if (PL_lex_starts++) {
2615 /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
2616 if (!PL_lex_casemods && PL_lex_inpat)
2617 OPERATOR(',');
2618 else
2619 Aop(OP_CONCAT);
2620 }
79072805 2621 else {
3280af22 2622 PL_bufptr = s;
cea2e8a9 2623 return yylex();
79072805
LW
2624 }
2625 }
2626
cea2e8a9 2627 return yylex();
a0d0e21e 2628 case LEX_FORMLINE:
3280af22
NIS
2629 PL_lex_state = LEX_NORMAL;
2630 s = scan_formline(PL_bufptr);
2631 if (!PL_lex_formbrack)
a0d0e21e
LW
2632 goto rightbracket;
2633 OPERATOR(';');
79072805
LW
2634 }
2635
3280af22
NIS
2636 s = PL_bufptr;
2637 PL_oldoldbufptr = PL_oldbufptr;
2638 PL_oldbufptr = s;
463ee0b2
LW
2639
2640 retry:
378cc40b
LW
2641 switch (*s) {
2642 default:
7e2040f0 2643 if (isIDFIRST_lazy_if(s,UTF))
834a4ddd 2644 goto keylookup;
cea2e8a9 2645 Perl_croak(aTHX_ "Unrecognized character \\x%02X", *s & 255);
e929a76b
LW
2646 case 4:
2647 case 26:
2648 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 2649 case 0:
3280af22
NIS
2650 if (!PL_rsfp) {
2651 PL_last_uni = 0;
2652 PL_last_lop = 0;
c5ee2135
WL
2653 if (PL_lex_brackets) {
2654 if (PL_lex_formbrack)
2655 yyerror("Format not terminated");
2656 else
2657 yyerror("Missing right curly or square bracket");
2658 }
4e553d73 2659 DEBUG_T( { PerlIO_printf(Perl_debug_log,
607df283 2660 "### Tokener got EOF\n");
5f80b19c 2661 } );
79072805 2662 TOKEN(0);
463ee0b2 2663 }
3280af22 2664 if (s++ < PL_bufend)
a687059c 2665 goto retry; /* ignore stray nulls */
3280af22
NIS
2666 PL_last_uni = 0;
2667 PL_last_lop = 0;
2668 if (!PL_in_eval && !PL_preambled) {
2669 PL_preambled = TRUE;
2670 sv_setpv(PL_linestr,incl_perldb());
2671 if (SvCUR(PL_linestr))
4147a61b 2672 sv_catpvn(PL_linestr,";", 1);
3280af22
NIS
2673 if (PL_preambleav){
2674 while(AvFILLp(PL_preambleav) >= 0) {
2675 SV *tmpsv = av_shift(PL_preambleav);
2676 sv_catsv(PL_linestr, tmpsv);
4147a61b 2677 sv_catpvn(PL_linestr, ";", 1);
91b7def8 2678 sv_free(tmpsv);
2679 }
3280af22
NIS
2680 sv_free((SV*)PL_preambleav);
2681 PL_preambleav = NULL;
91b7def8 2682 }
3280af22
NIS
2683 if (PL_minus_n || PL_minus_p) {
2684 sv_catpv(PL_linestr, "LINE: while (<>) {");
2685 if (PL_minus_l)
2686 sv_catpv(PL_linestr,"chomp;");
2687 if (PL_minus_a) {
3280af22 2688 if (PL_minus_F) {
3792a11b
NC
2689 if ((*PL_splitstr == '/' || *PL_splitstr == '\''
2690 || *PL_splitstr == '"')
3280af22 2691 && strchr(PL_splitstr + 1, *PL_splitstr))
3db68c4c 2692 Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr);
54310121 2693 else {
c8ef6a4b
NC
2694 /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
2695 bytes can be used as quoting characters. :-) */
48c4c863
NC
2696 /* The count here deliberately includes the NUL
2697 that terminates the C string constant. This
2698 embeds the opening NUL into the string. */
dd374669 2699 const char *splits = PL_splitstr;
9a3fb652 2700 sv_catpvn(PL_linestr, "our @F=split(q", 15);
48c4c863
NC
2701 do {
2702 /* Need to \ \s */
dd374669
AL
2703 if (*splits == '\\')
2704 sv_catpvn(PL_linestr, splits, 1);
2705 sv_catpvn(PL_linestr, splits, 1);
2706 } while (*splits++);
48c4c863
NC
2707 /* This loop will embed the trailing NUL of
2708 PL_linestr as the last thing it does before
2709 terminating. */
4fccd7c6 2710 sv_catpvn(PL_linestr, ");", 2);
54310121 2711 }
2304df62
AD
2712 }
2713 else
75c72d73 2714 sv_catpv(PL_linestr,"our @F=split(' ');");
2304df62 2715 }
79072805 2716 }
4147a61b 2717 sv_catpvn(PL_linestr, "\n", 1);
3280af22
NIS
2718 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2719 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2720 PL_last_lop = PL_last_uni = Nullch;
3280af22 2721 if (PERLDB_LINE && PL_curstash != PL_debstash) {
9d4ba2ae 2722 SV * const sv = NEWSV(85,0);
a0d0e21e
LW
2723
2724 sv_upgrade(sv, SVt_PVMG);
3280af22 2725 sv_setsv(sv,PL_linestr);
0ac0412a 2726 (void)SvIOK_on(sv);
45977657 2727 SvIV_set(sv, 0);
57843af0 2728 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
a0d0e21e 2729 }
79072805 2730 goto retry;
a687059c 2731 }
e929a76b 2732 do {
aa7440fb 2733 bof = PL_rsfp ? TRUE : FALSE;
7e28d3af
JH
2734 if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
2735 fake_eof:
2736 if (PL_rsfp) {
2737 if (PL_preprocess && !PL_in_eval)
2738 (void)PerlProc_pclose(PL_rsfp);
2739 else if ((PerlIO *)PL_rsfp == PerlIO_stdin())
2740 PerlIO_clearerr(PL_rsfp);
2741 else
2742 (void)PerlIO_close(PL_rsfp);
2743 PL_rsfp = Nullfp;
2744 PL_doextract = FALSE;
2745 }
2746 if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
a23c4656
NC
2747 sv_setpv(PL_linestr,PL_minus_p
2748 ? ";}continue{print;}" : ";}");
7e28d3af
JH
2749 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2750 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2751 PL_last_lop = PL_last_uni = Nullch;
7e28d3af
JH
2752 PL_minus_n = PL_minus_p = 0;
2753 goto retry;
2754 }
2755 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
207e3d1a 2756 PL_last_lop = PL_last_uni = Nullch;
c69006e4 2757 sv_setpvn(PL_linestr,"",0);
7e28d3af
JH
2758 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
2759 }
7aa207d6
JH
2760 /* If it looks like the start of a BOM or raw UTF-16,
2761 * check if it in fact is. */
2762 else if (bof &&
2763 (*s == 0 ||
2764 *(U8*)s == 0xEF ||
2765 *(U8*)s >= 0xFE ||
2766 s[1] == 0)) {
226017aa 2767#ifdef PERLIO_IS_STDIO
e3f494f1
JH
2768# ifdef __GNU_LIBRARY__
2769# if __GNU_LIBRARY__ == 1 /* Linux glibc5 */
226017aa
DD
2770# define FTELL_FOR_PIPE_IS_BROKEN
2771# endif
e3f494f1
JH
2772# else
2773# ifdef __GLIBC__
2774# if __GLIBC__ == 1 /* maybe some glibc5 release had it like this? */
2775# define FTELL_FOR_PIPE_IS_BROKEN
2776# endif
2777# endif
226017aa
DD
2778# endif
2779#endif
2780#ifdef FTELL_FOR_PIPE_IS_BROKEN
2781 /* This loses the possibility to detect the bof
2782 * situation on perl -P when the libc5 is being used.
2783 * Workaround? Maybe attach some extra state to PL_rsfp?
2784 */
2785 if (!PL_preprocess)
7e28d3af 2786 bof = PerlIO_tell(PL_rsfp) == SvCUR(PL_linestr);
226017aa 2787#else
eb160463 2788 bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr);
226017aa 2789#endif
7e28d3af 2790 if (bof) {
3280af22 2791 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
7e28d3af 2792 s = swallow_bom((U8*)s);
e929a76b 2793 }
378cc40b 2794 }
3280af22 2795 if (PL_doextract) {
a0d0e21e
LW
2796 /* Incest with pod. */
2797 if (*s == '=' && strnEQ(s, "=cut", 4)) {
c69006e4 2798 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
2799 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2800 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2801 PL_last_lop = PL_last_uni = Nullch;
3280af22 2802 PL_doextract = FALSE;
a0d0e21e 2803 }
4e553d73 2804 }
463ee0b2 2805 incline(s);
3280af22
NIS
2806 } while (PL_doextract);
2807 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
2808 if (PERLDB_LINE && PL_curstash != PL_debstash) {
9d4ba2ae 2809 SV * const sv = NEWSV(85,0);
a687059c 2810
93a17b20 2811 sv_upgrade(sv, SVt_PVMG);
3280af22 2812 sv_setsv(sv,PL_linestr);
0ac0412a 2813 (void)SvIOK_on(sv);
45977657 2814 SvIV_set(sv, 0);
57843af0 2815 av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
a687059c 2816 }
3280af22 2817 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2818 PL_last_lop = PL_last_uni = Nullch;
57843af0 2819 if (CopLINE(PL_curcop) == 1) {
3280af22 2820 while (s < PL_bufend && isSPACE(*s))
79072805 2821 s++;
a0d0e21e 2822 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 2823 s++;
44a8e56a 2824 d = Nullch;
3280af22 2825 if (!PL_in_eval) {
44a8e56a 2826 if (*s == '#' && *(s+1) == '!')
2827 d = s + 2;
2828#ifdef ALTERNATE_SHEBANG
2829 else {
bfed75c6 2830 static char const as[] = ALTERNATE_SHEBANG;
44a8e56a 2831 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
2832 d = s + (sizeof(as) - 1);
2833 }
2834#endif /* ALTERNATE_SHEBANG */
2835 }
2836 if (d) {
b8378b72 2837 char *ipath;
774d564b 2838 char *ipathend;
b8378b72 2839
774d564b 2840 while (isSPACE(*d))
b8378b72
CS
2841 d++;
2842 ipath = d;
774d564b 2843 while (*d && !isSPACE(*d))
2844 d++;
2845 ipathend = d;
2846
2847#ifdef ARG_ZERO_IS_SCRIPT
2848 if (ipathend > ipath) {
2849 /*
2850 * HP-UX (at least) sets argv[0] to the script name,
2851 * which makes $^X incorrect. And Digital UNIX and Linux,
2852 * at least, set argv[0] to the basename of the Perl
2853 * interpreter. So, having found "#!", we'll set it right.
2854 */
ee2f7564 2855 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV)); /* $^X */
774d564b 2856 assert(SvPOK(x) || SvGMAGICAL(x));
cc49e20b 2857 if (sv_eq(x, CopFILESV(PL_curcop))) {
774d564b 2858 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 2859 SvSETMAGIC(x);
2860 }
556c1dec
JH
2861 else {
2862 STRLEN blen;
2863 STRLEN llen;
cfd0369c 2864 const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
9d4ba2ae 2865 const char * const lstart = SvPV_const(x,llen);
556c1dec
JH
2866 if (llen < blen) {
2867 bstart += blen - llen;
2868 if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
2869 sv_setpvn(x, ipath, ipathend - ipath);
2870 SvSETMAGIC(x);
2871 }
2872 }
2873 }
774d564b 2874 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 2875 }
774d564b 2876#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
2877
2878 /*
2879 * Look for options.
2880 */
748a9306 2881 d = instr(s,"perl -");
84e30d1a 2882 if (!d) {
748a9306 2883 d = instr(s,"perl");
84e30d1a
GS
2884#if defined(DOSISH)
2885 /* avoid getting into infinite loops when shebang
2886 * line contains "Perl" rather than "perl" */
2887 if (!d) {
2888 for (d = ipathend-4; d >= ipath; --d) {
2889 if ((*d == 'p' || *d == 'P')
2890 && !ibcmp(d, "perl", 4))
2891 {
2892 break;
2893 }
2894 }
2895 if (d < ipath)
2896 d = Nullch;
2897 }
2898#endif
2899 }
44a8e56a 2900#ifdef ALTERNATE_SHEBANG
2901 /*
2902 * If the ALTERNATE_SHEBANG on this system starts with a
2903 * character that can be part of a Perl expression, then if
2904 * we see it but not "perl", we're probably looking at the
2905 * start of Perl code, not a request to hand off to some
2906 * other interpreter. Similarly, if "perl" is there, but
2907 * not in the first 'word' of the line, we assume the line
2908 * contains the start of the Perl program.
44a8e56a 2909 */
2910 if (d && *s != '#') {
f54cb97a 2911 const char *c = ipath;
44a8e56a 2912 while (*c && !strchr("; \t\r\n\f\v#", *c))
2913 c++;
2914 if (c < d)
2915 d = Nullch; /* "perl" not in first word; ignore */
2916 else
2917 *s = '#'; /* Don't try to parse shebang line */
2918 }
774d564b 2919#endif /* ALTERNATE_SHEBANG */
bf4acbe4 2920#ifndef MACOS_TRADITIONAL
748a9306 2921 if (!d &&
44a8e56a 2922 *s == '#' &&
774d564b 2923 ipathend > ipath &&
3280af22 2924 !PL_minus_c &&
748a9306 2925 !instr(s,"indir") &&
3280af22 2926 instr(PL_origargv[0],"perl"))
748a9306 2927 {
27da23d5 2928 dVAR;
9f68db38 2929 char **newargv;
9f68db38 2930
774d564b 2931 *ipathend = '\0';
2932 s = ipathend + 1;
3280af22 2933 while (s < PL_bufend && isSPACE(*s))
9f68db38 2934 s++;
3280af22 2935 if (s < PL_bufend) {
a02a5408 2936 Newxz(newargv,PL_origargc+3,char*);
9f68db38 2937 newargv[1] = s;
3280af22 2938 while (s < PL_bufend && !isSPACE(*s))
9f68db38
LW
2939 s++;
2940 *s = '\0';
3280af22 2941 Copy(PL_origargv+1, newargv+2, PL_origargc+1, char*);
9f68db38
LW
2942 }
2943 else
3280af22 2944 newargv = PL_origargv;
774d564b 2945 newargv[0] = ipath;
b35112e7 2946 PERL_FPU_PRE_EXEC
b4748376 2947 PerlProc_execv(ipath, EXEC_ARGV_CAST(newargv));
b35112e7 2948 PERL_FPU_POST_EXEC
cea2e8a9 2949 Perl_croak(aTHX_ "Can't exec %s", ipath);
9f68db38 2950 }
bf4acbe4 2951#endif
748a9306 2952 if (d) {
f54cb97a
AL
2953 const U32 oldpdb = PL_perldb;
2954 const bool oldn = PL_minus_n;
2955 const bool oldp = PL_minus_p;
748a9306
LW
2956
2957 while (*d && !isSPACE(*d)) d++;
bf4acbe4 2958 while (SPACE_OR_TAB(*d)) d++;
748a9306
LW
2959
2960 if (*d++ == '-') {
f54cb97a 2961 const bool switches_done = PL_doswitches;
8cc95fdb 2962 do {
3ffe3ee4 2963 if (*d == 'M' || *d == 'm' || *d == 'C') {
9d4ba2ae 2964 const char * const m = d;
8cc95fdb 2965 while (*d && !isSPACE(*d)) d++;
cea2e8a9 2966 Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
8cc95fdb 2967 (int)(d - m), m);
2968 }
2969 d = moreswitches(d);
2970 } while (d);
f0b2cf55
YST
2971 if (PL_doswitches && !switches_done) {
2972 int argc = PL_origargc;
2973 char **argv = PL_origargv;
2974 do {
2975 argc--,argv++;
2976 } while (argc && argv[0][0] == '-' && argv[0][1]);
2977 init_argv_symbols(argc,argv);
2978 }
155aba94
GS
2979 if ((PERLDB_LINE && !oldpdb) ||
2980 ((PL_minus_n || PL_minus_p) && !(oldn || oldp)))
b084f20b 2981 /* if we have already added "LINE: while (<>) {",
2982 we must not do it again */
748a9306 2983 {
c69006e4 2984 sv_setpvn(PL_linestr, "", 0);
3280af22
NIS
2985 PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
2986 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 2987 PL_last_lop = PL_last_uni = Nullch;
3280af22 2988 PL_preambled = FALSE;
84902520 2989 if (PERLDB_LINE)
3280af22 2990 (void)gv_fetchfile(PL_origfilename);
748a9306
LW
2991 goto retry;
2992 }
a11ec5a9
RGS
2993 if (PL_doswitches && !switches_done) {
2994 int argc = PL_origargc;
2995 char **argv = PL_origargv;
2996 do {
2997 argc--,argv++;
2998 } while (argc && argv[0][0] == '-' && argv[0][1]);
2999 init_argv_symbols(argc,argv);
3000 }
a0d0e21e 3001 }
79072805 3002 }
9f68db38 3003 }
79072805 3004 }
3280af22
NIS
3005 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3006 PL_bufptr = s;
3007 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3008 return yylex();
ae986130 3009 }
378cc40b 3010 goto retry;
4fdae800 3011 case '\r':
6a27c188 3012#ifdef PERL_STRICT_CR
cea2e8a9 3013 Perl_warn(aTHX_ "Illegal character \\%03o (carriage return)", '\r');
4e553d73 3014 Perl_croak(aTHX_
cc507455 3015 "\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
a868473f 3016#endif
4fdae800 3017 case ' ': case '\t': case '\f': case 013:
bf4acbe4
GS
3018#ifdef MACOS_TRADITIONAL
3019 case '\312':
3020#endif
378cc40b
LW
3021 s++;
3022 goto retry;
378cc40b 3023 case '#':
e929a76b 3024 case '\n':
3280af22 3025 if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
df0deb90
GS
3026 if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
3027 /* handle eval qq[#line 1 "foo"\n ...] */
3028 CopLINE_dec(PL_curcop);
3029 incline(s);
3030 }
3280af22 3031 d = PL_bufend;
a687059c 3032 while (s < d && *s != '\n')
378cc40b 3033 s++;
0f85fab0 3034 if (s < d)
378cc40b 3035 s++;
78c267c1 3036 else if (s > d) /* Found by Ilya: feed random input to Perl. */
a8406387 3037 Perl_croak(aTHX_ "panic: input overflow");
463ee0b2 3038 incline(s);
3280af22
NIS
3039 if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
3040 PL_bufptr = s;
3041 PL_lex_state = LEX_FORMLINE;
cea2e8a9 3042 return yylex();
a687059c 3043 }
378cc40b 3044 }
a687059c 3045 else {
378cc40b 3046 *s = '\0';
3280af22 3047 PL_bufend = s;
a687059c 3048 }
378cc40b
LW
3049 goto retry;
3050 case '-':
79072805 3051 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
e5edeb50
JH
3052 I32 ftst = 0;
3053
378cc40b 3054 s++;
3280af22 3055 PL_bufptr = s;
748a9306
LW
3056 tmp = *s++;
3057
bf4acbe4 3058 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306
LW
3059 s++;
3060
3061 if (strnEQ(s,"=>",2)) {
3280af22 3062 s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
b6007c36
DM
3063 DEBUG_T( { S_printbuf(aTHX_
3064 "### Saw unary minus before =>, forcing word %s\n", s);
5f80b19c 3065 } );
748a9306
LW
3066 OPERATOR('-'); /* unary minus */
3067 }
3280af22 3068 PL_last_uni = PL_oldbufptr;
748a9306 3069 switch (tmp) {
e5edeb50
JH
3070 case 'r': ftst = OP_FTEREAD; break;
3071 case 'w': ftst = OP_FTEWRITE; break;
3072 case 'x': ftst = OP_FTEEXEC; break;
3073 case 'o': ftst = OP_FTEOWNED; break;
3074 case 'R': ftst = OP_FTRREAD; break;
3075 case 'W': ftst = OP_FTRWRITE; break;
3076 case 'X': ftst = OP_FTREXEC; break;
3077 case 'O': ftst = OP_FTROWNED; break;
3078 case 'e': ftst = OP_FTIS; break;
3079 case 'z': ftst = OP_FTZERO; break;
3080 case 's': ftst = OP_FTSIZE; break;
3081 case 'f': ftst = OP_FTFILE; break;
3082 case 'd': ftst = OP_FTDIR; break;
3083 case 'l': ftst = OP_FTLINK; break;
3084 case 'p': ftst = OP_FTPIPE; break;
3085 case 'S': ftst = OP_FTSOCK; break;
3086 case 'u': ftst = OP_FTSUID; break;
3087 case 'g': ftst = OP_FTSGID; break;
3088 case 'k': ftst = OP_FTSVTX; break;
3089 case 'b': ftst = OP_FTBLK; break;
3090 case 'c': ftst = OP_FTCHR; break;
3091 case 't': ftst = OP_FTTTY; break;
3092 case 'T': ftst = OP_FTTEXT; break;
3093 case 'B': ftst = OP_FTBINARY; break;
3094 case 'M': case 'A': case 'C':
3095 gv_fetchpv("\024",TRUE, SVt_PV);
3096 switch (tmp) {
3097 case 'M': ftst = OP_FTMTIME; break;
3098 case 'A': ftst = OP_FTATIME; break;
3099 case 'C': ftst = OP_FTCTIME; break;
3100 default: break;
3101 }
3102 break;
378cc40b 3103 default:
378cc40b
LW
3104 break;
3105 }
e5edeb50 3106 if (ftst) {
eb160463 3107 PL_last_lop_op = (OPCODE)ftst;
4e553d73 3108 DEBUG_T( { PerlIO_printf(Perl_debug_log,
0844c848 3109 "### Saw file test %c\n", (int)ftst);
5f80b19c 3110 } );
e5edeb50
JH
3111 FTST(ftst);
3112 }
3113 else {
3114 /* Assume it was a minus followed by a one-letter named
3115 * subroutine call (or a -bareword), then. */
95c31fe3 3116 DEBUG_T( { PerlIO_printf(Perl_debug_log,
17ad61e0 3117 "### '-%c' looked like a file test but was not\n",
4fccd7c6 3118 (int) tmp);
5f80b19c 3119 } );
3cf7b4c4 3120 s = --PL_bufptr;
e5edeb50 3121 }
378cc40b 3122 }
a687059c
LW
3123 tmp = *s++;
3124 if (*s == tmp) {
3125 s++;
3280af22 3126 if (PL_expect == XOPERATOR)
79072805
LW
3127 TERM(POSTDEC);
3128 else
3129 OPERATOR(PREDEC);
3130 }
3131 else if (*s == '>') {
3132 s++;
3133 s = skipspace(s);
7e2040f0 3134 if (isIDFIRST_lazy_if(s,UTF)) {
a0d0e21e 3135 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
463ee0b2 3136 TOKEN(ARROW);
79072805 3137 }
748a9306
LW
3138 else if (*s == '$')
3139 OPERATOR(ARROW);
463ee0b2 3140 else
748a9306 3141 TERM(ARROW);
a687059c 3142 }
3280af22 3143 if (PL_expect == XOPERATOR)
79072805
LW
3144 Aop(OP_SUBTRACT);
3145 else {
3280af22 3146 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2f3197b3 3147 check_uni();
79072805 3148 OPERATOR('-'); /* unary minus */
2f3197b3 3149 }
79072805 3150
378cc40b 3151 case '+':
a687059c
LW
3152 tmp = *s++;
3153 if (*s == tmp) {
378cc40b 3154 s++;
3280af22 3155 if (PL_expect == XOPERATOR)
79072805
LW
3156 TERM(POSTINC);
3157 else
3158 OPERATOR(PREINC);
378cc40b 3159 }
3280af22 3160 if (PL_expect == XOPERATOR)
79072805
LW
3161 Aop(OP_ADD);
3162 else {
3280af22 3163 if (isSPACE(*s) || !isSPACE(*PL_bufptr))
2f3197b3 3164 check_uni();
a687059c 3165 OPERATOR('+');
2f3197b3 3166 }
a687059c 3167
378cc40b 3168 case '*':
3280af22
NIS
3169 if (PL_expect != XOPERATOR) {
3170 s = scan_ident(s, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3171 PL_expect = XOPERATOR;
3172 force_ident(PL_tokenbuf, '*');
3173 if (!*PL_tokenbuf)
a0d0e21e 3174 PREREF('*');
79072805 3175 TERM('*');
a687059c 3176 }
79072805
LW
3177 s++;
3178 if (*s == '*') {
a687059c 3179 s++;
79072805 3180 PWop(OP_POW);
a687059c 3181 }
79072805
LW
3182 Mop(OP_MULTIPLY);
3183
378cc40b 3184 case '%':
3280af22 3185 if (PL_expect == XOPERATOR) {
bbce6d69 3186 ++s;
3187 Mop(OP_MODULO);
a687059c 3188 }
3280af22
NIS
3189 PL_tokenbuf[0] = '%';
3190 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, TRUE);
3191 if (!PL_tokenbuf[1]) {
bbce6d69 3192 PREREF('%');
a687059c 3193 }
3280af22 3194 PL_pending_ident = '%';
bbce6d69 3195 TERM('%');
a687059c 3196
378cc40b 3197 case '^':
79072805 3198 s++;
a0d0e21e 3199 BOop(OP_BIT_XOR);
79072805 3200 case '[':
3280af22 3201 PL_lex_brackets++;
79072805 3202 /* FALL THROUGH */
378cc40b 3203 case '~':
378cc40b 3204 case ',':
378cc40b
LW
3205 tmp = *s++;
3206 OPERATOR(tmp);
a0d0e21e
LW
3207 case ':':
3208 if (s[1] == ':') {
3209 len = 0;
3210 goto just_a_word;
3211 }
3212 s++;
09bef843
SB
3213 switch (PL_expect) {
3214 OP *attrs;
3215 case XOPERATOR:
3216 if (!PL_in_my || PL_lex_state != LEX_NORMAL)
3217 break;
3218 PL_bufptr = s; /* update in case we back off */
3219 goto grabattrs;
3220 case XATTRBLOCK:
3221 PL_expect = XBLOCK;
3222 goto grabattrs;
3223 case XATTRTERM:
3224 PL_expect = XTERMBLOCK;
3225 grabattrs:
3226 s = skipspace(s);
3227 attrs = Nullop;
7e2040f0 3228 while (isIDFIRST_lazy_if(s,UTF)) {
09bef843 3229 d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
f9829d6b
GS
3230 if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
3231 if (tmp < 0) tmp = -tmp;
3232 switch (tmp) {
3233 case KEY_or:
3234 case KEY_and:
c963b151 3235 case KEY_err:
f9829d6b
GS
3236 case KEY_for:
3237 case KEY_unless:
3238 case KEY_if:
3239 case KEY_while:
3240 case KEY_until:
3241 goto got_attrs;
3242 default:
3243 break;
3244 }
3245 }
09bef843
SB
3246 if (*d == '(') {
3247 d = scan_str(d,TRUE,TRUE);
3248 if (!d) {
09bef843
SB
3249 /* MUST advance bufptr here to avoid bogus
3250 "at end of line" context messages from yyerror().
3251 */
3252 PL_bufptr = s + len;
3253 yyerror("Unterminated attribute parameter in attribute list");
3254 if (attrs)
3255 op_free(attrs);
bbf60fe6 3256 return REPORT(0); /* EOF indicator */
09bef843
SB
3257 }
3258 }
3259 if (PL_lex_stuff) {
3260 SV *sv = newSVpvn(s, len);
3261 sv_catsv(sv, PL_lex_stuff);
3262 attrs = append_elem(OP_LIST, attrs,
3263 newSVOP(OP_CONST, 0, sv));
3264 SvREFCNT_dec(PL_lex_stuff);
3265 PL_lex_stuff = Nullsv;
3266 }
3267 else {
371fce9b
DM
3268 if (len == 6 && strnEQ(s, "unique", len)) {
3269 if (PL_in_my == KEY_our)
3270#ifdef USE_ITHREADS
3271 GvUNIQUE_on(cGVOPx_gv(yylval.opval));
3272#else
3273 ; /* skip to avoid loading attributes.pm */
3274#endif
bfed75c6 3275 else
371fce9b
DM
3276 Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
3277 }
3278
d3cea301
SB
3279 /* NOTE: any CV attrs applied here need to be part of
3280 the CVf_BUILTIN_ATTRS define in cv.h! */
371fce9b 3281 else if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
78f9721b
SM
3282 CvLVALUE_on(PL_compcv);
3283 else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
3284 CvLOCKED_on(PL_compcv);
3285 else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
3286 CvMETHOD_on(PL_compcv);
06492da6
SF
3287 else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
3288 CvASSERTION_on(PL_compcv);
78f9721b
SM
3289 /* After we've set the flags, it could be argued that
3290 we don't need to do the attributes.pm-based setting
3291 process, and shouldn't bother appending recognized
d3cea301
SB
3292 flags. To experiment with that, uncomment the
3293 following "else". (Note that's already been
3294 uncommented. That keeps the above-applied built-in
3295 attributes from being intercepted (and possibly
3296 rejected) by a package's attribute routines, but is
3297 justified by the performance win for the common case
3298 of applying only built-in attributes.) */
0256094b 3299 else
78f9721b
SM
3300 attrs = append_elem(OP_LIST, attrs,
3301 newSVOP(OP_CONST, 0,
3302 newSVpvn(s, len)));
09bef843
SB
3303 }
3304 s = skipspace(d);
0120eecf 3305 if (*s == ':' && s[1] != ':')
09bef843 3306 s = skipspace(s+1);
0120eecf
GS
3307 else if (s == d)
3308 break; /* require real whitespace or :'s */
09bef843 3309 }
f9829d6b 3310 tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
8e7ae056 3311 if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
f54cb97a 3312 const char q = ((*s == '\'') ? '"' : '\'');
09bef843
SB
3313 /* If here for an expression, and parsed no attrs, back off. */
3314 if (tmp == '=' && !attrs) {
3315 s = PL_bufptr;
3316 break;
3317 }
3318 /* MUST advance bufptr here to avoid bogus "at end of line"
3319 context messages from yyerror().
3320 */
3321 PL_bufptr = s;
3322 if (!*s)
3323 yyerror("Unterminated attribute list");
3324 else
3325 yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
3326 q, *s, q));
3327 if (attrs)
3328 op_free(attrs);
3329 OPERATOR(':');
3330 }
f9829d6b 3331 got_attrs:
09bef843
SB
3332 if (attrs) {
3333 PL_nextval[PL_nexttoke].opval = attrs;
3334 force_next(THING);
3335 }
3336 TOKEN(COLONATTR);
3337 }
a0d0e21e 3338 OPERATOR(':');
8990e307
LW
3339 case '(':
3340 s++;
3280af22
NIS
3341 if (PL_last_lop == PL_oldoldbufptr || PL_last_uni == PL_oldoldbufptr)
3342 PL_oldbufptr = PL_oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e 3343 else
3280af22 3344 PL_expect = XTERM;
4a202259 3345 s = skipspace(s);
a0d0e21e 3346 TOKEN('(');
378cc40b 3347 case ';':
f4dd75d9 3348 CLINE;
378cc40b
LW
3349 tmp = *s++;
3350 OPERATOR(tmp);
3351 case ')':
378cc40b 3352 tmp = *s++;
16d20bd9
AD
3353 s = skipspace(s);
3354 if (*s == '{')
3355 PREBLOCK(tmp);
378cc40b 3356 TERM(tmp);
79072805
LW
3357 case ']':
3358 s++;
3280af22 3359 if (PL_lex_brackets <= 0)
d98d5fff 3360 yyerror("Unmatched right square bracket");
463ee0b2 3361 else
3280af22
NIS
3362 --PL_lex_brackets;
3363 if (PL_lex_state == LEX_INTERPNORMAL) {
3364 if (PL_lex_brackets == 0) {
a0d0e21e 3365 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
3280af22 3366 PL_lex_state = LEX_INTERPEND;
79072805
LW
3367 }
3368 }
4633a7c4 3369 TERM(']');
79072805
LW
3370 case '{':
3371 leftbracket:
79072805 3372 s++;
3280af22 3373 if (PL_lex_brackets > 100) {
8edd5f42 3374 Renew(PL_lex_brackstack, PL_lex_brackets + 10, char);
8990e307 3375 }
3280af22 3376 switch (PL_expect) {
a0d0e21e 3377 case XTERM:
3280af22 3378 if (PL_lex_formbrack) {
a0d0e21e
LW
3379 s--;
3380 PRETERMBLOCK(DO);
3381 }
3280af22
NIS
3382 if (PL_oldoldbufptr == PL_last_lop)
3383 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 3384 else
3280af22 3385 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
79072805 3386 OPERATOR(HASHBRACK);
a0d0e21e 3387 case XOPERATOR:
bf4acbe4 3388 while (s < PL_bufend && SPACE_OR_TAB(*s))
748a9306 3389 s++;
44a8e56a 3390 d = s;
3280af22
NIS
3391 PL_tokenbuf[0] = '\0';
3392 if (d < PL_bufend && *d == '-') {
3393 PL_tokenbuf[0] = '-';
44a8e56a 3394 d++;
bf4acbe4 3395 while (d < PL_bufend && SPACE_OR_TAB(*d))
44a8e56a 3396 d++;
3397 }
7e2040f0 3398 if (d < PL_bufend && isIDFIRST_lazy_if(d,UTF)) {
3280af22 3399 d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1,
8903cb82 3400 FALSE, &len);
bf4acbe4 3401 while (d < PL_bufend && SPACE_OR_TAB(*d))
748a9306
LW
3402 d++;
3403 if (*d == '}') {
f54cb97a 3404 const char minus = (PL_tokenbuf[0] == '-');
44a8e56a 3405 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
3406 if (minus)
3407 force_next('-');
748a9306
LW
3408 }
3409 }
3410 /* FALL THROUGH */
09bef843 3411 case XATTRBLOCK:
748a9306 3412 case XBLOCK:
3280af22
NIS
3413 PL_lex_brackstack[PL_lex_brackets++] = XSTATE;
3414 PL_expect = XSTATE;
a0d0e21e 3415 break;
09bef843 3416 case XATTRTERM:
a0d0e21e 3417 case XTERMBLOCK:
3280af22
NIS
3418 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
3419 PL_expect = XSTATE;
a0d0e21e
LW
3420 break;
3421 default: {
f54cb97a 3422 const char *t;
3280af22
NIS
3423 if (PL_oldoldbufptr == PL_last_lop)
3424 PL_lex_brackstack[PL_lex_brackets++] = XTERM;
a0d0e21e 3425 else
3280af22 3426 PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR;
a0d0e21e 3427 s = skipspace(s);
8452ff4b
SB
3428 if (*s == '}') {
3429 if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) {
3430 PL_expect = XTERM;
3431 /* This hack is to get the ${} in the message. */
3432 PL_bufptr = s+1;
3433 yyerror("syntax error");
3434 break;
3435 }
a0d0e21e 3436 OPERATOR(HASHBRACK);
8452ff4b 3437 }
b8a4b1be
GS
3438 /* This hack serves to disambiguate a pair of curlies
3439 * as being a block or an anon hash. Normally, expectation
3440 * determines that, but in cases where we're not in a
3441 * position to expect anything in particular (like inside
3442 * eval"") we have to resolve the ambiguity. This code
3443 * covers the case where the first term in the curlies is a
3444 * quoted string. Most other cases need to be explicitly
a0288114 3445 * disambiguated by prepending a "+" before the opening
b8a4b1be
GS
3446 * curly in order to force resolution as an anon hash.
3447 *
3448 * XXX should probably propagate the outer expectation
3449 * into eval"" to rely less on this hack, but that could
3450 * potentially break current behavior of eval"".
3451 * GSAR 97-07-21
3452 */
3453 t = s;
3454 if (*s == '\'' || *s == '"' || *s == '`') {
3455 /* common case: get past first string, handling escapes */
3280af22 3456 for (t++; t < PL_bufend && *t != *s;)
b8a4b1be
GS
3457 if (*t++ == '\\' && (*t == '\\' || *t == *s))
3458 t++;
3459 t++;
a0d0e21e 3460 }
b8a4b1be 3461 else if (*s == 'q') {
3280af22 3462 if (++t < PL_bufend
b8a4b1be 3463 && (!isALNUM(*t)
3280af22 3464 || ((*t == 'q' || *t == 'x') && ++t < PL_bufend
0505442f
GS
3465 && !isALNUM(*t))))
3466 {
abc667d1 3467 /* skip q//-like construct */
f54cb97a 3468 const char *tmps;
b8a4b1be
GS
3469 char open, close, term;
3470 I32 brackets = 1;
3471
3280af22 3472 while (t < PL_bufend && isSPACE(*t))
b8a4b1be 3473 t++;
abc667d1
DM
3474 /* check for q => */
3475 if (t+1 < PL_bufend && t[0] == '=' && t[1] == '>') {
3476 OPERATOR(HASHBRACK);
3477 }
b8a4b1be
GS
3478 term = *t;
3479 open = term;
3480 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3481 term = tmps[5];
3482 close = term;
3483 if (open == close)
3280af22
NIS
3484 for (t++; t < PL_bufend; t++) {
3485 if (*t == '\\' && t+1 < PL_bufend && open != '\\')
b8a4b1be 3486 t++;
6d07e5e9 3487 else if (*t == open)
b8a4b1be
GS
3488 break;
3489 }
abc667d1 3490 else {
3280af22
NIS
3491 for (t++; t < PL_bufend; t++) {
3492 if (*t == '\\' && t+1 < PL_bufend)
b8a4b1be 3493 t++;
6d07e5e9 3494 else if (*t == close && --brackets <= 0)
b8a4b1be
GS
3495 break;
3496 else if (*t == open)
3497 brackets++;
3498 }
abc667d1
DM
3499 }
3500 t++;
b8a4b1be 3501 }
abc667d1
DM
3502 else
3503 /* skip plain q word */
3504 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
3505 t += UTF8SKIP(t);
a0d0e21e 3506 }
7e2040f0 3507 else if (isALNUM_lazy_if(t,UTF)) {
0505442f 3508 t += UTF8SKIP(t);
7e2040f0 3509 while (t < PL_bufend && isALNUM_lazy_if(t,UTF))
0505442f 3510 t += UTF8SKIP(t);
a0d0e21e 3511 }
3280af22 3512 while (t < PL_bufend && isSPACE(*t))
a0d0e21e 3513 t++;
b8a4b1be
GS
3514 /* if comma follows first term, call it an anon hash */
3515 /* XXX it could be a comma expression with loop modifiers */
3280af22 3516 if (t < PL_bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
b8a4b1be 3517 || (*t == '=' && t[1] == '>')))
a0d0e21e 3518 OPERATOR(HASHBRACK);
3280af22 3519 if (PL_expect == XREF)
4e4e412b 3520 PL_expect = XTERM;
a0d0e21e 3521 else {
3280af22
NIS
3522 PL_lex_brackstack[PL_lex_brackets-1] = XSTATE;
3523 PL_expect = XSTATE;
a0d0e21e 3524 }
8990e307 3525 }
a0d0e21e 3526 break;
463ee0b2 3527 }
57843af0 3528 yylval.ival = CopLINE(PL_curcop);
79072805 3529 if (isSPACE(*s) || *s == '#')
3280af22 3530 PL_copline = NOLINE; /* invalidate current command line number */
79072805 3531 TOKEN('{');
378cc40b 3532 case '}':
79072805
LW
3533 rightbracket:
3534 s++;
3280af22 3535 if (PL_lex_brackets <= 0)
d98d5fff 3536 yyerror("Unmatched right curly bracket");
463ee0b2 3537 else
3280af22 3538 PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets];
c2e66d9e 3539 if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL)
3280af22
NIS
3540 PL_lex_formbrack = 0;
3541 if (PL_lex_state == LEX_INTERPNORMAL) {
3542 if (PL_lex_brackets == 0) {
9059aa12
LW
3543 if (PL_expect & XFAKEBRACK) {
3544 PL_expect &= XENUMMASK;
3280af22
NIS
3545 PL_lex_state = LEX_INTERPEND;
3546 PL_bufptr = s;
cea2e8a9 3547 return yylex(); /* ignore fake brackets */
79072805 3548 }
fa83b5b6 3549 if (*s == '-' && s[1] == '>')
3280af22 3550 PL_lex_state = LEX_INTERPENDMAYBE;
fa83b5b6 3551 else if (*s != '[' && *s != '{')
3280af22 3552 PL_lex_state = LEX_INTERPEND;
79072805
LW
3553 }
3554 }
9059aa12
LW
3555 if (PL_expect & XFAKEBRACK) {
3556 PL_expect &= XENUMMASK;
3280af22 3557 PL_bufptr = s;
cea2e8a9 3558 return yylex(); /* ignore fake brackets */
748a9306 3559 }
79072805
LW
3560 force_next('}');
3561 TOKEN(';');
378cc40b
LW
3562 case '&':
3563 s++;
3564 tmp = *s++;
3565 if (tmp == '&')
a0d0e21e 3566 AOPERATOR(ANDAND);
378cc40b 3567 s--;
3280af22 3568 if (PL_expect == XOPERATOR) {
041457d9
DM
3569 if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
3570 && isIDFIRST_lazy_if(s,UTF))
7e2040f0 3571 {
57843af0 3572 CopLINE_dec(PL_curcop);
9014280d 3573 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 3574 CopLINE_inc(PL_curcop);
463ee0b2 3575 }
79072805 3576 BAop(OP_BIT_AND);
463ee0b2 3577 }
79072805 3578
3280af22
NIS
3579 s = scan_ident(s - 1, PL_bufend, PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
3580 if (*PL_tokenbuf) {
3581 PL_expect = XOPERATOR;
3582 force_ident(PL_tokenbuf, '&');
463ee0b2 3583 }
79072805
LW
3584 else
3585 PREREF('&');
c07a80fd 3586 yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
3587 TERM('&');
3588
378cc40b
LW
3589 case '|':
3590 s++;
3591 tmp = *s++;
3592 if (tmp == '|')
a0d0e21e 3593 AOPERATOR(OROR);
378cc40b 3594 s--;
79072805 3595 BOop(OP_BIT_OR);
378cc40b
LW
3596 case '=':
3597 s++;
3598 tmp = *s++;
3599 if (tmp == '=')
79072805
LW
3600 Eop(OP_EQ);
3601 if (tmp == '>')
3602 OPERATOR(',');
378cc40b 3603 if (tmp == '~')
79072805 3604 PMop(OP_MATCH);
ce44635a 3605 if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX) && strchr("+-*/%.^&|<",tmp))
9014280d 3606 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
378cc40b 3607 s--;
3280af22
NIS
3608 if (PL_expect == XSTATE && isALPHA(tmp) &&
3609 (s == PL_linestart+1 || s[-2] == '\n') )
748a9306 3610 {
3280af22
NIS
3611 if (PL_in_eval && !PL_rsfp) {
3612 d = PL_bufend;
a5f75d66
AD
3613 while (s < d) {
3614 if (*s++ == '\n') {
3615 incline(s);
3616 if (strnEQ(s,"=cut",4)) {
3617 s = strchr(s,'\n');
3618 if (s)
3619 s++;
3620 else
3621 s = d;
3622 incline(s);
3623 goto retry;
3624 }
3625 }
3626 }
3627 goto retry;
3628 }
3280af22
NIS
3629 s = PL_bufend;
3630 PL_doextract = TRUE;
a0d0e21e
LW
3631 goto retry;
3632 }
3280af22 3633 if (PL_lex_brackets < PL_lex_formbrack) {
f54cb97a 3634 const char *t;
51882d45 3635#ifdef PERL_STRICT_CR
bf4acbe4 3636 for (t = s; SPACE_OR_TAB(*t); t++) ;
51882d45 3637#else
bf4acbe4 3638 for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
51882d45 3639#endif
a0d0e21e
LW
3640 if (*t == '\n' || *t == '#') {
3641 s--;
3280af22 3642 PL_expect = XBLOCK;
a0d0e21e
LW
3643 goto leftbracket;
3644 }
79072805 3645 }
a0d0e21e
LW
3646 yylval.ival = 0;
3647 OPERATOR(ASSIGNOP);
378cc40b
LW
3648 case '!':
3649 s++;
3650 tmp = *s++;
984200d0 3651 if (tmp == '=') {
decca21c
YST
3652 /* was this !=~ where !~ was meant?
3653 * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
3654
984200d0 3655 if (*s == '~' && ckWARN(WARN_SYNTAX)) {
f54cb97a 3656 const char *t = s+1;
984200d0
YST
3657
3658 while (t < PL_bufend && isSPACE(*t))
3659 ++t;
3660
decca21c
YST
3661 if (*t == '/' || *t == '?' ||
3662 ((*t == 'm' || *t == 's' || *t == 'y') && !isALNUM(t[1])) ||
3663 (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
984200d0
YST
3664 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
3665 "!=~ should be !~");
3666 }
79072805 3667 Eop(OP_NE);
984200d0 3668 }
378cc40b 3669 if (tmp == '~')
79072805 3670 PMop(OP_NOT);
378cc40b
LW
3671 s--;
3672 OPERATOR('!');
3673 case '<':
3280af22 3674 if (PL_expect != XOPERATOR) {
93a17b20 3675 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 3676 check_uni();
79072805
LW
3677 if (s[1] == '<')
3678 s = scan_heredoc(s);
3679 else
3680 s = scan_inputsymbol(s);
3681 TERM(sublex_start());
378cc40b
LW
3682 }
3683 s++;
3684 tmp = *s++;
3685 if (tmp == '<')
79072805 3686 SHop(OP_LEFT_SHIFT);
395c3793
LW
3687 if (tmp == '=') {
3688 tmp = *s++;
3689 if (tmp == '>')
79072805 3690 Eop(OP_NCMP);
395c3793 3691 s--;
79072805 3692 Rop(OP_LE);
395c3793 3693 }
378cc40b 3694 s--;
79072805 3695 Rop(OP_LT);
378cc40b
LW
3696 case '>':
3697 s++;
3698 tmp = *s++;
3699 if (tmp == '>')
79072805 3700 SHop(OP_RIGHT_SHIFT);
378cc40b 3701 if (tmp == '=')
79072805 3702 Rop(OP_GE);
378cc40b 3703 s--;
79072805 3704 Rop(OP_GT);
378cc40b
LW
3705
3706 case '$':
bbce6d69 3707 CLINE;
3708
3280af22
NIS
3709 if (PL_expect == XOPERATOR) {
3710 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3711 PL_expect = XTERM;
a0d0e21e 3712 depcom();
bbf60fe6 3713 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 3714 }
8990e307 3715 }
a0d0e21e 3716
7e2040f0 3717 if (s[1] == '#' && (isIDFIRST_lazy_if(s+2,UTF) || strchr("{$:+-", s[2]))) {
3280af22 3718 PL_tokenbuf[0] = '@';
376b8730
SM
3719 s = scan_ident(s + 1, PL_bufend, PL_tokenbuf + 1,
3720 sizeof PL_tokenbuf - 1, FALSE);
3721 if (PL_expect == XOPERATOR)
3722 no_op("Array length", s);
3280af22 3723 if (!PL_tokenbuf[1])
a0d0e21e 3724 PREREF(DOLSHARP);
3280af22
NIS
3725 PL_expect = XOPERATOR;
3726 PL_pending_ident = '#';
463ee0b2 3727 TOKEN(DOLSHARP);
79072805 3728 }
bbce6d69 3729
3280af22 3730 PL_tokenbuf[0] = '$';
376b8730
SM
3731 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
3732 sizeof PL_tokenbuf - 1, FALSE);
3733 if (PL_expect == XOPERATOR)
3734 no_op("Scalar", s);
3280af22
NIS
3735 if (!PL_tokenbuf[1]) {
3736 if (s == PL_bufend)
bbce6d69 3737 yyerror("Final $ should be \\$ or $name");
3738 PREREF('$');
8990e307 3739 }
a0d0e21e 3740
bbce6d69 3741 /* This kludge not intended to be bulletproof. */
3280af22 3742 if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
bbce6d69 3743 yylval.opval = newSVOP(OP_CONST, 0,
b448e4fe 3744 newSViv(PL_compiling.cop_arybase));
bbce6d69 3745 yylval.opval->op_private = OPpCONST_ARYBASE;
3746 TERM(THING);
3747 }
3748
ff68c719 3749 d = s;
69d2bceb 3750 tmp = (I32)*s;
3280af22 3751 if (PL_lex_state == LEX_NORMAL)
ff68c719 3752 s = skipspace(s);
3753
3280af22 3754 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3755 if (*s == '[') {
3280af22 3756 PL_tokenbuf[0] = '@';
599cee73 3757 if (ckWARN(WARN_SYNTAX)) {
b64e5050 3758 char *t;
bbce6d69 3759 for(t = s + 1;
7e2040f0 3760 isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
bbce6d69 3761 t++) ;
a0d0e21e 3762 if (*t++ == ',') {
3280af22
NIS
3763 PL_bufptr = skipspace(PL_bufptr);
3764 while (t < PL_bufend && *t != ']')
bbce6d69 3765 t++;
9014280d 3766 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73
PM
3767 "Multidimensional syntax %.*s not supported",
3768 (t - PL_bufptr) + 1, PL_bufptr);
a0d0e21e
LW
3769 }
3770 }
bbce6d69 3771 }
3772 else if (*s == '{') {
b64e5050 3773 char *t;
3280af22 3774 PL_tokenbuf[0] = '%';
ce44635a
DM
3775 if (strEQ(PL_tokenbuf+1, "SIG") && ckWARN(WARN_SYNTAX)
3776 && (t = strchr(s, '}')) && (t = strchr(t, '=')))
bbce6d69 3777 {
3280af22 3778 char tmpbuf[sizeof PL_tokenbuf];
a0d0e21e 3779 for (t++; isSPACE(*t); t++) ;
7e2040f0 3780 if (isIDFIRST_lazy_if(t,UTF)) {
f54cb97a 3781 STRLEN len;
8903cb82 3782 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
59a6d928 3783 for (; isSPACE(*t); t++) ;
864dbfa3 3784 if (*t == ';' && get_cv(tmpbuf, FALSE))
9014280d 3785 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 3786 "You need to quote \"%s\"", tmpbuf);
748a9306 3787 }
93a17b20
LW
3788 }
3789 }
2f3197b3 3790 }
bbce6d69 3791
3280af22 3792 PL_expect = XOPERATOR;
69d2bceb 3793 if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
f54cb97a 3794 const bool islop = (PL_last_lop == PL_oldoldbufptr);
3280af22
NIS
3795 if (!islop || PL_last_lop_op == OP_GREPSTART)
3796 PL_expect = XOPERATOR;
bbce6d69 3797 else if (strchr("$@\"'`q", *s))
3280af22 3798 PL_expect = XTERM; /* e.g. print $fh "foo" */
7e2040f0 3799 else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
3280af22 3800 PL_expect = XTERM; /* e.g. print $fh &sub */
7e2040f0 3801 else if (isIDFIRST_lazy_if(s,UTF)) {
3280af22 3802 char tmpbuf[sizeof PL_tokenbuf];
8903cb82 3803 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
155aba94 3804 if ((tmp = keyword(tmpbuf, len))) {
84902520
TB
3805 /* binary operators exclude handle interpretations */
3806 switch (tmp) {
3807 case -KEY_x:
3808 case -KEY_eq:
3809 case -KEY_ne:
3810 case -KEY_gt:
3811 case -KEY_lt:
3812 case -KEY_ge:
3813 case -KEY_le:
3814 case -KEY_cmp:
3815 break;
3816 default:
3280af22 3817 PL_expect = XTERM; /* e.g. print $fh length() */
84902520
TB
3818 break;
3819 }
3820 }
68dc0745 3821 else {
8a8635f0 3822 PL_expect = XTERM; /* e.g. print $fh subr() */
93a17b20 3823 }
93a17b20 3824 }
bbce6d69 3825 else if (isDIGIT(*s))
3280af22 3826 PL_expect = XTERM; /* e.g. print $fh 3 */
bbce6d69 3827 else if (*s == '.' && isDIGIT(s[1]))
3280af22 3828 PL_expect = XTERM; /* e.g. print $fh .3 */
3792a11b
NC
3829 else if ((*s == '?' || *s == '-' || *s == '+')
3830 && !isSPACE(s[1]) && s[1] != '=')
c963b151 3831 PL_expect = XTERM; /* e.g. print $fh -1 */
7ce6e6b9
RGS
3832 else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
3833 PL_expect = XTERM; /* e.g. print $fh /.../
3834 XXX except DORDOR operator */
e0587a03 3835 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
3280af22 3836 PL_expect = XTERM; /* print $fh <<"EOF" */
bbce6d69 3837 }
3280af22 3838 PL_pending_ident = '$';
79072805 3839 TOKEN('$');
378cc40b
LW
3840
3841 case '@':
3280af22 3842 if (PL_expect == XOPERATOR)
bbce6d69 3843 no_op("Array", s);
3280af22
NIS
3844 PL_tokenbuf[0] = '@';
3845 s = scan_ident(s, PL_bufend, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
3846 if (!PL_tokenbuf[1]) {
bbce6d69 3847 PREREF('@');
3848 }
3280af22 3849 if (PL_lex_state == LEX_NORMAL)
ff68c719 3850 s = skipspace(s);
3280af22 3851 if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
bbce6d69 3852 if (*s == '{')
3280af22 3853 PL_tokenbuf[0] = '%';
a0d0e21e
LW
3854
3855 /* Warn about @ where they meant $. */
041457d9
DM
3856 if (*s == '[' || *s == '{') {
3857 if (ckWARN(WARN_SYNTAX)) {
f54cb97a 3858 const char *t = s + 1;
7e2040f0 3859 while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
a0d0e21e
LW
3860 t++;
3861 if (*t == '}' || *t == ']') {
3862 t++;
3280af22 3863 PL_bufptr = skipspace(PL_bufptr);
9014280d 3864 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
599cee73 3865 "Scalar value %.*s better written as $%.*s",
3280af22 3866 t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
a0d0e21e 3867 }
93a17b20
LW
3868 }
3869 }
463ee0b2 3870 }
3280af22 3871 PL_pending_ident = '@';
79072805 3872 TERM('@');
378cc40b 3873
c963b151 3874 case '/': /* may be division, defined-or, or pattern */
6f33ba73
RGS
3875 if (PL_expect == XTERMORDORDOR && s[1] == '/') {
3876 s += 2;
3877 AOPERATOR(DORDOR);
3878 }
c963b151
BD
3879 case '?': /* may either be conditional or pattern */
3880 if(PL_expect == XOPERATOR) {
3881 tmp = *s++;
3882 if(tmp == '?') {
3883 OPERATOR('?');
3884 }
3885 else {
3886 tmp = *s++;
3887 if(tmp == '/') {
3888 /* A // operator. */
3889 AOPERATOR(DORDOR);
3890 }
3891 else {
3892 s--;
3893 Mop(OP_DIVIDE);
3894 }
3895 }
3896 }
3897 else {
3898 /* Disable warning on "study /blah/" */
3899 if (PL_oldoldbufptr == PL_last_uni
3900 && (*PL_last_uni != 's' || s - PL_last_uni < 5
3901 || memNE(PL_last_uni, "study", 5)
3902 || isALNUM_lazy_if(PL_last_uni+5,UTF)
3903 ))
3904 check_uni();
3905 s = scan_pat(s,OP_MATCH);
3906 TERM(sublex_start());
3907 }
378cc40b
LW
3908
3909 case '.':
51882d45
GS
3910 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
3911#ifdef PERL_STRICT_CR
3912 && s[1] == '\n'
3913#else
3914 && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))
3915#endif
3916 && (s == PL_linestart || s[-1] == '\n') )
3917 {
3280af22
NIS
3918 PL_lex_formbrack = 0;
3919 PL_expect = XSTATE;
79072805
LW
3920 goto rightbracket;
3921 }
3280af22 3922 if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
378cc40b 3923 tmp = *s++;
a687059c
LW
3924 if (*s == tmp) {
3925 s++;
2f3197b3
LW
3926 if (*s == tmp) {
3927 s++;
79072805 3928 yylval.ival = OPf_SPECIAL;
2f3197b3
LW
3929 }
3930 else
79072805 3931 yylval.ival = 0;
378cc40b 3932 OPERATOR(DOTDOT);
a687059c 3933 }
3280af22 3934 if (PL_expect != XOPERATOR)
2f3197b3 3935 check_uni();
79072805 3936 Aop(OP_CONCAT);
378cc40b
LW
3937 }
3938 /* FALL THROUGH */
3939 case '0': case '1': case '2': case '3': case '4':
3940 case '5': case '6': case '7': case '8': case '9':
b73d6f50 3941 s = scan_num(s, &yylval);
b6007c36 3942 DEBUG_T( { S_printbuf(aTHX_ "### Saw number in %s\n", s); } );
3280af22 3943 if (PL_expect == XOPERATOR)
8990e307 3944 no_op("Number",s);
79072805
LW
3945 TERM(THING);
3946
3947 case '\'':
09bef843 3948 s = scan_str(s,FALSE,FALSE);
b6007c36 3949 DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
3280af22
NIS
3950 if (PL_expect == XOPERATOR) {
3951 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3952 PL_expect = XTERM;
a0d0e21e 3953 depcom();
bbf60fe6 3954 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 3955 }
463ee0b2 3956 else
8990e307 3957 no_op("String",s);
463ee0b2 3958 }
79072805 3959 if (!s)
85e6fe83 3960 missingterm((char*)0);
79072805
LW
3961 yylval.ival = OP_CONST;
3962 TERM(sublex_start());
3963
3964 case '"':
09bef843 3965 s = scan_str(s,FALSE,FALSE);
b6007c36 3966 DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
3280af22
NIS
3967 if (PL_expect == XOPERATOR) {
3968 if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
3969 PL_expect = XTERM;
a0d0e21e 3970 depcom();
bbf60fe6 3971 return REPORT(','); /* grandfather non-comma-format format */
a0d0e21e 3972 }
463ee0b2 3973 else
8990e307 3974 no_op("String",s);
463ee0b2 3975 }
79072805 3976 if (!s)
85e6fe83 3977 missingterm((char*)0);
4633a7c4 3978 yylval.ival = OP_CONST;
cfd0369c
NC
3979 /* FIXME. I think that this can be const if char *d is replaced by
3980 more localised variables. */
3280af22 3981 for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
63cd0674 3982 if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
4633a7c4
LW
3983 yylval.ival = OP_STRINGIFY;
3984 break;
3985 }
3986 }
79072805
LW
3987 TERM(sublex_start());
3988
3989 case '`':
09bef843 3990 s = scan_str(s,FALSE,FALSE);
b6007c36 3991 DEBUG_T( { S_printbuf(aTHX_ "### Saw backtick string before %s\n", s); } );
3280af22 3992 if (PL_expect == XOPERATOR)
8990e307 3993 no_op("Backticks",s);
79072805 3994 if (!s)
85e6fe83 3995 missingterm((char*)0);
79072805
LW
3996 yylval.ival = OP_BACKTICK;
3997 set_csh();
3998 TERM(sublex_start());
3999
4000 case '\\':
4001 s++;
041457d9 4002 if (PL_lex_inwhat && isDIGIT(*s) && ckWARN(WARN_SYNTAX))
9014280d 4003 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
599cee73 4004 *s, *s);
3280af22 4005 if (PL_expect == XOPERATOR)
8990e307 4006 no_op("Backslash",s);
79072805
LW
4007 OPERATOR(REFGEN);
4008
a7cb1f99 4009 case 'v':
e526c9e6 4010 if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
f54cb97a 4011 char *start = s + 2;
dd629d5b 4012 while (isDIGIT(*start) || *start == '_')
a7cb1f99
GS
4013 start++;
4014 if (*start == '.' && isDIGIT(start[1])) {
b73d6f50 4015 s = scan_num(s, &yylval);
a7cb1f99
GS
4016 TERM(THING);
4017 }
e526c9e6 4018 /* avoid v123abc() or $h{v1}, allow C<print v10;> */
6f33ba73
RGS
4019 else if (!isALPHA(*start) && (PL_expect == XTERM
4020 || PL_expect == XREF || PL_expect == XSTATE
4021 || PL_expect == XTERMORDORDOR)) {
f54cb97a 4022 const char c = *start;
e526c9e6
GS
4023 GV *gv;
4024 *start = '\0';
4025 gv = gv_fetchpv(s, FALSE, SVt_PVCV);
4026 *start = c;
4027 if (!gv) {
b73d6f50 4028 s = scan_num(s, &yylval);
e526c9e6
GS
4029 TERM(THING);
4030 }
4031 }
a7cb1f99
GS
4032 }
4033 goto keylookup;
79072805 4034 case 'x':
3280af22 4035 if (isDIGIT(s[1]) && PL_expect == XOPERATOR) {
79072805
LW
4036 s++;
4037 Mop(OP_REPEAT);
2f3197b3 4038 }
79072805
LW
4039 goto keylookup;
4040
378cc40b 4041 case '_':
79072805
LW
4042 case 'a': case 'A':
4043 case 'b': case 'B':
4044 case 'c': case 'C':
4045 case 'd': case 'D':
4046 case 'e': case 'E':
4047 case 'f': case 'F':
4048 case 'g': case 'G':
4049 case 'h': case 'H':
4050 case 'i': case 'I':
4051 case 'j': case 'J':
4052 case 'k': case 'K':
4053 case 'l': case 'L':
4054 case 'm': case 'M':
4055 case 'n': case 'N':
4056 case 'o': case 'O':
4057 case 'p': case 'P':
4058 case 'q': case 'Q':
4059 case 'r': case 'R':
4060 case 's': case 'S':
4061 case 't': case 'T':
4062 case 'u': case 'U':
a7cb1f99 4063 case 'V':
79072805
LW
4064 case 'w': case 'W':
4065 case 'X':
4066 case 'y': case 'Y':
4067 case 'z': case 'Z':
4068
49dc05e3 4069 keylookup: {
1d239bbb 4070 orig_keyword = 0;
161b471a
NIS
4071 gv = Nullgv;
4072 gvp = 0;
49dc05e3 4073
3280af22
NIS
4074 PL_bufptr = s;
4075 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
8ebc5c01 4076
4077 /* Some keywords can be followed by any delimiter, including ':' */
155aba94
GS
4078 tmp = ((len == 1 && strchr("msyq", PL_tokenbuf[0])) ||
4079 (len == 2 && ((PL_tokenbuf[0] == 't' && PL_tokenbuf[1] == 'r') ||
4080 (PL_tokenbuf[0] == 'q' &&
4081 strchr("qwxr", PL_tokenbuf[1])))));
8ebc5c01 4082
4083 /* x::* is just a word, unless x is "CORE" */
3280af22 4084 if (!tmp && *s == ':' && s[1] == ':' && strNE(PL_tokenbuf, "CORE"))
4633a7c4
LW
4085 goto just_a_word;
4086
3643fb5f 4087 d = s;
3280af22 4088 while (d < PL_bufend && isSPACE(*d))
3643fb5f
CS
4089 d++; /* no comments skipped here, or s### is misparsed */
4090
4091 /* Is this a label? */
3280af22
NIS
4092 if (!tmp && PL_expect == XSTATE
4093 && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
8ebc5c01 4094 s = d + 1;
3280af22 4095 yylval.pval = savepv(PL_tokenbuf);
8ebc5c01 4096 CLINE;
4097 TOKEN(LABEL);
3643fb5f
CS
4098 }
4099
4100 /* Check for keywords */
3280af22 4101 tmp = keyword(PL_tokenbuf, len);
748a9306
LW
4102
4103 /* Is this a word before a => operator? */
1c3923b3 4104 if (*d == '=' && d[1] == '>') {
748a9306 4105 CLINE;
d0a148a6
NC
4106 yylval.opval
4107 = (OP*)newSVOP(OP_CONST, 0,
4108 S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
748a9306
LW
4109 yylval.opval->op_private = OPpCONST_BARE;
4110 TERM(WORD);
4111 }
4112
a0d0e21e 4113 if (tmp < 0) { /* second-class keyword? */
56f7f34b
CS
4114 GV *ogv = Nullgv; /* override (winner) */
4115 GV *hgv = Nullgv; /* hidden (loser) */
3280af22 4116 if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
56f7f34b 4117 CV *cv;
3280af22 4118 if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
56f7f34b
CS
4119 (cv = GvCVu(gv)))
4120 {
4121 if (GvIMPORTED_CV(gv))
4122 ogv = gv;
4123 else if (! CvMETHOD(cv))
4124 hgv = gv;
4125 }
4126 if (!ogv &&
3280af22
NIS
4127 (gvp = (GV**)hv_fetch(PL_globalstash,PL_tokenbuf,len,FALSE)) &&
4128 (gv = *gvp) != (GV*)&PL_sv_undef &&
56f7f34b
CS
4129 GvCVu(gv) && GvIMPORTED_CV(gv))
4130 {
4131 ogv = gv;
4132 }
4133 }
4134 if (ogv) {
30fe34ed 4135 orig_keyword = tmp;
56f7f34b 4136 tmp = 0; /* overridden by import or by GLOBAL */
6e7b2336
GS
4137 }
4138 else if (gv && !gvp
4139 && -tmp==KEY_lock /* XXX generalizable kludge */
d0456cad 4140 && GvCVu(gv)
3280af22 4141 && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
6e7b2336
GS
4142 {
4143 tmp = 0; /* any sub overrides "weak" keyword */
a0d0e21e 4144 }
7fc307b5
RGS
4145 else if (gv && !gvp
4146 && tmp == -KEY_err
4147 && GvCVu(gv)
4148 && PL_expect != XOPERATOR
4149 && PL_expect != XTERMORDORDOR)
4150 {
4151 /* any sub overrides the "err" keyword, except when really an
4152 * operator is expected */
4153 tmp = 0;
4154 }
56f7f34b
CS
4155 else { /* no override */
4156 tmp = -tmp;
ac206dc8 4157 if (tmp == KEY_dump && ckWARN(WARN_MISC)) {
9014280d 4158 Perl_warner(aTHX_ packWARN(WARN_MISC),
ac206dc8
RGS
4159 "dump() better written as CORE::dump()");
4160 }
56f7f34b
CS
4161 gv = Nullgv;
4162 gvp = 0;
041457d9
DM
4163 if (hgv && tmp != KEY_x && tmp != KEY_CORE
4164 && ckWARN(WARN_AMBIGUOUS)) /* never ambiguous */
9014280d 4165 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 4166 "Ambiguous call resolved as CORE::%s(), %s",
2f3ca594 4167 GvENAME(hgv), "qualify as such or use &");
49dc05e3 4168 }
a0d0e21e
LW
4169 }
4170
4171 reserved_word:
4172 switch (tmp) {
79072805
LW
4173
4174 default: /* not a keyword */
93a17b20 4175 just_a_word: {
96e4d5b1 4176 SV *sv;
ce29ac45 4177 int pkgname = 0;
f54cb97a 4178 const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
8990e307
LW
4179
4180 /* Get the rest if it looks like a package qualifier */
4181
155aba94 4182 if (*s == '\'' || (*s == ':' && s[1] == ':')) {
c3e0f903 4183 STRLEN morelen;
3280af22 4184 s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len,
c3e0f903
GS
4185 TRUE, &morelen);
4186 if (!morelen)
cea2e8a9 4187 Perl_croak(aTHX_ "Bad name after %s%s", PL_tokenbuf,
ec2ab091 4188 *s == '\'' ? "'" : "::");
c3e0f903 4189 len += morelen;
ce29ac45 4190 pkgname = 1;
a0d0e21e 4191 }
8990e307 4192
3280af22
NIS
4193 if (PL_expect == XOPERATOR) {
4194 if (PL_bufptr == PL_linestart) {
57843af0 4195 CopLINE_dec(PL_curcop);
9014280d 4196 Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
57843af0 4197 CopLINE_inc(PL_curcop);
463ee0b2
LW
4198 }
4199 else
54310121 4200 no_op("Bareword",s);
463ee0b2 4201 }
8990e307 4202
c3e0f903
GS
4203 /* Look for a subroutine with this name in current package,
4204 unless name is "Foo::", in which case Foo is a bearword
4205 (and a package name). */
4206
4207 if (len > 2 &&
3280af22 4208 PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
c3e0f903 4209 {
e476b1b5 4210 if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
9014280d 4211 Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
599cee73 4212 "Bareword \"%s\" refers to nonexistent package",
3280af22 4213 PL_tokenbuf);
c3e0f903 4214 len -= 2;
3280af22 4215 PL_tokenbuf[len] = '\0';
c3e0f903
GS
4216 gv = Nullgv;
4217 gvp = 0;
4218 }
4219 else {
4220 len = 0;
4221 if (!gv)
3280af22 4222 gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
c3e0f903
GS
4223 }
4224
4225 /* if we saw a global override before, get the right name */
8990e307 4226
49dc05e3 4227 if (gvp) {
79cb57f6 4228 sv = newSVpvn("CORE::GLOBAL::",14);
3280af22 4229 sv_catpv(sv,PL_tokenbuf);
49dc05e3 4230 }
8a7a129d
NC
4231 else {
4232 /* If len is 0, newSVpv does strlen(), which is correct.
4233 If len is non-zero, then it will be the true length,
4234 and so the scalar will be created correctly. */
4235 sv = newSVpv(PL_tokenbuf,len);
4236 }
8990e307 4237
a0d0e21e
LW
4238 /* Presume this is going to be a bareword of some sort. */
4239
4240 CLINE;
49dc05e3 4241 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
a0d0e21e 4242 yylval.opval->op_private = OPpCONST_BARE;
8f8cf39c
JH
4243 /* UTF-8 package name? */
4244 if (UTF && !IN_BYTES &&
95a20fc0 4245 is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
8f8cf39c 4246 SvUTF8_on(sv);
a0d0e21e 4247
c3e0f903
GS
4248 /* And if "Foo::", then that's what it certainly is. */
4249
4250 if (len)
4251 goto safe_bareword;
4252
8990e307
LW
4253 /* See if it's the indirect object for a list operator. */
4254
3280af22
NIS
4255 if (PL_oldoldbufptr &&
4256 PL_oldoldbufptr < PL_bufptr &&
65cec589
GS
4257 (PL_oldoldbufptr == PL_last_lop
4258 || PL_oldoldbufptr == PL_last_uni) &&
a0d0e21e 4259 /* NO SKIPSPACE BEFORE HERE! */
a9ef352a
GS
4260 (PL_expect == XREF ||
4261 ((PL_opargs[PL_last_lop_op] >> OASHIFT)& 7) == OA_FILEREF))
a0d0e21e 4262 {
748a9306
LW
4263 bool immediate_paren = *s == '(';
4264
a0d0e21e
LW
4265 /* (Now we can afford to cross potential line boundary.) */
4266 s = skipspace(s);
4267
4268 /* Two barewords in a row may indicate method call. */
4269
7e2040f0 4270 if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
bbf60fe6 4271 return REPORT(tmp);
a0d0e21e
LW
4272
4273 /* If not a declared subroutine, it's an indirect object. */
4274 /* (But it's an indir obj regardless for sort.) */
4275
7948272d 4276 if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
f0670693 4277 ((!gv || !GvCVu(gv)) &&
a9ef352a 4278 (PL_last_lop_op != OP_MAPSTART &&
f0670693 4279 PL_last_lop_op != OP_GREPSTART))))
a9ef352a 4280 {
3280af22 4281 PL_expect = (PL_last_lop == PL_oldoldbufptr) ? XTERM : XOPERATOR;
748a9306 4282 goto bareword;
93a17b20
LW
4283 }
4284 }
8990e307 4285
3280af22 4286 PL_expect = XOPERATOR;
8990e307 4287 s = skipspace(s);
1c3923b3
GS
4288
4289 /* Is this a word before a => operator? */
ce29ac45 4290 if (*s == '=' && s[1] == '>' && !pkgname) {
1c3923b3
GS
4291 CLINE;
4292 sv_setpv(((SVOP*)yylval.opval)->op_sv, PL_tokenbuf);
0064a8a9 4293 if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
7948272d 4294 SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
1c3923b3
GS
4295 TERM(WORD);
4296 }
4297
4298 /* If followed by a paren, it's certainly a subroutine. */
93a17b20 4299 if (*s == '(') {
79072805 4300 CLINE;
96e4d5b1 4301 if (gv && GvCVu(gv)) {
bf4acbe4 4302 for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
7a52d87a 4303 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
96e4d5b1 4304 s = d + 1;
4305 goto its_constant;
4306 }
4307 }
3280af22
NIS
4308 PL_nextval[PL_nexttoke].opval = yylval.opval;
4309 PL_expect = XOPERATOR;
93a17b20 4310 force_next(WORD);
c07a80fd 4311 yylval.ival = 0;
463ee0b2 4312 TOKEN('&');
79072805 4313 }
93a17b20 4314
a0d0e21e 4315 /* If followed by var or block, call it a method (unless sub) */
8990e307 4316
8ebc5c01 4317 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
3280af22
NIS
4318 PL_last_lop = PL_oldbufptr;
4319 PL_last_lop_op = OP_METHOD;
93a17b20 4320 PREBLOCK(METHOD);
463ee0b2
LW
4321 }
4322
8990e307
LW
4323 /* If followed by a bareword, see if it looks like indir obj. */
4324
30fe34ed
RGS
4325 if (!orig_keyword
4326 && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
4327 && (tmp = intuit_method(s,gv)))
bbf60fe6 4328 return REPORT(tmp);
93a17b20 4329
8990e307
LW
4330 /* Not a method, so call it a subroutine (if defined) */
4331
8ebc5c01 4332 if (gv && GvCVu(gv)) {
46fc3d4c 4333 CV* cv;
0453d815 4334 if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
9014280d 4335 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4336 "Ambiguous use of -%s resolved as -&%s()",
3280af22 4337 PL_tokenbuf, PL_tokenbuf);
89bfa8cd 4338 /* Check for a constant sub */
46fc3d4c 4339 cv = GvCV(gv);
96e4d5b1 4340 if ((sv = cv_const_sv(cv))) {
4341 its_constant:
4342 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
4343 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
4344 yylval.opval->op_private = 0;
4345 TOKEN(WORD);
89bfa8cd 4346 }
4347
a5f75d66
AD
4348 /* Resolve to GV now. */
4349 op_free(yylval.opval);
4350 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
9675f7ac 4351 yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
7a52d87a 4352 PL_last_lop = PL_oldbufptr;
bf848113 4353 PL_last_lop_op = OP_ENTERSUB;
4633a7c4
LW
4354 /* Is there a prototype? */
4355 if (SvPOK(cv)) {
4356 STRLEN len;
cfd0369c 4357 const char *proto = SvPV_const((SV*)cv, len);
4633a7c4
LW
4358 if (!len)
4359 TERM(FUNC0SUB);
770526c1 4360 if (*proto == '$' && proto[1] == '\0')
4633a7c4 4361 OPERATOR(UNIOPSUB);
0f5d0394
AE
4362 while (*proto == ';')
4363 proto++;
7a52d87a 4364 if (*proto == '&' && *s == '{') {
bfed75c6 4365 sv_setpv(PL_subname, PL_curstash ?
c99da370 4366 "__ANON__" : "__ANON__::__ANON__");
4633a7c4
LW
4367 PREBLOCK(LSTOPSUB);
4368 }
a9ef352a 4369 }
3280af22
NIS
4370 PL_nextval[PL_nexttoke].opval = yylval.opval;
4371 PL_expect = XTERM;
8990e307
LW
4372 force_next(WORD);
4373 TOKEN(NOAMP);
4374 }
748a9306 4375
8990e307
LW
4376 /* Call it a bare word */
4377
5603f27d
GS
4378 if (PL_hints & HINT_STRICT_SUBS)
4379 yylval.opval->op_private |= OPpCONST_STRICT;
4380 else {
4381 bareword:
041457d9
DM
4382 if (lastchar != '-') {
4383 if (ckWARN(WARN_RESERVED)) {
5603f27d 4384 for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
238ae712 4385 if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
9014280d 4386 Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
5603f27d
GS
4387 PL_tokenbuf);
4388 }
748a9306
LW
4389 }
4390 }
c3e0f903
GS
4391
4392 safe_bareword:
3792a11b
NC
4393 if ((lastchar == '*' || lastchar == '%' || lastchar == '&')
4394 && ckWARN_d(WARN_AMBIGUOUS)) {
9014280d 4395 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4396 "Operator or semicolon missing before %c%s",
3280af22 4397 lastchar, PL_tokenbuf);
9014280d 4398 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
0453d815 4399 "Ambiguous use of %c resolved as operator %c",
748a9306
LW
4400 lastchar, lastchar);
4401 }
93a17b20 4402 TOKEN(WORD);
79072805 4403 }
79072805 4404
68dc0745 4405 case KEY___FILE__:
46fc3d4c 4406 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
ed094faf 4407 newSVpv(CopFILE(PL_curcop),0));
46fc3d4c 4408 TERM(THING);
4409
79072805 4410 case KEY___LINE__:
cf2093f6 4411 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
57843af0 4412 Perl_newSVpvf(aTHX_ "%"IVdf, (IV)CopLINE(PL_curcop)));
79072805 4413 TERM(THING);
68dc0745 4414
4415 case KEY___PACKAGE__:
4416 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3280af22 4417 (PL_curstash
5aaec2b4 4418 ? newSVhek(HvNAME_HEK(PL_curstash))
3280af22 4419 : &PL_sv_undef));
79072805 4420 TERM(THING);
79072805 4421
e50aee73 4422 case KEY___DATA__:
79072805
LW
4423 case KEY___END__: {
4424 GV *gv;
3280af22 4425 if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
bfed75c6 4426 const char *pname = "main";
3280af22 4427 if (PL_tokenbuf[2] == 'D')
bfcb3514 4428 pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
cea2e8a9 4429 gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
a5f75d66 4430 GvMULTI_on(gv);
79072805 4431 if (!GvIO(gv))
a0d0e21e 4432 GvIOp(gv) = newIO();
3280af22 4433 IoIFP(GvIOp(gv)) = PL_rsfp;
a0d0e21e
LW
4434#if defined(HAS_FCNTL) && defined(F_SETFD)
4435 {
f54cb97a 4436 const int fd = PerlIO_fileno(PL_rsfp);
a0d0e21e
LW
4437 fcntl(fd,F_SETFD,fd >= 3);
4438 }
79072805 4439#endif
fd049845 4440 /* Mark this internal pseudo-handle as clean */
4441 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3280af22 4442 if (PL_preprocess)
50952442 4443 IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
3280af22 4444 else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
50952442 4445 IoTYPE(GvIOp(gv)) = IoTYPE_STD;
79072805 4446 else
50952442 4447 IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
c39cd008
GS
4448#if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
4449 /* if the script was opened in binmode, we need to revert
53129d29 4450 * it to text mode for compatibility; but only iff it has CRs
c39cd008 4451 * XXX this is a questionable hack at best. */
53129d29
GS
4452 if (PL_bufend-PL_bufptr > 2
4453 && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
c39cd008
GS
4454 {
4455 Off_t loc = 0;
50952442 4456 if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
c39cd008
GS
4457 loc = PerlIO_tell(PL_rsfp);
4458 (void)PerlIO_seek(PL_rsfp, 0L, 0);
4459 }
2986a63f
JH
4460#ifdef NETWARE
4461 if (PerlLIO_setmode(PL_rsfp, O_TEXT) != -1) {
4462#else
c39cd008 4463 if (PerlLIO_setmode(PerlIO_fileno(PL_rsfp), O_TEXT) != -1) {
2986a63f 4464#endif /* NETWARE */
1143fce0
JH
4465#ifdef PERLIO_IS_STDIO /* really? */
4466# if defined(__BORLANDC__)
cb359b41
JH
4467 /* XXX see note in do_binmode() */
4468 ((FILE*)PL_rsfp)->flags &= ~_F_BIN;
1143fce0
JH
4469# endif
4470#endif
c39cd008
GS
4471 if (loc > 0)
4472 PerlIO_seek(PL_rsfp, loc, 0);
4473 }
4474 }
4475#endif
7948272d 4476#ifdef PERLIO_LAYERS
52d2e0f4
JH
4477 if (!IN_BYTES) {
4478 if (UTF)
4479 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL, ":utf8");
4480 else if (PL_encoding) {
4481 SV *name;
4482 dSP;
4483 ENTER;
4484 SAVETMPS;
4485 PUSHMARK(sp);
4486 EXTEND(SP, 1);
4487 XPUSHs(PL_encoding);
4488 PUTBACK;
4489 call_method("name", G_SCALAR);
4490 SPAGAIN;
4491 name = POPs;
4492 PUTBACK;
bfed75c6 4493 PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
52d2e0f4
JH
4494 Perl_form(aTHX_ ":encoding(%"SVf")",
4495 name));
4496 FREETMPS;
4497 LEAVE;
4498 }
4499 }
7948272d 4500#endif
3280af22 4501 PL_rsfp = Nullfp;
79072805
LW
4502 }
4503 goto fake_eof;
e929a76b 4504 }
de3bb511 4505
8990e307 4506 case KEY_AUTOLOAD:
ed6116ce 4507 case KEY_DESTROY:
79072805 4508 case KEY_BEGIN:
7d30b5c4 4509 case KEY_CHECK:
7d07dbc2 4510 case KEY_INIT:
7d30b5c4 4511 case KEY_END:
3280af22
NIS
4512 if (PL_expect == XSTATE) {
4513 s = PL_bufptr;
93a17b20 4514 goto really_sub;
79072805
LW
4515 }
4516 goto just_a_word;
4517
a0d0e21e
LW
4518 case KEY_CORE:
4519 if (*s == ':' && s[1] == ':') {
4520 s += 2;
748a9306 4521 d = s;
3280af22 4522 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
6798c92b
GS
4523 if (!(tmp = keyword(PL_tokenbuf, len)))
4524 Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
a0d0e21e
LW
4525 if (tmp < 0)
4526 tmp = -tmp;
850e8516 4527 else if (tmp == KEY_require || tmp == KEY_do)
a72a1c8b 4528 /* that's a way to remember we saw "CORE::" */
850e8516 4529 orig_keyword = tmp;
a0d0e21e
LW
4530 goto reserved_word;
4531 }
4532 goto just_a_word;
4533
463ee0b2
LW
4534 case KEY_abs:
4535 UNI(OP_ABS);
4536
79072805
LW
4537 case KEY_alarm:
4538 UNI(OP_ALARM);
4539
4540 case KEY_accept:
a0d0e21e 4541 LOP(OP_ACCEPT,XTERM);
79072805 4542
463ee0b2
LW
4543 case KEY_and:
4544 OPERATOR(ANDOP);
4545
79072805 4546 case KEY_atan2:
a0d0e21e 4547 LOP(OP_ATAN2,XTERM);
85e6fe83 4548
79072805 4549 case KEY_bind:
a0d0e21e 4550 LOP(OP_BIND,XTERM);
79072805
LW
4551
4552 case KEY_binmode:
1c1fc3ea 4553 LOP(OP_BINMODE,XTERM);
79072805
LW
4554
4555 case KEY_bless:
a0d0e21e 4556 LOP(OP_BLESS,XTERM);
79072805
LW
4557
4558 case KEY_chop:
4559 UNI(OP_CHOP);
4560
4561 case KEY_continue:
4562 PREBLOCK(CONTINUE);
4563
4564 case KEY_chdir:
85e6fe83 4565 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
79072805
LW
4566 UNI(OP_CHDIR);
4567
4568 case KEY_close:
4569 UNI(OP_CLOSE);
4570
4571 case KEY_closedir:
4572 UNI(OP_CLOSEDIR);
4573
4574 case KEY_cmp:
4575 Eop(OP_SCMP);
4576
4577 case KEY_caller:
4578 UNI(OP_CALLER);
4579
4580 case KEY_crypt:
4581#ifdef FCRYPT
f4c556ac
GS
4582 if (!PL_cryptseen) {
4583 PL_cryptseen = TRUE;
de3bb511 4584 init_des();
f4c556ac 4585 }
a687059c 4586#endif
a0d0e21e 4587 LOP(OP_CRYPT,XTERM);
79072805
LW
4588
4589 case KEY_chmod:
a0d0e21e 4590 LOP(OP_CHMOD,XTERM);
79072805
LW
4591
4592 case KEY_chown:
a0d0e21e 4593 LOP(OP_CHOWN,XTERM);
79072805
LW
4594
4595 case KEY_connect:
a0d0e21e 4596 LOP(OP_CONNECT,XTERM);
79072805 4597
463ee0b2
LW
4598 case KEY_chr:
4599 UNI(OP_CHR);
4600
79072805
LW
4601 case KEY_cos:
4602 UNI(OP_COS);
4603
4604 case KEY_chroot:
4605 UNI(OP_CHROOT);
4606
4607 case KEY_do:
4608 s = skipspace(s);
4609 if (*s == '{')
a0d0e21e 4610 PRETERMBLOCK(DO);
79072805 4611 if (*s != '\'')
89c5585f 4612 s = force_word(s,WORD,TRUE,TRUE,FALSE);
850e8516
RGS
4613 if (orig_keyword == KEY_do) {
4614 orig_keyword = 0;
4615 yylval.ival = 1;
4616 }
4617 else
4618 yylval.ival = 0;
378cc40b 4619 OPERATOR(DO);
79072805
LW
4620
4621 case KEY_die:
3280af22 4622 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 4623 LOP(OP_DIE,XTERM);
79072805
LW
4624
4625 case KEY_defined:
4626 UNI(OP_DEFINED);
4627
4628 case KEY_delete:
a0d0e21e 4629 UNI(OP_DELETE);
79072805
LW
4630
4631 case KEY_dbmopen:
a0d0e21e
LW
4632 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
4633 LOP(OP_DBMOPEN,XTERM);
79072805
LW
4634
4635 case KEY_dbmclose:
4636 UNI(OP_DBMCLOSE);
4637
4638 case KEY_dump:
a0d0e21e 4639 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4640 LOOPX(OP_DUMP);
4641
4642 case KEY_else:
4643 PREBLOCK(ELSE);
4644
4645 case KEY_elsif:
57843af0 4646 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4647 OPERATOR(ELSIF);
4648
4649 case KEY_eq:
4650 Eop(OP_SEQ);
4651
a0d0e21e
LW
4652 case KEY_exists:
4653 UNI(OP_EXISTS);
4e553d73 4654
79072805
LW
4655 case KEY_exit:
4656 UNI(OP_EXIT);
4657
4658 case KEY_eval:
79072805 4659 s = skipspace(s);
3280af22 4660 PL_expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 4661 UNIBRACK(OP_ENTEREVAL);
79072805
LW
4662
4663 case KEY_eof:
4664 UNI(OP_EOF);
4665
c963b151
BD
4666 case KEY_err:
4667 OPERATOR(DOROP);
4668
79072805
LW
4669 case KEY_exp:
4670 UNI(OP_EXP);
4671
4672 case KEY_each:
4673 UNI(OP_EACH);
4674
4675 case KEY_exec:
4676 set_csh();
a0d0e21e 4677 LOP(OP_EXEC,XREF);
79072805
LW
4678
4679 case KEY_endhostent:
4680 FUN0(OP_EHOSTENT);
4681
4682 case KEY_endnetent:
4683 FUN0(OP_ENETENT);
4684
4685 case KEY_endservent:
4686 FUN0(OP_ESERVENT);
4687
4688 case KEY_endprotoent:
4689 FUN0(OP_EPROTOENT);
4690
4691 case KEY_endpwent:
4692 FUN0(OP_EPWENT);
4693
4694 case KEY_endgrent:
4695 FUN0(OP_EGRENT);
4696
4697 case KEY_for:
4698 case KEY_foreach:
57843af0 4699 yylval.ival = CopLINE(PL_curcop);
55497cff 4700 s = skipspace(s);
7e2040f0 4701 if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) {
55497cff 4702 char *p = s;
3280af22 4703 if ((PL_bufend - p) >= 3 &&
55497cff 4704 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
4705 p += 2;
77ca0c92
LW
4706 else if ((PL_bufend - p) >= 4 &&
4707 strnEQ(p, "our", 3) && isSPACE(*(p + 3)))
4708 p += 3;
55497cff 4709 p = skipspace(p);
7e2040f0 4710 if (isIDFIRST_lazy_if(p,UTF)) {
77ca0c92
LW
4711 p = scan_ident(p, PL_bufend,
4712 PL_tokenbuf, sizeof PL_tokenbuf, TRUE);
4713 p = skipspace(p);
4714 }
4715 if (*p != '$')
cea2e8a9 4716 Perl_croak(aTHX_ "Missing $ on loop variable");
55497cff 4717 }
79072805
LW
4718 OPERATOR(FOR);
4719
4720 case KEY_formline:
a0d0e21e 4721 LOP(OP_FORMLINE,XTERM);
79072805
LW
4722
4723 case KEY_fork:
4724 FUN0(OP_FORK);
4725
4726 case KEY_fcntl:
a0d0e21e 4727 LOP(OP_FCNTL,XTERM);
79072805
LW
4728
4729 case KEY_fileno:
4730 UNI(OP_FILENO);
4731
4732 case KEY_flock:
a0d0e21e 4733 LOP(OP_FLOCK,XTERM);
79072805
LW
4734
4735 case KEY_gt:
4736 Rop(OP_SGT);
4737
4738 case KEY_ge:
4739 Rop(OP_SGE);
4740
4741 case KEY_grep:
2c38e13d 4742 LOP(OP_GREPSTART, XREF);
79072805
LW
4743
4744 case KEY_goto:
a0d0e21e 4745 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4746 LOOPX(OP_GOTO);
4747
4748 case KEY_gmtime:
4749 UNI(OP_GMTIME);
4750
4751 case KEY_getc:
6f33ba73 4752 UNIDOR(OP_GETC);
79072805
LW
4753
4754 case KEY_getppid:
4755 FUN0(OP_GETPPID);
4756
4757 case KEY_getpgrp:
4758 UNI(OP_GETPGRP);
4759
4760 case KEY_getpriority:
a0d0e21e 4761 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
4762
4763 case KEY_getprotobyname:
4764 UNI(OP_GPBYNAME);
4765
4766 case KEY_getprotobynumber:
a0d0e21e 4767 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
4768
4769 case KEY_getprotoent:
4770 FUN0(OP_GPROTOENT);
4771
4772 case KEY_getpwent:
4773 FUN0(OP_GPWENT);
4774
4775 case KEY_getpwnam:
ff68c719 4776 UNI(OP_GPWNAM);
79072805
LW
4777
4778 case KEY_getpwuid:
ff68c719 4779 UNI(OP_GPWUID);
79072805
LW
4780
4781 case KEY_getpeername:
4782 UNI(OP_GETPEERNAME);
4783
4784 case KEY_gethostbyname:
4785 UNI(OP_GHBYNAME);
4786
4787 case KEY_gethostbyaddr:
a0d0e21e 4788 LOP(OP_GHBYADDR,XTERM);
79072805
LW
4789
4790 case KEY_gethostent:
4791 FUN0(OP_GHOSTENT);
4792
4793 case KEY_getnetbyname:
4794 UNI(OP_GNBYNAME);
4795
4796 case KEY_getnetbyaddr:
a0d0e21e 4797 LOP(OP_GNBYADDR,XTERM);
79072805
LW
4798
4799 case KEY_getnetent:
4800 FUN0(OP_GNETENT);
4801
4802 case KEY_getservbyname:
a0d0e21e 4803 LOP(OP_GSBYNAME,XTERM);
79072805
LW
4804
4805 case KEY_getservbyport:
a0d0e21e 4806 LOP(OP_GSBYPORT,XTERM);
79072805
LW
4807
4808 case KEY_getservent:
4809 FUN0(OP_GSERVENT);
4810
4811 case KEY_getsockname:
4812 UNI(OP_GETSOCKNAME);
4813
4814 case KEY_getsockopt:
a0d0e21e 4815 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
4816
4817 case KEY_getgrent:
4818 FUN0(OP_GGRENT);
4819
4820 case KEY_getgrnam:
ff68c719 4821 UNI(OP_GGRNAM);
79072805
LW
4822
4823 case KEY_getgrgid:
ff68c719 4824 UNI(OP_GGRGID);
79072805
LW
4825
4826 case KEY_getlogin:
4827 FUN0(OP_GETLOGIN);
4828
93a17b20 4829 case KEY_glob:
a0d0e21e
LW
4830 set_csh();
4831 LOP(OP_GLOB,XTERM);
93a17b20 4832
79072805
LW
4833 case KEY_hex:
4834 UNI(OP_HEX);
4835
4836 case KEY_if:
57843af0 4837 yylval.ival = CopLINE(PL_curcop);
79072805
LW
4838 OPERATOR(IF);
4839
4840 case KEY_index:
a0d0e21e 4841 LOP(OP_INDEX,XTERM);
79072805
LW
4842
4843 case KEY_int:
4844 UNI(OP_INT);
4845
4846 case KEY_ioctl:
a0d0e21e 4847 LOP(OP_IOCTL,XTERM);
79072805
LW
4848
4849 case KEY_join:
a0d0e21e 4850 LOP(OP_JOIN,XTERM);
79072805
LW
4851
4852 case KEY_keys:
4853 UNI(OP_KEYS);
4854
4855 case KEY_kill:
a0d0e21e 4856 LOP(OP_KILL,XTERM);
79072805
LW
4857
4858 case KEY_last:
a0d0e21e 4859 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 4860 LOOPX(OP_LAST);
4e553d73 4861
79072805
LW
4862 case KEY_lc:
4863 UNI(OP_LC);
4864
4865 case KEY_lcfirst:
4866 UNI(OP_LCFIRST);
4867
4868 case KEY_local:
09bef843 4869 yylval.ival = 0;
79072805
LW
4870 OPERATOR(LOCAL);
4871
4872 case KEY_length:
4873 UNI(OP_LENGTH);
4874
4875 case KEY_lt:
4876 Rop(OP_SLT);
4877
4878 case KEY_le:
4879 Rop(OP_SLE);
4880
4881 case KEY_localtime:
4882 UNI(OP_LOCALTIME);
4883
4884 case KEY_log:
4885 UNI(OP_LOG);
4886
4887 case KEY_link:
a0d0e21e 4888 LOP(OP_LINK,XTERM);
79072805
LW
4889
4890 case KEY_listen:
a0d0e21e 4891 LOP(OP_LISTEN,XTERM);
79072805 4892
c0329465
MB
4893 case KEY_lock:
4894 UNI(OP_LOCK);
4895
79072805
LW
4896 case KEY_lstat:
4897 UNI(OP_LSTAT);
4898
4899 case KEY_m:
8782bef2 4900 s = scan_pat(s,OP_MATCH);
79072805
LW
4901 TERM(sublex_start());
4902
a0d0e21e 4903 case KEY_map:
2c38e13d 4904 LOP(OP_MAPSTART, XREF);
4e4e412b 4905
79072805 4906 case KEY_mkdir:
a0d0e21e 4907 LOP(OP_MKDIR,XTERM);
79072805
LW
4908
4909 case KEY_msgctl:
a0d0e21e 4910 LOP(OP_MSGCTL,XTERM);
79072805
LW
4911
4912 case KEY_msgget:
a0d0e21e 4913 LOP(OP_MSGGET,XTERM);
79072805
LW
4914
4915 case KEY_msgrcv:
a0d0e21e 4916 LOP(OP_MSGRCV,XTERM);
79072805
LW
4917
4918 case KEY_msgsnd:
a0d0e21e 4919 LOP(OP_MSGSND,XTERM);
79072805 4920
77ca0c92 4921 case KEY_our:
93a17b20 4922 case KEY_my:
77ca0c92 4923 PL_in_my = tmp;
c750a3ec 4924 s = skipspace(s);
7e2040f0 4925 if (isIDFIRST_lazy_if(s,UTF)) {
3280af22 4926 s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len);
09bef843
SB
4927 if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3))
4928 goto really_sub;
def3634b 4929 PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len);
3280af22 4930 if (!PL_in_my_stash) {
c750a3ec 4931 char tmpbuf[1024];
3280af22
NIS
4932 PL_bufptr = s;
4933 sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
c750a3ec
MB
4934 yyerror(tmpbuf);
4935 }
4936 }
09bef843 4937 yylval.ival = 1;
55497cff 4938 OPERATOR(MY);
93a17b20 4939
79072805 4940 case KEY_next:
a0d0e21e 4941 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
4942 LOOPX(OP_NEXT);
4943
4944 case KEY_ne:
4945 Eop(OP_SNE);
4946
a0d0e21e 4947 case KEY_no:
468aa647 4948 s = tokenize_use(0, s);
a0d0e21e
LW
4949 OPERATOR(USE);
4950
4951 case KEY_not:
2d2e263d
LW
4952 if (*s == '(' || (s = skipspace(s), *s == '('))
4953 FUN1(OP_NOT);
4954 else
4955 OPERATOR(NOTOP);
a0d0e21e 4956
79072805 4957 case KEY_open:
93a17b20 4958 s = skipspace(s);
7e2040f0 4959 if (isIDFIRST_lazy_if(s,UTF)) {
f54cb97a 4960 const char *t;
7e2040f0 4961 for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
e2ab214b
DM
4962 for (t=d; *t && isSPACE(*t); t++) ;
4963 if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
66fbe8fb
HS
4964 /* [perl #16184] */
4965 && !(t[0] == '=' && t[1] == '>')
4966 ) {
9014280d 4967 Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
0453d815 4968 "Precedence problem: open %.*s should be open(%.*s)",
66fbe8fb
HS
4969 d - s, s, d - s, s);
4970 }
93a17b20 4971 }
a0d0e21e 4972 LOP(OP_OPEN,XTERM);
79072805 4973
463ee0b2 4974 case KEY_or:
a0d0e21e 4975 yylval.ival = OP_OR;
463ee0b2
LW
4976 OPERATOR(OROP);
4977
79072805
LW
4978 case KEY_ord:
4979 UNI(OP_ORD);
4980
4981 case KEY_oct:
4982 UNI(OP_OCT);
4983
4984 case KEY_opendir:
a0d0e21e 4985 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
4986
4987 case KEY_print:
3280af22 4988 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4989 LOP(OP_PRINT,XREF);
79072805
LW
4990
4991 case KEY_printf:
3280af22 4992 checkcomma(s,PL_tokenbuf,"filehandle");
a0d0e21e 4993 LOP(OP_PRTF,XREF);
79072805 4994
c07a80fd 4995 case KEY_prototype:
4996 UNI(OP_PROTOTYPE);
4997
79072805 4998 case KEY_push:
a0d0e21e 4999 LOP(OP_PUSH,XTERM);
79072805
LW
5000
5001 case KEY_pop:
6f33ba73 5002 UNIDOR(OP_POP);
79072805 5003
a0d0e21e 5004 case KEY_pos:
6f33ba73 5005 UNIDOR(OP_POS);
4e553d73 5006
79072805 5007 case KEY_pack:
a0d0e21e 5008 LOP(OP_PACK,XTERM);
79072805
LW
5009
5010 case KEY_package:
a0d0e21e 5011 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
5012 OPERATOR(PACKAGE);
5013
5014 case KEY_pipe:
a0d0e21e 5015 LOP(OP_PIPE_OP,XTERM);
79072805
LW
5016
5017 case KEY_q:
09bef843 5018 s = scan_str(s,FALSE,FALSE);
79072805 5019 if (!s)
85e6fe83 5020 missingterm((char*)0);
79072805
LW
5021 yylval.ival = OP_CONST;
5022 TERM(sublex_start());
5023
a0d0e21e
LW
5024 case KEY_quotemeta:
5025 UNI(OP_QUOTEMETA);
5026
8990e307 5027 case KEY_qw:
09bef843 5028 s = scan_str(s,FALSE,FALSE);
8990e307 5029 if (!s)
85e6fe83 5030 missingterm((char*)0);
3480a8d2 5031 PL_expect = XOPERATOR;
8127e0e3
GS
5032 force_next(')');
5033 if (SvCUR(PL_lex_stuff)) {
5034 OP *words = Nullop;
5035 int warned = 0;
3280af22 5036 d = SvPV_force(PL_lex_stuff, len);
8127e0e3 5037 while (len) {
7948272d 5038 SV *sv;
8127e0e3
GS
5039 for (; isSPACE(*d) && len; --len, ++d) ;
5040 if (len) {
f54cb97a 5041 const char *b = d;
e476b1b5 5042 if (!warned && ckWARN(WARN_QW)) {
8127e0e3
GS
5043 for (; !isSPACE(*d) && len; --len, ++d) {
5044 if (*d == ',') {
9014280d 5045 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
5046 "Possible attempt to separate words with commas");
5047 ++warned;
5048 }
5049 else if (*d == '#') {
9014280d 5050 Perl_warner(aTHX_ packWARN(WARN_QW),
8127e0e3
GS
5051 "Possible attempt to put comments in qw() list");
5052 ++warned;
5053 }
5054 }
5055 }
5056 else {
5057 for (; !isSPACE(*d) && len; --len, ++d) ;
5058 }
7948272d
NIS
5059 sv = newSVpvn(b, d-b);
5060 if (DO_UTF8(PL_lex_stuff))
5061 SvUTF8_on(sv);
8127e0e3 5062 words = append_elem(OP_LIST, words,
7948272d 5063 newSVOP(OP_CONST, 0, tokeq(sv)));
55497cff 5064 }
5065 }
8127e0e3
GS
5066 if (words) {
5067 PL_nextval[PL_nexttoke].opval = words;
5068 force_next(THING);
5069 }
55497cff 5070 }
37fd879b 5071 if (PL_lex_stuff) {
8127e0e3 5072 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
5073 PL_lex_stuff = Nullsv;
5074 }
3280af22 5075 PL_expect = XTERM;
8127e0e3 5076 TOKEN('(');
8990e307 5077
79072805 5078 case KEY_qq:
09bef843 5079 s = scan_str(s,FALSE,FALSE);
79072805 5080 if (!s)
85e6fe83 5081 missingterm((char*)0);
a0d0e21e 5082 yylval.ival = OP_STRINGIFY;
3280af22 5083 if (SvIVX(PL_lex_stuff) == '\'')
45977657 5084 SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should intepolate */
79072805
LW
5085 TERM(sublex_start());
5086
8782bef2
GB
5087 case KEY_qr:
5088 s = scan_pat(s,OP_QR);
5089 TERM(sublex_start());
5090
79072805 5091 case KEY_qx:
09bef843 5092 s = scan_str(s,FALSE,FALSE);
79072805 5093 if (!s)
85e6fe83 5094 missingterm((char*)0);
79072805
LW
5095 yylval.ival = OP_BACKTICK;
5096 set_csh();
5097 TERM(sublex_start());
5098
5099 case KEY_return:
5100 OLDLOP(OP_RETURN);
5101
5102 case KEY_require:
a7cb1f99 5103 s = skipspace(s);
e759cc13
RGS
5104 if (isDIGIT(*s)) {
5105 s = force_version(s, FALSE);
a7cb1f99 5106 }
e759cc13
RGS
5107 else if (*s != 'v' || !isDIGIT(s[1])
5108 || (s = force_version(s, TRUE), *s == 'v'))
5109 {
a7cb1f99
GS
5110 *PL_tokenbuf = '\0';
5111 s = force_word(s,WORD,TRUE,TRUE,FALSE);
7e2040f0 5112 if (isIDFIRST_lazy_if(PL_tokenbuf,UTF))
a7cb1f99
GS
5113 gv_stashpvn(PL_tokenbuf, strlen(PL_tokenbuf), TRUE);
5114 else if (*s == '<')
5115 yyerror("<> should be quotes");
5116 }
a72a1c8b
RGS
5117 if (orig_keyword == KEY_require) {
5118 orig_keyword = 0;
5119 yylval.ival = 1;
5120 }
5121 else
5122 yylval.ival = 0;
5123 PL_expect = XTERM;
5124 PL_bufptr = s;
5125 PL_last_uni = PL_oldbufptr;
5126 PL_last_lop_op = OP_REQUIRE;
5127 s = skipspace(s);
5128 return REPORT( (int)REQUIRE );
79072805
LW
5129
5130 case KEY_reset:
5131 UNI(OP_RESET);
5132
5133 case KEY_redo:
a0d0e21e 5134 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
5135 LOOPX(OP_REDO);
5136
5137 case KEY_rename:
a0d0e21e 5138 LOP(OP_RENAME,XTERM);
79072805
LW
5139
5140 case KEY_rand:
5141 UNI(OP_RAND);
5142
5143 case KEY_rmdir:
5144 UNI(OP_RMDIR);
5145
5146 case KEY_rindex:
a0d0e21e 5147 LOP(OP_RINDEX,XTERM);
79072805
LW
5148
5149 case KEY_read:
a0d0e21e 5150 LOP(OP_READ,XTERM);
79072805
LW
5151
5152 case KEY_readdir:
5153 UNI(OP_READDIR);
5154
93a17b20
LW
5155 case KEY_readline:
5156 set_csh();
6f33ba73 5157 UNIDOR(OP_READLINE);
93a17b20
LW
5158
5159 case KEY_readpipe:
5160 set_csh();
5161 UNI(OP_BACKTICK);
5162
79072805
LW
5163 case KEY_rewinddir:
5164 UNI(OP_REWINDDIR);
5165
5166 case KEY_recv:
a0d0e21e 5167 LOP(OP_RECV,XTERM);
79072805
LW
5168
5169 case KEY_reverse:
a0d0e21e 5170 LOP(OP_REVERSE,XTERM);
79072805
LW
5171
5172 case KEY_readlink:
6f33ba73 5173 UNIDOR(OP_READLINK);
79072805
LW
5174
5175 case KEY_ref:
5176 UNI(OP_REF);
5177
5178 case KEY_s:
5179 s = scan_subst(s);
5180 if (yylval.opval)
5181 TERM(sublex_start());
5182 else
5183 TOKEN(1); /* force error */
5184
a0d0e21e
LW
5185 case KEY_chomp:
5186 UNI(OP_CHOMP);
4e553d73 5187
79072805
LW
5188 case KEY_scalar:
5189 UNI(OP_SCALAR);
5190
5191 case KEY_select:
a0d0e21e 5192 LOP(OP_SELECT,XTERM);
79072805
LW
5193
5194 case KEY_seek:
a0d0e21e 5195 LOP(OP_SEEK,XTERM);
79072805
LW
5196
5197 case KEY_semctl:
a0d0e21e 5198 LOP(OP_SEMCTL,XTERM);
79072805
LW
5199
5200 case KEY_semget:
a0d0e21e 5201 LOP(OP_SEMGET,XTERM);
79072805
LW
5202
5203 case KEY_semop:
a0d0e21e 5204 LOP(OP_SEMOP,XTERM);
79072805
LW
5205
5206 case KEY_send:
a0d0e21e 5207 LOP(OP_SEND,XTERM);
79072805
LW
5208
5209 case KEY_setpgrp:
a0d0e21e 5210 LOP(OP_SETPGRP,XTERM);
79072805
LW
5211
5212 case KEY_setpriority:
a0d0e21e 5213 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
5214
5215 case KEY_sethostent:
ff68c719 5216 UNI(OP_SHOSTENT);
79072805
LW
5217
5218 case KEY_setnetent:
ff68c719 5219 UNI(OP_SNETENT);
79072805
LW
5220
5221 case KEY_setservent:
ff68c719 5222 UNI(OP_SSERVENT);
79072805
LW
5223
5224 case KEY_setprotoent:
ff68c719 5225 UNI(OP_SPROTOENT);
79072805
LW
5226
5227 case KEY_setpwent:
5228 FUN0(OP_SPWENT);
5229
5230 case KEY_setgrent:
5231 FUN0(OP_SGRENT);
5232
5233 case KEY_seekdir:
a0d0e21e 5234 LOP(OP_SEEKDIR,XTERM);
79072805
LW
5235
5236 case KEY_setsockopt:
a0d0e21e 5237 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
5238
5239 case KEY_shift:
6f33ba73 5240 UNIDOR(OP_SHIFT);
79072805
LW
5241
5242 case KEY_shmctl:
a0d0e21e 5243 LOP(OP_SHMCTL,XTERM);
79072805
LW
5244
5245 case KEY_shmget:
a0d0e21e 5246 LOP(OP_SHMGET,XTERM);
79072805
LW
5247
5248 case KEY_shmread:
a0d0e21e 5249 LOP(OP_SHMREAD,XTERM);
79072805
LW
5250
5251 case KEY_shmwrite:
a0d0e21e 5252 LOP(OP_SHMWRITE,XTERM);
79072805
LW
5253
5254 case KEY_shutdown:
a0d0e21e 5255 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
5256
5257 case KEY_sin:
5258 UNI(OP_SIN);
5259
5260 case KEY_sleep:
5261 UNI(OP_SLEEP);
5262
5263 case KEY_socket:
a0d0e21e 5264 LOP(OP_SOCKET,XTERM);
79072805
LW
5265
5266 case KEY_socketpair:
a0d0e21e 5267 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
5268
5269 case KEY_sort:
3280af22 5270 checkcomma(s,PL_tokenbuf,"subroutine name");
79072805
LW
5271 s = skipspace(s);
5272 if (*s == ';' || *s == ')') /* probably a close */
cea2e8a9 5273 Perl_croak(aTHX_ "sort is now a reserved word");
3280af22 5274 PL_expect = XTERM;
15f0808c 5275 s = force_word(s,WORD,TRUE,TRUE,FALSE);
a0d0e21e 5276 LOP(OP_SORT,XREF);
79072805
LW
5277
5278 case KEY_split:
a0d0e21e 5279 LOP(OP_SPLIT,XTERM);
79072805
LW
5280
5281 case KEY_sprintf:
a0d0e21e 5282 LOP(OP_SPRINTF,XTERM);
79072805
LW
5283
5284 case KEY_splice:
a0d0e21e 5285 LOP(OP_SPLICE,XTERM);
79072805
LW
5286
5287 case KEY_sqrt:
5288 UNI(OP_SQRT);
5289
5290 case KEY_srand:
5291 UNI(OP_SRAND);
5292
5293 case KEY_stat:
5294 UNI(OP_STAT);
5295
5296 case KEY_study:
79072805
LW
5297 UNI(OP_STUDY);
5298
5299 case KEY_substr:
a0d0e21e 5300 LOP(OP_SUBSTR,XTERM);
79072805
LW
5301
5302 case KEY_format:
5303 case KEY_sub:
93a17b20 5304 really_sub:
09bef843 5305 {
3280af22 5306 char tmpbuf[sizeof PL_tokenbuf];
9c5ffd7c 5307 SSize_t tboffset = 0;
09bef843 5308 expectation attrful;
d731386a 5309 bool have_name, have_proto, bad_proto;
f54cb97a 5310 const int key = tmp;
09bef843
SB
5311
5312 s = skipspace(s);
5313
7e2040f0 5314 if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' ||
09bef843
SB
5315 (*s == ':' && s[1] == ':'))
5316 {
5317 PL_expect = XBLOCK;
5318 attrful = XATTRBLOCK;
b1b65b59
JH
5319 /* remember buffer pos'n for later force_word */
5320 tboffset = s - PL_oldbufptr;
09bef843
SB
5321 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
5322 if (strchr(tmpbuf, ':'))
5323 sv_setpv(PL_subname, tmpbuf);
5324 else {
5325 sv_setsv(PL_subname,PL_curstname);
5326 sv_catpvn(PL_subname,"::",2);
5327 sv_catpvn(PL_subname,tmpbuf,len);
5328 }
5329 s = skipspace(d);
5330 have_name = TRUE;
5331 }
463ee0b2 5332 else {
09bef843
SB
5333 if (key == KEY_my)
5334 Perl_croak(aTHX_ "Missing name in \"my sub\"");
5335 PL_expect = XTERMBLOCK;
5336 attrful = XATTRTERM;
c69006e4 5337 sv_setpvn(PL_subname,"?",1);
09bef843 5338 have_name = FALSE;
463ee0b2 5339 }
4633a7c4 5340
09bef843
SB
5341 if (key == KEY_format) {
5342 if (*s == '=')
5343 PL_lex_formbrack = PL_lex_brackets + 1;
5344 if (have_name)
b1b65b59
JH
5345 (void) force_word(PL_oldbufptr + tboffset, WORD,
5346 FALSE, TRUE, TRUE);
09bef843
SB
5347 OPERATOR(FORMAT);
5348 }
79072805 5349
09bef843
SB
5350 /* Look for a prototype */
5351 if (*s == '(') {
5352 char *p;
5353
5354 s = scan_str(s,FALSE,FALSE);
37fd879b 5355 if (!s)
09bef843 5356 Perl_croak(aTHX_ "Prototype not terminated");
2f758a16 5357 /* strip spaces and check for bad characters */
09bef843
SB
5358 d = SvPVX(PL_lex_stuff);
5359 tmp = 0;
d731386a 5360 bad_proto = FALSE;
09bef843 5361 for (p = d; *p; ++p) {
d37a9538 5362 if (!isSPACE(*p)) {
09bef843 5363 d[tmp++] = *p;
d37a9538
ST
5364 if (!strchr("$@%*;[]&\\", *p))
5365 bad_proto = TRUE;
5366 }
09bef843
SB
5367 }
5368 d[tmp] = '\0';
420cdfc1 5369 if (bad_proto && ckWARN(WARN_SYNTAX))
9014280d 5370 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
35c1215d
NC
5371 "Illegal character in prototype for %"SVf" : %s",
5372 PL_subname, d);
b162af07 5373 SvCUR_set(PL_lex_stuff, tmp);
09bef843 5374 have_proto = TRUE;
68dc0745 5375
09bef843 5376 s = skipspace(s);
4633a7c4 5377 }
09bef843
SB
5378 else
5379 have_proto = FALSE;
5380
5381 if (*s == ':' && s[1] != ':')
5382 PL_expect = attrful;
8e742a20
MHM
5383 else if (*s != '{' && key == KEY_sub) {
5384 if (!have_name)
5385 Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
5386 else if (*s != ';')
5387 Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
5388 }
09bef843
SB
5389
5390 if (have_proto) {
b1b65b59
JH
5391 PL_nextval[PL_nexttoke].opval =
5392 (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
09bef843
SB
5393 PL_lex_stuff = Nullsv;
5394 force_next(THING);
68dc0745 5395 }
09bef843 5396 if (!have_name) {
c99da370
JH
5397 sv_setpv(PL_subname,
5398 PL_curstash ? "__ANON__" : "__ANON__::__ANON__");
09bef843 5399 TOKEN(ANONSUB);
4633a7c4 5400 }
b1b65b59
JH
5401 (void) force_word(PL_oldbufptr + tboffset, WORD,
5402 FALSE, TRUE, TRUE);
09bef843
SB
5403 if (key == KEY_my)
5404 TOKEN(MYSUB);
5405 TOKEN(SUB);
4633a7c4 5406 }
79072805
LW
5407
5408 case KEY_system:
5409 set_csh();
a0d0e21e 5410 LOP(OP_SYSTEM,XREF);
79072805
LW
5411
5412 case KEY_symlink:
a0d0e21e 5413 LOP(OP_SYMLINK,XTERM);
79072805
LW
5414
5415 case KEY_syscall:
a0d0e21e 5416 LOP(OP_SYSCALL,XTERM);
79072805 5417
c07a80fd 5418 case KEY_sysopen:
5419 LOP(OP_SYSOPEN,XTERM);
5420
137443ea 5421 case KEY_sysseek:
5422 LOP(OP_SYSSEEK,XTERM);
5423
79072805 5424 case KEY_sysread:
a0d0e21e 5425 LOP(OP_SYSREAD,XTERM);
79072805
LW
5426
5427 case KEY_syswrite:
a0d0e21e 5428 LOP(OP_SYSWRITE,XTERM);
79072805
LW
5429
5430 case KEY_tr:
5431 s = scan_trans(s);
5432 TERM(sublex_start());
5433
5434 case KEY_tell:
5435 UNI(OP_TELL);
5436
5437 case KEY_telldir:
5438 UNI(OP_TELLDIR);
5439
463ee0b2 5440 case KEY_tie:
a0d0e21e 5441 LOP(OP_TIE,XTERM);
463ee0b2 5442
c07a80fd 5443 case KEY_tied:
5444 UNI(OP_TIED);
5445
79072805
LW
5446 case KEY_time:
5447 FUN0(OP_TIME);
5448
5449 case KEY_times:
5450 FUN0(OP_TMS);
5451
5452 case KEY_truncate:
a0d0e21e 5453 LOP(OP_TRUNCATE,XTERM);
79072805
LW
5454
5455 case KEY_uc:
5456 UNI(OP_UC);
5457
5458 case KEY_ucfirst:
5459 UNI(OP_UCFIRST);
5460
463ee0b2
LW
5461 case KEY_untie:
5462 UNI(OP_UNTIE);
5463
79072805 5464 case KEY_until:
57843af0 5465 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5466 OPERATOR(UNTIL);
5467
5468 case KEY_unless:
57843af0 5469 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5470 OPERATOR(UNLESS);
5471
5472 case KEY_unlink:
a0d0e21e 5473 LOP(OP_UNLINK,XTERM);
79072805
LW
5474
5475 case KEY_undef:
6f33ba73 5476 UNIDOR(OP_UNDEF);
79072805
LW
5477
5478 case KEY_unpack:
a0d0e21e 5479 LOP(OP_UNPACK,XTERM);
79072805
LW
5480
5481 case KEY_utime:
a0d0e21e 5482 LOP(OP_UTIME,XTERM);
79072805
LW
5483
5484 case KEY_umask:
6f33ba73 5485 UNIDOR(OP_UMASK);
79072805
LW
5486
5487 case KEY_unshift:
a0d0e21e
LW
5488 LOP(OP_UNSHIFT,XTERM);
5489
5490 case KEY_use:
468aa647 5491 s = tokenize_use(1, s);
a0d0e21e 5492 OPERATOR(USE);
79072805
LW
5493
5494 case KEY_values:
5495 UNI(OP_VALUES);
5496
5497 case KEY_vec:
a0d0e21e 5498 LOP(OP_VEC,XTERM);
79072805
LW
5499
5500 case KEY_while:
57843af0 5501 yylval.ival = CopLINE(PL_curcop);
79072805
LW
5502 OPERATOR(WHILE);
5503
5504 case KEY_warn:
3280af22 5505 PL_hints |= HINT_BLOCK_SCOPE;
a0d0e21e 5506 LOP(OP_WARN,XTERM);
79072805
LW
5507
5508 case KEY_wait:
5509 FUN0(OP_WAIT);
5510
5511 case KEY_waitpid:
a0d0e21e 5512 LOP(OP_WAITPID,XTERM);
79072805
LW
5513
5514 case KEY_wantarray:
5515 FUN0(OP_WANTARRAY);
5516
5517 case KEY_write:
9d116dd7
JH
5518#ifdef EBCDIC
5519 {
df3728a2
JH
5520 char ctl_l[2];
5521 ctl_l[0] = toCTRL('L');
5522 ctl_l[1] = '\0';
9d116dd7
JH
5523 gv_fetchpv(ctl_l,TRUE, SVt_PV);
5524 }
5525#else
5526 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
5527#endif
79072805
LW
5528 UNI(OP_ENTERWRITE);
5529
5530 case KEY_x:
3280af22 5531 if (PL_expect == XOPERATOR)
79072805
LW
5532 Mop(OP_REPEAT);
5533 check_uni();
5534 goto just_a_word;
5535
a0d0e21e
LW
5536 case KEY_xor:
5537 yylval.ival = OP_XOR;
5538 OPERATOR(OROP);
5539
79072805
LW
5540 case KEY_y:
5541 s = scan_trans(s);
5542 TERM(sublex_start());
5543 }
49dc05e3 5544 }}
79072805 5545}
bf4acbe4
GS
5546#ifdef __SC__
5547#pragma segment Main
5548#endif
79072805 5549
e930465f
JH
5550static int
5551S_pending_ident(pTHX)
8eceec63
SC
5552{
5553 register char *d;
a55b55d8 5554 register I32 tmp = 0;
8eceec63
SC
5555 /* pit holds the identifier we read and pending_ident is reset */
5556 char pit = PL_pending_ident;
5557 PL_pending_ident = 0;
5558
5559 DEBUG_T({ PerlIO_printf(Perl_debug_log,
b6007c36 5560 "### Pending identifier '%s'\n", PL_tokenbuf); });
8eceec63
SC
5561
5562 /* if we're in a my(), we can't allow dynamics here.
5563 $foo'bar has already been turned into $foo::bar, so
5564 just check for colons.
5565
5566 if it's a legal name, the OP is a PADANY.
5567 */
5568 if (PL_in_my) {
5569 if (PL_in_my == KEY_our) { /* "our" is merely analogous to "my" */
5570 if (strchr(PL_tokenbuf,':'))
5571 yyerror(Perl_form(aTHX_ "No package name allowed for "
5572 "variable %s in \"our\"",
5573 PL_tokenbuf));
dd2155a4 5574 tmp = allocmy(PL_tokenbuf);
8eceec63
SC
5575 }
5576 else {
5577 if (strchr(PL_tokenbuf,':'))
5578 yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
5579
5580 yylval.opval = newOP(OP_PADANY, 0);
dd2155a4 5581 yylval.opval->op_targ = allocmy(PL_tokenbuf);
8eceec63
SC
5582 return PRIVATEREF;
5583 }
5584 }
5585
5586 /*
5587 build the ops for accesses to a my() variable.
5588
5589 Deny my($a) or my($b) in a sort block, *if* $a or $b is
5590 then used in a comparison. This catches most, but not
5591 all cases. For instance, it catches
5592 sort { my($a); $a <=> $b }
5593 but not
5594 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
5595 (although why you'd do that is anyone's guess).
5596 */
5597
5598 if (!strchr(PL_tokenbuf,':')) {
8716503d
DM
5599 if (!PL_in_my)
5600 tmp = pad_findmy(PL_tokenbuf);
5601 if (tmp != NOT_IN_PAD) {
8eceec63 5602 /* might be an "our" variable" */
dd2155a4 5603 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
8eceec63 5604 /* build ops for a bareword */
b64e5050
AL
5605 HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
5606 HEK * const stashname = HvNAME_HEK(stash);
5607 SV * const sym = newSVhek(stashname);
8eceec63
SC
5608 sv_catpvn(sym, "::", 2);
5609 sv_catpv(sym, PL_tokenbuf+1);
5610 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
5611 yylval.opval->op_private = OPpCONST_ENTERED;
7a5fd60d 5612 gv_fetchsv(sym,
8eceec63
SC
5613 (PL_in_eval
5614 ? (GV_ADDMULTI | GV_ADDINEVAL)
700078d2 5615 : GV_ADDMULTI
8eceec63
SC
5616 ),
5617 ((PL_tokenbuf[0] == '$') ? SVt_PV
5618 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5619 : SVt_PVHV));
5620 return WORD;
5621 }
5622
5623 /* if it's a sort block and they're naming $a or $b */
5624 if (PL_last_lop_op == OP_SORT &&
5625 PL_tokenbuf[0] == '$' &&
5626 (PL_tokenbuf[1] == 'a' || PL_tokenbuf[1] == 'b')
5627 && !PL_tokenbuf[2])
5628 {
5629 for (d = PL_in_eval ? PL_oldoldbufptr : PL_linestart;
5630 d < PL_bufend && *d != '\n';
5631 d++)
5632 {
5633 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
5634 Perl_croak(aTHX_ "Can't use \"my %s\" in sort comparison",
5635 PL_tokenbuf);
5636 }
5637 }
5638 }
5639
5640 yylval.opval = newOP(OP_PADANY, 0);
5641 yylval.opval->op_targ = tmp;
5642 return PRIVATEREF;
5643 }
5644 }
5645
5646 /*
5647 Whine if they've said @foo in a doublequoted string,
5648 and @foo isn't a variable we can find in the symbol
5649 table.
5650 */
5651 if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
5652 GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
5653 if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
5654 && ckWARN(WARN_AMBIGUOUS))
5655 {
5656 /* Downgraded from fatal to warning 20000522 mjd */
9014280d 5657 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
8eceec63
SC
5658 "Possible unintended interpolation of %s in string",
5659 PL_tokenbuf);
5660 }
5661 }
5662
5663 /* build ops for a bareword */
5664 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf+1, 0));
5665 yylval.opval->op_private = OPpCONST_ENTERED;
5666 gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
5667 ((PL_tokenbuf[0] == '$') ? SVt_PV
5668 : (PL_tokenbuf[0] == '@') ? SVt_PVAV
5669 : SVt_PVHV));
5670 return WORD;
5671}
5672
4c3bbe0f
MHM
5673/*
5674 * The following code was generated by perl_keyword.pl.
5675 */
e2e1dd5a 5676
79072805 5677I32
672994ce 5678Perl_keyword (pTHX_ const char *name, I32 len)
4c3bbe0f
MHM
5679{
5680 switch (len)
5681 {
5682 case 1: /* 5 tokens of length 1 */
5683 switch (name[0])
e2e1dd5a 5684 {
4c3bbe0f
MHM
5685 case 'm':
5686 { /* m */
5687 return KEY_m;
5688 }
5689
4c3bbe0f
MHM
5690 case 'q':
5691 { /* q */
5692 return KEY_q;
5693 }
5694
4c3bbe0f
MHM
5695 case 's':
5696 { /* s */
5697 return KEY_s;
5698 }
5699
4c3bbe0f
MHM
5700 case 'x':
5701 { /* x */
5702 return -KEY_x;
5703 }
5704
4c3bbe0f
MHM
5705 case 'y':
5706 { /* y */
5707 return KEY_y;
5708 }
5709
4c3bbe0f
MHM
5710 default:
5711 goto unknown;
e2e1dd5a 5712 }
4c3bbe0f
MHM
5713
5714 case 2: /* 18 tokens of length 2 */
5715 switch (name[0])
e2e1dd5a 5716 {
4c3bbe0f
MHM
5717 case 'd':
5718 if (name[1] == 'o')
5719 { /* do */
5720 return KEY_do;
5721 }
5722
5723 goto unknown;
5724
5725 case 'e':
5726 if (name[1] == 'q')
5727 { /* eq */
5728 return -KEY_eq;
5729 }
5730
5731 goto unknown;
5732
5733 case 'g':
5734 switch (name[1])
5735 {
5736 case 'e':
5737 { /* ge */
5738 return -KEY_ge;
5739 }
5740
4c3bbe0f
MHM
5741 case 't':
5742 { /* gt */
5743 return -KEY_gt;
5744 }
5745
4c3bbe0f
MHM
5746 default:
5747 goto unknown;
5748 }
5749
5750 case 'i':
5751 if (name[1] == 'f')
5752 { /* if */
5753 return KEY_if;
5754 }
5755
5756 goto unknown;
5757
5758 case 'l':
5759 switch (name[1])
5760 {
5761 case 'c':
5762 { /* lc */
5763 return -KEY_lc;
5764 }
5765
4c3bbe0f
MHM
5766 case 'e':
5767 { /* le */
5768 return -KEY_le;
5769 }
5770
4c3bbe0f
MHM
5771 case 't':
5772 { /* lt */
5773 return -KEY_lt;
5774 }
5775
4c3bbe0f
MHM
5776 default:
5777 goto unknown;
5778 }
5779
5780 case 'm':
5781 if (name[1] == 'y')
5782 { /* my */
5783 return KEY_my;
5784 }
5785
5786 goto unknown;
5787
5788 case 'n':
5789 switch (name[1])
5790 {
5791 case 'e':
5792 { /* ne */
5793 return -KEY_ne;
5794 }
5795
4c3bbe0f
MHM
5796 case 'o':
5797 { /* no */
5798 return KEY_no;
5799 }
5800
4c3bbe0f
MHM
5801 default:
5802 goto unknown;
5803 }
5804
5805 case 'o':
5806 if (name[1] == 'r')
5807 { /* or */
5808 return -KEY_or;
5809 }
5810
5811 goto unknown;
5812
5813 case 'q':
5814 switch (name[1])
5815 {
5816 case 'q':
5817 { /* qq */
5818 return KEY_qq;
5819 }
5820
4c3bbe0f
MHM
5821 case 'r':
5822 { /* qr */
5823 return KEY_qr;
5824 }
5825
4c3bbe0f
MHM
5826 case 'w':
5827 { /* qw */
5828 return KEY_qw;
5829 }
5830
4c3bbe0f
MHM
5831 case 'x':
5832 { /* qx */
5833 return KEY_qx;
5834 }
5835
4c3bbe0f
MHM
5836 default:
5837 goto unknown;
5838 }
5839
5840 case 't':
5841 if (name[1] == 'r')
5842 { /* tr */
5843 return KEY_tr;
5844 }
5845
5846 goto unknown;
5847
5848 case 'u':
5849 if (name[1] == 'c')
5850 { /* uc */
5851 return -KEY_uc;
5852 }
5853
5854 goto unknown;
5855
5856 default:
5857 goto unknown;
e2e1dd5a 5858 }
4c3bbe0f
MHM
5859
5860 case 3: /* 28 tokens of length 3 */
5861 switch (name[0])
e2e1dd5a 5862 {
4c3bbe0f
MHM
5863 case 'E':
5864 if (name[1] == 'N' &&
5865 name[2] == 'D')
5866 { /* END */
5867 return KEY_END;
5868 }
5869
5870 goto unknown;
5871
5872 case 'a':
5873 switch (name[1])
5874 {
5875 case 'b':
5876 if (name[2] == 's')
5877 { /* abs */
5878 return -KEY_abs;
5879 }
5880
5881 goto unknown;
5882
5883 case 'n':
5884 if (name[2] == 'd')
5885 { /* and */
5886 return -KEY_and;
5887 }
5888
5889 goto unknown;
5890
5891 default:
5892 goto unknown;
5893 }
5894
5895 case 'c':
5896 switch (name[1])
5897 {
5898 case 'h':
5899 if (name[2] == 'r')
5900 { /* chr */
5901 return -KEY_chr;
5902 }
5903
5904 goto unknown;
5905
5906 case 'm':
5907 if (name[2] == 'p')
5908 { /* cmp */
5909 return -KEY_cmp;
5910 }
5911
5912 goto unknown;
5913
5914 case 'o':
5915 if (name[2] == 's')
5916 { /* cos */
5917 return -KEY_cos;
5918 }
5919
5920 goto unknown;
5921
5922 default:
5923 goto unknown;
5924 }
5925
5926 case 'd':
5927 if (name[1] == 'i' &&
5928 name[2] == 'e')
5929 { /* die */
5930 return -KEY_die;
5931 }
5932
5933 goto unknown;
5934
5935 case 'e':
5936 switch (name[1])
5937 {
5938 case 'o':
5939 if (name[2] == 'f')
5940 { /* eof */
5941 return -KEY_eof;
5942 }
5943
5944 goto unknown;
5945
5946 case 'r':
5947 if (name[2] == 'r')
5948 { /* err */
5949 return -KEY_err;
5950 }
5951
5952 goto unknown;
5953
5954 case 'x':
5955 if (name[2] == 'p')
5956 { /* exp */
5957 return -KEY_exp;
5958 }
5959
5960 goto unknown;
5961
5962 default:
5963 goto unknown;
5964 }
5965
5966 case 'f':
5967 if (name[1] == 'o' &&
5968 name[2] == 'r')
5969 { /* for */
5970 return KEY_for;
5971 }
5972
5973 goto unknown;
5974
5975 case 'h':
5976 if (name[1] == 'e' &&
5977 name[2] == 'x')
5978 { /* hex */
5979 return -KEY_hex;
5980 }
5981
5982 goto unknown;
5983
5984 case 'i':
5985 if (name[1] == 'n' &&
5986 name[2] == 't')
5987 { /* int */
5988 return -KEY_int;
5989 }
5990
5991 goto unknown;
5992
5993 case 'l':
5994 if (name[1] == 'o' &&
5995 name[2] == 'g')
5996 { /* log */
5997 return -KEY_log;
5998 }
5999
6000 goto unknown;
6001
6002 case 'm':
6003 if (name[1] == 'a' &&
6004 name[2] == 'p')
6005 { /* map */
6006 return KEY_map;
6007 }
6008
6009 goto unknown;
6010
6011 case 'n':
6012 if (name[1] == 'o' &&
6013 name[2] == 't')
6014 { /* not */
6015 return -KEY_not;
6016 }
6017
6018 goto unknown;
6019
6020 case 'o':
6021 switch (name[1])
6022 {
6023 case 'c':
6024 if (name[2] == 't')
6025 { /* oct */
6026 return -KEY_oct;
6027 }
6028
6029 goto unknown;
6030
6031 case 'r':
6032 if (name[2] == 'd')
6033 { /* ord */
6034 return -KEY_ord;
6035 }
6036
6037 goto unknown;
6038
6039 case 'u':
6040 if (name[2] == 'r')
6041 { /* our */
6042 return KEY_our;
6043 }
6044
6045 goto unknown;
6046
6047 default:
6048 goto unknown;
6049 }
6050
6051 case 'p':
6052 if (name[1] == 'o')
6053 {
6054 switch (name[2])
6055 {
6056 case 'p':
6057 { /* pop */
6058 return -KEY_pop;
6059 }
6060
4c3bbe0f
MHM
6061 case 's':
6062 { /* pos */
6063 return KEY_pos;
6064 }
6065
4c3bbe0f
MHM
6066 default:
6067 goto unknown;
6068 }
6069 }
6070
6071 goto unknown;
6072
6073 case 'r':
6074 if (name[1] == 'e' &&
6075 name[2] == 'f')
6076 { /* ref */
6077 return -KEY_ref;
6078 }
6079
6080 goto unknown;
6081
6082 case 's':
6083 switch (name[1])
6084 {
6085 case 'i':
6086 if (name[2] == 'n')
6087 { /* sin */
6088 return -KEY_sin;
6089 }
6090
6091 goto unknown;
6092
6093 case 'u':
6094 if (name[2] == 'b')
6095 { /* sub */
6096 return KEY_sub;
6097 }
6098
6099 goto unknown;
6100
6101 default:
6102 goto unknown;
6103 }
6104
6105 case 't':
6106 if (name[1] == 'i' &&
6107 name[2] == 'e')
6108 { /* tie */
6109 return KEY_tie;
6110 }
6111
6112 goto unknown;
6113
6114 case 'u':
6115 if (name[1] == 's' &&
6116 name[2] == 'e')
6117 { /* use */
6118 return KEY_use;
6119 }
6120
6121 goto unknown;
6122
6123 case 'v':
6124 if (name[1] == 'e' &&
6125 name[2] == 'c')
6126 { /* vec */
6127 return -KEY_vec;
6128 }
6129
6130 goto unknown;
6131
6132 case 'x':
6133 if (name[1] == 'o' &&
6134 name[2] == 'r')
6135 { /* xor */
6136 return -KEY_xor;
6137 }
6138
6139 goto unknown;
6140
6141 default:
6142 goto unknown;
e2e1dd5a 6143 }
4c3bbe0f
MHM
6144
6145 case 4: /* 40 tokens of length 4 */
6146 switch (name[0])
e2e1dd5a 6147 {
4c3bbe0f
MHM
6148 case 'C':
6149 if (name[1] == 'O' &&
6150 name[2] == 'R' &&
6151 name[3] == 'E')
6152 { /* CORE */
6153 return -KEY_CORE;
6154 }
6155
6156 goto unknown;
6157
6158 case 'I':
6159 if (name[1] == 'N' &&
6160 name[2] == 'I' &&
6161 name[3] == 'T')
6162 { /* INIT */
6163 return KEY_INIT;
6164 }
6165
6166 goto unknown;
6167
6168 case 'b':
6169 if (name[1] == 'i' &&
6170 name[2] == 'n' &&
6171 name[3] == 'd')
6172 { /* bind */
6173 return -KEY_bind;
6174 }
6175
6176 goto unknown;
6177
6178 case 'c':
6179 if (name[1] == 'h' &&
6180 name[2] == 'o' &&
6181 name[3] == 'p')
6182 { /* chop */
6183 return -KEY_chop;
6184 }
6185
6186 goto unknown;
6187
6188 case 'd':
6189 if (name[1] == 'u' &&
6190 name[2] == 'm' &&
6191 name[3] == 'p')
6192 { /* dump */
6193 return -KEY_dump;
6194 }
6195
6196 goto unknown;
6197
6198 case 'e':
6199 switch (name[1])
6200 {
6201 case 'a':
6202 if (name[2] == 'c' &&
6203 name[3] == 'h')
6204 { /* each */
6205 return -KEY_each;
6206 }
6207
6208 goto unknown;
6209
6210 case 'l':
6211 if (name[2] == 's' &&
6212 name[3] == 'e')
6213 { /* else */
6214 return KEY_else;
6215 }
6216
6217 goto unknown;
6218
6219 case 'v':
6220 if (name[2] == 'a' &&
6221 name[3] == 'l')
6222 { /* eval */
6223 return KEY_eval;
6224 }
6225
6226 goto unknown;
6227
6228 case 'x':
6229 switch (name[2])
6230 {
6231 case 'e':
6232 if (name[3] == 'c')
6233 { /* exec */
6234 return -KEY_exec;
6235 }
6236
6237 goto unknown;
6238
6239 case 'i':
6240 if (name[3] == 't')
6241 { /* exit */
6242 return -KEY_exit;
6243 }
6244
6245 goto unknown;
6246
6247 default:
6248 goto unknown;
6249 }
6250
6251 default:
6252 goto unknown;
6253 }
6254
6255 case 'f':
6256 if (name[1] == 'o' &&
6257 name[2] == 'r' &&
6258 name[3] == 'k')
6259 { /* fork */
6260 return -KEY_fork;
6261 }
6262
6263 goto unknown;
6264
6265 case 'g':
6266 switch (name[1])
6267 {
6268 case 'e':
6269 if (name[2] == 't' &&
6270 name[3] == 'c')
6271 { /* getc */
6272 return -KEY_getc;
6273 }
6274
6275 goto unknown;
6276
6277 case 'l':
6278 if (name[2] == 'o' &&
6279 name[3] == 'b')
6280 { /* glob */
6281 return KEY_glob;
6282 }
6283
6284 goto unknown;
6285
6286 case 'o':
6287 if (name[2] == 't' &&
6288 name[3] == 'o')
6289 { /* goto */
6290 return KEY_goto;
6291 }
6292
6293 goto unknown;
6294
6295 case 'r':
6296 if (name[2] == 'e' &&
6297 name[3] == 'p')
6298 { /* grep */
6299 return KEY_grep;
6300 }
6301
6302 goto unknown;
6303
6304 default:
6305 goto unknown;
6306 }
6307
6308 case 'j':
6309 if (name[1] == 'o' &&
6310 name[2] == 'i' &&
6311 name[3] == 'n')
6312 { /* join */
6313 return -KEY_join;
6314 }
6315
6316 goto unknown;
6317
6318 case 'k':
6319 switch (name[1])
6320 {
6321 case 'e':
6322 if (name[2] == 'y' &&
6323 name[3] == 's')
6324 { /* keys */
6325 return -KEY_keys;
6326 }
6327
6328 goto unknown;
6329
6330 case 'i':
6331 if (name[2] == 'l' &&
6332 name[3] == 'l')
6333 { /* kill */
6334 return -KEY_kill;
6335 }
6336
6337 goto unknown;
6338
6339 default:
6340 goto unknown;
6341 }
6342
6343 case 'l':
6344 switch (name[1])
6345 {
6346 case 'a':
6347 if (name[2] == 's' &&
6348 name[3] == 't')
6349 { /* last */
6350 return KEY_last;
6351 }
6352
6353 goto unknown;
6354
6355 case 'i':
6356 if (name[2] == 'n' &&
6357 name[3] == 'k')
6358 { /* link */
6359 return -KEY_link;
6360 }
6361
6362 goto unknown;
6363
6364 case 'o':
6365 if (name[2] == 'c' &&
6366 name[3] == 'k')
6367 { /* lock */
6368 return -KEY_lock;
6369 }
6370
6371 goto unknown;
6372
6373 default:
6374 goto unknown;
6375 }
6376
6377 case 'n':
6378 if (name[1] == 'e' &&
6379 name[2] == 'x' &&
6380 name[3] == 't')
6381 { /* next */
6382 return KEY_next;
6383 }
6384
6385 goto unknown;
6386
6387 case 'o':
6388 if (name[1] == 'p' &&
6389 name[2] == 'e' &&
6390 name[3] == 'n')
6391 { /* open */
6392 return -KEY_open;
6393 }
6394
6395 goto unknown;
6396
6397 case 'p':
6398 switch (name[1])
6399 {
6400 case 'a':
6401 if (name[2] == 'c' &&
6402 name[3] == 'k')
6403 { /* pack */
6404 return -KEY_pack;
6405 }
6406
6407 goto unknown;
6408
6409 case 'i':
6410 if (name[2] == 'p' &&
6411 name[3] == 'e')
6412 { /* pipe */
6413 return -KEY_pipe;
6414 }
6415
6416 goto unknown;
6417
6418 case 'u':
6419 if (name[2] == 's' &&
6420 name[3] == 'h')
6421 { /* push */
6422 return -KEY_push;
6423 }
6424
6425 goto unknown;
6426
6427 default:
6428 goto unknown;
6429 }
6430
6431 case 'r':
6432 switch (name[1])
6433 {
6434 case 'a':
6435 if (name[2] == 'n' &&
6436 name[3] == 'd')
6437 { /* rand */
6438 return -KEY_rand;
6439 }
6440
6441 goto unknown;
6442
6443 case 'e':
6444 switch (name[2])
6445 {
6446 case 'a':
6447 if (name[3] == 'd')
6448 { /* read */
6449 return -KEY_read;
6450 }
6451
6452 goto unknown;
6453
6454 case 'c':
6455 if (name[3] == 'v')
6456 { /* recv */
6457 return -KEY_recv;
6458 }
6459
6460 goto unknown;
6461
6462 case 'd':
6463 if (name[3] == 'o')
6464 { /* redo */
6465 return KEY_redo;
6466 }
6467
6468 goto unknown;
6469
6470 default:
6471 goto unknown;
6472 }
6473
6474 default:
6475 goto unknown;
6476 }
6477
6478 case 's':
6479 switch (name[1])
6480 {
6481 case 'e':
6482 switch (name[2])
6483 {
6484 case 'e':
6485 if (name[3] == 'k')
6486 { /* seek */
6487 return -KEY_seek;
6488 }
6489
6490 goto unknown;
6491
6492 case 'n':
6493 if (name[3] == 'd')
6494 { /* send */
6495 return -KEY_send;
6496 }
6497
6498 goto unknown;
6499
6500 default:
6501 goto unknown;
6502 }
6503
6504 case 'o':
6505 if (name[2] == 'r' &&
6506 name[3] == 't')
6507 { /* sort */
6508 return KEY_sort;
6509 }
6510
6511 goto unknown;
6512
6513 case 'q':
6514 if (name[2] == 'r' &&
6515 name[3] == 't')
6516 { /* sqrt */
6517 return -KEY_sqrt;
6518 }
6519
6520 goto unknown;
6521
6522 case 't':
6523 if (name[2] == 'a' &&
6524 name[3] == 't')
6525 { /* stat */
6526 return -KEY_stat;
6527 }
6528
6529 goto unknown;
6530
6531 default:
6532 goto unknown;
6533 }
6534
6535 case 't':
6536 switch (name[1])
6537 {
6538 case 'e':
6539 if (name[2] == 'l' &&
6540 name[3] == 'l')
6541 { /* tell */
6542 return -KEY_tell;
6543 }
6544
6545 goto unknown;
6546
6547 case 'i':
6548 switch (name[2])
6549 {
6550 case 'e':
6551 if (name[3] == 'd')
6552 { /* tied */
6553 return KEY_tied;
6554 }
6555
6556 goto unknown;
6557
6558 case 'm':
6559 if (name[3] == 'e')
6560 { /* time */
6561 return -KEY_time;
6562 }
6563
6564 goto unknown;
6565
6566 default:
6567 goto unknown;
6568 }
6569
6570 default:
6571 goto unknown;
6572 }
6573
6574 case 'w':
6575 if (name[1] == 'a')
6576 {
6577 switch (name[2])
6578 {
6579 case 'i':
6580 if (name[3] == 't')
6581 { /* wait */
6582 return -KEY_wait;
6583 }
6584
6585 goto unknown;
6586
6587 case 'r':
6588 if (name[3] == 'n')
6589 { /* warn */
6590 return -KEY_warn;
6591 }
6592
6593 goto unknown;
6594
6595 default:
6596 goto unknown;
6597 }
6598 }
6599
6600 goto unknown;
6601
6602 default:
6603 goto unknown;
e2e1dd5a 6604 }
4c3bbe0f
MHM
6605
6606 case 5: /* 36 tokens of length 5 */
6607 switch (name[0])
e2e1dd5a 6608 {
4c3bbe0f
MHM
6609 case 'B':
6610 if (name[1] == 'E' &&
6611 name[2] == 'G' &&
6612 name[3] == 'I' &&
6613 name[4] == 'N')
6614 { /* BEGIN */
6615 return KEY_BEGIN;
6616 }
6617
6618 goto unknown;
6619
6620 case 'C':
6621 if (name[1] == 'H' &&
6622 name[2] == 'E' &&
6623 name[3] == 'C' &&
6624 name[4] == 'K')
6625 { /* CHECK */
6626 return KEY_CHECK;
6627 }
6628
6629 goto unknown;
6630
6631 case 'a':
6632 switch (name[1])
6633 {
6634 case 'l':
6635 if (name[2] == 'a' &&
6636 name[3] == 'r' &&
6637 name[4] == 'm')
6638 { /* alarm */
6639 return -KEY_alarm;
6640 }
6641
6642 goto unknown;
6643
6644 case 't':
6645 if (name[2] == 'a' &&
6646 name[3] == 'n' &&
6647 name[4] == '2')
6648 { /* atan2 */
6649 return -KEY_atan2;
6650 }
6651
6652 goto unknown;
6653
6654 default:
6655 goto unknown;
6656 }
6657
6658 case 'b':
6659 if (name[1] == 'l' &&
6660 name[2] == 'e' &&
6661 name[3] == 's' &&
6662 name[4] == 's')
6663 { /* bless */
6664 return -KEY_bless;
6665 }
6666
6667 goto unknown;
6668
6669 case 'c':
6670 switch (name[1])
6671 {
6672 case 'h':
6673 switch (name[2])
6674 {
6675 case 'd':
6676 if (name[3] == 'i' &&
6677 name[4] == 'r')
6678 { /* chdir */
6679 return -KEY_chdir;
6680 }
6681
6682 goto unknown;
6683
6684 case 'm':
6685 if (name[3] == 'o' &&
6686 name[4] == 'd')
6687 { /* chmod */
6688 return -KEY_chmod;
6689 }
6690
6691 goto unknown;
6692
6693 case 'o':
6694 switch (name[3])
6695 {
6696 case 'm':
6697 if (name[4] == 'p')
6698 { /* chomp */
6699 return -KEY_chomp;
6700 }
6701
6702 goto unknown;
6703
6704 case 'w':
6705 if (name[4] == 'n')
6706 { /* chown */
6707 return -KEY_chown;
6708 }
6709
6710 goto unknown;
6711
6712 default:
6713 goto unknown;
6714 }
6715
6716 default:
6717 goto unknown;
6718 }
6719
6720 case 'l':
6721 if (name[2] == 'o' &&
6722 name[3] == 's' &&
6723 name[4] == 'e')
6724 { /* close */
6725 return -KEY_close;
6726 }
6727
6728 goto unknown;
6729
6730 case 'r':
6731 if (name[2] == 'y' &&
6732 name[3] == 'p' &&
6733 name[4] == 't')
6734 { /* crypt */
6735 return -KEY_crypt;
6736 }
6737
6738 goto unknown;
6739
6740 default:
6741 goto unknown;
6742 }
6743
6744 case 'e':
6745 if (name[1] == 'l' &&
6746 name[2] == 's' &&
6747 name[3] == 'i' &&
6748 name[4] == 'f')
6749 { /* elsif */
6750 return KEY_elsif;
6751 }
6752
6753 goto unknown;
6754
6755 case 'f':
6756 switch (name[1])
6757 {
6758 case 'c':
6759 if (name[2] == 'n' &&
6760 name[3] == 't' &&
6761 name[4] == 'l')
6762 { /* fcntl */
6763 return -KEY_fcntl;
6764 }
6765
6766 goto unknown;
6767
6768 case 'l':
6769 if (name[2] == 'o' &&
6770 name[3] == 'c' &&
6771 name[4] == 'k')
6772 { /* flock */
6773 return -KEY_flock;
6774 }
6775
6776 goto unknown;
6777
6778 default:
6779 goto unknown;
6780 }
6781
6782 case 'i':
6783 switch (name[1])
6784 {
6785 case 'n':
6786 if (name[2] == 'd' &&
6787 name[3] == 'e' &&
6788 name[4] == 'x')
6789 { /* index */
6790 return -KEY_index;
6791 }
6792
6793 goto unknown;
6794
6795 case 'o':
6796 if (name[2] == 'c' &&
6797 name[3] == 't' &&
6798 name[4] == 'l')
6799 { /* ioctl */
6800 return -KEY_ioctl;
6801 }
6802
6803 goto unknown;
6804
6805 default:
6806 goto unknown;
6807 }
6808
6809 case 'l':
6810 switch (name[1])
6811 {
6812 case 'o':
6813 if (name[2] == 'c' &&
6814 name[3] == 'a' &&
6815 name[4] == 'l')
6816 { /* local */
6817 return KEY_local;
6818 }
6819
6820 goto unknown;
6821
6822 case 's':
6823 if (name[2] == 't' &&
6824 name[3] == 'a' &&
6825 name[4] == 't')
6826 { /* lstat */
6827 return -KEY_lstat;
6828 }
6829
6830 goto unknown;
6831
6832 default:
6833 goto unknown;
6834 }
6835
6836 case 'm':
6837 if (name[1] == 'k' &&
6838 name[2] == 'd' &&
6839 name[3] == 'i' &&
6840 name[4] == 'r')
6841 { /* mkdir */
6842 return -KEY_mkdir;
6843 }
6844
6845 goto unknown;
6846
6847 case 'p':
6848 if (name[1] == 'r' &&
6849 name[2] == 'i' &&
6850 name[3] == 'n' &&
6851 name[4] == 't')
6852 { /* print */
6853 return KEY_print;
6854 }
6855
6856 goto unknown;
6857
6858 case 'r':
6859 switch (name[1])
6860 {
6861 case 'e':
6862 if (name[2] == 's' &&
6863 name[3] == 'e' &&
6864 name[4] == 't')
6865 { /* reset */
6866 return -KEY_reset;
6867 }
6868
6869 goto unknown;
6870
6871 case 'm':
6872 if (name[2] == 'd' &&
6873 name[3] == 'i' &&
6874 name[4] == 'r')
6875 { /* rmdir */
6876 return -KEY_rmdir;
6877 }
6878
6879 goto unknown;
6880
6881 default:
6882 goto unknown;
6883 }
6884
6885 case 's':
6886 switch (name[1])
6887 {
6888 case 'e':
6889 if (name[2] == 'm' &&
6890 name[3] == 'o' &&
6891 name[4] == 'p')
6892 { /* semop */
6893 return -KEY_semop;
6894 }
6895
6896 goto unknown;
6897
6898 case 'h':
6899 if (name[2] == 'i' &&
6900 name[3] == 'f' &&
6901 name[4] == 't')
6902 { /* shift */
6903 return -KEY_shift;
6904 }
6905
6906 goto unknown;
6907
6908 case 'l':
6909 if (name[2] == 'e' &&
6910 name[3] == 'e' &&
6911 name[4] == 'p')
6912 { /* sleep */
6913 return -KEY_sleep;
6914 }
6915
6916 goto unknown;
6917
6918 case 'p':
6919 if (name[2] == 'l' &&
6920 name[3] == 'i' &&
6921 name[4] == 't')
6922 { /* split */
6923 return KEY_split;
6924 }
6925
6926 goto unknown;
6927
6928 case 'r':
6929 if (name[2] == 'a' &&
6930 name[3] == 'n' &&
6931 name[4] == 'd')
6932 { /* srand */
6933 return -KEY_srand;
6934 }
6935
6936 goto unknown;
6937
6938 case 't':
6939 if (name[2] == 'u' &&
6940 name[3] == 'd' &&
6941 name[4] == 'y')
6942 { /* study */
6943 return KEY_study;
6944 }
6945
6946 goto unknown;
6947
6948 default:
6949 goto unknown;
6950 }
6951
6952 case 't':
6953 if (name[1] == 'i' &&
6954 name[2] == 'm' &&
6955 name[3] == 'e' &&
6956 name[4] == 's')
6957 { /* times */
6958 return -KEY_times;
6959 }
6960
6961 goto unknown;
6962
6963 case 'u':
6964 switch (name[1])
6965 {
6966 case 'm':
6967 if (name[2] == 'a' &&
6968 name[3] == 's' &&
6969 name[4] == 'k')
6970 { /* umask */
6971 return -KEY_umask;
6972 }
6973
6974 goto unknown;
6975
6976 case 'n':
6977 switch (name[2])
6978 {
6979 case 'd':
6980 if (name[3] == 'e' &&
6981 name[4] == 'f')
6982 { /* undef */
6983 return KEY_undef;
6984 }
6985
6986 goto unknown;
6987
6988 case 't':
6989 if (name[3] == 'i')
6990 {
6991 switch (name[4])
6992 {
6993 case 'e':
6994 { /* untie */
6995 return KEY_untie;
6996 }
6997
4c3bbe0f
MHM
6998 case 'l':
6999 { /* until */
7000 return KEY_until;
7001 }
7002
4c3bbe0f
MHM
7003 default:
7004 goto unknown;
7005 }
7006 }
7007
7008 goto unknown;
7009
7010 default:
7011 goto unknown;
7012 }
7013
7014 case 't':
7015 if (name[2] == 'i' &&
7016 name[3] == 'm' &&
7017 name[4] == 'e')
7018 { /* utime */
7019 return -KEY_utime;
7020 }
7021
7022 goto unknown;
7023
7024 default:
7025 goto unknown;
7026 }
7027
7028 case 'w':
7029 switch (name[1])
7030 {
7031 case 'h':
7032 if (name[2] == 'i' &&
7033 name[3] == 'l' &&
7034 name[4] == 'e')
7035 { /* while */
7036 return KEY_while;
7037 }
7038
7039 goto unknown;
7040
7041 case 'r':
7042 if (name[2] == 'i' &&
7043 name[3] == 't' &&
7044 name[4] == 'e')
7045 { /* write */
7046 return -KEY_write;
7047 }
7048
7049 goto unknown;
7050
7051 default:
7052 goto unknown;
7053 }
7054
7055 default:
7056 goto unknown;
e2e1dd5a 7057 }
4c3bbe0f
MHM
7058
7059 case 6: /* 33 tokens of length 6 */
7060 switch (name[0])
7061 {
7062 case 'a':
7063 if (name[1] == 'c' &&
7064 name[2] == 'c' &&
7065 name[3] == 'e' &&
7066 name[4] == 'p' &&
7067 name[5] == 't')
7068 { /* accept */
7069 return -KEY_accept;
7070 }
7071
7072 goto unknown;
7073
7074 case 'c':
7075 switch (name[1])
7076 {
7077 case 'a':
7078 if (name[2] == 'l' &&
7079 name[3] == 'l' &&
7080 name[4] == 'e' &&
7081 name[5] == 'r')
7082 { /* caller */
7083 return -KEY_caller;
7084 }
7085
7086 goto unknown;
7087
7088 case 'h':
7089 if (name[2] == 'r' &&
7090 name[3] == 'o' &&
7091 name[4] == 'o' &&
7092 name[5] == 't')
7093 { /* chroot */
7094 return -KEY_chroot;
7095 }
7096
7097 goto unknown;
7098
7099 default:
7100 goto unknown;
7101 }
7102
7103 case 'd':
7104 if (name[1] == 'e' &&
7105 name[2] == 'l' &&
7106 name[3] == 'e' &&
7107 name[4] == 't' &&
7108 name[5] == 'e')
7109 { /* delete */
7110 return KEY_delete;
7111 }
7112
7113 goto unknown;
7114
7115 case 'e':
7116 switch (name[1])
7117 {
7118 case 'l':
7119 if (name[2] == 's' &&
7120 name[3] == 'e' &&
7121 name[4] == 'i' &&
7122 name[5] == 'f')
7123 { /* elseif */
7124 if(ckWARN_d(WARN_SYNTAX))
7125 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
7126 }
7127
7128 goto unknown;
7129
7130 case 'x':
7131 if (name[2] == 'i' &&
7132 name[3] == 's' &&
7133 name[4] == 't' &&
7134 name[5] == 's')
7135 { /* exists */
7136 return KEY_exists;
7137 }
7138
7139 goto unknown;
7140
7141 default:
7142 goto unknown;
7143 }
7144
7145 case 'f':
7146 switch (name[1])
7147 {
7148 case 'i':
7149 if (name[2] == 'l' &&
7150 name[3] == 'e' &&
7151 name[4] == 'n' &&
7152 name[5] == 'o')
7153 { /* fileno */
7154 return -KEY_fileno;
7155 }
7156
7157 goto unknown;
7158
7159 case 'o':
7160 if (name[2] == 'r' &&
7161 name[3] == 'm' &&
7162 name[4] == 'a' &&
7163 name[5] == 't')
7164 { /* format */
7165 return KEY_format;
7166 }
7167
7168 goto unknown;
7169
7170 default:
7171 goto unknown;
7172 }
7173
7174 case 'g':
7175 if (name[1] == 'm' &&
7176 name[2] == 't' &&
7177 name[3] == 'i' &&
7178 name[4] == 'm' &&
7179 name[5] == 'e')
7180 { /* gmtime */
7181 return -KEY_gmtime;
7182 }
7183
7184 goto unknown;
7185
7186 case 'l':
7187 switch (name[1])
7188 {
7189 case 'e':
7190 if (name[2] == 'n' &&
7191 name[3] == 'g' &&
7192 name[4] == 't' &&
7193 name[5] == 'h')
7194 { /* length */
7195 return -KEY_length;
7196 }
7197
7198 goto unknown;
7199
7200 case 'i':
7201 if (name[2] == 's' &&
7202 name[3] == 't' &&
7203 name[4] == 'e' &&
7204 name[5] == 'n')
7205 { /* listen */
7206 return -KEY_listen;
7207 }
7208
7209 goto unknown;
7210
7211 default:
7212 goto unknown;
7213 }
7214
7215 case 'm':
7216 if (name[1] == 's' &&
7217 name[2] == 'g')
7218 {
7219 switch (name[3])
7220 {
7221 case 'c':
7222 if (name[4] == 't' &&
7223 name[5] == 'l')
7224 { /* msgctl */
7225 return -KEY_msgctl;
7226 }
7227
7228 goto unknown;
7229
7230 case 'g':
7231 if (name[4] == 'e' &&
7232 name[5] == 't')
7233 { /* msgget */
7234 return -KEY_msgget;
7235 }
7236
7237 goto unknown;
7238
7239 case 'r':
7240 if (name[4] == 'c' &&
7241 name[5] == 'v')
7242 { /* msgrcv */
7243 return -KEY_msgrcv;
7244 }
7245
7246 goto unknown;
7247
7248 case 's':
7249 if (name[4] == 'n' &&
7250 name[5] == 'd')
7251 { /* msgsnd */
7252 return -KEY_msgsnd;
7253 }
7254
7255 goto unknown;
7256
7257 default:
7258 goto unknown;
7259 }
7260 }
7261
7262 goto unknown;
7263
7264 case 'p':
7265 if (name[1] == 'r' &&
7266 name[2] == 'i' &&
7267 name[3] == 'n' &&
7268 name[4] == 't' &&
7269 name[5] == 'f')
7270 { /* printf */
7271 return KEY_printf;
7272 }
7273
7274 goto unknown;
7275
7276 case 'r':
7277 switch (name[1])
7278 {
7279 case 'e':
7280 switch (name[2])
7281 {
7282 case 'n':
7283 if (name[3] == 'a' &&
7284 name[4] == 'm' &&
7285 name[5] == 'e')
7286 { /* rename */
7287 return -KEY_rename;
7288 }
7289
7290 goto unknown;
7291
7292 case 't':
7293 if (name[3] == 'u' &&
7294 name[4] == 'r' &&
7295 name[5] == 'n')
7296 { /* return */
7297 return KEY_return;
7298 }
7299
7300 goto unknown;
7301
7302 default:
7303 goto unknown;
7304 }
7305
7306 case 'i':
7307 if (name[2] == 'n' &&
7308 name[3] == 'd' &&
7309 name[4] == 'e' &&
7310 name[5] == 'x')
7311 { /* rindex */
7312 return -KEY_rindex;
7313 }
7314
7315 goto unknown;
7316
7317 default:
7318 goto unknown;
7319 }
7320
7321 case 's':
7322 switch (name[1])
7323 {
7324 case 'c':
7325 if (name[2] == 'a' &&
7326 name[3] == 'l' &&
7327 name[4] == 'a' &&
7328 name[5] == 'r')
7329 { /* scalar */
7330 return KEY_scalar;
7331 }
7332
7333 goto unknown;
7334
7335 case 'e':
7336 switch (name[2])
7337 {
7338 case 'l':
7339 if (name[3] == 'e' &&
7340 name[4] == 'c' &&
7341 name[5] == 't')
7342 { /* select */
7343 return -KEY_select;
7344 }
7345
7346 goto unknown;
7347
7348 case 'm':
7349 switch (name[3])
7350 {
7351 case 'c':
7352 if (name[4] == 't' &&
7353 name[5] == 'l')
7354 { /* semctl */
7355 return -KEY_semctl;
7356 }
7357
7358 goto unknown;
7359
7360 case 'g':
7361 if (name[4] == 'e' &&
7362 name[5] == 't')
7363 { /* semget */
7364 return -KEY_semget;
7365 }
7366
7367 goto unknown;
7368
7369 default:
7370 goto unknown;
7371 }
7372
7373 default:
7374 goto unknown;
7375 }
7376
7377 case 'h':
7378 if (name[2] == 'm')
7379 {
7380 switch (name[3])
7381 {
7382 case 'c':
7383 if (name[4] == 't' &&
7384 name[5] == 'l')
7385 { /* shmctl */
7386 return -KEY_shmctl;
7387 }
7388
7389 goto unknown;
7390
7391 case 'g':
7392 if (name[4] == 'e' &&
7393 name[5] == 't')
7394 { /* shmget */
7395 return -KEY_shmget;
7396 }
7397
7398 goto unknown;
7399
7400 default:
7401 goto unknown;
7402 }
7403 }
7404
7405 goto unknown;
7406
7407 case 'o':
7408 if (name[2] == 'c' &&
7409 name[3] == 'k' &&
7410 name[4] == 'e' &&
7411 name[5] == 't')
7412 { /* socket */
7413 return -KEY_socket;
7414 }
7415
7416 goto unknown;
7417
7418 case 'p':
7419 if (name[2] == 'l' &&
7420 name[3] == 'i' &&
7421 name[4] == 'c' &&
7422 name[5] == 'e')
7423 { /* splice */
7424 return -KEY_splice;
7425 }
7426
7427 goto unknown;
7428
7429 case 'u':
7430 if (name[2] == 'b' &&
7431 name[3] == 's' &&
7432 name[4] == 't' &&
7433 name[5] == 'r')
7434 { /* substr */
7435 return -KEY_substr;
7436 }
7437
7438 goto unknown;
7439
7440 case 'y':
7441 if (name[2] == 's' &&
7442 name[3] == 't' &&
7443 name[4] == 'e' &&
7444 name[5] == 'm')
7445 { /* system */
7446 return -KEY_system;
7447 }
7448
7449 goto unknown;
7450
7451 default:
7452 goto unknown;
7453 }
7454
7455 case 'u':
7456 if (name[1] == 'n')
7457 {
7458 switch (name[2])
7459 {
7460 case 'l':
7461 switch (name[3])
7462 {
7463 case 'e':
7464 if (name[4] == 's' &&
7465 name[5] == 's')
7466 { /* unless */
7467 return KEY_unless;
7468 }
7469
7470 goto unknown;
7471
7472 case 'i':
7473 if (name[4] == 'n' &&
7474 name[5] == 'k')
7475 { /* unlink */
7476 return -KEY_unlink;
7477 }
7478
7479 goto unknown;
7480
7481 default:
7482 goto unknown;
7483 }
7484
7485 case 'p':
7486 if (name[3] == 'a' &&
7487 name[4] == 'c' &&
7488 name[5] == 'k')
7489 { /* unpack */
7490 return -KEY_unpack;
7491 }
7492
7493 goto unknown;
7494
7495 default:
7496 goto unknown;
7497 }
7498 }
7499
7500 goto unknown;
7501
7502 case 'v':
7503 if (name[1] == 'a' &&
7504 name[2] == 'l' &&
7505 name[3] == 'u' &&
7506 name[4] == 'e' &&
7507 name[5] == 's')
7508 { /* values */
7509 return -KEY_values;
7510 }
7511
7512 goto unknown;
7513
7514 default:
7515 goto unknown;
e2e1dd5a 7516 }
4c3bbe0f
MHM
7517
7518 case 7: /* 28 tokens of length 7 */
7519 switch (name[0])
7520 {
7521 case 'D':
7522 if (name[1] == 'E' &&
7523 name[2] == 'S' &&
7524 name[3] == 'T' &&
7525 name[4] == 'R' &&
7526 name[5] == 'O' &&
7527 name[6] == 'Y')
7528 { /* DESTROY */
7529 return KEY_DESTROY;
7530 }
7531
7532 goto unknown;
7533
7534 case '_':
7535 if (name[1] == '_' &&
7536 name[2] == 'E' &&
7537 name[3] == 'N' &&
7538 name[4] == 'D' &&
7539 name[5] == '_' &&
7540 name[6] == '_')
7541 { /* __END__ */
7542 return KEY___END__;
7543 }
7544
7545 goto unknown;
7546
7547 case 'b':
7548 if (name[1] == 'i' &&
7549 name[2] == 'n' &&
7550 name[3] == 'm' &&
7551 name[4] == 'o' &&
7552 name[5] == 'd' &&
7553 name[6] == 'e')
7554 { /* binmode */
7555 return -KEY_binmode;
7556 }
7557
7558 goto unknown;
7559
7560 case 'c':
7561 if (name[1] == 'o' &&
7562 name[2] == 'n' &&
7563 name[3] == 'n' &&
7564 name[4] == 'e' &&
7565 name[5] == 'c' &&
7566 name[6] == 't')
7567 { /* connect */
7568 return -KEY_connect;
7569 }
7570
7571 goto unknown;
7572
7573 case 'd':
7574 switch (name[1])
7575 {
7576 case 'b':
7577 if (name[2] == 'm' &&
7578 name[3] == 'o' &&
7579 name[4] == 'p' &&
7580 name[5] == 'e' &&
7581 name[6] == 'n')
7582 { /* dbmopen */
7583 return -KEY_dbmopen;
7584 }
7585
7586 goto unknown;
7587
7588 case 'e':
7589 if (name[2] == 'f' &&
7590 name[3] == 'i' &&
7591 name[4] == 'n' &&
7592 name[5] == 'e' &&
7593 name[6] == 'd')
7594 { /* defined */
7595 return KEY_defined;
7596 }
7597
7598 goto unknown;
7599
7600 default:
7601 goto unknown;
7602 }
7603
7604 case 'f':
7605 if (name[1] == 'o' &&
7606 name[2] == 'r' &&
7607 name[3] == 'e' &&
7608 name[4] == 'a' &&
7609 name[5] == 'c' &&
7610 name[6] == 'h')
7611 { /* foreach */
7612 return KEY_foreach;
7613 }
7614
7615 goto unknown;
7616
7617 case 'g':
7618 if (name[1] == 'e' &&
7619 name[2] == 't' &&
7620 name[3] == 'p')
7621 {
7622 switch (name[4])
7623 {
7624 case 'g':
7625 if (name[5] == 'r' &&
7626 name[6] == 'p')
7627 { /* getpgrp */
7628 return -KEY_getpgrp;
7629 }
7630
7631 goto unknown;
7632
7633 case 'p':
7634 if (name[5] == 'i' &&
7635 name[6] == 'd')
7636 { /* getppid */
7637 return -KEY_getppid;
7638 }
7639
7640 goto unknown;
7641
7642 default:
7643 goto unknown;
7644 }
7645 }
7646
7647 goto unknown;
7648
7649 case 'l':
7650 if (name[1] == 'c' &&
7651 name[2] == 'f' &&
7652 name[3] == 'i' &&
7653 name[4] == 'r' &&
7654 name[5] == 's' &&
7655 name[6] == 't')
7656 { /* lcfirst */
7657 return -KEY_lcfirst;
7658 }
7659
7660 goto unknown;
7661
7662 case 'o':
7663 if (name[1] == 'p' &&
7664 name[2] == 'e' &&
7665 name[3] == 'n' &&
7666 name[4] == 'd' &&
7667 name[5] == 'i' &&
7668 name[6] == 'r')
7669 { /* opendir */
7670 return -KEY_opendir;
7671 }
7672
7673 goto unknown;
7674
7675 case 'p':
7676 if (name[1] == 'a' &&
7677 name[2] == 'c' &&
7678 name[3] == 'k' &&
7679 name[4] == 'a' &&
7680 name[5] == 'g' &&
7681 name[6] == 'e')
7682 { /* package */
7683 return KEY_package;
7684 }
7685
7686 goto unknown;
7687
7688 case 'r':
7689 if (name[1] == 'e')
7690 {
7691 switch (name[2])
7692 {
7693 case 'a':
7694 if (name[3] == 'd' &&
7695 name[4] == 'd' &&
7696 name[5] == 'i' &&
7697 name[6] == 'r')
7698 { /* readdir */
7699 return -KEY_readdir;
7700 }
7701
7702 goto unknown;
7703
7704 case 'q':
7705 if (name[3] == 'u' &&
7706 name[4] == 'i' &&
7707 name[5] == 'r' &&
7708 name[6] == 'e')
7709 { /* require */
7710 return KEY_require;
7711 }
7712
7713 goto unknown;
7714
7715 case 'v':
7716 if (name[3] == 'e' &&
7717 name[4] == 'r' &&
7718 name[5] == 's' &&
7719 name[6] == 'e')
7720 { /* reverse */
7721 return -KEY_reverse;
7722 }
7723
7724 goto unknown;
7725
7726 default:
7727 goto unknown;
7728 }
7729 }
7730
7731 goto unknown;
7732
7733 case 's':
7734 switch (name[1])
7735 {
7736 case 'e':
7737 switch (name[2])
7738 {
7739 case 'e':
7740 if (name[3] == 'k' &&
7741 name[4] == 'd' &&
7742 name[5] == 'i' &&
7743 name[6] == 'r')
7744 { /* seekdir */
7745 return -KEY_seekdir;
7746 }
7747
7748 goto unknown;
7749
7750 case 't':
7751 if (name[3] == 'p' &&
7752 name[4] == 'g' &&
7753 name[5] == 'r' &&
7754 name[6] == 'p')
7755 { /* setpgrp */
7756 return -KEY_setpgrp;
7757 }
7758
7759 goto unknown;
7760
7761 default:
7762 goto unknown;
7763 }
7764
7765 case 'h':
7766 if (name[2] == 'm' &&
7767 name[3] == 'r' &&
7768 name[4] == 'e' &&
7769 name[5] == 'a' &&
7770 name[6] == 'd')
7771 { /* shmread */
7772 return -KEY_shmread;
7773 }
7774
7775 goto unknown;
7776
7777 case 'p':
7778 if (name[2] == 'r' &&
7779 name[3] == 'i' &&
7780 name[4] == 'n' &&
7781 name[5] == 't' &&
7782 name[6] == 'f')
7783 { /* sprintf */
7784 return -KEY_sprintf;
7785 }
7786
7787 goto unknown;
7788
7789 case 'y':
7790 switch (name[2])
7791 {
7792 case 'm':
7793 if (name[3] == 'l' &&
7794 name[4] == 'i' &&
7795 name[5] == 'n' &&
7796 name[6] == 'k')
7797 { /* symlink */
7798 return -KEY_symlink;
7799 }
7800
7801 goto unknown;
7802
7803 case 's':
7804 switch (name[3])
7805 {
7806 case 'c':
7807 if (name[4] == 'a' &&
7808 name[5] == 'l' &&
7809 name[6] == 'l')
7810 { /* syscall */
7811 return -KEY_syscall;
7812 }
7813
7814 goto unknown;
7815
7816 case 'o':
7817 if (name[4] == 'p' &&
7818 name[5] == 'e' &&
7819 name[6] == 'n')
7820 { /* sysopen */
7821 return -KEY_sysopen;
7822 }
7823
7824 goto unknown;
7825
7826 case 'r':
7827 if (name[4] == 'e' &&
7828 name[5] == 'a' &&
7829 name[6] == 'd')
7830 { /* sysread */
7831 return -KEY_sysread;
7832 }
7833
7834 goto unknown;
7835
7836 case 's':
7837 if (name[4] == 'e' &&
7838 name[5] == 'e' &&
7839 name[6] == 'k')
7840 { /* sysseek */
7841 return -KEY_sysseek;
7842 }
7843
7844 goto unknown;
7845
7846 default:
7847 goto unknown;
7848 }
7849
7850 default:
7851 goto unknown;
7852 }
7853
7854 default:
7855 goto unknown;
7856 }
7857
7858 case 't':
7859 if (name[1] == 'e' &&
7860 name[2] == 'l' &&
7861 name[3] == 'l' &&
7862 name[4] == 'd' &&
7863 name[5] == 'i' &&
7864 name[6] == 'r')
7865 { /* telldir */
7866 return -KEY_telldir;
7867 }
7868
7869 goto unknown;
7870
7871 case 'u':
7872 switch (name[1])
7873 {
7874 case 'c':
7875 if (name[2] == 'f' &&
7876 name[3] == 'i' &&
7877 name[4] == 'r' &&
7878 name[5] == 's' &&
7879 name[6] == 't')
7880 { /* ucfirst */
7881 return -KEY_ucfirst;
7882 }
7883
7884 goto unknown;
7885
7886 case 'n':
7887 if (name[2] == 's' &&
7888 name[3] == 'h' &&
7889 name[4] == 'i' &&
7890 name[5] == 'f' &&
7891 name[6] == 't')
7892 { /* unshift */
7893 return -KEY_unshift;
7894 }
7895
7896 goto unknown;
7897
7898 default:
7899 goto unknown;
7900 }
7901
7902 case 'w':
7903 if (name[1] == 'a' &&
7904 name[2] == 'i' &&
7905 name[3] == 't' &&
7906 name[4] == 'p' &&
7907 name[5] == 'i' &&
7908 name[6] == 'd')
7909 { /* waitpid */
7910 return -KEY_waitpid;
7911 }
7912
7913 goto unknown;
7914
7915 default:
7916 goto unknown;
7917 }
7918
7919 case 8: /* 26 tokens of length 8 */
7920 switch (name[0])
7921 {
7922 case 'A':
7923 if (name[1] == 'U' &&
7924 name[2] == 'T' &&
7925 name[3] == 'O' &&
7926 name[4] == 'L' &&
7927 name[5] == 'O' &&
7928 name[6] == 'A' &&
7929 name[7] == 'D')
7930 { /* AUTOLOAD */
7931 return KEY_AUTOLOAD;
7932 }
7933
7934 goto unknown;
7935
7936 case '_':
7937 if (name[1] == '_')
7938 {
7939 switch (name[2])
7940 {
7941 case 'D':
7942 if (name[3] == 'A' &&
7943 name[4] == 'T' &&
7944 name[5] == 'A' &&
7945 name[6] == '_' &&
7946 name[7] == '_')
7947 { /* __DATA__ */
7948 return KEY___DATA__;
7949 }
7950
7951 goto unknown;
7952
7953 case 'F':
7954 if (name[3] == 'I' &&
7955 name[4] == 'L' &&
7956 name[5] == 'E' &&
7957 name[6] == '_' &&
7958 name[7] == '_')
7959 { /* __FILE__ */
7960 return -KEY___FILE__;
7961 }
7962
7963 goto unknown;
7964
7965 case 'L':
7966 if (name[3] == 'I' &&
7967 name[4] == 'N' &&
7968 name[5] == 'E' &&
7969 name[6] == '_' &&
7970 name[7] == '_')
7971 { /* __LINE__ */
7972 return -KEY___LINE__;
7973 }
7974
7975 goto unknown;
7976
7977 default:
7978 goto unknown;
7979 }
7980 }
7981
7982 goto unknown;
7983
7984 case 'c':
7985 switch (name[1])
7986 {
7987 case 'l':
7988 if (name[2] == 'o' &&
7989 name[3] == 's' &&
7990 name[4] == 'e' &&
7991 name[5] == 'd' &&
7992 name[6] == 'i' &&
7993 name[7] == 'r')
7994 { /* closedir */
7995 return -KEY_closedir;
7996 }
7997
7998 goto unknown;
7999
8000 case 'o':
8001 if (name[2] == 'n' &&
8002 name[3] == 't' &&
8003 name[4] == 'i' &&
8004 name[5] == 'n' &&
8005 name[6] == 'u' &&
8006 name[7] == 'e')
8007 { /* continue */
8008 return -KEY_continue;
8009 }
8010
8011 goto unknown;
8012
8013 default:
8014 goto unknown;
8015 }
8016
8017 case 'd':
8018 if (name[1] == 'b' &&
8019 name[2] == 'm' &&
8020 name[3] == 'c' &&
8021 name[4] == 'l' &&
8022 name[5] == 'o' &&
8023 name[6] == 's' &&
8024 name[7] == 'e')
8025 { /* dbmclose */
8026 return -KEY_dbmclose;
8027 }
8028
8029 goto unknown;
8030
8031 case 'e':
8032 if (name[1] == 'n' &&
8033 name[2] == 'd')
8034 {
8035 switch (name[3])
8036 {
8037 case 'g':
8038 if (name[4] == 'r' &&
8039 name[5] == 'e' &&
8040 name[6] == 'n' &&
8041 name[7] == 't')
8042 { /* endgrent */
8043 return -KEY_endgrent;
8044 }
8045
8046 goto unknown;
8047
8048 case 'p':
8049 if (name[4] == 'w' &&
8050 name[5] == 'e' &&
8051 name[6] == 'n' &&
8052 name[7] == 't')
8053 { /* endpwent */
8054 return -KEY_endpwent;
8055 }
8056
8057 goto unknown;
8058
8059 default:
8060 goto unknown;
8061 }
8062 }
8063
8064 goto unknown;
8065
8066 case 'f':
8067 if (name[1] == 'o' &&
8068 name[2] == 'r' &&
8069 name[3] == 'm' &&
8070 name[4] == 'l' &&
8071 name[5] == 'i' &&
8072 name[6] == 'n' &&
8073 name[7] == 'e')
8074 { /* formline */
8075 return -KEY_formline;
8076 }
8077
8078 goto unknown;
8079
8080 case 'g':
8081 if (name[1] == 'e' &&
8082 name[2] == 't')
8083 {
8084 switch (name[3])
8085 {
8086 case 'g':
8087 if (name[4] == 'r')
8088 {
8089 switch (name[5])
8090 {
8091 case 'e':
8092 if (name[6] == 'n' &&
8093 name[7] == 't')
8094 { /* getgrent */
8095 return -KEY_getgrent;
8096 }
8097
8098 goto unknown;
8099
8100 case 'g':
8101 if (name[6] == 'i' &&
8102 name[7] == 'd')
8103 { /* getgrgid */
8104 return -KEY_getgrgid;
8105 }
8106
8107 goto unknown;
8108
8109 case 'n':
8110 if (name[6] == 'a' &&
8111 name[7] == 'm')
8112 { /* getgrnam */
8113 return -KEY_getgrnam;
8114 }
8115
8116 goto unknown;
8117
8118 default:
8119 goto unknown;
8120 }
8121 }
8122
8123 goto unknown;
8124
8125 case 'l':
8126 if (name[4] == 'o' &&
8127 name[5] == 'g' &&
8128 name[6] == 'i' &&
8129 name[7] == 'n')
8130 { /* getlogin */
8131 return -KEY_getlogin;
8132 }
8133
8134 goto unknown;
8135
8136 case 'p':
8137 if (name[4] == 'w')
8138 {
8139 switch (name[5])
8140 {
8141 case 'e':
8142 if (name[6] == 'n' &&
8143 name[7] == 't')
8144 { /* getpwent */
8145 return -KEY_getpwent;
8146 }
8147
8148 goto unknown;
8149
8150 case 'n':
8151 if (name[6] == 'a' &&
8152 name[7] == 'm')
8153 { /* getpwnam */
8154 return -KEY_getpwnam;
8155 }
8156
8157 goto unknown;
8158
8159 case 'u':
8160 if (name[6] == 'i' &&
8161 name[7] == 'd')
8162 { /* getpwuid */
8163 return -KEY_getpwuid;
8164 }
8165
8166 goto unknown;
8167
8168 default:
8169 goto unknown;
8170 }
8171 }
8172
8173 goto unknown;
8174
8175 default:
8176 goto unknown;
8177 }
8178 }
8179
8180 goto unknown;
8181
8182 case 'r':
8183 if (name[1] == 'e' &&
8184 name[2] == 'a' &&
8185 name[3] == 'd')
8186 {
8187 switch (name[4])
8188 {
8189 case 'l':
8190 if (name[5] == 'i' &&
8191 name[6] == 'n')
8192 {
8193 switch (name[7])
8194 {
8195 case 'e':
8196 { /* readline */
8197 return -KEY_readline;
8198 }
8199
4c3bbe0f
MHM
8200 case 'k':
8201 { /* readlink */
8202 return -KEY_readlink;
8203 }
8204
4c3bbe0f
MHM
8205 default:
8206 goto unknown;
8207 }
8208 }
8209
8210 goto unknown;
8211
8212 case 'p':
8213 if (name[5] == 'i' &&
8214 name[6] == 'p' &&
8215 name[7] == 'e')
8216 { /* readpipe */
8217 return -KEY_readpipe;
8218 }
8219
8220 goto unknown;
8221
8222 default:
8223 goto unknown;
8224 }
8225 }
8226
8227 goto unknown;
8228
8229 case 's':
8230 switch (name[1])
8231 {
8232 case 'e':
8233 if (name[2] == 't')
8234 {
8235 switch (name[3])
8236 {
8237 case 'g':
8238 if (name[4] == 'r' &&
8239 name[5] == 'e' &&
8240 name[6] == 'n' &&
8241 name[7] == 't')
8242 { /* setgrent */
8243 return -KEY_setgrent;
8244 }
8245
8246 goto unknown;
8247
8248 case 'p':
8249 if (name[4] == 'w' &&
8250 name[5] == 'e' &&
8251 name[6] == 'n' &&
8252 name[7] == 't')
8253 { /* setpwent */
8254 return -KEY_setpwent;
8255 }
8256
8257 goto unknown;
8258
8259 default:
8260 goto unknown;
8261 }
8262 }
8263
8264 goto unknown;
8265
8266 case 'h':
8267 switch (name[2])
8268 {
8269 case 'm':
8270 if (name[3] == 'w' &&
8271 name[4] == 'r' &&
8272 name[5] == 'i' &&
8273 name[6] == 't' &&
8274 name[7] == 'e')
8275 { /* shmwrite */
8276 return -KEY_shmwrite;
8277 }
8278
8279 goto unknown;
8280
8281 case 'u':
8282 if (name[3] == 't' &&
8283 name[4] == 'd' &&
8284 name[5] == 'o' &&
8285 name[6] == 'w' &&
8286 name[7] == 'n')
8287 { /* shutdown */
8288 return -KEY_shutdown;
8289 }
8290
8291 goto unknown;
8292
8293 default:
8294 goto unknown;
8295 }
8296
8297 case 'y':
8298 if (name[2] == 's' &&
8299 name[3] == 'w' &&
8300 name[4] == 'r' &&
8301 name[5] == 'i' &&
8302 name[6] == 't' &&
8303 name[7] == 'e')
8304 { /* syswrite */
8305 return -KEY_syswrite;
8306 }
8307
8308 goto unknown;
8309
8310 default:
8311 goto unknown;
8312 }
8313
8314 case 't':
8315 if (name[1] == 'r' &&
8316 name[2] == 'u' &&
8317 name[3] == 'n' &&
8318 name[4] == 'c' &&
8319 name[5] == 'a' &&
8320 name[6] == 't' &&
8321 name[7] == 'e')
8322 { /* truncate */
8323 return -KEY_truncate;
8324 }
8325
8326 goto unknown;
8327
8328 default:
8329 goto unknown;
8330 }
8331
8332 case 9: /* 8 tokens of length 9 */
8333 switch (name[0])
8334 {
8335 case 'e':
8336 if (name[1] == 'n' &&
8337 name[2] == 'd' &&
8338 name[3] == 'n' &&
8339 name[4] == 'e' &&
8340 name[5] == 't' &&
8341 name[6] == 'e' &&
8342 name[7] == 'n' &&
8343 name[8] == 't')
8344 { /* endnetent */
8345 return -KEY_endnetent;
8346 }
8347
8348 goto unknown;
8349
8350 case 'g':
8351 if (name[1] == 'e' &&
8352 name[2] == 't' &&
8353 name[3] == 'n' &&
8354 name[4] == 'e' &&
8355 name[5] == 't' &&
8356 name[6] == 'e' &&
8357 name[7] == 'n' &&
8358 name[8] == 't')
8359 { /* getnetent */
8360 return -KEY_getnetent;
8361 }
8362
8363 goto unknown;
8364
8365 case 'l':
8366 if (name[1] == 'o' &&
8367 name[2] == 'c' &&
8368 name[3] == 'a' &&
8369 name[4] == 'l' &&
8370 name[5] == 't' &&
8371 name[6] == 'i' &&
8372 name[7] == 'm' &&
8373 name[8] == 'e')
8374 { /* localtime */
8375 return -KEY_localtime;
8376 }
8377
8378 goto unknown;
8379
8380 case 'p':
8381 if (name[1] == 'r' &&
8382 name[2] == 'o' &&
8383 name[3] == 't' &&
8384 name[4] == 'o' &&
8385 name[5] == 't' &&
8386 name[6] == 'y' &&
8387 name[7] == 'p' &&
8388 name[8] == 'e')
8389 { /* prototype */
8390 return KEY_prototype;
8391 }
8392
8393 goto unknown;
8394
8395 case 'q':
8396 if (name[1] == 'u' &&
8397 name[2] == 'o' &&
8398 name[3] == 't' &&
8399 name[4] == 'e' &&
8400 name[5] == 'm' &&
8401 name[6] == 'e' &&
8402 name[7] == 't' &&
8403 name[8] == 'a')
8404 { /* quotemeta */
8405 return -KEY_quotemeta;
8406 }
8407
8408 goto unknown;
8409
8410 case 'r':
8411 if (name[1] == 'e' &&
8412 name[2] == 'w' &&
8413 name[3] == 'i' &&
8414 name[4] == 'n' &&
8415 name[5] == 'd' &&
8416 name[6] == 'd' &&
8417 name[7] == 'i' &&
8418 name[8] == 'r')
8419 { /* rewinddir */
8420 return -KEY_rewinddir;
8421 }
8422
8423 goto unknown;
8424
8425 case 's':
8426 if (name[1] == 'e' &&
8427 name[2] == 't' &&
8428 name[3] == 'n' &&
8429 name[4] == 'e' &&
8430 name[5] == 't' &&
8431 name[6] == 'e' &&
8432 name[7] == 'n' &&
8433 name[8] == 't')
8434 { /* setnetent */
8435 return -KEY_setnetent;
8436 }
8437
8438 goto unknown;
8439
8440 case 'w':
8441 if (name[1] == 'a' &&
8442 name[2] == 'n' &&
8443 name[3] == 't' &&
8444 name[4] == 'a' &&
8445 name[5] == 'r' &&
8446 name[6] == 'r' &&
8447 name[7] == 'a' &&
8448 name[8] == 'y')
8449 { /* wantarray */
8450 return -KEY_wantarray;
8451 }
8452
8453 goto unknown;
8454
8455 default:
8456 goto unknown;
8457 }
8458
8459 case 10: /* 9 tokens of length 10 */
8460 switch (name[0])
8461 {
8462 case 'e':
8463 if (name[1] == 'n' &&
8464 name[2] == 'd')
8465 {
8466 switch (name[3])
8467 {
8468 case 'h':
8469 if (name[4] == 'o' &&
8470 name[5] == 's' &&
8471 name[6] == 't' &&
8472 name[7] == 'e' &&
8473 name[8] == 'n' &&
8474 name[9] == 't')
8475 { /* endhostent */
8476 return -KEY_endhostent;
8477 }
8478
8479 goto unknown;
8480
8481 case 's':
8482 if (name[4] == 'e' &&
8483 name[5] == 'r' &&
8484 name[6] == 'v' &&
8485 name[7] == 'e' &&
8486 name[8] == 'n' &&
8487 name[9] == 't')
8488 { /* endservent */
8489 return -KEY_endservent;
8490 }
8491
8492 goto unknown;
8493
8494 default:
8495 goto unknown;
8496 }
8497 }
8498
8499 goto unknown;
8500
8501 case 'g':
8502 if (name[1] == 'e' &&
8503 name[2] == 't')
8504 {
8505 switch (name[3])
8506 {
8507 case 'h':
8508 if (name[4] == 'o' &&
8509 name[5] == 's' &&
8510 name[6] == 't' &&
8511 name[7] == 'e' &&
8512 name[8] == 'n' &&
8513 name[9] == 't')
8514 { /* gethostent */
8515 return -KEY_gethostent;
8516 }
8517
8518 goto unknown;
8519
8520 case 's':
8521 switch (name[4])
8522 {
8523 case 'e':
8524 if (name[5] == 'r' &&
8525 name[6] == 'v' &&
8526 name[7] == 'e' &&
8527 name[8] == 'n' &&
8528 name[9] == 't')
8529 { /* getservent */
8530 return -KEY_getservent;
8531 }
8532
8533 goto unknown;
8534
8535 case 'o':
8536 if (name[5] == 'c' &&
8537 name[6] == 'k' &&
8538 name[7] == 'o' &&
8539 name[8] == 'p' &&
8540 name[9] == 't')
8541 { /* getsockopt */
8542 return -KEY_getsockopt;
8543 }
8544
8545 goto unknown;
8546
8547 default:
8548 goto unknown;
8549 }
8550
8551 default:
8552 goto unknown;
8553 }
8554 }
8555
8556 goto unknown;
8557
8558 case 's':
8559 switch (name[1])
8560 {
8561 case 'e':
8562 if (name[2] == 't')
8563 {
8564 switch (name[3])
8565 {
8566 case 'h':
8567 if (name[4] == 'o' &&
8568 name[5] == 's' &&
8569 name[6] == 't' &&
8570 name[7] == 'e' &&
8571 name[8] == 'n' &&
8572 name[9] == 't')
8573 { /* sethostent */
8574 return -KEY_sethostent;
8575 }
8576
8577 goto unknown;
8578
8579 case 's':
8580 switch (name[4])
8581 {
8582 case 'e':
8583 if (name[5] == 'r' &&
8584 name[6] == 'v' &&
8585 name[7] == 'e' &&
8586 name[8] == 'n' &&
8587 name[9] == 't')
8588 { /* setservent */
8589 return -KEY_setservent;
8590 }
8591
8592 goto unknown;
8593
8594 case 'o':
8595 if (name[5] == 'c' &&
8596 name[6] == 'k' &&
8597 name[7] == 'o' &&
8598 name[8] == 'p' &&
8599 name[9] == 't')
8600 { /* setsockopt */
8601 return -KEY_setsockopt;
8602 }
8603
8604 goto unknown;
8605
8606 default:
8607 goto unknown;
8608 }
8609
8610 default:
8611 goto unknown;
8612 }
8613 }
8614
8615 goto unknown;
8616
8617 case 'o':
8618 if (name[2] == 'c' &&
8619 name[3] == 'k' &&
8620 name[4] == 'e' &&
8621 name[5] == 't' &&
8622 name[6] == 'p' &&
8623 name[7] == 'a' &&
8624 name[8] == 'i' &&
8625 name[9] == 'r')
8626 { /* socketpair */
8627 return -KEY_socketpair;
8628 }
8629
8630 goto unknown;
8631
8632 default:
8633 goto unknown;
8634 }
8635
8636 default:
8637 goto unknown;
e2e1dd5a 8638 }
4c3bbe0f
MHM
8639
8640 case 11: /* 8 tokens of length 11 */
8641 switch (name[0])
8642 {
8643 case '_':
8644 if (name[1] == '_' &&
8645 name[2] == 'P' &&
8646 name[3] == 'A' &&
8647 name[4] == 'C' &&
8648 name[5] == 'K' &&
8649 name[6] == 'A' &&
8650 name[7] == 'G' &&
8651 name[8] == 'E' &&
8652 name[9] == '_' &&
8653 name[10] == '_')
8654 { /* __PACKAGE__ */
8655 return -KEY___PACKAGE__;
8656 }
8657
8658 goto unknown;
8659
8660 case 'e':
8661 if (name[1] == 'n' &&
8662 name[2] == 'd' &&
8663 name[3] == 'p' &&
8664 name[4] == 'r' &&
8665 name[5] == 'o' &&
8666 name[6] == 't' &&
8667 name[7] == 'o' &&
8668 name[8] == 'e' &&
8669 name[9] == 'n' &&
8670 name[10] == 't')
8671 { /* endprotoent */
8672 return -KEY_endprotoent;
8673 }
8674
8675 goto unknown;
8676
8677 case 'g':
8678 if (name[1] == 'e' &&
8679 name[2] == 't')
8680 {
8681 switch (name[3])
8682 {
8683 case 'p':
8684 switch (name[4])
8685 {
8686 case 'e':
8687 if (name[5] == 'e' &&
8688 name[6] == 'r' &&
8689 name[7] == 'n' &&
8690 name[8] == 'a' &&
8691 name[9] == 'm' &&
8692 name[10] == 'e')
8693 { /* getpeername */
8694 return -KEY_getpeername;
8695 }
8696
8697 goto unknown;
8698
8699 case 'r':
8700 switch (name[5])
8701 {
8702 case 'i':
8703 if (name[6] == 'o' &&
8704 name[7] == 'r' &&
8705 name[8] == 'i' &&
8706 name[9] == 't' &&
8707 name[10] == 'y')
8708 { /* getpriority */
8709 return -KEY_getpriority;
8710 }
8711
8712 goto unknown;
8713
8714 case 'o':
8715 if (name[6] == 't' &&
8716 name[7] == 'o' &&
8717 name[8] == 'e' &&
8718 name[9] == 'n' &&
8719 name[10] == 't')
8720 { /* getprotoent */
8721 return -KEY_getprotoent;
8722 }
8723
8724 goto unknown;
8725
8726 default:
8727 goto unknown;
8728 }
8729
8730 default:
8731 goto unknown;
8732 }
8733
8734 case 's':
8735 if (name[4] == 'o' &&
8736 name[5] == 'c' &&
8737 name[6] == 'k' &&
8738 name[7] == 'n' &&
8739 name[8] == 'a' &&
8740 name[9] == 'm' &&
8741 name[10] == 'e')
8742 { /* getsockname */
8743 return -KEY_getsockname;
8744 }
8745
8746 goto unknown;
8747
8748 default:
8749 goto unknown;
8750 }
8751 }
8752
8753 goto unknown;
8754
8755 case 's':
8756 if (name[1] == 'e' &&
8757 name[2] == 't' &&
8758 name[3] == 'p' &&
8759 name[4] == 'r')
8760 {
8761 switch (name[5])
8762 {
8763 case 'i':
8764 if (name[6] == 'o' &&
8765 name[7] == 'r' &&
8766 name[8] == 'i' &&
8767 name[9] == 't' &&
8768 name[10] == 'y')
8769 { /* setpriority */
8770 return -KEY_setpriority;
8771 }
8772
8773 goto unknown;
8774
8775 case 'o':
8776 if (name[6] == 't' &&
8777 name[7] == 'o' &&
8778 name[8] == 'e' &&
8779 name[9] == 'n' &&
8780 name[10] == 't')
8781 { /* setprotoent */
8782 return -KEY_setprotoent;
8783 }
8784
8785 goto unknown;
8786
8787 default:
8788 goto unknown;
8789 }
8790 }
8791
8792 goto unknown;
8793
8794 default:
8795 goto unknown;
e2e1dd5a 8796 }
4c3bbe0f
MHM
8797
8798 case 12: /* 2 tokens of length 12 */
8799 if (name[0] == 'g' &&
8800 name[1] == 'e' &&
8801 name[2] == 't' &&
8802 name[3] == 'n' &&
8803 name[4] == 'e' &&
8804 name[5] == 't' &&
8805 name[6] == 'b' &&
8806 name[7] == 'y')
8807 {
8808 switch (name[8])
8809 {
8810 case 'a':
8811 if (name[9] == 'd' &&
8812 name[10] == 'd' &&
8813 name[11] == 'r')
8814 { /* getnetbyaddr */
8815 return -KEY_getnetbyaddr;
8816 }
8817
8818 goto unknown;
8819
8820 case 'n':
8821 if (name[9] == 'a' &&
8822 name[10] == 'm' &&
8823 name[11] == 'e')
8824 { /* getnetbyname */
8825 return -KEY_getnetbyname;
8826 }
8827
8828 goto unknown;
8829
8830 default:
8831 goto unknown;
8832 }
e2e1dd5a 8833 }
4c3bbe0f
MHM
8834
8835 goto unknown;
8836
8837 case 13: /* 4 tokens of length 13 */
8838 if (name[0] == 'g' &&
8839 name[1] == 'e' &&
8840 name[2] == 't')
8841 {
8842 switch (name[3])
8843 {
8844 case 'h':
8845 if (name[4] == 'o' &&
8846 name[5] == 's' &&
8847 name[6] == 't' &&
8848 name[7] == 'b' &&
8849 name[8] == 'y')
8850 {
8851 switch (name[9])
8852 {
8853 case 'a':
8854 if (name[10] == 'd' &&
8855 name[11] == 'd' &&
8856 name[12] == 'r')
8857 { /* gethostbyaddr */
8858 return -KEY_gethostbyaddr;
8859 }
8860
8861 goto unknown;
8862
8863 case 'n':
8864 if (name[10] == 'a' &&
8865 name[11] == 'm' &&
8866 name[12] == 'e')
8867 { /* gethostbyname */
8868 return -KEY_gethostbyname;
8869 }
8870
8871 goto unknown;
8872
8873 default:
8874 goto unknown;
8875 }
8876 }
8877
8878 goto unknown;
8879
8880 case 's':
8881 if (name[4] == 'e' &&
8882 name[5] == 'r' &&
8883 name[6] == 'v' &&
8884 name[7] == 'b' &&
8885 name[8] == 'y')
8886 {
8887 switch (name[9])
8888 {
8889 case 'n':
8890 if (name[10] == 'a' &&
8891 name[11] == 'm' &&
8892 name[12] == 'e')
8893 { /* getservbyname */
8894 return -KEY_getservbyname;
8895 }
8896
8897 goto unknown;
8898
8899 case 'p':
8900 if (name[10] == 'o' &&
8901 name[11] == 'r' &&
8902 name[12] == 't')
8903 { /* getservbyport */
8904 return -KEY_getservbyport;
8905 }
8906
8907 goto unknown;
8908
8909 default:
8910 goto unknown;
8911 }
8912 }
8913
8914 goto unknown;
8915
8916 default:
8917 goto unknown;
8918 }
e2e1dd5a 8919 }
4c3bbe0f
MHM
8920
8921 goto unknown;
8922
8923 case 14: /* 1 tokens of length 14 */
8924 if (name[0] == 'g' &&
8925 name[1] == 'e' &&
8926 name[2] == 't' &&
8927 name[3] == 'p' &&
8928 name[4] == 'r' &&
8929 name[5] == 'o' &&
8930 name[6] == 't' &&
8931 name[7] == 'o' &&
8932 name[8] == 'b' &&
8933 name[9] == 'y' &&
8934 name[10] == 'n' &&
8935 name[11] == 'a' &&
8936 name[12] == 'm' &&
8937 name[13] == 'e')
8938 { /* getprotobyname */
8939 return -KEY_getprotobyname;
8940 }
8941
8942 goto unknown;
8943
8944 case 16: /* 1 tokens of length 16 */
8945 if (name[0] == 'g' &&
8946 name[1] == 'e' &&
8947 name[2] == 't' &&
8948 name[3] == 'p' &&
8949 name[4] == 'r' &&
8950 name[5] == 'o' &&
8951 name[6] == 't' &&
8952 name[7] == 'o' &&
8953 name[8] == 'b' &&
8954 name[9] == 'y' &&
8955 name[10] == 'n' &&
8956 name[11] == 'u' &&
8957 name[12] == 'm' &&
8958 name[13] == 'b' &&
8959 name[14] == 'e' &&
8960 name[15] == 'r')
8961 { /* getprotobynumber */
8962 return -KEY_getprotobynumber;
8963 }
8964
8965 goto unknown;
8966
8967 default:
8968 goto unknown;
e2e1dd5a 8969 }
4c3bbe0f
MHM
8970
8971unknown:
e2e1dd5a 8972 return 0;
a687059c
LW
8973}
8974
76e3520e 8975STATIC void
f54cb97a 8976S_checkcomma(pTHX_ register char *s, const char *name, const char *what)
a687059c 8977{
f54cb97a 8978 const char *w;
2f3197b3 8979
d008e5eb 8980 if (*s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
d008e5eb
GS
8981 if (ckWARN(WARN_SYNTAX)) {
8982 int level = 1;
8983 for (w = s+2; *w && level; w++) {
8984 if (*w == '(')
8985 ++level;
8986 else if (*w == ')')
8987 --level;
8988 }
8989 if (*w)
8990 for (; *w && isSPACE(*w); w++) ;
8991 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
9014280d 8992 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
65cec589 8993 "%s (...) interpreted as function",name);
d008e5eb 8994 }
2f3197b3 8995 }
3280af22 8996 while (s < PL_bufend && isSPACE(*s))
2f3197b3 8997 s++;
a687059c
LW
8998 if (*s == '(')
8999 s++;
3280af22 9000 while (s < PL_bufend && isSPACE(*s))
a687059c 9001 s++;
7e2040f0 9002 if (isIDFIRST_lazy_if(s,UTF)) {
2f3197b3 9003 w = s++;
7e2040f0 9004 while (isALNUM_lazy_if(s,UTF))
a687059c 9005 s++;
3280af22 9006 while (s < PL_bufend && isSPACE(*s))
a687059c 9007 s++;
e929a76b 9008 if (*s == ',') {
463ee0b2 9009 int kw;
f54cb97a 9010 *s = '\0'; /* XXX If we didn't do this, we could const a lot of toke.c */
864dbfa3 9011 kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
e929a76b 9012 *s = ',';
463ee0b2 9013 if (kw)
e929a76b 9014 return;
cea2e8a9 9015 Perl_croak(aTHX_ "No comma allowed after %s", what);
463ee0b2
LW
9016 }
9017 }
9018}
9019
423cee85
JH
9020/* Either returns sv, or mortalizes sv and returns a new SV*.
9021 Best used as sv=new_constant(..., sv, ...).
9022 If s, pv are NULL, calls subroutine with one argument,
9023 and type is used with error messages only. */
9024
b3ac6de7 9025STATIC SV *
7fc63493 9026S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
9b0e499b 9027 const char *type)
b3ac6de7 9028{
27da23d5 9029 dVAR; dSP;
890ce7af 9030 HV * const table = GvHV(PL_hintgv); /* ^H */
b3ac6de7 9031 SV *res;
b3ac6de7
IZ
9032 SV **cvp;
9033 SV *cv, *typesv;
89e33a05 9034 const char *why1 = "", *why2 = "", *why3 = "";
4e553d73 9035
f0af216f 9036 if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
423cee85
JH
9037 SV *msg;
9038
f0af216f 9039 why2 = strEQ(key,"charnames")
41ab332f 9040 ? "(possibly a missing \"use charnames ...\")"
f0af216f 9041 : "";
4e553d73 9042 msg = Perl_newSVpvf(aTHX_ "Constant(%s) unknown: %s",
41ab332f
JH
9043 (type ? type: "undef"), why2);
9044
9045 /* This is convoluted and evil ("goto considered harmful")
9046 * but I do not understand the intricacies of all the different
9047 * failure modes of %^H in here. The goal here is to make
9048 * the most probable error message user-friendly. --jhi */
9049
9050 goto msgdone;
9051
423cee85 9052 report:
4e553d73 9053 msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
f0af216f 9054 (type ? type: "undef"), why1, why2, why3);
41ab332f 9055 msgdone:
95a20fc0 9056 yyerror(SvPVX_const(msg));
423cee85
JH
9057 SvREFCNT_dec(msg);
9058 return sv;
9059 }
b3ac6de7
IZ
9060 cvp = hv_fetch(table, key, strlen(key), FALSE);
9061 if (!cvp || !SvOK(*cvp)) {
423cee85
JH
9062 why1 = "$^H{";
9063 why2 = key;
f0af216f 9064 why3 = "} is not defined";
423cee85 9065 goto report;
b3ac6de7
IZ
9066 }
9067 sv_2mortal(sv); /* Parent created it permanently */
9068 cv = *cvp;
423cee85
JH
9069 if (!pv && s)
9070 pv = sv_2mortal(newSVpvn(s, len));
9071 if (type && pv)
9072 typesv = sv_2mortal(newSVpv(type, 0));
b3ac6de7 9073 else
423cee85 9074 typesv = &PL_sv_undef;
4e553d73 9075
e788e7d3 9076 PUSHSTACKi(PERLSI_OVERLOAD);
423cee85
JH
9077 ENTER ;
9078 SAVETMPS;
4e553d73 9079
423cee85 9080 PUSHMARK(SP) ;
a5845cb7 9081 EXTEND(sp, 3);
423cee85
JH
9082 if (pv)
9083 PUSHs(pv);
b3ac6de7 9084 PUSHs(sv);
423cee85
JH
9085 if (pv)
9086 PUSHs(typesv);
b3ac6de7 9087 PUTBACK;
423cee85 9088 call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
4e553d73 9089
423cee85 9090 SPAGAIN ;
4e553d73 9091
423cee85 9092 /* Check the eval first */
9b0e499b 9093 if (!PL_in_eval && SvTRUE(ERRSV)) {
423cee85 9094 sv_catpv(ERRSV, "Propagated");
8b6b16e7 9095 yyerror(SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
e1f15930 9096 (void)POPs;
423cee85
JH
9097 res = SvREFCNT_inc(sv);
9098 }
9099 else {
9100 res = POPs;
e1f15930 9101 (void)SvREFCNT_inc(res);
423cee85 9102 }
4e553d73 9103
423cee85
JH
9104 PUTBACK ;
9105 FREETMPS ;
9106 LEAVE ;
b3ac6de7 9107 POPSTACK;
4e553d73 9108
b3ac6de7 9109 if (!SvOK(res)) {
423cee85
JH
9110 why1 = "Call to &{$^H{";
9111 why2 = key;
f0af216f 9112 why3 = "}} did not return a defined value";
423cee85
JH
9113 sv = res;
9114 goto report;
9b0e499b 9115 }
423cee85 9116
9b0e499b 9117 return res;
b3ac6de7 9118}
4e553d73 9119
d0a148a6
NC
9120/* Returns a NUL terminated string, with the length of the string written to
9121 *slp
9122 */
76e3520e 9123STATIC char *
cea2e8a9 9124S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
463ee0b2
LW
9125{
9126 register char *d = dest;
890ce7af 9127 register char * const e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 9128 for (;;) {
8903cb82 9129 if (d >= e)
cea2e8a9 9130 Perl_croak(aTHX_ ident_too_long);
834a4ddd 9131 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 9132 *d++ = *s++;
7e2040f0 9133 else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
9134 *d++ = ':';
9135 *d++ = ':';
9136 s++;
9137 }
c3e0f903 9138 else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
463ee0b2
LW
9139 *d++ = *s++;
9140 *d++ = *s++;
9141 }
fd400ab9 9142 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 9143 char *t = s + UTF8SKIP(s);
fd400ab9 9144 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
9145 t += UTF8SKIP(t);
9146 if (d + (t - s) > e)
cea2e8a9 9147 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
9148 Copy(s, d, t - s, char);
9149 d += t - s;
9150 s = t;
9151 }
463ee0b2
LW
9152 else {
9153 *d = '\0';
9154 *slp = d - dest;
9155 return s;
e929a76b 9156 }
378cc40b
LW
9157 }
9158}
9159
76e3520e 9160STATIC char *
f54cb97a 9161S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
378cc40b
LW
9162{
9163 register char *d;
8903cb82 9164 register char *e;
46c461b5 9165 char *bracket = Nullch;
748a9306 9166 char funny = *s++;
378cc40b 9167
a0d0e21e
LW
9168 if (isSPACE(*s))
9169 s = skipspace(s);
378cc40b 9170 d = dest;
8903cb82 9171 e = d + destlen - 3; /* two-character token, ending NUL */
de3bb511 9172 if (isDIGIT(*s)) {
8903cb82 9173 while (isDIGIT(*s)) {
9174 if (d >= e)
cea2e8a9 9175 Perl_croak(aTHX_ ident_too_long);
378cc40b 9176 *d++ = *s++;
8903cb82 9177 }
378cc40b
LW
9178 }
9179 else {
463ee0b2 9180 for (;;) {
8903cb82 9181 if (d >= e)
cea2e8a9 9182 Perl_croak(aTHX_ ident_too_long);
834a4ddd 9183 if (isALNUM(*s)) /* UTF handled below */
463ee0b2 9184 *d++ = *s++;
7e2040f0 9185 else if (*s == '\'' && isIDFIRST_lazy_if(s+1,UTF)) {
463ee0b2
LW
9186 *d++ = ':';
9187 *d++ = ':';
9188 s++;
9189 }
a0d0e21e 9190 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
9191 *d++ = *s++;
9192 *d++ = *s++;
9193 }
fd400ab9 9194 else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
a0ed51b3 9195 char *t = s + UTF8SKIP(s);
fd400ab9 9196 while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
a0ed51b3
LW
9197 t += UTF8SKIP(t);
9198 if (d + (t - s) > e)
cea2e8a9 9199 Perl_croak(aTHX_ ident_too_long);
a0ed51b3
LW
9200 Copy(s, d, t - s, char);
9201 d += t - s;
9202 s = t;
9203 }
463ee0b2
LW
9204 else
9205 break;
9206 }
378cc40b
LW
9207 }
9208 *d = '\0';
9209 d = dest;
79072805 9210 if (*d) {
3280af22
NIS
9211 if (PL_lex_state != LEX_NORMAL)
9212 PL_lex_state = LEX_INTERPENDMAYBE;
79072805 9213 return s;
378cc40b 9214 }
748a9306 9215 if (*s == '$' && s[1] &&
3792a11b 9216 (isALNUM_lazy_if(s+1,UTF) || s[1] == '$' || s[1] == '{' || strnEQ(s+1,"::",2)) )
5cd24f17 9217 {
4810e5ec 9218 return s;
5cd24f17 9219 }
79072805
LW
9220 if (*s == '{') {
9221 bracket = s;
9222 s++;
9223 }
9224 else if (ck_uni)
9225 check_uni();
93a17b20 9226 if (s < send)
79072805
LW
9227 *d = *s++;
9228 d[1] = '\0';
2b92dfce 9229 if (*d == '^' && *s && isCONTROLVAR(*s)) {
bbce6d69 9230 *d = toCTRL(*s);
9231 s++;
de3bb511 9232 }
79072805 9233 if (bracket) {
748a9306 9234 if (isSPACE(s[-1])) {
fa83b5b6 9235 while (s < send) {
f54cb97a 9236 const char ch = *s++;
bf4acbe4 9237 if (!SPACE_OR_TAB(ch)) {
fa83b5b6 9238 *d = ch;
9239 break;
9240 }
9241 }
748a9306 9242 }
7e2040f0 9243 if (isIDFIRST_lazy_if(d,UTF)) {
79072805 9244 d++;
a0ed51b3
LW
9245 if (UTF) {
9246 e = s;
155aba94 9247 while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
a0ed51b3 9248 e += UTF8SKIP(e);
fd400ab9 9249 while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
a0ed51b3
LW
9250 e += UTF8SKIP(e);
9251 }
9252 Copy(s, d, e - s, char);
9253 d += e - s;
9254 s = e;
9255 }
9256 else {
2b92dfce 9257 while ((isALNUM(*s) || *s == ':') && d < e)
a0ed51b3 9258 *d++ = *s++;
2b92dfce 9259 if (d >= e)
cea2e8a9 9260 Perl_croak(aTHX_ ident_too_long);
a0ed51b3 9261 }
79072805 9262 *d = '\0';
bf4acbe4 9263 while (s < send && SPACE_OR_TAB(*s)) s++;
ff68c719 9264 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
599cee73 9265 if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
dff6d3cd 9266 const char *brack = *s == '[' ? "[...]" : "{...}";
9014280d 9267 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
599cee73 9268 "Ambiguous use of %c{%s%s} resolved to %c%s%s",
748a9306
LW
9269 funny, dest, brack, funny, dest, brack);
9270 }
79072805 9271 bracket++;
a0be28da 9272 PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK);
79072805
LW
9273 return s;
9274 }
4e553d73
NIS
9275 }
9276 /* Handle extended ${^Foo} variables
2b92dfce
GS
9277 * 1999-02-27 mjd-perl-patch@plover.com */
9278 else if (!isALNUM(*d) && !isPRINT(*d) /* isCTRL(d) */
9279 && isALNUM(*s))
9280 {
9281 d++;
9282 while (isALNUM(*s) && d < e) {
9283 *d++ = *s++;
9284 }
9285 if (d >= e)
cea2e8a9 9286 Perl_croak(aTHX_ ident_too_long);
2b92dfce 9287 *d = '\0';
79072805
LW
9288 }
9289 if (*s == '}') {
9290 s++;
7df0d042 9291 if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) {
3280af22 9292 PL_lex_state = LEX_INTERPEND;
7df0d042
AE
9293 PL_expect = XREF;
9294 }
748a9306
LW
9295 if (funny == '#')
9296 funny = '@';
d008e5eb 9297 if (PL_lex_state == LEX_NORMAL) {
d008e5eb 9298 if (ckWARN(WARN_AMBIGUOUS) &&
864dbfa3 9299 (keyword(dest, d - dest) || get_cv(dest, FALSE)))
d008e5eb 9300 {
9014280d 9301 Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
d008e5eb
GS
9302 "Ambiguous use of %c{%s} resolved to %c%s",
9303 funny, dest, funny, dest);
9304 }
9305 }
79072805
LW
9306 }
9307 else {
9308 s = bracket; /* let the parser handle it */
93a17b20 9309 *dest = '\0';
79072805
LW
9310 }
9311 }
3280af22
NIS
9312 else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
9313 PL_lex_state = LEX_INTERPEND;
378cc40b
LW
9314 return s;
9315}
9316
cea2e8a9 9317void
2b36a5a0 9318Perl_pmflag(pTHX_ U32* pmfl, int ch)
a0d0e21e 9319{
bbce6d69 9320 if (ch == 'i')
a0d0e21e 9321 *pmfl |= PMf_FOLD;
a0d0e21e
LW
9322 else if (ch == 'g')
9323 *pmfl |= PMf_GLOBAL;
c90c0ff4 9324 else if (ch == 'c')
9325 *pmfl |= PMf_CONTINUE;
a0d0e21e
LW
9326 else if (ch == 'o')
9327 *pmfl |= PMf_KEEP;
9328 else if (ch == 'm')
9329 *pmfl |= PMf_MULTILINE;
9330 else if (ch == 's')
9331 *pmfl |= PMf_SINGLELINE;
9332 else if (ch == 'x')
9333 *pmfl |= PMf_EXTENDED;
9334}
378cc40b 9335
76e3520e 9336STATIC char *
cea2e8a9 9337S_scan_pat(pTHX_ char *start, I32 type)
378cc40b 9338{
79072805 9339 PMOP *pm;
f54cb97a 9340 char *s = scan_str(start,FALSE,FALSE);
378cc40b 9341
25c09cbf 9342 if (!s) {
46c461b5 9343 char * const delimiter = skipspace(start);
25c09cbf
SF
9344 Perl_croak(aTHX_ *delimiter == '?'
9345 ? "Search pattern not terminated or ternary operator parsed as search pattern"
9346 : "Search pattern not terminated" );
9347 }
bbce6d69 9348
8782bef2 9349 pm = (PMOP*)newPMOP(type, 0);
3280af22 9350 if (PL_multi_open == '?')
79072805 9351 pm->op_pmflags |= PMf_ONCE;
8782bef2
GB
9352 if(type == OP_QR) {
9353 while (*s && strchr("iomsx", *s))
9354 pmflag(&pm->op_pmflags,*s++);
9355 }
9356 else {
9357 while (*s && strchr("iogcmsx", *s))
9358 pmflag(&pm->op_pmflags,*s++);
9359 }
4ac733c9 9360 /* issue a warning if /c is specified,but /g is not */
041457d9
DM
9361 if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
9362 && ckWARN(WARN_REGEXP))
4ac733c9
MJD
9363 {
9364 Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
9365 }
9366
4633a7c4 9367 pm->op_pmpermflags = pm->op_pmflags;
bbce6d69 9368
3280af22 9369 PL_lex_op = (OP*)pm;
79072805 9370 yylval.ival = OP_MATCH;
378cc40b
LW
9371 return s;
9372}
9373
76e3520e 9374STATIC char *
cea2e8a9 9375S_scan_subst(pTHX_ char *start)
79072805 9376{
27da23d5 9377 dVAR;
a0d0e21e 9378 register char *s;
79072805 9379 register PMOP *pm;
4fdae800 9380 I32 first_start;
79072805
LW
9381 I32 es = 0;
9382
79072805
LW
9383 yylval.ival = OP_NULL;
9384
09bef843 9385 s = scan_str(start,FALSE,FALSE);
79072805 9386
37fd879b 9387 if (!s)
cea2e8a9 9388 Perl_croak(aTHX_ "Substitution pattern not terminated");
79072805 9389
3280af22 9390 if (s[-1] == PL_multi_open)
79072805
LW
9391 s--;
9392
3280af22 9393 first_start = PL_multi_start;
09bef843 9394 s = scan_str(s,FALSE,FALSE);
79072805 9395 if (!s) {
37fd879b 9396 if (PL_lex_stuff) {
3280af22 9397 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
9398 PL_lex_stuff = Nullsv;
9399 }
cea2e8a9 9400 Perl_croak(aTHX_ "Substitution replacement not terminated");
a687059c 9401 }
3280af22 9402 PL_multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 9403
79072805 9404 pm = (PMOP*)newPMOP(OP_SUBST, 0);
48c036b1 9405 while (*s) {
a687059c
LW
9406 if (*s == 'e') {
9407 s++;
2f3197b3 9408 es++;
a687059c 9409 }
b3eb6a9b 9410 else if (strchr("iogcmsx", *s))
a0d0e21e 9411 pmflag(&pm->op_pmflags,*s++);
48c036b1
GS
9412 else
9413 break;
378cc40b 9414 }
79072805 9415
64e578a2 9416 /* /c is not meaningful with s/// */
041457d9 9417 if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP))
4ac733c9 9418 {
64e578a2 9419 Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
4ac733c9
MJD
9420 }
9421
79072805
LW
9422 if (es) {
9423 SV *repl;
0244c3a4
GS
9424 PL_sublex_info.super_bufptr = s;
9425 PL_sublex_info.super_bufend = PL_bufend;
9426 PL_multi_end = 0;
79072805 9427 pm->op_pmflags |= PMf_EVAL;
79cb57f6 9428 repl = newSVpvn("",0);
463ee0b2 9429 while (es-- > 0)
a0d0e21e 9430 sv_catpv(repl, es ? "eval " : "do ");
79072805 9431 sv_catpvn(repl, "{ ", 2);
3280af22 9432 sv_catsv(repl, PL_lex_repl);
79072805 9433 sv_catpvn(repl, " };", 2);
25da4f38 9434 SvEVALED_on(repl);
3280af22
NIS
9435 SvREFCNT_dec(PL_lex_repl);
9436 PL_lex_repl = repl;
378cc40b 9437 }
79072805 9438
4633a7c4 9439 pm->op_pmpermflags = pm->op_pmflags;
3280af22 9440 PL_lex_op = (OP*)pm;
79072805 9441 yylval.ival = OP_SUBST;
378cc40b
LW
9442 return s;
9443}
9444
76e3520e 9445STATIC char *
cea2e8a9 9446S_scan_trans(pTHX_ char *start)
378cc40b 9447{
a0d0e21e 9448 register char* s;
11343788 9449 OP *o;
79072805
LW
9450 short *tbl;
9451 I32 squash;
a0ed51b3 9452 I32 del;
79072805
LW
9453 I32 complement;
9454
9455 yylval.ival = OP_NULL;
9456
09bef843 9457 s = scan_str(start,FALSE,FALSE);
37fd879b 9458 if (!s)
cea2e8a9 9459 Perl_croak(aTHX_ "Transliteration pattern not terminated");
3280af22 9460 if (s[-1] == PL_multi_open)
2f3197b3
LW
9461 s--;
9462
09bef843 9463 s = scan_str(s,FALSE,FALSE);
79072805 9464 if (!s) {
37fd879b 9465 if (PL_lex_stuff) {
3280af22 9466 SvREFCNT_dec(PL_lex_stuff);
37fd879b
HS
9467 PL_lex_stuff = Nullsv;
9468 }
cea2e8a9 9469 Perl_croak(aTHX_ "Transliteration replacement not terminated");
a687059c 9470 }
79072805 9471
a0ed51b3 9472 complement = del = squash = 0;
7a1e2023
NC
9473 while (1) {
9474 switch (*s) {
9475 case 'c':
79072805 9476 complement = OPpTRANS_COMPLEMENT;
7a1e2023
NC
9477 break;
9478 case 'd':
a0ed51b3 9479 del = OPpTRANS_DELETE;
7a1e2023
NC
9480 break;
9481 case 's':
79072805 9482 squash = OPpTRANS_SQUASH;
7a1e2023
NC
9483 break;
9484 default:
9485 goto no_more;
9486 }
395c3793
LW
9487 s++;
9488 }
7a1e2023 9489 no_more:
8973db79 9490
a02a5408 9491 Newx(tbl, complement&&!del?258:256, short);
8973db79 9492 o = newPVOP(OP_TRANS, 0, (char*)tbl);
59f00321
RGS
9493 o->op_private &= ~OPpTRANS_ALL;
9494 o->op_private |= del|squash|complement|
7948272d
NIS
9495 (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
9496 (DO_UTF8(PL_lex_repl) ? OPpTRANS_TO_UTF : 0);
79072805 9497
3280af22 9498 PL_lex_op = o;
79072805
LW
9499 yylval.ival = OP_TRANS;
9500 return s;
9501}
9502
76e3520e 9503STATIC char *
cea2e8a9 9504S_scan_heredoc(pTHX_ register char *s)
79072805
LW
9505{
9506 SV *herewas;
9507 I32 op_type = OP_SCALAR;
9508 I32 len;
9509 SV *tmpstr;
9510 char term;
73d840c0
AL
9511 const char newline[] = "\n";
9512 const char *found_newline;
79072805 9513 register char *d;
fc36a67e 9514 register char *e;
4633a7c4 9515 char *peek;
f54cb97a 9516 const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
79072805
LW
9517
9518 s += 2;
3280af22
NIS
9519 d = PL_tokenbuf;
9520 e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
fd2d0953 9521 if (!outer)
79072805 9522 *d++ = '\n';
bf4acbe4 9523 for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
3792a11b 9524 if (*peek == '`' || *peek == '\'' || *peek =='"') {
4633a7c4 9525 s = peek;
79072805 9526 term = *s++;
3280af22 9527 s = delimcpy(d, e, s, PL_bufend, term, &len);
fc36a67e 9528 d += len;
3280af22 9529 if (s < PL_bufend)
79072805 9530 s++;
79072805
LW
9531 }
9532 else {
9533 if (*s == '\\')
9534 s++, term = '\'';
9535 else
9536 term = '"';
7e2040f0 9537 if (!isALNUM_lazy_if(s,UTF))
12bcd1a6 9538 deprecate_old("bare << to mean <<\"\"");
7e2040f0 9539 for (; isALNUM_lazy_if(s,UTF); s++) {
fc36a67e 9540 if (d < e)
9541 *d++ = *s;
9542 }
9543 }
3280af22 9544 if (d >= PL_tokenbuf + sizeof PL_tokenbuf - 1)
cea2e8a9 9545 Perl_croak(aTHX_ "Delimiter for here document is too long");
79072805
LW
9546 *d++ = '\n';
9547 *d = '\0';
3280af22 9548 len = d - PL_tokenbuf;
6a27c188 9549#ifndef PERL_STRICT_CR
f63a84b2
LW
9550 d = strchr(s, '\r');
9551 if (d) {
b464bac0 9552 char * const olds = s;
f63a84b2 9553 s = d;
3280af22 9554 while (s < PL_bufend) {
f63a84b2
LW
9555 if (*s == '\r') {
9556 *d++ = '\n';
9557 if (*++s == '\n')
9558 s++;
9559 }
9560 else if (*s == '\n' && s[1] == '\r') { /* \015\013 on a mac? */
9561 *d++ = *s++;
9562 s++;
9563 }
9564 else
9565 *d++ = *s++;
9566 }
9567 *d = '\0';
3280af22 9568 PL_bufend = d;
95a20fc0 9569 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2
LW
9570 s = olds;
9571 }
9572#endif
73d840c0
AL
9573 if ( outer || !(found_newline = ninstr(s,PL_bufend,newline,newline+1)) ) {
9574 herewas = newSVpvn(s,PL_bufend-s);
9575 }
9576 else {
9577 s--;
9578 herewas = newSVpvn(s,found_newline-s);
9579 }
79072805 9580 s += SvCUR(herewas);
748a9306 9581
8d6dde3e 9582 tmpstr = NEWSV(87,79);
748a9306
LW
9583 sv_upgrade(tmpstr, SVt_PVIV);
9584 if (term == '\'') {
79072805 9585 op_type = OP_CONST;
45977657 9586 SvIV_set(tmpstr, -1);
748a9306
LW
9587 }
9588 else if (term == '`') {
79072805 9589 op_type = OP_BACKTICK;
45977657 9590 SvIV_set(tmpstr, '\\');
748a9306 9591 }
79072805
LW
9592
9593 CLINE;
57843af0 9594 PL_multi_start = CopLINE(PL_curcop);
3280af22
NIS
9595 PL_multi_open = PL_multi_close = '<';
9596 term = *PL_tokenbuf;
0244c3a4
GS
9597 if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
9598 char *bufptr = PL_sublex_info.super_bufptr;
9599 char *bufend = PL_sublex_info.super_bufend;
b464bac0 9600 char * const olds = s - SvCUR(herewas);
0244c3a4
GS
9601 s = strchr(bufptr, '\n');
9602 if (!s)
9603 s = bufend;
9604 d = s;
9605 while (s < bufend &&
9606 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
9607 if (*s++ == '\n')
57843af0 9608 CopLINE_inc(PL_curcop);
0244c3a4
GS
9609 }
9610 if (s >= bufend) {
eb160463 9611 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
0244c3a4
GS
9612 missingterm(PL_tokenbuf);
9613 }
9614 sv_setpvn(herewas,bufptr,d-bufptr+1);
9615 sv_setpvn(tmpstr,d+1,s-d);
9616 s += len - 1;
9617 sv_catpvn(herewas,s,bufend-s);
95a20fc0 9618 Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
0244c3a4
GS
9619
9620 s = olds;
9621 goto retval;
9622 }
9623 else if (!outer) {
79072805 9624 d = s;
3280af22
NIS
9625 while (s < PL_bufend &&
9626 (*s != term || memNE(s,PL_tokenbuf,len)) ) {
79072805 9627 if (*s++ == '\n')
57843af0 9628 CopLINE_inc(PL_curcop);
79072805 9629 }
3280af22 9630 if (s >= PL_bufend) {
eb160463 9631 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 9632 missingterm(PL_tokenbuf);
79072805
LW
9633 }
9634 sv_setpvn(tmpstr,d+1,s-d);
9635 s += len - 1;
57843af0 9636 CopLINE_inc(PL_curcop); /* the preceding stmt passes a newline */
49d8d3a1 9637
3280af22
NIS
9638 sv_catpvn(herewas,s,PL_bufend-s);
9639 sv_setsv(PL_linestr,herewas);
9640 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
9641 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 9642 PL_last_lop = PL_last_uni = Nullch;
79072805
LW
9643 }
9644 else
9645 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3280af22 9646 while (s >= PL_bufend) { /* multiple line string? */
fd2d0953 9647 if (!outer ||
3280af22 9648 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
eb160463 9649 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
3280af22 9650 missingterm(PL_tokenbuf);
79072805 9651 }
57843af0 9652 CopLINE_inc(PL_curcop);
3280af22 9653 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 9654 PL_last_lop = PL_last_uni = Nullch;
6a27c188 9655#ifndef PERL_STRICT_CR
3280af22 9656 if (PL_bufend - PL_linestart >= 2) {
a1529941
NIS
9657 if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
9658 (PL_bufend[-2] == '\n' && PL_bufend[-1] == '\r'))
c6f14548 9659 {
3280af22
NIS
9660 PL_bufend[-2] = '\n';
9661 PL_bufend--;
95a20fc0 9662 SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
f63a84b2 9663 }
3280af22
NIS
9664 else if (PL_bufend[-1] == '\r')
9665 PL_bufend[-1] = '\n';
f63a84b2 9666 }
3280af22
NIS
9667 else if (PL_bufend - PL_linestart == 1 && PL_bufend[-1] == '\r')
9668 PL_bufend[-1] = '\n';
f63a84b2 9669#endif
3280af22 9670 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
9671 SV *sv = NEWSV(88,0);
9672
93a17b20 9673 sv_upgrade(sv, SVt_PVMG);
3280af22 9674 sv_setsv(sv,PL_linestr);
0ac0412a 9675 (void)SvIOK_on(sv);
45977657 9676 SvIV_set(sv, 0);
57843af0 9677 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
79072805 9678 }
3280af22 9679 if (*s == term && memEQ(s,PL_tokenbuf,len)) {
95a20fc0 9680 STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
1de9afcd 9681 *(SvPVX(PL_linestr) + off ) = ' ';
3280af22
NIS
9682 sv_catsv(PL_linestr,herewas);
9683 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
1de9afcd 9684 s = SvPVX(PL_linestr) + off; /* In case PV of PL_linestr moved. */
79072805
LW
9685 }
9686 else {
3280af22
NIS
9687 s = PL_bufend;
9688 sv_catsv(tmpstr,PL_linestr);
395c3793
LW
9689 }
9690 }
79072805 9691 s++;
0244c3a4 9692retval:
57843af0 9693 PL_multi_end = CopLINE(PL_curcop);
79072805 9694 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
1da4ca5f 9695 SvPV_shrink_to_cur(tmpstr);
79072805 9696 }
8990e307 9697 SvREFCNT_dec(herewas);
2f31ce75 9698 if (!IN_BYTES) {
95a20fc0 9699 if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
2f31ce75
JH
9700 SvUTF8_on(tmpstr);
9701 else if (PL_encoding)
9702 sv_recode_to_utf8(tmpstr, PL_encoding);
9703 }
3280af22 9704 PL_lex_stuff = tmpstr;
79072805
LW
9705 yylval.ival = op_type;
9706 return s;
9707}
9708
02aa26ce
NT
9709/* scan_inputsymbol
9710 takes: current position in input buffer
9711 returns: new position in input buffer
9712 side-effects: yylval and lex_op are set.
9713
9714 This code handles:
9715
9716 <> read from ARGV
9717 <FH> read from filehandle
9718 <pkg::FH> read from package qualified filehandle
9719 <pkg'FH> read from package qualified filehandle
9720 <$fh> read from filehandle in $fh
9721 <*.h> filename glob
9722
9723*/
9724
76e3520e 9725STATIC char *
cea2e8a9 9726S_scan_inputsymbol(pTHX_ char *start)
79072805 9727{
02aa26ce 9728 register char *s = start; /* current position in buffer */
79072805 9729 register char *d;
cfd0369c 9730 const char *e;
1b420867 9731 char *end;
79072805
LW
9732 I32 len;
9733
3280af22
NIS
9734 d = PL_tokenbuf; /* start of temp holding space */
9735 e = PL_tokenbuf + sizeof PL_tokenbuf; /* end of temp holding space */
1b420867
GS
9736 end = strchr(s, '\n');
9737 if (!end)
9738 end = PL_bufend;
9739 s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
02aa26ce
NT
9740
9741 /* die if we didn't have space for the contents of the <>,
1b420867 9742 or if it didn't end, or if we see a newline
02aa26ce
NT
9743 */
9744
3280af22 9745 if (len >= sizeof PL_tokenbuf)
cea2e8a9 9746 Perl_croak(aTHX_ "Excessively long <> operator");
1b420867 9747 if (s >= end)
cea2e8a9 9748 Perl_croak(aTHX_ "Unterminated <> operator");
02aa26ce 9749
fc36a67e 9750 s++;
02aa26ce
NT
9751
9752 /* check for <$fh>
9753 Remember, only scalar variables are interpreted as filehandles by
9754 this code. Anything more complex (e.g., <$fh{$num}>) will be
9755 treated as a glob() call.
9756 This code makes use of the fact that except for the $ at the front,
9757 a scalar variable and a filehandle look the same.
9758 */
4633a7c4 9759 if (*d == '$' && d[1]) d++;
02aa26ce
NT
9760
9761 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
7e2040f0 9762 while (*d && (isALNUM_lazy_if(d,UTF) || *d == '\'' || *d == ':'))
79072805 9763 d++;
02aa26ce
NT
9764
9765 /* If we've tried to read what we allow filehandles to look like, and
9766 there's still text left, then it must be a glob() and not a getline.
9767 Use scan_str to pull out the stuff between the <> and treat it
9768 as nothing more than a string.
9769 */
9770
3280af22 9771 if (d - PL_tokenbuf != len) {
79072805
LW
9772 yylval.ival = OP_GLOB;
9773 set_csh();
09bef843 9774 s = scan_str(start,FALSE,FALSE);
79072805 9775 if (!s)
cea2e8a9 9776 Perl_croak(aTHX_ "Glob not terminated");
79072805
LW
9777 return s;
9778 }
395c3793 9779 else {
9b3023bc
RGS
9780 bool readline_overriden = FALSE;
9781 GV *gv_readline = Nullgv;
9782 GV **gvp;
02aa26ce 9783 /* we're in a filehandle read situation */
3280af22 9784 d = PL_tokenbuf;
02aa26ce
NT
9785
9786 /* turn <> into <ARGV> */
79072805 9787 if (!len)
689badd5 9788 Copy("ARGV",d,5,char);
02aa26ce 9789
9b3023bc 9790 /* Check whether readline() is overriden */
ba979b31
NIS
9791 if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
9792 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
9b3023bc 9793 ||
ba979b31 9794 ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
9b3023bc 9795 && (gv_readline = *gvp) != (GV*)&PL_sv_undef
ba979b31 9796 && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
9b3023bc
RGS
9797 readline_overriden = TRUE;
9798
02aa26ce
NT
9799 /* if <$fh>, create the ops to turn the variable into a
9800 filehandle
9801 */
79072805 9802 if (*d == '$') {
a0d0e21e 9803 I32 tmp;
02aa26ce
NT
9804
9805 /* try to find it in the pad for this block, otherwise find
9806 add symbol table ops
9807 */
11343788 9808 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
dd2155a4 9809 if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
4b6dd97a
NC
9810 HV *stash = PAD_COMPNAME_OURSTASH(tmp);
9811 HEK *stashname = HvNAME_HEK(stash);
5aaec2b4 9812 SV *sym = sv_2mortal(newSVhek(stashname));
f558d5af
JH
9813 sv_catpvn(sym, "::", 2);
9814 sv_catpv(sym, d+1);
9815 d = SvPVX(sym);
9816 goto intro_sym;
9817 }
9818 else {
9819 OP *o = newOP(OP_PADSV, 0);
9820 o->op_targ = tmp;
9b3023bc
RGS
9821 PL_lex_op = readline_overriden
9822 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9823 append_elem(OP_LIST, o,
9824 newCVREF(0, newGVOP(OP_GV,0,gv_readline))))
9825 : (OP*)newUNOP(OP_READLINE, 0, o);
f558d5af 9826 }
a0d0e21e
LW
9827 }
9828 else {
f558d5af
JH
9829 GV *gv;
9830 ++d;
9831intro_sym:
9832 gv = gv_fetchpv(d,
9833 (PL_in_eval
9834 ? (GV_ADDMULTI | GV_ADDINEVAL)
bea70d1e 9835 : GV_ADDMULTI),
f558d5af 9836 SVt_PV);
9b3023bc
RGS
9837 PL_lex_op = readline_overriden
9838 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9839 append_elem(OP_LIST,
9840 newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)),
9841 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9842 : (OP*)newUNOP(OP_READLINE, 0,
9843 newUNOP(OP_RV2SV, 0,
9844 newGVOP(OP_GV, 0, gv)));
a0d0e21e 9845 }
7c6fadd6
RGS
9846 if (!readline_overriden)
9847 PL_lex_op->op_flags |= OPf_SPECIAL;
f5284f61 9848 /* we created the ops in PL_lex_op, so make yylval.ival a null op */
79072805
LW
9849 yylval.ival = OP_NULL;
9850 }
02aa26ce
NT
9851
9852 /* If it's none of the above, it must be a literal filehandle
9853 (<Foo::BAR> or <FOO>) so build a simple readline OP */
79072805 9854 else {
85e6fe83 9855 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
9b3023bc
RGS
9856 PL_lex_op = readline_overriden
9857 ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
9858 append_elem(OP_LIST,
9859 newGVOP(OP_GV, 0, gv),
9860 newCVREF(0, newGVOP(OP_GV, 0, gv_readline))))
9861 : (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
79072805
LW
9862 yylval.ival = OP_NULL;
9863 }
9864 }
02aa26ce 9865
79072805
LW
9866 return s;
9867}
9868
02aa26ce
NT
9869
9870/* scan_str
9871 takes: start position in buffer
09bef843
SB
9872 keep_quoted preserve \ on the embedded delimiter(s)
9873 keep_delims preserve the delimiters around the string
02aa26ce
NT
9874 returns: position to continue reading from buffer
9875 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
9876 updates the read buffer.
9877
9878 This subroutine pulls a string out of the input. It is called for:
9879 q single quotes q(literal text)
9880 ' single quotes 'literal text'
9881 qq double quotes qq(interpolate $here please)
9882 " double quotes "interpolate $here please"
9883 qx backticks qx(/bin/ls -l)
9884 ` backticks `/bin/ls -l`
9885 qw quote words @EXPORT_OK = qw( func() $spam )
9886 m// regexp match m/this/
9887 s/// regexp substitute s/this/that/
9888 tr/// string transliterate tr/this/that/
9889 y/// string transliterate y/this/that/
9890 ($*@) sub prototypes sub foo ($)
09bef843 9891 (stuff) sub attr parameters sub foo : attr(stuff)
02aa26ce
NT
9892 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
9893
9894 In most of these cases (all but <>, patterns and transliterate)
9895 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
9896 calls scan_str(). s/// makes yylex() call scan_subst() which calls
9897 scan_str(). tr/// and y/// make yylex() call scan_trans() which
9898 calls scan_str().
4e553d73 9899
02aa26ce
NT
9900 It skips whitespace before the string starts, and treats the first
9901 character as the delimiter. If the delimiter is one of ([{< then
9902 the corresponding "close" character )]}> is used as the closing
9903 delimiter. It allows quoting of delimiters, and if the string has
9904 balanced delimiters ([{<>}]) it allows nesting.
9905
37fd879b
HS
9906 On success, the SV with the resulting string is put into lex_stuff or,
9907 if that is already non-NULL, into lex_repl. The second case occurs only
9908 when parsing the RHS of the special constructs s/// and tr/// (y///).
9909 For convenience, the terminating delimiter character is stuffed into
9910 SvIVX of the SV.
02aa26ce
NT
9911*/
9912
76e3520e 9913STATIC char *
09bef843 9914S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
79072805 9915{
02aa26ce
NT
9916 SV *sv; /* scalar value: string */
9917 char *tmps; /* temp string, used for delimiter matching */
9918 register char *s = start; /* current position in the buffer */
9919 register char term; /* terminating character */
9920 register char *to; /* current position in the sv's data */
9921 I32 brackets = 1; /* bracket nesting level */
89491803 9922 bool has_utf8 = FALSE; /* is there any utf8 content? */
220e2d4e 9923 I32 termcode; /* terminating char. code */
89ebb4a3 9924 U8 termstr[UTF8_MAXBYTES]; /* terminating string */
220e2d4e
IH
9925 STRLEN termlen; /* length of terminating string */
9926 char *last = NULL; /* last position for nesting bracket */
02aa26ce
NT
9927
9928 /* skip space before the delimiter */
fb73857a 9929 if (isSPACE(*s))
9930 s = skipspace(s);
02aa26ce
NT
9931
9932 /* mark where we are, in case we need to report errors */
79072805 9933 CLINE;
02aa26ce
NT
9934
9935 /* after skipping whitespace, the next character is the terminator */
a0d0e21e 9936 term = *s;
220e2d4e
IH
9937 if (!UTF) {
9938 termcode = termstr[0] = term;
9939 termlen = 1;
9940 }
9941 else {
f3b9ce0f 9942 termcode = utf8_to_uvchr((U8*)s, &termlen);
220e2d4e
IH
9943 Copy(s, termstr, termlen, U8);
9944 if (!UTF8_IS_INVARIANT(term))
9945 has_utf8 = TRUE;
9946 }
b1c7b182 9947
02aa26ce 9948 /* mark where we are */
57843af0 9949 PL_multi_start = CopLINE(PL_curcop);
3280af22 9950 PL_multi_open = term;
02aa26ce
NT
9951
9952 /* find corresponding closing delimiter */
93a17b20 9953 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
220e2d4e
IH
9954 termcode = termstr[0] = term = tmps[5];
9955
3280af22 9956 PL_multi_close = term;
79072805 9957
02aa26ce 9958 /* create a new SV to hold the contents. 87 is leak category, I'm
8d6dde3e
IZ
9959 assuming. 79 is the SV's initial length. What a random number. */
9960 sv = NEWSV(87,79);
ed6116ce 9961 sv_upgrade(sv, SVt_PVIV);
45977657 9962 SvIV_set(sv, termcode);
a0d0e21e 9963 (void)SvPOK_only(sv); /* validate pointer */
02aa26ce
NT
9964
9965 /* move past delimiter and try to read a complete string */
09bef843 9966 if (keep_delims)
220e2d4e
IH
9967 sv_catpvn(sv, s, termlen);
9968 s += termlen;
93a17b20 9969 for (;;) {
220e2d4e
IH
9970 if (PL_encoding && !UTF) {
9971 bool cont = TRUE;
9972
9973 while (cont) {
95a20fc0 9974 int offset = s - SvPVX_const(PL_linestr);
66a1b24b 9975 const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
f3b9ce0f 9976 &offset, (char*)termstr, termlen);
95a20fc0 9977 const char *ns = SvPVX_const(PL_linestr) + offset;
220e2d4e
IH
9978 char *svlast = SvEND(sv) - 1;
9979
9980 for (; s < ns; s++) {
9981 if (*s == '\n' && !PL_rsfp)
9982 CopLINE_inc(PL_curcop);
9983 }
9984 if (!found)
9985 goto read_more_line;
9986 else {
9987 /* handle quoted delimiters */
52327caf 9988 if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
f54cb97a 9989 const char *t;
95a20fc0 9990 for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
220e2d4e
IH
9991 t--;
9992 if ((svlast-1 - t) % 2) {
9993 if (!keep_quoted) {
9994 *(svlast-1) = term;
9995 *svlast = '\0';
9996 SvCUR_set(sv, SvCUR(sv) - 1);
9997 }
9998 continue;
9999 }
10000 }
10001 if (PL_multi_open == PL_multi_close) {
10002 cont = FALSE;
10003 }
10004 else {
f54cb97a
AL
10005 const char *t;
10006 char *w;
220e2d4e
IH
10007 if (!last)
10008 last = SvPVX(sv);
f54cb97a 10009 for (t = w = last; t < svlast; w++, t++) {
220e2d4e
IH
10010 /* At here, all closes are "was quoted" one,
10011 so we don't check PL_multi_close. */
10012 if (*t == '\\') {
10013 if (!keep_quoted && *(t+1) == PL_multi_open)
10014 t++;
10015 else
10016 *w++ = *t++;
10017 }
10018 else if (*t == PL_multi_open)
10019 brackets++;
10020
10021 *w = *t;
10022 }
10023 if (w < t) {
10024 *w++ = term;
10025 *w = '\0';
95a20fc0 10026 SvCUR_set(sv, w - SvPVX_const(sv));
220e2d4e
IH
10027 }
10028 last = w;
10029 if (--brackets <= 0)
10030 cont = FALSE;
10031 }
10032 }
10033 }
10034 if (!keep_delims) {
10035 SvCUR_set(sv, SvCUR(sv) - 1);
10036 *SvEND(sv) = '\0';
10037 }
10038 break;
10039 }
10040
02aa26ce 10041 /* extend sv if need be */
3280af22 10042 SvGROW(sv, SvCUR(sv) + (PL_bufend - s) + 1);
02aa26ce 10043 /* set 'to' to the next character in the sv's string */
463ee0b2 10044 to = SvPVX(sv)+SvCUR(sv);
09bef843 10045
02aa26ce 10046 /* if open delimiter is the close delimiter read unbridle */
3280af22
NIS
10047 if (PL_multi_open == PL_multi_close) {
10048 for (; s < PL_bufend; s++,to++) {
02aa26ce 10049 /* embedded newlines increment the current line number */
3280af22 10050 if (*s == '\n' && !PL_rsfp)
57843af0 10051 CopLINE_inc(PL_curcop);
02aa26ce 10052 /* handle quoted delimiters */
3280af22 10053 if (*s == '\\' && s+1 < PL_bufend && term != '\\') {
09bef843 10054 if (!keep_quoted && s[1] == term)
a0d0e21e 10055 s++;
02aa26ce 10056 /* any other quotes are simply copied straight through */
a0d0e21e
LW
10057 else
10058 *to++ = *s++;
10059 }
02aa26ce
NT
10060 /* terminate when run out of buffer (the for() condition), or
10061 have found the terminator */
220e2d4e
IH
10062 else if (*s == term) {
10063 if (termlen == 1)
10064 break;
f3b9ce0f 10065 if (s+termlen <= PL_bufend && memEQ(s, (char*)termstr, termlen))
220e2d4e
IH
10066 break;
10067 }
63cd0674 10068 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 10069 has_utf8 = TRUE;
93a17b20
LW
10070 *to = *s;
10071 }
10072 }
02aa26ce
NT
10073
10074 /* if the terminator isn't the same as the start character (e.g.,
10075 matched brackets), we have to allow more in the quoting, and
10076 be prepared for nested brackets.
10077 */
93a17b20 10078 else {
02aa26ce 10079 /* read until we run out of string, or we find the terminator */
3280af22 10080 for (; s < PL_bufend; s++,to++) {
02aa26ce 10081 /* embedded newlines increment the line count */
3280af22 10082 if (*s == '\n' && !PL_rsfp)
57843af0 10083 CopLINE_inc(PL_curcop);
02aa26ce 10084 /* backslashes can escape the open or closing characters */
3280af22 10085 if (*s == '\\' && s+1 < PL_bufend) {
09bef843
SB
10086 if (!keep_quoted &&
10087 ((s[1] == PL_multi_open) || (s[1] == PL_multi_close)))
a0d0e21e
LW
10088 s++;
10089 else
10090 *to++ = *s++;
10091 }
02aa26ce 10092 /* allow nested opens and closes */
3280af22 10093 else if (*s == PL_multi_close && --brackets <= 0)
93a17b20 10094 break;
3280af22 10095 else if (*s == PL_multi_open)
93a17b20 10096 brackets++;
63cd0674 10097 else if (!has_utf8 && !UTF8_IS_INVARIANT((U8)*s) && UTF)
89491803 10098 has_utf8 = TRUE;
93a17b20
LW
10099 *to = *s;
10100 }
10101 }
02aa26ce 10102 /* terminate the copied string and update the sv's end-of-string */
93a17b20 10103 *to = '\0';
95a20fc0 10104 SvCUR_set(sv, to - SvPVX_const(sv));
93a17b20 10105
02aa26ce
NT
10106 /*
10107 * this next chunk reads more into the buffer if we're not done yet
10108 */
10109
b1c7b182
GS
10110 if (s < PL_bufend)
10111 break; /* handle case where we are done yet :-) */
79072805 10112
6a27c188 10113#ifndef PERL_STRICT_CR
95a20fc0 10114 if (to - SvPVX_const(sv) >= 2) {
c6f14548
GS
10115 if ((to[-2] == '\r' && to[-1] == '\n') ||
10116 (to[-2] == '\n' && to[-1] == '\r'))
10117 {
f63a84b2
LW
10118 to[-2] = '\n';
10119 to--;
95a20fc0 10120 SvCUR_set(sv, to - SvPVX_const(sv));
f63a84b2
LW
10121 }
10122 else if (to[-1] == '\r')
10123 to[-1] = '\n';
10124 }
95a20fc0 10125 else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
f63a84b2
LW
10126 to[-1] = '\n';
10127#endif
10128
220e2d4e 10129 read_more_line:
02aa26ce
NT
10130 /* if we're out of file, or a read fails, bail and reset the current
10131 line marker so we can report where the unterminated string began
10132 */
3280af22
NIS
10133 if (!PL_rsfp ||
10134 !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
c07a80fd 10135 sv_free(sv);
eb160463 10136 CopLINE_set(PL_curcop, (line_t)PL_multi_start);
79072805
LW
10137 return Nullch;
10138 }
02aa26ce 10139 /* we read a line, so increment our line counter */
57843af0 10140 CopLINE_inc(PL_curcop);
a0ed51b3 10141
02aa26ce 10142 /* update debugger info */
3280af22 10143 if (PERLDB_LINE && PL_curstash != PL_debstash) {
79072805
LW
10144 SV *sv = NEWSV(88,0);
10145
93a17b20 10146 sv_upgrade(sv, SVt_PVMG);
3280af22 10147 sv_setsv(sv,PL_linestr);
0ac0412a 10148 (void)SvIOK_on(sv);
45977657 10149 SvIV_set(sv, 0);
57843af0 10150 av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
395c3793 10151 }
a0ed51b3 10152
3280af22
NIS
10153 /* having changed the buffer, we must update PL_bufend */
10154 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
207e3d1a 10155 PL_last_lop = PL_last_uni = Nullch;
378cc40b 10156 }
4e553d73 10157
02aa26ce
NT
10158 /* at this point, we have successfully read the delimited string */
10159
220e2d4e
IH
10160 if (!PL_encoding || UTF) {
10161 if (keep_delims)
10162 sv_catpvn(sv, s, termlen);
10163 s += termlen;
10164 }
10165 if (has_utf8 || PL_encoding)
b1c7b182 10166 SvUTF8_on(sv);
d0063567 10167
57843af0 10168 PL_multi_end = CopLINE(PL_curcop);
02aa26ce
NT
10169
10170 /* if we allocated too much space, give some back */
93a17b20
LW
10171 if (SvCUR(sv) + 5 < SvLEN(sv)) {
10172 SvLEN_set(sv, SvCUR(sv) + 1);
b7e9a5c2 10173 SvPV_renew(sv, SvLEN(sv));
79072805 10174 }
02aa26ce
NT
10175
10176 /* decide whether this is the first or second quoted string we've read
10177 for this op
10178 */
4e553d73 10179
3280af22
NIS
10180 if (PL_lex_stuff)
10181 PL_lex_repl = sv;
79072805 10182 else
3280af22 10183 PL_lex_stuff = sv;
378cc40b
LW
10184 return s;
10185}
10186
02aa26ce
NT
10187/*
10188 scan_num
10189 takes: pointer to position in buffer
10190 returns: pointer to new position in buffer
10191 side-effects: builds ops for the constant in yylval.op
10192
10193 Read a number in any of the formats that Perl accepts:
10194
7fd134d9
JH
10195 \d(_?\d)*(\.(\d(_?\d)*)?)?[Ee][\+\-]?(\d(_?\d)*) 12 12.34 12.
10196 \.\d(_?\d)*[Ee][\+\-]?(\d(_?\d)*) .34
24138b49
JH
10197 0b[01](_?[01])*
10198 0[0-7](_?[0-7])*
10199 0x[0-9A-Fa-f](_?[0-9A-Fa-f])*
02aa26ce 10200
3280af22 10201 Like most scan_ routines, it uses the PL_tokenbuf buffer to hold the
02aa26ce
NT
10202 thing it reads.
10203
10204 If it reads a number without a decimal point or an exponent, it will
10205 try converting the number to an integer and see if it can do so
10206 without loss of precision.
10207*/
4e553d73 10208
378cc40b 10209char *
bfed75c6 10210Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
378cc40b 10211{
bfed75c6 10212 register const char *s = start; /* current position in buffer */
02aa26ce
NT
10213 register char *d; /* destination in temp buffer */
10214 register char *e; /* end of temp buffer */
86554af2 10215 NV nv; /* number read, as a double */
a7cb1f99 10216 SV *sv = Nullsv; /* place to put the converted number */
a86a20aa 10217 bool floatit; /* boolean: int or float? */
bfed75c6
AL
10218 const char *lastub = 0; /* position of last underbar */
10219 static char const number_too_long[] = "Number too long";
378cc40b 10220
02aa26ce
NT
10221 /* We use the first character to decide what type of number this is */
10222
378cc40b 10223 switch (*s) {
79072805 10224 default:
cea2e8a9 10225 Perl_croak(aTHX_ "panic: scan_num");
4e553d73 10226
02aa26ce 10227 /* if it starts with a 0, it could be an octal number, a decimal in
a7cb1f99 10228 0.13 disguise, or a hexadecimal number, or a binary number. */
378cc40b
LW
10229 case '0':
10230 {
02aa26ce
NT
10231 /* variables:
10232 u holds the "number so far"
4f19785b
WSI
10233 shift the power of 2 of the base
10234 (hex == 4, octal == 3, binary == 1)
02aa26ce
NT
10235 overflowed was the number more than we can hold?
10236
10237 Shift is used when we add a digit. It also serves as an "are
4f19785b
WSI
10238 we in octal/hex/binary?" indicator to disallow hex characters
10239 when in octal mode.
02aa26ce 10240 */
9e24b6e2
JH
10241 NV n = 0.0;
10242 UV u = 0;
79072805 10243 I32 shift;
9e24b6e2 10244 bool overflowed = FALSE;
61f33854 10245 bool just_zero = TRUE; /* just plain 0 or binary number? */
27da23d5
JH
10246 static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
10247 static const char* const bases[5] =
10248 { "", "binary", "", "octal", "hexadecimal" };
10249 static const char* const Bases[5] =
10250 { "", "Binary", "", "Octal", "Hexadecimal" };
10251 static const char* const maxima[5] =
10252 { "",
10253 "0b11111111111111111111111111111111",
10254 "",
10255 "037777777777",
10256 "0xffffffff" };
bfed75c6 10257 const char *base, *Base, *max;
378cc40b 10258
02aa26ce 10259 /* check for hex */
378cc40b
LW
10260 if (s[1] == 'x') {
10261 shift = 4;
10262 s += 2;
61f33854 10263 just_zero = FALSE;
4f19785b
WSI
10264 } else if (s[1] == 'b') {
10265 shift = 1;
10266 s += 2;
61f33854 10267 just_zero = FALSE;
378cc40b 10268 }
02aa26ce 10269 /* check for a decimal in disguise */
b78218b7 10270 else if (s[1] == '.' || s[1] == 'e' || s[1] == 'E')
378cc40b 10271 goto decimal;
02aa26ce 10272 /* so it must be octal */
928753ea 10273 else {
378cc40b 10274 shift = 3;
928753ea
JH
10275 s++;
10276 }
10277
10278 if (*s == '_') {
10279 if (ckWARN(WARN_SYNTAX))
9014280d 10280 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
10281 "Misplaced _ in number");
10282 lastub = s++;
10283 }
9e24b6e2
JH
10284
10285 base = bases[shift];
10286 Base = Bases[shift];
10287 max = maxima[shift];
02aa26ce 10288
4f19785b 10289 /* read the rest of the number */
378cc40b 10290 for (;;) {
9e24b6e2 10291 /* x is used in the overflow test,
893fe2c2 10292 b is the digit we're adding on. */
9e24b6e2 10293 UV x, b;
55497cff 10294
378cc40b 10295 switch (*s) {
02aa26ce
NT
10296
10297 /* if we don't mention it, we're done */
378cc40b
LW
10298 default:
10299 goto out;
02aa26ce 10300
928753ea 10301 /* _ are ignored -- but warned about if consecutive */
de3bb511 10302 case '_':
041457d9 10303 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 10304 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
10305 "Misplaced _ in number");
10306 lastub = s++;
de3bb511 10307 break;
02aa26ce
NT
10308
10309 /* 8 and 9 are not octal */
378cc40b 10310 case '8': case '9':
4f19785b 10311 if (shift == 3)
cea2e8a9 10312 yyerror(Perl_form(aTHX_ "Illegal octal digit '%c'", *s));
378cc40b 10313 /* FALL THROUGH */
02aa26ce
NT
10314
10315 /* octal digits */
4f19785b 10316 case '2': case '3': case '4':
378cc40b 10317 case '5': case '6': case '7':
4f19785b 10318 if (shift == 1)
cea2e8a9 10319 yyerror(Perl_form(aTHX_ "Illegal binary digit '%c'", *s));
4f19785b
WSI
10320 /* FALL THROUGH */
10321
10322 case '0': case '1':
02aa26ce 10323 b = *s++ & 15; /* ASCII digit -> value of digit */
55497cff 10324 goto digit;
02aa26ce
NT
10325
10326 /* hex digits */
378cc40b
LW
10327 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
10328 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
02aa26ce 10329 /* make sure they said 0x */
378cc40b
LW
10330 if (shift != 4)
10331 goto out;
55497cff 10332 b = (*s++ & 7) + 9;
02aa26ce
NT
10333
10334 /* Prepare to put the digit we have onto the end
10335 of the number so far. We check for overflows.
10336 */
10337
55497cff 10338 digit:
61f33854 10339 just_zero = FALSE;
9e24b6e2
JH
10340 if (!overflowed) {
10341 x = u << shift; /* make room for the digit */
10342
10343 if ((x >> shift) != u
10344 && !(PL_hints & HINT_NEW_BINARY)) {
9e24b6e2
JH
10345 overflowed = TRUE;
10346 n = (NV) u;
767a6a26 10347 if (ckWARN_d(WARN_OVERFLOW))
9014280d 10348 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
9e24b6e2
JH
10349 "Integer overflow in %s number",
10350 base);
10351 } else
10352 u = x | b; /* add the digit to the end */
10353 }
10354 if (overflowed) {
10355 n *= nvshift[shift];
10356 /* If an NV has not enough bits in its
10357 * mantissa to represent an UV this summing of
10358 * small low-order numbers is a waste of time
10359 * (because the NV cannot preserve the
10360 * low-order bits anyway): we could just
10361 * remember when did we overflow and in the
10362 * end just multiply n by the right
10363 * amount. */
10364 n += (NV) b;
55497cff 10365 }
378cc40b
LW
10366 break;
10367 }
10368 }
02aa26ce
NT
10369
10370 /* if we get here, we had success: make a scalar value from
10371 the number.
10372 */
378cc40b 10373 out:
928753ea
JH
10374
10375 /* final misplaced underbar check */
10376 if (s[-1] == '_') {
10377 if (ckWARN(WARN_SYNTAX))
9014280d 10378 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
928753ea
JH
10379 }
10380
79072805 10381 sv = NEWSV(92,0);
9e24b6e2 10382 if (overflowed) {
041457d9 10383 if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
9014280d 10384 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
10385 "%s number > %s non-portable",
10386 Base, max);
10387 sv_setnv(sv, n);
10388 }
10389 else {
15041a67 10390#if UVSIZE > 4
041457d9 10391 if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
9014280d 10392 Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
9e24b6e2
JH
10393 "%s number > %s non-portable",
10394 Base, max);
2cc4c2dc 10395#endif
9e24b6e2
JH
10396 sv_setuv(sv, u);
10397 }
61f33854 10398 if (just_zero && (PL_hints & HINT_NEW_INTEGER))
bfed75c6 10399 sv = new_constant(start, s - start, "integer",
61f33854
RGS
10400 sv, Nullsv, NULL);
10401 else if (PL_hints & HINT_NEW_BINARY)
b3ac6de7 10402 sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
378cc40b
LW
10403 }
10404 break;
02aa26ce
NT
10405
10406 /*
10407 handle decimal numbers.
10408 we're also sent here when we read a 0 as the first digit
10409 */
378cc40b
LW
10410 case '1': case '2': case '3': case '4': case '5':
10411 case '6': case '7': case '8': case '9': case '.':
10412 decimal:
3280af22
NIS
10413 d = PL_tokenbuf;
10414 e = PL_tokenbuf + sizeof PL_tokenbuf - 6; /* room for various punctuation */
79072805 10415 floatit = FALSE;
02aa26ce
NT
10416
10417 /* read next group of digits and _ and copy into d */
de3bb511 10418 while (isDIGIT(*s) || *s == '_') {
4e553d73 10419 /* skip underscores, checking for misplaced ones
02aa26ce
NT
10420 if -w is on
10421 */
93a17b20 10422 if (*s == '_') {
041457d9 10423 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 10424 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
10425 "Misplaced _ in number");
10426 lastub = s++;
93a17b20 10427 }
fc36a67e 10428 else {
02aa26ce 10429 /* check for end of fixed-length buffer */
fc36a67e 10430 if (d >= e)
cea2e8a9 10431 Perl_croak(aTHX_ number_too_long);
02aa26ce 10432 /* if we're ok, copy the character */
378cc40b 10433 *d++ = *s++;
fc36a67e 10434 }
378cc40b 10435 }
02aa26ce
NT
10436
10437 /* final misplaced underbar check */
928753ea 10438 if (lastub && s == lastub + 1) {
d008e5eb 10439 if (ckWARN(WARN_SYNTAX))
9014280d 10440 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
d008e5eb 10441 }
02aa26ce
NT
10442
10443 /* read a decimal portion if there is one. avoid
10444 3..5 being interpreted as the number 3. followed
10445 by .5
10446 */
2f3197b3 10447 if (*s == '.' && s[1] != '.') {
79072805 10448 floatit = TRUE;
378cc40b 10449 *d++ = *s++;
02aa26ce 10450
928753ea
JH
10451 if (*s == '_') {
10452 if (ckWARN(WARN_SYNTAX))
9014280d 10453 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
10454 "Misplaced _ in number");
10455 lastub = s;
10456 }
10457
10458 /* copy, ignoring underbars, until we run out of digits.
02aa26ce 10459 */
fc36a67e 10460 for (; isDIGIT(*s) || *s == '_'; s++) {
02aa26ce 10461 /* fixed length buffer check */
fc36a67e 10462 if (d >= e)
cea2e8a9 10463 Perl_croak(aTHX_ number_too_long);
928753ea 10464 if (*s == '_') {
041457d9 10465 if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
9014280d 10466 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
10467 "Misplaced _ in number");
10468 lastub = s;
10469 }
10470 else
fc36a67e 10471 *d++ = *s;
378cc40b 10472 }
928753ea
JH
10473 /* fractional part ending in underbar? */
10474 if (s[-1] == '_') {
10475 if (ckWARN(WARN_SYNTAX))
9014280d 10476 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
928753ea
JH
10477 "Misplaced _ in number");
10478 }
dd629d5b
GS
10479 if (*s == '.' && isDIGIT(s[1])) {
10480 /* oops, it's really a v-string, but without the "v" */
f4758303 10481 s = start;
dd629d5b
GS
10482 goto vstring;
10483 }
378cc40b 10484 }
02aa26ce
NT
10485
10486 /* read exponent part, if present */
3792a11b 10487 if ((*s == 'e' || *s == 'E') && strchr("+-0123456789_", s[1])) {
79072805
LW
10488 floatit = TRUE;
10489 s++;
02aa26ce
NT
10490
10491 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
79072805 10492 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
02aa26ce 10493
7fd134d9
JH
10494 /* stray preinitial _ */
10495 if (*s == '_') {
10496 if (ckWARN(WARN_SYNTAX))
9014280d 10497 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
10498 "Misplaced _ in number");
10499 lastub = s++;
10500 }
10501
02aa26ce 10502 /* allow positive or negative exponent */
378cc40b
LW
10503 if (*s == '+' || *s == '-')
10504 *d++ = *s++;
02aa26ce 10505
7fd134d9
JH
10506 /* stray initial _ */
10507 if (*s == '_') {
10508 if (ckWARN(WARN_SYNTAX))
9014280d 10509 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9
JH
10510 "Misplaced _ in number");
10511 lastub = s++;
10512 }
10513
7fd134d9
JH
10514 /* read digits of exponent */
10515 while (isDIGIT(*s) || *s == '_') {
10516 if (isDIGIT(*s)) {
10517 if (d >= e)
10518 Perl_croak(aTHX_ number_too_long);
b3b48e3e 10519 *d++ = *s++;
7fd134d9
JH
10520 }
10521 else {
041457d9
DM
10522 if (((lastub && s == lastub + 1) ||
10523 (!isDIGIT(s[1]) && s[1] != '_'))
10524 && ckWARN(WARN_SYNTAX))
9014280d 10525 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
7fd134d9 10526 "Misplaced _ in number");
b3b48e3e 10527 lastub = s++;
7fd134d9 10528 }
7fd134d9 10529 }
378cc40b 10530 }
02aa26ce 10531
02aa26ce
NT
10532
10533 /* make an sv from the string */
79072805 10534 sv = NEWSV(92,0);
097ee67d 10535
0b7fceb9 10536 /*
58bb9ec3
NC
10537 We try to do an integer conversion first if no characters
10538 indicating "float" have been found.
0b7fceb9
MU
10539 */
10540
10541 if (!floatit) {
58bb9ec3
NC
10542 UV uv;
10543 int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
10544
10545 if (flags == IS_NUMBER_IN_UV) {
10546 if (uv <= IV_MAX)
86554af2 10547 sv_setiv(sv, uv); /* Prefer IVs over UVs. */
58bb9ec3 10548 else
c239479b 10549 sv_setuv(sv, uv);
58bb9ec3
NC
10550 } else if (flags == (IS_NUMBER_IN_UV | IS_NUMBER_NEG)) {
10551 if (uv <= (UV) IV_MIN)
10552 sv_setiv(sv, -(IV)uv);
10553 else
10554 floatit = TRUE;
10555 } else
10556 floatit = TRUE;
10557 }
0b7fceb9 10558 if (floatit) {
58bb9ec3
NC
10559 /* terminate the string */
10560 *d = '\0';
86554af2
JH
10561 nv = Atof(PL_tokenbuf);
10562 sv_setnv(sv, nv);
10563 }
86554af2 10564
b8403495
JH
10565 if ( floatit ? (PL_hints & HINT_NEW_FLOAT) :
10566 (PL_hints & HINT_NEW_INTEGER) )
4e553d73 10567 sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
b8403495
JH
10568 (floatit ? "float" : "integer"),
10569 sv, Nullsv, NULL);
378cc40b 10570 break;
0b7fceb9 10571
e312add1 10572 /* if it starts with a v, it could be a v-string */
a7cb1f99 10573 case 'v':
dd629d5b 10574vstring:
f4758303 10575 sv = NEWSV(92,5); /* preallocate storage space */
b0f01acb 10576 s = scan_vstring(s,sv);
a7cb1f99 10577 break;
79072805 10578 }
a687059c 10579
02aa26ce
NT
10580 /* make the op for the constant and return */
10581
a86a20aa 10582 if (sv)
b73d6f50 10583 lvalp->opval = newSVOP(OP_CONST, 0, sv);
a7cb1f99 10584 else
b73d6f50 10585 lvalp->opval = Nullop;
a687059c 10586
73d840c0 10587 return (char *)s;
378cc40b
LW
10588}
10589
76e3520e 10590STATIC char *
cea2e8a9 10591S_scan_formline(pTHX_ register char *s)
378cc40b 10592{
79072805 10593 register char *eol;
378cc40b 10594 register char *t;
79cb57f6 10595 SV *stuff = newSVpvn("",0);
79072805 10596 bool needargs = FALSE;
c5ee2135 10597 bool eofmt = FALSE;
378cc40b 10598
79072805 10599 while (!needargs) {
a1b95068 10600 if (*s == '.') {
51882d45 10601#ifdef PERL_STRICT_CR
bf4acbe4 10602 for (t = s+1;SPACE_OR_TAB(*t); t++) ;
51882d45 10603#else
bf4acbe4 10604 for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
51882d45 10605#endif
c5ee2135
WL
10606 if (*t == '\n' || t == PL_bufend) {
10607 eofmt = TRUE;
79072805 10608 break;
c5ee2135 10609 }
79072805 10610 }
3280af22 10611 if (PL_in_eval && !PL_rsfp) {
07409e01 10612 eol = (char *) memchr(s,'\n',PL_bufend-s);
0f85fab0 10613 if (!eol++)
3280af22 10614 eol = PL_bufend;
0f85fab0
LW
10615 }
10616 else
3280af22 10617 eol = PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
79072805 10618 if (*s != '#') {
a0d0e21e
LW
10619 for (t = s; t < eol; t++) {
10620 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
10621 needargs = FALSE;
10622 goto enough; /* ~~ must be first line in formline */
378cc40b 10623 }
a0d0e21e
LW
10624 if (*t == '@' || *t == '^')
10625 needargs = TRUE;
378cc40b 10626 }
7121b347
MG
10627 if (eol > s) {
10628 sv_catpvn(stuff, s, eol-s);
2dc4c65b 10629#ifndef PERL_STRICT_CR
7121b347
MG
10630 if (eol-s > 1 && eol[-2] == '\r' && eol[-1] == '\n') {
10631 char *end = SvPVX(stuff) + SvCUR(stuff);
10632 end[-2] = '\n';
10633 end[-1] = '\0';
b162af07 10634 SvCUR_set(stuff, SvCUR(stuff) - 1);
7121b347 10635 }
2dc4c65b 10636#endif
7121b347
MG
10637 }
10638 else
10639 break;
79072805 10640 }
95a20fc0 10641 s = (char*)eol;
3280af22
NIS
10642 if (PL_rsfp) {
10643 s = filter_gets(PL_linestr, PL_rsfp, 0);
10644 PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
10645 PL_bufend = PL_bufptr + SvCUR(PL_linestr);
207e3d1a 10646 PL_last_lop = PL_last_uni = Nullch;
79072805 10647 if (!s) {
3280af22 10648 s = PL_bufptr;
378cc40b
LW
10649 break;
10650 }
378cc40b 10651 }
463ee0b2 10652 incline(s);
79072805 10653 }
a0d0e21e
LW
10654 enough:
10655 if (SvCUR(stuff)) {
3280af22 10656 PL_expect = XTERM;
79072805 10657 if (needargs) {
3280af22
NIS
10658 PL_lex_state = LEX_NORMAL;
10659 PL_nextval[PL_nexttoke].ival = 0;
79072805
LW
10660 force_next(',');
10661 }
a0d0e21e 10662 else
3280af22 10663 PL_lex_state = LEX_FORMLINE;
1bd51a4c 10664 if (!IN_BYTES) {
95a20fc0 10665 if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
1bd51a4c
IH
10666 SvUTF8_on(stuff);
10667 else if (PL_encoding)
10668 sv_recode_to_utf8(stuff, PL_encoding);
10669 }
3280af22 10670 PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
79072805 10671 force_next(THING);
3280af22 10672 PL_nextval[PL_nexttoke].ival = OP_FORMLINE;
79072805 10673 force_next(LSTOP);
378cc40b 10674 }
79072805 10675 else {
8990e307 10676 SvREFCNT_dec(stuff);
c5ee2135
WL
10677 if (eofmt)
10678 PL_lex_formbrack = 0;
3280af22 10679 PL_bufptr = s;
79072805
LW
10680 }
10681 return s;
378cc40b 10682}
a687059c 10683
76e3520e 10684STATIC void
cea2e8a9 10685S_set_csh(pTHX)
a687059c 10686{
ae986130 10687#ifdef CSH
3280af22
NIS
10688 if (!PL_cshlen)
10689 PL_cshlen = strlen(PL_cshname);
ae986130 10690#endif
a687059c 10691}
463ee0b2 10692
ba6d6ac9 10693I32
864dbfa3 10694Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
8990e307 10695{
a3b680e6 10696 const I32 oldsavestack_ix = PL_savestack_ix;
3280af22 10697 CV* outsidecv = PL_compcv;
8990e307 10698
3280af22
NIS
10699 if (PL_compcv) {
10700 assert(SvTYPE(PL_compcv) == SVt_PVCV);
e9a444f0 10701 }
7766f137 10702 SAVEI32(PL_subline);
3280af22 10703 save_item(PL_subname);
3280af22 10704 SAVESPTR(PL_compcv);
3280af22
NIS
10705
10706 PL_compcv = (CV*)NEWSV(1104,0);
10707 sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
10708 CvFLAGS(PL_compcv) |= flags;
10709
57843af0 10710 PL_subline = CopLINE(PL_curcop);
dd2155a4 10711 CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
3280af22 10712 CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
a3985cdc 10713 CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
748a9306 10714
8990e307
LW
10715 return oldsavestack_ix;
10716}
10717
084592ab
CN
10718#ifdef __SC__
10719#pragma segment Perl_yylex
10720#endif
8990e307 10721int
bfed75c6 10722Perl_yywarn(pTHX_ const char *s)
8990e307 10723{
faef0170 10724 PL_in_eval |= EVAL_WARNONLY;
748a9306 10725 yyerror(s);
faef0170 10726 PL_in_eval &= ~EVAL_WARNONLY;
748a9306 10727 return 0;
8990e307
LW
10728}
10729
10730int
bfed75c6 10731Perl_yyerror(pTHX_ const char *s)
463ee0b2 10732{
bfed75c6
AL
10733 const char *where = NULL;
10734 const char *context = NULL;
68dc0745 10735 int contlen = -1;
46fc3d4c 10736 SV *msg;
463ee0b2 10737
3280af22 10738 if (!yychar || (yychar == ';' && !PL_rsfp))
54310121 10739 where = "at EOF";
8bcfe651
TM
10740 else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
10741 PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
10742 PL_oldbufptr != PL_bufptr) {
f355267c
JH
10743 /*
10744 Only for NetWare:
10745 The code below is removed for NetWare because it abends/crashes on NetWare
10746 when the script has error such as not having the closing quotes like:
10747 if ($var eq "value)
10748 Checking of white spaces is anyway done in NetWare code.
10749 */
10750#ifndef NETWARE
3280af22
NIS
10751 while (isSPACE(*PL_oldoldbufptr))
10752 PL_oldoldbufptr++;
f355267c 10753#endif
3280af22
NIS
10754 context = PL_oldoldbufptr;
10755 contlen = PL_bufptr - PL_oldoldbufptr;
463ee0b2 10756 }
8bcfe651
TM
10757 else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
10758 PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
f355267c
JH
10759 /*
10760 Only for NetWare:
10761 The code below is removed for NetWare because it abends/crashes on NetWare
10762 when the script has error such as not having the closing quotes like:
10763 if ($var eq "value)
10764 Checking of white spaces is anyway done in NetWare code.
10765 */
10766#ifndef NETWARE
3280af22
NIS
10767 while (isSPACE(*PL_oldbufptr))
10768 PL_oldbufptr++;
f355267c 10769#endif
3280af22
NIS
10770 context = PL_oldbufptr;
10771 contlen = PL_bufptr - PL_oldbufptr;
463ee0b2
LW
10772 }
10773 else if (yychar > 255)
68dc0745 10774 where = "next token ???";
12fbd33b 10775 else if (yychar == -2) { /* YYEMPTY */
3280af22
NIS
10776 if (PL_lex_state == LEX_NORMAL ||
10777 (PL_lex_state == LEX_KNOWNEXT && PL_lex_defer == LEX_NORMAL))
68dc0745 10778 where = "at end of line";
3280af22 10779 else if (PL_lex_inpat)
68dc0745 10780 where = "within pattern";
463ee0b2 10781 else
68dc0745 10782 where = "within string";
463ee0b2 10783 }
46fc3d4c 10784 else {
79cb57f6 10785 SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
46fc3d4c 10786 if (yychar < 32)
cea2e8a9 10787 Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
46fc3d4c 10788 else if (isPRINT_LC(yychar))
cea2e8a9 10789 Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
463ee0b2 10790 else
cea2e8a9 10791 Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
95a20fc0 10792 where = SvPVX_const(where_sv);
463ee0b2 10793 }
46fc3d4c 10794 msg = sv_2mortal(newSVpv(s, 0));
ed094faf 10795 Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
248c2a4d 10796 OutCopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
68dc0745 10797 if (context)
cea2e8a9 10798 Perl_sv_catpvf(aTHX_ msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 10799 else
cea2e8a9 10800 Perl_sv_catpvf(aTHX_ msg, "%s\n", where);
57843af0 10801 if (PL_multi_start < PL_multi_end && (U32)(CopLINE(PL_curcop) - PL_multi_end) <= 1) {
cf2093f6 10802 Perl_sv_catpvf(aTHX_ msg,
57def98f 10803 " (Might be a runaway multi-line %c%c string starting on line %"IVdf")\n",
cf2093f6 10804 (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start);
3280af22 10805 PL_multi_end = 0;
a0d0e21e 10806 }
56da5a46
RGS
10807 if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
10808 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
463ee0b2 10809 else
5a844595 10810 qerror(msg);
c7d6bfb2
GS
10811 if (PL_error_count >= 10) {
10812 if (PL_in_eval && SvCUR(ERRSV))
d2560b70 10813 Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
248c2a4d 10814 ERRSV, OutCopFILE(PL_curcop));
c7d6bfb2
GS
10815 else
10816 Perl_croak(aTHX_ "%s has too many errors.\n",
248c2a4d 10817 OutCopFILE(PL_curcop));
c7d6bfb2 10818 }
3280af22
NIS
10819 PL_in_my = 0;
10820 PL_in_my_stash = Nullhv;
463ee0b2
LW
10821 return 0;
10822}
084592ab
CN
10823#ifdef __SC__
10824#pragma segment Main
10825#endif
4e35701f 10826
b250498f 10827STATIC char*
3ae08724 10828S_swallow_bom(pTHX_ U8 *s)
01ec43d0 10829{
f54cb97a 10830 const STRLEN slen = SvCUR(PL_linestr);
7aa207d6 10831 switch (s[0]) {
4e553d73
NIS
10832 case 0xFF:
10833 if (s[1] == 0xFE) {
7aa207d6 10834 /* UTF-16 little-endian? (or UTF32-LE?) */
3ae08724 10835 if (s[2] == 0 && s[3] == 0) /* UTF-32 little-endian */
7aa207d6 10836 Perl_croak(aTHX_ "Unsupported script encoding UTF32-LE");
01ec43d0 10837#ifndef PERL_NO_UTF16_FILTER
7aa207d6 10838 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF16-LE script encoding (BOM)\n");
3ae08724 10839 s += 2;
7aa207d6 10840 utf16le:
dea0fc0b
JH
10841 if (PL_bufend > (char*)s) {
10842 U8 *news;
10843 I32 newlen;
10844
10845 filter_add(utf16rev_textfilter, NULL);
a02a5408 10846 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
10847 utf16_to_utf8_reversed(s, news,
10848 PL_bufend - (char*)s - 1,
10849 &newlen);
7aa207d6 10850 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 10851 Safefree(news);
7aa207d6
JH
10852 SvUTF8_on(PL_linestr);
10853 s = (U8*)SvPVX(PL_linestr);
10854 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 10855 }
b250498f 10856#else
7aa207d6 10857 Perl_croak(aTHX_ "Unsupported script encoding UTF16-LE");
b250498f 10858#endif
01ec43d0
GS
10859 }
10860 break;
78ae23f5 10861 case 0xFE:
7aa207d6 10862 if (s[1] == 0xFF) { /* UTF-16 big-endian? */
01ec43d0 10863#ifndef PERL_NO_UTF16_FILTER
7aa207d6 10864 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (BOM)\n");
dea0fc0b 10865 s += 2;
7aa207d6 10866 utf16be:
dea0fc0b
JH
10867 if (PL_bufend > (char *)s) {
10868 U8 *news;
10869 I32 newlen;
10870
10871 filter_add(utf16_textfilter, NULL);
a02a5408 10872 Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
1de9afcd
RGS
10873 utf16_to_utf8(s, news,
10874 PL_bufend - (char*)s,
10875 &newlen);
7aa207d6 10876 sv_setpvn(PL_linestr, (const char*)news, newlen);
dea0fc0b 10877 Safefree(news);
7aa207d6
JH
10878 SvUTF8_on(PL_linestr);
10879 s = (U8*)SvPVX(PL_linestr);
10880 PL_bufend = SvPVX(PL_linestr) + newlen;
dea0fc0b 10881 }
b250498f 10882#else
7aa207d6 10883 Perl_croak(aTHX_ "Unsupported script encoding UTF16-BE");
b250498f 10884#endif
01ec43d0
GS
10885 }
10886 break;
3ae08724
GS
10887 case 0xEF:
10888 if (slen > 2 && s[1] == 0xBB && s[2] == 0xBF) {
7aa207d6 10889 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-8 script encoding (BOM)\n");
01ec43d0
GS
10890 s += 3; /* UTF-8 */
10891 }
10892 break;
10893 case 0:
7aa207d6
JH
10894 if (slen > 3) {
10895 if (s[1] == 0) {
10896 if (s[2] == 0xFE && s[3] == 0xFF) {
10897 /* UTF-32 big-endian */
10898 Perl_croak(aTHX_ "Unsupported script encoding UTF32-BE");
10899 }
10900 }
10901 else if (s[2] == 0 && s[3] != 0) {
10902 /* Leading bytes
10903 * 00 xx 00 xx
10904 * are a good indicator of UTF-16BE. */
10905 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16BE script encoding (no BOM)\n");
10906 goto utf16be;
10907 }
01ec43d0 10908 }
7aa207d6
JH
10909 default:
10910 if (slen > 3 && s[1] == 0 && s[2] != 0 && s[3] == 0) {
10911 /* Leading bytes
10912 * xx 00 xx 00
10913 * are a good indicator of UTF-16LE. */
10914 if (DEBUG_p_TEST || DEBUG_T_TEST) PerlIO_printf(Perl_debug_log, "UTF-16LE script encoding (no BOM)\n");
10915 goto utf16le;
10916 }
01ec43d0 10917 }
b8f84bb2 10918 return (char*)s;
b250498f 10919}
4755096e 10920
4755096e
GS
10921/*
10922 * restore_rsfp
10923 * Restore a source filter.
10924 */
10925
10926static void
acfe0abc 10927restore_rsfp(pTHX_ void *f)
4755096e
GS
10928{
10929 PerlIO *fp = (PerlIO*)f;
10930
10931 if (PL_rsfp == PerlIO_stdin())
10932 PerlIO_clearerr(PL_rsfp);
10933 else if (PL_rsfp && (PL_rsfp != fp))
10934 PerlIO_close(PL_rsfp);
10935 PL_rsfp = fp;
10936}
6e3aabd6
GS
10937
10938#ifndef PERL_NO_UTF16_FILTER
10939static I32
acfe0abc 10940utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 10941{
f54cb97a
AL
10942 const STRLEN old = SvCUR(sv);
10943 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
10944 DEBUG_P(PerlIO_printf(Perl_debug_log,
10945 "utf16_textfilter(%p): %d %d (%d)\n",
4fccd7c6 10946 utf16_textfilter, idx, maxlen, (int) count));
6e3aabd6
GS
10947 if (count) {
10948 U8* tmps;
dea0fc0b 10949 I32 newlen;
a02a5408 10950 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
10951 Copy(SvPVX_const(sv), tmps, old, char);
10952 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
10953 SvCUR(sv) - old, &newlen);
10954 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 10955 }
1de9afcd
RGS
10956 DEBUG_P({sv_dump(sv);});
10957 return SvCUR(sv);
6e3aabd6
GS
10958}
10959
10960static I32
acfe0abc 10961utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
6e3aabd6 10962{
f54cb97a
AL
10963 const STRLEN old = SvCUR(sv);
10964 const I32 count = FILTER_READ(idx+1, sv, maxlen);
1de9afcd
RGS
10965 DEBUG_P(PerlIO_printf(Perl_debug_log,
10966 "utf16rev_textfilter(%p): %d %d (%d)\n",
4fccd7c6 10967 utf16rev_textfilter, idx, maxlen, (int) count));
6e3aabd6
GS
10968 if (count) {
10969 U8* tmps;
dea0fc0b 10970 I32 newlen;
a02a5408 10971 Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
95a20fc0
SP
10972 Copy(SvPVX_const(sv), tmps, old, char);
10973 utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
1de9afcd
RGS
10974 SvCUR(sv) - old, &newlen);
10975 sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
6e3aabd6 10976 }
1de9afcd 10977 DEBUG_P({ sv_dump(sv); });
6e3aabd6
GS
10978 return count;
10979}
10980#endif
9f4817db 10981
f333445c
JP
10982/*
10983Returns a pointer to the next character after the parsed
10984vstring, as well as updating the passed in sv.
10985
10986Function must be called like
10987
10988 sv = NEWSV(92,5);
10989 s = scan_vstring(s,sv);
10990
10991The sv should already be large enough to store the vstring
10992passed in, for performance reasons.
10993
10994*/
10995
10996char *
bfed75c6 10997Perl_scan_vstring(pTHX_ const char *s, SV *sv)
f333445c 10998{
bfed75c6
AL
10999 const char *pos = s;
11000 const char *start = s;
f333445c 11001 if (*pos == 'v') pos++; /* get past 'v' */
3e884cbf
JH
11002 while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
11003 pos++;
f333445c
JP
11004 if ( *pos != '.') {
11005 /* this may not be a v-string if followed by => */
bfed75c6 11006 const char *next = pos;
8fc7bb1c
SM
11007 while (next < PL_bufend && isSPACE(*next))
11008 ++next;
11009 if ((PL_bufend - next) >= 2 && *next == '=' && next[1] == '>' ) {
f333445c
JP
11010 /* return string not v-string */
11011 sv_setpvn(sv,(char *)s,pos-s);
73d840c0 11012 return (char *)pos;
f333445c
JP
11013 }
11014 }
11015
11016 if (!isALPHA(*pos)) {
11017 UV rev;
89ebb4a3 11018 U8 tmpbuf[UTF8_MAXBYTES+1];
f333445c
JP
11019 U8 *tmpend;
11020
11021 if (*s == 'v') s++; /* get past 'v' */
11022
11023 sv_setpvn(sv, "", 0);
11024
11025 for (;;) {
11026 rev = 0;
11027 {
11028 /* this is atoi() that tolerates underscores */
bfed75c6 11029 const char *end = pos;
f333445c
JP
11030 UV mult = 1;
11031 while (--end >= s) {
11032 UV orev;
11033 if (*end == '_')
11034 continue;
11035 orev = rev;
11036 rev += (*end - '0') * mult;
11037 mult *= 10;
11038 if (orev > rev && ckWARN_d(WARN_OVERFLOW))
11039 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
11040 "Integer overflow in decimal number");
11041 }
11042 }
11043#ifdef EBCDIC
11044 if (rev > 0x7FFFFFFF)
11045 Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647");
11046#endif
11047 /* Append native character for the rev point */
11048 tmpend = uvchr_to_utf8(tmpbuf, rev);
11049 sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf);
11050 if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
11051 SvUTF8_on(sv);
3e884cbf 11052 if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
f333445c
JP
11053 s = ++pos;
11054 else {
11055 s = pos;
11056 break;
11057 }
3e884cbf 11058 while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
f333445c
JP
11059 pos++;
11060 }
11061 SvPOK_on(sv);
11062 sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start);
11063 SvRMAGICAL_on(sv);
11064 }
73d840c0 11065 return (char *)s;
f333445c
JP
11066}
11067
1da4ca5f
NC
11068/*
11069 * Local variables:
11070 * c-indentation-style: bsd
11071 * c-basic-offset: 4
11072 * indent-tabs-mode: t
11073 * End:
11074 *
37442d52
RGS
11075 * ex: set ts=8 sts=4 sw=4 noet:
11076 */