/*
** Copyright (c) 2001-2009 Expat maintainers.
**
** Permission is hereby granted, free of charge, to any person obtaining
** a copy of this software and associated documentation files (the
** "Software"), to deal in the Software without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Software, and to
** permit persons to whom the Software is furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#include "expat_68k.h"
#include <exec/emulation.h>
#include <proto/exec.h>
#include <stdarg.h>

static uint32 VARARGS68K call_68k_code (void *code, int num_args, ...) {
	uint32 res = 0;

	va_list vargs;
	va_startlinear(vargs, num_args);
	uint32 *args = va_getlinearva(vargs, uint32 *);

	uint8 *stack = AllocVec(4096, MEMF_SHARED);
	if (stack) {
		uint32 *sp = (uint32 *)(stack + 4096);
		args += num_args;
		while (num_args--) {
			*--sp = *--args;
		}

		res = EmulateTags(code, ET_StackPtr, sp, TAG_END);
		FreeVec(stack);
	}

	va_end(vargs);

	return res;
}

void _68k_startelementhandler(void *userdata, const char *name, const char **attrs) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->startelementhandler, 3, p->handlerarg, name, attrs);
}

void _68k_endelementhandler(void *userdata, const char *name) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->endelementhandler, 2, p->handlerarg, name);
}

void _68k_chardatahandler(void *userdata, const char *s, int len) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->chardatahandler, 3, p->handlerarg, s, len);
}

void _68k_procinsthandler(void *userdata, const char *target, const char *data) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->procinsthandler, 3, p->handlerarg, target, data);
}

void _68k_commenthandler(void *userdata, const char *data) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->commenthandler, 2, p->handlerarg, data);
}

void _68k_startcdatahandler(void *userdata) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->startcdatahandler, 1, p->handlerarg);
}

void _68k_endcdatahandler(void *userdata) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->endcdatahandler, 1, p->handlerarg);
}

void _68k_defaulthandler(void *userdata, const char *s, int len) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->defaulthandler, 3, p->handlerarg, s, len);
}

void _68k_defaulthandlerexp(void *userdata, const char *s, int len) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->defaulthandlerexp, 3, p->handlerarg, s, len);
}

int _68k_extentrefhandler(XML_Parser parser, const char *context, const char *base,
	const char *sysid, const char *pubid)
{
	M68kXML_Parser p = XML_GetUserData(parser);
	void *arg = p->extenthandlerarg;
	return (int)call_68k_code(p->extentrefhandler, 5, arg ? arg : p, context, base, sysid, pubid);
}

int _68k_unknownenchandler(void *enchandlerdata, const char *name, XML_Encoding *info) {
	M68kXML_Parser p = enchandlerdata;
	return (int)call_68k_code(p->unknownenchandler, 3, p->enchandlerarg, name, info);
}

void _68k_startnamespacehandler(void *userdata, const char *prefix, const char *uri) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->startnamespacehandler, 3, p->handlerarg, prefix, uri);
}

void _68k_endnamespacehandler(void *userdata, const char *prefix) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->endnamespacehandler, 2, p->handlerarg, prefix);
}

void _68k_xmldeclhandler(void *userdata, const char *version, const char *encoding, int standalone) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->xmldeclhandler, 4, p->handlerarg, version, encoding, standalone);
}

void _68k_startdoctypehandler(void *userdata, const char *doctypename,
	const char *sysid, const char *pubid, int has_internal_subset)
{
	M68kXML_Parser p = userdata;
	call_68k_code(p->startdoctypehandler, 5, p->handlerarg, doctypename, sysid, pubid, has_internal_subset);
}

void _68k_enddoctypehandler(void *userdata) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->enddoctypehandler, 1, p->handlerarg);
}

void _68k_elementdeclhandler(void *userdata, const char *name, XML_Content *model) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->elementdeclhandler, 3, p->handlerarg, name, model);
}

void _68k_attlistdeclhandler(void *userdata, const char *elname, const char *attname,
	const char *att_type, const char *dflt, int isrequired)
{
	M68kXML_Parser p = userdata;
	call_68k_code(p->attlistdeclhandler, 6, p->handlerarg, elname, attname, att_type, dflt, isrequired);
}

void _68k_entitydeclhandler(void *userdata, const char *entityname, int is_param_entity,
	const char *value, int value_length, const char *base, const char *sysid, const char *pubid,
	const char *notationname)
{
	M68kXML_Parser p = userdata;
	call_68k_code(p->entitydeclhandler, 9, p->handlerarg, entityname, is_param_entity,
		value, value_length, base, sysid, pubid, notationname);
}

void _68k_unparseddeclhandler(void *userdata, const char *entityname, const char *base,
	const char *sysid, const char *pubid, const char *notationname)
{
	M68kXML_Parser p = userdata;
	call_68k_code(p->unparseddeclhandler, 6, p->handlerarg, entityname, base, sysid, pubid, notationname);
}

void _68k_notationdeclhandler(void *userdata, const char *notationname, const char *base,
	const char *sysid, const char *pubid)
{
	M68kXML_Parser p = userdata;
	call_68k_code(p->notationdeclhandler, 5, p->handlerarg, notationname, base, sysid, pubid);
}

int _68k_notstandalonehandler(void *userdata) {
	M68kXML_Parser p = userdata;
	return (int)call_68k_code(p->notstandalonehandler, 1, p->handlerarg);
}

void _68k_skippedentityhandler(void *userdata, const char *entityname, int is_param_entity) {
	M68kXML_Parser p = userdata;
	call_68k_code(p->skippedentityhandler, 3, p->handlerarg, entityname, is_param_entity);
}
