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