1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
/*
* db.c - a simple database
* Copyright (C) 1996 by candy
*/
char rcsid_db[] = "$Id: db.c,v 3.6 1996/11/28 09:01:20 candy Exp $";
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "db.h"
#ifdef NO_MEMMOVE
#define memmove(d,s,l) bcopy(s,d,l)
#endif
struct db_t *
db_new(size_t max, int (*comp)(const void *, const void *))
{
struct db_t *db = malloc(sizeof(*db));
if (db != NULL) {
db->db_max = max;
db->db_used = 0;
db->db_comp = comp;
db->db_table = malloc(sizeof(*db->db_table) * max);
if (db->db_table == NULL) {
free(db);
db = NULL;
}
}
return db;
}/* db_new */
void
db_free(struct db_t *db)
{
free(db->db_table);
free(db);
}/* db_free */
void *
db_install(struct db_t *db, const void *data)
{
void *ret = NULL;
if (db->db_used < db->db_max) {
void **tab = db->db_table;
int i = 0;
while (i < db->db_used && db->db_comp(tab[i], data) < 0)
i++;
if (i < db->db_used)
memmove(&tab[i + 1], &tab[i], sizeof(*tab) * (db->db_used - i));
tab[i] = (void *)data;
db->db_used++;
ret = (void *)data;
}
return ret;
}/* db_install */
static int (*cur_comp)(const void *, const void *);
static int
std_comp(const void *d_, const void *s_)
{
void * const *d = d_, * const *s = s_;
return cur_comp(*d, *s);
}/* std_comp */
void *
db_lookup(struct db_t *db, const void *data)
{
void *ret;
cur_comp = db->db_comp;
ret = bsearch(&data, db->db_table, db->db_used, sizeof(*db->db_table), std_comp);
if (ret != NULL)
ret = *(void **)ret;
return ret;
}/* db_lookup */
|