Пример #1
0
static SRes
squash_csc_reader (void* istream, void* buf, size_t* size) {
  SquashCscStream* s = (SquashCscStream*) ((struct SquashCscInStream*) istream)->s;
  SquashStream* stream = (SquashStream*) s;
  uint8_t* buffer = (uint8_t*) buf;

  size_t remaining = *size;
  while (remaining != 0) {
    const size_t cp_size = (stream->avail_in < remaining) ? stream->avail_in : remaining;

    if (cp_size > 0) {
      memcpy (buffer + (*size - remaining), stream->next_in, cp_size);
      stream->next_in += cp_size;
      stream->avail_in -= cp_size;
      remaining -= cp_size;
    }

    if (remaining != 0) {
      if (s->operation == SQUASH_OPERATION_FINISH)
        break;

      s->operation = squash_stream_yield ((SquashStream*) stream, SQUASH_OK);
    }
  }

  *size = (*size - remaining);
  return 0;
}
Пример #2
0
static size_t
squash_csc_writer (void* ostream, const void* buf, size_t size) {
  SquashCscStream* s = (SquashCscStream*) ((struct SquashCscOutStream*) ostream)->s;
  SquashStream* stream = (SquashStream*) s;
  const uint8_t* buffer = (uint8_t*) buf;

  assert (size != 0);
  size_t remaining = size;
  while (remaining != 0) {
    const size_t cp_size = (stream->avail_out < remaining) ? stream->avail_out : remaining;

    if (cp_size != 0) {
      memcpy (stream->next_out, buffer + (size - remaining), cp_size);
      stream->next_out += cp_size;
      stream->avail_out -= cp_size;
      remaining -= cp_size;
    }

    if (remaining != 0)
      s->operation = squash_stream_yield ((SquashStream*) stream, SQUASH_PROCESSING);
  }

  assert (remaining == 0);
  return (size - remaining);
}
Пример #3
0
static int
squash_brotli_writer (void* user_data, const uint8_t* buf, size_t size) {
  SquashBrotliStream* stream = (SquashBrotliStream*) user_data;
  size_t remaining = size;
  while (remaining != 0) {
    const size_t cp_size = (stream->base_object.avail_out < remaining) ? stream->base_object.avail_out : remaining;

    memcpy (stream->base_object.next_out, buf + (size - remaining), cp_size);
    stream->base_object.next_out += cp_size;
    stream->base_object.avail_out -= cp_size;
    remaining -= cp_size;

    if (remaining != 0) {
      stream->operation = squash_stream_yield ((SquashStream*) stream, SQUASH_PROCESSING);
    }
  }

  return (size - remaining);
}
Пример #4
0
static SquashStatus
squash_stream_write_cb (size_t* data_size,
                        const uint8_t data[SQUASH_ARRAY_PARAM(*data_size)],
                        void* user_data) {
    assert (user_data != NULL);
    assert (data_size != NULL);

    SquashStream* s = (SquashStream*) user_data;
    assert (s->priv != NULL);
    const size_t requested = *data_size;
    size_t remaining = *data_size;
    SquashOperation operation = s->priv->request;

    while (remaining != 0) {
        const size_t cp_size = (s->avail_out < remaining) ? s->avail_out : remaining;

        if (cp_size != 0) {
            memcpy (s->next_out, data + (requested - remaining), cp_size);
            s->next_out += cp_size;
            s->avail_out -= cp_size;
            remaining -= cp_size;
        }

        if (remaining != 0) {
            if (operation == SQUASH_OPERATION_TERMINATE)
                break;

            operation = squash_stream_yield (s, SQUASH_PROCESSING);
        }
    }

    *data_size = requested - remaining;

    /* If we are terminating, we want to return an error code.  However,
       don't call squash_error because this may just be from unreffing
       the stream before it is finished to abandon it. */

    return (*data_size != 0) ? SQUASH_OK : SQUASH_FAILED;
}
Пример #5
0
static int
squash_brotli_reader (void* user_data, uint8_t* buf, size_t size) {
  SquashBrotliStream* stream = (SquashBrotliStream*) user_data;

  size_t remaining = size;
  while (remaining != 0) {
    const size_t cp_size = (stream->base_object.avail_in < remaining) ? stream->base_object.avail_in : remaining;

    memcpy (buf + (size - remaining), stream->base_object.next_in, cp_size);
    stream->base_object.next_in += cp_size;
    stream->base_object.avail_in -= cp_size;
    remaining -= cp_size;

    if (remaining != 0) {
      if (stream->operation == SQUASH_OPERATION_FINISH)
        break;

      stream->operation = squash_stream_yield ((SquashStream*) stream, SQUASH_OK);
    }
  }

  return (size - remaining);
}
Пример #6
0
static SquashStatus
squash_stream_read_cb (size_t* data_size,
                       uint8_t data[SQUASH_ARRAY_PARAM(*data_size)],
                       void* user_data) {
    assert (user_data != NULL);
    assert (data_size != NULL);

    SquashStream* s = (SquashStream*) user_data;
    assert (s->priv != NULL);
    const size_t requested = *data_size;
    size_t remaining = *data_size;
    SquashOperation operation = s->priv->request;

    while (remaining != 0) {
        const size_t cp_size = (s->avail_in < remaining) ? s->avail_in : remaining;

        if (cp_size != 0) {
            memcpy (data + (requested - remaining), s->next_in, cp_size);
            s->next_in += cp_size;
            s->avail_in -= cp_size;
            remaining -= cp_size;
        }

        if (remaining != 0) {
            if (operation == SQUASH_OPERATION_FINISH || operation == SQUASH_OPERATION_TERMINATE) {
                break;
            }

            SquashStatus res = (s->avail_in == 0) ? SQUASH_OK : SQUASH_PROCESSING;
            operation = squash_stream_yield (s, res);
        }
    }

    *data_size = requested - remaining;

    return (*data_size != 0) ? SQUASH_OK : SQUASH_END_OF_STREAM;
}