370 lines
No EOL
7 KiB
C++
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 ++;
|
|
}
|
|
} |