/* $XFree86$ */
#if (!defined(__CODECONV_H))
#define __CODECONV_H

#define _CCMAJOR 1
#define _CCMINOR 0

#define	MOD_TYPE_CODECONV "CCCV/Character Code ConVerter v1.0"

#define DECLARE_SUBREQ(cconvSubReq) \
static XF86ModReqInfo cconvSubReq = \
{ \
    _XTT_V_MAJOR, \
    _XTT_V_MINOR, \
    _XTT_V_REVISION, \
    ABI_CLASS_ANSIC, \
    ABI_VERS_UNSPEC, \
    MOD_CLASS_FONT \
};

#define CCONVVERSION(name) PREDEFCCONVVERSION(name)
#define PREDEFCCONVVERSION(name) \
static XF86ModuleVersionInfo name ## VersRec = \
{ \
	#name, \
	_XTT_VENDOR_NAME, \
	MODINFOSTRING1, \
	MODINFOSTRING2, \
	XF86_VERSION_CURRENT, \
	_XTT_V_MAJOR, \
	_XTT_V_MINOR, \
	_XTT_V_REVISION, \
	ABI_CLASS_FONT,			/* Font module */ \
	ABI_FONT_VERSION, \
	MOD_CLASS_FONT, \
	{0,0,0,0}       /* signature, to be patched into the file by a tool */ \
};

#define CCONVINIT(name) PREDEFCCONVINIT(name)
#define PREDEFCCONVINIT(name) \
XF86ModuleData \
name ## ModuleData = { \
    & name ## VersRec, \
    name ## Setup, \
    NULL, \
};
/*
#define CCONVINIT(name) PREDEFCCONVINIT(name)
#define PREDEFCCONVINIT(name) \
void \
name ## ModuleInit(XF86ModuleVersionInfo **vers, ModuleSetupProc *setup, \
	      ModuleTearDownProc *teardown) \
{ \
    *vers = & name ## VersRec; \
    *setup = name ## Setup; \
    *teardown = NULL; \
}
*/

#define CCONVSETUP(name) PREDEFCCONVSETUP(name)

#ifdef CCONV_USE_SYMBOLIC_ENTRY_POINT
#define PREDEFCCONVSETUP(name) \
char* name ## _entrypointName = {\
#name\
"_entrypoint"};\
static pointer \
name ## Setup(pointer module, pointer opts, int *errmaj, int *errmin) \
{ \
	ModuleSetupArg *moduleArg = (ModuleSetupArg*)opts; \
	return (pointer)(long) name ## _entrypoint (\
		moduleArg->charSetHints,\
		moduleArg->refCodeConverterInfo,\
		moduleArg->refMapID); \
}
#else
#define PREDEFCCONVSETUP(name) \
static pointer \
name ## Setup(pointer module, pointer opts, int *errmaj, int *errmin) \
{ \
	ModuleSetupArg *moduleArg = (ModuleSetupArg*)opts; \
	return (pointer)(long) name ## _entrypoint (\
		moduleArg->charSetHints,\
		moduleArg->refCodeConverterInfo,\
		moduleArg->refMapID); \
}
#endif

#define CCONV_MODULE_SETUP \
CCONVVERSION(MODNAME) \
CCONVSETUP(MODNAME) \
CCONVINIT(MODNAME)

/* argument for module setup */
typedef struct {
    CharSetSelectionHints const *charSetHints;
    CodeConverterInfo *refCodeConverterInfo;
    int *refMapID;
} ModuleSetupArg;

#endif
