JD2022-TU1/main/extern/Camcam/CCIO/IO_BASE.cpp

370 lines
No EOL
7 KiB
C++

#include <memory.h>
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "IO_Defs.h"
u32 LASLOAD_VersionUpdated = 0;
#define MODE_TEXT (IO->LSD & LSD_TEXT)
__inline u32 IsDeci(char H)
{
if ((H >= '0') && (H <= '9')) return H + 1 - '0' ;
return 0;
}
__inline u32 IsHex(char H)
{
if (IsDeci(H)) return IsDeci(H);
if ((H >= 'a') && (H <= 'f')) return H + 1 + 10 - 'a' ;
if ((H >= 'A') && (H <= 'F')) return H + 1 + 10 - 'A' ;
return 0;
}
double IO_DecodeNumber(char *Address)
{
double RetValue;
char *Decode;
float Neg;
Neg = 1.0f;
RetValue = 0.0f;
Decode = Address;
if (*Decode == '-')
{
Neg = -1.0f;
Decode++;
}
if (*Decode == '+') Decode++;
while ((*Decode >= '0') && (*Decode <= '9'))
{
RetValue *= 10.0f;
RetValue += (float)(*(Decode++) - '0');
}
if ((*(Decode) == '.') || (*(Decode) == ','))
{
float Div = 0.1f;
Decode++;
while ((*Decode >= '0') && (*Decode <= '9'))
{
RetValue += (float)(*(Decode++) - '0') * Div;
Div /= 10.0f;
}
}
if ((*(Decode) == 'e') || (*(Decode) == 'E'))
{
s32 Exp,Sign;
Sign = 1;
Exp = 0;
Decode++;
if (*(Decode) == '-') {Sign = -1;Decode++;};
if (*(Decode) == '+') {Decode++;};
while ((*Decode >= '0') && (*Decode <= '9'))
{
Exp *= 10;
Exp += *Decode++ - '0';
}
RetValue *= pow(10.0f,(float)(Sign * Exp));
}
RetValue *= Neg;//*/
return RetValue;
}
u32 IO_FAIL(IO_STRUCT *IO)
{
IO->Depth--;
return -1;
}
u32 IO_FREE(IO_STRUCT *IO)
{
while (IO->PrtStackSize--)
{
if (IO->PrtStack[IO->PrtStackSize])
{
free(IO->PrtStack[IO->PrtStackSize]);
}
IO->PrtStack[IO->PrtStackSize] = NULL;
};
IO->PrtStackSize = 0;
return 0;
}
void IO_SetName (IO_STRUCT *IO,char *Name)
{
}
void Signify_Ptr(IO_STRUCT *IO,void **Adress,u32 Size)
{
if (IO->LSD & LSD_CREATE)
{
if (Size)
{
*Adress =malloc(Size);
memset(*Adress,0,Size);
} else
*Adress = NULL;
}
if (IO->LSD & LSD_Destroy)
{
if (*Adress)
IO->PrtStack[IO->PrtStackSize++] = *Adress;
}
}
void ReadSave_SYS(IO_STRUCT *IO,void *Address,u32 Size)
{
if (Size == 0) return;
switch (IO->LSD)
{
case LSD_LoadT:
case LSD_Load: fread(Address, Size , 1 , IO->F); break;
case LSD_SaveT:
case LSD_Save: fwrite(Address, Size , 1 , IO->F); break;
case LSD_SaveM: memcpy(IO->MemPtr + IO->Size,Address,Size);break;
case LSD_LoadM: memcpy(Address,IO->MemPtr + IO->Size,Size);break;
default:;break;
}
IO->Size += Size;
}
void ReadSave_Text_Word(IO_STRUCT *IO,char *Address)
{
READSAVE_ENTRY();
do
{
ReadSave_SYS(IO,Address++,1);
}
while (*(Address-1) <= 32);
do
{
ReadSave_SYS(IO,Address++,1);
}
while (*(Address-1) > 32);
}
void ReadSave(IO_STRUCT *IO,void *Address,u32 Size,u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
char *ADD;
ADD = (char *)Address;
while(Count--)
{
ReadSave_SYS(IO,ADD,Size);
ADD += Size;
}
}
void ReadSave_U32(IO_STRUCT *IO,u32 *Address,u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
while(Count--)
{
if (MODE_TEXT)
{
char LOCALTEXT[256];
sprintf(LOCALTEXT,"%d ",*Address);
ReadSave_Text_Word(IO,(char*)LOCALTEXT);
*(Address++) = (u32)IO_DecodeNumber(LOCALTEXT);
} else
{
ReadSave_SYS(IO,Address,sizeof(u32));
Address ++;
}
}
}
void ReadSave_S32(IO_STRUCT *IO,s32 *Address,u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
while(Count--)
{
if (MODE_TEXT)
{
char LOCALTEXT[256];
sprintf(LOCALTEXT,"%d ",*Address);
ReadSave_Text_Word(IO,(char*)LOCALTEXT);
*(Address++) = (s32)IO_DecodeNumber(LOCALTEXT);
} else
{
ReadSave_SYS(IO,Address,sizeof(u32));
Address ++;
}
}
}
void ReadSave_U8(IO_STRUCT *IO,u8 *Address,u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
while(Count--)
{
if (MODE_TEXT)
{
char LOCALTEXT[256],*Decode;
sprintf(LOCALTEXT,"%d ",*Address);
ReadSave_Text_Word(IO,(char*)LOCALTEXT);
*(Address++) = (u8)IO_DecodeNumber(LOCALTEXT);
} else
{
ReadSave_SYS(IO,Address,sizeof(u8));
Address ++;
}
}
}
void ReadSave_U16(IO_STRUCT *IO,u16 *Address,u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
while(Count--)
{
if (MODE_TEXT)
{
char LOCALTEXT[256];
sprintf(LOCALTEXT,"%d ",*Address);
ReadSave_Text_Word(IO,(char*)LOCALTEXT);
*(Address++) = (u16)IO_DecodeNumber(LOCALTEXT);
} else
{
ReadSave_SYS(IO,Address,sizeof(u16));
Address ++;
}
}
}
void ReadSave_FLOAT(IO_STRUCT *IO,float *Address,u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
while(Count--)
{
if (MODE_TEXT)
{
char LOCALTEXT[256];
sprintf(LOCALTEXT,"%g ",*Address);
ReadSave_Text_Word(IO,(char*)LOCALTEXT);
*(Address++) = (float)IO_DecodeNumber(LOCALTEXT);
} else
{
ReadSave_SYS(IO,Address,sizeof(float));
Address ++;
}
}
}
void ReadSave_String(IO_STRUCT *IO,char *Address)
{
char Quote;
READSAVE_ENTRY();
Quote = '"';
ReadSave_SYS(IO,&Quote,1);
do
{
if (*Address == 0) *Address = '"';
ReadSave_SYS(IO,Address++,1);
}
while (*(Address-1) != '"');
*(Address-1) = 0;
}
void ReadSave_Color(IO_STRUCT *IO,u32 *Address,u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
while(Count--)
{
if (MODE_TEXT)
{
char LOCALTEXT[256];
sprintf(LOCALTEXT,"%08X ",*Address);
ReadSave_Text_Word(IO,(char*)LOCALTEXT);
*(Address++) = (u32)((((IsHex(*(LOCALTEXT + 0))-1)*16 + (IsHex(*(LOCALTEXT + 1))-1)) << 24) +
(((IsHex(*(LOCALTEXT + 2))-1)*16 + (IsHex(*(LOCALTEXT + 3))-1)) << 16) +
(((IsHex(*(LOCALTEXT + 4))-1)*16 + (IsHex(*(LOCALTEXT + 5))-1)) << 8) +
(((IsHex(*(LOCALTEXT + 6))-1)*16 + (IsHex(*(LOCALTEXT + 7))-1)) ));
} else
{
ReadSave_SYS(IO,Address,sizeof(u32));
Address ++;
}
}
}
void ReadSave_String_Const(IO_STRUCT *IO,char *Address)
{
char Quote;
READSAVE_ENTRY();
Quote = ' ';
char LocalString[2048];
if (!MODE_TEXT) return;
sprintf(LocalString,"\r\n<%s>",Address);
Address = LocalString;
do
{
ReadSave_SYS(IO,Address++,1);
}
while (*(Address-1) != '>');
ReadSave_SYS(IO,&Quote,1);
}
void ReadSave_Vector(IO_STRUCT *IO,Vector *Address,u32 Count)
{
READSAVE_ENTRY();
for (int i = 0; i < Count ; i ++)
{
char TEXT[16];
sprintf(TEXT,"V %d",i);
ReadSave_String_Const(IO,TEXT);
ReadSave_FLOAT(IO,&Address->x);
ReadSave_FLOAT(IO,&Address->y);
ReadSave_FLOAT(IO,&Address->z);
Address ++;
}
}
void ReadSave_Quat(IO_STRUCT *IO,Quat *Address,u32 Count)
{
READSAVE_ENTRY();
for (int i = 0; i < Count ; i ++)
{
char TEXT[16];
sprintf(TEXT,"Q %d",i);
ReadSave_String_Const(IO,TEXT);
ReadSave_FLOAT(IO,&Address->x);
ReadSave_FLOAT(IO,&Address->y);
ReadSave_FLOAT(IO,&Address->z);
ReadSave_FLOAT(IO,&Address->w);
Address ++;
}
}
void ReadSave_Matrix(IO_STRUCT *IO,MATRIX *Address,u32 Count)
{
READSAVE_ENTRY();
while(Count--)
{
ReadSave_Vector(IO,&Address->I,4);
Address ++;
}
}
void ReadSave_Name(IO_STRUCT *IO,u32 *Address,char *Descriptor, u32 Count)
{
READSAVE_ENTRY();
if (!Count) return;
while(Count--)
{
char Name[2048];
if (Descriptor) ReadSave_String_Const(IO,Descriptor);
IO->Dico->GetName(Address,(char*)Name);
ReadSave_String(IO,Name);
IO->Dico->GetUnic(Address,(char*)Name);
Address ++;
}
}