NMD
|
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().
{ NMD_metadata_item cmp; NMD_MALLOC(cmp,1,struct NMD_metadata_item_,"component"); cmp->cookie = NMDCOOKIE; cmp->set = NMDFalse; *rcmp = cmp; CHKMEMQ; return 0; }
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().
{ NMD_metadata_item cpt; int idx; NMDErrorCode ierr; /* * if we are about to overflow, * reallocate the components in this category */ if (cat->ncmp >= cat->alloc) { NMD_metadata_item* newcmps; int newalloc; newalloc = 2*cat->alloc; ierr = PetscMalloc (newalloc*sizeof(struct NMD_metadata_item_),&newcmps); CHKERRQ(ierr); for (idx=0; idx<cat->ncmp; idx++) newcmps[idx] = cat->cmps[idx]; ierr = PetscFree(cat->cmps); CHKERRQ(ierr); cat->cmps = newcmps; cat->alloc = newalloc; } /* * with space guaranteed, create the component */ idx = cat->ncmp++; ierr = NMDAllocateComponent(&cpt); NMD_ERR_RETURN(ierr); NMD_STRDUP(cmp,cpt->name); cpt->t = type; cpt->set = NMDFalse; cat->cmps[idx] = cpt; if (rcpt) *rcpt = cpt; CHKMEMQ; return 0; }
NMDErrorCode NMDCategoryGetComponent | ( | NMD_metadata_category | cat, |
const 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().
{ NMDTruth flg; NMDErrorCode ierr; CHECKHASNMDCOOKIE(cat); ierr = NMDCategoryTryGetComponent (cat,cmp,cpt,&flg); NMD_ERR_RETURN(ierr); if (!flg) NMD_ERR_REPORTss("Could not find component in category",cmp,cat->name); CHKMEMQ; return 0; }
NMDErrorCode NMDCategoryGetComponents | ( | NMD_metadata | obj, |
const char * | cat, | ||
int * | ncmp, | ||
const 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().
{ NMD_metadata_category catobj; int icmp; const char **names; NMDDataType *types; NMDErrorCode ierr; CHECKHASNMDCOOKIE(obj); ierr = NMDObjectGetCategory(obj,cat,&catobj); CHKERRQ(ierr); if (ncmp) *ncmp = catobj->ncmp; if (cmps) { NMD_MALLOC(names,catobj->ncmp,char*,"name array"); for (icmp=0; icmp<catobj->ncmp; icmp++) names[icmp] = catobj->cmps[icmp]->name; *cmps = names; } if (typs) { NMD_MALLOC(types,catobj->ncmp,NMDDataType,"type array"); for (icmp=0; icmp<catobj->ncmp; icmp++) types[icmp] = catobj->cmps[icmp]->t; *typs = types; } CHKMEMQ; return 0; }
NMDErrorCode NMDCategoryGetOrCreateComponent | ( | NMD_metadata_category | cat, |
const 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().
{ NMD_metadata_item cnew; NMDTruth flg; NMDErrorCode ierr; CHECKHASNMDCOOKIE(cat); ierr = NMDCategoryTryGetComponent(cat,cmp,&cnew,&flg); NMD_ERR_RETURN(ierr); if (flg) { if (type!=cnew->t) NMD_ERR_REPORTii ("Type incompatibility: old/new",(int)(cnew->t),(int)type); if (cpt) *cpt = cnew; } else { ierr = NMDCategoryAllocateNewComponent (cat,cmp,type,cpt); NMD_ERR_RETURN(ierr); } CHKMEMQ; return 0; }
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().
{ int icmp; CHECKHASNMDCOOKIE(cat); *f = NMDFalse; for (icmp=0; icmp<cat->ncmp; icmp++) { NMD_metadata_item cpt = cat->cmps[icmp]; CHECKHASNMDCOOKIE(cpt); if (strcmp(cmp,cpt->name)==0) { *f = NMDTrue; if (rcpt) *rcpt = cpt; break; } } CHKMEMQ; return 0; }
Definition at line 72 of file nmdcmp.c.
References NMD_metadata_item_::cc, NMD_intarray_struct::data, NMD_realarray_struct::data, NMD_metadata_item_::ii, NMD_intarray_struct::length, NMD_realarray_struct::length, NMD_metadata_item_::name, NMD_FREE, NMDIntarray, NMDRealarray, NMDString, NMD_metadata_item_::rr, NMD_metadata_item_::t, NMD_intarray_struct::unique, and NMD_realarray_struct::unique.
Referenced by NMDDestroyObject().
{ switch (cmp->t) { case NMDIntarray : if (cmp->ii) { struct NMD_intarray_struct *arraystruct = (struct NMD_intarray_struct *)(cmp->ii); if (arraystruct->length>0 && arraystruct->unique==1) NMD_FREE(arraystruct->data); NMD_FREE(cmp->ii); } ; break; case NMDRealarray : if (cmp->rr) { struct NMD_realarray_struct *arraystruct = (struct NMD_realarray_struct *)(cmp->rr); if (arraystruct->length>0 && arraystruct->unique==1) NMD_FREE(arraystruct->data); NMD_FREE(cmp->rr); } ; break; case NMDString : NMD_FREE(cmp->cc); break; default : /* other components need no destructor */ break; } NMD_FREE(cmp->name); NMD_FREE(cmp); return 0; }
NMDErrorCode NMDComponentSetArrayValue | ( | NMD_metadata_item | cpt, |
NMDDataType | t, | ||
void * | v, | ||
int | l | ||
) |
Definition at line 323 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, NMD_intarray_struct::data, NMD_realarray_struct::data, NMD_metadata_item_::ii, NMD_intarray_struct::length, NMD_realarray_struct::length, NMD_MALLOC, NMDComponentSetValue(), NMDInt, NMDIntarray, NMDReal, NMDRealarray, NMDString, NMDTrue, NMD_metadata_item_::rr, NMD_metadata_item_::set, NMD_metadata_item_::t, NMD_intarray_struct::unique, and NMD_realarray_struct::unique.
Referenced by NMDSetArrayValue().
{ NMDErrorCode ierr; CHECKHASNMDCOOKIE(cpt); switch (cpt->t) { case NMDInt : case NMDReal : case NMDString : ierr = NMDComponentSetValue(cpt,cpt->t,v); NMD_ERR_RETURN(ierr); break; case NMDIntarray : { struct NMD_intarray_struct* iistruct; NMD_MALLOC(iistruct,1,struct NMD_intarray_struct,"int array struct"); iistruct->unique = 0; iistruct->length = l; iistruct->data = *(int**)v; cpt->ii = iistruct; break;} case NMDRealarray : { struct NMD_realarray_struct* rrstruct; NMD_MALLOC(rrstruct,1,struct NMD_realarray_struct,"real array struct"); rrstruct->unique = 0; rrstruct->length = l; rrstruct->data = *(NMDRealtype**)v; cpt->rr = rrstruct; break;} default : NMD_ERR_REPORTi("Unknown type",(int)t) } cpt->set = NMDTrue; return 0; }
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().
{ CHECKHASNMDCOOKIE(cpt); if (t!=cpt->t) NMD_ERR_REPORT("Type conflict"); switch (cpt->t) { case NMDInt : cpt->i = *(int*)v; break; case NMDReal : cpt->r = *(double*)v; break; case NMDString : NMD_STRDUP((char*)v,cpt->cc); break; case NMDIntarray : case NMDRealarray : NMD_ERR_REPORT("Please use NMDSetArrayValue"); break; default : NMD_ERR_REPORTi("Unknown type",(int)t); break; } cpt->set = NMDTrue; return 0; }
Definition at line 297 of file nmdcmp.c.
References NMD_metadata_item_::cc, CHECKHASNMDCOOKIE, NMD_intarray_struct::data, NMD_realarray_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().
{ CHECKHASNMDCOOKIE(cpt); switch (cpt->t) { case NMDInt : case NMDReal : break; case NMDString : NMD_FREE(cpt->cc); break; case NMDIntarray : { struct NMD_intarray_struct* iistruct = cpt->ii; NMD_FREE(iistruct->data); NMD_FREE(iistruct); break;} case NMDRealarray : { struct NMD_realarray_struct* rrstruct = cpt->rr; NMD_FREE(rrstruct->data); NMD_FREE(rrstruct); break;} default : NMD_ERR_REPORTi("Unknown type",cpt->t); break; } cpt->set = NMDFalse; return 0; }
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_intarray_struct::data, NMD_realarray_struct::data, NMD_metadata_item_::i, NMD_metadata_item_::ii, NMD_intarray_struct::length, NMD_realarray_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_intarray_struct::unique, and NMD_realarray_struct::unique.
Referenced by NMDCloneObject(), and NMDCopyCategory().
{ tar->set = src->set; if (!src->set) goto done; switch (src->t) { case NMDInt : tar->i = src->i; break; case NMDReal : tar->r = src->r ; break; case NMDString : NMD_STRDUP(src->cc,tar->cc); break; case NMDIntarray : { struct NMD_intarray_struct *tarstruct,*srcstruct = src->ii; int length=srcstruct->length; NMD_MALLOC(tarstruct,1,struct NMD_intarray_struct,"copied int array"); tarstruct->length = length; tarstruct->unique = srcstruct->unique; if (srcstruct->unique) { int *a1=srcstruct->data,*a2; int i; NMD_MALLOC(a2,length,int,"int array data"); for (i=0; i<length; i++) a2[i] = a1[i]; tarstruct->data = a2; } else tarstruct->data = srcstruct->data; tar->ii = tarstruct; } ; break; case NMDRealarray : { struct NMD_realarray_struct *tarstruct,*srcstruct = src->rr; int length=srcstruct->length; NMD_MALLOC(tarstruct,1,struct NMD_realarray_struct,"copied real array"); tarstruct->length = length; tarstruct->unique = srcstruct->unique; if (srcstruct->unique) { NMDRealtype *a1=srcstruct->data,*a2; int i; NMD_MALLOC(a2,length,NMDRealtype,"real array data"); for (i=0; i<length; i++) a2[i] = a1[i]; tarstruct->data = a2; } else tarstruct->data = srcstruct->data; tar->rr = tarstruct; } ; break; default : NMD_ERR_REPORTi("Can not copy items of type",(int)(src->t)); break; } done: CHKMEMQ; return 0; }
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.
{ NMD_metadata_category cat; CHECKHASNMDCOOKIE(obj); cat = obj->cats[icat]; if (ncmp) *ncmp = cat->ncmp; if (cat->ncmp && (cmps || typs) ) { NMDDataType *types; char **names; int icmp; if (cmps) NMD_MALLOC(names,cat->ncmp,char*,"name array"); if (typs) NMD_MALLOC(types,cat->ncmp,NMDDataType,"name array"); for (icmp=0; icmp<cat->ncmp; icmp++) { if (cmps) names[icmp] = cat->cmps[icmp]->name; if (typs) types[icmp] = cat->cmps[icmp]->t; } if (cmps) *cmps = names; if (typs) *typs = types; } return 0; }
NMDErrorCode NMDObjectEnsureCategoryComponent | ( | NMD_metadata | obj, |
const char * | cat, | ||
const 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().
{ NMD_metadata_category ctg; NMD_metadata_item cpt; NMDTruth flg; NMDErrorCode ierr; CHECKHASNMDCOOKIE(obj); ierr = NMDObjectTryGetCategory(obj,cat,&ctg,&flg); NMD_ERR_RETURN(ierr); if (!flg) { ierr = NMDObjectAllocateNewCategory(obj,cat,&ctg); NMD_ERR_RETURN(ierr); } ierr = NMDCategoryTryGetComponent(ctg,cmp,&cpt,&flg); NMD_ERR_RETURN(ierr); if (flg) { if (nnew) *nnew = NMDFalse; if (type!=cpt->t) NMD_ERR_REPORTii ("Type incompatibility: old/new",(int)(cpt->t),(int)type); } else { if (nnew) *nnew = NMDTrue; ierr = NMDCategoryAllocateNewComponent (ctg,cmp,type,NULL); NMD_ERR_RETURN(ierr); } CHKMEMQ; return 0; }
NMDErrorCode NMDObjectHasCategoryComponent | ( | NMD_metadata | obj, |
const char * | cat, | ||
const char * | cmp, | ||
NMDTruth * | f | ||
) |
Definition at line 161 of file nmdcmp.c.
References CHECKHASNMDCOOKIE, CHKMEMQ, NMDCategoryTryGetComponent(), and NMDObjectTryGetCategory().
Referenced by main().
{ NMD_metadata_category ctg; NMDErrorCode ierr; CHECKHASNMDCOOKIE(obj); ierr = NMDObjectTryGetCategory(obj,cat,&ctg,f); NMD_ERR_RETURN(ierr); if (*f) { ierr = NMDCategoryTryGetComponent(ctg,cmp,NULL,f); NMD_ERR_RETURN(ierr); } CHKMEMQ; return 0; }