/****************************************************************************
 * include/limits.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_LIMITS_H
#define __INCLUDE_LIMITS_H

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

#include <nuttx/config.h>

/* Architecture specific limits */

#include <arch/limits.h>

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

/* Default values for user configurable limits ******************************/

/* Maximum number of bytes in a filename (not including terminating null). */

#ifndef CONFIG_NAME_MAX
#  define CONFIG_NAME_MAX 32
#endif

/* Maximum number of bytes in a pathname, including the terminating null
 * character.
 */

#ifndef CONFIG_PATH_MAX
#  if CONFIG_NAME_MAX < 64
#    define CONFIG_PATH_MAX (4*CONFIG_NAME_MAX + 1)
#  else
#    define CONFIG_PATH_MAX 256
#  endif
#endif

/* Maximum length of any multibyte character in any locale.
 * We define this value here since the gcc header does not define
 * the correct value.
 */

#define MB_LEN_MAX            4

/* Configurable limits required by POSIX ************************************
 *
 * Required for all implementations:
 *
 *   _POSIX_ARG_MAX        Total length of string arguments
 *   _POSIX_CHILD_MAX      Number of child tasks active
 *   _POSIX_LINK_MAX       The number of links a file can have
 *   _POSIX_MAX_CANON      Number bytes in TTY canonical input queue
 *   _POSIX_MAX_INPUT      Number bytes in TTY canonical input queue
 *   _POSIX_NAME_MAX       Number of bytes in a file or pathname component
 *   _POSIX_NGROUPS_MAX    Number supplementary group IDs
 *   _POSIX_OPEN_MAX       Number of files a task can have open at once
 *   _POSIX_PATH_MAX       Number of bytes in a full pathname
 *                         (including NULL)
 *   _POSIX_PIPE_BUF       Number of bytes for atomic write into pipe
 *   _POSIX_SSIZE_MAX      Largest filesystem write; also max value
 *                         of ssize_t
 *   _POSIX_STREAM_MAX     Number of std I/O streams open at once
 *   _POSIX_TZNAME_MAX     Max number of bytes of a timezone name
 *
 * Required for sigqueue
 *
 *   _POSIX_RTSIG_MAX      Number of realtime signals reserved
 *                         for application
 *   _POSIX_SIGQUEUE_MAX   Max number signals a task can queue
 *
 * Required for POSIX timers
 *
 *   _POSIX_DELAYTIMER_MAX Max number timer overruns
 *   _POSIX_TIMER_MAX      Max number of timers per task
 *   _POSIX_CLOCKRES_MIN   Clock resolution in nanoseconds
 *
 * Required for asynchronous I/O
 *
 *   _POSIX_AIO_LISTIO_MAX Max number of AIOs in single listio call
 *   _POSIX_AIO_MAX        Max number of simultaneous AIO operations
 *
 * Required for POSIX message passing
 *
 *   _POSIX_MQ_OPEN_MAX    Max number message queues task may open (mq_open)
 *   _POSIX_MQ_PRIO_MAX    Max message priority (mq_send)
 *
 * Required for POSIX semaphores
 *
 *   _POSIX_SEM_NSEMS_MAX  Max number of open semaphores per task
 *   _POSIX_SEM_VALUE_MAX  Max value a semaphore may have
 *
 * Required for symbolic links
 *   _POSIX_SYMLOOP_MAX    Maximum number of symbolic links that can be
 *                         reliably traversed in the resolution of a pathname
 *                         in the absence of a loop.
 *
 */

#define _POSIX_ARG_MAX        4096
#define _POSIX_CHILD_MAX      6
#define _POSIX_LINK_MAX       8
#define _POSIX_MAX_CANON      255
#define _POSIX_MAX_INPUT      255
#define _POSIX_NAME_MAX       CONFIG_NAME_MAX
#define _POSIX_NGROUPS_MAX    0
#define _POSIX_OPEN_MAX       16
#define _POSIX_PATH_MAX       CONFIG_PATH_MAX
#define _POSIX_PIPE_BUF       512
#define _POSIX_STREAM_MAX     16
#define _POSIX_TZNAME_MAX     3

#ifdef CONFIG_SMALL_MEMORY

#define _POSIX_SIZE_MAX       65535        /* See sys/types.h */
#define _POSIX_SIZE_MIN       0

#define _POSIX_SSIZE_MAX      32767        /* See sys/types.h */
#define _POSIX_SSIZE_MIN      -32768

#else /* CONFIG_SMALL_MEMORY */

#define _POSIX_SIZE_MAX       ULONG_MAX
#define _POSIX_SIZE_MIN       0

#define _POSIX_SSIZE_MAX      LONG_MAX
#define _POSIX_SSIZE_MIN      LONG_MIN

#endif /* CONFIG_SMALL_MEMORY */

/* Required for sigqueue */

#define _POSIX_RTSIG_MAX      8   /*  Number of reserved realtime signals */
#define _POSIX_SIGQUEUE_MAX   32

/* Required for symbolic links */

#define _POSIX_SYMLOOP_MAX    8

/* Required for POSIX timers.
 *
 * _POSIX_DELAYTIMER_MAX is the number of timer expiration overruns.
 *
 * _POSIX_TIMER_MAX is the per-process number of timers.
 *
 * _POSIX_CLOCKRES_MIN is the resolution of the CLOCK_REALTIME clock in
 *    nanoseconds.  CLOCK_REALTIME is controlled by the NuttX system time.
 *    The default value is the system timer which has a resolution of 1000
 *    microseconds.  This default setting can be overridden by defining the
 *    clock interval in microseconds as CONFIG_USEC_PER_TICK in the NuttX
 *    configuration file.
 */

