/**
***     Additional procedures for ILE/RPG support.
***
***     See Copyright for the status of this software.
***
***     Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
**/

#include <sys/types.h>

#include <stdarg.h>

#include "libxml/xmlmemory.h"
#include "libxml/xpath.h"
#include "libxml/parser.h"

#include "rpgsupport.h"


/**
***     ILE/RPG cannot directly derefence a pointer value an has no macros.
***     The following additional procedures supply these functions.
***     In addition, the following code is adjusted for threads control at
***             compile time via the C macros.
**/

#define THREADED_VAR(name, type)                                        \
                type __get_##name(void) { return name; }                \
                void __set_##name(type arg) { name = arg; }


THREADED_VAR(xmlFree, xmlFreeFunc)

void
__call_xmlFree(void * mem)

{
        xmlFree(mem);
}


THREADED_VAR(xmlMalloc, xmlMallocFunc)

void *
__call_xmlMalloc(size_t size)

{
        return xmlMalloc(size);
}


THREADED_VAR(xmlMallocAtomic, xmlMallocFunc)

void *
__call_xmlMallocAtomic(size_t size)

{
        return xmlMallocAtomic(size);
}


THREADED_VAR(xmlRealloc, xmlReallocFunc)

void *
__call_xmlRealloc(void * mem, size_t size)

{
        return xmlRealloc(mem, size);
}


THREADED_VAR(xmlMemStrdup, xmlStrdupFunc)

char *
__call_xmlMemStrdup(const char * str)

{
        return xmlMemStrdup(str);
}


#ifdef LIBXML_DOCB_ENABLED
THREADED_VAR(docbDefaultSAXHandler, xmlSAXHandlerV1)
#endif


#ifdef LIBXML_HTML_ENABLED
THREADED_VAR(htmlDefaultSAXHandler, xmlSAXHandlerV1)
#endif


THREADED_VAR(xmlLastError, xmlError)

THREADED_VAR(oldXMLWDcompatibility, int)
THREADED_VAR(xmlBufferAllocScheme, xmlBufferAllocationScheme)
THREADED_VAR(xmlDefaultBufferSize, int)
THREADED_VAR(xmlDefaultSAXHandler, xmlSAXHandlerV1)
THREADED_VAR(xmlDefaultSAXLocator, xmlSAXLocator)
THREADED_VAR(xmlDoValidityCheckingDefaultValue, int)

/* No caller to xmlGenericError() because the argument list is unknown. */
THREADED_VAR(xmlGenericError, xmlGenericErrorFunc)


THREADED_VAR(xmlStructuredError, xmlStructuredErrorFunc)

void
__call_xmlStructuredError(void * userData, xmlErrorPtr error)

{
        xmlStructuredError(userData, error);
}

THREADED_VAR(xmlGenericErrorContext, void *)
THREADED_VAR(xmlStructuredErrorContext, void *)
THREADED_VAR(xmlGetWarningsDefaultValue, int)
THREADED_VAR(xmlIndentTreeOutput, int)
THREADED_VAR(xmlTreeIndentString, const char *)
THREADED_VAR(xmlKeepBlanksDefaultValue, int)
THREADED_VAR(xmlLineNumbersDefaultValue, int)
THREADED_VAR(xmlLoadExtDtdDefaultValue, int)
THREADED_VAR(xmlParserDebugEntities, int)
THREADED_VAR(xmlParserVersion, const char *)
THREADED_VAR(xmlPedanticParserDefaultValue, int)
THREADED_VAR(xmlSaveNoEmptyTags, int)
THREADED_VAR(xmlSubstituteEntitiesDefaultValue, int)


THREADED_VAR(xmlRegisterNodeDefaultValue, xmlRegisterNodeFunc)

void
__call_xmlRegisterNodeDefaultValue(xmlNodePtr node)

{
        xmlRegisterNodeDefaultValue(node);
}


THREADED_VAR(xmlDeregisterNodeDefaultValue, xmlDeregisterNodeFunc)

void
__call_xmlDeregisterNodeDefaultValue(xmlNodePtr node)

{
        xmlDeregisterNodeDefaultValue(node);
}


THREADED_VAR(xmlParserInputBufferCreateFilenameValue, xmlParserInputBufferCreateFilenameFunc)

xmlParserInputBufferPtr
__call_xmlParserInputBufferCreateFilenameValue(const char *URI,
                                                        xmlCharEncoding enc)

{
        return xmlParserInputBufferCreateFilenameValue(URI, enc);
}


THREADED_VAR(xmlOutputBufferCreateFilenameValue, xmlOutputBufferCreateFilenameFunc)

xmlOutputBufferPtr
__call_xmlOutputBufferCreateFilenameValue(const char *URI,
                        xmlCharEncodingHandlerPtr encoder, int compression)

{
        return xmlOutputBufferCreateFilenameValue(URI, encoder, compression);
}



/**
***     va_list support.
**/

void
__xmlVaStart(char * * list, char * lastargaddr, size_t lastargsize)

{
        list[1] = lastargaddr + lastargsize;
}


void *
__xmlVaArg(char * * list, void * dest, size_t argsize)

{
        size_t align;

        if (!argsize)
                return (void *) NULL;

        for (align = 16; align > argsize; align >>= 1)
                ;

        align--;
        list[0] = list[1] + (align - (((size_t) list[0] - 1) & align));
        list[1] = list[0] + argsize;

        if (dest)
                memcpy(dest, list[0], argsize);

        return (void *) list[0];
}


void
__xmlVaEnd(char * * list)

{
        /* Nothing to do. */
}


#ifdef LIBXML_XPATH_ENABLED
int
__xmlXPathNodeSetGetLength(xmlNodeSetPtr ns)

{
	return ns? ns->nodeNr: 0;
}


xmlNodePtr
__xmlXPathNodeSetItem(xmlNodeSetPtr ns, int index)

{
	return ns && index >= 0 && index < ns->nodeNr && ns->nodeTab?
	    ns->nodeTab[index]: 0;
}


int
__xmlXPathNodeSetIsEmpty(xmlNodeSetPtr ns)

{
	return !ns || !ns->nodeNr || !ns->nodeTab;
}
#endif
