On Sun, Jan 30, 2022 at 10:23:43AM -0600, Scott Cheloha wrote: > In tr(1), we have these two global arrays, "string1" and "string2". > > I have a few complaints: > > 1. They are not strings. They are lookup tables. The names are > misleading. > > 2. The arguments given to tr(1) in argv[] are indeed called "string1" > and "string2". These are the names used in the standard, the manpage, > and the usage printout. > > However, the lookup tables are merely *described* by these arguments. > They are not the arguments themselves. > > 3. The meaning of the contents of these lookup tables changes depending > on which of the five different operating modes tr(1) is running in. > > string1[i] might mean "delete byte i" or "squeeze byte i" or > "replace byte i with the value string1[i]" depending on how > tr(1) was invoked. > > Given this, I think it'd be a lot nicer if we named the tables to > indicate which transformation operation they correspond to. > > We have three such operations: "delete", "squeeze", and "translate". > So we ought to have a table for each. And in setup() we should call > the table a "table", not a "string". > > Now when you look at the loops in main() you can immediately > understand which operation is happening without needing to consult the > manpage or the comments. (Seriously, look.) > > I have more cleanup I want to do here in tr.c, but I think renaming > these tables first is going to make the rest of it a lot easier to > review. > > ok?
1 week bump. ok? Index: tr.c =================================================================== RCS file: /cvs/src/usr.bin/tr/tr.c,v retrieving revision 1.20 diff -u -p -r1.20 tr.c --- tr.c 2 Nov 2021 15:45:52 -0000 1.20 +++ tr.c 30 Jan 2022 16:14:21 -0000 @@ -40,7 +40,8 @@ #include "extern.h" -static int string1[NCHARS] = { +int delete[NCHARS], squeeze[NCHARS]; +int translate[NCHARS] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* ASCII */ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, @@ -73,7 +74,7 @@ static int string1[NCHARS] = { 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, -}, string2[NCHARS]; +}; STR s1 = { STRING1, NORMAL, 0, OOBCH, { 0, OOBCH }, NULL, NULL }; STR s2 = { STRING2, NORMAL, 0, OOBCH, { 0, OOBCH }, NULL, NULL }; @@ -122,11 +123,11 @@ main(int argc, char *argv[]) if (argc != 2) usage(); - setup(string1, argv[0], &s1, cflag); - setup(string2, argv[1], &s2, 0); + setup(delete, argv[0], &s1, cflag); + setup(squeeze, argv[1], &s2, 0); for (lastch = OOBCH; (ch = getchar()) != EOF;) - if (!string1[ch] && (!string2[ch] || lastch != ch)) { + if (!delete[ch] && (!squeeze[ch] || lastch != ch)) { lastch = ch; (void)putchar(ch); } @@ -141,10 +142,10 @@ main(int argc, char *argv[]) if (argc != 1) usage(); - setup(string1, argv[0], &s1, cflag); + setup(delete, argv[0], &s1, cflag); while ((ch = getchar()) != EOF) - if (!string1[ch]) + if (!delete[ch]) (void)putchar(ch); exit(0); } @@ -154,10 +155,10 @@ main(int argc, char *argv[]) * Squeeze all characters (or complemented characters) in string1. */ if (sflag && argc == 1) { - setup(string1, argv[0], &s1, cflag); + setup(squeeze, argv[0], &s1, cflag); for (lastch = OOBCH; (ch = getchar()) != EOF;) - if (!string1[ch] || lastch != ch) { + if (!squeeze[ch] || lastch != ch) { lastch = ch; (void)putchar(ch); } @@ -177,7 +178,7 @@ main(int argc, char *argv[]) s2.str = (unsigned char *)argv[1]; if (cflag) - for (cnt = NCHARS, p = string1; cnt--;) + for (cnt = NCHARS, p = translate; cnt--;) *p++ = OOBCH; if (!next(&s2)) @@ -187,45 +188,45 @@ main(int argc, char *argv[]) ch = s2.lastch; if (sflag) while (next(&s1)) { - string1[s1.lastch] = ch = s2.lastch; - string2[ch] = 1; + translate[s1.lastch] = ch = s2.lastch; + squeeze[ch] = 1; (void)next(&s2); } else while (next(&s1)) { - string1[s1.lastch] = ch = s2.lastch; + translate[s1.lastch] = ch = s2.lastch; (void)next(&s2); } if (cflag) - for (cnt = 0, p = string1; cnt < NCHARS; ++p, ++cnt) + for (cnt = 0, p = translate; cnt < NCHARS; ++p, ++cnt) *p = *p == OOBCH ? ch : cnt; if (sflag) for (lastch = OOBCH; (ch = getchar()) != EOF;) { - ch = string1[ch]; - if (!string2[ch] || lastch != ch) { + ch = translate[ch]; + if (!squeeze[ch] || lastch != ch) { lastch = ch; (void)putchar(ch); } } else while ((ch = getchar()) != EOF) - (void)putchar(string1[ch]); + (void)putchar(translate[ch]); exit (0); } static void -setup(int *string, char *arg, STR *str, int cflag) +setup(int *table, char *arg, STR *str, int cflag) { int cnt, *p; str->str = (unsigned char *)arg; - bzero(string, NCHARS * sizeof(int)); + bzero(table, NCHARS * sizeof(int)); while (next(str)) - string[str->lastch] = 1; + table[str->lastch] = 1; if (cflag) - for (p = string, cnt = NCHARS; cnt--; ++p) + for (p = table, cnt = NCHARS; cnt--; ++p) *p = !*p; }