Home | History | Annotate | Download | only in amiga
      1 /*
      2 ** Copyright (c) 2001-2009 Expat maintainers.
      3 **
      4 ** Permission is hereby granted, free of charge, to any person obtaining
      5 ** a copy of this software and associated documentation files (the
      6 ** "Software"), to deal in the Software without restriction, including
      7 ** without limitation the rights to use, copy, modify, merge, publish,
      8 ** distribute, sublicense, and/or sell copies of the Software, and to
      9 ** permit persons to whom the Software is furnished to do so, subject to
     10 ** the following conditions:
     11 **
     12 ** The above copyright notice and this permission notice shall be included
     13 ** in all copies or substantial portions of the Software.
     14 **
     15 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     16 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     18 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     19 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     20 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     21 ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     22 */
     23 
     24 #ifdef __USE_INLINE__
     25 #undef __USE_INLINE__
     26 #endif
     27 
     28 #include "expat_68k.h"
     29 #include <exec/emulation.h>
     30 #include <proto/exec.h>
     31 #include <stdarg.h>
     32 
     33 static uint32 VARARGS68K call_68k_code (struct ExecIFace *IExec, void *code, int num_args, ...) {
     34 	uint32 res = 0;
     35 
     36 	va_list vargs;
     37 	va_startlinear(vargs, num_args);
     38 	uint32 *args = va_getlinearva(vargs, uint32 *);
     39 
     40 	uint8 *stack = IExec->AllocVec(4096, MEMF_SHARED);
     41 	if (stack) {
     42 		uint32 *sp = (uint32 *)(stack + 4096);
     43 		args += num_args;
     44 		while (num_args--) {
     45 			*--sp = *--args;
     46 		}
     47 
     48 		res = IExec->EmulateTags(code, ET_StackPtr, sp, TAG_END);
     49 		IExec->FreeVec(stack);
     50 	}
     51 
     52 	va_end(vargs);
     53 
     54 	return res;
     55 }
     56 
     57 void _68k_startelementhandler(void *userdata, const char *name, const char **attrs) {
     58 	M68kXML_Parser p = userdata;
     59 	call_68k_code(p->IExec, p->startelementhandler, 3, p->handlerarg, name, attrs);
     60 }
     61 
     62 void _68k_endelementhandler(void *userdata, const char *name) {
     63 	M68kXML_Parser p = userdata;
     64 	call_68k_code(p->IExec, p->endelementhandler, 2, p->handlerarg, name);
     65 }
     66 
     67 void _68k_chardatahandler(void *userdata, const char *s, int len) {
     68 	M68kXML_Parser p = userdata;
     69 	call_68k_code(p->IExec, p->chardatahandler, 3, p->handlerarg, s, len);
     70 }
     71 
     72 void _68k_procinsthandler(void *userdata, const char *target, const char *data) {
     73 	M68kXML_Parser p = userdata;
     74 	call_68k_code(p->IExec, p->procinsthandler, 3, p->handlerarg, target, data);
     75 }
     76 
     77 void _68k_commenthandler(void *userdata, const char *data) {
     78 	M68kXML_Parser p = userdata;
     79 	call_68k_code(p->IExec, p->commenthandler, 2, p->handlerarg, data);
     80 }
     81 
     82 void _68k_startcdatahandler(void *userdata) {
     83 	M68kXML_Parser p = userdata;
     84 	call_68k_code(p->IExec, p->startcdatahandler, 1, p->handlerarg);
     85 }
     86 
     87 void _68k_endcdatahandler(void *userdata) {
     88 	M68kXML_Parser p = userdata;
     89 	call_68k_code(p->IExec, p->endcdatahandler, 1, p->handlerarg);
     90 }
     91 
     92 void _68k_defaulthandler(void *userdata, const char *s, int len) {
     93 	M68kXML_Parser p = userdata;
     94 	call_68k_code(p->IExec, p->defaulthandler, 3, p->handlerarg, s, len);
     95 }
     96 
     97 void _68k_defaulthandlerexp(void *userdata, const char *s, int len) {
     98 	M68kXML_Parser p = userdata;
     99 	call_68k_code(p->IExec, p->defaulthandlerexp, 3, p->handlerarg, s, len);
    100 }
    101 
    102 int _68k_extentrefhandler(XML_Parser parser, const char *context, const char *base,
    103 	const char *sysid, const char *pubid)
    104 {
    105 	M68kXML_Parser p = XML_GetUserData(parser);
    106 	void *arg = p->extenthandlerarg;
    107 	return (int)call_68k_code(p->IExec, p->extentrefhandler, 5, arg ? arg : p, context, base, sysid, pubid);
    108 }
    109 
    110 int _68k_unknownenchandler(void *enchandlerdata, const char *name, XML_Encoding *info) {
    111 	M68kXML_Parser p = enchandlerdata;
    112 	return (int)call_68k_code(p->IExec, p->unknownenchandler, 3, p->enchandlerarg, name, info);
    113 }
    114 
    115 void _68k_startnamespacehandler(void *userdata, const char *prefix, const char *uri) {
    116 	M68kXML_Parser p = userdata;
    117 	call_68k_code(p->IExec, p->startnamespacehandler, 3, p->handlerarg, prefix, uri);
    118 }
    119 
    120 void _68k_endnamespacehandler(void *userdata, const char *prefix) {
    121 	M68kXML_Parser p = userdata;
    122 	call_68k_code(p->IExec, p->endnamespacehandler, 2, p->handlerarg, prefix);
    123 }
    124 
    125 void _68k_xmldeclhandler(void *userdata, const char *version, const char *encoding, int standalone) {
    126 	M68kXML_Parser p = userdata;
    127 	call_68k_code(p->IExec, p->xmldeclhandler, 4, p->handlerarg, version, encoding, standalone);
    128 }
    129 
    130 void _68k_startdoctypehandler(void *userdata, const char *doctypename,
    131 	const char *sysid, const char *pubid, int has_internal_subset)
    132 {
    133 	M68kXML_Parser p = userdata;
    134 	call_68k_code(p->IExec, p->startdoctypehandler, 5, p->handlerarg, doctypename, sysid, pubid, has_internal_subset);
    135 }
    136 
    137 void _68k_enddoctypehandler(void *userdata) {
    138 	M68kXML_Parser p = userdata;
    139 	call_68k_code(p->IExec, p->enddoctypehandler, 1, p->handlerarg);
    140 }
    141 
    142 void _68k_elementdeclhandler(void *userdata, const char *name, XML_Content *model) {
    143 	M68kXML_Parser p = userdata;
    144 	call_68k_code(p->IExec, p->elementdeclhandler, 3, p->handlerarg, name, model);
    145 }
    146 
    147 void _68k_attlistdeclhandler(void *userdata, const char *elname, const char *attname,
    148 	const char *att_type, const char *dflt, int isrequired)
    149 {
    150 	M68kXML_Parser p = userdata;
    151 	call_68k_code(p->IExec, p->attlistdeclhandler, 6, p->handlerarg, elname, attname, att_type, dflt, isrequired);
    152 }
    153 
    154 void _68k_entitydeclhandler(void *userdata, const char *entityname, int is_param_entity,
    155 	const char *value, int value_length, const char *base, const char *sysid, const char *pubid,
    156 	const char *notationname)
    157 {
    158 	M68kXML_Parser p = userdata;
    159 	call_68k_code(p->IExec, p->entitydeclhandler, 9, p->handlerarg, entityname, is_param_entity,
    160 		value, value_length, base, sysid, pubid, notationname);
    161 }
    162 
    163 void _68k_unparseddeclhandler(void *userdata, const char *entityname, const char *base,
    164 	const char *sysid, const char *pubid, const char *notationname)
    165 {
    166 	M68kXML_Parser p = userdata;
    167 	call_68k_code(p->IExec, p->unparseddeclhandler, 6, p->handlerarg, entityname, base, sysid, pubid, notationname);
    168 }
    169 
    170 void _68k_notationdeclhandler(void *userdata, const char *notationname, const char *base,
    171 	const char *sysid, const char *pubid)
    172 {
    173 	M68kXML_Parser p = userdata;
    174 	call_68k_code(p->IExec, p->notationdeclhandler, 5, p->handlerarg, notationname, base, sysid, pubid);
    175 }
    176 
    177 int _68k_notstandalonehandler(void *userdata) {
    178 	M68kXML_Parser p = userdata;
    179 	return (int)call_68k_code(p->IExec, p->notstandalonehandler, 1, p->handlerarg);
    180 }
    181 
    182 void _68k_skippedentityhandler(void *userdata, const char *entityname, int is_param_entity) {
    183 	M68kXML_Parser p = userdata;
    184 	call_68k_code(p->IExec, p->skippedentityhandler, 3, p->handlerarg, entityname, is_param_entity);
    185 }
    186