#define _POSIX_DELAYTIMER_MAX 32
#define _POSIX_TIMER_MAX      32

#ifdef CONFIG_USEC_PER_TICK
#  define _POSIX_CLOCKRES_MIN ((CONFIG_USEC_PER_TICK)*1000)
#else
#  define _POSIX_CLOCKRES_MIN (10*1000000)
#endif

/* Required for asynchronous I/O */

#define _POSIX_AIO_LISTIO_MAX 2
#define _POSIX_AIO_MAX        1

/* Required for POSIX message passing */

#define _POSIX_MQ_OPEN_MAX    8
#define _POSIX_MQ_PRIO_MAX    UCHAR_MAX

/* Required for POSIX semaphores */

#define _POSIX_SEM_NSEMS_MAX  INT_MAX
#define _POSIX_SEM_VALUE_MAX  0x7fff

/* Numerical limits.  These values may be increased from the POSIX minimum
 * values above or made indeterminate
 */

#define ARG_MAX        _POSIX_ARG_MAX
#define CHILD_MAX      _POSIX_CHILD_MAX
#define LINK_MAX       _POSIX_LINK_MAX
#define MAX_CANON      _POSIX_MAX_CANON
#define MAX_INPUT      _POSIX_MAX_INPUT
#define NAME_MAX       _POSIX_NAME_MAX
#define TTY_NAME_MAX   _POSIX_NAME_MAX
#define NGROUPS_MAX    _POSIX_NGROUPS_MAX
#if CONFIG_LIBC_OPEN_MAX < _POSIX_OPEN_MAX
#  define OPEN_MAX     _POSIX_OPEN_MAX
#else
#  define OPEN_MAX     CONFIG_LIBC_OPEN_MAX
#endif
#define PATH_MAX       _POSIX_PATH_MAX
#define PIPE_BUF       _POSIX_PIPE_BUF
#define SIZE_MAX       _POSIX_SIZE_MAX
#define SIZE_MIN       _POSIX_SIZE_MIN
#define RSIZE_MAX      _POSIX_SIZE_MAX
#define SSIZE_MAX      _POSIX_SSIZE_MAX
#define SSIZE_MIN      _POSIX_SSIZE_MIN
#define STREAM_MAX     _POSIX_STREAM_MAX
#define TZNAME_MAX     _POSIX_TZNAME_MAX
#define TZ_MAX_TIMES   CONFIG_LIBC_TZ_MAX_TIMES
#define TZ_MAX_TYPES   CONFIG_LIBC_TZ_MAX_TYPES

#define RTSIG_MAX      32
#define SIGQUEUE_MAX   _POSIX_SIGQUEUE_MAX

#define SYMLOOP_MAX    _POSIX_SYMLOOP_MAX

#define DELAYTIMER_MAX _POSIX_DELAYTIMER_MAX
#define TIMER_MAX      _POSIX_TIMER_MAX
#define CLOCKRES_MIN   _POSIX_CLOCKRES_MIN

#ifdef CONFIG_SYSTEM_TIME64
#  define CLOCK_MAX    UINT64_MAX
#else
#  define CLOCK_MAX    UINT32_MAX
#endif

/* Other invariant values */

/* CHARCLASS_NAME_MAX
 *   Maximum number of bytes in a character class name. Minimum Acceptable
 *   Value: 14
 */

#define CHARCLASS_NAME_MAX 14

/* Maximum value of digit in calls to the printf() and scanf() functions.
 * Minimum Acceptable Value: 9
 */

#ifdef CONFIG_LIBC_NUMBERED_ARGS
#  ifdef CONFIG_LIBC_NL_ARGMAX
#    define NL_ARGMAX CONFIG_LIBC_NL_ARGMAX
#  else
#    define NL_ARGMAX 9
#  endif
#endif

/* NL_LANGMAX
 *    Maximum number of bytes in a LANG name. Minimum Acceptable Value: 14
 */

#define NL_LANGMAX 14

/* NL_MSGMAX
 *    Maximum message number. Minimum Acceptable Value: 32 67
 */

#define NL_MSGMAX 32767

/* NL_NMAX
 *   Maximum number of bytes in an N-to-1 collation mapping. Minimum
 *   Acceptable Value: *
 */

/* NL_SETMAX
 *   Maximum set number. Minimum Acceptable Value: 255
 */

#define NL_SETMAX 255

/* NL_TEXTMAX
 *   Maximum number of bytes in a message string. Minimum Acceptable Value:
 *   _POSIX2_LINE_MAX
 */

#define NL_TEXTMAX _POSIX2_LINE_MAX

/* NZERO
 *   Default process priority. Minimum Acceptable Value: 100
 */

#define NZERO SCHED_PRIORITY_DEFAULT

/* Required for asynchronous I/O */

#define AIO_LISTIO_MAX _POSIX_AIO_LISTIO_MAX
#define AIO_MAX        _POSIX_AIO_MAX

/* Required for POSIX message passing */

#define MQ_OPEN_MAX    _POSIX_MQ_OPEN_MAX
#define MQ_PRIO_MAX    _POSIX_MQ_PRIO_MAX

/* Required for POSIX semaphores */

#define SEM_NSEMS_MAX  _POSIX_SEM_NSEMS_MAX
#define SEM_VALUE_MAX  _POSIX_SEM_VALUE_MAX

/* Required for readv() and writev() */

/* There really is no upper limit on the number of vectors */

#define IOV_MAX        INT_MAX

#define HOST_NAME_MAX  32

/* ptrdiff_t limits */

#define PTRDIFF_MAX PTR_MAX
#define PTRDIFF_MIN PTR_MIN

#endif /* __INCLUDE_LIMITS_H */