
/*************************************************************************
**
** Main.c
** Copyright (c) 1995,1996 Daniel Kahlin <tlr@stacken.kth.se>
**
** NOT MACHINE DEPENDENT
**
******/

#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <error.h>
#include <string.h>
#include <ctype.h>

#include "Main_rev.h"

#include "Block.h"
#include "Protocol.h"
#include "Main.h"
#include "o5.h"
#include "config.h"

#include "mach.h"


void o5_Help(char *);


UBYTE	serial=FALSE;

struct O5Config o5config;

ULONG debug=DBG_NONE;

struct table {
	char *tbl_name;
	void (*tbl_func)(char *);
};

struct table command[]={
	{"SIMPLEWRITE",	&o5_SimpleWrite},
	{"SIMPLEREAD",	&o5_SimpleRead},
	{"COPY",			&o5_Copy},
	{"WRITEFILE",&o5_WriteFile},
	{"READFILE",	&o5_ReadFile},
	{"WRITEMEM",	&o5_WriteMem},
	{"READMEM",	&o5_ReadMem},
	{"SYS",	&o5_Sys},
	{"RUN",	&o5_Run},
	{"RESET",	&o5_Reset},
	{"BOOT",	&o5_Boot},
	{"DIR", &o5_Dir},
	{"STATUS",	&o5_Status},
	{"COMMAND",	&o5_Command},
	{"WRITEDISK",&o5_WriteDisk},
	{"WRITEZIP",&o5_WriteZip},
	{"READDISK",	&o5_ReadDisk},
	{"READZIP",	&o5_ReadZip},
	{"TEST",	&o5_Test},
	{"SERVER",	&o5_Server},
	{"HELP",	&o5_Help},
	{"?",	&o5_Help},
	{NULL,NULL}
};

/*************************************************************************
**
** The absolute main....
**
******/
void main(int argc, char **argv[])
{
	int	num,i,fail;
	STRPTR ErrorStr=NULL;
	UBYTE *params=NULL;
	char *name=NULL;
	char *newargstr=NULL;
	void (*func)(char *)=NULL;
	ULONG len=NULL;

	mach_startup();

/*
** set config defaults
** and readconfig file
*/
	o5config.device=8;
	readconfig(CONFIG_FILE, configtable);

/*
**
*/

	if (!(serial=!(ErrorStr=CreateSerial())))
		panic(ErrorStr);

/* get argstring */
	params=mach_getargstr();
	len=strlen(params);
	if (len==0)
		panic("error in args");

/*** skip leading spaces ***/
	for	(i=0; i<len; i++) {
		if (!(isspace(*(params++)))) break;
	}
	params--;

/*** find keyword ***/
	num=0;
	fail=TRUE;
	while (name=command[num].tbl_name) {
		func=command[num].tbl_func;
		if (0==strnicmp((params),name,strlen(name))) {
			params+=strlen(name);	
			fail=FALSE;
			break;
		}
		num++;
	}
	if (fail)
		panic("error in args");

/*** found command prepare to execute ***/
	if (params) {
		newargstr=params;
	} else {
		newargstr="\n";
	}

/*** execute! ***/
	(func)(newargstr);

	closeall(0);
}



/*************************************************************************
**
** closeall
**
******/
void closeall(int ret)
{
	if (serial)	DeleteSerial();
	mach_closeall(ret);

	exit(ret);
}


/*************************************************************************
**
** Panic (new cool with varargs)
**
******/
void panic(char *str, ...)
{
	va_list arglist;

	va_start(arglist,str);

	if (str) {
		printf(PROGRAM_NAME ": ");
		vprintf(str, arglist);
		puts("!");
	}	else
		puts(PROGRAM_NAME ": panic!\n");

	va_end(arglist);

	closeall(1);
}



/*************************************************************************
**
** HELP
**
******/
void o5_Help(char *str)
{
	puts(
"Usage: Over5 COMMAND/A\n"
"where COMMAND is one of the following:\n"
"  HELP, ?, COPY, WRITEFILE, READFILE, WRITEMEM, READMEM, SYS,\n"
"  RUN, RESET, SIMPLEWRITE, SIMPLEREAD, BOOT, DIR, STATUS, COMMAND,\n"
"  TEST, WRITEDISK, WRITEZIP, READDISK, READZIP, SERVER\n"
"use 'Over5 COMMAND/A ?' for more info."
	);
}

/*************************************************************************
**
** Ladda fil till buffer
**
******/
UBYTE *LoadFile(UBYTE *filename)
{
	FILE *fp;
	int size=0;
	char *ptr=NULL;

	if (!(fp=fopen(filename,"rb")))
		panic("couldn't open file");
	fseek(fp,0,SEEK_END);
	size=ftell(fp);
	ptr=jalloc(size);
	fseek(fp,0,SEEK_SET);

	fread(ptr,1,size,fp);
	fclose(fp);

	return(ptr);	
}


/*************************************************************************
**
** spara fil från buffer
**
******/
void SaveFile(UBYTE *filename,UBYTE *ptr,ULONG size)
{
	FILE *fp;

	if (!(fp=fopen(filename,"wb")))
		panic("couldn't open file");
	fwrite(ptr,1,size,fp);
	fclose(fp);

}



/*************************************************************************
**
** Jücklo minnes hantering (kommer ihåg size)
**
** UBYTE *jalloc(LONG)
** void jfree(UBYTE *)
** ULONG jsize(UBYTE *)
**
******/
UBYTE *jalloc(LONG len)
{
	ULONG *ptr;

	if (len<0)
		panic("negative mem");
	if (!(ptr=malloc(len+4)))
		panic("couldn't jalloc");

	setmem(ptr,len+4,0);
	*ptr=len;
	return(((UBYTE *)ptr)+4);
}
/************************************************************************/
void jfree(UBYTE *ptr)
{
	if (!ptr)
		return;
	free(ptr-4);
}
/************************************************************************/
ULONG jsize(UBYTE *ptr)
{
	return(*(ULONG *)(ptr-4));
}


