JD2022-TU1/main/extern/Camcam/DLLInc/IO_Defs.h

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