Doxygen Source Code Documentation
niml_registry.c File Reference
#include "niml_private.h"Go to the source code of this file.
Data Structures | |
| struct | registry_entry |
Defines | |
| #define | INLINE |
| #define | NIREG_PRIVATE_MALLOC (1<<0) |
| #define | NIREG_isprivate(rr) (((rr)->flags & NIREG_PRIVATE_MALLOC) != 0) |
| #define | NIREG_free(rr) |
Functions | |
| INLINE void | vpt_to_char (void *vpt, char *cpt) |
| INLINE void * | char_to_vpt (char *cpt) |
| void | init_registry (void) |
| void * | NI_registry_malloc (char *idcode, char *name, size_t len) |
| void * | NI_registry_add (char *idcode, char *name, void *vpt) |
| void * | NI_registry_realloc (void *vpt, size_t newlen) |
| void * | NI_registry_replace (void *vpt, void *vpt_new) |
| void | NI_registry_free (void *vpt) |
| void * | NI_registry_idcode_to_ptr (char *idcode) |
| size_t | NI_registry_idcode_to_len (char *idcode) |
| size_t | NI_registry_ptr_to_len (void *vpt) |
| char * | NI_registry_idcode_to_name (char *idcode) |
| char * | NI_registry_ptr_to_idcode (void *vpt) |
| char * | NI_registry_ptr_to_name (void *vpt) |
| void | NI_registry_idcode_altername (char *idcode, char *newname) |
| void | NI_registry_ptr_altername (void *vpt, char *newname) |
Variables | |
| Htable * | registry_htable_idc = NULL |
| Htable * | registry_htable_ipt = NULL |
Define Documentation
|
|
Definition at line 7 of file niml_registry.c. Referenced by char_to_vpt(), and vpt_to_char(). |
|
|
Value: do{ if( !NIREG_isprivate(rr) ) free( (rr)->vpt ) ; \ free((void *)(rr)->name) ; \ free((void *)(rr)) ; \ } while(0) Definition at line 31 of file niml_registry.c. Referenced by NI_registry_free(). |
|
|
Definition at line 28 of file niml_registry.c. Referenced by NI_registry_realloc(), and NI_registry_replace(). |
|
|
Definition at line 25 of file niml_registry.c. Referenced by NI_registry_add(), and NI_registry_replace(). |
Function Documentation
|
|
Convert string representation to a pointer; this is the inverse function to vpt_to_char(). Definition at line 55 of file niml_registry.c. References INLINE.
00056 {
00057 void *vpt=NULL ;
00058 if( cpt == NULL ) return NULL ;
00059 sscanf(cpt,"%p",&vpt) ;
00060 return vpt ;
00061 }
|
|
|
Create the (empty) underlying hash tables for indexing the list of registry elements. Definition at line 67 of file niml_registry.c. References new_Htable(). Referenced by NI_registry_add(), and NI_registry_malloc().
00068 {
00069 if( registry_htable_ipt == NULL ){
00070 registry_htable_idc = new_Htable(131) ;
00071 registry_htable_ipt = new_Htable(131) ;
00072 }
00073 return ;
00074 }
|
|
||||||||||||||||
|
Associate a given pointer (non-NULL) with idcode and name string.
Definition at line 138 of file niml_registry.c. References addto_Htable(), calloc, findin_Htable(), registry_entry::flags, registry_entry::idc, init_registry(), registry_entry::ipt, registry_entry::name, name, NI_strncpy(), NIREG_PRIVATE_MALLOC, registry_entry::vlen, registry_entry::vpt, and vpt_to_char().
00139 {
00140 void *xpt ;
00141 registry_entry *rent ; /* pay this or be evicted */
00142
00143 init_registry() ; /* setup empty hash tables, if needed */
00144
00145 if( idcode == NULL || *idcode == '\0' || vpt == NULL ) return NULL ;
00146
00147 /* check to see if already have this idcode */
00148
00149 xpt = findin_Htable( idcode , registry_htable_idc ) ;
00150 if( xpt != NULL ) return NULL ; /* bad */
00151
00152 /* make the registry entry for this doohicky */
00153
00154 rent = calloc(1,sizeof(registry_entry)) ;
00155 NI_strncpy( rent->idc , idcode , 32 ) ; /* copy idcode */
00156 rent->vpt = vpt ; /* copy data pointer */
00157 rent->vlen = 0 ; /* set length */
00158 vpt_to_char( vpt , rent->ipt ) ; /* string version of data pointer */
00159 if( name == NULL ) name = "\0" ;
00160 rent->name = strdup(name) ; /* copy name */
00161 rent->flags = NIREG_PRIVATE_MALLOC ; /* init flags */
00162
00163 /* and index this new registry entry under the idcode and the pointer */
00164
00165 addto_Htable( rent->idc , (void *)rent , registry_htable_idc ) ;
00166 addto_Htable( rent->ipt , (void *)rent , registry_htable_ipt ) ;
00167
00168 return vpt ; /* give the user the pointer he asked for */
00169 }
|
|
|
Definition at line 256 of file niml_registry.c. References findin_Htable(), registry_entry::idc, registry_entry::ipt, NIREG_free, removefrom_Htable(), and vpt_to_char().
00257 {
00258 char ipt[32] ;
00259 registry_entry *rent ;
00260
00261 if( vpt == NULL || registry_htable_ipt == NULL ) return ;
00262
00263 /* look for the pointer in the index */
00264
00265 vpt_to_char( vpt , ipt ) ;
00266 rent = (registry_entry *) findin_Htable( ipt , registry_htable_ipt ) ;
00267 if( rent == NULL ) return ; /* stupid users must be punished somehow */
00268
00269 removefrom_Htable( rent->ipt , registry_htable_ipt ) ;
00270 removefrom_Htable( rent->idc , registry_htable_idc ) ;
00271 NIREG_free( rent ) ;
00272 return ;
00273 }
|
|
||||||||||||
|
Given an idcode, modify the name string that goes with it. Definition at line 373 of file niml_registry.c. References findin_Htable(), free, and registry_entry::name.
00374 {
00375 registry_entry *rent ;
00376
00377 rent = (registry_entry *) findin_Htable( idcode , registry_htable_idc ) ;
00378 if( rent == NULL ) return ;
00379 free((void *)rent->name) ;
00380 if( newname == NULL ) newname = "\0" ;
00381 rent->name = strdup(newname) ;
00382 return ;
00383 }
|
|
|
Given an idcode, get the data length that goes with it. Note that 0 is returned if the data ptr was setup with len=0 OR* if the idcode can't be found in the registry. --------------------------------------------------------------------- Definition at line 293 of file niml_registry.c. References findin_Htable(), and registry_entry::vlen.
00294 {
00295 registry_entry *rent ;
00296
00297 rent = (registry_entry *) findin_Htable( idcode , registry_htable_idc ) ;
00298 if( rent == NULL ) return 0 ;
00299 return rent->vlen ;
00300 }
|
|
|
Given an idcode, get the name string that went with it. This is the pointer into the internal registry_entry struct, so don't modify it! --------------------------------------------------------------------- Definition at line 327 of file niml_registry.c. References findin_Htable(), and registry_entry::name.
00328 {
00329 registry_entry *rent ;
00330
00331 rent = (registry_entry *) findin_Htable( idcode , registry_htable_idc ) ;
00332 if( rent == NULL ) return NULL ;
00333 return rent->name ;
00334 }
|
|
|
Given an idcode, get the data pointer that goes with it. Definition at line 278 of file niml_registry.c. References findin_Htable(), and registry_entry::vpt.
00279 {
00280 registry_entry *rent ;
00281
00282 rent = (registry_entry *) findin_Htable( idcode , registry_htable_idc ) ;
00283 if( rent == NULL ) return NULL ;
00284 return rent->vpt ;
00285 }
|
|
||||||||||||||||
|
Allocate memory with calloc(), and associate it with a given idcode and name string.
Definition at line 87 of file niml_registry.c. References addto_Htable(), calloc, findin_Htable(), registry_entry::flags, registry_entry::idc, init_registry(), registry_entry::ipt, registry_entry::name, name, NI_strncpy(), registry_entry::vlen, registry_entry::vpt, and vpt_to_char().
00088 {
00089 void *vpt ;
00090 int lll ;
00091 registry_entry *rent ; /* pay this or be evicted */
00092
00093 init_registry() ; /* setup empty hash tables, if needed */
00094
00095 if( idcode == NULL || *idcode == '\0' ) return NULL ;
00096
00097 /* check to see if already have this idcode */
00098
00099 vpt = findin_Htable( idcode , registry_htable_idc ) ;
00100 if( vpt != NULL ) return NULL ; /* bad */
00101
00102 /* allocate space for result of this function */
00103
00104 lll = (len == 0) ? 4 : len ;
00105 vpt = calloc(1,lll) ;
00106 if( vpt == NULL ) return NULL ; /* bad */
00107
00108 if( len == 0 ){ char *cpt=(char *)vpt; *cpt = '\0'; }
00109
00110 /* make the registry entry for this doohicky */
00111
00112 rent = calloc(1,sizeof(registry_entry)) ;
00113 NI_strncpy( rent->idc , idcode , 32 ) ; /* copy idcode */
00114 rent->vpt = vpt ; /* copy data pointer */
00115 rent->vlen = len ; /* save length */
00116 vpt_to_char( vpt , rent->ipt ) ; /* string version of data pointer */
00117 if( name == NULL ) name = "\0" ;
00118 rent->name = strdup(name) ; /* copy name */
00119 rent->flags = 0 ; /* init flags */
00120
00121 /* and index this new registry entry under the idcode and the pointer */
00122
00123 addto_Htable( rent->idc , (void *)rent , registry_htable_idc ) ;
00124 addto_Htable( rent->ipt , (void *)rent , registry_htable_ipt ) ;
00125
00126 return vpt ; /* give the user the pointer he asked for */
00127 }
|
|
||||||||||||
|
Given a data pointer, alter the name string that goes with it. Definition at line 388 of file niml_registry.c. References findin_Htable(), free, registry_entry::name, and vpt_to_char().
00389 {
00390 char ipt[32] ;
00391 registry_entry *rent ;
00392
00393 if( vpt == NULL || registry_htable_ipt == NULL ) return ;
00394
00395 vpt_to_char( vpt , ipt ) ;
00396 rent = (registry_entry *) findin_Htable( ipt , registry_htable_ipt ) ;
00397 if( rent == NULL ) return ;
00398 free((void *)rent->name) ;
00399 if( newname == NULL ) newname = "\0" ;
00400 rent->name = strdup(newname) ;
00401 return ;
00402 }
|
|
|
Given a data pointer, return a pointer to the idcode that corresponds. Don't modify this! --------------------------------------------------------------------- Definition at line 341 of file niml_registry.c. References findin_Htable(), registry_entry::idc, and vpt_to_char().
00342 {
00343 char ipt[32] ;
00344 registry_entry *rent ;
00345
00346 if( vpt == NULL || registry_htable_ipt == NULL ) return ;
00347
00348 vpt_to_char( vpt , ipt ) ;
00349 rent = (registry_entry *) findin_Htable( ipt , registry_htable_ipt ) ;
00350 if( rent == NULL ) return ;
00351 return rent->idc ;
00352 }
|
|
|
Given a data pointer, get the data length that goes with it. Note that 0 is returned if the data ptr was setup with len=0 OR* if the data ptr can't be found in the registry. --------------------------------------------------------------------- Definition at line 308 of file niml_registry.c. References findin_Htable(), registry_entry::vlen, and vpt_to_char().
00309 {
00310 char ipt[32] ;
00311 registry_entry *rent ;
00312
00313 if( vpt == NULL || registry_htable_ipt == NULL ) return ;
00314
00315 vpt_to_char( vpt , ipt ) ;
00316 rent = (registry_entry *) findin_Htable( ipt , registry_htable_ipt ) ;
00317 if( rent == NULL ) return 0 ;
00318 return rent->vlen ;
00319 }
|
|
|
Given a data pointer, get the name string that corresponds. Definition at line 357 of file niml_registry.c. References findin_Htable(), registry_entry::name, and vpt_to_char().
00358 {
00359 char ipt[32] ;
00360 registry_entry *rent ;
00361
00362 if( vpt == NULL || registry_htable_ipt == NULL ) return ;
00363
00364 vpt_to_char( vpt , ipt ) ;
00365 rent = (registry_entry *) findin_Htable( ipt , registry_htable_ipt ) ;
00366 if( rent == NULL ) return ;
00367 return rent->name ;
00368 }
|
|
||||||||||||
|
Like realloc(), but also updates the indexes.
Definition at line 182 of file niml_registry.c. References addto_Htable(), findin_Htable(), registry_entry::ipt, NIREG_isprivate, realloc, removefrom_Htable(), registry_entry::vlen, registry_entry::vpt, and vpt_to_char().
00183 {
00184 char ipt[32] ;
00185 void *vpt_new ;
00186 int lll ;
00187 registry_entry *rent ;
00188
00189 if( vpt == NULL || registry_htable_ipt == NULL ) return NULL ;
00190
00191 /* look up the pointer in the index */
00192
00193 vpt_to_char( vpt , ipt ) ;
00194 rent = (registry_entry *) findin_Htable( ipt , registry_htable_ipt ) ;
00195 if( rent == NULL ) return NULL ; /* not found!? */
00196 if( NIREG_isprivate(rent) ) return NULL ; /* bad user */
00197
00198 lll = (newlen == 0) ? 4 : newlen ;
00199 vpt_new = realloc( vpt , lll ) ; /* get new allocation */
00200 if( vpt_new == NULL ) return NULL ; /* bad */
00201 if( vpt_new == vpt ) return vpt ; /* no change! */
00202
00203 /* remove the pointer-based entry from the index,
00204 then make a new pointer index */
00205
00206 removefrom_Htable( ipt , registry_htable_ipt ) ;
00207
00208 rent->vpt = vpt_new ;
00209 rent->vlen = newlen ;
00210 vpt_to_char( vpt , rent->ipt ) ;
00211 addto_Htable( rent->ipt , (void *)rent , registry_htable_ipt ) ;
00212
00213 return vpt_new ; /* give back the new pointer */
00214 }
|
|
||||||||||||
|
For something added with NI_registry_add(), lets you replace the pointer with some other pointer. --------------------------------------------------------------------- Definition at line 221 of file niml_registry.c. References addto_Htable(), findin_Htable(), registry_entry::flags, free, registry_entry::ipt, NIREG_isprivate, NIREG_PRIVATE_MALLOC, removefrom_Htable(), registry_entry::vlen, registry_entry::vpt, and vpt_to_char().
00222 {
00223 char ipt[32] ;
00224 registry_entry *rent ;
00225
00226 if( vpt == NULL || vpt_new == NULL ||
00227 registry_htable_ipt == NULL ) return NULL ;
00228
00229 if( vpt == vpt_new ) return vpt ;
00230
00231 /* look up the pointer in the index */
00232
00233 vpt_to_char( vpt , ipt ) ;
00234 rent = (registry_entry *) findin_Htable( ipt , registry_htable_ipt ) ;
00235 if( rent == NULL ) return NULL ; /* not found!? */
00236
00237 if( !NIREG_isprivate(rent) ) free((void *)vpt) ;
00238
00239 /* remove the pointer-based entry from the index,
00240 then make a new pointer index */
00241
00242 removefrom_Htable( ipt , registry_htable_ipt ) ;
00243
00244 rent->vpt = vpt_new ;
00245 rent->vlen = 0 ; /* len is unknown here */
00246 vpt_to_char( vpt , rent->ipt ) ;
00247 addto_Htable( rent->ipt , (void *)rent , registry_htable_ipt ) ;
00248 rent->flags = NIREG_PRIVATE_MALLOC ;
00249
00250 return vpt_new ; /* give back the new pointer */
00251 }
|
|
||||||||||||
|
Convert pointer to a string representation. Definition at line 46 of file niml_registry.c. References INLINE. Referenced by NI_registry_add(), NI_registry_free(), 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(), and NI_registry_replace().
00047 {
00048 sprintf( cpt , "%p" , vpt ) ;
00049 }
|
Variable Documentation
|
|
Definition at line 40 of file niml_registry.c. |
|
|
Definition at line 41 of file niml_registry.c. |