Moved generic type-checking code to common.swg

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@659 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-08-15 21:28:21 +00:00
commit 3dfabddeee
3 changed files with 142 additions and 234 deletions

View file

@ -6,14 +6,8 @@
* type checking.
*
* Author : David Beazley (beazley@cs.uchicago.edu)
*
* Copyright (c) 1999-2000, The University of Chicago
*
* This file may be freely redistributed without license or fee provided
* this copyright message remains intact.
************************************************************************/
#include <string.h>
#include <stdlib.h>
#ifdef __cplusplus
@ -21,49 +15,6 @@ extern "C" {
#endif
#include "Python.h"
#if defined(_WIN32) || defined(__WIN32__)
# if defined(_MSC_VER)
# if defined(STATIC_LINKED)
# define SWIGEXPORT(a) a
# else
# define SWIGEXPORT(a) __declspec(dllexport) a
# endif
# else
# if defined(__BORLANDC__)
# define SWIGEXPORT(a) a _export
# else
# define SWIGEXPORT(a) a
# endif
#endif
#else
# define SWIGEXPORT(a) a
#endif
#ifdef SWIG_GLOBAL
#define SWIGSTATICRUNTIME(a) SWIGEXPORT(a)
#else
#define SWIGSTATICRUNTIME(a) static a
#endif
/* Type information structure */
typedef struct _swig_type_info {
char *name;
void *(*converter)(void *);
struct _swig_type_info *next;
struct _swig_type_info *prev;
} _swig_type_info;
/* Constant information structure */
typedef struct _swig_const_info {
int type;
char *name;
long lvalue;
double dvalue;
void *pvalue;
_swig_type_info **ptype;
} _swig_const_info;
#define SWIG_PY_INT 1
#define SWIG_PY_FLOAT 2
#define SWIG_PY_STRING 3
@ -73,15 +24,11 @@ typedef struct _swig_const_info {
SWIGEXPORT(PyObject *) SWIG_newvarlink();
SWIGEXPORT(void) SWIG_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *));
SWIGEXPORT(_swig_type_info *) SWIG_TypeRegister(_swig_type_info *);
SWIGEXPORT(_swig_type_info *) SWIG_TypeCheck(char *, _swig_type_info *);
SWIGEXPORT(int) SWIG_ConvertPtr(PyObject *, void **, _swig_type_info *, int);
SWIGEXPORT(void) SWIG_MakePtr(char *c, void *, _swig_type_info *);
SWIGEXPORT(PyObject *) SWIG_NewPointerObj(void *, _swig_type_info *);
SWIGEXPORT(void) SWIG_InstallConstants(PyObject *d, _swig_const_info constants[]);
/* External declarations when using runtime libraries */
#else
/* -----------------------------------------------------------------------------
@ -189,76 +136,6 @@ SWIG_addvarlink(PyObject *p, char *name,
gv->next = v->vars;
v->vars = gv;
}
/* -----------------------------------------------------------------------------
* Pointer type-checking
* ----------------------------------------------------------------------------- */
static _swig_type_info *swig_types = 0;
/* Register type mappings with the type-checker */
SWIGSTATICRUNTIME(_swig_type_info *)
SWIG_TypeRegister(_swig_type_info *ti) {
_swig_type_info *tc, *head, *ret, *next;
/* Check to see if this type has already been registered */
tc = swig_types;
while (tc) {
if (strcmp(tc->name, ti->name) == 0) {
/* Already exists in the table. Just add additional types to the list */
head = tc;
next = tc->next;
goto l1;
}
tc = tc->prev;
}
head = ti;
next = 0;
/* Place in list */
ti->prev = swig_types;
swig_types = ti;
/* Build linked lists */
l1:
ret = head;
tc = ti + 1;
while (tc->name) {
head->next = tc;
tc->prev = head;
head = tc;
tc++;
}
head->next = next;
return ret;
}
/* Check the typename */
SWIGSTATICRUNTIME(_swig_type_info *)
SWIG_TypeCheck(char *c, _swig_type_info *ty) {
_swig_type_info *s;
char *sn;
if (!ty) return 0; /* Void pointer */
s = ty->next; /* First element is always just the name */
while (s) {
sn = s->name;
if ((c == sn) || ((*c == *sn) && (strcmp(sn,c) == 0))) {
if (s == ty->next) return s;
/* Move s to the top of the linked list */
s->prev->next = s->next;
if (s->next) {
s->next->prev = s->prev;
}
/* Insert s as second element in the list */
s->next = ty->next;
if (ty->next) ty->next->prev = s;
ty->next = s;
return s;
}
s = s->next;
}
return 0;
}
/* Convert a pointer value */
SWIGSTATICRUNTIME(int)
SWIG_ConvertPtr(PyObject *obj, void **ptr, _swig_type_info *ty, int flags) {
@ -336,9 +213,7 @@ cobject:
if (ty) {
tc = SWIG_TypeCheck(c,ty);
if (!tc) goto type_error;
if (tc->converter) {
*ptr = (*tc->converter)((void *) p);
}
*ptr = SWIG_TypeCast(tc,p);
}
return 0;