libclamav/table.c
b151ef55
 /*
  *  Copyright (C) 2002 Nigel Horne <njh@bandsman.co.uk>
  *
  *  This program 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 2 of the License, or
  *  (at your option) any later version.
  *
  *  This program 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 this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
5eeffbb9
 #if HAVE_CONFIG_H
 #include "clamav-config.h"
 #endif
 
 #ifndef	CL_DEBUG
 #define	NDEBUG	/* map CLAMAV debug onto standard */
 #endif
 
b151ef55
 #include <stdlib.h>
 #include <string.h>
 #include <strings.h>
 #include <assert.h>
 
 #include "table.h"
 #include "others.h"
 
 struct table *
 tableCreate(void)
 {
 	return (struct table *)cli_calloc(1, sizeof(struct table));
 }
 
 void
 tableDestroy(table_t *table)
 {
 	tableEntry *tableItem;
 
 	assert(table != NULL);
 
 	tableItem = table->tableHead;
 
 	while(tableItem) {
 		tableEntry *tableNext = tableItem->next;
 
 		assert(tableItem->key != NULL);
 
 		free(tableItem->key);
 		free(tableItem);
 
 		tableItem = tableNext;
 	}
 
 	free(table);
 }
 
 /*
  * Returns the value, or -1 for failure
  */
 int
 tableInsert(table_t *table, const char *key, int value)
 {
 	const int v = tableFind(table, key);
 
 	if(v > 0)	/* duplicate key */
 		return (v == value) ? value : -1;	/* allow real dups */
 
 	assert(value != -1);	/* that would confuse us */
 
 	if(table->tableHead == NULL)
aedb0336
 		table->tableLast = table->tableHead = (tableEntry *)cli_malloc(sizeof(tableEntry));
7b8fb055
 	else
 		table->tableLast = table->tableLast->next =
aedb0336
 			(tableEntry *)cli_malloc(sizeof(tableEntry));
b151ef55
 
4d9c0ca8
 	if(table->tableLast == NULL)
 		return -1;
 
b151ef55
 	table->tableLast->next = NULL;
 	table->tableLast->key = strdup(key);
 	table->tableLast->value = value;
 
 	return value;
 }
 
 /*
  * Returns the value - -1 for not found
  */
 int
 tableFind(const table_t *table, const char *key)
 {
 	const tableEntry *tableItem;
5eeffbb9
 #ifdef	CL_DEBUG
 	int cost;
 #endif
b151ef55
 
 	assert(table != NULL);
 
 	if(key == NULL)
 		return -1;	/* not treated as a fatal error */
 
 	if(table->tableHead == NULL)
 		return -1;	/* not populated yet */
 
3810a396
 #ifdef	CL_DEBUG
5eeffbb9
 	cost = 0;
3810a396
 #endif
5eeffbb9
 
 	for(tableItem = table->tableHead; tableItem; tableItem = tableItem->next) {
 #ifdef	CL_DEBUG
 		cost++;
 #endif
 		if(strcasecmp(tableItem->key, key) == 0) {
 #ifdef	CL_DEBUG
 			cli_dbgmsg("tableFind: Cost of '%s' = %d\n", key, cost);
 #endif
aedb0336
 			return tableItem->value;
5eeffbb9
 		}
 	}
b151ef55
 
 	return -1;	/* not found */
 }