/* vi: set sw=4 ts=4: */
/*
 * Mini tr implementation for busybox
 *
 ** Copyright (c) 1987,1997, Prentice Hall   All rights reserved.
 *
 * The name of Prentice Hall may not be used to endorse or promote
 * products derived from this software without specific prior
 * written permission.
 *
 * Copyright (c) Michiel Huisjes
 *
 * This version of tr is adapted from Minix tr and was modified
 * by Erik Andersen <andersen@codepoet.org> to be used in busybox.
 *
 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
 */
/* http://www.opengroup.org/onlinepubs/009695399/utilities/tr.html
 * TODO: xdigit, graph, print
 */
#include "libbb.h"

#define ASCII 0377

static void map(char *pvector,
		unsigned char *string1, unsigned int string1_len,
		unsigned char *string2, unsigned int string2_len)
{
	char last = '0';
	unsigned int i, j;

	for (j = 0, i = 0; i < string1_len; i++) {
		if (string2_len <= j)
			pvector[string1[i]] = last;
		else
			pvector[string1[i]] = last = string2[j++];
	}
}

/* supported constructs:
 *   Ranges,  e.g.,  0-9   ==>  0123456789
 *   Ranges,  e.g.,  [0-9] ==>  0123456789
 *   Escapes, e.g.,  \a    ==>  Control-G
 *   Character classes, e.g. [:upper:] ==> A...Z
 *   Equiv classess, e.g. [=A=] ==> A   (hmmmmmmm?)
 */
static unsigned int expand(const char *arg, char *buffer)
{
	char *buffer_start = buffer;
	unsigned i; /* can't be unsigned char: must be able to hold 256 */
	unsigned char ac;

	while (*arg) {
		if (*arg == '\\') {
			arg++;
			*buffer++ = bb_process_escape_sequence(&arg);
			continue;
		}
		if (arg[1] == '-') { /* "0-9..." */
			ac = arg[2];
			if (ac == '\0') { /* "0-": copy verbatim */
				*buffer++ = *arg++; /* copy '0' */
				continue; /* next iter will copy '-' and stop */
			}
			i = *arg;
			while (i <= ac) /* ok: i is unsigned _int_ */
				*buffer++ = i++;
			arg += 3; /* skip 0-9 */
			continue;
		}
		if (*arg == '[') { /* "[xyz..." */
			arg++;
			i = *arg++;
			/* "[xyz...", i=x, arg points to y */
			if (ENABLE_FEATURE_TR_CLASSES && i == ':') {
#define CLO ":]\0"
				static const char classes[] ALIGN1 =
					"alpha"CLO "alnum"CLO "digit"CLO
					"lower"CLO "upper"CLO "space"CLO
					"blank"CLO "punct"CLO "cntrl"CLO;
#define CLASS_invalid 0 /* we increment the retval */
#define CLASS_alpha 1
#define CLASS_alnum 2
#define CLASS_digit 3
#define CLASS_lower 4
#define CLASS_upper 5
#define CLASS_space 6
#define CLASS_blank 7
#define CLASS_punct 8
#define CLASS_cntrl 9
//#define CLASS_xdigit 10
//#define CLASS_graph 11
//#define CLASS_print 12
				smalluint j;
				{ /* not really pretty.. */
					char *tmp = xstrndup(arg, 7); // warning: xdigit would need 8, not 7
					j = index_in_strings(classes, tmp) + 1;
					free(tmp);
				}
				if (j == CLASS_alnum || j == CLASS_digit) {
					for (i = '0'; i <= '9'; i++)
						*buffer++ = i;
				}
				if (j == CLASS_alpha || j == CLASS_alnum || j == CLASS_upper) {
					for (i = 'A'; i <= 'Z'; i++)
						*buffer++ = i;
				}
				if (j == CLASS_alpha || j == CLASS_alnum || j == CLASS_lower) {
					for (i = 'a'; i <= 'z'; i++)
						*buffer++ = i;
				}
				if (j == CLASS_space || j == CLASS_blank) {
					*buffer++ = '\t';
					if (j == CLASS_space) {
						*buffer++ = '\n';
						*buffer++ = '\v';
						*buffer++ = '\f';
						*buffer++ = '\r';
					}
					*buffer++ = ' ';
				}
				if (j == CLASS_punct || j == CLASS_cntrl) {
					for (i = '\0'; i <= ASCII; i++)
						if ((j == CLASS_punct && isprint(i) && !isalnum(i) && !isspace(i))
						 || (j == CLASS_cntrl && iscntrl(i)))
							*buffer++ = i;
				}
				if (j == CLASS_invalid) {
					*buffer++ = '[';
					*buffer++ = ':';
					continue;
				}
				break;
			}
			/* "[xyz...", i=x, arg points to y */
			if (ENABLE_FEATURE_TR_EQUIV && i == '=') { /* [=CHAR=] */
				*buffer++ = *arg; /* copy CHAR */
				arg += 3;	/* skip CHAR=] */
				continue;
			}
			if (*arg != '-') { /* not [x-...] - copy verbatim */
				*buffer++ = '[';
				arg--; /* points to x */
				continue; /* copy all, including eventual ']' */
			}
			/* [x-y...] */
			arg++;
			ac = *arg++;
			while (i <= ac)
				*buffer++ = i++;
			arg++;	/* skip the assumed ']' */
			continue;
		}
		*buffer++ = *arg++;
	}
	return (buffer - buffer_start);
}

