|
|
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.