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);
1361 filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
1364 if (!rsfp_filters) {
1365 filter_add(win32_textfilter,NULL);
1371 SvCUR_set(sv, 0); /* start with empty line */
1372 if (FILTER_READ(0, sv, 0) > 0)
1373 return ( SvPVX(sv) ) ;
1378 return (sv_gets(sv, fp, append));
1383 static char* exp_name[] =
1384 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
1387 EXT int yychar; /* last token */
1392 Works out what to call the token just pulled out of the input
1393 stream. The yacc parser takes care of taking the ops we return and
1394 stitching them into a tree.
1400 if read an identifier
1401 if we're in a my declaration
1402 croak if they tried to say my($foo::bar)
1403 build the ops for a my() declaration
1404 if it's an access to a my() variable
1405 are we in a sort block?
1406 croak if my($a); $a <=> $b
1407 build ops for access to a my() variable
1408 if in a dq string, and they've said @foo and we can't find @foo
1410 build ops for a bareword
1411 if we already built the token before, use it.
1425 /* check if there's an identifier for us to look at */
1426 if (pending_ident) {
1427 /* pit holds the identifier we read and pending_ident is reset */
1428 char pit = pending_ident;
1431 /* if we're in a my(), we can't allow dynamics here.
1432 $foo'bar has already been turned into $foo::bar, so
1433 just check for colons.
1435 if it's a legal name, the OP is a PADANY.
1438 if (strchr(tokenbuf,':'))
1439 croak(no_myglob,tokenbuf);
1441 yylval.opval = newOP(OP_PADANY, 0);
1442 yylval.opval->op_targ = pad_allocmy(tokenbuf);
1447 build the ops for accesses to a my() variable.
1449 Deny my($a) or my($b) in a sort block, *if* $a or $b is
1450 then used in a comparison. This catches most, but not
1451 all cases. For instance, it catches
1452 sort { my($a); $a <=> $b }
1454 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
1455 (although why you'd do that is anyone's guess).
1458 if (!strchr(tokenbuf,':')) {
1460 /* Check for single character per-thread SVs */
1461 if (tokenbuf[0] == '$' && tokenbuf[2] == '\0'
1462 && !isALPHA(tokenbuf[1]) /* Rule out obvious non-threadsvs */
1463 && (tmp = find_threadsv(&tokenbuf[1])) != NOT_IN_PAD)
1465 yylval.opval = newOP(OP_THREADSV, 0);
1466 yylval.opval->op_targ = tmp;
1469 #endif /* USE_THREADS */
1470 if ((tmp = pad_findmy(tokenbuf)) != NOT_IN_PAD) {
1471 /* if it's a sort block and they're naming $a or $b */
1472 if (last_lop_op == OP_SORT &&
1473 tokenbuf[0] == '$' &&
1474 (tokenbuf[1] == 'a' || tokenbuf[1] == 'b')
1477 for (d = in_eval ? oldoldbufptr : linestart;
1478 d < bufend && *d != '\n';
1481 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
1482 croak("Can't use \"my %s\" in sort comparison",
1488 yylval.opval = newOP(OP_PADANY, 0);
1489 yylval.opval->op_targ = tmp;
1495 Whine if they've said @foo in a doublequoted string,
1496 and @foo isn't a variable we can find in the symbol
1499 if (pit == '@' && lex_state != LEX_NORMAL && !lex_brackets) {
1500 GV *gv = gv_fetchpv(tokenbuf+1, FALSE, SVt_PVAV);
1501 if (!gv || ((tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
1502 yyerror(form("In string, %s now must be written as \\%s",
1503 tokenbuf, tokenbuf));
1506 /* build ops for a bareword */
1507 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf+1, 0));
1508 yylval.opval->op_private = OPpCONST_ENTERED;
1509 gv_fetchpv(tokenbuf+1, in_eval ? GV_ADDMULTI : TRUE,
1510 ((tokenbuf[0] == '$') ? SVt_PV
1511 : (tokenbuf[0] == '@') ? SVt_PVAV
1516 /* no identifier pending identification */
1518 switch (lex_state) {
1520 case LEX_NORMAL: /* Some compilers will produce faster */
1521 case LEX_INTERPNORMAL: /* code if we comment these out. */
1525 /* when we're already built the next token, just pull it out the queue */
1528 yylval = nextval[nexttoke];
1530 lex_state = lex_defer;
1531 expect = lex_expect;
1532 lex_defer = LEX_NORMAL;
1534 return(nexttype[nexttoke]);
1536 /* interpolated case modifiers like \L \U, including \Q and \E.
1537 when we get here, bufptr is at the \
1539 case LEX_INTERPCASEMOD:
1541 if (bufptr != bufend && *bufptr != '\\')
1542 croak("panic: INTERPCASEMOD");
1544 /* handle \E or end of string */
1545 if (bufptr == bufend || bufptr[1] == 'E') {
1550 oldmod = lex_casestack[--lex_casemods];
1551 lex_casestack[lex_casemods] = '\0';
1553 if (bufptr != bufend && strchr("LUQ", oldmod)) {
1555 lex_state = LEX_INTERPCONCAT;
1559 if (bufptr != bufend)
1561 lex_state = LEX_INTERPCONCAT;
1566 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
1567 tmp = *s, *s = s[2], s[2] = tmp; /* misordered... */
1568 if (strchr("LU", *s) &&
1569 (strchr(lex_casestack, 'L') || strchr(lex_casestack, 'U')))
1571 lex_casestack[--lex_casemods] = '\0';
1574 if (lex_casemods > 10) {
1575 char* newlb = Renew(lex_casestack, lex_casemods + 2, char);
1576 if (newlb != lex_casestack) {
1578 lex_casestack = newlb;
1581 lex_casestack[lex_casemods++] = *s;
1582 lex_casestack[lex_casemods] = '\0';
1583 lex_state = LEX_INTERPCONCAT;
1584 nextval[nexttoke].ival = 0;
1587 nextval[nexttoke].ival = OP_LCFIRST;
1589 nextval[nexttoke].ival = OP_UCFIRST;
1591 nextval[nexttoke].ival = OP_LC;
1593 nextval[nexttoke].ival = OP_UC;
1595 nextval[nexttoke].ival = OP_QUOTEMETA;
1597 croak("panic: yylex");
1609 case LEX_INTERPPUSH:
1610 return sublex_push();
1612 case LEX_INTERPSTART:
1613 if (bufptr == bufend)
1614 return sublex_done();
1616 lex_dojoin = (*bufptr == '@');
1617 lex_state = LEX_INTERPNORMAL;
1619 nextval[nexttoke].ival = 0;
1622 nextval[nexttoke].opval = newOP(OP_THREADSV, 0);
1623 nextval[nexttoke].opval->op_targ = find_threadsv("\"");
1624 force_next(PRIVATEREF);
1626 force_ident("\"", '$');
1627 #endif /* USE_THREADS */
1628 nextval[nexttoke].ival = 0;
1630 nextval[nexttoke].ival = 0;
1632 nextval[nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
1641 case LEX_INTERPENDMAYBE:
1642 if (intuit_more(bufptr)) {
1643 lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
1651 lex_state = LEX_INTERPCONCAT;
1655 case LEX_INTERPCONCAT:
1658 croak("panic: INTERPCONCAT");
1660 if (bufptr == bufend)
1661 return sublex_done();
1663 if (SvIVX(linestr) == '\'') {
1664 SV *sv = newSVsv(linestr);
1667 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1671 s = scan_const(bufptr);
1673 lex_state = LEX_INTERPCASEMOD;
1675 lex_state = LEX_INTERPSTART;
1679 nextval[nexttoke] = yylval;
1692 lex_state = LEX_NORMAL;
1693 s = scan_formline(bufptr);
1700 oldoldbufptr = oldbufptr;
1703 PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[expect], s);
1709 croak("Unrecognized character \\%03o", *s & 255);
1712 goto fake_eof; /* emulate EOF on ^D or ^Z */
1718 yyerror("Missing right bracket");
1722 goto retry; /* ignore stray nulls */
1725 if (!in_eval && !preambled) {
1727 sv_setpv(linestr,incl_perldb());
1729 sv_catpv(linestr,";");
1731 while(AvFILLp(preambleav) >= 0) {
1732 SV *tmpsv = av_shift(preambleav);
1733 sv_catsv(linestr, tmpsv);
1734 sv_catpv(linestr, ";");
1737 sv_free((SV*)preambleav);
1740 if (minus_n || minus_p) {
1741 sv_catpv(linestr, "LINE: while (<>) {");
1743 sv_catpv(linestr,"chomp;");
1745 GV* gv = gv_fetchpv("::F", TRUE, SVt_PVAV);
1747 GvIMPORTED_AV_on(gv);
1749 if (strchr("/'\"", *splitstr)
1750 && strchr(splitstr + 1, *splitstr))
1751 sv_catpvf(linestr, "@F=split(%s);", splitstr);
1754 s = "'~#\200\1'"; /* surely one char is unused...*/
1755 while (s[1] && strchr(splitstr, *s)) s++;
1757 sv_catpvf(linestr, "@F=split(%s%c",
1758 "q" + (delim == '\''), delim);
1759 for (s = splitstr; *s; s++) {
1761 sv_catpvn(linestr, "\\", 1);
1762 sv_catpvn(linestr, s, 1);
1764 sv_catpvf(linestr, "%c);", delim);
1768 sv_catpv(linestr,"@F=split(' ');");
1771 sv_catpv(linestr, "\n");
1772 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1773 bufend = SvPVX(linestr) + SvCUR(linestr);
1774 if (PERLDB_LINE && curstash != debstash) {
1775 SV *sv = NEWSV(85,0);
1777 sv_upgrade(sv, SVt_PVMG);
1778 sv_setsv(sv,linestr);
1779 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1784 if ((s = filter_gets(linestr, rsfp, 0)) == Nullch) {
1787 if (preprocess && !in_eval)
1788 (void)PerlProc_pclose(rsfp);
1789 else if ((PerlIO *)rsfp == PerlIO_stdin())
1790 PerlIO_clearerr(rsfp);
1792 (void)PerlIO_close(rsfp);
1797 if (!in_eval && (minus_n || minus_p)) {
1798 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
1799 sv_catpv(linestr,";}");
1800 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1801 bufend = SvPVX(linestr) + SvCUR(linestr);
1802 minus_n = minus_p = 0;
1805 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1806 sv_setpv(linestr,"");
1807 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
1810 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
1813 /* Incest with pod. */
1814 if (*s == '=' && strnEQ(s, "=cut", 4)) {
1815 sv_setpv(linestr, "");
1816 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1817 bufend = SvPVX(linestr) + SvCUR(linestr);
1822 } while (doextract);
1823 oldoldbufptr = oldbufptr = bufptr = linestart = s;
1824 if (PERLDB_LINE && curstash != debstash) {
1825 SV *sv = NEWSV(85,0);
1827 sv_upgrade(sv, SVt_PVMG);
1828 sv_setsv(sv,linestr);
1829 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1831 bufend = SvPVX(linestr) + SvCUR(linestr);
1832 if (curcop->cop_line == 1) {
1833 while (s < bufend && isSPACE(*s))
1835 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
1839 if (*s == '#' && *(s+1) == '!')
1841 #ifdef ALTERNATE_SHEBANG
1843 static char as[] = ALTERNATE_SHEBANG;
1844 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
1845 d = s + (sizeof(as) - 1);
1847 #endif /* ALTERNATE_SHEBANG */
1856 while (*d && !isSPACE(*d))
1860 #ifdef ARG_ZERO_IS_SCRIPT
1861 if (ipathend > ipath) {
1863 * HP-UX (at least) sets argv[0] to the script name,
1864 * which makes $^X incorrect. And Digital UNIX and Linux,
1865 * at least, set argv[0] to the basename of the Perl
1866 * interpreter. So, having found "#!", we'll set it right.
1868 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
1869 assert(SvPOK(x) || SvGMAGICAL(x));
1870 if (sv_eq(x, GvSV(curcop->cop_filegv))) {
1871 sv_setpvn(x, ipath, ipathend - ipath);
1874 TAINT_NOT; /* $^X is always tainted, but that's OK */
1876 #endif /* ARG_ZERO_IS_SCRIPT */
1881 d = instr(s,"perl -");
1883 d = instr(s,"perl");
1884 #ifdef ALTERNATE_SHEBANG
1886 * If the ALTERNATE_SHEBANG on this system starts with a
1887 * character that can be part of a Perl expression, then if
1888 * we see it but not "perl", we're probably looking at the
1889 * start of Perl code, not a request to hand off to some
1890 * other interpreter. Similarly, if "perl" is there, but
1891 * not in the first 'word' of the line, we assume the line
1892 * contains the start of the Perl program.
1894 if (d && *s != '#') {
1896 while (*c && !strchr("; \t\r\n\f\v#", *c))
1899 d = Nullch; /* "perl" not in first word; ignore */
1901 *s = '#'; /* Don't try to parse shebang line */
1903 #endif /* ALTERNATE_SHEBANG */
1908 !instr(s,"indir") &&
1909 instr(origargv[0],"perl"))
1915 while (s < bufend && isSPACE(*s))
1918 Newz(899,newargv,origargc+3,char*);
1920 while (s < bufend && !isSPACE(*s))
1923 Copy(origargv+1, newargv+2, origargc+1, char*);
1928 execv(ipath, newargv);
1929 croak("Can't exec %s", ipath);
1932 U32 oldpdb = perldb;
1933 bool oldn = minus_n;
1934 bool oldp = minus_p;
1936 while (*d && !isSPACE(*d)) d++;
1937 while (*d == ' ' || *d == '\t') d++;
1941 if (*d == 'M' || *d == 'm') {
1943 while (*d && !isSPACE(*d)) d++;
1944 croak("Too late for \"-%.*s\" option",
1947 d = moreswitches(d);
1949 if (PERLDB_LINE && !oldpdb ||
1950 ( minus_n || minus_p ) && !(oldn || oldp) )
1951 /* if we have already added "LINE: while (<>) {",
1952 we must not do it again */
1954 sv_setpv(linestr, "");
1955 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1956 bufend = SvPVX(linestr) + SvCUR(linestr);
1959 (void)gv_fetchfile(origfilename);
1966 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1968 lex_state = LEX_FORMLINE;
1974 warn("Illegal character \\%03o (carriage return)", '\r');
1976 "(Maybe you didn't strip carriage returns after a network transfer?)\n");
1978 case ' ': case '\t': case '\f': case 013:
1983 if (lex_state != LEX_NORMAL || (in_eval && !rsfp)) {
1985 while (s < d && *s != '\n')
1990 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1992 lex_state = LEX_FORMLINE;
2002 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2007 while (s < bufend && (*s == ' ' || *s == '\t'))
2010 if (strnEQ(s,"=>",2)) {
2012 warn("Ambiguous use of -%c => resolved to \"-%c\" =>",
2013 (int)tmp, (int)tmp);
2014 s = force_word(bufptr,WORD,FALSE,FALSE,FALSE);
2015 OPERATOR('-'); /* unary minus */
2017 last_uni = oldbufptr;
2018 last_lop_op = OP_FTEREAD; /* good enough */
2020 case 'r': FTST(OP_FTEREAD);
2021 case 'w': FTST(OP_FTEWRITE);
2022 case 'x': FTST(OP_FTEEXEC);
2023 case 'o': FTST(OP_FTEOWNED);
2024 case 'R': FTST(OP_FTRREAD);
2025 case 'W': FTST(OP_FTRWRITE);
2026 case 'X': FTST(OP_FTREXEC);
2027 case 'O': FTST(OP_FTROWNED);
2028 case 'e': FTST(OP_FTIS);
2029 case 'z': FTST(OP_FTZERO);
2030 case 's': FTST(OP_FTSIZE);
2031 case 'f': FTST(OP_FTFILE);
2032 case 'd': FTST(OP_FTDIR);
2033 case 'l': FTST(OP_FTLINK);
2034 case 'p': FTST(OP_FTPIPE);
2035 case 'S': FTST(OP_FTSOCK);
2036 case 'u': FTST(OP_FTSUID);
2037 case 'g': FTST(OP_FTSGID);
2038 case 'k': FTST(OP_FTSVTX);
2039 case 'b': FTST(OP_FTBLK);
2040 case 'c': FTST(OP_FTCHR);
2041 case 't': FTST(OP_FTTTY);
2042 case 'T': FTST(OP_FTTEXT);
2043 case 'B': FTST(OP_FTBINARY);
2044 case 'M': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTMTIME);
2045 case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
2046 case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
2048 croak("Unrecognized file test: -%c", (int)tmp);
2055 if (expect == XOPERATOR)
2060 else if (*s == '>') {
2063 if (isIDFIRST(*s)) {
2064 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2072 if (expect == XOPERATOR)
2075 if (isSPACE(*s) || !isSPACE(*bufptr))
2077 OPERATOR('-'); /* unary minus */
2084 if (expect == XOPERATOR)
2089 if (expect == XOPERATOR)
2092 if (isSPACE(*s) || !isSPACE(*bufptr))
2098 if (expect != XOPERATOR) {
2099 s = scan_ident(s, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2101 force_ident(tokenbuf, '*');
2114 if (expect == XOPERATOR) {
2119 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, TRUE);
2122 yyerror("Final % should be \\% or %name");
2125 pending_ident = '%';
2147 if (last_lop == oldoldbufptr || last_uni == oldoldbufptr)
2148 oldbufptr = oldoldbufptr; /* allow print(STDOUT 123) */
2153 if (curcop->cop_line < copline)
2154 copline = curcop->cop_line;
2165 if (lex_brackets <= 0)
2166 yyerror("Unmatched right bracket");
2169 if (lex_state == LEX_INTERPNORMAL) {
2170 if (lex_brackets == 0) {
2171 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
2172 lex_state = LEX_INTERPEND;
2179 if (lex_brackets > 100) {
2180 char* newlb = Renew(lex_brackstack, lex_brackets + 1, char);
2181 if (newlb != lex_brackstack) {
2183 lex_brackstack = newlb;
2188 if (lex_formbrack) {
2192 if (oldoldbufptr == last_lop)
2193 lex_brackstack[lex_brackets++] = XTERM;
2195 lex_brackstack[lex_brackets++] = XOPERATOR;
2196 OPERATOR(HASHBRACK);
2198 while (s < bufend && (*s == ' ' || *s == '\t'))
2202 if (d < bufend && *d == '-') {
2205 while (d < bufend && (*d == ' ' || *d == '\t'))
2208 if (d < bufend && isIDFIRST(*d)) {
2209 d = scan_word(d, tokenbuf + 1, sizeof tokenbuf - 1,
2211 while (d < bufend && (*d == ' ' || *d == '\t'))
2214 char minus = (tokenbuf[0] == '-');
2216 (keyword(tokenbuf + 1, len) ||
2217 (minus && len == 1 && isALPHA(tokenbuf[1])) ||
2218 perl_get_cv(tokenbuf + 1, FALSE) ))
2219 warn("Ambiguous use of {%s} resolved to {\"%s\"}",
2220 tokenbuf + !minus, tokenbuf + !minus);
2221 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
2228 lex_brackstack[lex_brackets++] = XSTATE;
2232 lex_brackstack[lex_brackets++] = XOPERATOR;
2237 if (oldoldbufptr == last_lop)
2238 lex_brackstack[lex_brackets++] = XTERM;
2240 lex_brackstack[lex_brackets++] = XOPERATOR;
2243 if (expect == XSTATE) {
2244 lex_brackstack[lex_brackets-1] = XSTATE;
2247 OPERATOR(HASHBRACK);
2249 /* This hack serves to disambiguate a pair of curlies
2250 * as being a block or an anon hash. Normally, expectation
2251 * determines that, but in cases where we're not in a
2252 * position to expect anything in particular (like inside
2253 * eval"") we have to resolve the ambiguity. This code
2254 * covers the case where the first term in the curlies is a
2255 * quoted string. Most other cases need to be explicitly
2256 * disambiguated by prepending a `+' before the opening
2257 * curly in order to force resolution as an anon hash.
2259 * XXX should probably propagate the outer expectation
2260 * into eval"" to rely less on this hack, but that could
2261 * potentially break current behavior of eval"".
2265 if (*s == '\'' || *s == '"' || *s == '`') {
2266 /* common case: get past first string, handling escapes */
2267 for (t++; t < bufend && *t != *s;)
2268 if (*t++ == '\\' && (*t == '\\' || *t == *s))
2272 else if (*s == 'q') {
2275 || ((*t == 'q' || *t == 'x') && ++t < bufend
2276 && !isALNUM(*t)))) {
2278 char open, close, term;
2281 while (t < bufend && isSPACE(*t))
2285 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
2289 for (t++; t < bufend; t++) {
2290 if (*t == '\\' && t+1 < bufend && open != '\\')
2292 else if (*t == open)
2296 for (t++; t < bufend; t++) {
2297 if (*t == '\\' && t+1 < bufend)
2299 else if (*t == close && --brackets <= 0)
2301 else if (*t == open)
2307 else if (isALPHA(*s)) {
2308 for (t++; t < bufend && isALNUM(*t); t++) ;
2310 while (t < bufend && isSPACE(*t))
2312 /* if comma follows first term, call it an anon hash */
2313 /* XXX it could be a comma expression with loop modifiers */
2314 if (t < bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
2315 || (*t == '=' && t[1] == '>')))
2316 OPERATOR(HASHBRACK);
2320 lex_brackstack[lex_brackets-1] = XSTATE;
2326 yylval.ival = curcop->cop_line;
2327 if (isSPACE(*s) || *s == '#')
2328 copline = NOLINE; /* invalidate current command line number */
2333 if (lex_brackets <= 0)
2334 yyerror("Unmatched right bracket");
2336 expect = (expectation)lex_brackstack[--lex_brackets];
2337 if (lex_brackets < lex_formbrack)
2339 if (lex_state == LEX_INTERPNORMAL) {
2340 if (lex_brackets == 0) {
2341 if (lex_fakebrack) {
2342 lex_state = LEX_INTERPEND;
2344 return yylex(); /* ignore fake brackets */
2346 if (*s == '-' && s[1] == '>')
2347 lex_state = LEX_INTERPENDMAYBE;
2348 else if (*s != '[' && *s != '{')
2349 lex_state = LEX_INTERPEND;
2352 if (lex_brackets < lex_fakebrack) {
2355 return yylex(); /* ignore fake brackets */
2365 if (expect == XOPERATOR) {
2366 if (dowarn && isALPHA(*s) && bufptr == linestart) {
2374 s = scan_ident(s - 1, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2377 force_ident(tokenbuf, '&');
2381 yylval.ival = (OPpENTERSUB_AMPER<<8);
2400 if (dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
2401 warn("Reversed %c= operator",(int)tmp);
2403 if (expect == XSTATE && isALPHA(tmp) &&
2404 (s == linestart+1 || s[-2] == '\n') )
2406 if (in_eval && !rsfp) {
2411 if (strnEQ(s,"=cut",4)) {
2428 if (lex_brackets < lex_formbrack) {
2430 for (t = s; *t == ' ' || *t == '\t'; t++) ;
2431 if (*t == '\n' || *t == '#') {
2449 if (expect != XOPERATOR) {
2450 if (s[1] != '<' && !strchr(s,'>'))
2453 s = scan_heredoc(s);
2455 s = scan_inputsymbol(s);
2456 TERM(sublex_start());
2461 SHop(OP_LEFT_SHIFT);
2475 SHop(OP_RIGHT_SHIFT);
2484 if (expect == XOPERATOR) {
2485 if (lex_formbrack && lex_brackets == lex_formbrack) {
2488 return ','; /* grandfather non-comma-format format */
2492 if (s[1] == '#' && (isALPHA(s[2]) || strchr("_{$:", s[2]))) {
2493 if (expect == XOPERATOR)
2494 no_op("Array length", bufptr);
2496 s = scan_ident(s + 1, bufend, tokenbuf + 1, sizeof tokenbuf - 1,
2501 pending_ident = '#';
2505 if (expect == XOPERATOR)
2506 no_op("Scalar", bufptr);
2508 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2511 yyerror("Final $ should be \\$ or $name");
2515 /* This kludge not intended to be bulletproof. */
2516 if (tokenbuf[1] == '[' && !tokenbuf[2]) {
2517 yylval.opval = newSVOP(OP_CONST, 0,
2518 newSViv((IV)compiling.cop_arybase));
2519 yylval.opval->op_private = OPpCONST_ARYBASE;
2524 if (lex_state == LEX_NORMAL)
2527 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2533 isSPACE(*t) || isALNUM(*t) || *t == '$';
2536 bufptr = skipspace(bufptr);
2537 while (t < bufend && *t != ']')
2539 warn("Multidimensional syntax %.*s not supported",
2540 (t - bufptr) + 1, bufptr);
2544 else if (*s == '{') {
2546 if (dowarn && strEQ(tokenbuf+1, "SIG") &&
2547 (t = strchr(s, '}')) && (t = strchr(t, '=')))
2549 char tmpbuf[sizeof tokenbuf];
2551 for (t++; isSPACE(*t); t++) ;
2552 if (isIDFIRST(*t)) {
2553 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
2554 if (*t != '(' && perl_get_cv(tmpbuf, FALSE))
2555 warn("You need to quote \"%s\"", tmpbuf);
2562 if (lex_state == LEX_NORMAL && isSPACE(*d)) {
2563 bool islop = (last_lop == oldoldbufptr);
2564 if (!islop || last_lop_op == OP_GREPSTART)
2566 else if (strchr("$@\"'`q", *s))
2567 expect = XTERM; /* e.g. print $fh "foo" */
2568 else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
2569 expect = XTERM; /* e.g. print $fh &sub */
2570 else if (isIDFIRST(*s)) {
2571 char tmpbuf[sizeof tokenbuf];
2572 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2573 if (tmp = keyword(tmpbuf, len)) {
2574 /* binary operators exclude handle interpretations */
2586 expect = XTERM; /* e.g. print $fh length() */
2591 GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2592 if (gv && GvCVu(gv))
2593 expect = XTERM; /* e.g. print $fh subr() */
2596 else if (isDIGIT(*s))
2597 expect = XTERM; /* e.g. print $fh 3 */
2598 else if (*s == '.' && isDIGIT(s[1]))
2599 expect = XTERM; /* e.g. print $fh .3 */
2600 else if (strchr("/?-+", *s) && !isSPACE(s[1]))
2601 expect = XTERM; /* e.g. print $fh -1 */
2602 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]))
2603 expect = XTERM; /* print $fh <<"EOF" */
2605 pending_ident = '$';
2609 if (expect == XOPERATOR)
2612 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2615 yyerror("Final @ should be \\@ or @name");
2618 if (lex_state == LEX_NORMAL)
2620 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2624 /* Warn about @ where they meant $. */
2626 if (*s == '[' || *s == '{') {
2628 while (*t && (isALNUM(*t) || strchr(" \t$#+-'\"", *t)))
2630 if (*t == '}' || *t == ']') {
2632 bufptr = skipspace(bufptr);
2633 warn("Scalar value %.*s better written as $%.*s",
2634 t-bufptr, bufptr, t-bufptr-1, bufptr+1);
2639 pending_ident = '@';
2642 case '/': /* may either be division or pattern */
2643 case '?': /* may either be conditional or pattern */
2644 if (expect != XOPERATOR) {
2645 /* Disable warning on "study /blah/" */
2646 if (oldoldbufptr == last_uni
2647 && (*last_uni != 's' || s - last_uni < 5
2648 || memNE(last_uni, "study", 5) || isALNUM(last_uni[5])))
2651 TERM(sublex_start());
2659 if (lex_formbrack && lex_brackets == lex_formbrack && s[1] == '\n' &&
2660 (s == linestart || s[-1] == '\n') ) {
2665 if (expect == XOPERATOR || !isDIGIT(s[1])) {
2671 yylval.ival = OPf_SPECIAL;
2677 if (expect != XOPERATOR)
2682 case '0': case '1': case '2': case '3': case '4':
2683 case '5': case '6': case '7': case '8': case '9':
2685 if (expect == XOPERATOR)
2691 if (expect == XOPERATOR) {
2692 if (lex_formbrack && lex_brackets == lex_formbrack) {
2695 return ','; /* grandfather non-comma-format format */
2701 missingterm((char*)0);
2702 yylval.ival = OP_CONST;
2703 TERM(sublex_start());
2707 if (expect == XOPERATOR) {
2708 if (lex_formbrack && lex_brackets == lex_formbrack) {
2711 return ','; /* grandfather non-comma-format format */
2717 missingterm((char*)0);
2718 yylval.ival = OP_CONST;
2719 for (d = SvPV(lex_stuff, len); len; len--, d++) {
2720 if (*d == '$' || *d == '@' || *d == '\\') {
2721 yylval.ival = OP_STRINGIFY;
2725 TERM(sublex_start());
2729 if (expect == XOPERATOR)
2730 no_op("Backticks",s);
2732 missingterm((char*)0);
2733 yylval.ival = OP_BACKTICK;
2735 TERM(sublex_start());
2739 if (dowarn && lex_inwhat && isDIGIT(*s))
2740 warn("Can't use \\%c to mean $%c in expression", *s, *s);
2741 if (expect == XOPERATOR)
2742 no_op("Backslash",s);
2746 if (isDIGIT(s[1]) && expect == XOPERATOR) {
2785 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
2787 /* Some keywords can be followed by any delimiter, including ':' */
2788 tmp = (len == 1 && strchr("msyq", tokenbuf[0]) ||
2789 len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
2790 (tokenbuf[0] == 'q' &&
2791 strchr("qwx", tokenbuf[1]))));
2793 /* x::* is just a word, unless x is "CORE" */
2794 if (!tmp && *s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
2798 while (d < bufend && isSPACE(*d))
2799 d++; /* no comments skipped here, or s### is misparsed */
2801 /* Is this a label? */
2802 if (!tmp && expect == XSTATE
2803 && d < bufend && *d == ':' && *(d + 1) != ':') {
2805 yylval.pval = savepv(tokenbuf);
2810 /* Check for keywords */
2811 tmp = keyword(tokenbuf, len);
2813 /* Is this a word before a => operator? */
2814 if (strnEQ(d,"=>",2)) {
2816 if (dowarn && (tmp || perl_get_cv(tokenbuf, FALSE)))
2817 warn("Ambiguous use of %s => resolved to \"%s\" =>",
2818 tokenbuf, tokenbuf);
2819 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2820 yylval.opval->op_private = OPpCONST_BARE;
2824 if (tmp < 0) { /* second-class keyword? */
2825 if (expect != XOPERATOR && (*s != ':' || s[1] != ':') &&
2826 (((gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV)) &&
2827 GvCVu(gv) && GvIMPORTED_CV(gv)) ||
2828 ((gvp = (GV**)hv_fetch(globalstash,tokenbuf,len,FALSE)) &&
2829 (gv = *gvp) != (GV*)&sv_undef &&
2830 GvCVu(gv) && GvIMPORTED_CV(gv))))
2832 tmp = 0; /* overridden by importation */
2835 && -tmp==KEY_lock /* XXX generalizable kludge */
2836 && !hv_fetch(GvHVn(incgv), "Thread.pm", 9, FALSE))
2838 tmp = 0; /* any sub overrides "weak" keyword */
2841 tmp = -tmp; gv = Nullgv; gvp = 0;
2848 default: /* not a keyword */
2851 char lastchar = (bufptr == oldoldbufptr ? 0 : bufptr[-1]);
2853 /* Get the rest if it looks like a package qualifier */
2855 if (*s == '\'' || *s == ':' && s[1] == ':') {
2856 s = scan_word(s, tokenbuf + len, sizeof tokenbuf - len,
2859 croak("Bad name after %s::", tokenbuf);
2862 if (expect == XOPERATOR) {
2863 if (bufptr == linestart) {
2869 no_op("Bareword",s);
2872 /* Look for a subroutine with this name in current package. */
2875 sv = newSVpv("CORE::GLOBAL::",14);
2876 sv_catpv(sv,tokenbuf);
2879 sv = newSVpv(tokenbuf,0);
2881 gv = gv_fetchpv(tokenbuf,FALSE, SVt_PVCV);
2883 /* Presume this is going to be a bareword of some sort. */
2886 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2887 yylval.opval->op_private = OPpCONST_BARE;
2889 /* See if it's the indirect object for a list operator. */
2892 oldoldbufptr < bufptr &&
2893 (oldoldbufptr == last_lop || oldoldbufptr == last_uni) &&
2894 /* NO SKIPSPACE BEFORE HERE! */
2896 ((opargs[last_lop_op] >> OASHIFT)& 7) == OA_FILEREF) )
2898 bool immediate_paren = *s == '(';
2900 /* (Now we can afford to cross potential line boundary.) */
2903 /* Two barewords in a row may indicate method call. */
2905 if ((isALPHA(*s) || *s == '$') && (tmp=intuit_method(s,gv)))
2908 /* If not a declared subroutine, it's an indirect object. */
2909 /* (But it's an indir obj regardless for sort.) */
2911 if ((last_lop_op == OP_SORT ||
2912 (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
2913 (last_lop_op != OP_MAPSTART && last_lop_op != OP_GREPSTART)){
2914 expect = (last_lop == oldoldbufptr) ? XTERM : XOPERATOR;
2919 /* If followed by a paren, it's certainly a subroutine. */
2925 if (gv && GvCVu(gv)) {
2926 for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
2927 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
2932 nextval[nexttoke].opval = yylval.opval;
2939 /* If followed by var or block, call it a method (unless sub) */
2941 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
2942 last_lop = oldbufptr;
2943 last_lop_op = OP_METHOD;
2947 /* If followed by a bareword, see if it looks like indir obj. */
2949 if ((isALPHA(*s) || *s == '$') && (tmp = intuit_method(s,gv)))
2952 /* Not a method, so call it a subroutine (if defined) */
2954 if (gv && GvCVu(gv)) {
2956 if (lastchar == '-')
2957 warn("Ambiguous use of -%s resolved as -&%s()",
2958 tokenbuf, tokenbuf);
2959 last_lop = oldbufptr;
2960 last_lop_op = OP_ENTERSUB;
2961 /* Check for a constant sub */
2963 if ((sv = cv_const_sv(cv))) {
2965 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
2966 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
2967 yylval.opval->op_private = 0;
2971 /* Resolve to GV now. */
2972 op_free(yylval.opval);
2973 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
2974 /* Is there a prototype? */
2977 char *proto = SvPV((SV*)cv, len);
2980 if (strEQ(proto, "$"))
2982 if (*proto == '&' && *s == '{') {
2983 sv_setpv(subname,"__ANON__");
2987 nextval[nexttoke].opval = yylval.opval;
2993 if (hints & HINT_STRICT_SUBS &&
2996 last_lop_op != OP_TRUNCATE && /* S/F prototype in opcode.pl */
2997 last_lop_op != OP_ACCEPT &&
2998 last_lop_op != OP_PIPE_OP &&
2999 last_lop_op != OP_SOCKPAIR)
3002 "Bareword \"%s\" not allowed while \"strict subs\" in use",
3007 /* Call it a bare word */
3011 if (lastchar != '-') {
3012 for (d = tokenbuf; *d && isLOWER(*d); d++) ;
3014 warn(warn_reserved, tokenbuf);
3017 if (lastchar && strchr("*%&", lastchar)) {
3018 warn("Operator or semicolon missing before %c%s",
3019 lastchar, tokenbuf);
3020 warn("Ambiguous use of %c resolved as operator %c",
3021 lastchar, lastchar);
3027 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3028 newSVsv(GvSV(curcop->cop_filegv)));
3032 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3033 newSVpvf("%ld", (long)curcop->cop_line));
3036 case KEY___PACKAGE__:
3037 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3039 ? newSVsv(curstname)
3048 if (rsfp && (!in_eval || tokenbuf[2] == 'D')) {
3049 char *pname = "main";
3050 if (tokenbuf[2] == 'D')
3051 pname = HvNAME(curstash ? curstash : defstash);
3052 gv = gv_fetchpv(form("%s::DATA", pname), TRUE, SVt_PVIO);
3055 GvIOp(gv) = newIO();
3056 IoIFP(GvIOp(gv)) = rsfp;
3057 #if defined(HAS_FCNTL) && defined(F_SETFD)
3059 int fd = PerlIO_fileno(rsfp);
3060 fcntl(fd,F_SETFD,fd >= 3);
3063 /* Mark this internal pseudo-handle as clean */
3064 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3066 IoTYPE(GvIOp(gv)) = '|';
3067 else if ((PerlIO*)rsfp == PerlIO_stdin())
3068 IoTYPE(GvIOp(gv)) = '-';
3070 IoTYPE(GvIOp(gv)) = '<';
3081 if (expect == XSTATE) {
3088 if (*s == ':' && s[1] == ':') {
3091 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
3092 tmp = keyword(tokenbuf, len);
3106 LOP(OP_ACCEPT,XTERM);
3112 LOP(OP_ATAN2,XTERM);
3121 LOP(OP_BLESS,XTERM);
3130 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
3150 LOP(OP_CRYPT,XTERM);
3154 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3155 if (*d != '0' && isDIGIT(*d))
3156 yywarn("chmod: mode argument is missing initial 0");
3158 LOP(OP_CHMOD,XTERM);
3161 LOP(OP_CHOWN,XTERM);
3164 LOP(OP_CONNECT,XTERM);
3180 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3184 hints |= HINT_BLOCK_SCOPE;
3194 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
3195 LOP(OP_DBMOPEN,XTERM);
3201 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3208 yylval.ival = curcop->cop_line;
3222 expect = (*s == '{') ? XTERMBLOCK : XTERM;
3223 UNIBRACK(OP_ENTEREVAL);
3238 case KEY_endhostent:
3244 case KEY_endservent:
3247 case KEY_endprotoent:
3258 yylval.ival = curcop->cop_line;
3260 if (expect == XSTATE && isIDFIRST(*s)) {
3262 if ((bufend - p) >= 3 &&
3263 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
3267 croak("Missing $ on loop variable");
3272 LOP(OP_FORMLINE,XTERM);
3278 LOP(OP_FCNTL,XTERM);
3284 LOP(OP_FLOCK,XTERM);
3293 LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
3296 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3311 case KEY_getpriority:
3312 LOP(OP_GETPRIORITY,XTERM);
3314 case KEY_getprotobyname:
3317 case KEY_getprotobynumber:
3318 LOP(OP_GPBYNUMBER,XTERM);
3320 case KEY_getprotoent:
3332 case KEY_getpeername:
3333 UNI(OP_GETPEERNAME);
3335 case KEY_gethostbyname:
3338 case KEY_gethostbyaddr:
3339 LOP(OP_GHBYADDR,XTERM);
3341 case KEY_gethostent:
3344 case KEY_getnetbyname:
3347 case KEY_getnetbyaddr:
3348 LOP(OP_GNBYADDR,XTERM);
3353 case KEY_getservbyname:
3354 LOP(OP_GSBYNAME,XTERM);
3356 case KEY_getservbyport:
3357 LOP(OP_GSBYPORT,XTERM);
3359 case KEY_getservent:
3362 case KEY_getsockname:
3363 UNI(OP_GETSOCKNAME);
3365 case KEY_getsockopt:
3366 LOP(OP_GSOCKOPT,XTERM);
3388 yylval.ival = curcop->cop_line;
3392 LOP(OP_INDEX,XTERM);
3398 LOP(OP_IOCTL,XTERM);
3410 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3441 LOP(OP_LISTEN,XTERM);
3451 TERM(sublex_start());
3454 LOP(OP_MAPSTART,XREF);
3457 LOP(OP_MKDIR,XTERM);
3460 LOP(OP_MSGCTL,XTERM);
3463 LOP(OP_MSGGET,XTERM);
3466 LOP(OP_MSGRCV,XTERM);
3469 LOP(OP_MSGSND,XTERM);
3474 if (isIDFIRST(*s)) {
3475 s = scan_word(s, tokenbuf, sizeof tokenbuf, TRUE, &len);
3476 in_my_stash = gv_stashpv(tokenbuf, FALSE);
3480 sprintf(tmpbuf, "No such class %.1000s", tokenbuf);
3487 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3494 if (expect != XSTATE)
3495 yyerror("\"no\" not allowed in expression");
3496 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3497 s = force_version(s);
3506 if (isIDFIRST(*s)) {
3508 for (d = s; isALNUM(*d); d++) ;
3510 if (strchr("|&*+-=!?:.", *t))
3511 warn("Precedence problem: open %.*s should be open(%.*s)",
3517 yylval.ival = OP_OR;
3527 LOP(OP_OPEN_DIR,XTERM);
3530 checkcomma(s,tokenbuf,"filehandle");
3534 checkcomma(s,tokenbuf,"filehandle");
3553 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3557 LOP(OP_PIPE_OP,XTERM);
3562 missingterm((char*)0);
3563 yylval.ival = OP_CONST;
3564 TERM(sublex_start());
3572 missingterm((char*)0);
3573 if (dowarn && SvLEN(lex_stuff)) {
3574 d = SvPV_force(lex_stuff, len);
3575 for (; len; --len, ++d) {
3577 warn("Possible attempt to separate words with commas");
3581 warn("Possible attempt to put comments in qw() list");
3587 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, q(lex_stuff));
3591 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
3594 yylval.ival = OP_SPLIT;
3598 last_lop = oldbufptr;
3599 last_lop_op = OP_SPLIT;
3605 missingterm((char*)0);
3606 yylval.ival = OP_STRINGIFY;
3607 if (SvIVX(lex_stuff) == '\'')
3608 SvIVX(lex_stuff) = 0; /* qq'$foo' should intepolate */
3609 TERM(sublex_start());
3614 missingterm((char*)0);
3615 yylval.ival = OP_BACKTICK;
3617 TERM(sublex_start());
3624 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3625 if (isIDFIRST(*tokenbuf))
3626 gv_stashpvn(tokenbuf, strlen(tokenbuf), TRUE);
3628 yyerror("<> should be quotes");
3635 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3639 LOP(OP_RENAME,XTERM);
3648 LOP(OP_RINDEX,XTERM);
3671 LOP(OP_REVERSE,XTERM);
3682 TERM(sublex_start());
3684 TOKEN(1); /* force error */
3693 LOP(OP_SELECT,XTERM);
3699 LOP(OP_SEMCTL,XTERM);
3702 LOP(OP_SEMGET,XTERM);
3705 LOP(OP_SEMOP,XTERM);
3711 LOP(OP_SETPGRP,XTERM);
3713 case KEY_setpriority:
3714 LOP(OP_SETPRIORITY,XTERM);
3716 case KEY_sethostent:
3722 case KEY_setservent:
3725 case KEY_setprotoent:
3735 LOP(OP_SEEKDIR,XTERM);
3737 case KEY_setsockopt:
3738 LOP(OP_SSOCKOPT,XTERM);
3744 LOP(OP_SHMCTL,XTERM);
3747 LOP(OP_SHMGET,XTERM);
3750 LOP(OP_SHMREAD,XTERM);
3753 LOP(OP_SHMWRITE,XTERM);
3756 LOP(OP_SHUTDOWN,XTERM);
3765 LOP(OP_SOCKET,XTERM);
3767 case KEY_socketpair:
3768 LOP(OP_SOCKPAIR,XTERM);
3771 checkcomma(s,tokenbuf,"subroutine name");
3773 if (*s == ';' || *s == ')') /* probably a close */
3774 croak("sort is now a reserved word");
3776 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3780 LOP(OP_SPLIT,XTERM);
3783 LOP(OP_SPRINTF,XTERM);
3786 LOP(OP_SPLICE,XTERM);
3802 LOP(OP_SUBSTR,XTERM);
3809 if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
3810 char tmpbuf[sizeof tokenbuf];
3812 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3813 if (strchr(tmpbuf, ':'))
3814 sv_setpv(subname, tmpbuf);
3816 sv_setsv(subname,curstname);
3817 sv_catpvn(subname,"::",2);
3818 sv_catpvn(subname,tmpbuf,len);
3820 s = force_word(s,WORD,FALSE,TRUE,TRUE);
3824 expect = XTERMBLOCK;
3825 sv_setpv(subname,"?");
3828 if (tmp == KEY_format) {
3831 lex_formbrack = lex_brackets + 1;
3835 /* Look for a prototype */
3842 SvREFCNT_dec(lex_stuff);
3844 croak("Prototype not terminated");
3847 d = SvPVX(lex_stuff);
3849 for (p = d; *p; ++p) {
3854 SvCUR(lex_stuff) = tmp;
3857 nextval[1] = nextval[0];
3858 nexttype[1] = nexttype[0];
3859 nextval[0].opval = (OP*)newSVOP(OP_CONST, 0, lex_stuff);
3860 nexttype[0] = THING;
3861 if (nexttoke == 1) {
3862 lex_defer = lex_state;
3863 lex_expect = expect;
3864 lex_state = LEX_KNOWNEXT;
3869 if (*SvPV(subname,na) == '?') {
3870 sv_setpv(subname,"__ANON__");
3877 LOP(OP_SYSTEM,XREF);
3880 LOP(OP_SYMLINK,XTERM);
3883 LOP(OP_SYSCALL,XTERM);
3886 LOP(OP_SYSOPEN,XTERM);
3889 LOP(OP_SYSSEEK,XTERM);
3892 LOP(OP_SYSREAD,XTERM);
3895 LOP(OP_SYSWRITE,XTERM);
3899 TERM(sublex_start());
3920 LOP(OP_TRUNCATE,XTERM);
3932 yylval.ival = curcop->cop_line;
3936 yylval.ival = curcop->cop_line;
3940 LOP(OP_UNLINK,XTERM);
3946 LOP(OP_UNPACK,XTERM);
3949 LOP(OP_UTIME,XTERM);
3953 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3954 if (*d != '0' && isDIGIT(*d))
3955 yywarn("umask: argument is missing initial 0");
3960 LOP(OP_UNSHIFT,XTERM);
3963 if (expect != XSTATE)
3964 yyerror("\"use\" not allowed in expression");
3967 s = force_version(s);
3968 if(*s == ';' || (s = skipspace(s), *s == ';')) {
3969 nextval[nexttoke].opval = Nullop;
3974 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3975 s = force_version(s);
3988 yylval.ival = curcop->cop_line;
3992 hints |= HINT_BLOCK_SCOPE;
3999 LOP(OP_WAITPID,XTERM);
4005 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
4009 if (expect == XOPERATOR)
4015 yylval.ival = OP_XOR;
4020 TERM(sublex_start());
4026 keyword(register char *d, I32 len)
4031 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
4032 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
4033 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
4034 if (strEQ(d,"__DATA__")) return KEY___DATA__;
4035 if (strEQ(d,"__END__")) return KEY___END__;
4039 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
4044 if (strEQ(d,"and")) return -KEY_and;
4045 if (strEQ(d,"abs")) return -KEY_abs;
4048 if (strEQ(d,"alarm")) return -KEY_alarm;
4049 if (strEQ(d,"atan2")) return -KEY_atan2;
4052 if (strEQ(d,"accept")) return -KEY_accept;
4057 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
4060 if (strEQ(d,"bless")) return -KEY_bless;
4061 if (strEQ(d,"bind")) return -KEY_bind;
4062 if (strEQ(d,"binmode")) return -KEY_binmode;
4065 if (strEQ(d,"CORE")) return -KEY_CORE;
4070 if (strEQ(d,"cmp")) return -KEY_cmp;
4071 if (strEQ(d,"chr")) return -KEY_chr;
4072 if (strEQ(d,"cos")) return -KEY_cos;
4075 if (strEQ(d,"chop")) return KEY_chop;
4078 if (strEQ(d,"close")) return -KEY_close;
4079 if (strEQ(d,"chdir")) return -KEY_chdir;
4080 if (strEQ(d,"chomp")) return KEY_chomp;
4081 if (strEQ(d,"chmod")) return -KEY_chmod;
4082 if (strEQ(d,"chown")) return -KEY_chown;
4083 if (strEQ(d,"crypt")) return -KEY_crypt;
4086 if (strEQ(d,"chroot")) return -KEY_chroot;
4087 if (strEQ(d,"caller")) return -KEY_caller;
4090 if (strEQ(d,"connect")) return -KEY_connect;
4093 if (strEQ(d,"closedir")) return -KEY_closedir;
4094 if (strEQ(d,"continue")) return -KEY_continue;
4099 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
4104 if (strEQ(d,"do")) return KEY_do;
4107 if (strEQ(d,"die")) return -KEY_die;
4110 if (strEQ(d,"dump")) return -KEY_dump;
4113 if (strEQ(d,"delete")) return KEY_delete;
4116 if (strEQ(d,"defined")) return KEY_defined;
4117 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
4120 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
4125 if (strEQ(d,"EQ")) { deprecate(d); return -KEY_eq;}
4126 if (strEQ(d,"END")) return KEY_END;
4131 if (strEQ(d,"eq")) return -KEY_eq;
4134 if (strEQ(d,"eof")) return -KEY_eof;
4135 if (strEQ(d,"exp")) return -KEY_exp;
4138 if (strEQ(d,"else")) return KEY_else;
4139 if (strEQ(d,"exit")) return -KEY_exit;
4140 if (strEQ(d,"eval")) return KEY_eval;
4141 if (strEQ(d,"exec")) return -KEY_exec;
4142 if (strEQ(d,"each")) return KEY_each;
4145 if (strEQ(d,"elsif")) return KEY_elsif;
4148 if (strEQ(d,"exists")) return KEY_exists;
4149 if (strEQ(d,"elseif")) warn("elseif should be elsif");
4152 if (strEQ(d,"endgrent")) return -KEY_endgrent;
4153 if (strEQ(d,"endpwent")) return -KEY_endpwent;
4156 if (strEQ(d,"endnetent")) return -KEY_endnetent;
4159 if (strEQ(d,"endhostent")) return -KEY_endhostent;
4160 if (strEQ(d,"endservent")) return -KEY_endservent;
4163 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
4170 if (strEQ(d,"for")) return KEY_for;
4173 if (strEQ(d,"fork")) return -KEY_fork;
4176 if (strEQ(d,"fcntl")) return -KEY_fcntl;
4177 if (strEQ(d,"flock")) return -KEY_flock;
4180 if (strEQ(d,"format")) return KEY_format;
4181 if (strEQ(d,"fileno")) return -KEY_fileno;
4184 if (strEQ(d,"foreach")) return KEY_foreach;
4187 if (strEQ(d,"formline")) return -KEY_formline;
4193 if (strEQ(d,"GT")) { deprecate(d); return -KEY_gt;}
4194 if (strEQ(d,"GE")) { deprecate(d); return -KEY_ge;}
4198 if (strnEQ(d,"get",3)) {
4203 if (strEQ(d,"ppid")) return -KEY_getppid;
4204 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
4207 if (strEQ(d,"pwent")) return -KEY_getpwent;
4208 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
4209 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
4212 if (strEQ(d,"peername")) return -KEY_getpeername;
4213 if (strEQ(d,"protoent")) return -KEY_getprotoent;
4214 if (strEQ(d,"priority")) return -KEY_getpriority;
4217 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
4220 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
4224 else if (*d == 'h') {
4225 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
4226 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
4227 if (strEQ(d,"hostent")) return -KEY_gethostent;
4229 else if (*d == 'n') {
4230 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
4231 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
4232 if (strEQ(d,"netent")) return -KEY_getnetent;
4234 else if (*d == 's') {
4235 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
4236 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
4237 if (strEQ(d,"servent")) return -KEY_getservent;
4238 if (strEQ(d,"sockname")) return -KEY_getsockname;
4239 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
4241 else if (*d == 'g') {
4242 if (strEQ(d,"grent")) return -KEY_getgrent;
4243 if (strEQ(d,"grnam")) return -KEY_getgrnam;
4244 if (strEQ(d,"grgid")) return -KEY_getgrgid;
4246 else if (*d == 'l') {
4247 if (strEQ(d,"login")) return -KEY_getlogin;
4249 else if (strEQ(d,"c")) return -KEY_getc;
4254 if (strEQ(d,"gt")) return -KEY_gt;
4255 if (strEQ(d,"ge")) return -KEY_ge;
4258 if (strEQ(d,"grep")) return KEY_grep;
4259 if (strEQ(d,"goto")) return KEY_goto;
4260 if (strEQ(d,"glob")) return KEY_glob;
4263 if (strEQ(d,"gmtime")) return -KEY_gmtime;
4268 if (strEQ(d,"hex")) return -KEY_hex;
4271 if (strEQ(d,"INIT")) return KEY_INIT;
4276 if (strEQ(d,"if")) return KEY_if;
4279 if (strEQ(d,"int")) return -KEY_int;
4282 if (strEQ(d,"index")) return -KEY_index;
4283 if (strEQ(d,"ioctl")) return -KEY_ioctl;
4288 if (strEQ(d,"join")) return -KEY_join;
4292 if (strEQ(d,"keys")) return KEY_keys;
4293 if (strEQ(d,"kill")) return -KEY_kill;
4298 if (strEQ(d,"LT")) { deprecate(d); return -KEY_lt;}
4299 if (strEQ(d,"LE")) { deprecate(d); return -KEY_le;}
4305 if (strEQ(d,"lt")) return -KEY_lt;
4306 if (strEQ(d,"le")) return -KEY_le;
4307 if (strEQ(d,"lc")) return -KEY_lc;
4310 if (strEQ(d,"log")) return -KEY_log;
4313 if (strEQ(d,"last")) return KEY_last;
4314 if (strEQ(d,"link")) return -KEY_link;
4315 if (strEQ(d,"lock")) return -KEY_lock;
4318 if (strEQ(d,"local")) return KEY_local;
4319 if (strEQ(d,"lstat")) return -KEY_lstat;
4322 if (strEQ(d,"length")) return -KEY_length;
4323 if (strEQ(d,"listen")) return -KEY_listen;
4326 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
4329 if (strEQ(d,"localtime")) return -KEY_localtime;
4335 case 1: return KEY_m;
4337 if (strEQ(d,"my")) return KEY_my;
4340 if (strEQ(d,"map")) return KEY_map;
4343 if (strEQ(d,"mkdir")) return -KEY_mkdir;
4346 if (strEQ(d,"msgctl")) return -KEY_msgctl;
4347 if (strEQ(d,"msgget")) return -KEY_msgget;
4348 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
4349 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
4354 if (strEQ(d,"NE")) { deprecate(d); return -KEY_ne;}
4357 if (strEQ(d,"next")) return KEY_next;
4358 if (strEQ(d,"ne")) return -KEY_ne;
4359 if (strEQ(d,"not")) return -KEY_not;
4360 if (strEQ(d,"no")) return KEY_no;
4365 if (strEQ(d,"or")) return -KEY_or;
4368 if (strEQ(d,"ord")) return -KEY_ord;
4369 if (strEQ(d,"oct")) return -KEY_oct;
4372 if (strEQ(d,"open")) return -KEY_open;
4375 if (strEQ(d,"opendir")) return -KEY_opendir;
4382 if (strEQ(d,"pop")) return KEY_pop;
4383 if (strEQ(d,"pos")) return KEY_pos;
4386 if (strEQ(d,"push")) return KEY_push;
4387 if (strEQ(d,"pack")) return -KEY_pack;
4388 if (strEQ(d,"pipe")) return -KEY_pipe;
4391 if (strEQ(d,"print")) return KEY_print;
4394 if (strEQ(d,"printf")) return KEY_printf;
4397 if (strEQ(d,"package")) return KEY_package;
4400 if (strEQ(d,"prototype")) return KEY_prototype;
4405 if (strEQ(d,"q")) return KEY_q;
4406 if (strEQ(d,"qq")) return KEY_qq;
4407 if (strEQ(d,"qw")) return KEY_qw;
4408 if (strEQ(d,"qx")) return KEY_qx;
4410 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
4415 if (strEQ(d,"ref")) return -KEY_ref;
4418 if (strEQ(d,"read")) return -KEY_read;
4419 if (strEQ(d,"rand")) return -KEY_rand;
4420 if (strEQ(d,"recv")) return -KEY_recv;
4421 if (strEQ(d,"redo")) return KEY_redo;
4424 if (strEQ(d,"rmdir")) return -KEY_rmdir;
4425 if (strEQ(d,"reset")) return -KEY_reset;
4428 if (strEQ(d,"return")) return KEY_return;
4429 if (strEQ(d,"rename")) return -KEY_rename;
4430 if (strEQ(d,"rindex")) return -KEY_rindex;
4433 if (strEQ(d,"require")) return -KEY_require;
4434 if (strEQ(d,"reverse")) return -KEY_reverse;
4435 if (strEQ(d,"readdir")) return -KEY_readdir;
4438 if (strEQ(d,"readlink")) return -KEY_readlink;
4439 if (strEQ(d,"readline")) return -KEY_readline;
4440 if (strEQ(d,"readpipe")) return -KEY_readpipe;
4443 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
4449 case 0: return KEY_s;
4451 if (strEQ(d,"scalar")) return KEY_scalar;
4456 if (strEQ(d,"seek")) return -KEY_seek;
4457 if (strEQ(d,"send")) return -KEY_send;
4460 if (strEQ(d,"semop")) return -KEY_semop;
4463 if (strEQ(d,"select")) return -KEY_select;
4464 if (strEQ(d,"semctl")) return -KEY_semctl;
4465 if (strEQ(d,"semget")) return -KEY_semget;
4468 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
4469 if (strEQ(d,"seekdir")) return -KEY_seekdir;
4472 if (strEQ(d,"setpwent")) return -KEY_setpwent;
4473 if (strEQ(d,"setgrent")) return -KEY_setgrent;
4476 if (strEQ(d,"setnetent")) return -KEY_setnetent;
4479 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
4480 if (strEQ(d,"sethostent")) return -KEY_sethostent;
4481 if (strEQ(d,"setservent")) return -KEY_setservent;
4484 if (strEQ(d,"setpriority")) return -KEY_setpriority;
4485 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
4492 if (strEQ(d,"shift")) return KEY_shift;
4495 if (strEQ(d,"shmctl")) return -KEY_shmctl;
4496 if (strEQ(d,"shmget")) return -KEY_shmget;
4499 if (strEQ(d,"shmread")) return -KEY_shmread;
4502 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
4503 if (strEQ(d,"shutdown")) return -KEY_shutdown;
4508 if (strEQ(d,"sin")) return -KEY_sin;
4511 if (strEQ(d,"sleep")) return -KEY_sleep;
4514 if (strEQ(d,"sort")) return KEY_sort;
4515 if (strEQ(d,"socket")) return -KEY_socket;
4516 if (strEQ(d,"socketpair")) return -KEY_socketpair;
4519 if (strEQ(d,"split")) return KEY_split;
4520 if (strEQ(d,"sprintf")) return -KEY_sprintf;
4521 if (strEQ(d,"splice")) return KEY_splice;
4524 if (strEQ(d,"sqrt")) return -KEY_sqrt;
4527 if (strEQ(d,"srand")) return -KEY_srand;
4530 if (strEQ(d,"stat")) return -KEY_stat;
4531 if (strEQ(d,"study")) return KEY_study;
4534 if (strEQ(d,"substr")) return -KEY_substr;
4535 if (strEQ(d,"sub")) return KEY_sub;
4540 if (strEQ(d,"system")) return -KEY_system;
4543 if (strEQ(d,"symlink")) return -KEY_symlink;
4544 if (strEQ(d,"syscall")) return -KEY_syscall;
4545 if (strEQ(d,"sysopen")) return -KEY_sysopen;
4546 if (strEQ(d,"sysread")) return -KEY_sysread;
4547 if (strEQ(d,"sysseek")) return -KEY_sysseek;
4550 if (strEQ(d,"syswrite")) return -KEY_syswrite;
4559 if (strEQ(d,"tr")) return KEY_tr;
4562 if (strEQ(d,"tie")) return KEY_tie;
4565 if (strEQ(d,"tell")) return -KEY_tell;
4566 if (strEQ(d,"tied")) return KEY_tied;
4567 if (strEQ(d,"time")) return -KEY_time;
4570 if (strEQ(d,"times")) return -KEY_times;
4573 if (strEQ(d,"telldir")) return -KEY_telldir;
4576 if (strEQ(d,"truncate")) return -KEY_truncate;
4583 if (strEQ(d,"uc")) return -KEY_uc;
4586 if (strEQ(d,"use")) return KEY_use;
4589 if (strEQ(d,"undef")) return KEY_undef;
4590 if (strEQ(d,"until")) return KEY_until;
4591 if (strEQ(d,"untie")) return KEY_untie;
4592 if (strEQ(d,"utime")) return -KEY_utime;
4593 if (strEQ(d,"umask")) return -KEY_umask;
4596 if (strEQ(d,"unless")) return KEY_unless;
4597 if (strEQ(d,"unpack")) return -KEY_unpack;
4598 if (strEQ(d,"unlink")) return -KEY_unlink;
4601 if (strEQ(d,"unshift")) return KEY_unshift;
4602 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
4607 if (strEQ(d,"values")) return -KEY_values;
4608 if (strEQ(d,"vec")) return -KEY_vec;
4613 if (strEQ(d,"warn")) return -KEY_warn;
4614 if (strEQ(d,"wait")) return -KEY_wait;
4617 if (strEQ(d,"while")) return KEY_while;
4618 if (strEQ(d,"write")) return -KEY_write;
4621 if (strEQ(d,"waitpid")) return -KEY_waitpid;
4624 if (strEQ(d,"wantarray")) return -KEY_wantarray;
4629 if (len == 1) return -KEY_x;
4630 if (strEQ(d,"xor")) return -KEY_xor;
4633 if (len == 1) return KEY_y;
4642 checkcomma(register char *s, char *name, char *what)
4646 if (dowarn && *s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
4648 for (w = s+2; *w && level; w++) {
4655 for (; *w && isSPACE(*w); w++) ;
4656 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
4657 warn("%s (...) interpreted as function",name);
4659 while (s < bufend && isSPACE(*s))
4663 while (s < bufend && isSPACE(*s))
4665 if (isIDFIRST(*s)) {
4669 while (s < bufend && isSPACE(*s))
4674 kw = keyword(w, s - w) || perl_get_cv(w, FALSE) != 0;
4678 croak("No comma allowed after %s", what);
4684 scan_word(register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
4686 register char *d = dest;
4687 register char *e = d + destlen - 3; /* two-character token, ending NUL */
4690 croak(ident_too_long);
4693 else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
4698 else if (*s == ':' && s[1] == ':' && allow_package && isIDFIRST(s[2])) {
4711 scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
4718 if (lex_brackets == 0)
4723 e = d + destlen - 3; /* two-character token, ending NUL */
4725 while (isDIGIT(*s)) {
4727 croak(ident_too_long);
4734 croak(ident_too_long);
4737 else if (*s == '\'' && isIDFIRST(s[1])) {
4742 else if (*s == ':' && s[1] == ':') {
4753 if (lex_state != LEX_NORMAL)
4754 lex_state = LEX_INTERPENDMAYBE;
4757 if (*s == '$' && s[1] &&
4758 (isALNUM(s[1]) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
4760 if (isDIGIT(s[1]) && lex_state == LEX_INTERPNORMAL)
4761 deprecate("\"$$<digit>\" to mean \"${$}<digit>\"");
4774 if (*d == '^' && *s && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
4779 if (isSPACE(s[-1])) {
4782 if (ch != ' ' && ch != '\t') {
4788 if (isIDFIRST(*d)) {
4790 while (isALNUM(*s) || *s == ':')
4793 while (s < send && (*s == ' ' || *s == '\t')) s++;
4794 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
4795 if (dowarn && keyword(dest, d - dest)) {
4796 char *brack = *s == '[' ? "[...]" : "{...}";
4797 warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
4798 funny, dest, brack, funny, dest, brack);
4800 lex_fakebrack = lex_brackets+1;
4802 lex_brackstack[lex_brackets++] = XOPERATOR;
4808 if (lex_state == LEX_INTERPNORMAL && !lex_brackets)
4809 lex_state = LEX_INTERPEND;
4812 if (dowarn && lex_state == LEX_NORMAL &&
4813 (keyword(dest, d - dest) || perl_get_cv(dest, FALSE)))
4814 warn("Ambiguous use of %c{%s} resolved to %c%s",
4815 funny, dest, funny, dest);
4818 s = bracket; /* let the parser handle it */
4822 else if (lex_state == LEX_INTERPNORMAL && !lex_brackets && !intuit_more(s))
4823 lex_state = LEX_INTERPEND;
4827 void pmflag(U16 *pmfl, int ch)
4832 *pmfl |= PMf_GLOBAL;
4834 *pmfl |= PMf_CONTINUE;
4838 *pmfl |= PMf_MULTILINE;
4840 *pmfl |= PMf_SINGLELINE;
4842 *pmfl |= PMf_EXTENDED;
4846 scan_pat(char *start)
4851 s = scan_str(start);
4854 SvREFCNT_dec(lex_stuff);
4856 croak("Search pattern not terminated");
4859 pm = (PMOP*)newPMOP(OP_MATCH, 0);
4860 if (multi_open == '?')
4861 pm->op_pmflags |= PMf_ONCE;
4862 while (*s && strchr("iogcmsx", *s))
4863 pmflag(&pm->op_pmflags,*s++);
4864 pm->op_pmpermflags = pm->op_pmflags;
4867 yylval.ival = OP_MATCH;
4872 scan_subst(char *start)
4879 yylval.ival = OP_NULL;
4881 s = scan_str(start);
4885 SvREFCNT_dec(lex_stuff);
4887 croak("Substitution pattern not terminated");
4890 if (s[-1] == multi_open)
4893 first_start = multi_start;
4897 SvREFCNT_dec(lex_stuff);
4900 SvREFCNT_dec(lex_repl);
4902 croak("Substitution replacement not terminated");
4904 multi_start = first_start; /* so whole substitution is taken together */
4906 pm = (PMOP*)newPMOP(OP_SUBST, 0);
4907 while (*s && strchr("iogcmsex", *s)) {
4913 pmflag(&pm->op_pmflags,*s++);
4918 pm->op_pmflags |= PMf_EVAL;
4919 repl = newSVpv("",0);
4921 sv_catpv(repl, es ? "eval " : "do ");
4922 sv_catpvn(repl, "{ ", 2);
4923 sv_catsv(repl, lex_repl);
4924 sv_catpvn(repl, " };", 2);
4925 SvCOMPILED_on(repl);
4926 SvREFCNT_dec(lex_repl);
4930 pm->op_pmpermflags = pm->op_pmflags;
4932 yylval.ival = OP_SUBST;
4937 scan_trans(char *start)
4946 yylval.ival = OP_NULL;
4948 s = scan_str(start);
4951 SvREFCNT_dec(lex_stuff);
4953 croak("Translation pattern not terminated");
4955 if (s[-1] == multi_open)
4961 SvREFCNT_dec(lex_stuff);
4964 SvREFCNT_dec(lex_repl);
4966 croak("Translation replacement not terminated");
4969 New(803,tbl,256,short);
4970 o = newPVOP(OP_TRANS, 0, (char*)tbl);
4972 complement = Delete = squash = 0;
4973 while (*s == 'c' || *s == 'd' || *s == 's') {
4975 complement = OPpTRANS_COMPLEMENT;
4977 Delete = OPpTRANS_DELETE;
4979 squash = OPpTRANS_SQUASH;
4982 o->op_private = Delete|squash|complement;
4985 yylval.ival = OP_TRANS;
4990 scan_heredoc(register char *s)
4994 I32 op_type = OP_SCALAR;
5001 int outer = (rsfp && !lex_inwhat);
5005 e = tokenbuf + sizeof tokenbuf - 1;
5008 for (peek = s; *peek == ' ' || *peek == '\t'; peek++) ;
5009 if (*peek && strchr("`'\"",*peek)) {
5012 s = delimcpy(d, e, s, bufend, term, &len);
5023 deprecate("bare << to mean <<\"\"");
5024 for (; isALNUM(*s); s++) {
5029 if (d >= tokenbuf + sizeof tokenbuf - 1)
5030 croak("Delimiter for here document is too long");
5035 if (outer || !(d=ninstr(s,bufend,d,d+1)))
5036 herewas = newSVpv(s,bufend-s);
5038 s--, herewas = newSVpv(s,d-s);
5039 s += SvCUR(herewas);
5041 tmpstr = NEWSV(87,80);
5042 sv_upgrade(tmpstr, SVt_PVIV);
5047 else if (term == '`') {
5048 op_type = OP_BACKTICK;
5049 SvIVX(tmpstr) = '\\';
5053 multi_start = curcop->cop_line;
5054 multi_open = multi_close = '<';
5058 while (s < bufend &&
5059 (*s != term || memNE(s,tokenbuf,len)) ) {
5064 curcop->cop_line = multi_start;
5065 missingterm(tokenbuf);
5067 sv_setpvn(tmpstr,d+1,s-d);
5069 curcop->cop_line++; /* the preceding stmt passes a newline */
5071 sv_catpvn(herewas,s,bufend-s);
5072 sv_setsv(linestr,herewas);
5073 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
5074 bufend = SvPVX(linestr) + SvCUR(linestr);
5077 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
5078 while (s >= bufend) { /* multiple line string? */
5080 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5081 curcop->cop_line = multi_start;
5082 missingterm(tokenbuf);
5085 if (PERLDB_LINE && curstash != debstash) {
5086 SV *sv = NEWSV(88,0);
5088 sv_upgrade(sv, SVt_PVMG);
5089 sv_setsv(sv,linestr);
5090 av_store(GvAV(curcop->cop_filegv),
5091 (I32)curcop->cop_line,sv);
5093 bufend = SvPVX(linestr) + SvCUR(linestr);
5094 if (*s == term && memEQ(s,tokenbuf,len)) {
5097 sv_catsv(linestr,herewas);
5098 bufend = SvPVX(linestr) + SvCUR(linestr);
5102 sv_catsv(tmpstr,linestr);
5105 multi_end = curcop->cop_line;
5107 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
5108 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
5109 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
5111 SvREFCNT_dec(herewas);
5113 yylval.ival = op_type;
5118 takes: current position in input buffer
5119 returns: new position in input buffer
5120 side-effects: yylval and lex_op are set.
5125 <FH> read from filehandle
5126 <pkg::FH> read from package qualified filehandle
5127 <pkg'FH> read from package qualified filehandle
5128 <$fh> read from filehandle in $fh
5134 scan_inputsymbol(char *start)
5136 register char *s = start; /* current position in buffer */
5141 d = tokenbuf; /* start of temp holding space */
5142 e = tokenbuf + sizeof tokenbuf; /* end of temp holding space */
5143 s = delimcpy(d, e, s + 1, bufend, '>', &len); /* extract until > */
5145 /* die if we didn't have space for the contents of the <>,
5149 if (len >= sizeof tokenbuf)
5150 croak("Excessively long <> operator");
5152 croak("Unterminated <> operator");
5157 Remember, only scalar variables are interpreted as filehandles by
5158 this code. Anything more complex (e.g., <$fh{$num}>) will be
5159 treated as a glob() call.
5160 This code makes use of the fact that except for the $ at the front,
5161 a scalar variable and a filehandle look the same.
5163 if (*d == '$' && d[1]) d++;
5165 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
5166 while (*d && (isALNUM(*d) || *d == '\'' || *d == ':'))
5169 /* If we've tried to read what we allow filehandles to look like, and
5170 there's still text left, then it must be a glob() and not a getline.
5171 Use scan_str to pull out the stuff between the <> and treat it
5172 as nothing more than a string.
5175 if (d - tokenbuf != len) {
5176 yylval.ival = OP_GLOB;
5178 s = scan_str(start);
5180 croak("Glob not terminated");
5184 /* we're in a filehandle read situation */
5187 /* turn <> into <ARGV> */
5189 (void)strcpy(d,"ARGV");
5191 /* if <$fh>, create the ops to turn the variable into a
5197 /* try to find it in the pad for this block, otherwise find
5198 add symbol table ops
5200 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
5201 OP *o = newOP(OP_PADSV, 0);
5203 lex_op = (OP*)newUNOP(OP_READLINE, 0, newUNOP(OP_RV2GV, 0, o));
5206 GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
5207 lex_op = (OP*)newUNOP(OP_READLINE, 0,
5208 newUNOP(OP_RV2GV, 0,
5209 newUNOP(OP_RV2SV, 0,
5210 newGVOP(OP_GV, 0, gv))));
5212 /* we created the ops in lex_op, so make yylval.ival a null op */
5213 yylval.ival = OP_NULL;
5216 /* If it's none of the above, it must be a literal filehandle
5217 (<Foo::BAR> or <FOO>) so build a simple readline OP */
5219 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
5220 lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
5221 yylval.ival = OP_NULL;
5230 takes: start position in buffer
5231 returns: position to continue reading from buffer
5232 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
5233 updates the read buffer.
5235 This subroutine pulls a string out of the input. It is called for:
5236 q single quotes q(literal text)
5237 ' single quotes 'literal text'
5238 qq double quotes qq(interpolate $here please)
5239 " double quotes "interpolate $here please"
5240 qx backticks qx(/bin/ls -l)
5241 ` backticks `/bin/ls -l`
5242 qw quote words @EXPORT_OK = qw( func() $spam )
5243 m// regexp match m/this/
5244 s/// regexp substitute s/this/that/
5245 tr/// string transliterate tr/this/that/
5246 y/// string transliterate y/this/that/
5247 ($*@) sub prototypes sub foo ($)
5248 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
5250 In most of these cases (all but <>, patterns and transliterate)
5251 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
5252 calls scan_str(). s/// makes yylex() call scan_subst() which calls
5253 scan_str(). tr/// and y/// make yylex() call scan_trans() which
5256 It skips whitespace before the string starts, and treats the first
5257 character as the delimiter. If the delimiter is one of ([{< then
5258 the corresponding "close" character )]}> is used as the closing
5259 delimiter. It allows quoting of delimiters, and if the string has
5260 balanced delimiters ([{<>}]) it allows nesting.
5262 The lexer always reads these strings into lex_stuff, except in the
5263 case of the operators which take *two* arguments (s/// and tr///)
5264 when it checks to see if lex_stuff is full (presumably with the 1st
5265 arg to s or tr) and if so puts the string into lex_repl.
5270 scan_str(char *start)
5273 SV *sv; /* scalar value: string */
5274 char *tmps; /* temp string, used for delimiter matching */
5275 register char *s = start; /* current position in the buffer */
5276 register char term; /* terminating character */
5277 register char *to; /* current position in the sv's data */
5278 I32 brackets = 1; /* bracket nesting level */
5280 /* skip space before the delimiter */
5284 /* mark where we are, in case we need to report errors */
5287 /* after skipping whitespace, the next character is the terminator */
5289 /* mark where we are */
5290 multi_start = curcop->cop_line;
5293 /* find corresponding closing delimiter */
5294 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5298 /* create a new SV to hold the contents. 87 is leak category, I'm
5299 assuming. 80 is the SV's initial length. What a random number. */
5301 sv_upgrade(sv, SVt_PVIV);
5303 (void)SvPOK_only(sv); /* validate pointer */
5305 /* move past delimiter and try to read a complete string */
5308 /* extend sv if need be */
5309 SvGROW(sv, SvCUR(sv) + (bufend - s) + 1);
5310 /* set 'to' to the next character in the sv's string */
5311 to = SvPVX(sv)+SvCUR(sv);
5313 /* if open delimiter is the close delimiter read unbridle */
5314 if (multi_open == multi_close) {
5315 for (; s < bufend; s++,to++) {
5316 /* embedded newlines increment the current line number */
5317 if (*s == '\n' && !rsfp)
5319 /* handle quoted delimiters */
5320 if (*s == '\\' && s+1 < bufend && term != '\\') {
5323 /* any other quotes are simply copied straight through */
5327 /* terminate when run out of buffer (the for() condition), or
5328 have found the terminator */
5329 else if (*s == term)
5335 /* if the terminator isn't the same as the start character (e.g.,
5336 matched brackets), we have to allow more in the quoting, and
5337 be prepared for nested brackets.
5340 /* read until we run out of string, or we find the terminator */
5341 for (; s < bufend; s++,to++) {
5342 /* embedded newlines increment the line count */
5343 if (*s == '\n' && !rsfp)
5345 /* backslashes can escape the open or closing characters */
5346 if (*s == '\\' && s+1 < bufend) {
5347 if ((s[1] == multi_open) || (s[1] == multi_close))
5352 /* allow nested opens and closes */
5353 else if (*s == multi_close && --brackets <= 0)
5355 else if (*s == multi_open)
5360 /* terminate the copied string and update the sv's end-of-string */
5362 SvCUR_set(sv, to - SvPVX(sv));
5365 * this next chunk reads more into the buffer if we're not done yet
5368 if (s < bufend) break; /* handle case where we are done yet :-) */
5370 /* if we're out of file, or a read fails, bail and reset the current
5371 line marker so we can report where the unterminated string began
5374 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5376 curcop->cop_line = multi_start;
5379 /* we read a line, so increment our line counter */
5382 /* update debugger info */
5383 if (PERLDB_LINE && curstash != debstash) {
5384 SV *sv = NEWSV(88,0);
5386 sv_upgrade(sv, SVt_PVMG);
5387 sv_setsv(sv,linestr);
5388 av_store(GvAV(curcop->cop_filegv),
5389 (I32)curcop->cop_line, sv);
5392 /* having changed the buffer, we must update bufend */
5393 bufend = SvPVX(linestr) + SvCUR(linestr);
5396 /* at this point, we have successfully read the delimited string */
5398 multi_end = curcop->cop_line;
5401 /* if we allocated too much space, give some back */
5402 if (SvCUR(sv) + 5 < SvLEN(sv)) {
5403 SvLEN_set(sv, SvCUR(sv) + 1);
5404 Renew(SvPVX(sv), SvLEN(sv), char);
5407 /* decide whether this is the first or second quoted string we've read
5420 takes: pointer to position in buffer
5421 returns: pointer to new position in buffer
5422 side-effects: builds ops for the constant in yylval.op
5424 Read a number in any of the formats that Perl accepts:
5426 0(x[0-7A-F]+)|([0-7]+)
5427 [\d_]+(\.[\d_]*)?[Ee](\d+)
5429 Underbars (_) are allowed in decimal numbers. If -w is on,
5430 underbars before a decimal point must be at three digit intervals.
5432 Like most scan_ routines, it uses the tokenbuf buffer to hold the
5435 If it reads a number without a decimal point or an exponent, it will
5436 try converting the number to an integer and see if it can do so
5437 without loss of precision.
5441 scan_num(char *start)
5443 register char *s = start; /* current position in buffer */
5444 register char *d; /* destination in temp buffer */
5445 register char *e; /* end of temp buffer */
5446 I32 tryiv; /* used to see if it can be an int */
5447 double value; /* number read, as a double */
5448 SV *sv; /* place to put the converted number */
5449 I32 floatit; /* boolean: int or float? */
5450 char *lastub = 0; /* position of last underbar */
5451 static char number_too_long[] = "Number too long";
5453 /* We use the first character to decide what type of number this is */
5457 croak("panic: scan_num");
5459 /* if it starts with a 0, it could be an octal number, a decimal in
5460 0.13 disguise, or a hexadecimal number.
5465 u holds the "number so far"
5466 shift the power of 2 of the base (hex == 4, octal == 3)
5467 overflowed was the number more than we can hold?
5469 Shift is used when we add a digit. It also serves as an "are
5470 we in octal or hex?" indicator to disallow hex characters when
5475 bool overflowed = FALSE;
5482 /* check for a decimal in disguise */
5483 else if (s[1] == '.')
5485 /* so it must be octal */
5490 /* read the rest of the octal number */
5492 UV n, b; /* n is used in the overflow test, b is the digit we're adding on */
5496 /* if we don't mention it, we're done */
5505 /* 8 and 9 are not octal */
5508 yyerror("Illegal octal digit");
5512 case '0': case '1': case '2': case '3': case '4':
5513 case '5': case '6': case '7':
5514 b = *s++ & 15; /* ASCII digit -> value of digit */
5518 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
5519 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
5520 /* make sure they said 0x */
5525 /* Prepare to put the digit we have onto the end
5526 of the number so far. We check for overflows.
5530 n = u << shift; /* make room for the digit */
5531 if (!overflowed && (n >> shift) != u) {
5532 warn("Integer overflow in %s number",
5533 (shift == 4) ? "hex" : "octal");
5536 u = n | b; /* add the digit to the end */
5541 /* if we get here, we had success: make a scalar value from
5551 handle decimal numbers.
5552 we're also sent here when we read a 0 as the first digit
5554 case '1': case '2': case '3': case '4': case '5':
5555 case '6': case '7': case '8': case '9': case '.':
5558 e = tokenbuf + sizeof tokenbuf - 6; /* room for various punctuation */
5561 /* read next group of digits and _ and copy into d */
5562 while (isDIGIT(*s) || *s == '_') {
5563 /* skip underscores, checking for misplaced ones
5567 if (dowarn && lastub && s - lastub != 3)
5568 warn("Misplaced _ in number");
5572 /* check for end of fixed-length buffer */
5574 croak(number_too_long);
5575 /* if we're ok, copy the character */
5580 /* final misplaced underbar check */
5581 if (dowarn && lastub && s - lastub != 3)
5582 warn("Misplaced _ in number");
5584 /* read a decimal portion if there is one. avoid
5585 3..5 being interpreted as the number 3. followed
5588 if (*s == '.' && s[1] != '.') {
5592 /* copy, ignoring underbars, until we run out of
5593 digits. Note: no misplaced underbar checks!
5595 for (; isDIGIT(*s) || *s == '_'; s++) {
5596 /* fixed length buffer check */
5598 croak(number_too_long);
5604 /* read exponent part, if present */
5605 if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
5609 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
5610 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
5612 /* allow positive or negative exponent */
5613 if (*s == '+' || *s == '-')
5616 /* read digits of exponent (no underbars :-) */
5617 while (isDIGIT(*s)) {
5619 croak(number_too_long);
5624 /* terminate the string */
5627 /* make an sv from the string */
5629 /* reset numeric locale in case we were earlier left in Swaziland */
5630 SET_NUMERIC_STANDARD();
5631 value = atof(tokenbuf);
5634 See if we can make do with an integer value without loss of
5635 precision. We use I_V to cast to an int, because some
5636 compilers have issues. Then we try casting it back and see
5637 if it was the same. We only do this if we know we
5638 specifically read an integer.
5640 Note: if floatit is true, then we don't need to do the
5644 if (!floatit && (double)tryiv == value)
5645 sv_setiv(sv, tryiv);
5647 sv_setnv(sv, value);
5651 /* make the op for the constant and return */
5653 yylval.opval = newSVOP(OP_CONST, 0, sv);
5659 scan_formline(register char *s)
5664 SV *stuff = newSVpv("",0);
5665 bool needargs = FALSE;
5668 if (*s == '.' || *s == '}') {
5670 for (t = s+1; *t == ' ' || *t == '\t'; t++) ;
5674 if (in_eval && !rsfp) {
5675 eol = strchr(s,'\n');
5680 eol = bufend = SvPVX(linestr) + SvCUR(linestr);
5682 for (t = s; t < eol; t++) {
5683 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
5685 goto enough; /* ~~ must be first line in formline */
5687 if (*t == '@' || *t == '^')
5690 sv_catpvn(stuff, s, eol-s);
5694 s = filter_gets(linestr, rsfp, 0);
5695 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
5696 bufend = bufptr + SvCUR(linestr);
5699 yyerror("Format not terminated");
5709 lex_state = LEX_NORMAL;
5710 nextval[nexttoke].ival = 0;
5714 lex_state = LEX_FORMLINE;
5715 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
5717 nextval[nexttoke].ival = OP_FORMLINE;
5721 SvREFCNT_dec(stuff);
5733 cshlen = strlen(cshname);
5738 start_subparse(I32 is_format, U32 flags)
5741 I32 oldsavestack_ix = savestack_ix;
5742 CV* outsidecv = compcv;
5746 assert(SvTYPE(compcv) == SVt_PVCV);
5753 SAVESPTR(comppad_name);
5755 SAVEI32(comppad_name_fill);
5756 SAVEI32(min_intro_pending);
5757 SAVEI32(max_intro_pending);
5758 SAVEI32(pad_reset_pending);
5760 compcv = (CV*)NEWSV(1104,0);
5761 sv_upgrade((SV *)compcv, is_format ? SVt_PVFM : SVt_PVCV);
5762 CvFLAGS(compcv) |= flags;
5765 av_push(comppad, Nullsv);
5766 curpad = AvARRAY(comppad);
5767 comppad_name = newAV();
5768 comppad_name_fill = 0;
5769 min_intro_pending = 0;
5771 subline = curcop->cop_line;
5773 av_store(comppad_name, 0, newSVpv("@_", 2));
5774 curpad[0] = (SV*)newAV();
5775 SvPADMY_on(curpad[0]); /* XXX Needed? */
5776 CvOWNER(compcv) = 0;
5777 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5778 MUTEX_INIT(CvMUTEXP(compcv));
5779 #endif /* USE_THREADS */
5781 comppadlist = newAV();
5782 AvREAL_off(comppadlist);
5783 av_store(comppadlist, 0, (SV*)comppad_name);
5784 av_store(comppadlist, 1, (SV*)comppad);
5786 CvPADLIST(compcv) = comppadlist;
5787 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(outsidecv);
5789 CvOWNER(compcv) = 0;
5790 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5791 MUTEX_INIT(CvMUTEXP(compcv));
5792 #endif /* USE_THREADS */
5794 return oldsavestack_ix;
5813 char *context = NULL;
5817 if (!yychar || (yychar == ';' && !rsfp))
5819 else if (bufptr > oldoldbufptr && bufptr - oldoldbufptr < 200 &&
5820 oldoldbufptr != oldbufptr && oldbufptr != bufptr) {
5821 while (isSPACE(*oldoldbufptr))
5823 context = oldoldbufptr;
5824 contlen = bufptr - oldoldbufptr;
5826 else if (bufptr > oldbufptr && bufptr - oldbufptr < 200 &&
5827 oldbufptr != bufptr) {
5828 while (isSPACE(*oldbufptr))
5830 context = oldbufptr;
5831 contlen = bufptr - oldbufptr;
5833 else if (yychar > 255)
5834 where = "next token ???";
5835 else if ((yychar & 127) == 127) {
5836 if (lex_state == LEX_NORMAL ||
5837 (lex_state == LEX_KNOWNEXT && lex_defer == LEX_NORMAL))
5838 where = "at end of line";
5840 where = "within pattern";
5842 where = "within string";
5845 SV *where_sv = sv_2mortal(newSVpv("next char ", 0));
5847 sv_catpvf(where_sv, "^%c", toCTRL(yychar));
5848 else if (isPRINT_LC(yychar))
5849 sv_catpvf(where_sv, "%c", yychar);
5851 sv_catpvf(where_sv, "\\%03o", yychar & 255);
5852 where = SvPVX(where_sv);
5854 msg = sv_2mortal(newSVpv(s, 0));
5855 sv_catpvf(msg, " at %_ line %ld, ",
5856 GvSV(curcop->cop_filegv), (long)curcop->cop_line);
5858 sv_catpvf(msg, "near \"%.*s\"\n", contlen, context);
5860 sv_catpvf(msg, "%s\n", where);
5861 if (multi_start < multi_end && (U32)(curcop->cop_line - multi_end) <= 1) {
5863 " (Might be a runaway multi-line %c%c string starting on line %ld)\n",
5864 (int)multi_open,(int)multi_close,(long)multi_start);
5870 sv_catsv(ERRSV, msg);
5872 PerlIO_write(PerlIO_stderr(), SvPVX(msg), SvCUR(msg));
5873 if (++error_count >= 10)
5874 croak("%_ has too many errors.\n", GvSV(curcop->cop_filegv));
5876 in_my_stash = Nullhv;