Files
2ine-tms34010/native/os2native.h
T
Ryan C. Gordon bee2afe62b Bunch More Work, mostly cleanup and organization.
Wanted to do this now before it gets out of hand.

Ideally, this can be used for a Winelib-like option eventually, too, where you
don't load OS/2 binaries at all but rather compile and link your OS/2-based
source code against this API reimplementation.
2016-09-30 15:58:48 -04:00

61 lines
2.0 KiB
C

#ifndef _INCL_NATIVE_H_
#define _INCL_NATIVE_H_
#include <stdint.h>
#include <stdlib.h>
#include "os2types.h"
#include "os2errors.h"
#include "../lx_loader.h"
#if 1
#define TRACE_NATIVE(...) do { printf("TRACE: "); printf(__VA_ARGS__); printf(";\n"); } while (0)
#else
#define TRACE_NATIVE(...) do {} while (0)
#endif
// !!! FIXME: this is nasty for several reasons.
#define NATIVE_MODULE(modname) \
static LxLoaderState *GLoaderState = NULL
#define NATIVE_REPLACEMENT_TABLE(modname) \
LxModule *loadNativeLxModule(LxLoaderState *state) { \
GLoaderState = state; \
LxModule *retval = (LxModule *) malloc(sizeof (LxModule)); \
if (!retval) goto loadnative_failed; \
memset(retval, '\0', sizeof (LxModule)); \
retval->refcount = 1; \
strcpy(retval->name, modname); \
#define NATIVE_REPLACEMENT(fn, ord) { \
void *ptr = realloc(retval->exported_names, (retval->num_names+1) * sizeof (LxExportedName)); \
if (!ptr) { goto loadnative_failed; } \
retval->exported_names = (LxExportedName *) ptr; \
strcpy(retval->exported_names[retval->num_names].name, #fn); \
retval->exported_names[retval->num_names].addr = (uint32) ((size_t) fn); \
retval->num_names++; \
ptr = realloc(retval->exported_ordinals, (retval->num_ordinals+1) * sizeof (LxExportedOrdinal)); \
if (!ptr) { goto loadnative_failed; } \
retval->exported_ordinals = (LxExportedOrdinal *) ptr; \
retval->exported_ordinals[retval->num_ordinals].ordinal = ord; \
retval->exported_ordinals[retval->num_ordinals].addr = (uint32) ((size_t) fn); \
retval->num_ordinals++; \
}
#define END_NATIVE_REPLACEMENT_TABLE() \
return retval; \
\
loadnative_failed: \
if (retval) { \
free(retval->exported_ordinals); \
free(retval->exported_names); \
free(retval); \
} \
return NULL; \
}
#endif
// end of native.h ...