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