seq, xargs: style: put main at bottom

This commit is contained in:
Hiltjo Posthuma 2015-03-07 13:36:40 +01:00
parent 0c17cd0fb3
commit 37eaf92a7d
2 changed files with 143 additions and 147 deletions

130
seq.c
View File

@ -5,9 +5,69 @@
#include "util.h"
static int digitsleft(const char *);
static int digitsright(const char *);
static int validfmt(const char *);
static int
digitsleft(const char *d)
{
char *exp;
int shift;
if (*d == '+')
d++;
exp = strpbrk(d, "eE");
shift = exp ? estrtonum(&exp[1], INT_MIN, INT_MAX) : 0;
return MAX(0, strspn(d, "-0123456789") + shift);
}
static int
digitsright(const char *d)
{
char *exp;
int shift, after;
exp = strpbrk(d, "eE");
shift = exp ? estrtonum(&exp[1], INT_MIN, INT_MAX) : 0;
after = (d = strchr(d, '.')) ? strspn(&d[1], "0123456789") : 0;
return MAX(0, after - shift);
}
static int
validfmt(const char *fmt)
{
int occur = 0;
literal:
while (*fmt)
if (*fmt++ == '%')
goto format;
return occur == 1;
format:
if (*fmt == '%') {
fmt++;
goto literal;
}
fmt += strspn(fmt, "-+#0 '");
fmt += strspn(fmt, "0123456789");
if (*fmt == '.') {
fmt++;
fmt += strspn(fmt, "0123456789");
}
if (*fmt == 'L')
fmt++;
switch (*fmt) {
case 'f': case 'F':
case 'g': case 'G':
case 'e': case 'E':
case 'a': case 'A':
occur++;
goto literal;
default:
return 0;
}
}
static void
usage(void)
@ -86,67 +146,3 @@ main(int argc, char *argv[])
return 0;
}
static int
digitsleft(const char *d)
{
char *exp;
int shift;
if (*d == '+')
d++;
exp = strpbrk(d, "eE");
shift = exp ? estrtonum(&exp[1], INT_MIN, INT_MAX) : 0;
return MAX(0, strspn(d, "-0123456789") + shift);
}
static int
digitsright(const char *d)
{
char *exp;
int shift, after;
exp = strpbrk(d, "eE");
shift = exp ? estrtonum(&exp[1], INT_MIN, INT_MAX) : 0;
after = (d = strchr(d, '.')) ? strspn(&d[1], "0123456789") : 0;
return MAX(0, after - shift);
}
static int
validfmt(const char *fmt)
{
int occur = 0;
literal:
while (*fmt)
if (*fmt++ == '%')
goto format;
return occur == 1;
format:
if (*fmt == '%') {
fmt++;
goto literal;
}
fmt += strspn(fmt, "-+#0 '");
fmt += strspn(fmt, "0123456789");
if (*fmt == '.') {
fmt++;
fmt += strspn(fmt, "0123456789");
}
if (*fmt == 'L')
fmt++;
switch (*fmt) {
case 'f': case 'F':
case 'g': case 'G':
case 'e': case 'E':
case 'a': case 'A':
occur++;
goto literal;
default:
return 0;
}
}

160
xargs.c
View File

@ -32,86 +32,6 @@ static int nerrors = 0;
static char *eofstr;
static int rflag = 0, nflag = 0;
static void
usage(void)
{
eprintf("usage: %s [-n maxargs] [-r] [-E eofstr] [cmd [arg...]]\n", argv0);
}
int
main(int argc, char *argv[])
{
int leftover = 0;
long argsz, argmaxsz;
char *arg = "";
int i, a;
ARGBEGIN {
case 'n':
nflag = 1;
if ((maxargs = strtol(EARGF(usage()), NULL, 10)) <= 0)
eprintf("%s: value for -n option should be >= 1\n", argv0);
break;
case 'r':
rflag = 1;
break;
case 'E':
eofstr = EARGF(usage());
break;
default:
usage();
} ARGEND;
argmaxsz = sysconf(_SC_ARG_MAX);
if (argmaxsz < 0)
eprintf("sysconf:");
/* Leave some room for environment variables */
argmaxsz -= 4 * 1024;
do {
argsz = 0; i = 0; a = 0;
if (argc > 0) {
for (; i < argc; i++) {
cmd[i] = estrdup(argv[i]);
argsz += strlen(cmd[i]) + 1;
}
} else {
cmd[i] = estrdup("/bin/echo");
argsz += strlen(cmd[i]) + 1;
i++;
}
while (leftover == 1 || (arg = poparg())) {
if (argsz + strlen(arg) + 1 > argmaxsz ||
i >= NARGS - 1) {
if (strlen(arg) + 1 > argmaxsz)
eprintf("insufficient argument space\n");
leftover = 1;
break;
}
cmd[i] = estrdup(arg);
argsz += strlen(cmd[i]) + 1;
i++;
a++;
leftover = 0;
if (nflag == 1 && a >= maxargs)
break;
}
cmd[i] = NULL;
if (a >= maxargs && nflag == 1)
spawn();
else if (!a || (i == 1 && rflag == 1))
;
else
spawn();
for (; i >= 0; i--)
free(cmd[i]);
} while (arg);
free(argb);
return nerrors > 0 ? 123 : 0;
}
static int
inputc(void)
{
@ -258,3 +178,83 @@ spawn(void)
}
waitchld();
}
static void
usage(void)
{
eprintf("usage: %s [-n maxargs] [-r] [-E eofstr] [cmd [arg...]]\n", argv0);
}
int
main(int argc, char *argv[])
{
int leftover = 0;
long argsz, argmaxsz;
char *arg = "";
int i, a;
ARGBEGIN {
case 'n':
nflag = 1;
if ((maxargs = strtol(EARGF(usage()), NULL, 10)) <= 0)
eprintf("%s: value for -n option should be >= 1\n", argv0);
break;
case 'r':
rflag = 1;
break;
case 'E':
eofstr = EARGF(usage());
break;
default:
usage();
} ARGEND;
argmaxsz = sysconf(_SC_ARG_MAX);
if (argmaxsz < 0)
eprintf("sysconf:");
/* Leave some room for environment variables */
argmaxsz -= 4 * 1024;
do {
argsz = 0; i = 0; a = 0;
if (argc > 0) {
for (; i < argc; i++) {
cmd[i] = estrdup(argv[i]);
argsz += strlen(cmd[i]) + 1;
}
} else {
cmd[i] = estrdup("/bin/echo");
argsz += strlen(cmd[i]) + 1;
i++;
}
while (leftover == 1 || (arg = poparg())) {
if (argsz + strlen(arg) + 1 > argmaxsz ||
i >= NARGS - 1) {
if (strlen(arg) + 1 > argmaxsz)
eprintf("insufficient argument space\n");
leftover = 1;
break;
}
cmd[i] = estrdup(arg);
argsz += strlen(cmd[i]) + 1;
i++;
a++;
leftover = 0;
if (nflag == 1 && a >= maxargs)
break;
}
cmd[i] = NULL;
if (a >= maxargs && nflag == 1)
spawn();
else if (!a || (i == 1 && rflag == 1))
;
else
spawn();
for (; i >= 0; i--)
free(cmd[i]);
} while (arg);
free(argb);
return nerrors > 0 ? 123 : 0;
}