13typedef unsigned char uchar;
 
   14typedef unsigned short ushort;
 
   15typedef unsigned int uint;
 
   16typedef unsigned long ulong;
 
   17typedef signed long long int llong;
 
   18typedef unsigned long long int ullong;
 
   20#if defined(__GNUC__) || defined(_MSC_VER) 
   21    #define RESTRICT __restrict 
   38inline T max(T a, T b, T c)
 
   40    return max(max(a, b), c);
 
   48inline T min(T a, T b, T c)
 
   50    return min(min(a, b), c);
 
   54    #define BITSCAN(mask) (__builtin_ffs(mask)-1) 
   57        #pragma intrinsic(_BitScanForward) 
   58        inline int BITSCAN(uint mask)
 
   61            return _BitScanForward(&i, mask) ? i : -1;
 
   64        inline int BITSCAN(uint mask)
 
   68            if(!(mask&0xFFFF)) { i += 16; mask >>= 16; }
 
   69            if(!(mask&0xFF)) { i += 8; mask >>= 8; }
 
   70            if(!(mask&0xF)) { i += 4; mask >>= 4; }
 
   71            if(!(mask&3)) { i += 2; mask >>= 2; }
 
   77inline int randomint(
int x)
 
   81inline float randomfloat(
int x)
 
   83    return (
float((rand()*
float(x))/
float(RAND_MAX)));
 
   86inline float detrnd(uint s, 
int x)
 
   88    return static_cast<int>(((s*1103515245+12345)>>16)%x);
 
   91constexpr double SQRT2 = 1.4142135623731;
 
   92constexpr double SQRT3 = 1.73205080756888;
 
   96        constexpr double M_PI = 3.14159265358979323846;
 
   99        constexpr double M_LN2 = 0.693147180559945309417;
 
  103        #pragma warning (3: 4189)        
  104        #pragma warning (disable: 4244)  
  105        #pragma warning (disable: 4267)  
  106        #pragma warning (disable: 4355)  
  107        #pragma warning (disable: 4996)  
  110    #define strcasecmp _stricmp 
  111    #define strncasecmp _strnicmp 
  116    #define _vsnprintf vsnprintf 
  120#define RAD static_cast<float>(180.0f / M_PI)  
  124    #define PRINTFARGS(fmt, args) __attribute__((format(printf, fmt, args))) 
  126    #define PRINTFARGS(fmt, args) 
  130const int maxstrlen = 260;
 
  132typedef char string[maxstrlen];
 
  134inline void vformatstring(
char *d, 
const char *fmt, va_list v, 
int len) { _vsnprintf(d, len, fmt, v); d[len-1] = 0; }
 
  137inline void vformatstring(
char (&d)[N], 
const char *fmt, va_list v) { vformatstring(d, fmt, v, N); }
 
  139inline char *copystring(
char *d, 
const char *s, 
size_t len)
 
  141    size_t slen = min(strlen(s), len-1);
 
  142    std::memcpy(d, s, slen);
 
  147inline char *copystring(
char (&d)[N], 
const char *s) { 
return copystring(d, s, N); }
 
  149inline char *concatstring(
char *d, 
const char *s, 
size_t len) { 
size_t used = strlen(d); 
return used < len ? copystring(d+used, s, len-used) : d; }
 
  152inline char *concatstring(
char (&d)[N], 
const char *s) { 
return concatstring(d, s, N); }
 
  154inline void nformatstring(
char *d, 
int len, 
const char *fmt, ...) PRINTFARGS(3, 4);
 
  155inline 
void nformatstring(
char *d, 
int len, const 
char *fmt, ...)
 
  159    vformatstring(d, fmt, v, len);
 
  164inline void formatstring(
char (&d)[N], 
const char *fmt, ...) PRINTFARGS(2, 3);
 
  167inline 
void formatstring(
char (&d)[N], const 
char *fmt, ...)
 
  171    vformatstring(d, fmt, v, 
static_cast<int>(N));
 
  176inline void concformatstring(
char (&d)[N], 
const char *fmt, ...) PRINTFARGS(2, 3);
 
  179inline 
