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