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;
 | 
						|
 |