/***********************************************************************
 *
 *	GDBM interface definitions for GNU Smalltalk 
 *
 *	$Revision: 1.1 $
 *	$Date: 1995/06/05 17:00:08 $
 *	$Author: sbb $
 *
 ***********************************************************************/

/***********************************************************************
 *
 * Copyright (C) 1994, 1995 Free Software Foundation, Inc.
 * Written by Steve Byrne.
 *
 * This file is part of GNU Smalltalk.
 *
 * GNU Smalltalk is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 1, or (at your option) any later 
 * version.
 * 
 * GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
 * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
 *
 ***********************************************************************/

/*
 *    Change Log
 * ============================================================================
 * Author      Date       Change 
 * sbb	     16 Sep 95	  created change log.
 *
 */


#include "gstpub.h"
#include <gdbm.h>

#include <malloc.h>

/* It might be a good idea to have the make file in this directory
 * automatically run configure if it hasn't already been run, to ensure
 * that the definitions in use reflect things which are actually present
 * in the local environment (such as some of the gdbm_ functions which are
 * only present after particular versions) */

/*
     GDBM_FILE gdbm_open(name, block_size, flags, mode, fatal_func);
     void gdbm_close(dbf);
     int gdbm_store(dbf, key, content, flag);
     datum gdbm_fetch(dbf, key);
     int gdbm_delete(dbf, key);
     datum gdbm_firstkey(dbf);
     datum gdbm_nextkey(dbf, key);
     int gdbm_reorganize(dbf);
     void gdbm_sync(dbf); -- new
     int gdbm_exists(dbf, key); not present
     char *gdbm_strerror(errno); -- new 
     int gdbm_setopt(dbf, option, value, size) -- new
*/

int Wrapped_gdbm_store(dbf, key, content, flag)
GDBM_FILE dbf;
datum* key;
datum* content;
int flag;
{
  return gdbm_store(dbf, *key, *content, flag);
}

datum* Wrapped_gdbm_fetch(dbf, key)
GDBM_FILE dbf;
datum* key;
{
  datum* result;
  /* 
     printf("key is %d\n", key->dsize);
     printf("key value is %s\n", key->dptr);
  */
  result = (datum*)malloc(sizeof(datum));
  *result = gdbm_fetch(dbf, *key);
  /*
     printf("result length is %d ptr is %x\n", result->dsize, result->dptr);
  */
  return result;
}

int Wrapped_gdbm_delete(dbf, key)
GDBM_FILE dbf;
datum* key;
{
  return gdbm_delete(dbf, *key);
}

datum* Wrapped_gdbm_firstkey(dbf)
GDBM_FILE dbf;
{
  datum* result;
  result = (datum*)malloc(sizeof(datum));
  *result = gdbm_firstkey(dbf);
  return result;
}

datum* Wrapped_gdbm_nextkey(dbf, key)
GDBM_FILE dbf;
datum* key;
{
  datum* result;
  result = (datum*)malloc(sizeof(datum));
  *result = gdbm_nextkey(dbf, *key);
  return result;
}

/*
int Wrapped_gdbm_exists(dbf, key)
GDBM_FILE dbf;
datum* key;
{
  return gdbm_exists(dbf, *key);
}
*/

void
initGdbm()
{
  /* the use of the Wrapped_ functions is an artifact of the limitation of C
     that you cannot reliably and portably synthesize a function call where
     some of the parameters are by-value structs.  Other than the use of
     pointers to datums instead of by-value datum structures, the signatures
     are identical to the normal gdbm functions */
  defineCFunc("gdbm_open", gdbm_open);
  defineCFunc("gdbm_close", gdbm_close);
  defineCFunc("gdbm_store", Wrapped_gdbm_store);
  defineCFunc("gdbm_fetch", Wrapped_gdbm_fetch);
  defineCFunc("gdbm_delete", Wrapped_gdbm_delete);
  defineCFunc("gdbm_firstkey", Wrapped_gdbm_firstkey);
  defineCFunc("gdbm_nextkey", Wrapped_gdbm_nextkey);
  defineCFunc("gdbm_reorganize", gdbm_reorganize);
/*  defineCFunc("gdbm_sync", gdbm_sync); not universal */
/*  defineCFunc("gdbm_exists", Wrapped_gdbm_exists); */
/*   defineCFunc("gdbm_strerror", gdbm_strerror); not universal */
/*  defineCFunc("gdbm_setopt", gdbm_setopt); not universal */
}
