]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wxSWIG/swig_lib/array.i
Since I have made several changes to SWIG over the years to accomodate
[wxWidgets.git] / wxPython / wxSWIG / swig_lib / array.i
diff --git a/wxPython/wxSWIG/swig_lib/array.i b/wxPython/wxSWIG/swig_lib/array.i
new file mode 100644 (file)
index 0000000..3ae8a8c
--- /dev/null
@@ -0,0 +1,401 @@
+//
+// array.i
+// Dave Beazley
+// November 30, 1996
+//
+// This SWIG library file provides access to C arrays.
+
+%module carray
+
+%section "SWIG C Array Module",info,after,pre,nosort,skip=1,chop_left=3,chop_right=0,chop_top=0,chop_bottom=0
+
+%text %{
+%include array.i
+
+This module provides scripting language access to various kinds of C/C++
+arrays. For each datatype, a collection of four functions are created :
+
+   <type>_array(size)              : Create a new array of given size
+   <type>_get(array, index)        : Get an element from the array
+   <type>_set(array, index, value) : Set an element in the array
+   <type>_destroy(array)           : Destroy an array
+
+The functions in this library are only low-level accessor functions
+designed to directly access C arrays.  Like C, no bounds checking is
+performed so use at your own peril.
+%}
+
+// Grab the SWIG exception library
+
+#ifndef AUTODOC
+%include exception.i
+#endif
+
+// A Typemap used to check input arguments.
+
+%typemap(check) int *, double *, float *, char **, short *, long * {
+  if (!$target) {
+    SWIG_exception(SWIG_ValueError,"Received a NULL Pointer");
+  }
+}
+
+%typemap(ret) int *, double *, float *, char **, short *, long * {
+  if (!$source) {
+    SWIG_exception(SWIG_MemoryError,"Out of memory.");
+  }
+}
+
+// -----------------------------------------------------------------------
+// Integer array support
+// -----------------------------------------------------------------------
+
+%subsection "Integer Arrays"
+%text %{
+The following functions provide access to integer arrays (mapped
+onto the C 'int' datatype. 
+%}
+
+%{
+#include <limits.h>
+
+/* Create a new integer array */
+
+  static int *int_array(int size) {
+#ifdef __cplusplus
+    return new int[size];
+#else
+    return (int *) malloc(size*sizeof(int));
+#endif
+  }
+
+  /* Destroy an integer array */
+
+  static void int_destroy(int *array) {
+    if (array) {
+#ifdef __cplusplus
+      delete array;
+#else
+      free(array);
+#endif
+    }
+  }
+
+  /* Return an element */
+
+  static int int_get(int *array, int index) {
+    if (array) {
+      return array[index];
+    } else {
+      return INT_MIN;
+    }
+  }
+   
+  /* Set an element */
+  
+  static int int_set(int *array, int index, int value) {
+    if (array) {
+      return (array[index] = value);
+    } else {
+      return INT_MIN;
+    }
+  }
+
+%}
+
+int *int_array(int nitems);
+/* Creates a new array of integers. nitems specifies the number of elements.
+   The array is created using malloc() in C and new() in C++. */
+
+void int_destroy(int *array);
+/* Destroys the given array. */
+
+int int_get(int *array, int index);
+/* Returns the value of array[index]. */
+
+int int_set(int *array, int index, int value);
+/* Sets array[index] = value.  Returns value. */
+
+
+// -----------------------------------------------------------------------
+// Floating point
+// -----------------------------------------------------------------------
+
+%subsection "Floating Point Arrays"
+/* The following functions provide access to arrays of floats and doubles. */
+
+
+%{
+  #include <float.h>
+
+  /* Create a new float array */
+
+  static float *float_array(int size) {
+#ifdef __cplusplus
+    return new float[size];
+#else
+    return (float *) malloc(size*sizeof(float));
+#endif
+  }
+
+  /* Destroy an array */
+
+  static void float_destroy(float *array) {
+    if (array) {
+#ifdef __cplusplus
+      delete array;
+#else
+      free(array);
+#endif
+    }
+  }
+
+  /* Return an element */
+
+  static float float_get(float *array, int index) {
+    if (array) {
+      return array[index];
+    } else {
+      return FLT_MIN;
+    }
+  }
+   
+  /* Set an element */
+  
+  static float float_set(float *array, int index, float value) {
+    if (array) {
+      return (array[index] = value);
+    } else {
+      return FLT_MIN;
+    }
+  }
+
+  /* Create a new double array */
+
+  static double *double_array(int size) {
+#ifdef __cplusplus
+    return new double[size];
+#else
+    return (double *) malloc(size*sizeof(double));
+#endif
+  }
+
+  /* Destroy an array */
+
+  static void double_destroy(double *array) {
+    if (array) {
+#ifdef __cplusplus
+      delete array;
+#else
+      free(array);
+#endif
+    }
+  }
+
+  /* Return an element */
+
+  static double double_get(double *array, int index) {
+    if (array) {
+      return array[index];
+    } else {
+      return FLT_MIN;
+    }
+  }
+   
+  /* Set an element */
+  
+  static double double_set(double *array, int index, double value) {
+    if (array) {
+      return (array[index] = value);
+    } else {
+      return FLT_MIN;
+    }
+  }
+
+%}
+
+double *double_array(int nitems);
+/* Creates a new array of doubles. nitems specifies the number of elements.
+   The array is created using malloc() in C and new() in C++. */
+
+void double_destroy(double *array);
+/* Destroys the given array. */
+
+double double_get(double *array, int index);
+/* Returns the value of array[index]. */
+
+double double_set(double *array, int index, double value);
+/* Sets array[index] = value.  Returns value. */
+
+float *float_array(int nitems);
+/* Creates a new array of floats. nitems specifies the number of elements.
+   The array is created using malloc() in C and new() in C++. */
+
+void float_destroy(float *array);
+/* Destroys the given array. */
+
+float float_get(float *array, int index);
+/* Returns the value of array[index]. */
+
+float float_set(float *array, int index, float value);
+/* Sets array[index] = value.  Returns value. */
+
+// -----------------------------------------------------------------------
+// Character strings
+// -----------------------------------------------------------------------
+
+%subsection "String Arrays"
+
+%text %{
+The following functions provide support for the 'char **' datatype.   This
+is primarily used to handle argument lists and other similar structures that
+need to be passed to a C/C++ function.
+%}
+
+#if defined(SWIGTCL)
+%text %{
+To convert from a Tcl list into a 'char **', the following code can be used :
+
+     # $list is a list
+     set args [string_array expr {[llength $list] + 1}]
+     set i 0
+     foreach a $list {
+        string_set $args $i $a
+        incr i 1
+     }
+     string_set $i ""
+     # $args is now a char ** type
+%}
+#elif defined(SWIGPERL)
+
+%text %{
+To convert from a Perl list into a 'char **', code similar to the following
+can be used :
+
+    # @list is a list
+    my $l = scalar(@list);
+    my $args = string_array($l+1);
+    my $i = 0;
+    foreach $arg (@list) {
+        string_set($args,$i,$arg);
+        $i++;
+    }   
+    string_set($args,$i,"");
+
+(of course, there is always more than one way to do it)
+%}
+#elif defined(SWIGPYTHON)
+
+%text %{
+To convert from a Python list to a 'char **', code similar to the following
+can be used :
+
+    # 'list' is a list
+    args = string_array(len(list)+1)
+    for i in range(0,len(list)):
+       string_set(args,i,list[i])
+    string_set(args,len(list),"")
+%}
+
+#endif
+
+%{
+/* Create character string arrays */
+
+static char **string_array(int size) {
+  char **a;
+  int i;
+#ifdef __cplusplus
+  a = new char *[size];
+#else
+  a = (char **) malloc(size*sizeof(char *));
+#endif
+  for (i = 0; i < size; i++)
+    a[i] = 0;
+  return a;
+}
+
+/* Destroy a string array */
+
+static void string_destroy(char **array) {
+  int i = 0;
+  if (array) {
+      while (array[i]) {
+#ifdef __cplusplus
+            delete array[i];
+#else
+            free(array[i]);
+#endif
+            i++;
+      }                
+#ifdef __cplusplus
+     delete array;
+#else
+     free(array);
+#endif
+   }      
+}
+
+/* Get an element */
+
+static char *string_get(char **array_string, int index) {
+  if (array_string) 
+    if (array_string[index]) return (array_string[index]);
+    else return "";
+  else 
+    return "";
+}
+
+/* Set an element */
+
+static char *string_set(char **array_string, int index, char * val) {
+  if (array_string) {
+    if (array_string[index]) {
+#ifdef __cplusplus
+       delete array_string[index];
+#else
+        free(array_string[index]);
+#endif
+    }  
+    if (strlen(val) > 0) {
+#ifdef __cplusplus
+      array_string[index] = new char[strlen(val)+1];
+#else
+      array_string[index] = (char *) malloc(strlen(val)+1);
+#endif
+      strcpy(array_string[index],val);
+      return array_string[index];
+    } else {
+      array_string[index] = 0;
+      return val;
+    }
+  } else return val;
+}
+
+%}
+
+char **string_array(int nitems);
+/* Creates a new array of strings. nitems specifies the number of elements.
+   The array is created using malloc() in C and new() in C++. Each element
+   of the array is set to NULL upon initialization. */
+
+void string_destroy(char **array);
+/* Destroys the given array. Each element of the array is assumed to be
+   a NULL-terminated string allocated with malloc() or new().  All of
+   these strings will be destroyed as well. (It is probably only safe to
+   use this function on an array created by string_array) */
+
+char *string_get(char **array, int index);
+/* Returns the value of array[index]. Returns a string of zero length
+   if the corresponding element is NULL. */
+
+char *string_set(char **array, int index, char *value);
+/* Sets array[index] = value.  value is assumed to be a NULL-terminated
+   string.  A string of zero length is mapped into a NULL value.  When
+   setting the value, the value will be copied into a new string allocated
+   with malloc() or new().  Any previous value in the array will be
+   destroyed. */
+
+
+%typemap(check) int *, double *, float *, char **, short *, long * = PREVIOUS;
+%typemap(out) int *, double *, float *, char **, short *, long * = PREVIOUS;
+