📄 test.c
字号:
/* * test expression * [ expression ] */#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0))#define DIR 1#define FIL 2int ap;int ac;char **av;char *tmp;main(argc, argv)char *argv[];{ ac = argc; av = argv; ap = 1; if(EQ(argv[0],"[")) { if(!EQ(argv[--ac],"]")) synbad("] missing",""); } argv[ac] = 0; if (ac<=1) exit(1); exit(exp()?0:1);}char *nxtarg(mt) { if (ap>=ac) { if(mt) { ap++; return(0); } synbad("argument expected",""); } return(av[ap++]);}exp() { int p1; p1 = e1(); if (EQ(nxtarg(1), "-o")) return(p1 | exp()); ap--; return(p1);}e1() { int p1; p1 = e2(); if (EQ(nxtarg(1), "-a")) return (p1 & e1()); ap--; return(p1);}e2() { if (EQ(nxtarg(0), "!")) return(!e3()); ap--; return(e3());}e3() { int p1; register char *a; char *p2; int int1, int2; a=nxtarg(0); if(EQ(a, "(")) { p1 = exp(); if(!EQ(nxtarg(0), ")")) synbad(") expected",""); return(p1); } if(EQ(a, "-r")) return(tio(nxtarg(0), 0)); if(EQ(a, "-w")) return(tio(nxtarg(0), 1)); if(EQ(a, "-d")) return(ftype(nxtarg(0))==DIR); if(EQ(a, "-f")) return(ftype(nxtarg(0))==FIL); if(EQ(a, "-s")) return(fsizep(nxtarg(0))); if(EQ(a, "-t")) if(ap>=ac) return(isatty(1)); else return(isatty(atoi(nxtarg(0)))); if(EQ(a, "-n")) return(!EQ(nxtarg(0), "")); if(EQ(a, "-z")) return(EQ(nxtarg(0), "")); p2 = nxtarg(1); if (p2==0) return(!EQ(a,"")); if(EQ(p2, "=")) return(EQ(nxtarg(0), a)); if(EQ(p2, "!=")) return(!EQ(nxtarg(0), a)); if(EQ(a, "-l")) { int1=length(p2); p2=nxtarg(0); } else{ int1=atoi(a); } int2 = atoi(nxtarg(0)); if(EQ(p2, "-eq")) return(int1==int2); if(EQ(p2, "-ne")) return(int1!=int2); if(EQ(p2, "-gt")) return(int1>int2); if(EQ(p2, "-lt")) return(int1<int2); if(EQ(p2, "-ge")) return(int1>=int2); if(EQ(p2, "-le")) return(int1<=int2); synbad("unknown operator ",p2);}tio(a, f)char *a;int f;{ f = open(a, f); if (f>=0) { close(f); return(1); } return(0);}ftype(f)char *f;{ struct stat statb; if(stat(f,&statb)<0) return(0); if((statb.st_mode&S_IFMT)==S_IFDIR) return(DIR); return(FIL);}fsizep(f)char *f;{ struct stat statb; if(stat(f,&statb)<0) return(0); return(statb.st_size>0);}synbad(s1,s2)char *s1, *s2;{ write(2, "test: ", 6); write(2, s1, strlen(s1)); write(2, s2, strlen(s2)); write(2, "\n", 1); exit(255);}length(s) char *s;{ char *es=s; while(*es++); return(es-s-1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -