date and time created 83/09/02 12:57:42 by edward
[unix-history] / usr / src / usr.bin / apply / apply.c
CommitLineData
fcf77ac5 1static char sccsid[] = "@(#)apply.c 4.2 (Berkeley) %G%";
8123553b
KM
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>
11char *cmdp;
12#define NCHARS 512
13char cmd[512];
14char defargs=1;
15#define DEFARGCHAR '%'
16char argchar=DEFARGCHAR;
17int nchars;
fcf77ac5
SL
18extern char *getenv();
19
8123553b
KM
20main(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}
48char
49addc(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}
58char *
59addarg(s, t)
60 register char *s, *t;
61{
62 while(*t = addc(*s++))
63 *t++;
64 return(t);
65}
66docmd(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}
107system(s)
108char *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}