# Copyright (c) 2016 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

if MINIMAL_LIBC

config MINIMAL_LIBC_NON_REENTRANT_FUNCTIONS
	bool "Non-reentrant functions"
	default y if !USERSPACE
	select NEED_LIBC_MEM_PARTITION
	help
	  Enable non-reentrant functions that make use of the globals; e.g.
	  rand() and gmtime(). The globals must be put into a dedicated C
	  library memory partition when CONFIG_USERSPACE=y, and enabling this
	  option may require an additional memory protection region.

config MINIMAL_LIBC_MALLOC
	bool "[DEPRECATED] Minimal libc malloc implementation"
	default y
	imply COMMON_LIBC_MALLOC
	help
	  [DEPRECATED] Use COMMON_LIBC_MALLOC

	  Enable the minimal libc's implementation of malloc, free, and realloc.
	  Disable if you wish to provide your own implementations of these functions.

config MINIMAL_LIBC_MALLOC_ARENA_SIZE
	int "[DEPRECATED] Size of the minimal libc malloc arena"
	default -2
	depends on COMMON_LIBC_MALLOC
	help
	  [DEPRECATED] Use COMMON_LIBC_MALLOC_ARENA_SIZE

	  Indicate the size in bytes of the memory arena used for common C
	  library malloc() implementation when using the minimal C library.

	  If set to -2, then the value of COMMON_LIBC_MALLOC_ARENA_SIZE
	  will be used.

config MINIMAL_LIBC_CALLOC
	bool "[DEPRECATED] Minimal libc trivial calloc implementation"
	default y
	help
	  [DEPRECATED] Use COMMON_LIBC_CALLOC

	  Enable the minimal libc's trivial implementation of calloc, which
	  forwards to malloc and memset.

config MINIMAL_LIBC_REALLOCARRAY
	bool "[DEPRECATED] Minimal libc trivial reallocarray implementation"
	default y
	help
	  [DEPRECATED] Use COMMON_LIBC_REALLOCARRAY

	  Enable the minimal libc's trivial implementation of reallocarray, which
	  forwards to realloc.

config MINIMAL_LIBC_LL_PRINTF
	bool "Build with minimal libc long long printf" if !64BIT
	default y if 64BIT
	help
	  Build with long long printf enabled. This will increase the size of
	  the image.

config MINIMAL_LIBC_OPTIMIZE_STRING_FOR_SIZE
	bool "Use size optimized string functions"
	default y if SIZE_OPTIMIZATIONS
	help
	  Enable smaller but potentially slower implementations of memcpy and
	  memset. On the Cortex-M0+ this reduces the total code size by 120 bytes.

config MINIMAL_LIBC_RAND
	bool "Rand and srand functions"
	help
	  Enable rand_r() for the minimal libc.

	  In order to make use of the non-reentrant rand() and srand(), it is
	  necessary to set CONFIG_MINIMAL_LIBC_NON_REENTRANT_FUNCTIONS=y.

config MINIMAL_LIBC_TIME
	bool "Time functions"
	select COMMON_LIBC_TIME if POSIX_CLOCK
	select COMMON_LIBC_GMTIME_R
	default y
	help
	  Enable time() and gmtime_r() for the minimal libc.

	  time() requires CONFIG_POSIX_CLOCK=y because it relies on the POSIX
	  clock_gettime() function.

	  In order to make use of the non-reentrant gmtime(), it is necessary
	  to set CONFIG_MINIMAL_LIBC_NON_REENTRANT_FUNCTIONS=y.

config MINIMAL_LIBC_STRING_ERROR_TABLE
	bool "String error table for strerror() and strerror_r()"
	help
	  Select this option to ensure that streror(), strerror_r()
	  produce strings corresponding to the descriptions in errno.h.

	  The string error table can add ~2kiB to ROM. As such, it is
	  disabled by default. In this case, strerror() and strerror_r()
	  symbols are still present, but the functions produce an empty
	  string.

endif # MINIMAL_LIBC
