
// Console dynamic link library. Sample by Ghost

#include "stdio.h" 
#include "string.h" 
#include "mesys.h" 

char* dllname="/rd/1/console.obj";
int i;

char* imports[] = {"START","version","con_init","con_write_asciiz","con_printf","con_exit",NULL};
char* caption = "Console test - colors";

dword (* dll_start)(dword res);
dword* dll_ver;
void stdcall (* con_init)(dword wnd_width, dword wnd_height, dword scr_width, dword scr_height, const char* title);
void stdcall (* con_write_asciiz)(dword flags, const char* string);
void cdecl (* con_printf)(dword flags, const char* format, ...);
void stdcall (* con_exit)(dword bCloseWindow);

struct import{
	char *name;
	void *data;
};

// в библиотеке есть аналогичная функция _msys_cofflib_getproc, но пока она работает не корректно
void* __msys_cofflib_getproc(struct import *lib, char *name){
	int i;
	for(i = 0; lib[i].name && strcmp(name, lib[i].name); i++);
	if(lib[i].name)return lib[i].data;
	else return NULL;
}

void link(struct import *exp, char** imports){
	dll_start = (dword (*)(dword))
		__msys_cofflib_getproc(exp, imports[0]);
	dll_ver = (dword*)
		__msys_cofflib_getproc(exp, imports[1]);
	con_init = (void stdcall (*)(dword , dword, dword, dword, const char*))
		__msys_cofflib_getproc(exp, imports[2]);
	con_write_asciiz = (void stdcall (*)(dword, const char*))
		__msys_cofflib_getproc(exp, imports[3]);
	con_printf = (void cdecl (*)(dword, const char*, ...))
		__msys_cofflib_getproc(exp, imports[4]);
	con_exit = (void stdcall (*)(dword))
		__msys_cofflib_getproc(exp, imports[5]);
}

int main(int argc, char **argv){
	struct import * hDll;

	if((hDll = (struct import *)_msys_cofflib_load(dllname)) == 0){
		debug_out_str("can't load lib\n\r");
		return 1;
	}
	link(hDll, imports);
        debug_out_str("dll loaded\n\r");

	if(dll_start(1) == 0){
		debug_out_str("dll_start failed\n\r");
		return 1;
        }

	con_init(-1, -1, -1, -1, caption);
	for(i = 0; i < 256; i++){
		con_printf(7, "Color 0x%02X: ", i);
		con_write_asciiz(i, "Text sample.");

		con_printf(i, "  printf %s test %d\n", "small", i);
        }

	con_exit(0);
	debug_out_str("all right's ;)\n\r");
}