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