* 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>.
* This should close Bug #1015.  Please test.
 -Erik
This commit is contained in:
Eric Andersen 2000-07-05 17:26:35 +00:00
parent 57ebebfb01
commit f7cf2f7ef9
7 changed files with 63 additions and 66 deletions

View File

@ -24,6 +24,9 @@
of thing. Patch thanks to David Vrabel <dvrabel@arcom.co.uk> of thing. Patch thanks to David Vrabel <dvrabel@arcom.co.uk>
* Fix to init.c from Stuart Menefy <Stuart.Menefy@st.com> so that * Fix to init.c from Stuart Menefy <Stuart.Menefy@st.com> so that
it always sets the controlling terminal before running any programs 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 -Erik Andersen

View File

@ -40,7 +40,7 @@ extern int
echo_main(int argc, char** argv) echo_main(int argc, char** argv)
{ {
register char **ap; register char **ap;
register char *p; char *p;
register char c; register char c;
int nflag = 0; int nflag = 0;
int eflag = 0; int eflag = 0;
@ -65,28 +65,10 @@ echo_main(int argc, char** argv)
while ((p = *ap++) != NULL) { while ((p = *ap++) != NULL) {
while ((c = *p++) != '\0') { while ((c = *p++) != '\0') {
if (c == '\\' && eflag) { if (c == '\\' && eflag) {
switch (c = *p++) { if (*p == 'c')
case 'a': c = '\007'; break; exit(0);
case 'b': c = '\b'; break; else
case 'c': exit( 0); /* exit */ c = process_escape_sequence(&p);
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;
}
} }
putchar(c); putchar(c);
} }

View File

@ -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; int i, ac;
while (*arg) { while (*arg) {
if (*arg == '\\') { if (*arg == '\\') {
arg++; arg++;
i = ac = 0; *buffer++ = process_escape_sequence(&arg);
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++;
} else if (*arg == '[') { } else if (*arg == '[') {
arg++; arg++;
i = *arg++; i = *arg++;

28
echo.c
View File

@ -40,7 +40,7 @@ extern int
echo_main(int argc, char** argv) echo_main(int argc, char** argv)
{ {
register char **ap; register char **ap;
register char *p; char *p;
register char c; register char c;
int nflag = 0; int nflag = 0;
int eflag = 0; int eflag = 0;
@ -65,28 +65,10 @@ echo_main(int argc, char** argv)
while ((p = *ap++) != NULL) { while ((p = *ap++) != NULL) {
while ((c = *p++) != '\0') { while ((c = *p++) != '\0') {
if (c == '\\' && eflag) { if (c == '\\' && eflag) {
switch (c = *p++) { if (*p == 'c')
case 'a': c = '\007'; break; exit(0);
case 'b': c = '\b'; break; else
case 'c': exit( 0); /* exit */ c = process_escape_sequence(&p);
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;
}
} }
putchar(c); putchar(c);
} }

View File

@ -259,6 +259,7 @@ extern pid_t* findPidByName( char* pidName);
extern void *xmalloc (size_t size); extern void *xmalloc (size_t size);
extern int find_real_root_device_name(char* name); extern int find_real_root_device_name(char* name);
extern char *get_line_from_file(FILE *file); 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 /* 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 * for BusyBox since we want to avoid using the glibc NSS stuff, which

12
tr.c
View File

@ -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; int i, ac;
while (*arg) { while (*arg) {
if (*arg == '\\') { if (*arg == '\\') {
arg++; arg++;
i = ac = 0; *buffer++ = process_escape_sequence(&arg);
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++;
} else if (*arg == '[') { } else if (*arg == '[') {
arg++; arg++;
i = *arg++; i = *arg++;

View File

@ -1617,6 +1617,51 @@ extern char *get_line_from_file(FILE *file)
return linebuf; 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 */ /* END CODE */
/* /*
Local Variables: Local Variables: