git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@4312 626c5289-ae23-0410-ae9c-e8d60b6d4f22
375 lines
9.7 KiB
Text
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
|