void concformatstring(
char (&d)[N], const 
char *fmt, ...)
 
  184    vformatstring(d + len, fmt, v, 
static_cast<int>(N) - len);
 
  188extern char *tempformatstring(
const char *fmt, ...) PRINTFARGS(1, 2);
 
  190#define DEF_FORMAT_STRING(d,...) string d; formatstring(d, __VA_ARGS__) 
  191#define DEFV_FORMAT_STRING(d,last,fmt) string d; { va_list ap; va_start(ap, last); vformatstring(d, fmt, ap); va_end(ap); } 
  193inline char *newstring(
size_t l)
 
  195    return new char[l+1];
 
  198inline char *newstring(
const char *s, 
size_t l)
 
  200    return copystring(newstring(l), s, l+1);
 
  203inline char *newstring(
const char *s)
 
  205    size_t l = strlen(s);
 
  206    char *d = newstring(l);
 
  207    std::memcpy(d, s, l+1);
 
  211inline char *newconcatstring(
const char *s, 
const char *t)
 
  213    size_t slen = strlen(s),
 
  215    char *r = newstring(slen + tlen);
 
  216    std::memcpy(r, s, slen);
 
  217    std::memcpy(&r[slen], t, tlen);
 
  235    databuf() : buf(
nullptr), len(0), maxlen(0), flags(0) {}
 
  238    databuf(T *buf, U maxlen) : buf(buf), len(0), maxlen(
static_cast<int>(maxlen)), flags(0) {}
 
  246    void reset(T *buf_, 
int maxlen_)
 
  264        static const T overreadval = 0;
 
 
  288        sz = std::clamp(sz, 0, maxlen-len);
 
  290        return databuf(&buf[len-sz], sz);
 
 
  306        len += min(numvals, maxlen-len);
 
 
  329    void put(
const T *vals, 
int numvals)
 
  331        if(maxlen - len < numvals)
 
  333            numvals = maxlen - len;
 
  336        std::memcpy(&buf[len], 
static_cast<const void *
>(vals), numvals*
sizeof(T));
 
  340    int get(T *vals, 
int numvals)
 
  342        if(maxlen - len < numvals)
 
  344            numvals = maxlen - len;
 
  347        std::memcpy(vals, 
static_cast<void *
>(&buf[len]), numvals*
sizeof(T));
 
  376    bool empty()
 const { 
return len==0; }
 
  409    bool overread()
 const { 
return (flags&OVERREAD)!=0; }
 
  422    bool check(
int n) { 
return remaining() >= n; }
 
 
  434inline uint memhash(
const void *ptr, 
int len)
 
  436    const uchar *data = 
static_cast<const uchar *
>(ptr);
 
  438    for(
int i = 0; i < static_cast<int>(len); ++i)
 
  440        h = ((h<<5)+h)^data[i];
 
  446inline T endianswap(T n) { 
union { T t; uint i; } conv; conv.t = n; conv.i = SDL_Swap32(conv.i); 
return conv.t; }
 
  449inline uint endianswap<uint>(uint n) { 
return SDL_Swap32(n); }
 
  452inline int endianswap<int>(
int n) { 
return SDL_Swap32(n); }
 
  465    #if defined(__GNUC__) && !defined(__MINGW32__) 
  466        typedef off64_t offset;
 
  468        typedef __int64 offset;
 
  471        typedef off_t offset;
 
  475    virtual void close() = 0;
 
  476    virtual bool end() = 0;
 
  477    virtual offset tell()
 const { 
return -1; }
 
  478    virtual offset rawtell()
 const { 
return tell(); }
 
  479    virtual bool seek(offset, 
int) { 
return false; }
 
  480    virtual offset size();
 
  481    virtual offset rawsize() { 
return size(); }
 
  482    virtual size_t read(
void *, 
size_t) { 
return 0; }
 
  483    virtual size_t write(
const void *, 
size_t) { 
return 0; }
 
  484    virtual bool flush() { 
return true; }
 
  485    virtual int getchar() { uchar c; 
return read(&c, 1) == 1 ? c : -1; }
 
  486    virtual bool putchar(
int n) { uchar c = n; 
return write(&c, 1) == 1; }
 
  487    virtual bool getline(
char *str, 
size_t len);
 
  488    virtual bool putstring(
const char *str) { 
size_t len = strlen(str); 
return write(str, len) == len; }
 
  489    virtual bool putline(
const char *str) { 
return putstring(str) && putchar(
'\n'); }
 
  490    virtual size_t printf(
const char *fmt, ...) PRINTFARGS(2, 3);
 
  491    virtual uint getcrc() { 
return 0; }
 
  494    size_t put(
const T *v, 
size_t n) { 
return write(v, n*
sizeof(T))/
sizeof(T); }
 
  497    bool put(T n) { 
return write(&n, 
sizeof(n)) == 
sizeof(n); }
 
  500    size_t get(T *v, 
size_t n) { 
return read(v, n*
sizeof(T))/
sizeof(T); }
 
  503    T get() { T n; 
return read(&n, 
sizeof(n)) == 
sizeof(n) ? n : 0; }
 
  506    bool putbig(T n) { 
return put<T>(endianswap(n)); }
 
 
  511extern std::string homedir;
 
  513extern char *path(
char *s);
 
  514extern std::string path(std::string s);
 
  515extern char *copypath(
const char *s);
 
  516extern const char *sethomedir(
const char *dir);
 
  517extern const char *findfile(
const char *filename, 
const char *mode);
 
  528extern stream *openrawfile(
const char *filename, 
const char *mode);
 
  529extern stream *openzipfile(
const char *filename, 
const char *mode);
 
  530extern stream *openfile(
const char *filename, 
const char *mode);
 
  531extern stream *opengzfile(
const char *filename, 
const char *mode, 
stream *file = 
nullptr, 
int level = Z_BEST_COMPRESSION);
 
  534inline void putint_(T &p, 
int n)
 
  540    else if(n<0x8000 && n>=-0x8000)
 
  557inline void putuint_(T &p, 
int n)
 
  559    if(n < 0 || n >= (1<<21))
 
  561        p.put(0x80 | (n & 0x7F));
 
  562        p.put(0x80 | ((n >> 7) & 0x7F));
 
  563        p.put(0x80 | ((n >> 14) & 0x7F));
 
  572        p.put(0x80 | (n & 0x7F));
 
  577        p.put(0x80 | (n & 0x7F));
 
  578        p.put(0x80 | ((n >> 7) & 0x7F));
 
  583extern void putint(std::vector<uchar> &p, 
int n);
 
  586inline void vectorput(std::vector<uint8_t>& buf, 
const T& data)
 
  588    const uint8_t* data_ptr = 
