mirror of
https://github.com/sheumann/hush.git
synced 2024-12-26 10:32:02 +00:00
Rob Sullivan added character and equivalence classes to tr. I changed some
comments.
This commit is contained in:
parent
1d62d3b7b9
commit
f1048143ee
@ -28,11 +28,10 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include "busybox.h"
|
#include "busybox.h"
|
||||||
|
|
||||||
/* This must be a #define, since when CONFIG_DEBUG and BUFFERS_GO_IN_BSS are
|
|
||||||
* enabled, we otherwise get a "storage size isn't constant error. */
|
|
||||||
#define ASCII 0377
|
#define ASCII 0377
|
||||||
|
|
||||||
/* some "globals" shared across this file */
|
/* some "globals" shared across this file */
|
||||||
@ -93,6 +92,7 @@ static void map(register unsigned char *string1, unsigned int string1_len,
|
|||||||
/* supported constructs:
|
/* supported constructs:
|
||||||
* Ranges, e.g., [0-9] ==> 0123456789
|
* Ranges, e.g., [0-9] ==> 0123456789
|
||||||
* Escapes, e.g., \a ==> Control-G
|
* Escapes, e.g., \a ==> Control-G
|
||||||
|
* Character classes, e.g. [:upper:] ==> A ... Z
|
||||||
*/
|
*/
|
||||||
static unsigned int expand(const char *arg, register unsigned char *buffer)
|
static unsigned int expand(const char *arg, register unsigned char *buffer)
|
||||||
{
|
{
|
||||||
@ -115,12 +115,64 @@ static unsigned int expand(const char *arg, register unsigned char *buffer)
|
|||||||
arg += 3; /* Skip the assumed a-z */
|
arg += 3; /* Skip the assumed a-z */
|
||||||
} else if (*arg == '[') {
|
} else if (*arg == '[') {
|
||||||
arg++;
|
arg++;
|
||||||
i = *arg++;
|
if (ENABLE_FEATURE_TR_CLASSES && *arg++ == ':') {
|
||||||
|
if (strncmp(arg, "alpha", 5) == 0) {
|
||||||
|
for (i = 'A'; i <= 'Z'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
for (i = 'a'; i <= 'z'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
}
|
||||||
|
else if (strncmp(arg, "alnum", 5) == 0) {
|
||||||
|
for (i = 'A'; i <= 'Z'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
for (i = 'a'; i <= 'z'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
for (i = '0'; i <= '9'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
}
|
||||||
|
else if (strncmp(arg, "digit", 5) == 0)
|
||||||
|
for (i = '0'; i <= '9'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
else if (strncmp(arg, "lower", 5) == 0)
|
||||||
|
for (i = 'a'; i <= 'z'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
else if (strncmp(arg, "upper", 5) == 0)
|
||||||
|
for (i = 'A'; i <= 'Z'; i++)
|
||||||
|
*buffer++ = i;
|
||||||
|
else if (strncmp(arg, "space", 5) == 0)
|
||||||
|
strcat(buffer, " \f\n\r\t\v");
|
||||||
|
else if (strncmp(arg, "blank", 5) == 0)
|
||||||
|
strcat(buffer, " \t");
|
||||||
|
/* gcc gives a warning if braces aren't used here */
|
||||||
|
else if (strncmp(arg, "punct", 5) == 0) {
|
||||||
|
for (i = 0; i <= ASCII; i++)
|
||||||
|
if (isprint(i) && (!isalnum(i)) && (!isspace(i)))
|
||||||
|
*buffer++ = i;
|
||||||
|
}
|
||||||
|
else if (strncmp(arg, "cntrl", 5) == 0) {
|
||||||
|
for (i = 0; i <= ASCII; i++)
|
||||||
|
if (iscntrl(i))
|
||||||
|
*buffer++ = i;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcat(buffer, "[:");
|
||||||
|
arg++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ENABLE_FEATURE_TR_EQUIV && *arg++ == '=') {
|
||||||
|
*buffer++ = *arg;
|
||||||
|
/* skip the closing =] */
|
||||||
|
arg += 3;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (*arg++ != '-') {
|
if (*arg++ != '-') {
|
||||||
*buffer++ = '[';
|
*buffer++ = '[';
|
||||||
arg -= 2;
|
arg -= 2;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
i = *arg++;
|
||||||
ac = *arg++;
|
ac = *arg++;
|
||||||
while (i <= ac)
|
while (i <= ac)
|
||||||
*buffer++ = i++;
|
*buffer++ = i++;
|
||||||
|
Loading…
Reference in New Issue
Block a user