Doxygen Source Code Documentation
niml_htable.c File Reference
#include "niml_private.h"
Go to the source code of this file.
Defines | |
#define | UINT unsigned int |
#define | INLINE |
Functions | |
void | Htable_set_vtkill (int vt) |
INLINE UINT | hashkey (char *str) |
Htable * | new_Htable (int len) |
void | destroy_Htable (Htable *ht) |
void * | findin_Htable (char *str, Htable *ht) |
void | addto_Htable (char *str, void *vpt, Htable *ht) |
void | removefrom_Htable (char *str, Htable *ht) |
void | profile_Htable (char *str, Htable *ht) |
void | subsume_Htable (Htable *htold, Htable *htnew) |
void | resize_Htable (int newlen, Htable *ht) |
Variables | |
int | vtkill = 0 |
Define Documentation
|
Definition at line 14 of file niml_htable.c. Referenced by hashkey(). |
|
Definition at line 8 of file niml_htable.c. Referenced by addto_Htable(), findin_Htable(), hashkey(), and removefrom_Htable(). |
Function Documentation
|
Add a string/pointer pair to a hash table.
Definition at line 129 of file niml_htable.c. References calloc, Htable::ctab, free, hashkey(), key, Htable::len, Htable::ntab, Htable::ntot, realloc, removefrom_Htable(), UINT, Htable::vtab, and vtkill. Referenced by addto_Dtable(), NI_register_struct(), NI_registry_add(), NI_registry_malloc(), NI_registry_realloc(), NI_registry_replace(), subsume_Htable(), and THD_init_session().
00130 { 00131 UINT jj ; 00132 int kk , ll=-1 ; 00133 char *key ; 00134 00135 /* check for bad inputs */ 00136 00137 if( str == NULL || ht == NULL ) return ; 00138 00139 if( vpt == NULL ){ removefrom_Htable( str , ht ) ; return ; } 00140 00141 jj = hashkey(str) % ht->len ; /* hash table row */ 00142 00143 key = strdup(str) ; /* internal key string */ 00144 00145 if( ht->vtab[jj] == NULL ){ /* create this row in table */ 00146 00147 ht->vtab[jj] = (void **) calloc(3,sizeof(void *)) ; 00148 ht->ctab[jj] = (char **) calloc(3,sizeof(char *)) ; 00149 ht->ntab[jj] = 3 ; /* made 2 extra entries */ 00150 00151 ht->vtab[jj][0] = vpt ; /* save pointer */ 00152 ht->ctab[jj][0] = key ; /* save key string */ 00153 ht->ntot ++ ; /* 1 more in table */ 00154 00155 } else { /* search this row */ 00156 00157 for( kk=0 ; kk < ht->ntab[jj] ; kk++ ){ 00158 if( ht->ctab[jj][kk] == NULL ){ if(ll < 0) ll=kk; } /* add here? */ 00159 else if( strcmp(key,ht->ctab[jj][kk]) == 0 ) break ; /* found it? */ 00160 } 00161 00162 if( kk == ht->ntab[jj] ){ /* didn't find str in row already */ 00163 00164 if( ll >= 0 ){ /* have a NULL slot from scan above */ 00165 00166 ht->vtab[jj][ll] = vpt ; /* save ptr */ 00167 ht->ctab[jj][ll] = key ; /* save key string */ 00168 ht->ntot ++ ; /* 1 more in table */ 00169 00170 } else { /* must make row longer */ 00171 00172 ht->vtab[jj] = (void **) realloc( ht->vtab[jj] , (kk+3)*sizeof(void *)) ; 00173 ht->ctab[jj] = (char **) realloc( ht->ctab[jj] , (kk+3)*sizeof(char *)) ; 00174 ht->ntab[jj] = kk+3 ; 00175 00176 ht->vtab[jj][kk] = vpt ; /* save ptr */ 00177 ht->ctab[jj][kk] = key ; /* save key string */ 00178 ht->ntot ++ ; /* 1 more in table */ 00179 00180 ht->vtab[jj][kk+1] = ht->vtab[jj][kk+2] = NULL ; /* created 2 extra */ 00181 ht->ctab[jj][kk+1] = ht->ctab[jj][kk+2] = NULL ; /* elements above */ 00182 00183 } 00184 00185 } else { /* found str in row at index kk */ 00186 00187 if( vtkill && ht->vtab[jj][kk] != NULL ) free(ht->vtab[jj][kk]) ; 00188 00189 ht->vtab[jj][kk] = vpt ; /* replace old ptr with new */ 00190 free(key) ; /* don't need this */ 00191 } 00192 } 00193 } |
|
Delete a Htable forever. ----------------------------------------------------------- Definition at line 65 of file niml_htable.c. References Htable::ctab, free, Htable::len, Htable::ntab, and Htable::vtab. Referenced by AFNI_finalize_read_sess_CB(), AFNI_read_inputs(), AFNI_rescan_session_NEW(), AFNI_rescan_session_OLD(), and destroy_Dtable().
00066 { 00067 int jj , kk ; 00068 00069 if( ht == NULL ) return ; 00070 00071 for( jj=0 ; jj < ht->len ; jj++ ){ 00072 if( ht->vtab[jj] != NULL ){ 00073 if( vtkill ){ 00074 for( kk=0 ; kk < ht->ntab[jj] ; kk++ ) 00075 if( ht->vtab[jj][kk] != NULL ) free(ht->vtab[jj][kk]) ; 00076 } 00077 free(ht->vtab[jj]) ; 00078 } 00079 if( ht->ctab[jj] != NULL ){ 00080 for( kk=0 ; kk < ht->ntab[jj] ; kk++ ) 00081 if( ht->ctab[jj][kk] != NULL ) free(ht->ctab[jj][kk]) ; 00082 free(ht->ctab[jj]) ; 00083 } 00084 } 00085 free(ht->vtab) ; free(ht->ctab) ; free(ht->ntab) ; free(ht) ; 00086 return ; 00087 } |
|
Definition at line 95 of file niml_htable.c. References Htable::ctab, hashkey(), key, Htable::len, Htable::ntab, Htable::ntot, UINT, and Htable::vtab. Referenced by AFNI_find_warp(), findin_Dtable_a(), findin_Dtable_b(), NI_find_struct(), NI_register_struct(), NI_registry_add(), NI_registry_free(), NI_registry_idcode_altername(), NI_registry_idcode_to_len(), NI_registry_idcode_to_name(), NI_registry_idcode_to_ptr(), NI_registry_malloc(), NI_registry_ptr_altername(), NI_registry_ptr_to_idcode(), NI_registry_ptr_to_len(), NI_registry_ptr_to_name(), NI_registry_realloc(), NI_registry_replace(), NI_rowtype_find_name(), removefrom_Dtable_a(), and removefrom_Dtable_b().
00096 { 00097 UINT jj ; 00098 int kk , ntab ; 00099 char *key , **ctab ; 00100 void ***vtab ; 00101 00102 if( str == NULL || ht == NULL || ht->ntot == 0 ) return NULL ; 00103 00104 jj = hashkey(str) % ht->len ; /* hash table row */ 00105 00106 vtab = ht->vtab ; 00107 00108 if( vtab[jj] == NULL ) return NULL ; /* nothing there */ 00109 00110 key = str ; 00111 00112 ctab = ht->ctab[jj] ; ntab = ht->ntab[jj] ; 00113 00114 for( kk=0 ; kk < ntab ; kk++ ) /* scan for match of key to ctab */ 00115 if( ctab[kk] != NULL && strcmp(key,ctab[kk]) == 0 ) 00116 return vtab[jj][kk]; 00117 00118 return NULL ; /* no match found */ 00119 } |
|
Compute a non-negative integer key from a string. ----------------------------------------------------------- Definition at line 24 of file niml_htable.c. References INLINE, p, and UINT. Referenced by addto_Htable(), findin_Htable(), and removefrom_Htable().
|
|
Definition at line 18 of file niml_htable.c. References vtkill. Referenced by destroy_Dtable().
00018 { vtkill = vt ; } |
|
Create a new Htable, with len slots. --------------------------------------------------------- Definition at line 44 of file niml_htable.c. References calloc, Htable::ctab, Htable::len, Htable::ntab, and Htable::vtab. Referenced by AFNI_finalize_read_sess_CB(), AFNI_read_inputs(), AFNI_rescan_session_NEW(), AFNI_rescan_session_OLD(), init_registry(), new_Dtable(), NI_register_struct(), resize_Htable(), setup_basic_types(), and THD_init_session().
00045 { 00046 Htable *ht ; 00047 00048 if( len <= 7 ) len = 7 ; /* smallest allowed */ 00049 else if( len%2 == 0 ) len++ ; /* mustn't be even */ 00050 00051 ht = (Htable *) calloc( 1 , sizeof(Htable) ) ; 00052 00053 ht->len = len ; 00054 ht->vtab = (void ***) calloc( len , sizeof(void **) ) ; 00055 ht->ctab = (char ***) calloc( len , sizeof(char **) ) ; 00056 ht->ntab = (int *) calloc( len , sizeof(int) ) ; 00057 00058 return ht ; 00059 } |
|
Profile a Htable to stdout. ------------------------------------------------------------------- Definition at line 234 of file niml_htable.c. References Htable::ctab, Htable::len, Htable::ntab, Htable::ntot, and Htable::vtab. Referenced by setup_basic_types().
00235 { 00236 int jj, kk , nn ; 00237 00238 printf("\n----- Htable profile: %s\n",(str != NULL) ? str : "" ) ; 00239 if( ht == NULL ){ 00240 printf("++ EMPTY ++\n") ; return ; 00241 } 00242 00243 printf("Rows=%d Ntot=%d\n",ht->len,ht->ntot) ; 00244 00245 for( jj=0 ; jj < ht->len ; jj++ ){ 00246 printf(" #%05d: ",jj) ; 00247 if( ht->vtab[jj] == NULL ){ 00248 printf("++ EMPTY ++\n") ; 00249 } else { 00250 for( nn=kk=0 ; kk < ht->ntab[jj] ; kk++ ){ 00251 if( ht->ctab[jj][kk] != NULL ){ printf("*") ; nn++ ; } 00252 else { printf(".") ; } 00253 } 00254 printf(" [ntab=%d nn=%d]\n",ht->ntab[jj],nn) ; 00255 } 00256 } 00257 fflush(stdout) ; 00258 } |
|
Remove an entry from a Htable. ---------------------------------------------------------- Definition at line 199 of file niml_htable.c. References Htable::ctab, free, hashkey(), key, Htable::len, Htable::ntab, Htable::ntot, UINT, Htable::vtab, and vtkill. Referenced by addto_Htable(), NI_registry_free(), NI_registry_realloc(), NI_registry_replace(), NI_unregister_struct(), removefrom_Dtable_a(), and removefrom_Dtable_b().
00200 { 00201 UINT jj ; 00202 int kk ; 00203 char *key ; 00204 void ***vtab ; 00205 char **ctab ; 00206 int ntab ; 00207 00208 if( str == NULL || ht == NULL || ht->ntot == 0 ) return ; 00209 00210 jj = hashkey(str) % ht->len ; /* hash table row */ 00211 00212 vtab = ht->vtab ; 00213 00214 if( vtab[jj] == NULL ) return ; /* nothing there */ 00215 00216 key = str ; 00217 00218 ctab = ht->ctab[jj] ; ntab = ht->ntab[jj] ; 00219 00220 for( kk=0 ; kk < ntab ; kk++ ) /* scan for match of key to ctab */ 00221 if( ctab[kk] != NULL && strcmp(key,ctab[kk]) == 0 ){ 00222 free(ctab[kk]); ctab[kk] = NULL; 00223 if( vtkill && vtab[jj][kk] != NULL ) free(vtab[jj][kk]) ; 00224 vtab[jj][kk] = NULL; ht->ntot--; break; 00225 } 00226 00227 return ; 00228 } |
|
Resize the guts of a Htable [28 Feb 2005] ------------------------------------------------------------------- Definition at line 285 of file niml_htable.c. References Htable::ctab, free, Htable::len, new_Htable(), Htable::ntab, Htable::ntot, subsume_Htable(), and Htable::vtab.
00286 { 00287 Htable *htnew ; 00288 int jj , kk ; 00289 00290 if( ht == NULL ) return ; 00291 00292 /* auto-resize? */ 00293 00294 if( newlen == 0 ){ 00295 if( ht->ntot <= 131 * ht->len ) return ; 00296 newlen = ht->ntot / 37 ; 00297 } 00298 00299 /* create new Htable, copy contents of this one into it */ 00300 00301 htnew = new_Htable( newlen ) ; 00302 if( htnew == NULL ) return ; 00303 00304 subsume_Htable( ht , htnew ) ; 00305 00306 /* erase contents of this one now */ 00307 00308 for( jj=0 ; jj < ht->len ; jj++ ){ 00309 if( ht->vtab[jj] != NULL ) free(ht->vtab[jj]) ; 00310 00311 if( ht->ctab[jj] != NULL ){ 00312 for( kk=0 ; kk < ht->ntab[jj] ; kk++ ) 00313 if( ht->ctab[jj][kk] != NULL ) free(ht->ctab[jj][kk]) ; 00314 free(ht->ctab[jj]) ; 00315 } 00316 } 00317 free(ht->vtab) ; free(ht->ctab) ; free(ht->ntab) ; 00318 00319 /* copy guts of new Htable over the guts of this one */ 00320 00321 *ht = *htnew ; 00322 00323 /* free the shell of the new Htable and exit */ 00324 00325 free((void *)htnew) ; return ; 00326 } |
|
Put contents of htold into htnew. ------------------------------------------------------------------- Definition at line 264 of file niml_htable.c. References addto_Htable(), Htable::ctab, Htable::len, Htable::ntab, Htable::ntot, and Htable::vtab. Referenced by AFNI_finalize_read_sess_CB(), AFNI_read_inputs(), AFNI_rescan_session_NEW(), AFNI_rescan_session_OLD(), and resize_Htable().
00265 { 00266 int kk,jj ; 00267 00268 /* check inputs for sanity */ 00269 00270 if( htold == NULL || htold->ntot == 0 || htnew == NULL ) return ; 00271 00272 for( jj=0 ; jj < htold->len ; jj++ ){ 00273 if( htold->vtab[jj] != NULL ){ 00274 for( kk=0 ; kk < htold->ntab[jj] ; kk++ ) 00275 if( htold->ctab[jj][kk] != NULL ) 00276 addto_Htable( htold->ctab[jj][kk] , htold->vtab[jj][kk] , htnew ) ; 00277 } 00278 } 00279 } |
Variable Documentation
|
Definition at line 17 of file niml_htable.c. Referenced by addto_Htable(), Htable_set_vtkill(), and removefrom_Htable(). |