static int complement(char *buffer, int buffer_len)
{
	int i, j, ix;
	char conv[ASCII + 2];

	ix = 0;
	for (i = '\0'; i <= ASCII; i++) {
		for (j = 0; j < buffer_len; j++)
			if (buffer[j] == i)
				break;
		if (j == buffer_len)
			conv[ix++] = i & ASCII;
	}
	memcpy(buffer, conv, ix);
	return ix;
}

int tr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int tr_main(int argc, char **argv)
{
	int output_length = 0, input_length;
	int i;
	smalluint flags;
	ssize_t read_chars = 0;
	size_t in_index = 0, out_index = 0;
	unsigned last = UCHAR_MAX + 1; /* not equal to any char */
	unsigned char coded, c;
	unsigned char *output = xmalloc(BUFSIZ);
	char *vector = xzalloc((ASCII+1) * 3);
	char *invec  = vector + (ASCII+1);
	char *outvec = vector + (ASCII+1) * 2;

#define TR_OPT_complement	(1 << 0)
#define TR_OPT_delete		(1 << 1)
#define TR_OPT_squeeze_reps	(1 << 2)

	flags = getopt32(argv, "+cds"); /* '+': stop at first non-option */
	argv += optind;

	for (i = 0; i <= ASCII; i++) {
		vector[i] = i;
		/*invec[i] = outvec[i] = FALSE; - done by xzalloc */
	}

#define tr_buf bb_common_bufsiz1
	if (*argv != NULL) {
		input_length = expand(*argv++, tr_buf);
		if (flags & TR_OPT_complement)
			input_length = complement(tr_buf, input_length);
		if (*argv) {
			if (argv[0][0] == '\0')
				bb_error_msg_and_die("STRING2 cannot be empty");
			output_length = expand(*argv, output);
			map(vector, tr_buf, input_length, output, output_length);
		}
		for (i = 0; i < input_length; i++)
			invec[(unsigned char)tr_buf[i]] = TRUE;
		for (i = 0; i < output_length; i++)
			outvec[output[i]] = TRUE;
	}

	for (;;) {
		/* If we're out of input, flush output and read more input. */
		if (in_index == read_chars) {
			if (out_index) {
				xwrite(STDOUT_FILENO, (char *)output, out_index);
				out_index = 0;
			}
			read_chars = safe_read(STDIN_FILENO, tr_buf, BUFSIZ);
			if (read_chars <= 0) {
				if (read_chars < 0)
					bb_perror_msg_and_die(bb_msg_read_error);
				exit(EXIT_SUCCESS);
			}
			in_index = 0;
		}
		c = tr_buf[in_index++];
		coded = vector[c];
		if ((flags & TR_OPT_delete) && invec[c])
			continue;
		if ((flags & TR_OPT_squeeze_reps) && last == coded
		 && (invec[c] || outvec[coded]))
			continue;
		output[out_index++] = last = coded;
	}
	/* NOTREACHED */
	return EXIT_SUCCESS;
}
