# 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
	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
