/****************************************************************************
 * include/stdio.h
 *
 * 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.
 *
 ****************************************************************************/

#ifndef __INCLUDE_STDIO_H
#define __INCLUDE_STDIO_H

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

#include <nuttx/config.h>

#include <sys/types.h>
#include <stdarg.h>
#include <time.h>

#include <nuttx/fs/fs.h>
#include <nuttx/lib/lib.h>

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/* File System Definitions **************************************************/

#define FILENAME_MAX _POSIX_NAME_MAX
#define FOPEN_MAX    _POSIX_STREAM_MAX

/* The (default) size of the I/O buffers */

#if defined(CONFIG_STDIO_BUFFER_SIZE) && CONFIG_STDIO_BUFFER_SIZE > 0
#  define BUFSIZ   CONFIG_STDIO_BUFFER_SIZE
#else
#  define BUFSIZ   64
#endif

/* The following three definitions are for ANSI C, used by setvbuf */

#define _IOFBF     0               /* Fully buffered */
#define _IOLBF     1               /* Line buffered */
#define _IONBF     2               /* Unbuffered */

/* File system error values */

#define EOF        (-1)

/* The first three _iob entries are reserved for standard I/O */

#define stdin      lib_get_stream(0)
#define stdout     lib_get_stream(1)
#define stderr     lib_get_stream(2)

/* Path to the directory where temporary files can be created */

#ifndef CONFIG_LIBC_TMPDIR
#  define CONFIG_LIBC_TMPDIR "/tmp"
#endif

#define P_tmpdir   CONFIG_LIBC_TMPDIR

/* Maximum size of character array to hold tmpnam() output. */

#ifndef CONFIG_LIBC_MAX_TMPFILE
#  define CONFIG_LIBC_MAX_TMPFILE 32
#endif

#define L_tmpnam   CONFIG_LIBC_MAX_TMPFILE

/* The maximum number of unique temporary file names that can be generated */

#define TMP_MAX 56800235584ull

#if defined(CONFIG_FS_LARGEFILE)
#  define tmpfile64 tmpfile
#  define fopen64   fopen
#  define freopen64 freopen
#  define fseeko64  fseeko
#  define ftello64  ftello
#  define fgetpos64 fgetpos
#  define fsetpos64 fsetpos
#endif

#define setlinebuf(stream)   setvbuf(stream, NULL, _IOLBF, 0)

#define feof_unlocked(stream)     feof(stream)
#define ferror_unlocked(stream)   ferror(stream)
#define fileno_unlocked(stream)   fileno(stream)

/****************************************************************************
 * Public Type Definitions
 ****************************************************************************/

/* Streams */

typedef struct file_struct FILE;

struct va_format
{
  FAR const char *fmt;
  FAR va_list *va;
};

/****************************************************************************
 * Public Data
 ****************************************************************************/

#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif

/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

/* ANSI-like File System Interfaces */

/* Operations on streams (FILE) */

void   clearerr(FAR FILE *stream);
void   clearerr_unlocked(FAR FILE *stream);
int    fclose(FAR FILE *stream);
int    fflush(FAR FILE *stream);
int    fflush_unlocked(FAR FILE *stream);
int    feof(FAR FILE *stream);
int    ferror(FAR FILE *stream);
int    fileno(FAR FILE *stream);
int    fgetc(FAR FILE *stream);
int    fgetc_unlocked(FAR FILE *stream);
int    fgetpos(FAR FILE *stream, FAR fpos_t *pos);
FAR char *fgets(FAR char *s, int n, FAR FILE *stream);
FAR char *fgets_unlocked(FAR char *s, int n, FAR FILE *stream);
FAR FILE *fopen(FAR const char *path, FAR const char *type) fopen_like;
int    fprintf(FAR FILE *stream, FAR const IPTR char *format, ...)
       printf_like(2, 3);
int    fputc(int c, FAR FILE *stream);
int    fputc_unlocked(int c, FAR FILE *stream);
int    fputs(FAR const IPTR char *s, FAR FILE *stream);
int    fputs_unlocked(FAR const IPTR char *s, FAR FILE *stream);
size_t fread(FAR void *ptr, size_t size, size_t n_items, FAR FILE *stream);
size_t fread_unlocked(FAR void *ptr, size_t size, size_t n_items,
                      FAR FILE *stream);
FAR FILE *freopen(FAR const char *path, FAR const char *mode,
                  FAR FILE *stream);
int    fscanf(FAR FILE *stream, FAR const IPTR char *fmt, ...)
       scanf_like(2, 3);
int    fseek(FAR FILE *stream, long int offset, int whence);
int    fseeko(FAR FILE *stream, off_t offset, int whence);
int    fsetpos(FAR FILE *stream, FAR fpos_t *pos);
long   ftell(FAR FILE *stream);
off_t  ftello(FAR FILE *stream);
size_t fwrite(FAR const void *ptr, size_t size, size_t n_items,
              FAR FILE *stream);
size_t fwrite_unlocked(FAR const void *ptr, size_t size, size_t n_items,
                       FAR FILE *stream);
int     getc(FAR FILE *stream);
int     getc_unlocked(FAR FILE *stream);
int     getchar(void);
int     getchar_unlocked(void);
ssize_t getdelim(FAR char **lineptr, size_t *n, int delimiter,
                 FAR FILE *stream);
ssize_t getline(FAR char **lineptr, size_t *n, FAR FILE *stream);
FAR char *gets(FAR char *s);
FAR char *gets_s(FAR char *s, rsize_t n);
void   rewind(FAR FILE *stream);

void   setbuf(FAR FILE *stream, FAR char *buf);
int    setvbuf(FAR FILE *stream, FAR char *buffer, int mode, size_t size);
void   setbuffer(FAR FILE *stream, FAR char *buf, size_t size);

int    ungetc(int c, FAR FILE *stream);

void flockfile(FAR FILE *stream);
int ftrylockfile(FAR FILE *stream);
void funlockfile(FAR FILE *stream);

/* Operations on the stdout stream, buffers, paths,
 * and the whole printf-family
 */

void   perror(FAR const char *s);
int    printf(FAR const IPTR char *fmt, ...) printf_like(1, 2);
int    putc(int c, FAR FILE *stream);
int    putc_unlocked(int c, FAR FILE *stream);
int    putchar(int c);
int    putchar_unlocked(int c);
int    puts(FAR const IPTR char *s);
int    rename(FAR const char *oldpath, FAR const char *newpath);
int    renameat(int olddirfd, FAR const char *oldpath,
                int newdirfd, FAR const char *newpath);
int    sprintf(FAR char *buf, FAR const IPTR char *fmt, ...)
       printf_like(2, 3);
int    asprintf(FAR char **ptr, FAR const IPTR char *fmt, ...)
       printf_like(2, 3);
int    snprintf(FAR char *buf, size_t size,
                FAR const IPTR char *fmt, ...) printf_like(3, 4);
int    sscanf(FAR const char *buf, FAR const IPTR char *fmt, ...)
       scanf_like(2, 3);

int    scanf(FAR const IPTR char *fmt, ...) scanf_like(1, 2);
int    vasprintf(FAR char **ptr, FAR const IPTR char *fmt, va_list ap)
       printf_like(2, 0);
int    vfprintf(FAR FILE *stream, FAR const IPTR char *fmt,
                va_list ap) printf_like(2, 0);
int    vfscanf(FAR FILE *stream, FAR const IPTR char *fmt, va_list ap)
       scanf_like(2, 0);
int    vprintf(FAR const IPTR char *fmt, va_list ap) printf_like(1, 0);
int    vscanf(FAR const IPTR char *fmt, va_list ap) scanf_like(1, 0);
int    vsnprintf(FAR char *buf, size_t size, FAR const IPTR char *fmt,
                 va_list ap) printf_like(3, 0);
int    vsprintf(FAR char *buf, FAR const IPTR char *fmt, va_list ap)
       printf_like(2, 0);
int    vsscanf(FAR const char *buf, FAR const IPTR char *fmt, va_list ap)
       scanf_like(2, 0);

/* Operations on file descriptors including:
 *
 * POSIX-like File System Interfaces (fdopen), and
 * Extensions from the Open Group Technical Standard, 2006, Extended API Set
 *   Part 1 (dprintf and vdprintf)
 */

FAR FILE *fdopen(int fd, FAR const char *type) fopen_like;
int    dprintf(int fd, FAR const IPTR char *fmt, ...) printf_like(2, 3);
int    vdprintf(int fd, FAR const IPTR char *fmt, va_list ap)
       printf_like(2, 0);

/* Custom stream operation fopencookie. */

FAR FILE *fopencookie(FAR void *cookie, FAR const char *mode,
                      cookie_io_functions_t io_funcs);

/* Memory buffer stream */

FAR FILE *fmemopen(FAR void *buf, size_t size, FAR const char *mode);
FAR FILE *open_memstream(FAR char **bufp, FAR size_t *sizep);

/* Operations on paths */

FAR FILE *tmpfile(void) fopen_like;
FAR char *tmpnam(FAR char *s);
FAR char *tempnam(FAR const char *dir, FAR const char *pfx) malloc_like;
int       remove(FAR const char *path);

/* Shell operations.  These are not actually implemented in the OS.  See
 * apps/system/popen for implementation.
 */

#ifndef __KERNEL__
int pclose(FILE *stream);
FILE *popen(FAR const char *command, FAR const char *mode) popen_like;
#endif

#if CONFIG_FORTIFY_SOURCE > 0
fortify_function(fgets) FAR char *fgets(FAR char *s, int n, FAR FILE *stream)
{
  fortify_assert((size_t)n <= fortify_size(s, 0));
  return __real_fgets(s, n, stream);
}

fortify_function(fread) size_t fread(FAR void *ptr, size_t size,
                                     size_t n_items, FAR FILE *stream)
{
  fortify_assert(n_items == 0 || (n_items * size) / n_items == size);
  fortify_assert(n_items * size <= fortify_size(ptr, 0));
  return __real_fread(ptr, size, n_items, stream);
}

fortify_function(fwrite) size_t fwrite(FAR const void *ptr, size_t size,
                                       size_t n_items, FAR FILE *stream)
{
  fortify_assert(n_items == 0 || (n_items * size) / n_items == size);
  fortify_assert(n_items * size <= fortify_size(ptr, 0));
  return __real_fwrite(ptr, size, n_items, stream);
}

fortify_function(vsnprintf) int vsnprintf(FAR char *buf, size_t size,
                                          FAR const IPTR char *format,
                                          va_list ap)
{
  fortify_assert(size <= fortify_size(buf, 0));
  return __real_vsnprintf(buf, size, format, ap);
}

fortify_function(vsprintf) int vsprintf(FAR char *dest,
                                        FAR const IPTR char *src,
                                        va_list ap)
{
  int ret;

  ret = __real_vsprintf(dest, src, ap);
  fortify_assert(ret == -1 || (size_t)ret <= fortify_size(dest, 0));
  return ret;
}

fortify_function(snprintf) int snprintf(FAR char *buf, size_t size,
                                        FAR const IPTR char *format, ...)
{
  fortify_assert(size <= fortify_size(buf, 0));
  return __real_snprintf(buf, size, format, fortify_va_arg_pack());
}

fortify_function(sprintf) int sprintf(FAR char *buf,
                                      FAR const IPTR char *fmt,
                                      ...)
{
  int ret;

  ret = __real_sprintf(buf, fmt, fortify_va_arg_pack());
  fortify_assert(ret == -1 || (size_t)ret <= fortify_size(buf, 0));
  return ret;
}
#endif

#undef EXTERN
#if defined(__cplusplus)
}
#endif

#endif /* __INCLUDE_STDIO_H */
