zip_buffer_t * _zip_buffer_new_from_source(zip_source_t *src, zip_uint64_t size, zip_uint8_t *buf, zip_error_t *error) { zip_buffer_t *buffer; if ((buffer = _zip_buffer_new(buf, size)) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if (_zip_read(src, buffer->data, size, error) < 0) { _zip_buffer_free(buffer); return NULL; } return buffer; }
zip_uint8_t * _zip_read_data(zip_buffer_t *buffer, zip_source_t *src, size_t length, bool nulp, zip_error_t *error) { zip_uint8_t *r; if (length == 0 && !nulp) { return NULL; } r = (zip_uint8_t *)malloc(length + (nulp ? 1 : 0)); if (!r) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if (buffer) { zip_uint8_t *data = _zip_buffer_get(buffer, length); if (data == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); free(r); return NULL; } memcpy(r, data, length); } else { if (_zip_read(src, r, length, error) < 0) { free(r); return NULL; } } if (nulp) { zip_uint8_t *o; /* replace any in-string NUL characters with spaces */ r[length] = 0; for (o=r; o<r+length; o++) if (*o == '\0') *o = ' '; } return r; }
static int copy_data(zip_t *za, zip_uint64_t len) { zip_uint8_t buf[BUFSIZE]; size_t n; while (len > 0) { n = len > sizeof(buf) ? sizeof(buf) : len; if (_zip_read(za->src, buf, n, &za->error) < 0) { return -1; } if (_zip_write(za, buf, n) < 0) { return -1; } len -= n; } return 0; }