#ifndef FMT1_STRUCT_H
#define FMT1_STRUCT_H
typedef struct FMT1_Metadata_Type FMT1_Metadata;
typedef struct FMT1_Variable_Type FMT1_Variable;
typedef struct FMT1_Diskio_Type{
ABS_DISKIO_TYPE
/* FMT1 specific members */
FILE *fp;
char *label;
float starttime;
float dt;
int framesize;
int datatype;
void *framevals;
FMT1_Metadata **autoSAVE_famdi;
FMT1_Variable **autoSAVE_favi;
int writeposition;
int flush_frame_offset;
short is_appendmode;
}FMT1_Diskio;
extern int FMT1_NOP();
/*FMT1_Diskio Methods */
extern Abs_Metadata* FMT1_ConstructGlobalAttr(/* char *name, Abs_Type type, long size */);
extern Abs_Variable* FMT1_ConstructVar(/* char *name, Abs_Type type, Abs_Varshape *shape */);
extern int FMT1_FlushFile();
extern int FMT1_DestructChildInterfaces();
extern int FMT1_DestructFile();
extern int FMT1_IsCoordVar(/*char *varname */);
extern Abs_Variable* FMT1_ConstructCoordVar(/* char *coordname */);
extern int FMT1_SetFile(/*char *fname, char mode */);
extern int FMT1_OpenFile(/*char *fname, char mode */);
extern int FMT1_ResetDataOffset();
extern int FMT1_ResetFile();
extern int FMT1_CloseFile();
extern void FMT1_GatherFileInfo();
extern int FMT1_BufferLabel();
extern int FMT1_BufferStartTime();
extern int FMT1_BufferDt();
extern int FMT1_BufferFrameSize();
extern int FMT1_BufferDatatype();
extern int FMT1_Get_HeaderSize();
extern int FMT1_Get_DataType();
extern float FMT1_GetStartTime();
extern float FMT1_GetDt();
extern int FMT1_SetMetadataInterface(/* int famdi_offset, Abs_Metadata *amdi */);
extern int FMT1_SetAppendMode(/* short appendmode */);
extern int FMT1_SetVariableInterface(/* int favi_offset, Abs_Variable *avi */);
extern int FMT1_SetMetadataValues(/* int famdi_offset, void *vals, long start, long count */);
extern int FMT1_SetVariableValues(/* int favi_offset, void *vals, long start[], long count[] */);
extern int FMT1_FillAllVariableValues();
extern int FMT1_FillVariableValues(/* int favi_offset */);
extern char* FMT1_CreateIndexedName(/*char *clientname, int clientindex*/);
extern char* FMT1_RecreateNameAndIndex(/*char *nameinfile, int *index */);
/* Private Methods */
extern int FMT1_WriteHeader();
extern int FMT1_Get_FrameSize();
struct FMT1_Metadata_Type{
ABS_METADATA_TYPE
/* FMT1 specific members */
short propmodified;
};
/*FMT1 Metadata Methods */
/*private: */
extern int FMT1_CreateAttr(/* Abs_Type type, long size*/);
/*public: */
extern int FMT1_SetAttrType(/* Abs_Type type */);
extern int FMT1_SetAttrSize(/* long size */);
extern int FMT1_SetAttrValues(/* void *vals, long start_index, long count */);
extern int FMT1_RenameAttr(/* char *newname */);
extern int FMT1_FlushAttr();
extern int FMT1_DeleteAttr();
extern int FMT1_DummyDestructAttr();
extern int FMT1_DestructAttr();
extern int FMT1_FlushMetadataValues();
struct FMT1_Variable_Type{
ABS_VARIABLE_TYPE
/* Netcdf specific members */
void *vals;
int nvalallocations;
short propmodified;
};
/*FMT1 Variable Methods */
extern Abs_Metadata* FMT1_ConstructLocalAttr(/* char *name, Abs_Type type, long size */);
/*private: */
extern int FMT1_CreateVar(/*char *name, Abs_Type type, Abs_Varshape * */);
extern int FMT1_IsVarName(/*char *name*/);
/*public: */
extern int FMT1_SetVarShape(/* Abs_Varshape* shape */);
extern int FMT1_SetVarType(/* Abs_Type type */);
extern int FMT1_SetVarValues(/* void *vals, long start_index[], long count[] */);
extern Abs_Varshape* FMT1_GetVarShape();
extern Abs_Type FMT1_GetVarType();
extern size_t FMT1_GetVarTypeSize();
extern int FMT1_GetVarValues(/* void *vals, long start_index[], long count[]*/);
extern int FMT1_RenameVar(/* char *newname */);
extern int FMT1_DeleteVar();
extern int FMT1_FlushVar();
extern int FMT1_DummyDestructVar();
extern int FMT1_DestructVar();
/* Global array of FMT1 types */
extern fmt1_type FMT1_type[];
/* Type conversion functions */
extern fmt1_type Abs_Type_To_fmt1_type();
extern Abs_Type fmt1_type_To_Abs_Type();
extern void* FMT1_Convert_To_fmt1_type();
/** Some FMT1 helper functions **/
extern void FMT1_FillIndexedAttrName();
extern void FMT1_FillIndexedVarName();
/* Notification for an unsupported type */
#define FMT1_INVALID (fmt1_type)-100
#define FMT1_FRAME_INCREMENT 20
#endif