// Copyright 2019 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#pragma once

// This provides the pw::string::Format functions, which are safer alternatives
// to std::snprintf and std::vsnprintf. The snprintf return value is awkward to
// interpret, and misinterpreting it can lead to serious bugs.
//
// These functions return a StatusWithSize. The Status is set to reflect any
// errors and the return value is always the number of characters written before
// the null terminator.

#include <cstdarg>
#include <span>

#include "pw_preprocessor/compiler.h"
#include "pw_status/status_with_size.h"

namespace pw::string {

// Writes a printf-style formatted string to the provided buffer, similarly to
// std::snprintf. Returns the number of characters written, excluding the null
// terminator. The buffer is always null-terminated unless it is empty.
//
// The status is
//
//   Status::Ok() if the operation succeeded,
//   Status::ResourceExhausted() if the buffer was too small to fit the output,
//   Status::InvalidArgument() if there was a formatting error.
//
PW_PRINTF_FORMAT(2, 3)
StatusWithSize Format(std::span<char> buffer, const char* format, ...);

// Writes a printf-style formatted string with va_list-packed arguments to the
// provided buffer, similarly to std::vsnprintf. The return value is the same as
// above.
StatusWithSize FormatVaList(std::span<char> buffer,
                            const char* format,
                            va_list args);

}  // namespace pw::string
