commit a319ca8c90cbd4f20325a9b71d685a7cca36da9d from: Stefan Sperling date: Fri Oct 15 10:36:12 2021 UTC move encode_delta() in pack_create.c to eliminate a forward declaration commit - 748817012564e9ed225b41406d8174d23b8b1796 commit + a319ca8c90cbd4f20325a9b71d685a7cca36da9d blob - 125aaed90edfbd73a30ec4ba0e12d332bd6b8881 blob + c2fe31df1b52aa2eb9e4b6dfec289f29d5dc4a1b --- lib/pack_create.c +++ lib/pack_create.c @@ -165,8 +165,91 @@ delta_size(struct got_delta_instruction *deltas, int n static const struct got_error * encode_delta(struct got_pack_meta *m, struct got_raw_object *o, struct got_delta_instruction *deltas, int ndeltas, - off_t base_size, FILE *f); + off_t base_size, FILE *f) +{ + unsigned char buf[16], *bp; + int i, j; + off_t n; + size_t w; + struct got_delta_instruction *d; + + /* base object size */ + buf[0] = base_size & GOT_DELTA_SIZE_VAL_MASK; + n = base_size >> GOT_DELTA_SIZE_SHIFT; + for (i = 1; n > 0; i++) { + buf[i - 1] |= GOT_DELTA_SIZE_MORE; + buf[i] = n & GOT_DELTA_SIZE_VAL_MASK; + n >>= GOT_DELTA_SIZE_SHIFT; + } + w = fwrite(buf, 1, i, f); + if (w != i) + return got_ferror(f, GOT_ERR_IO); + + /* target object size */ + buf[0] = o->size & GOT_DELTA_SIZE_VAL_MASK; + n = o->size >> GOT_DELTA_SIZE_SHIFT; + for (i = 1; n > 0; i++) { + buf[i - 1] |= GOT_DELTA_SIZE_MORE; + buf[i] = n & GOT_DELTA_SIZE_VAL_MASK; + n >>= GOT_DELTA_SIZE_SHIFT; + } + w = fwrite(buf, 1, i, f); + if (w != i) + return got_ferror(f, GOT_ERR_IO); + + for (j = 0; j < ndeltas; j++) { + d = &deltas[j]; + if (d->copy) { + n = d->offset; + bp = &buf[1]; + buf[0] = GOT_DELTA_BASE_COPY; + for (i = 0; i < 4; i++) { + /* DELTA_COPY_OFF1 ... DELTA_COPY_OFF4 */ + buf[0] |= 1 << i; + *bp++ = n & 0xff; + n >>= 8; + if (n == 0) + break; + } + + n = d->len; + if (n != GOT_DELTA_COPY_DEFAULT_LEN) { + /* DELTA_COPY_LEN1 ... DELTA_COPY_LEN3 */ + for (i = 0; i < 3 && n > 0; i++) { + buf[0] |= 1 << (i + 4); + *bp++ = n & 0xff; + n >>= 8; + } + } + w = fwrite(buf, 1, bp - buf, f); + if (w != bp - buf) + return got_ferror(f, GOT_ERR_IO); + } else { + char content[128]; + size_t r; + if (fseeko(o->f, o->hdrlen + d->offset, SEEK_SET) == -1) + return got_error_from_errno("fseeko"); + n = 0; + while (n != d->len) { + buf[0] = (d->len - n < 127) ? d->len - n : 127; + w = fwrite(buf, 1, 1, f); + if (w != 1) + return got_ferror(f, GOT_ERR_IO); + r = fread(content, 1, buf[0], o->f); + if (r != buf[0]) + return got_ferror(o->f, GOT_ERR_IO); + w = fwrite(content, 1, buf[0], f); + if (w != buf[0]) + return got_ferror(f, GOT_ERR_IO); + n += buf[0]; + } + } + } + return NULL; +} + + static const struct got_error * pick_deltas(struct got_pack_meta **meta, int nmeta, int nours, FILE *delta_cache, struct got_repository *repo, @@ -1027,93 +1110,6 @@ packhdr(int *hdrlen, char *hdr, size_t bufsize, int ob } *hdrlen = i; - return NULL; -} - -static const struct got_error * -encode_delta(struct got_pack_meta *m, struct got_raw_object *o, - struct got_delta_instruction *deltas, int ndeltas, - off_t base_size, FILE *f) -{ - unsigned char buf[16], *bp; - int i, j; - off_t n; - size_t w; - struct got_delta_instruction *d; - - /* base object size */ - buf[0] = base_size & GOT_DELTA_SIZE_VAL_MASK; - n = base_size >> GOT_DELTA_SIZE_SHIFT; - for (i = 1; n > 0; i++) { - buf[i - 1] |= GOT_DELTA_SIZE_MORE; - buf[i] = n & GOT_DELTA_SIZE_VAL_MASK; - n >>= GOT_DELTA_SIZE_SHIFT; - } - w = fwrite(buf, 1, i, f); - if (w != i) - return got_ferror(f, GOT_ERR_IO); - - /* target object size */ - buf[0] = o->size & GOT_DELTA_SIZE_VAL_MASK; - n = o->size >> GOT_DELTA_SIZE_SHIFT; - for (i = 1; n > 0; i++) { - buf[i - 1] |= GOT_DELTA_SIZE_MORE; - buf[i] = n & GOT_DELTA_SIZE_VAL_MASK; - n >>= GOT_DELTA_SIZE_SHIFT; - } - w = fwrite(buf, 1, i, f); - if (w != i) - return got_ferror(f, GOT_ERR_IO); - - for (j = 0; j < ndeltas; j++) { - d = &deltas[j]; - if (d->copy) { - n = d->offset; - bp = &buf[1]; - buf[0] = GOT_DELTA_BASE_COPY; - for (i = 0; i < 4; i++) { - /* DELTA_COPY_OFF1 ... DELTA_COPY_OFF4 */ - buf[0] |= 1 << i; - *bp++ = n & 0xff; - n >>= 8; - if (n == 0) - break; - } - - n = d->len; - if (n != GOT_DELTA_COPY_DEFAULT_LEN) { - /* DELTA_COPY_LEN1 ... DELTA_COPY_LEN3 */ - for (i = 0; i < 3 && n > 0; i++) { - buf[0] |= 1 << (i + 4); - *bp++ = n & 0xff; - n >>= 8; - } - } - w = fwrite(buf, 1, bp - buf, f); - if (w != bp - buf) - return got_ferror(f, GOT_ERR_IO); - } else { - char content[128]; - size_t r; - if (fseeko(o->f, o->hdrlen + d->offset, SEEK_SET) == -1) - return got_error_from_errno("fseeko"); - n = 0; - while (n != d->len) { - buf[0] = (d->len - n < 127) ? d->len - n : 127; - w = fwrite(buf, 1, 1, f); - if (w != 1) - return got_ferror(f, GOT_ERR_IO); - r = fread(content, 1, buf[0], o->f); - if (r != buf[0]) - return got_ferror(o->f, GOT_ERR_IO); - w = fwrite(content, 1, buf[0], f); - if (w != buf[0]) - return got_ferror(f, GOT_ERR_IO); - n += buf[0]; - } - } - } - return NULL; }