#include <stdlib.h>
#include "memory.h"
#include "nmd.h"
#include "nmd_impl.h"
Go to the source code of this file.
static NMDErrorCode NMDAllocateComponent | ( | NMD_metadata_item * | rcmp | ) | [static] |
An internal routine that only allocates the component data structure
Definition at line 24 of file nmdcmp.c.
References CHKMEMQ, NMD_metadata_item_::cookie, NMD_MALLOC, NMDCOOKIE, NMDFalse, and NMD_metadata_item_::set.
Referenced by NMDCategoryAllocateNewComponent().
00025 { 00026 NMD_metadata_item cmp; 00027 NMD_MALLOC(cmp,1,struct NMD_metadata_item_,"component"); 00028 cmp->cookie = NMDCOOKIE; cmp->set = NMDFalse; 00029 *rcmp = cmp; 00030 CHKMEMQ 00031 return 0; 00032 }
NMDErrorCode NMDCategoryAllocateNewComponent | ( | NMD_metadata_category | cat, | |
const char * | cmp, | |||
NMDDataType | type, | |||
NMD_metadata_item * | rcpt | |||
) |
Create a new component by name in an existing category object. If a component pointer is supplied, the new component object is returned, but this pointer is allowed to be NULL.
Definition at line 41 of file nmdcmp.c.
References NMD_metadata_category_::alloc, CHKMEMQ, NMD_metadata_category_::cmps, NMD_metadata_item_::name, NMD_metadata_category_::ncmp, NMD_STRDUP, NMDAllocateComponent(), NMDFalse, NMD_metadata_item_::set, and NMD_metadata_item_::t.
Referenced by main(), NMDCategoryGetOrCreateComponent(), and NMDObjectEnsureCategoryComponent().
00042 { 00043 NMD_metadata_item cpt; int idx; NMDErrorCode ierr; 00044 /* 00045 * if we are about to overflow, 00046 * reallocate the components in this category 00047 */ 00048 if (cat->ncmp >= cat->alloc) { 00049 NMD_metadata_item* newcmps; int newalloc; 00050 newalloc = 2*cat->alloc; 00051 ierr = PetscMalloc 00052 (newalloc*sizeof(struct NMD_metadata_item_),&newcmps); CHKERRQ(ierr); 00053 for (idx=0; idx<cat->ncmp; idx++) 00054 newcmps[idx] = cat->cmps[idx]; 00055 ierr = PetscFree(cat->cmps); CHKERRQ(ierr); 00056 cat->cmps = newcmps; cat->alloc = newalloc; 00057 } 00058 /* 00059 * with space guaranteed, create the component 00060 */ 00061 idx = cat->ncmp++; 00062 ierr = NMDAllocateComponent(&cpt); NMD_ERR_RETURN(ierr); 00063 NMD_STRDUP(cmp,cpt->name); cpt->t = type; cpt->set = NMDFalse; 00064 cat->cmps[idx] = cpt; 00065 if (rcpt) *rcpt = cpt; 00066 CHKMEMQ 00067 return 0; 00068 }
NMDErrorCode NMDCategoryGetComponent | ( | NMD_metadata_category | cat, | |
char * | cmp, | |||
NMD_metadata_item * | cpt | |||
) |
Test whether a metadata category has a certain component. The component has to exist.
Definition at line 234 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, CHKMEMQ, NMD_metadata_category_::name, and NMDCategoryTryGetComponent().
Referenced by NMDGetArrayValue(), and NMDGetDataType().
00235 { 00236 NMDTruth flg; NMDErrorCode ierr; 00237 CHECKHASNMDCOOKIE(cat); 00238 ierr = NMDCategoryTryGetComponent 00239 (cat,cmp,cpt,&flg); NMD_ERR_RETURN(ierr); 00240 if (!flg) NMD_ERR_REPORTss("Could not find component in category",cmp,cat->name); 00241 CHKMEMQ 00242 return 0; 00243 }
NMDErrorCode NMDCategoryGetComponents | ( | NMD_metadata | obj, | |
char * | cat, | |||
int * | ncmp, | |||
char *** | cmps, | |||
NMDDataType ** | typs | |||
) |
Get a list of all component names and types in a category. All three output arguments are optional. The names and types arrays are allocated and should be freed by the user by NMD_FREE(). The names in the name array points to the strings in the database object, so they do not need to be freed.
Definition at line 205 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, CHKMEMQ, NMD_metadata_category_::cmps, NMD_metadata_item_::name, NMD_metadata_category_::ncmp, NMD_MALLOC, NMDObjectGetCategory(), and NMD_metadata_item_::t.
Referenced by main().
00206 { 00207 NMD_metadata_category catobj; int icmp; 00208 char **names; NMDDataType *types; NMDErrorCode ierr; 00209 CHECKHASNMDCOOKIE(obj); 00210 ierr = NMDObjectGetCategory(obj,cat,&catobj); CHKERRQ(ierr); 00211 if (ncmp) *ncmp = catobj->ncmp; 00212 if (cmps) { 00213 NMD_MALLOC(names,catobj->ncmp,char*,"name array"); 00214 for (icmp=0; icmp<catobj->ncmp; icmp++) 00215 names[icmp] = catobj->cmps[icmp]->name; 00216 *cmps = names; 00217 } 00218 if (typs) { 00219 NMD_MALLOC(types,catobj->ncmp,NMDDataType,"type array"); 00220 for (icmp=0; icmp<catobj->ncmp; icmp++) 00221 types[icmp] = catobj->cmps[icmp]->t; 00222 *typs = types; 00223 } 00224 CHKMEMQ 00225 return 0; 00226 }
NMDErrorCode NMDCategoryGetOrCreateComponent | ( | NMD_metadata_category | cat, | |
char * | cmp, | |||
NMDDataType | type, | |||
NMD_metadata_item * | cpt | |||
) |
Retrieve a component, creating it if it doesn't already exist.
Definition at line 108 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, CHKMEMQ, NMDCategoryAllocateNewComponent(), NMDCategoryTryGetComponent(), and NMD_metadata_item_::t.
Referenced by main(), NMDCloneObject(), NMDCopyArrayValue(), NMDCopyCategory(), NMDSetArrayValue(), and NMDSetValue().
00109 { 00110 NMD_metadata_item cnew; NMDTruth flg; NMDErrorCode ierr; 00111 CHECKHASNMDCOOKIE(cat); 00112 ierr = NMDCategoryTryGetComponent(cat,cmp,&cnew,&flg); NMD_ERR_RETURN(ierr); 00113 if (flg) { 00114 if (type!=cnew->t) 00115 NMD_ERR_REPORTii 00116 ("Type incompatibility: old/new",(int)(cnew->t),(int)type); 00117 if (cpt) *cpt = cnew; 00118 } else { 00119 ierr = NMDCategoryAllocateNewComponent 00120 (cat,cmp,type,cpt); NMD_ERR_RETURN(ierr); 00121 } 00122 CHKMEMQ 00123 return 0; 00124 }
NMDErrorCode NMDCategoryTryGetComponent | ( | NMD_metadata_category | cat, | |
const char * | cmp, | |||
NMD_metadata_item * | rcpt, | |||
NMDTruth * | f | |||
) |
Test whether a metadata category has a certain component.
Definition at line 178 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, CHKMEMQ, NMD_metadata_category_::cmps, NMD_metadata_item_::name, NMD_metadata_category_::ncmp, NMDFalse, and NMDTrue.
Referenced by main(), NMDCategoryGetComponent(), NMDCategoryGetOrCreateComponent(), NMDGetValue(), NMDObjectEnsureCategoryComponent(), NMDObjectHasCategoryComponent(), and NMDUnsetValue().
00179 { 00180 int icmp; 00181 CHECKHASNMDCOOKIE(cat); 00182 *f = NMDFalse; 00183 for (icmp=0; icmp<cat->ncmp; icmp++) { 00184 NMD_metadata_item cpt = cat->cmps[icmp]; 00185 CHECKHASNMDCOOKIE(cpt); 00186 if (strcmp(cmp,cpt->name)==0) { 00187 *f = NMDTrue; 00188 if (rcpt) *rcpt = cpt; 00189 break; 00190 } 00191 } 00192 CHKMEMQ 00193 return 0; 00194 }
NMDErrorCode NMDComponentDestroy | ( | NMD_metadata_item | cmp | ) |
Definition at line 72 of file nmdcmp.c.
References NMD_metadata_item_::cc, NMD_realarray_struct::data, NMD_intarray_struct::data, NMD_metadata_item_::ii, NMD_realarray_struct::length, NMD_intarray_struct::length, NMD_metadata_item_::name, NMD_FREE, NMDIntarray, NMDRealarray, NMDString, NMD_metadata_item_::rr, NMD_metadata_item_::t, NMD_realarray_struct::unique, and NMD_intarray_struct::unique.
Referenced by NMDDestroyObject().
00073 { 00074 switch (cmp->t) { 00075 case NMDIntarray : 00076 if (cmp->ii) { 00077 struct NMD_intarray_struct *arraystruct = 00078 (struct NMD_intarray_struct *)(cmp->ii); 00079 if (arraystruct->length>0 && arraystruct->unique==1) 00080 NMD_FREE(arraystruct->data); 00081 NMD_FREE(cmp->ii); 00082 } ; 00083 break; 00084 case NMDRealarray : 00085 if (cmp->rr) { 00086 struct NMD_realarray_struct *arraystruct = 00087 (struct NMD_realarray_struct *)(cmp->rr); 00088 if (arraystruct->length>0 && arraystruct->unique==1) 00089 NMD_FREE(arraystruct->data); 00090 NMD_FREE(cmp->rr); 00091 } ; 00092 break; 00093 case NMDString : NMD_FREE(cmp->cc); 00094 break; 00095 default : /* other components need no destructor */ 00096 break; 00097 } 00098 NMD_FREE(cmp->name); 00099 NMD_FREE(cmp); 00100 return 0; 00101 }
NMDErrorCode NMDComponentSetArrayValue | ( | NMD_metadata_item | cpt, | |
NMDDataType | t, | |||
void * | v, | |||
int | l | |||
) |
Definition at line 323 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, NMD_realarray_struct::data, NMD_intarray_struct::data, NMD_metadata_item_::ii, NMD_realarray_struct::length, NMD_intarray_struct::length, NMD_MALLOC, NMDComponentSetValue(), NMDInt, NMDIntarray, NMDReal, NMDRealarray, NMDString, NMDTrue, NMD_metadata_item_::rr, NMD_metadata_item_::set, NMD_metadata_item_::t, NMD_realarray_struct::unique, and NMD_intarray_struct::unique.
Referenced by NMDSetArrayValue().
00324 { 00325 NMDErrorCode ierr; 00326 CHECKHASNMDCOOKIE(cpt); 00327 switch (cpt->t) { 00328 case NMDInt : 00329 case NMDReal : 00330 case NMDString : 00331 ierr = NMDComponentSetValue(cpt,cpt->t,v); NMD_ERR_RETURN(ierr); 00332 break; 00333 case NMDIntarray : { 00334 struct NMD_intarray_struct* iistruct; 00335 NMD_MALLOC(iistruct,1,struct NMD_intarray_struct,"int array struct"); 00336 iistruct->unique = 0; iistruct->length = l; 00337 iistruct->data = *(int**)v; 00338 cpt->ii = iistruct; 00339 break;} 00340 case NMDRealarray : { 00341 struct NMD_realarray_struct* rrstruct; 00342 NMD_MALLOC(rrstruct,1,struct NMD_realarray_struct,"real array struct"); 00343 rrstruct->unique = 0; rrstruct->length = l; 00344 rrstruct->data = *(NMDRealtype**)v; 00345 cpt->rr = rrstruct; 00346 break;} 00347 default : 00348 NMD_ERR_REPORTi("Unknown type",(int)t) 00349 } 00350 cpt->set = NMDTrue; 00351 return 0; 00352 }
NMDErrorCode NMDComponentSetValue | ( | NMD_metadata_item | cpt, | |
NMDDataType | t, | |||
void * | v | |||
) |
Definition at line 278 of file nmdcmp.c.
References NMD_metadata_item_::cc, CHECKHASNMDCOOKIE, NMD_metadata_item_::i, NMD_STRDUP, NMDInt, NMDIntarray, NMDReal, NMDRealarray, NMDString, NMDTrue, NMD_metadata_item_::r, NMD_metadata_item_::set, and NMD_metadata_item_::t.
Referenced by NMDComponentSetArrayValue(), and NMDSetValue().
00279 { 00280 CHECKHASNMDCOOKIE(cpt); 00281 if (t!=cpt->t) NMD_ERR_REPORT("Type conflict"); 00282 switch (cpt->t) { 00283 case NMDInt : cpt->i = *(int*)v; break; 00284 case NMDReal : cpt->r = *(double*)v; break; 00285 case NMDString : NMD_STRDUP((char*)v,cpt->cc); break; 00286 case NMDIntarray : 00287 case NMDRealarray : 00288 NMD_ERR_REPORT("Please use NMDSetArrayValue"); break; 00289 default : NMD_ERR_REPORTi("Unknown type",(int)t); break; 00290 } 00291 cpt->set = NMDTrue; 00292 return 0; 00293 }
NMDErrorCode NMDComponentUnsetValue | ( | NMD_metadata_item | cpt | ) |
Definition at line 297 of file nmdcmp.c.
References NMD_metadata_item_::cc, CHECKHASNMDCOOKIE, NMD_realarray_struct::data, NMD_intarray_struct::data, NMD_metadata_item_::ii, NMD_FREE, NMDFalse, NMDInt, NMDIntarray, NMDReal, NMDRealarray, NMDString, NMD_metadata_item_::rr, NMD_metadata_item_::set, and NMD_metadata_item_::t.
Referenced by NMDUnsetValue().
00298 { 00299 CHECKHASNMDCOOKIE(cpt); 00300 switch (cpt->t) { 00301 case NMDInt : 00302 case NMDReal : break; 00303 case NMDString : NMD_FREE(cpt->cc); break; 00304 case NMDIntarray : { 00305 struct NMD_intarray_struct* iistruct = cpt->ii; 00306 NMD_FREE(iistruct->data); 00307 NMD_FREE(iistruct); 00308 break;} 00309 case NMDRealarray : { 00310 struct NMD_realarray_struct* rrstruct = cpt->rr; 00311 NMD_FREE(rrstruct->data); 00312 NMD_FREE(rrstruct); 00313 break;} 00314 default : NMD_ERR_REPORTi("Unknown type",cpt->t); break; 00315 } 00316 cpt->set = NMDFalse; 00317 return 0; 00318 }
PetscErrorCode NMDCopyItemValues | ( | NMD_metadata_item | src, | |
NMD_metadata_item | tar | |||
) |
Copy data between two item structures. If the original has unique data, so does the clone.
Definition at line 359 of file nmdcmp.c.
References NMD_metadata_item_::cc, CHKMEMQ, NMD_realarray_struct::data, NMD_intarray_struct::data, NMD_metadata_item_::i, NMD_metadata_item_::ii, NMD_realarray_struct::length, NMD_intarray_struct::length, NMD_MALLOC, NMD_STRDUP, NMDInt, NMDIntarray, NMDReal, NMDRealarray, NMDString, NMD_metadata_item_::r, NMD_metadata_item_::rr, NMD_metadata_item_::set, NMD_metadata_item_::t, NMD_realarray_struct::unique, and NMD_intarray_struct::unique.
Referenced by NMDCloneObject(), and NMDCopyCategory().
00360 { 00361 tar->set = src->set; if (!src->set) goto done; 00362 switch (src->t) { 00363 case NMDInt : tar->i = src->i; break; 00364 case NMDReal : tar->r = src->r ; break; 00365 case NMDString : NMD_STRDUP(src->cc,tar->cc); break; 00366 case NMDIntarray : 00367 { 00368 struct NMD_intarray_struct *tarstruct,*srcstruct = src->ii; 00369 int length=srcstruct->length; 00370 NMD_MALLOC(tarstruct,1,struct NMD_intarray_struct,"copied int array"); 00371 tarstruct->length = length; tarstruct->unique = srcstruct->unique; 00372 if (srcstruct->unique) { 00373 int *a1=srcstruct->data,*a2; int i; 00374 NMD_MALLOC(a2,length,int,"int array data"); 00375 for (i=0; i<length; i++) a2[i] = a1[i]; 00376 tarstruct->data = a2; 00377 } else 00378 tarstruct->data = srcstruct->data; 00379 tar->ii = tarstruct; 00380 } ; 00381 break; 00382 case NMDRealarray : 00383 { 00384 struct NMD_realarray_struct *tarstruct,*srcstruct = src->rr; 00385 int length=srcstruct->length; 00386 NMD_MALLOC(tarstruct,1,struct NMD_realarray_struct,"copied real array"); 00387 tarstruct->length = length; tarstruct->unique = srcstruct->unique; 00388 if (srcstruct->unique) { 00389 NMDRealtype *a1=srcstruct->data,*a2; int i; 00390 NMD_MALLOC(a2,length,NMDRealtype,"real array data"); 00391 for (i=0; i<length; i++) a2[i] = a1[i]; 00392 tarstruct->data = a2; 00393 } else 00394 tarstruct->data = srcstruct->data; 00395 tar->rr = tarstruct; 00396 } ; 00397 break; 00398 default : NMD_ERR_REPORTi("Can not copy items of type",(int)(src->t)); 00399 break; 00400 } 00401 done: 00402 CHKMEMQ 00403 return 0; 00404 }
NMDErrorCode NMDGetCategoryIGetComponents | ( | NMD_metadata | obj, | |
int | icat, | |||
int * | ncmp, | |||
char *** | cmps, | |||
NMDDataType ** | typs | |||
) |
For a given category, get the number of components and their names.
All output arguments can be NULL. The names array is allocated; the user needs to free it. The names themselves are pointers to the strings in the metadata object, so they do not need to be freed. The types array is also allocated and needs to be freed.
Definition at line 255 of file nmdcmp.c.
References NMD_metadata_::cats, CHECKHASNMDCOOKIE, NMD_metadata_category_::cmps, NMD_metadata_item_::name, NMD_metadata_category_::ncmp, NMD_MALLOC, and NMD_metadata_item_::t.
00256 { 00257 NMD_metadata_category cat; 00258 CHECKHASNMDCOOKIE(obj); 00259 cat = obj->cats[icat]; 00260 if (ncmp) *ncmp = cat->ncmp; 00261 if (cat->ncmp && (cmps || typs) ) { 00262 NMDDataType *types; char **names; int icmp; 00263 if (cmps) 00264 NMD_MALLOC(names,cat->ncmp,char*,"name array"); 00265 if (typs) 00266 NMD_MALLOC(types,cat->ncmp,NMDDataType,"name array"); 00267 for (icmp=0; icmp<cat->ncmp; icmp++) { 00268 if (cmps) names[icmp] = cat->cmps[icmp]->name; 00269 if (typs) types[icmp] = cat->cmps[icmp]->t; 00270 } 00271 if (cmps) *cmps = names; if (typs) *typs = types; 00272 } 00273 return 0; 00274 }
NMDErrorCode NMDObjectEnsureCategoryComponent | ( | NMD_metadata | obj, | |
char * | cat, | |||
char * | cmp, | |||
NMDDataType | type, | |||
NMDTruth * | nnew | |||
) |
Definition at line 134 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, CHKMEMQ, NMDCategoryAllocateNewComponent(), NMDCategoryTryGetComponent(), NMDFalse, NMDObjectAllocateNewCategory(), NMDObjectTryGetCategory(), NMDTrue, and NMD_metadata_item_::t.
Referenced by main(), and NMDCloneObjectStructure().
00135 { 00136 NMD_metadata_category ctg; NMD_metadata_item cpt; 00137 NMDTruth flg; NMDErrorCode ierr; 00138 CHECKHASNMDCOOKIE(obj); 00139 ierr = NMDObjectTryGetCategory(obj,cat,&ctg,&flg); NMD_ERR_RETURN(ierr); 00140 if (!flg) { 00141 ierr = NMDObjectAllocateNewCategory(obj,cat,&ctg); NMD_ERR_RETURN(ierr); 00142 } 00143 ierr = NMDCategoryTryGetComponent(ctg,cmp,&cpt,&flg); NMD_ERR_RETURN(ierr); 00144 if (flg) { 00145 if (nnew) *nnew = NMDFalse; 00146 if (type!=cpt->t) 00147 NMD_ERR_REPORTii 00148 ("Type incompatibility: old/new",(int)(cpt->t),(int)type); 00149 } else { 00150 if (nnew) *nnew = NMDTrue; 00151 ierr = NMDCategoryAllocateNewComponent 00152 (ctg,cmp,type,NULL); NMD_ERR_RETURN(ierr); 00153 } 00154 CHKMEMQ 00155 return 0; 00156 }
NMDErrorCode NMDObjectHasCategoryComponent | ( | NMD_metadata | obj, | |
char * | cat, | |||
char * | cmp, | |||
NMDTruth * | f | |||
) |
Definition at line 161 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, CHKMEMQ, NMDCategoryTryGetComponent(), and NMDObjectTryGetCategory().
Referenced by main().
00162 { 00163 NMD_metadata_category ctg; NMDErrorCode ierr; 00164 CHECKHASNMDCOOKIE(obj); 00165 ierr = NMDObjectTryGetCategory(obj,cat,&ctg,f); NMD_ERR_RETURN(ierr); 00166 if (*f) { 00167 ierr = NMDCategoryTryGetComponent(ctg,cmp,NULL,f); NMD_ERR_RETURN(ierr); 00168 } 00169 CHKMEMQ 00170 return 0; 00171 }