This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add missing reset of eval_owner if doeval() fails to parse.
[perl5.git] / toke.c
CommitLineData
a0d0e21e 1/* toke.c
a687059c 2 *
9607fc9c 3 * Copyright (c) 1991-1997, Larry Wall
a687059c 4 *
d48672a2
LW
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.
378cc40b 7 *
a0d0e21e
LW
8 */
9
10/*
11 * "It all comes from here, the stench and the peril." --Frodo
378cc40b
LW
12 */
13
14#include "EXTERN.h"
15#include "perl.h"
378cc40b 16
a0d0e21e
LW
17static void check_uni _((void));
18static void force_next _((I32 type));
89bfa8cd 19static char *force_version _((char *start));
a0d0e21e
LW
20static char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
21static SV *q _((SV *sv));
22static char *scan_const _((char *start));
23static char *scan_formline _((char *s));
24static char *scan_heredoc _((char *s));
8903cb82 25static char *scan_ident _((char *s, char *send, char *dest, STRLEN destlen,
26 I32 ck_uni));
a0d0e21e
LW
27static char *scan_inputsymbol _((char *start));
28static char *scan_pat _((char *start));
29static char *scan_str _((char *start));
30static char *scan_subst _((char *start));
31static char *scan_trans _((char *start));
8903cb82 32static char *scan_word _((char *s, char *dest, STRLEN destlen,
33 int allow_package, STRLEN *slp));
a0d0e21e
LW
34static char *skipspace _((char *s));
35static void checkcomma _((char *s, char *name, char *what));
36static void force_ident _((char *s, int kind));
37static void incline _((char *s));
38static int intuit_method _((char *s, GV *gv));
39static int intuit_more _((char *s));
40static I32 lop _((I32 f, expectation x, char *s));
41static void missingterm _((char *s));
42static void no_op _((char *what, char *s));
43static void set_csh _((void));
44static I32 sublex_done _((void));
55497cff 45static I32 sublex_push _((void));
a0d0e21e
LW
46static I32 sublex_start _((void));
47#ifdef CRIPPLED_CC
48static int uni _((I32 f, char *s));
49#endif
fd049845 50static char * filter_gets _((SV *sv, PerlIO *fp, STRLEN append));
6d5fb7e3 51static void restore_rsfp _((void *f));
2f3197b3 52
fc36a67e 53static char ident_too_long[] = "Identifier too long";
8903cb82 54
fd049845 55static char *linestart; /* beg. of most recently read line */
56
bbce6d69 57static char pending_ident; /* pending identifier lookup */
58
55497cff 59static struct {
60 I32 super_state; /* lexer state to save */
61 I32 sub_inwhat; /* "lex_inwhat" to use */
62 OP *sub_op; /* "lex_op" to use */
63} sublex_info;
64
79072805
LW
65/* The following are arranged oddly so that the guard on the switch statement
66 * can get by with a single comparison (if the compiler is smart enough).
67 */
68
55497cff 69#define LEX_NORMAL 10
70#define LEX_INTERPNORMAL 9
71#define LEX_INTERPCASEMOD 8
72#define LEX_INTERPPUSH 7
73#define LEX_INTERPSTART 6
74#define LEX_INTERPEND 5
75#define LEX_INTERPENDMAYBE 4
76#define LEX_INTERPCONCAT 3
77#define LEX_INTERPCONST 2
78#define LEX_FORMLINE 1
79#define LEX_KNOWNEXT 0
79072805 80
395c3793
LW
81#ifdef I_FCNTL
82#include <fcntl.h>
83#endif
fe14fcc3
LW
84#ifdef I_SYS_FILE
85#include <sys/file.h>
86#endif
395c3793 87
a790bc05 88/* XXX If this causes problems, set i_unistd=undef in the hint file. */
89#ifdef I_UNISTD
90# include <unistd.h> /* Needed for execv() */
91#endif
92
93
79072805
LW
94#ifdef ff_next
95#undef ff_next
d48672a2
LW
96#endif
97
79072805 98#include "keywords.h"
fe14fcc3 99
ae986130
LW
100#ifdef CLINE
101#undef CLINE
102#endif
79072805 103#define CLINE (copline = (curcop->cop_line < copline ? curcop->cop_line : copline))
378cc40b 104
79072805
LW
105#define TOKEN(retval) return (bufptr = s,(int)retval)
106#define OPERATOR(retval) return (expect = XTERM,bufptr = s,(int)retval)
a0d0e21e 107#define AOPERATOR(retval) return ao((expect = XTERM,bufptr = s,(int)retval))
79072805 108#define PREBLOCK(retval) return (expect = XBLOCK,bufptr = s,(int)retval)
a0d0e21e 109#define PRETERMBLOCK(retval) return (expect = XTERMBLOCK,bufptr = s,(int)retval)
79072805
LW
110#define PREREF(retval) return (expect = XREF,bufptr = s,(int)retval)
111#define TERM(retval) return (CLINE, expect = XOPERATOR,bufptr = s,(int)retval)
463ee0b2 112#define LOOPX(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LOOPEX)
79072805
LW
113#define FTST(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)UNIOP)
114#define FUN0(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC0)
115#define FUN1(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC1)
a0d0e21e
LW
116#define BOop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITOROP))
117#define BAop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITANDOP))
118#define SHop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)SHIFTOP))
119#define PWop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)POWOP))
79072805 120#define PMop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)MATCHOP)
a0d0e21e
LW
121#define Aop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)ADDOP))
122#define Mop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)MULOP))
79072805
LW
123#define Eop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)EQOP)
124#define Rop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)RELOP)
2f3197b3 125
a687059c
LW
126/* This bit of chicanery makes a unary function followed by
127 * a parenthesis into a function with one argument, highest precedence.
128 */
2f3197b3 129#define UNI(f) return(yylval.ival = f, \
79072805 130 expect = XTERM, \
2f3197b3
LW
131 bufptr = s, \
132 last_uni = oldbufptr, \
a0d0e21e 133 last_lop_op = f, \
a687059c
LW
134 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
135
79072805
LW
136#define UNIBRACK(f) return(yylval.ival = f, \
137 bufptr = s, \
138 last_uni = oldbufptr, \
139 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
140
9f68db38 141/* grandfather return to old style */
79072805
LW
142#define OLDLOP(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LSTOP)
143
a0d0e21e
LW
144static int
145ao(toketype)
146int toketype;
147{
148 if (*bufptr == '=') {
149 bufptr++;
150 if (toketype == ANDAND)
151 yylval.ival = OP_ANDASSIGN;
152 else if (toketype == OROR)
153 yylval.ival = OP_ORASSIGN;
154 toketype = ASSIGNOP;
155 }
156 return toketype;
157}
158
8990e307
LW
159static void
160no_op(what, s)
463ee0b2 161char *what;
8990e307 162char *s;
463ee0b2 163{
748a9306 164 char *oldbp = bufptr;
fd049845 165 bool is_first = (oldbufptr == linestart);
68dc0745 166
8990e307 167 bufptr = s;
46fc3d4c 168 yywarn(form("%s found where operator expected", what));
748a9306 169 if (is_first)
a0d0e21e 170 warn("\t(Missing semicolon on previous line?)\n");
748a9306
LW
171 else if (oldoldbufptr && isIDFIRST(*oldoldbufptr)) {
172 char *t;
173 for (t = oldoldbufptr; *t && (isALNUM(*t) || *t == ':'); t++) ;
174 if (t < bufptr && isSPACE(*t))
175 warn("\t(Do you need to predeclare %.*s?)\n",
176 t - oldoldbufptr, oldoldbufptr);
177
178 }
179 else
180 warn("\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
181 bufptr = oldbp;
8990e307
LW
182}
183
184static void
185missingterm(s)
186char *s;
187{
188 char tmpbuf[3];
189 char q;
190 if (s) {
191 char *nl = strrchr(s,'\n');
192 if (nl)
193 *nl = '\0';
194 }
195 else if (multi_close < 32 || multi_close == 127) {
196 *tmpbuf = '^';
bbce6d69 197 tmpbuf[1] = toCTRL(multi_close);
8990e307
LW
198 s = "\\n";
199 tmpbuf[2] = '\0';
200 s = tmpbuf;
201 }
202 else {
203 *tmpbuf = multi_close;
204 tmpbuf[1] = '\0';
205 s = tmpbuf;
206 }
207 q = strchr(s,'"') ? '\'' : '"';
208 croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
463ee0b2 209}
79072805
LW
210
211void
a0d0e21e
LW
212deprecate(s)
213char *s;
214{
215 if (dowarn)
216 warn("Use of %s is deprecated", s);
217}
218
219static void
220depcom()
221{
222 deprecate("comma-less variable list");
223}
224
225void
8990e307
LW
226lex_start(line)
227SV *line;
79072805 228{
8990e307
LW
229 char *s;
230 STRLEN len;
231
55497cff 232 SAVEI32(lex_dojoin);
233 SAVEI32(lex_brackets);
234 SAVEI32(lex_fakebrack);
235 SAVEI32(lex_casemods);
236 SAVEI32(lex_starts);
237 SAVEI32(lex_state);
a0d0e21e 238 SAVESPTR(lex_inpat);
55497cff 239 SAVEI32(lex_inwhat);
240 SAVEI16(curcop->cop_line);
85e6fe83
LW
241 SAVEPPTR(bufptr);
242 SAVEPPTR(bufend);
243 SAVEPPTR(oldbufptr);
244 SAVEPPTR(oldoldbufptr);
fd049845 245 SAVEPPTR(linestart);
463ee0b2 246 SAVESPTR(linestr);
85e6fe83 247 SAVEPPTR(lex_brackstack);
a0d0e21e 248 SAVEPPTR(lex_casestack);
6d5fb7e3 249 SAVEDESTRUCTOR(restore_rsfp, rsfp);
463ee0b2 250
79072805
LW
251 lex_state = LEX_NORMAL;
252 lex_defer = 0;
8990e307 253 expect = XSTATE;
79072805
LW
254 lex_brackets = 0;
255 lex_fakebrack = 0;
8990e307 256 New(899, lex_brackstack, 120, char);
a0d0e21e 257 New(899, lex_casestack, 12, char);
8990e307 258 SAVEFREEPV(lex_brackstack);
a0d0e21e 259 SAVEFREEPV(lex_casestack);
79072805 260 lex_casemods = 0;
a0d0e21e 261 *lex_casestack = '\0';
79072805
LW
262 lex_dojoin = 0;
263 lex_starts = 0;
264 if (lex_stuff)
8990e307 265 SvREFCNT_dec(lex_stuff);
79072805
LW
266 lex_stuff = Nullsv;
267 if (lex_repl)
8990e307 268 SvREFCNT_dec(lex_repl);
79072805
LW
269 lex_repl = Nullsv;
270 lex_inpat = 0;
271 lex_inwhat = 0;
8990e307
LW
272 linestr = line;
273 if (SvREADONLY(linestr))
274 linestr = sv_2mortal(newSVsv(linestr));
275 s = SvPV(linestr, len);
276 if (len && s[len-1] != ';') {
a0d0e21e 277 if (!(SvFLAGS(linestr) & SVs_TEMP))
8990e307
LW
278 linestr = sv_2mortal(newSVsv(linestr));
279 sv_catpvn(linestr, "\n;", 2);
280 }
281 SvTEMP_off(linestr);
fd049845 282 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
79072805 283 bufend = bufptr + SvCUR(linestr);
c07a80fd 284 SvREFCNT_dec(rs);
285 rs = newSVpv("\n", 1);
8990e307 286 rsfp = 0;
79072805 287}
a687059c 288
463ee0b2
LW
289void
290lex_end()
291{
6ca21dd3 292 doextract = FALSE;
463ee0b2
LW
293}
294
295static void
6d5fb7e3
CS
296restore_rsfp(f)
297void *f;
298{
760ac839 299 PerlIO *fp = (PerlIO*)f;
6d5fb7e3 300
760ac839
LW
301 if (rsfp == PerlIO_stdin())
302 PerlIO_clearerr(rsfp);
a5f75d66 303 else if (rsfp && (rsfp != fp))
760ac839 304 PerlIO_close(rsfp);
6d5fb7e3
CS
305 rsfp = fp;
306}
307
308static void
463ee0b2
LW
309incline(s)
310char *s;
311{
312 char *t;
313 char *n;
314 char ch;
315 int sawline = 0;
316
317 curcop->cop_line++;
318 if (*s++ != '#')
319 return;
320 while (*s == ' ' || *s == '\t') s++;
321 if (strnEQ(s, "line ", 5)) {
322 s += 5;
323 sawline = 1;
324 }
325 if (!isDIGIT(*s))
326 return;
327 n = s;
328 while (isDIGIT(*s))
329 s++;
330 while (*s == ' ' || *s == '\t')
331 s++;
332 if (*s == '"' && (t = strchr(s+1, '"')))
333 s++;
334 else {
335 if (!sawline)
336 return; /* false alarm */
337 for (t = s; !isSPACE(*t); t++) ;
338 }
339 ch = *t;
340 *t = '\0';
341 if (t - s > 0)
342 curcop->cop_filegv = gv_fetchfile(s);
343 else
344 curcop->cop_filegv = gv_fetchfile(origfilename);
345 *t = ch;
346 curcop->cop_line = atoi(n)-1;
347}
348
8990e307 349static char *
a687059c
LW
350skipspace(s)
351register char *s;
352{
11343788 353 dTHR;
85e6fe83 354 if (lex_formbrack && lex_brackets <= lex_formbrack) {
463ee0b2
LW
355 while (s < bufend && (*s == ' ' || *s == '\t'))
356 s++;
357 return s;
358 }
359 for (;;) {
fd049845 360 STRLEN prevlen;
463ee0b2
LW
361 while (s < bufend && isSPACE(*s))
362 s++;
363 if (s < bufend && *s == '#') {
364 while (s < bufend && *s != '\n')
365 s++;
366 if (s < bufend)
367 s++;
368 }
a0d0e21e 369 if (s < bufend || !rsfp || lex_state != LEX_NORMAL)
463ee0b2 370 return s;
fd049845 371 if ((s = filter_gets(linestr, rsfp, (prevlen = SvCUR(linestr)))) == Nullch) {
a0d0e21e
LW
372 if (minus_n || minus_p) {
373 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
374 sv_catpv(linestr,";}");
375 minus_n = minus_p = 0;
376 }
377 else
378 sv_setpv(linestr,";");
fd049845 379 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
a0d0e21e
LW
380 bufend = SvPVX(linestr) + SvCUR(linestr);
381 if (preprocess && !in_eval)
8990e307 382 (void)my_pclose(rsfp);
760ac839
LW
383 else if ((PerlIO*)rsfp == PerlIO_stdin())
384 PerlIO_clearerr(rsfp);
8990e307 385 else
760ac839 386 (void)PerlIO_close(rsfp);
8990e307 387 rsfp = Nullfp;
463ee0b2
LW
388 return s;
389 }
fd049845 390 linestart = bufptr = s + prevlen;
391 bufend = s + SvCUR(linestr);
392 s = bufptr;
a0d0e21e 393 incline(s);
8990e307
LW
394 if (perldb && curstash != debstash) {
395 SV *sv = NEWSV(85,0);
396
397 sv_upgrade(sv, SVt_PVMG);
fd049845 398 sv_setpvn(sv,bufptr,bufend-bufptr);
8990e307
LW
399 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
400 }
463ee0b2 401 }
a687059c 402}
378cc40b 403
8990e307 404static void
2f3197b3
LW
405check_uni() {
406 char *s;
407 char ch;
a0d0e21e 408 char *t;
2f3197b3
LW
409
410 if (oldoldbufptr != last_uni)
411 return;
412 while (isSPACE(*last_uni))
413 last_uni++;
e334a159 414 for (s = last_uni; isALNUM(*s) || *s == '-'; s++) ;
a0d0e21e
LW
415 if ((t = strchr(s, '(')) && t < bufptr)
416 return;
2f3197b3
LW
417 ch = *s;
418 *s = '\0';
419 warn("Warning: Use of \"%s\" without parens is ambiguous", last_uni);
420 *s = ch;
421}
422
ffed7fef
LW
423#ifdef CRIPPLED_CC
424
425#undef UNI
ffed7fef 426#define UNI(f) return uni(f,s)
ffed7fef 427
8990e307 428static int
ffed7fef 429uni(f,s)
79072805 430I32 f;
ffed7fef
LW
431char *s;
432{
433 yylval.ival = f;
79072805 434 expect = XTERM;
ffed7fef 435 bufptr = s;
2f3197b3 436 last_uni = oldbufptr;
a0d0e21e 437 last_lop_op = f;
ffed7fef
LW
438 if (*s == '(')
439 return FUNC1;
440 s = skipspace(s);
441 if (*s == '(')
442 return FUNC1;
443 else
444 return UNIOP;
445}
446
a0d0e21e
LW
447#endif /* CRIPPLED_CC */
448
449#define LOP(f,x) return lop(f,x,s)
450
8990e307 451static I32
f86702cc 452lop
453#ifdef CAN_PROTOTYPE
454 (I32 f, expectation x, char *s)
455#else
456 (f,x,s)
79072805 457I32 f;
a0d0e21e 458expectation x;
ffed7fef 459char *s;
f86702cc 460#endif /* CAN_PROTOTYPE */
ffed7fef 461{
79072805 462 yylval.ival = f;
35c8bce7 463 CLINE;
a0d0e21e 464 expect = x;
79072805 465 bufptr = s;
8990e307
LW
466 last_lop = oldbufptr;
467 last_lop_op = f;
a0d0e21e
LW
468 if (nexttoke)
469 return LSTOP;
79072805
LW
470 if (*s == '(')
471 return FUNC;
472 s = skipspace(s);
473 if (*s == '(')
474 return FUNC;
475 else
476 return LSTOP;
477}
478
8990e307 479static void
79072805
LW
480force_next(type)
481I32 type;
482{
483 nexttype[nexttoke] = type;
484 nexttoke++;
485 if (lex_state != LEX_KNOWNEXT) {
486 lex_defer = lex_state;
463ee0b2 487 lex_expect = expect;
79072805
LW
488 lex_state = LEX_KNOWNEXT;
489 }
490}
491
8990e307 492static char *
a0d0e21e 493force_word(start,token,check_keyword,allow_pack,allow_tick)
463ee0b2 494register char *start;
79072805 495int token;
463ee0b2 496int check_keyword;
a0d0e21e 497int allow_pack;
463ee0b2 498int allow_tick;
79072805 499{
463ee0b2
LW
500 register char *s;
501 STRLEN len;
502
503 start = skipspace(start);
504 s = start;
a0d0e21e
LW
505 if (isIDFIRST(*s) ||
506 (allow_pack && *s == ':') ||
507 (allow_tick && *s == '\'') )
508 {
8903cb82 509 s = scan_word(s, tokenbuf, sizeof tokenbuf, allow_pack, &len);
463ee0b2
LW
510 if (check_keyword && keyword(tokenbuf, len))
511 return start;
512 if (token == METHOD) {
513 s = skipspace(s);
514 if (*s == '(')
515 expect = XTERM;
516 else {
517 expect = XOPERATOR;
518 force_next(')');
519 force_next('(');
520 }
79072805 521 }
463ee0b2 522 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(tokenbuf,0));
8990e307 523 nextval[nexttoke].opval->op_private |= OPpCONST_BARE;
79072805
LW
524 force_next(token);
525 }
526 return s;
527}
528
8990e307 529static void
a0d0e21e 530force_ident(s, kind)
79072805 531register char *s;
a0d0e21e 532int kind;
79072805
LW
533{
534 if (s && *s) {
11343788
MB
535 OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
536 nextval[nexttoke].opval = o;
79072805 537 force_next(WORD);
748a9306 538 if (kind) {
e858de61 539 dTHR; /* just for in_eval */
11343788 540 o->op_private = OPpCONST_ENTERED;
55497cff 541 /* XXX see note in pp_entereval() for why we forgo typo
542 warnings if the symbol must be introduced in an eval.
543 GSAR 96-10-12 */
544 gv_fetchpv(s, in_eval ? GV_ADDMULTI : TRUE,
a0d0e21e
LW
545 kind == '$' ? SVt_PV :
546 kind == '@' ? SVt_PVAV :
547 kind == '%' ? SVt_PVHV :
548 SVt_PVGV
549 );
748a9306 550 }
79072805
LW
551 }
552}
553
89bfa8cd 554static char *
555force_version(s)
556char *s;
557{
558 OP *version = Nullop;
559
560 s = skipspace(s);
561
562 /* default VERSION number -- GBARR */
563
564 if(isDIGIT(*s)) {
565 char *d;
566 int c;
55497cff 567 for( d=s, c = 1; isDIGIT(*d) || *d == '_' || (*d == '.' && c--); d++);
89bfa8cd 568 if((*d == ';' || isSPACE(*d)) && *(skipspace(d)) != ',') {
569 s = scan_num(s);
570 /* real VERSION number -- GBARR */
571 version = yylval.opval;
572 }
573 }
574
575 /* NOTE: The parser sees the package name and the VERSION swapped */
576 nextval[nexttoke].opval = version;
577 force_next(WORD);
578
579 return (s);
580}
581
8990e307 582static SV *
79072805
LW
583q(sv)
584SV *sv;
585{
586 register char *s;
587 register char *send;
588 register char *d;
463ee0b2 589 STRLEN len;
79072805
LW
590
591 if (!SvLEN(sv))
592 return sv;
593
a0d0e21e 594 s = SvPV_force(sv, len);
748a9306
LW
595 if (SvIVX(sv) == -1)
596 return sv;
463ee0b2 597 send = s + len;
79072805
LW
598 while (s < send && *s != '\\')
599 s++;
600 if (s == send)
601 return sv;
602 d = s;
79072805
LW
603 while (s < send) {
604 if (*s == '\\') {
a0d0e21e 605 if (s + 1 < send && (s[1] == '\\'))
79072805
LW
606 s++; /* all that, just for this */
607 }
608 *d++ = *s++;
609 }
610 *d = '\0';
463ee0b2 611 SvCUR_set(sv, d - SvPVX(sv));
79072805
LW
612
613 return sv;
614}
615
8990e307 616static I32
79072805
LW
617sublex_start()
618{
619 register I32 op_type = yylval.ival;
79072805
LW
620
621 if (op_type == OP_NULL) {
622 yylval.opval = lex_op;
623 lex_op = Nullop;
624 return THING;
625 }
626 if (op_type == OP_CONST || op_type == OP_READLINE) {
1c9c84df
CS
627 SV *sv = q(lex_stuff);
628 STRLEN len;
629 char *p = SvPV(sv, len);
630 yylval.opval = (OP*)newSVOP(op_type, 0, newSVpv(p, len));
631 SvREFCNT_dec(sv);
79072805
LW
632 lex_stuff = Nullsv;
633 return THING;
634 }
635
55497cff 636 sublex_info.super_state = lex_state;
637 sublex_info.sub_inwhat = op_type;
638 sublex_info.sub_op = lex_op;
639 lex_state = LEX_INTERPPUSH;
640
641 expect = XTERM;
642 if (lex_op) {
643 yylval.opval = lex_op;
644 lex_op = Nullop;
645 return PMFUNC;
646 }
647 else
648 return FUNC;
649}
650
651static I32
652sublex_push()
653{
79072805 654 push_scope();
55497cff 655
656 lex_state = sublex_info.super_state;
657 SAVEI32(lex_dojoin);
658 SAVEI32(lex_brackets);
659 SAVEI32(lex_fakebrack);
660 SAVEI32(lex_casemods);
661 SAVEI32(lex_starts);
662 SAVEI32(lex_state);
a0d0e21e 663 SAVESPTR(lex_inpat);
55497cff 664 SAVEI32(lex_inwhat);
665 SAVEI16(curcop->cop_line);
85e6fe83
LW
666 SAVEPPTR(bufptr);
667 SAVEPPTR(oldbufptr);
668 SAVEPPTR(oldoldbufptr);
fd049845 669 SAVEPPTR(linestart);
79072805 670 SAVESPTR(linestr);
85e6fe83 671 SAVEPPTR(lex_brackstack);
a0d0e21e 672 SAVEPPTR(lex_casestack);
79072805
LW
673
674 linestr = lex_stuff;
675 lex_stuff = Nullsv;
676
fd049845 677 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
79072805 678 bufend += SvCUR(linestr);
8990e307 679 SAVEFREESV(linestr);
79072805
LW
680
681 lex_dojoin = FALSE;
682 lex_brackets = 0;
683 lex_fakebrack = 0;
8990e307 684 New(899, lex_brackstack, 120, char);
a0d0e21e 685 New(899, lex_casestack, 12, char);
8990e307 686 SAVEFREEPV(lex_brackstack);
a0d0e21e 687 SAVEFREEPV(lex_casestack);
79072805 688 lex_casemods = 0;
a0d0e21e 689 *lex_casestack = '\0';
79072805
LW
690 lex_starts = 0;
691 lex_state = LEX_INTERPCONCAT;
692 curcop->cop_line = multi_start;
693
55497cff 694 lex_inwhat = sublex_info.sub_inwhat;
695 if (lex_inwhat == OP_MATCH || lex_inwhat == OP_SUBST)
696 lex_inpat = sublex_info.sub_op;
79072805 697 else
55497cff 698 lex_inpat = Nullop;
79072805 699
55497cff 700 return '(';
79072805
LW
701}
702
8990e307 703static I32
79072805
LW
704sublex_done()
705{
706 if (!lex_starts++) {
707 expect = XOPERATOR;
93a17b20 708 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
79072805
LW
709 return THING;
710 }
711
712 if (lex_casemods) { /* oops, we've got some unbalanced parens */
713 lex_state = LEX_INTERPCASEMOD;
714 return yylex();
715 }
716
79072805
LW
717 /* Is there a right-hand side to take care of? */
718 if (lex_repl && (lex_inwhat == OP_SUBST || lex_inwhat == OP_TRANS)) {
719 linestr = lex_repl;
720 lex_inpat = 0;
fd049845 721 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
79072805 722 bufend += SvCUR(linestr);
8990e307 723 SAVEFREESV(linestr);
79072805
LW
724 lex_dojoin = FALSE;
725 lex_brackets = 0;
726 lex_fakebrack = 0;
727 lex_casemods = 0;
a0d0e21e 728 *lex_casestack = '\0';
79072805
LW
729 lex_starts = 0;
730 if (SvCOMPILED(lex_repl)) {
731 lex_state = LEX_INTERPNORMAL;
732 lex_starts++;
733 }
734 else
735 lex_state = LEX_INTERPCONCAT;
736 lex_repl = Nullsv;
737 return ',';
ffed7fef
LW
738 }
739 else {
79072805 740 pop_scope();
463ee0b2 741 bufend = SvPVX(linestr);
79072805
LW
742 bufend += SvCUR(linestr);
743 expect = XOPERATOR;
744 return ')';
ffed7fef
LW
745 }
746}
747
8990e307 748static char *
79072805
LW
749scan_const(start)
750char *start;
751{
752 register char *send = bufend;
753 SV *sv = NEWSV(93, send - start);
754 register char *s = start;
463ee0b2 755 register char *d = SvPVX(sv);
79072805
LW
756 bool dorange = FALSE;
757 I32 len;
758 char *leave =
759 lex_inpat
748a9306 760 ? "\\.^$@AGZdDwWsSbB+*?|()-nrtfeaxc0123456789[{]} \t\n\r\f\v#"
79072805
LW
761 : (lex_inwhat & OP_TRANS)
762 ? ""
763 : "";
764
765 while (s < send || dorange) {
766 if (lex_inwhat == OP_TRANS) {
767 if (dorange) {
768 I32 i;
769 I32 max;
463ee0b2 770 i = d - SvPVX(sv);
79072805 771 SvGROW(sv, SvLEN(sv) + 256);
463ee0b2 772 d = SvPVX(sv) + i;
79072805 773 d -= 2;
91b7def8 774 max = (U8)d[1];
775 for (i = (U8)*d; i <= max; i++)
79072805
LW
776 *d++ = i;
777 dorange = FALSE;
778 continue;
779 }
780 else if (*s == '-' && s+1 < send && s != start) {
781 dorange = TRUE;
782 s++;
783 }
784 }
748a9306
LW
785 else if (*s == '(' && lex_inpat && s[1] == '?' && s[2] == '#') {
786 while (s < send && *s != ')')
787 *d++ = *s++;
788 }
789 else if (*s == '#' && lex_inpat &&
790 ((PMOP*)lex_inpat)->op_pmflags & PMf_EXTENDED) {
791 while (s+1 < send && *s != '\n')
792 *d++ = *s++;
793 }
a0d0e21e 794 else if (*s == '@' && s[1] && (isALNUM(s[1]) || strchr(":'{$", s[1])))
79072805
LW
795 break;
796 else if (*s == '$') {
797 if (!lex_inpat) /* not a regexp, so $ must be var */
798 break;
a0d0e21e 799 if (s + 1 < send && !strchr(")| \n\t", s[1]))
79072805
LW
800 break; /* in regexp, $ might be tail anchor */
801 }
802 if (*s == '\\' && s+1 < send) {
803 s++;
93a17b20 804 if (*s && strchr(leave, *s)) {
79072805
LW
805 *d++ = '\\';
806 *d++ = *s++;
807 continue;
808 }
809 if (lex_inwhat == OP_SUBST && !lex_inpat &&
a0d0e21e 810 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
79072805 811 {
a0d0e21e
LW
812 if (dowarn)
813 warn("\\%c better written as $%c", *s, *s);
79072805
LW
814 *--s = '$';
815 break;
816 }
a0d0e21e 817 if (lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
79072805
LW
818 --s;
819 break;
820 }
821 switch (*s) {
822 case '-':
823 if (lex_inwhat == OP_TRANS) {
824 *d++ = *s++;
825 continue;
826 }
827 /* FALL THROUGH */
828 default:
829 *d++ = *s++;
830 continue;
831 case '0': case '1': case '2': case '3':
832 case '4': case '5': case '6': case '7':
833 *d++ = scan_oct(s, 3, &len);
834 s += len;
835 continue;
836 case 'x':
837 *d++ = scan_hex(++s, 2, &len);
838 s += len;
839 continue;
840 case 'c':
841 s++;
bbce6d69 842 len = *s++;
843 *d++ = toCTRL(len);
79072805
LW
844 continue;
845 case 'b':
846 *d++ = '\b';
847 break;
848 case 'n':
849 *d++ = '\n';
850 break;
851 case 'r':
852 *d++ = '\r';
853 break;
854 case 'f':
855 *d++ = '\f';
856 break;
857 case 't':
858 *d++ = '\t';
859 break;
860 case 'e':
861 *d++ = '\033';
862 break;
863 case 'a':
864 *d++ = '\007';
865 break;
866 }
867 s++;
868 continue;
869 }
870 *d++ = *s++;
871 }
872 *d = '\0';
463ee0b2 873 SvCUR_set(sv, d - SvPVX(sv));
79072805
LW
874 SvPOK_on(sv);
875
876 if (SvCUR(sv) + 5 < SvLEN(sv)) {
877 SvLEN_set(sv, SvCUR(sv) + 1);
463ee0b2 878 Renew(SvPVX(sv), SvLEN(sv), char);
79072805
LW
879 }
880 if (s > bufptr)
881 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
882 else
8990e307 883 SvREFCNT_dec(sv);
79072805
LW
884 return s;
885}
886
887/* This is the one truly awful dwimmer necessary to conflate C and sed. */
8990e307 888static int
79072805
LW
889intuit_more(s)
890register char *s;
891{
892 if (lex_brackets)
893 return TRUE;
894 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
895 return TRUE;
896 if (*s != '{' && *s != '[')
897 return FALSE;
898 if (!lex_inpat)
899 return TRUE;
900
901 /* In a pattern, so maybe we have {n,m}. */
902 if (*s == '{') {
903 s++;
904 if (!isDIGIT(*s))
905 return TRUE;
906 while (isDIGIT(*s))
907 s++;
908 if (*s == ',')
909 s++;
910 while (isDIGIT(*s))
911 s++;
912 if (*s == '}')
913 return FALSE;
914 return TRUE;
915
916 }
917
918 /* On the other hand, maybe we have a character class */
919
920 s++;
921 if (*s == ']' || *s == '^')
922 return FALSE;
923 else {
924 int weight = 2; /* let's weigh the evidence */
925 char seen[256];
926 unsigned char un_char = 0, last_un_char;
93a17b20 927 char *send = strchr(s,']');
8903cb82 928 char tmpbuf[sizeof tokenbuf * 4];
79072805
LW
929
930 if (!send) /* has to be an expression */
931 return TRUE;
932
933 Zero(seen,256,char);
934 if (*s == '$')
935 weight -= 3;
936 else if (isDIGIT(*s)) {
937 if (s[1] != ']') {
938 if (isDIGIT(s[1]) && s[2] == ']')
939 weight -= 10;
940 }
941 else
942 weight -= 100;
943 }
944 for (; s < send; s++) {
945 last_un_char = un_char;
946 un_char = (unsigned char)*s;
947 switch (*s) {
948 case '@':
949 case '&':
950 case '$':
951 weight -= seen[un_char] * 10;
952 if (isALNUM(s[1])) {
8903cb82 953 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
a0d0e21e 954 if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
79072805
LW
955 weight -= 100;
956 else
957 weight -= 10;
958 }
959 else if (*s == '$' && s[1] &&
93a17b20
LW
960 strchr("[#!%*<>()-=",s[1])) {
961 if (/*{*/ strchr("])} =",s[2]))
79072805
LW
962 weight -= 10;
963 else
964 weight -= 1;
965 }
966 break;
967 case '\\':
968 un_char = 254;
969 if (s[1]) {
93a17b20 970 if (strchr("wds]",s[1]))
79072805
LW
971 weight += 100;
972 else if (seen['\''] || seen['"'])
973 weight += 1;
93a17b20 974 else if (strchr("rnftbxcav",s[1]))
79072805
LW
975 weight += 40;
976 else if (isDIGIT(s[1])) {
977 weight += 40;
978 while (s[1] && isDIGIT(s[1]))
979 s++;
980 }
981 }
982 else
983 weight += 100;
984 break;
985 case '-':
986 if (s[1] == '\\')
987 weight += 50;
93a17b20 988 if (strchr("aA01! ",last_un_char))
79072805 989 weight += 30;
93a17b20 990 if (strchr("zZ79~",s[1]))
79072805
LW
991 weight += 30;
992 break;
993 default:
93a17b20 994 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
79072805
LW
995 isALPHA(*s) && s[1] && isALPHA(s[1])) {
996 char *d = tmpbuf;
997 while (isALPHA(*s))
998 *d++ = *s++;
999 *d = '\0';
1000 if (keyword(tmpbuf, d - tmpbuf))
1001 weight -= 150;
1002 }
1003 if (un_char == last_un_char + 1)
1004 weight += 5;
1005 weight -= seen[un_char];
1006 break;
1007 }
1008 seen[un_char]++;
1009 }
1010 if (weight >= 0) /* probably a character class */
1011 return FALSE;
1012 }
1013
1014 return TRUE;
1015}
ffed7fef 1016
a0d0e21e
LW
1017static int
1018intuit_method(start,gv)
1019char *start;
1020GV *gv;
1021{
1022 char *s = start + (*start == '$');
8903cb82 1023 char tmpbuf[sizeof tokenbuf];
a0d0e21e
LW
1024 STRLEN len;
1025 GV* indirgv;
1026
1027 if (gv) {
1028 if (GvIO(gv))
1029 return 0;
8ebc5c01 1030 if (!GvCVu(gv))
a0d0e21e
LW
1031 gv = 0;
1032 }
8903cb82 1033 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
a0d0e21e
LW
1034 if (*start == '$') {
1035 if (gv || last_lop_op == OP_PRINT || isUPPER(*tokenbuf))
1036 return 0;
1037 s = skipspace(s);
1038 bufptr = start;
1039 expect = XREF;
1040 return *s == '(' ? FUNCMETH : METHOD;
1041 }
1042 if (!keyword(tmpbuf, len)) {
1043 indirgv = gv_fetchpv(tmpbuf,FALSE, SVt_PVCV);
8ebc5c01 1044 if (indirgv && GvCVu(indirgv))
a0d0e21e
LW
1045 return 0;
1046 /* filehandle or package name makes it a method */
89bfa8cd 1047 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
a0d0e21e 1048 s = skipspace(s);
55497cff 1049 if ((bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
1050 return 0; /* no assumptions -- "=>" quotes bearword */
a0d0e21e
LW
1051 nextval[nexttoke].opval =
1052 (OP*)newSVOP(OP_CONST, 0,
1053 newSVpv(tmpbuf,0));
1054 nextval[nexttoke].opval->op_private =
1055 OPpCONST_BARE;
1056 expect = XTERM;
1057 force_next(WORD);
1058 bufptr = s;
1059 return *s == '(' ? FUNCMETH : METHOD;
1060 }
1061 }
1062 return 0;
1063}
1064
1065static char*
1066incl_perldb()
1067{
1068 if (perldb) {
1069 char *pdb = getenv("PERL5DB");
1070
1071 if (pdb)
1072 return pdb;
1073 return "BEGIN { require 'perl5db.pl' }";
1074 }
1075 return "";
1076}
1077
1078
16d20bd9
AD
1079/* Encoded script support. filter_add() effectively inserts a
1080 * 'pre-processing' function into the current source input stream.
1081 * Note that the filter function only applies to the current source file
1082 * (e.g., it will not affect files 'require'd or 'use'd by this one).
1083 *
1084 * The datasv parameter (which may be NULL) can be used to pass
1085 * private data to this instance of the filter. The filter function
1086 * can recover the SV using the FILTER_DATA macro and use it to
1087 * store private buffers and state information.
1088 *
1089 * The supplied datasv parameter is upgraded to a PVIO type
1090 * and the IoDIRP field is used to store the function pointer.
1091 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
1092 * private use must be set using malloc'd pointers.
1093 */
1094static int filter_debug = 0;
1095
1096SV *
1097filter_add(funcp, datasv)
1098 filter_t funcp;
1099 SV *datasv;
1100{
1101 if (!funcp){ /* temporary handy debugging hack to be deleted */
1102 filter_debug = atoi((char*)datasv);
1103 return NULL;
1104 }
1105 if (!rsfp_filters)
1106 rsfp_filters = newAV();
1107 if (!datasv)
1108 datasv = newSV(0);
1109 if (!SvUPGRADE(datasv, SVt_PVIO))
1110 die("Can't upgrade filter_add data to SVt_PVIO");
1111 IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
1112 if (filter_debug)
ff0cee69 1113 warn("filter_add func %p (%s)", funcp, SvPV(datasv,na));
e50aee73
AD
1114 av_unshift(rsfp_filters, 1);
1115 av_store(rsfp_filters, 0, datasv) ;
16d20bd9
AD
1116 return(datasv);
1117}
1118
1119
1120/* Delete most recently added instance of this filter function. */
a0d0e21e 1121void
16d20bd9
AD
1122filter_del(funcp)
1123 filter_t funcp;
1124{
1125 if (filter_debug)
ff0cee69 1126 warn("filter_del func %p", funcp);
16d20bd9
AD
1127 if (!rsfp_filters || AvFILL(rsfp_filters)<0)
1128 return;
1129 /* if filter is on top of stack (usual case) just pop it off */
e50aee73
AD
1130 if (IoDIRP(FILTER_DATA(0)) == (void*)funcp){
1131 /* sv_free(av_pop(rsfp_filters)); */
1132 sv_free(av_shift(rsfp_filters));
1133
16d20bd9
AD
1134 return;
1135 }
1136 /* we need to search for the correct entry and clear it */
1137 die("filter_del can only delete in reverse order (currently)");
1138}
1139
1140
1141/* Invoke the n'th filter function for the current rsfp. */
1142I32
1143filter_read(idx, buf_sv, maxlen)
1144 int idx;
1145 SV *buf_sv;
1146 int maxlen; /* 0 = read one text line */
a0d0e21e 1147{
16d20bd9
AD
1148 filter_t funcp;
1149 SV *datasv = NULL;
e50aee73 1150
16d20bd9
AD
1151 if (!rsfp_filters)
1152 return -1;
1153 if (idx > AvFILL(rsfp_filters)){ /* Any more filters? */
1154 /* Provide a default input filter to make life easy. */
1155 /* Note that we append to the line. This is handy. */
16d20bd9
AD
1156 if (filter_debug)
1157 warn("filter_read %d: from rsfp\n", idx);
1158 if (maxlen) {
1159 /* Want a block */
1160 int len ;
1161 int old_len = SvCUR(buf_sv) ;
1162
1163 /* ensure buf_sv is large enough */
1164 SvGROW(buf_sv, old_len + maxlen) ;
760ac839
LW
1165 if ((len = PerlIO_read(rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
1166 if (PerlIO_error(rsfp))
37120919
AD
1167 return -1; /* error */
1168 else
1169 return 0 ; /* end of file */
1170 }
16d20bd9
AD
1171 SvCUR_set(buf_sv, old_len + len) ;
1172 } else {
1173 /* Want a line */
37120919 1174 if (sv_gets(buf_sv, rsfp, SvCUR(buf_sv)) == NULL) {
760ac839 1175 if (PerlIO_error(rsfp))
37120919
AD
1176 return -1; /* error */
1177 else
1178 return 0 ; /* end of file */
1179 }
16d20bd9
AD
1180 }
1181 return SvCUR(buf_sv);
1182 }
1183 /* Skip this filter slot if filter has been deleted */
1184 if ( (datasv = FILTER_DATA(idx)) == &sv_undef){
1185 if (filter_debug)
1186 warn("filter_read %d: skipped (filter deleted)\n", idx);
1187 return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
1188 }
1189 /* Get function pointer hidden within datasv */
1190 funcp = (filter_t)IoDIRP(datasv);
1191 if (filter_debug)
ff0cee69 1192 warn("filter_read %d: via function %p (%s)\n",
16d20bd9
AD
1193 idx, funcp, SvPV(datasv,na));
1194 /* Call function. The function is expected to */
1195 /* call "FILTER_READ(idx+1, buf_sv)" first. */
37120919 1196 /* Return: <0:error, =0:eof, >0:not eof */
16d20bd9
AD
1197 return (*funcp)(idx, buf_sv, maxlen);
1198}
1199
1200static char *
fd049845 1201filter_gets(sv,fp, append)
16d20bd9 1202register SV *sv;
760ac839 1203register PerlIO *fp;
fd049845 1204STRLEN append;
16d20bd9
AD
1205{
1206 if (rsfp_filters) {
1207
55497cff 1208 if (!append)
1209 SvCUR_set(sv, 0); /* start with empty line */
16d20bd9
AD
1210 if (FILTER_READ(0, sv, 0) > 0)
1211 return ( SvPVX(sv) ) ;
1212 else
1213 return Nullch ;
1214 }
1215 else
fd049845 1216 return (sv_gets(sv, fp, append));
16d20bd9 1217
a0d0e21e
LW
1218}
1219
1220
748a9306
LW
1221#ifdef DEBUGGING
1222 static char* exp_name[] =
a0d0e21e 1223 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
748a9306 1224#endif
463ee0b2 1225
71be2cbc 1226EXT int yychar; /* last token */
463ee0b2 1227
2f3197b3 1228int
378cc40b
LW
1229yylex()
1230{
11343788 1231 dTHR;
79072805 1232 register char *s;
378cc40b 1233 register char *d;
79072805 1234 register I32 tmp;
463ee0b2 1235 STRLEN len;
a687059c 1236
bbce6d69 1237 if (pending_ident) {
1238 char pit = pending_ident;
1239 pending_ident = 0;
1240
1241 if (in_my) {
1242 if (strchr(tokenbuf,':'))
1243 croak(no_myglob,tokenbuf);
1244 yylval.opval = newOP(OP_PADANY, 0);
1245 yylval.opval->op_targ = pad_allocmy(tokenbuf);
1246 return PRIVATEREF;
1247 }
1248
5dc0d613
MB
1249 if (!strchr(tokenbuf,':')
1250 && (tmp = pad_findmy(tokenbuf)) != NOT_IN_PAD) {
bbce6d69 1251 if (last_lop_op == OP_SORT &&
1252 tokenbuf[0] == '$' &&
1253 (tokenbuf[1] == 'a' || tokenbuf[1] == 'b')
1254 && !tokenbuf[2])
1255 {
1256 for (d = in_eval ? oldoldbufptr : linestart;
1257 d < bufend && *d != '\n';
1258 d++)
1259 {
1260 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
1261 croak("Can't use \"my %s\" in sort comparison",
1262 tokenbuf);
1263 }
1264 }
1265 }
1266
1267 yylval.opval = newOP(OP_PADANY, 0);
1268 yylval.opval->op_targ = tmp;
1269 return PRIVATEREF;
1270 }
1271
1272 /* Force them to make up their mind on "@foo". */
1273 if (pit == '@' && lex_state != LEX_NORMAL && !lex_brackets) {
1274 GV *gv = gv_fetchpv(tokenbuf+1, FALSE, SVt_PVAV);
46fc3d4c 1275 if (!gv || ((tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
1276 yyerror(form("In string, %s now must be written as \\%s",
1277 tokenbuf, tokenbuf));
bbce6d69 1278 }
1279
1280 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf+1, 0));
1281 yylval.opval->op_private = OPpCONST_ENTERED;
1282 gv_fetchpv(tokenbuf+1, in_eval ? GV_ADDMULTI : TRUE,
1283 ((tokenbuf[0] == '$') ? SVt_PV
1284 : (tokenbuf[0] == '@') ? SVt_PVAV
1285 : SVt_PVHV));
1286 return WORD;
1287 }
1288
79072805
LW
1289 switch (lex_state) {
1290#ifdef COMMENTARY
1291 case LEX_NORMAL: /* Some compilers will produce faster */
1292 case LEX_INTERPNORMAL: /* code if we comment these out. */
1293 break;
1294#endif
1295
1296 case LEX_KNOWNEXT:
1297 nexttoke--;
1298 yylval = nextval[nexttoke];
463ee0b2 1299 if (!nexttoke) {
79072805 1300 lex_state = lex_defer;
463ee0b2 1301 expect = lex_expect;
a0d0e21e 1302 lex_defer = LEX_NORMAL;
463ee0b2 1303 }
79072805
LW
1304 return(nexttype[nexttoke]);
1305
1306 case LEX_INTERPCASEMOD:
1307#ifdef DEBUGGING
1308 if (bufptr != bufend && *bufptr != '\\')
463ee0b2 1309 croak("panic: INTERPCASEMOD");
79072805
LW
1310#endif
1311 if (bufptr == bufend || bufptr[1] == 'E') {
a0d0e21e 1312 char oldmod;
79072805 1313 if (lex_casemods) {
a0d0e21e
LW
1314 oldmod = lex_casestack[--lex_casemods];
1315 lex_casestack[lex_casemods] = '\0';
1316 if (bufptr != bufend && strchr("LUQ", oldmod)) {
1317 bufptr += 2;
1318 lex_state = LEX_INTERPCONCAT;
1319 }
79072805
LW
1320 return ')';
1321 }
a0d0e21e
LW
1322 if (bufptr != bufend)
1323 bufptr += 2;
1324 lex_state = LEX_INTERPCONCAT;
79072805
LW
1325 return yylex();
1326 }
1327 else {
1328 s = bufptr + 1;
1329 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
1330 tmp = *s, *s = s[2], s[2] = tmp; /* misordered... */
a0d0e21e
LW
1331 if (strchr("LU", *s) &&
1332 (strchr(lex_casestack, 'L') || strchr(lex_casestack, 'U')))
1333 {
1334 lex_casestack[--lex_casemods] = '\0';
1335 return ')';
1336 }
1337 if (lex_casemods > 10) {
89bfa8cd 1338 char* newlb = Renew(lex_casestack, lex_casemods + 2, char);
a0d0e21e
LW
1339 if (newlb != lex_casestack) {
1340 SAVEFREEPV(newlb);
1341 lex_casestack = newlb;
1342 }
1343 }
1344 lex_casestack[lex_casemods++] = *s;
1345 lex_casestack[lex_casemods] = '\0';
79072805
LW
1346 lex_state = LEX_INTERPCONCAT;
1347 nextval[nexttoke].ival = 0;
1348 force_next('(');
1349 if (*s == 'l')
1350 nextval[nexttoke].ival = OP_LCFIRST;
1351 else if (*s == 'u')
1352 nextval[nexttoke].ival = OP_UCFIRST;
1353 else if (*s == 'L')
1354 nextval[nexttoke].ival = OP_LC;
1355 else if (*s == 'U')
1356 nextval[nexttoke].ival = OP_UC;
a0d0e21e
LW
1357 else if (*s == 'Q')
1358 nextval[nexttoke].ival = OP_QUOTEMETA;
79072805 1359 else
463ee0b2 1360 croak("panic: yylex");
79072805
LW
1361 bufptr = s + 1;
1362 force_next(FUNC);
1363 if (lex_starts) {
1364 s = bufptr;
463ee0b2 1365 lex_starts = 0;
79072805
LW
1366 Aop(OP_CONCAT);
1367 }
1368 else
1369 return yylex();
1370 }
1371
55497cff 1372 case LEX_INTERPPUSH:
1373 return sublex_push();
1374
79072805
LW
1375 case LEX_INTERPSTART:
1376 if (bufptr == bufend)
1377 return sublex_done();
1378 expect = XTERM;
1379 lex_dojoin = (*bufptr == '@');
1380 lex_state = LEX_INTERPNORMAL;
1381 if (lex_dojoin) {
1382 nextval[nexttoke].ival = 0;
1383 force_next(',');
a0d0e21e 1384 force_ident("\"", '$');
79072805
LW
1385 nextval[nexttoke].ival = 0;
1386 force_next('$');
1387 nextval[nexttoke].ival = 0;
1388 force_next('(');
1389 nextval[nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
1390 force_next(FUNC);
1391 }
1392 if (lex_starts++) {
1393 s = bufptr;
1394 Aop(OP_CONCAT);
1395 }
68dc0745 1396 return yylex();
79072805
LW
1397
1398 case LEX_INTERPENDMAYBE:
1399 if (intuit_more(bufptr)) {
1400 lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
1401 break;
1402 }
1403 /* FALL THROUGH */
1404
1405 case LEX_INTERPEND:
1406 if (lex_dojoin) {
1407 lex_dojoin = FALSE;
1408 lex_state = LEX_INTERPCONCAT;
1409 return ')';
1410 }
1411 /* FALLTHROUGH */
1412 case LEX_INTERPCONCAT:
1413#ifdef DEBUGGING
1414 if (lex_brackets)
463ee0b2 1415 croak("panic: INTERPCONCAT");
79072805
LW
1416#endif
1417 if (bufptr == bufend)
1418 return sublex_done();
1419
ed6116ce 1420 if (SvIVX(linestr) == '\'') {
79072805
LW
1421 SV *sv = newSVsv(linestr);
1422 if (!lex_inpat)
1423 sv = q(sv);
1424 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1425 s = bufend;
1426 }
1427 else {
1428 s = scan_const(bufptr);
1429 if (*s == '\\')
1430 lex_state = LEX_INTERPCASEMOD;
1431 else
1432 lex_state = LEX_INTERPSTART;
1433 }
1434
1435 if (s != bufptr) {
1436 nextval[nexttoke] = yylval;
463ee0b2 1437 expect = XTERM;
79072805
LW
1438 force_next(THING);
1439 if (lex_starts++)
1440 Aop(OP_CONCAT);
1441 else {
1442 bufptr = s;
1443 return yylex();
1444 }
1445 }
1446
1447 return yylex();
a0d0e21e
LW
1448 case LEX_FORMLINE:
1449 lex_state = LEX_NORMAL;
1450 s = scan_formline(bufptr);
1451 if (!lex_formbrack)
1452 goto rightbracket;
1453 OPERATOR(';');
79072805
LW
1454 }
1455
1456 s = bufptr;
a687059c
LW
1457 oldoldbufptr = oldbufptr;
1458 oldbufptr = s;
79072805 1459 DEBUG_p( {
760ac839 1460 PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[expect], s);
79072805 1461 } )
463ee0b2
LW
1462
1463 retry:
378cc40b
LW
1464 switch (*s) {
1465 default:
54310121 1466 croak("Unrecognized character \\%03o", *s & 255);
e929a76b
LW
1467 case 4:
1468 case 26:
1469 goto fake_eof; /* emulate EOF on ^D or ^Z */
378cc40b 1470 case 0:
463ee0b2 1471 if (!rsfp) {
55497cff 1472 last_uni = 0;
1473 last_lop = 0;
463ee0b2
LW
1474 if (lex_brackets)
1475 yyerror("Missing right bracket");
79072805 1476 TOKEN(0);
463ee0b2 1477 }
a687059c
LW
1478 if (s++ < bufend)
1479 goto retry; /* ignore stray nulls */
2f3197b3 1480 last_uni = 0;
79072805 1481 last_lop = 0;
a0d0e21e 1482 if (!in_eval && !preambled) {
79072805 1483 preambled = TRUE;
a0d0e21e 1484 sv_setpv(linestr,incl_perldb());
91b7def8 1485 if (SvCUR(linestr))
1486 sv_catpv(linestr,";");
1487 if (preambleav){
1488 while(AvFILL(preambleav) >= 0) {
1489 SV *tmpsv = av_shift(preambleav);
1490 sv_catsv(linestr, tmpsv);
1491 sv_catpv(linestr, ";");
1492 sv_free(tmpsv);
1493 }
1494 sv_free((SV*)preambleav);
1495 preambleav = NULL;
1496 }
79072805
LW
1497 if (minus_n || minus_p) {
1498 sv_catpv(linestr, "LINE: while (<>) {");
1499 if (minus_l)
a0d0e21e 1500 sv_catpv(linestr,"chomp;");
8fd239a7
CS
1501 if (minus_a) {
1502 GV* gv = gv_fetchpv("::F", TRUE, SVt_PVAV);
1503 if (gv)
1504 GvIMPORTED_AV_on(gv);
1505 if (minus_F) {
54310121 1506 if (strchr("/'\"", *splitstr)
1507 && strchr(splitstr + 1, *splitstr))
46fc3d4c 1508 sv_catpvf(linestr, "@F=split(%s);", splitstr);
54310121 1509 else {
1510 char delim;
1511 s = "'~#\200\1'"; /* surely one char is unused...*/
1512 while (s[1] && strchr(splitstr, *s)) s++;
1513 delim = *s;
46fc3d4c 1514 sv_catpvf(linestr, "@F=split(%s%c",
1515 "q" + (delim == '\''), delim);
1516 for (s = splitstr; *s; s++) {
54310121 1517 if (*s == '\\')
46fc3d4c 1518 sv_catpvn(linestr, "\\", 1);
1519 sv_catpvn(linestr, s, 1);
54310121 1520 }
46fc3d4c 1521 sv_catpvf(linestr, "%c);", delim);
54310121 1522 }
2304df62
AD
1523 }
1524 else
1525 sv_catpv(linestr,"@F=split(' ');");
1526 }
79072805 1527 }
a0d0e21e 1528 sv_catpv(linestr, "\n");
fd049845 1529 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
463ee0b2 1530 bufend = SvPVX(linestr) + SvCUR(linestr);
a0d0e21e
LW
1531 if (perldb && curstash != debstash) {
1532 SV *sv = NEWSV(85,0);
1533
1534 sv_upgrade(sv, SVt_PVMG);
1535 sv_setsv(sv,linestr);
1536 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1537 }
79072805 1538 goto retry;
a687059c 1539 }
e929a76b 1540 do {
fd049845 1541 if ((s = filter_gets(linestr, rsfp, 0)) == Nullch) {
e929a76b 1542 fake_eof:
395c3793 1543 if (rsfp) {
a0d0e21e 1544 if (preprocess && !in_eval)
79072805 1545 (void)my_pclose(rsfp);
760ac839
LW
1546 else if ((PerlIO *)rsfp == PerlIO_stdin())
1547 PerlIO_clearerr(rsfp);
395c3793 1548 else
760ac839 1549 (void)PerlIO_close(rsfp);
395c3793
LW
1550 rsfp = Nullfp;
1551 }
a0d0e21e 1552 if (!in_eval && (minus_n || minus_p)) {
79072805
LW
1553 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
1554 sv_catpv(linestr,";}");
fd049845 1555 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
463ee0b2 1556 bufend = SvPVX(linestr) + SvCUR(linestr);
e929a76b
LW
1557 minus_n = minus_p = 0;
1558 goto retry;
1559 }
fd049845 1560 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
79072805
LW
1561 sv_setpv(linestr,"");
1562 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
378cc40b 1563 }
a0d0e21e
LW
1564 if (doextract) {
1565 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
1566 doextract = FALSE;
1567
1568 /* Incest with pod. */
1569 if (*s == '=' && strnEQ(s, "=cut", 4)) {
1570 sv_setpv(linestr, "");
fd049845 1571 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
a0d0e21e
LW
1572 bufend = SvPVX(linestr) + SvCUR(linestr);
1573 doextract = FALSE;
1574 }
1575 }
463ee0b2 1576 incline(s);
e929a76b 1577 } while (doextract);
fd049845 1578 oldoldbufptr = oldbufptr = bufptr = linestart = s;
8990e307 1579 if (perldb && curstash != debstash) {
79072805 1580 SV *sv = NEWSV(85,0);
a687059c 1581
93a17b20 1582 sv_upgrade(sv, SVt_PVMG);
79072805
LW
1583 sv_setsv(sv,linestr);
1584 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
a687059c 1585 }
463ee0b2 1586 bufend = SvPVX(linestr) + SvCUR(linestr);
79072805
LW
1587 if (curcop->cop_line == 1) {
1588 while (s < bufend && isSPACE(*s))
1589 s++;
a0d0e21e 1590 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
79072805 1591 s++;
44a8e56a 1592 d = Nullch;
1593 if (!in_eval) {
1594 if (*s == '#' && *(s+1) == '!')
1595 d = s + 2;
1596#ifdef ALTERNATE_SHEBANG
1597 else {
1598 static char as[] = ALTERNATE_SHEBANG;
1599 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
1600 d = s + (sizeof(as) - 1);
1601 }
1602#endif /* ALTERNATE_SHEBANG */
1603 }
1604 if (d) {
b8378b72 1605 char *ipath;
774d564b 1606 char *ipathend;
b8378b72 1607
774d564b 1608 while (isSPACE(*d))
b8378b72
CS
1609 d++;
1610 ipath = d;
774d564b 1611 while (*d && !isSPACE(*d))
1612 d++;
1613 ipathend = d;
1614
1615#ifdef ARG_ZERO_IS_SCRIPT
1616 if (ipathend > ipath) {
1617 /*
1618 * HP-UX (at least) sets argv[0] to the script name,
1619 * which makes $^X incorrect. And Digital UNIX and Linux,
1620 * at least, set argv[0] to the basename of the Perl
1621 * interpreter. So, having found "#!", we'll set it right.
1622 */
1623 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
1624 assert(SvPOK(x) || SvGMAGICAL(x));
9607fc9c 1625 if (sv_eq(x, GvSV(curcop->cop_filegv))) {
774d564b 1626 sv_setpvn(x, ipath, ipathend - ipath);
9607fc9c 1627 SvSETMAGIC(x);
1628 }
774d564b 1629 TAINT_NOT; /* $^X is always tainted, but that's OK */
8ebc5c01 1630 }
774d564b 1631#endif /* ARG_ZERO_IS_SCRIPT */
b8378b72
CS
1632
1633 /*
1634 * Look for options.
1635 */
748a9306
LW
1636 d = instr(s,"perl -");
1637 if (!d)
1638 d = instr(s,"perl");
44a8e56a 1639#ifdef ALTERNATE_SHEBANG
1640 /*
1641 * If the ALTERNATE_SHEBANG on this system starts with a
1642 * character that can be part of a Perl expression, then if
1643 * we see it but not "perl", we're probably looking at the
1644 * start of Perl code, not a request to hand off to some
1645 * other interpreter. Similarly, if "perl" is there, but
1646 * not in the first 'word' of the line, we assume the line
1647 * contains the start of the Perl program.
44a8e56a 1648 */
1649 if (d && *s != '#') {
774d564b 1650 char *c = ipath;
44a8e56a 1651 while (*c && !strchr("; \t\r\n\f\v#", *c))
1652 c++;
1653 if (c < d)
1654 d = Nullch; /* "perl" not in first word; ignore */
1655 else
1656 *s = '#'; /* Don't try to parse shebang line */
1657 }
774d564b 1658#endif /* ALTERNATE_SHEBANG */
748a9306 1659 if (!d &&
44a8e56a 1660 *s == '#' &&
774d564b 1661 ipathend > ipath &&
748a9306
LW
1662 !minus_c &&
1663 !instr(s,"indir") &&
1664 instr(origargv[0],"perl"))
1665 {
9f68db38 1666 char **newargv;
9f68db38 1667
774d564b 1668 *ipathend = '\0';
1669 s = ipathend + 1;
de3bb511 1670 while (s < bufend && isSPACE(*s))
9f68db38
LW
1671 s++;
1672 if (s < bufend) {
1673 Newz(899,newargv,origargc+3,char*);
1674 newargv[1] = s;
de3bb511 1675 while (s < bufend && !isSPACE(*s))
9f68db38
LW
1676 s++;
1677 *s = '\0';
1678 Copy(origargv+1, newargv+2, origargc+1, char*);
1679 }
1680 else
1681 newargv = origargv;
774d564b 1682 newargv[0] = ipath;
1683 execv(ipath, newargv);
1684 croak("Can't exec %s", ipath);
9f68db38 1685 }
748a9306 1686 if (d) {
ba6d6ac9
CS
1687 U32 oldpdb = perldb;
1688 bool oldn = minus_n;
1689 bool oldp = minus_p;
748a9306
LW
1690
1691 while (*d && !isSPACE(*d)) d++;
89bfa8cd 1692 while (*d == ' ' || *d == '\t') d++;
748a9306
LW
1693
1694 if (*d++ == '-') {
8cc95fdb 1695 do {
1696 if (*d == 'M' || *d == 'm') {
1697 char *m = d;
1698 while (*d && !isSPACE(*d)) d++;
1699 croak("Too late for \"-%.*s\" option",
1700 (int)(d - m), m);
1701 }
1702 d = moreswitches(d);
1703 } while (d);
748a9306 1704 if (perldb && !oldpdb ||
b084f20b 1705 ( minus_n || minus_p ) && !(oldn || oldp) )
1706 /* if we have already added "LINE: while (<>) {",
1707 we must not do it again */
748a9306
LW
1708 {
1709 sv_setpv(linestr, "");
fd049845 1710 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
748a9306
LW
1711 bufend = SvPVX(linestr) + SvCUR(linestr);
1712 preambled = FALSE;
1713 if (perldb)
1714 (void)gv_fetchfile(origfilename);
1715 goto retry;
1716 }
a0d0e21e 1717 }
79072805 1718 }
9f68db38 1719 }
79072805 1720 }
85e6fe83 1721 if (lex_formbrack && lex_brackets <= lex_formbrack) {
a0d0e21e
LW
1722 bufptr = s;
1723 lex_state = LEX_FORMLINE;
1724 return yylex();
ae986130 1725 }
378cc40b 1726 goto retry;
4fdae800 1727 case '\r':
54310121 1728 warn("Illegal character \\%03o (carriage return)", '\r');
1729 croak(
1730 "(Maybe you didn't strip carriage returns after a network transfer?)\n");
4fdae800 1731 case ' ': case '\t': case '\f': case 013:
378cc40b
LW
1732 s++;
1733 goto retry;
378cc40b 1734 case '#':
e929a76b 1735 case '\n':
79072805 1736 if (lex_state != LEX_NORMAL || (in_eval && !rsfp)) {
a687059c
LW
1737 d = bufend;
1738 while (s < d && *s != '\n')
378cc40b 1739 s++;
0f85fab0 1740 if (s < d)
378cc40b 1741 s++;
463ee0b2 1742 incline(s);
85e6fe83 1743 if (lex_formbrack && lex_brackets <= lex_formbrack) {
a0d0e21e
LW
1744 bufptr = s;
1745 lex_state = LEX_FORMLINE;
1746 return yylex();
a687059c 1747 }
378cc40b 1748 }
a687059c 1749 else {
378cc40b 1750 *s = '\0';
a687059c
LW
1751 bufend = s;
1752 }
378cc40b
LW
1753 goto retry;
1754 case '-':
79072805 1755 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
378cc40b 1756 s++;
748a9306
LW
1757 bufptr = s;
1758 tmp = *s++;
1759
1760 while (s < bufend && (*s == ' ' || *s == '\t'))
1761 s++;
1762
1763 if (strnEQ(s,"=>",2)) {
1764 if (dowarn)
1765 warn("Ambiguous use of -%c => resolved to \"-%c\" =>",
ff0cee69 1766 (int)tmp, (int)tmp);
748a9306
LW
1767 s = force_word(bufptr,WORD,FALSE,FALSE,FALSE);
1768 OPERATOR('-'); /* unary minus */
1769 }
e334a159 1770 last_uni = oldbufptr;
a0d0e21e 1771 last_lop_op = OP_FTEREAD; /* good enough */
748a9306 1772 switch (tmp) {
79072805
LW
1773 case 'r': FTST(OP_FTEREAD);
1774 case 'w': FTST(OP_FTEWRITE);
1775 case 'x': FTST(OP_FTEEXEC);
1776 case 'o': FTST(OP_FTEOWNED);
1777 case 'R': FTST(OP_FTRREAD);
1778 case 'W': FTST(OP_FTRWRITE);
1779 case 'X': FTST(OP_FTREXEC);
1780 case 'O': FTST(OP_FTROWNED);
1781 case 'e': FTST(OP_FTIS);
1782 case 'z': FTST(OP_FTZERO);
1783 case 's': FTST(OP_FTSIZE);
1784 case 'f': FTST(OP_FTFILE);
1785 case 'd': FTST(OP_FTDIR);
1786 case 'l': FTST(OP_FTLINK);
1787 case 'p': FTST(OP_FTPIPE);
1788 case 'S': FTST(OP_FTSOCK);
1789 case 'u': FTST(OP_FTSUID);
1790 case 'g': FTST(OP_FTSGID);
1791 case 'k': FTST(OP_FTSVTX);
1792 case 'b': FTST(OP_FTBLK);
1793 case 'c': FTST(OP_FTCHR);
1794 case 't': FTST(OP_FTTTY);
1795 case 'T': FTST(OP_FTTEXT);
1796 case 'B': FTST(OP_FTBINARY);
85e6fe83
LW
1797 case 'M': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTMTIME);
1798 case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
1799 case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
378cc40b 1800 default:
ff0cee69 1801 croak("Unrecognized file test: -%c", (int)tmp);
378cc40b
LW
1802 break;
1803 }
1804 }
a687059c
LW
1805 tmp = *s++;
1806 if (*s == tmp) {
1807 s++;
79072805
LW
1808 if (expect == XOPERATOR)
1809 TERM(POSTDEC);
1810 else
1811 OPERATOR(PREDEC);
1812 }
1813 else if (*s == '>') {
1814 s++;
1815 s = skipspace(s);
1816 if (isIDFIRST(*s)) {
a0d0e21e 1817 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
463ee0b2 1818 TOKEN(ARROW);
79072805 1819 }
748a9306
LW
1820 else if (*s == '$')
1821 OPERATOR(ARROW);
463ee0b2 1822 else
748a9306 1823 TERM(ARROW);
a687059c 1824 }
79072805
LW
1825 if (expect == XOPERATOR)
1826 Aop(OP_SUBTRACT);
1827 else {
2f3197b3
LW
1828 if (isSPACE(*s) || !isSPACE(*bufptr))
1829 check_uni();
79072805 1830 OPERATOR('-'); /* unary minus */
2f3197b3 1831 }
79072805 1832
378cc40b 1833 case '+':
a687059c
LW
1834 tmp = *s++;
1835 if (*s == tmp) {
378cc40b 1836 s++;
79072805
LW
1837 if (expect == XOPERATOR)
1838 TERM(POSTINC);
1839 else
1840 OPERATOR(PREINC);
378cc40b 1841 }
79072805
LW
1842 if (expect == XOPERATOR)
1843 Aop(OP_ADD);
1844 else {
2f3197b3
LW
1845 if (isSPACE(*s) || !isSPACE(*bufptr))
1846 check_uni();
a687059c 1847 OPERATOR('+');
2f3197b3 1848 }
a687059c 1849
378cc40b 1850 case '*':
79072805 1851 if (expect != XOPERATOR) {
8903cb82 1852 s = scan_ident(s, bufend, tokenbuf, sizeof tokenbuf, TRUE);
463ee0b2 1853 expect = XOPERATOR;
a0d0e21e
LW
1854 force_ident(tokenbuf, '*');
1855 if (!*tokenbuf)
1856 PREREF('*');
79072805 1857 TERM('*');
a687059c 1858 }
79072805
LW
1859 s++;
1860 if (*s == '*') {
a687059c 1861 s++;
79072805 1862 PWop(OP_POW);
a687059c 1863 }
79072805
LW
1864 Mop(OP_MULTIPLY);
1865
378cc40b 1866 case '%':
bbce6d69 1867 if (expect == XOPERATOR) {
1868 ++s;
1869 Mop(OP_MODULO);
a687059c 1870 }
bbce6d69 1871 tokenbuf[0] = '%';
8903cb82 1872 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, TRUE);
bbce6d69 1873 if (!tokenbuf[1]) {
1874 if (s == bufend)
1875 yyerror("Final % should be \\% or %name");
1876 PREREF('%');
a687059c 1877 }
bbce6d69 1878 pending_ident = '%';
1879 TERM('%');
a687059c 1880
378cc40b 1881 case '^':
79072805 1882 s++;
a0d0e21e 1883 BOop(OP_BIT_XOR);
79072805
LW
1884 case '[':
1885 lex_brackets++;
1886 /* FALL THROUGH */
378cc40b 1887 case '~':
378cc40b 1888 case ',':
378cc40b
LW
1889 tmp = *s++;
1890 OPERATOR(tmp);
a0d0e21e
LW
1891 case ':':
1892 if (s[1] == ':') {
1893 len = 0;
1894 goto just_a_word;
1895 }
1896 s++;
1897 OPERATOR(':');
8990e307
LW
1898 case '(':
1899 s++;
a0d0e21e 1900 if (last_lop == oldoldbufptr || last_uni == oldoldbufptr)
8990e307 1901 oldbufptr = oldoldbufptr; /* allow print(STDOUT 123) */
a0d0e21e
LW
1902 else
1903 expect = XTERM;
1904 TOKEN('(');
378cc40b 1905 case ';':
79072805
LW
1906 if (curcop->cop_line < copline)
1907 copline = curcop->cop_line;
378cc40b
LW
1908 tmp = *s++;
1909 OPERATOR(tmp);
1910 case ')':
378cc40b 1911 tmp = *s++;
16d20bd9
AD
1912 s = skipspace(s);
1913 if (*s == '{')
1914 PREBLOCK(tmp);
378cc40b 1915 TERM(tmp);
79072805
LW
1916 case ']':
1917 s++;
463ee0b2
LW
1918 if (lex_brackets <= 0)
1919 yyerror("Unmatched right bracket");
1920 else
1921 --lex_brackets;
79072805 1922 if (lex_state == LEX_INTERPNORMAL) {
463ee0b2 1923 if (lex_brackets == 0) {
a0d0e21e 1924 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
79072805
LW
1925 lex_state = LEX_INTERPEND;
1926 }
1927 }
4633a7c4 1928 TERM(']');
79072805
LW
1929 case '{':
1930 leftbracket:
79072805 1931 s++;
8990e307 1932 if (lex_brackets > 100) {
89bfa8cd 1933 char* newlb = Renew(lex_brackstack, lex_brackets + 1, char);
8990e307
LW
1934 if (newlb != lex_brackstack) {
1935 SAVEFREEPV(newlb);
1936 lex_brackstack = newlb;
1937 }
1938 }
a0d0e21e
LW
1939 switch (expect) {
1940 case XTERM:
1941 if (lex_formbrack) {
1942 s--;
1943 PRETERMBLOCK(DO);
1944 }
1945 if (oldoldbufptr == last_lop)
1946 lex_brackstack[lex_brackets++] = XTERM;
1947 else
1948 lex_brackstack[lex_brackets++] = XOPERATOR;
79072805 1949 OPERATOR(HASHBRACK);
a0d0e21e 1950 case XOPERATOR:
748a9306
LW
1951 while (s < bufend && (*s == ' ' || *s == '\t'))
1952 s++;
44a8e56a 1953 d = s;
1954 tokenbuf[0] = '\0';
1955 if (d < bufend && *d == '-') {
1956 tokenbuf[0] = '-';
1957 d++;
1958 while (d < bufend && (*d == ' ' || *d == '\t'))
1959 d++;
1960 }
1961 if (d < bufend && isIDFIRST(*d)) {
8903cb82 1962 d = scan_word(d, tokenbuf + 1, sizeof tokenbuf - 1,
1963 FALSE, &len);
748a9306
LW
1964 while (d < bufend && (*d == ' ' || *d == '\t'))
1965 d++;
1966 if (*d == '}') {
44a8e56a 1967 char minus = (tokenbuf[0] == '-');
748a9306 1968 if (dowarn &&
44a8e56a 1969 (keyword(tokenbuf + 1, len) ||
1970 (minus && len == 1 && isALPHA(tokenbuf[1])) ||
1971 perl_get_cv(tokenbuf + 1, FALSE) ))
748a9306 1972 warn("Ambiguous use of {%s} resolved to {\"%s\"}",
44a8e56a 1973 tokenbuf + !minus, tokenbuf + !minus);
1974 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
1975 if (minus)
1976 force_next('-');
748a9306
LW
1977 }
1978 }
1979 /* FALL THROUGH */
1980 case XBLOCK:
a0d0e21e 1981 lex_brackstack[lex_brackets++] = XSTATE;
2304df62 1982 expect = XSTATE;
a0d0e21e
LW
1983 break;
1984 case XTERMBLOCK:
1985 lex_brackstack[lex_brackets++] = XOPERATOR;
1986 expect = XSTATE;
1987 break;
1988 default: {
1989 char *t;
1990 if (oldoldbufptr == last_lop)
1991 lex_brackstack[lex_brackets++] = XTERM;
1992 else
1993 lex_brackstack[lex_brackets++] = XOPERATOR;
1994 s = skipspace(s);
1995 if (*s == '}')
1996 OPERATOR(HASHBRACK);
1997 if (isALPHA(*s)) {
c07a80fd 1998 for (t = s; t < bufend && isALNUM(*t); t++) ;
a0d0e21e
LW
1999 }
2000 else if (*s == '\'' || *s == '"') {
2001 t = strchr(s+1,*s);
2002 if (!t++)
2003 t = s;
2004 }
2005 else
2006 t = s;
2007 while (t < bufend && isSPACE(*t))
2008 t++;
2009 if ((*t == ',' && !isLOWER(*s)) || (*t == '=' && t[1] == '>'))
2010 OPERATOR(HASHBRACK);
2011 if (expect == XREF)
2012 expect = XTERM;
2013 else {
2014 lex_brackstack[lex_brackets-1] = XSTATE;
2015 expect = XSTATE;
2016 }
8990e307 2017 }
a0d0e21e 2018 break;
463ee0b2 2019 }
79072805
LW
2020 yylval.ival = curcop->cop_line;
2021 if (isSPACE(*s) || *s == '#')
2022 copline = NOLINE; /* invalidate current command line number */
79072805 2023 TOKEN('{');
378cc40b 2024 case '}':
79072805
LW
2025 rightbracket:
2026 s++;
463ee0b2
LW
2027 if (lex_brackets <= 0)
2028 yyerror("Unmatched right bracket");
2029 else
2030 expect = (expectation)lex_brackstack[--lex_brackets];
85e6fe83
LW
2031 if (lex_brackets < lex_formbrack)
2032 lex_formbrack = 0;
79072805 2033 if (lex_state == LEX_INTERPNORMAL) {
463ee0b2 2034 if (lex_brackets == 0) {
79072805
LW
2035 if (lex_fakebrack) {
2036 lex_state = LEX_INTERPEND;
2037 bufptr = s;
2038 return yylex(); /* ignore fake brackets */
2039 }
fa83b5b6 2040 if (*s == '-' && s[1] == '>')
2041 lex_state = LEX_INTERPENDMAYBE;
2042 else if (*s != '[' && *s != '{')
79072805
LW
2043 lex_state = LEX_INTERPEND;
2044 }
2045 }
748a9306
LW
2046 if (lex_brackets < lex_fakebrack) {
2047 bufptr = s;
2048 lex_fakebrack = 0;
2049 return yylex(); /* ignore fake brackets */
2050 }
79072805
LW
2051 force_next('}');
2052 TOKEN(';');
378cc40b
LW
2053 case '&':
2054 s++;
2055 tmp = *s++;
2056 if (tmp == '&')
a0d0e21e 2057 AOPERATOR(ANDAND);
378cc40b 2058 s--;
463ee0b2 2059 if (expect == XOPERATOR) {
fd049845 2060 if (dowarn && isALPHA(*s) && bufptr == linestart) {
463ee0b2
LW
2061 curcop->cop_line--;
2062 warn(warn_nosemi);
2063 curcop->cop_line++;
2064 }
79072805 2065 BAop(OP_BIT_AND);
463ee0b2 2066 }
79072805 2067
8903cb82 2068 s = scan_ident(s - 1, bufend, tokenbuf, sizeof tokenbuf, TRUE);
463ee0b2
LW
2069 if (*tokenbuf) {
2070 expect = XOPERATOR;
a0d0e21e 2071 force_ident(tokenbuf, '&');
463ee0b2 2072 }
79072805
LW
2073 else
2074 PREREF('&');
c07a80fd 2075 yylval.ival = (OPpENTERSUB_AMPER<<8);
79072805
LW
2076 TERM('&');
2077
378cc40b
LW
2078 case '|':
2079 s++;
2080 tmp = *s++;
2081 if (tmp == '|')
a0d0e21e 2082 AOPERATOR(OROR);
378cc40b 2083 s--;
79072805 2084 BOop(OP_BIT_OR);
378cc40b
LW
2085 case '=':
2086 s++;
2087 tmp = *s++;
2088 if (tmp == '=')
79072805
LW
2089 Eop(OP_EQ);
2090 if (tmp == '>')
2091 OPERATOR(',');
378cc40b 2092 if (tmp == '~')
79072805 2093 PMop(OP_MATCH);
463ee0b2 2094 if (dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
ff0cee69 2095 warn("Reversed %c= operator",(int)tmp);
378cc40b 2096 s--;
748a9306 2097 if (expect == XSTATE && isALPHA(tmp) &&
fd049845 2098 (s == linestart+1 || s[-2] == '\n') )
748a9306 2099 {
a5f75d66
AD
2100 if (in_eval && !rsfp) {
2101 d = bufend;
2102 while (s < d) {
2103 if (*s++ == '\n') {
2104 incline(s);
2105 if (strnEQ(s,"=cut",4)) {
2106 s = strchr(s,'\n');
2107 if (s)
2108 s++;
2109 else
2110 s = d;
2111 incline(s);
2112 goto retry;
2113 }
2114 }
2115 }
2116 goto retry;
2117 }
a0d0e21e
LW
2118 s = bufend;
2119 doextract = TRUE;
2120 goto retry;
2121 }
2122 if (lex_brackets < lex_formbrack) {
2123 char *t;
2124 for (t = s; *t == ' ' || *t == '\t'; t++) ;
2125 if (*t == '\n' || *t == '#') {
2126 s--;
2127 expect = XBLOCK;
2128 goto leftbracket;
2129 }
79072805 2130 }
a0d0e21e
LW
2131 yylval.ival = 0;
2132 OPERATOR(ASSIGNOP);
378cc40b
LW
2133 case '!':
2134 s++;
2135 tmp = *s++;
2136 if (tmp == '=')
79072805 2137 Eop(OP_NE);
378cc40b 2138 if (tmp == '~')
79072805 2139 PMop(OP_NOT);
378cc40b
LW
2140 s--;
2141 OPERATOR('!');
2142 case '<':
79072805 2143 if (expect != XOPERATOR) {
93a17b20 2144 if (s[1] != '<' && !strchr(s,'>'))
2f3197b3 2145 check_uni();
79072805
LW
2146 if (s[1] == '<')
2147 s = scan_heredoc(s);
2148 else
2149 s = scan_inputsymbol(s);
2150 TERM(sublex_start());
378cc40b
LW
2151 }
2152 s++;
2153 tmp = *s++;
2154 if (tmp == '<')
79072805 2155 SHop(OP_LEFT_SHIFT);
395c3793
LW
2156 if (tmp == '=') {
2157 tmp = *s++;
2158 if (tmp == '>')
79072805 2159 Eop(OP_NCMP);
395c3793 2160 s--;
79072805 2161 Rop(OP_LE);
395c3793 2162 }
378cc40b 2163 s--;
79072805 2164 Rop(OP_LT);
378cc40b
LW
2165 case '>':
2166 s++;
2167 tmp = *s++;
2168 if (tmp == '>')
79072805 2169 SHop(OP_RIGHT_SHIFT);
378cc40b 2170 if (tmp == '=')
79072805 2171 Rop(OP_GE);
378cc40b 2172 s--;
79072805 2173 Rop(OP_GT);
378cc40b
LW
2174
2175 case '$':
bbce6d69 2176 CLINE;
2177
8990e307 2178 if (expect == XOPERATOR) {
a0d0e21e
LW
2179 if (lex_formbrack && lex_brackets == lex_formbrack) {
2180 expect = XTERM;
2181 depcom();
bbce6d69 2182 return ','; /* grandfather non-comma-format format */
a0d0e21e 2183 }
8990e307 2184 }
a0d0e21e 2185
bbce6d69 2186 if (s[1] == '#' && (isALPHA(s[2]) || strchr("_{$:", s[2]))) {
2187 if (expect == XOPERATOR)
2188 no_op("Array length", bufptr);
2189 tokenbuf[0] = '@';
8903cb82 2190 s = scan_ident(s + 1, bufend, tokenbuf + 1, sizeof tokenbuf - 1,
2191 FALSE);
bbce6d69 2192 if (!tokenbuf[1])
a0d0e21e 2193 PREREF(DOLSHARP);
463ee0b2 2194 expect = XOPERATOR;
bbce6d69 2195 pending_ident = '#';
463ee0b2 2196 TOKEN(DOLSHARP);
79072805 2197 }
bbce6d69 2198
2199 if (expect == XOPERATOR)
2200 no_op("Scalar", bufptr);
2201 tokenbuf[0] = '$';
8903cb82 2202 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
bbce6d69 2203 if (!tokenbuf[1]) {
2204 if (s == bufend)
2205 yyerror("Final $ should be \\$ or $name");
2206 PREREF('$');
8990e307 2207 }
a0d0e21e 2208
bbce6d69 2209 /* This kludge not intended to be bulletproof. */
2210 if (tokenbuf[1] == '[' && !tokenbuf[2]) {
2211 yylval.opval = newSVOP(OP_CONST, 0,
2212 newSViv((IV)compiling.cop_arybase));
2213 yylval.opval->op_private = OPpCONST_ARYBASE;
2214 TERM(THING);
2215 }
2216
ff68c719 2217 d = s;
2218 if (lex_state == LEX_NORMAL)
2219 s = skipspace(s);
2220
bbce6d69 2221 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2222 char *t;
2223 if (*s == '[') {
2224 tokenbuf[0] = '@';
2225 if (dowarn) {
2226 for(t = s + 1;
2227 isSPACE(*t) || isALNUM(*t) || *t == '$';
2228 t++) ;
a0d0e21e
LW
2229 if (*t++ == ',') {
2230 bufptr = skipspace(bufptr);
bbce6d69 2231 while (t < bufend && *t != ']')
2232 t++;
a0d0e21e 2233 warn("Multidimensional syntax %.*s not supported",
bbce6d69 2234 (t - bufptr) + 1, bufptr);
a0d0e21e
LW
2235 }
2236 }
bbce6d69 2237 }
2238 else if (*s == '{') {
2239 tokenbuf[0] = '%';
2240 if (dowarn && strEQ(tokenbuf+1, "SIG") &&
2241 (t = strchr(s, '}')) && (t = strchr(t, '=')))
2242 {
8903cb82 2243 char tmpbuf[sizeof tokenbuf];
a0d0e21e
LW
2244 STRLEN len;
2245 for (t++; isSPACE(*t); t++) ;
748a9306 2246 if (isIDFIRST(*t)) {
8903cb82 2247 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
748a9306
LW
2248 if (*t != '(' && perl_get_cv(tmpbuf, FALSE))
2249 warn("You need to quote \"%s\"", tmpbuf);
2250 }
93a17b20
LW
2251 }
2252 }
2f3197b3 2253 }
bbce6d69 2254
2255 expect = XOPERATOR;
ff68c719 2256 if (lex_state == LEX_NORMAL && isSPACE(*d)) {
bbce6d69 2257 bool islop = (last_lop == oldoldbufptr);
bbce6d69 2258 if (!islop || last_lop_op == OP_GREPSTART)
2259 expect = XOPERATOR;
2260 else if (strchr("$@\"'`q", *s))
2261 expect = XTERM; /* e.g. print $fh "foo" */
2262 else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
2263 expect = XTERM; /* e.g. print $fh &sub */
68dc0745 2264 else if (isIDFIRST(*s)) {
8903cb82 2265 char tmpbuf[sizeof tokenbuf];
2266 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
68dc0745 2267 if (keyword(tmpbuf, len))
2268 expect = XTERM; /* e.g. print $fh length() */
2269 else {
2270 GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2271 if (gv && GvCVu(gv))
2272 expect = XTERM; /* e.g. print $fh subr() */
93a17b20 2273 }
93a17b20 2274 }
bbce6d69 2275 else if (isDIGIT(*s))
2276 expect = XTERM; /* e.g. print $fh 3 */
2277 else if (*s == '.' && isDIGIT(s[1]))
2278 expect = XTERM; /* e.g. print $fh .3 */
2279 else if (strchr("/?-+", *s) && !isSPACE(s[1]))
2280 expect = XTERM; /* e.g. print $fh -1 */
2281 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]))
2282 expect = XTERM; /* print $fh <<"EOF" */
2283 }
2284 pending_ident = '$';
79072805 2285 TOKEN('$');
378cc40b
LW
2286
2287 case '@':
8990e307 2288 if (expect == XOPERATOR)
bbce6d69 2289 no_op("Array", s);
2290 tokenbuf[0] = '@';
8903cb82 2291 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
bbce6d69 2292 if (!tokenbuf[1]) {
2293 if (s == bufend)
2294 yyerror("Final @ should be \\@ or @name");
2295 PREREF('@');
2296 }
ff68c719 2297 if (lex_state == LEX_NORMAL)
2298 s = skipspace(s);
bbce6d69 2299 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2300 if (*s == '{')
2301 tokenbuf[0] = '%';
a0d0e21e
LW
2302
2303 /* Warn about @ where they meant $. */
2304 if (dowarn) {
2305 if (*s == '[' || *s == '{') {
2306 char *t = s + 1;
2307 while (*t && (isALNUM(*t) || strchr(" \t$#+-'\"", *t)))
2308 t++;
2309 if (*t == '}' || *t == ']') {
2310 t++;
2311 bufptr = skipspace(bufptr);
2312 warn("Scalar value %.*s better written as $%.*s",
2313 t-bufptr, bufptr, t-bufptr-1, bufptr+1);
2314 }
93a17b20
LW
2315 }
2316 }
463ee0b2 2317 }
bbce6d69 2318 pending_ident = '@';
79072805 2319 TERM('@');
378cc40b
LW
2320
2321 case '/': /* may either be division or pattern */
2322 case '?': /* may either be conditional or pattern */
79072805 2323 if (expect != XOPERATOR) {
2f3197b3 2324 check_uni();
79072805
LW
2325 s = scan_pat(s);
2326 TERM(sublex_start());
378cc40b
LW
2327 }
2328 tmp = *s++;
a687059c 2329 if (tmp == '/')
79072805 2330 Mop(OP_DIVIDE);
378cc40b
LW
2331 OPERATOR(tmp);
2332
2333 case '.':
748a9306 2334 if (lex_formbrack && lex_brackets == lex_formbrack && s[1] == '\n' &&
fd049845 2335 (s == linestart || s[-1] == '\n') ) {
85e6fe83 2336 lex_formbrack = 0;
8990e307 2337 expect = XSTATE;
79072805
LW
2338 goto rightbracket;
2339 }
2340 if (expect == XOPERATOR || !isDIGIT(s[1])) {
378cc40b 2341 tmp = *s++;
a687059c
LW
2342 if (*s == tmp) {
2343 s++;
2f3197b3
LW
2344 if (*s == tmp) {
2345 s++;
79072805 2346 yylval.ival = OPf_SPECIAL;
2f3197b3
LW
2347 }
2348 else
79072805 2349 yylval.ival = 0;
378cc40b 2350 OPERATOR(DOTDOT);
a687059c 2351 }
79072805 2352 if (expect != XOPERATOR)
2f3197b3 2353 check_uni();
79072805 2354 Aop(OP_CONCAT);
378cc40b
LW
2355 }
2356 /* FALL THROUGH */
2357 case '0': case '1': case '2': case '3': case '4':
2358 case '5': case '6': case '7': case '8': case '9':
79072805 2359 s = scan_num(s);
8990e307
LW
2360 if (expect == XOPERATOR)
2361 no_op("Number",s);
79072805
LW
2362 TERM(THING);
2363
2364 case '\'':
8990e307 2365 s = scan_str(s);
463ee0b2 2366 if (expect == XOPERATOR) {
a0d0e21e
LW
2367 if (lex_formbrack && lex_brackets == lex_formbrack) {
2368 expect = XTERM;
2369 depcom();
2370 return ','; /* grandfather non-comma-format format */
2371 }
463ee0b2 2372 else
8990e307 2373 no_op("String",s);
463ee0b2 2374 }
79072805 2375 if (!s)
85e6fe83 2376 missingterm((char*)0);
79072805
LW
2377 yylval.ival = OP_CONST;
2378 TERM(sublex_start());
2379
2380 case '"':
8990e307 2381 s = scan_str(s);
463ee0b2 2382 if (expect == XOPERATOR) {
a0d0e21e
LW
2383 if (lex_formbrack && lex_brackets == lex_formbrack) {
2384 expect = XTERM;
2385 depcom();
2386 return ','; /* grandfather non-comma-format format */
2387 }
463ee0b2 2388 else
8990e307 2389 no_op("String",s);
463ee0b2 2390 }
79072805 2391 if (!s)
85e6fe83 2392 missingterm((char*)0);
4633a7c4
LW
2393 yylval.ival = OP_CONST;
2394 for (d = SvPV(lex_stuff, len); len; len--, d++) {
2395 if (*d == '$' || *d == '@' || *d == '\\') {
2396 yylval.ival = OP_STRINGIFY;
2397 break;
2398 }
2399 }
79072805
LW
2400 TERM(sublex_start());
2401
2402 case '`':
2403 s = scan_str(s);
8990e307
LW
2404 if (expect == XOPERATOR)
2405 no_op("Backticks",s);
79072805 2406 if (!s)
85e6fe83 2407 missingterm((char*)0);
79072805
LW
2408 yylval.ival = OP_BACKTICK;
2409 set_csh();
2410 TERM(sublex_start());
2411
2412 case '\\':
2413 s++;
748a9306
LW
2414 if (dowarn && lex_inwhat && isDIGIT(*s))
2415 warn("Can't use \\%c to mean $%c in expression", *s, *s);
8990e307
LW
2416 if (expect == XOPERATOR)
2417 no_op("Backslash",s);
79072805
LW
2418 OPERATOR(REFGEN);
2419
2420 case 'x':
2421 if (isDIGIT(s[1]) && expect == XOPERATOR) {
2422 s++;
2423 Mop(OP_REPEAT);
2f3197b3 2424 }
79072805
LW
2425 goto keylookup;
2426
378cc40b 2427 case '_':
79072805
LW
2428 case 'a': case 'A':
2429 case 'b': case 'B':
2430 case 'c': case 'C':
2431 case 'd': case 'D':
2432 case 'e': case 'E':
2433 case 'f': case 'F':
2434 case 'g': case 'G':
2435 case 'h': case 'H':
2436 case 'i': case 'I':
2437 case 'j': case 'J':
2438 case 'k': case 'K':
2439 case 'l': case 'L':
2440 case 'm': case 'M':
2441 case 'n': case 'N':
2442 case 'o': case 'O':
2443 case 'p': case 'P':
2444 case 'q': case 'Q':
2445 case 'r': case 'R':
2446 case 's': case 'S':
2447 case 't': case 'T':
2448 case 'u': case 'U':
2449 case 'v': case 'V':
2450 case 'w': case 'W':
2451 case 'X':
2452 case 'y': case 'Y':
2453 case 'z': case 'Z':
2454
2455 keylookup:
748a9306 2456 bufptr = s;
8903cb82 2457 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
8ebc5c01 2458
2459 /* Some keywords can be followed by any delimiter, including ':' */
2460 tmp = (len == 1 && strchr("msyq", tokenbuf[0]) ||
2461 len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
2462 (tokenbuf[0] == 'q' &&
2463 strchr("qwx", tokenbuf[1]))));
2464
2465 /* x::* is just a word, unless x is "CORE" */
2466 if (!tmp && *s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
4633a7c4
LW
2467 goto just_a_word;
2468
3643fb5f
CS
2469 d = s;
2470 while (d < bufend && isSPACE(*d))
2471 d++; /* no comments skipped here, or s### is misparsed */
2472
2473 /* Is this a label? */
8ebc5c01 2474 if (!tmp && expect == XSTATE
2475 && d < bufend && *d == ':' && *(d + 1) != ':') {
2476 s = d + 1;
2477 yylval.pval = savepv(tokenbuf);
2478 CLINE;
2479 TOKEN(LABEL);
3643fb5f
CS
2480 }
2481
2482 /* Check for keywords */
a0d0e21e 2483 tmp = keyword(tokenbuf, len);
748a9306
LW
2484
2485 /* Is this a word before a => operator? */
748a9306
LW
2486 if (strnEQ(d,"=>",2)) {
2487 CLINE;
2488 if (dowarn && (tmp || perl_get_cv(tokenbuf, FALSE)))
2489 warn("Ambiguous use of %s => resolved to \"%s\" =>",
2490 tokenbuf, tokenbuf);
2491 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2492 yylval.opval->op_private = OPpCONST_BARE;
2493 TERM(WORD);
2494 }
2495
a0d0e21e
LW
2496 if (tmp < 0) { /* second-class keyword? */
2497 GV* gv;
2498 if (expect != XOPERATOR &&
a5f75d66
AD
2499 (*s != ':' || s[1] != ':') &&
2500 (gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV)) &&
2501 GvIMPORTED_CV(gv))
a0d0e21e
LW
2502 {
2503 tmp = 0;
2504 }
2505 else
2506 tmp = -tmp;
2507 }
2508
2509 reserved_word:
2510 switch (tmp) {
79072805
LW
2511
2512 default: /* not a keyword */
93a17b20
LW
2513 just_a_word: {
2514 GV *gv;
96e4d5b1 2515 SV *sv;
748a9306 2516 char lastchar = (bufptr == oldoldbufptr ? 0 : bufptr[-1]);
8990e307
LW
2517
2518 /* Get the rest if it looks like a package qualifier */
2519
a0d0e21e 2520 if (*s == '\'' || *s == ':' && s[1] == ':') {
8903cb82 2521 s = scan_word(s, tokenbuf + len, sizeof tokenbuf - len,
2522 TRUE, &len);
a0d0e21e
LW
2523 if (!len)
2524 croak("Bad name after %s::", tokenbuf);
2525 }
8990e307 2526
3643fb5f 2527 if (expect == XOPERATOR) {
fd049845 2528 if (bufptr == linestart) {
463ee0b2
LW
2529 curcop->cop_line--;
2530 warn(warn_nosemi);
2531 curcop->cop_line++;
2532 }
2533 else
54310121 2534 no_op("Bareword",s);
463ee0b2 2535 }
8990e307
LW
2536
2537 /* Look for a subroutine with this name in current package. */
2538
85e6fe83 2539 gv = gv_fetchpv(tokenbuf,FALSE, SVt_PVCV);
8990e307 2540
a0d0e21e
LW
2541 /* Presume this is going to be a bareword of some sort. */
2542
2543 CLINE;
2544 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2545 yylval.opval->op_private = OPpCONST_BARE;
2546
8990e307
LW
2547 /* See if it's the indirect object for a list operator. */
2548
a0d0e21e
LW
2549 if (oldoldbufptr &&
2550 oldoldbufptr < bufptr &&
2551 (oldoldbufptr == last_lop || oldoldbufptr == last_uni) &&
2552 /* NO SKIPSPACE BEFORE HERE! */
2553 (expect == XREF ||
2554 (opargs[last_lop_op] >> OASHIFT & 7) == OA_FILEREF) )
2555 {
748a9306
LW
2556 bool immediate_paren = *s == '(';
2557
a0d0e21e
LW
2558 /* (Now we can afford to cross potential line boundary.) */
2559 s = skipspace(s);
2560
2561 /* Two barewords in a row may indicate method call. */
2562
2563 if ((isALPHA(*s) || *s == '$') && (tmp=intuit_method(s,gv)))
2564 return tmp;
2565
2566 /* If not a declared subroutine, it's an indirect object. */
2567 /* (But it's an indir obj regardless for sort.) */
2568
8e07c86e 2569 if ((last_lop_op == OP_SORT ||
8ebc5c01 2570 (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
8e07c86e 2571 (last_lop_op != OP_MAPSTART && last_lop_op != OP_GREPSTART)){
748a9306
LW
2572 expect = (last_lop == oldoldbufptr) ? XTERM : XOPERATOR;
2573 goto bareword;
93a17b20
LW
2574 }
2575 }
8990e307
LW
2576
2577 /* If followed by a paren, it's certainly a subroutine. */
2578
2579 expect = XOPERATOR;
2580 s = skipspace(s);
93a17b20 2581 if (*s == '(') {
79072805 2582 CLINE;
96e4d5b1 2583 if (gv && GvCVu(gv)) {
2584 for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
2585 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
2586 s = d + 1;
2587 goto its_constant;
2588 }
2589 }
a0d0e21e 2590 nextval[nexttoke].opval = yylval.opval;
463ee0b2 2591 expect = XOPERATOR;
93a17b20 2592 force_next(WORD);
c07a80fd 2593 yylval.ival = 0;
463ee0b2 2594 TOKEN('&');
79072805 2595 }
93a17b20 2596
a0d0e21e 2597 /* If followed by var or block, call it a method (unless sub) */
8990e307 2598
8ebc5c01 2599 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
463ee0b2 2600 last_lop = oldbufptr;
8990e307 2601 last_lop_op = OP_METHOD;
93a17b20 2602 PREBLOCK(METHOD);
463ee0b2
LW
2603 }
2604
8990e307
LW
2605 /* If followed by a bareword, see if it looks like indir obj. */
2606
a0d0e21e
LW
2607 if ((isALPHA(*s) || *s == '$') && (tmp = intuit_method(s,gv)))
2608 return tmp;
93a17b20 2609
8990e307
LW
2610 /* Not a method, so call it a subroutine (if defined) */
2611
8ebc5c01 2612 if (gv && GvCVu(gv)) {
46fc3d4c 2613 CV* cv;
748a9306 2614 if (lastchar == '-')
c2960299 2615 warn("Ambiguous use of -%s resolved as -&%s()",
748a9306 2616 tokenbuf, tokenbuf);
8990e307 2617 last_lop = oldbufptr;
a0d0e21e 2618 last_lop_op = OP_ENTERSUB;
89bfa8cd 2619 /* Check for a constant sub */
46fc3d4c 2620 cv = GvCV(gv);
96e4d5b1 2621 if ((sv = cv_const_sv(cv))) {
2622 its_constant:
2623 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
2624 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
2625 yylval.opval->op_private = 0;
2626 TOKEN(WORD);
89bfa8cd 2627 }
2628
a5f75d66
AD
2629 /* Resolve to GV now. */
2630 op_free(yylval.opval);
2631 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
4633a7c4
LW
2632 /* Is there a prototype? */
2633 if (SvPOK(cv)) {
2634 STRLEN len;
2635 char *proto = SvPV((SV*)cv, len);
2636 if (!len)
2637 TERM(FUNC0SUB);
2638 if (strEQ(proto, "$"))
2639 OPERATOR(UNIOPSUB);
2640 if (*proto == '&' && *s == '{') {
2641 sv_setpv(subname,"__ANON__");
2642 PREBLOCK(LSTOPSUB);
2643 }
2644 }
a5f75d66 2645 nextval[nexttoke].opval = yylval.opval;
8990e307
LW
2646 expect = XTERM;
2647 force_next(WORD);
2648 TOKEN(NOAMP);
2649 }
748a9306
LW
2650
2651 if (hints & HINT_STRICT_SUBS &&
2652 lastchar != '-' &&
a0d0e21e 2653 strnNE(s,"->",2) &&
9b01e405 2654 last_lop_op != OP_TRUNCATE && /* S/F prototype in opcode.pl */
a0d0e21e
LW
2655 last_lop_op != OP_ACCEPT &&
2656 last_lop_op != OP_PIPE_OP &&
2657 last_lop_op != OP_SOCKPAIR)
2658 {
2659 warn(
2660 "Bareword \"%s\" not allowed while \"strict subs\" in use",
85e6fe83
LW
2661 tokenbuf);
2662 ++error_count;
2663 }
8990e307
LW
2664
2665 /* Call it a bare word */
2666
748a9306
LW
2667 bareword:
2668 if (dowarn) {
2669 if (lastchar != '-') {
2670 for (d = tokenbuf; *d && isLOWER(*d); d++) ;
2671 if (!*d)
2672 warn(warn_reserved, tokenbuf);
2673 }
2674 }
2675 if (lastchar && strchr("*%&", lastchar)) {
2676 warn("Operator or semicolon missing before %c%s",
2677 lastchar, tokenbuf);
c2960299 2678 warn("Ambiguous use of %c resolved as operator %c",
748a9306
LW
2679 lastchar, lastchar);
2680 }
93a17b20 2681 TOKEN(WORD);
79072805 2682 }
79072805 2683
68dc0745 2684 case KEY___FILE__:
46fc3d4c 2685 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
2686 newSVsv(GvSV(curcop->cop_filegv)));
2687 TERM(THING);
2688
79072805 2689 case KEY___LINE__:
46fc3d4c 2690 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
2691 newSVpvf("%ld", (long)curcop->cop_line));
79072805 2692 TERM(THING);
68dc0745 2693
2694 case KEY___PACKAGE__:
2695 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
2696 (curstash
2697 ? newSVsv(curstname)
2698 : &sv_undef));
79072805 2699 TERM(THING);
79072805 2700
e50aee73 2701 case KEY___DATA__:
79072805
LW
2702 case KEY___END__: {
2703 GV *gv;
79072805
LW
2704
2705 /*SUPPRESS 560*/
a5f75d66 2706 if (rsfp && (!in_eval || tokenbuf[2] == 'D')) {
e50aee73
AD
2707 char *pname = "main";
2708 if (tokenbuf[2] == 'D')
2709 pname = HvNAME(curstash ? curstash : defstash);
46fc3d4c 2710 gv = gv_fetchpv(form("%s::DATA", pname), TRUE, SVt_PVIO);
a5f75d66 2711 GvMULTI_on(gv);
79072805 2712 if (!GvIO(gv))
a0d0e21e
LW
2713 GvIOp(gv) = newIO();
2714 IoIFP(GvIOp(gv)) = rsfp;
2715#if defined(HAS_FCNTL) && defined(F_SETFD)
2716 {
760ac839 2717 int fd = PerlIO_fileno(rsfp);
a0d0e21e
LW
2718 fcntl(fd,F_SETFD,fd >= 3);
2719 }
79072805 2720#endif
fd049845 2721 /* Mark this internal pseudo-handle as clean */
2722 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
79072805 2723 if (preprocess)
a0d0e21e 2724 IoTYPE(GvIOp(gv)) = '|';
760ac839 2725 else if ((PerlIO*)rsfp == PerlIO_stdin())
a0d0e21e 2726 IoTYPE(GvIOp(gv)) = '-';
79072805 2727 else
a0d0e21e 2728 IoTYPE(GvIOp(gv)) = '<';
79072805
LW
2729 rsfp = Nullfp;
2730 }
2731 goto fake_eof;
e929a76b 2732 }
de3bb511 2733
8990e307 2734 case KEY_AUTOLOAD:
ed6116ce 2735 case KEY_DESTROY:
79072805
LW
2736 case KEY_BEGIN:
2737 case KEY_END:
c750a3ec 2738 case KEY_RESTART:
a0d0e21e 2739 if (expect == XSTATE) {
93a17b20
LW
2740 s = bufptr;
2741 goto really_sub;
79072805
LW
2742 }
2743 goto just_a_word;
2744
a0d0e21e
LW
2745 case KEY_CORE:
2746 if (*s == ':' && s[1] == ':') {
2747 s += 2;
748a9306 2748 d = s;
8903cb82 2749 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
a0d0e21e
LW
2750 tmp = keyword(tokenbuf, len);
2751 if (tmp < 0)
2752 tmp = -tmp;
2753 goto reserved_word;
2754 }
2755 goto just_a_word;
2756
463ee0b2
LW
2757 case KEY_abs:
2758 UNI(OP_ABS);
2759
79072805
LW
2760 case KEY_alarm:
2761 UNI(OP_ALARM);
2762
2763 case KEY_accept:
a0d0e21e 2764 LOP(OP_ACCEPT,XTERM);
79072805 2765
463ee0b2
LW
2766 case KEY_and:
2767 OPERATOR(ANDOP);
2768
79072805 2769 case KEY_atan2:
a0d0e21e 2770 LOP(OP_ATAN2,XTERM);
85e6fe83 2771
79072805 2772 case KEY_bind:
a0d0e21e 2773 LOP(OP_BIND,XTERM);
79072805
LW
2774
2775 case KEY_binmode:
2776 UNI(OP_BINMODE);
2777
2778 case KEY_bless:
a0d0e21e 2779 LOP(OP_BLESS,XTERM);
79072805
LW
2780
2781 case KEY_chop:
2782 UNI(OP_CHOP);
2783
2784 case KEY_continue:
2785 PREBLOCK(CONTINUE);
2786
2787 case KEY_chdir:
85e6fe83 2788 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
79072805
LW
2789 UNI(OP_CHDIR);
2790
2791 case KEY_close:
2792 UNI(OP_CLOSE);
2793
2794 case KEY_closedir:
2795 UNI(OP_CLOSEDIR);
2796
2797 case KEY_cmp:
2798 Eop(OP_SCMP);
2799
2800 case KEY_caller:
2801 UNI(OP_CALLER);
2802
2803 case KEY_crypt:
2804#ifdef FCRYPT
de3bb511
LW
2805 if (!cryptseen++)
2806 init_des();
a687059c 2807#endif
a0d0e21e 2808 LOP(OP_CRYPT,XTERM);
79072805
LW
2809
2810 case KEY_chmod:
748a9306
LW
2811 if (dowarn) {
2812 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
2813 if (*d != '0' && isDIGIT(*d))
2814 yywarn("chmod: mode argument is missing initial 0");
2815 }
a0d0e21e 2816 LOP(OP_CHMOD,XTERM);
79072805
LW
2817
2818 case KEY_chown:
a0d0e21e 2819 LOP(OP_CHOWN,XTERM);
79072805
LW
2820
2821 case KEY_connect:
a0d0e21e 2822 LOP(OP_CONNECT,XTERM);
79072805 2823
463ee0b2
LW
2824 case KEY_chr:
2825 UNI(OP_CHR);
2826
79072805
LW
2827 case KEY_cos:
2828 UNI(OP_COS);
2829
2830 case KEY_chroot:
2831 UNI(OP_CHROOT);
2832
2833 case KEY_do:
2834 s = skipspace(s);
2835 if (*s == '{')
a0d0e21e 2836 PRETERMBLOCK(DO);
79072805 2837 if (*s != '\'')
a0d0e21e 2838 s = force_word(s,WORD,FALSE,TRUE,FALSE);
378cc40b 2839 OPERATOR(DO);
79072805
LW
2840
2841 case KEY_die:
a0d0e21e
LW
2842 hints |= HINT_BLOCK_SCOPE;
2843 LOP(OP_DIE,XTERM);
79072805
LW
2844
2845 case KEY_defined:
2846 UNI(OP_DEFINED);
2847
2848 case KEY_delete:
a0d0e21e 2849 UNI(OP_DELETE);
79072805
LW
2850
2851 case KEY_dbmopen:
a0d0e21e
LW
2852 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
2853 LOP(OP_DBMOPEN,XTERM);
79072805
LW
2854
2855 case KEY_dbmclose:
2856 UNI(OP_DBMCLOSE);
2857
2858 case KEY_dump:
a0d0e21e 2859 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
2860 LOOPX(OP_DUMP);
2861
2862 case KEY_else:
2863 PREBLOCK(ELSE);
2864
2865 case KEY_elsif:
2866 yylval.ival = curcop->cop_line;
2867 OPERATOR(ELSIF);
2868
2869 case KEY_eq:
2870 Eop(OP_SEQ);
2871
a0d0e21e
LW
2872 case KEY_exists:
2873 UNI(OP_EXISTS);
2874
79072805
LW
2875 case KEY_exit:
2876 UNI(OP_EXIT);
2877
2878 case KEY_eval:
79072805 2879 s = skipspace(s);
a0d0e21e 2880 expect = (*s == '{') ? XTERMBLOCK : XTERM;
463ee0b2 2881 UNIBRACK(OP_ENTEREVAL);
79072805
LW
2882
2883 case KEY_eof:
2884 UNI(OP_EOF);
2885
2886 case KEY_exp:
2887 UNI(OP_EXP);
2888
2889 case KEY_each:
2890 UNI(OP_EACH);
2891
2892 case KEY_exec:
2893 set_csh();
a0d0e21e 2894 LOP(OP_EXEC,XREF);
79072805
LW
2895
2896 case KEY_endhostent:
2897 FUN0(OP_EHOSTENT);
2898
2899 case KEY_endnetent:
2900 FUN0(OP_ENETENT);
2901
2902 case KEY_endservent:
2903 FUN0(OP_ESERVENT);
2904
2905 case KEY_endprotoent:
2906 FUN0(OP_EPROTOENT);
2907
2908 case KEY_endpwent:
2909 FUN0(OP_EPWENT);
2910
2911 case KEY_endgrent:
2912 FUN0(OP_EGRENT);
2913
2914 case KEY_for:
2915 case KEY_foreach:
2916 yylval.ival = curcop->cop_line;
55497cff 2917 s = skipspace(s);
2918 if (isIDFIRST(*s)) {
2919 char *p = s;
2920 if ((bufend - p) >= 3 &&
2921 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
2922 p += 2;
2923 p = skipspace(p);
2924 if (isIDFIRST(*p))
2925 croak("Missing $ on loop variable");
2926 }
79072805
LW
2927 OPERATOR(FOR);
2928
2929 case KEY_formline:
a0d0e21e 2930 LOP(OP_FORMLINE,XTERM);
79072805
LW
2931
2932 case KEY_fork:
2933 FUN0(OP_FORK);
2934
2935 case KEY_fcntl:
a0d0e21e 2936 LOP(OP_FCNTL,XTERM);
79072805
LW
2937
2938 case KEY_fileno:
2939 UNI(OP_FILENO);
2940
2941 case KEY_flock:
a0d0e21e 2942 LOP(OP_FLOCK,XTERM);
79072805
LW
2943
2944 case KEY_gt:
2945 Rop(OP_SGT);
2946
2947 case KEY_ge:
2948 Rop(OP_SGE);
2949
2950 case KEY_grep:
a0d0e21e 2951 LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
79072805
LW
2952
2953 case KEY_goto:
a0d0e21e 2954 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
2955 LOOPX(OP_GOTO);
2956
2957 case KEY_gmtime:
2958 UNI(OP_GMTIME);
2959
2960 case KEY_getc:
2961 UNI(OP_GETC);
2962
2963 case KEY_getppid:
2964 FUN0(OP_GETPPID);
2965
2966 case KEY_getpgrp:
2967 UNI(OP_GETPGRP);
2968
2969 case KEY_getpriority:
a0d0e21e 2970 LOP(OP_GETPRIORITY,XTERM);
79072805
LW
2971
2972 case KEY_getprotobyname:
2973 UNI(OP_GPBYNAME);
2974
2975 case KEY_getprotobynumber:
a0d0e21e 2976 LOP(OP_GPBYNUMBER,XTERM);
79072805
LW
2977
2978 case KEY_getprotoent:
2979 FUN0(OP_GPROTOENT);
2980
2981 case KEY_getpwent:
2982 FUN0(OP_GPWENT);
2983
2984 case KEY_getpwnam:
ff68c719 2985 UNI(OP_GPWNAM);
79072805
LW
2986
2987 case KEY_getpwuid:
ff68c719 2988 UNI(OP_GPWUID);
79072805
LW
2989
2990 case KEY_getpeername:
2991 UNI(OP_GETPEERNAME);
2992
2993 case KEY_gethostbyname:
2994 UNI(OP_GHBYNAME);
2995
2996 case KEY_gethostbyaddr:
a0d0e21e 2997 LOP(OP_GHBYADDR,XTERM);
79072805
LW
2998
2999 case KEY_gethostent:
3000 FUN0(OP_GHOSTENT);
3001
3002 case KEY_getnetbyname:
3003 UNI(OP_GNBYNAME);
3004
3005 case KEY_getnetbyaddr:
a0d0e21e 3006 LOP(OP_GNBYADDR,XTERM);
79072805
LW
3007
3008 case KEY_getnetent:
3009 FUN0(OP_GNETENT);
3010
3011 case KEY_getservbyname:
a0d0e21e 3012 LOP(OP_GSBYNAME,XTERM);
79072805
LW
3013
3014 case KEY_getservbyport:
a0d0e21e 3015 LOP(OP_GSBYPORT,XTERM);
79072805
LW
3016
3017 case KEY_getservent:
3018 FUN0(OP_GSERVENT);
3019
3020 case KEY_getsockname:
3021 UNI(OP_GETSOCKNAME);
3022
3023 case KEY_getsockopt:
a0d0e21e 3024 LOP(OP_GSOCKOPT,XTERM);
79072805
LW
3025
3026 case KEY_getgrent:
3027 FUN0(OP_GGRENT);
3028
3029 case KEY_getgrnam:
ff68c719 3030 UNI(OP_GGRNAM);
79072805
LW
3031
3032 case KEY_getgrgid:
ff68c719 3033 UNI(OP_GGRGID);
79072805
LW
3034
3035 case KEY_getlogin:
3036 FUN0(OP_GETLOGIN);
3037
93a17b20 3038 case KEY_glob:
a0d0e21e
LW
3039 set_csh();
3040 LOP(OP_GLOB,XTERM);
93a17b20 3041
79072805
LW
3042 case KEY_hex:
3043 UNI(OP_HEX);
3044
3045 case KEY_if:
3046 yylval.ival = curcop->cop_line;
3047 OPERATOR(IF);
3048
3049 case KEY_index:
a0d0e21e 3050 LOP(OP_INDEX,XTERM);
79072805
LW
3051
3052 case KEY_int:
3053 UNI(OP_INT);
3054
3055 case KEY_ioctl:
a0d0e21e 3056 LOP(OP_IOCTL,XTERM);
79072805
LW
3057
3058 case KEY_join:
a0d0e21e 3059 LOP(OP_JOIN,XTERM);
79072805
LW
3060
3061 case KEY_keys:
3062 UNI(OP_KEYS);
3063
3064 case KEY_kill:
a0d0e21e 3065 LOP(OP_KILL,XTERM);
79072805
LW
3066
3067 case KEY_last:
a0d0e21e 3068 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805 3069 LOOPX(OP_LAST);
a0d0e21e 3070
79072805
LW
3071 case KEY_lc:
3072 UNI(OP_LC);
3073
3074 case KEY_lcfirst:
3075 UNI(OP_LCFIRST);
3076
3077 case KEY_local:
3078 OPERATOR(LOCAL);
3079
3080 case KEY_length:
3081 UNI(OP_LENGTH);
3082
3083 case KEY_lt:
3084 Rop(OP_SLT);
3085
3086 case KEY_le:
3087 Rop(OP_SLE);
3088
3089 case KEY_localtime:
3090 UNI(OP_LOCALTIME);
3091
3092 case KEY_log:
3093 UNI(OP_LOG);
3094
3095 case KEY_link:
a0d0e21e 3096 LOP(OP_LINK,XTERM);
79072805
LW
3097
3098 case KEY_listen:
a0d0e21e 3099 LOP(OP_LISTEN,XTERM);
79072805 3100
c0329465
MB
3101 case KEY_lock:
3102 UNI(OP_LOCK);
3103
79072805
LW
3104 case KEY_lstat:
3105 UNI(OP_LSTAT);
3106
3107 case KEY_m:
3108 s = scan_pat(s);
3109 TERM(sublex_start());
3110
a0d0e21e
LW
3111 case KEY_map:
3112 LOP(OP_MAPSTART,XREF);
3113
79072805 3114 case KEY_mkdir:
a0d0e21e 3115 LOP(OP_MKDIR,XTERM);
79072805
LW
3116
3117 case KEY_msgctl:
a0d0e21e 3118 LOP(OP_MSGCTL,XTERM);
79072805
LW
3119
3120 case KEY_msgget:
a0d0e21e 3121 LOP(OP_MSGGET,XTERM);
79072805
LW
3122
3123 case KEY_msgrcv:
a0d0e21e 3124 LOP(OP_MSGRCV,XTERM);
79072805
LW
3125
3126 case KEY_msgsnd:
a0d0e21e 3127 LOP(OP_MSGSND,XTERM);
79072805 3128
93a17b20
LW
3129 case KEY_my:
3130 in_my = TRUE;
c750a3ec
MB
3131 s = skipspace(s);
3132 if (isIDFIRST(*s)) {
97fcbf96 3133 s = scan_word(s, tokenbuf, sizeof tokenbuf, TRUE, &len);
c750a3ec
MB
3134 in_my_stash = gv_stashpv(tokenbuf, FALSE);
3135 if (!in_my_stash) {
3136 char tmpbuf[1024];
3137 bufptr = s;
3138 sprintf(tmpbuf, "No such class %.1000s", tokenbuf);
3139 yyerror(tmpbuf);
3140 }
3141 }
55497cff 3142 OPERATOR(MY);
93a17b20 3143
79072805 3144 case KEY_next:
a0d0e21e 3145 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
3146 LOOPX(OP_NEXT);
3147
3148 case KEY_ne:
3149 Eop(OP_SNE);
3150
a0d0e21e
LW
3151 case KEY_no:
3152 if (expect != XSTATE)
3153 yyerror("\"no\" not allowed in expression");
3154 s = force_word(s,WORD,FALSE,TRUE,FALSE);
89bfa8cd 3155 s = force_version(s);
a0d0e21e
LW
3156 yylval.ival = 0;
3157 OPERATOR(USE);
3158
3159 case KEY_not:
3160 OPERATOR(NOTOP);
3161
79072805 3162 case KEY_open:
93a17b20
LW
3163 s = skipspace(s);
3164 if (isIDFIRST(*s)) {
3165 char *t;
3166 for (d = s; isALNUM(*d); d++) ;
3167 t = skipspace(d);
3168 if (strchr("|&*+-=!?:.", *t))
3169 warn("Precedence problem: open %.*s should be open(%.*s)",
3170 d-s,s, d-s,s);
3171 }
a0d0e21e 3172 LOP(OP_OPEN,XTERM);
79072805 3173
463ee0b2 3174 case KEY_or:
a0d0e21e 3175 yylval.ival = OP_OR;
463ee0b2
LW
3176 OPERATOR(OROP);
3177
79072805
LW
3178 case KEY_ord:
3179 UNI(OP_ORD);
3180
3181 case KEY_oct:
3182 UNI(OP_OCT);
3183
3184 case KEY_opendir:
a0d0e21e 3185 LOP(OP_OPEN_DIR,XTERM);
79072805
LW
3186
3187 case KEY_print:
3188 checkcomma(s,tokenbuf,"filehandle");
a0d0e21e 3189 LOP(OP_PRINT,XREF);
79072805
LW
3190
3191 case KEY_printf:
3192 checkcomma(s,tokenbuf,"filehandle");
a0d0e21e 3193 LOP(OP_PRTF,XREF);
79072805 3194
c07a80fd 3195 case KEY_prototype:
3196 UNI(OP_PROTOTYPE);
3197
79072805 3198 case KEY_push:
a0d0e21e 3199 LOP(OP_PUSH,XTERM);
79072805
LW
3200
3201 case KEY_pop:
3202 UNI(OP_POP);
3203
a0d0e21e
LW
3204 case KEY_pos:
3205 UNI(OP_POS);
3206
79072805 3207 case KEY_pack:
a0d0e21e 3208 LOP(OP_PACK,XTERM);
79072805
LW
3209
3210 case KEY_package:
a0d0e21e 3211 s = force_word(s,WORD,FALSE,TRUE,FALSE);
79072805
LW
3212 OPERATOR(PACKAGE);
3213
3214 case KEY_pipe:
a0d0e21e 3215 LOP(OP_PIPE_OP,XTERM);
79072805
LW
3216
3217 case KEY_q:
3218 s = scan_str(s);
3219 if (!s)
85e6fe83 3220 missingterm((char*)0);
79072805
LW
3221 yylval.ival = OP_CONST;
3222 TERM(sublex_start());
3223
a0d0e21e
LW
3224 case KEY_quotemeta:
3225 UNI(OP_QUOTEMETA);
3226
8990e307
LW
3227 case KEY_qw:
3228 s = scan_str(s);
3229 if (!s)
85e6fe83 3230 missingterm((char*)0);
55497cff 3231 if (dowarn && SvLEN(lex_stuff)) {
3232 d = SvPV_force(lex_stuff, len);
3233 for (; len; --len, ++d) {
3234 if (*d == ',') {
3235 warn("Possible attempt to separate words with commas");
3236 break;
3237 }
3238 if (*d == '#') {
3239 warn("Possible attempt to put comments in qw() list");
3240 break;
3241 }
3242 }
3243 }
8990e307
LW
3244 force_next(')');
3245 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, q(lex_stuff));
3246 lex_stuff = Nullsv;
3247 force_next(THING);
3248 force_next(',');
3249 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
3250 force_next(THING);
3251 force_next('(');
a0d0e21e
LW
3252 yylval.ival = OP_SPLIT;
3253 CLINE;
3254 expect = XTERM;
3255 bufptr = s;
3256 last_lop = oldbufptr;
3257 last_lop_op = OP_SPLIT;
3258 return FUNC;
8990e307 3259
79072805
LW
3260 case KEY_qq:
3261 s = scan_str(s);
3262 if (!s)
85e6fe83 3263 missingterm((char*)0);
a0d0e21e 3264 yylval.ival = OP_STRINGIFY;
ed6116ce
LW
3265 if (SvIVX(lex_stuff) == '\'')
3266 SvIVX(lex_stuff) = 0; /* qq'$foo' should intepolate */
79072805
LW
3267 TERM(sublex_start());
3268
3269 case KEY_qx:
3270 s = scan_str(s);
3271 if (!s)
85e6fe83 3272 missingterm((char*)0);
79072805
LW
3273 yylval.ival = OP_BACKTICK;
3274 set_csh();
3275 TERM(sublex_start());
3276
3277 case KEY_return:
3278 OLDLOP(OP_RETURN);
3279
3280 case KEY_require:
748a9306 3281 *tokenbuf = '\0';
a0d0e21e 3282 s = force_word(s,WORD,TRUE,TRUE,FALSE);
748a9306 3283 if (isIDFIRST(*tokenbuf))
89bfa8cd 3284 gv_stashpvn(tokenbuf, strlen(tokenbuf), TRUE);
748a9306 3285 else if (*s == '<')
a0d0e21e 3286 yyerror("<> should be quotes");
463ee0b2 3287 UNI(OP_REQUIRE);
79072805
LW
3288
3289 case KEY_reset:
3290 UNI(OP_RESET);
3291
3292 case KEY_redo:
a0d0e21e 3293 s = force_word(s,WORD,TRUE,FALSE,FALSE);
79072805
LW
3294 LOOPX(OP_REDO);
3295
3296 case KEY_rename:
a0d0e21e 3297 LOP(OP_RENAME,XTERM);
79072805
LW
3298
3299 case KEY_rand:
3300 UNI(OP_RAND);
3301
3302 case KEY_rmdir:
3303 UNI(OP_RMDIR);
3304
3305 case KEY_rindex:
a0d0e21e 3306 LOP(OP_RINDEX,XTERM);
79072805
LW
3307
3308 case KEY_read:
a0d0e21e 3309 LOP(OP_READ,XTERM);
79072805
LW
3310
3311 case KEY_readdir:
3312 UNI(OP_READDIR);
3313
93a17b20
LW
3314 case KEY_readline:
3315 set_csh();
3316 UNI(OP_READLINE);
3317
3318 case KEY_readpipe:
3319 set_csh();
3320 UNI(OP_BACKTICK);
3321
79072805
LW
3322 case KEY_rewinddir:
3323 UNI(OP_REWINDDIR);
3324
3325 case KEY_recv:
a0d0e21e 3326 LOP(OP_RECV,XTERM);
79072805
LW
3327
3328 case KEY_reverse:
a0d0e21e 3329 LOP(OP_REVERSE,XTERM);
79072805
LW
3330
3331 case KEY_readlink:
3332 UNI(OP_READLINK);
3333
3334 case KEY_ref:
3335 UNI(OP_REF);
3336
3337 case KEY_s:
3338 s = scan_subst(s);
3339 if (yylval.opval)
3340 TERM(sublex_start());
3341 else
3342 TOKEN(1); /* force error */
3343
a0d0e21e
LW
3344 case KEY_chomp:
3345 UNI(OP_CHOMP);
3346
79072805
LW
3347 case KEY_scalar:
3348 UNI(OP_SCALAR);
3349
3350 case KEY_select:
a0d0e21e 3351 LOP(OP_SELECT,XTERM);
79072805
LW
3352
3353 case KEY_seek:
a0d0e21e 3354 LOP(OP_SEEK,XTERM);
79072805
LW
3355
3356 case KEY_semctl:
a0d0e21e 3357 LOP(OP_SEMCTL,XTERM);
79072805
LW
3358
3359 case KEY_semget:
a0d0e21e 3360 LOP(OP_SEMGET,XTERM);
79072805
LW
3361
3362 case KEY_semop:
a0d0e21e 3363 LOP(OP_SEMOP,XTERM);
79072805
LW
3364
3365 case KEY_send:
a0d0e21e 3366 LOP(OP_SEND,XTERM);
79072805
LW
3367
3368 case KEY_setpgrp:
a0d0e21e 3369 LOP(OP_SETPGRP,XTERM);
79072805
LW
3370
3371 case KEY_setpriority:
a0d0e21e 3372 LOP(OP_SETPRIORITY,XTERM);
79072805
LW
3373
3374 case KEY_sethostent:
ff68c719 3375 UNI(OP_SHOSTENT);
79072805
LW
3376
3377 case KEY_setnetent:
ff68c719 3378 UNI(OP_SNETENT);
79072805
LW
3379
3380 case KEY_setservent:
ff68c719 3381 UNI(OP_SSERVENT);
79072805
LW
3382
3383 case KEY_setprotoent:
ff68c719 3384 UNI(OP_SPROTOENT);
79072805
LW
3385
3386 case KEY_setpwent:
3387 FUN0(OP_SPWENT);
3388
3389 case KEY_setgrent:
3390 FUN0(OP_SGRENT);
3391
3392 case KEY_seekdir:
a0d0e21e 3393 LOP(OP_SEEKDIR,XTERM);
79072805
LW
3394
3395 case KEY_setsockopt:
a0d0e21e 3396 LOP(OP_SSOCKOPT,XTERM);
79072805
LW
3397
3398 case KEY_shift:
3399 UNI(OP_SHIFT);
3400
3401 case KEY_shmctl:
a0d0e21e 3402 LOP(OP_SHMCTL,XTERM);
79072805
LW
3403
3404 case KEY_shmget:
a0d0e21e 3405 LOP(OP_SHMGET,XTERM);
79072805
LW
3406
3407 case KEY_shmread:
a0d0e21e 3408 LOP(OP_SHMREAD,XTERM);
79072805
LW
3409
3410 case KEY_shmwrite:
a0d0e21e 3411 LOP(OP_SHMWRITE,XTERM);
79072805
LW
3412
3413 case KEY_shutdown:
a0d0e21e 3414 LOP(OP_SHUTDOWN,XTERM);
79072805
LW
3415
3416 case KEY_sin:
3417 UNI(OP_SIN);
3418
3419 case KEY_sleep:
3420 UNI(OP_SLEEP);
3421
3422 case KEY_socket:
a0d0e21e 3423 LOP(OP_SOCKET,XTERM);
79072805
LW
3424
3425 case KEY_socketpair:
a0d0e21e 3426 LOP(OP_SOCKPAIR,XTERM);
79072805
LW
3427
3428 case KEY_sort:
3429 checkcomma(s,tokenbuf,"subroutine name");
3430 s = skipspace(s);
3431 if (*s == ';' || *s == ')') /* probably a close */
463ee0b2
LW
3432 croak("sort is now a reserved word");
3433 expect = XTERM;
a0d0e21e
LW
3434 s = force_word(s,WORD,TRUE,TRUE,TRUE);
3435 LOP(OP_SORT,XREF);
79072805
LW
3436
3437 case KEY_split:
a0d0e21e 3438 LOP(OP_SPLIT,XTERM);
79072805
LW
3439
3440 case KEY_sprintf:
a0d0e21e 3441 LOP(OP_SPRINTF,XTERM);
79072805
LW
3442
3443 case KEY_splice:
a0d0e21e 3444 LOP(OP_SPLICE,XTERM);
79072805
LW
3445
3446 case KEY_sqrt:
3447 UNI(OP_SQRT);
3448
3449 case KEY_srand:
3450 UNI(OP_SRAND);
3451
3452 case KEY_stat:
3453 UNI(OP_STAT);
3454
3455 case KEY_study:
3456 sawstudy++;
3457 UNI(OP_STUDY);
3458
3459 case KEY_substr:
a0d0e21e 3460 LOP(OP_SUBSTR,XTERM);
79072805
LW
3461
3462 case KEY_format:
3463 case KEY_sub:
93a17b20 3464 really_sub:
79072805 3465 s = skipspace(s);
4633a7c4 3466
463ee0b2 3467 if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
8903cb82 3468 char tmpbuf[sizeof tokenbuf];
4633a7c4 3469 expect = XBLOCK;
8903cb82 3470 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
463ee0b2
LW
3471 if (strchr(tmpbuf, ':'))
3472 sv_setpv(subname, tmpbuf);
3473 else {
3474 sv_setsv(subname,curstname);
8990e307 3475 sv_catpvn(subname,"::",2);
463ee0b2
LW
3476 sv_catpvn(subname,tmpbuf,len);
3477 }
a0d0e21e 3478 s = force_word(s,WORD,FALSE,TRUE,TRUE);
4633a7c4 3479 s = skipspace(s);
79072805 3480 }
4633a7c4
LW
3481 else {
3482 expect = XTERMBLOCK;
79072805 3483 sv_setpv(subname,"?");
4633a7c4
LW
3484 }
3485
3486 if (tmp == KEY_format) {
3487 s = skipspace(s);
3488 if (*s == '=')
3489 lex_formbrack = lex_brackets + 1;
3490 OPERATOR(FORMAT);
3491 }
79072805 3492
4633a7c4
LW
3493 /* Look for a prototype */
3494 if (*s == '(') {
68dc0745 3495 char *p;
3496
4633a7c4
LW
3497 s = scan_str(s);
3498 if (!s) {
3499 if (lex_stuff)
3500 SvREFCNT_dec(lex_stuff);
3501 lex_stuff = Nullsv;
3502 croak("Prototype not terminated");
3503 }
68dc0745 3504 /* strip spaces */
3505 d = SvPVX(lex_stuff);
3506 tmp = 0;
3507 for (p = d; *p; ++p) {
3508 if (!isSPACE(*p))
3509 d[tmp++] = *p;
3510 }
3511 d[tmp] = '\0';
3512 SvCUR(lex_stuff) = tmp;
3513
4633a7c4
LW
3514 nexttoke++;
3515 nextval[1] = nextval[0];
3516 nexttype[1] = nexttype[0];
3517 nextval[0].opval = (OP*)newSVOP(OP_CONST, 0, lex_stuff);
3518 nexttype[0] = THING;
3519 if (nexttoke == 1) {
3520 lex_defer = lex_state;
3521 lex_expect = expect;
3522 lex_state = LEX_KNOWNEXT;
3523 }
3524 lex_stuff = Nullsv;
3525 }
79072805 3526
4633a7c4
LW
3527 if (*SvPV(subname,na) == '?') {
3528 sv_setpv(subname,"__ANON__");
3529 TOKEN(ANONSUB);
3530 }
3531 PREBLOCK(SUB);
79072805
LW
3532
3533 case KEY_system:
3534 set_csh();
a0d0e21e 3535 LOP(OP_SYSTEM,XREF);
79072805
LW
3536
3537 case KEY_symlink:
a0d0e21e 3538 LOP(OP_SYMLINK,XTERM);
79072805
LW
3539
3540 case KEY_syscall:
a0d0e21e 3541 LOP(OP_SYSCALL,XTERM);
79072805 3542
c07a80fd 3543 case KEY_sysopen:
3544 LOP(OP_SYSOPEN,XTERM);
3545
137443ea 3546 case KEY_sysseek:
3547 LOP(OP_SYSSEEK,XTERM);
3548
79072805 3549 case KEY_sysread:
a0d0e21e 3550 LOP(OP_SYSREAD,XTERM);
79072805
LW
3551
3552 case KEY_syswrite:
a0d0e21e 3553 LOP(OP_SYSWRITE,XTERM);
79072805
LW
3554
3555 case KEY_tr:
3556 s = scan_trans(s);
3557 TERM(sublex_start());
3558
3559 case KEY_tell:
3560 UNI(OP_TELL);
3561
3562 case KEY_telldir:
3563 UNI(OP_TELLDIR);
3564
463ee0b2 3565 case KEY_tie:
a0d0e21e 3566 LOP(OP_TIE,XTERM);
463ee0b2 3567
c07a80fd 3568 case KEY_tied:
3569 UNI(OP_TIED);
3570
79072805
LW
3571 case KEY_time:
3572 FUN0(OP_TIME);
3573
3574 case KEY_times:
3575 FUN0(OP_TMS);
3576
3577 case KEY_truncate:
a0d0e21e 3578 LOP(OP_TRUNCATE,XTERM);
79072805
LW
3579
3580 case KEY_uc:
3581 UNI(OP_UC);
3582
3583 case KEY_ucfirst:
3584 UNI(OP_UCFIRST);
3585
463ee0b2
LW
3586 case KEY_untie:
3587 UNI(OP_UNTIE);
3588
79072805
LW
3589 case KEY_until:
3590 yylval.ival = curcop->cop_line;
3591 OPERATOR(UNTIL);
3592
3593 case KEY_unless:
3594 yylval.ival = curcop->cop_line;
3595 OPERATOR(UNLESS);
3596
3597 case KEY_unlink:
a0d0e21e 3598 LOP(OP_UNLINK,XTERM);
79072805
LW
3599
3600 case KEY_undef:
3601 UNI(OP_UNDEF);
3602
3603 case KEY_unpack:
a0d0e21e 3604 LOP(OP_UNPACK,XTERM);
79072805
LW
3605
3606 case KEY_utime:
a0d0e21e 3607 LOP(OP_UTIME,XTERM);
79072805
LW
3608
3609 case KEY_umask:
748a9306
LW
3610 if (dowarn) {
3611 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3612 if (*d != '0' && isDIGIT(*d))
3613 yywarn("umask: argument is missing initial 0");
3614 }
79072805
LW
3615 UNI(OP_UMASK);
3616
3617 case KEY_unshift:
a0d0e21e
LW
3618 LOP(OP_UNSHIFT,XTERM);
3619
3620 case KEY_use:
3621 if (expect != XSTATE)
3622 yyerror("\"use\" not allowed in expression");
89bfa8cd 3623 s = skipspace(s);
3624 if(isDIGIT(*s)) {
3625 s = force_version(s);
3626 if(*s == ';' || (s = skipspace(s), *s == ';')) {
3627 nextval[nexttoke].opval = Nullop;
3628 force_next(WORD);
3629 }
3630 }
3631 else {
3632 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3633 s = force_version(s);
3634 }
a0d0e21e
LW
3635 yylval.ival = 1;
3636 OPERATOR(USE);
79072805
LW
3637
3638 case KEY_values:
3639 UNI(OP_VALUES);
3640
3641 case KEY_vec:
3642 sawvec = TRUE;
a0d0e21e 3643 LOP(OP_VEC,XTERM);
79072805
LW
3644
3645 case KEY_while:
3646 yylval.ival = curcop->cop_line;
3647 OPERATOR(WHILE);
3648
3649 case KEY_warn:
a0d0e21e
LW
3650 hints |= HINT_BLOCK_SCOPE;
3651 LOP(OP_WARN,XTERM);
79072805
LW
3652
3653 case KEY_wait:
3654 FUN0(OP_WAIT);
3655
3656 case KEY_waitpid:
a0d0e21e 3657 LOP(OP_WAITPID,XTERM);
79072805
LW
3658
3659 case KEY_wantarray:
3660 FUN0(OP_WANTARRAY);
3661
3662 case KEY_write:
85e6fe83 3663 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
79072805
LW
3664 UNI(OP_ENTERWRITE);
3665
3666 case KEY_x:
3667 if (expect == XOPERATOR)
3668 Mop(OP_REPEAT);
3669 check_uni();
3670 goto just_a_word;
3671
a0d0e21e
LW
3672 case KEY_xor:
3673 yylval.ival = OP_XOR;
3674 OPERATOR(OROP);
3675
79072805
LW
3676 case KEY_y:
3677 s = scan_trans(s);
3678 TERM(sublex_start());
3679 }
3680 }
3681}
3682
3683I32
3684keyword(d, len)
3685register char *d;
3686I32 len;
3687{
3688 switch (*d) {
3689 case '_':
3690 if (d[1] == '_') {
a0d0e21e 3691 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
68dc0745 3692 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
3693 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
e50aee73 3694 if (strEQ(d,"__DATA__")) return KEY___DATA__;
79072805
LW
3695 if (strEQ(d,"__END__")) return KEY___END__;
3696 }
3697 break;
8990e307
LW
3698 case 'A':
3699 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
3700 break;
79072805 3701 case 'a':
463ee0b2
LW
3702 switch (len) {
3703 case 3:
a0d0e21e
LW
3704 if (strEQ(d,"and")) return -KEY_and;
3705 if (strEQ(d,"abs")) return -KEY_abs;
85e6fe83 3706 break;
463ee0b2 3707 case 5:
a0d0e21e
LW
3708 if (strEQ(d,"alarm")) return -KEY_alarm;
3709 if (strEQ(d,"atan2")) return -KEY_atan2;
463ee0b2
LW
3710 break;
3711 case 6:
a0d0e21e 3712 if (strEQ(d,"accept")) return -KEY_accept;
463ee0b2
LW
3713 break;
3714 }
79072805
LW
3715 break;
3716 case 'B':
3717 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
93a17b20 3718 break;
79072805 3719 case 'b':
a0d0e21e
LW
3720 if (strEQ(d,"bless")) return -KEY_bless;
3721 if (strEQ(d,"bind")) return -KEY_bind;
3722 if (strEQ(d,"binmode")) return -KEY_binmode;
3723 break;
3724 case 'C':
3725 if (strEQ(d,"CORE")) return -KEY_CORE;
79072805
LW
3726 break;
3727 case 'c':
3728 switch (len) {
3729 case 3:
a0d0e21e
LW
3730 if (strEQ(d,"cmp")) return -KEY_cmp;
3731 if (strEQ(d,"chr")) return -KEY_chr;
3732 if (strEQ(d,"cos")) return -KEY_cos;
79072805
LW
3733 break;
3734 case 4:
3735 if (strEQ(d,"chop")) return KEY_chop;
3736 break;
3737 case 5:
a0d0e21e
LW
3738 if (strEQ(d,"close")) return -KEY_close;
3739 if (strEQ(d,"chdir")) return -KEY_chdir;
3740 if (strEQ(d,"chomp")) return KEY_chomp;
3741 if (strEQ(d,"chmod")) return -KEY_chmod;
3742 if (strEQ(d,"chown")) return -KEY_chown;
3743 if (strEQ(d,"crypt")) return -KEY_crypt;
79072805
LW
3744 break;
3745 case 6:
a0d0e21e
LW
3746 if (strEQ(d,"chroot")) return -KEY_chroot;
3747 if (strEQ(d,"caller")) return -KEY_caller;
79072805
LW
3748 break;
3749 case 7:
a0d0e21e 3750 if (strEQ(d,"connect")) return -KEY_connect;
79072805
LW
3751 break;
3752 case 8:
a0d0e21e
LW
3753 if (strEQ(d,"closedir")) return -KEY_closedir;
3754 if (strEQ(d,"continue")) return -KEY_continue;
79072805
LW
3755 break;
3756 }
3757 break;
ed6116ce
LW
3758 case 'D':
3759 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
3760 break;
79072805
LW
3761 case 'd':
3762 switch (len) {
3763 case 2:
3764 if (strEQ(d,"do")) return KEY_do;
3765 break;
3766 case 3:
a0d0e21e 3767 if (strEQ(d,"die")) return -KEY_die;
79072805
LW
3768 break;
3769 case 4:
a0d0e21e 3770 if (strEQ(d,"dump")) return -KEY_dump;
79072805
LW
3771 break;
3772 case 6:
3773 if (strEQ(d,"delete")) return KEY_delete;
3774 break;
3775 case 7:
3776 if (strEQ(d,"defined")) return KEY_defined;
a0d0e21e 3777 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
79072805
LW
3778 break;
3779 case 8:
a0d0e21e 3780 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
79072805
LW
3781 break;
3782 }
3783 break;
3784 case 'E':
a0d0e21e 3785 if (strEQ(d,"EQ")) { deprecate(d); return -KEY_eq;}
79072805
LW
3786 if (strEQ(d,"END")) return KEY_END;
3787 break;
3788 case 'e':
3789 switch (len) {
3790 case 2:
a0d0e21e 3791 if (strEQ(d,"eq")) return -KEY_eq;
79072805
LW
3792 break;
3793 case 3:
a0d0e21e
LW
3794 if (strEQ(d,"eof")) return -KEY_eof;
3795 if (strEQ(d,"exp")) return -KEY_exp;
79072805
LW
3796 break;
3797 case 4:
3798 if (strEQ(d,"else")) return KEY_else;
a0d0e21e 3799 if (strEQ(d,"exit")) return -KEY_exit;
79072805 3800 if (strEQ(d,"eval")) return KEY_eval;
a0d0e21e 3801 if (strEQ(d,"exec")) return -KEY_exec;
79072805
LW
3802 if (strEQ(d,"each")) return KEY_each;
3803 break;
3804 case 5:
3805 if (strEQ(d,"elsif")) return KEY_elsif;
3806 break;
a0d0e21e
LW
3807 case 6:
3808 if (strEQ(d,"exists")) return KEY_exists;
4633a7c4 3809 if (strEQ(d,"elseif")) warn("elseif should be elsif");
a0d0e21e 3810 break;
79072805 3811 case 8:
a0d0e21e
LW
3812 if (strEQ(d,"endgrent")) return -KEY_endgrent;
3813 if (strEQ(d,"endpwent")) return -KEY_endpwent;
79072805
LW
3814 break;
3815 case 9:
a0d0e21e 3816 if (strEQ(d,"endnetent")) return -KEY_endnetent;
79072805
LW
3817 break;
3818 case 10:
a0d0e21e
LW
3819 if (strEQ(d,"endhostent")) return -KEY_endhostent;
3820 if (strEQ(d,"endservent")) return -KEY_endservent;
79072805
LW
3821 break;
3822 case 11:
a0d0e21e 3823 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
79072805 3824 break;
a687059c 3825 }
a687059c 3826 break;
79072805
LW
3827 case 'f':
3828 switch (len) {
3829 case 3:
3830 if (strEQ(d,"for")) return KEY_for;
3831 break;
3832 case 4:
a0d0e21e 3833 if (strEQ(d,"fork")) return -KEY_fork;
79072805
LW
3834 break;
3835 case 5:
a0d0e21e
LW
3836 if (strEQ(d,"fcntl")) return -KEY_fcntl;
3837 if (strEQ(d,"flock")) return -KEY_flock;
79072805
LW
3838 break;
3839 case 6:
3840 if (strEQ(d,"format")) return KEY_format;
a0d0e21e 3841 if (strEQ(d,"fileno")) return -KEY_fileno;
79072805
LW
3842 break;
3843 case 7:
3844 if (strEQ(d,"foreach")) return KEY_foreach;
3845 break;
3846 case 8:
a0d0e21e 3847 if (strEQ(d,"formline")) return -KEY_formline;
79072805 3848 break;
378cc40b 3849 }
a687059c 3850 break;
79072805
LW
3851 case 'G':
3852 if (len == 2) {
a0d0e21e
LW
3853 if (strEQ(d,"GT")) { deprecate(d); return -KEY_gt;}
3854 if (strEQ(d,"GE")) { deprecate(d); return -KEY_ge;}
9f68db38 3855 }
a687059c 3856 break;
79072805 3857 case 'g':
a687059c
LW
3858 if (strnEQ(d,"get",3)) {
3859 d += 3;
3860 if (*d == 'p') {
79072805
LW
3861 switch (len) {
3862 case 7:
a0d0e21e
LW
3863 if (strEQ(d,"ppid")) return -KEY_getppid;
3864 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
79072805
LW
3865 break;
3866 case 8:
a0d0e21e
LW
3867 if (strEQ(d,"pwent")) return -KEY_getpwent;
3868 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
3869 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
79072805
LW
3870 break;
3871 case 11:
a0d0e21e
LW
3872 if (strEQ(d,"peername")) return -KEY_getpeername;
3873 if (strEQ(d,"protoent")) return -KEY_getprotoent;
3874 if (strEQ(d,"priority")) return -KEY_getpriority;
79072805
LW
3875 break;
3876 case 14:
a0d0e21e 3877 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
79072805
LW
3878 break;
3879 case 16:
a0d0e21e 3880 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
79072805
LW
3881 break;
3882 }
a687059c
LW
3883 }
3884 else if (*d == 'h') {
a0d0e21e
LW
3885 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
3886 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
3887 if (strEQ(d,"hostent")) return -KEY_gethostent;
a687059c
LW
3888 }
3889 else if (*d == 'n') {
a0d0e21e
LW
3890 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
3891 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
3892 if (strEQ(d,"netent")) return -KEY_getnetent;
a687059c
LW
3893 }
3894 else if (*d == 's') {
a0d0e21e
LW
3895 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
3896 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
3897 if (strEQ(d,"servent")) return -KEY_getservent;
3898 if (strEQ(d,"sockname")) return -KEY_getsockname;
3899 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
a687059c
LW
3900 }
3901 else if (*d == 'g') {
a0d0e21e
LW
3902 if (strEQ(d,"grent")) return -KEY_getgrent;
3903 if (strEQ(d,"grnam")) return -KEY_getgrnam;
3904 if (strEQ(d,"grgid")) return -KEY_getgrgid;
a687059c
LW
3905 }
3906 else if (*d == 'l') {
a0d0e21e 3907 if (strEQ(d,"login")) return -KEY_getlogin;
a687059c 3908 }
a0d0e21e 3909 else if (strEQ(d,"c")) return -KEY_getc;
79072805 3910 break;
a687059c 3911 }
79072805
LW
3912 switch (len) {
3913 case 2:
a0d0e21e
LW
3914 if (strEQ(d,"gt")) return -KEY_gt;
3915 if (strEQ(d,"ge")) return -KEY_ge;
79072805
LW
3916 break;
3917 case 4:
3918 if (strEQ(d,"grep")) return KEY_grep;
3919 if (strEQ(d,"goto")) return KEY_goto;
a0d0e21e 3920 if (strEQ(d,"glob")) return -KEY_glob;
79072805
LW
3921 break;
3922 case 6:
a0d0e21e 3923 if (strEQ(d,"gmtime")) return -KEY_gmtime;
79072805 3924 break;
378cc40b 3925 }
a687059c 3926 break;
79072805 3927 case 'h':
a0d0e21e 3928 if (strEQ(d,"hex")) return -KEY_hex;
a687059c 3929 break;
79072805
LW
3930 case 'i':
3931 switch (len) {
3932 case 2:
3933 if (strEQ(d,"if")) return KEY_if;
3934 break;
3935 case 3:
a0d0e21e 3936 if (strEQ(d,"int")) return -KEY_int;
79072805
LW
3937 break;
3938 case 5:
a0d0e21e
LW
3939 if (strEQ(d,"index")) return -KEY_index;
3940 if (strEQ(d,"ioctl")) return -KEY_ioctl;
79072805
LW
3941 break;
3942 }
a687059c 3943 break;
79072805 3944 case 'j':
a0d0e21e 3945 if (strEQ(d,"join")) return -KEY_join;
a687059c 3946 break;
79072805
LW
3947 case 'k':
3948 if (len == 4) {
3949 if (strEQ(d,"keys")) return KEY_keys;
a0d0e21e 3950 if (strEQ(d,"kill")) return -KEY_kill;
663a0e37 3951 }
79072805
LW
3952 break;
3953 case 'L':
3954 if (len == 2) {
a0d0e21e
LW
3955 if (strEQ(d,"LT")) { deprecate(d); return -KEY_lt;}
3956 if (strEQ(d,"LE")) { deprecate(d); return -KEY_le;}
378cc40b 3957 }
79072805
LW
3958 break;
3959 case 'l':
3960 switch (len) {
3961 case 2:
a0d0e21e
LW
3962 if (strEQ(d,"lt")) return -KEY_lt;
3963 if (strEQ(d,"le")) return -KEY_le;
3964 if (strEQ(d,"lc")) return -KEY_lc;
79072805
LW
3965 break;
3966 case 3:
a0d0e21e 3967 if (strEQ(d,"log")) return -KEY_log;
79072805
LW
3968 break;
3969 case 4:
3970 if (strEQ(d,"last")) return KEY_last;
a0d0e21e 3971 if (strEQ(d,"link")) return -KEY_link;
c0329465 3972 if (strEQ(d,"lock")) return -KEY_lock;
395c3793 3973 break;
79072805
LW
3974 case 5:
3975 if (strEQ(d,"local")) return KEY_local;
a0d0e21e 3976 if (strEQ(d,"lstat")) return -KEY_lstat;
79072805
LW
3977 break;
3978 case 6:
a0d0e21e
LW
3979 if (strEQ(d,"length")) return -KEY_length;
3980 if (strEQ(d,"listen")) return -KEY_listen;
79072805
LW
3981 break;
3982 case 7:
a0d0e21e 3983 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
79072805
LW
3984 break;
3985 case 9:
a0d0e21e 3986 if (strEQ(d,"localtime")) return -KEY_localtime;
395c3793
LW
3987 break;
3988 }
a687059c 3989 break;
79072805
LW
3990 case 'm':
3991 switch (len) {
3992 case 1: return KEY_m;
93a17b20
LW
3993 case 2:
3994 if (strEQ(d,"my")) return KEY_my;
3995 break;
a0d0e21e
LW
3996 case 3:
3997 if (strEQ(d,"map")) return KEY_map;
3998 break;
79072805 3999 case 5:
a0d0e21e 4000 if (strEQ(d,"mkdir")) return -KEY_mkdir;
79072805
LW
4001 break;
4002 case 6:
a0d0e21e
LW
4003 if (strEQ(d,"msgctl")) return -KEY_msgctl;
4004 if (strEQ(d,"msgget")) return -KEY_msgget;
4005 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
4006 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
79072805
LW
4007 break;
4008 }
a687059c 4009 break;
79072805 4010 case 'N':
a0d0e21e 4011 if (strEQ(d,"NE")) { deprecate(d); return -KEY_ne;}
a687059c 4012 break;
79072805
LW
4013 case 'n':
4014 if (strEQ(d,"next")) return KEY_next;
a0d0e21e
LW
4015 if (strEQ(d,"ne")) return -KEY_ne;
4016 if (strEQ(d,"not")) return -KEY_not;
4017 if (strEQ(d,"no")) return KEY_no;
a687059c 4018 break;
79072805
LW
4019 case 'o':
4020 switch (len) {
463ee0b2 4021 case 2:
a0d0e21e 4022 if (strEQ(d,"or")) return -KEY_or;
463ee0b2 4023 break;
79072805 4024 case 3:
a0d0e21e
LW
4025 if (strEQ(d,"ord")) return -KEY_ord;
4026 if (strEQ(d,"oct")) return -KEY_oct;
79072805
LW
4027 break;
4028 case 4:
a0d0e21e 4029 if (strEQ(d,"open")) return -KEY_open;
79072805
LW
4030 break;
4031 case 7:
a0d0e21e 4032 if (strEQ(d,"opendir")) return -KEY_opendir;
79072805 4033 break;
fe14fcc3 4034 }
a687059c 4035 break;
79072805
LW
4036 case 'p':
4037 switch (len) {
4038 case 3:
4039 if (strEQ(d,"pop")) return KEY_pop;
a0d0e21e 4040 if (strEQ(d,"pos")) return KEY_pos;
79072805
LW
4041 break;
4042 case 4:
4043 if (strEQ(d,"push")) return KEY_push;
a0d0e21e
LW
4044 if (strEQ(d,"pack")) return -KEY_pack;
4045 if (strEQ(d,"pipe")) return -KEY_pipe;
79072805
LW
4046 break;
4047 case 5:
4048 if (strEQ(d,"print")) return KEY_print;
4049 break;
4050 case 6:
4051 if (strEQ(d,"printf")) return KEY_printf;
4052 break;
4053 case 7:
4054 if (strEQ(d,"package")) return KEY_package;
4055 break;
c07a80fd 4056 case 9:
4057 if (strEQ(d,"prototype")) return KEY_prototype;
663a0e37 4058 }
79072805
LW
4059 break;
4060 case 'q':
4061 if (len <= 2) {
4062 if (strEQ(d,"q")) return KEY_q;
4063 if (strEQ(d,"qq")) return KEY_qq;
8990e307 4064 if (strEQ(d,"qw")) return KEY_qw;
79072805 4065 if (strEQ(d,"qx")) return KEY_qx;
663a0e37 4066 }
a0d0e21e 4067 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
79072805 4068 break;
c750a3ec
MB
4069 case 'R':
4070 if (strEQ(d,"RESTART")) return KEY_RESTART;
4071 break;
79072805
LW
4072 case 'r':
4073 switch (len) {
4074 case 3:
a0d0e21e 4075 if (strEQ(d,"ref")) return -KEY_ref;
79072805
LW
4076 break;
4077 case 4:
a0d0e21e
LW
4078 if (strEQ(d,"read")) return -KEY_read;
4079 if (strEQ(d,"rand")) return -KEY_rand;
4080 if (strEQ(d,"recv")) return -KEY_recv;
79072805
LW
4081 if (strEQ(d,"redo")) return KEY_redo;
4082 break;
4083 case 5:
a0d0e21e
LW
4084 if (strEQ(d,"rmdir")) return -KEY_rmdir;
4085 if (strEQ(d,"reset")) return -KEY_reset;
79072805
LW
4086 break;
4087 case 6:
4088 if (strEQ(d,"return")) return KEY_return;
a0d0e21e
LW
4089 if (strEQ(d,"rename")) return -KEY_rename;
4090 if (strEQ(d,"rindex")) return -KEY_rindex;
79072805
LW
4091 break;
4092 case 7:
a0d0e21e
LW
4093 if (strEQ(d,"require")) return -KEY_require;
4094 if (strEQ(d,"reverse")) return -KEY_reverse;
4095 if (strEQ(d,"readdir")) return -KEY_readdir;
79072805
LW
4096 break;
4097 case 8:
a0d0e21e
LW
4098 if (strEQ(d,"readlink")) return -KEY_readlink;
4099 if (strEQ(d,"readline")) return -KEY_readline;
4100 if (strEQ(d,"readpipe")) return -KEY_readpipe;
79072805
LW
4101 break;
4102 case 9:
a0d0e21e 4103 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
79072805 4104 break;
a687059c 4105 }
79072805
LW
4106 break;
4107 case 's':
a687059c 4108 switch (d[1]) {
79072805 4109 case 0: return KEY_s;
a687059c 4110 case 'c':
79072805 4111 if (strEQ(d,"scalar")) return KEY_scalar;
a687059c
LW
4112 break;
4113 case 'e':
79072805
LW
4114 switch (len) {
4115 case 4:
a0d0e21e
LW
4116 if (strEQ(d,"seek")) return -KEY_seek;
4117 if (strEQ(d,"send")) return -KEY_send;
79072805
LW
4118 break;
4119 case 5:
a0d0e21e 4120 if (strEQ(d,"semop")) return -KEY_semop;
79072805
LW
4121 break;
4122 case 6:
a0d0e21e
LW
4123 if (strEQ(d,"select")) return -KEY_select;
4124 if (strEQ(d,"semctl")) return -KEY_semctl;
4125 if (strEQ(d,"semget")) return -KEY_semget;
79072805
LW
4126 break;
4127 case 7:
a0d0e21e
LW
4128 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
4129 if (strEQ(d,"seekdir")) return -KEY_seekdir;
79072805
LW
4130 break;
4131 case 8:
a0d0e21e
LW
4132 if (strEQ(d,"setpwent")) return -KEY_setpwent;
4133 if (strEQ(d,"setgrent")) return -KEY_setgrent;
79072805
LW
4134 break;
4135 case 9:
a0d0e21e 4136 if (strEQ(d,"setnetent")) return -KEY_setnetent;
79072805
LW
4137 break;
4138 case 10:
a0d0e21e
LW
4139 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
4140 if (strEQ(d,"sethostent")) return -KEY_sethostent;
4141 if (strEQ(d,"setservent")) return -KEY_setservent;
79072805
LW
4142 break;
4143 case 11:
a0d0e21e
LW
4144 if (strEQ(d,"setpriority")) return -KEY_setpriority;
4145 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
79072805
LW
4146 break;
4147 }
a687059c
LW
4148 break;
4149 case 'h':
79072805
LW
4150 switch (len) {
4151 case 5:
4152 if (strEQ(d,"shift")) return KEY_shift;
4153 break;
4154 case 6:
a0d0e21e
LW
4155 if (strEQ(d,"shmctl")) return -KEY_shmctl;
4156 if (strEQ(d,"shmget")) return -KEY_shmget;
79072805
LW
4157 break;
4158 case 7:
a0d0e21e 4159 if (strEQ(d,"shmread")) return -KEY_shmread;
79072805
LW
4160 break;
4161 case 8:
a0d0e21e
LW
4162 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
4163 if (strEQ(d,"shutdown")) return -KEY_shutdown;
79072805
LW
4164 break;
4165 }
a687059c
LW
4166 break;
4167 case 'i':
a0d0e21e 4168 if (strEQ(d,"sin")) return -KEY_sin;
a687059c
LW
4169 break;
4170 case 'l':
a0d0e21e 4171 if (strEQ(d,"sleep")) return -KEY_sleep;
a687059c
LW
4172 break;
4173 case 'o':
79072805 4174 if (strEQ(d,"sort")) return KEY_sort;
a0d0e21e
LW
4175 if (strEQ(d,"socket")) return -KEY_socket;
4176 if (strEQ(d,"socketpair")) return -KEY_socketpair;
a687059c
LW
4177 break;
4178 case 'p':
79072805 4179 if (strEQ(d,"split")) return KEY_split;
a0d0e21e 4180 if (strEQ(d,"sprintf")) return -KEY_sprintf;
79072805 4181 if (strEQ(d,"splice")) return KEY_splice;
a687059c
LW
4182 break;
4183 case 'q':
a0d0e21e 4184 if (strEQ(d,"sqrt")) return -KEY_sqrt;
a687059c
LW
4185 break;
4186 case 'r':
a0d0e21e 4187 if (strEQ(d,"srand")) return -KEY_srand;
a687059c
LW
4188 break;
4189 case 't':
a0d0e21e 4190 if (strEQ(d,"stat")) return -KEY_stat;
79072805 4191 if (strEQ(d,"study")) return KEY_study;
a687059c
LW
4192 break;
4193 case 'u':
a0d0e21e 4194 if (strEQ(d,"substr")) return -KEY_substr;
79072805 4195 if (strEQ(d,"sub")) return KEY_sub;
a687059c
LW
4196 break;
4197 case 'y':
79072805
LW
4198 switch (len) {
4199 case 6:
a0d0e21e 4200 if (strEQ(d,"system")) return -KEY_system;
79072805
LW
4201 break;
4202 case 7:
a0d0e21e
LW
4203 if (strEQ(d,"symlink")) return -KEY_symlink;
4204 if (strEQ(d,"syscall")) return -KEY_syscall;
137443ea 4205 if (strEQ(d,"sysopen")) return -KEY_sysopen;
4206 if (strEQ(d,"sysread")) return -KEY_sysread;
4207 if (strEQ(d,"sysseek")) return -KEY_sysseek;
79072805
LW
4208 break;
4209 case 8:
a0d0e21e 4210 if (strEQ(d,"syswrite")) return -KEY_syswrite;
79072805 4211 break;
a687059c 4212 }
a687059c
LW
4213 break;
4214 }
4215 break;
79072805
LW
4216 case 't':
4217 switch (len) {
4218 case 2:
4219 if (strEQ(d,"tr")) return KEY_tr;
4220 break;
463ee0b2
LW
4221 case 3:
4222 if (strEQ(d,"tie")) return KEY_tie;
4223 break;
79072805 4224 case 4:
a0d0e21e 4225 if (strEQ(d,"tell")) return -KEY_tell;
c07a80fd 4226 if (strEQ(d,"tied")) return KEY_tied;
a0d0e21e 4227 if (strEQ(d,"time")) return -KEY_time;
79072805
LW
4228 break;
4229 case 5:
a0d0e21e 4230 if (strEQ(d,"times")) return -KEY_times;
79072805
LW
4231 break;
4232 case 7:
a0d0e21e 4233 if (strEQ(d,"telldir")) return -KEY_telldir;
79072805
LW
4234 break;
4235 case 8:
a0d0e21e 4236 if (strEQ(d,"truncate")) return -KEY_truncate;
79072805 4237 break;
378cc40b 4238 }
a687059c 4239 break;
79072805
LW
4240 case 'u':
4241 switch (len) {
4242 case 2:
a0d0e21e
LW
4243 if (strEQ(d,"uc")) return -KEY_uc;
4244 break;
4245 case 3:
4246 if (strEQ(d,"use")) return KEY_use;
79072805
LW
4247 break;
4248 case 5:
4249 if (strEQ(d,"undef")) return KEY_undef;
4250 if (strEQ(d,"until")) return KEY_until;
463ee0b2 4251 if (strEQ(d,"untie")) return KEY_untie;
a0d0e21e
LW
4252 if (strEQ(d,"utime")) return -KEY_utime;
4253 if (strEQ(d,"umask")) return -KEY_umask;
79072805
LW
4254 break;
4255 case 6:
4256 if (strEQ(d,"unless")) return KEY_unless;
a0d0e21e
LW
4257 if (strEQ(d,"unpack")) return -KEY_unpack;
4258 if (strEQ(d,"unlink")) return -KEY_unlink;
79072805
LW
4259 break;
4260 case 7:
4261 if (strEQ(d,"unshift")) return KEY_unshift;
a0d0e21e 4262 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
79072805 4263 break;
a687059c
LW
4264 }
4265 break;
79072805 4266 case 'v':
a0d0e21e
LW
4267 if (strEQ(d,"values")) return -KEY_values;
4268 if (strEQ(d,"vec")) return -KEY_vec;
a687059c 4269 break;
79072805
LW
4270 case 'w':
4271 switch (len) {
4272 case 4:
a0d0e21e
LW
4273 if (strEQ(d,"warn")) return -KEY_warn;
4274 if (strEQ(d,"wait")) return -KEY_wait;
79072805
LW
4275 break;
4276 case 5:
4277 if (strEQ(d,"while")) return KEY_while;
a0d0e21e 4278 if (strEQ(d,"write")) return -KEY_write;
79072805
LW
4279 break;
4280 case 7:
a0d0e21e 4281 if (strEQ(d,"waitpid")) return -KEY_waitpid;
79072805
LW
4282 break;
4283 case 9:
a0d0e21e 4284 if (strEQ(d,"wantarray")) return -KEY_wantarray;
79072805 4285 break;
2f3197b3 4286 }
a687059c 4287 break;
79072805 4288 case 'x':
a0d0e21e
LW
4289 if (len == 1) return -KEY_x;
4290 if (strEQ(d,"xor")) return -KEY_xor;
a687059c 4291 break;
79072805
LW
4292 case 'y':
4293 if (len == 1) return KEY_y;
4294 break;
4295 case 'z':
a687059c
LW
4296 break;
4297 }
79072805 4298 return 0;
a687059c
LW
4299}
4300
8990e307 4301static void
2f3197b3 4302checkcomma(s,name,what)
a687059c 4303register char *s;
2f3197b3 4304char *name;
a687059c
LW
4305char *what;
4306{
2f3197b3
LW
4307 char *w;
4308
463ee0b2 4309 if (dowarn && *s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
a0d0e21e
LW
4310 int level = 1;
4311 for (w = s+2; *w && level; w++) {
4312 if (*w == '(')
4313 ++level;
4314 else if (*w == ')')
4315 --level;
4316 }
4317 if (*w)
4318 for (; *w && isSPACE(*w); w++) ;
4319 if (!*w || !strchr(";|})]oa!=", *w)) /* an advisory hack only... */
2f3197b3
LW
4320 warn("%s (...) interpreted as function",name);
4321 }
4322 while (s < bufend && isSPACE(*s))
4323 s++;
a687059c
LW
4324 if (*s == '(')
4325 s++;
de3bb511 4326 while (s < bufend && isSPACE(*s))
a687059c 4327 s++;
79072805 4328 if (isIDFIRST(*s)) {
2f3197b3 4329 w = s++;
de3bb511 4330 while (isALNUM(*s))
a687059c 4331 s++;
de3bb511 4332 while (s < bufend && isSPACE(*s))
a687059c 4333 s++;
e929a76b 4334 if (*s == ',') {
463ee0b2 4335 int kw;
e929a76b 4336 *s = '\0';
4633a7c4 4337 kw = keyword(w, s - w) || perl_get_cv(w, FALSE) != 0;
e929a76b 4338 *s = ',';
463ee0b2 4339 if (kw)
e929a76b 4340 return;
463ee0b2
LW
4341 croak("No comma allowed after %s", what);
4342 }
4343 }
4344}
4345
8990e307 4346static char *
8903cb82 4347scan_word(s, dest, destlen, allow_package, slp)
463ee0b2
LW
4348register char *s;
4349char *dest;
8903cb82 4350STRLEN destlen;
463ee0b2
LW
4351int allow_package;
4352STRLEN *slp;
4353{
4354 register char *d = dest;
8903cb82 4355 register char *e = d + destlen - 3; /* two-character token, ending NUL */
463ee0b2 4356 for (;;) {
8903cb82 4357 if (d >= e)
fc36a67e 4358 croak(ident_too_long);
463ee0b2
LW
4359 if (isALNUM(*s))
4360 *d++ = *s++;
4361 else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
4362 *d++ = ':';
4363 *d++ = ':';
4364 s++;
4365 }
4366 else if (*s == ':' && s[1] == ':' && allow_package && isIDFIRST(s[2])) {
4367 *d++ = *s++;
4368 *d++ = *s++;
4369 }
4370 else {
4371 *d = '\0';
4372 *slp = d - dest;
4373 return s;
e929a76b 4374 }
378cc40b
LW
4375 }
4376}
4377
8990e307 4378static char *
8903cb82 4379scan_ident(s, send, dest, destlen, ck_uni)
378cc40b 4380register char *s;
a687059c 4381register char *send;
378cc40b 4382char *dest;
8903cb82 4383STRLEN destlen;
79072805 4384I32 ck_uni;
378cc40b
LW
4385{
4386 register char *d;
8903cb82 4387 register char *e;
79072805 4388 char *bracket = 0;
748a9306 4389 char funny = *s++;
378cc40b 4390
79072805
LW
4391 if (lex_brackets == 0)
4392 lex_fakebrack = 0;
a0d0e21e
LW
4393 if (isSPACE(*s))
4394 s = skipspace(s);
378cc40b 4395 d = dest;
8903cb82 4396 e = d + destlen - 3; /* two-character token, ending NUL */
de3bb511 4397 if (isDIGIT(*s)) {
8903cb82 4398 while (isDIGIT(*s)) {
4399 if (d >= e)
fc36a67e 4400 croak(ident_too_long);
378cc40b 4401 *d++ = *s++;
8903cb82 4402 }
378cc40b
LW
4403 }
4404 else {
463ee0b2 4405 for (;;) {
8903cb82 4406 if (d >= e)
fc36a67e 4407 croak(ident_too_long);
463ee0b2
LW
4408 if (isALNUM(*s))
4409 *d++ = *s++;
4410 else if (*s == '\'' && isIDFIRST(s[1])) {
4411 *d++ = ':';
4412 *d++ = ':';
4413 s++;
4414 }
a0d0e21e 4415 else if (*s == ':' && s[1] == ':') {
463ee0b2
LW
4416 *d++ = *s++;
4417 *d++ = *s++;
4418 }
4419 else
4420 break;
4421 }
378cc40b
LW
4422 }
4423 *d = '\0';
4424 d = dest;
79072805
LW
4425 if (*d) {
4426 if (lex_state != LEX_NORMAL)
4427 lex_state = LEX_INTERPENDMAYBE;
4428 return s;
378cc40b 4429 }
748a9306 4430 if (*s == '$' && s[1] &&
ff0cee69 4431 (isALNUM(s[1]) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
5cd24f17 4432 {
4433 if (isDIGIT(s[1]) && lex_state == LEX_INTERPNORMAL)
4434 deprecate("\"$$<digit>\" to mean \"${$}<digit>\"");
4435 else
4436 return s;
4437 }
79072805
LW
4438 if (*s == '{') {
4439 bracket = s;
4440 s++;
4441 }
4442 else if (ck_uni)
4443 check_uni();
93a17b20 4444 if (s < send)
79072805
LW
4445 *d = *s++;
4446 d[1] = '\0';
748a9306 4447 if (*d == '^' && *s && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
bbce6d69 4448 *d = toCTRL(*s);
4449 s++;
de3bb511 4450 }
79072805 4451 if (bracket) {
748a9306 4452 if (isSPACE(s[-1])) {
fa83b5b6 4453 while (s < send) {
4454 char ch = *s++;
4455 if (ch != ' ' && ch != '\t') {
4456 *d = ch;
4457 break;
4458 }
4459 }
748a9306 4460 }
ff68c719 4461 if (isIDFIRST(*d)) {
79072805 4462 d++;
748a9306 4463 while (isALNUM(*s) || *s == ':')
79072805
LW
4464 *d++ = *s++;
4465 *d = '\0';
748a9306 4466 while (s < send && (*s == ' ' || *s == '\t')) s++;
ff68c719 4467 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
748a9306
LW
4468 if (dowarn && keyword(dest, d - dest)) {
4469 char *brack = *s == '[' ? "[...]" : "{...}";
4470 warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
4471 funny, dest, brack, funny, dest, brack);
4472 }
4473 lex_fakebrack = lex_brackets+1;
79072805 4474 bracket++;
a0d0e21e 4475 lex_brackstack[lex_brackets++] = XOPERATOR;
79072805
LW
4476 return s;
4477 }
4478 }
4479 if (*s == '}') {
4480 s++;
4481 if (lex_state == LEX_INTERPNORMAL && !lex_brackets)
4482 lex_state = LEX_INTERPEND;
748a9306
LW
4483 if (funny == '#')
4484 funny = '@';
4485 if (dowarn &&
4486 (keyword(dest, d - dest) || perl_get_cv(dest, FALSE)))
4487 warn("Ambiguous use of %c{%s} resolved to %c%s",
4488 funny, dest, funny, dest);
79072805
LW
4489 }
4490 else {
4491 s = bracket; /* let the parser handle it */
93a17b20 4492 *dest = '\0';
79072805
LW
4493 }
4494 }
4495 else if (lex_state == LEX_INTERPNORMAL && !lex_brackets && !intuit_more(s))
4496 lex_state = LEX_INTERPEND;
378cc40b
LW
4497 return s;
4498}
4499
a0d0e21e
LW
4500void pmflag(pmfl,ch)
4501U16* pmfl;
4502int ch;
4503{
bbce6d69 4504 if (ch == 'i')
a0d0e21e 4505 *pmfl |= PMf_FOLD;
a0d0e21e
LW
4506 else if (ch == 'g')
4507 *pmfl |= PMf_GLOBAL;
c90c0ff4 4508 else if (ch == 'c')
4509 *pmfl |= PMf_CONTINUE;
a0d0e21e
LW
4510 else if (ch == 'o')
4511 *pmfl |= PMf_KEEP;
4512 else if (ch == 'm')
4513 *pmfl |= PMf_MULTILINE;
4514 else if (ch == 's')
4515 *pmfl |= PMf_SINGLELINE;
4516 else if (ch == 'x')
4517 *pmfl |= PMf_EXTENDED;
4518}
378cc40b 4519
8990e307 4520static char *
79072805
LW
4521scan_pat(start)
4522char *start;
378cc40b 4523{
79072805
LW
4524 PMOP *pm;
4525 char *s;
378cc40b 4526
79072805
LW
4527 s = scan_str(start);
4528 if (!s) {
4529 if (lex_stuff)
8990e307 4530 SvREFCNT_dec(lex_stuff);
79072805 4531 lex_stuff = Nullsv;
463ee0b2 4532 croak("Search pattern not terminated");
378cc40b 4533 }
bbce6d69 4534
79072805 4535 pm = (PMOP*)newPMOP(OP_MATCH, 0);
a0d0e21e 4536 if (multi_open == '?')
79072805 4537 pm->op_pmflags |= PMf_ONCE;
c90c0ff4 4538 while (*s && strchr("iogcmsx", *s))
a0d0e21e 4539 pmflag(&pm->op_pmflags,*s++);
4633a7c4 4540 pm->op_pmpermflags = pm->op_pmflags;
bbce6d69 4541
79072805
LW
4542 lex_op = (OP*)pm;
4543 yylval.ival = OP_MATCH;
378cc40b
LW
4544 return s;
4545}
4546
8990e307 4547static char *
79072805 4548scan_subst(start)
2f3197b3 4549char *start;
79072805 4550{
a0d0e21e 4551 register char *s;
79072805 4552 register PMOP *pm;
4fdae800 4553 I32 first_start;
79072805
LW
4554 I32 es = 0;
4555
79072805
LW
4556 yylval.ival = OP_NULL;
4557
a0d0e21e 4558 s = scan_str(start);
79072805
LW
4559
4560 if (!s) {
4561 if (lex_stuff)
8990e307 4562 SvREFCNT_dec(lex_stuff);
79072805 4563 lex_stuff = Nullsv;
463ee0b2 4564 croak("Substitution pattern not terminated");
a687059c 4565 }
79072805 4566
a0d0e21e 4567 if (s[-1] == multi_open)
79072805
LW
4568 s--;
4569
4fdae800 4570 first_start = multi_start;
79072805
LW
4571 s = scan_str(s);
4572 if (!s) {
4573 if (lex_stuff)
8990e307 4574 SvREFCNT_dec(lex_stuff);
79072805
LW
4575 lex_stuff = Nullsv;
4576 if (lex_repl)
8990e307 4577 SvREFCNT_dec(lex_repl);
79072805 4578 lex_repl = Nullsv;
463ee0b2 4579 croak("Substitution replacement not terminated");
a687059c 4580 }
4fdae800 4581 multi_start = first_start; /* so whole substitution is taken together */
2f3197b3 4582
79072805 4583 pm = (PMOP*)newPMOP(OP_SUBST, 0);
c90c0ff4 4584 while (*s && strchr("iogcmsex", *s)) {
a687059c
LW
4585 if (*s == 'e') {
4586 s++;
2f3197b3 4587 es++;
a687059c 4588 }
a0d0e21e
LW
4589 else
4590 pmflag(&pm->op_pmflags,*s++);
378cc40b 4591 }
79072805
LW
4592
4593 if (es) {
4594 SV *repl;
4595 pm->op_pmflags |= PMf_EVAL;
463ee0b2
LW
4596 repl = newSVpv("",0);
4597 while (es-- > 0)
a0d0e21e 4598 sv_catpv(repl, es ? "eval " : "do ");
79072805
LW
4599 sv_catpvn(repl, "{ ", 2);
4600 sv_catsv(repl, lex_repl);
4601 sv_catpvn(repl, " };", 2);
4602 SvCOMPILED_on(repl);
8990e307 4603 SvREFCNT_dec(lex_repl);
79072805 4604 lex_repl = repl;
378cc40b 4605 }
79072805 4606
4633a7c4 4607 pm->op_pmpermflags = pm->op_pmflags;
79072805
LW
4608 lex_op = (OP*)pm;
4609 yylval.ival = OP_SUBST;
378cc40b
LW
4610 return s;
4611}
4612
1462b684 4613void
79072805
LW
4614hoistmust(pm)
4615register PMOP *pm;
378cc40b 4616{
11343788 4617 dTHR;
79072805
LW
4618 if (!pm->op_pmshort && pm->op_pmregexp->regstart &&
4619 (!pm->op_pmregexp->regmust || pm->op_pmregexp->reganch & ROPT_ANCH)
d48672a2 4620 ) {
79072805
LW
4621 if (!(pm->op_pmregexp->reganch & ROPT_ANCH))
4622 pm->op_pmflags |= PMf_SCANFIRST;
8990e307 4623 pm->op_pmshort = SvREFCNT_inc(pm->op_pmregexp->regstart);
748a9306 4624 pm->op_pmslen = SvCUR(pm->op_pmshort);
d48672a2 4625 }
79072805
LW
4626 else if (pm->op_pmregexp->regmust) {/* is there a better short-circuit? */
4627 if (pm->op_pmshort &&
4628 sv_eq(pm->op_pmshort,pm->op_pmregexp->regmust))
a687059c 4629 {
79072805 4630 if (pm->op_pmflags & PMf_SCANFIRST) {
8990e307 4631 SvREFCNT_dec(pm->op_pmshort);
79072805 4632 pm->op_pmshort = Nullsv;
378cc40b
LW
4633 }
4634 else {
8990e307 4635 SvREFCNT_dec(pm->op_pmregexp->regmust);
79072805 4636 pm->op_pmregexp->regmust = Nullsv;
378cc40b
LW
4637 return;
4638 }
4639 }
774d564b 4640 /* promote the better string */
5cd24f17 4641 if ((!pm->op_pmshort &&
4642 !(pm->op_pmregexp->reganch & ROPT_ANCH_GPOS)) ||
774d564b 4643 ((pm->op_pmflags & PMf_SCANFIRST) &&
4644 (SvCUR(pm->op_pmshort) < SvCUR(pm->op_pmregexp->regmust)))) {
8990e307 4645 SvREFCNT_dec(pm->op_pmshort); /* ok if null */
79072805 4646 pm->op_pmshort = pm->op_pmregexp->regmust;
748a9306 4647 pm->op_pmslen = SvCUR(pm->op_pmshort);
79072805
LW
4648 pm->op_pmregexp->regmust = Nullsv;
4649 pm->op_pmflags |= PMf_SCANFIRST;
378cc40b
LW
4650 }
4651 }
4652}
4653
8990e307 4654static char *
79072805 4655scan_trans(start)
2f3197b3 4656char *start;
378cc40b 4657{
a0d0e21e 4658 register char* s;
11343788 4659 OP *o;
79072805
LW
4660 short *tbl;
4661 I32 squash;
4662 I32 delete;
4663 I32 complement;
4664
4665 yylval.ival = OP_NULL;
4666
a0d0e21e 4667 s = scan_str(start);
79072805
LW
4668 if (!s) {
4669 if (lex_stuff)
8990e307 4670 SvREFCNT_dec(lex_stuff);
79072805 4671 lex_stuff = Nullsv;
463ee0b2 4672 croak("Translation pattern not terminated");
a687059c 4673 }
a0d0e21e 4674 if (s[-1] == multi_open)
2f3197b3
LW
4675 s--;
4676
93a17b20 4677 s = scan_str(s);
79072805
LW
4678 if (!s) {
4679 if (lex_stuff)
8990e307 4680 SvREFCNT_dec(lex_stuff);
79072805
LW
4681 lex_stuff = Nullsv;
4682 if (lex_repl)
8990e307 4683 SvREFCNT_dec(lex_repl);
79072805 4684 lex_repl = Nullsv;
463ee0b2 4685 croak("Translation replacement not terminated");
a687059c 4686 }
79072805
LW
4687
4688 New(803,tbl,256,short);
11343788 4689 o = newPVOP(OP_TRANS, 0, (char*)tbl);
2f3197b3 4690
395c3793
LW
4691 complement = delete = squash = 0;
4692 while (*s == 'c' || *s == 'd' || *s == 's') {
4693 if (*s == 'c')
79072805 4694 complement = OPpTRANS_COMPLEMENT;
395c3793 4695 else if (*s == 'd')
79072805 4696 delete = OPpTRANS_DELETE;
395c3793 4697 else
79072805 4698 squash = OPpTRANS_SQUASH;
395c3793
LW
4699 s++;
4700 }
11343788 4701 o->op_private = delete|squash|complement;
79072805 4702
11343788 4703 lex_op = o;
79072805
LW
4704 yylval.ival = OP_TRANS;
4705 return s;
4706}
4707
8990e307 4708static char *
79072805
LW
4709scan_heredoc(s)
4710register char *s;
4711{
11343788 4712 dTHR;
79072805
LW
4713 SV *herewas;
4714 I32 op_type = OP_SCALAR;
4715 I32 len;
4716 SV *tmpstr;
4717 char term;
4718 register char *d;
fc36a67e 4719 register char *e;
4633a7c4 4720 char *peek;
fd2d0953 4721 int outer = (rsfp && !lex_inwhat);
79072805
LW
4722
4723 s += 2;
4724 d = tokenbuf;
fc36a67e 4725 e = tokenbuf + sizeof tokenbuf - 1;
fd2d0953 4726 if (!outer)
79072805 4727 *d++ = '\n';
4633a7c4
LW
4728 for (peek = s; *peek == ' ' || *peek == '\t'; peek++) ;
4729 if (*peek && strchr("`'\"",*peek)) {
4730 s = peek;
79072805 4731 term = *s++;
fc36a67e 4732 s = delimcpy(d, e, s, bufend, term, &len);
4733 d += len;
79072805
LW
4734 if (s < bufend)
4735 s++;
79072805
LW
4736 }
4737 else {
4738 if (*s == '\\')
4739 s++, term = '\'';
4740 else
4741 term = '"';
4633a7c4
LW
4742 if (!isALNUM(*s))
4743 deprecate("bare << to mean <<\"\"");
fc36a67e 4744 for (; isALNUM(*s); s++) {
4745 if (d < e)
4746 *d++ = *s;
4747 }
4748 }
4749 if (d >= tokenbuf + sizeof tokenbuf - 1)
4750 croak("Delimiter for here document is too long");
79072805
LW
4751 *d++ = '\n';
4752 *d = '\0';
4753 len = d - tokenbuf;
4754 d = "\n";
fd2d0953 4755 if (outer || !(d=ninstr(s,bufend,d,d+1)))
79072805
LW
4756 herewas = newSVpv(s,bufend-s);
4757 else
4758 s--, herewas = newSVpv(s,d-s);
4759 s += SvCUR(herewas);
748a9306
LW
4760
4761 tmpstr = NEWSV(87,80);
4762 sv_upgrade(tmpstr, SVt_PVIV);
4763 if (term == '\'') {
79072805 4764 op_type = OP_CONST;
748a9306
LW
4765 SvIVX(tmpstr) = -1;
4766 }
4767 else if (term == '`') {
79072805 4768 op_type = OP_BACKTICK;
748a9306
LW
4769 SvIVX(tmpstr) = '\\';
4770 }
79072805
LW
4771
4772 CLINE;
4773 multi_start = curcop->cop_line;
4774 multi_open = multi_close = '<';
79072805 4775 term = *tokenbuf;
fd2d0953 4776 if (!outer) {
79072805
LW
4777 d = s;
4778 while (s < bufend &&
36477c24 4779 (*s != term || memNE(s,tokenbuf,len)) ) {
79072805
LW
4780 if (*s++ == '\n')
4781 curcop->cop_line++;
4782 }
4783 if (s >= bufend) {
4784 curcop->cop_line = multi_start;
8990e307 4785 missingterm(tokenbuf);
79072805
LW
4786 }
4787 sv_setpvn(tmpstr,d+1,s-d);
4788 s += len - 1;
4789 sv_catpvn(herewas,s,bufend-s);
4790 sv_setsv(linestr,herewas);
fd049845 4791 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
463ee0b2 4792 bufend = SvPVX(linestr) + SvCUR(linestr);
79072805
LW
4793 }
4794 else
4795 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
4796 while (s >= bufend) { /* multiple line string? */
fd2d0953 4797 if (!outer ||
fd049845 4798 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
79072805 4799 curcop->cop_line = multi_start;
8990e307 4800 missingterm(tokenbuf);
79072805
LW
4801 }
4802 curcop->cop_line++;
8990e307 4803 if (perldb && curstash != debstash) {
79072805
LW
4804 SV *sv = NEWSV(88,0);
4805
93a17b20 4806 sv_upgrade(sv, SVt_PVMG);
79072805
LW
4807 sv_setsv(sv,linestr);
4808 av_store(GvAV(curcop->cop_filegv),
4809 (I32)curcop->cop_line,sv);
4810 }
463ee0b2 4811 bufend = SvPVX(linestr) + SvCUR(linestr);
36477c24 4812 if (*s == term && memEQ(s,tokenbuf,len)) {
79072805
LW
4813 s = bufend - 1;
4814 *s = ' ';
4815 sv_catsv(linestr,herewas);
463ee0b2 4816 bufend = SvPVX(linestr) + SvCUR(linestr);
79072805
LW
4817 }
4818 else {
4819 s = bufend;
4820 sv_catsv(tmpstr,linestr);
395c3793
LW
4821 }
4822 }
79072805
LW
4823 multi_end = curcop->cop_line;
4824 s++;
4825 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
4826 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
463ee0b2 4827 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
79072805 4828 }
8990e307 4829 SvREFCNT_dec(herewas);
79072805
LW
4830 lex_stuff = tmpstr;
4831 yylval.ival = op_type;
4832 return s;
4833}
4834
8990e307 4835static char *
79072805
LW
4836scan_inputsymbol(start)
4837char *start;
4838{
4839 register char *s = start;
4840 register char *d;
fc36a67e 4841 register char *e;
79072805
LW
4842 I32 len;
4843
4844 d = tokenbuf;
fc36a67e 4845 e = tokenbuf + sizeof tokenbuf;
4846 s = delimcpy(d, e, s + 1, bufend, '>', &len);
4847 if (len >= sizeof tokenbuf)
4848 croak("Excessively long <> operator");
4849 if (s >= bufend)
463ee0b2 4850 croak("Unterminated <> operator");
fc36a67e 4851 s++;
4633a7c4 4852 if (*d == '$' && d[1]) d++;
a0d0e21e 4853 while (*d && (isALNUM(*d) || *d == '\'' || *d == ':'))
79072805
LW
4854 d++;
4855 if (d - tokenbuf != len) {
4856 yylval.ival = OP_GLOB;
4857 set_csh();
4858 s = scan_str(start);
4859 if (!s)
463ee0b2 4860 croak("Glob not terminated");
79072805
LW
4861 return s;
4862 }
395c3793 4863 else {
79072805
LW
4864 d = tokenbuf;
4865 if (!len)
4866 (void)strcpy(d,"ARGV");
4867 if (*d == '$') {
a0d0e21e 4868 I32 tmp;
11343788
MB
4869 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
4870 OP *o = newOP(OP_PADSV, 0);
4871 o->op_targ = tmp;
4872 lex_op = (OP*)newUNOP(OP_READLINE, 0, newUNOP(OP_RV2GV, 0, o));
a0d0e21e
LW
4873 }
4874 else {
4875 GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
4876 lex_op = (OP*)newUNOP(OP_READLINE, 0,
4877 newUNOP(OP_RV2GV, 0,
4878 newUNOP(OP_RV2SV, 0,
4879 newGVOP(OP_GV, 0, gv))));
4880 }
79072805
LW
4881 yylval.ival = OP_NULL;
4882 }
4883 else {
85e6fe83 4884 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
79072805
LW
4885 lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
4886 yylval.ival = OP_NULL;
4887 }
4888 }
4889 return s;
4890}
4891
8990e307 4892static char *
79072805
LW
4893scan_str(start)
4894char *start;
4895{
11343788 4896 dTHR;
93a17b20 4897 SV *sv;
79072805
LW
4898 char *tmps;
4899 register char *s = start;
a0d0e21e 4900 register char term;
93a17b20
LW
4901 register char *to;
4902 I32 brackets = 1;
79072805 4903
a0d0e21e
LW
4904 if (isSPACE(*s))
4905 s = skipspace(s);
79072805 4906 CLINE;
a0d0e21e 4907 term = *s;
79072805
LW
4908 multi_start = curcop->cop_line;
4909 multi_open = term;
93a17b20 4910 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
79072805
LW
4911 term = tmps[5];
4912 multi_close = term;
4913
93a17b20 4914 sv = NEWSV(87,80);
ed6116ce
LW
4915 sv_upgrade(sv, SVt_PVIV);
4916 SvIVX(sv) = term;
a0d0e21e 4917 (void)SvPOK_only(sv); /* validate pointer */
93a17b20
LW
4918 s++;
4919 for (;;) {
4920 SvGROW(sv, SvCUR(sv) + (bufend - s) + 1);
463ee0b2 4921 to = SvPVX(sv)+SvCUR(sv);
93a17b20
LW
4922 if (multi_open == multi_close) {
4923 for (; s < bufend; s++,to++) {
463ee0b2
LW
4924 if (*s == '\n' && !rsfp)
4925 curcop->cop_line++;
a0d0e21e
LW
4926 if (*s == '\\' && s+1 < bufend && term != '\\') {
4927 if (s[1] == term)
4928 s++;
4929 else
4930 *to++ = *s++;
4931 }
93a17b20
LW
4932 else if (*s == term)
4933 break;
4934 *to = *s;
4935 }
4936 }
4937 else {
4938 for (; s < bufend; s++,to++) {
463ee0b2
LW
4939 if (*s == '\n' && !rsfp)
4940 curcop->cop_line++;
a0d0e21e
LW
4941 if (*s == '\\' && s+1 < bufend && term != '\\') {
4942 if (s[1] == term)
4943 s++;
4944 else
4945 *to++ = *s++;
4946 }
93a17b20
LW
4947 else if (*s == term && --brackets <= 0)
4948 break;
4949 else if (*s == multi_open)
4950 brackets++;
4951 *to = *s;
4952 }
4953 }
4954 *to = '\0';
463ee0b2 4955 SvCUR_set(sv, to - SvPVX(sv));
93a17b20
LW
4956
4957 if (s < bufend) break; /* string ends on this line? */
79072805 4958
79072805 4959 if (!rsfp ||
fd049845 4960 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
c07a80fd 4961 sv_free(sv);
79072805
LW
4962 curcop->cop_line = multi_start;
4963 return Nullch;
4964 }
4965 curcop->cop_line++;
8990e307 4966 if (perldb && curstash != debstash) {
79072805
LW
4967 SV *sv = NEWSV(88,0);
4968
93a17b20 4969 sv_upgrade(sv, SVt_PVMG);
79072805
LW
4970 sv_setsv(sv,linestr);
4971 av_store(GvAV(curcop->cop_filegv),
4972 (I32)curcop->cop_line, sv);
395c3793 4973 }
463ee0b2 4974 bufend = SvPVX(linestr) + SvCUR(linestr);
378cc40b 4975 }
79072805
LW
4976 multi_end = curcop->cop_line;
4977 s++;
93a17b20
LW
4978 if (SvCUR(sv) + 5 < SvLEN(sv)) {
4979 SvLEN_set(sv, SvCUR(sv) + 1);
463ee0b2 4980 Renew(SvPVX(sv), SvLEN(sv), char);
79072805
LW
4981 }
4982 if (lex_stuff)
93a17b20 4983 lex_repl = sv;
79072805 4984 else
93a17b20 4985 lex_stuff = sv;
378cc40b
LW
4986 return s;
4987}
4988
4989char *
79072805 4990scan_num(start)
2f3197b3 4991char *start;
378cc40b 4992{
2f3197b3 4993 register char *s = start;
378cc40b 4994 register char *d;
fc36a67e 4995 register char *e;
1e422769 4996 I32 tryiv;
79072805
LW
4997 double value;
4998 SV *sv;
4999 I32 floatit;
93a17b20 5000 char *lastub = 0;
fc36a67e 5001 static char number_too_long[] = "Number too long";
378cc40b
LW
5002
5003 switch (*s) {
79072805 5004 default:
463ee0b2 5005 croak("panic: scan_num");
378cc40b
LW
5006 case '0':
5007 {
55497cff 5008 UV u;
79072805 5009 I32 shift;
55497cff 5010 bool overflowed = FALSE;
378cc40b 5011
378cc40b
LW
5012 if (s[1] == 'x') {
5013 shift = 4;
5014 s += 2;
5015 }
5016 else if (s[1] == '.')
5017 goto decimal;
5018 else
5019 shift = 3;
55497cff 5020 u = 0;
378cc40b 5021 for (;;) {
55497cff 5022 UV n, b;
5023
378cc40b
LW
5024 switch (*s) {
5025 default:
5026 goto out;
de3bb511
LW
5027 case '_':
5028 s++;
5029 break;
378cc40b
LW
5030 case '8': case '9':
5031 if (shift != 4)
a687059c 5032 yyerror("Illegal octal digit");
378cc40b
LW
5033 /* FALL THROUGH */
5034 case '0': case '1': case '2': case '3': case '4':
5035 case '5': case '6': case '7':
55497cff 5036 b = *s++ & 15;
5037 goto digit;
378cc40b
LW
5038 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
5039 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
5040 if (shift != 4)
5041 goto out;
55497cff 5042 b = (*s++ & 7) + 9;
5043 digit:
5044 n = u << shift;
5045 if (!overflowed && (n >> shift) != u) {
5046 warn("Integer overflow in %s number",
5047 (shift == 4) ? "hex" : "octal");
5048 overflowed = TRUE;
5049 }
5050 u = n | b;
378cc40b
LW
5051 break;
5052 }
5053 }
5054 out:
79072805 5055 sv = NEWSV(92,0);
55497cff 5056 sv_setuv(sv, u);
378cc40b
LW
5057 }
5058 break;
5059 case '1': case '2': case '3': case '4': case '5':
5060 case '6': case '7': case '8': case '9': case '.':
5061 decimal:
378cc40b 5062 d = tokenbuf;
fc36a67e 5063 e = tokenbuf + sizeof tokenbuf - 6; /* room for various punctuation */
79072805 5064 floatit = FALSE;
de3bb511 5065 while (isDIGIT(*s) || *s == '_') {
93a17b20
LW
5066 if (*s == '_') {
5067 if (dowarn && lastub && s - lastub != 3)
8990e307 5068 warn("Misplaced _ in number");
93a17b20
LW
5069 lastub = ++s;
5070 }
fc36a67e 5071 else {
5072 if (d >= e)
5073 croak(number_too_long);
378cc40b 5074 *d++ = *s++;
fc36a67e 5075 }
378cc40b 5076 }
93a17b20 5077 if (dowarn && lastub && s - lastub != 3)
8990e307 5078 warn("Misplaced _ in number");
2f3197b3 5079 if (*s == '.' && s[1] != '.') {
79072805 5080 floatit = TRUE;
378cc40b 5081 *d++ = *s++;
fc36a67e 5082 for (; isDIGIT(*s) || *s == '_'; s++) {
5083 if (d >= e)
5084 croak(number_too_long);
5085 if (*s != '_')
5086 *d++ = *s;
378cc40b
LW
5087 }
5088 }
93a17b20 5089 if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
79072805
LW
5090 floatit = TRUE;
5091 s++;
5092 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
378cc40b
LW
5093 if (*s == '+' || *s == '-')
5094 *d++ = *s++;
fc36a67e 5095 while (isDIGIT(*s)) {
5096 if (d >= e)
5097 croak(number_too_long);
378cc40b 5098 *d++ = *s++;
fc36a67e 5099 }
378cc40b
LW
5100 }
5101 *d = '\0';
79072805 5102 sv = NEWSV(92,0);
36477c24 5103 SET_NUMERIC_STANDARD();
79072805 5104 value = atof(tokenbuf);
1e422769 5105 tryiv = I_V(value);
5106 if (!floatit && (double)tryiv == value)
5107 sv_setiv(sv, tryiv);
2f3197b3 5108 else
1e422769 5109 sv_setnv(sv, value);
378cc40b 5110 break;
79072805 5111 }
a687059c 5112
79072805 5113 yylval.opval = newSVOP(OP_CONST, 0, sv);
a687059c 5114
378cc40b
LW
5115 return s;
5116}
5117
8990e307 5118static char *
79072805
LW
5119scan_formline(s)
5120register char *s;
378cc40b 5121{
11343788 5122 dTHR;
79072805 5123 register char *eol;
378cc40b 5124 register char *t;
a0d0e21e 5125 SV *stuff = newSVpv("",0);
79072805 5126 bool needargs = FALSE;
378cc40b 5127
79072805 5128 while (!needargs) {
85e6fe83 5129 if (*s == '.' || *s == '}') {
79072805
LW
5130 /*SUPPRESS 530*/
5131 for (t = s+1; *t == ' ' || *t == '\t'; t++) ;
5132 if (*t == '\n')
5133 break;
5134 }
0f85fab0 5135 if (in_eval && !rsfp) {
93a17b20 5136 eol = strchr(s,'\n');
0f85fab0
LW
5137 if (!eol++)
5138 eol = bufend;
5139 }
5140 else
463ee0b2 5141 eol = bufend = SvPVX(linestr) + SvCUR(linestr);
79072805 5142 if (*s != '#') {
a0d0e21e
LW
5143 for (t = s; t < eol; t++) {
5144 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
5145 needargs = FALSE;
5146 goto enough; /* ~~ must be first line in formline */
378cc40b 5147 }
a0d0e21e
LW
5148 if (*t == '@' || *t == '^')
5149 needargs = TRUE;
378cc40b 5150 }
a0d0e21e 5151 sv_catpvn(stuff, s, eol-s);
79072805
LW
5152 }
5153 s = eol;
5154 if (rsfp) {
fd049845 5155 s = filter_gets(linestr, rsfp, 0);
5156 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
a0d0e21e 5157 bufend = bufptr + SvCUR(linestr);
79072805
LW
5158 if (!s) {
5159 s = bufptr;
5160 yyerror("Format not terminated");
378cc40b
LW
5161 break;
5162 }
378cc40b 5163 }
463ee0b2 5164 incline(s);
79072805 5165 }
a0d0e21e
LW
5166 enough:
5167 if (SvCUR(stuff)) {
463ee0b2 5168 expect = XTERM;
79072805 5169 if (needargs) {
a0d0e21e 5170 lex_state = LEX_NORMAL;
79072805
LW
5171 nextval[nexttoke].ival = 0;
5172 force_next(',');
5173 }
a0d0e21e
LW
5174 else
5175 lex_state = LEX_FORMLINE;
79072805
LW
5176 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
5177 force_next(THING);
5178 nextval[nexttoke].ival = OP_FORMLINE;
5179 force_next(LSTOP);
378cc40b 5180 }
79072805 5181 else {
8990e307 5182 SvREFCNT_dec(stuff);
85e6fe83 5183 lex_formbrack = 0;
79072805
LW
5184 bufptr = s;
5185 }
5186 return s;
378cc40b 5187}
a687059c 5188
2f3197b3 5189static void
a687059c
LW
5190set_csh()
5191{
ae986130
LW
5192#ifdef CSH
5193 if (!cshlen)
5194 cshlen = strlen(cshname);
5195#endif
a687059c 5196}
463ee0b2 5197
ba6d6ac9 5198I32
774d564b 5199start_subparse(is_format, flags)
5200I32 is_format;
fa83b5b6 5201U32 flags;
8990e307 5202{
11343788 5203 dTHR;
ba6d6ac9 5204 I32 oldsavestack_ix = savestack_ix;
748a9306
LW
5205 CV* outsidecv = compcv;
5206 AV* comppadlist;
8990e307 5207
e9a444f0
LW
5208 if (compcv) {
5209 assert(SvTYPE(compcv) == SVt_PVCV);
5210 }
8990e307
LW
5211 save_I32(&subline);
5212 save_item(subname);
55497cff 5213 SAVEI32(padix);
8990e307
LW
5214 SAVESPTR(curpad);
5215 SAVESPTR(comppad);
5216 SAVESPTR(comppad_name);
748a9306 5217 SAVESPTR(compcv);
55497cff 5218 SAVEI32(comppad_name_fill);
5219 SAVEI32(min_intro_pending);
5220 SAVEI32(max_intro_pending);
5221 SAVEI32(pad_reset_pending);
748a9306
LW
5222
5223 compcv = (CV*)NEWSV(1104,0);
774d564b 5224 sv_upgrade((SV *)compcv, is_format ? SVt_PVFM : SVt_PVCV);
fa83b5b6 5225 CvFLAGS(compcv) |= flags;
748a9306 5226
8990e307 5227 comppad = newAV();
6d4ff0d2
MB
5228 av_push(comppad, Nullsv);
5229 curpad = AvARRAY(comppad);
8990e307
LW
5230 comppad_name = newAV();
5231 comppad_name_fill = 0;
5232 min_intro_pending = 0;
8990e307 5233 padix = 0;
8990e307 5234 subline = curcop->cop_line;
6d4ff0d2
MB
5235#ifdef USE_THREADS
5236 av_store(comppad_name, 0, newSVpv("@_", 2));
5237 curpad[0] = (SV*)newAV();
5238 SvPADMY_on(curpad[0]); /* XXX Needed? */
5239 CvOWNER(compcv) = 0;
5240 New(666, CvMUTEXP(compcv), 1, pthread_mutex_t);
5241 MUTEX_INIT(CvMUTEXP(compcv));
5242 New(666, CvCONDP(compcv), 1, pthread_cond_t);
5243 COND_INIT(CvCONDP(compcv));
5244#endif /* USE_THREADS */
748a9306
LW
5245
5246 comppadlist = newAV();
5247 AvREAL_off(comppadlist);
8e07c86e
AD
5248 av_store(comppadlist, 0, (SV*)comppad_name);
5249 av_store(comppadlist, 1, (SV*)comppad);
748a9306
LW
5250
5251 CvPADLIST(compcv) = comppadlist;
e9a444f0 5252 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc((SV*)outsidecv);
11343788
MB
5253#ifdef USE_THREADS
5254 CvOWNER(compcv) = 0;
5255 New(666, CvMUTEXP(compcv), 1, pthread_mutex_t);
5256 MUTEX_INIT(CvMUTEXP(compcv));
5257 New(666, CvCONDP(compcv), 1, pthread_cond_t);
5258 COND_INIT(CvCONDP(compcv));
5259#endif /* USE_THREADS */
748a9306 5260
8990e307
LW
5261 return oldsavestack_ix;
5262}
5263
5264int
5265yywarn(s)
5266char *s;
5267{
11343788 5268 dTHR;
8990e307 5269 --error_count;
748a9306
LW
5270 in_eval |= 2;
5271 yyerror(s);
5272 in_eval &= ~2;
5273 return 0;
8990e307
LW
5274}
5275
5276int
463ee0b2
LW
5277yyerror(s)
5278char *s;
5279{
11343788 5280 dTHR;
68dc0745 5281 char *where = NULL;
5282 char *context = NULL;
5283 int contlen = -1;
46fc3d4c 5284 SV *msg;
463ee0b2 5285
54310121 5286 if (!yychar || (yychar == ';' && !rsfp))
5287 where = "at EOF";
5288 else if (bufptr > oldoldbufptr && bufptr - oldoldbufptr < 200 &&
463ee0b2
LW
5289 oldoldbufptr != oldbufptr && oldbufptr != bufptr) {
5290 while (isSPACE(*oldoldbufptr))
5291 oldoldbufptr++;
68dc0745 5292 context = oldoldbufptr;
5293 contlen = bufptr - oldoldbufptr;
463ee0b2
LW
5294 }
5295 else if (bufptr > oldbufptr && bufptr - oldbufptr < 200 &&
5296 oldbufptr != bufptr) {
5297 while (isSPACE(*oldbufptr))
5298 oldbufptr++;
68dc0745 5299 context = oldbufptr;
5300 contlen = bufptr - oldbufptr;
463ee0b2
LW
5301 }
5302 else if (yychar > 255)
68dc0745 5303 where = "next token ???";
463ee0b2
LW
5304 else if ((yychar & 127) == 127) {
5305 if (lex_state == LEX_NORMAL ||
5306 (lex_state == LEX_KNOWNEXT && lex_defer == LEX_NORMAL))
68dc0745 5307 where = "at end of line";
4633a7c4 5308 else if (lex_inpat)
68dc0745 5309 where = "within pattern";
463ee0b2 5310 else
68dc0745 5311 where = "within string";
463ee0b2 5312 }
46fc3d4c 5313 else {
5314 SV *where_sv = sv_2mortal(newSVpv("next char ", 0));
5315 if (yychar < 32)
5316 sv_catpvf(where_sv, "^%c", toCTRL(yychar));
5317 else if (isPRINT_LC(yychar))
5318 sv_catpvf(where_sv, "%c", yychar);
463ee0b2 5319 else
46fc3d4c 5320 sv_catpvf(where_sv, "\\%03o", yychar & 255);
5321 where = SvPVX(where_sv);
463ee0b2 5322 }
46fc3d4c 5323 msg = sv_2mortal(newSVpv(s, 0));
fc36a67e 5324 sv_catpvf(msg, " at %_ line %ld, ",
46fc3d4c 5325 GvSV(curcop->cop_filegv), (long)curcop->cop_line);
68dc0745 5326 if (context)
46fc3d4c 5327 sv_catpvf(msg, "near \"%.*s\"\n", contlen, context);
463ee0b2 5328 else
46fc3d4c 5329 sv_catpvf(msg, "%s\n", where);
4fdae800 5330 if (multi_start < multi_end && (U32)(curcop->cop_line - multi_end) <= 1) {
46fc3d4c 5331 sv_catpvf(msg,
4fdae800 5332 " (Might be a runaway multi-line %c%c string starting on line %ld)\n",
ff0cee69 5333 (int)multi_open,(int)multi_close,(long)multi_start);
a0d0e21e
LW
5334 multi_end = 0;
5335 }
748a9306 5336 if (in_eval & 2)
fc36a67e 5337 warn("%_", msg);
748a9306 5338 else if (in_eval)
46fc3d4c 5339 sv_catsv(GvSV(errgv), msg);
463ee0b2 5340 else
46fc3d4c 5341 PerlIO_write(PerlIO_stderr(), SvPVX(msg), SvCUR(msg));
463ee0b2 5342 if (++error_count >= 10)
fc36a67e 5343 croak("%_ has too many errors.\n", GvSV(curcop->cop_filegv));
4633a7c4 5344 in_my = 0;
c750a3ec 5345 in_my_stash = Nullhv;
463ee0b2
LW
5346 return 0;
5347}