NMD
|
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 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 * 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