216 lines
No EOL
5.7 KiB
C
216 lines
No EOL
5.7 KiB
C
#ifndef ___IO_DEFS_H___
|
|
#define ___IO_DEFS_H___
|
|
|
|
#include "DICO.h"
|
|
#include "CCMath.h"
|
|
|
|
#define LSD_TEXT 0x01
|
|
#define LSD_WRITE 0x02
|
|
#define LSD_MEMORY 0x04
|
|
#define LSD_CREATE 0x08
|
|
#define LSD_FILE 0x10
|
|
#define LSD_DESTROY 0x20
|
|
|
|
#define LSD_ENCRYPT 0x40
|
|
|
|
_inline int BSWAP_U32(int x)
|
|
{
|
|
__asm
|
|
{
|
|
mov eax, x
|
|
bswap eax
|
|
mov x , eax
|
|
};
|
|
return x;
|
|
}
|
|
|
|
typedef enum {
|
|
LSD_Save = LSD_WRITE|LSD_FILE,
|
|
LSD_Load = LSD_CREATE|LSD_FILE,
|
|
LSD_Size = 0,
|
|
LSD_SaveM = LSD_WRITE|LSD_MEMORY,
|
|
LSD_LoadM = LSD_CREATE|LSD_MEMORY,
|
|
LSD_SaveT = LSD_WRITE|LSD_TEXT|LSD_FILE,
|
|
LSD_LoadT = LSD_CREATE|LSD_TEXT|LSD_FILE,
|
|
LSD_Destroy = LSD_DESTROY,
|
|
} LSD_Mode;
|
|
|
|
extern u32 LASLOAD_VersionUpdated;
|
|
|
|
typedef struct
|
|
{
|
|
FILE *F;
|
|
char *MemPtr;
|
|
u32 Size;
|
|
u32 Depth;
|
|
int LSD;
|
|
UNIC_Dico *Dico;
|
|
void *PrtStack[128];
|
|
u32 PrtStackSize;
|
|
u32 ModeText;
|
|
} IO_STRUCT;
|
|
|
|
|
|
#define SPECIAL_CODE_Txt BSWAP_U32('STAR')
|
|
#define SPECIAL_CODE_Bin BSWAP_U32('STAB')
|
|
#define SPECIAL_CODE_E BSWAP_U32('CLOS')
|
|
|
|
#define READSAVE_ENTRY()\
|
|
if (IO->LSD & LSD_Destroy) return;
|
|
|
|
|
|
|
|
#define CHECK_VERSION(DATAVERSION) \
|
|
u32 Version,SCode; \
|
|
IO->Depth++;\
|
|
SCode = (IO->LSD & LSD_TEXT) ? SPECIAL_CODE_Txt : SPECIAL_CODE_Bin; \
|
|
ReadSave(IO,&SCode,4); \
|
|
if (SCode == SPECIAL_CODE_Txt)\
|
|
IO->LSD |= LSD_TEXT;\
|
|
else\
|
|
if (SCode == SPECIAL_CODE_Bin)\
|
|
IO->LSD |= 0;\
|
|
else return IO_FAIL(IO); \
|
|
Version = DATAVERSION; \
|
|
ReadSave_String_Const(IO,"Version");\
|
|
ReadSave_U32(IO,&Version); \
|
|
if (Version > DATAVERSION) return IO_FAIL(IO);\
|
|
if (Version != DATAVERSION) LASLOAD_VersionUpdated = 1;
|
|
|
|
#define CHECK_END() \
|
|
SCode = SPECIAL_CODE_E; \
|
|
ReadSave_String_Const(IO,""); \
|
|
ReadSave(IO,&SCode,4); \
|
|
if (SCode != SPECIAL_CODE_E) return IO_FAIL(IO);\
|
|
IO->Depth--;\
|
|
return 0;
|
|
|
|
u32 IO_FAIL(IO_STRUCT *IO);
|
|
u32 IO_FREE(IO_STRUCT *IO);
|
|
|
|
void IO_SetName (IO_STRUCT *IO,char *Name);
|
|
double IO_DecodeNumber(char *Address);
|
|
|
|
void Signify_Ptr (IO_STRUCT *IO,void **Adress,u32 Size);
|
|
void ReadSave (IO_STRUCT *IO,void *Address,u32 Size,u32 Count = 1);
|
|
void ReadSave_U8 (IO_STRUCT *IO,u8 *Address,u32 Count = 1);
|
|
void ReadSave_U16 (IO_STRUCT *IO,u16 *Address,u32 Count = 1);
|
|
void ReadSave_U32 (IO_STRUCT *IO,u32 *Address,u32 Count = 1);
|
|
void ReadSave_S32 (IO_STRUCT *IO,s32 *Address,u32 Count = 1);
|
|
#define ReadSave_int ReadSave_S32
|
|
void ReadSave_FLOAT (IO_STRUCT *IO,float *Address,u32 Count = 1);
|
|
void ReadSave_String(IO_STRUCT *IO,char *Address);
|
|
void ReadSave_Color (IO_STRUCT *IO,u32 *Address,u32 Count = 1);
|
|
void ReadSave_String_Const(IO_STRUCT *IO,char *Address);
|
|
|
|
void ReadSave_Vector(IO_STRUCT *IO,Vector *Address,u32 Count = 1);
|
|
void ReadSave_Quat(IO_STRUCT *IO,Quat *Address,u32 Count = 1);
|
|
void ReadSave_Matrix(IO_STRUCT *IO,MATRIX *Address,u32 Count = 1);
|
|
|
|
void ReadSave_Name(IO_STRUCT *IO,u32 *Address,char *Descriptor = NULL, u32 Count = 1);
|
|
|
|
|
|
#define LOAD_XXX(DATADST,XTYPE) \
|
|
{ \
|
|
if (!*DATADST) return IO_FAIL(&IO); \
|
|
memset(*DATADST,0,sizeof(XTYPE)); \
|
|
IO.LSD = LSD_LoadT; \
|
|
IO.PrtStackSize = IO.Depth = IO.Size = 0; \
|
|
IOResLoad = XTYPE##_LoadSave(&IO,*DATADST); \
|
|
}
|
|
|
|
#define SAVE_XXX(XTYPE,DATA) \
|
|
{ \
|
|
IO.LSD = LSD_SaveT; \
|
|
IO.PrtStackSize = IO.Depth = IO.Size = 0; \
|
|
IOResSave = XTYPE##_LoadSave(&IO,DATA); \
|
|
}
|
|
|
|
#define FREE_XXX(XTYPE,DATA) \
|
|
{ \
|
|
IO.LSD = LSD_Destroy; \
|
|
IO.PrtStackSize = IO.Depth = IO.Size = 0; \
|
|
XTYPE##_LoadSave(&IO,DATA); \
|
|
IO_FREE(&IO);\
|
|
}
|
|
|
|
#define COPY_XXX(XTYPE,DATA) \
|
|
{ \
|
|
XTYPE *M; \
|
|
IO.LSD = LSD_Size; \
|
|
IO.PrtStackSize = IO.Depth = IO.Size = 0; \
|
|
XTYPE##_LoadSave(&IO,DATA); \
|
|
IO.MemPtr = (char *)malloc(IO.Size); \
|
|
IO.LSD = LSD_SaveM; \
|
|
IO.PrtStackSize = IO.Depth = IO.Size = 0; \
|
|
XTYPE##_LoadSave(&IO,DATA); \
|
|
M = (XTYPE *)malloc(sizeof(XTYPE)); \
|
|
memset(M,0,sizeof(XTYPE)); \
|
|
IO.LSD = LSD_LoadM; \
|
|
IO.PrtStackSize = IO.Depth = IO.Size = 0; \
|
|
XTYPE##_LoadSave(&IO,M); \
|
|
free(IO.MemPtr); \
|
|
return M; \
|
|
}
|
|
|
|
#define SIZE_XXX(XTYPE,DATA) \
|
|
{ \
|
|
IO.LSD = LSD_Size; \
|
|
IO.PrtStackSize = IO.Depth = IO.Size = 0; \
|
|
XTYPE##_LoadSave(&IO,DATA); \
|
|
return IO.Size; \
|
|
}
|
|
|
|
#define DECLARE_IO_C(XTYPE)\
|
|
u32 Load##XTYPE(XTYPE **DATADST,char *FileName ,UNIC_Dico *Dico, u32 AllowUpdate)\
|
|
{\
|
|
IO_STRUCT IO; u32 IOResLoad; u32 IOResSave;\
|
|
IO.F = fopen(FileName, "rb");\
|
|
if (!IO.F) return IO_FAIL(&IO);\
|
|
IO.Dico = Dico;\
|
|
LASLOAD_VersionUpdated = 0;\
|
|
LOAD_XXX(DATADST,XTYPE); \
|
|
fclose(IO.F);\
|
|
if (AllowUpdate && !IOResLoad && LASLOAD_VersionUpdated)\
|
|
{ IO.F = fopen(FileName, "wb");\
|
|
if (IO.F) {SAVE_XXX(XTYPE, *DATADST);}}\
|
|
return IOResLoad;\
|
|
}\
|
|
u32 Save##XTYPE(XTYPE *DATASOURCE,char *FileName, UNIC_Dico *Dico)\
|
|
{\
|
|
IO_STRUCT IO; u32 IOResSave;\
|
|
IO.F = fopen(FileName, "wb");\
|
|
if (!IO.F) return IO_FAIL(&IO);\
|
|
IO.Dico = Dico;\
|
|
SAVE_XXX(XTYPE, DATASOURCE);\
|
|
fclose(IO.F);\
|
|
return IOResSave;\
|
|
}\
|
|
XTYPE* Copy##XTYPE(XTYPE *DATASOURCE, UNIC_Dico *Dico)\
|
|
{\
|
|
IO_STRUCT IO;\
|
|
IO.Dico = Dico;\
|
|
COPY_XXX(XTYPE,DATASOURCE);\
|
|
}\
|
|
unsigned int Size##XTYPE(XTYPE *DATASOURCE, UNIC_Dico *Dico)\
|
|
{\
|
|
IO_STRUCT IO;\
|
|
IO.Dico = Dico;\
|
|
SIZE_XXX(XTYPE,DATASOURCE);\
|
|
}\
|
|
void Free##XTYPE(XTYPE *DATASOURCE, UNIC_Dico *Dico)\
|
|
{\
|
|
IO_STRUCT IO;\
|
|
IO.Dico = Dico;\
|
|
FREE_XXX(XTYPE,DATASOURCE);\
|
|
}
|
|
|
|
#define DECLARE_IO_H(XTYPE, API)\
|
|
u32 API Load##XTYPE(XTYPE **DATADST,char *FName ,UNIC_Dico *Dico = NULL, u32 AllowUpdate = 0);\
|
|
u32 API Save##XTYPE(XTYPE *DATASOURCE,char *FName , UNIC_Dico *Dico = NULL);\
|
|
XTYPE API *Copy##XTYPE(XTYPE *DATASOURCE, UNIC_Dico *Dico = NULL);\
|
|
void API Free##XTYPE(XTYPE *DATASOURCE, UNIC_Dico *Dico = NULL);\
|
|
u32 API Size##XTYPE(XTYPE *DATASOURCE, UNIC_Dico *Dico = NULL);\
|
|
u32 API XTYPE##_LoadSave(IO_STRUCT *IO,XTYPE *M);\
|
|
|
|
#endif |