* 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:
parent
57ebebfb01
commit
f7cf2f7ef9
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
28
echo.c
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
12
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;
|
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++;
|
||||||
|
45
utility.c
45
utility.c
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user