📄 toke.c
字号:
case ']': tmp = *s++; TERM(tmp); case '}': *s |= 128; RETURN(';'); case '&': s++; tmp = *s++; if (tmp == '&') OPERATOR(ANDAND); s--; if (expectterm) { d = bufend; while (s < d && isSPACE(*s)) s++; if (isALPHA(*s) || *s == '_' || *s == '\'') *(--s) = '\\'; /* force next ident to WORD */ else check_uni(); OPERATOR(AMPER); } OPERATOR('&'); case '|': s++; tmp = *s++; if (tmp == '|') OPERATOR(OROR); s--; OPERATOR('|'); case '=': s++; tmp = *s++; if (tmp == '=') EOP(O_EQ); if (tmp == '~') OPERATOR(MATCH); s--; OPERATOR('='); case '!': s++; tmp = *s++; if (tmp == '=') EOP(O_NE); if (tmp == '~') OPERATOR(NMATCH); s--; OPERATOR('!'); case '<': if (expectterm) { if (s[1] != '<' && !index(s,'>')) check_uni(); s = scanstr(s, SCAN_DEF); TERM(RSTRING); } s++; tmp = *s++; if (tmp == '<') OPERATOR(LS); if (tmp == '=') { tmp = *s++; if (tmp == '>') EOP(O_NCMP); s--; ROP(O_LE); } s--; ROP(O_LT); case '>': s++; tmp = *s++; if (tmp == '>') OPERATOR(RS); if (tmp == '=') ROP(O_GE); s--; ROP(O_GT);#define SNARFWORD \ d = tokenbuf; \ while (isALNUM(*s) || *s == '\'') \ *d++ = *s++; \ while (d[-1] == '\'') \ d--,s--; \ *d = '\0'; \ d = tokenbuf; case '$': if (s[1] == '#' && (isALPHA(s[2]) || s[2] == '_')) { s++; s = scanident(s,bufend,tokenbuf); yylval.stabval = aadd(stabent(tokenbuf,TRUE)); TERM(ARYLEN); } d = s; s = scanident(s,bufend,tokenbuf); if (reparse) { /* turn ${foo[bar]} into ($foo[bar]) */ do_reparse: s[-1] = ')'; s = d; s[1] = s[0]; s[0] = '('; goto retry; } yylval.stabval = stabent(tokenbuf,TRUE); expectterm = FALSE; if (isSPACE(*s) && oldoldbufptr && oldoldbufptr < bufptr) { s++; while (isSPACE(*oldoldbufptr)) oldoldbufptr++; if (*oldoldbufptr == 'p' && strnEQ(oldoldbufptr,"print",5)) { if (index("&*<%", *s) && isALPHA(s[1])) expectterm = TRUE; /* e.g. print $fh &sub */ else if (*s == '.' && isDIGIT(s[1])) expectterm = TRUE; /* e.g. print $fh .3 */ else if (index("/?-+", *s) && !isSPACE(s[1])) expectterm = TRUE; /* e.g. print $fh -1 */ } } RETURN(REG); case '@': d = s; s = scanident(s,bufend,tokenbuf); if (reparse) goto do_reparse; yylval.stabval = aadd(stabent(tokenbuf,TRUE)); TERM(ARY); case '/': /* may either be division or pattern */ case '?': /* may either be conditional or pattern */ if (expectterm) { check_uni(); s = scanpat(s); TERM(PATTERN); } tmp = *s++; if (tmp == '/') MOP(O_DIVIDE); OPERATOR(tmp); case '.': if (!expectterm || !isDIGIT(s[1])) { tmp = *s++; if (*s == tmp) { s++; if (*s == tmp) { s++; yylval.ival = 0; } else yylval.ival = AF_COMMON; OPERATOR(DOTDOT); } if (expectterm) check_uni(); AOP(O_CONCAT); } /* FALL THROUGH */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '\'': case '"': case '`': s = scanstr(s, SCAN_DEF); TERM(RSTRING); case '\\': /* some magic to force next word to be a WORD */ s++; /* used by do and sub to force a separate namespace */ if (!isALPHA(*s) && *s != '_' && *s != '\'') { warn("Spurious backslash ignored"); goto retry; } /* FALL THROUGH */ case '_': SNARFWORD; if (d[1] == '_') { if (strEQ(d,"__LINE__") || strEQ(d,"__FILE__")) { ARG *arg = op_new(1); yylval.arg = arg; arg->arg_type = O_ITEM; if (d[2] == 'L') (void)sprintf(tokenbuf,"%ld",(long)curcmd->c_line); else strcpy(tokenbuf, stab_val(curcmd->c_filestab)->str_ptr); arg[1].arg_type = A_SINGLE; arg[1].arg_ptr.arg_str = str_make(tokenbuf,strlen(tokenbuf)); TERM(RSTRING); } else if (strEQ(d,"__END__")) { STAB *stab; int fd; /*SUPPRESS 560*/ if (!in_eval && (stab = stabent("DATA",FALSE))) { stab->str_pok |= SP_MULTI; if (!stab_io(stab)) stab_io(stab) = stio_new(); stab_io(stab)->ifp = rsfp;#if defined(HAS_FCNTL) && defined(F_SETFD) fd = fileno(rsfp); fcntl(fd,F_SETFD,fd >= 3);#endif if (preprocess) stab_io(stab)->type = '|'; else if ((FILE*)rsfp == stdin) stab_io(stab)->type = '-'; else stab_io(stab)->type = '<'; rsfp = Nullfp; } goto fake_eof; } } break; case 'a': case 'A': SNARFWORD; if (strEQ(d,"alarm")) UNI(O_ALARM); if (strEQ(d,"accept")) FOP22(O_ACCEPT); if (strEQ(d,"atan2")) FUN2(O_ATAN2); break; case 'b': case 'B': SNARFWORD; if (strEQ(d,"bind")) FOP2(O_BIND); if (strEQ(d,"binmode")) FOP(O_BINMODE); break; case 'c': case 'C': SNARFWORD; if (strEQ(d,"chop")) LFUN(O_CHOP); if (strEQ(d,"continue")) OPERATOR(CONTINUE); if (strEQ(d,"chdir")) { (void)stabent("ENV",TRUE); /* may use HOME */ UNI(O_CHDIR); } if (strEQ(d,"close")) FOP(O_CLOSE); if (strEQ(d,"closedir")) FOP(O_CLOSEDIR); if (strEQ(d,"cmp")) EOP(O_SCMP); if (strEQ(d,"caller")) UNI(O_CALLER); if (strEQ(d,"crypt")) {#ifdef FCRYPT static int cryptseen = 0; if (!cryptseen++) init_des();#endif FUN2(O_CRYPT); } if (strEQ(d,"chmod")) LOP(O_CHMOD); if (strEQ(d,"chown")) LOP(O_CHOWN); if (strEQ(d,"connect")) FOP2(O_CONNECT); if (strEQ(d,"cos")) UNI(O_COS); if (strEQ(d,"chroot")) UNI(O_CHROOT); break; case 'd': case 'D': SNARFWORD; if (strEQ(d,"do")) { d = bufend; while (s < d && isSPACE(*s)) s++; if (isALPHA(*s) || *s == '_') *(--s) = '\\'; /* force next ident to WORD */ OPERATOR(DO); } if (strEQ(d,"die")) LOP(O_DIE); if (strEQ(d,"defined")) LFUN(O_DEFINED); if (strEQ(d,"delete")) OPERATOR(DELETE); if (strEQ(d,"dbmopen")) HFUN3(O_DBMOPEN); if (strEQ(d,"dbmclose")) HFUN(O_DBMCLOSE); if (strEQ(d,"dump")) LOOPX(O_DUMP); break; case 'e': case 'E': SNARFWORD; if (strEQ(d,"else")) OPERATOR(ELSE); if (strEQ(d,"elsif")) { yylval.ival = curcmd->c_line; OPERATOR(ELSIF); } if (strEQ(d,"eq") || strEQ(d,"EQ")) EOP(O_SEQ); if (strEQ(d,"exit")) UNI(O_EXIT); if (strEQ(d,"eval")) { allstabs = TRUE; /* must initialize everything since */ UNI(O_EVAL); /* we don't know what will be used */ } if (strEQ(d,"eof")) FOP(O_EOF); if (strEQ(d,"exp")) UNI(O_EXP); if (strEQ(d,"each")) HFUN(O_EACH); if (strEQ(d,"exec")) { set_csh(); LOP(O_EXEC_OP); } if (strEQ(d,"endhostent")) FUN0(O_EHOSTENT); if (strEQ(d,"endnetent")) FUN0(O_ENETENT); if (strEQ(d,"endservent")) FUN0(O_ESERVENT); if (strEQ(d,"endprotoent")) FUN0(O_EPROTOENT); if (strEQ(d,"endpwent")) FUN0(O_EPWENT); if (strEQ(d,"endgrent")) FUN0(O_EGRENT); break; case 'f': case 'F': SNARFWORD; if (strEQ(d,"for") || strEQ(d,"foreach")) { yylval.ival = curcmd->c_line; while (s < bufend && isSPACE(*s)) s++; if (isALPHA(*s)) fatal("Missing $ on loop variable"); OPERATOR(FOR); } if (strEQ(d,"format")) { d = bufend; while (s < d && isSPACE(*s)) s++; if (isALPHA(*s) || *s == '_') *(--s) = '\\'; /* force next ident to WORD */ in_format = TRUE; allstabs = TRUE; /* must initialize everything since */ OPERATOR(FORMAT); /* we don't know what will be used */ } if (strEQ(d,"fork")) FUN0(O_FORK); if (strEQ(d,"fcntl")) FOP3(O_FCNTL); if (strEQ(d,"fileno")) FOP(O_FILENO); if (strEQ(d,"flock")) FOP2(O_FLOCK); break; case 'g': case 'G': SNARFWORD; if (strEQ(d,"gt") || strEQ(d,"GT")) ROP(O_SGT); if (strEQ(d,"ge") || strEQ(d,"GE")) ROP(O_SGE); if (strEQ(d,"grep")) FL2(O_GREP); if (strEQ(d,"goto")) LOOPX(O_GOTO); if (strEQ(d,"gmtime")) UNI(O_GMTIME); if (strEQ(d,"getc")) FOP(O_GETC); if (strnEQ(d,"get",3)) { d += 3; if (*d == 'p') { if (strEQ(d,"ppid")) FUN0(O_GETPPID); if (strEQ(d,"pgrp")) UNI(O_GETPGRP); if (strEQ(d,"priority")) FUN2(O_GETPRIORITY); if (strEQ(d,"protobyname")) UNI(O_GPBYNAME); if (strEQ(d,"protobynumber")) FUN1(O_GPBYNUMBER); if (strEQ(d,"protoent")) FUN0(O_GPROTOENT); if (strEQ(d,"pwent")) FUN0(O_GPWENT); if (strEQ(d,"pwnam")) FUN1(O_GPWNAM); if (strEQ(d,"pwuid")) FUN1(O_GPWUID); if (strEQ(d,"peername")) FOP(O_GETPEERNAME); } else if (*d == 'h') { if (strEQ(d,"hostbyname")) UNI(O_GHBYNAME); if (strEQ(d,"hostbyaddr")) FUN2(O_GHBYADDR); if (strEQ(d,"hostent")) FUN0(O_GHOSTENT); } else if (*d == 'n') { if (strEQ(d,"netbyname")) UNI(O_GNBYNAME); if (strEQ(d,"netbyaddr")) FUN2(O_GNBYADDR); if (strEQ(d,"netent")) FUN0(O_GNETENT); } else if (*d == 's') { if (strEQ(d,"servbyname")) FUN2(O_GSBYNAME); if (strEQ(d,"servbyport")) FUN2(O_GSBYPORT); if (strEQ(d,"servent")) FUN0(O_GSERVENT); if (strEQ(d,"sockname")) FOP(O_GETSOCKNAME); if (strEQ(d,"sockopt")) FOP3(O_GSOCKOPT); } else if (*d == 'g') { if (strEQ(d,"grent")) FUN0(O_GGRENT); if (strEQ(d,"grnam")) FUN1(O_GGRNAM); if (strEQ(d,"grgid")) FUN1(O_GGRGID); } else if (*d == 'l') { if (strEQ(d,"login")) FUN0(O_GETLOGIN); } d -= 3; } break; case 'h': case 'H': SNARFWORD; if (strEQ(d,"hex")) UNI(O_HEX); break; case 'i': case 'I': SNARFWORD; if (strEQ(d,"if")) { yylval.ival = curcmd->c_line; OPERATOR(IF); } if (strEQ(d,"index")) FUN2x(O_INDEX); if (strEQ(d,"int")) UNI(O_INT); if (strEQ(d,"ioctl")) FOP3(O_IOCTL); break; case 'j': case 'J': SNARFWORD; if (strEQ(d,"join")) FL2(O_JOIN); break; case 'k': case 'K': SNARFWORD; if (strEQ(d,"keys")) HFUN(O_KEYS); if (strEQ(d,"kill")) LOP(O_KILL); break; case 'l': case 'L': SNARFWORD; if (strEQ(d,"last")) LOOPX(O_LAST); if (strEQ(d,"local")) OPERATOR(LOCAL); if (strEQ(d,"length")) UNI(O_LENGTH); if (strEQ(d,"lt") || strEQ(d,"LT")) ROP(O_SLT); if (strEQ(d,"le") || strEQ(d,"LE")) ROP(O_SLE); if (strEQ(d,"localtime")) UNI(O_LOCALTIME); if (strEQ(d,"log")) UNI(O_LOG); if (strEQ(d,"link")) FUN2(O_LINK); if (strEQ(d,"listen")) FOP2(O_LISTEN); if (strEQ(d,"lstat")) FOP(O_LSTAT); break; case 'm': case 'M': if (s[1] == '\'') { d = "m"; s++; } else { SNARFWORD; } if (strEQ(d,"m")) { s = scanpat(s-1); if (yylval.arg) TERM(PATTERN); else RETURN(1); /* force error */ } switch (d[1]) { case 'k': if (strEQ(d,"mkdir")) FUN2(O_MKDIR); break; case 's': if (strEQ(d,"msgctl")) FUN3(O_MSGCTL); if (strEQ(d,"msgget")) FUN2(O_MSGGET); if (strEQ(d,"msgrcv")) FUN5(O_MSGRCV); if (strEQ(d,"msgsnd")) FUN3(O_MSGSND); break; } break; case 'n': case 'N': SNARFWORD; if (strEQ(d,"next")) LOOPX(O_NEXT); if (strEQ(d,"ne") || strEQ(d,"NE")) EOP(O_SNE); break; case 'o': case 'O': SNARFWORD; if (strEQ(d,"open")) OPERATOR(OPEN); if (strEQ(d,"ord")) UNI(O_ORD); if (strEQ(d,"oct")) UNI(O_OCT); if (strEQ(d,"opendir")) FOP2(O_OPEN_DIR); break; case 'p': case 'P': SNARFWORD; if (strEQ(d,"print")) { checkcomma(s,d,"filehandle"); LOP(O_PRINT); } if (strEQ(d,"printf")) { checkcomma(s,d,"filehandle"); LOP(O_PRTF); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -