/* v04.c
 * Visual Editor, Datei laden testen
 * Autor: Andre Adrian
 * Version: 01Feb2011 fuer CP/M, MS-DOS, MS-Windows, Linux
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef CPM
#	include <conio.h>
#	define system(s)
#endif
#if defined(_MSC_VER) || defined(__TURBOC__)
#	include <conio.h>
#	define putch(c) putchar(c)
#	define cputs(s) fputs(s,stdout)
#	define system(s)
#endif
#ifdef linux
#	define putch(c) putchar(c)
#	define cputs(s) fputs(s,stdout)
#	define getch()  getchar()
#endif

#define SCRW	80		/* Bildschirm Breite */
#define SCRH	25		/* Bildschirm Hoehe */

/* Zeichen von Tastatur */
#define ETX	('C'-'@')	/* Strg-C */
#define CUUin	('W'-'@')
#define CUDin	('X'-'@')
#define CUFin	('D'-'@')
#define CUBin	('A'-'@')

/* ANSI Escape Sequenzen an Terminal(-Emulator) */
#define CUUout	"\033[A"
#define CUDout	"\033[B"
#define CUFout	"\033[C"
#define CUBout	"\033[D"

char *text;		/* enthaelt Editortext */
unsigned int tsize;	/* Groesse von text */
char line[128];		/* enthaelt aktuelle Zeile */

int main(int argc, char *argv[]) {
	int c;
	FILE *fp;
	if (argc != 2) {
		cputs("usage: v filename\n");
		exit(1);
	}
	/* HI-TECH-C unter CP/M: Zuerst fopen(), dann malloc(),
	   sonst ist fopen() nicht erfolgreich */
	fp = fopen(argv[1], "r");
	
	for (tsize = 64512; tsize >= 2048; tsize -= 1024) {
		text = (char *)malloc(tsize);
		if (text != NULL) break;
	}
	if (NULL == text) exit(1);
	text[0] = 0;	/* Textspeicher initialisieren */
	printf("text memory is %u bytes\n", tsize);

	if (fp != NULL) {
		while (fgets(line, sizeof(line)-1, fp) != NULL) {
			unsigned len;
			len = strlen(line);
			if (line[len-1] != '\n') {
				cputs("split long line\n");
				strcat(line, "\n");
			}
			/* cputs(line); */
			strcat(text, line);
			if (strlen(text) + 1024 > tsize) {
				cputs("can't load complete file\n");
				break;
			}
		}
		fclose(fp);
	} else {
		cputs("can't open file\n");
	}
	printf("text fill is %u bytes\n", strlen(text));

	system("stty -icanon -echo");
	do {
		c = getch();
		switch (c) {
		case CUUin:
			cputs(CUUout);
			break;
		case CUDin:
			cputs(CUDout);
			break;
		case CUFin:
			cputs(CUFout);
			break;
		case CUBin:
			cputs(CUBout);
			break;
		default:
			if (c >= 32 && c <= 126) {
				putch(c);
			} else {
				printf("<%02x>", c);
			}
			break;
		}
	} while (c != ETX);
	system("stty sane");
	return 0;
}