xref: /original-bsd/usr.bin/apply/apply.c (revision 92d3de31)
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