1 /* $RCSfile: toke.c,v $$Revision: 4.1 $$Date: 92/08/07 18:28:39 $
3 * Copyright (c) 1991, Larry Wall
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.
9 * Revision 4.1 92/08/07 18:28:39 lwall
11 * Revision 4.0.1.7 92/06/11 21:16:30 lwall
12 * patch34: expect incorrectly set to indicate start of program or block
14 * Revision 4.0.1.6 92/06/08 16:03:49 lwall
15 * patch20: an EXPR may now start with a bareword
16 * patch20: print $fh EXPR can now expect term rather than operator in EXPR
17 * patch20: added ... as variant on ..
18 * patch20: new warning on spurious backslash
19 * patch20: new warning on missing $ for foreach variable
20 * patch20: "foo"x1024 now legal without space after x
21 * patch20: new warning on print accidentally used as function
22 * patch20: tr/stuff// wasn't working right
23 * patch20: 2. now eats the dot
24 * patch20: <@ARGV> now notices @ARGV
25 * patch20: tr/// now lets you say \-
27 * Revision 4.0.1.5 91/11/11 16:45:51 lwall
28 * patch19: default arg for shift was wrong after first subroutine definition
30 * Revision 4.0.1.4 91/11/05 19:02:48 lwall
31 * patch11: \x and \c were subject to double interpretation in regexps
32 * patch11: prepared for ctype implementations that don't define isascii()
33 * patch11: nested list operators could miscount parens
34 * patch11: once-thru blocks didn't display right in the debugger
35 * patch11: sort eval "whatever" didn't work
36 * patch11: underscore is now allowed within literal octal and hex numbers
38 * Revision 4.0.1.3 91/06/10 01:32:26 lwall
39 * patch10: m'$foo' now treats string as single quoted
40 * patch10: certain pattern optimizations were botched
42 * Revision 4.0.1.2 91/06/07 12:05:56 lwall
43 * patch4: new copyright notice
44 * patch4: debugger lost track of lines in eval
45 * patch4: //o and s///o now optimize themselves fully at runtime
46 * patch4: added global modifier for pattern matches
48 * Revision 4.0.1.1 91/04/12 09:18:18 lwall
49 * patch1: perl -de "print" wouldn't stop at the first statement
51 * Revision 4.0 91/03/20 01:42:14 lwall
60 static void set_csh();
62 /* The following are arranged oddly so that the guard on the switch statement
63 * can get by with a single comparison (if the compiler is smart enough).
67 #define LEX_INTERPNORMAL 7
68 #define LEX_INTERPCASEMOD 6
69 #define LEX_INTERPSTART 5
70 #define LEX_INTERPEND 4
71 #define LEX_INTERPENDMAYBE 3
72 #define LEX_INTERPCONCAT 2
73 #define LEX_INTERPCONST 1
74 #define LEX_KNOWNEXT 0
76 static U32 lex_state = LEX_NORMAL; /* next token is determined */
77 static U32 lex_defer; /* state after determined token */
78 static expectation lex_expect; /* expect after determined token */
79 static I32 lex_brackets; /* bracket count */
80 static I32 lex_fakebrack; /* outer bracket is mere delimiter */
81 static I32 lex_casemods; /* casemod count */
82 static I32 lex_dojoin; /* doing an array interpolation */
83 static I32 lex_starts; /* how many interps done on level */
84 static SV * lex_stuff; /* runtime pattern from m// or s/// */
85 static SV * lex_repl; /* runtime replacement from s/// */
86 static OP * lex_op; /* extra info to pass back on op */
87 static I32 lex_inpat; /* in pattern $) and $| are special */
88 static I32 lex_inwhat; /* what kind of quoting are we in */
89 static char * lex_brackstack; /* what kind of brackets to pop */
91 /* What we know when we're in LEX_KNOWNEXT state. */
92 static YYSTYPE nextval[5]; /* value of next token, if any */
93 static I32 nexttype[5]; /* type of next token */
94 static I32 nexttoke = 0;
100 #include <sys/file.h>
107 #include "keywords.h"
114 #define CLINE (copline = (curcop->cop_line < copline ? curcop->cop_line : copline))
117 #define PERL_META(c) ((c) | 128)
119 #define META(c) ((c) | 128)
122 #define TOKEN(retval) return (bufptr = s,(int)retval)
123 #define OPERATOR(retval) return (expect = XTERM,bufptr = s,(int)retval)
124 #define PREBLOCK(retval) return (expect = XBLOCK,bufptr = s,(int)retval)
125 #define PREREF(retval) return (expect = XREF,bufptr = s,(int)retval)
126 #define TERM(retval) return (CLINE, expect = XOPERATOR,bufptr = s,(int)retval)
127 #define LOOPX(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LOOPEX)
128 #define FTST(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)UNIOP)
129 #define FUN0(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC0)
130 #define FUN1(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC1)
131 #define BOop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)BITOROP)
132 #define BAop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)BITANDOP)
133 #define SHop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)SHIFTOP)
134 #define PWop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)POWOP)
135 #define PMop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)MATCHOP)
136 #define Aop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)ADDOP)
137 #define Mop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)MULOP)
138 #define Eop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)EQOP)
139 #define Rop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)RELOP)
141 /* This bit of chicanery makes a unary function followed by
142 * a parenthesis into a function with one argument, highest precedence.
144 #define UNI(f) return(yylval.ival = f, \
147 last_uni = oldbufptr, \
148 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
150 #define UNIBRACK(f) return(yylval.ival = f, \
152 last_uni = oldbufptr, \
153 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
155 /* This does similarly for list operators */
156 #define LOP(f) return(yylval.ival = f, \
160 last_lop = oldbufptr, \
162 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC : (int)LSTOP) )
164 /* grandfather return to old style */
165 #define OLDLOP(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LSTOP)
173 char *oldbufptr = bufptr;
175 sprintf(tmpbuf, "%s found where operator expected", what);
177 if (bufptr == SvPVX(linestr))
178 warn("\t(Missing semicolon on previous line?)\n", what);
189 char *nl = strrchr(s,'\n');
193 else if (multi_close < 32 || multi_close == 127) {
195 tmpbuf[1] = multi_close ^ 64;
201 *tmpbuf = multi_close;
205 q = strchr(s,'"') ? '\'' : '"';
206 croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
217 SAVEINT(lex_brackets);
218 SAVEINT(lex_fakebrack);
219 SAVEINT(lex_casemods);
224 SAVEINT(curcop->cop_line);
228 SAVESPTR(oldoldbufptr);
230 SAVESPTR(lex_brackstack);
233 lex_state = LEX_NORMAL;
239 SAVESPTR(lex_brackstack);
240 New(899, lex_brackstack, 120, char);
241 SAVEFREEPV(lex_brackstack);
246 SvREFCNT_dec(lex_stuff);
249 SvREFCNT_dec(lex_repl);
254 if (SvREADONLY(linestr))
255 linestr = sv_2mortal(newSVsv(linestr));
256 s = SvPV(linestr, len);
257 if (len && s[len-1] != ';') {
258 if (!(SvFLAGS(linestr) & SVs_TEMP));
259 linestr = sv_2mortal(newSVsv(linestr));
260 sv_catpvn(linestr, "\n;", 2);
263 oldoldbufptr = oldbufptr = bufptr = SvPVX(linestr);
264 bufend = bufptr + SvCUR(linestr);
289 while (*s == ' ' || *s == '\t') s++;
290 if (strnEQ(s, "line ", 5)) {
299 while (*s == ' ' || *s == '\t')
301 if (*s == '"' && (t = strchr(s+1, '"')))
305 return; /* false alarm */
306 for (t = s; !isSPACE(*t); t++) ;
311 curcop->cop_filegv = gv_fetchfile(s);
313 curcop->cop_filegv = gv_fetchfile(origfilename);
315 curcop->cop_line = atoi(n)-1;
322 if (in_format && lex_brackets <= 1) {
323 while (s < bufend && (*s == ' ' || *s == '\t'))
328 while (s < bufend && isSPACE(*s))
330 if (s < bufend && *s == '#') {
331 while (s < bufend && *s != '\n')
336 if (s < bufend || !rsfp)
338 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch) {
339 sv_setpv(linestr,";");
340 oldoldbufptr = oldbufptr = bufptr = s = SvPVX(linestr);
343 (void)my_pclose(rsfp);
344 else if ((FILE*)rsfp == stdin)
351 oldoldbufptr = oldbufptr = bufptr = s;
352 bufend = bufptr + SvCUR(linestr);
353 if (perldb && curstash != debstash) {
354 SV *sv = NEWSV(85,0);
356 sv_upgrade(sv, SVt_PVMG);
357 sv_setsv(sv,linestr);
358 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
369 if (oldoldbufptr != last_uni)
371 while (isSPACE(*last_uni))
373 for (s = last_uni; isALNUM(*s) || *s == '-'; s++) ;
376 warn("Warning: Use of \"%s\" without parens is ambiguous", last_uni);
384 #define UNI(f) return uni(f,s)
385 #define LOP(f) return lop(f,s)
395 last_uni = oldbufptr;
414 last_lop = oldbufptr;
425 #endif /* CRIPPLED_CC */
431 nexttype[nexttoke] = type;
433 if (lex_state != LEX_KNOWNEXT) {
434 lex_defer = lex_state;
436 lex_state = LEX_KNOWNEXT;
441 force_word(start,token,check_keyword,allow_tick)
442 register char *start;
450 start = skipspace(start);
452 if (isIDFIRST(*s) || (allow_tick && (*s == '\'' || *s == ':'))) {
453 s = scan_word(s, tokenbuf, allow_tick, &len);
454 if (check_keyword && keyword(tokenbuf, len))
456 if (token == METHOD) {
466 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(tokenbuf,0));
467 nextval[nexttoke].opval->op_private |= OPpCONST_BARE;
478 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
498 while (s < send && *s != '\\')
506 if (s + 1 < send && (s[1] == '\\' || s[1] == delim))
507 s++; /* all that, just for this */
512 SvCUR_set(sv, d - SvPVX(sv));
520 register I32 op_type = yylval.ival;
524 if (op_type == OP_NULL) {
525 yylval.opval = lex_op;
529 if (op_type == OP_CONST || op_type == OP_READLINE) {
530 yylval.opval = (OP*)newSVOP(op_type, 0, q(lex_stuff));
537 SAVEINT(lex_brackets);
538 SAVEINT(lex_fakebrack);
539 SAVEINT(lex_casemods);
544 SAVEINT(curcop->cop_line);
547 SAVESPTR(oldoldbufptr);
549 SAVESPTR(lex_brackstack);
554 bufend = bufptr = oldbufptr = oldoldbufptr = SvPVX(linestr);
555 bufend += SvCUR(linestr);
561 New(899, lex_brackstack, 120, char);
562 SAVEFREEPV(lex_brackstack);
565 lex_state = LEX_INTERPCONCAT;
566 curcop->cop_line = multi_start;
568 lex_inwhat = op_type;
569 if (op_type == OP_MATCH || op_type == OP_SUBST)
577 yylval.opval = lex_op;
590 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
594 if (lex_casemods) { /* oops, we've got some unbalanced parens */
595 lex_state = LEX_INTERPCASEMOD;
599 /* Is there a right-hand side to take care of? */
600 if (lex_repl && (lex_inwhat == OP_SUBST || lex_inwhat == OP_TRANS)) {
603 bufend = bufptr = oldbufptr = oldoldbufptr = SvPVX(linestr);
604 bufend += SvCUR(linestr);
611 if (SvCOMPILED(lex_repl)) {
612 lex_state = LEX_INTERPNORMAL;
616 lex_state = LEX_INTERPCONCAT;
622 bufend = SvPVX(linestr);
623 bufend += SvCUR(linestr);
633 register char *send = bufend;
634 SV *sv = NEWSV(93, send - start);
635 register char *s = start;
636 register char *d = SvPVX(sv);
637 char delim = SvIVX(linestr);
638 bool dorange = FALSE;
642 ? "\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}"
643 : (lex_inwhat & OP_TRANS)
647 while (s < send || dorange) {
648 if (lex_inwhat == OP_TRANS) {
653 SvGROW(sv, SvLEN(sv) + 256);
657 for (i = (*d & 0377); i <= max; i++)
662 else if (*s == '-' && s+1 < send && s != start) {
669 else if (*s == '$') {
670 if (!lex_inpat) /* not a regexp, so $ must be var */
672 if (s + 1 < send && s[1] != ')' && s[1] != '|')
673 break; /* in regexp, $ might be tail anchor */
675 if (*s == '\\' && s+1 < send) {
681 if (*s && strchr(leave, *s)) {
686 if (lex_inwhat == OP_SUBST && !lex_inpat &&
687 isDIGIT(*s) && !isDIGIT(s[1]))
692 if (lex_inwhat != OP_TRANS && *s && strchr("lLuUE", *s)) {
698 if (lex_inwhat == OP_TRANS) {
706 case '0': case '1': case '2': case '3':
707 case '4': case '5': case '6': case '7':
708 *d++ = scan_oct(s, 3, &len);
712 *d++ = scan_hex(++s, 2, &len);
750 SvCUR_set(sv, d - SvPVX(sv));
753 if (SvCUR(sv) + 5 < SvLEN(sv)) {
754 SvLEN_set(sv, SvCUR(sv) + 1);
755 Renew(SvPVX(sv), SvLEN(sv), char);
758 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
764 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
771 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
773 if (*s != '{' && *s != '[')
778 /* In a pattern, so maybe we have {n,m}. */
795 /* On the other hand, maybe we have a character class */
798 if (*s == ']' || *s == '^')
801 int weight = 2; /* let's weigh the evidence */
803 unsigned char un_char = 0, last_un_char;
804 char *send = strchr(s,']');
807 if (!send) /* has to be an expression */
813 else if (isDIGIT(*s)) {
815 if (isDIGIT(s[1]) && s[2] == ']')
821 for (; s < send; s++) {
822 last_un_char = un_char;
823 un_char = (unsigned char)*s;
828 weight -= seen[un_char] * 10;
830 scan_ident(s,send,tmpbuf,FALSE);
831 if (strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE))
836 else if (*s == '$' && s[1] &&
837 strchr("[#!%*<>()-=",s[1])) {
838 if (/*{*/ strchr("])} =",s[2]))
847 if (strchr("wds]",s[1]))
849 else if (seen['\''] || seen['"'])
851 else if (strchr("rnftbxcav",s[1]))
853 else if (isDIGIT(s[1])) {
855 while (s[1] && isDIGIT(s[1]))
865 if (strchr("aA01! ",last_un_char))
867 if (strchr("zZ79~",s[1]))
871 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
872 isALPHA(*s) && s[1] && isALPHA(s[1])) {
877 if (keyword(tmpbuf, d - tmpbuf))
880 if (un_char == last_un_char + 1)
882 weight -= seen[un_char];
887 if (weight >= 0) /* probably a character class */
894 static char* exp_name[] = { "OPERATOR", "TERM", "REF", "STATE", "BLOCK" };
896 extern int yychar; /* last token */
908 case LEX_NORMAL: /* Some compilers will produce faster */
909 case LEX_INTERPNORMAL: /* code if we comment these out. */
915 yylval = nextval[nexttoke];
917 lex_state = lex_defer;
920 return(nexttype[nexttoke]);
922 case LEX_INTERPCASEMOD:
924 if (bufptr != bufend && *bufptr != '\\')
925 croak("panic: INTERPCASEMOD");
927 if (bufptr == bufend || bufptr[1] == 'E') {
928 if (lex_casemods <= 1) {
929 if (bufptr != bufend)
931 lex_state = LEX_INTERPSTART;
939 else if (lex_casemods) {
945 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
946 tmp = *s, *s = s[2], s[2] = tmp; /* misordered... */
948 lex_state = LEX_INTERPCONCAT;
949 nextval[nexttoke].ival = 0;
952 nextval[nexttoke].ival = OP_LCFIRST;
954 nextval[nexttoke].ival = OP_UCFIRST;
956 nextval[nexttoke].ival = OP_LC;
958 nextval[nexttoke].ival = OP_UC;
960 croak("panic: yylex");
972 case LEX_INTERPSTART:
973 if (bufptr == bufend)
974 return sublex_done();
976 lex_dojoin = (*bufptr == '@');
977 lex_state = LEX_INTERPNORMAL;
979 nextval[nexttoke].ival = 0;
982 nextval[nexttoke].ival = 0;
984 nextval[nexttoke].ival = 0;
986 nextval[nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
997 case LEX_INTERPENDMAYBE:
998 if (intuit_more(bufptr)) {
999 lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
1007 lex_state = LEX_INTERPCONCAT;
1011 case LEX_INTERPCONCAT:
1014 croak("panic: INTERPCONCAT");
1016 if (bufptr == bufend)
1017 return sublex_done();
1019 if (SvIVX(linestr) == '\'') {
1020 SV *sv = newSVsv(linestr);
1023 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1027 s = scan_const(bufptr);
1029 lex_state = LEX_INTERPCASEMOD;
1031 lex_state = LEX_INTERPSTART;
1035 nextval[nexttoke] = yylval;
1050 oldoldbufptr = oldbufptr;
1053 fprintf(stderr,"### Tokener expecting %s at %s\n", exp_name[expect], s);
1059 if ((*s & 127) == '}') {
1064 warn("Unrecognized character \\%03o ignored", *s++ & 255);
1070 if ((*s & 127) == '}') {
1075 warn("Unrecognized character \\%03o ignored", *s++ & 255);
1079 goto fake_eof; /* emulate EOF on ^D or ^Z */
1083 yyerror("Missing right bracket");
1087 goto retry; /* ignore stray nulls */
1092 sv_setpv(linestr,"");
1094 char *pdb = getenv("PERLDB");
1096 sv_catpv(linestr, pdb ? pdb : "BEGIN { require 'perldb.pl' }");
1098 if (minus_n || minus_p) {
1099 sv_catpv(linestr, "LINE: while (<>) {");
1101 sv_catpv(linestr,"chop;");
1105 if ( splitstr[0] == '/' ||
1106 splitstr[0] == '\'' ||
1107 splitstr[0] == '"' )
1108 sprintf( tmpbuf1, "@F=split(%s);", splitstr );
1110 sprintf( tmpbuf1, "@F=split('%s');", splitstr );
1111 sv_catpv(linestr,tmpbuf1);
1114 sv_catpv(linestr,"@F=split(' ');");
1117 oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1118 bufend = SvPVX(linestr) + SvCUR(linestr);
1123 #endif /* CRYPTSCRIPT */
1125 if ((s = sv_gets(linestr, rsfp, 0)) == Nullch) {
1129 (void)my_pclose(rsfp);
1130 else if ((FILE*)rsfp == stdin)
1136 if (minus_n || minus_p) {
1137 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
1138 sv_catpv(linestr,";}");
1139 oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1140 bufend = SvPVX(linestr) + SvCUR(linestr);
1141 minus_n = minus_p = 0;
1144 oldoldbufptr = oldbufptr = s = SvPVX(linestr);
1145 sv_setpv(linestr,"");
1146 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
1148 if (doextract && *s == '#')
1151 } while (doextract);
1152 oldoldbufptr = oldbufptr = bufptr = s;
1153 if (perldb && curstash != debstash) {
1154 SV *sv = NEWSV(85,0);
1156 sv_upgrade(sv, SVt_PVMG);
1157 sv_setsv(sv,linestr);
1158 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1160 bufend = SvPVX(linestr) + SvCUR(linestr);
1161 if (curcop->cop_line == 1) {
1162 while (s < bufend && isSPACE(*s))
1164 if (*s == ':') /* for csh's that have to exec sh scripts */
1166 if (*s == '#' && s[1] == '!') {
1167 if (!in_eval && !instr(s,"perl") && !instr(s,"indir") &&
1168 instr(origargv[0],"perl")) {
1176 while (s < bufend && !isSPACE(*s))
1179 while (s < bufend && isSPACE(*s))
1182 Newz(899,newargv,origargc+3,char*);
1184 while (s < bufend && !isSPACE(*s))
1187 Copy(origargv+1, newargv+2, origargc+1, char*);
1193 croak("Can't exec %s", cmd);
1195 if (d = instr(s, "perl -")) {
1198 while (d = moreswitches(d)) ;
1202 if (in_format && lex_brackets <= 1) {
1203 s = scan_formline(s);
1209 case ' ': case '\t': case '\f': case '\r': case 013:
1214 if (lex_state != LEX_NORMAL || (in_eval && !rsfp)) {
1216 while (s < d && *s != '\n')
1221 if (in_format && lex_brackets <= 1) {
1222 s = scan_formline(s);
1234 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
1236 last_uni = oldbufptr;
1238 case 'r': FTST(OP_FTEREAD);
1239 case 'w': FTST(OP_FTEWRITE);
1240 case 'x': FTST(OP_FTEEXEC);
1241 case 'o': FTST(OP_FTEOWNED);
1242 case 'R': FTST(OP_FTRREAD);
1243 case 'W': FTST(OP_FTRWRITE);
1244 case 'X': FTST(OP_FTREXEC);
1245 case 'O': FTST(OP_FTROWNED);
1246 case 'e': FTST(OP_FTIS);
1247 case 'z': FTST(OP_FTZERO);
1248 case 's': FTST(OP_FTSIZE);
1249 case 'f': FTST(OP_FTFILE);
1250 case 'd': FTST(OP_FTDIR);
1251 case 'l': FTST(OP_FTLINK);
1252 case 'p': FTST(OP_FTPIPE);
1253 case 'S': FTST(OP_FTSOCK);
1254 case 'u': FTST(OP_FTSUID);
1255 case 'g': FTST(OP_FTSGID);
1256 case 'k': FTST(OP_FTSVTX);
1257 case 'b': FTST(OP_FTBLK);
1258 case 'c': FTST(OP_FTCHR);
1259 case 't': FTST(OP_FTTTY);
1260 case 'T': FTST(OP_FTTEXT);
1261 case 'B': FTST(OP_FTBINARY);
1262 case 'M': gv_fetchpv("\024",TRUE); FTST(OP_FTMTIME);
1263 case 'A': gv_fetchpv("\024",TRUE); FTST(OP_FTATIME);
1264 case 'C': gv_fetchpv("\024",TRUE); FTST(OP_FTCTIME);
1273 if (expect == XOPERATOR)
1278 else if (*s == '>') {
1281 if (isIDFIRST(*s)) {
1282 s = force_word(s,METHOD,FALSE,TRUE);
1288 if (expect == XOPERATOR)
1291 if (isSPACE(*s) || !isSPACE(*bufptr))
1293 OPERATOR('-'); /* unary minus */
1300 if (expect == XOPERATOR)
1305 if (expect == XOPERATOR)
1308 if (isSPACE(*s) || !isSPACE(*bufptr))
1314 if (expect != XOPERATOR) {
1315 s = scan_ident(s, bufend, tokenbuf, TRUE);
1317 force_ident(tokenbuf);
1328 if (expect != XOPERATOR) {
1329 s = scan_ident(s, bufend, tokenbuf + 1, TRUE);
1334 if (strchr(tokenbuf,':'))
1335 croak("\"my\" variable %s can't be in a package",tokenbuf);
1336 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1337 nextval[nexttoke].opval->op_targ = pad_allocmy(tokenbuf);
1338 force_next(PRIVATEREF);
1341 if (!strchr(tokenbuf,':')) {
1342 if (tmp = pad_findmy(tokenbuf)) {
1343 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1344 nextval[nexttoke].opval->op_targ = tmp;
1345 force_next(PRIVATEREF);
1349 force_ident(tokenbuf + 1);
1371 if (last_lop == oldoldbufptr)
1372 oldbufptr = oldoldbufptr; /* allow print(STDOUT 123) */
1375 if (curcop->cop_line < copline)
1376 copline = curcop->cop_line;
1384 if (lex_brackets <= 0)
1385 yyerror("Unmatched right bracket");
1388 if (lex_state == LEX_INTERPNORMAL) {
1389 if (lex_brackets == 0) {
1390 if (*s != '-' || s[1] != '>')
1391 lex_state = LEX_INTERPEND;
1400 if (lex_brackets > 100) {
1401 char* newlb = (char*)realloc(lex_brackstack, lex_brackets + 1);
1402 if (newlb != lex_brackstack) {
1404 lex_brackstack = newlb;
1407 if (oldoldbufptr == last_lop)
1408 lex_brackstack[lex_brackets++] = XTERM;
1410 lex_brackstack[lex_brackets++] = XOPERATOR;
1411 if (expect == XTERM)
1412 OPERATOR(HASHBRACK);
1413 else if (expect == XBLOCK || expect == XOPERATOR) {
1414 lex_brackstack[lex_brackets-1] = XSTATE;
1421 OPERATOR(HASHBRACK);
1424 (isSPACE(*t) || isALPHA(*t) || *t == '"' || *t == '\'');
1426 if (*t == ',' || (*t == '=' && t[1] == '>'))
1427 OPERATOR(HASHBRACK);
1431 lex_brackstack[lex_brackets-1] = XSTATE;
1435 yylval.ival = curcop->cop_line;
1436 if (isSPACE(*s) || *s == '#')
1437 copline = NOLINE; /* invalidate current command line number */
1442 if (lex_brackets <= 0)
1443 yyerror("Unmatched right bracket");
1445 expect = (expectation)lex_brackstack[--lex_brackets];
1446 if (lex_state == LEX_INTERPNORMAL) {
1447 if (lex_brackets == 0) {
1448 if (lex_fakebrack) {
1449 lex_state = LEX_INTERPEND;
1451 return yylex(); /* ignore fake brackets */
1453 if (*s != '-' || s[1] != '>')
1454 lex_state = LEX_INTERPEND;
1465 if (expect == XOPERATOR) {
1466 if (dowarn && isALPHA(*s) && bufptr == SvPVX(linestr)) {
1474 s = scan_ident(s-1, bufend, tokenbuf, TRUE);
1477 force_ident(tokenbuf);
1499 if (dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
1500 warn("Reversed %c= operator",tmp);
1502 if (in_format == 2 && (tmp == '\n' || s[1] == '\n')) {
1519 if (expect != XOPERATOR) {
1520 if (s[1] != '<' && !strchr(s,'>'))
1523 s = scan_heredoc(s);
1525 s = scan_inputsymbol(s);
1526 TERM(sublex_start());
1531 SHop(OP_LEFT_SHIFT);
1545 SHop(OP_RIGHT_SHIFT);
1552 if (s[1] == '#' && (isALPHA(s[2]) || s[2] == '_' || s[2] == '{')) {
1553 s = scan_ident(s+1, bufend, tokenbuf, FALSE);
1554 if (expect == XOPERATOR) {
1556 OPERATOR(','); /* grandfather non-comma-format format */
1558 no_op("Array length",s);
1561 force_ident(tokenbuf);
1564 s = scan_ident(s, bufend, tokenbuf+1, FALSE);
1565 if (expect == XOPERATOR) {
1567 OPERATOR(','); /* grandfather non-comma-format format */
1573 if (dowarn && *s == '[') {
1575 for (t = s+1; isSPACE(*t) || isALNUM(*t) || *t == '$'; t++) ;
1577 bufptr = skipspace(bufptr);
1578 while (t < bufend && *t != ']') t++;
1579 warn("Multidimensional syntax %.*s not supported",
1580 t-bufptr+1, bufptr);
1584 if (lex_state == LEX_NORMAL && isSPACE(*s)) {
1585 bool islop = (last_lop == oldoldbufptr);
1589 else if (strchr("$@\"'`q", *s))
1590 expect = XTERM; /* e.g. print $fh "foo" */
1591 else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
1592 expect = XTERM; /* e.g. print $fh &sub */
1593 else if (isDIGIT(*s))
1594 expect = XTERM; /* e.g. print $fh 3 */
1595 else if (*s == '.' && isDIGIT(s[1]))
1596 expect = XTERM; /* e.g. print $fh .3 */
1597 else if (strchr("/?-+", *s) && !isSPACE(s[1]))
1598 expect = XTERM; /* e.g. print $fh -1 */
1599 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]))
1600 expect = XTERM; /* print $fh <<"EOF" */
1603 if (strchr(tokenbuf,':'))
1604 croak("\"my\" variable %s can't be in a package",tokenbuf);
1605 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1606 nextval[nexttoke].opval->op_targ = pad_allocmy(tokenbuf);
1607 force_next(PRIVATEREF);
1609 else if (!strchr(tokenbuf,':')) {
1614 if (tmp = pad_findmy(tokenbuf)) {
1615 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1616 nextval[nexttoke].opval->op_targ = tmp;
1617 force_next(PRIVATEREF);
1620 force_ident(tokenbuf+1);
1623 force_ident(tokenbuf+1);
1627 yyerror("Final $ should be \\$ or $name");
1633 s = scan_ident(s, bufend, tokenbuf+1, FALSE);
1634 if (expect == XOPERATOR)
1640 if (strchr(tokenbuf,':'))
1641 croak("\"my\" variable %s can't be in a package",tokenbuf);
1642 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1643 nextval[nexttoke].opval->op_targ = pad_allocmy(tokenbuf);
1644 force_next(PRIVATEREF);
1647 else if (!strchr(tokenbuf,':')) {
1650 if (tmp = pad_findmy(tokenbuf)) {
1651 nextval[nexttoke].opval = newOP(OP_PADANY, 0);
1652 nextval[nexttoke].opval->op_targ = tmp;
1653 force_next(PRIVATEREF);
1657 if (dowarn && *s == '[') {
1659 for (t = s+1; *t && (isALNUM(*t) || strchr(" \t$#+-", *t)); t++)
1662 bufptr = skipspace(bufptr);
1663 warn("Scalar value %.*s better written as $%.*s",
1664 t-bufptr, bufptr, t-bufptr-1, bufptr+1);
1667 force_ident(tokenbuf+1);
1671 yyerror("Final @ should be \\@ or @name");
1676 case '/': /* may either be division or pattern */
1677 case '?': /* may either be conditional or pattern */
1678 if (expect != XOPERATOR) {
1681 TERM(sublex_start());
1689 if (in_format == 2) {
1694 if (expect == XOPERATOR || !isDIGIT(s[1])) {
1700 yylval.ival = OPf_SPECIAL;
1706 if (expect != XOPERATOR)
1711 case '0': case '1': case '2': case '3': case '4':
1712 case '5': case '6': case '7': case '8': case '9':
1714 if (expect == XOPERATOR)
1720 if (expect == XOPERATOR) {
1722 OPERATOR(','); /* grandfather non-comma-format format */
1728 yylval.ival = OP_CONST;
1729 TERM(sublex_start());
1733 if (expect == XOPERATOR) {
1735 OPERATOR(','); /* grandfather non-comma-format format */
1741 yylval.ival = OP_SCALAR;
1742 TERM(sublex_start());
1746 if (expect == XOPERATOR)
1747 no_op("Backticks",s);
1750 yylval.ival = OP_BACKTICK;
1752 TERM(sublex_start());
1756 if (expect == XOPERATOR)
1757 no_op("Backslash",s);
1761 if (isDIGIT(s[1]) && expect == XOPERATOR) {
1797 s = scan_word(s, tokenbuf, FALSE, &len);
1799 switch (tmp = keyword(tokenbuf, len)) {
1801 default: /* not a keyword */
1805 /* Get the rest if it looks like a package qualifier */
1807 if (*s == '\'' || *s == ':')
1808 s = scan_word(s, tokenbuf + len, TRUE, &len);
1810 /* Do special processing at start of statement. */
1812 if (expect == XSTATE) {
1813 while (isSPACE(*s)) s++;
1814 if (*s == ':') { /* It's a label. */
1815 yylval.pval = savestr(tokenbuf);
1821 else if (dowarn && expect == XOPERATOR) {
1822 if (bufptr == SvPVX(linestr)) {
1828 no_op("Bare word",s);
1831 /* Look for a subroutine with this name in current package. */
1833 gv = gv_fetchpv(tokenbuf,FALSE);
1835 /* See if it's the indirect object for a list operator. */
1837 if (oldoldbufptr && oldoldbufptr < bufptr) {
1838 if (oldoldbufptr == last_lop &&
1839 (!gv || !GvCV(gv) || last_lop_op == OP_SORT))
1843 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
1844 newSVpv(tokenbuf,0));
1845 yylval.opval->op_private = OPpCONST_BARE;
1846 for (d = tokenbuf; *d && isLOWER(*d); d++) ;
1848 warn(warn_reserved, tokenbuf);
1853 /* If followed by a paren, it's certainly a subroutine. */
1859 nextval[nexttoke].opval =
1860 (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
1861 nextval[nexttoke].opval->op_private = OPpCONST_BARE;
1867 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
1868 yylval.opval->op_private = OPpCONST_BARE;
1870 /* If followed by var or block, call it a method (maybe). */
1872 if ((*s == '$' || *s == '{') && (!gv || !GvCV(gv))) {
1873 last_lop = oldbufptr;
1874 last_lop_op = OP_METHOD;
1878 /* If followed by a bareword, see if it looks like indir obj. */
1884 s = scan_word(s, tmpbuf, TRUE, &len);
1885 if (!keyword(tmpbuf, len)) {
1886 SV* tmpsv = newSVpv(tmpbuf,0);
1887 indirgv = gv_fetchpv(tmpbuf,FALSE);
1888 if (!indirgv || !GvCV(indirgv)) {
1889 if (!gv || !GvCV(gv) || fetch_stash(tmpsv, FALSE)) {
1890 nextval[nexttoke].opval =
1891 (OP*)newSVOP(OP_CONST, 0, tmpsv);
1892 nextval[nexttoke].opval->op_private =
1899 SvREFCNT_dec(tmpsv);
1904 /* Not a method, so call it a subroutine (if defined) */
1906 if (gv && GvCV(gv)) {
1907 nextval[nexttoke].opval = yylval.opval;
1913 last_lop = oldbufptr;
1914 last_lop_op = OP_ENTERSUBR;
1920 /* Call it a bare word */
1922 for (d = tokenbuf; *d && isLOWER(*d); d++) ;
1924 warn(warn_reserved, tokenbuf);
1929 case KEY___FILE__: {
1930 if (tokenbuf[2] == 'L')
1931 (void)sprintf(tokenbuf,"%ld",(long)curcop->cop_line);
1933 strcpy(tokenbuf, SvPVX(GvSV(curcop->cop_filegv)));
1934 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
1943 if (!in_eval && (gv = gv_fetchpv("DATA",FALSE))) {
1947 IoIFP(GvIO(gv)) = rsfp;
1948 #if defined(HAS_FCNTL) && defined(FFt_SETFD)
1950 fcntl(fd,FFt_SETFD,fd >= 3);
1953 IoTYPE(GvIO(gv)) = '|';
1954 else if ((FILE*)rsfp == stdin)
1955 IoTYPE(GvIO(gv)) = '-';
1957 IoTYPE(GvIO(gv)) = '<';
1968 if (expect == XSTATE && (minus_p || minus_n || *s == '{' )) {
2005 (void)gv_fetchpv("ENV",TRUE); /* may use HOME */
2029 if (dowarn && *s != '0' && isDIGIT(*s))
2030 yywarn("chmod: mode argument is missing initial 0");
2053 s = force_word(s,WORD,FALSE,TRUE);
2072 s = force_word(s,WORD,TRUE,FALSE);
2079 yylval.ival = curcop->cop_line;
2090 expect = (*s == '{') ? XBLOCK : XTERM;
2091 UNIBRACK(OP_ENTEREVAL);
2106 case KEY_endhostent:
2112 case KEY_endservent:
2115 case KEY_endprotoent:
2126 yylval.ival = curcop->cop_line;
2127 while (s < bufend && isSPACE(*s))
2130 croak("Missing $ on loop variable");
2158 s = force_word(s,WORD,TRUE,FALSE);
2173 case KEY_getpriority:
2174 LOP(OP_GETPRIORITY);
2176 case KEY_getprotobyname:
2179 case KEY_getprotobynumber:
2182 case KEY_getprotoent:
2194 case KEY_getpeername:
2195 UNI(OP_GETPEERNAME);
2197 case KEY_gethostbyname:
2200 case KEY_gethostbyaddr:
2203 case KEY_gethostent:
2206 case KEY_getnetbyname:
2209 case KEY_getnetbyaddr:
2215 case KEY_getservbyname:
2218 case KEY_getservbyport:
2221 case KEY_getservent:
2224 case KEY_getsockname:
2225 UNI(OP_GETSOCKNAME);
2227 case KEY_getsockopt:
2249 yylval.ival = curcop->cop_line;
2271 s = force_word(s,WORD,TRUE,FALSE);
2310 TERM(sublex_start());
2333 s = force_word(s,WORD,TRUE,FALSE);
2341 if (isIDFIRST(*s)) {
2343 for (d = s; isALNUM(*d); d++) ;
2345 if (strchr("|&*+-=!?:.", *t))
2346 warn("Precedence problem: open %.*s should be open(%.*s)",
2364 checkcomma(s,tokenbuf,"filehandle");
2368 checkcomma(s,tokenbuf,"filehandle");
2381 s = force_word(s,WORD,FALSE,TRUE);
2391 yylval.ival = OP_CONST;
2392 TERM(sublex_start());
2399 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, q(lex_stuff));
2403 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
2412 yylval.ival = OP_SCALAR;
2413 if (SvIVX(lex_stuff) == '\'')
2414 SvIVX(lex_stuff) = 0; /* qq'$foo' should intepolate */
2415 TERM(sublex_start());
2421 yylval.ival = OP_BACKTICK;
2423 TERM(sublex_start());
2429 s = force_word(s,WORD,TRUE,FALSE);
2436 s = force_word(s,WORD,TRUE,FALSE);
2483 TERM(sublex_start());
2485 TOKEN(1); /* force error */
2511 case KEY_setpriority:
2512 LOP(OP_SETPRIORITY);
2514 case KEY_sethostent:
2520 case KEY_setservent:
2523 case KEY_setprotoent:
2535 case KEY_setsockopt:
2565 case KEY_socketpair:
2569 checkcomma(s,tokenbuf,"subroutine name");
2571 if (*s == ';' || *s == ')') /* probably a close */
2572 croak("sort is now a reserved word");
2574 s = force_word(s,WORD,TRUE,TRUE);
2605 yylval.ival = start_subparse();
2607 if (tmp == KEY_format)
2611 if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
2613 d = scan_word(s, tmpbuf, TRUE, &len);
2614 if (strchr(tmpbuf, ':'))
2615 sv_setpv(subname, tmpbuf);
2617 sv_setsv(subname,curstname);
2618 sv_catpvn(subname,"::",2);
2619 sv_catpvn(subname,tmpbuf,len);
2621 s = force_word(s,WORD,FALSE,TRUE);
2624 sv_setpv(subname,"?");
2626 if (tmp != KEY_format)
2651 TERM(sublex_start());
2681 yylval.ival = curcop->cop_line;
2685 yylval.ival = curcop->cop_line;
2702 if (dowarn && *s != '0' && isDIGIT(*s))
2703 warn("umask: argument is missing initial 0");
2717 yylval.ival = curcop->cop_line;
2736 if (expect == XOPERATOR)
2743 TERM(sublex_start());
2756 if (strEQ(d,"__LINE__")) return KEY___LINE__;
2757 if (strEQ(d,"__FILE__")) return KEY___FILE__;
2758 if (strEQ(d,"__END__")) return KEY___END__;
2762 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
2767 if (strEQ(d,"and")) return KEY_and;
2768 if (strEQ(d,"abs")) return KEY_abs;
2771 if (strEQ(d,"alarm")) return KEY_alarm;
2772 if (strEQ(d,"atan2")) return KEY_atan2;
2775 if (strEQ(d,"accept")) return KEY_accept;
2780 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
2783 if (strEQ(d,"bless")) return KEY_bless;
2784 if (strEQ(d,"bind")) return KEY_bind;
2785 if (strEQ(d,"binmode")) return KEY_binmode;
2790 if (strEQ(d,"cmp")) return KEY_cmp;
2791 if (strEQ(d,"chr")) return KEY_chr;
2792 if (strEQ(d,"cos")) return KEY_cos;
2795 if (strEQ(d,"chop")) return KEY_chop;
2798 if (strEQ(d,"close")) return KEY_close;
2799 if (strEQ(d,"chdir")) return KEY_chdir;
2800 if (strEQ(d,"chmod")) return KEY_chmod;
2801 if (strEQ(d,"chown")) return KEY_chown;
2802 if (strEQ(d,"crypt")) return KEY_crypt;
2805 if (strEQ(d,"chroot")) return KEY_chroot;
2806 if (strEQ(d,"caller")) return KEY_caller;
2809 if (strEQ(d,"connect")) return KEY_connect;
2812 if (strEQ(d,"closedir")) return KEY_closedir;
2813 if (strEQ(d,"continue")) return KEY_continue;
2818 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
2823 if (strEQ(d,"do")) return KEY_do;
2826 if (strEQ(d,"die")) return KEY_die;
2829 if (strEQ(d,"dump")) return KEY_dump;
2832 if (strEQ(d,"delete")) return KEY_delete;
2835 if (strEQ(d,"defined")) return KEY_defined;
2836 if (strEQ(d,"dbmopen")) return KEY_dbmopen;
2839 if (strEQ(d,"dbmclose")) return KEY_dbmclose;
2844 if (strEQ(d,"EQ")) return KEY_eq;
2845 if (strEQ(d,"END")) return KEY_END;
2850 if (strEQ(d,"eq")) return KEY_eq;
2853 if (strEQ(d,"eof")) return KEY_eof;
2854 if (strEQ(d,"exp")) return KEY_exp;
2857 if (strEQ(d,"else")) return KEY_else;
2858 if (strEQ(d,"exit")) return KEY_exit;
2859 if (strEQ(d,"eval")) return KEY_eval;
2860 if (strEQ(d,"exec")) return KEY_exec;
2861 if (strEQ(d,"each")) return KEY_each;
2864 if (strEQ(d,"elsif")) return KEY_elsif;
2867 if (strEQ(d,"endgrent")) return KEY_endgrent;
2868 if (strEQ(d,"endpwent")) return KEY_endpwent;
2871 if (strEQ(d,"endnetent")) return KEY_endnetent;
2874 if (strEQ(d,"endhostent")) return KEY_endhostent;
2875 if (strEQ(d,"endservent")) return KEY_endservent;
2878 if (strEQ(d,"endprotoent")) return KEY_endprotoent;
2885 if (strEQ(d,"for")) return KEY_for;
2888 if (strEQ(d,"fork")) return KEY_fork;
2891 if (strEQ(d,"fcntl")) return KEY_fcntl;
2892 if (strEQ(d,"flock")) return KEY_flock;
2895 if (strEQ(d,"format")) return KEY_format;
2896 if (strEQ(d,"fileno")) return KEY_fileno;
2899 if (strEQ(d,"foreach")) return KEY_foreach;
2902 if (strEQ(d,"formline")) return KEY_formline;
2908 if (strEQ(d,"GT")) return KEY_gt;
2909 if (strEQ(d,"GE")) return KEY_ge;
2913 if (strnEQ(d,"get",3)) {
2918 if (strEQ(d,"ppid")) return KEY_getppid;
2919 if (strEQ(d,"pgrp")) return KEY_getpgrp;
2922 if (strEQ(d,"pwent")) return KEY_getpwent;
2923 if (strEQ(d,"pwnam")) return KEY_getpwnam;
2924 if (strEQ(d,"pwuid")) return KEY_getpwuid;
2927 if (strEQ(d,"peername")) return KEY_getpeername;
2928 if (strEQ(d,"protoent")) return KEY_getprotoent;
2929 if (strEQ(d,"priority")) return KEY_getpriority;
2932 if (strEQ(d,"protobyname")) return KEY_getprotobyname;
2935 if (strEQ(d,"protobynumber"))return KEY_getprotobynumber;
2939 else if (*d == 'h') {
2940 if (strEQ(d,"hostbyname")) return KEY_gethostbyname;
2941 if (strEQ(d,"hostbyaddr")) return KEY_gethostbyaddr;
2942 if (strEQ(d,"hostent")) return KEY_gethostent;
2944 else if (*d == 'n') {
2945 if (strEQ(d,"netbyname")) return KEY_getnetbyname;
2946 if (strEQ(d,"netbyaddr")) return KEY_getnetbyaddr;
2947 if (strEQ(d,"netent")) return KEY_getnetent;
2949 else if (*d == 's') {
2950 if (strEQ(d,"servbyname")) return KEY_getservbyname;
2951 if (strEQ(d,"servbyport")) return KEY_getservbyport;
2952 if (strEQ(d,"servent")) return KEY_getservent;
2953 if (strEQ(d,"sockname")) return KEY_getsockname;
2954 if (strEQ(d,"sockopt")) return KEY_getsockopt;
2956 else if (*d == 'g') {
2957 if (strEQ(d,"grent")) return KEY_getgrent;
2958 if (strEQ(d,"grnam")) return KEY_getgrnam;
2959 if (strEQ(d,"grgid")) return KEY_getgrgid;
2961 else if (*d == 'l') {
2962 if (strEQ(d,"login")) return KEY_getlogin;
2964 else if (strEQ(d,"c")) return KEY_getc;
2969 if (strEQ(d,"gt")) return KEY_gt;
2970 if (strEQ(d,"ge")) return KEY_ge;
2973 if (strEQ(d,"grep")) return KEY_grep;
2974 if (strEQ(d,"goto")) return KEY_goto;
2975 if (strEQ(d,"glob")) return KEY_glob;
2978 if (strEQ(d,"gmtime")) return KEY_gmtime;
2983 if (strEQ(d,"hex")) return KEY_hex;
2988 if (strEQ(d,"if")) return KEY_if;
2991 if (strEQ(d,"int")) return KEY_int;
2994 if (strEQ(d,"index")) return KEY_index;
2995 if (strEQ(d,"ioctl")) return KEY_ioctl;
3000 if (strEQ(d,"join")) return KEY_join;
3004 if (strEQ(d,"keys")) return KEY_keys;
3005 if (strEQ(d,"kill")) return KEY_kill;
3010 if (strEQ(d,"LT")) return KEY_lt;
3011 if (strEQ(d,"LE")) return KEY_le;
3017 if (strEQ(d,"lt")) return KEY_lt;
3018 if (strEQ(d,"le")) return KEY_le;
3019 if (strEQ(d,"lc")) return KEY_lc;
3022 if (strEQ(d,"log")) return KEY_log;
3025 if (strEQ(d,"last")) return KEY_last;
3026 if (strEQ(d,"link")) return KEY_link;
3029 if (strEQ(d,"local")) return KEY_local;
3030 if (strEQ(d,"lstat")) return KEY_lstat;
3033 if (strEQ(d,"length")) return KEY_length;
3034 if (strEQ(d,"listen")) return KEY_listen;
3037 if (strEQ(d,"lcfirst")) return KEY_lcfirst;
3040 if (strEQ(d,"localtime")) return KEY_localtime;
3046 case 1: return KEY_m;
3048 if (strEQ(d,"my")) return KEY_my;
3051 if (strEQ(d,"mkdir")) return KEY_mkdir;
3054 if (strEQ(d,"msgctl")) return KEY_msgctl;
3055 if (strEQ(d,"msgget")) return KEY_msgget;
3056 if (strEQ(d,"msgrcv")) return KEY_msgrcv;
3057 if (strEQ(d,"msgsnd")) return KEY_msgsnd;
3062 if (strEQ(d,"NE")) return KEY_ne;
3065 if (strEQ(d,"next")) return KEY_next;
3066 if (strEQ(d,"ne")) return KEY_ne;
3071 if (strEQ(d,"or")) return KEY_or;
3074 if (strEQ(d,"ord")) return KEY_ord;
3075 if (strEQ(d,"oct")) return KEY_oct;
3078 if (strEQ(d,"open")) return KEY_open;
3081 if (strEQ(d,"opendir")) return KEY_opendir;
3088 if (strEQ(d,"pop")) return KEY_pop;
3091 if (strEQ(d,"push")) return KEY_push;
3092 if (strEQ(d,"pack")) return KEY_pack;
3093 if (strEQ(d,"pipe")) return KEY_pipe;
3096 if (strEQ(d,"print")) return KEY_print;
3099 if (strEQ(d,"printf")) return KEY_printf;
3102 if (strEQ(d,"package")) return KEY_package;
3108 if (strEQ(d,"q")) return KEY_q;
3109 if (strEQ(d,"qq")) return KEY_qq;
3110 if (strEQ(d,"qw")) return KEY_qw;
3111 if (strEQ(d,"qx")) return KEY_qx;
3117 if (strEQ(d,"ref")) return KEY_ref;
3120 if (strEQ(d,"read")) return KEY_read;
3121 if (strEQ(d,"rand")) return KEY_rand;
3122 if (strEQ(d,"recv")) return KEY_recv;
3123 if (strEQ(d,"redo")) return KEY_redo;
3126 if (strEQ(d,"rmdir")) return KEY_rmdir;
3127 if (strEQ(d,"reset")) return KEY_reset;
3130 if (strEQ(d,"return")) return KEY_return;
3131 if (strEQ(d,"rename")) return KEY_rename;
3132 if (strEQ(d,"rindex")) return KEY_rindex;
3135 if (strEQ(d,"require")) return KEY_require;
3136 if (strEQ(d,"reverse")) return KEY_reverse;
3137 if (strEQ(d,"readdir")) return KEY_readdir;
3140 if (strEQ(d,"readlink")) return KEY_readlink;
3141 if (strEQ(d,"readline")) return KEY_readline;
3142 if (strEQ(d,"readpipe")) return KEY_readpipe;
3145 if (strEQ(d,"rewinddir")) return KEY_rewinddir;
3151 case 0: return KEY_s;
3153 if (strEQ(d,"scalar")) return KEY_scalar;
3158 if (strEQ(d,"seek")) return KEY_seek;
3159 if (strEQ(d,"send")) return KEY_send;
3162 if (strEQ(d,"semop")) return KEY_semop;
3165 if (strEQ(d,"select")) return KEY_select;
3166 if (strEQ(d,"semctl")) return KEY_semctl;
3167 if (strEQ(d,"semget")) return KEY_semget;
3170 if (strEQ(d,"setpgrp")) return KEY_setpgrp;
3171 if (strEQ(d,"seekdir")) return KEY_seekdir;
3174 if (strEQ(d,"setpwent")) return KEY_setpwent;
3175 if (strEQ(d,"setgrent")) return KEY_setgrent;
3178 if (strEQ(d,"setnetent")) return KEY_setnetent;
3181 if (strEQ(d,"setsockopt")) return KEY_setsockopt;
3182 if (strEQ(d,"sethostent")) return KEY_sethostent;
3183 if (strEQ(d,"setservent")) return KEY_setservent;
3186 if (strEQ(d,"setpriority")) return KEY_setpriority;
3187 if (strEQ(d,"setprotoent")) return KEY_setprotoent;
3194 if (strEQ(d,"shift")) return KEY_shift;
3197 if (strEQ(d,"shmctl")) return KEY_shmctl;
3198 if (strEQ(d,"shmget")) return KEY_shmget;
3201 if (strEQ(d,"shmread")) return KEY_shmread;
3204 if (strEQ(d,"shmwrite")) return KEY_shmwrite;
3205 if (strEQ(d,"shutdown")) return KEY_shutdown;
3210 if (strEQ(d,"sin")) return KEY_sin;
3213 if (strEQ(d,"sleep")) return KEY_sleep;
3216 if (strEQ(d,"sort")) return KEY_sort;
3217 if (strEQ(d,"socket")) return KEY_socket;
3218 if (strEQ(d,"socketpair")) return KEY_socketpair;
3221 if (strEQ(d,"split")) return KEY_split;
3222 if (strEQ(d,"sprintf")) return KEY_sprintf;
3223 if (strEQ(d,"splice")) return KEY_splice;
3226 if (strEQ(d,"sqrt")) return KEY_sqrt;
3229 if (strEQ(d,"srand")) return KEY_srand;
3232 if (strEQ(d,"stat")) return KEY_stat;
3233 if (strEQ(d,"study")) return KEY_study;
3236 if (strEQ(d,"substr")) return KEY_substr;
3237 if (strEQ(d,"sub")) return KEY_sub;
3242 if (strEQ(d,"system")) return KEY_system;
3245 if (strEQ(d,"sysread")) return KEY_sysread;
3246 if (strEQ(d,"symlink")) return KEY_symlink;
3247 if (strEQ(d,"syscall")) return KEY_syscall;
3250 if (strEQ(d,"syswrite")) return KEY_syswrite;
3259 if (strEQ(d,"tr")) return KEY_tr;
3262 if (strEQ(d,"tie")) return KEY_tie;
3265 if (strEQ(d,"tell")) return KEY_tell;
3266 if (strEQ(d,"time")) return KEY_time;
3269 if (strEQ(d,"times")) return KEY_times;
3272 if (strEQ(d,"telldir")) return KEY_telldir;
3275 if (strEQ(d,"truncate")) return KEY_truncate;
3282 if (strEQ(d,"uc")) return KEY_uc;
3285 if (strEQ(d,"undef")) return KEY_undef;
3286 if (strEQ(d,"until")) return KEY_until;
3287 if (strEQ(d,"untie")) return KEY_untie;
3288 if (strEQ(d,"utime")) return KEY_utime;
3289 if (strEQ(d,"umask")) return KEY_umask;
3292 if (strEQ(d,"unless")) return KEY_unless;
3293 if (strEQ(d,"unpack")) return KEY_unpack;
3294 if (strEQ(d,"unlink")) return KEY_unlink;
3297 if (strEQ(d,"unshift")) return KEY_unshift;
3298 if (strEQ(d,"ucfirst")) return KEY_ucfirst;
3303 if (strEQ(d,"values")) return KEY_values;
3304 if (strEQ(d,"vec")) return KEY_vec;
3309 if (strEQ(d,"warn")) return KEY_warn;
3310 if (strEQ(d,"wait")) return KEY_wait;
3313 if (strEQ(d,"while")) return KEY_while;
3314 if (strEQ(d,"write")) return KEY_write;
3317 if (strEQ(d,"waitpid")) return KEY_waitpid;
3320 if (strEQ(d,"wantarray")) return KEY_wantarray;
3325 if (len == 1) return KEY_x;
3328 if (len == 1) return KEY_y;
3337 checkcomma(s,name,what)
3344 if (dowarn && *s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
3347 for (w++; *w && isSPACE(*w); w++) ;
3348 if (!w || !*w || !strchr(";|}", *w)) /* an advisory hack only... */
3349 warn("%s (...) interpreted as function",name);
3351 while (s < bufend && isSPACE(*s))
3355 while (s < bufend && isSPACE(*s))
3357 if (isIDFIRST(*s)) {
3361 while (s < bufend && isSPACE(*s))
3366 kw = keyword(w, s - w);
3370 croak("No comma allowed after %s", what);
3376 scan_word(s, dest, allow_package, slp)
3382 register char *d = dest;
3386 else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
3391 else if (*s == ':' && s[1] == ':' && allow_package && isIDFIRST(s[2])) {
3404 scan_ident(s,send,dest,ck_uni)
3406 register char *send;
3413 if (lex_brackets == 0)
3425 else if (*s == '\'' && isIDFIRST(s[1])) {
3430 else if (*s == ':' && s[1] == ':' && isIDFIRST(s[2])) {
3441 if (lex_state != LEX_NORMAL)
3442 lex_state = LEX_INTERPENDMAYBE;
3446 (*s == '$' && s[1] && (isALPHA(s[1]) || strchr("$_{", s[1]))))
3457 if (*d == '^' && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
3461 if (isALPHA(*d) || *d == '_') {
3466 if (*s == '[' || *s == '{') {
3468 croak("Can't use delimiter brackets within expression");
3469 lex_fakebrack = TRUE;
3477 if (lex_state == LEX_INTERPNORMAL && !lex_brackets)
3478 lex_state = LEX_INTERPEND;
3481 s = bracket; /* let the parser handle it */
3485 else if (lex_state == LEX_INTERPNORMAL && !lex_brackets && !intuit_more(s))
3486 lex_state = LEX_INTERPEND;
3491 scan_prefix(pm,string,len)
3496 register SV *tmpstr;
3500 char *origstring = string;
3502 if (ninstr(string, string+len, vert, vert+1))
3506 tmpstr = NEWSV(86,len);
3507 sv_upgrade(tmpstr, SVt_PVBM);
3508 sv_setpvn(tmpstr,string,len);
3511 BmUSEFUL(tmpstr) = 100;
3512 for (d=t; d < e; ) {
3520 case '.': case '[': case '$': case '(': case ')': case '|': case '+':
3525 if (d[1] && strchr("wWbB0123456789sSdDlLuUExc",d[1])) {
3529 Move(d+1,d,e-d,char);
3554 if (d[1] == '*' || (d[1] == '{' && d[2] == '0') || d[1] == '?') {
3562 SvREFCNT_dec(tmpstr);
3566 SvCUR_set(tmpstr, d - t);
3568 pm->op_pmflags |= PMf_ALL;
3569 if (*origstring != '^')
3570 pm->op_pmflags |= PMf_SCANFIRST;
3571 pm->op_pmshort = tmpstr;
3572 pm->op_pmslen = d - t;
3582 multi_start = curcop->cop_line;
3584 s = scan_str(start);
3587 SvREFCNT_dec(lex_stuff);
3589 croak("Search pattern not terminated");
3591 pm = (PMOP*)newPMOP(OP_MATCH, 0);
3593 pm->op_pmflags |= PMf_ONCE;
3595 while (*s == 'i' || *s == 'o' || *s == 'g') {
3599 pm->op_pmflags |= PMf_FOLD;
3603 pm->op_pmflags |= PMf_KEEP;
3607 pm->op_pmflags |= PMf_GLOBAL;
3612 yylval.ival = OP_MATCH;
3620 register char *s = start;
3624 multi_start = curcop->cop_line;
3625 yylval.ival = OP_NULL;
3631 SvREFCNT_dec(lex_stuff);
3633 croak("Substitution pattern not terminated");
3636 if (s[-1] == *start)
3642 SvREFCNT_dec(lex_stuff);
3645 SvREFCNT_dec(lex_repl);
3647 croak("Substitution replacement not terminated");
3650 pm = (PMOP*)newPMOP(OP_SUBST, 0);
3651 while (*s == 'g' || *s == 'i' || *s == 'e' || *s == 'o') {
3658 pm->op_pmflags |= PMf_GLOBAL;
3663 pm->op_pmflags |= PMf_FOLD;
3667 pm->op_pmflags |= PMf_KEEP;
3673 pm->op_pmflags |= PMf_EVAL;
3674 repl = newSVpv("",0);
3676 sv_catpvn(repl, "eval ", 5);
3677 sv_catpvn(repl, "{ ", 2);
3678 sv_catsv(repl, lex_repl);
3679 sv_catpvn(repl, " };", 2);
3680 SvCOMPILED_on(repl);
3681 SvREFCNT_dec(lex_repl);
3686 yylval.ival = OP_SUBST;
3694 if (!pm->op_pmshort && pm->op_pmregexp->regstart &&
3695 (!pm->op_pmregexp->regmust || pm->op_pmregexp->reganch & ROPT_ANCH)
3697 if (!(pm->op_pmregexp->reganch & ROPT_ANCH))
3698 pm->op_pmflags |= PMf_SCANFIRST;
3699 else if (pm->op_pmflags & PMf_FOLD)
3701 pm->op_pmshort = SvREFCNT_inc(pm->op_pmregexp->regstart);
3703 else if (pm->op_pmregexp->regmust) {/* is there a better short-circuit? */
3704 if (pm->op_pmshort &&
3705 sv_eq(pm->op_pmshort,pm->op_pmregexp->regmust))
3707 if (pm->op_pmflags & PMf_SCANFIRST) {
3708 SvREFCNT_dec(pm->op_pmshort);
3709 pm->op_pmshort = Nullsv;
3712 SvREFCNT_dec(pm->op_pmregexp->regmust);
3713 pm->op_pmregexp->regmust = Nullsv;
3717 if (!pm->op_pmshort || /* promote the better string */
3718 ((pm->op_pmflags & PMf_SCANFIRST) &&
3719 (SvCUR(pm->op_pmshort) < SvCUR(pm->op_pmregexp->regmust)) )){
3720 SvREFCNT_dec(pm->op_pmshort); /* ok if null */
3721 pm->op_pmshort = pm->op_pmregexp->regmust;
3722 pm->op_pmregexp->regmust = Nullsv;
3723 pm->op_pmflags |= PMf_SCANFIRST;
3732 register char *s = start;
3739 yylval.ival = OP_NULL;
3744 SvREFCNT_dec(lex_stuff);
3746 croak("Translation pattern not terminated");
3748 if (s[-1] == *start)
3754 SvREFCNT_dec(lex_stuff);
3757 SvREFCNT_dec(lex_repl);
3759 croak("Translation replacement not terminated");
3762 New(803,tbl,256,short);
3763 op = newPVOP(OP_TRANS, 0, (char*)tbl);
3765 complement = delete = squash = 0;
3766 while (*s == 'c' || *s == 'd' || *s == 's') {
3768 complement = OPpTRANS_COMPLEMENT;
3770 delete = OPpTRANS_DELETE;
3772 squash = OPpTRANS_SQUASH;
3775 op->op_private = delete|squash|complement;
3778 yylval.ival = OP_TRANS;
3787 I32 op_type = OP_SCALAR;
3797 if (*s && strchr("`'\"",*s)) {
3799 s = cpytill(d,s,bufend,term,&len);
3811 } /* assuming tokenbuf won't clobber */
3816 if (rsfp || !(d=ninstr(s,bufend,d,d+1)))
3817 herewas = newSVpv(s,bufend-s);
3819 s--, herewas = newSVpv(s,d-s);
3820 s += SvCUR(herewas);
3824 op_type = OP_BACKTICK;
3827 multi_start = curcop->cop_line;
3828 multi_open = multi_close = '<';
3829 tmpstr = NEWSV(87,80);
3833 while (s < bufend &&
3834 (*s != term || bcmp(s,tokenbuf,len) != 0) ) {
3839 curcop->cop_line = multi_start;
3840 missingterm(tokenbuf);
3842 sv_setpvn(tmpstr,d+1,s-d);
3844 sv_catpvn(herewas,s,bufend-s);
3845 sv_setsv(linestr,herewas);
3846 oldoldbufptr = oldbufptr = bufptr = s = SvPVX(linestr);
3847 bufend = SvPVX(linestr) + SvCUR(linestr);
3850 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
3851 while (s >= bufend) { /* multiple line string? */
3853 !(oldoldbufptr = oldbufptr = s = sv_gets(linestr, rsfp, 0))) {
3854 curcop->cop_line = multi_start;
3855 missingterm(tokenbuf);
3858 if (perldb && curstash != debstash) {
3859 SV *sv = NEWSV(88,0);
3861 sv_upgrade(sv, SVt_PVMG);
3862 sv_setsv(sv,linestr);
3863 av_store(GvAV(curcop->cop_filegv),
3864 (I32)curcop->cop_line,sv);
3866 bufend = SvPVX(linestr) + SvCUR(linestr);
3867 if (*s == term && bcmp(s,tokenbuf,len) == 0) {
3870 sv_catsv(linestr,herewas);
3871 bufend = SvPVX(linestr) + SvCUR(linestr);
3875 sv_catsv(tmpstr,linestr);
3878 multi_end = curcop->cop_line;
3880 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
3881 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
3882 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
3884 SvREFCNT_dec(herewas);
3886 yylval.ival = op_type;
3891 scan_inputsymbol(start)
3894 register char *s = start;
3899 s = cpytill(d, s+1, bufend, '>', &len);
3903 croak("Unterminated <> operator");
3906 while (*d && (isALNUM(*d) || *d == '\''))
3908 if (d - tokenbuf != len) {
3909 yylval.ival = OP_GLOB;
3911 s = scan_str(start);
3913 croak("Glob not terminated");
3919 (void)strcpy(d,"ARGV");
3921 GV *gv = gv_fetchpv(d+1,TRUE);
3922 lex_op = (OP*)newUNOP(OP_READLINE, 0,
3923 newUNOP(OP_RV2GV, 0,
3924 newUNOP(OP_RV2SV, 0,
3925 newGVOP(OP_GV, 0, gv))));
3926 yylval.ival = OP_NULL;
3931 GV *gv = gv_fetchpv(d,TRUE);
3933 if (strEQ(d,"ARGV")) {
3935 IoFLAGS(io) |= IOf_ARGV|IOf_START;
3937 lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
3938 yylval.ival = OP_NULL;
3950 register char *s = start;
3951 register char term = *s;
3956 multi_start = curcop->cop_line;
3958 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
3963 sv_upgrade(sv, SVt_PVIV);
3965 SvPOK_only(sv); /* validate pointer */
3968 SvGROW(sv, SvCUR(sv) + (bufend - s) + 1);
3969 to = SvPVX(sv)+SvCUR(sv);
3970 if (multi_open == multi_close) {
3971 for (; s < bufend; s++,to++) {
3972 if (*s == '\n' && !rsfp)
3974 if (*s == '\\' && s+1 < bufend && term != '\\')
3976 else if (*s == term)
3982 for (; s < bufend; s++,to++) {
3983 if (*s == '\n' && !rsfp)
3985 if (*s == '\\' && s+1 < bufend && term != '\\')
3987 else if (*s == term && --brackets <= 0)
3989 else if (*s == multi_open)
3995 SvCUR_set(sv, to - SvPVX(sv));
3997 if (s < bufend) break; /* string ends on this line? */
4000 !(oldoldbufptr = oldbufptr = s = sv_gets(linestr, rsfp, 0))) {
4001 curcop->cop_line = multi_start;
4005 if (perldb && curstash != debstash) {
4006 SV *sv = NEWSV(88,0);
4008 sv_upgrade(sv, SVt_PVMG);
4009 sv_setsv(sv,linestr);
4010 av_store(GvAV(curcop->cop_filegv),
4011 (I32)curcop->cop_line, sv);
4013 bufend = SvPVX(linestr) + SvCUR(linestr);
4015 multi_end = curcop->cop_line;
4017 if (SvCUR(sv) + 5 < SvLEN(sv)) {
4018 SvLEN_set(sv, SvCUR(sv) + 1);
4019 Renew(SvPVX(sv), SvLEN(sv), char);
4032 register char *s = start;
4042 croak("panic: scan_num");
4052 else if (s[1] == '.')
4066 yyerror("Illegal octal digit");
4068 case '0': case '1': case '2': case '3': case '4':
4069 case '5': case '6': case '7':
4073 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
4074 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
4078 i += (*s++ & 7) + 9;
4085 if (tryi32 == i && tryi32 >= 0)
4086 sv_setiv(sv,tryi32);
4088 sv_setnv(sv,(double)i);
4091 case '1': case '2': case '3': case '4': case '5':
4092 case '6': case '7': case '8': case '9': case '.':
4096 while (isDIGIT(*s) || *s == '_') {
4098 if (dowarn && lastub && s - lastub != 3)
4099 warn("Misplaced _ in number");
4105 if (dowarn && lastub && s - lastub != 3)
4106 warn("Misplaced _ in number");
4107 if (*s == '.' && s[1] != '.') {
4110 while (isDIGIT(*s) || *s == '_') {
4117 if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
4120 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
4121 if (*s == '+' || *s == '-')
4128 value = atof(tokenbuf);
4129 tryi32 = I_32(value);
4130 if (!floatit && (double)tryi32 == value)
4131 sv_setiv(sv,tryi32);
4137 yylval.opval = newSVOP(OP_CONST, 0, sv);
4148 SV *stuff = newSV(0);
4149 bool needargs = FALSE;
4154 for (t = s+1; *t == ' ' || *t == '\t'; t++) ;
4158 if (in_eval && !rsfp) {
4159 eol = strchr(s,'\n');
4164 eol = bufend = SvPVX(linestr) + SvCUR(linestr);
4166 sv_catpvn(stuff, s, eol-s);
4168 if (*s == '@' || *s == '^') {
4177 s = sv_gets(linestr, rsfp, 0);
4178 oldoldbufptr = oldbufptr = bufptr = SvPVX(linestr);
4181 yyerror("Format not terminated");
4190 nextval[nexttoke].ival = 0;
4195 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
4197 nextval[nexttoke].ival = OP_FORMLINE;
4201 SvREFCNT_dec(stuff);
4213 cshlen = strlen(cshname);
4220 int oldsavestack_ix = savestack_ix;
4227 SAVESPTR(comppad_name);
4228 SAVEINT(comppad_name_fill);
4229 SAVEINT(min_intro_pending);
4230 SAVEINT(max_intro_pending);
4232 comppad_name = newAV();
4233 comppad_name_fill = 0;
4234 min_intro_pending = 0;
4235 av_push(comppad, Nullsv);
4236 curpad = AvARRAY(comppad);
4239 subline = curcop->cop_line;
4240 return oldsavestack_ix;
4257 char *tname = tmpbuf;
4259 if (bufptr > oldoldbufptr && bufptr - oldoldbufptr < 200 &&
4260 oldoldbufptr != oldbufptr && oldbufptr != bufptr) {
4261 while (isSPACE(*oldoldbufptr))
4263 cpy7bit(tmp2buf, oldoldbufptr, bufptr - oldoldbufptr);
4264 sprintf(tname,"near \"%s\"",tmp2buf);
4266 else if (bufptr > oldbufptr && bufptr - oldbufptr < 200 &&
4267 oldbufptr != bufptr) {
4268 while (isSPACE(*oldbufptr))
4270 cpy7bit(tmp2buf, oldbufptr, bufptr - oldbufptr);
4271 sprintf(tname,"near \"%s\"",tmp2buf);
4273 else if (yychar > 255)
4274 tname = "next token ???";
4275 else if (!yychar || (yychar == ';' && !rsfp))
4276 (void)strcpy(tname,"at EOF");
4277 else if ((yychar & 127) == 127) {
4278 if (lex_state == LEX_NORMAL ||
4279 (lex_state == LEX_KNOWNEXT && lex_defer == LEX_NORMAL))
4280 (void)strcpy(tname,"at end of line");
4282 (void)strcpy(tname,"at end of string");
4284 else if (yychar < 32)
4285 (void)sprintf(tname,"next char ^%c",yychar+64);
4287 (void)sprintf(tname,"next char %c",yychar);
4288 (void)sprintf(buf, "%s at %s line %d, %s\n",
4289 s,SvPVX(GvSV(curcop->cop_filegv)),curcop->cop_line,tname);
4290 if (curcop->cop_line == multi_end && multi_start < multi_end)
4291 sprintf(buf+strlen(buf),
4292 " (Might be a runaway multi-line %c%c string starting on line %d)\n",
4293 multi_open,multi_close,multi_start);
4295 sv_catpv(GvSV(gv_fetchpv("@",TRUE)),buf);
4298 if (++error_count >= 10)
4299 croak("%s has too many errors.\n",
4300 SvPVX(GvSV(curcop->cop_filegv)));