/*
 * Debugging-Hilfe Buggy
 * (c) 1991 by D. Rabich, Dlmen
 * Entwickelt mit und fr Pure C.
 */

#include <aes.h>
#include <tos.h>

#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <ext.h>

#include "buggy.h"

#define	LINES		5
#define	LINELENGTH	30

#define	min(x, y)	(((x) < (y)) ? (x) : (y))

#define	BUGGYMODE	"BUGGYMODE"

static struct
{
	int				mode;
	unsigned int	delay;
	char			name[16];
	char			*copyright;
	char			buffer[2048];
}	_BuggyParms =
{
	B_STDERR,
	5,
	"",
	"@(#) Buggy Version 1.01, (c) Dietmar Rabich, Dlmen, " __DATE__,
	""
};

static size_t strins(char *dest, char *srce)
{
	size_t lend, lens;

	lend	= strlen(dest);
	lens	= strlen(srce);

	memmove(dest + lens, dest, lend + 1);
	memcpy(dest, srce, lens);

	return(lens);
}

void SetBuggyMode(int mode)
{
	_BuggyParms.mode	= mode;
}

void SetBuggyDelay(int delay)
{
	_BuggyParms.delay	= delay;
}

void SetBuggyName(char *s)
{
	strncpy(_BuggyParms.name, s, 15);
	_BuggyParms.name[15]	= 0;
}

void cdecl Buggy(const char *form, ...)
{
	va_list	args;
	size_t	len, slen;
	char	*c;
	FILE	*stream;

	va_start(args, form);
	len	= vsprintf(_BuggyParms.buffer, form, args);
	va_end(args);

	c	= getenv(BUGGYMODE);
	if(c)
	{
		strupr(c);
		if(!strncmp("STDOUT", c, 6))
			_BuggyParms.mode	= B_STDOUT;
		else if(!strncmp("STDERR", c, 6))
			_BuggyParms.mode	= B_STDERR;
		else if(!strncmp("STDAUX", c, 6))
			_BuggyParms.mode	= B_STDAUX;
		else if(!strncmp("STDPRN", c, 6))
			_BuggyParms.mode	= B_STDPRN;
		else if(!strncmp("MIDI", c, 4))
			_BuggyParms.mode	= B_MIDI;
		else if(!strncmp("GEM", c, 3))
			_BuggyParms.mode	= B_GEM;
		else
			_BuggyParms.mode	= B_NULL;
	}

	if(_BuggyParms.name[0])
	{
		len	+= strins(_BuggyParms.buffer, ": ");
		len	+= strins(_BuggyParms.buffer, _BuggyParms.name);
	}

	switch(_BuggyParms.mode)
	{
		case B_STDOUT:
		case B_STDERR:
		case B_STDAUX:
		case B_STDPRN:

			switch(_BuggyParms.mode)
			{
				case B_STDOUT:
					stream	= stdout;
					break;

				case B_STDAUX:
					stream	= stdaux;
					break;

				case B_STDPRN:
					stream	= stdprn;
					break;

				default:
					stream	= stderr;
					break;
			}

			fprintf(stream, "%s\n", _BuggyParms.buffer);
			break;

		case B_MIDI:
			for(c = _BuggyParms.buffer; *c; c++)
			{
				Bconout(3, *c);
				delay(_BuggyParms.delay);
			}
			Bconout(3, '\n');
			break;

		case B_GEM:
			slen = min(LINES * LINELENGTH, len);
			_BuggyParms.buffer[slen] = 0;
			for(c = _BuggyParms.buffer + LINELENGTH;
				c < _BuggyParms.buffer + slen;
				c += LINELENGTH + 1)
				slen += strins(c, "|");

			strins(_BuggyParms.buffer, "[1][");
			strcat(_BuggyParms.buffer, "][OK| Abbruch ]");
			if(form_alert(1, _BuggyParms.buffer) == 2)
				exit(-999);
			break;
	}
}
