// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <string.h>
#include <zircon/types.h>

size_t fdio_iovec_get_capacity(const zx_iovec_t* vector, size_t vector_count) {
  size_t total_capacity = 0u;
  for (size_t i = 0; i < vector_count; ++i) {
    total_capacity += vector[i].capacity;
  }
  return total_capacity;
}

void fdio_iovec_copy_to(const uint8_t* buffer, size_t buffer_size, const zx_iovec_t* vector,
                        size_t vector_count, size_t* out_actual) {
  size_t remaining = buffer_size;
  for (size_t i = 0; i < vector_count && remaining > 0; ++i) {
    size_t chunk_size = remaining;
    if (chunk_size > vector[i].capacity) {
      chunk_size = vector[i].capacity;
    }
    memcpy(vector[i].buffer, buffer, chunk_size);
    buffer += chunk_size;
    remaining -= chunk_size;
  }
  *out_actual = buffer_size - remaining;
}

void fdio_iovec_copy_from(const zx_iovec_t* vector, size_t vector_count, uint8_t* buffer,
                          size_t buffer_size, size_t* out_actual) {
  size_t remaining = buffer_size;
  for (size_t i = 0; i < vector_count && remaining > 0; ++i) {
    size_t chunk_size = remaining;
    if (chunk_size > vector[i].capacity) {
      chunk_size = vector[i].capacity;
    }
    memcpy(buffer, vector[i].buffer, chunk_size);
    buffer += chunk_size;
    remaining -= chunk_size;
  }
  *out_actual = buffer_size - remaining;
}
