3 * Copyright (c) 1991-1997, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "It all comes from here, the stench and the peril." --Frodo
17 static void check_uni _((void));
18 static void force_next _((I32 type));
19 static char *force_version _((char *start));
20 static char *force_word _((char *start, int token, int check_keyword, int allow_pack, int allow_tick));
21 static SV *q _((SV *sv));
22 static char *scan_const _((char *start));
23 static char *scan_formline _((char *s));
24 static char *scan_heredoc _((char *s));
25 static char *scan_ident _((char *s, char *send, char *dest, STRLEN destlen,
27 static char *scan_inputsymbol _((char *start));
28 static char *scan_pat _((char *start));
29 static char *scan_str _((char *start));
30 static char *scan_subst _((char *start));
31 static char *scan_trans _((char *start));
32 static char *scan_word _((char *s, char *dest, STRLEN destlen,
33 int allow_package, STRLEN *slp));
34 static char *skipspace _((char *s));
35 static void checkcomma _((char *s, char *name, char *what));
36 static void force_ident _((char *s, int kind));
37 static void incline _((char *s));
38 static int intuit_method _((char *s, GV *gv));
39 static int intuit_more _((char *s));
40 static I32 lop _((I32 f, expectation x, char *s));
41 static void missingterm _((char *s));
42 static void no_op _((char *what, char *s));
43 static void set_csh _((void));
44 static I32 sublex_done _((void));
45 static I32 sublex_push _((void));
46 static I32 sublex_start _((void));
48 static int uni _((I32 f, char *s));
50 static char * filter_gets _((SV *sv, PerlIO *fp, STRLEN append));
51 static void restore_rsfp _((void *f));
52 static void restore_expect _((void *e));
53 static void restore_lex_expect _((void *e));
55 static char ident_too_long[] = "Identifier too long";
57 static char *linestart; /* beg. of most recently read line */
59 static char pending_ident; /* pending identifier lookup */
62 I32 super_state; /* lexer state to save */
63 I32 sub_inwhat; /* "lex_inwhat" to use */
64 OP *sub_op; /* "lex_op" to use */
67 /* The following are arranged oddly so that the guard on the switch statement
68 * can get by with a single comparison (if the compiler is smart enough).
71 /* #define LEX_NOTPARSING 11 is done in perl.h. */
74 #define LEX_INTERPNORMAL 9
75 #define LEX_INTERPCASEMOD 8
76 #define LEX_INTERPPUSH 7
77 #define LEX_INTERPSTART 6
78 #define LEX_INTERPEND 5
79 #define LEX_INTERPENDMAYBE 4
80 #define LEX_INTERPCONCAT 3
81 #define LEX_INTERPCONST 2
82 #define LEX_FORMLINE 1
83 #define LEX_KNOWNEXT 0
92 /* XXX If this causes problems, set i_unistd=undef in the hint file. */
94 # include <unistd.h> /* Needed for execv() */
102 #include "keywords.h"
107 #define CLINE (copline = (curcop->cop_line < copline ? curcop->cop_line : copline))
109 #define TOKEN(retval) return (bufptr = s,(int)retval)
110 #define OPERATOR(retval) return (expect = XTERM,bufptr = s,(int)retval)
111 #define AOPERATOR(retval) return ao((expect = XTERM,bufptr = s,(int)retval))
112 #define PREBLOCK(retval) return (expect = XBLOCK,bufptr = s,(int)retval)
113 #define PRETERMBLOCK(retval) return (expect = XTERMBLOCK,bufptr = s,(int)retval)
114 #define PREREF(retval) return (expect = XREF,bufptr = s,(int)retval)
115 #define TERM(retval) return (CLINE, expect = XOPERATOR,bufptr = s,(int)retval)
116 #define LOOPX(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LOOPEX)
117 #define FTST(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)UNIOP)
118 #define FUN0(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC0)
119 #define FUN1(f) return(yylval.ival = f,expect = XOPERATOR,bufptr = s,(int)FUNC1)
120 #define BOop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITOROP))
121 #define BAop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)BITANDOP))
122 #define SHop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)SHIFTOP))
123 #define PWop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)POWOP))
124 #define PMop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)MATCHOP)
125 #define Aop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)ADDOP))
126 #define Mop(f) return ao((yylval.ival=f,expect = XTERM,bufptr = s,(int)MULOP))
127 #define Eop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)EQOP)
128 #define Rop(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)RELOP)
130 /* This bit of chicanery makes a unary function followed by
131 * a parenthesis into a function with one argument, highest precedence.
133 #define UNI(f) return(yylval.ival = f, \
136 last_uni = oldbufptr, \
138 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
140 #define UNIBRACK(f) return(yylval.ival = f, \
142 last_uni = oldbufptr, \
143 (*s == '(' || (s = skipspace(s), *s == '(') ? (int)FUNC1 : (int)UNIOP) )
145 /* grandfather return to old style */
146 #define OLDLOP(f) return(yylval.ival=f,expect = XTERM,bufptr = s,(int)LSTOP)
151 if (*bufptr == '=') {
153 if (toketype == ANDAND)
154 yylval.ival = OP_ANDASSIGN;
155 else if (toketype == OROR)
156 yylval.ival = OP_ORASSIGN;
163 no_op(char *what, char *s)
165 char *oldbp = bufptr;
166 bool is_first = (oldbufptr == linestart);
169 yywarn(form("%s found where operator expected", what));
171 warn("\t(Missing semicolon on previous line?)\n");
172 else if (oldoldbufptr && isIDFIRST(*oldoldbufptr)) {
174 for (t = oldoldbufptr; *t && (isALNUM(*t) || *t == ':'); t++) ;
175 if (t < bufptr && isSPACE(*t))
176 warn("\t(Do you need to predeclare %.*s?)\n",
177 t - oldoldbufptr, oldoldbufptr);
181 warn("\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
191 char *nl = strrchr(s,'\n');
195 else if (multi_close < 32 || multi_close == 127) {
197 tmpbuf[1] = toCTRL(multi_close);
203 *tmpbuf = multi_close;
207 q = strchr(s,'"') ? '\'' : '"';
208 croak("Can't find string terminator %c%s%c anywhere before EOF",q,s,q);
215 warn("Use of %s is deprecated", s);
221 deprecate("comma-less variable list");
227 win32_textfilter(int idx, SV *sv, int maxlen)
229 I32 count = FILTER_READ(idx+1, sv, maxlen);
230 if (count > 0 && !maxlen)
231 win32_strip_return(sv);
245 SAVEI32(lex_brackets);
246 SAVEI32(lex_fakebrack);
247 SAVEI32(lex_casemods);
252 SAVEI16(curcop->cop_line);
256 SAVEPPTR(oldoldbufptr);
259 SAVEPPTR(lex_brackstack);
260 SAVEPPTR(lex_casestack);
261 SAVEDESTRUCTOR(restore_rsfp, rsfp);
265 SAVEDESTRUCTOR(restore_expect, tokenbuf + expect); /* encode as pointer */
266 SAVEDESTRUCTOR(restore_lex_expect, tokenbuf + expect);
268 lex_state = LEX_NORMAL;
273 New(899, lex_brackstack, 120, char);
274 New(899, lex_casestack, 12, char);
275 SAVEFREEPV(lex_brackstack);
276 SAVEFREEPV(lex_casestack);
278 *lex_casestack = '\0';
286 if (SvREADONLY(linestr))
287 linestr = sv_2mortal(newSVsv(linestr));
288 s = SvPV(linestr, len);
289 if (len && s[len-1] != ';') {
290 if (!(SvFLAGS(linestr) & SVs_TEMP))
291 linestr = sv_2mortal(newSVsv(linestr));
292 sv_catpvn(linestr, "\n;", 2);
295 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
296 bufend = bufptr + SvCUR(linestr);
298 rs = newSVpv("\n", 1);
309 restore_rsfp(void *f)
311 PerlIO *fp = (PerlIO*)f;
313 if (rsfp == PerlIO_stdin())
314 PerlIO_clearerr(rsfp);
315 else if (rsfp && (rsfp != fp))
324 /* a safe way to store a small integer in a pointer */
325 expect = (expectation)((char *)e - tokenbuf);
329 restore_lex_expect(e)
332 /* a safe way to store a small integer in a pointer */
333 lex_expect = (expectation)((char *)e - tokenbuf);
348 while (*s == ' ' || *s == '\t') s++;
349 if (strnEQ(s, "line ", 5)) {
358 while (*s == ' ' || *s == '\t')
360 if (*s == '"' && (t = strchr(s+1, '"')))
364 return; /* false alarm */
365 for (t = s; !isSPACE(*t); t++) ;
370 curcop->cop_filegv = gv_fetchfile(s);
372 curcop->cop_filegv = gv_fetchfile(origfilename);
374 curcop->cop_line = atoi(n)-1;
378 skipspace(register char *s)
381 if (lex_formbrack && lex_brackets <= lex_formbrack) {
382 while (s < bufend && (*s == ' ' || *s == '\t'))
388 while (s < bufend && isSPACE(*s))
390 if (s < bufend && *s == '#') {
391 while (s < bufend && *s != '\n')
396 if (s < bufend || !rsfp || lex_state != LEX_NORMAL)
398 if ((s = filter_gets(linestr, rsfp, (prevlen = SvCUR(linestr)))) == Nullch) {
399 if (minus_n || minus_p) {
400 sv_setpv(linestr,minus_p ?
401 ";}continue{print or die qq(-p destination: $!\\n)" :
403 sv_catpv(linestr,";}");
404 minus_n = minus_p = 0;
407 sv_setpv(linestr,";");
408 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
409 bufend = SvPVX(linestr) + SvCUR(linestr);
410 if (preprocess && !in_eval)
411 (void)PerlProc_pclose(rsfp);
412 else if ((PerlIO*)rsfp == PerlIO_stdin())
413 PerlIO_clearerr(rsfp);
415 (void)PerlIO_close(rsfp);
421 linestart = bufptr = s + prevlen;
422 bufend = s + SvCUR(linestr);
425 if (PERLDB_LINE && curstash != debstash) {
426 SV *sv = NEWSV(85,0);
428 sv_upgrade(sv, SVt_PVMG);
429 sv_setpvn(sv,bufptr,bufend-bufptr);
430 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
441 if (oldoldbufptr != last_uni)
443 while (isSPACE(*last_uni))
445 for (s = last_uni; isALNUM(*s) || *s == '-'; s++) ;
446 if ((t = strchr(s, '(')) && t < bufptr)
450 warn("Warning: Use of \"%s\" without parens is ambiguous", last_uni);
457 #define UNI(f) return uni(f,s)
465 last_uni = oldbufptr;
476 #endif /* CRIPPLED_CC */
478 #define LOP(f,x) return lop(f,x,s)
481 lop(I32 f, expectation x, char *s)
488 last_lop = oldbufptr;
504 nexttype[nexttoke] = type;
506 if (lex_state != LEX_KNOWNEXT) {
507 lex_defer = lex_state;
509 lex_state = LEX_KNOWNEXT;
514 force_word(register char *start, int token, int check_keyword, int allow_pack, int allow_initial_tick)
519 start = skipspace(start);
522 (allow_pack && *s == ':') ||
523 (allow_initial_tick && *s == '\'') )
525 s = scan_word(s, tokenbuf, sizeof tokenbuf, allow_pack, &len);
526 if (check_keyword && keyword(tokenbuf, len))
528 if (token == METHOD) {
538 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(tokenbuf,0));
539 nextval[nexttoke].opval->op_private |= OPpCONST_BARE;
546 force_ident(register char *s, int kind)
549 OP* o = (OP*)newSVOP(OP_CONST, 0, newSVpv(s,0));
550 nextval[nexttoke].opval = o;
553 dTHR; /* just for in_eval */
554 o->op_private = OPpCONST_ENTERED;
555 /* XXX see note in pp_entereval() for why we forgo typo
556 warnings if the symbol must be introduced in an eval.
558 gv_fetchpv(s, in_eval ? GV_ADDMULTI : TRUE,
559 kind == '$' ? SVt_PV :
560 kind == '@' ? SVt_PVAV :
561 kind == '%' ? SVt_PVHV :
569 force_version(char *s)
571 OP *version = Nullop;
575 /* default VERSION number -- GBARR */
580 for( d=s, c = 1; isDIGIT(*d) || *d == '_' || (*d == '.' && c--); d++);
581 if((*d == ';' || isSPACE(*d)) && *(skipspace(d)) != ',') {
583 /* real VERSION number -- GBARR */
584 version = yylval.opval;
588 /* NOTE: The parser sees the package name and the VERSION swapped */
589 nextval[nexttoke].opval = version;
606 s = SvPV_force(sv, len);
610 while (s < send && *s != '\\')
617 if (s + 1 < send && (s[1] == '\\'))
618 s++; /* all that, just for this */
623 SvCUR_set(sv, d - SvPVX(sv));
631 register I32 op_type = yylval.ival;
633 if (op_type == OP_NULL) {
634 yylval.opval = lex_op;
638 if (op_type == OP_CONST || op_type == OP_READLINE) {
639 SV *sv = q(lex_stuff);
641 char *p = SvPV(sv, len);
642 yylval.opval = (OP*)newSVOP(op_type, 0, newSVpv(p, len));
648 sublex_info.super_state = lex_state;
649 sublex_info.sub_inwhat = op_type;
650 sublex_info.sub_op = lex_op;
651 lex_state = LEX_INTERPPUSH;
655 yylval.opval = lex_op;
669 lex_state = sublex_info.super_state;
671 SAVEI32(lex_brackets);
672 SAVEI32(lex_fakebrack);
673 SAVEI32(lex_casemods);
678 SAVEI16(curcop->cop_line);
681 SAVEPPTR(oldoldbufptr);
684 SAVEPPTR(lex_brackstack);
685 SAVEPPTR(lex_casestack);
690 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
691 bufend += SvCUR(linestr);
697 New(899, lex_brackstack, 120, char);
698 New(899, lex_casestack, 12, char);
699 SAVEFREEPV(lex_brackstack);
700 SAVEFREEPV(lex_casestack);
702 *lex_casestack = '\0';
704 lex_state = LEX_INTERPCONCAT;
705 curcop->cop_line = multi_start;
707 lex_inwhat = sublex_info.sub_inwhat;
708 if (lex_inwhat == OP_MATCH || lex_inwhat == OP_SUBST)
709 lex_inpat = sublex_info.sub_op;
721 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv("",0));
725 if (lex_casemods) { /* oops, we've got some unbalanced parens */
726 lex_state = LEX_INTERPCASEMOD;
730 /* Is there a right-hand side to take care of? */
731 if (lex_repl && (lex_inwhat == OP_SUBST || lex_inwhat == OP_TRANS)) {
734 bufend = bufptr = oldbufptr = oldoldbufptr = linestart = SvPVX(linestr);
735 bufend += SvCUR(linestr);
741 *lex_casestack = '\0';
743 if (SvCOMPILED(lex_repl)) {
744 lex_state = LEX_INTERPNORMAL;
748 lex_state = LEX_INTERPCONCAT;
754 bufend = SvPVX(linestr);
755 bufend += SvCUR(linestr);
764 Extracts a pattern, double-quoted string, or transliteration. This
767 It looks at lex_inwhat and lex_inpat to find out whether it's
768 processing a pattern (lex_inpat is true), a transliteration
769 (lex_inwhat & OP_TRANS is true), or a double-quoted string.
773 double-quoted style: \r and \n
774 regexp special ones: \D \s
776 backrefs: \1 (deprecated in substitution replacements)
777 case and quoting: \U \Q \E
778 stops on @ and $, but not for $ as tail anchor
781 characters are VERY literal, except for - not at the start or end
782 of the string, which indicates a range. scan_const expands the
783 range to the full set of intermediate characters.
785 In double-quoted strings:
787 double-quoted style: \r and \n
789 backrefs: \1 (deprecated)
790 case and quoting: \U \Q \E
793 scan_const does *not* construct ops to handle interpolated strings.
794 It stops processing as soon as it finds an embedded $ or @ variable
795 and leaves it to the caller to work out what's going on.
797 @ in pattern could be: @foo, @{foo}, @$foo, @'foo, @:foo.
799 $ in pattern could be $foo or could be tail anchor. Assumption:
800 it's a tail anchor if $ is the last thing in the string, or if it's
801 followed by one of ")| \n\t"
803 \1 (backreferences) are turned into $1
805 The structure of the code is
806 while (there's a character to process) {
807 handle transliteration ranges
809 skip # initiated comments in //x patterns
810 check for embedded @foo
811 check for embedded scalars
813 leave intact backslashes from leave (below)
814 deprecate \1 in strings and sub replacements
815 handle string-changing backslashes \l \U \Q \E, etc.
816 switch (what was escaped) {
817 handle - in a transliteration (becomes a literal -)
818 handle \132 octal characters
819 handle 0x15 hex characters
820 handle \cV (control V)
821 handle printf backslashes (\f, \r, \n, etc)
824 } (end while character to read)
829 scan_const(char *start)
831 register char *send = bufend; /* end of the constant */
832 SV *sv = NEWSV(93, send - start); /* sv for the constant */
833 register char *s = start; /* start of the constant */
834 register char *d = SvPVX(sv); /* destination for copies */
835 bool dorange = FALSE; /* are we in a translit range? */
839 leave is the set of acceptably-backslashed characters.
841 I do *not* understand why there's the double hook here.
845 ? "\\.^$@AGZdDwWsSbB+*?|()-nrtfeaxc0123456789[{]} \t\n\r\f\v#"
846 : (lex_inwhat & OP_TRANS)
850 while (s < send || dorange) {
851 /* get transliterations out of the way (they're most literal) */
852 if (lex_inwhat == OP_TRANS) {
853 /* expand a range A-Z to the full set of characters. AIE! */
855 I32 i; /* current expanded character */
856 I32 max; /* last character in range */
858 i = d - SvPVX(sv); /* remember current offset */
859 SvGROW(sv, SvLEN(sv) + 256); /* expand the sv -- there'll never be more'n 256 chars in a range for it to grow by */
860 d = SvPVX(sv) + i; /* restore d after the grow potentially has changed the ptr */
861 d -= 2; /* eat the first char and the - */
863 max = (U8)d[1]; /* last char in range */
865 for (i = (U8)*d; i <= max; i++)
868 /* mark the range as done, and continue */
873 /* range begins (ignore - as first or last char) */
874 else if (*s == '-' && s+1 < send && s != start) {
880 /* if we get here, we're not doing a transliteration */
882 /* skip for regexp comments /(?#comment)/ */
883 else if (*s == '(' && lex_inpat && s[1] == '?') {
885 while (s < send && *s != ')')
887 } else if (s[2] == '{') { /* This should march regcomp.c */
889 char *regparse = s + 3;
892 while (count && (c = *regparse)) {
893 if (c == '\\' && regparse[1])
901 if (*regparse == ')')
904 yyerror("Sequence (?{...}) not terminated or not {}-balanced");
905 while (s < regparse && *s != ')')
910 /* likewise skip #-initiated comments in //x patterns */
911 else if (*s == '#' && lex_inpat &&
912 ((PMOP*)lex_inpat)->op_pmflags & PMf_EXTENDED) {
913 while (s+1 < send && *s != '\n')
917 /* check for embedded arrays (@foo, @:foo, @'foo, @{foo}, @$foo) */
918 else if (*s == '@' && s[1] && (isALNUM(s[1]) || strchr(":'{$", s[1])))
921 /* check for embedded scalars. only stop if we're sure it's a
924 else if (*s == '$') {
925 if (!lex_inpat) /* not a regexp, so $ must be var */
927 if (s + 1 < send && !strchr("()| \n\t", s[1]))
928 break; /* in regexp, $ might be tail anchor */
932 if (*s == '\\' && s+1 < send) {
935 /* some backslashes we leave behind */
936 if (*s && strchr(leaveit, *s)) {
942 /* deprecate \1 in strings and substitution replacements */
943 if (lex_inwhat == OP_SUBST && !lex_inpat &&
944 isDIGIT(*s) && *s != '0' && !isDIGIT(s[1]))
947 warn("\\%c better written as $%c", *s, *s);
952 /* string-change backslash escapes */
953 if (lex_inwhat != OP_TRANS && *s && strchr("lLuUEQ", *s)) {
958 /* if we get here, it's either a quoted -, or a digit */
961 /* quoted - in transliterations */
963 if (lex_inwhat == OP_TRANS) {
968 /* default action is to copy the quoted character */
973 /* \132 indicates an octal constant */
974 case '0': case '1': case '2': case '3':
975 case '4': case '5': case '6': case '7':
976 *d++ = scan_oct(s, 3, &len);
980 /* \x24 indicates a hex constant */
982 *d++ = scan_hex(++s, 2, &len);
986 /* \c is a control character */
993 /* printf-style backslashes, formfeeds, newlines, etc */
1019 } /* end if (backslash) */
1022 } /* while loop to process each character */
1024 /* terminate the string and set up the sv */
1026 SvCUR_set(sv, d - SvPVX(sv));
1029 /* shrink the sv if we allocated more than we used */
1030 if (SvCUR(sv) + 5 < SvLEN(sv)) {
1031 SvLEN_set(sv, SvCUR(sv) + 1);
1032 Renew(SvPVX(sv), SvLEN(sv), char);
1037 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1043 /* This is the one truly awful dwimmer necessary to conflate C and sed. */
1045 intuit_more(register char *s)
1049 if (*s == '-' && s[1] == '>' && (s[2] == '[' || s[2] == '{'))
1051 if (*s != '{' && *s != '[')
1056 /* In a pattern, so maybe we have {n,m}. */
1073 /* On the other hand, maybe we have a character class */
1076 if (*s == ']' || *s == '^')
1079 int weight = 2; /* let's weigh the evidence */
1081 unsigned char un_char = 0, last_un_char;
1082 char *send = strchr(s,']');
1083 char tmpbuf[sizeof tokenbuf * 4];
1085 if (!send) /* has to be an expression */
1088 Zero(seen,256,char);
1091 else if (isDIGIT(*s)) {
1093 if (isDIGIT(s[1]) && s[2] == ']')
1099 for (; s < send; s++) {
1100 last_un_char = un_char;
1101 un_char = (unsigned char)*s;
1106 weight -= seen[un_char] * 10;
1107 if (isALNUM(s[1])) {
1108 scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
1109 if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
1114 else if (*s == '$' && s[1] &&
1115 strchr("[#!%*<>()-=",s[1])) {
1116 if (/*{*/ strchr("])} =",s[2]))
1125 if (strchr("wds]",s[1]))
1127 else if (seen['\''] || seen['"'])
1129 else if (strchr("rnftbxcav",s[1]))
1131 else if (isDIGIT(s[1])) {
1133 while (s[1] && isDIGIT(s[1]))
1143 if (strchr("aA01! ",last_un_char))
1145 if (strchr("zZ79~",s[1]))
1149 if (!isALNUM(last_un_char) && !strchr("$@&",last_un_char) &&
1150 isALPHA(*s) && s[1] && isALPHA(s[1])) {
1155 if (keyword(tmpbuf, d - tmpbuf))
1158 if (un_char == last_un_char + 1)
1160 weight -= seen[un_char];
1165 if (weight >= 0) /* probably a character class */
1173 intuit_method(char *start, GV *gv)
1175 char *s = start + (*start == '$');
1176 char tmpbuf[sizeof tokenbuf];
1184 if ((cv = GvCVu(gv))) {
1185 char *proto = SvPVX(cv);
1195 s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
1196 if (*start == '$') {
1197 if (gv || last_lop_op == OP_PRINT || isUPPER(*tokenbuf))
1202 return *s == '(' ? FUNCMETH : METHOD;
1204 if (!keyword(tmpbuf, len)) {
1205 indirgv = gv_fetchpv(tmpbuf,FALSE, SVt_PVCV);
1206 if (indirgv && GvCVu(indirgv))
1208 /* filehandle or package name makes it a method */
1209 if (!gv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, FALSE)) {
1211 if ((bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
1212 return 0; /* no assumptions -- "=>" quotes bearword */
1213 nextval[nexttoke].opval =
1214 (OP*)newSVOP(OP_CONST, 0,
1216 nextval[nexttoke].opval->op_private =
1221 return *s == '(' ? FUNCMETH : METHOD;
1231 char *pdb = PerlEnv_getenv("PERL5DB");
1235 SETERRNO(0,SS$_NORMAL);
1236 return "BEGIN { require 'perl5db.pl' }";
1242 /* Encoded script support. filter_add() effectively inserts a
1243 * 'pre-processing' function into the current source input stream.
1244 * Note that the filter function only applies to the current source file
1245 * (e.g., it will not affect files 'require'd or 'use'd by this one).
1247 * The datasv parameter (which may be NULL) can be used to pass
1248 * private data to this instance of the filter. The filter function
1249 * can recover the SV using the FILTER_DATA macro and use it to
1250 * store private buffers and state information.
1252 * The supplied datasv parameter is upgraded to a PVIO type
1253 * and the IoDIRP field is used to store the function pointer.
1254 * Note that IoTOP_NAME, IoFMT_NAME, IoBOTTOM_NAME, if set for
1255 * private use must be set using malloc'd pointers.
1257 static int filter_debug = 0;
1260 filter_add(filter_t funcp, SV *datasv)
1262 if (!funcp){ /* temporary handy debugging hack to be deleted */
1263 filter_debug = atoi((char*)datasv);
1267 rsfp_filters = newAV();
1269 datasv = NEWSV(255,0);
1270 if (!SvUPGRADE(datasv, SVt_PVIO))
1271 die("Can't upgrade filter_add data to SVt_PVIO");
1272 IoDIRP(datasv) = (DIR*)funcp; /* stash funcp into spare field */
1274 warn("filter_add func %p (%s)", funcp, SvPV(datasv,na));
1275 av_unshift(rsfp_filters, 1);
1276 av_store(rsfp_filters, 0, datasv) ;
1281 /* Delete most recently added instance of this filter function. */
1283 filter_del(filter_t funcp)
1286 warn("filter_del func %p", funcp);
1287 if (!rsfp_filters || AvFILLp(rsfp_filters)<0)
1289 /* if filter is on top of stack (usual case) just pop it off */
1290 if (IoDIRP(FILTER_DATA(AvFILLp(rsfp_filters))) == (void*)funcp){
1291 sv_free(av_pop(rsfp_filters));
1295 /* we need to search for the correct entry and clear it */
1296 die("filter_del can only delete in reverse order (currently)");
1300 /* Invoke the n'th filter function for the current rsfp. */
1302 filter_read(int idx, SV *buf_sv, int maxlen)
1305 /* 0 = read one text line */
1312 if (idx > AvFILLp(rsfp_filters)){ /* Any more filters? */
1313 /* Provide a default input filter to make life easy. */
1314 /* Note that we append to the line. This is handy. */
1316 warn("filter_read %d: from rsfp\n", idx);
1320 int old_len = SvCUR(buf_sv) ;
1322 /* ensure buf_sv is large enough */
1323 SvGROW(buf_sv, old_len + maxlen) ;
1324 if ((len = PerlIO_read(rsfp, SvPVX(buf_sv) + old_len, maxlen)) <= 0){
1325 if (PerlIO_error(rsfp))
1326 return -1; /* error */
1328 return 0 ; /* end of file */
1330 SvCUR_set(buf_sv, old_len + len) ;
1333 if (sv_gets(buf_sv, rsfp, SvCUR(buf_sv)) == NULL) {
1334 if (PerlIO_error(rsfp))
1335 return -1; /* error */
1337 return 0 ; /* end of file */
1340 return SvCUR(buf_sv);
1342 /* Skip this filter slot if filter has been deleted */
1343 if ( (datasv = FILTER_DATA(idx)) == &sv_undef){
1345 warn("filter_read %d: skipped (filter deleted)\n", idx);
1346 return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
1348 /* Get function pointer hidden within datasv */
1349 funcp = (filter_t)IoDIRP(datasv);
1351 warn("filter_read %d: via function %p (%s)\n",
1352 idx, funcp, SvPV(datasv,na));
1353 /* Call function. The function is expected to */
1354 /* call "FILTER_READ(idx+1, buf_sv)" first. */
1355 /* Return: <0:error, =0:eof, >0:not eof */
1356 return (*funcp)(idx, buf_sv, maxlen);
1360 filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
1363 if (!rsfp_filters) {
1364 filter_add(win32_textfilter,NULL);
1370 SvCUR_set(sv, 0); /* start with empty line */
1371 if (FILTER_READ(0, sv, 0) > 0)
1372 return ( SvPVX(sv) ) ;
1377 return (sv_gets(sv, fp, append));
1382 static char* exp_name[] =
1383 { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "TERMBLOCK" };
1386 EXT int yychar; /* last token */
1391 Works out what to call the token just pulled out of the input
1392 stream. The yacc parser takes care of taking the ops we return and
1393 stitching them into a tree.
1399 if read an identifier
1400 if we're in a my declaration
1401 croak if they tried to say my($foo::bar)
1402 build the ops for a my() declaration
1403 if it's an access to a my() variable
1404 are we in a sort block?
1405 croak if my($a); $a <=> $b
1406 build ops for access to a my() variable
1407 if in a dq string, and they've said @foo and we can't find @foo
1409 build ops for a bareword
1410 if we already built the token before, use it.
1424 /* check if there's an identifier for us to look at */
1425 if (pending_ident) {
1426 /* pit holds the identifier we read and pending_ident is reset */
1427 char pit = pending_ident;
1430 /* if we're in a my(), we can't allow dynamics here.
1431 $foo'bar has already been turned into $foo::bar, so
1432 just check for colons.
1434 if it's a legal name, the OP is a PADANY.
1437 if (strchr(tokenbuf,':'))
1438 croak(no_myglob,tokenbuf);
1440 yylval.opval = newOP(OP_PADANY, 0);
1441 yylval.opval->op_targ = pad_allocmy(tokenbuf);
1446 build the ops for accesses to a my() variable.
1448 Deny my($a) or my($b) in a sort block, *if* $a or $b is
1449 then used in a comparison. This catches most, but not
1450 all cases. For instance, it catches
1451 sort { my($a); $a <=> $b }
1453 sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; }
1454 (although why you'd do that is anyone's guess).
1457 if (!strchr(tokenbuf,':')) {
1459 /* Check for single character per-thread SVs */
1460 if (tokenbuf[0] == '$' && tokenbuf[2] == '\0'
1461 && !isALPHA(tokenbuf[1]) /* Rule out obvious non-threadsvs */
1462 && (tmp = find_threadsv(&tokenbuf[1])) != NOT_IN_PAD)
1464 yylval.opval = newOP(OP_THREADSV, 0);
1465 yylval.opval->op_targ = tmp;
1468 #endif /* USE_THREADS */
1469 if ((tmp = pad_findmy(tokenbuf)) != NOT_IN_PAD) {
1470 /* if it's a sort block and they're naming $a or $b */
1471 if (last_lop_op == OP_SORT &&
1472 tokenbuf[0] == '$' &&
1473 (tokenbuf[1] == 'a' || tokenbuf[1] == 'b')
1476 for (d = in_eval ? oldoldbufptr : linestart;
1477 d < bufend && *d != '\n';
1480 if (strnEQ(d,"<=>",3) || strnEQ(d,"cmp",3)) {
1481 croak("Can't use \"my %s\" in sort comparison",
1487 yylval.opval = newOP(OP_PADANY, 0);
1488 yylval.opval->op_targ = tmp;
1494 Whine if they've said @foo in a doublequoted string,
1495 and @foo isn't a variable we can find in the symbol
1498 if (pit == '@' && lex_state != LEX_NORMAL && !lex_brackets) {
1499 GV *gv = gv_fetchpv(tokenbuf+1, FALSE, SVt_PVAV);
1500 if (!gv || ((tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
1501 yyerror(form("In string, %s now must be written as \\%s",
1502 tokenbuf, tokenbuf));
1505 /* build ops for a bareword */
1506 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf+1, 0));
1507 yylval.opval->op_private = OPpCONST_ENTERED;
1508 gv_fetchpv(tokenbuf+1, in_eval ? GV_ADDMULTI : TRUE,
1509 ((tokenbuf[0] == '$') ? SVt_PV
1510 : (tokenbuf[0] == '@') ? SVt_PVAV
1515 /* no identifier pending identification */
1517 switch (lex_state) {
1519 case LEX_NORMAL: /* Some compilers will produce faster */
1520 case LEX_INTERPNORMAL: /* code if we comment these out. */
1524 /* when we're already built the next token, just pull it out the queue */
1527 yylval = nextval[nexttoke];
1529 lex_state = lex_defer;
1530 expect = lex_expect;
1531 lex_defer = LEX_NORMAL;
1533 return(nexttype[nexttoke]);
1535 /* interpolated case modifiers like \L \U, including \Q and \E.
1536 when we get here, bufptr is at the \
1538 case LEX_INTERPCASEMOD:
1540 if (bufptr != bufend && *bufptr != '\\')
1541 croak("panic: INTERPCASEMOD");
1543 /* handle \E or end of string */
1544 if (bufptr == bufend || bufptr[1] == 'E') {
1549 oldmod = lex_casestack[--lex_casemods];
1550 lex_casestack[lex_casemods] = '\0';
1552 if (bufptr != bufend && strchr("LUQ", oldmod)) {
1554 lex_state = LEX_INTERPCONCAT;
1558 if (bufptr != bufend)
1560 lex_state = LEX_INTERPCONCAT;
1565 if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
1566 tmp = *s, *s = s[2], s[2] = tmp; /* misordered... */
1567 if (strchr("LU", *s) &&
1568 (strchr(lex_casestack, 'L') || strchr(lex_casestack, 'U')))
1570 lex_casestack[--lex_casemods] = '\0';
1573 if (lex_casemods > 10) {
1574 char* newlb = Renew(lex_casestack, lex_casemods + 2, char);
1575 if (newlb != lex_casestack) {
1577 lex_casestack = newlb;
1580 lex_casestack[lex_casemods++] = *s;
1581 lex_casestack[lex_casemods] = '\0';
1582 lex_state = LEX_INTERPCONCAT;
1583 nextval[nexttoke].ival = 0;
1586 nextval[nexttoke].ival = OP_LCFIRST;
1588 nextval[nexttoke].ival = OP_UCFIRST;
1590 nextval[nexttoke].ival = OP_LC;
1592 nextval[nexttoke].ival = OP_UC;
1594 nextval[nexttoke].ival = OP_QUOTEMETA;
1596 croak("panic: yylex");
1608 case LEX_INTERPPUSH:
1609 return sublex_push();
1611 case LEX_INTERPSTART:
1612 if (bufptr == bufend)
1613 return sublex_done();
1615 lex_dojoin = (*bufptr == '@');
1616 lex_state = LEX_INTERPNORMAL;
1618 nextval[nexttoke].ival = 0;
1621 nextval[nexttoke].opval = newOP(OP_THREADSV, 0);
1622 nextval[nexttoke].opval->op_targ = find_threadsv("\"");
1623 force_next(PRIVATEREF);
1625 force_ident("\"", '$');
1626 #endif /* USE_THREADS */
1627 nextval[nexttoke].ival = 0;
1629 nextval[nexttoke].ival = 0;
1631 nextval[nexttoke].ival = OP_JOIN; /* emulate join($", ...) */
1640 case LEX_INTERPENDMAYBE:
1641 if (intuit_more(bufptr)) {
1642 lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
1650 lex_state = LEX_INTERPCONCAT;
1654 case LEX_INTERPCONCAT:
1657 croak("panic: INTERPCONCAT");
1659 if (bufptr == bufend)
1660 return sublex_done();
1662 if (SvIVX(linestr) == '\'') {
1663 SV *sv = newSVsv(linestr);
1666 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
1670 s = scan_const(bufptr);
1672 lex_state = LEX_INTERPCASEMOD;
1674 lex_state = LEX_INTERPSTART;
1678 nextval[nexttoke] = yylval;
1691 lex_state = LEX_NORMAL;
1692 s = scan_formline(bufptr);
1699 oldoldbufptr = oldbufptr;
1702 PerlIO_printf(PerlIO_stderr(), "### Tokener expecting %s at %s\n", exp_name[expect], s);
1708 croak("Unrecognized character \\%03o", *s & 255);
1711 goto fake_eof; /* emulate EOF on ^D or ^Z */
1717 yyerror("Missing right bracket");
1721 goto retry; /* ignore stray nulls */
1724 if (!in_eval && !preambled) {
1726 sv_setpv(linestr,incl_perldb());
1728 sv_catpv(linestr,";");
1730 while(AvFILLp(preambleav) >= 0) {
1731 SV *tmpsv = av_shift(preambleav);
1732 sv_catsv(linestr, tmpsv);
1733 sv_catpv(linestr, ";");
1736 sv_free((SV*)preambleav);
1739 if (minus_n || minus_p) {
1740 sv_catpv(linestr, "LINE: while (<>) {");
1742 sv_catpv(linestr,"chomp;");
1744 GV* gv = gv_fetchpv("::F", TRUE, SVt_PVAV);
1746 GvIMPORTED_AV_on(gv);
1748 if (strchr("/'\"", *splitstr)
1749 && strchr(splitstr + 1, *splitstr))
1750 sv_catpvf(linestr, "@F=split(%s);", splitstr);
1753 s = "'~#\200\1'"; /* surely one char is unused...*/
1754 while (s[1] && strchr(splitstr, *s)) s++;
1756 sv_catpvf(linestr, "@F=split(%s%c",
1757 "q" + (delim == '\''), delim);
1758 for (s = splitstr; *s; s++) {
1760 sv_catpvn(linestr, "\\", 1);
1761 sv_catpvn(linestr, s, 1);
1763 sv_catpvf(linestr, "%c);", delim);
1767 sv_catpv(linestr,"@F=split(' ');");
1770 sv_catpv(linestr, "\n");
1771 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1772 bufend = SvPVX(linestr) + SvCUR(linestr);
1773 if (PERLDB_LINE && curstash != debstash) {
1774 SV *sv = NEWSV(85,0);
1776 sv_upgrade(sv, SVt_PVMG);
1777 sv_setsv(sv,linestr);
1778 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1783 if ((s = filter_gets(linestr, rsfp, 0)) == Nullch) {
1786 if (preprocess && !in_eval)
1787 (void)PerlProc_pclose(rsfp);
1788 else if ((PerlIO *)rsfp == PerlIO_stdin())
1789 PerlIO_clearerr(rsfp);
1791 (void)PerlIO_close(rsfp);
1796 if (!in_eval && (minus_n || minus_p)) {
1797 sv_setpv(linestr,minus_p ? ";}continue{print" : "");
1798 sv_catpv(linestr,";}");
1799 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1800 bufend = SvPVX(linestr) + SvCUR(linestr);
1801 minus_n = minus_p = 0;
1804 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1805 sv_setpv(linestr,"");
1806 TOKEN(';'); /* not infinite loop because rsfp is NULL now */
1809 if (*s == '#' && s[1] == '!' && instr(s,"perl"))
1812 /* Incest with pod. */
1813 if (*s == '=' && strnEQ(s, "=cut", 4)) {
1814 sv_setpv(linestr, "");
1815 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1816 bufend = SvPVX(linestr) + SvCUR(linestr);
1821 } while (doextract);
1822 oldoldbufptr = oldbufptr = bufptr = linestart = s;
1823 if (PERLDB_LINE && curstash != debstash) {
1824 SV *sv = NEWSV(85,0);
1826 sv_upgrade(sv, SVt_PVMG);
1827 sv_setsv(sv,linestr);
1828 av_store(GvAV(curcop->cop_filegv),(I32)curcop->cop_line,sv);
1830 bufend = SvPVX(linestr) + SvCUR(linestr);
1831 if (curcop->cop_line == 1) {
1832 while (s < bufend && isSPACE(*s))
1834 if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
1838 if (*s == '#' && *(s+1) == '!')
1840 #ifdef ALTERNATE_SHEBANG
1842 static char as[] = ALTERNATE_SHEBANG;
1843 if (*s == as[0] && strnEQ(s, as, sizeof(as) - 1))
1844 d = s + (sizeof(as) - 1);
1846 #endif /* ALTERNATE_SHEBANG */
1855 while (*d && !isSPACE(*d))
1859 #ifdef ARG_ZERO_IS_SCRIPT
1860 if (ipathend > ipath) {
1862 * HP-UX (at least) sets argv[0] to the script name,
1863 * which makes $^X incorrect. And Digital UNIX and Linux,
1864 * at least, set argv[0] to the basename of the Perl
1865 * interpreter. So, having found "#!", we'll set it right.
1867 SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV));
1868 assert(SvPOK(x) || SvGMAGICAL(x));
1869 if (sv_eq(x, GvSV(curcop->cop_filegv))) {
1870 sv_setpvn(x, ipath, ipathend - ipath);
1873 TAINT_NOT; /* $^X is always tainted, but that's OK */
1875 #endif /* ARG_ZERO_IS_SCRIPT */
1880 d = instr(s,"perl -");
1882 d = instr(s,"perl");
1883 #ifdef ALTERNATE_SHEBANG
1885 * If the ALTERNATE_SHEBANG on this system starts with a
1886 * character that can be part of a Perl expression, then if
1887 * we see it but not "perl", we're probably looking at the
1888 * start of Perl code, not a request to hand off to some
1889 * other interpreter. Similarly, if "perl" is there, but
1890 * not in the first 'word' of the line, we assume the line
1891 * contains the start of the Perl program.
1893 if (d && *s != '#') {
1895 while (*c && !strchr("; \t\r\n\f\v#", *c))
1898 d = Nullch; /* "perl" not in first word; ignore */
1900 *s = '#'; /* Don't try to parse shebang line */
1902 #endif /* ALTERNATE_SHEBANG */
1907 !instr(s,"indir") &&
1908 instr(origargv[0],"perl"))
1914 while (s < bufend && isSPACE(*s))
1917 Newz(899,newargv,origargc+3,char*);
1919 while (s < bufend && !isSPACE(*s))
1922 Copy(origargv+1, newargv+2, origargc+1, char*);
1927 execv(ipath, newargv);
1928 croak("Can't exec %s", ipath);
1931 U32 oldpdb = perldb;
1932 bool oldn = minus_n;
1933 bool oldp = minus_p;
1935 while (*d && !isSPACE(*d)) d++;
1936 while (*d == ' ' || *d == '\t') d++;
1940 if (*d == 'M' || *d == 'm') {
1942 while (*d && !isSPACE(*d)) d++;
1943 croak("Too late for \"-%.*s\" option",
1946 d = moreswitches(d);
1948 if (PERLDB_LINE && !oldpdb ||
1949 ( minus_n || minus_p ) && !(oldn || oldp) )
1950 /* if we have already added "LINE: while (<>) {",
1951 we must not do it again */
1953 sv_setpv(linestr, "");
1954 oldoldbufptr = oldbufptr = s = linestart = SvPVX(linestr);
1955 bufend = SvPVX(linestr) + SvCUR(linestr);
1958 (void)gv_fetchfile(origfilename);
1965 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1967 lex_state = LEX_FORMLINE;
1973 warn("Illegal character \\%03o (carriage return)", '\r');
1975 "(Maybe you didn't strip carriage returns after a network transfer?)\n");
1977 case ' ': case '\t': case '\f': case 013:
1982 if (lex_state != LEX_NORMAL || (in_eval && !rsfp)) {
1984 while (s < d && *s != '\n')
1989 if (lex_formbrack && lex_brackets <= lex_formbrack) {
1991 lex_state = LEX_FORMLINE;
2001 if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
2006 while (s < bufend && (*s == ' ' || *s == '\t'))
2009 if (strnEQ(s,"=>",2)) {
2011 warn("Ambiguous use of -%c => resolved to \"-%c\" =>",
2012 (int)tmp, (int)tmp);
2013 s = force_word(bufptr,WORD,FALSE,FALSE,FALSE);
2014 OPERATOR('-'); /* unary minus */
2016 last_uni = oldbufptr;
2017 last_lop_op = OP_FTEREAD; /* good enough */
2019 case 'r': FTST(OP_FTEREAD);
2020 case 'w': FTST(OP_FTEWRITE);
2021 case 'x': FTST(OP_FTEEXEC);
2022 case 'o': FTST(OP_FTEOWNED);
2023 case 'R': FTST(OP_FTRREAD);
2024 case 'W': FTST(OP_FTRWRITE);
2025 case 'X': FTST(OP_FTREXEC);
2026 case 'O': FTST(OP_FTROWNED);
2027 case 'e': FTST(OP_FTIS);
2028 case 'z': FTST(OP_FTZERO);
2029 case 's': FTST(OP_FTSIZE);
2030 case 'f': FTST(OP_FTFILE);
2031 case 'd': FTST(OP_FTDIR);
2032 case 'l': FTST(OP_FTLINK);
2033 case 'p': FTST(OP_FTPIPE);
2034 case 'S': FTST(OP_FTSOCK);
2035 case 'u': FTST(OP_FTSUID);
2036 case 'g': FTST(OP_FTSGID);
2037 case 'k': FTST(OP_FTSVTX);
2038 case 'b': FTST(OP_FTBLK);
2039 case 'c': FTST(OP_FTCHR);
2040 case 't': FTST(OP_FTTTY);
2041 case 'T': FTST(OP_FTTEXT);
2042 case 'B': FTST(OP_FTBINARY);
2043 case 'M': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTMTIME);
2044 case 'A': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTATIME);
2045 case 'C': gv_fetchpv("\024",TRUE, SVt_PV); FTST(OP_FTCTIME);
2047 croak("Unrecognized file test: -%c", (int)tmp);
2054 if (expect == XOPERATOR)
2059 else if (*s == '>') {
2062 if (isIDFIRST(*s)) {
2063 s = force_word(s,METHOD,FALSE,TRUE,FALSE);
2071 if (expect == XOPERATOR)
2074 if (isSPACE(*s) || !isSPACE(*bufptr))
2076 OPERATOR('-'); /* unary minus */
2083 if (expect == XOPERATOR)
2088 if (expect == XOPERATOR)
2091 if (isSPACE(*s) || !isSPACE(*bufptr))
2097 if (expect != XOPERATOR) {
2098 s = scan_ident(s, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2100 force_ident(tokenbuf, '*');
2113 if (expect == XOPERATOR) {
2118 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, TRUE);
2121 yyerror("Final % should be \\% or %name");
2124 pending_ident = '%';
2146 if (last_lop == oldoldbufptr || last_uni == oldoldbufptr)
2147 oldbufptr = oldoldbufptr; /* allow print(STDOUT 123) */
2152 if (curcop->cop_line < copline)
2153 copline = curcop->cop_line;
2164 if (lex_brackets <= 0)
2165 yyerror("Unmatched right bracket");
2168 if (lex_state == LEX_INTERPNORMAL) {
2169 if (lex_brackets == 0) {
2170 if (*s != '[' && *s != '{' && (*s != '-' || s[1] != '>'))
2171 lex_state = LEX_INTERPEND;
2178 if (lex_brackets > 100) {
2179 char* newlb = Renew(lex_brackstack, lex_brackets + 1, char);
2180 if (newlb != lex_brackstack) {
2182 lex_brackstack = newlb;
2187 if (lex_formbrack) {
2191 if (oldoldbufptr == last_lop)
2192 lex_brackstack[lex_brackets++] = XTERM;
2194 lex_brackstack[lex_brackets++] = XOPERATOR;
2195 OPERATOR(HASHBRACK);
2197 while (s < bufend && (*s == ' ' || *s == '\t'))
2201 if (d < bufend && *d == '-') {
2204 while (d < bufend && (*d == ' ' || *d == '\t'))
2207 if (d < bufend && isIDFIRST(*d)) {
2208 d = scan_word(d, tokenbuf + 1, sizeof tokenbuf - 1,
2210 while (d < bufend && (*d == ' ' || *d == '\t'))
2213 char minus = (tokenbuf[0] == '-');
2215 (keyword(tokenbuf + 1, len) ||
2216 (minus && len == 1 && isALPHA(tokenbuf[1])) ||
2217 perl_get_cv(tokenbuf + 1, FALSE) ))
2218 warn("Ambiguous use of {%s} resolved to {\"%s\"}",
2219 tokenbuf + !minus, tokenbuf + !minus);
2220 s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
2227 lex_brackstack[lex_brackets++] = XSTATE;
2231 lex_brackstack[lex_brackets++] = XOPERATOR;
2236 if (oldoldbufptr == last_lop)
2237 lex_brackstack[lex_brackets++] = XTERM;
2239 lex_brackstack[lex_brackets++] = XOPERATOR;
2242 if (expect == XSTATE) {
2243 lex_brackstack[lex_brackets-1] = XSTATE;
2246 OPERATOR(HASHBRACK);
2248 /* This hack serves to disambiguate a pair of curlies
2249 * as being a block or an anon hash. Normally, expectation
2250 * determines that, but in cases where we're not in a
2251 * position to expect anything in particular (like inside
2252 * eval"") we have to resolve the ambiguity. This code
2253 * covers the case where the first term in the curlies is a
2254 * quoted string. Most other cases need to be explicitly
2255 * disambiguated by prepending a `+' before the opening
2256 * curly in order to force resolution as an anon hash.
2258 * XXX should probably propagate the outer expectation
2259 * into eval"" to rely less on this hack, but that could
2260 * potentially break current behavior of eval"".
2264 if (*s == '\'' || *s == '"' || *s == '`') {
2265 /* common case: get past first string, handling escapes */
2266 for (t++; t < bufend && *t != *s;)
2267 if (*t++ == '\\' && (*t == '\\' || *t == *s))
2271 else if (*s == 'q') {
2274 || ((*t == 'q' || *t == 'x') && ++t < bufend
2275 && !isALNUM(*t)))) {
2277 char open, close, term;
2280 while (t < bufend && isSPACE(*t))
2284 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
2288 for (t++; t < bufend; t++) {
2289 if (*t == '\\' && t+1 < bufend && open != '\\')
2291 else if (*t == open)
2295 for (t++; t < bufend; t++) {
2296 if (*t == '\\' && t+1 < bufend)
2298 else if (*t == close && --brackets <= 0)
2300 else if (*t == open)
2306 else if (isALPHA(*s)) {
2307 for (t++; t < bufend && isALNUM(*t); t++) ;
2309 while (t < bufend && isSPACE(*t))
2311 /* if comma follows first term, call it an anon hash */
2312 /* XXX it could be a comma expression with loop modifiers */
2313 if (t < bufend && ((*t == ',' && (*s == 'q' || !isLOWER(*s)))
2314 || (*t == '=' && t[1] == '>')))
2315 OPERATOR(HASHBRACK);
2319 lex_brackstack[lex_brackets-1] = XSTATE;
2325 yylval.ival = curcop->cop_line;
2326 if (isSPACE(*s) || *s == '#')
2327 copline = NOLINE; /* invalidate current command line number */
2332 if (lex_brackets <= 0)
2333 yyerror("Unmatched right bracket");
2335 expect = (expectation)lex_brackstack[--lex_brackets];
2336 if (lex_brackets < lex_formbrack)
2338 if (lex_state == LEX_INTERPNORMAL) {
2339 if (lex_brackets == 0) {
2340 if (lex_fakebrack) {
2341 lex_state = LEX_INTERPEND;
2343 return yylex(); /* ignore fake brackets */
2345 if (*s == '-' && s[1] == '>')
2346 lex_state = LEX_INTERPENDMAYBE;
2347 else if (*s != '[' && *s != '{')
2348 lex_state = LEX_INTERPEND;
2351 if (lex_brackets < lex_fakebrack) {
2354 return yylex(); /* ignore fake brackets */
2364 if (expect == XOPERATOR) {
2365 if (dowarn && isALPHA(*s) && bufptr == linestart) {
2373 s = scan_ident(s - 1, bufend, tokenbuf, sizeof tokenbuf, TRUE);
2376 force_ident(tokenbuf, '&');
2380 yylval.ival = (OPpENTERSUB_AMPER<<8);
2399 if (dowarn && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
2400 warn("Reversed %c= operator",(int)tmp);
2402 if (expect == XSTATE && isALPHA(tmp) &&
2403 (s == linestart+1 || s[-2] == '\n') )
2405 if (in_eval && !rsfp) {
2410 if (strnEQ(s,"=cut",4)) {
2427 if (lex_brackets < lex_formbrack) {
2429 for (t = s; *t == ' ' || *t == '\t'; t++) ;
2430 if (*t == '\n' || *t == '#') {
2448 if (expect != XOPERATOR) {
2449 if (s[1] != '<' && !strchr(s,'>'))
2452 s = scan_heredoc(s);
2454 s = scan_inputsymbol(s);
2455 TERM(sublex_start());
2460 SHop(OP_LEFT_SHIFT);
2474 SHop(OP_RIGHT_SHIFT);
2483 if (expect == XOPERATOR) {
2484 if (lex_formbrack && lex_brackets == lex_formbrack) {
2487 return ','; /* grandfather non-comma-format format */
2491 if (s[1] == '#' && (isALPHA(s[2]) || strchr("_{$:", s[2]))) {
2492 if (expect == XOPERATOR)
2493 no_op("Array length", bufptr);
2495 s = scan_ident(s + 1, bufend, tokenbuf + 1, sizeof tokenbuf - 1,
2500 pending_ident = '#';
2504 if (expect == XOPERATOR)
2505 no_op("Scalar", bufptr);
2507 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2510 yyerror("Final $ should be \\$ or $name");
2514 /* This kludge not intended to be bulletproof. */
2515 if (tokenbuf[1] == '[' && !tokenbuf[2]) {
2516 yylval.opval = newSVOP(OP_CONST, 0,
2517 newSViv((IV)compiling.cop_arybase));
2518 yylval.opval->op_private = OPpCONST_ARYBASE;
2523 if (lex_state == LEX_NORMAL)
2526 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2532 isSPACE(*t) || isALNUM(*t) || *t == '$';
2535 bufptr = skipspace(bufptr);
2536 while (t < bufend && *t != ']')
2538 warn("Multidimensional syntax %.*s not supported",
2539 (t - bufptr) + 1, bufptr);
2543 else if (*s == '{') {
2545 if (dowarn && strEQ(tokenbuf+1, "SIG") &&
2546 (t = strchr(s, '}')) && (t = strchr(t, '=')))
2548 char tmpbuf[sizeof tokenbuf];
2550 for (t++; isSPACE(*t); t++) ;
2551 if (isIDFIRST(*t)) {
2552 t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
2553 if (*t != '(' && perl_get_cv(tmpbuf, FALSE))
2554 warn("You need to quote \"%s\"", tmpbuf);
2561 if (lex_state == LEX_NORMAL && isSPACE(*d)) {
2562 bool islop = (last_lop == oldoldbufptr);
2563 if (!islop || last_lop_op == OP_GREPSTART)
2565 else if (strchr("$@\"'`q", *s))
2566 expect = XTERM; /* e.g. print $fh "foo" */
2567 else if (strchr("&*<%", *s) && isIDFIRST(s[1]))
2568 expect = XTERM; /* e.g. print $fh &sub */
2569 else if (isIDFIRST(*s)) {
2570 char tmpbuf[sizeof tokenbuf];
2571 scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
2572 if (tmp = keyword(tmpbuf, len)) {
2573 /* binary operators exclude handle interpretations */
2585 expect = XTERM; /* e.g. print $fh length() */
2590 GV *gv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
2591 if (gv && GvCVu(gv))
2592 expect = XTERM; /* e.g. print $fh subr() */
2595 else if (isDIGIT(*s))
2596 expect = XTERM; /* e.g. print $fh 3 */
2597 else if (*s == '.' && isDIGIT(s[1]))
2598 expect = XTERM; /* e.g. print $fh .3 */
2599 else if (strchr("/?-+", *s) && !isSPACE(s[1]))
2600 expect = XTERM; /* e.g. print $fh -1 */
2601 else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]))
2602 expect = XTERM; /* print $fh <<"EOF" */
2604 pending_ident = '$';
2608 if (expect == XOPERATOR)
2611 s = scan_ident(s, bufend, tokenbuf + 1, sizeof tokenbuf - 1, FALSE);
2614 yyerror("Final @ should be \\@ or @name");
2617 if (lex_state == LEX_NORMAL)
2619 if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
2623 /* Warn about @ where they meant $. */
2625 if (*s == '[' || *s == '{') {
2627 while (*t && (isALNUM(*t) || strchr(" \t$#+-'\"", *t)))
2629 if (*t == '}' || *t == ']') {
2631 bufptr = skipspace(bufptr);
2632 warn("Scalar value %.*s better written as $%.*s",
2633 t-bufptr, bufptr, t-bufptr-1, bufptr+1);
2638 pending_ident = '@';
2641 case '/': /* may either be division or pattern */
2642 case '?': /* may either be conditional or pattern */
2643 if (expect != XOPERATOR) {
2644 /* Disable warning on "study /blah/" */
2645 if (oldoldbufptr == last_uni
2646 && (*last_uni != 's' || s - last_uni < 5
2647 || memNE(last_uni, "study", 5) || isALNUM(last_uni[5])))
2650 TERM(sublex_start());
2658 if (lex_formbrack && lex_brackets == lex_formbrack && s[1] == '\n' &&
2659 (s == linestart || s[-1] == '\n') ) {
2664 if (expect == XOPERATOR || !isDIGIT(s[1])) {
2670 yylval.ival = OPf_SPECIAL;
2676 if (expect != XOPERATOR)
2681 case '0': case '1': case '2': case '3': case '4':
2682 case '5': case '6': case '7': case '8': case '9':
2684 if (expect == XOPERATOR)
2690 if (expect == XOPERATOR) {
2691 if (lex_formbrack && lex_brackets == lex_formbrack) {
2694 return ','; /* grandfather non-comma-format format */
2700 missingterm((char*)0);
2701 yylval.ival = OP_CONST;
2702 TERM(sublex_start());
2706 if (expect == XOPERATOR) {
2707 if (lex_formbrack && lex_brackets == lex_formbrack) {
2710 return ','; /* grandfather non-comma-format format */
2716 missingterm((char*)0);
2717 yylval.ival = OP_CONST;
2718 for (d = SvPV(lex_stuff, len); len; len--, d++) {
2719 if (*d == '$' || *d == '@' || *d == '\\') {
2720 yylval.ival = OP_STRINGIFY;
2724 TERM(sublex_start());
2728 if (expect == XOPERATOR)
2729 no_op("Backticks",s);
2731 missingterm((char*)0);
2732 yylval.ival = OP_BACKTICK;
2734 TERM(sublex_start());
2738 if (dowarn && lex_inwhat && isDIGIT(*s))
2739 warn("Can't use \\%c to mean $%c in expression", *s, *s);
2740 if (expect == XOPERATOR)
2741 no_op("Backslash",s);
2745 if (isDIGIT(s[1]) && expect == XOPERATOR) {
2784 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
2786 /* Some keywords can be followed by any delimiter, including ':' */
2787 tmp = (len == 1 && strchr("msyq", tokenbuf[0]) ||
2788 len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
2789 (tokenbuf[0] == 'q' &&
2790 strchr("qwx", tokenbuf[1]))));
2792 /* x::* is just a word, unless x is "CORE" */
2793 if (!tmp && *s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
2797 while (d < bufend && isSPACE(*d))
2798 d++; /* no comments skipped here, or s### is misparsed */
2800 /* Is this a label? */
2801 if (!tmp && expect == XSTATE
2802 && d < bufend && *d == ':' && *(d + 1) != ':') {
2804 yylval.pval = savepv(tokenbuf);
2809 /* Check for keywords */
2810 tmp = keyword(tokenbuf, len);
2812 /* Is this a word before a => operator? */
2813 if (strnEQ(d,"=>",2)) {
2815 if (dowarn && (tmp || perl_get_cv(tokenbuf, FALSE)))
2816 warn("Ambiguous use of %s => resolved to \"%s\" =>",
2817 tokenbuf, tokenbuf);
2818 yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf,0));
2819 yylval.opval->op_private = OPpCONST_BARE;
2823 if (tmp < 0) { /* second-class keyword? */
2824 if (expect != XOPERATOR && (*s != ':' || s[1] != ':') &&
2825 (((gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV)) &&
2826 GvCVu(gv) && GvIMPORTED_CV(gv)) ||
2827 ((gvp = (GV**)hv_fetch(globalstash,tokenbuf,len,FALSE)) &&
2828 (gv = *gvp) != (GV*)&sv_undef &&
2829 GvCVu(gv) && GvIMPORTED_CV(gv))))
2831 tmp = 0; /* overridden by importation */
2834 && -tmp==KEY_lock /* XXX generalizable kludge */
2835 && !hv_fetch(GvHVn(incgv), "Thread.pm", 9, FALSE))
2837 tmp = 0; /* any sub overrides "weak" keyword */
2840 tmp = -tmp; gv = Nullgv; gvp = 0;
2847 default: /* not a keyword */
2850 char lastchar = (bufptr == oldoldbufptr ? 0 : bufptr[-1]);
2852 /* Get the rest if it looks like a package qualifier */
2854 if (*s == '\'' || *s == ':' && s[1] == ':') {
2855 s = scan_word(s, tokenbuf + len, sizeof tokenbuf - len,
2858 croak("Bad name after %s::", tokenbuf);
2861 if (expect == XOPERATOR) {
2862 if (bufptr == linestart) {
2868 no_op("Bareword",s);
2871 /* Look for a subroutine with this name in current package. */
2874 sv = newSVpv("CORE::GLOBAL::",14);
2875 sv_catpv(sv,tokenbuf);
2878 sv = newSVpv(tokenbuf,0);
2880 gv = gv_fetchpv(tokenbuf,FALSE, SVt_PVCV);
2882 /* Presume this is going to be a bareword of some sort. */
2885 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sv);
2886 yylval.opval->op_private = OPpCONST_BARE;
2888 /* See if it's the indirect object for a list operator. */
2891 oldoldbufptr < bufptr &&
2892 (oldoldbufptr == last_lop || oldoldbufptr == last_uni) &&
2893 /* NO SKIPSPACE BEFORE HERE! */
2895 ((opargs[last_lop_op] >> OASHIFT)& 7) == OA_FILEREF) )
2897 bool immediate_paren = *s == '(';
2899 /* (Now we can afford to cross potential line boundary.) */
2902 /* Two barewords in a row may indicate method call. */
2904 if ((isALPHA(*s) || *s == '$') && (tmp=intuit_method(s,gv)))
2907 /* If not a declared subroutine, it's an indirect object. */
2908 /* (But it's an indir obj regardless for sort.) */
2910 if ((last_lop_op == OP_SORT ||
2911 (!immediate_paren && (!gv || !GvCVu(gv))) ) &&
2912 (last_lop_op != OP_MAPSTART && last_lop_op != OP_GREPSTART)){
2913 expect = (last_lop == oldoldbufptr) ? XTERM : XOPERATOR;
2918 /* If followed by a paren, it's certainly a subroutine. */
2924 if (gv && GvCVu(gv)) {
2925 for (d = s + 1; *d == ' ' || *d == '\t'; d++) ;
2926 if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
2931 nextval[nexttoke].opval = yylval.opval;
2938 /* If followed by var or block, call it a method (unless sub) */
2940 if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
2941 last_lop = oldbufptr;
2942 last_lop_op = OP_METHOD;
2946 /* If followed by a bareword, see if it looks like indir obj. */
2948 if ((isALPHA(*s) || *s == '$') && (tmp = intuit_method(s,gv)))
2951 /* Not a method, so call it a subroutine (if defined) */
2953 if (gv && GvCVu(gv)) {
2955 if (lastchar == '-')
2956 warn("Ambiguous use of -%s resolved as -&%s()",
2957 tokenbuf, tokenbuf);
2958 last_lop = oldbufptr;
2959 last_lop_op = OP_ENTERSUB;
2960 /* Check for a constant sub */
2962 if ((sv = cv_const_sv(cv))) {
2964 SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
2965 ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
2966 yylval.opval->op_private = 0;
2970 /* Resolve to GV now. */
2971 op_free(yylval.opval);
2972 yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
2973 /* Is there a prototype? */
2976 char *proto = SvPV((SV*)cv, len);
2979 if (strEQ(proto, "$"))
2981 if (*proto == '&' && *s == '{') {
2982 sv_setpv(subname,"__ANON__");
2986 nextval[nexttoke].opval = yylval.opval;
2992 if (hints & HINT_STRICT_SUBS &&
2995 last_lop_op != OP_TRUNCATE && /* S/F prototype in opcode.pl */
2996 last_lop_op != OP_ACCEPT &&
2997 last_lop_op != OP_PIPE_OP &&
2998 last_lop_op != OP_SOCKPAIR)
3001 "Bareword \"%s\" not allowed while \"strict subs\" in use",
3006 /* Call it a bare word */
3010 if (lastchar != '-') {
3011 for (d = tokenbuf; *d && isLOWER(*d); d++) ;
3013 warn(warn_reserved, tokenbuf);
3016 if (lastchar && strchr("*%&", lastchar)) {
3017 warn("Operator or semicolon missing before %c%s",
3018 lastchar, tokenbuf);
3019 warn("Ambiguous use of %c resolved as operator %c",
3020 lastchar, lastchar);
3026 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3027 newSVsv(GvSV(curcop->cop_filegv)));
3031 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3032 newSVpvf("%ld", (long)curcop->cop_line));
3035 case KEY___PACKAGE__:
3036 yylval.opval = (OP*)newSVOP(OP_CONST, 0,
3038 ? newSVsv(curstname)
3047 if (rsfp && (!in_eval || tokenbuf[2] == 'D')) {
3048 char *pname = "main";
3049 if (tokenbuf[2] == 'D')
3050 pname = HvNAME(curstash ? curstash : defstash);
3051 gv = gv_fetchpv(form("%s::DATA", pname), TRUE, SVt_PVIO);
3054 GvIOp(gv) = newIO();
3055 IoIFP(GvIOp(gv)) = rsfp;
3056 #if defined(HAS_FCNTL) && defined(F_SETFD)
3058 int fd = PerlIO_fileno(rsfp);
3059 fcntl(fd,F_SETFD,fd >= 3);
3062 /* Mark this internal pseudo-handle as clean */
3063 IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
3065 IoTYPE(GvIOp(gv)) = '|';
3066 else if ((PerlIO*)rsfp == PerlIO_stdin())
3067 IoTYPE(GvIOp(gv)) = '-';
3069 IoTYPE(GvIOp(gv)) = '<';
3080 if (expect == XSTATE) {
3087 if (*s == ':' && s[1] == ':') {
3090 s = scan_word(s, tokenbuf, sizeof tokenbuf, FALSE, &len);
3091 tmp = keyword(tokenbuf, len);
3105 LOP(OP_ACCEPT,XTERM);
3111 LOP(OP_ATAN2,XTERM);
3120 LOP(OP_BLESS,XTERM);
3129 (void)gv_fetchpv("ENV",TRUE, SVt_PVHV); /* may use HOME */
3149 LOP(OP_CRYPT,XTERM);
3153 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3154 if (*d != '0' && isDIGIT(*d))
3155 yywarn("chmod: mode argument is missing initial 0");
3157 LOP(OP_CHMOD,XTERM);
3160 LOP(OP_CHOWN,XTERM);
3163 LOP(OP_CONNECT,XTERM);
3179 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3183 hints |= HINT_BLOCK_SCOPE;
3193 gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
3194 LOP(OP_DBMOPEN,XTERM);
3200 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3207 yylval.ival = curcop->cop_line;
3221 expect = (*s == '{') ? XTERMBLOCK : XTERM;
3222 UNIBRACK(OP_ENTEREVAL);
3237 case KEY_endhostent:
3243 case KEY_endservent:
3246 case KEY_endprotoent:
3257 yylval.ival = curcop->cop_line;
3259 if (expect == XSTATE && isIDFIRST(*s)) {
3261 if ((bufend - p) >= 3 &&
3262 strnEQ(p, "my", 2) && isSPACE(*(p + 2)))
3266 croak("Missing $ on loop variable");
3271 LOP(OP_FORMLINE,XTERM);
3277 LOP(OP_FCNTL,XTERM);
3283 LOP(OP_FLOCK,XTERM);
3292 LOP(OP_GREPSTART, *s == '(' ? XTERM : XREF);
3295 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3310 case KEY_getpriority:
3311 LOP(OP_GETPRIORITY,XTERM);
3313 case KEY_getprotobyname:
3316 case KEY_getprotobynumber:
3317 LOP(OP_GPBYNUMBER,XTERM);
3319 case KEY_getprotoent:
3331 case KEY_getpeername:
3332 UNI(OP_GETPEERNAME);
3334 case KEY_gethostbyname:
3337 case KEY_gethostbyaddr:
3338 LOP(OP_GHBYADDR,XTERM);
3340 case KEY_gethostent:
3343 case KEY_getnetbyname:
3346 case KEY_getnetbyaddr:
3347 LOP(OP_GNBYADDR,XTERM);
3352 case KEY_getservbyname:
3353 LOP(OP_GSBYNAME,XTERM);
3355 case KEY_getservbyport:
3356 LOP(OP_GSBYPORT,XTERM);
3358 case KEY_getservent:
3361 case KEY_getsockname:
3362 UNI(OP_GETSOCKNAME);
3364 case KEY_getsockopt:
3365 LOP(OP_GSOCKOPT,XTERM);
3387 yylval.ival = curcop->cop_line;
3391 LOP(OP_INDEX,XTERM);
3397 LOP(OP_IOCTL,XTERM);
3409 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3440 LOP(OP_LISTEN,XTERM);
3450 TERM(sublex_start());
3453 LOP(OP_MAPSTART,XREF);
3456 LOP(OP_MKDIR,XTERM);
3459 LOP(OP_MSGCTL,XTERM);
3462 LOP(OP_MSGGET,XTERM);
3465 LOP(OP_MSGRCV,XTERM);
3468 LOP(OP_MSGSND,XTERM);
3473 if (isIDFIRST(*s)) {
3474 s = scan_word(s, tokenbuf, sizeof tokenbuf, TRUE, &len);
3475 in_my_stash = gv_stashpv(tokenbuf, FALSE);
3479 sprintf(tmpbuf, "No such class %.1000s", tokenbuf);
3486 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3493 if (expect != XSTATE)
3494 yyerror("\"no\" not allowed in expression");
3495 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3496 s = force_version(s);
3505 if (isIDFIRST(*s)) {
3507 for (d = s; isALNUM(*d); d++) ;
3509 if (strchr("|&*+-=!?:.", *t))
3510 warn("Precedence problem: open %.*s should be open(%.*s)",
3516 yylval.ival = OP_OR;
3526 LOP(OP_OPEN_DIR,XTERM);
3529 checkcomma(s,tokenbuf,"filehandle");
3533 checkcomma(s,tokenbuf,"filehandle");
3552 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3556 LOP(OP_PIPE_OP,XTERM);
3561 missingterm((char*)0);
3562 yylval.ival = OP_CONST;
3563 TERM(sublex_start());
3571 missingterm((char*)0);
3572 if (dowarn && SvLEN(lex_stuff)) {
3573 d = SvPV_force(lex_stuff, len);
3574 for (; len; --len, ++d) {
3576 warn("Possible attempt to separate words with commas");
3580 warn("Possible attempt to put comments in qw() list");
3586 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, q(lex_stuff));
3590 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(" ",1));
3593 yylval.ival = OP_SPLIT;
3597 last_lop = oldbufptr;
3598 last_lop_op = OP_SPLIT;
3604 missingterm((char*)0);
3605 yylval.ival = OP_STRINGIFY;
3606 if (SvIVX(lex_stuff) == '\'')
3607 SvIVX(lex_stuff) = 0; /* qq'$foo' should intepolate */
3608 TERM(sublex_start());
3613 missingterm((char*)0);
3614 yylval.ival = OP_BACKTICK;
3616 TERM(sublex_start());
3623 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3624 if (isIDFIRST(*tokenbuf))
3625 gv_stashpvn(tokenbuf, strlen(tokenbuf), TRUE);
3627 yyerror("<> should be quotes");
3634 s = force_word(s,WORD,TRUE,FALSE,FALSE);
3638 LOP(OP_RENAME,XTERM);
3647 LOP(OP_RINDEX,XTERM);
3670 LOP(OP_REVERSE,XTERM);
3681 TERM(sublex_start());
3683 TOKEN(1); /* force error */
3692 LOP(OP_SELECT,XTERM);
3698 LOP(OP_SEMCTL,XTERM);
3701 LOP(OP_SEMGET,XTERM);
3704 LOP(OP_SEMOP,XTERM);
3710 LOP(OP_SETPGRP,XTERM);
3712 case KEY_setpriority:
3713 LOP(OP_SETPRIORITY,XTERM);
3715 case KEY_sethostent:
3721 case KEY_setservent:
3724 case KEY_setprotoent:
3734 LOP(OP_SEEKDIR,XTERM);
3736 case KEY_setsockopt:
3737 LOP(OP_SSOCKOPT,XTERM);
3743 LOP(OP_SHMCTL,XTERM);
3746 LOP(OP_SHMGET,XTERM);
3749 LOP(OP_SHMREAD,XTERM);
3752 LOP(OP_SHMWRITE,XTERM);
3755 LOP(OP_SHUTDOWN,XTERM);
3764 LOP(OP_SOCKET,XTERM);
3766 case KEY_socketpair:
3767 LOP(OP_SOCKPAIR,XTERM);
3770 checkcomma(s,tokenbuf,"subroutine name");
3772 if (*s == ';' || *s == ')') /* probably a close */
3773 croak("sort is now a reserved word");
3775 s = force_word(s,WORD,TRUE,TRUE,FALSE);
3779 LOP(OP_SPLIT,XTERM);
3782 LOP(OP_SPRINTF,XTERM);
3785 LOP(OP_SPLICE,XTERM);
3801 LOP(OP_SUBSTR,XTERM);
3808 if (isIDFIRST(*s) || *s == '\'' || *s == ':') {
3809 char tmpbuf[sizeof tokenbuf];
3811 d = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
3812 if (strchr(tmpbuf, ':'))
3813 sv_setpv(subname, tmpbuf);
3815 sv_setsv(subname,curstname);
3816 sv_catpvn(subname,"::",2);
3817 sv_catpvn(subname,tmpbuf,len);
3819 s = force_word(s,WORD,FALSE,TRUE,TRUE);
3823 expect = XTERMBLOCK;
3824 sv_setpv(subname,"?");
3827 if (tmp == KEY_format) {
3830 lex_formbrack = lex_brackets + 1;
3834 /* Look for a prototype */
3841 SvREFCNT_dec(lex_stuff);
3843 croak("Prototype not terminated");
3846 d = SvPVX(lex_stuff);
3848 for (p = d; *p; ++p) {
3853 SvCUR(lex_stuff) = tmp;
3856 nextval[1] = nextval[0];
3857 nexttype[1] = nexttype[0];
3858 nextval[0].opval = (OP*)newSVOP(OP_CONST, 0, lex_stuff);
3859 nexttype[0] = THING;
3860 if (nexttoke == 1) {
3861 lex_defer = lex_state;
3862 lex_expect = expect;
3863 lex_state = LEX_KNOWNEXT;
3868 if (*SvPV(subname,na) == '?') {
3869 sv_setpv(subname,"__ANON__");
3876 LOP(OP_SYSTEM,XREF);
3879 LOP(OP_SYMLINK,XTERM);
3882 LOP(OP_SYSCALL,XTERM);
3885 LOP(OP_SYSOPEN,XTERM);
3888 LOP(OP_SYSSEEK,XTERM);
3891 LOP(OP_SYSREAD,XTERM);
3894 LOP(OP_SYSWRITE,XTERM);
3898 TERM(sublex_start());
3919 LOP(OP_TRUNCATE,XTERM);
3931 yylval.ival = curcop->cop_line;
3935 yylval.ival = curcop->cop_line;
3939 LOP(OP_UNLINK,XTERM);
3945 LOP(OP_UNPACK,XTERM);
3948 LOP(OP_UTIME,XTERM);
3952 for (d = s; d < bufend && (isSPACE(*d) || *d == '('); d++) ;
3953 if (*d != '0' && isDIGIT(*d))
3954 yywarn("umask: argument is missing initial 0");
3959 LOP(OP_UNSHIFT,XTERM);
3962 if (expect != XSTATE)
3963 yyerror("\"use\" not allowed in expression");
3966 s = force_version(s);
3967 if(*s == ';' || (s = skipspace(s), *s == ';')) {
3968 nextval[nexttoke].opval = Nullop;
3973 s = force_word(s,WORD,FALSE,TRUE,FALSE);
3974 s = force_version(s);
3987 yylval.ival = curcop->cop_line;
3991 hints |= HINT_BLOCK_SCOPE;
3998 LOP(OP_WAITPID,XTERM);
4004 gv_fetchpv("\f",TRUE, SVt_PV); /* Make sure $^L is defined */
4008 if (expect == XOPERATOR)
4014 yylval.ival = OP_XOR;
4019 TERM(sublex_start());
4025 keyword(register char *d, I32 len)
4030 if (strEQ(d,"__FILE__")) return -KEY___FILE__;
4031 if (strEQ(d,"__LINE__")) return -KEY___LINE__;
4032 if (strEQ(d,"__PACKAGE__")) return -KEY___PACKAGE__;
4033 if (strEQ(d,"__DATA__")) return KEY___DATA__;
4034 if (strEQ(d,"__END__")) return KEY___END__;
4038 if (strEQ(d,"AUTOLOAD")) return KEY_AUTOLOAD;
4043 if (strEQ(d,"and")) return -KEY_and;
4044 if (strEQ(d,"abs")) return -KEY_abs;
4047 if (strEQ(d,"alarm")) return -KEY_alarm;
4048 if (strEQ(d,"atan2")) return -KEY_atan2;
4051 if (strEQ(d,"accept")) return -KEY_accept;
4056 if (strEQ(d,"BEGIN")) return KEY_BEGIN;
4059 if (strEQ(d,"bless")) return -KEY_bless;
4060 if (strEQ(d,"bind")) return -KEY_bind;
4061 if (strEQ(d,"binmode")) return -KEY_binmode;
4064 if (strEQ(d,"CORE")) return -KEY_CORE;
4069 if (strEQ(d,"cmp")) return -KEY_cmp;
4070 if (strEQ(d,"chr")) return -KEY_chr;
4071 if (strEQ(d,"cos")) return -KEY_cos;
4074 if (strEQ(d,"chop")) return KEY_chop;
4077 if (strEQ(d,"close")) return -KEY_close;
4078 if (strEQ(d,"chdir")) return -KEY_chdir;
4079 if (strEQ(d,"chomp")) return KEY_chomp;
4080 if (strEQ(d,"chmod")) return -KEY_chmod;
4081 if (strEQ(d,"chown")) return -KEY_chown;
4082 if (strEQ(d,"crypt")) return -KEY_crypt;
4085 if (strEQ(d,"chroot")) return -KEY_chroot;
4086 if (strEQ(d,"caller")) return -KEY_caller;
4089 if (strEQ(d,"connect")) return -KEY_connect;
4092 if (strEQ(d,"closedir")) return -KEY_closedir;
4093 if (strEQ(d,"continue")) return -KEY_continue;
4098 if (strEQ(d,"DESTROY")) return KEY_DESTROY;
4103 if (strEQ(d,"do")) return KEY_do;
4106 if (strEQ(d,"die")) return -KEY_die;
4109 if (strEQ(d,"dump")) return -KEY_dump;
4112 if (strEQ(d,"delete")) return KEY_delete;
4115 if (strEQ(d,"defined")) return KEY_defined;
4116 if (strEQ(d,"dbmopen")) return -KEY_dbmopen;
4119 if (strEQ(d,"dbmclose")) return -KEY_dbmclose;
4124 if (strEQ(d,"EQ")) { deprecate(d); return -KEY_eq;}
4125 if (strEQ(d,"END")) return KEY_END;
4130 if (strEQ(d,"eq")) return -KEY_eq;
4133 if (strEQ(d,"eof")) return -KEY_eof;
4134 if (strEQ(d,"exp")) return -KEY_exp;
4137 if (strEQ(d,"else")) return KEY_else;
4138 if (strEQ(d,"exit")) return -KEY_exit;
4139 if (strEQ(d,"eval")) return KEY_eval;
4140 if (strEQ(d,"exec")) return -KEY_exec;
4141 if (strEQ(d,"each")) return KEY_each;
4144 if (strEQ(d,"elsif")) return KEY_elsif;
4147 if (strEQ(d,"exists")) return KEY_exists;
4148 if (strEQ(d,"elseif")) warn("elseif should be elsif");
4151 if (strEQ(d,"endgrent")) return -KEY_endgrent;
4152 if (strEQ(d,"endpwent")) return -KEY_endpwent;
4155 if (strEQ(d,"endnetent")) return -KEY_endnetent;
4158 if (strEQ(d,"endhostent")) return -KEY_endhostent;
4159 if (strEQ(d,"endservent")) return -KEY_endservent;
4162 if (strEQ(d,"endprotoent")) return -KEY_endprotoent;
4169 if (strEQ(d,"for")) return KEY_for;
4172 if (strEQ(d,"fork")) return -KEY_fork;
4175 if (strEQ(d,"fcntl")) return -KEY_fcntl;
4176 if (strEQ(d,"flock")) return -KEY_flock;
4179 if (strEQ(d,"format")) return KEY_format;
4180 if (strEQ(d,"fileno")) return -KEY_fileno;
4183 if (strEQ(d,"foreach")) return KEY_foreach;
4186 if (strEQ(d,"formline")) return -KEY_formline;
4192 if (strEQ(d,"GT")) { deprecate(d); return -KEY_gt;}
4193 if (strEQ(d,"GE")) { deprecate(d); return -KEY_ge;}
4197 if (strnEQ(d,"get",3)) {
4202 if (strEQ(d,"ppid")) return -KEY_getppid;
4203 if (strEQ(d,"pgrp")) return -KEY_getpgrp;
4206 if (strEQ(d,"pwent")) return -KEY_getpwent;
4207 if (strEQ(d,"pwnam")) return -KEY_getpwnam;
4208 if (strEQ(d,"pwuid")) return -KEY_getpwuid;
4211 if (strEQ(d,"peername")) return -KEY_getpeername;
4212 if (strEQ(d,"protoent")) return -KEY_getprotoent;
4213 if (strEQ(d,"priority")) return -KEY_getpriority;
4216 if (strEQ(d,"protobyname")) return -KEY_getprotobyname;
4219 if (strEQ(d,"protobynumber"))return -KEY_getprotobynumber;
4223 else if (*d == 'h') {
4224 if (strEQ(d,"hostbyname")) return -KEY_gethostbyname;
4225 if (strEQ(d,"hostbyaddr")) return -KEY_gethostbyaddr;
4226 if (strEQ(d,"hostent")) return -KEY_gethostent;
4228 else if (*d == 'n') {
4229 if (strEQ(d,"netbyname")) return -KEY_getnetbyname;
4230 if (strEQ(d,"netbyaddr")) return -KEY_getnetbyaddr;
4231 if (strEQ(d,"netent")) return -KEY_getnetent;
4233 else if (*d == 's') {
4234 if (strEQ(d,"servbyname")) return -KEY_getservbyname;
4235 if (strEQ(d,"servbyport")) return -KEY_getservbyport;
4236 if (strEQ(d,"servent")) return -KEY_getservent;
4237 if (strEQ(d,"sockname")) return -KEY_getsockname;
4238 if (strEQ(d,"sockopt")) return -KEY_getsockopt;
4240 else if (*d == 'g') {
4241 if (strEQ(d,"grent")) return -KEY_getgrent;
4242 if (strEQ(d,"grnam")) return -KEY_getgrnam;
4243 if (strEQ(d,"grgid")) return -KEY_getgrgid;
4245 else if (*d == 'l') {
4246 if (strEQ(d,"login")) return -KEY_getlogin;
4248 else if (strEQ(d,"c")) return -KEY_getc;
4253 if (strEQ(d,"gt")) return -KEY_gt;
4254 if (strEQ(d,"ge")) return -KEY_ge;
4257 if (strEQ(d,"grep")) return KEY_grep;
4258 if (strEQ(d,"goto")) return KEY_goto;
4259 if (strEQ(d,"glob")) return KEY_glob;
4262 if (strEQ(d,"gmtime")) return -KEY_gmtime;
4267 if (strEQ(d,"hex")) return -KEY_hex;
4270 if (strEQ(d,"INIT")) return KEY_INIT;
4275 if (strEQ(d,"if")) return KEY_if;
4278 if (strEQ(d,"int")) return -KEY_int;
4281 if (strEQ(d,"index")) return -KEY_index;
4282 if (strEQ(d,"ioctl")) return -KEY_ioctl;
4287 if (strEQ(d,"join")) return -KEY_join;
4291 if (strEQ(d,"keys")) return KEY_keys;
4292 if (strEQ(d,"kill")) return -KEY_kill;
4297 if (strEQ(d,"LT")) { deprecate(d); return -KEY_lt;}
4298 if (strEQ(d,"LE")) { deprecate(d); return -KEY_le;}
4304 if (strEQ(d,"lt")) return -KEY_lt;
4305 if (strEQ(d,"le")) return -KEY_le;
4306 if (strEQ(d,"lc")) return -KEY_lc;
4309 if (strEQ(d,"log")) return -KEY_log;
4312 if (strEQ(d,"last")) return KEY_last;
4313 if (strEQ(d,"link")) return -KEY_link;
4314 if (strEQ(d,"lock")) return -KEY_lock;
4317 if (strEQ(d,"local")) return KEY_local;
4318 if (strEQ(d,"lstat")) return -KEY_lstat;
4321 if (strEQ(d,"length")) return -KEY_length;
4322 if (strEQ(d,"listen")) return -KEY_listen;
4325 if (strEQ(d,"lcfirst")) return -KEY_lcfirst;
4328 if (strEQ(d,"localtime")) return -KEY_localtime;
4334 case 1: return KEY_m;
4336 if (strEQ(d,"my")) return KEY_my;
4339 if (strEQ(d,"map")) return KEY_map;
4342 if (strEQ(d,"mkdir")) return -KEY_mkdir;
4345 if (strEQ(d,"msgctl")) return -KEY_msgctl;
4346 if (strEQ(d,"msgget")) return -KEY_msgget;
4347 if (strEQ(d,"msgrcv")) return -KEY_msgrcv;
4348 if (strEQ(d,"msgsnd")) return -KEY_msgsnd;
4353 if (strEQ(d,"NE")) { deprecate(d); return -KEY_ne;}
4356 if (strEQ(d,"next")) return KEY_next;
4357 if (strEQ(d,"ne")) return -KEY_ne;
4358 if (strEQ(d,"not")) return -KEY_not;
4359 if (strEQ(d,"no")) return KEY_no;
4364 if (strEQ(d,"or")) return -KEY_or;
4367 if (strEQ(d,"ord")) return -KEY_ord;
4368 if (strEQ(d,"oct")) return -KEY_oct;
4371 if (strEQ(d,"open")) return -KEY_open;
4374 if (strEQ(d,"opendir")) return -KEY_opendir;
4381 if (strEQ(d,"pop")) return KEY_pop;
4382 if (strEQ(d,"pos")) return KEY_pos;
4385 if (strEQ(d,"push")) return KEY_push;
4386 if (strEQ(d,"pack")) return -KEY_pack;
4387 if (strEQ(d,"pipe")) return -KEY_pipe;
4390 if (strEQ(d,"print")) return KEY_print;
4393 if (strEQ(d,"printf")) return KEY_printf;
4396 if (strEQ(d,"package")) return KEY_package;
4399 if (strEQ(d,"prototype")) return KEY_prototype;
4404 if (strEQ(d,"q")) return KEY_q;
4405 if (strEQ(d,"qq")) return KEY_qq;
4406 if (strEQ(d,"qw")) return KEY_qw;
4407 if (strEQ(d,"qx")) return KEY_qx;
4409 else if (strEQ(d,"quotemeta")) return -KEY_quotemeta;
4414 if (strEQ(d,"ref")) return -KEY_ref;
4417 if (strEQ(d,"read")) return -KEY_read;
4418 if (strEQ(d,"rand")) return -KEY_rand;
4419 if (strEQ(d,"recv")) return -KEY_recv;
4420 if (strEQ(d,"redo")) return KEY_redo;
4423 if (strEQ(d,"rmdir")) return -KEY_rmdir;
4424 if (strEQ(d,"reset")) return -KEY_reset;
4427 if (strEQ(d,"return")) return KEY_return;
4428 if (strEQ(d,"rename")) return -KEY_rename;
4429 if (strEQ(d,"rindex")) return -KEY_rindex;
4432 if (strEQ(d,"require")) return -KEY_require;
4433 if (strEQ(d,"reverse")) return -KEY_reverse;
4434 if (strEQ(d,"readdir")) return -KEY_readdir;
4437 if (strEQ(d,"readlink")) return -KEY_readlink;
4438 if (strEQ(d,"readline")) return -KEY_readline;
4439 if (strEQ(d,"readpipe")) return -KEY_readpipe;
4442 if (strEQ(d,"rewinddir")) return -KEY_rewinddir;
4448 case 0: return KEY_s;
4450 if (strEQ(d,"scalar")) return KEY_scalar;
4455 if (strEQ(d,"seek")) return -KEY_seek;
4456 if (strEQ(d,"send")) return -KEY_send;
4459 if (strEQ(d,"semop")) return -KEY_semop;
4462 if (strEQ(d,"select")) return -KEY_select;
4463 if (strEQ(d,"semctl")) return -KEY_semctl;
4464 if (strEQ(d,"semget")) return -KEY_semget;
4467 if (strEQ(d,"setpgrp")) return -KEY_setpgrp;
4468 if (strEQ(d,"seekdir")) return -KEY_seekdir;
4471 if (strEQ(d,"setpwent")) return -KEY_setpwent;
4472 if (strEQ(d,"setgrent")) return -KEY_setgrent;
4475 if (strEQ(d,"setnetent")) return -KEY_setnetent;
4478 if (strEQ(d,"setsockopt")) return -KEY_setsockopt;
4479 if (strEQ(d,"sethostent")) return -KEY_sethostent;
4480 if (strEQ(d,"setservent")) return -KEY_setservent;
4483 if (strEQ(d,"setpriority")) return -KEY_setpriority;
4484 if (strEQ(d,"setprotoent")) return -KEY_setprotoent;
4491 if (strEQ(d,"shift")) return KEY_shift;
4494 if (strEQ(d,"shmctl")) return -KEY_shmctl;
4495 if (strEQ(d,"shmget")) return -KEY_shmget;
4498 if (strEQ(d,"shmread")) return -KEY_shmread;
4501 if (strEQ(d,"shmwrite")) return -KEY_shmwrite;
4502 if (strEQ(d,"shutdown")) return -KEY_shutdown;
4507 if (strEQ(d,"sin")) return -KEY_sin;
4510 if (strEQ(d,"sleep")) return -KEY_sleep;
4513 if (strEQ(d,"sort")) return KEY_sort;
4514 if (strEQ(d,"socket")) return -KEY_socket;
4515 if (strEQ(d,"socketpair")) return -KEY_socketpair;
4518 if (strEQ(d,"split")) return KEY_split;
4519 if (strEQ(d,"sprintf")) return -KEY_sprintf;
4520 if (strEQ(d,"splice")) return KEY_splice;
4523 if (strEQ(d,"sqrt")) return -KEY_sqrt;
4526 if (strEQ(d,"srand")) return -KEY_srand;
4529 if (strEQ(d,"stat")) return -KEY_stat;
4530 if (strEQ(d,"study")) return KEY_study;
4533 if (strEQ(d,"substr")) return -KEY_substr;
4534 if (strEQ(d,"sub")) return KEY_sub;
4539 if (strEQ(d,"system")) return -KEY_system;
4542 if (strEQ(d,"symlink")) return -KEY_symlink;
4543 if (strEQ(d,"syscall")) return -KEY_syscall;
4544 if (strEQ(d,"sysopen")) return -KEY_sysopen;
4545 if (strEQ(d,"sysread")) return -KEY_sysread;
4546 if (strEQ(d,"sysseek")) return -KEY_sysseek;
4549 if (strEQ(d,"syswrite")) return -KEY_syswrite;
4558 if (strEQ(d,"tr")) return KEY_tr;
4561 if (strEQ(d,"tie")) return KEY_tie;
4564 if (strEQ(d,"tell")) return -KEY_tell;
4565 if (strEQ(d,"tied")) return KEY_tied;
4566 if (strEQ(d,"time")) return -KEY_time;
4569 if (strEQ(d,"times")) return -KEY_times;
4572 if (strEQ(d,"telldir")) return -KEY_telldir;
4575 if (strEQ(d,"truncate")) return -KEY_truncate;
4582 if (strEQ(d,"uc")) return -KEY_uc;
4585 if (strEQ(d,"use")) return KEY_use;
4588 if (strEQ(d,"undef")) return KEY_undef;
4589 if (strEQ(d,"until")) return KEY_until;
4590 if (strEQ(d,"untie")) return KEY_untie;
4591 if (strEQ(d,"utime")) return -KEY_utime;
4592 if (strEQ(d,"umask")) return -KEY_umask;
4595 if (strEQ(d,"unless")) return KEY_unless;
4596 if (strEQ(d,"unpack")) return -KEY_unpack;
4597 if (strEQ(d,"unlink")) return -KEY_unlink;
4600 if (strEQ(d,"unshift")) return KEY_unshift;
4601 if (strEQ(d,"ucfirst")) return -KEY_ucfirst;
4606 if (strEQ(d,"values")) return -KEY_values;
4607 if (strEQ(d,"vec")) return -KEY_vec;
4612 if (strEQ(d,"warn")) return -KEY_warn;
4613 if (strEQ(d,"wait")) return -KEY_wait;
4616 if (strEQ(d,"while")) return KEY_while;
4617 if (strEQ(d,"write")) return -KEY_write;
4620 if (strEQ(d,"waitpid")) return -KEY_waitpid;
4623 if (strEQ(d,"wantarray")) return -KEY_wantarray;
4628 if (len == 1) return -KEY_x;
4629 if (strEQ(d,"xor")) return -KEY_xor;
4632 if (len == 1) return KEY_y;
4641 checkcomma(register char *s, char *name, char *what)
4645 if (dowarn && *s == ' ' && s[1] == '(') { /* XXX gotta be a better way */
4647 for (w = s+2; *w && level; w++) {
4654 for (; *w && isSPACE(*w); w++) ;
4655 if (!*w || !strchr(";|})]oaiuw!=", *w)) /* an advisory hack only... */
4656 warn("%s (...) interpreted as function",name);
4658 while (s < bufend && isSPACE(*s))
4662 while (s < bufend && isSPACE(*s))
4664 if (isIDFIRST(*s)) {
4668 while (s < bufend && isSPACE(*s))
4673 kw = keyword(w, s - w) || perl_get_cv(w, FALSE) != 0;
4677 croak("No comma allowed after %s", what);
4683 scan_word(register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
4685 register char *d = dest;
4686 register char *e = d + destlen - 3; /* two-character token, ending NUL */
4689 croak(ident_too_long);
4692 else if (*s == '\'' && allow_package && isIDFIRST(s[1])) {
4697 else if (*s == ':' && s[1] == ':' && allow_package && isIDFIRST(s[2])) {
4710 scan_ident(register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
4717 if (lex_brackets == 0)
4722 e = d + destlen - 3; /* two-character token, ending NUL */
4724 while (isDIGIT(*s)) {
4726 croak(ident_too_long);
4733 croak(ident_too_long);
4736 else if (*s == '\'' && isIDFIRST(s[1])) {
4741 else if (*s == ':' && s[1] == ':') {
4752 if (lex_state != LEX_NORMAL)
4753 lex_state = LEX_INTERPENDMAYBE;
4756 if (*s == '$' && s[1] &&
4757 (isALNUM(s[1]) || strchr("${", s[1]) || strnEQ(s+1,"::",2)) )
4759 if (isDIGIT(s[1]) && lex_state == LEX_INTERPNORMAL)
4760 deprecate("\"$$<digit>\" to mean \"${$}<digit>\"");
4773 if (*d == '^' && *s && (isUPPER(*s) || strchr("[\\]^_?", *s))) {
4778 if (isSPACE(s[-1])) {
4781 if (ch != ' ' && ch != '\t') {
4787 if (isIDFIRST(*d)) {
4789 while (isALNUM(*s) || *s == ':')
4792 while (s < send && (*s == ' ' || *s == '\t')) s++;
4793 if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
4794 if (dowarn && keyword(dest, d - dest)) {
4795 char *brack = *s == '[' ? "[...]" : "{...}";
4796 warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
4797 funny, dest, brack, funny, dest, brack);
4799 lex_fakebrack = lex_brackets+1;
4801 lex_brackstack[lex_brackets++] = XOPERATOR;
4807 if (lex_state == LEX_INTERPNORMAL && !lex_brackets)
4808 lex_state = LEX_INTERPEND;
4811 if (dowarn && lex_state == LEX_NORMAL &&
4812 (keyword(dest, d - dest) || perl_get_cv(dest, FALSE)))
4813 warn("Ambiguous use of %c{%s} resolved to %c%s",
4814 funny, dest, funny, dest);
4817 s = bracket; /* let the parser handle it */
4821 else if (lex_state == LEX_INTERPNORMAL && !lex_brackets && !intuit_more(s))
4822 lex_state = LEX_INTERPEND;
4826 void pmflag(U16 *pmfl, int ch)
4831 *pmfl |= PMf_GLOBAL;
4833 *pmfl |= PMf_CONTINUE;
4837 *pmfl |= PMf_MULTILINE;
4839 *pmfl |= PMf_SINGLELINE;
4841 *pmfl |= PMf_EXTENDED;
4845 scan_pat(char *start)
4850 s = scan_str(start);
4853 SvREFCNT_dec(lex_stuff);
4855 croak("Search pattern not terminated");
4858 pm = (PMOP*)newPMOP(OP_MATCH, 0);
4859 if (multi_open == '?')
4860 pm->op_pmflags |= PMf_ONCE;
4861 while (*s && strchr("iogcmsx", *s))
4862 pmflag(&pm->op_pmflags,*s++);
4863 pm->op_pmpermflags = pm->op_pmflags;
4866 yylval.ival = OP_MATCH;
4871 scan_subst(char *start)
4878 yylval.ival = OP_NULL;
4880 s = scan_str(start);
4884 SvREFCNT_dec(lex_stuff);
4886 croak("Substitution pattern not terminated");
4889 if (s[-1] == multi_open)
4892 first_start = multi_start;
4896 SvREFCNT_dec(lex_stuff);
4899 SvREFCNT_dec(lex_repl);
4901 croak("Substitution replacement not terminated");
4903 multi_start = first_start; /* so whole substitution is taken together */
4905 pm = (PMOP*)newPMOP(OP_SUBST, 0);
4906 while (*s && strchr("iogcmsex", *s)) {
4912 pmflag(&pm->op_pmflags,*s++);
4917 pm->op_pmflags |= PMf_EVAL;
4918 repl = newSVpv("",0);
4920 sv_catpv(repl, es ? "eval " : "do ");
4921 sv_catpvn(repl, "{ ", 2);
4922 sv_catsv(repl, lex_repl);
4923 sv_catpvn(repl, " };", 2);
4924 SvCOMPILED_on(repl);
4925 SvREFCNT_dec(lex_repl);
4929 pm->op_pmpermflags = pm->op_pmflags;
4931 yylval.ival = OP_SUBST;
4936 scan_trans(char *start)
4945 yylval.ival = OP_NULL;
4947 s = scan_str(start);
4950 SvREFCNT_dec(lex_stuff);
4952 croak("Translation pattern not terminated");
4954 if (s[-1] == multi_open)
4960 SvREFCNT_dec(lex_stuff);
4963 SvREFCNT_dec(lex_repl);
4965 croak("Translation replacement not terminated");
4968 New(803,tbl,256,short);
4969 o = newPVOP(OP_TRANS, 0, (char*)tbl);
4971 complement = Delete = squash = 0;
4972 while (*s == 'c' || *s == 'd' || *s == 's') {
4974 complement = OPpTRANS_COMPLEMENT;
4976 Delete = OPpTRANS_DELETE;
4978 squash = OPpTRANS_SQUASH;
4981 o->op_private = Delete|squash|complement;
4984 yylval.ival = OP_TRANS;
4989 scan_heredoc(register char *s)
4993 I32 op_type = OP_SCALAR;
5000 int outer = (rsfp && !(lex_inwhat == OP_SCALAR));
5004 e = tokenbuf + sizeof tokenbuf - 1;
5007 for (peek = s; *peek == ' ' || *peek == '\t'; peek++) ;
5008 if (*peek && strchr("`'\"",*peek)) {
5011 s = delimcpy(d, e, s, bufend, term, &len);
5022 deprecate("bare << to mean <<\"\"");
5023 for (; isALNUM(*s); s++) {
5028 if (d >= tokenbuf + sizeof tokenbuf - 1)
5029 croak("Delimiter for here document is too long");
5034 if (outer || !(d=ninstr(s,bufend,d,d+1)))
5035 herewas = newSVpv(s,bufend-s);
5037 s--, herewas = newSVpv(s,d-s);
5038 s += SvCUR(herewas);
5040 tmpstr = NEWSV(87,80);
5041 sv_upgrade(tmpstr, SVt_PVIV);
5046 else if (term == '`') {
5047 op_type = OP_BACKTICK;
5048 SvIVX(tmpstr) = '\\';
5052 multi_start = curcop->cop_line;
5053 multi_open = multi_close = '<';
5057 while (s < bufend &&
5058 (*s != term || memNE(s,tokenbuf,len)) ) {
5063 curcop->cop_line = multi_start;
5064 missingterm(tokenbuf);
5066 sv_setpvn(tmpstr,d+1,s-d);
5068 curcop->cop_line++; /* the preceding stmt passes a newline */
5070 sv_catpvn(herewas,s,bufend-s);
5071 sv_setsv(linestr,herewas);
5072 oldoldbufptr = oldbufptr = bufptr = s = linestart = SvPVX(linestr);
5073 bufend = SvPVX(linestr) + SvCUR(linestr);
5076 sv_setpvn(tmpstr,"",0); /* avoid "uninitialized" warning */
5077 while (s >= bufend) { /* multiple line string? */
5079 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5080 curcop->cop_line = multi_start;
5081 missingterm(tokenbuf);
5084 if (PERLDB_LINE && curstash != debstash) {
5085 SV *sv = NEWSV(88,0);
5087 sv_upgrade(sv, SVt_PVMG);
5088 sv_setsv(sv,linestr);
5089 av_store(GvAV(curcop->cop_filegv),
5090 (I32)curcop->cop_line,sv);
5092 bufend = SvPVX(linestr) + SvCUR(linestr);
5093 if (*s == term && memEQ(s,tokenbuf,len)) {
5096 sv_catsv(linestr,herewas);
5097 bufend = SvPVX(linestr) + SvCUR(linestr);
5101 sv_catsv(tmpstr,linestr);
5104 multi_end = curcop->cop_line;
5106 if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
5107 SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
5108 Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
5110 SvREFCNT_dec(herewas);
5112 yylval.ival = op_type;
5117 takes: current position in input buffer
5118 returns: new position in input buffer
5119 side-effects: yylval and lex_op are set.
5124 <FH> read from filehandle
5125 <pkg::FH> read from package qualified filehandle
5126 <pkg'FH> read from package qualified filehandle
5127 <$fh> read from filehandle in $fh
5133 scan_inputsymbol(char *start)
5135 register char *s = start; /* current position in buffer */
5140 d = tokenbuf; /* start of temp holding space */
5141 e = tokenbuf + sizeof tokenbuf; /* end of temp holding space */
5142 s = delimcpy(d, e, s + 1, bufend, '>', &len); /* extract until > */
5144 /* die if we didn't have space for the contents of the <>,
5148 if (len >= sizeof tokenbuf)
5149 croak("Excessively long <> operator");
5151 croak("Unterminated <> operator");
5156 Remember, only scalar variables are interpreted as filehandles by
5157 this code. Anything more complex (e.g., <$fh{$num}>) will be
5158 treated as a glob() call.
5159 This code makes use of the fact that except for the $ at the front,
5160 a scalar variable and a filehandle look the same.
5162 if (*d == '$' && d[1]) d++;
5164 /* allow <Pkg'VALUE> or <Pkg::VALUE> */
5165 while (*d && (isALNUM(*d) || *d == '\'' || *d == ':'))
5168 /* If we've tried to read what we allow filehandles to look like, and
5169 there's still text left, then it must be a glob() and not a getline.
5170 Use scan_str to pull out the stuff between the <> and treat it
5171 as nothing more than a string.
5174 if (d - tokenbuf != len) {
5175 yylval.ival = OP_GLOB;
5177 s = scan_str(start);
5179 croak("Glob not terminated");
5183 /* we're in a filehandle read situation */
5186 /* turn <> into <ARGV> */
5188 (void)strcpy(d,"ARGV");
5190 /* if <$fh>, create the ops to turn the variable into a
5196 /* try to find it in the pad for this block, otherwise find
5197 add symbol table ops
5199 if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
5200 OP *o = newOP(OP_PADSV, 0);
5202 lex_op = (OP*)newUNOP(OP_READLINE, 0, newUNOP(OP_RV2GV, 0, o));
5205 GV *gv = gv_fetchpv(d+1,TRUE, SVt_PV);
5206 lex_op = (OP*)newUNOP(OP_READLINE, 0,
5207 newUNOP(OP_RV2GV, 0,
5208 newUNOP(OP_RV2SV, 0,
5209 newGVOP(OP_GV, 0, gv))));
5211 /* we created the ops in lex_op, so make yylval.ival a null op */
5212 yylval.ival = OP_NULL;
5215 /* If it's none of the above, it must be a literal filehandle
5216 (<Foo::BAR> or <FOO>) so build a simple readline OP */
5218 GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
5219 lex_op = (OP*)newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, gv));
5220 yylval.ival = OP_NULL;
5229 takes: start position in buffer
5230 returns: position to continue reading from buffer
5231 side-effects: multi_start, multi_close, lex_repl or lex_stuff, and
5232 updates the read buffer.
5234 This subroutine pulls a string out of the input. It is called for:
5235 q single quotes q(literal text)
5236 ' single quotes 'literal text'
5237 qq double quotes qq(interpolate $here please)
5238 " double quotes "interpolate $here please"
5239 qx backticks qx(/bin/ls -l)
5240 ` backticks `/bin/ls -l`
5241 qw quote words @EXPORT_OK = qw( func() $spam )
5242 m// regexp match m/this/
5243 s/// regexp substitute s/this/that/
5244 tr/// string transliterate tr/this/that/
5245 y/// string transliterate y/this/that/
5246 ($*@) sub prototypes sub foo ($)
5247 <> readline or globs <FOO>, <>, <$fh>, or <*.c>
5249 In most of these cases (all but <>, patterns and transliterate)
5250 yylex() calls scan_str(). m// makes yylex() call scan_pat() which
5251 calls scan_str(). s/// makes yylex() call scan_subst() which calls
5252 scan_str(). tr/// and y/// make yylex() call scan_trans() which
5255 It skips whitespace before the string starts, and treats the first
5256 character as the delimiter. If the delimiter is one of ([{< then
5257 the corresponding "close" character )]}> is used as the closing
5258 delimiter. It allows quoting of delimiters, and if the string has
5259 balanced delimiters ([{<>}]) it allows nesting.
5261 The lexer always reads these strings into lex_stuff, except in the
5262 case of the operators which take *two* arguments (s/// and tr///)
5263 when it checks to see if lex_stuff is full (presumably with the 1st
5264 arg to s or tr) and if so puts the string into lex_repl.
5269 scan_str(char *start)
5272 SV *sv; /* scalar value: string */
5273 char *tmps; /* temp string, used for delimiter matching */
5274 register char *s = start; /* current position in the buffer */
5275 register char term; /* terminating character */
5276 register char *to; /* current position in the sv's data */
5277 I32 brackets = 1; /* bracket nesting level */
5279 /* skip space before the delimiter */
5283 /* mark where we are, in case we need to report errors */
5286 /* after skipping whitespace, the next character is the terminator */
5288 /* mark where we are */
5289 multi_start = curcop->cop_line;
5292 /* find corresponding closing delimiter */
5293 if (term && (tmps = strchr("([{< )]}> )]}>",term)))
5297 /* create a new SV to hold the contents. 87 is leak category, I'm
5298 assuming. 80 is the SV's initial length. What a random number. */
5300 sv_upgrade(sv, SVt_PVIV);
5302 (void)SvPOK_only(sv); /* validate pointer */
5304 /* move past delimiter and try to read a complete string */
5307 /* extend sv if need be */
5308 SvGROW(sv, SvCUR(sv) + (bufend - s) + 1);
5309 /* set 'to' to the next character in the sv's string */
5310 to = SvPVX(sv)+SvCUR(sv);
5312 /* if open delimiter is the close delimiter read unbridle */
5313 if (multi_open == multi_close) {
5314 for (; s < bufend; s++,to++) {
5315 /* embedded newlines increment the current line number */
5316 if (*s == '\n' && !rsfp)
5318 /* handle quoted delimiters */
5319 if (*s == '\\' && s+1 < bufend && term != '\\') {
5322 /* any other quotes are simply copied straight through */
5326 /* terminate when run out of buffer (the for() condition), or
5327 have found the terminator */
5328 else if (*s == term)
5334 /* if the terminator isn't the same as the start character (e.g.,
5335 matched brackets), we have to allow more in the quoting, and
5336 be prepared for nested brackets.
5339 /* read until we run out of string, or we find the terminator */
5340 for (; s < bufend; s++,to++) {
5341 /* embedded newlines increment the line count */
5342 if (*s == '\n' && !rsfp)
5344 /* backslashes can escape the open or closing characters */
5345 if (*s == '\\' && s+1 < bufend) {
5346 if ((s[1] == multi_open) || (s[1] == multi_close))
5351 /* allow nested opens and closes */
5352 else if (*s == multi_close && --brackets <= 0)
5354 else if (*s == multi_open)
5359 /* terminate the copied string and update the sv's end-of-string */
5361 SvCUR_set(sv, to - SvPVX(sv));
5364 * this next chunk reads more into the buffer if we're not done yet
5367 if (s < bufend) break; /* handle case where we are done yet :-) */
5369 /* if we're out of file, or a read fails, bail and reset the current
5370 line marker so we can report where the unterminated string began
5373 !(oldoldbufptr = oldbufptr = s = linestart = filter_gets(linestr, rsfp, 0))) {
5375 curcop->cop_line = multi_start;
5378 /* we read a line, so increment our line counter */
5381 /* update debugger info */
5382 if (PERLDB_LINE && curstash != debstash) {
5383 SV *sv = NEWSV(88,0);
5385 sv_upgrade(sv, SVt_PVMG);
5386 sv_setsv(sv,linestr);
5387 av_store(GvAV(curcop->cop_filegv),
5388 (I32)curcop->cop_line, sv);
5391 /* having changed the buffer, we must update bufend */
5392 bufend = SvPVX(linestr) + SvCUR(linestr);
5395 /* at this point, we have successfully read the delimited string */
5397 multi_end = curcop->cop_line;
5400 /* if we allocated too much space, give some back */
5401 if (SvCUR(sv) + 5 < SvLEN(sv)) {
5402 SvLEN_set(sv, SvCUR(sv) + 1);
5403 Renew(SvPVX(sv), SvLEN(sv), char);
5406 /* decide whether this is the first or second quoted string we've read
5419 takes: pointer to position in buffer
5420 returns: pointer to new position in buffer
5421 side-effects: builds ops for the constant in yylval.op
5423 Read a number in any of the formats that Perl accepts:
5425 0(x[0-7A-F]+)|([0-7]+)
5426 [\d_]+(\.[\d_]*)?[Ee](\d+)
5428 Underbars (_) are allowed in decimal numbers. If -w is on,
5429 underbars before a decimal point must be at three digit intervals.
5431 Like most scan_ routines, it uses the tokenbuf buffer to hold the
5434 If it reads a number without a decimal point or an exponent, it will
5435 try converting the number to an integer and see if it can do so
5436 without loss of precision.
5440 scan_num(char *start)
5442 register char *s = start; /* current position in buffer */
5443 register char *d; /* destination in temp buffer */
5444 register char *e; /* end of temp buffer */
5445 I32 tryiv; /* used to see if it can be an int */
5446 double value; /* number read, as a double */
5447 SV *sv; /* place to put the converted number */
5448 I32 floatit; /* boolean: int or float? */
5449 char *lastub = 0; /* position of last underbar */
5450 static char number_too_long[] = "Number too long";
5452 /* We use the first character to decide what type of number this is */
5456 croak("panic: scan_num");
5458 /* if it starts with a 0, it could be an octal number, a decimal in
5459 0.13 disguise, or a hexadecimal number.
5464 u holds the "number so far"
5465 shift the power of 2 of the base (hex == 4, octal == 3)
5466 overflowed was the number more than we can hold?
5468 Shift is used when we add a digit. It also serves as an "are
5469 we in octal or hex?" indicator to disallow hex characters when
5474 bool overflowed = FALSE;
5481 /* check for a decimal in disguise */
5482 else if (s[1] == '.')
5484 /* so it must be octal */
5489 /* read the rest of the octal number */
5491 UV n, b; /* n is used in the overflow test, b is the digit we're adding on */
5495 /* if we don't mention it, we're done */
5504 /* 8 and 9 are not octal */
5507 yyerror("Illegal octal digit");
5511 case '0': case '1': case '2': case '3': case '4':
5512 case '5': case '6': case '7':
5513 b = *s++ & 15; /* ASCII digit -> value of digit */
5517 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
5518 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
5519 /* make sure they said 0x */
5524 /* Prepare to put the digit we have onto the end
5525 of the number so far. We check for overflows.
5529 n = u << shift; /* make room for the digit */
5530 if (!overflowed && (n >> shift) != u) {
5531 warn("Integer overflow in %s number",
5532 (shift == 4) ? "hex" : "octal");
5535 u = n | b; /* add the digit to the end */
5540 /* if we get here, we had success: make a scalar value from
5550 handle decimal numbers.
5551 we're also sent here when we read a 0 as the first digit
5553 case '1': case '2': case '3': case '4': case '5':
5554 case '6': case '7': case '8': case '9': case '.':
5557 e = tokenbuf + sizeof tokenbuf - 6; /* room for various punctuation */
5560 /* read next group of digits and _ and copy into d */
5561 while (isDIGIT(*s) || *s == '_') {
5562 /* skip underscores, checking for misplaced ones
5566 if (dowarn && lastub && s - lastub != 3)
5567 warn("Misplaced _ in number");
5571 /* check for end of fixed-length buffer */
5573 croak(number_too_long);
5574 /* if we're ok, copy the character */
5579 /* final misplaced underbar check */
5580 if (dowarn && lastub && s - lastub != 3)
5581 warn("Misplaced _ in number");
5583 /* read a decimal portion if there is one. avoid
5584 3..5 being interpreted as the number 3. followed
5587 if (*s == '.' && s[1] != '.') {
5591 /* copy, ignoring underbars, until we run out of
5592 digits. Note: no misplaced underbar checks!
5594 for (; isDIGIT(*s) || *s == '_'; s++) {
5595 /* fixed length buffer check */
5597 croak(number_too_long);
5603 /* read exponent part, if present */
5604 if (*s && strchr("eE",*s) && strchr("+-0123456789",s[1])) {
5608 /* regardless of whether user said 3E5 or 3e5, use lower 'e' */
5609 *d++ = 'e'; /* At least some Mach atof()s don't grok 'E' */
5611 /* allow positive or negative exponent */
5612 if (*s == '+' || *s == '-')
5615 /* read digits of exponent (no underbars :-) */
5616 while (isDIGIT(*s)) {
5618 croak(number_too_long);
5623 /* terminate the string */
5626 /* make an sv from the string */
5628 /* reset numeric locale in case we were earlier left in Swaziland */
5629 SET_NUMERIC_STANDARD();
5630 value = atof(tokenbuf);
5633 See if we can make do with an integer value without loss of
5634 precision. We use I_V to cast to an int, because some
5635 compilers have issues. Then we try casting it back and see
5636 if it was the same. We only do this if we know we
5637 specifically read an integer.
5639 Note: if floatit is true, then we don't need to do the
5643 if (!floatit && (double)tryiv == value)
5644 sv_setiv(sv, tryiv);
5646 sv_setnv(sv, value);
5650 /* make the op for the constant and return */
5652 yylval.opval = newSVOP(OP_CONST, 0, sv);
5658 scan_formline(register char *s)
5663 SV *stuff = newSVpv("",0);
5664 bool needargs = FALSE;
5667 if (*s == '.' || *s == '}') {
5669 for (t = s+1; *t == ' ' || *t == '\t'; t++) ;
5673 if (in_eval && !rsfp) {
5674 eol = strchr(s,'\n');
5679 eol = bufend = SvPVX(linestr) + SvCUR(linestr);
5681 for (t = s; t < eol; t++) {
5682 if (*t == '~' && t[1] == '~' && SvCUR(stuff)) {
5684 goto enough; /* ~~ must be first line in formline */
5686 if (*t == '@' || *t == '^')
5689 sv_catpvn(stuff, s, eol-s);
5693 s = filter_gets(linestr, rsfp, 0);
5694 oldoldbufptr = oldbufptr = bufptr = linestart = SvPVX(linestr);
5695 bufend = bufptr + SvCUR(linestr);
5698 yyerror("Format not terminated");
5708 lex_state = LEX_NORMAL;
5709 nextval[nexttoke].ival = 0;
5713 lex_state = LEX_FORMLINE;
5714 nextval[nexttoke].opval = (OP*)newSVOP(OP_CONST, 0, stuff);
5716 nextval[nexttoke].ival = OP_FORMLINE;
5720 SvREFCNT_dec(stuff);
5732 cshlen = strlen(cshname);
5737 start_subparse(I32 is_format, U32 flags)
5740 I32 oldsavestack_ix = savestack_ix;
5741 CV* outsidecv = compcv;
5745 assert(SvTYPE(compcv) == SVt_PVCV);
5752 SAVESPTR(comppad_name);
5754 SAVEI32(comppad_name_fill);
5755 SAVEI32(min_intro_pending);
5756 SAVEI32(max_intro_pending);
5757 SAVEI32(pad_reset_pending);
5759 compcv = (CV*)NEWSV(1104,0);
5760 sv_upgrade((SV *)compcv, is_format ? SVt_PVFM : SVt_PVCV);
5761 CvFLAGS(compcv) |= flags;
5764 av_push(comppad, Nullsv);
5765 curpad = AvARRAY(comppad);
5766 comppad_name = newAV();
5767 comppad_name_fill = 0;
5768 min_intro_pending = 0;
5770 subline = curcop->cop_line;
5772 av_store(comppad_name, 0, newSVpv("@_", 2));
5773 curpad[0] = (SV*)newAV();
5774 SvPADMY_on(curpad[0]); /* XXX Needed? */
5775 CvOWNER(compcv) = 0;
5776 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5777 MUTEX_INIT(CvMUTEXP(compcv));
5778 #endif /* USE_THREADS */
5780 comppadlist = newAV();
5781 AvREAL_off(comppadlist);
5782 av_store(comppadlist, 0, (SV*)comppad_name);
5783 av_store(comppadlist, 1, (SV*)comppad);
5785 CvPADLIST(compcv) = comppadlist;
5786 CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(outsidecv);
5788 CvOWNER(compcv) = 0;
5789 New(666, CvMUTEXP(compcv), 1, perl_mutex);
5790 MUTEX_INIT(CvMUTEXP(compcv));
5791 #endif /* USE_THREADS */
5793 return oldsavestack_ix;
5812 char *context = NULL;
5816 if (!yychar || (yychar == ';' && !rsfp))
5818 else if (bufptr > oldoldbufptr && bufptr - oldoldbufptr < 200 &&
5819 oldoldbufptr != oldbufptr && oldbufptr != bufptr) {
5820 while (isSPACE(*oldoldbufptr))
5822 context = oldoldbufptr;
5823 contlen = bufptr - oldoldbufptr;
5825 else if (bufptr > oldbufptr && bufptr - oldbufptr < 200 &&
5826 oldbufptr != bufptr) {
5827 while (isSPACE(*oldbufptr))
5829 context = oldbufptr;
5830 contlen = bufptr - oldbufptr;
5832 else if (yychar > 255)
5833 where = "next token ???";
5834 else if ((yychar & 127) == 127) {
5835 if (lex_state == LEX_NORMAL ||
5836 (lex_state == LEX_KNOWNEXT && lex_defer == LEX_NORMAL))
5837 where = "at end of line";
5839 where = "within pattern";
5841 where = "within string";
5844 SV *where_sv = sv_2mortal(newSVpv("next char ", 0));
5846 sv_catpvf(where_sv, "^%c", toCTRL(yychar));
5847 else if (isPRINT_LC(yychar))
5848 sv_catpvf(where_sv, "%c", yychar);
5850 sv_catpvf(where_sv, "\\%03o", yychar & 255);
5851 where = SvPVX(where_sv);
5853 msg = sv_2mortal(newSVpv(s, 0));
5854 sv_catpvf(msg, " at %_ line %ld, ",
5855 GvSV(curcop->cop_filegv), (long)curcop->cop_line);
5857 sv_catpvf(msg, "near \"%.*s\"\n", contlen, context);
5859 sv_catpvf(msg, "%s\n", where);
5860 if (multi_start < multi_end && (U32)(curcop->cop_line - multi_end) <= 1) {
5862 " (Might be a runaway multi-line %c%c string starting on line %ld)\n",
5863 (int)multi_open,(int)multi_close,(long)multi_start);
5869 sv_catsv(ERRSV, msg);
5871 PerlIO_write(PerlIO_stderr(), SvPVX(msg), SvCUR(msg));
5872 if (++error_count >= 10)
5873 croak("%_ has too many errors.\n", GvSV(curcop->cop_filegv));
5875 in_my_stash = Nullhv;