/*
** Ulric Eriksson <ulric@siag.nu>
**
** The author disclaims copyright to this source code.  In place of
** a legal notice, here is a blessing:
**
**    May you do good and not evil.
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "siod.h"

extern long siod_verbose_level;	/* from siodp.h */

extern void init_sdb(void);

/* dummy args for SIOD */
static char *siod_argv[] = {
  "siod",
  "-h30000:10", /* 100000:10 */
  "-g0",
  "-o1000",
  "-s100000",   /* 200000 */
  "-n2048"};
static int siod_argc = sizeof siod_argv / sizeof siod_argv[0];

int main(int argc, char **argv)
{
	int j, xflag = 0, retval = 0;
	char *linebuffer = NULL, *ptr, *iobuff, cmd[1024];

	siod_verbose_level = 1;
	print_welcome();

	for (j = 1; j < argc; ++j) {
		if (strcmp(argv[j], "x") == 0) {
			xflag = 1;
		} else if (strcmp(argv[j], "xx") == 0) {
			xflag = 3;
		} else if (strncmp(argv[j], "-e", 2) == 0) {
			xflag = 2;
			linebuffer = &argv[j][2];
		} else if (!strcmp(argv[j], "-f")) {
			xflag = 4;
			j++;
			linebuffer = argv[j];
		}
	}
#if 0
	process_cla(argc, argv, (xflag) ? 0 : 1);
#else
	process_cla(siod_argc, siod_argv, 1);
#endif
	print_hs_1();
	init_storage();
	init_subrs();
	init_trace();
	init_slibu();
	init_sdb();
	switch (xflag) {
	case 0:
		retval = repl_driver(1, 1, NULL);
		break;
	case 1:
		printf("Using repl_c_string\n");
		linebuffer = (char *) malloc(256);
		while (fgets(linebuffer, 256, stdin)) {
			if ((ptr = strchr(linebuffer, '\n')))
				*ptr = 0;
			retval = repl_c_string(linebuffer, 1, xflag, 0);
			xflag = 0;
		}
		break;
	case 2:
		retval = repl_c_string(linebuffer, 1, xflag, 1);
		break;
	case 3:
		printf("Using repl_c_string I/O case\n");
		linebuffer = (char *) malloc(256);
		iobuff = (char *) malloc(1024);
		while (fgets(linebuffer, 256, stdin)) {
			if ((ptr = strchr(linebuffer, '\n')))
				*ptr = 0;
			sprintf(iobuff, "(*catch 'errobj (begin %s))",
				linebuffer);
			retval = repl_c_string(iobuff, 1, xflag, 1024);
			printf("retval = %d\n%s\n", retval, iobuff);
			xflag = 0;
		}
		break;
	case 4:
		if (!linebuffer) {
			fprintf(stderr, "No filename\n");
			exit(EXIT_FAILURE);
		}
		snprintf(cmd, sizeof cmd, "(load \"%s\")", linebuffer);
		retval = repl_c_string(cmd, 1, xflag, 0);
		break;
	}
	return retval;
}
