/***************
*
* g:\exe\txf\src\txfex_s.c
*/
#include "txf.h"

/********************old_exchange()***************************/

void old_exchange(char far *st1,char far *st2)
{				/* oldšnew	*/
	int match = 0, ix = 1, iy = 1, dmy;
	int oldlen = far_strlen(st1), newlen = 0;
	int chrattr = CT_ANK;
	char far *old = NULL, far *oldattr, far *new = NULL;
	char far *rptr = NULL;

	old = ftrans(st1);
	oldlen = far_strlen(old);
	oldattr = farmalloc(oldlen + 1);
	if (oldattr == NULL) {
		errexit("out of memory(oldattr)");
	}
	for (match = 0; *(old + match) != NUL; match++) {
		chrattr = chkctype(*(old + match), chrattr);
		*(oldattr + match) = chrattr;
		}
	if (st2 != NULL) {
		new = ftrans(st2);
	}
	if (new != NULL) {
		newlen = far_strlen(new);
	}

	rptr = buffileopen(9);

	if (viewmode > 1) fprintf(stderr, "'%s'š'%s'\n", old, new);

	match = 0;
	chrattr = CT_ANK;
	while (remainbyte() > 0) {
		while (match < oldlen) {
			if (remainbyte()) {
				rptr = readnext(1);
			}
			else {
				break;
			}
			if (ix == 1L) {
				if (chktouch(rptr, iy)) {
					while (*rptr != LF) {
						_dos_write(outputh, rptr, 1, &dmy);
						if (!remainbyte()) break;
						rptr = readnext(1);
					}
					if (*rptr == LF) {
						_dos_write(outputh, rptr, 1, &dmy);
						ix = 1;
						iy++;
					}
					if (!remainbyte()) break;
					continue;
				}
			}
			chrattr = chkctype(*rptr, chrattr);
			if ((*rptr == *(old + match)) && (chrattr == *(oldattr + match))) {
				match++;
			}
			else {
				if (match > 0) {
					_dos_write(outputh, old, match, &dmy);
					match = 0;
				}
				if (match == 0) {
					_dos_write(outputh, rptr, 1, &dmy);
				}
			}
/*			if (!remainbyte()) break; */
			if (*rptr == LF) {
				ix = 1;
				iy++;
				quote = 0;
			}
			else {
				ix++;
			}
/*----
			if (remainbyte()) {
				rptr = readnext(1);
			}
			else {
				break;
			}
----*/
		}

		if (match >= oldlen) {
			if (newlen > 0) {
				_dos_write(outputh, new, newlen, &dmy);
			}
		}
		else {
			_dos_write(outputh, old, match, &dmy);
		}
		match = 0;
	}

	bufclose();
	farfree(new);
	farfree(old);
	farfree(oldattr);
}

void old_exchangedriver()
{
	int i;

	if (viewmode > 1) {
		fprintf(stderr, "TXF Tiny exchange module.(Series) Ver1.03\n");
	}

	if (exold[0] != NULL) {
/*		old_exchange(exold[0], exnew[0]); */
		for (i = 0; i < exflg; i++) {
			old_exchange(exold[i], exnew[i]);
		}
	}

}

/****************end of old_exchange()************************/
