aboutsummaryrefslogtreecommitdiff
path: root/src/util.cc
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-05-22 19:03:45 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-05-22 19:03:45 -0300
commit4e41f79a50b18b4e9b9fa00bbfa68ecb15fcb63e (patch)
tree7ca2a0f7c3977ba4e2e530a599fc5332a0ae9712 /src/util.cc
parentc595a2c2935b5bfcb2c08cc9ec4a22db55bd1ff7 (diff)
downloadgame-4e41f79a50b18b4e9b9fa00bbfa68ecb15fcb63e.tar.gz
game-4e41f79a50b18b4e9b9fa00bbfa68ecb15fcb63e.zip
implement TWriteStream, T(Dynamic)WriteBuffer, and TWriteBinaryFile
Diffstat (limited to 'src/util.cc')
-rw-r--r--src/util.cc174
1 files changed, 173 insertions, 1 deletions
diff --git a/src/util.cc b/src/util.cc
index 5cdd933..30e1ba5 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -80,7 +80,7 @@ void TReadStream::readString(char *Buffer, int MaxLength){
this->readBytes(Buffer, Length);
Buffer[Length] = 0;
}else{
- this->readBytes(Buffer, MaxLength - 1);
+ this->readBytes((uint8*)Buffer, MaxLength - 1);
this->skip(Length - MaxLength + 1);
Buffer[MaxLength - 1] = 0;
}
@@ -176,3 +176,175 @@ void TReadBuffer::skip(int Count){
this->Position += Count;
}
+
+// TWriteStream
+// =============================================================================
+void TWriteStream::writeFlag(bool Flag){
+ this->writeByte((uint8)Flag);
+}
+
+void TWriteStream::writeWord(uint16 Word){
+ this->writeByte((uint8)(Word));
+ this->writeByte((uint8)(Word >> 8));
+}
+
+void TWriteStream::writeQuad(uint32 Quad){
+ this->writeByte((uint8)(Quad));
+ this->writeByte((uint8)(Quad >> 8));
+ this->writeByte((uint8)(Quad >> 16));
+ this->writeByte((uint8)(Quad >> 24));
+}
+
+void TWriteStream::writeString(const char *String){
+ if(String == NULL){
+ this->writeWord(0);
+ return;
+ }
+
+ int StringLength = (int)strlen(String);
+ ASSERT(StringLength >= 0);
+ if(StringLength < 0xFFFF){
+ this->writeWord((uint16)StringLength);
+ }else{
+ this->writeWord(0xFFFF);
+ this->writeQuad((uint32)StringLength);
+ }
+
+ if(StringLength > 0){
+ this->writeBytes((const uint8*)String, StringLength);
+ }
+}
+
+void TWriteStream::writeBytes(const uint8 *Buffer, int Count){
+ if(Buffer == NULL){
+ error("TWriteStream::writeBytes: Übergebener Puffer existiert nicht.\n");
+ throw "internal error";
+ }
+
+ for(int i = 0; i < Count; i += 1){
+ this->writeByte(Buffer[i]);
+ }
+}
+
+// TWriteBuffer
+// =============================================================================
+TWriteBuffer::TWriteBuffer(uint8 *Data, int Size){
+ if(Data == NULL){
+ error("TWriteBuffer::TWriteBuffer: data ist NULL.\n");
+ Size = 0;
+ }else if(Size < 0){
+ error("TWriteBuffer::TWriteBuffer: Ungültige Datengröße %d.\n", Size);
+ Size = 0;
+ }
+
+ this->Data = Data;
+ this->Size = Size;
+ this->Position = 0;
+}
+
+void TWriteBuffer::writeByte(uint8 Byte){
+ if((this->Size - this->Position) < 1){
+ throw "buffer full";
+ }
+
+ this->Data[this->Position] = Byte;
+ this->Position += 1;
+}
+
+void TWriteBuffer::writeWord(uint16 Word){
+ if((this->Size - this->Position) < 2){
+ throw "buffer full";
+ }
+
+ this->Data[this->Position] = (uint8)(Word);
+ this->Data[this->Position + 1] = (uint8)(Word >> 8);
+ this->Position += 2;
+}
+
+void TWriteBuffer::writeQuad(uint32 Quad){
+ if((this->Size - this->Position) < 4){
+ throw "buffer full";
+ }
+
+ this->Data[this->Position] = (uint8)(Quad);
+ this->Data[this->Position + 1] = (uint8)(Quad >> 8);
+ this->Data[this->Position + 2] = (uint8)(Quad >> 16);
+ this->Data[this->Position + 3] = (uint8)(Quad >> 24);
+ this->Position += 4;
+}
+
+void TWriteBuffer::writeBytes(uint8 *Buffer, int Count){
+ if((this->Size - this->Position) < Count){
+ throw "buffer full";
+ }
+
+ memcpy(&this->Data[this->Position], Buffer, Count);
+ this->Position += Count;
+}
+
+// TDynamicWriteBuffer
+// =============================================================================
+TDynamicWriteBuffer::TDynamicWriteBuffer(int InitialSize)
+ : TWriteBuffer(new uint8[InitialSize], InitialSize)
+{
+ // no-op
+}
+
+void TDynamicWriteBuffer::resizeBuffer(void){
+ ASSERT(this->Size > 0);
+ int Size = this->Size * 2;
+ uint8 *Data = new uint8[Size];
+ if(this->Data != NULL){
+ memcpy(Data, this->Data, this->Size);
+ delete[] this->Data;
+ }
+
+ this->Data = Data;
+ this->Size = Size;
+}
+
+void TDynamicWriteBuffer::writeByte(uint8 Byte){
+ while((this->Size - this->Position) < 1){
+ this->resizeBuffer();
+ }
+
+ this->Data[this->Position] = Byte;
+ this->Position += 1;
+}
+
+void TDynamicWriteBuffer::writeWord(uint16 Word){
+ while((this->Size - this->Position) < 2){
+ this->resizeBuffer();
+ }
+
+ this->Data[this->Position] = (uint8)(Word);
+ this->Data[this->Position + 1] = (uint8)(Word >> 8);
+ this->Position += 2;
+}
+
+void TDynamicWriteBuffer::writeQuad(uint32 Quad){
+ while((this->Size - this->Position) < 4){
+ this->resizeBuffer();
+ }
+
+ this->Data[this->Position] = (uint8)(Quad);
+ this->Data[this->Position + 1] = (uint8)(Quad >> 8);
+ this->Data[this->Position + 2] = (uint8)(Quad >> 16);
+ this->Data[this->Position + 3] = (uint8)(Quad >> 24);
+ this->Position += 4;
+}
+
+void TDynamicWriteBuffer::writeBytes(uint8 *Buffer, int Count){
+ while((this->Size - this->Position) < Count){
+ this->resizeBuffer();
+ }
+
+ memcpy(&this->Data[this->Position], Buffer, Count);
+ this->Position += Count;
+}
+
+TDynamicWriteBuffer::~TDynamicWriteBuffer(void){
+ if(this->Data != NULL){
+ delete[] this->Data;
+ }
+}