zmem.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "zlib.h"
  2. /* bits taken from ppc */
  3. extern void *avail_ram, *end_avail;
  4. void exit (void)
  5. {
  6. for (;;);
  7. }
  8. void *zalloc(void *x, unsigned items, unsigned size)
  9. {
  10. void *p = avail_ram;
  11. size *= items;
  12. size = (size + 7) & -8;
  13. avail_ram += size;
  14. if (avail_ram > end_avail) {
  15. //puts("oops... out of memory\n");
  16. //pause();
  17. exit ();
  18. }
  19. return p;
  20. }
  21. void zfree(void *x, void *addr, unsigned nb)
  22. {
  23. }
  24. #define HEAD_CRC 2
  25. #define EXTRA_FIELD 4
  26. #define ORIG_NAME 8
  27. #define COMMENT 0x10
  28. #define RESERVED 0xe0
  29. #define DEFLATED 8
  30. void gunzip (void *dst, int dstlen, unsigned char *src, int *lenp)
  31. {
  32. z_stream s;
  33. int r, i, flags;
  34. /* skip header */
  35. i = 10;
  36. flags = src[3];
  37. if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
  38. //puts("bad gzipped data\n");
  39. exit();
  40. }
  41. if ((flags & EXTRA_FIELD) != 0)
  42. i = 12 + src[10] + (src[11] << 8);
  43. if ((flags & ORIG_NAME) != 0)
  44. while (src[i++] != 0)
  45. ;
  46. if ((flags & COMMENT) != 0)
  47. while (src[i++] != 0)
  48. ;
  49. if ((flags & HEAD_CRC) != 0)
  50. i += 2;
  51. if (i >= *lenp) {
  52. //puts("gunzip: ran out of data in header\n");
  53. exit();
  54. }
  55. s.zalloc = zalloc;
  56. s.zfree = zfree;
  57. r = inflateInit2(&s, -MAX_WBITS);
  58. if (r != Z_OK) {
  59. //puts("inflateInit2 returned "); puthex(r); puts("\n");
  60. exit();
  61. }
  62. s.next_in = src + i;
  63. s.avail_in = *lenp - i;
  64. s.next_out = dst;
  65. s.avail_out = dstlen;
  66. r = inflate(&s, Z_FINISH);
  67. if (r != Z_OK && r != Z_STREAM_END) {
  68. //puts("inflate returned "); puthex(r); puts("\n");
  69. exit();
  70. }
  71. *lenp = s.next_out - (unsigned char *) dst;
  72. inflateEnd(&s);
  73. }