/
xargs.c
64 lines (54 loc) · 1.1 KB
/
xargs.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <utf.h>
#include <errno.h>
#include "util.h"
int main (int argc, char *argu[]) {
int n;
#include "argPrae.c"
#include "argPost.c"
findFSRS (0);
for (;;) {
char *x, *y, *z, **argv;
int ii;
n = afgetln (&x, stdin);
if (n == 0) break;
if (n < 0) {
if (errno) eprintf ("%s:", argu[0]);
else return 0;
}
z = x;
argv = malloc (sizeof (char *) * (argc + 1));
if (!argv) eprintf ("%s:", argu[0]);
for (ii = 0; ii < argc - 1; ii++) argv[ii] = argu[ii + 1];
if (ii == 0) argv[ii++] = "echo";
/* ii now index of xargument in argv */
for (; x; x = y) {
int pid, c;
y = utfrune (x, fs);
if (y) {
Rune _;
int l = chartorune (&_, y);
y[0] = 0;
y += l;
}
else {
y = utfrune (x, rs);
if (y) y[0] = 0;
y = 0;
}
argv[ii] = x;
argv[ii + 1] = 0;
pid = fork ();
if (pid == 0) {
execvp (argv[0], argv);
eprintf ("%s: %s:", argu[0], argv[0]);
}
waitpid (pid, &c, 0);
if (c != 0) return 1;
}
}
}