#!/usr/bin/pike

// This is an experimental prototype program using parts of psyced from pike.
//
// But careful, you need to apply the pikelpc.patch for pike to even grok
// the LPC syntax.

int main(int argc, array(string) args) {
	Stdio.Stat s;
	string f;
	string home = "/opt/psyced";
	array(string) jacks = ({
	    "/local/psyconf.h", "/local/config.h", "/pike",
	    "/world/net/psyc",
	});

	//write("%O: %O\n", argc, args);
	//GTK.setup_gtk();
	//GTK.Alert("Hi!")->signal_connect("destroy", exit, 0);

	if (argc > 1) home = args[1];
	foreach (jacks;; f) {
		if (! (s = file_stat(f = home + f))) {
			write("%s does not exist.\n", f);
			return 1;
		} 
        } 
	add_module_path(home +"/pike");
	//add_include_path(home +"/world"); // doesn't work?
	add_include_path(home +"/world/net/include");
	add_include_path(home +"/world/drivers/pike/include");

	// wicked emulation of the LPC debug_message() efun
	add_constant("debug_write", _static_modules.files()->_stderr->write);

	// the only way to include pathes at runtime without ugly wrapper
	// scripts is to delay the actual program compilation with a compile
	// statement. what a hack to even get started using pike!!  :D
	//
	program psyced = compile("void create() { net.psyced(4444); }");
	//
	// run, baby
	psyced();
	// and don't look back
	return -1;
}

/* nifty stuff from http://pike.oav.net/7.0/tutorial_16.html#16

	add_constant("sqr",lambda(mixed x) { return x * x; });
	void add_program_path(string path);
	mapping (string:mixed) all_constant();
	array array_sscanf(string data, string format);
	void atexit(function callback);
	array(array) backtrace();
	int errno(); 
	int getpid();
	int glob(string glob, string str); or
	array(string) glob(string glob, array(string) arr);
	int query_num_arg();	// for varargs
	mapping replace(mapping a, mixed from, mixed to);
	...search(mapping haystack, mixed needle, [ mixed start ]); // member()

*/ // vim:syntax=pike