NMD
Functions
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, const char *cmp, NMDDataType type, NMD_metadata_item *cpt)
NMDErrorCode NMDObjectEnsureCategoryComponent (NMD_metadata obj, const char *cat, const char *cmp, NMDDataType type, NMDTruth *nnew)
NMDErrorCode NMDObjectHasCategoryComponent (NMD_metadata obj, const char *cat, const char *cmp, NMDTruth *f)
NMDErrorCode NMDCategoryTryGetComponent (NMD_metadata_category cat, const char *cmp, NMD_metadata_item *rcpt, NMDTruth *f)
NMDErrorCode NMDCategoryGetComponents (NMD_metadata obj, const char *cat, int *ncmp, const char ***cmps, NMDDataType **typs)
NMDErrorCode NMDCategoryGetComponent (NMD_metadata_category cat, const 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

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;
}

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;
}

Here is the call graph for this function:

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;
}

Here is the call graph for this function:

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;
}

Here is the call graph for this function:

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;
}

Here is the call graph for this function:

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;
}

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;
}

Here is the call graph for this function:

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;
}

Here is the call graph for this function:

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;
}

Here is the call graph for this function: