/* -*- C -*- ***********************************************
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 or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.

STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI 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.

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

/*
    This library implements dlopen() - functions for OS/2 using
    DosLoadModule() and company.
*/

#define INCL_DOS
#define INCL_DOSERRORS
#define INCL_DOSSESMGR
#define INCL_WINPROGRAMLIST
#define INCL_WINFRAMEMGR
#include <os2.h>

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

/*-------------------------------------- Unix-like dynamic linking emulation -*/

typedef struct _track_rec {
	char *name;
	HMODULE handle;
	void *id;
	struct _track_rec *next;
} tDLLchain, *DLLchain;

static DLLchain dlload = NULL;		/* A simple chained list of DLL names */
static char dlerr [256];			    /* last error text string */
static void *last_id;

static DLLchain find_id(void *id)
{
	DLLchain tmp;

	for (tmp = dlload; tmp; tmp = tmp->next)
		if (id == tmp->id)
			return (tmp);

	return (NULL);
}

/* load a dynamic-link library and return handle */
void *dlopen (char *filename, int flags)
{
	HMODULE hm;
	DLLchain tmp;
	char err[256];
	char *errtxt;
	int rc = 0, set_chain = 0;

	for (tmp = dlload; tmp; tmp = tmp->next)
		if (strnicmp(tmp->name, filename, 999) == 0)
			break;

	if (!tmp)
	{
		tmp = (DLLchain)malloc (sizeof (tDLLchain));
		if (!tmp)
			goto nomem;
		tmp->name = strdup (filename);
		tmp->next = dlload;
		set_chain = 1;
	}

	switch (rc = DosLoadModule((PSZ)&err, sizeof(err), filename, &hm))
	{
		case NO_ERROR:
			tmp->handle = hm;
			if (set_chain) {
				do {
					last_id++;
				} while ((last_id == 0) || (find_id(last_id)));
				tmp->id = last_id;
				dlload = tmp;
			}
			return (tmp->id);
		case ERROR_FILE_NOT_FOUND:
		case ERROR_PATH_NOT_FOUND:
			errtxt = "module `%s' not found";
			break;
		case ERROR_TOO_MANY_OPEN_FILES:
		case ERROR_NOT_ENOUGH_MEMORY:
		case ERROR_SHARING_BUFFER_EXCEEDED:
nomem:
			errtxt = "out of system resources";
			break;
		case ERROR_ACCESS_DENIED:
			errtxt = "access denied";
			break;
		case ERROR_BAD_FORMAT:
		case ERROR_INVALID_SEGMENT_NUMBER:
		case ERROR_INVALID_ORDINAL:
		case ERROR_INVALID_MODULETYPE:
		case ERROR_INVALID_EXE_SIGNATURE:
		case ERROR_EXE_MARKED_INVALID:
		case ERROR_ITERATED_DATA_EXCEEDS_64K:
		case ERROR_INVALID_MINALLOCSIZE:
		case ERROR_INVALID_SEGDPL:
		case ERROR_AUTODATASEG_EXCEEDS_64K:
		case ERROR_RELOCSRC_CHAIN_EXCEEDS_SEGLIMIT:
			errtxt = "invalid module format";
			break;
		case ERROR_INVALID_NAME:
			errtxt = "filename doesn't match module name";
			break;
		case ERROR_SHARING_VIOLATION:
		case ERROR_LOCK_VIOLATION:
			errtxt = "sharing violation";
			break;
		case ERROR_INIT_ROUTINE_FAILED:
			errtxt = "module initialization failed";
			break;
		default:
			errtxt = "cause `%s', error code = %d";
			break;
	}
	snprintf (dlerr, sizeof (dlerr), errtxt, &err, rc);
	if (tmp) {
		if (tmp->name)
			free(tmp->name);
		free (tmp);
	}
	return (0);
}

/* return a pointer to the `symbol' in DLL */
void *dlsym (void *handle, char *symbol)
{
	int rc = 0;
	PFN addr;
	char *errtxt;
	int symord = 0;
	DLLchain tmp = find_id (handle);

	if (!tmp)
		goto inv_handle;

	if (*symbol == '#')
		symord = atoi (symbol + 1);

	switch (rc = DosQueryProcAddr(tmp->handle, symord, symbol, &addr))
	{
		case NO_ERROR:
			return ((void *)addr);
		case ERROR_INVALID_HANDLE:
inv_handle:
			errtxt = "invalid module handle";
			break;
		case ERROR_PROC_NOT_FOUND:
		case ERROR_INVALID_NAME:
			errtxt = "no symbol `%s' in module";
			break;
		default:
			errtxt = "symbol `%s', error code = %d";
			break;
	}
	snprintf (dlerr, sizeof (dlerr), errtxt, symbol, rc);
	return (NULL);
}

/* free dynamicaly-linked library */
int dlclose (void *handle)
{
	int rc;
	DLLchain tmp = find_id (handle);

	if (!tmp)
		goto inv_handle;

	switch (rc = DosFreeModule (tmp->handle))
	{
		case NO_ERROR:
			free (tmp->name);
			dlload = tmp->next;
			free (tmp);
			return (0);
		case ERROR_INVALID_HANDLE:
inv_handle:
			strcpy(dlerr, "invalid module handle");
			return (-1);
		case ERROR_INVALID_ACCESS:
			strcpy (dlerr, "access denied");
			return (-1);
		default:
			return (-1);
	}
}

/* return a string describing last occured dl error */
char *dlerror()
{
	return (dlerr);
}
