First class data visualization and communication library with embedded devices. Code is maintained at github.com/Overdrivr/Telemetry

Dependents:   telemetry_car_demo telemetry_demo_FRDM-TFC telemetry_example_01 telemetry_indexed_data_demo ... more

Committer:
Overdrivr
Date:
Tue Apr 12 07:40:10 2016 +0000
Revision:
7:d224bddd5405
Release 2.0.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Overdrivr 7:d224bddd5405 1 #include "dictionnary.h"
Overdrivr 7:d224bddd5405 2 #include "stdlib.h"
Overdrivr 7:d224bddd5405 3 #include "stdint.h"
Overdrivr 7:d224bddd5405 4 #include "string.h"
Overdrivr 7:d224bddd5405 5
Overdrivr 7:d224bddd5405 6 /* hash: form hash value for string s */
Overdrivr 7:d224bddd5405 7 unsigned hash(const char * s)
Overdrivr 7:d224bddd5405 8 {
Overdrivr 7:d224bddd5405 9 unsigned hashval;
Overdrivr 7:d224bddd5405 10 for (hashval = 0; *s != '\0'; s++)
Overdrivr 7:d224bddd5405 11 hashval = *s + 31 * hashval;
Overdrivr 7:d224bddd5405 12 return hashval % HASHSIZE;
Overdrivr 7:d224bddd5405 13 }
Overdrivr 7:d224bddd5405 14
Overdrivr 7:d224bddd5405 15 char * strdup(const char * s) /* make a duplicate of s */
Overdrivr 7:d224bddd5405 16 {
Overdrivr 7:d224bddd5405 17 char *p;
Overdrivr 7:d224bddd5405 18 p = (char *) malloc(strlen(s)+1); /* +1 for ’\0’ */
Overdrivr 7:d224bddd5405 19 if (p != NULL)
Overdrivr 7:d224bddd5405 20 strcpy(p, s);
Overdrivr 7:d224bddd5405 21 return p;
Overdrivr 7:d224bddd5405 22 }
Overdrivr 7:d224bddd5405 23
Overdrivr 7:d224bddd5405 24 void init_entry(struct nlist * entry)
Overdrivr 7:d224bddd5405 25 {
Overdrivr 7:d224bddd5405 26 entry->ptr_f32 = NULL;
Overdrivr 7:d224bddd5405 27 entry->ptr_u8 = NULL;
Overdrivr 7:d224bddd5405 28 entry->ptr_u16 = NULL;
Overdrivr 7:d224bddd5405 29 entry->ptr_u32 = NULL;
Overdrivr 7:d224bddd5405 30 entry->ptr_i8 = NULL;
Overdrivr 7:d224bddd5405 31 entry->ptr_i16 = NULL;
Overdrivr 7:d224bddd5405 32 entry->ptr_i32 = NULL;
Overdrivr 7:d224bddd5405 33 entry->ptr_function = NULL;
Overdrivr 7:d224bddd5405 34 }
Overdrivr 7:d224bddd5405 35
Overdrivr 7:d224bddd5405 36 void init_table(struct nlist ** hashtab)
Overdrivr 7:d224bddd5405 37 {
Overdrivr 7:d224bddd5405 38 uint32_t i = 0;
Overdrivr 7:d224bddd5405 39 for(i = 0 ; i < HASHSIZE ; i++)
Overdrivr 7:d224bddd5405 40 {
Overdrivr 7:d224bddd5405 41 hashtab[i] = NULL;
Overdrivr 7:d224bddd5405 42 }
Overdrivr 7:d224bddd5405 43 }
Overdrivr 7:d224bddd5405 44
Overdrivr 7:d224bddd5405 45 /* lookup: look for s in hashtab */
Overdrivr 7:d224bddd5405 46 struct nlist *lookup(struct nlist ** hashtab, const char * key)
Overdrivr 7:d224bddd5405 47 {
Overdrivr 7:d224bddd5405 48 struct nlist *np;
Overdrivr 7:d224bddd5405 49
Overdrivr 7:d224bddd5405 50 for (np = hashtab[hash(key)]; np != NULL; np = np->next)
Overdrivr 7:d224bddd5405 51 {
Overdrivr 7:d224bddd5405 52 if (strcmp(key, np->key) == 0)
Overdrivr 7:d224bddd5405 53 {
Overdrivr 7:d224bddd5405 54 return np; /* found */
Overdrivr 7:d224bddd5405 55 }
Overdrivr 7:d224bddd5405 56 }
Overdrivr 7:d224bddd5405 57 return NULL; /* not found */
Overdrivr 7:d224bddd5405 58 }
Overdrivr 7:d224bddd5405 59
Overdrivr 7:d224bddd5405 60 struct nlist * install(struct nlist ** hashtab, const char * key, void * ptr, ptr_type type)
Overdrivr 7:d224bddd5405 61 {
Overdrivr 7:d224bddd5405 62 struct nlist * np;
Overdrivr 7:d224bddd5405 63 unsigned hashval;
Overdrivr 7:d224bddd5405 64
Overdrivr 7:d224bddd5405 65 if ((np = lookup(hashtab, key)) == NULL)
Overdrivr 7:d224bddd5405 66 {
Overdrivr 7:d224bddd5405 67 // Allocate new hastable entry and initialize it
Overdrivr 7:d224bddd5405 68 np = (struct nlist *) malloc(sizeof(*np));
Overdrivr 7:d224bddd5405 69
Overdrivr 7:d224bddd5405 70 // If allocation failed
Overdrivr 7:d224bddd5405 71 if (np == NULL || (np->key = strdup(key)) == NULL)
Overdrivr 7:d224bddd5405 72 return NULL;
Overdrivr 7:d224bddd5405 73
Overdrivr 7:d224bddd5405 74 init_entry(np);
Overdrivr 7:d224bddd5405 75
Overdrivr 7:d224bddd5405 76 hashval = hash(key);
Overdrivr 7:d224bddd5405 77 np->next = hashtab[hashval];
Overdrivr 7:d224bddd5405 78 hashtab[hashval] = np;
Overdrivr 7:d224bddd5405 79 }
Overdrivr 7:d224bddd5405 80
Overdrivr 7:d224bddd5405 81 // Set value
Overdrivr 7:d224bddd5405 82 switch(type)
Overdrivr 7:d224bddd5405 83 {
Overdrivr 7:d224bddd5405 84 case ptr_f32:
Overdrivr 7:d224bddd5405 85 np->ptr_f32 = (float *)(ptr);
Overdrivr 7:d224bddd5405 86 break;
Overdrivr 7:d224bddd5405 87 case ptr_u8:
Overdrivr 7:d224bddd5405 88 np->ptr_u8 = (uint8_t *)(ptr);
Overdrivr 7:d224bddd5405 89 break;
Overdrivr 7:d224bddd5405 90 case ptr_u16:
Overdrivr 7:d224bddd5405 91 np->ptr_u16 = (uint16_t *)(ptr);
Overdrivr 7:d224bddd5405 92 break;
Overdrivr 7:d224bddd5405 93 case ptr_u32:
Overdrivr 7:d224bddd5405 94 np->ptr_u32 = (uint32_t *)(ptr);
Overdrivr 7:d224bddd5405 95 break;
Overdrivr 7:d224bddd5405 96 case ptr_i8:
Overdrivr 7:d224bddd5405 97 np->ptr_i8 = (int8_t *)(ptr);
Overdrivr 7:d224bddd5405 98 break;
Overdrivr 7:d224bddd5405 99 case ptr_i16:
Overdrivr 7:d224bddd5405 100 np->ptr_i16 = (int16_t *)(ptr);
Overdrivr 7:d224bddd5405 101 break;
Overdrivr 7:d224bddd5405 102 case ptr_i32:
Overdrivr 7:d224bddd5405 103 np->ptr_i32 = (int32_t *)(ptr);
Overdrivr 7:d224bddd5405 104 break;
Overdrivr 7:d224bddd5405 105 case ptr_function:
Overdrivr 7:d224bddd5405 106 np->ptr_function = ptr;
Overdrivr 7:d224bddd5405 107 break;
Overdrivr 7:d224bddd5405 108 }
Overdrivr 7:d224bddd5405 109
Overdrivr 7:d224bddd5405 110 return np;
Overdrivr 7:d224bddd5405 111 }