special cases and other things in wxPython, and since I plan on making several more, I've decided to put the SWIG sources in wxPython's CVS instead of relying on maintaining patches. This effectivly becomes a fork of an obsolete version of SWIG, :-( but since SWIG 1.3 still doesn't have some things I rely on in 1.1, not to mention that my custom patches would all have to be redone, I felt that this is the easier road to take. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15307 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			402 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			402 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
| //
 | |
| // 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;
 | |
| 
 |