/*====================================================================
 *
 * TXF etc. function
 *
 *====================================================================
 *                                   copyright(C) 1992-1994 T.Nakatani
 *====================================================================
 */
#include "txf.h"

int hex(char far *str)
{
	int i, j, val = 0;

	for (j = 0; j < 2; j++) {
		i = (int)(*(str + j));
		if ((i < 0x30) || (i > 0x66)) i = 0;
		if (i > 0x60) i -= 0x57;
		if (i > 0x46) i = 0;
		if (i > 0x40) i -= 0x37;
		if (i > 0x39) i = 0;
		if (i > 0x2f) i -= 0x30;
		val += (i * ((j == 0) ? 16 : 1));
	}
	return (val);
}

char far *ftrans(char far *form)
{
	int i = 0, j = 0, k = 0;
	int len = far_strlen(form);
	int chrattr = CT_ANK, lowk, highk;
	char far *original, *attr, *tmp, far *str;

	if (form == NULL) {
		errexit("find NULL pointer(ftrans)");
	}
	attr = malloc(len + 1);
	if (attr == NULL) {
		errexit("Heap Error at(ftrans)");
	}
	original = form;
	tmp = malloc(3000);
	if (tmp == NULL) {
		errexit("out of memory at ftrans()");
	}
	for (i = 0; *(original + i) != NUL; i++) {
		chrattr = chkctype(*(original + i), chrattr);
		*(attr + i) = chrattr;
	}

	for (i = 0; i < len; i++) {
		if ((*(original + i) == 0x5c) && (*(attr + i) == CT_ANK)) {
			i++;
			switch (*(original + i)) {
			case 0x5c:
				*(tmp + j) = 0x5c;
				break;
			case '-':
				*(tmp + j) = '-';
				break;
			case '#':
				*(tmp + j) = '#';
				break;
			case '_':
				*(tmp + j) = ' ';
				break;
			case 0x81:
				if (*(original + i + 1) == 0x51) {
					i++;
					*(tmp+j) = 0x81;
					j++;
					*(tmp+j) = 0x40;
				}
				break;
			case 'e':
				*(tmp + j) = '=';
				break;
			case 'd':
				*(tmp + j) = 0x22;
				break;
			case 'n':
				*(tmp + j) = CR;
				j++;
				*(tmp + j) = LF;
				break;
			case 't':
				*(tmp + j) = TAB;
				break;
			case 's':
				*(tmp + j) = ';';
				break;
			case 'r':
				*(tmp + j) = '>';
				break;
			case 'l':
				*(tmp + j) = '<';
				break;
			case 'v':
				*(tmp + j) = '|';
				break;
			case 'x':
				*(tmp + j) = hex(original + i + 1);
				i += 2;
				break;
			case 'X':
				*(tmp + j) = hex(original + i + 1);
				j++;
				*(tmp + j) = hex(original + i + 3);
				i += 4;
				break;
			default:
				*(tmp + j) = *(original + i);
			}
		}
		else if ((*(original + i) == '-') && (*(attr + i) == CT_ANK)) {
			if ((*(attr + i - 1) == CT_ANK) && (*(attr + i + 1) == CT_ANK)) {
				for (k = 1; (*(original+i-1) + k) <= *(original+i+1); k++) {
					*(tmp + (j++)) = *(original + i - 1) + k;
				}
				i++;
				j--;
			}
			else if ((*(attr+i-1) == CT_KJ2) && (*(attr+i+1) == CT_KJ1)) {
				lowk = (*(original + i - 2) << 8) | *(original + i - 1);
				highk = (*(original + i + 1) << 8) | *(original + i + 2);
				for (k = (lowk + 1); k <= highk; k++) {
					*(tmp + (j++)) = k >> 8;
					*(tmp + (j++)) = k & 0xff;
				}
				i += 2;
				j--;
			}
		}
		else {
			(*(tmp + j)) = (*(original + i));
		}
		j++;
	}
	*(tmp + j) = NUL;
	str = farmalloc(strlen(tmp) + 1);
	if (str == NULL) {
		errexit("Heap Error at(ftrans2)");
	}
	far_strcpy(str, tmp);
	free(attr);
	free(tmp);
	return (str);
}

int quotechk(char far *ptr)
{
	char *now, *next;
	if (strchr(kq, ',') == NULL) {
		if (iskanji(*ptr)) {
			if (jstrchr(kq, (*(ptr+1L) | (*ptr << 8))) != NULL) return (1);
		}
		else {
			if (jstrchr(kq, (*ptr & 0x0ff)) != NULL) return (1);
		}
	}
	else {
		next = kq;
		for(;;) {
			now = next;
			while (*now == ',') now++;
			if (*now == NUL) {
				break;
			}
			if ((next = strchr(now, ',')) == NULL) {
				next = strchr(now, NUL);
			}
			if (far_strncmp(ptr, now, (int)(next - now)) == 0) {
				return (1);
			}
		}
	}

	return (0);
}

/*
char *strspc(char *ptr, char find)
{
	while (*ptr != find) {
		if (*ptr == NUL) {
			return (ptr);
		}
		*ptr = NUL;
		ptr++;
	}
	return (ptr);
}
*/

char *ktrans(char far *str)
{
	char far *buf;
	char *nbuf;

	buf = ftrans(str);
	nbuf = malloc(far_strlen(buf)+1);
	if (nbuf == NULL) {
		errexit("Heap Error");
	}
	far_strcpy(nbuf, buf);
	farfree(buf);
	return (nbuf);
}


void init_allswitch()
{
	int i;
	inputfile[0] = NUL;
	outputfile[0] = NUL;
	for (i = 0; i < PARA_MAX; i++) {
		para[i] = NULL;
	}
	for (i = 0; i < 2; i++) {
		tfile[i][0] = NUL;
	}
	for (i = 0; i < 16; i++) {
		exold[i] = NULL;
		exnew[i] = NULL;
	}
	*bakfile = NUL;		/*	-rb	*/
	tabsize = 8;		/*	-t	*/
	tabx = 0;			/*	-x	tab“WŠJ	*/
	maxc = 76;			/*	-l	*/
	cent = 0;			/*	-c	*/
	left = -1;			/*	-ml	*/
	right = -1;			/*	-mr	*/
	retflg = 0;			/*	-r	*/
	quoteflg = 0;		/*	-q	ˆø—p•¶	*/
	base = -1;			/*	-b	*/
	tfile[0][0] = NUL;	/*	-d	*/
	tfile[1][0] = NUL;	/*	-d	*/
	exflg = 0;			/*	-e	*/
	format = 1;			/*	-n,-f	*/
	viewmode = 0;		/*	-v	*/
	sep = 0x22;			/*	-s	*/
	removeeofflg = 0;
	removebakfile = 0;
}

void gettmpfile()
{
	if (getenv("TMP") != NULL) {
		strncpy(tfile[0], getenv("TMP"), 64);
#ifdef DEBUG
		if (viewmode > 3) {
			fprintf(stderr, "TMP 0:%s\n", tfile[0]);
		}
#endif
	}
	else {
		strncpy(tfile[0], basedir, 80);
		if (strchr(tfile[0], 0x5c) != NULL) {
			*(strrchr(tfile[0], 0x5c)) = NUL;
		}
		else if (strrchr(tfile[0], ':') != NULL) {
			*(strrchr(tfile[0], ':') + 1) = NUL;
		}
		else{
			tfile[0][0] = NUL;
		}
		if (viewmode > 3) {
			fprintf(stderr, "TMP 0:%s\n", tfile[0]);
		}
	}
}

