diff options
| author | root <root@krebs> | 2011-08-20 23:33:40 +0200 |
|---|---|---|
| committer | root <root@krebs> | 2011-08-20 23:33:40 +0200 |
| commit | 6b2cd5bb85d257f432923e22178c0559fe9656aa (patch) | |
| tree | 46f16983868954dd5aec208cdbcfc8466d87eef3 /oncology/dpfhack_display/lcd4linux/.svn/text-base/hash.c.svn-base | |
| parent | a130ff747711005511c33f4c0714550f32e707f2 (diff) | |
lcd4linux: removed trash
Diffstat (limited to 'oncology/dpfhack_display/lcd4linux/.svn/text-base/hash.c.svn-base')
| -rw-r--r-- | oncology/dpfhack_display/lcd4linux/.svn/text-base/hash.c.svn-base | 505 |
1 files changed, 0 insertions, 505 deletions
diff --git a/oncology/dpfhack_display/lcd4linux/.svn/text-base/hash.c.svn-base b/oncology/dpfhack_display/lcd4linux/.svn/text-base/hash.c.svn-base deleted file mode 100644 index a01b6d23..00000000 --- a/oncology/dpfhack_display/lcd4linux/.svn/text-base/hash.c.svn-base +++ /dev/null @@ -1,505 +0,0 @@ -/* $Id$ - * $URL$ - * - * hashes (associative arrays) - * - * Copyright (C) 2003 Michael Reinelt <michael@reinelt.co.at> - * Copyright (C) 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net> - * - * This file is part of LCD4Linux. - * - * LCD4Linux 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, or (at your option) - * any later version. - * - * LCD4Linux 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. - * - */ - -/* - * exported functions: - * - * void hash_create (HASH *Hash); - * initializes hash - * - * int hash_age (HASH *Hash, char *key, char **value); - * return time of last hash_put - * - * void hash_put (HASH *Hash, char *key, char *val); - * set an entry in the hash - * - * void hash_put_delta (HASH *Hash, char *key, char *val); - * set a delta entry in the hash - * - * char *hash_get (HASH *Hash, char *key); - * fetch an entry from the hash - * - * double hash_get_delta (HASH *Hash, char *key, int delay); - * fetch a delta antry from the hash - * - * double hash_get_regex (HASH *Hash, char *key, int delay); - * fetch one or more entries from the hash - * - * void hash_destroy (HASH *Hash); - * releases hash - * - */ - - -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <regex.h> - -#include "debug.h" -#include "hash.h" - -#ifdef WITH_DMALLOC -#include <dmalloc.h> -#endif - -/* number of slots for delta processing */ -#define DELTA_SLOTS 64 - -/* string buffer chunk size */ -#define CHUNK_SIZE 16 - - -/* initialize a new hash table */ -void hash_create(HASH * Hash) -{ - Hash->sorted = 0; - - Hash->timestamp.tv_sec = 0; - Hash->timestamp.tv_usec = 0; - - Hash->nItems = 0; - Hash->Items = NULL; - - Hash->nColumns = 0; - Hash->Columns = NULL; - - Hash->delimiter = strdup(" \t\n"); -} - - -/* bsearch compare function for hash items */ -static int hash_lookup_item(const void *a, const void *b) -{ - char *key = (char *) a; - HASH_ITEM *item = (HASH_ITEM *) b; - - return strcasecmp(key, item->key); -} - - -/* qsort compare function for hash items */ -static int hash_sort_item(const void *a, const void *b) -{ - HASH_ITEM *ha = (HASH_ITEM *) a; - HASH_ITEM *hb = (HASH_ITEM *) b; - - return strcasecmp(ha->key, hb->key); -} - - -/* bsearch compare function for hash headers */ -static int hash_lookup_column(const void *a, const void *b) -{ - char *key = (char *) a; - HASH_COLUMN *column = (HASH_COLUMN *) b; - - return strcasecmp(key, column->key); -} - - -/* qsort compare function for hash headers */ -static int hash_sort_column(const void *a, const void *b) -{ - HASH_COLUMN *ha = (HASH_COLUMN *) a; - HASH_COLUMN *hb = (HASH_COLUMN *) b; - - return strcasecmp(ha->key, hb->key); -} - - -/* split a value into columns and */ -/* return the nth column in a string */ -/* WARNING: does return a pointer to a static string!! */ -static char *split(const char *val, const int column, const char *delimiter) -{ - static char buffer[256]; - int num; - size_t len; - const char *beg, *end; - - if (column < 0) - return (char *) val; - if (val == NULL) - return NULL; - - num = 0; - len = 0; - beg = val; - end = beg; - while (beg && *beg) { - while (strchr(delimiter, *beg)) - beg++; - end = strpbrk(beg, delimiter); - if (num++ == column) - break; - beg = end ? end + 1 : NULL; - } - if (beg != NULL) { - len = end ? (size_t) (end - beg) : strlen(beg); - if (len >= sizeof(buffer)) - len = sizeof(buffer) - 1; - strncpy(buffer, beg, len); - } - - buffer[len] = '\0'; - return buffer; -} - - -/* search an entry in the hash table: */ -/* If the table is flagged "sorted", the entry is looked */ -/* up using the bsearch function. If the table is */ -/* unsorted, it will be searched in a linear way */ -static HASH_ITEM *hash_lookup(HASH * Hash, const char *key, const int do_sort) -{ - HASH_ITEM *Item = NULL; - - /* maybe sort the array */ - if (do_sort && !Hash->sorted) { - qsort(Hash->Items, Hash->nItems, sizeof(HASH_ITEM), hash_sort_item); - Hash->sorted = 1; - } - - /* no key was passed */ - if (key == NULL) - return NULL; - - /* lookup using bsearch */ - if (Hash->sorted) { - Item = bsearch(key, Hash->Items, Hash->nItems, sizeof(HASH_ITEM), hash_lookup_item); - } - - /* linear search */ - if (Item == NULL) { - int i; - for (i = 0; i < Hash->nItems; i++) { - if (strcmp(key, Hash->Items[i].key) == 0) { - Item = &(Hash->Items[i]); - break; - } - } - } - - return Item; - -} - - -/* return the age in milliseconds of an entry from the hash table */ -/* or from the hash table itself if key is NULL */ -/* returns -1 if entry does not exist */ -int hash_age(HASH * Hash, const char *key) -{ - HASH_ITEM *Item; - struct timeval now, *timestamp; - - if (key == NULL) { - timestamp = &(Hash->timestamp); - } else { - Item = hash_lookup(Hash, key, 1); - if (Item == NULL) - return -1; - timestamp = &(Item->Slot[Item->index].timestamp); - } - - gettimeofday(&now, NULL); - - return (now.tv_sec - timestamp->tv_sec) * 1000 + (now.tv_usec - timestamp->tv_usec) / 1000; -} - - -/* add an entry to the column header table */ -void hash_set_column(HASH * Hash, const int number, const char *column) -{ - if (Hash == NULL) - return; - - Hash->nColumns++; - Hash->Columns = realloc(Hash->Columns, Hash->nColumns * sizeof(HASH_COLUMN)); - Hash->Columns[Hash->nColumns - 1].key = strdup(column); - Hash->Columns[Hash->nColumns - 1].val = number; - - qsort(Hash->Columns, Hash->nColumns, sizeof(HASH_COLUMN), hash_sort_column); - -} - - -/* fetch a column number by column header */ -static int hash_get_column(HASH * Hash, const char *key) -{ - HASH_COLUMN *Column; - - if (key == NULL || *key == '\0') - return -1; - - Column = bsearch(key, Hash->Columns, Hash->nColumns, sizeof(HASH_COLUMN), hash_lookup_column); - if (Column == NULL) - return -1; - - return Column->val; -} - - -/* set column delimiters */ -void hash_set_delimiter(HASH * Hash, const char *delimiter) -{ - if (Hash->delimiter != NULL) - free(Hash->delimiter); - Hash->delimiter = strdup(delimiter); -} - - -/* get a string from the hash table */ -char *hash_get(HASH * Hash, const char *key, const char *column) -{ - HASH_ITEM *Item; - int c; - - Item = hash_lookup(Hash, key, 1); - if (Item == NULL) - return NULL; - - c = hash_get_column(Hash, column); - return split(Item->Slot[Item->index].value, c, Hash->delimiter); -} - - -/* get a delta value from the delta table */ -double hash_get_delta(HASH * Hash, const char *key, const char *column, const int delay) -{ - HASH_ITEM *Item; - HASH_SLOT *Slot1, *Slot2; - int i, c; - double v1, v2; - double dv, dt; - struct timeval now, end; - - /* lookup item */ - Item = hash_lookup(Hash, key, 1); - if (Item == NULL) - return 0.0; - - /* this is the "current" Slot */ - Slot1 = &(Item->Slot[Item->index]); - - /* fetch column number */ - c = hash_get_column(Hash, column); - - /* if delay is zero, return absolute value */ - if (delay == 0) - return atof(split(Slot1->value, c, Hash->delimiter)); - - /* prepare timing values */ - now = Slot1->timestamp; - end.tv_sec = now.tv_sec; - end.tv_usec = now.tv_usec - 1000 * delay; - while (end.tv_usec < 0) { - end.tv_sec--; - end.tv_usec += 1000000; - } - - /* search delta slot */ - Slot2 = &(Item->Slot[Item->index]); - for (i = 1; i < Item->nSlot; i++) { - Slot2 = &(Item->Slot[(Item->index + i) % Item->nSlot]); - if (Slot2->timestamp.tv_sec == 0) - break; - if (timercmp(&(Slot2->timestamp), &end, <)) - break; - } - - /* empty slot => try the one before */ - if (Slot2->timestamp.tv_sec == 0) { - i--; - Slot2 = &(Item->Slot[(Item->index + i) % Item->nSlot]); - } - - /* not enough slots available... */ - if (i == 0) - return 0.0; - - /* delta value, delta time */ - v1 = atof(split(Slot1->value, c, Hash->delimiter)); - v2 = atof(split(Slot2->value, c, Hash->delimiter)); - dv = v1 - v2; - dt = (Slot1->timestamp.tv_sec - Slot2->timestamp.tv_sec) - + (Slot1->timestamp.tv_usec - Slot2->timestamp.tv_usec) / 1000000.0; - - if (dt > 0.0 && dv >= 0.0) - return dv / dt; - return 0.0; -} - - -/* get a delta value from the delta table */ -/* key may contain regular expressions, and the sum */ -/* of all matching entries is returned. */ -double hash_get_regex(HASH * Hash, const char *key, const char *column, const int delay) -{ - double sum; - regex_t preg; - int i, err; - - err = regcomp(&preg, key, REG_ICASE | REG_NOSUB); - if (err != 0) { - char buffer[32]; - regerror(err, &preg, buffer, sizeof(buffer)); - error("error in regular expression: %s", buffer); - regfree(&preg); - return 0.0; - } - - /* force the table to be sorted by requesting anything */ - hash_lookup(Hash, NULL, 1); - - sum = 0.0; - for (i = 0; i < Hash->nItems; i++) { - if (regexec(&preg, Hash->Items[i].key, 0, NULL, 0) == 0) { - sum += hash_get_delta(Hash, Hash->Items[i].key, column, delay); - } - } - regfree(&preg); - return sum; -} - - -/* insert a key/val pair into the hash table */ -/* If the entry does already exist, it will be overwritten, */ -/* and the table stays sorted (if it has been before). */ -/* Otherwise, the entry is appended at the end, and */ -/* the table will be flagged 'unsorted' afterwards */ - -static HASH_ITEM *hash_set(HASH * Hash, const char *key, const char *value, const int delta) -{ - HASH_ITEM *Item; - HASH_SLOT *Slot; - int size; - - Item = hash_lookup(Hash, key, 0); - - if (Item == NULL) { - - /* add entry */ - Hash->sorted = 0; - Hash->nItems++; - Hash->Items = realloc(Hash->Items, Hash->nItems * sizeof(HASH_ITEM)); - - Item = &(Hash->Items[Hash->nItems - 1]); - Item->key = strdup(key); - Item->index = 0; - Item->nSlot = delta; - Item->Slot = malloc(Item->nSlot * sizeof(HASH_SLOT)); - memset(Item->Slot, 0, Item->nSlot * sizeof(HASH_SLOT)); - - } else { - - /* maybe enlarge delta table */ - if (Item->nSlot < delta) { - Item->nSlot = delta; - Item->Slot = realloc(Item->Slot, Item->nSlot * sizeof(HASH_SLOT)); - } - - } - - if (Item->nSlot > 1) { - /* move the pointer to the next free slot, wrap around if necessary */ - if (--Item->index < 0) - Item->index = Item->nSlot - 1; - } - - /* create entry */ - Slot = &(Item->Slot[Item->index]); - size = strlen(value) + 1; - - /* maybe enlarge value buffer */ - if (size > Slot->size) { - /* buffer is either empty or too small */ - /* allocate memory in multiples of CHUNK_SIZE */ - Slot->size = CHUNK_SIZE * (size / CHUNK_SIZE + 1); - Slot->value = realloc(Slot->value, Slot->size); - } - - /* set value */ - strcpy(Slot->value, value); - - /* set timestamps */ - gettimeofday(&(Hash->timestamp), NULL); - Slot->timestamp = Hash->timestamp; - - return Item; -} - - -/* insert a string into the hash table */ -/* without delta processing */ -void hash_put(HASH * Hash, const char *key, const char *value) -{ - hash_set(Hash, key, value, 1); -} - - -/* insert a string into the hash table */ -/* with delta processing */ -void hash_put_delta(HASH * Hash, const char *key, const char *value) -{ - hash_set(Hash, key, value, DELTA_SLOTS); -} - - -void hash_destroy(HASH * Hash) -{ - int i; - - if (Hash->Items) { - - /* free all headers */ - for (i = 0; i < Hash->nColumns; i++) { - if (Hash->Columns[i].key) - free(Hash->Columns[i].key); - } - - /* free header table */ - free(Hash->Columns); - - /* free all items */ - for (i = 0; i < Hash->nItems; i++) { - if (Hash->Items[i].key) - free(Hash->Items[i].key); - if (Hash->Items[i].Slot) - free(Hash->Items[i].Slot); - } - - /* free items table */ - free(Hash->Items); - } - - Hash->sorted = 0; - Hash->nItems = 0; - Hash->Items = NULL; -} |
