// Copyright 2016 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 <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <zircon/assert.h>

#include <array>

#include <fbl/string_printf.h>

namespace fbl {

String StringPrintf(const char* format, ...) {
  va_list ap;
  va_start(ap, format);
  String rv = StringVPrintf(format, ap);
  va_end(ap);
  return rv;
}

String StringVPrintf(const char* format, va_list ap) {
  // Size of the small stack buffer to use first. This should be kept in sync
  // with the numbers in StringPrintfTest.StringPrintf_Boundary.
  constexpr size_t kStackBufferSize = 1024U;

  // First, try with a small buffer on the stack.
  std::array<char, kStackBufferSize> stack_buf;
  // Copy |ap| (which can only be used once), in case we need to retry.
  va_list ap_copy;
  va_copy(ap_copy, ap);

  // TODO(johngro): Remove this when clang-tidy (or the clang analyzer) gets
  // fixed.  Right now, it seems unaware that va_copy is initializing
  // |ap_copy|.
  //
  // NOLINTNEXTLINE (clang-analyzer-valist.Uninitialized)
  int result = vsnprintf(stack_buf.data(), kStackBufferSize, format, ap_copy);
  va_end(ap_copy);
  if (result < 0) {
    // As far as I can tell, we'd only get |EOVERFLOW| if the result is so large
    // that it can't be represented by an |int| (in which case retrying would be
    // futile), so Chromium's implementation is wrong.
    return String();
  }
  // |result| should be the number of characters we need, not including the
  // terminating null. However, |vsnprintf()| always null-terminates!
  size_t output_size = static_cast<size_t>(result);
  // Check if the output fit into our stack buffer. This is "<" not "<=", since
  // |vsnprintf()| will null-terminate.
  if (output_size < kStackBufferSize) {
    // It fit.
    return String(stack_buf.data(), static_cast<size_t>(result));
  }

  // Since we have the required output size, we can just heap allocate that.
  // (Add 1 because |vsnprintf()| will always null-terminate.)
  size_t heap_buf_size = output_size + 1U;

  // TODO(johngro): remove this exception if clang-tidy learns to ignore this.
  // Our configuration of clang-tidy really does not want to see _any_
  // traditional C arrays in it's world, so it demands that you convert them
  // all to std::arrays.  In this case, however, that is not good advice.  The
  // code below is deliberately dynamically allocating a character buffer to
  // sprintf into.  Since the point of std::array is to have a compile time
  // sized array type, it is really not appropriate to use here.
  //
  // NOLINTNEXTLINE (modernize-avoid-c-arrays)
  std::unique_ptr<char[]> heap_buf(new char[heap_buf_size]);
  result = vsnprintf(heap_buf.get(), heap_buf_size, format, ap);
  ZX_ASSERT(result >= 0 && static_cast<size_t>(result) == output_size);
  return String(heap_buf.get(), static_cast<size_t>(result));
}

}  // namespace fbl
