|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)apply.c 5.3 (Berkeley) 5/11/89";
15: #endif not lint
16:
17: /*%cc -s -O %
18: * apply - apply a command to a set of arguments
19: *
20: * apply echo * == ls
21: * apply -2 cmp A1 B1 A2 B2 compares A's with B's
22: * apply "ln %1 /usr/fred/dir" * duplicates a directory
23: */
24: #include <paths.h>
25: #include <stdio.h>
26:
27: char *cmdp;
28: #define NCHARS 512
29: char cmd[512];
30: char defargs=1;
31: #define DEFARGCHAR '%'
32: char argchar=DEFARGCHAR;
33: int nchars;
34: extern char *getenv();
35:
36: main(argc, argv)
37: char *argv[];
38: {
39: register n;
40: while(argc>2 && argv[1][0]=='-'){
41: if(argv[1][1]=='a'){
42: argchar=argv[1][2];
43: if(argchar=='\0')
44: argchar=DEFARGCHAR;
45: } else {
46: defargs = atoi(&argv[1][1]);
47: if(defargs < 0)
48: defargs = 1;
49: }
50: --argc; ++argv;
51: }
52: if(argc<2){
53: fprintf(stderr, "usage: apply [-#] [-ac] cmd arglist\n");
54: exit(1);
55: }
56: argc -= 2;
57: cmdp = argv[1];
58: argv += 2;
59: while(n=docmd(argc, argv)){
60: argc -= n;
61: argv += n;
62: }
63: }
64: char
65: addc(c)
66: char c;
67: {
68: if(nchars++>=NCHARS){
69: fprintf(stderr, "apply: command too long\n");
70: exit(1);
71: }
72: return(c);
73: }
74: char *
75: addarg(s, t)
76: register char *s, *t;
77: {
78: while(*t = addc(*s++))
79: *t++;
80: return(t);
81: }
82: docmd(argc, argv)
83: char *argv[];
84: {
85: register char *p, *q;
86: register max, i;
87: char gotit;
88: if(argc<=0)
89: return(0);
90: nchars = 0;
91: max = 0;
92: gotit = 0;
93: p = cmdp;
94: q = cmd;
95: while(*q = addc(*p++)){
96: if(*q++!=argchar || *p<'1' || '9'<*p)
97: continue;
98: if((i= *p++-'1') > max)
99: max = i;
100: if(i>=argc){
101: Toofew:
102: fprintf(stderr, "apply: expecting argument(s) after `%s'\n", argv[argc-1]);
103: exit(1);
104: }
105: q = addarg(argv[i], q-1);
106: gotit++;
107: }
108: if(defargs!=0 && gotit==0){
109: if(defargs>argc)
110: goto Toofew;
111: for(i=0; i<defargs; i++){
112: *q++ = addc(' ');
113: q = addarg(argv[i], q);
114: }
115: }
116: i = system(cmd);
117: if(i == 127){
118: fprintf(stderr, "apply: no shell!\n");
119: exit(1);
120: }
121: return(max==0? (defargs==0? 1 : defargs) : max+1);
122: }
123: system(s)
124: char *s;
125: {
126: int status, pid, w;
127: char *shell = getenv("SHELL");
128:
129: if ((pid = fork()) == 0) {
130: execl(shell ? shell : _PATH_BSHELL, "sh", "-c", s, 0);
131: _exit(127);
132: }
133: if(pid == -1){
134: fprintf(stderr, "apply: can't fork\n");
135: exit(1);
136: }
137: while ((w = wait(&status)) != pid && w != -1)
138: ;
139: if (w == -1)
140: status = -1;
141: return(status);
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.