📄 toke.c
字号:
if (strEQ(d,"push")) { yylval.ival = O_PUSH; OPERATOR(PUSH); } if (strEQ(d,"pop")) OPERATOR(POP); if (strEQ(d,"pack")) FL2(O_PACK); if (strEQ(d,"package")) OPERATOR(PACKAGE); if (strEQ(d,"pipe")) FOP22(O_PIPE_OP); break; case 'q': case 'Q': SNARFWORD; if (strEQ(d,"q")) { s = scanstr(s-1, SCAN_DEF); TERM(RSTRING); } if (strEQ(d,"qq")) { s = scanstr(s-2, SCAN_DEF); TERM(RSTRING); } if (strEQ(d,"qx")) { s = scanstr(s-2, SCAN_DEF); TERM(RSTRING); } break; case 'r': case 'R': SNARFWORD; if (strEQ(d,"return")) OLDLOP(O_RETURN); if (strEQ(d,"require")) { allstabs = TRUE; /* must initialize everything since */ UNI(O_REQUIRE); /* we don't know what will be used */ } if (strEQ(d,"reset")) UNI(O_RESET); if (strEQ(d,"redo")) LOOPX(O_REDO); if (strEQ(d,"rename")) FUN2(O_RENAME); if (strEQ(d,"rand")) UNI(O_RAND); if (strEQ(d,"rmdir")) UNI(O_RMDIR); if (strEQ(d,"rindex")) FUN2x(O_RINDEX); if (strEQ(d,"read")) FOP3(O_READ); if (strEQ(d,"readdir")) FOP(O_READDIR); if (strEQ(d,"rewinddir")) FOP(O_REWINDDIR); if (strEQ(d,"recv")) FOP4(O_RECV); if (strEQ(d,"reverse")) LOP(O_REVERSE); if (strEQ(d,"readlink")) UNI(O_READLINK); break; case 's': case 'S': if (s[1] == '\'') { d = "s"; s++; } else { SNARFWORD; } if (strEQ(d,"s")) { s = scansubst(s); if (yylval.arg) TERM(SUBST); else RETURN(1); /* force error */ } switch (d[1]) { case 'a': case 'b': break; case 'c': if (strEQ(d,"scalar")) UNI(O_SCALAR); break; case 'd': break; case 'e': if (strEQ(d,"select")) OPERATOR(SSELECT); if (strEQ(d,"seek")) FOP3(O_SEEK); if (strEQ(d,"semctl")) FUN4(O_SEMCTL); if (strEQ(d,"semget")) FUN3(O_SEMGET); if (strEQ(d,"semop")) FUN2(O_SEMOP); if (strEQ(d,"send")) FOP3(O_SEND); if (strEQ(d,"setpgrp")) FUN2(O_SETPGRP); if (strEQ(d,"setpriority")) FUN3(O_SETPRIORITY); if (strEQ(d,"sethostent")) FUN1(O_SHOSTENT); if (strEQ(d,"setnetent")) FUN1(O_SNETENT); if (strEQ(d,"setservent")) FUN1(O_SSERVENT); if (strEQ(d,"setprotoent")) FUN1(O_SPROTOENT); if (strEQ(d,"setpwent")) FUN0(O_SPWENT); if (strEQ(d,"setgrent")) FUN0(O_SGRENT); if (strEQ(d,"seekdir")) FOP2(O_SEEKDIR); if (strEQ(d,"setsockopt")) FOP4(O_SSOCKOPT); break; case 'f': case 'g': break; case 'h': if (strEQ(d,"shift")) TERM(SHIFT); if (strEQ(d,"shmctl")) FUN3(O_SHMCTL); if (strEQ(d,"shmget")) FUN3(O_SHMGET); if (strEQ(d,"shmread")) FUN4(O_SHMREAD); if (strEQ(d,"shmwrite")) FUN4(O_SHMWRITE); if (strEQ(d,"shutdown")) FOP2(O_SHUTDOWN); break; case 'i': if (strEQ(d,"sin")) UNI(O_SIN); break; case 'j': case 'k': break; case 'l': if (strEQ(d,"sleep")) UNI(O_SLEEP); break; case 'm': case 'n': break; case 'o': if (strEQ(d,"socket")) FOP4(O_SOCKET); if (strEQ(d,"socketpair")) FOP25(O_SOCKPAIR); if (strEQ(d,"sort")) { checkcomma(s,d,"subroutine name"); d = bufend; while (s < d && isSPACE(*s)) s++; if (*s == ';' || *s == ')') /* probably a close */ fatal("sort is now a reserved word"); if (isALPHA(*s) || *s == '_') { /*SUPPRESS 530*/ for (d = s; isALNUM(*d); d++) ; strncpy(tokenbuf,s,d-s); tokenbuf[d-s] = '\0'; if (strNE(tokenbuf,"keys") && strNE(tokenbuf,"values") && strNE(tokenbuf,"split") && strNE(tokenbuf,"grep") && strNE(tokenbuf,"readdir") && strNE(tokenbuf,"unpack") && strNE(tokenbuf,"do") && strNE(tokenbuf,"eval") && (d >= bufend || isSPACE(*d)) ) *(--s) = '\\'; /* force next ident to WORD */ } LOP(O_SORT); } break; case 'p': if (strEQ(d,"split")) TERM(SPLIT); if (strEQ(d,"sprintf")) FL(O_SPRINTF); if (strEQ(d,"splice")) { yylval.ival = O_SPLICE; OPERATOR(PUSH); } break; case 'q': if (strEQ(d,"sqrt")) UNI(O_SQRT); break; case 'r': if (strEQ(d,"srand")) UNI(O_SRAND); break; case 's': break; case 't': if (strEQ(d,"stat")) FOP(O_STAT); if (strEQ(d,"study")) { sawstudy++; LFUN(O_STUDY); } break; case 'u': if (strEQ(d,"substr")) FUN2x(O_SUBSTR); if (strEQ(d,"sub")) { yylval.ival = savestack->ary_fill; /* restore stuff on reduce */ savelong(&subline); saveitem(subname); subline = curcmd->c_line; d = bufend; while (s < d && isSPACE(*s)) s++; if (isALPHA(*s) || *s == '_' || *s == '\'') { str_sset(subname,curstname); str_ncat(subname,"'",1); for (d = s+1; isALNUM(*d) || *d == '\''; d++) /*SUPPRESS 530*/ ; if (d[-1] == '\'') d--; str_ncat(subname,s,d-s); *(--s) = '\\'; /* force next ident to WORD */ } else str_set(subname,"?"); OPERATOR(SUB); } break; case 'v': case 'w': case 'x': break; case 'y': if (strEQ(d,"system")) { set_csh(); LOP(O_SYSTEM); } if (strEQ(d,"symlink")) FUN2(O_SYMLINK); if (strEQ(d,"syscall")) LOP(O_SYSCALL); if (strEQ(d,"sysread")) FOP3(O_SYSREAD); if (strEQ(d,"syswrite")) FOP3(O_SYSWRITE); break; case 'z': break; } break; case 't': case 'T': SNARFWORD; if (strEQ(d,"tr")) { s = scantrans(s); if (yylval.arg) TERM(TRANS); else RETURN(1); /* force error */ } if (strEQ(d,"tell")) FOP(O_TELL); if (strEQ(d,"telldir")) FOP(O_TELLDIR); if (strEQ(d,"time")) FUN0(O_TIME); if (strEQ(d,"times")) FUN0(O_TMS); if (strEQ(d,"truncate")) FOP2(O_TRUNCATE); break; case 'u': case 'U': SNARFWORD; if (strEQ(d,"using")) OPERATOR(USING); if (strEQ(d,"until")) { yylval.ival = curcmd->c_line; OPERATOR(UNTIL); } if (strEQ(d,"unless")) { yylval.ival = curcmd->c_line; OPERATOR(UNLESS); } if (strEQ(d,"unlink")) LOP(O_UNLINK); if (strEQ(d,"undef")) LFUN(O_UNDEF); if (strEQ(d,"unpack")) FUN2(O_UNPACK); if (strEQ(d,"utime")) LOP(O_UTIME); if (strEQ(d,"umask")) UNI(O_UMASK); if (strEQ(d,"unshift")) { yylval.ival = O_UNSHIFT; OPERATOR(PUSH); } break; case 'v': case 'V': SNARFWORD; if (strEQ(d,"values")) HFUN(O_VALUES); if (strEQ(d,"vec")) { sawvec = TRUE; FUN3(O_VEC); } break; case 'w': case 'W': SNARFWORD; if (strEQ(d,"while")) { yylval.ival = curcmd->c_line; OPERATOR(WHILE); } if (strEQ(d,"warn")) LOP(O_WARN); if (strEQ(d,"wait")) FUN0(O_WAIT); if (strEQ(d,"waitpid")) FUN2(O_WAITPID); if (strEQ(d,"wantarray")) { yylval.arg = op_new(1); yylval.arg->arg_type = O_ITEM; yylval.arg[1].arg_type = A_WANTARRAY; TERM(RSTRING); } if (strEQ(d,"write")) FOP(O_WRITE); break; case 'x': case 'X': if (*s == 'x' && isDIGIT(s[1]) && !expectterm) { s++; MOP(O_REPEAT); } SNARFWORD; if (strEQ(d,"x")) { if (!expectterm) MOP(O_REPEAT); check_uni(); } break; case 'y': case 'Y': if (s[1] == '\'') { d = "y"; s++; } else { SNARFWORD; } if (strEQ(d,"y")) { s = scantrans(s); TERM(TRANS); } break; case 'z': case 'Z': SNARFWORD; break; } yylval.cval = savestr(d); if (expectterm == 2) { /* special case: start of statement */ while (isSPACE(*s)) s++; if (*s == ':') { s++; CLINE; OPERATOR(LABEL); } TERM(WORD); } expectterm = FALSE; if (oldoldbufptr && oldoldbufptr < bufptr) { while (isSPACE(*oldoldbufptr)) oldoldbufptr++; if (*oldoldbufptr == 'p' && strnEQ(oldoldbufptr,"print",5)) expectterm = TRUE; else if (*oldoldbufptr == 's' && strnEQ(oldoldbufptr,"sort",4)) expectterm = TRUE; } return (CLINE, bufptr = s, (int)WORD);}voidcheckcomma(s,name,what)register char *s;char *name;char *what;{ char *w; if (dowarn && *s == ' ' && s[1] == '(') { w = index(s,')'); if (w) for (w++; *w && isSPACE(*w); w++) ; if (!w || !*w || !index(";|}", *w)) /* an advisory hack only... */ warn("%s (...) interpreted as function",name); } while (s < bufend && isSPACE(*s)) s++; if (*s == '(') s++; while (s < bufend && isSPACE(*s)) s++; if (isALPHA(*s) || *s == '_') { w = s++; while (isALNUM(*s)) s++; while (s < bufend && isSPACE(*s)) s++; if (*s == ',') { *s = '\0'; w = instr( "tell eof times getlogin wait length shift umask getppid \ cos exp int log rand sin sqrt ord wantarray", w); *s = ','; if (w) return; fatal("No comma allowed after %s", what); } }}char *scanident(s,send,dest)register char *s;register char *send;char *dest;{ register char *d; int brackets = 0; reparse = Nullch; s++; d = dest; if (isDIGIT(*s)) { while (isDIGIT(*s)) *d++ = *s++; } else { while (isALNUM(*s) || *s == '\'') *d++ = *s++; } while (d > dest+1 && d[-1] == '\'') d--,s--; *d = '\0'; d = dest; if (!*d) { *d = *s++; if (*d == '{' /* } */ ) { d = dest; brackets++; while (s < send && brackets) { if (!reparse && (d == dest || (*s && isALNUM(*s) ))) { *d++ = *s++; continue; } else if (!reparse) reparse = s; switch (*s++) { /* { */ case '}': brackets--; if (reparse && reparse == s - 1) reparse = Nullch; break; case '{': /* } */ brackets++; break; } } *d = '\0'; d = dest; } else d[1] = '\0'; } if (*d == '^' && (isUPPER(*s) || index("[\\]^_?", *s))) {#ifdef DEBUGGING if (*s == 'D') debug |= 32768;#endif *d = *s++ ^ 64; } return s;}voidscanconst(spat,string,len)SPAT *spat;char *string;int len;{ register STR *tmpstr; register char *t; register char *d; register char *e; char *origstring = string; static char *vert = "|"; if (ninstr(string, string+len, vert, vert+1)) return; if (*string == '^') string++, len--; tmpstr = Str_new(86,len); str_nset(tmpstr,string,len); t = str_get(tmpstr); e = t + len; tmpstr->str_u.str_useful = 100; for (d=t; d < e; ) { switch (*d) { case '{': if (isDIGIT(d[1])) e = d; else goto defchar; break; case '.': case '[': case '$': case '(': case ')': case '|': case '+': case '^': e = d; break; case '\\': if (d[1] && index("wWbB0123456789sSdDlLuUExc",d[1])) { e = d; break; } Move(d+1,d,e-d,char); e--; switch(*d) { case 'n': *d = '\n'; break; case 't': *d = '\t'; break; case 'f': *d = '\f'; break; case 'r': *d = '\r'; break; case 'e': *d = '\033'; break; case 'a': *d = '\007'; break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -