annotate ParamHelper/ParamBag.c @ 1:1b61e0c00512

almost working k=3, about to change to k=4
author Sean Halle <seanhalle@yahoo.com>
date Wed, 19 Feb 2014 09:27:10 -0800
parents
children
rev   line source
seanhalle@0 1 /*
seanhalle@0 2 * Copyright 2009 OpenSourceStewardshipFoundation.org
seanhalle@0 3 * Licensed under GNU General Public License version 2
seanhalle@0 4 *
seanhalle@0 5 * Based on code posted to a discussion group on the web. (Forgot to mark
seanhalle@0 6 * down where got it from)
seanhalle@0 7 *
seanhalle@0 8 * Author: seanhalle@yahoo.com
seanhalle@0 9 *
seanhalle@0 10 * Created on November 14, 2009, 9:00 PM
seanhalle@0 11 */
seanhalle@0 12 #include <string.h>
seanhalle@0 13 #include <stdio.h>
seanhalle@0 14 #include <stdlib.h>
seanhalle@0 15
seanhalle@0 16 #include "Param.h"
seanhalle@0 17
seanhalle@0 18 void freeParamStruc( ParamStruc * param );
seanhalle@0 19 void freeParamBagHashEntry( ParamBagHashEntry *entry );
seanhalle@0 20 ParamBagHashEntry * lookupKeyInHash( char *key, ParamBag * bag );
seanhalle@0 21 unsigned int hashThisKey( char *s, int hashSz );
seanhalle@0 22 void nullOutParamBagHashEntries( ParamBag *bag );
seanhalle@0 23
seanhalle@0 24 ParamBag *
seanhalle@0 25 makeParamBag()
seanhalle@0 26 { ParamBag * retBag;
seanhalle@0 27 retBag = malloc( sizeof( ParamBag ) );
seanhalle@0 28 retBag->entries = malloc( PARAM_BAG_HASHSIZE * sizeof( ParamBagHashEntry *) );
seanhalle@0 29 retBag->bagSz = PARAM_BAG_HASHSIZE;
seanhalle@0 30 nullOutParamBagHashEntries( retBag );
seanhalle@0 31
seanhalle@0 32 return retBag;
seanhalle@0 33 }
seanhalle@0 34
seanhalle@0 35 void
seanhalle@0 36 nullOutParamBagHashEntries( ParamBag *bag )
seanhalle@0 37 { int i, bagSz;
seanhalle@0 38 bagSz = bag->bagSz;
seanhalle@0 39 ParamBagHashEntry ** entries = bag->entries;
seanhalle@0 40 for( i = 0; i < bagSz; i++ )
seanhalle@0 41 entries[ i ] = NULL;
seanhalle@0 42 }
seanhalle@0 43
seanhalle@0 44 unsigned int
seanhalle@0 45 hashKey( char *s, int hashSz )
seanhalle@0 46 { unsigned int h = 0;
seanhalle@0 47
seanhalle@0 48 for( ; *s != 0; s++ )
seanhalle@0 49 h = *s + h*31;
seanhalle@0 50 return h % hashSz;
seanhalle@0 51 }
seanhalle@0 52
seanhalle@0 53 /*Need this to be separated out, for use in both getParam and putParam
seanhalle@0 54 */
seanhalle@0 55 ParamBagHashEntry *
seanhalle@0 56 lookupKeyInHash( char *key, ParamBag * bag )
seanhalle@0 57 { unsigned int
seanhalle@0 58 hashIndex = hashKey( key, bag->bagSz );
seanhalle@0 59 ParamBagHashEntry*
seanhalle@0 60 hashEntry = bag->entries[ hashIndex ];
seanhalle@0 61 for( ; hashEntry != NULL; hashEntry = hashEntry->next )
seanhalle@0 62 { if( strcmp( hashEntry->key, key ) == 0 ) return hashEntry;
seanhalle@0 63 }
seanhalle@0 64 return NULL;
seanhalle@0 65 }
seanhalle@0 66
seanhalle@0 67 ParamStruc *
seanhalle@0 68 getParamFromBag( char *key, ParamBag * bag )
seanhalle@0 69 { ParamBagHashEntry *entry;
seanhalle@0 70 entry = lookupKeyInHash( key, bag );
seanhalle@0 71 if( entry == NULL ) return NULL;
seanhalle@0 72
seanhalle@0 73 return entry->param;
seanhalle@0 74 }
seanhalle@0 75
seanhalle@0 76 int
seanhalle@0 77 addParamToBag( char* key, ParamStruc *param, ParamBag *bag )
seanhalle@0 78 { unsigned int hashIdx;
seanhalle@0 79 ParamBagHashEntry* hashEntry;
seanhalle@0 80 hashEntry = lookupKeyInHash( key, bag );
seanhalle@0 81 if( hashEntry == NULL )
seanhalle@0 82 { hashIdx = hashKey( key, bag->bagSz );
seanhalle@0 83 hashEntry = (ParamBagHashEntry*) malloc( sizeof( ParamBagHashEntry ) );
seanhalle@0 84 if( hashEntry == NULL ) return 0;
seanhalle@0 85 hashEntry->key = strdup( key );
seanhalle@0 86 if( hashEntry->key == NULL ) return 0;
seanhalle@0 87 hashEntry->next = (bag->entries)[hashIdx];
seanhalle@0 88 (bag->entries)[hashIdx] = hashEntry;
seanhalle@0 89 }
seanhalle@0 90 else
seanhalle@0 91 { freeParamStruc( hashEntry->param );
seanhalle@0 92 }
seanhalle@0 93 hashEntry->param = param;
seanhalle@0 94 return 1;
seanhalle@0 95 }
seanhalle@0 96
seanhalle@0 97
seanhalle@0 98 void
seanhalle@0 99 freeParamBag( ParamBag *bag )
seanhalle@0 100 { int i;
seanhalle@0 101 ParamBagHashEntry *hashEntry, *temp, **entries;
seanhalle@0 102
seanhalle@0 103 entries = bag->entries;
seanhalle@0 104 for( i=0; i < bag->bagSz; i++ )
seanhalle@0 105 { if( entries[i] != NULL )
seanhalle@0 106 { hashEntry = entries[i];
seanhalle@0 107 while( hashEntry != NULL )
seanhalle@0 108 {
seanhalle@0 109 temp = hashEntry->next;
seanhalle@0 110 freeParamBagHashEntry( hashEntry );
seanhalle@0 111 hashEntry = temp;
seanhalle@0 112 }
seanhalle@0 113 }
seanhalle@0 114 }
seanhalle@0 115 }
seanhalle@0 116
seanhalle@0 117 void
seanhalle@0 118 freeParamBagHashEntry( ParamBagHashEntry *entry )
seanhalle@0 119 {
seanhalle@0 120 freeParamStruc( entry->param );
seanhalle@0 121 free( entry->key ); //was malloc'd above, so free it
seanhalle@0 122 free( entry );
seanhalle@0 123 }
seanhalle@0 124
seanhalle@0 125 void
seanhalle@0 126 freeParamStruc( ParamStruc * param )
seanhalle@0 127 { if( param->type == STRING_PARAM_TYPE ) free( param->strValue );
seanhalle@0 128 free( param );
seanhalle@0 129 }
seanhalle@0 130
seanhalle@0 131 ParamStruc *
seanhalle@0 132 makeParamStruc()
seanhalle@0 133 { ParamStruc *retStruc;
seanhalle@0 134 retStruc = malloc( sizeof( ParamStruc ) );
seanhalle@0 135 retStruc->floatValue = 0.0;
seanhalle@0 136 retStruc->intValue = 0;
seanhalle@0 137 retStruc->strValue = NULL;
seanhalle@0 138
seanhalle@0 139 return retStruc;
seanhalle@0 140 }
seanhalle@0 141
seanhalle@0 142 void
seanhalle@0 143 removeEndWhtSpaceFromStr( char *str )
seanhalle@0 144 { int n;
seanhalle@0 145
seanhalle@0 146 n = strlen ( str );
seanhalle@0 147 while( --n >= 0 )
seanhalle@0 148 {
seanhalle@0 149 if(str[n] != ' ' && str[n] != '\t' && str[n] != '\n' && str[n] != '\r')
seanhalle@0 150 break;
seanhalle@0 151 }
seanhalle@0 152 str[n + 1] = '\0';
seanhalle@0 153 }
seanhalle@0 154
seanhalle@0 155
seanhalle@0 156 ParamStruc *
seanhalle@0 157 makeParamFromStrs( char * type, char *value )
seanhalle@0 158 { ParamStruc *retParam;
seanhalle@0 159 retParam = makeParamStruc();
seanhalle@0 160 switch(*type)
seanhalle@0 161 { case 'i':
seanhalle@0 162 { retParam->type = INT_PARAM_TYPE;
seanhalle@0 163 retParam->intValue = atoi( value );
seanhalle@0 164 } break;
seanhalle@0 165 case 's':
seanhalle@0 166 { retParam->type = STRING_PARAM_TYPE;
seanhalle@0 167 retParam->strValue = malloc( strlen(value) + 1);
seanhalle@0 168 strcpy( retParam->strValue, value );
seanhalle@0 169 removeEndWhtSpaceFromStr( retParam->strValue );
seanhalle@0 170 } break;
seanhalle@0 171 case 'f':
seanhalle@0 172 { retParam->type = FLOAT_PARAM_TYPE;
seanhalle@0 173 retParam->floatValue = atof( value );
seanhalle@0 174 } break;
seanhalle@0 175 }
seanhalle@0 176 return retParam;
seanhalle@0 177 }
seanhalle@0 178
seanhalle@0 179
seanhalle@0 180 /* A pretty useless but good debugging function,
seanhalle@0 181 which simply displays the hashtable in (key.value) pairs
seanhalle@0 182 */
seanhalle@0 183 /*void paramBagToString( ParamBag * bag )
seanhalle@0 184 { int i;
seanhalle@0 185 ParamBagHashEntry *t;
seanhalle@0 186 for( i = 0; i < bag->bagSz; i++ )
seanhalle@0 187 { t = entries[i];
seanhalle@0 188 if( t == NULL )
seanhalle@0 189 strcat_m( retStr, &"()" );
seanhalle@0 190 else
seanhalle@0 191 { strcat_m( retStr, &"(" );
seanhalle@0 192 for( ; t != NULL; t = t->next )
seanhalle@0 193 { strcat_m( retStr, &" " );
seanhalle@0 194 strcat_m( retStr, t->key );
seanhalle@0 195 strcat_m( retStr, &"." );
seanhalle@0 196 strcat_m( retStr, paramToString( t->param ) );
seanhalle@0 197 strcat_m( retStr, &" " );
seanhalle@0 198 }
seanhalle@0 199 strcat_m( retStr, &")" );
seanhalle@0 200 }
seanhalle@0 201 }
seanhalle@0 202 }
seanhalle@0 203 */