3 * Copyright (c) 1991-1997, 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.
11 * "It all comes from here, the stench and the peril." --Frodo
17 static void check_uni _((void));
18 static void force_next _((I32 type));
19 static char *force_version _((char *start));
20 static char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
21 static SV *q _((SV *sv));
22 static char *scan_const _((char *start));
23 static char *scan_formline _((char *s));
24 static char *scan_heredoc _((char *s));
25 static char *scan_ident _((char *s, char *send, char *dest, STRLEN destlen,
27 static char *scan_inputsymbol _((char *start));
28 static char *scan_pat _((char *start));
29 static char *scan_str _((char *start));
30 static char *scan_subst _((char *start));
31 static char *scan_trans _((char *start));
32 static char *scan_word _((char *s, char *dest, STRLEN destlen,
33 int allow_package, STRLEN *slp));
34 static char *skipspace _((char *s));
35 static void checkcomma _((char *s, char *name, char *what));
36 static void force_ident _((char *s, int kind));
37 static void incline _((char *s));
38 static int intuit_method _((char *s, GV *gv));
39 static int intuit_more _((char *s));
40 static I32 lop _((I32 f, expectation x, char *s));
41 static void missingterm _((char *s));
42 static void no_op _((char *what, char *s));
43 static void set_csh _((void));
44 static I32 sublex_done _((void));
45 static I32 sublex_push _((void));
46 static I32 sublex_start _((void));
48 static int uni _((I32 f, char *s));
50 static char * filter_gets _((SV *sv, PerlIO *fp, STRLEN append));
51 static void restore_rsfp _((void *f));
52 static void restore_expect _((void *e));
53 static void restore_lex_expect _((void *e));
55 static char ident_too_long[] = "Identifier too long";
57 static char *linestart; /* beg. of most recently read line */
59 static char pending_ident; /* pending identifier lookup */
62 I32 super_state; /* lexer state to save */
63 I32 sub_inwhat; /* "lex_inwhat" to use */
64 OP *sub_op; /* "lex_op" to use */
67 /* The following are arranged oddly so that the guard on the switch statement
68 * can get by with a single comparison (if the compiler is smart enough).
71 /* #define LEX_NOTPARSING 11 is done in perl.h. */
74 #define LEX_INTERPNORMAL 9
75 #define LEX_INTERPCASEMOD 8
76 #define LEX_INTERPPUSH 7
77 #define LEX_INTERPSTART 6
78 #define LEX_INTERPEND 5
79 #define LEX_INTERPENDMAYBE 4
80 #define LEX_INTERPCONCAT 3
81 #define LEX_INTERPCONST 2
82 #define LEX_FORMLINE 1
83 #define LEX_KNOWNEXT 0
92 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
94 # include <unistd.h> /* Needed for execv() */
102 #include "keywords.h"
107 #define CLINE (copline = (curcop->cop_line < copline ? curcop->cop_line : copline))
109 #define TOKEN(retval) return (bufptr = s,(int)retval)
110 #define OPERATOR(retval) return (expect = XTERM,bufptr = s,(int)retval)
111 #define AOPERATOR(retval) return ao((expect = XTERM,bufptr = s,(int)retval))
112 #define PREBLOCK(retval) return (expect = XBLOCK,bufptr = s,(int)retval)
113 #define PRETERMBLOCK(retval) return (expect = XTERMBLOCK,bufptr = s,(int)retval)
114 #define PREREF(retval) return (expect = XREF,bufptr = s,(int)retval)
115 #define TERM(retval) return (CLINE, expect = XOPERATOR,bufptr = s,(int)retval)
116 #define LOOPX(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LOOPEX)
117 #define FTST(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)UNIOP)
118 #define FUN0(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC0)
119 #define FUN1(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC1)
120 #define BOop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITOROP))
121 #define BAop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITANDOP))
122 #define SHop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)SHIFTOP))
123 #define PWop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)POWOP))
124 #define PMop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)MATCHOP)
125 #define Aop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)ADDOP))
126 #define Mop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)MULOP))
127 #define Eop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)EQOP)
128 #define Rop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)RELOP)
130 /* This bit of chicanery makes a unary function followed by
131 * a parenthesis into a function with one argument, highest precedence.
133 #define UNI(f) return(yylval.ival = f, \
136 last_uni = oldbufptr, \
138 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
140 #define UNIBRACK(f) return(yylval.ival = f, \
142 last_uni = oldbufptr, \
143 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
145 /* grandfather return to old style */
146 #define OLDLOP(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LSTOP)
151 if (*bufptr == '=') {
153 if (toketype == ANDAND)
154 yylval.ival = OP_ANDASSIGN;
155 else if (toketype == OROR)
156 yylval.ival = OP_ORASSIGN;
163 no_op(char *what, char *s)
165 char *oldbp = bufptr;
166 bool is_first = (oldbufptr == linestart);
169 yywarn(form("%s found where operator expected", what));
171 warn("\t(Missing semicolon on previous line?)\n");
172 else if (oldoldbufptr && isIDFIRST(*oldoldbufptr)) {
174 for (t = oldoldbufptr; *t && (isALNUM(*t) || *t == ':'); t++) ;
175 if (t < bufptr && isSPACE(*t))
176 warn("\t(Do you need to predeclare %.*s?)\n",
177 t - oldoldbufptr, oldoldbufptr);
181 warn("\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
191 char *nl = strrchr(s,'\n');
195 else if (multi_close < 32 || multi_close == 127) {
197 tmpbuf[1] = toCTRL(multi_close);
203 *tmpbuf = multi_close;
207 q = strchr(s,'"') ? '\'' : '"';
208 croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
215 warn("Use of %s is deprecated", s);
221 deprecate("comma-less variable list");
227 win32_textfilter(int idx, SV *sv, int maxlen)
229 I32 count = FILTER_READ(idx+1, sv, maxlen);
230 if (count > 0 && !maxlen)
231 win32_strip_return(sv);
245 SAVEI32(lex_brackets);
246 SAVEI32(lex_fakebrack);
247 SAVEI32(lex_casemods);
252 SAVEI16(curcop->cop_line);
256 SAVEPPTR(oldoldbufptr);
259 SAVEPPTR(lex_brackstack);
260 SAVEPPTR(lex_casestack);
261 SAVEDESTRUCTOR(restore_rsfp, rsfp);
265 SAVEDESTRUCTOR(restore_expect, tokenbuf + expect); /* encode as pointer */
266 SAVEDESTRUCTOR(restore_lex_expect, tokenbuf + expect);
268 lex_state = LEX_NORMAL;
273 New(899, lex_brackstack, 120, char);
274 New(899, lex_casestack, 12, char);
275 SAVEFREEPV(lex_brackstack);
276 SAVEFREEPV(lex_casestack);
278 *lex_casestack = '\0';
286 if (SvREADONLY(linestr))
287 linestr = sv_2mortal(newSVsv(linestr));
288 s = SvPV(linestr, len);
289 if (len && s[len-1] != ';') {
290 if (!(SvFLAGS(linestr) & SVs_TEMP))
291 linestr = sv_2mortal(newSVsv(linestr));
292 sv_catpvn(linestr, "\n;", 2);
295 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
296 bufend = bufptr + SvCUR(linestr);
298 rs = newSVpv("\n", 1);
309 restore_rsfp(void *f)
311 PerlIO *fp = (PerlIO*)f;
313 if (rsfp == PerlIO_stdin())
314 PerlIO_clearerr(rsfp);
315 else if (rsfp && (rsfp != fp))
324 /* a safe way to store a small integer in a pointer */
325 expect = (expectation)((char *)e - tokenbuf);
329 restore_lex_expect(e)
332 /* a safe way to store a small integer in a pointer */
333 lex_expect = (expectation)((char *)e - tokenbuf);
348 while (*s == ' ' || *s == '\t') s++;
349 if (strnEQ(s, "line ", 5)) {
358 while (*s == ' ' || *s == '\t')
360 if (*s == '"' && (t = strchr(s+1, '"')))
364 return; /* false alarm */
365 for (t = s; !isSPACE(*t); t++) ;
370 curcop->cop_filegv = gv_fetchfile(s);
372 curcop->cop_filegv = gv_fetchfile(origfilename);
374 curcop->cop_line = atoi(n)-1;
378 skipspace(register char *s)
381 if (lex_formbrack && lex_brackets <= lex_formbrack) {
382 while (s < bufend && (*s == ' ' || *s == '\t'))
388 while (s < bufend && isSPACE(*s))
390 if (s < bufend && *s == '#') {
391 while (s < bufend && *s != '\n')
396 if (s < bufend || !rsfp || lex_state != LEX_NORMAL)
398 if ((s = filter_gets(linestr, rsfp, (prevlen = SvCUR(linestr)))) == Nullch) {
399 if (minus_n || minus_p) {
400 sv_setpv(linestr,minus_p ?
401 ";}continue{print or die qq(-p destination: $!\\n)" :
403 sv_catpv(linestr,";}");
404 minus_n = minus_p = 0;
407 sv_setpv(linestr,";");
408 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
409 bufend = SvPVX(linestr) + SvCUR(linestr);
410 if (preprocess && !in_eval)
411 (void)PerlProc_pclose(rsfp);
412 else if ((PerlIO*)rsfp == PerlIO_stdin())
413 PerlIO_clearerr(rsfp);
415 (void)PerlIO_close(rsfp);
421 linestart = bufptr = s + prevlen;
422 bufend = s + SvCUR(linestr);
425 if (PERLDB_LINE && curstash != debstash) {
426 SV *sv = NEWSV(85,0);
428 sv_upgrade(sv, SVt_PVMG);
429 sv_setpvn(sv,bufptr,bufend-bufptr);
430 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
441 if (oldoldbufptr != last_uni)
443 while (isSPACE(*last_uni))
445 for (s = last_uni; isALNUM(*s) || *s == '-'; s++) ;
446 if ((t = strchr(s, '(')) && t < bufptr)
450 warn("Warning: Use of \"%s\" without parens is ambiguous", last_uni);
457 #define UNI(f) return uni(f,s)
465 last_uni = oldbufptr;
476 #endif /* CRIPPLED_CC */
478 #define LOP(f,x) return lop(f,x,s)
481 lop(I32 f, expectation x, char *s)
488 last_lop = oldbufptr;
504 nexttype[nexttoke] = type;
506 if (lex_state != LEX_KNOWNEXT) {
507 lex_defer = lex_state;
509 lex_state = LEX_KNOWNEXT;
514 force_word(register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
519 start = skipspace(start);
522 (allow_pack && *s == ':') ||
523 (allow_initial_tick && *s == '\'') )
525 s = scan_word(s, tokenbuf, sizeof tokenbuf, allow_pack, &len);
526 if (check_keyword && keyword(tokenbuf, len))
528 if (token == METHOD) {
538 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(tokenbuf,0));
539 nextval[nexttoke].opval->op_private |= OPpCONST_BARE;
546 force_ident(register char *s, int kind)
549 OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
550 nextval[nexttoke].opval = o;
553 dTHR; /* just for in_eval */
554 o->op_private = OPpCONST_ENTERED;
555 /* XXX see note in pp_entereval() for why we forgo typo
556 warnings if the symbol must be introduced in an eval.
558 gv_fetchpv(s, in_eval ? GV_ADDMULTI : TRUE,
559 kind == '$' ? SVt_PV :
560 kind == '@' ? SVt_PVAV :
561 kind == '%' ? SVt_PVHV :
569 force_version(char *s)
571 OP *version = Nullop;
575 /* default VERSION number -- GBARR */
580 for( d=s, c = 1; isDIGIT(*d) || *d == '_' || (*d == '.' && c--); d++);
581 if((*d == ';' || isSPACE(*d)) && *(skipspace(d)) != ',') {
583 /* real VERSION number -- GBARR */
584 version = yylval.opval;
588 /* NOTE: The parser sees the package name and the VERSION swapped */
589 nextval[nexttoke].opval = version;
606 s = SvPV_force(sv, len);
610 while (s < send && *s != '\\')
617 if (s + 1 < send && (s[1] == '\\'))
618 s++; /* all that, just for this */
623 SvCUR_set(sv, d - SvPVX(sv));
631 register I32 op_type = yylval.ival;
633 if (op_type == OP_NULL) {
634 yylval.opval = lex_op;
638 if (op_type == OP_CONST || op_type == OP_READLINE) {
639 SV *sv = q(lex_stuff);
641 char *p = SvPV(sv, len);
642 yylval.opval = (OP*)newSVOP(op_type, 0, newSVpv(p, len));
648 sublex_info.super_state = lex_state;
649 sublex_info.sub_inwhat = op_type;
650 sublex_info.sub_op = lex_op;
651 lex_state = LEX_INTERPPUSH;
655 yylval.opval = lex_op;
669 lex_state = sublex_info.super_state;
671 SAVEI32(lex_brackets);
672 SAVEI32(lex_fakebrack);
673 SAVEI32(lex_casemods);
678 SAVEI16(curcop->cop_line);
681 SAVEPPTR(oldoldbufptr);
684 SAVEPPTR(lex_brackstack);
685 SAVEPPTR(lex_casestack);
690 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
691 bufend += SvCUR(linestr);
697 New(899, lex_brackstack, 120, char);
698 New(899, lex_casestack, 12, char);
699 SAVEFREEPV(lex_brackstack);
700 SAVEFREEPV(lex_casestack);
702 *lex_casestack = '\0';
704 lex_state = LEX_INTERPCONCAT;
705 curcop->cop_line = multi_start;
707 lex_inwhat = sublex_info.sub_inwhat;
708 if (lex_inwhat == OP_MATCH || lex_inwhat == OP_SUBST)
709 lex_inpat = sublex_info.sub_op;
721 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
725 if (lex_casemods) { /* oops, we've got some unbalanced parens */
726 lex_state = LEX_INTERPCASEMOD;
730 /* Is there a right-hand side to take care of? */
731 if (lex_repl && (lex_inwhat == OP_SUBST || lex_inwhat == OP_TRANS)) {
734 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
735 bufend += SvCUR(linestr);
741 *lex_casestack = '\0';
743 if (SvCOMPILED(lex_repl)) {
744 lex_state = LEX_INTERPNORMAL;
748 lex_state = LEX_INTERPCONCAT;
754 bufend = SvPVX(linestr);
755 bufend += SvCUR(linestr);
764 Extracts a pattern, double-quoted string, or transliteration. This
767 It looks at lex_inwhat and lex_inpat to find out whether it's
768 processing a pattern (lex_inpat is true), a transliteration
769 (lex_inwhat & OP_TRANS is true), or a double-quoted string.
773 double-quoted style: \r and \n
774 regexp special ones: \D \s
776 backrefs: \1 (deprecated in substitution replacements)
777 case and quoting: \U \Q \E
778 stops on @ and $, but not for $ as tail anchor
781 characters are VERY literal, except for - not at the start or end
782 of the string, which indicates a range. scan_const expands the
783 range to the full set of intermediate characters.
785 In double-quoted strings:
787 double-quoted style: \r and \n
789 backrefs: \1 (deprecated)
790 case and quoting: \U \Q \E
793 scan_const does *not* construct ops to handle interpolated strings.
794 It stops processing as soon as it finds an embedded $ or @ variable
795 and leaves it to the caller to work out what's going on.
797 @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @:foo.
799 $ in pattern could be $foo or could be tail anchor. Assumption:
800 it's a tail anchor if $ is the last thing in the string, or if it's
801 followed by one of ")| \n\t"
803 \1 (backreferences) are turned into $1
805 The structure of the code is
806 while (there's a character to process) {
807 handle transliteration ranges
809 skip # initiated comments in //x patterns
810 check for embedded @foo
811 check for embedded scalars
813 leave intact backslashes from leave (below)
814 deprecate \1 in strings and sub replacements
815 handle string-changing backslashes \l \U \Q \E, etc.
816 switch (what was escaped) {
817 handle - in a transliteration (becomes a literal -)
818 handle \132 octal characters
819 handle 0x15 hex characters
820 handle \cV (control V)
821 handle printf backslashes (\f, \r, \n, etc)
824 } (end while character to read)
829 scan_const(char *start)
831 register char *send = bufend; /* end of the constant */
832 SV *sv = NEWSV(93, send - start); /* sv for the constant */
833 register char *s = start; /* start of the constant */
834 register char *d = SvPVX(sv); /* destination for copies */
835 bool dorange = FALSE; /* are we in a translit range? */
839 leave is the set of acceptably-backslashed characters.
841 I do *not* understand why there's the double hook here.
845 ? "\\.^$@AGZdDwWsSbB+*?|()-nrtfeaxc0123456789[{]} \t\n\r\f\v#"
846 : (lex_inwhat & OP_TRANS)
850 while (s < send || dorange) {
851 /* get transliterations out of the way (they're most literal) */
852 if (lex_inwhat == OP_TRANS) {
853 /* expand a range A-Z to the full set of characters. AIE! */
855 I32 i; /* current expanded character */
856 I32 max; /* last character in range */
858 i = d - SvPVX(sv); /* remember current offset */
859 SvGROW(sv, SvLEN(sv) + 256); /* expand the sv -- there'll never be more'n 256 chars in a range for it to grow by */
860 d = SvPVX(sv) + i; /* restore d after the grow potentially has changed the ptr */
861 d -= 2; /* eat the first char and the - */
863 max = (U8)d[1]; /* last char in range */
865 for (i = (U8)*d; i <= max; i++)
868 /* mark the range as done, and continue */
873 /* range begins (ignore - as first or last char) */
874 else if (*s == '-' && s+1 < send && s != start) {
880 /* if we get here, we're not doing a transliteration */
882 /* skip for regexp comments /(?#comment)/ */
883 else if (*s == '(' && lex_inpat && s[1] == '?') {
885 while (s < send && *s != ')')
887 } else if (s[2] == '{') { /* This should march regcomp.c */
889 char *regparse = s + 3;
892 while (count && (c = *regparse)) {
893 if (c == '\\' && regparse[1])
901 if (*regparse == ')')
904 yyerror("Sequence (?{...}) not terminated or not {}-balanced");
905 while (s < regparse && *s != ')')
910 /* likewise skip #-initiated comments in //x patterns */
911 else if (*s == '#' && lex_inpat &&
912 ((PMOP*)lex_inpat)->op_pmflags & PMf_EXTENDED) {
913 while (s+1 < send && *s != '\n')
917 /* check for embedded arrays (@foo, @:foo, @'foo, @{foo}, @$foo) */
918 else if (*s == '@' && s[1] && (isALNUM(s[1]) || strchr(":'{$", s[1])))
921 /* check for embedded scalars. only stop if we're sure it's a
924 else if (*s == '$') {
925 if (!lex_inpat) /* not a regexp, so $ must be var */
927 if (s + 1 < send && !strchr("()| \n\t", s[1]))
928 break; /* in regexp, $ might be tail anchor */
932 if (*s == '\\' && s+1 < send) {
935 /* some backslashes we leave behind */
936 if (*s && strchr(leaveit, *s)) {
942 /* deprecate \1 in strings and substitution replacements */
943 if (lex_inwhat == OP_SUBST && !lex_inpat &&
944 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
947 warn("\\%c better written as $%c", *s, *s);
952 /* string-change backslash escapes */
953 if (lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
958 /* if we get here, it's either a quoted -, or a digit */
961 /* quoted - in transliterations */
963 if (lex_inwhat == OP_TRANS) {
968 /* default action is to copy the quoted character */
973 /* \132 indicates an octal constant */
974 case '0': case '1': case '2': case '3':
975 case '4': case '5': case '6': case '7':
976 *d++ = scan_oct(s, 3, &len);
980 /* \x24 indicates a hex constant */
982 *d++ = scan_hex(++s, 2, &len);
986 /* \c is a control character */
993 /* printf-style backslashes, formfeeds, newlines, etc */
1019 } /* end if (backslash) */
1022 } /* while loop to process each character */
1024 /* terminate the string and set up the sv */
1026 SvCUR_set(sv, d - SvPVX(sv));
1029 /* shrink the sv if we allocated more than we used */
1030 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1031 SvLEN_set(sv, SvCUR(sv) + 1);
1032 Renew(SvPVX(sv), SvLEN(sv), char);
1037 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1043 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
1045 intuit_more(register char *s)
1049 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1051 if (*s != '{' && *s != '[')
1056 /* In a pattern, so maybe we have {n,m}. */
1073 /* On the other hand, maybe we have a character class */
1076 if (*s == ']' || *s == '^')
1079 int weight = 2; /* let's weigh the evidence */
1081 unsigned char un_char = 0, last_un_char;
1082 char *send = strchr(s,']');
1083 char tmpbuf[sizeof tokenbuf * 4];
1085 if (!send) /* has to be an expression */
1088 Zero(seen,256,char);
1091 else if (isDIGIT(*s)) {
1093 if (isDIGIT(s[1]) && s[2] == ']')
1099 for (; s < send; s++) {
1100 last_un_char = un_char;
1101 un_char = (unsigned char)*s;
1106 weight -= seen[un_char] * 10;
1107 if (isALNUM(s[1])) {
1108 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
1109 if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
1114 else if (*s == '$' && s[1] &&
1115 strchr("[#!%*<>()-=",s[1])) {
1116 if (/*{*/ strchr("])} =",s[2]))
1125 if (strchr("wds]",s[1]))
1127 else if (seen['\''] || seen['"'])
1129 else if (strchr("rnftbxcav",s[1]))
1131 else if (isDIGIT(s[1])) {
1133 while (s[1] && isDIGIT(s[1]))
1143 if (strchr("aA01! ",last_un_char))
1145 if (strchr("zZ79~",s[1]))
1149 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
1150 isALPHA(*s) && s[1] && isALPHA(s[1])) {
1155 if (keyword(tmpbuf, d - tmpbuf))
1158 if (un_char == last_un_char + 1)
1160 weight -= seen[un_char];
1165 if (weight >= 0) /* probably a character class */
1173 intuit_method(char *start, GV *gv)
1175 char *s = start + (*start == '$');
1176 char tmpbuf[sizeof tokenbuf];
1184 if ((cv = GvCVu(gv))) {
1185 char *proto = SvPVX(cv);
1195 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
1196 if (*start == '$') {
1197 if (gv || last_lop_op == OP_PRINT || isUPPER(*tokenbuf))
1202 return *s == '(' ? FUNCMETH : METHOD;
1204 if (!keyword(tmpbuf, len)) {
1205 indirgv = gv_fetchpv(tmpbuf,FALSE, SVt_PVCV);
1206 if (indirgv && GvCVu(indirgv))
1208 /* filehandle or package name makes it a method */
1209 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
1211 if ((bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
1212 return 0; /* no assumptions -- "=>" quotes bearword */
1213 nextval[nexttoke].opval =
1214 (OP*)newSVOP(OP_CONST, 0,
1216 nextval[nexttoke].opval->op_private =
1221 return *s == '(' ? FUNCMETH : METHOD;
1231 char *pdb = PerlEnv_getenv("PERL5DB");
1235 SETERRNO(0,SS$_NORMAL);
1236 return "BEGIN { require 'perl5db.pl' }";
1242 /* Encoded script support. filter_add() effectively inserts a
1243 * 'pre-processing' function into the current source input stream.
1244 * Note that the filter function only applies to the current source file
1245 * (e.g., it will not affect files 'require'd or 'use'd by this one).
1247 * The datasv parameter (which may be NULL) can be used to pass
1248 * private data to this instance of the filter. The filter function
1249 * can recover the SV using the FILTER_DATA macro and use it to
1250 * store private buffers and state information.
1252 * The supplied datasv parameter is upgraded to a PVIO type
1253 * and the IoDIRP field is used to store the function pointer.
1254 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
1255 * private use must be set using malloc'd pointers.
1257 static int filter_debug = 0;
1260 filter_add(filter_t funcp, SV *datasv)
1262 if (!funcp){ /* temporary handy debugging hack to be deleted */
1263 filter_debug = atoi((char*)datasv);
1267 rsfp_filters = newAV();
1269 datasv = NEWSV(255,0);
1270 if (!SvUPGRADE(datasv, SVt_PVIO))
1271 die("Can't upgrade filter_add data to SVt_PVIO");
1272 IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
1274 warn("filter_add func %p (%s)", funcp, SvPV(datasv,na));
1275 av_unshift(rsfp_filters, 1);
1276 av_store(rsfp_filters, 0, datasv) ;
1281 /* Delete most recently added instance of this filter function. */
1283 filter_del(filter_t funcp)
1286 warn("filter_del func %p", funcp);
1287 if (!rsfp_filters || AvFILLp(rsfp_filters)<0)
1289 /* if filter is on top of stack (usual case) just pop it off */
1290 if (IoDIRP(FILTER_DATA(AvFILLp(rsfp_filters))) == (void*)funcp){
1291 sv_free(av_pop(rsfp_filters));
1295 /* we need to search for the correct entry and clear it */
1296 die("filter_del can only delete in reverse order (currently)");
1300 /* Invoke the n'th filter function for the current rsfp. */
1302 filter_read(int idx, SV *buf_sv, int maxlen)
1305 /* 0 = read one text line */
1312 if (idx > AvFILLp(rsfp_filters)){ /* Any more filters? */
1313 /* Provide a default input filter to make life easy. */
1314 /* Note that we append to the line. This is handy. */
1316 warn("filter_read %d: from rsfp\n", idx);
1320 int old_len = SvCUR(buf_sv) ;
1322 /* ensure buf_sv is large enough */
1323 SvGROW(buf_sv, old_len + maxlen) ;
1324 if ((len = PerlIO_read(rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
1325 if (PerlIO_error(rsfp))
1326 return -1; /* error */
1328 return 0 ; /* end of file */
1330 SvCUR_set(buf_sv, old_len + len) ;
1333 if (sv_gets(buf_sv, rsfp, SvCUR(buf_sv)) == NULL) {
1334 if (PerlIO_error(rsfp))
1335 return -1; /* error */
1337 return 0 ; /* end of file */
1340 return SvCUR(buf_sv);
1342 /* Skip this filter slot if filter has been deleted */
1343 if ( (datasv = FILTER_DATA(idx)) == &sv_undef){
1345 warn("filter_read %d: skipped (filter deleted)\n", idx);
1346 return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
1348 /* Get function pointer hidden within datasv */
1349 funcp = (filter_t)IoDIRP(datasv);
1351 warn("filter_read %d: via function %p (%s)\n",
1352 idx, funcp, SvPV(datasv,na));
1353 /* Call function. The function is expected to */
1354 /* call "FILTER_READ(idx+1, buf_sv)" first. */
1355 /* Return: <0:error, =0:eof, >0:not eof */
1356 return (*funcp)(idx, buf_sv, maxlen);
1360 filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
1363 if (!rsfp_filters) {
1364 filter_add(win32_textfilter,NULL);
1370 SvCUR_set(sv, 0); /* start with empty line */
1371 if (FILTER_READ(0, sv, 0) > 0)
1372 return ( SvPVX(sv) ) ;
1377 return (sv_gets(sv, fp, append));
1382 static char* exp_name[] =
1383 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
1386 EXT int yychar; /* last token */
1391 Works out what to call the token just pulled out of the input
1392 stream. The yacc parser takes care of taking the ops we return and
1393 stitching them into a tree.
1399 if read an identifier
1400 if we're in a my declaration
1401 croak if they tried to say my($foo::bar)
1402 build the ops for a my() declaration
1403 if it's an access to a my() variable
1404 are we in a sort block?
1405 croak if my($a); $a <=> $b
1406 build ops for access to a my() variable
1407 if in a dq string, and they've said @foo and we can't find @foo
1409 build ops for a bareword
1410 if we already built the token before, use it.
1424 /* check if there's an identifier for us to look at */
1425 if (pending_ident) {
1426 /* pit holds the identifier we read and pending_ident is reset */
1427 char pit = pending_ident;
1430 /* if we're in a my(), we can't allow dynamics here.
1431 $foo'bar has already been turned into $foo::bar, so
1432 just check for colons.
1434 if it's a legal name, the OP is a PADANY.
1437 if (strchr(tokenbuf,':'))
1438 croak(no_myglob,tokenbuf);
1440 yylval.opval = newOP(OP_PADANY, 0);
1441 yylval.opval->op_targ = pad_allocmy(tokenbuf);
1446 build the ops for accesses to a my() variable.
1448 Deny my($a) or my($b) in a sort block, *if* $a or $b is
1449 then used in a comparison. This catches most, but not
1450 all cases. For instance, it catches
1451 sort { my($a); $a <=> $b }
1453 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
1454 (although why you'd do that is anyone's guess).
1457 if (!strchr(tokenbuf,':')) {
1459 /* Check for single character per-thread SVs */
1460 if (tokenbuf[0] == '$' && tokenbuf[2] == '\0'
1461 && !isALPHA(tokenbuf[1]) /* Rule out obvious non-threadsvs */
1462 && (tmp = find_threadsv(&tokenbuf[1])) != NOT_IN_PAD)
1464 yylval.opval = newOP(OP_THREADSV, 0);
1465 yylval.opval->op_targ = tmp;
1468 #endif /* USE_THREADS */
1469 if ((tmp = pad_findmy(tokenbuf)) != NOT_IN_PAD) {
1470 /* if it's a sort block and they're naming $a or $b */
1471 if (last_lop_op == OP_SORT &&
1472 tokenbuf[0] == '$' &&
1473 (tokenbuf[1] == 'a' || tokenbuf[1] == 'b')
1476 for (d = in_eval ? oldoldbufptr : linestart;
1477 d < bufend && *d != '\n';
1480 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
1481 croak("Can't use \"my %s\" in sort comparison",
1487 yylval.opval = newOP(OP_PADANY, 0);
1488 yylval.opval->op_targ = tmp;
1494 Whine if they've said @foo in a doublequoted string,
1495 and @foo isn't a variable we can find in the symbol
1498 if (pit == '@' && lex_state != LEX_NORMAL && !lex_brackets) {
1499 GV *gv = gv_fetchpv(tokenbuf+1, FALSE, SVt_PVAV);
1500 if (!gv || ((tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
1501 yyerror(form("In string, %s now must be written as \\%s",
1502 tokenbuf, tokenbuf));
1505 /* build ops for a bareword */
1506 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf+1, 0));
1507 yylval.opval->op_private = OPpCONST_ENTERED;
1508 gv_fetchpv(tokenbuf+1, in_eval ? GV_ADDMULTI : TRUE,
1509 ((tokenbuf[0] == '$') ? SVt_PV
1510 : (tokenbuf[0] == '@') ? SVt_PVAV
1515 /* no identifier pending identification */
1517 switch (lex_state) {
1519 case LEX_NORMAL: /* Some compilers will produce faster */
1520 case LEX_INTERPNORMAL: /* code if we comment these out. */
1524 /* when we're already built the next token, just pull it out the queue */
1527 yylval = nextval[nexttoke];
1529 lex_state = lex_defer;
1530 expect = lex_expect;
1531 lex_defer = LEX_NORMAL;
1533 return(nexttype[nexttoke]);
1535 /* interpolated case modifiers like \L \U, including \Q and \E.
1536 when we get here, bufptr is at the \
1538 case LEX_INTERPCASEMOD:
1540 if (bufptr != bufend && *bufptr != '\\')
1541 croak("panic: INTERPCASEMOD");
1543 /* handle \E or end of string */
1544 if (bufptr == bufend || bufptr[1] == 'E') {
1549 oldmod = lex_casestack[--lex_casemods];
1550 lex_casestack[lex_casemods] = '\0';
1552 if (bufptr != bufend && strchr("LUQ", oldmod)) {
1554 lex_state = LEX_INTERPCONCAT;
1558 if (bufptr != bufend)
1560 lex_state = LEX_INTERPCONCAT;
1565 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
1566 tmp = *s, *s = s[2], s[2] = tmp; /* misordered... */
1567 if (strchr("LU", *s) &&
1568 (strchr(lex_casestack, 'L') || strchr(lex_casestack, 'U')))
1570 lex_casestack[--lex_casemods] = '\0';
1573 if (lex_casemods > 10) {
1574 char* newlb = Renew(lex_casestack, lex_casemods + 2, char);
1575 if (newlb != lex_casestack) {
1577 lex_casestack = newlb;
1580 lex_casestack[lex_casemods++] = *s;
1581 lex_casestack[lex_casemods] = '\0';
1582 lex_state = LEX_INTERPCONCAT;
1583 nextval[nexttoke].ival = 0;
1586 nextval[nexttoke].ival = OP_LCFIRST;
1588 nextval[nexttoke].ival = OP_UCFIRST;
1590 nextval[nexttoke].ival = OP_LC;
1592 nextval[nexttoke].ival = OP_UC;
1594 nextval[nexttoke].ival = OP_QUOTEMETA;
1596 croak("panic: yylex");
1608 case LEX_INTERPPUSH:
1609 return sublex_push();
1611 case LEX_INTERPSTART:
1612 if (bufptr == bufend)
1613 return sublex_done();
1615 lex_dojoin = (*bufptr == '@');
1616 lex_state = LEX_INTERPNORMAL;
1618 nextval[nexttoke].ival = 0;
1621 nextval[nexttoke].opval = newOP(OP_THREADSV, 0);
1622 nextval[nexttoke].opval->op_targ = find_threadsv("\"");
1623 force_next(PRIVATEREF);
1625 force_ident("\"", '$');
1626 #endif /* USE_THREADS */
1627 nextval[nexttoke].ival = 0;
1629 nextval[nexttoke].ival = 0;
1631 nextval[nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
1640 case LEX_INTERPENDMAYBE:
1641 if (intuit_more(bufptr)) {
1642 lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
1650 lex_state = LEX_INTERPCONCAT;
1654 case LEX_INTERPCONCAT:
1657 croak("panic: INTERPCONCAT");
1659 if (bufptr == bufend)
1660 return sublex_done();
1662 if (SvIVX(linestr) == '\'') {
1663 SV *sv = newSVsv(linestr);
1666 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1670 s = scan_const(bufptr);
1672 lex_state = LEX_INTERPCASEMOD;
1674 lex_state = LEX_INTERPSTART;
1678 nextval[nexttoke] = yylval;
1691 lex_state = LEX_NORMAL;
1692 s = scan_formline(bufptr);
1699 oldoldbufptr = oldbufptr;
1702 PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[expect], s);
1708 croak("Unrecognized character \\%03o", *s & 255);
1711 goto fake_eof; /* emulate EOF on ^D or ^Z */
1717 yyerror("Missing right bracket");
1721 goto retry; /* ignore stray nulls */
1724 if (!in_eval && !preambled) {
1726 sv_setpv(linestr,incl_perldb());
1728 sv_catpv(linestr,";");
1730 while(AvFILLp(preambleav) >= 0) {
1731 SV *tmpsv = av_shift(preambleav);
1732 sv_catsv(linestr, tmpsv);
1733 sv_catpv(linestr, ";");
1736 sv_free((SV*)preambleav);
1739 if (minus_n || minus_p) {
1740 sv_catpv(linestr, "LINE: while (<>) {");
1742 sv_catpv(linestr,"chomp;");
1744 GV* gv = gv_fetchpv("::F", TRUE, SVt_PVAV);
1746 GvIMPORTED_AV_on(gv);
1748 if (strchr("/'\"", *splitstr)
1749 && strchr(splitstr + 1, *splitstr))
1750 sv_catpvf(linestr, "@F=split(%s);", splitstr);
1753 s = "'~#\200\1'"; /* surely one char is unused...*/
1754 while (s[1] && strchr(splitstr, *s)) s++;
1756 sv_catpvf(linestr, "@F=split(%s%c",
1757 "q" + (delim == '\''), delim);
1758 for (s = splitstr; *s; s++) {
1760 sv_catpvn(linestr, "\\", 1);
1761 sv_catpvn(linestr, s, 1);
1763 sv_catpvf(linestr, "%c);", delim);
1767 sv_catpv(linestr,"@F=split(' ');");
1770 sv_catpv(linestr, "\n");
1771 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1772 bufend = SvPVX(linestr) + SvCUR(linestr);
1773 if (PERLDB_LINE && curstash != debstash) {
1774 SV *sv = NEWSV(85,0);
1776 sv_upgrade(sv, SVt_PVMG);
1777 sv_setsv(sv,linestr);
1778 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1783 if ((s = filter_gets(linestr, rsfp, 0)) == Nullch) {
1786 if (preprocess && !in_eval)
1787 (void)PerlProc_pclose(rsfp);
1788 else if ((PerlIO *)rsfp == PerlIO_stdin())
1789 PerlIO_clearerr(rsfp);
1791 (void)PerlIO_close(rsfp);
1796 if (!in_eval && (minus_n || minus_p)) {
1797 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
1798 sv_catpv(linestr,";}");
1799 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1800 bufend = SvPVX(linestr) + SvCUR(linestr);
1801 minus_n = minus_p = 0;
1804 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1805 sv_setpv(linestr,"");
1806 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
1809 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
1812 /* Incest with pod. */
1813 if (*s == '=' && strnEQ(s, "=cut", 4)) {
1814 sv_setpv(linestr, "");
1815 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1816 bufend = SvPVX(linestr) + SvCUR(linestr);
1821 } while (doextract);
1822 oldoldbufptr = oldbufptr = bufptr = linestart = s;
1823 if (PERLDB_LINE && curstash != debstash) {
1824 SV *sv = NEWSV(85,0);
1826 sv_upgrade(sv, SVt_PVMG);
1827 sv_setsv(sv,linestr);
1828 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1830 bufend = SvPVX(linestr) + SvCUR(linestr);
1831 if (curcop->cop_line == 1) {
1832 while (s < bufend && isSPACE(*s))
1834 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
1838 if (*s == '#' && *(s+1) == '!')
1840 #ifdef ALTERNATE_SHEBANG
1842 static char as[] = ALTERNATE_SHEBANG;
1843 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
1844 d = s + (sizeof(as) - 1);
1846 #endif /* ALTERNATE_SHEBANG */
1855 while (*d && !isSPACE(*d))
1859 #ifdef ARG_ZERO_IS_SCRIPT
1860 if (ipathend > ipath) {
1862 * HP-UX (at least) sets argv[0] to the script name,
1863 * which makes $^X incorrect. And Digital UNIX and Linux,
1864 * at least, set argv[0] to the basename of the Perl
1865 * interpreter. So, having found "#!", we'll set it right.
1867 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
1868 assert(SvPOK(x) || SvGMAGICAL(x));
1869 if (sv_eq(x, GvSV(curcop->cop_filegv))) {
1870 sv_setpvn(x, ipath, ipathend - ipath);
1873 TAINT_NOT; /* $^X is always tainted, but that's OK */
1875 #endif /* ARG_ZERO_IS_SCRIPT */
1880 d = instr(s,"perl -");
1882 d = instr(s,"perl");
1883 #ifdef ALTERNATE_SHEBANG
1885 * If the ALTERNATE_SHEBANG on this system starts with a
1886 * character that can be part of a Perl expression, then if
1887 * we see it but not "perl", we're probably looking at the
1888 * start of Perl code, not a request to hand off to some
1889 * other interpreter. Similarly, if "perl" is there, but
1890 * not in the first 'word' of the line, we assume the line
1891 * contains the start of the Perl program.
1893 if (d && *s != '#') {
1895 while (*c && !strchr("; \t\r\n\f\v#", *c))
1898 d = Nullch; /* "perl" not in first word; ignore */
1900 *s = '#'; /* Don't try to parse shebang line */
1902 #endif /* ALTERNATE_SHEBANG */
1907 !instr(s,"indir") &&
1908 instr(origargv[0],"perl"))
1914 while (s < bufend && isSPACE(*s))
1917 Newz(899,newargv,origargc+3,char*);
1919 while (s < bufend && !isSPACE(*s))
1922 Copy(origargv+1, newargv+2, origargc+1, char*);
1927 execv(ipath, newargv);
1928 croak("Can't exec %s", ipath);
1931 U32 oldpdb = perldb;
1932 bool oldn = minus_n;
1933 bool oldp = minus_p;
1935 while (*d && !isSPACE(*d)) d++;
1936 while (*d == ' ' || *d == '\t') d++;
1940 if (*d == 'M' || *d == 'm') {
1942 while (*d && !isSPACE(*d)) d++;
1943 croak("Too late for \"-%.*s\" option",
1946 d = moreswitches(d);
1948 if (PERLDB_LINE && !oldpdb ||
1949 ( minus_n || minus_p ) && !(oldn || oldp) )
1950 /* if we have already added "LINE: while (<>) {",
1951 we must not do it again */
1953 sv_setpv(linestr, "");
1954 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1955 bufend = SvPVX(linestr) + SvCUR(linestr);
1958 (void)gv_fetchfile(origfilename);
1965 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1967 lex_state = LEX_FORMLINE;
1973 warn("Illegal character \\%03o (carriage return)", '\r');
1975 "(Maybe you didn't strip carriage returns after a network transfer?)\n");
1977 case ' ': case '\t': case '\f': case 013:
1982 if (lex_state != LEX_NORMAL || (in_eval && !rsfp)) {
1984 while (s < d && *s != '\n')
1989 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1991 lex_state = LEX_FORMLINE;
2001 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2006 while (s < bufend && (*s == ' ' || *s == '\t'))
2009 if (strnEQ(s,"=>",2)) {
2010 s = force_word(bufptr,WORD,FALSE,FALSE,FALSE);
2011 OPERATOR('-'); /* unary minus */
2013 last_uni = oldbufptr;
2014 last_lop_op = OP_FTEREAD; /* good enough */
2016 case 'r': FTST(OP_FTEREAD);
2017 case 'w': FTST(OP_FTEWRITE);
2018 case 'x': FTST(OP_FTEEXEC);
2019 case 'o': FTST(OP_FTEOWNED);
2020 case 'R': FTST(OP_FTRREAD);
2021 case 'W': FTST(OP_FTRWRITE);
2022 case 'X': FTST(OP_FTREXEC);
2023 case 'O': FTST(OP_FTROWNED);
2024 case 'e': FTST(OP_FTIS);
2025 case 'z': FTST(OP_FTZERO);
2026 case 's': FTST(OP_FTSIZE);
2027 case 'f': FTST(OP_FTFILE);
2028 case 'd': FTST(OP_FTDIR);
2029 case 'l': FTST(OP_FTLINK);
2030 case 'p': FTST(OP_FTPIPE);
2031 case 'S': FTST(OP_FTSOCK);
2032 case 'u': FTST(OP_FTSUID);
2033 case 'g': FTST(OP_FTSGID);
2034 case 'k': FTST(OP_FTSVTX);
2035 case 'b': FTST(OP_FTBLK);
2036 case 'c': FTST(OP_FTCHR);
2037 case 't': FTST(OP_FTTTY);
2038 case 'T': FTST(OP_FTTEXT);
2039 case 'B': FTST(OP_FTBINARY);
2040 case 'M': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTMTIME);
2041 case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
2042 case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
2044 croak("Unrecognized file test: -%c", (int)tmp);
2051 if (expect == XOPERATOR)
2056 else if (*s == '>') {
2059 if (isIDFIRST(*s)) {
2060 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2068 if (expect == XOPERATOR)
2071 if (isSPACE(*s) || !isSPACE(*bufptr))
2073 OPERATOR('-'); /* unary minus */
2080 if (expect == XOPERATOR)
2085 if (expect == XOPERATOR)
2088 if (isSPACE(*s) || !isSPACE(*bufptr))
2094 if (expect != XOPERATOR) {
2095 s = scan_ident(s, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2097 force_ident(tokenbuf, '*');
2110 if (expect == XOPERATOR) {
2115 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, TRUE);
2118 yyerror("Final % should be \\% or %name");
2121 pending_ident = '%';
2143 if (last_lop == oldoldbufptr || last_uni == oldoldbufptr)
2144 oldbufptr = oldoldbufptr; /* allow print(STDOUT 123) */
2149 if (curcop->cop_line < copline)
2150 copline = curcop->cop_line;
2161 if (lex_brackets <= 0)
2162 yyerror("Unmatched right bracket");
2165 if (lex_state == LEX_INTERPNORMAL) {
2166 if (lex_brackets == 0) {
2167 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
2168 lex_state = LEX_INTERPEND;
2175 if (lex_brackets > 100) {
2176 char* newlb = Renew(lex_brackstack, lex_brackets + 1, char);
2177 if (newlb != lex_brackstack) {
2179 lex_brackstack = newlb;
2184 if (lex_formbrack) {
2188 if (oldoldbufptr == last_lop)
2189 lex_brackstack[lex_brackets++] = XTERM;
2191 lex_brackstack[lex_brackets++] = XOPERATOR;
2192 OPERATOR(HASHBRACK);
2194 while (s < bufend && (*s == ' ' || *s == '\t'))
2198 if (d < bufend && *d == '-') {
2201 while (d < bufend && (*d == ' ' || *d == '\t'))
2204 if (d < bufend && isIDFIRST(*d)) {
2205 d = scan_word(d, tokenbuf + 1, sizeof tokenbuf - 1,
2207 while (d < bufend && (*d == ' ' || *d == '\t'))
2210 char minus = (tokenbuf[0] == '-');
2211 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
2218 lex_brackstack[lex_brackets++] = XSTATE;
2222 lex_brackstack[lex_brackets++] = XOPERATOR;
2227 if (oldoldbufptr == last_lop)
2228 lex_brackstack[lex_brackets++] = XTERM;
2230 lex_brackstack[lex_brackets++] = XOPERATOR;
2233 if (expect == XSTATE) {
2234 lex_brackstack[lex_brackets-1] = XSTATE;
2237 OPERATOR(HASHBRACK);
2239 /* This hack serves to disambiguate a pair of curlies
2240 * as being a block or an anon hash. Normally, expectation
2241 * determines that, but in cases where we're not in a
2242 * position to expect anything in particular (like inside
2243 * eval"") we have to resolve the ambiguity. This code
2244 * covers the case where the first term in the curlies is a
2245 * quoted string. Most other cases need to be explicitly
2246 * disambiguated by prepending a `+' before the opening
2247 * curly in order to force resolution as an anon hash.
2249 * XXX should probably propagate the outer expectation
2250 * into eval"" to rely less on this hack, but that could
2251 * potentially break current behavior of eval"".
2255 if (*s == '\'' || *s == '"' || *s == '`') {
2256 /* common case: get past first string, handling escapes */
2257 for (t++; t < bufend && *t != *s;)
2258 if (*t++ == '\\' && (*t == '\\' || *t == *s))
2262 else if (*s == 'q') {
2265 || ((*t == 'q' || *t == 'x') && ++t < bufend
2266 && !isALNUM(*t)))) {
2268 char open, close, term;
2271 while (t < bufend && isSPACE(*t))
2275 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
2279 for (t++; t < bufend; t++) {
2280 if (*t == '\\' && t+1 < bufend && open != '\\')
2282 else if (*t == open)
2286 for (t++; t < bufend; t++) {
2287 if (*t == '\\' && t+1 < bufend)
2289 else if (*t == close && --brackets <= 0)
2291 else if (*t == open)
2297 else if (isALPHA(*s)) {
2298 for (t++; t < bufend && isALNUM(*t); t++) ;
2300 while (t < bufend && isSPACE(*t))
2302 /* if comma follows first term, call it an anon hash */
2303 /* XXX it could be a comma expression with loop modifiers */
2304 if (t < bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
2305 || (*t == '=' && t[1] == '>')))
2306 OPERATOR(HASHBRACK);
2310 lex_brackstack[lex_brackets-1] = XSTATE;
2316 yylval.ival = curcop->cop_line;
2317 if (isSPACE(*s) || *s == '#')
2318 copline = NOLINE; /* invalidate current command line number */
2323 if (lex_brackets <= 0)
2324 yyerror("Unmatched right bracket");
2326 expect = (expectation)lex_brackstack[--lex_brackets];
2327 if (lex_brackets < lex_formbrack)
2329 if (lex_state == LEX_INTERPNORMAL) {
2330 if (lex_brackets == 0) {
2331 if (lex_fakebrack) {
2332 lex_state = LEX_INTERPEND;
2334 return yylex(); /* ignore fake brackets */
2336 if (*s == '-' && s[1] == '>')
2337 lex_state = LEX_INTERPENDMAYBE;
2338 else if (*s != '[' && *s != '{')
2339 lex_state = LEX_INTERPEND;
2342 if (lex_brackets < lex_fakebrack) {
2345 return yylex(); /* ignore fake brackets */
2355 if (expect == XOPERATOR) {
2356 if (dowarn && isALPHA(*s) && bufptr == linestart) {
2364 s = scan_ident(s - 1, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2367 force_ident(tokenbuf, '&');
2371 yylval.ival = (OPpENTERSUB_AMPER<<8);
2390 if (dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
2391 warn("Reversed %c= operator",(int)tmp);
2393 if (expect == XSTATE && isALPHA(tmp) &&
2394 (s == linestart+1 || s[-2] == '\n') )
2396 if (in_eval && !rsfp) {
2401 if (strnEQ(s,"=cut",4)) {
2418 if (lex_brackets < lex_formbrack) {
2420 for (t = s; *t == ' ' || *t == '\t'; t++) ;
2421 if (*t == '\n' || *t == '#') {
2439 if (expect != XOPERATOR) {
2440 if (s[1] != '<' && !strchr(s,'>'))
2443 s = scan_heredoc(s);
2445 s = scan_inputsymbol(s);
2446 TERM(sublex_start());
2451 SHop(OP_LEFT_SHIFT);
2465 SHop(OP_RIGHT_SHIFT);
2474 if (expect == XOPERATOR) {
2475 if (lex_formbrack && lex_brackets == lex_formbrack) {
2478 return ','; /* grandfather non-comma-format format */
2482 if (s[1] == '#' && (isALPHA(s[2]) || strchr("_{$:", s[2]))) {
2483 if (expect == XOPERATOR)
2484 no_op("Array length", bufptr);
2486 s = scan_ident(s + 1, bufend, tokenbuf + 1, sizeof tokenbuf - 1,
2491 pending_ident = '#';
2495 if (expect == XOPERATOR)
2496 no_op("Scalar", bufptr);
2498 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2501 yyerror("Final $ should be \\$ or $name");
2505 /* This kludge not intended to be bulletproof. */
2506 if (tokenbuf[1] == '[' && !tokenbuf[2]) {
2507 yylval.opval = newSVOP(OP_CONST, 0,
2508 newSViv((IV)compiling.cop_arybase));
2509 yylval.opval->op_private = OPpCONST_ARYBASE;
2514 if (lex_state == LEX_NORMAL)
2517 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2523 isSPACE(*t) || isALNUM(*t) || *t == '$';
2526 bufptr = skipspace(bufptr);
2527 while (t < bufend && *t != ']')
2529 warn("Multidimensional syntax %.*s not supported",
2530 (t - bufptr) + 1, bufptr);
2534 else if (*s == '{') {
2536 if (dowarn && strEQ(tokenbuf+1, "SIG") &&
2537 (t = strchr(s, '}')) && (t = strchr(t, '=')))
2539 char tmpbuf[sizeof tokenbuf];
2541 for (t++; isSPACE(*t); t++) ;
2542 if (isIDFIRST(*t)) {
2543 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
2544 if (*t != '(' && perl_get_cv(tmpbuf, FALSE))
2545 warn("You need to quote \"%s\"", tmpbuf);
2552 if (lex_state == LEX_NORMAL && isSPACE(*d)) {
2553 bool islop = (last_lop == oldoldbufptr);
2554 if (!islop || last_lop_op == OP_GREPSTART)
2556 else if (strchr("$@\"'`q", *s))
2557 expect = XTERM; /* e.g. print $fh "foo" */
2558 else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
2559 expect = XTERM; /* e.g. print $fh &sub */
2560 else if (isIDFIRST(*s)) {
2561 char tmpbuf[sizeof tokenbuf];
2562 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2563 if (tmp = keyword(tmpbuf, len)) {
2564 /* binary operators exclude handle interpretations */
2576 expect = XTERM; /* e.g. print $fh length() */
2581 GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2582 if (gv && GvCVu(gv))
2583 expect = XTERM; /* e.g. print $fh subr() */
2586 else if (isDIGIT(*s))
2587 expect = XTERM; /* e.g. print $fh 3 */
2588 else if (*s == '.' && isDIGIT(s[1]))
2589 expect = XTERM; /* e.g. print $fh .3 */
2590 else if (strchr("/?-+", *s) && !isSPACE(s[1]))
2591 expect = XTERM; /* e.g. print $fh -1 */
2592 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]))
2593 expect = XTERM; /* print $fh <<"EOF" */
2595 pending_ident = '$';
2599 if (expect == XOPERATOR)
2602 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2605 yyerror("Final @ should be \\@ or @name");
2608 if (lex_state == LEX_NORMAL)
2610 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2614 /* Warn about @ where they meant $. */
2616 if (*s == '[' || *s == '{') {
2618 while (*t && (isALNUM(*t) || strchr(" \t$#+-'\"", *t)))
2620 if (*t == '}' || *t == ']') {
2622 bufptr = skipspace(bufptr);
2623 warn("Scalar value %.*s better written as $%.*s",
2624 t-bufptr, bufptr, t-bufptr-1, bufptr+1);
2629 pending_ident = '@';
2632 case '/': /* may either be division or pattern */
2633 case '?': /* may either be conditional or pattern */
2634 if (expect != XOPERATOR) {
2635 /* Disable warning on "study /blah/" */
2636 if (oldoldbufptr == last_uni
2637 && (*last_uni != 's' || s - last_uni < 5
2638 || memNE(last_uni, "study", 5) || isALNUM(last_uni[5])))
2641 TERM(sublex_start());
2649 if (lex_formbrack && lex_brackets == lex_formbrack && s[1] == '\n' &&
2650 (s == linestart || s[-1] == '\n') ) {
2655 if (expect == XOPERATOR || !isDIGIT(s[1])) {
2661 yylval.ival = OPf_SPECIAL;
2667 if (expect != XOPERATOR)
2672 case '0': case '1': case '2': case '3': case '4':
2673 case '5': case '6': case '7': case '8': case '9':
2675 if (expect == XOPERATOR)
2681 if (expect == XOPERATOR) {
2682 if (lex_formbrack && lex_brackets == lex_formbrack) {
2685 return ','; /* grandfather non-comma-format format */
2691 missingterm((char*)0);
2692 yylval.ival = OP_CONST;
2693 TERM(sublex_start());
2697 if (expect == XOPERATOR) {
2698 if (lex_formbrack && lex_brackets == lex_formbrack) {
2701 return ','; /* grandfather non-comma-format format */
2707 missingterm((char*)0);
2708 yylval.ival = OP_CONST;
2709 for (d = SvPV(lex_stuff, len); len; len--, d++) {
2710 if (*d == '$' || *d == '@' || *d == '\\') {
2711 yylval.ival = OP_STRINGIFY;
2715 TERM(sublex_start());
2719 if (expect == XOPERATOR)
2720 no_op("Backticks",s);
2722 missingterm((char*)0);
2723 yylval.ival = OP_BACKTICK;
2725 TERM(sublex_start());
2729 if (dowarn && lex_inwhat && isDIGIT(*s))
2730 warn("Can't use \\%c to mean $%c in expression", *s, *s);
2731 if (expect == XOPERATOR)
2732 no_op("Backslash",s);
2736 if (isDIGIT(s[1]) && expect == XOPERATOR) {
2775 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
2777 /* Some keywords can be followed by any delimiter, including ':' */
2778 tmp = (len == 1 && strchr("msyq", tokenbuf[0]) ||
2779 len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
2780 (tokenbuf[0] == 'q' &&
2781 strchr("qwx", tokenbuf[1]))));
2783 /* x::* is just a word, unless x is "CORE" */
2784 if (!tmp && *s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
2788 while (d < bufend && isSPACE(*d))
2789 d++; /* no comments skipped here, or s### is misparsed */
2791 /* Is this a label? */
2792 if (!tmp && expect == XSTATE
2793 && d < bufend && *d == ':' && *(d + 1) != ':') {
2795 yylval.pval = savepv(tokenbuf);
2800 /* Check for keywords */
2801 tmp = keyword(tokenbuf, len);
2803 /* Is this a word before a => operator? */
2804 if (strnEQ(d,"=>",2)) {
2806 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2807 yylval.opval->op_private = OPpCONST_BARE;
2811 if (tmp < 0) { /* second-class keyword? */
2812 if (expect != XOPERATOR && (*s != ':' || s[1] != ':') &&
2813 (((gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV)) &&
2814 GvCVu(gv) && GvIMPORTED_CV(gv)) ||
2815 ((gvp = (GV**)hv_fetch(globalstash,tokenbuf,len,FALSE)) &&
2816 (gv = *gvp) != (GV*)&sv_undef &&
2817 GvCVu(gv) && GvIMPORTED_CV(gv))))
2819 tmp = 0; /* overridden by importation */
2822 && -tmp==KEY_lock /* XXX generalizable kludge */
2823 && !hv_fetch(GvHVn(incgv), "Thread.pm", 9, FALSE))
2825 tmp = 0; /* any sub overrides "weak" keyword */
2828 tmp = -tmp; gv = Nullgv; gvp = 0;
2835 default: /* not a keyword */
2838 char lastchar = (bufptr == oldoldbufptr ? 0 : bufptr[-1]);
2840 /* Get the rest if it looks like a package qualifier */
2842 if (*s == '\'' || *s == ':' && s[1] == ':') {
2843 s = scan_word(s, tokenbuf + len, sizeof tokenbuf - len,
2846 croak("Bad name after %s::", tokenbuf);
2849 if (expect == XOPERATOR) {
2850 if (bufptr == linestart) {
2856 no_op("Bareword",s);
2859 /* Look for a subroutine with this name in current package. */
2862 sv = newSVpv("CORE::GLOBAL::",14);
2863 sv_catpv(sv,tokenbuf);
2866 sv = newSVpv(tokenbuf,0);
2868 gv = gv_fetchpv(tokenbuf,FALSE, SVt_PVCV);
2870 /* Presume this is going to be a bareword of some sort. */
2873 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2874 yylval.opval->op_private = OPpCONST_BARE;
2876 /* See if it's the indirect object for a list operator. */
2879 oldoldbufptr < bufptr &&
2880 (oldoldbufptr == last_lop || oldoldbufptr == last_uni) &&
2881 /* NO SKIPSPACE BEFORE HERE! */
2883 ((opargs[last_lop_op] >> OASHIFT)& 7) == OA_FILEREF) )
2885 bool immediate_paren = *s == '(';
2887 /* (Now we can afford to cross potential line boundary.) */
2890 /* Two barewords in a row may indicate method call. */
2892 if ((isALPHA(*s) || *s == '$') && (tmp=intuit_method(s,gv)))
2895 /* If not a declared subroutine, it's an indirect object. */
2896 /* (But it's an indir obj regardless for sort.) */
2898 if ((last_lop_op == OP_SORT ||
2899 (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
2900 (last_lop_op != OP_MAPSTART && last_lop_op != OP_GREPSTART)){
2901 expect = (last_lop == oldoldbufptr) ? XTERM : XOPERATOR;
2906 /* If followed by a paren, it's certainly a subroutine. */
2912 if (gv && GvCVu(gv)) {
2913 for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
2914 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
2919 nextval[nexttoke].opval = yylval.opval;
2926 /* If followed by var or block, call it a method (unless sub) */
2928 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
2929 last_lop = oldbufptr;
2930 last_lop_op = OP_METHOD;
2934 /* If followed by a bareword, see if it looks like indir obj. */
2936 if ((isALPHA(*s) || *s == '$') && (tmp = intuit_method(s,gv)))
2939 /* Not a method, so call it a subroutine (if defined) */
2941 if (gv && GvCVu(gv)) {
2943 if (lastchar == '-')
2944 warn("Ambiguous use of -%s resolved as -&%s()",
2945 tokenbuf, tokenbuf);
2946 last_lop = oldbufptr;
2947 last_lop_op = OP_ENTERSUB;
2948 /* Check for a constant sub */
2950 if ((sv = cv_const_sv(cv))) {
2952 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
2953 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
2954 yylval.opval->op_private = 0;
2958 /* Resolve to GV now. */
2959 op_free(yylval.opval);
2960 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
2961 /* Is there a prototype? */
2964 char *proto = SvPV((SV*)cv, len);
2967 if (strEQ(proto, "$"))
2969 if (*proto == '&' && *s == '{') {
2970 sv_setpv(subname,"__ANON__");
2974 nextval[nexttoke].opval = yylval.opval;
2980 if (hints & HINT_STRICT_SUBS &&
2983 last_lop_op != OP_TRUNCATE && /* S/F prototype in opcode.pl */
2984 last_lop_op != OP_ACCEPT &&
2985 last_lop_op != OP_PIPE_OP &&
2986 last_lop_op != OP_SOCKPAIR)
2989 "Bareword \"%s\" not allowed while \"strict subs\" in use",
2994 /* Call it a bare word */
2998 if (lastchar != '-') {
2999 for (d = tokenbuf; *d && isLOWER(*d); d++) ;
3001 warn(warn_reserved, tokenbuf);
3004 if (lastchar && strchr("*%&", lastchar)) {
3005 warn("Operator or semicolon missing before %c%s",
3006 lastchar, tokenbuf);
3007 warn("Ambiguous use of %c resolved as operator %c",
3008 lastchar, lastchar);
3014 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3015 newSVsv(GvSV(curcop->cop_filegv)));
3019 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3020 newSVpvf("%ld", (long)curcop->cop_line));
3023 case KEY___PACKAGE__:
3024 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3026 ? newSVsv(curstname)
3035 if (rsfp && (!in_eval || tokenbuf[2] == 'D')) {
3036 char *pname = "main";
3037 if (tokenbuf[2] == 'D')
3038 pname = HvNAME(curstash ? curstash : defstash);
3039 gv = gv_fetchpv(form("%s::DATA", pname), TRUE, SVt_PVIO);
3042 GvIOp(gv) = newIO();
3043 IoIFP(GvIOp(gv)) = rsfp;
3044 #if defined(HAS_FCNTL) && defined(F_SETFD)
3046 int fd = PerlIO_fileno(rsfp);
3047 fcntl(fd,F_SETFD,fd >= 3);
3050 /* Mark this internal pseudo-handle as clean */
3051 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3053 IoTYPE(GvIOp(gv)) = '|';
3054 else if ((PerlIO*)rsfp == PerlIO_stdin())
3055 IoTYPE(GvIOp(gv)) = '-';
3057 IoTYPE(GvIOp(gv)) = '<';
3068 if (expect == XSTATE) {
3075 if (*s == ':' && s[1] == ':') {
3078 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
3079 tmp = keyword(tokenbuf, len);
3093 LOP(OP_ACCEPT,XTERM);
3099 LOP(OP_ATAN2,XTERM);
3108 LOP(OP_BLESS,XTERM);
3117 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
3137 LOP(OP_CRYPT,XTERM);
3141 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3142 if (*d != '0' && isDIGIT(*d))
3143 yywarn("chmod: mode argument is missing initial 0");
3145 LOP(OP_CHMOD,XTERM);
3148 LOP(OP_CHOWN,XTERM);
3151 LOP(OP_CONNECT,XTERM);
3167 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3171 hints |= HINT_BLOCK_SCOPE;
3181 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
3182 LOP(OP_DBMOPEN,XTERM);
3188 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3195 yylval.ival = curcop->cop_line;
3209 expect = (*s == '{') ? XTERMBLOCK : XTERM;
3210 UNIBRACK(OP_ENTEREVAL);
3225 case KEY_endhostent:
3231 case KEY_endservent:
3234 case KEY_endprotoent:
3245 yylval.ival = curcop->cop_line;
3247 if (expect == XSTATE && isIDFIRST(*s)) {
3249 if ((bufend - p) >= 3 &&
3250 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
3254 croak("Missing $ on loop variable");
3259 LOP(OP_FORMLINE,XTERM);
3265 LOP(OP_FCNTL,XTERM);
3271 LOP(OP_FLOCK,XTERM);
3280 LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
3283 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3298 case KEY_getpriority:
3299 LOP(OP_GETPRIORITY,XTERM);
3301 case KEY_getprotobyname:
3304 case KEY_getprotobynumber:
3305 LOP(OP_GPBYNUMBER,XTERM);
3307 case KEY_getprotoent:
3319 case KEY_getpeername:
3320 UNI(OP_GETPEERNAME);
3322 case KEY_gethostbyname:
3325 case KEY_gethostbyaddr:
3326 LOP(OP_GHBYADDR,XTERM);
3328 case KEY_gethostent:
3331 case KEY_getnetbyname:
3334 case KEY_getnetbyaddr:
3335 LOP(OP_GNBYADDR,XTERM);
3340 case KEY_getservbyname:
3341 LOP(OP_GSBYNAME,XTERM);
3343 case KEY_getservbyport:
3344 LOP(OP_GSBYPORT,XTERM);
3346 case KEY_getservent:
3349 case KEY_getsockname:
3350 UNI(OP_GETSOCKNAME);
3352 case KEY_getsockopt:
3353 LOP(OP_GSOCKOPT,XTERM);
3375 yylval.ival = curcop->cop_line;
3379 LOP(OP_INDEX,XTERM);
3385 LOP(OP_IOCTL,XTERM);
3397 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3428 LOP(OP_LISTEN,XTERM);
3438 TERM(sublex_start());
3441 LOP(OP_MAPSTART,XREF);
3444 LOP(OP_MKDIR,XTERM);
3447 LOP(OP_MSGCTL,XTERM);
3450 LOP(OP_MSGGET,XTERM);
3453 LOP(OP_MSGRCV,XTERM);
3456 LOP(OP_MSGSND,XTERM);
3461 if (isIDFIRST(*s)) {
3462 s = scan_word(s, tokenbuf, sizeof tokenbuf, TRUE, &len);
3463 in_my_stash = gv_stashpv(tokenbuf, FALSE);
3467 sprintf(tmpbuf, "No such class %.1000s", tokenbuf);
3474 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3481 if (expect != XSTATE)
3482 yyerror("\"no\" not allowed in expression");
3483 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3484 s = force_version(s);
3493 if (isIDFIRST(*s)) {
3495 for (d = s; isALNUM(*d); d++) ;
3497 if (strchr("|&*+-=!?:.", *t))
3498 warn("Precedence problem: open %.*s should be open(%.*s)",
3504 yylval.ival = OP_OR;
3514 LOP(OP_OPEN_DIR,XTERM);
3517 checkcomma(s,tokenbuf,"filehandle");
3521 checkcomma(s,tokenbuf,"filehandle");
3540 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3544 LOP(OP_PIPE_OP,XTERM);
3549 missingterm((char*)0);
3550 yylval.ival = OP_CONST;
3551 TERM(sublex_start());
3559 missingterm((char*)0);
3560 if (dowarn && SvLEN(lex_stuff)) {
3561 d = SvPV_force(lex_stuff, len);
3562 for (; len; --len, ++d) {
3564 warn("Possible attempt to separate words with commas");
3568 warn("Possible attempt to put comments in qw() list");
3574 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, q(lex_stuff));
3578 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
3581 yylval.ival = OP_SPLIT;
3585 last_lop = oldbufptr;
3586 last_lop_op = OP_SPLIT;
3592 missingterm((char*)0);
3593 yylval.ival = OP_STRINGIFY;
3594 if (SvIVX(lex_stuff) == '\'')
3595 SvIVX(lex_stuff) = 0; /* qq'$foo' should intepolate */
3596 TERM(sublex_start());
3601 missingterm((char*)0);
3602 yylval.ival = OP_BACKTICK;
3604 TERM(sublex_start());
3611 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3612 if (isIDFIRST(*tokenbuf))
3613 gv_stashpvn(tokenbuf, strlen(tokenbuf), TRUE);
3615 yyerror("<> should be quotes");
3622 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3626 LOP(OP_RENAME,XTERM);
3635 LOP(OP_RINDEX,XTERM);
3658 LOP(OP_REVERSE,XTERM);
3669 TERM(sublex_start());
3671 TOKEN(1); /* force error */
3680 LOP(OP_SELECT,XTERM);
3686 LOP(OP_SEMCTL,XTERM);
3689 LOP(OP_SEMGET,XTERM);
3692 LOP(OP_SEMOP,XTERM);
3698 LOP(OP_SETPGRP,XTERM);
3700 case KEY_setpriority:
3701 LOP(OP_SETPRIORITY,XTERM);
3703 case KEY_sethostent:
3709 case KEY_setservent:
3712 case KEY_setprotoent:
3722 LOP(OP_SEEKDIR,XTERM);
3724 case KEY_setsockopt:
3725 LOP(OP_SSOCKOPT,XTERM);
3731 LOP(OP_SHMCTL,XTERM);
3734 LOP(OP_SHMGET,XTERM);
3737 LOP(OP_SHMREAD,XTERM);
3740 LOP(OP_SHMWRITE,XTERM);
3743 LOP(OP_SHUTDOWN,XTERM);
3752 LOP(OP_SOCKET,XTERM);
3754 case KEY_socketpair:
3755 LOP(OP_SOCKPAIR,XTERM);
3758 checkcomma(s,tokenbuf,"subroutine name");
3760 if (*s == ';' || *s == ')') /* probably a close */
3761 croak("sort is now a reserved word");
3763 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3767 LOP(OP_SPLIT,XTERM);
3770 LOP(OP_SPRINTF,XTERM);
3773 LOP(OP_SPLICE,XTERM);
3789 LOP(OP_SUBSTR,XTERM);
3796 if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
3797 char tmpbuf[sizeof tokenbuf];
3799 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3800 if (strchr(tmpbuf, ':'))
3801 sv_setpv(subname, tmpbuf);
3803 sv_setsv(subname,curstname);
3804 sv_catpvn(subname,"::",2);
3805 sv_catpvn(subname,tmpbuf,len);
3807 s = force_word(s,WORD,FALSE,TRUE,TRUE);
3811 expect = XTERMBLOCK;
3812 sv_setpv(subname,"?");
3815 if (tmp == KEY_format) {
3818 lex_formbrack = lex_brackets + 1;
3822 /* Look for a prototype */
3829 SvREFCNT_dec(lex_stuff);
3831 croak("Prototype not terminated");
3834 d = SvPVX(lex_stuff);
3836 for (p = d; *p; ++p) {
3841 SvCUR(lex_stuff) = tmp;
3844 nextval[1] = nextval[0];
3845 nexttype[1] = nexttype[0];
3846 nextval[0].opval = (OP*)newSVOP(OP_CONST, 0, lex_stuff);
3847 nexttype[0] = THING;
3848 if (nexttoke == 1) {
3849 lex_defer = lex_state;
3850 lex_expect = expect;
3851 lex_state = LEX_KNOWNEXT;
3856 if (*SvPV(subname,na) == '?') {
3857 sv_setpv(subname,"__ANON__");
3864 LOP(OP_SYSTEM,XREF);
3867 LOP(OP_SYMLINK,XTERM);
3870 LOP(OP_SYSCALL,XTERM);
3873 LOP(OP_SYSOPEN,XTERM);
3876 LOP(OP_SYSSEEK,XTERM);
3879 LOP(OP_SYSREAD,XTERM);
3882 LOP(OP_SYSWRITE,XTERM);
3886 TERM(sublex_start());
3907 LOP(OP_TRUNCATE,XTERM);
3919 yylval.ival = curcop->cop_line;
3923 yylval.ival = curcop->cop_line;
3927 LOP(OP_UNLINK,XTERM);
3933 LOP(OP_UNPACK,XTERM);
3936 LOP(OP_UTIME,XTERM);
3940 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3941 if (*d != '0' && isDIGIT(*d))
3942 yywarn("umask: argument is missing initial 0");
3947 LOP(OP_UNSHIFT,XTERM);
3950 if (expect != XSTATE)
3951 yyerror("\"use\" not allowed in expression");
3954 s = force_version(s);
3955 if(*s == ';' || (s = skipspace(s), *s == ';')) {
3956 nextval[nexttoke].opval = Nullop;
3961 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3962 s = force_version(s);
3975 yylval.ival = curcop->cop_line;
3979 hints |= HINT_BLOCK_SCOPE;
3986 LOP(OP_WAITPID,XTERM);
3992 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
3996 if (expect == XOPERATOR)
4002 yylval.ival = OP_XOR;
4007 TERM(sublex_start());
4013 keyword(register char *d, I32 len)
4018 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
4019 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
4020 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
4021 if (strEQ(d,"__DATA__")) return KEY___DATA__;
4022 if (strEQ(d,"__END__")) return KEY___END__;
4026 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
4031 if (strEQ(d,"and")) return -KEY_and;
4032 if (strEQ(d,"abs")) return -KEY_abs;
4035 if (strEQ(d,"alarm")) return -KEY_alarm;
4036 if (strEQ(d,"atan2")) return -KEY_atan2;
4039 if (strEQ(d,"accept")) return -KEY_accept;
4044 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
4047 if (strEQ(d,"bless")) return -KEY_bless;
4048 if (strEQ(d,"bind")) return -KEY_bind;
4049 if (strEQ(d,"binmode")) return -KEY_binmode;
4052 if (strEQ(d,"CORE")) return -KEY_CORE;
4057 if (strEQ(d,"cmp")) return -KEY_cmp;
4058 if (strEQ(d,"chr")) return -KEY_chr;
4059 if (strEQ(d,"cos")) return -KEY_cos;
4062 if (strEQ(d,"chop")) return KEY_chop;
4065 if (strEQ(d,"close")) return -KEY_close;
4066 if (strEQ(d,"chdir")) return -KEY_chdir;
4067 if (strEQ(d,"chomp")) return KEY_chomp;
4068 if (strEQ(d,"chmod")) return -KEY_chmod;
4069 if (strEQ(d,"chown")) return -KEY_chown;
4070 if (strEQ(d,"crypt")) return -KEY_crypt;
4073 if (strEQ(d,"chroot")) return -KEY_chroot;
4074 if (strEQ(d,"caller")) return -KEY_caller;
4077 if (strEQ(d,"connect")) return -KEY_connect;
4080 if (strEQ(d,"closedir")) return -KEY_closedir;
4081 if (strEQ(d,"continue")) return -KEY_continue;
4086 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
4091 if (strEQ(d,"do")) return KEY_do;
4094 if (strEQ(d,"die")) return -KEY_die;
4097 if (strEQ(d,"dump")) return -KEY_dump;
4100 if (strEQ(d,"delete")) return KEY_delete;
4103 if (strEQ(d,"defined")) return KEY_defined;
4104 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
4107 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
4112 if (strEQ(d,"EQ")) { deprecate(d); return -KEY_eq;}
4113 if (strEQ(d,"END")) return KEY_END;
4118 if (strEQ(d,"eq")) return -KEY_eq;
4121 if (strEQ(d,"eof")) return -KEY_eof;
4122 if (strEQ(d,"exp")) return -KEY_exp;
4125 if (strEQ(d,"else")) return KEY_else;
4126 if (strEQ(d,"exit")) return -KEY_exit;
4127 if (strEQ(d,"eval")) return KEY_eval;
4128 if (strEQ(d,"exec")) return -KEY_exec;
4129 if (strEQ(d,"each")) return KEY_each;
4132 if (strEQ(d,"elsif")) return KEY_elsif;
4135 if (strEQ(d,"exists")) return KEY_exists;
4136 if (strEQ(d,"elseif")) warn("elseif should be elsif");
4139 if (strEQ(d,"endgrent")) return -KEY_endgrent;
4140 if (strEQ(d,"endpwent")) return -KEY_endpwent;
4143 if (strEQ(d,"endnetent")) return -KEY_endnetent;
4146 if (strEQ(d,"endhostent")) return -KEY_endhostent;
4147 if (strEQ(d,"endservent")) return -KEY_endservent;
4150 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
4157 if (strEQ(d,"for")) return KEY_for;
4160 if (strEQ(d,"fork")) return -KEY_fork;
4163 if (strEQ(d,"fcntl")) return -KEY_fcntl;
4164 if (strEQ(d,"flock")) return -KEY_flock;
4167 if (strEQ(d,"format")) return KEY_format;
4168 if (strEQ(d,"fileno")) return -KEY_fileno;
4171 if (strEQ(d,"foreach")) return KEY_foreach;
4174 if (strEQ(d,"formline")) return -KEY_formline;
4180 if (strEQ(d,"GT")) { deprecate(d); return -KEY_gt;}
4181 if (strEQ(d,"GE")) { deprecate(d); return -KEY_ge;}
4185 if (strnEQ(d,"get",3)) {
4190 if (strEQ(d,"ppid")) return -KEY_getppid;
4191 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
4194 if (strEQ(d,"pwent")) return -KEY_getpwent;
4195 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
4196 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
4199 if (strEQ(d,"peername")) return -KEY_getpeername;
4200 if (strEQ(d,"protoent")) return -KEY_getprotoent;
4201 if (strEQ(d,"priority")) return -KEY_getpriority;
4204 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
4207 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
4211 else if (*d == 'h') {
4212 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
4213 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
4214 if (strEQ(d,"hostent")) return -KEY_gethostent;
4216 else if (*d == 'n') {
4217 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
4218 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
4219 if (strEQ(d,"netent")) return -KEY_getnetent;
4221 else if (*d == 's') {
4222 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
4223 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
4224 if (strEQ(d,"servent")) return -KEY_getservent;
4225 if (strEQ(d,"sockname")) return -KEY_getsockname;
4226 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
4228 else if (*d == 'g') {
4229 if (strEQ(d,"grent")) return -KEY_getgrent;
4230 if (strEQ(d,"grnam")) return -KEY_getgrnam;
4231 if (strEQ(d,"grgid")) return -KEY_getgrgid;
4233 else if (*d == 'l') {
4234 if (strEQ(d,"login")) return -KEY_getlogin;
4236 else if (strEQ(d,"c")) return -KEY_getc;
4241 if (strEQ(d,"gt")) return -KEY_gt;
4242 if (strEQ(d,"ge")) return -KEY_ge;
4245 if (strEQ(d,"grep")) return KEY_grep;
4246 if (strEQ(d,"goto")) return KEY_goto;
4247 if (strEQ(d,"glob")) return KEY_glob;
4250 if (strEQ(d,"gmtime")) return -KEY_gmtime;
4255 if (strEQ(d,"hex")) return -KEY_hex;
4258 if (strEQ(d,"INIT")) return KEY_INIT;
4263 if (strEQ(d,"if")) return KEY_if;
4266 if (strEQ(d,"int")) return -KEY_int;
4269 if (strEQ(d,"index")) return -KEY_index;
4270 if (strEQ(d,"ioctl")) return -KEY_ioctl;
4275 if (strEQ(d,"join")) return -KEY_join;
4279 if (strEQ(d,"keys")) return KEY_keys;
4280 if (strEQ(d,"kill")) return -KEY_kill;
4285 if (strEQ(d,"LT")) { deprecate(d); return -KEY_lt;}
4286 if (strEQ(d,"LE")) { deprecate(d); return -KEY_le;}
4292 if (strEQ(d,"lt")) return -KEY_lt;
4293 if (strEQ(d,"le")) return -KEY_le;
4294 if (strEQ(d,"lc")) return -KEY_lc;
4297 if (strEQ(d,"log")) return -KEY_log;
4300 if (strEQ(d,"last")) return KEY_last;
4301 if (strEQ(d,"link")) return -KEY_link;
4302 if (strEQ(d,"lock")) return -KEY_lock;
4305 if (strEQ(d,"local")) return KEY_local;
4306 if (strEQ(d,"lstat")) return -KEY_lstat;
4309 if (strEQ(d,"length")) return -KEY_length;
4310 if (strEQ(d,"listen")) return -KEY_listen;
4313 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
4316 if (strEQ(d,"localtime")) return -KEY_localtime;
4322 case 1: return KEY_m;
4324 if (strEQ(d,"my")) return KEY_my;
4327 if (strEQ(d,"map")) return KEY_map;
4330 if (strEQ(d,"mkdir")) return -KEY_mkdir;
4333 if (strEQ(d,"msgctl")) return -KEY_msgctl;
4334 if (strEQ(d,"msgget")) return -KEY_msgget;
4335 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
4336 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
4341 if (strEQ(d,"NE")) { deprecate(d); return -KEY_ne;}
4344 if (strEQ(d,"next")) return KEY_next;
4345 if (strEQ(d,"ne")) return -KEY_ne;
4346 if (strEQ(d,"not")) return -KEY_not;
4347 if (strEQ(d,"no")) return KEY_no;
4352 if (strEQ(d,"or")) return -KEY_or;
4355 if (strEQ(d,"ord")) return -KEY_ord;
4356 if (strEQ(d,"oct")) return -KEY_oct;
4359 if (strEQ(d,"open")) return -KEY_open;
4362 if (strEQ(d,"opendir")) return -KEY_opendir;
4369 if (strEQ(d,"pop")) return KEY_pop;
4370 if (strEQ(d,"pos")) return KEY_pos;
4373 if (strEQ(d,"push")) return KEY_push;
4374 if (strEQ(d,"pack")) return -KEY_pack;
4375 if (strEQ(d,"pipe")) return -KEY_pipe;
4378 if (strEQ(d,"print")) return KEY_print;
4381 if (strEQ(d,"printf")) return KEY_printf;
4384 if (strEQ(d,"package")) return KEY_package;
4387 if (strEQ(d,"prototype")) return KEY_prototype;
4392 if (strEQ(d,"q")) return KEY_q;
4393 if (strEQ(d,"qq")) return KEY_qq;
4394 if (strEQ(d,"qw")) return KEY_qw;
4395 if (strEQ(d,"qx")) return KEY_qx;
4397 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
4402 if (strEQ(d,"ref")) return -KEY_ref;
4405 if (strEQ(d,"read")) return -KEY_read;
4406 if (strEQ(d,"rand")) return -KEY_rand;
4407 if (strEQ(d,"recv")) return -KEY_recv;
4408 if (strEQ(d,"redo")) return KEY_redo;
4411 if (strEQ(d,"rmdir")) return -KEY_rmdir;
4412 if (strEQ(d,"reset")) return -KEY_reset;
4415 if (strEQ(d,"return")) return KEY_return;
4416 if (strEQ(d,"rename")) return -KEY_rename;
4417 if (strEQ(d,"rindex")) return -KEY_rindex;
4420 if (strEQ(d,"require")) return -KEY_require;
4421 if (strEQ(d,"reverse")) return -KEY_reverse;
4422 if (strEQ(d,"readdir")) return -KEY_readdir;
4425 if (strEQ(d,"readlink")) return -KEY_readlink;
4426 if (strEQ(d,"readline")) return -KEY_readline;
4427 if (strEQ(d,"readpipe")) return -KEY_readpipe;
4430 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
4436 case 0: return KEY_s;
4438 if (strEQ(d,"scalar")) return KEY_scalar;
4443 if (strEQ(d,"seek")) return -KEY_seek;
4444 if (strEQ(d,"send")) return -KEY_send;
4447 if (strEQ(d,"semop")) return -KEY_semop;
4450 if (strEQ(d,"select")) return -KEY_select;
4451 if (strEQ(d,"semctl")) return -KEY_semctl;
4452 if (strEQ(d,"semget")) return -KEY_semget;
4455 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
4456 if (strEQ(d,"seekdir")) return -KEY_seekdir;
4459 if (strEQ(d,"setpwent")) return -KEY_setpwent;
4460 if (strEQ(d,"setgrent")) return -KEY_setgrent;
4463 if (strEQ(d,"setnetent")) return -KEY_setnetent;
4466 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
4467 if (strEQ(d,"sethostent")) return -KEY_sethostent;
4468 if (strEQ(d,"setservent")) return -KEY_setservent;
4471 if (strEQ(d,"setpriority")) return -KEY_setpriority;
4472 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
4479 if (strEQ(d,"shift")) return KEY_shift;
4482 if (strEQ(d,"shmctl")) return -KEY_shmctl;
4483 if (strEQ(d,"shmget")) return -KEY_shmget;
4486 if (strEQ(d,"shmread")) return -KEY_shmread;
4489 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
4490 if (strEQ(d,"shutdown")) return -KEY_shutdown;
4495 if (strEQ(d,"sin")) return -KEY_sin;
4498 if (strEQ(d,"sleep")) return -KEY_sleep;
4501 if (strEQ(d,"sort")) return KEY_sort;
4502 if (strEQ(d,"socket")) return -KEY_socket;
4503 if (strEQ(d,"socketpair")) return -KEY_socketpair;
4506 if (strEQ(d,"split")) return KEY_split;
4507 if (strEQ(d,"sprintf")) return -KEY_sprintf;
4508 if (strEQ(d,"splice")) return KEY_splice;
4511 if (strEQ(d,"sqrt")) return -KEY_sqrt;
4514 if (strEQ(d,"srand")) return -KEY_srand;
4517 if (strEQ(d,"stat")) return -KEY_stat;
4518 if (strEQ(d,"study")) return KEY_study;
4521 if (strEQ(d,"substr")) return -KEY_substr;
4522 if (strEQ(d,"sub")) return KEY_sub;
4527 if (strEQ(d,"system")) return -KEY_system;
4530 if (strEQ(d,"symlink")) return -KEY_symlink;
4531 if (strEQ(d,"syscall")) return -KEY_syscall;
4532 if (strEQ(d,"sysopen")) return -KEY_sysopen;
4533 if (strEQ(d,"sysread")) return -KEY_sysread;
4534 if (strEQ(d,"sysseek")) return -KEY_sysseek;
4537 if (strEQ(d,"syswrite")) return -KEY_syswrite;
4546 if (strEQ(d,"tr")) return KEY_tr;
4549 if (strEQ(d,"tie")) return KEY_tie;
4552 if (strEQ(d,"tell")) return -KEY_tell;
4553 if (strEQ(d,"tied")) return KEY_tied;
4554 if (strEQ(d,"time")) return -KEY_time;
4557 if (strEQ(d,"times")) return -KEY_times;
4560 if (strEQ(d,"telldir")) return -KEY_telldir;
4563 if (strEQ(d,"truncate")) return -KEY_truncate;
4570 if (strEQ(d,"uc")) return -KEY_uc;
4573 if (strEQ(d,"use")) return KEY_use;
4576 if (strEQ(d,"undef")) return KEY_undef;
4577 if (strEQ(d,"until")) return KEY_until;
4578 if (strEQ(d,"untie")) return KEY_untie;
4579 if (strEQ(d,"utime")) return -KEY_utime;
4580 if (strEQ(d,"umask")) return -KEY_umask;
4583 if (strEQ(d,"unless")) return KEY_unless;
4584 if (strEQ(d,"unpack")) return -KEY_unpack;
4585 if (strEQ(d,"unlink")) return -KEY_unlink;
4588 if (strEQ(d,"unshift")) return KEY_unshift;
4589 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
4594 if (strEQ(d,"values")) return -KEY_values;
4595 if (strEQ(d,"vec")) return -KEY_vec;
4600 if (strEQ(d,"warn")) return -KEY_warn;
4601 if (strEQ(d,"wait")) return -KEY_wait;
4604 if (strEQ(d,"while")) return KEY_while;
4605 if (strEQ(d,"write")) return -KEY_write;
4608 if (strEQ(d,"waitpid")) return -KEY_waitpid;
4611 if (strEQ(d,"wantarray")) return -KEY_wantarray;
4616 if (len == 1) return -KEY_x;
4617 if (strEQ(d,"xor")) return -KEY_xor;
4620 if (len == 1) return KEY_y;
4629 checkcomma(register char *s, char *name, char *what)
4633 if (dowarn && *s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
4635 for (w = s+2; *w && level; w++) {
4642 for (; *w && isSPACE(*w); w++) ;
4643 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
4644 warn("%s (...) interpreted as function",name);
4646 while (s < bufend && isSPACE(*s))
4650 while (s < bufend && isSPACE(*s))
4652 if (isIDFIRST(*s)) {
4656 while (s < bufend && isSPACE(*s))
4661 kw = keyword(w, s - w) || perl_get_cv(w, FALSE) != 0;
4665 croak("No comma allowed after %s", what);
4671 scan_word(register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
4673 register char *d = dest;
4674 register char *e = d + destlen - 3; /* two-character token, ending NUL */
4677 croak(ident_too_long);
4680 else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
4685 else if (*s == ':' && s[1] == ':' && allow_package && isIDFIRST(s[2])) {
4698 scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
4705 if (lex_brackets == 0)
4710 e = d + destlen - 3; /* two-character token, ending NUL */
4712 while (isDIGIT(*s)) {
4714 croak(ident_too_long);
4721 croak(ident_too_long);
4724 else if (*s == '\'' && isIDFIRST(s[1])) {
4729 else if (*s == ':' && s[1] == ':') {
4740 if (lex_state != LEX_NORMAL)
4741 lex_state = LEX_INTERPENDMAYBE;
4744 if (*s == '$' && s[1] &&
4745 (isALNUM(s[1]) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
4747 if (isDIGIT(s[1]) && lex_state == LEX_INTERPNORMAL)
4748 deprecate("\"$$<digit>\" to mean \"${$}<digit>\"");
4761 if (*d == '^' && *s && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
4766 if (isSPACE(s[-1])) {
4769 if (ch != ' ' && ch != '\t') {
4775 if (isIDFIRST(*d)) {
4777 while (isALNUM(*s) || *s == ':')
4780 while (s < send && (*s == ' ' || *s == '\t')) s++;
4781 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
4782 if (dowarn && keyword(dest, d - dest)) {
4783 char *brack = *s == '[' ? "[...]" : "{...}";
4784 warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
4785 funny, dest, brack, funny, dest, brack);
4787 lex_fakebrack = lex_brackets+1;
4789 lex_brackstack[lex_brackets++] = XOPERATOR;
4795 if (lex_state == LEX_INTERPNORMAL && !lex_brackets)
4796 lex_state = LEX_INTERPEND;
4799 if (dowarn && lex_state == LEX_NORMAL &&
4800 (keyword(dest, d - dest) || perl_get_cv(dest, FALSE)))
4801 warn("Ambiguous use of %c{%s} resolved to %c%s",
4802 funny, dest, funny, dest);
4805 s = bracket; /* let the parser handle it */
4809 else if (lex_state == LEX_INTERPNORMAL && !lex_brackets && !intuit_more(s))
4810 lex_state = LEX_INTERPEND;
4814 void pmflag(U16 *pmfl, int ch)
4819 *pmfl |= PMf_GLOBAL;
4821 *pmfl |= PMf_CONTINUE;
4825 *pmfl |= PMf_MULTILINE;
4827 *pmfl |= PMf_SINGLELINE;
4829 *pmfl |= PMf_EXTENDED;
4833 scan_pat(char *start)
4838 s = scan_str(start);
4841 SvREFCNT_dec(lex_stuff);
4843 croak("Search pattern not terminated");
4846 pm = (PMOP*)newPMOP(OP_MATCH, 0);
4847 if (multi_open == '?')
4848 pm->op_pmflags |= PMf_ONCE;
4849 while (*s && strchr("iogcmsx", *s))
4850 pmflag(&pm->op_pmflags,*s++);
4851 pm->op_pmpermflags = pm->op_pmflags;
4854 yylval.ival = OP_MATCH;
4859 scan_subst(char *start)
4866 yylval.ival = OP_NULL;
4868 s = scan_str(start);
4872 SvREFCNT_dec(lex_stuff);
4874 croak("Substitution pattern not terminated");
4877 if (s[-1] == multi_open)
4880 first_start = multi_start;
4884 SvREFCNT_dec(lex_stuff);
4887 SvREFCNT_dec(lex_repl);
4889 croak("Substitution replacement not terminated");
4891 multi_start = first_start; /* so whole substitution is taken together */
4893 pm = (PMOP*)newPMOP(OP_SUBST, 0);
4894 while (*s && strchr("iogcmsex", *s)) {
4900 pmflag(&pm->op_pmflags,*s++);
4905 pm->op_pmflags |= PMf_EVAL;
4906 repl = newSVpv("",0);
4908 sv_catpv(repl, es ? "eval " : "do ");
4909 sv_catpvn(repl, "{ ", 2);
4910 sv_catsv(repl, lex_repl);
4911 sv_catpvn(repl, " };", 2);
4912 SvCOMPILED_on(repl);
4913 SvREFCNT_dec(lex_repl);
4917 pm->op_pmpermflags = pm->op_pmflags;
4919 yylval.ival = OP_SUBST;
4924 scan_trans(char *start)
4933 yylval.ival = OP_NULL;
4935 s = scan_str(start);
4938 SvREFCNT_dec(lex_stuff);
4940 croak("Translation pattern not terminated");
4942 if (s[-1] == multi_open)
4948 SvREFCNT_dec(lex_stuff);
4951 SvREFCNT_dec(lex_repl);
4953 croak("Translation replacement not terminated");
4956 New(803,tbl,256,short);
4957 o = newPVOP(OP_TRANS, 0, (char*)tbl);
4959 complement = Delete = squash = 0;
4960 while (*s == 'c' || *s == 'd' || *s == 's') {
4962 complement = OPpTRANS_COMPLEMENT;
4964 Delete = OPpTRANS_DELETE;
4966 squash = OPpTRANS_SQUASH;
4969 o->op_private = Delete|squash|complement;
4972 yylval.ival = OP_TRANS;
4977 scan_heredoc(register char *s)
4981 I32 op_type = OP_SCALAR;
4988 int outer = (rsfp && !(lex_inwhat == OP_SCALAR));
4992 e = tokenbuf + sizeof tokenbuf - 1;
4995 for (peek = s; *peek == ' ' || *peek == '\t'; peek++) ;
4996 if (*peek && strchr("`'\"",*peek)) {
4999 s = delimcpy(d, e, s, bufend, term, &len);
5010 deprecate("bare << to mean <<\"\"");
5011 for (; isALNUM(*s); s++) {
5016 if (d >= tokenbuf + sizeof tokenbuf - 1)
5017 croak("Delimiter for here document is too long");
5022 if (outer || !(d=ninstr(s,bufend,d,d+1)))
5023 herewas = newSVpv(s,bufend-s);
5025 s--, herewas = newSVpv(s,d-s);
5026 s += SvCUR(herewas);
5028 tmpstr = NEWSV(87,80);
5029 sv_upgrade(tmpstr, SVt_PVIV);
5034 else if (term == '`') {
5035 op_type = OP_BACKTICK;
5036 SvIVX(tmpstr) = '\\';
5040 multi_start = curcop->cop_line;
5041 multi_open = multi_close = '<';
5045 while (s < bufend &&
5046 (*s != term || memNE(s,tokenbuf,len)) ) {
5051 curcop->cop_line = multi_start;
5052 missingterm(tokenbuf);
5054 sv_setpvn(tmpstr,d+1,s-d);
5056 curcop->cop_line++; /* the preceding stmt passes a newline */
5058 sv_catpvn(herewas,s,bufend-s);
5059 sv_setsv(linestr,herewas);
5060 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
5061 bufend = SvPVX(linestr) + SvCUR(linestr);
5064 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
5065 while (s >= bufend) { /* multiple line string? */
5067 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5068 curcop->cop_line = multi_start;
5069 missingterm(tokenbuf);
5072 if (PERLDB_LINE && curstash != debstash) {
5073 SV *sv = NEWSV(88,0);
5075 sv_upgrade(sv, SVt_PVMG);
5076 sv_setsv(sv,linestr);
5077 av_store(GvAV(curcop->cop_filegv),
5078 (I32)curcop->cop_line,sv);
5080 bufend = SvPVX(linestr) + SvCUR(linestr);
5081 if (*s == term && memEQ(s,tokenbuf,len)) {
5084 sv_catsv(linestr,herewas);
5085 bufend = SvPVX(linestr) + SvCUR(linestr);
5089 sv_catsv(tmpstr,linestr);
5092 multi_end = curcop->cop_line;
5094 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
5095 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
5096 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
5098 SvREFCNT_dec(herewas);
5100 yylval.ival = op_type;
5105 takes: current position in input buffer
5106 returns: new position in input buffer
5107 side-effects: yylval and lex_op are set.
5112 <FH> read from filehandle
5113 <pkg::FH> read from package qualified filehandle
5114 <pkg'FH> read from package qualified filehandle
5115 <$fh> read from filehandle in $fh
5121 scan_inputsymbol(char *start)
5123 register char *s = start; /* current position in buffer */
5128 d = tokenbuf; /* start of temp holding space */
5129 e = tokenbuf + sizeof tokenbuf; /* end of temp holding space */
5130 s = delimcpy(d, e, s + 1, bufend, '>', &len); /* extract until > */
5132 /* die if we didn't have space for the contents of the <>,
5136 if (len >= sizeof tokenbuf)
5137 croak("Excessively long <> operator");
5139 croak("Unterminated <> operator");
5144 Remember, only scalar variables are interpreted as filehandles by
5145 this code. Anything more complex (e.g., <$fh{$num}>) will be
5146 treated as a glob() call.
5147 This code makes use of the fact that except for the $ at the front,
5148 a scalar variable and a filehandle look the same.
5150 if (*d == '$' && d[1]) d++;
5152 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
5153 while (*d && (isALNUM(*d) || *d == '\'' || *d == ':'))
5156 /* If we've tried to read what we allow filehandles to look like, and
5157 there's still text left, then it must be a glob() and not a getline.
5158 Use scan_str to pull out the stuff between the <> and treat it
5159 as nothing more than a string.
5162 if (d - tokenbuf != len) {
5163 yylval.ival = OP_GLOB;
5165 s = scan_str(start);
5167 croak("Glob not terminated");
5171 /* we're in a filehandle read situation */
5174 /* turn <> into <ARGV> */
5176 (void)strcpy(d,"ARGV");
5178 /* if <$fh>, create the ops to turn the variable into a
5184 /* try to find it in the pad for this block, otherwise find
5185 add symbol table ops
5187 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
5188 OP *o = newOP(OP_PADSV, 0);
5190 lex_op = (OP*)newUNOP(OP_READLINE, 0, newUNOP(OP_RV2GV, 0, o));
5193 GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
5194 lex_op = (OP*)newUNOP(OP_READLINE, 0,
5195 newUNOP(OP_RV2GV, 0,
5196 newUNOP(OP_RV2SV, 0,
5197 newGVOP(OP_GV, 0, gv))));
5199 /* we created the ops in lex_op, so make yylval.ival a null op */
5200 yylval.ival = OP_NULL;
5203 /* If it's none of the above, it must be a literal filehandle
5204 (<Foo::BAR> or <FOO>) so build a simple readline OP */
5206 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
5207 lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
5208 yylval.ival = OP_NULL;
5217 takes: start position in buffer
5218 returns: position to continue reading from buffer
5219 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
5220 updates the read buffer.
5222 This subroutine pulls a string out of the input. It is called for:
5223 q single quotes q(literal text)
5224 ' single quotes 'literal text'
5225 qq double quotes qq(interpolate $here please)
5226 " double quotes "interpolate $here please"
5227 qx backticks qx(/bin/ls -l)
5228 ` backticks `/bin/ls -l`
5229 qw quote words @EXPORT_OK = qw( func() $spam )
5230 m// regexp match m/this/
5231 s/// regexp substitute s/this/that/
5232 tr/// string transliterate tr/this/that/
5233 y/// string transliterate y/this/that/
5234 ($*@) sub prototypes sub foo ($)
5235 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
5237 In most of these cases (all but <>, patterns and transliterate)
5238 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
5239 calls scan_str(). s/// makes yylex() call scan_subst() which calls
5240 scan_str(). tr/// and y/// make yylex() call scan_trans() which
5243 It skips whitespace before the string starts, and treats the first
5244 character as the delimiter. If the delimiter is one of ([{< then
5245 the corresponding "close" character )]}> is used as the closing
5246 delimiter. It allows quoting of delimiters, and if the string has
5247 balanced delimiters ([{<>}]) it allows nesting.
5249 The lexer always reads these strings into lex_stuff, except in the
5250 case of the operators which take *two* arguments (s/// and tr///)
5251 when it checks to see if lex_stuff is full (presumably with the 1st
5252 arg to s or tr) and if so puts the string into lex_repl.
5257 scan_str(char *start)
5260 SV *sv; /* scalar value: string */
5261 char *tmps; /* temp string, used for delimiter matching */
5262 register char *s = start; /* current position in the buffer */
5263 register char term; /* terminating character */
5264 register char *to; /* current position in the sv's data */
5265 I32 brackets = 1; /* bracket nesting level */
5267 /* skip space before the delimiter */
5271 /* mark where we are, in case we need to report errors */
5274 /* after skipping whitespace, the next character is the terminator */
5276 /* mark where we are */
5277 multi_start = curcop->cop_line;
5280 /* find corresponding closing delimiter */
5281 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5285 /* create a new SV to hold the contents. 87 is leak category, I'm
5286 assuming. 80 is the SV's initial length. What a random number. */
5288 sv_upgrade(sv, SVt_PVIV);
5290 (void)SvPOK_only(sv); /* validate pointer */
5292 /* move past delimiter and try to read a complete string */
5295 /* extend sv if need be */
5296 SvGROW(sv, SvCUR(sv) + (bufend - s) + 1);
5297 /* set 'to' to the next character in the sv's string */
5298 to = SvPVX(sv)+SvCUR(sv);
5300 /* if open delimiter is the close delimiter read unbridle */
5301 if (multi_open == multi_close) {
5302 for (; s < bufend; s++,to++) {
5303 /* embedded newlines increment the current line number */
5304 if (*s == '\n' && !rsfp)
5306 /* handle quoted delimiters */
5307 if (*s == '\\' && s+1 < bufend && term != '\\') {
5310 /* any other quotes are simply copied straight through */
5314 /* terminate when run out of buffer (the for() condition), or
5315 have found the terminator */
5316 else if (*s == term)
5322 /* if the terminator isn't the same as the start character (e.g.,
5323 matched brackets), we have to allow more in the quoting, and
5324 be prepared for nested brackets.
5327 /* read until we run out of string, or we find the terminator */
5328 for (; s < bufend; s++,to++) {
5329 /* embedded newlines increment the line count */
5330 if (*s == '\n' && !rsfp)
5332 /* backslashes can escape the open or closing characters */
5333 if (*s == '\\' && s+1 < bufend) {
5334 if ((s[1] == multi_open) || (s[1] == multi_close))
5339 /* allow nested opens and closes */
5340 else if (*s == multi_close && --brackets <= 0)
5342 else if (*s == multi_open)
5347 /* terminate the copied string and update the sv's end-of-string */
5349 SvCUR_set(sv, to - SvPVX(sv));
5352 * this next chunk reads more into the buffer if we're not done yet
5355 if (s < bufend) break; /* handle case where we are done yet :-) */
5357 /* if we're out of file, or a read fails, bail and reset the current
5358 line marker so we can report where the unterminated string began
5361 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5363 curcop->cop_line = multi_start;
5366 /* we read a line, so increment our line counter */
5369 /* update debugger info */
5370 if (PERLDB_LINE && curstash != debstash) {
5371 SV *sv = NEWSV(88,0);
5373 sv_upgrade(sv, SVt_PVMG);
5374 sv_setsv(sv,linestr);
5375 av_store(GvAV(curcop->cop_filegv),
5376 (I32)curcop->cop_line, sv);
5379 /* having changed the buffer, we must update bufend */
5380 bufend = SvPVX(linestr) + SvCUR(linestr);
5383 /* at this point, we have successfully read the delimited string */
5385 multi_end = curcop->cop_line;
5388 /* if we allocated too much space, give some back */
5389 if (SvCUR(sv) + 5 < SvLEN(sv)) {
5390 SvLEN_set(sv, SvCUR(sv) + 1);
5391 Renew(SvPVX(sv), SvLEN(sv), char);
5394 /* decide whether this is the first or second quoted string we've read
5407 takes: pointer to position in buffer
5408 returns: pointer to new position in buffer
5409 side-effects: builds ops for the constant in yylval.op
5411 Read a number in any of the formats that Perl accepts:
5413 0(x[0-7A-F]+)|([0-7]+)
5414 [\d_]+(\.[\d_]*)?[Ee](\d+)
5416 Underbars (_) are allowed in decimal numbers. If -w is on,
5417 underbars before a decimal point must be at three digit intervals.
5419 Like most scan_ routines, it uses the tokenbuf buffer to hold the
5422 If it reads a number without a decimal point or an exponent, it will
5423 try converting the number to an integer and see if it can do so
5424 without loss of precision.
5428 scan_num(char *start)
5430 register char *s = start; /* current position in buffer */
5431 register char *d; /* destination in temp buffer */
5432 register char *e; /* end of temp buffer */
5433 I32 tryiv; /* used to see if it can be an int */
5434 double value; /* number read, as a double */
5435 SV *sv; /* place to put the converted number */
5436 I32 floatit; /* boolean: int or float? */
5437 char *lastub = 0; /* position of last underbar */
5438 static char number_too_long[] = "Number too long";
5440 /* We use the first character to decide what type of number this is */
5444 croak("panic: scan_num");
5446 /* if it starts with a 0, it could be an octal number, a decimal in
5447 0.13 disguise, or a hexadecimal number.
5452 u holds the "number so far"
5453 shift the power of 2 of the base (hex == 4, octal == 3)
5454 overflowed was the number more than we can hold?
5456 Shift is used when we add a digit. It also serves as an "are
5457 we in octal or hex?" indicator to disallow hex characters when
5462 bool overflowed = FALSE;
5469 /* check for a decimal in disguise */
5470 else if (s[1] == '.')
5472 /* so it must be octal */
5477 /* read the rest of the octal number */
5479 UV n, b; /* n is used in the overflow test, b is the digit we're adding on */
5483 /* if we don't mention it, we're done */
5492 /* 8 and 9 are not octal */
5495 yyerror("Illegal octal digit");
5499 case '0': case '1': case '2': case '3': case '4':
5500 case '5': case '6': case '7':
5501 b = *s++ & 15; /* ASCII digit -> value of digit */
5505 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
5506 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
5507 /* make sure they said 0x */
5512 /* Prepare to put the digit we have onto the end
5513 of the number so far. We check for overflows.
5517 n = u << shift; /* make room for the digit */
5518 if (!overflowed && (n >> shift) != u) {
5519 warn("Integer overflow in %s number",
5520 (shift == 4) ? "hex" : "octal");
5523 u = n | b; /* add the digit to the end */
5528 /* if we get here, we had success: make a scalar value from
5538 handle decimal numbers.
5539 we're also sent here when we read a 0 as the first digit
5541 case '1': case '2': case '3': case '4': case '5':
5542 case '6': case '7': case '8': case '9': case '.':
5545 e = tokenbuf + sizeof tokenbuf - 6; /* room for various punctuation */
5548 /* read next group of digits and _ and copy into d */
5549 while (isDIGIT(*s) || *s == '_') {
5550 /* skip underscores, checking for misplaced ones
5554 if (dowarn && lastub && s - lastub != 3)
5555 warn("Misplaced _ in number");
5559 /* check for end of fixed-length buffer */
5561 croak(number_too_long);
5562 /* if we're ok, copy the character */
5567 /* final misplaced underbar check */
5568 if (dowarn && lastub && s - lastub != 3)
5569 warn("Misplaced _ in number");
5571 /* read a decimal portion if there is one. avoid
5572 3..5 being interpreted as the number 3. followed
5575 if (*s == '.' && s[1] != '.') {
5579 /* copy, ignoring underbars, until we run out of
5580 digits. Note: no misplaced underbar checks!
5582 for (; isDIGIT(*s) || *s == '_'; s++) {
5583 /* fixed length buffer check */
5585 croak(number_too_long);
5591 /* read exponent part, if present */
5592 if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
5596 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
5597 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
5599 /* allow positive or negative exponent */
5600 if (*s == '+' || *s == '-')
5603 /* read digits of exponent (no underbars :-) */
5604 while (isDIGIT(*s)) {
5606 croak(number_too_long);
5611 /* terminate the string */
5614 /* make an sv from the string */
5616 /* reset numeric locale in case we were earlier left in Swaziland */
5617 SET_NUMERIC_STANDARD();
5618 value = atof(tokenbuf);
5621 See if we can make do with an integer value without loss of
5622 precision. We use I_V to cast to an int, because some
5623 compilers have issues. Then we try casting it back and see
5624 if it was the same. We only do this if we know we
5625 specifically read an integer.
5627 Note: if floatit is true, then we don't need to do the
5631 if (!floatit && (double)tryiv == value)
5632 sv_setiv(sv, tryiv);
5634 sv_setnv(sv, value);
5638 /* make the op for the constant and return */
5640 yylval.opval = newSVOP(OP_CONST, 0, sv);
5646 scan_formline(register char *s)
5651 SV *stuff = newSVpv("",0);
5652 bool needargs = FALSE;
5655 if (*s == '.' || *s == '}') {
5657 for (t = s+1; *t == ' ' || *t == '\t'; t++) ;
5661 if (in_eval && !rsfp) {
5662 eol = strchr(s,'\n');
5667 eol = bufend = SvPVX(linestr) + SvCUR(linestr);
5669 for (t = s; t < eol; t++) {
5670 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
5672 goto enough; /* ~~ must be first line in formline */
5674 if (*t == '@' || *t == '^')
5677 sv_catpvn(stuff, s, eol-s);
5681 s = filter_gets(linestr, rsfp, 0);
5682 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
5683 bufend = bufptr + SvCUR(linestr);
5686 yyerror("Format not terminated");
5696 lex_state = LEX_NORMAL;
5697 nextval[nexttoke].ival = 0;
5701 lex_state = LEX_FORMLINE;
5702 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
5704 nextval[nexttoke].ival = OP_FORMLINE;
5708 SvREFCNT_dec(stuff);
5720 cshlen = strlen(cshname);
5725 start_subparse(I32 is_format, U32 flags)
5728 I32 oldsavestack_ix = savestack_ix;
5729 CV* outsidecv = compcv;
5733 assert(SvTYPE(compcv) == SVt_PVCV);
5740 SAVESPTR(comppad_name);
5742 SAVEI32(comppad_name_fill);
5743 SAVEI32(min_intro_pending);
5744 SAVEI32(max_intro_pending);
5745 SAVEI32(pad_reset_pending);
5747 compcv = (CV*)NEWSV(1104,0);
5748 sv_upgrade((SV *)compcv, is_format ? SVt_PVFM : SVt_PVCV);
5749 CvFLAGS(compcv) |= flags;
5752 av_push(comppad, Nullsv);
5753 curpad = AvARRAY(comppad);
5754 comppad_name = newAV();
5755 comppad_name_fill = 0;
5756 min_intro_pending = 0;
5758 subline = curcop->cop_line;
5760 av_store(comppad_name, 0, newSVpv("@_", 2));
5761 curpad[0] = (SV*)newAV();
5762 SvPADMY_on(curpad[0]); /* XXX Needed? */
5763 CvOWNER(compcv) = 0;
5764 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5765 MUTEX_INIT(CvMUTEXP(compcv));
5766 #endif /* USE_THREADS */
5768 comppadlist = newAV();
5769 AvREAL_off(comppadlist);
5770 av_store(comppadlist, 0, (SV*)comppad_name);
5771 av_store(comppadlist, 1, (SV*)comppad);
5773 CvPADLIST(compcv) = comppadlist;
5774 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(outsidecv);
5776 CvOWNER(compcv) = 0;
5777 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5778 MUTEX_INIT(CvMUTEXP(compcv));
5779 #endif /* USE_THREADS */
5781 return oldsavestack_ix;
5800 char *context = NULL;
5804 if (!yychar || (yychar == ';' && !rsfp))
5806 else if (bufptr > oldoldbufptr && bufptr - oldoldbufptr < 200 &&
5807 oldoldbufptr != oldbufptr && oldbufptr != bufptr) {
5808 while (isSPACE(*oldoldbufptr))
5810 context = oldoldbufptr;
5811 contlen = bufptr - oldoldbufptr;
5813 else if (bufptr > oldbufptr && bufptr - oldbufptr < 200 &&
5814 oldbufptr != bufptr) {
5815 while (isSPACE(*oldbufptr))
5817 context = oldbufptr;
5818 contlen = bufptr - oldbufptr;
5820 else if (yychar > 255)
5821 where = "next token ???";
5822 else if ((yychar & 127) == 127) {
5823 if (lex_state == LEX_NORMAL ||
5824 (lex_state == LEX_KNOWNEXT && lex_defer == LEX_NORMAL))
5825 where = "at end of line";
5827 where = "within pattern";
5829 where = "within string";
5832 SV *where_sv = sv_2mortal(newSVpv("next char ", 0));
5834 sv_catpvf(where_sv, "^%c", toCTRL(yychar));
5835 else if (isPRINT_LC(yychar))
5836 sv_catpvf(where_sv, "%c", yychar);
5838 sv_catpvf(where_sv, "\\%03o", yychar & 255);
5839 where = SvPVX(where_sv);
5841 msg = sv_2mortal(newSVpv(s, 0));
5842 sv_catpvf(msg, " at %_ line %ld, ",
5843 GvSV(curcop->cop_filegv), (long)curcop->cop_line);
5845 sv_catpvf(msg, "near \"%.*s\"\n", contlen, context);
5847 sv_catpvf(msg, "%s\n", where);
5848 if (multi_start < multi_end && (U32)(curcop->cop_line - multi_end) <= 1) {
5850 " (Might be a runaway multi-line %c%c string starting on line %ld)\n",
5851 (int)multi_open,(int)multi_close,(long)multi_start);
5857 sv_catsv(ERRSV, msg);
5859 PerlIO_write(PerlIO_stderr(), SvPVX(msg), SvCUR(msg));
5860 if (++error_count >= 10)
5861 croak("%_ has too many errors.\n", GvSV(curcop->cop_filegv));
5863 in_my_stash = Nullhv;