Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/tr Tidy up.
details: https://anonhg.NetBSD.org/src/rev/767fece4745b
branches: trunk
changeset: 789202:767fece4745b
user: dholland <dholland%NetBSD.org@localhost>
date: Sun Aug 11 01:29:28 2013 +0000
description:
Tidy up.
diffstat:
usr.bin/tr/str.c | 147 ++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 103 insertions(+), 44 deletions(-)
diffs (289 lines):
diff -r eb6d77b307cc -r 767fece4745b usr.bin/tr/str.c
--- a/usr.bin/tr/str.c Sun Aug 11 01:00:13 2013 +0000
+++ b/usr.bin/tr/str.c Sun Aug 11 01:29:28 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: str.c,v 1.25 2013/08/11 01:00:13 dholland Exp $ */
+/* $NetBSD: str.c,v 1.26 2013/08/11 01:29:28 dholland Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)str.c 8.2 (Berkeley) 4/28/95";
#endif
-__RCSID("$NetBSD: str.c,v 1.25 2013/08/11 01:00:13 dholland Exp $");
+__RCSID("$NetBSD: str.c,v 1.26 2013/08/11 01:29:28 dholland Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -63,7 +63,7 @@
static int backslash(STR *);
static int bracket(STR *);
static int c_class(const void *, const void *);
-static void genclass(STR *);
+static void genclass(STR *, const char *, size_t);
static void genequiv(STR *);
static int genrange(STR *);
static void genseq(STR *);
@@ -112,7 +112,8 @@
*ret = s->lastch;
return 1;
case NORMAL:
- switch (ch = (unsigned char)*s->str) {
+ ch = (unsigned char)s->str[0];
+ switch (ch) {
case '\0':
s->state = EOS;
*ret = s->lastch;
@@ -121,8 +122,9 @@
s->lastch = backslash(s);
break;
case '[':
- if (bracket(s))
+ if (bracket(s)) {
return next(s, ret);
+ }
/* FALLTHROUGH */
default:
++s->str;
@@ -137,23 +139,30 @@
*ret = s->lastch;
return 1;
case RANGE:
- if (s->cnt-- == 0) {
+ if (s->cnt == 0) {
s->state = NORMAL;
return next(s, ret);
}
+ s->cnt--;
++s->lastch;
*ret = s->lastch;
return 1;
case SEQUENCE:
- if (s->cnt-- == 0) {
+ if (s->cnt == 0) {
s->state = NORMAL;
return next(s, ret);
}
+ s->cnt--;
*ret = s->lastch;
return 1;
case SET:
- if ((s->lastch = s->set[s->cnt++]) == OOBCH) {
+ s->lastch = s->set[s->cnt++];
+ if (s->lastch == OOBCH) {
s->state = NORMAL;
+ if (s->set != s->equiv) {
+ free(s->set);
+ }
+ s->set = NULL;
return next(s, ret);
}
*ret = s->lastch;
@@ -168,15 +177,14 @@
static int
bracket(STR *s)
{
- char *p;
+ const char *p;
switch (s->str[1]) {
case ':': /* "[:class:]" */
if ((p = strstr(s->str + 2, ":]")) == NULL)
return 0;
- *p = '\0';
s->str += 2;
- genclass(s);
+ genclass(s, s->str, p - s->str);
s->str = p + 2;
return 1;
case '=': /* "[=equiv=]" */
@@ -217,36 +225,77 @@
{ "xdigit", isxdigit },
};
+typedef struct {
+ const char *name;
+ size_t len;
+} CLASSKEY;
+
static void
-genclass(STR *s)
+genclass(STR *s, const char *class, size_t len)
{
- int cnt;
+ int ch;
const CLASS *cp;
- CLASS tmp;
+ CLASSKEY key;
int *p;
+ unsigned pos, num;
+
+ /* Find the class */
+ key.name = class;
+ key.len = len;
+ cp = bsearch(&key, classes, __arraycount(classes), sizeof(classes[0]),
+ c_class);
+ if (cp == NULL) {
+ errx(1, "unknown class %.*s", (int)len, class);
+ }
- tmp.name = s->str;
- if ((cp = bsearch(&tmp, classes, sizeof(classes) /
- sizeof(*cp), sizeof(*cp), c_class)) == NULL)
- errx(1, "unknown class %s", s->str);
+ /*
+ * Figure out what characters are in the class
+ */
- if ((s->set = p = malloc((NCHARS + 1) * sizeof(*p))) == NULL)
+ num = NCHARS + 1;
+ p = malloc(num * sizeof(*p));
+ if (p == NULL) {
err(1, "malloc");
+ }
- for (cnt = 0; cnt < NCHARS; ++cnt)
- if ((*cp->func)(cnt))
- *p++ = cnt;
- *p++ = OOBCH;
- memset(p, 0, NCHARS + 1 - (p - s->set));
+ pos = 0;
+ for (ch = 0; ch < NCHARS; ch++) {
+ if (cp->func(ch)) {
+ p[pos++] = ch;
+ }
+ }
+ p[pos++] = OOBCH;
+ for (; pos < num; pos++) {
+ p[pos] = 0;
+ }
+
+ /* Update the state */
+
+ s->set = p;
s->cnt = 0;
s->state = SET;
}
static int
-c_class(const void *a, const void *b)
+c_class(const void *av, const void *bv)
{
- return strcmp(((const CLASS *)a)->name, ((const CLASS *)b)->name);
+ const CLASSKEY *a = av;
+ const CLASS *b = bv;
+ size_t blen;
+ int r;
+
+ blen = strlen(b->name);
+ r = strncmp(a->name, b->name, a->len);
+ if (r != 0) {
+ return r;
+ }
+ if (a->len < blen) {
+ /* someone gave us a prefix of the right name */
+ return -1;
+ }
+ assert(a-> len == blen);
+ return 0;
}
/*
@@ -258,12 +307,14 @@
{
if (*s->str == '\\') {
s->equiv[0] = backslash(s);
- if (*s->str != '=')
- errx(1, "misplaced equivalence equals sign");
+ if (*s->str != '=') {
+ errx(1, "Misplaced equivalence equals sign");
+ }
} else {
s->equiv[0] = (unsigned char)s->str[0];
- if (s->str[1] != '=')
- errx(1, "misplaced equivalence equals sign");
+ if (s->str[1] != '=') {
+ errx(1, "Misplaced equivalence equals sign");
+ }
}
s->str += 2;
s->cnt = 0;
@@ -278,8 +329,8 @@
const char *savestart;
savestart = s->str++;
- stopval = *s->str == '\\' ? backslash(s) : (unsigned char)*s->str++;
- if (stopval < (u_char)s->lastch) {
+ stopval = s->str[0] == '\\' ? backslash(s) : (unsigned char)*s->str++;
+ if (stopval < (unsigned char)s->lastch) {
s->str = savestart;
return 0;
}
@@ -294,17 +345,21 @@
{
char *ep;
- if (s->which == STRING1)
- errx(1, "sequences only valid in string2");
+ if (s->which == STRING1) {
+ errx(1, "Sequences only valid in string2");
+ }
- if (*s->str == '\\')
+ if (*s->str == '\\') {
s->lastch = backslash(s);
- else
+ } else {
s->lastch = (unsigned char)*s->str++;
- if (*s->str != '*')
- errx(1, "misplaced sequence asterisk");
+ }
+ if (*s->str != '*') {
+ errx(1, "Misplaced sequence asterisk");
+ }
- switch (*++s->str) {
+ s->str++;
+ switch (s->str[0]) {
case '\\':
s->cnt = backslash(s);
break;
@@ -313,7 +368,7 @@
++s->str;
break;
default:
- if (isdigit((unsigned char)*s->str)) {
+ if (isdigit((unsigned char)s->str[0])) {
s->cnt = strtol(s->str, &ep, 0);
if (*ep == ']') {
s->str = ep + 1;
@@ -337,19 +392,23 @@
int ch, cnt, val;
for (cnt = val = 0;;) {
- ch = (unsigned char)*++s->str;
- if (!isascii(ch) || !isdigit(ch))
+ s->str++;
+ ch = (unsigned char)s->str[0];
+ if (!isascii(ch) || !isdigit(ch)) {
break;
+ }
val = val * 8 + ch - '0';
if (++cnt == 3) {
++s->str;
break;
}
}
- if (cnt)
+ if (cnt) {
return val;
- if (ch != '\0')
+ }
+ if (ch != '\0') {
++s->str;
+ }
switch (ch) {
case 'a': /* escape characters */
return '\7';
Home |
Main Index |
Thread Index |
Old Index