NMD
nmd.h
Go to the documentation of this file.
00001 #ifndef NMD_H
00002 #define NMD_H 1
00003 
00004 /*! \page types NMD Data Types
00005 
00006   Most NMD datatypes have two different definitions, depending on 
00007   whether Petsc is used or not.
00008 
00009   NMDTruth is only used for success parameters in routines
00010   such as NMDGetValue(). It has possible values NMDTrue and NMDFalse.
00011 */
00012 
00013 #if defined(NMD_HAVE_PETSC)
00014 #include "petsc.h"
00015 typedef PetscReal NMDRealtype;
00016 typedef PetscBool NMDTruth;
00017 #define NMDTrue PETSC_TRUE
00018 #define NMDFalse PETSC_FALSE
00019 typedef PetscErrorCode NMDErrorCode;
00020 #else
00021 typedef double NMDRealtype;
00022 typedef int NMDTruth;
00023 #define NMDTrue 1
00024 #define NMDFalse 0
00025 typedef int NMDErrorCode;
00026 #endif
00027 
00028 typedef enum {
00029   NMDInvalid, NMDInt, NMDReal, NMDString, NMDIntarray, NMDRealarray
00030 }  NMDDataType;
00031 extern const char *typenames[];
00032 
00033 typedef struct NMD_metadata_item_* NMD_metadata_item;
00034 typedef struct NMD_metadata_category_* NMD_metadata_category;
00035 typedef struct NMD_metadata_* NMD_metadata;
00036 typedef struct NMD_object_* NMD_object;
00037 
00038 #define NMDCOOKIE 32897432
00039 #define CHECKHASNMDCOOKIE(obj) { if (!obj) NMD_ERR_REPORT("Null object"); if (((NMD_object)(obj))->cookie!=NMDCOOKIE) NMD_ERR_REPORTi("Object has invalid cookie",((NMD_object)(obj))->cookie); }
00040 
00041 /*
00042  * Object
00043  */
00044 extern NMDErrorCode NMDCreateObject(NMD_metadata*);
00045 extern NMDErrorCode NMDDestroyObject(NMD_metadata);
00046 extern NMDErrorCode NMDViewObject(NMD_metadata);
00047 extern NMDErrorCode NMDBuildObjectStructure(NMD_metadata);
00048 extern NMDErrorCode NMDDestroyObjectStructure(NMD_metadata);
00049 extern NMDErrorCode NMDCloneObjectStructure(NMD_metadata,NMD_metadata*);
00050 extern NMDErrorCode NMDCloneObject(NMD_metadata,NMD_metadata);
00051 extern NMDErrorCode NMDReportObject
00052 (NMD_metadata,NMDTruth,const char**,const char**,
00053  const char,const char,const char);
00054 /*
00055  * Category
00056  */
00057 extern NMDErrorCode NMDObjectAllocateNewCategory
00058 (NMD_metadata,const char*,NMD_metadata_category*);
00059 extern NMDErrorCode NMDObjectTryGetCategory
00060 (NMD_metadata,const char*,NMD_metadata_category*,NMDTruth*);
00061 extern NMDErrorCode NMDObjectGetCategory(NMD_metadata,const char*,NMD_metadata_category*);
00062 extern NMDErrorCode NMDObjectGetOrCreateCategory
00063 (NMD_metadata obj,const char *cat,NMD_metadata_category *ctg);
00064 extern NMDErrorCode NMDRemoveCategory(NMD_metadata,const char*);
00065 extern NMDErrorCode NMDCopyCategory(NMD_metadata_category,NMD_metadata_category);
00066 extern NMDErrorCode NMDGetCategories(NMD_metadata,int*,char***);
00067 /*
00068  * Component
00069  */
00070 extern NMDErrorCode NMDCategoryAllocateNewComponent
00071 (NMD_metadata_category,const char*,NMDDataType,NMD_metadata_item*);
00072 extern NMDErrorCode NMDComponentDestroy(NMD_metadata_item);
00073 extern NMDErrorCode NMDCategoryCreateComponent(NMD_metadata,char*,char*);
00074 extern NMDErrorCode NMDCategoryGetComponents
00075 (NMD_metadata,const char*,int*,const char***,NMDDataType**);
00076 extern NMDErrorCode NMDCategoryGetOrCreateComponent
00077 (NMD_metadata_category,const char*,NMDDataType,NMD_metadata_item*);
00078 extern NMDErrorCode NMDCategoryTryGetComponent
00079 (NMD_metadata_category,const char*,NMD_metadata_item*,NMDTruth*);
00080 extern NMDErrorCode NMDObjectHasCategoryComponent
00081 (NMD_metadata,const char*,const char*,NMDTruth*);
00082 extern NMDErrorCode NMDObjectEnsureCategoryComponent
00083 (NMD_metadata,const char*,const char*,NMDDataType,NMDTruth*);
00084 extern NMDErrorCode NMDCategoryGetComponent
00085 (NMD_metadata_category,const char*,NMD_metadata_item*);
00086 extern NMDErrorCode NMDGetCategoryIGetComponents(NMD_metadata,int,int*,char***,NMDDataType**);
00087 /* values */
00088 extern NMDErrorCode NMDSetValue(NMD_metadata,const char*,const char*,NMDDataType,void*);
00089 extern NMDErrorCode NMDComponentSetValue(NMD_metadata_item,NMDDataType,void*);
00090 extern NMDErrorCode NMDComponentUnsetValue(NMD_metadata_item);
00091 extern NMDErrorCode NMDSetArrayValue
00092 (NMD_metadata,const char*,const char*,NMDDataType,void*,int);
00093 extern NMDErrorCode NMDComponentSetArrayValue
00094 (NMD_metadata_item,NMDDataType,void*,int);
00095 extern NMDErrorCode NMDCopyArrayValue
00096 (NMD_metadata,const char*,const char*,NMDDataType,void*,int);
00097 extern NMDErrorCode NMDGetValue
00098 (NMD_metadata,const char*,const char*,NMDDataType*,void*,NMDTruth*);
00099 extern NMDErrorCode NMDGetArrayValue
00100 (NMD_metadata,const char*,const char*,NMDDataType*,void*,int*,NMDTruth*);
00101 extern NMDErrorCode NMDCopyItemValues(NMD_metadata_item,NMD_metadata_item);
00102 extern NMDErrorCode NMDGetDataType(NMD_metadata,const char*,const char*,NMDDataType*t);
00103 extern NMDErrorCode NMDIsArrayType(NMDDataType type,NMDTruth*);
00104 extern NMDErrorCode NMDUnsetValue(NMD_metadata,const char*,const char*);
00105 
00106 extern NMDErrorCode NMDGetTypeMySQLName(NMDDataType,const char**);
00107 
00108 #if defined(NMD_HAVE_HDF5)
00109 /*
00110  * hdf5 dump
00111  */
00112 extern NMDErrorCode NMDObjectDumpToHDF5(NMD_metadata obj,const char*);
00113 #endif
00114 extern NMDErrorCode NMDObjectDumpToMySQL(NMD_metadata obj);
00115 
00116 /*
00117  * our own string library
00118  */
00119 typedef struct NMD_string_* NMD_string;
00120 
00121 extern NMDErrorCode NMDStringCreate(const char*,NMD_string*);
00122 extern NMDErrorCode NMDStringDestroy(NMD_string);
00123 extern NMDErrorCode NMDStringGetString(NMD_string str,const char **t);
00124 extern NMDErrorCode NMDStringConcat
00125 (char,NMD_string,char,NMD_string,char,NMD_string*);
00126 extern NMDErrorCode NMDStringAppend(char,NMD_string*,char,NMD_string,char);
00127 
00128 #define NMD_ERR_RETURN(a) if (a) {printf("Error in <%s>\n  line %d of file %s.\n",__FUNCT__,__LINE__,__FILE__); return a;}
00129 #define NMD_ERR_REPORT(a)     {printf("Error in <%s>\n  line %d of file %s:\n\n||  %s  ||  \n\n",            __FUNCT__,__LINE__,__FILE__,a); return 1;}
00130 #define NMD_ERR_REPORTs(a,b)     {printf("Error in <%s>\n  line %d of file %s:\n\n||  %s: %s  ||\n\n",     __FUNCT__,__LINE__,__FILE__,a,b); return 1;}
00131 #define NMD_ERR_REPORTss(a,b,c)                                             {printf("Error in <%s>\n  line %d of file %s:\n\n||  %s: %s,%s  ||\n\n",        __FUNCT__,__LINE__,__FILE__,a,b,c); return 1;}
00132 #define NMD_ERR_REPORTi(a,b)     {printf("Error in <%s>\n  line %d of file %s:\n\n||  %s: %d  ||\n\n",      __FUNCT__,__LINE__,__FILE__,a,b); return 1;}
00133 #define NMD_ERR_REPORTii(a,b,c)     {printf("Error in <%s>\n  line %d of file %s:\n\n||  %s: %d,%d  ||\n\n",        __FUNCT__,__LINE__,__FILE__,a,b,c); return 1;}
00134 #if defined(NMD_HAVE_PETSC)
00135 #define NMD_MALLOC(a,b,c,d)      \
00136   { NMDErrorCode merr; merr = PetscMalloc((b)*sizeof(c),&a); CHKERRQ(merr); \
00137     merr = PetscMemzero(a,(b)*sizeof(c)); CHKERRQ(merr); CHKMEMQ; }
00138 #define NMD_FREE(a) {NMDErrorCode merr; merr = PetscFree(a); CHKERRQ(merr); }
00139 #define NMD_STRDUP(a,b) { NMDErrorCode merr; merr = PetscStrallocpy(a,&b); CHKERRQ(merr); }
00140 #else
00141 #define NMD_MALLOC(a,b,c,d)      \
00142   { a = (c*)malloc((b)*sizeof(c));                 \
00143     if (!a) NMD_ERR_REPORTs("Could not allocate",d); \
00144     memset(a,0,(b)*sizeof(c)); }
00145 #define NMD_FREE(a) {free(a);}
00146 #define NMD_STRDUP(a,b) b = strdup(a);
00147 #endif
00148 
00149 #endif
00150