sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 61ee561728f53a264c384d7c67dcb4671a3903ce
parent e00cdf226ae45c349793a7adf91774b5095e5730
Author: FRIGN <dev@frign.de>
Date:   Mon,  3 Aug 2015 01:12:29 +0200

Factor out parse_keydef() into addkeydef() and reorder functions

Add a small comment explaining the data-structure and sort the
functions according to usage, not alphabetically.

Diffstat:
Msort.c | 143++++++++++++++++++++++++++++++++++++++-----------------------------------------
1 file changed, 69 insertions(+), 74 deletions(-)

diff --git a/sort.c b/sort.c @@ -26,11 +26,10 @@ enum { static TAILQ_HEAD(kdhead, keydef) kdhead = TAILQ_HEAD_INITIALIZER(kdhead); +static int parse_flags(char **, int *, int); static void addkeydef(char *, int); -static void check(FILE *); static int linecmp(const char **, const char **); -static int parse_flags(char **, int *, int); -static int parse_keydef(struct keydef *, char *, int); +static void check(FILE *); static char *skipblank(char *); static char *skipnonblank(char *); static char *skipcolumn(char *, char *, int); @@ -41,35 +40,69 @@ static char *fieldsep = NULL; static char *col1, *col2; static size_t col1siz, col2siz; +static int +parse_flags(char **s, int *flags, int bflag) +{ + while (isalpha((int)**s)) { + switch (*((*s)++)) { + case 'b': + *flags |= bflag; + break; + case 'n': + *flags |= MOD_N; + break; + case 'r': + *flags |= MOD_R; + break; + default: + return -1; + } + } + + return 0; +} + static void addkeydef(char *kdstr, int flags) { struct keydef *kd; kd = enmalloc(2, sizeof(*kd)); - if (parse_keydef(kd, kdstr, flags)) - enprintf(2, "faulty key definition\n"); - TAILQ_INSERT_TAIL(&kdhead, kd, entry); -} + /* parse key definition kdstr with format + * start_column[.start_char][flags][,end_column[.end_char][flags]] + */ + kd->start_column = 1; + kd->start_char = 1; + kd->end_column = 0; /* 0 means end of line */ + kd->end_char = 0; /* 0 means end of column */ + kd->flags = flags; -static void -check(FILE *fp) -{ - static struct { char *buf; size_t size; } prev, cur, tmp; + if ((kd->start_column = strtol(kdstr, &kdstr, 10)) < 1) + enprintf(2, "invalid start column in key definition\n"); - if (!prev.buf && getline(&prev.buf, &prev.size, fp) < 0) - eprintf("getline:"); - while (getline(&cur.buf, &cur.size, fp) > 0) { - if (uflag > linecmp((const char **) &cur.buf, (const char **) &prev.buf)) { - if (!Cflag) - weprintf("disorder: %s", cur.buf); - exit(1); + if (*kdstr == '.') { + if ((kd->start_char = strtol(kdstr + 1, &kdstr, 10)) < 1) + enprintf(2, "invalid start character in key definition\n"); + } + if (parse_flags(&kdstr, &kd->flags, MOD_STARTB) < 0) + enprintf(2, "invalid start flags in key definition\n"); + + if (*kdstr == ',') { + if ((kd->end_column = strtol(kdstr + 1, &kdstr, 10)) < 0) + enprintf(2, "invalid end column in key definition\n"); + if (*kdstr == '.') { + if ((kd->end_char = strtol(kdstr + 1, &kdstr, 10)) < 0) + enprintf(2, "invalid end character in key definition\n"); } - tmp = cur; - cur = prev; - prev = tmp; + if (parse_flags(&kdstr, &kd->flags, MOD_ENDB) < 0) + enprintf(2, "invalid end flags in key definition\n"); } + + if (*kdstr != '\0') + enprintf(2, "invalid key definition\n"); + + TAILQ_INSERT_TAIL(&kdhead, kd, entry); } static int @@ -105,62 +138,23 @@ linecmp(const char **a, const char **b) return res; } -static int -parse_flags(char **s, int *flags, int bflag) -{ - while (isalpha((int)**s)) { - switch (*((*s)++)) { - case 'b': - *flags |= bflag; - break; - case 'n': - *flags |= MOD_N; - break; - case 'r': - *flags |= MOD_R; - break; - default: - return -1; - } - } - - return 0; -} - -static int -parse_keydef(struct keydef *kd, char *s, int flags) +static void +check(FILE *fp) { - char *rest = s; - - kd->start_column = 1; - kd->start_char = 1; - kd->end_column = 0; /* 0 means end of line */ - kd->end_char = 0; - kd->flags = flags; + static struct { char *buf; size_t size; } prev, cur, tmp; - kd->start_column = strtol(rest, &rest, 10); - if (kd->start_column < 1) - return -1; - if (*rest == '.') - kd->start_char = strtol(rest+1, &rest, 10); - if (kd->start_char < 1) - return -1; - if (parse_flags(&rest, &kd->flags, MOD_STARTB) < 0) - return -1; - if (*rest == ',') { - kd->end_column = strtol(rest+1, &rest, 10); - if (kd->end_column < 1) - return -1; - if (*rest == '.') { - kd->end_char = strtol(rest+1, &rest, 10); - if (kd->end_char < 0) - return -1; + if (!prev.buf && getline(&prev.buf, &prev.size, fp) < 0) + eprintf("getline:"); + while (getline(&cur.buf, &cur.size, fp) > 0) { + if (uflag > linecmp((const char **) &cur.buf, (const char **) &prev.buf)) { + if (!Cflag) + weprintf("disorder: %s", cur.buf); + exit(1); } - if (parse_flags(&rest, &kd->flags, MOD_ENDB) < 0) - return -1; + tmp = cur; + cur = prev; + prev = tmp; } - - return -(*rest); } static char * @@ -232,7 +226,8 @@ columns(char *line, const struct keydef *kd, char **col, size_t *colsiz) static void usage(void) { - enprintf(2, "usage: %s [-Cbcmnru] [-o outfile] [-t delim] [-k def]... [file ...]\n", argv0); + enprintf(2, "usage: %s [-Cbcmnru] [-o outfile] [-t delim] " + "[-k def]... [file ...]\n", argv0); } int