/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its 
documentation for any purpose and without fee is hereby granted, 
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in 
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

/* System module */

/*
Various bits of information used by the interpreter are collected in
module 'sys'.
Function member:
- exit(sts): raise SystemExit
Data members:
- stdin, stdout, stderr: standard file objects
- modules: the table of modules (dictionary)
- path: module search path (list of strings)
- argv: script arguments (list of strings)
- ps1, ps2: optional primary and secondary prompts (strings)
*/

#include "allobjects.h"

#include "sysmodule.h"
#include "import.h"
#include "modsupport.h"
#include "osdefs.h"

object *sys_trace, *sys_profile;
int sys_checkinterval = 10;

static object *sysdict;

#ifdef NT
extern void *PyWin_DLLhModule;
#endif

object *
sysget(name)
	char *name;
{
	return dictlookup(sysdict, name);
}

FILE *
sysgetfile(name, def)
	char *name;
	FILE *def;
{
	FILE *fp = NULL;
	object *v = sysget(name);
	if (v != NULL && is_fileobject(v))
		fp = getfilefile(v);
	if (fp == NULL)
		fp = def;
	return fp;
}

int
sysset(name, v)
	char *name;
	object *v;
{
	if (v == NULL) {
		if (dictlookup(sysdict, name) == NULL)
			return 0;
		else
			return dictremove(sysdict, name);
	}
	else
		return dictinsert(sysdict, name, v);
}

static object *
sys_exit(self, args)
	object *self;
	object *args;
{
	/* Raise SystemExit so callers may catch it or clean up. */
	err_setval(SystemExit, args);
	return NULL;
}

static object *
sys_settrace(self, args)
	object *self;
	object *args;
{
	if (args == None)
		args = NULL;
	else
		XINCREF(args);
	XDECREF(sys_trace);
	sys_trace = args;
	INCREF(None);
	return None;
}

static object *
sys_setprofile(self, args)
	object *self;
	object *args;
{
	if (args == None)
		args = NULL;
	else
		XINCREF(args);
	XDECREF(sys_profile);
	sys_profile = args;
	INCREF(None);
	return None;
}

static object *
sys_setcheckinterval(self, args)
	object *self;
	object *args;
{
	if (!newgetargs(args, "i", &sys_checkinterval))
		return NULL;
	INCREF(None);
	return None;
}

#ifdef USE_MALLOPT
/* Link with -lmalloc (or -lmpc) on an SGI */
#include <malloc.h>

static object *
sys_mdebug(self, args)
	object *self;
	object *args;
{
	int flag;
	if (!getargs(args, "i", &flag))
		return NULL;
	mallopt(M_DEBUG, flag);
	INCREF(None);
	return None;
}
#endif /* USE_MALLOPT */

static object *
sys_getrefcount(self, args)
	object *self;
	object *args;
{
	object *arg;
	if (!getargs(args, "O", &arg))
		return NULL;
	return newintobject((long) arg->ob_refcnt);
}

#ifdef COUNT_ALLOCS
static PyObject *
sys_getcounts(self, args)
	PyObject *self, *args;
{
	extern PyObject *get_counts Py_PROTO((void));

	if (!PyArg_Parse(args, ""))
		return NULL;
	return get_counts();
}
#endif

#ifdef Py_TRACE_REFS
/* Defined in objects.c because it uses static globals if that file */
extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
#endif

static struct methodlist sys_methods[] = {
	{"exit",	sys_exit, 0},
	{"getrefcount",	sys_getrefcount, 0},
#ifdef COUNT_ALLOCS
	{"getcounts",	sys_getcounts, 0},
#endif
#ifdef Py_TRACE_REFS
	{"getobjects",	_Py_GetObjects, 1},
#endif
#ifdef USE_MALLOPT
	{"mdebug",	sys_mdebug, 0},
#endif
	{"setprofile",	sys_setprofile, 0},
	{"settrace",	sys_settrace, 0},
	{"setcheckinterval",	sys_setcheckinterval, 1},
	{NULL,		NULL}		/* sentinel */
};

