version 1.24, 2018/08/04 16:14:03 |
version 1.25, 2018/08/04 16:47:05 |
|
|
int delimcnt; |
int delimcnt; |
|
|
int tr(char *); |
int tr(char *); |
void usage(void); |
__dead void usage(void); |
void parallel(char **); |
void parallel(char **); |
void sequential(char **); |
void sequential(char **); |
|
|
|
|
if (argc == 0) |
if (argc == 0) |
usage(); |
usage(); |
|
|
if (!delim) { |
if (delim == NULL) { |
delimcnt = 1; |
delimcnt = 1; |
delim = "\t"; |
delim = "\t"; |
} |
} |
|
|
sequential(argv); |
sequential(argv); |
else |
else |
parallel(argv); |
parallel(argv); |
exit(0); |
return 0; |
} |
} |
|
|
struct list { |
struct list { |
|
|
int opencnt, output; |
int opencnt, output; |
char ch; |
char ch; |
|
|
for (cnt = 0; (p = *argv); ++argv, ++cnt) { |
for (cnt = 0; (p = *argv) != NULL; ++argv, ++cnt) { |
if (!(lp = malloc(sizeof(struct list)))) |
if ((lp = malloc(sizeof(*lp))) == NULL) |
err(1, "malloc"); |
err(1, NULL); |
|
|
if (p[0] == '-' && !p[1]) |
if (p[0] == '-' && p[1] == '\0') |
lp->fp = stdin; |
lp->fp = stdin; |
else if (!(lp->fp = fopen(p, "r"))) |
else if ((lp->fp = fopen(p, "r")) == NULL) |
err(1, "%s", p); |
err(1, "%s", p); |
lp->cnt = cnt; |
lp->cnt = cnt; |
lp->name = p; |
lp->name = p; |
|
|
for (opencnt = cnt; opencnt;) { |
for (opencnt = cnt; opencnt;) { |
output = 0; |
output = 0; |
SIMPLEQ_FOREACH(lp, &head, entries) { |
SIMPLEQ_FOREACH(lp, &head, entries) { |
if (!lp->fp) { |
if (lp->fp == NULL) { |
if (output && lp->cnt && |
if (output && lp->cnt && |
(ch = delim[(lp->cnt - 1) % delimcnt])) |
(ch = delim[(lp->cnt - 1) % delimcnt])) |
putchar(ch); |
putchar(ch); |
|
|
if (ferror(lp->fp)) |
if (ferror(lp->fp)) |
err(1, "%s", lp->fp == stdin ? |
err(1, "%s", lp->fp == stdin ? |
"getline" : lp->name); |
"getline" : lp->name); |
if (!--opencnt) |
if (--opencnt == 0) |
break; |
break; |
if (lp->fp != stdin) |
if (lp->fp != stdin) |
(void)fclose(lp->fp); |
fclose(lp->fp); |
lp->fp = NULL; |
lp->fp = NULL; |
if (output && lp->cnt && |
if (output && lp->cnt && |
(ch = delim[(lp->cnt - 1) % delimcnt])) |
(ch = delim[(lp->cnt - 1) % delimcnt])) |
|
|
|
|
line = NULL; |
line = NULL; |
linesize = 0; |
linesize = 0; |
for (; (p = *argv); ++argv) { |
for (; (p = *argv) != NULL; ++argv) { |
if (p[0] == '-' && !p[1]) |
if (p[0] == '-' && p[1] == '\0') |
fp = stdin; |
fp = stdin; |
else if (!(fp = fopen(p, "r"))) { |
else if ((fp = fopen(p, "r")) == NULL) { |
warn("%s", p); |
warn("%s", p); |
continue; |
continue; |
} |
} |
|
|
if (cnt >= 0) |
if (cnt >= 0) |
putchar('\n'); |
putchar('\n'); |
if (fp != stdin) |
if (fp != stdin) |
(void)fclose(fp); |
fclose(fp); |
} |
} |
free(line); |
free(line); |
} |
} |
|
|
int cnt; |
int cnt; |
char ch, *p; |
char ch, *p; |
|
|
for (p = arg, cnt = 0; (ch = *p++); ++arg, ++cnt) { |
for (p = arg, cnt = 0; (ch = *p++) != '\0'; ++arg, ++cnt) { |
if (ch == '\\') { |
if (ch == '\\') { |
switch (ch = *p++) { |
switch (ch = *p++) { |
case 'n': |
case 'n': |
|
|
*arg = ch; |
*arg = ch; |
} |
} |
|
|
if (!cnt) |
if (cnt == 0) |
errx(1, "no delimiters specified"); |
errx(1, "no delimiters specified"); |
return (cnt); |
return cnt; |
} |
} |
|
|
void |
__dead void |
usage(void) |
usage(void) |
{ |
{ |
extern char *__progname; |
extern char *__progname; |
(void)fprintf(stderr, "usage: %s [-s] [-d list] file ...\n", |
fprintf(stderr, "usage: %s [-s] [-d list] file ...\n", __progname); |
__progname); |
|
exit(1); |
exit(1); |
} |
} |