#include "txtcvt.h"

/**********************************
	Get 2-byte lohi value from file
***********************************/

int get2byte(FILE *ifp, int offset)
{
	int value = -1;
	int r;
	int hi;
	int lo;

	r = fseek(ifp, offset, SEEK_SET);
	if(r != -1)	{
		lo = fgetc(ifp);
		if(lo != EOF) {
			hi = fgetc(ifp);
			if(hi != EOF) {
				value = hi * 256 + lo;
			}
		}
	}
	return(value);
}
	
/********************************
	Read Microsoft text file
********************************/

void readmsfile(FILE *ifp, FILE *ofp, int filetype)
{
	unsigned int c;
	int r;
	int size;
	int offset;
	int hdrsize;
	int textoffset;
	int written;

	switch (filetype) {
		case DOSWORD: {
			offset = 14;
			hdrsize = 128;
			break;
		}
		case WINWORD1: {
			offset = 28;
			hdrsize = 384;
			break;
		}
		case WINWORD2: {
			offset = 28;
			hdrsize = 384;
			break;
		}
		case WINWRITE: {
			offset = 14;
			hdrsize = 128;
			break;
		}
	}

	size = get2byte(ifp, offset) - hdrsize;
	if(size == 0) {
		printf("Unable to process inputfile\n");
	}
	else {
		printf("Length of text: %i\n", size);
	}

	switch (filetype) {
		case DOSWORD: {
			textoffset = 128;
			break;
		}
		case WINWORD1: {
			textoffset = get2byte(ifp, 24);
			break;
		}
		case WINWORD2: {
			textoffset = get2byte(ifp, 24);
			break;
		}
		case WINWRITE: {
			textoffset = 128;
			break;
		}
	}
	if(textoffset == 0) {
		printf("Unable to process inputfile\n");
	}
	else {
		printf("Start of text: %i\n", textoffset);
	}

	r = fseek(ifp, textoffset, SEEK_SET);
	if(r != -1)	{
		c = fgetc(ifp);
		r = 0;
		written = 0;
		while(c != EOF && r != EOF && written < size) {
			written++;
			switch (c) {
				case 0:
				case 1:
				case 2:
				case 3:
				case 4:
				case 5:
				case 6:	
				case 7:
				case 8:
				case 12:			/* explicit page break */ 
				case 14:
				case 16:
				case 17:
				case 18:
				case 19:
				case 20:
				case 21:
				case 22:
				case 23:
				case 24:
				case 25:
				case 26:
				case 27:
				case 28:
				case 29:
				case 31:
					break;
				case 11: {			/* Hard line break */
					r = fputc(13, ofp);
					if(r != EOF) {
						r = fputc(10, ofp);
					}
					break;
				}
				case 15: {			/* em-hyphen to hyphen */
					if(filetype == DOSWORD || filetype == WINWORD1 || filetype == WINWORD2) {
						r = fputc(45, ofp);
						if(r != EOF) {
							r = fputc(45, ofp);
						}
					}
					break;
				}
				case 30: {			/* nonbreaking hyphen */
					if(filetype == WINWORD1 || filetype == WINWORD2) {
						r = fputc(45, ofp);
					}
					break;
				}
				case 160: {			/* nonbreaking space */
					if(filetype == WINWORD1 || filetype == WINWORD2) {
						r = fputc(32, ofp);
					}
					else {
						r = fputc(c, ofp);
					}
					break;
				}
				case 196: {			/* nonbreaking hyphen */
					if(filetype == DOSWORD) {
						r = fputc(45, ofp);
					}
					else {
						r = fputc(c, ofp);
					}
					break;
				}
				case 255: {			/* nonbreaking space */
					if(filetype == DOSWORD) {
						r = fputc(32, ofp);
					}
					else {
						r = fputc(c, ofp);
					}
					break;
				}
				default: {
					r = fputc(c, ofp);
					break;
				}
			}
			c = fgetc(ifp);
		}
		if(r == EOF) {
			printf("Error %d occurred while writing to outputfile.\n",errno);
		}
	}
	else {
		printf("Unable to process inputfile\n");
	}
}
