Skip to content

Commit

Permalink
Import engine/shared/packer from DDNet
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaffeine committed Sep 2, 2021
1 parent 52bd0c4 commit 6322571
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 40 deletions.
82 changes: 49 additions & 33 deletions src/engine/shared/packer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
/* If you are missing that file, acquire a complete release at teeworlds.com. */
#include <base/system.h>

#include "packer.h"
#include "compression.h"
#include "config.h"
#include "packer.h"

void CPacker::Reset()
{
Expand Down Expand Up @@ -33,44 +33,42 @@ void CPacker::AddString(const char *pStr, int Limit)
if(m_Error)
return;

//
if(Limit > 0)
if(Limit <= 0)
{
while(*pStr && Limit != 0)
{
*m_pCurrent++ = *pStr++;
Limit--;

if(m_pCurrent >= m_pEnd)
{
m_Error = 1;
break;
}
}
*m_pCurrent++ = 0;
Limit = PACKER_BUFFER_SIZE;
}
else
while(*pStr && Limit != 0)
{
while(*pStr)
int Codepoint = str_utf8_decode(&pStr);
if(Codepoint == -1)
{
*m_pCurrent++ = *pStr++;

if(m_pCurrent >= m_pEnd)
{
m_Error = 1;
break;
}
Codepoint = 0xfffd; // Unicode replacement character.
}
char aGarbage[4];
int Length = str_utf8_encode(aGarbage, Codepoint);
if(Limit < Length)
{
break;
}
// Ensure space for the null termination.
if(m_pEnd - m_pCurrent < Length + 1)
{
m_Error = 1;
break;
}
*m_pCurrent++ = 0;
Length = str_utf8_encode((char *)m_pCurrent, Codepoint);
m_pCurrent += Length;
Limit -= Length;
}
*m_pCurrent++ = 0;
}

void CPacker::AddRaw(const void *pData, int Size)
{
if(m_Error)
return;

if(m_pCurrent+Size >= m_pEnd)
if(m_pCurrent + Size >= m_pEnd)
{
m_Error = 1;
return;
Expand All @@ -84,7 +82,6 @@ void CPacker::AddRaw(const void *pData, int Size)
}
}


void CUnpacker::Reset(const void *pData, int Size)
{
m_Error = 0;
Expand Down Expand Up @@ -114,29 +111,48 @@ int CUnpacker::GetInt()
return i;
}

int CUnpacker::GetIntOrDefault(int Default)
{
if(m_Error)
{
return 0;
}
if(m_pCurrent == m_pEnd)
{
return Default;
}
return GetInt();
}

const char *CUnpacker::GetString(int SanitizeType)
{
if(m_Error || m_pCurrent >= m_pEnd)
if(m_Error)
return "";

if(m_pCurrent >= m_pEnd)
{
m_Error = 1;
return "";
}

char *pPtr = (char *)m_pCurrent;
while(*m_pCurrent) // skip the string
{
m_pCurrent++;
if(m_pCurrent == m_pEnd)
{
m_Error = 1;;
m_Error = 1;
return "";
}
}
m_pCurrent++;

// sanitize all strings
if(SanitizeType&SANITIZE)
if(SanitizeType & SANITIZE)
str_sanitize(pPtr);
else if(SanitizeType&SANITIZE_CC)
else if(SanitizeType & SANITIZE_CC)
str_sanitize_cc(pPtr);
return SanitizeType&SKIP_START_WHITESPACES ? str_utf8_skip_whitespaces(pPtr) : pPtr;
return SanitizeType & SKIP_START_WHITESPACES ? str_utf8_skip_whitespaces(pPtr) : pPtr;
}

const unsigned char *CUnpacker::GetRaw(int Size)
Expand All @@ -146,7 +162,7 @@ const unsigned char *CUnpacker::GetRaw(int Size)
return 0;

// check for nasty sizes
if(Size < 0 || m_pCurrent+Size > m_pEnd)
if(Size < 0 || m_pCurrent + Size > m_pEnd)
{
m_Error = 1;
return 0;
Expand Down
20 changes: 13 additions & 7 deletions src/engine/shared/packer.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,27 @@
#ifndef ENGINE_SHARED_PACKER_H
#define ENGINE_SHARED_PACKER_H



class CPacker
{
public:
enum
{
PACKER_BUFFER_SIZE=1024*2
PACKER_BUFFER_SIZE = 1024 * 2
};

private:
unsigned char m_aBuffer[PACKER_BUFFER_SIZE];
unsigned char *m_pCurrent;
unsigned char *m_pEnd;
int m_Error;

public:
void Reset();
void AddInt(int i);
void AddString(const char *pStr, int Limit);
void AddRaw(const void *pData, int Size);

int Size() const { return (int)(m_pCurrent-m_aBuffer); }
int Size() const { return (int)(m_pCurrent - m_aBuffer); }
const unsigned char *Data() const { return m_aBuffer; }
bool Error() const { return m_Error; }
};
Expand All @@ -33,19 +34,24 @@ class CUnpacker
const unsigned char *m_pCurrent;
const unsigned char *m_pEnd;
int m_Error;

public:
enum
{
SANITIZE=1,
SANITIZE_CC=2,
SKIP_START_WHITESPACES=4
SANITIZE = 1,
SANITIZE_CC = 2,
SKIP_START_WHITESPACES = 4
};

void Reset(const void *pData, int Size);
int GetInt();
int GetIntOrDefault(int Default);
const char *GetString(int SanitizeType = SANITIZE);
const unsigned char *GetRaw(int Size);
bool Error() const { return m_Error; }

int CompleteSize() const { return m_pEnd - m_pStart; }
const unsigned char *CompleteData() const { return m_pStart; }
};

#endif

0 comments on commit 6322571

Please sign in to comment.