/* -----------------------------------------------------------------------------
 * pikerun.swg
 *
 * This file contains the runtime support for Pike modules
 * and includes code for managing global variables and pointer
 * type checking.
 * ----------------------------------------------------------------------------- */

#ifdef __cplusplus
extern "C" {
#endif
#include "pike/object.h"
#include "pike/program.h"
#ifdef __cplusplus
}
#endif
#include <assert.h>

/* Stores information about a wrapped object */
typedef struct swig_object_wrapper {
    void *self;
    swig_type_info *type;
} swig_object_wrapper;

#ifdef THIS
#undef THIS
#endif
#define THIS (((swig_object_wrapper *) Pike_fp->current_storage)->self)

#define SWIG_ConvertPtr SWIG_Pike_ConvertPtr
#define SWIG_NewPointerObj SWIG_Pike_NewPointerObj
#define SWIG_GetModule(clientdata) SWIG_Pike_GetModule(clientdata)
#define SWIG_SetModule(clientdata, pointer) SWIG_Pike_SetModule(pointer)

/* These need to be filled in before type sharing between modules will work */
static swig_module_info *SWIG_Pike_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
  return 0;
}

static void SWIG_Pike_SetModule(swig_module_info *pointer) {

}

/* Convert a pointer value */
static int
SWIG_Pike_ConvertPtr(struct object *obj, void **ptr, swig_type_info *ty, int flags) {
    struct program *pr;
    swig_cast_info *tc;
    swig_object_wrapper *obj_wrapper;
    
    if (ty) {
        pr = (struct program *) ty->clientdata;
        obj_wrapper = (swig_object_wrapper *) get_storage(obj, pr);
        if (obj_wrapper && obj_wrapper->type) {
            tc = SWIG_TypeCheckStruct(obj_wrapper->type, ty);
            if (tc) {
                int newmemory = 0;
                *ptr = SWIG_TypeCast(tc, obj_wrapper->self, &newmemory);
                assert(!newmemory); /* newmemory handling not yet implemented */
                return 0;
            }
        }
    }
    return -1;
}

/* Create a new pointer object */
static struct object *
SWIG_Pike_NewPointerObj(void *ptr, swig_type_info *type, int own) {
    return 0;
}
