#include #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 ++; } }