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