+static void
+write_bytes_to_file(FILE * file, char *addr, long bytes, int compression)
+{
+ if (compression == COMPRESSION_LEVEL_NONE) {
+ while (bytes > 0) {
+ long count = fwrite(addr, 1, bytes, file);
+ if (count > 0) {
+ bytes -= count;
+ addr += count;
+ }
+ else {
+ perror("error writing to save file");
+ bytes = 0;
+ }
+ }
+#ifdef LISP_FEATURE_SB_CORE_COMPRESSION
+ } else if ((compression >= -1) && (compression <= 9)) {
+# define ZLIB_BUFFER_SIZE (1u<<16)
+ z_stream stream;
+ unsigned char buf[ZLIB_BUFFER_SIZE];
+ unsigned char * written, * end;
+ long total_written = 0;
+ int ret;
+ stream.zalloc = NULL;
+ stream.zfree = NULL;
+ stream.opaque = NULL;
+ stream.avail_in = bytes;
+ stream.next_in = (void*)addr;
+ ret = deflateInit(&stream, compression);
+ if (ret != Z_OK)
+ lose("deflateInit: %i\n", ret);
+ do {
+ stream.avail_out = sizeof(buf);
+ stream.next_out = buf;
+ ret = deflate(&stream, Z_FINISH);
+ if (ret < 0) lose("zlib deflate error: %i... exiting\n", ret);
+ written = buf;
+ end = buf+sizeof(buf)-stream.avail_out;
+ total_written += end - written;
+ while (written < end) {
+ long count = fwrite(written, 1, end-written, file);
+ if (count > 0) {
+ written += count;
+ } else {
+ lose("unable to write to core file\n");
+ }
+ }
+ } while (stream.avail_out == 0);
+ deflateEnd(&stream);
+ printf("compressed %lu bytes into %lu at level %i\n",
+ bytes, total_written, compression);
+# undef ZLIB_BUFFER_SIZE
+#endif
+ } else {
+#ifdef LISP_FEATURE_SB_CORE_COMPRESSION
+ lose("Unknown core compression level %i, exiting\n", compression);
+#else
+ lose("zlib-compressed core support not built in this runtime\n");
+#endif
+ }
+
+ fflush(file);
+};
+
+