nmdcmp.c File Reference

#include <stdlib.h>
#include "memory.h"
#include "nmd.h"
#include "nmd_impl.h"

Include dependency graph for nmdcmp.c:

Go to the source code of this file.

Functions

static NMDErrorCode NMDAllocateComponent (NMD_metadata_item *rcmp)
NMDErrorCode NMDCategoryAllocateNewComponent (NMD_metadata_category cat, const char *cmp, NMDDataType type, NMD_metadata_item *rcpt)
NMDErrorCode NMDComponentDestroy (NMD_metadata_item cmp)
NMDErrorCode NMDCategoryGetOrCreateComponent (NMD_metadata_category cat, char *cmp, NMDDataType type, NMD_metadata_item *cpt)
NMDErrorCode NMDObjectEnsureCategoryComponent (NMD_metadata obj, char *cat, char *cmp, NMDDataType type, NMDTruth *nnew)
NMDErrorCode NMDObjectHasCategoryComponent (NMD_metadata obj, char *cat, char *cmp, NMDTruth *f)
NMDErrorCode NMDCategoryTryGetComponent (NMD_metadata_category cat, const char *cmp, NMD_metadata_item *rcpt, NMDTruth *f)
NMDErrorCode NMDCategoryGetComponents (NMD_metadata obj, char *cat, int *ncmp, char ***cmps, NMDDataType **typs)
NMDErrorCode NMDCategoryGetComponent (NMD_metadata_category cat, char *cmp, NMD_metadata_item *cpt)
NMDErrorCode NMDGetCategoryIGetComponents (NMD_metadata obj, int icat, int *ncmp, char ***cmps, NMDDataType **typs)
NMDErrorCode NMDComponentSetValue (NMD_metadata_item cpt, NMDDataType t, void *v)
NMDErrorCode NMDComponentUnsetValue (NMD_metadata_item cpt)
NMDErrorCode NMDComponentSetArrayValue (NMD_metadata_item cpt, NMDDataType t, void *v, int l)
PetscErrorCode NMDCopyItemValues (NMD_metadata_item src, NMD_metadata_item tar)


Function Documentation

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:


Generated on Sun Oct 4 03:59:29 2009 for NMD by  doxygen 1.5.9