/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│
│vi: set net ft=c ts=4 sts=4 sw=4 fenc=utf-8                                :vi│
╞══════════════════════════════════════════════════════════════════════════════╡
│ Copyright 1995-2017 Jean-loup Gailly                                         │
│ Use of this source code is governed by the BSD-style licenses that can       │
│ be found in the third_party/zlib/LICENSE file.                               │
╚─────────────────────────────────────────────────────────────────────────────*/
#include "libc/mem/mem.h"
#include "third_party/zlib/zutil.internal.h"

asm(".ident\t\"\\n\\n\
zlib (zlib License)\\n\
Copyright 1995-2017 Jean-loup Gailly and Mark Adler\"");
asm(".include \"libc/disclaimer.inc\"");

const char *const z_errmsg[10] = {
    (const char *)"need dictionary",     /* Z_NEED_DICT       2  */
    (const char *)"stream end",          /* Z_STREAM_END      1  */
    (const char *)"",                    /* Z_OK              0  */
    (const char *)"file error",          /* Z_ERRNO         (-1) */
    (const char *)"stream error",        /* Z_STREAM_ERROR  (-2) */
    (const char *)"data error",          /* Z_DATA_ERROR    (-3) */
    (const char *)"insufficient memory", /* Z_MEM_ERROR     (-4) */
    (const char *)"buffer error",        /* Z_BUF_ERROR     (-5) */
    (const char *)"",                    /* Z_VERSION_ERROR (-6) */
    (const char *)"",
};

const char *zlibVersion() {
  return ZLIB_VERSION;
}

uLong zlibCompileFlags() {
  uLong flags;
  flags = 0;
  switch ((int)(sizeof(uInt))) {
    case 2:
      break;
    case 4:
      flags += 1;
      break;
    case 8:
      flags += 2;
      break;
    default:
      flags += 3;
  }
  switch ((int)(sizeof(uLong))) {
    case 2:
      break;
    case 4:
      flags += 1 << 2;
      break;
    case 8:
      flags += 2 << 2;
      break;
    default:
      flags += 3 << 2;
  }
  switch ((int)(sizeof(voidpf))) {
    case 2:
      break;
    case 4:
      flags += 1 << 4;
      break;
    case 8:
      flags += 2 << 4;
      break;
    default:
      flags += 3 << 4;
  }
  switch ((int)(sizeof(int64_t))) {
    case 2:
      break;
    case 4:
      flags += 1 << 6;
      break;
    case 8:
      flags += 2 << 6;
      break;
    default:
      flags += 3 << 6;
  }
#ifdef ZLIB_DEBUG
  flags += 1 << 8;
#endif
#if defined(ASMV) || defined(ASMINF)
  flags += 1 << 9;
#endif
#ifdef ZLIB_WINAPI
  flags += 1 << 10;
#endif
#ifdef BUILDFIXED
  flags += 1 << 12;
#endif
#ifdef DYNAMIC_CRC_TABLE
  flags += 1 << 13;
#endif
#ifdef NO_GZCOMPRESS
  flags += 1L << 16;
#endif
#ifdef NO_GZIP
  flags += 1L << 17;
#endif
#ifdef PKZIP_BUG_WORKAROUND
  flags += 1L << 20;
#endif
#ifdef FASTEST
  flags += 1L << 21;
#endif
  return flags;
}

#ifdef ZLIB_DEBUG
#ifndef verbose
#define verbose 0
#endif
int z_verbose hidden = verbose;

void z_error(char *m) {
  fprintf(stderr, "%s\n", m);
  exit(1);
}
#endif

/**
 * Exported to allow conversion of error code to string for compress()
 * and uncompress()
 */
const char *zError(int err) {
  return ERR_MSG(err);
}
