|
|
1.1 ! root 1: /*%cc -s -O % ! 2: * apply - apply a command to a set of arguments ! 3: * ! 4: * apply echo * == ls ! 5: * apply -2 cmp A1 B1 A2 B2 compares A's with B's ! 6: * apply "ln %1 /usr/fred/dir" * duplicates a directory ! 7: * apply -v ... # print each command first ! 8: */ ! 9: #include <stdio.h> ! 10: char *cmdp; ! 11: #define NCHARS 512 ! 12: char cmd[512]; ! 13: char defargs=1; ! 14: #define DEFARGCHAR '%' ! 15: char argchar=DEFARGCHAR; ! 16: int nchars; ! 17: int vflag; ! 18: main(argc, argv) ! 19: char *argv[]; ! 20: { ! 21: register n; ! 22: while(argc>2 && argv[1][0]=='-'){ ! 23: if(argv[1][1]=='a'){ ! 24: argchar=argv[1][2]; ! 25: if(argchar=='\0') ! 26: argchar=DEFARGCHAR; ! 27: } else if(argv[1][1]=='v') ! 28: vflag++; ! 29: else { ! 30: defargs = atoi(&argv[1][1]); ! 31: if(defargs < 0) ! 32: defargs = 1; ! 33: } ! 34: --argc; ++argv; ! 35: } ! 36: if(argc<2){ ! 37: fprintf(stderr, "usage: apply [-14] [-a%] cmd arglist\n"); ! 38: exit(1); ! 39: } ! 40: argc -= 2; ! 41: cmdp = argv[1]; ! 42: argv += 2; ! 43: while(n=docmd(argc, argv)){ ! 44: argc -= n; ! 45: argv += n; ! 46: } ! 47: } ! 48: char ! 49: addc(c) ! 50: char c; ! 51: { ! 52: if(nchars++>=NCHARS){ ! 53: fprintf(stderr, "apply: command too long\n"); ! 54: exit(1); ! 55: } ! 56: return(c); ! 57: } ! 58: char * ! 59: addarg(s, t) ! 60: register char *s, *t; ! 61: { ! 62: while(*t = addc(*s++)) ! 63: *t++; ! 64: return(t); ! 65: } ! 66: docmd(argc, argv) ! 67: char *argv[]; ! 68: { ! 69: register char *p, *q; ! 70: register max, i; ! 71: char gotit; ! 72: if(argc<=0) ! 73: return(0); ! 74: nchars = 0; ! 75: max = 0; ! 76: gotit = 0; ! 77: p = cmdp; ! 78: q = cmd; ! 79: while(*q = addc(*p++)){ ! 80: if(*q++!=argchar || *p<'1' || '9'<*p) ! 81: continue; ! 82: if((i= *p++-'1') > max) ! 83: max = i; ! 84: if(i>=argc){ ! 85: Toofew: ! 86: fprintf(stderr, "apply: expecting argument(s) after `%s'\n", argv[argc-1]); ! 87: exit(1); ! 88: } ! 89: q = addarg(argv[i], q-1); ! 90: gotit++; ! 91: } ! 92: if(defargs!=0 && gotit==0){ ! 93: if(defargs>argc) ! 94: goto Toofew; ! 95: for(i=0; i<defargs; i++){ ! 96: *q++ = addc(' '); ! 97: q = addarg(argv[i], q); ! 98: } ! 99: } ! 100: i = system(cmd); ! 101: if(i == 127){ ! 102: fprintf(stderr, "apply: no shell!\n"); ! 103: exit(1); ! 104: } ! 105: return(max==0? (defargs==0? 1 : defargs) : max+1); ! 106: } ! 107: system(s) ! 108: char *s; ! 109: { ! 110: int status, pid, w; ! 111: ! 112: if(vflag) ! 113: printf("%s\n", s); ! 114: if ((pid = fork()) == 0) { ! 115: execl("/bin/sh", "sh", "-c", s, 0); ! 116: _exit(127); ! 117: } ! 118: if(pid == -1){ ! 119: fprintf(stderr, "apply: can't fork\n"); ! 120: exit(1); ! 121: } ! 122: while ((w = wait(&status)) != pid && w != -1) ! 123: ; ! 124: if (w == -1) ! 125: status = -1; ! 126: return(status); ! 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.