00001 #ifndef NMD_H
00002 #define NMD_H 1
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #if defined(NMD_HAVE_PETSC)
00014 #include "petsc.h"
00015 typedef PetscReal NMDRealtype;
00016 typedef PetscTruth 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
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,char**,char**,char,char,char);
00053
00054
00055
00056 extern NMDErrorCode NMDObjectAllocateNewCategory
00057 (NMD_metadata,const char*,NMD_metadata_category*);
00058 extern NMDErrorCode NMDObjectTryGetCategory
00059 (NMD_metadata,const char*,NMD_metadata_category*,NMDTruth*);
00060 extern NMDErrorCode NMDObjectGetCategory(NMD_metadata,char*,NMD_metadata_category*);
00061 extern NMDErrorCode NMDObjectGetOrCreateCategory
00062 (NMD_metadata obj,char *cat,NMD_metadata_category *ctg);
00063 extern NMDErrorCode NMDRemoveCategory(NMD_metadata,const char*);
00064 extern NMDErrorCode NMDCopyCategory(NMD_metadata_category,NMD_metadata_category);
00065 extern NMDErrorCode NMDGetCategories(NMD_metadata,int*,char***);
00066
00067
00068
00069 extern NMDErrorCode NMDCategoryAllocateNewComponent
00070 (NMD_metadata_category,const char*,NMDDataType,NMD_metadata_item*);
00071 extern NMDErrorCode NMDComponentDestroy(NMD_metadata_item);
00072 extern NMDErrorCode NMDCategoryCreateComponent(NMD_metadata,char*,char*);
00073 extern NMDErrorCode NMDCategoryGetComponents
00074 (NMD_metadata,char*,int*,char***,NMDDataType**);
00075 extern NMDErrorCode NMDCategoryGetOrCreateComponent
00076 (NMD_metadata_category,char*,NMDDataType,NMD_metadata_item*);
00077 extern NMDErrorCode NMDCategoryTryGetComponent
00078 (NMD_metadata_category,const char*,NMD_metadata_item*,NMDTruth*);
00079 extern NMDErrorCode NMDObjectHasCategoryComponent
00080 (NMD_metadata,char*,char*,NMDTruth*);
00081 extern NMDErrorCode NMDObjectEnsureCategoryComponent
00082 (NMD_metadata,char*,char*,NMDDataType,NMDTruth*);
00083 extern NMDErrorCode NMDCategoryGetComponent
00084 (NMD_metadata_category,char*,NMD_metadata_item*);
00085 extern NMDErrorCode NMDGetCategoryIGetComponents(NMD_metadata,int,int*,char***,NMDDataType**);
00086
00087 extern NMDErrorCode NMDSetValue(NMD_metadata,const char*,const char*,NMDDataType,void*);
00088 extern NMDErrorCode NMDComponentSetValue(NMD_metadata_item,NMDDataType,void*);
00089 extern NMDErrorCode NMDComponentUnsetValue(NMD_metadata_item);
00090 extern NMDErrorCode NMDSetArrayValue
00091 (NMD_metadata,const char*,const char*,NMDDataType,void*,int);
00092 extern NMDErrorCode NMDComponentSetArrayValue
00093 (NMD_metadata_item,NMDDataType,void*,int);
00094 extern NMDErrorCode NMDCopyArrayValue
00095 (NMD_metadata,const char*,const char*,NMDDataType,void*,int);
00096 extern NMDErrorCode NMDGetValue
00097 (NMD_metadata,const char*,const char*,NMDDataType*,void*,NMDTruth*);
00098 extern NMDErrorCode NMDGetArrayValue
00099 (NMD_metadata,char*,char*,NMDDataType*,void*,int*,NMDTruth*);
00100 extern NMDErrorCode NMDCopyItemValues(NMD_metadata_item,NMD_metadata_item);
00101 extern NMDErrorCode NMDGetDataType(NMD_metadata,char*,char*,NMDDataType*t);
00102 extern NMDErrorCode NMDIsArrayType(NMDDataType type,NMDTruth*);
00103 extern NMDErrorCode NMDUnsetValue(NMD_metadata,const char*,const char*);
00104
00105 extern PetscErrorCode NMDGetTypeMySQLName(NMDDataType,char**);
00106
00107 #if defined(NMD_HAVE_HDF5)
00108
00109
00110
00111 extern NMDErrorCode NMDObjectDumpToHDF5(NMD_metadata obj,char *fname);
00112 #endif
00113
00114
00115
00116
00117 typedef struct NMD_string_* NMD_string;
00118
00119 extern NMDErrorCode NMDStringCreate(char*,NMD_string*);
00120 extern NMDErrorCode NMDStringDestroy(NMD_string);
00121 extern NMDErrorCode NMDStringGetString(NMD_string str,char **t);
00122 extern NMDErrorCode NMDStringConcat
00123 (char,NMD_string,char,NMD_string,char,NMD_string*);
00124
00125 #define NMD_ERR_RETURN(a) if (a) {printf("Error in <%s>\n line %d of file %s.\n",__FUNCT__,__LINE__,__FILE__); return a;}
00126 #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;}
00127 #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;}
00128 #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;}
00129 #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;}
00130 #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;}
00131 #if defined(NMD_HAVE_PETSC)
00132 #define NMD_MALLOC(a,b,c,d) \
00133 { NMDErrorCode merr; merr = PetscMalloc((b)*sizeof(c),&a); CHKERRQ(merr); \
00134 merr = PetscMemzero(a,(b)*sizeof(c)); CHKERRQ(merr); CHKMEMQ; }
00135 #define NMD_FREE(a) {NMDErrorCode merr; merr = PetscFree(a); CHKERRQ(merr); }
00136 #define NMD_STRDUP(a,b) { NMDErrorCode merr; merr = PetscStrallocpy(a,&b); CHKERRQ(merr); }
00137 #else
00138 #define NMD_MALLOC(a,b,c,d) \
00139 { a = (c*)malloc((b)*sizeof(c)); \
00140 if (!a) NMD_ERR_REPORTs("Could not allocate",d); \
00141 memset(a,0,(b)*sizeof(c)); }
00142 #define NMD_FREE(a) {free(a);}
00143 #define NMD_STRDUP(a,b) b = strdup(a);
00144 #endif
00145
00146 #endif
00147