1 static char sccsid[] = "@(#)apply.c 4.2 (Berkeley) 02/09/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 } 127