reinterpret_cast<const uint8_t*
>(&data);
 
  589    buf.insert(buf.end(), data_ptr, data_ptr + 
sizeof(T));
 
  592inline void vectorput(std::vector<uint8_t>& buf, 
const uint8_t* data, 
size_t size)
 
  594    buf.insert(buf.end(), data, data + size);
 
  598inline void sendstring_(
const char *t, T &p)
 
  608inline void putfloat_(T &p, 
float f)
 
  610    p.put(
reinterpret_cast<uchar *
>(&f), 
sizeof(
float));
 
  613extern void putint(ucharbuf &p, 
int n);
 
  614extern int getint(ucharbuf &p);
 
  615extern void putuint(ucharbuf &p, 
int n);
 
  616extern int getuint(ucharbuf &p);
 
  617extern void putfloat(ucharbuf &p, 
float f);
 
  618extern float getfloat(ucharbuf &p);
 
  619extern void sendstring(
const char *t, ucharbuf &p);
 
  620extern void getstring(
char *t, ucharbuf &p, 
size_t len);
 
  623inline void getstring(
char (&t)[N], ucharbuf &p) { getstring(t, p, N); }
 
  625extern void filtertext(
char *dst, 
const char *src, 
bool whitespace, 
bool forcespace, 
size_t len);
 
  628inline void filtertext(
char (&dst)[N], 
const char *src, 
bool whitespace = 
true, 
bool forcespace = 
false) { filtertext(dst, src, whitespace, forcespace, N-1); }
 
const T & get()
Adds an existing value in the underlying buffer to the databuf.
Definition tools.h:262
 
int length() const
Returns the number of allocated entries in the databuf.
Definition tools.h:386
 
void put(const T &val)
Adds an entry to the databuf if space is available.
Definition tools.h:317
 
databuf subbuf(int sz)
Returns a databuf<T> object containing the first n entries.
Definition tools.h:286
 
bool overread() const
Returns whether the databuf has been accessed with too large of an index.
Definition tools.h:409
 
T * pad(int numvals)
Adds N empty elements to the end of the array and returns a pointer.
Definition tools.h:303
 
int remaining() const
Returns the number of values remaining before the databuf overflows.
Definition tools.h:397
 
bool empty() const
Returns whether any entries have been assigned to the array.
Definition tools.h:376
 
T * getbuf() const
Returns a pointer to the internal data array.
Definition tools.h:368
 
bool overwrote() const
Returns whether the databuf has had invalid writes to it.
Definition tools.h:420