/* swigptr.cfg
 * $Header$
 *
 * This file contains two functions :
 *
 *       void  _swig_make_hex(char *_c, void *_ptr, char *type)
 *       char *_swig_get_hex(char *_c, void **ptr, char *type)
 *
 * These are used to convert pointers to and from pointer strings
 * and to perform type checking.
 *
 * You can remap these functions by making a file called "swigptr.cfg" in
 * your the same directory as the interface file you are wrapping.
 *
 * IMPORTANT !!! the function _swig_get_hex returns a non-null char pointer
 * in the event of a type error (this is used to generate an error message).
 * If a type is successfully parsed, a NULL pointer is returned.
 *
 * $Log$
 * Revision 1.1  2002/04/29 19:56:50  RD
 * Since I have made several changes to SWIG over the years to accomodate
 * 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.
 *
 * Revision 1.1.1.1  1999/02/28 02:00:53  beazley
 * Swig1.1
 *
 * Revision 1.5  1996/08/01 16:28:56  dmb
 * Took out unused "dt" variable.
 *
 * Revision 1.4  1996/07/23 14:38:42  dmb
 * Minor change to handling of NULL pointers.
 *
 * Revision 1.3  1996/07/17 15:26:08  dmb
 * Made a minor bug fix so pointers of form _0_Type could be used
 * (as described in the manual).   Disable by compiling with -DNO_ZERO.
 *
 * Revision 1.2  1996/06/10 23:42:10  beazley
 * Added const qualifier.
 *
# Revision 1.1  1996/05/22  17:17:47  beazley
# Initial revision
#
 */

static void 
_swig_make_hex (char *_c, const void *_ptr, char *type)
{
  static char _hex[16] =
  {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
   'a', 'b', 'c', 'd', 'e', 'f'};
  unsigned long _p, _s;
  char _result[128], *_r;
  _r = _result;
  _p = (unsigned long) _ptr;
  if (_p > 0)
    {
      while (_p > 0)
	{
	  _s = _p & 0xf;
	  *(_r++) = _hex[_s];
	  _p = _p >> 4;
	}
      *_r = '_';
      while (_r >= _result)
	*(_c++) = *(_r--);
    }
  else
    {
      strcpy (_c, "NULL");
    }
  if (_ptr)
    strcpy (_c, type);
}

/* A forward reference; */

static char ***swig_ptr_derived = 0;

static char *
_swig_get_hex (char *_c, void **ptr, char *_t)
{
  unsigned long _p;
  char temp_type[256];
  char *_tt;
  char **eq;
  int i, j, n;
  _p = 0;
  if (*_c == '_')
    {
      _c++;
      while (*_c)
	{
	  if ((*_c >= '0') && (*_c <= '9'))
	    _p = (_p << 4) + (*_c - '0');
	  else if ((*_c >= 'a') && (*_c <= 'f'))
	    _p = (_p << 4) + ((*_c - 'a') + 10);
	  else
	    break;
	  _c++;
	}
#ifdef NO_ZERO
      if (_p == 0)
	{
	  return (char *) _c;
	}
#endif
      _tt = _c;
      if (_t)
	{
	  if (strcmp (_c, _t))
	    {
	      /* Have a type mismatch, we're going to have to do some
	         searching here */
	      i = 0;
	      if (swig_ptr_derived)
		{
		  while (swig_ptr_derived[i])
		    {
		      eq = swig_ptr_derived[i];
		      /* Check type */
		      if (strncmp (_t, eq[0], strlen (eq[0])) == 0)
			{
			  /* Found derived type list for this. */
			  n = strlen (eq[0]);
			  j = 1;
			  while (eq[j])
			    {
			      sprintf (temp_type, "%s%s", eq[j], _t + n);
			      if (strcmp (_c, temp_type) == 0)
				{
				  *ptr = (void *) _p;
				  return (char *) 0;
				}
			      j++;
			    }
			}
		      i++;
		    }
		}
	      *ptr = (void *) _p;
	      return _tt;
	    }
	  else
	    {
	      *ptr = (void *) _p;
	      return (char *) 0;
	    }
	}
      else
	{
	  *ptr = (void *) _p;
	  return (char *) 0;
	}
    }
  else {
#ifdef ALLOW_NULL
      if (strcmp (_c, "NULL") == 0)
	{
	  *ptr = (void *) 0;
	  return (char *) 0;
	}
#endif
      *ptr = (void *) 0;	
      return _c;
    }
}