aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog3
-rw-r--r--coreutils/echo.c28
-rw-r--r--coreutils/tr.c12
-rw-r--r--echo.c28
-rw-r--r--internal.h1
-rw-r--r--tr.c12
-rw-r--r--utility.c45
7 files changed, 63 insertions, 66 deletions
diff --git a/Changelog b/Changelog
index d18244215..d147196cf 100644
--- a/Changelog
+++ b/Changelog
@@ -24,6 +24,9 @@
of thing. Patch thanks to David Vrabel <dvrabel@arcom.co.uk>
* Fix to init.c from Stuart Menefy <Stuart.Menefy@st.com> so that
it always sets the controlling terminal before running any programs
+ * Fix to tr so it recognizes standard escape sequences. Merged common
+ escape seq. code from tr and echo into utility.c. Fix thanks to
+ Matt Kraai <kraai@alumni.carnegiemellon.edu>.
-Erik Andersen
diff --git a/coreutils/echo.c b/coreutils/echo.c
index 4659e4bc6..6e279d1c6 100644
--- a/coreutils/echo.c
+++ b/coreutils/echo.c
@@ -40,7 +40,7 @@ extern int
echo_main(int argc, char** argv)
{
register char **ap;
- register char *p;
+ char *p;
register char c;
int nflag = 0;
int eflag = 0;
@@ -65,28 +65,10 @@ echo_main(int argc, char** argv)
while ((p = *ap++) != NULL) {
while ((c = *p++) != '\0') {
if (c == '\\' && eflag) {
- switch (c = *p++) {
- case 'a': c = '\007'; break;
- case 'b': c = '\b'; break;
- case 'c': exit( 0); /* exit */
- case 'f': c = '\f'; break;
- case 'n': c = '\n'; break;
- case 'r': c = '\r'; break;
- case 't': c = '\t'; break;
- case 'v': c = '\v'; break;
- case '\\': break; /* c = '\\' */
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- c -= '0';
- if (*p >= '0' && *p <= '7')
- c = c * 8 + (*p++ - '0');
- if (*p >= '0' && *p <= '7')
- c = c * 8 + (*p++ - '0');
- break;
- default:
- p--;
- break;
- }
+ if (*p == 'c')
+ exit(0);
+ else
+ c = process_escape_sequence(&p);
}
putchar(c);
}
diff --git a/coreutils/tr.c b/coreutils/tr.c
index 3e7ba583c..48cdd47bd 100644
--- a/coreutils/tr.c
+++ b/coreutils/tr.c
@@ -111,22 +111,14 @@ static void map(register unsigned char *string1, register unsigned char *string2
}
}
-static void expand(register char *arg, register unsigned char *buffer)
+static void expand(char *arg, register unsigned char *buffer)
{
int i, ac;
while (*arg) {
if (*arg == '\\') {
arg++;
- i = ac = 0;
- if (*arg >= '0' && *arg <= '7') {
- do {
- ac = (ac << 3) + *arg++ - '0';
- i++;
- } while (i < 4 && *arg >= '0' && *arg <= '7');
- *buffer++ = ac;
- } else if (*arg != '\0')
- *buffer++ = *arg++;
+ *buffer++ = process_escape_sequence(&arg);
} else if (*arg == '[') {
arg++;
i = *arg++;
diff --git a/echo.c b/echo.c
index 4659e4bc6..6e279d1c6 100644
--- a/echo.c
+++ b/echo.c
@@ -40,7 +40,7 @@ extern int
echo_main(int argc, char** argv)
{
register char **ap;
- register char *p;
+ char *p;
register char c;
int nflag = 0;
int eflag = 0;
@@ -65,28 +65,10 @@ echo_main(int argc, char** argv)
while ((p = *ap++) != NULL) {
while ((c = *p++) != '\0') {
if (c == '\\' && eflag) {
- switch (c = *p++) {
- case 'a': c = '\007'; break;
- case 'b': c = '\b'; break;
- case 'c': exit( 0); /* exit */
- case 'f': c = '\f'; break;
- case 'n': c = '\n'; break;
- case 'r': c = '\r'; break;
- case 't': c = '\t'; break;
- case 'v': c = '\v'; break;
- case '\\': break; /* c = '\\' */
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- c -= '0';
- if (*p >= '0' && *p <= '7')
- c = c * 8 + (*p++ - '0');
- if (*p >= '0' && *p <= '7')
- c = c * 8 + (*p++ - '0');
- break;
- default:
- p--;
- break;
- }
+ if (*p == 'c')
+ exit(0);
+ else
+ c = process_escape_sequence(&p);
}
putchar(c);
}
diff --git a/internal.h b/internal.h
index 41a72e18a..27be05ee2 100644
--- a/internal.h
+++ b/internal.h
@@ -259,6 +259,7 @@ extern pid_t* findPidByName( char* pidName);
extern void *xmalloc (size_t size);
extern int find_real_root_device_name(char* name);
extern char *get_line_from_file(FILE *file);
+extern char process_escape_sequence(char **ptr);
/* These parse entries in /etc/passwd and /etc/group. This is desirable
* for BusyBox since we want to avoid using the glibc NSS stuff, which
diff --git a/tr.c b/tr.c
index 3e7ba583c..48cdd47bd 100644
--- a/tr.c
+++ b/tr.c
@@ -111,22 +111,14 @@ static void map(register unsigned char *string1, register unsigned char *string2
}
}
-static void expand(register char *arg, register unsigned char *buffer)
+static void expand(char *arg, register unsigned char *buffer)
{
int i, ac;
while (*arg) {
if (*arg == '\\') {
arg++;
- i = ac = 0;
- if (*arg >= '0' && *arg <= '7') {
- do {
- ac = (ac << 3) + *arg++ - '0';
- i++;
- } while (i < 4 && *arg >= '0' && *arg <= '7');
- *buffer++ = ac;
- } else if (*arg != '\0')
- *buffer++ = *arg++;
+ *buffer++ = process_escape_sequence(&arg);
} else if (*arg == '[') {
arg++;
i = *arg++;
diff --git a/utility.c b/utility.c
index de53dbda8..f3af01f44 100644
--- a/utility.c
+++ b/utility.c
@@ -1617,6 +1617,51 @@ extern char *get_line_from_file(FILE *file)
return linebuf;
}
+#if defined BB_ECHO || defined BB_TR
+char process_escape_sequence(char **ptr)
+{
+ char c;
+
+ switch (c = *(*ptr)++) {
+ case 'a':
+ c = '\a';
+ break;
+ case 'b':
+ c = '\b';
+ break;
+ case 'f':
+ c = '\f';
+ break;
+ case 'n':
+ c = '\n';
+ break;
+ case 't':
+ c = '\t';
+ break;
+ case 'v':
+ c = '\v';
+ break;
+ case '\\':
+ c = '\\';
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ c -= '0';
+ if ('0' <= **ptr && **ptr <= '7') {
+ c = c * 8 + (*(*ptr)++ - '0');
+ if ('0' <= **ptr && **ptr <= '7')
+ c = c * 8 + (*(*ptr)++ - '0');
+ }
+ break;
+ default:
+ (*ptr)--;
+ c = '\\';
+ break;
+ }
+ return c;
+}
+#endif
+
/* END CODE */
/*
Local Variables: