/****************************************************************************
 * libs/libc/stdio/lib_asprintf.c
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.  The
 * ASF licenses this file to you 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
 *
 *   http://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.
 *
 ****************************************************************************/

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <stdio.h>

/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Name: nx_asprintf
 *
 * Description:
 *   This function is similar to sprintf, except that it dynamically
 *   allocates a string (as with kmm_malloc) to hold the output, instead of
 *   putting the output in a buffer you allocate in advance.  The ptr
 *   argument should be the address of a char * object, and a successful
 *   call to asprintf stores a pointer to the newly allocated string at that
 *   location.
 *
 * Returned Value:
 *   The returned value is the number of characters allocated for the buffer,
 *   or less than zero if an error occurred. Usually this means that the
 *   buffer could not be allocated.
 *
 ****************************************************************************/

int nx_asprintf(FAR char **ptr, FAR const IPTR char *fmt, ...)
{
  va_list ap;
  int ret;

  /* Let vasprintf do all of the work */

  va_start(ap, fmt);
  ret = nx_vasprintf(ptr, fmt, ap);
  va_end(ap);

  return ret;
}

/****************************************************************************
 * Name: asprintf
 *
 * Description:
 *   This function is similar to sprintf, except that it dynamically
 *   allocates a string (as with malloc) to hold the output, instead of
 *   putting the output in a buffer you allocate in advance.  The ptr
 *   argument should be the address of a char * object, and a successful
 *   call to asprintf stores a pointer to the newly allocated string at that
 *   location.
 *
 * Returned Value:
 *   The returned value is the number of characters allocated for the buffer,
 *   or less than zero if an error occurred. Usually this means that the
 *   buffer could not be allocated.
 *
 ****************************************************************************/

#undef asprintf
int asprintf(FAR char **ptr, FAR const IPTR char *fmt, ...)
{
  va_list ap;
  int ret;

  /* Let vasprintf do all of the work */

  va_start(ap, fmt);
  ret = vasprintf(ptr, fmt, ap);
  va_end(ap);

  return ret;
}
