// 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>

#include "private.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;
}
