aboutsummaryrefslogtreecommitdiff
path: root/raylib/src/external/sinfl.h
diff options
context:
space:
mode:
authorUneven Prankster <unevenprankster@protonmail.com>2023-11-16 21:12:27 -0300
committerUneven Prankster <unevenprankster@protonmail.com>2023-11-16 21:12:27 -0300
commit2bbf92ad5ae7708bf18ac7ef333e9a979d8d1bde (patch)
treec9d22bb0d73d9cc0c8586e4d31c93a561ea8e910 /raylib/src/external/sinfl.h
parent1c0cc775732201f4c4d3ee0d6772be786b3b4aa1 (diff)
Working so hard like a soldiermain
Can't afford a thing on TV
Diffstat (limited to 'raylib/src/external/sinfl.h')
-rw-r--r--raylib/src/external/sinfl.h28
1 files changed, 22 insertions, 6 deletions
diff --git a/raylib/src/external/sinfl.h b/raylib/src/external/sinfl.h
index 8979fcd..16589c1 100644
--- a/raylib/src/external/sinfl.h
+++ b/raylib/src/external/sinfl.h
@@ -122,6 +122,7 @@ extern "C" {
struct sinfl {
const unsigned char *bitptr;
+ const unsigned char *bitend; // @raysan5: added
unsigned long long bitbuf;
int bitcnt;
@@ -185,9 +186,10 @@ sinfl_read64(const void *p) {
}
static void
sinfl_copy64(unsigned char **dst, unsigned char **src) {
- unsigned long long n;
- memcpy(&n, *src, 8);
- memcpy(*dst, &n, 8);
+ //unsigned long long n;
+ //memcpy(&n, *src, 8);
+ //memcpy(*dst, &n, 8);
+ memcpy(*dst, *src, 8); // @raysan5
*dst += 8, *src += 8;
}
static unsigned char*
@@ -210,9 +212,22 @@ sinfl_copy128(unsigned char **dst, unsigned char **src) {
#endif
static void
sinfl_refill(struct sinfl *s) {
- s->bitbuf |= sinfl_read64(s->bitptr) << s->bitcnt;
- s->bitptr += (63 - s->bitcnt) >> 3;
- s->bitcnt |= 56; /* bitcount in range [56,63] */
+ if (s->bitend - s->bitptr >= 8) {
+ // @raysan5: original code, only those 3 lines
+ s->bitbuf |= sinfl_read64(s->bitptr) << s->bitcnt;
+ s->bitptr += (63 - s->bitcnt) >> 3;
+ s->bitcnt |= 56; /* bitcount in range [56,63] */
+ } else {
+ // @raysan5: added this case when bits remaining < 8
+ int bitswant = 63 - s->bitcnt;
+ int byteswant = bitswant >> 3;
+ int bytesuse = s->bitend - s->bitptr <= byteswant ? (int)(s->bitend - s->bitptr) : byteswant;
+ unsigned long long n = 0;
+ memcpy(&n, s->bitptr, bytesuse);
+ s->bitbuf |= n << s->bitcnt;
+ s->bitptr += bytesuse;
+ s->bitcnt += bytesuse << 3;
+ }
}
static int
sinfl_peek(struct sinfl *s, int cnt) {
@@ -384,6 +399,7 @@ sinfl_decompress(unsigned char *out, int cap, const unsigned char *in, int size)
int last = 0;
s.bitptr = in;
+ s.bitend = e; // @raysan5: added
while (1) {
switch (state) {
case hdr: {