swig/SWIG/Lib/chicken/chickenrun.swg
Jonah Beckford 870e6457d1 Initial additions.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@4312 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-02-15 01:47:12 +00:00

375 lines
9.7 KiB
Text

/***********************************************************************
* chickenrun.swg
*
* This file contains the runtime support for CHICKEN modules
* and includes code for managing global variables and pointer
* type checking.
*
* Author : Jonah Beckford
* Derived from - file : pyrun.swg
* Derived from - author : David Beazley (beazley@cs.uchicago.edu)
************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
#ifdef C_SIXTY_FOUR
# define WORDS_PER_FLONUM 2
#else
# define WORDS_PER_FLONUM 4
#endif
/* Flags for pointer conversion */
#define SWIG_POINTER_EXCEPTION 0x1
#define C_swig_is_bool(x) C_truep (C_booleanp (x))
#define C_swig_is_char(x) C_truep (C_charp (x))
#define C_swig_is_fixnum(x) C_truep (C_fixnump (x))
#define C_swig_is_flonum(x) (C_truep (C_blockp (x)) && C_truep (C_flonump (x)))
#define C_swig_is_string(x) (C_truep (C_blockp (x)) && C_truep (C_stringp (x)))
#define C_swig_is_vector(x) (C_truep (C_blockp (x)) && C_truep (C_vectorp (x)))
#define C_swig_is_list(x) (C_truep (C_i_listp (x)))
#define C_swig_is_tagged_ptr(x) (C_truep (C_blockp (x)) && C_truep (C_taggedpointerp (x)))
#define C_swig_is_tag_struct(x) (C_truep (C_blockp (x)) && C_truep (C_structurep (x)) && (C_header_size (x) >= 3))
#define C_swig_is_ptr(x) (C_truep (C_blockp (x)) && C_truep (C_pointerp (x)))
enum {
SWIG_BARF1_BAD_ARGUMENT_TYPE /* 1 arg */,
SWIG_BARF1_ARGUMENT_NULL /* 1 arg */
};
typedef struct swig_chicken_clientdata {
void* literal_frame;
C_word tag;
} swig_chicken_clientdata;
#ifdef SWIG_NOINCLUDE
SWIGEXPORT(char *) swig_make_string (C_word string);
SWIGEXPORT(char *) swig_make_string2 (char *data, int len);
SWIGEXPORT(void) swig_barf (int code, C_char *msg, ...) C_noret;
SWIGEXPORT(void) swig_panic (C_char *msg) C_noret;
SWIGEXPORT(int) swig_convert_ptr(C_word , void **,
swig_type_info *, int);
SWIGEXPORT(int) swig_convert_packed(C_word , void *, int sz,
swig_type_info *, int);
SWIGEXPORT(char *) swig_pack_data(char *c, void *, int);
SWIGEXPORT(char *) swig_unpack_data(char *c, void *, int);
SWIGEXPORT(C_word) swig_new_pointer_obj(void *, swig_type_info *,
int own);
SWIGEXPORT(C_word) swig_new_packed_obj(void *, int sz,
swig_type_info *);
#else
/* Allocate a zero-terminated string. No error-checking. */
SWIGRUNTIME(char *)
swig_make_string2 (char *data, int len)
{
char *ret;
if (data == NULL) return NULL;
ret = (char *) malloc (len + 1);
strncpy (ret, data, len);
ret [len] = 0;
return ret;
}
/* Allocate a zero-terminated string. No error-checking. */
SWIGRUNTIME(char *)
swig_make_string (C_word string)
{
return swig_make_string2 (C_c_string (string),
C_header_size (string));
}
SWIGRUNTIME(void) swig_panic (C_char *) C_noret;
SWIGRUNTIME(void)
swig_panic (C_char *msg)
{
C_word *a = C_alloc (C_SIZEOF_STRING (strlen (msg)));
C_word scmmsg = C_string2 (&a, msg);
C_halt (scmmsg);
exit (5); /* should never get here */
}
SWIGRUNTIME(void) swig_barf (int, C_char *, ...) C_noret;
SWIGRUNTIME(void)
swig_barf (int code, C_char *msg, ...)
{
char *errorhook = C_text("\003syserror-hook");
C_word *a = C_alloc (C_SIZEOF_STRING (strlen (errorhook)));
C_word err = C_intern2 (&a, errorhook);
int c = -1;
int i, barfval;
va_list v;
C_temporary_stack = C_temporary_stack_bottom;
err = C_block_item(err, 0);
if(C_immediatep (err))
swig_panic (C_text ("`##sys#error-hook' is not defined"));
switch (code) {
case SWIG_BARF1_BAD_ARGUMENT_TYPE:
barfval = C_BAD_ARGUMENT_TYPE_ERROR;
c = 1;
break;
case SWIG_BARF1_ARGUMENT_NULL:
barfval = C_BAD_ARGUMENT_TYPE_ERROR;
c = 1;
break;
default:
swig_panic (C_text (msg));
};
if(c > 0 && !C_immediatep (err)) {
C_save (C_fix (barfval));
i = c;
if (i) {
C_word *b = C_alloc (C_SIZEOF_STRING (strlen (msg)));
C_word scmmsg = C_string2 (&b, msg);
C_save (scmmsg);
i--;
}
va_start (v, msg);
while(i--)
C_save (va_arg (v, C_word));
va_end (v);
C_do_apply (c + 1, err,
C_SCHEME_UNDEFINED); /* <- no continuation is passed:
'##sys#error-hook' may not
return! */
}
else if (msg) {
swig_panic (msg);
}
else {
swig_panic (C_text ("unspecified panic"));
}
}
/* Pack binary data into a string */
SWIGRUNTIME(char *)
swig_pack_data(char *c, void *ptr, int sz) {
static char hex[17] = "0123456789abcdef";
int i;
unsigned char *u = (unsigned char *) ptr;
register unsigned char uu;
for (i = 0; i < sz; i++,u++) {
uu = *u;
*(c++) = hex[(uu & 0xf0) >> 4];
*(c++) = hex[uu & 0xf];
}
return c;
}
/* Unpack binary data from a string */
SWIGRUNTIME(char *)
swig_unpack_data(char *c, void *ptr, int sz) {
register unsigned char uu = 0;
register int d;
unsigned char *u = (unsigned char *) ptr;
int i;
for (i = 0; i < sz; i++, u++) {
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu = ((d - '0') << 4);
else if ((d >= 'a') && (d <= 'f'))
uu = ((d - ('a'-10)) << 4);
d = *(c++);
if ((d >= '0') && (d <= '9'))
uu |= (d - '0');
else if ((d >= 'a') && (d <= 'f'))
uu |= (d - ('a'-10));
*u = uu;
}
return c;
}
/* Convert a pointer value */
SWIGRUNTIME(int)
swig_convert_ptr(C_word obj, void **ptr, swig_type_info *ty, int flags) {
swig_type_info *tc;
#ifdef SWIG_POINTER_AS_STRING
char *s;
char *c;
if (obj == C_SCHEME_FALSE) {
*ptr = 0;
return 0;
}
c = s = 0;
if (!(C_swig_is_string (obj))) goto type_error;
s = c = swig_make_string (obj);
if (!c) goto type_error;
/* Pointer values must start with leading underscore */
if (*c != '_') goto type_error;
c++;
c = swig_unpack_data (c,ptr,sizeof(void *));
if (ty) {
tc = SWIG_TypeCheck(c,ty);
if (!tc) goto type_error;
*ptr = SWIG_TypeCast(tc,(void*) *ptr);
}
free (s);
#else
C_word tag;
C_word tag_ptr;
if (obj == C_SCHEME_FALSE) {
*ptr = 0;
return 0;
}
if (!(C_swig_is_tagged_ptr (obj))) goto type_error;
*ptr = (void*) C_pointer_address (obj);
if (ty) {
tag = C_block_item (obj, 1);
if (!(C_swig_is_tag_struct (tag))) goto type_error;
tag_ptr = C_block_item (tag, 3);
if (!(C_swig_is_ptr (tag_ptr))) goto type_error;
tc = (swig_type_info *) C_pointer_address (tag_ptr);
if (!tc) goto type_error;
*ptr = SWIG_TypeCast(tc,(void*) *ptr);
}
#endif
return 0;
type_error:
#ifdef SWIG_POINTER_AS_STRING
if (s) { free (s); }
#endif
if (flags & SWIG_POINTER_EXCEPTION) {
if (ty) {
char *temp = (char *) malloc(64+strlen(ty->name));
sprintf(temp,"Type error. Expected %s", ty->name);
swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, temp);
free((char *) temp);
} else {
swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Expected a pointer");
}
}
return -1;
}
/* Convert a packed value */
SWIGRUNTIME(int)
swig_convert_packed(C_word obj, void *ptr, int sz, swig_type_info *ty, int flags) {
swig_type_info *tc;
char *c;
char *s;
if (!C_swig_is_string (obj)) goto type_error;
s = c = swig_make_string (obj);
/* Pointer values must start with leading underscore */
if (!c || *c != '_') goto type_error;
c++;
c = swig_unpack_data(c,ptr,sz);
if (ty) {
tc = SWIG_TypeCheck(c,ty);
if (!tc) goto type_error;
}
free (s);
return 0;
type_error:
free (s);
if (flags) {
if (ty) {
char *temp = (char *) malloc(64+strlen(ty->name));
sprintf(temp,"Type error. Expected %s", ty->name);
swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, temp);
free((char *) temp);
} else {
swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Expected a pointer");
}
}
return -1;
}
#define SWIG_STRLEN_PACKED_OBJ(obj_sz,name) (2*obj_sz+1+strlen(name))
#define SWIG_ALLOCSZ_PACKED_OBJ(obj_sz,name) (C_SIZEOF_STRING (SWIG_STRLEN_PACKED_OBJ (obj_sz,name)))
/* #define SWIG_ALLOCSZ_POINTER(name) SWIG_ALLOCSZ_PACKED_OBJ(sizeof(void*),name) */
#define SWIG_ALLOCSZ_POINTER(name) 3
/* Create a new pointer object. 'a' should be a pointer to some
C_alloc result with SWIG_ALLOCSZ_POINTER (type->name) room */
SWIGRUNTIME(C_word)
swig_new_pointer_obj(void *ptr, C_word **a, swig_type_info *type) {
if (ptr == NULL)
return C_SCHEME_FALSE;
#ifdef SWIG_POINTER_AS_STRING
{
char result[1024];
char *r = result;
*(r++) = '_';
r = swig_pack_data(r,&ptr,sizeof(void *));
strcpy(r,type->name);
return C_string2 (a, result);
}
#else
{
/* similar to C_mpointer */
C_word *p = *a,
*p0 = p;
*(p++) = C_TAGGED_POINTER_TAG;
*((void **)(p++)) = ptr;
C_mutate ((C_word*)(p++),
((swig_chicken_clientdata*) type->clientdata)->tag);
*a = p;
return (C_word)p0;
}
#endif
}
/* 'a' should be a pointer to some C_alloc result with
SWIG_ALLOCSZ_PACKED_OBJ (sz,type->name) room */
SWIGRUNTIME(C_word)
swig_new_packed_obj (void *ptr, C_word **a, int sz, swig_type_info *type) {
char result[1024];
char *r = result;
if (SWIG_STRLEN_PACKED_OBJ (sz, type->name) > 1000) return 0;
*(r++) = '_';
r = swig_pack_data(r,ptr,sz);
strcpy(r,type->name);
return C_string2 (a, result);
}
/* Standard Chicken function */
static void C_fcall swig_tr2(C_proc2 k) C_regparm C_noret;
static void C_fcall swig_tr2(C_proc2 k) {
C_word t1=C_pick(0);
C_word t0=C_pick(1);
C_adjust_stack(-2);
(k)(2,t0,t1);
}
/* Standard Chicken function */
static void C_fcall swig_tr2r(C_proc2 k) C_regparm C_noret;
static void C_fcall swig_tr2r(C_proc2 k) {
int n;
C_word *a,t2;
C_word t1=C_pick(0);
C_word t0=C_pick(1);
C_adjust_stack(-2);
n=C_rest_count(0);
a=C_alloc(n*3);
t2=C_restore_rest(a,n);
(k)(t0,t1,t2);
}
#endif
#ifdef __cplusplus
}
#endif