|
|
1.1 ! root 1: static char sccsid[] = "@(#)apply.c 4.2 (Berkeley) 2/9/83"; ! 2: ! 3: /*%cc -s -O % ! 4: * apply - apply a command to a set of arguments ! 5: * ! 6: * apply echo * == ls ! 7: * apply -2 cmp A1 B1 A2 B2 compares A's with B's ! 8: * apply "ln %1 /usr/fred/dir" * duplicates a directory ! 9: */ ! 10: #include <stdio.h> ! 11: char *cmdp; ! 12: #define NCHARS 512 ! 13: char cmd[512]; ! 14: char defargs=1; ! 15: #define DEFARGCHAR '%' ! 16: char argchar=DEFARGCHAR; ! 17: int nchars; ! 18: extern char *getenv(); ! 19: ! 20: main(argc, argv) ! 21: char *argv[]; ! 22: { ! 23: register n; ! 24: while(argc>2 && argv[1][0]=='-'){ ! 25: if(argv[1][1]=='a'){ ! 26: argchar=argv[1][2]; ! 27: if(argchar=='\0') ! 28: argchar=DEFARGCHAR; ! 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: char *shell = getenv("SHELL"); ! 112: ! 113: if ((pid = fork()) == 0) { ! 114: execl(shell ? shell : "/bin/sh", "sh", "-c", s, 0); ! 115: _exit(127); ! 116: } ! 117: if(pid == -1){ ! 118: fprintf(stderr, "apply: can't fork\n"); ! 119: exit(1); ! 120: } ! 121: while ((w = wait(&status)) != pid && w != -1) ! 122: ; ! 123: if (w == -1) ! 124: status = -1; ! 125: return(status); ! 126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.