summaryrefslogtreecommitdiff
path: root/Lib/mzscheme
diff options
context:
space:
mode:
authorMatthias Köppe <mkoeppe@mail.math.uni-magdeburg.de>2006-02-19 19:28:42 +0000
committerMatthias Köppe <mkoeppe@mail.math.uni-magdeburg.de>2006-02-19 19:28:42 +0000
commitb63f275984409e443c00844099045b86c25f3388 (patch)
tree077973890496bdb1c721aa037e47bfb3052b06e8 /Lib/mzscheme
parent4f7aeb6bdbb7e795217e98c39e74f548e4c7c5e8 (diff)
downloadswig-b63f275984409e443c00844099045b86c25f3388.tar.gz
[MzScheme] Typemaps for all integral types now accept the full range
of integral values, and they signal an error when a value outside the valid range is passed. [Guile] Typemaps for all integral types now signal an error when a value outside the valid range is passed. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8844 626c5289-ae23-0410-ae9c-e8d60b6d4f22
Diffstat (limited to 'Lib/mzscheme')
-rw-r--r--Lib/mzscheme/mzrun.swg45
-rw-r--r--Lib/mzscheme/mzscheme.swg21
-rw-r--r--Lib/mzscheme/typemaps.i40
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 &