static object *sysin, *sysout, *syserr;

static object *
list_builtin_module_names()
{
	object *list = newlistobject(0);
	int i;
	if (list == NULL)
		return NULL;
	for (i = 0; inittab[i].name != NULL; i++) {
		object *name = newstringobject(inittab[i].name);
		if (name == NULL)
			break;
		addlistitem(list, name);
		DECREF(name);
	}
	if (sortlist(list) != 0) {
		DECREF(list);
		list = NULL;
	}
	return list;
}

void
initsys()
{
	extern long getmaxint PROTO((void));
	extern char *getversion PROTO((void));
	extern char *getcopyright PROTO((void));
	extern char *getplatform PROTO((void));
	extern int fclose PROTO((FILE *));
	object *m = initmodule("sys", sys_methods);
	object *v;
	sysdict = getmoduledict(m);
	INCREF(sysdict);
	/* NB keep an extra ref to the std files to avoid closing them
	   when the user deletes them */
	sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
	sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
	syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
	if (err_occurred())
		fatal("can't initialize sys.std{in,out,err}");
	dictinsert(sysdict, "stdin", sysin);
	dictinsert(sysdict, "stdout", sysout);
	dictinsert(sysdict, "stderr", syserr);
	dictinsert(sysdict, "version", v = newstringobject(getversion()));
	XDECREF(v);
	dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
	XDECREF(v);
	dictinsert(sysdict, "platform", v = newstringobject(getplatform()));
	XDECREF(v);
	dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
	XDECREF(v);
	dictinsert(sysdict, "modules", get_modules());
	dictinsert(sysdict, "builtin_module_names",
		   v = list_builtin_module_names());
	XDECREF(v);
#ifdef NT
	dictinsert(sysdict, "dllhandle", v = newintobject((int)PyWin_DLLhModule));
	XDECREF(v);
	dictinsert(sysdict, "winver", v = newstringobject(WIN32_PATCH_LEVEL));
	XDECREF(v);
#endif
	if (err_occurred())
		fatal("can't insert sys.* objects in sys dict");
}

static object *
makepathobject(path, delim)
	char *path;
	int delim;
{
	int i, n;
	char *p;
	object *v, *w;
	
	n = 1;
	p = path;
	while ((p = strchr(p, delim)) != NULL) {
		n++;
		p++;
	}
	v = newlistobject(n);
	if (v == NULL)
		return NULL;
	for (i = 0; ; i++) {
		p = strchr(path, delim);
		if (p == NULL)
			p = strchr(path, '\0'); /* End of string */
		w = newsizedstringobject(path, (int) (p - path));
		if (w == NULL) {
			DECREF(v);
			return NULL;
		}
		setlistitem(v, i, w);
		if (*p == '\0')
			break;
		path = p+1;
	}
	return v;
}

void
setpythonpath(path)
	char *path;
{
	object *v;
	if ((v = makepathobject(path, DELIM)) == NULL)
		fatal("can't create sys.path");
	if (sysset("path", v) != 0)
		fatal("can't assign sys.path");
	DECREF(v);
}

static object *
makeargvobject(argc, argv)
	int argc;
	char **argv;
{
	object *av;
	if (argc <= 0 || argv == NULL) {
		/* Ensure at least one (empty) argument is seen */
		static char *empty_argv[1] = {""};
		argv = empty_argv;
		argc = 1;
	}
	av = newlistobject(argc);
	if (av != NULL) {
		int i;
		for (i = 0; i < argc; i++) {
			object *v = newstringobject(argv[i]);
			if (v == NULL) {
				DECREF(av);
				av = NULL;
				break;
			}
			setlistitem(av, i, v);
		}
	}
	return av;
}

void
setpythonargv(argc, argv)
	int argc;
	char **argv;
{
	object *av = makeargvobject(argc, argv);
	if (av == NULL)
		fatal("no mem for sys.argv");
	if (sysset("argv", av) != 0)
		fatal("can't assign sys.argv");
	DECREF(av);
}
