diff options
Diffstat (limited to 'Lib/mzscheme')
-rw-r--r-- | Lib/mzscheme/mzrun.swg | 45 | ||||
-rw-r--r-- | Lib/mzscheme/mzscheme.swg | 21 | ||||
-rw-r--r-- | Lib/mzscheme/typemaps.i | 40 |
3 files changed, 86 insertions, 20 deletions
diff --git a/Lib/mzscheme/mzrun.swg b/Lib/mzscheme/mzrun.swg index ea2d9be96..c61214698 100644 --- a/Lib/mzscheme/mzrun.swg +++ b/Lib/mzscheme/mzrun.swg @@ -8,6 +8,7 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <limits.h> #include <escheme.h> #ifdef __cplusplus @@ -46,6 +47,50 @@ extern "C" { #define MAXVALUES 6 #define swig_make_boolean(b) (b ? scheme_true : scheme_false) +static long +SWIG_convert_integer(Scheme_Object *o, + long lower_bound, long upper_bound, + const char *func_name, int argnum, int argc, + Scheme_Object **argv) +{ + long value; + int status = scheme_get_int_val(o, &value); + if (!status) + scheme_wrong_type(func_name, "integer", argnum, argc, argv); + if (value < lower_bound || value > upper_bound) + scheme_wrong_type(func_name, "integer", argnum, argc, argv); + return value; +} + +static int +SWIG_is_integer(Scheme_Object *o) +{ + long value; + return scheme_get_int_val(o, &value); +} + +static unsigned long +SWIG_convert_unsigned_integer(Scheme_Object *o, + unsigned long lower_bound, unsigned long upper_bound, + const char *func_name, int argnum, int argc, + Scheme_Object **argv) +{ + unsigned long value; + int status = scheme_get_unsigned_int_val(o, &value); + if (!status) + scheme_wrong_type(func_name, "integer", argnum, argc, argv); + if (value < lower_bound || value > upper_bound) + scheme_wrong_type(func_name, "integer", argnum, argc, argv); + return value; +} + +static int +SWIG_is_unsigned_integer(Scheme_Object *o) +{ + unsigned long value; + return scheme_get_unsigned_int_val(o, &value); +} + /* ----------------------------------------------------------------------- * mzscheme 30X support code * Contributed by Hans Oesterholt diff --git a/Lib/mzscheme/mzscheme.swg b/Lib/mzscheme/mzscheme.swg index 12ff5794f..cc846c459 100644 --- a/Lib/mzscheme/mzscheme.swg +++ b/Lib/mzscheme/mzscheme.swg @@ -14,6 +14,27 @@ #define SWIG_malloc(size) swig_malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) +#define SWIG_convert_short(o) \ + SWIG_convert_integer(o, - (1 << (8 * sizeof(short) - 1)), \ + (1 << (8 * sizeof(short) - 1)) - 1, \ + FUNC_NAME, $argnum-1, argc, argv) +#define SWIG_convert_int(o) \ + SWIG_convert_integer(o, INT_MIN, INT_MAX, \ + FUNC_NAME, $argnum-1, argc, argv) +#define SWIG_convert_long(o) \ + SWIG_convert_integer(o, LONG_MIN, LONG_MAX, \ + FUNC_NAME, $argnum-1, argc, argv) +#define SWIG_convert_unsigned_short(o) \ + SWIG_convert_unsigned_integer(o, 0, \ + (1 << (8 * sizeof(short))) - 1, \ + FUNC_NAME, $argnum-1, argc, argv) +#define SWIG_convert_unsigned_int(o) \ + SWIG_convert_unsigned_integer(o, 0, UINT_MAX, \ + FUNC_NAME, $argnum-1, argc, argv) +#define SWIG_convert_unsigned_long(o) \ + SWIG_convert_unsigned_integer(o, 0, ULONG_MAX, \ + FUNC_NAME, $argnum-1, argc, argv) + /* Guile compatibility kludges */ #define SCM_VALIDATE_VECTOR(argnum, value) (void)0 #define SCM_VALIDATE_LIST(argnum, value) (void)0 diff --git a/Lib/mzscheme/typemaps.i b/Lib/mzscheme/typemaps.i index 9df763370..aa1e247db 100644 --- a/Lib/mzscheme/typemaps.i +++ b/Lib/mzscheme/typemaps.i @@ -1,5 +1,5 @@ /* typemaps.i --- mzscheme typemaps -*- c -*- - Copyright 2000, 2001, 2004 Matthias Koeppe <mkoeppe@mail.math.uni-magdeburg.de> + Copyright 2000, 2001, 2004, 2006 Matthias Koeppe <mkoeppe@mail.math.uni-magdeburg.de> Based on code written by Oleg Tolmatcev. $Id$ @@ -89,15 +89,15 @@ /* Enums */ %typemap(in) enum SWIGTYPE { - if (!SCHEME_INTP($input)) + if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", $argnum - 1, argc, argv); - $1 = ($1_type) SCHEME_INT_VAL($input); + $1 = ($1_type) SWIG_convert_int($input); } %typemap(varin) enum SWIGTYPE { - if (!SCHEME_INTP($input)) + if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", 0, argc, argv); - $1 = ($1_type) SCHEME_INT_VAL($input); + $1 = ($1_type) SWIG_convert_int($input); } %typemap(out) enum SWIGTYPE "$result = scheme_make_integer_value($1);"; @@ -194,21 +194,21 @@ SIMPLE_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); SIMPLE_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); -SIMPLE_MAP(int, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); -SIMPLE_MAP(short, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); -SIMPLE_MAP(long, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); -SIMPLE_MAP(ptrdiff_t, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(ptrdiff_t, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); -SIMPLE_MAP(unsigned int, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); -SIMPLE_MAP(unsigned short, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); -SIMPLE_MAP(unsigned long, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); -SIMPLE_MAP(size_t, SCHEME_INTP, SCHEME_INT_VAL, +SIMPLE_MAP(size_t, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); @@ -248,17 +248,17 @@ REF_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); REF_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); -REF_MAP(int, SCHEME_INTP, SCHEME_INT_VAL, +REF_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); -REF_MAP(short, SCHEME_INTP, SCHEME_INT_VAL, +REF_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); -REF_MAP(long, SCHEME_INTP, SCHEME_INT_VAL, +REF_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); -REF_MAP(unsigned int, SCHEME_INTP, SCHEME_INT_VAL, +REF_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); -REF_MAP(unsigned short, SCHEME_INTP, SCHEME_INT_VAL, +REF_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); -REF_MAP(unsigned long, SCHEME_INTP, SCHEME_INT_VAL, +REF_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); REF_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); @@ -301,7 +301,7 @@ REF_MAP(double, SCHEME_REALP, scheme_real_to_double, const long long &, const unsigned long long &, enum SWIGTYPE { - $1 = (SCHEME_INTP($input)) ? 1 : 0; + $1 = (SWIG_is_integer($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_BOOL) bool, bool &, const bool & |