This is an automated email from the ASF dual-hosted git repository.
cederom pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new f139e56cd testing/libc/wcstombs: Add testing application for wcstombs
f139e56cd is described below
commit f139e56cd62a30d6edcd7207c7e4cbc6e9b8b7d1
Author: Tiago Medicci <[email protected]>
AuthorDate: Wed Feb 5 10:39:19 2025 -0300
testing/libc/wcstombs: Add testing application for wcstombs
This application test the libc's `wcstombs` function for different
len sizes (bigger than the converted string, exactly the size of
it and smaller than it).
---
testing/libc/wcstombs/CMakeLists.txt | 35 ++++++
testing/libc/wcstombs/Kconfig | 30 +++++
testing/libc/wcstombs/Make.defs | 25 ++++
testing/libc/wcstombs/Makefile | 36 ++++++
testing/libc/wcstombs/wcstombs_main.c | 224 ++++++++++++++++++++++++++++++++++
5 files changed, 350 insertions(+)
diff --git a/testing/libc/wcstombs/CMakeLists.txt
b/testing/libc/wcstombs/CMakeLists.txt
new file mode 100644
index 000000000..c58cc1f2d
--- /dev/null
+++ b/testing/libc/wcstombs/CMakeLists.txt
@@ -0,0 +1,35 @@
+#
##############################################################################
+# apps/testing/libc/wcstombs/CMakeLists.txt
+#
+# 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.
+#
+#
##############################################################################
+
+if(CONFIG_TESTING_WCSTOMBS)
+ nuttx_add_application(
+ NAME
+ ${CONFIG_TESTING_WCSTOMBS_PROGNAME}
+ PRIORITY
+ ${CONFIG_TESTING_WCSTOMBS_PRIORITY}
+ STACKSIZE
+ ${CONFIG_TESTING_WCSTOMBS_STACKSIZE}
+ MODULE
+ ${CONFIG_TESTING_WCSTOMBS}
+ SRCS
+ wcstombs_main.c)
+endif()
diff --git a/testing/libc/wcstombs/Kconfig b/testing/libc/wcstombs/Kconfig
new file mode 100644
index 000000000..41d72b507
--- /dev/null
+++ b/testing/libc/wcstombs/Kconfig
@@ -0,0 +1,30 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+config TESTING_WCSTOMBS
+ tristate "wcstombs() test"
+ default n
+ depends on LIBC_LOCALE
+ ---help---
+ Enable wcstombs() test
+
+if TESTING_WCSTOMBS
+
+config TESTING_WCSTOMBS_PROGNAME
+ string "Program name"
+ default "wcstombs"
+ ---help---
+ This is the name of the program that will be used when the NSH
ELF
+ program is installed.
+
+config TESTING_WCSTOMBS_PRIORITY
+ int "wcstombs task priority"
+ default 100
+
+config TESTING_WCSTOMBS_STACKSIZE
+ int "wcstombs stack size"
+ default DEFAULT_TASK_STACKSIZE
+
+endif
diff --git a/testing/libc/wcstombs/Make.defs b/testing/libc/wcstombs/Make.defs
new file mode 100644
index 000000000..3c1ac4c83
--- /dev/null
+++ b/testing/libc/wcstombs/Make.defs
@@ -0,0 +1,25 @@
+############################################################################
+# apps/testing/libc/wcstombs/Make.defs
+#
+# 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.
+#
+############################################################################
+
+ifneq ($(CONFIG_TESTING_WCSTOMBS),)
+CONFIGURED_APPS += $(APPDIR)/testing/libc/wcstombs
+endif
diff --git a/testing/libc/wcstombs/Makefile b/testing/libc/wcstombs/Makefile
new file mode 100644
index 000000000..a5fb15ddc
--- /dev/null
+++ b/testing/libc/wcstombs/Makefile
@@ -0,0 +1,36 @@
+############################################################################
+# apps/testing/libc/wcstombs/Makefile
+#
+# 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.
+#
+############################################################################
+
+include $(APPDIR)/Make.defs
+
+# wcstombs() test built-in application info
+
+PROGNAME = $(CONFIG_TESTING_WCSTOMBS_PROGNAME)
+PRIORITY = $(CONFIG_TESTING_WCSTOMBS_PRIORITY)
+STACKSIZE = $(CONFIG_TESTING_WCSTOMBS_STACKSIZE)
+MODULE = $(CONFIG_TESTING_WCSTOMBS)
+
+# wcstombs test files
+
+MAINSRC = wcstombs_main.c
+
+include $(APPDIR)/Application.mk
diff --git a/testing/libc/wcstombs/wcstombs_main.c
b/testing/libc/wcstombs/wcstombs_main.c
new file mode 100644
index 000000000..73f5e504e
--- /dev/null
+++ b/testing/libc/wcstombs/wcstombs_main.c
@@ -0,0 +1,224 @@
+/****************************************************************************
+ * apps/testing/libc/wcstombs/wcstombs_main.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>
+#include <stdlib.h>
+#include <wchar.h>
+#include <locale.h>
+#include <stdint.h>
+#include <string.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(void)
+{
+ /* Local variable declarations */
+
+ const wchar_t *src;
+ size_t dst_size;
+ char *dst;
+ size_t ret;
+ size_t i;
+
+ printf("wcstombs Test application:\n");
+
+ /* Set the locale to the user's default locale */
+
+ setlocale(LC_ALL, "");
+
+ /* Example wide character array (source) */
+
+ src = L"Hello, world!";
+
+ /* Calculate the required size for the dst buffer */
+
+ dst_size = wcstombs(NULL, src, 0) + 1; /* +1 for the null terminator */
+ dst = (char *)malloc(dst_size);
+
+ if (dst == NULL)
+ {
+ printf("ERROR: malloc failed.\n");
+ return EXIT_FAILURE;
+ }
+
+ printf("\nTest Scenario: len is bigger than the size of the converted "
+ "string. Expected the null-terminator at the end of the converted "
+ "string.\n");
+
+ /* Initialize dst with a known value (0xaa) */
+
+ memset(dst, 0xaa, dst_size);
+
+ /* Convert wide characters to multibyte characters */
+
+ ret = wcstombs(dst, src, dst_size);
+
+ /* Check if the conversion was successful */
+
+ if (ret == (size_t)-1)
+ {
+ printf("ERROR: wcstombs failed.\n");
+ free(dst);
+ return EXIT_FAILURE;
+ }
+
+ /* Print the return code */
+
+ printf("Return code: %zu\n", ret);
+
+ /* Print the dst buffer as an array of uint8_t elements */
+
+ printf("dst buffer (as uint8_t array): ");
+ for (i = 0; i < dst_size; i++) /* Include the null terminator in the output
*/
+ {
+ printf("%02x ", (uint8_t)dst[i]);
+ }
+
+ printf("\n");
+
+ /* Check if the dst value just after the return value is as expected */
+
+ if (dst[ret] == '\0')
+ {
+ printf("The character just after the return value is the null "
+ "terminating character.\n");
+ }
+ else
+ {
+ printf("The character just after the return value is not the expected "
+ "null-terminator (value: %02x). This is a bug!\n", dst[ret]);
+ free(dst);
+ return EXIT_FAILURE;
+ }
+
+ printf("\nTest Scenario: len is exactly the size of the converted string. "
+ "Do not expected the null-terminator at the end of the converted "
+ "string.\n");
+
+ /* Initialize dst with a known value (0xaa) */
+
+ memset(dst, 0xaa, dst_size);
+
+ /* Convert wide characters to multibyte characters */
+
+ ret = wcstombs(dst, src, dst_size - 1);
+
+ /* Check if the conversion was successful */
+
+ if (ret == (size_t)-1)
+ {
+ printf("ERROR: wcstombs failed.\n");
+ free(dst);
+ return EXIT_FAILURE;
+ }
+
+ /* Print the return code */
+
+ printf("Return code: %zu\n", ret);
+
+ /* Print the dst buffer as an array of uint8_t elements */
+
+ printf("dst buffer (as uint8_t array): ");
+ for (i = 0; i < dst_size; i++) /* Include the null terminator in the output
*/
+ {
+ printf("%02x ", (uint8_t)dst[i]);
+ }
+
+ printf("\n");
+
+ /* Check if the dst value just after the return value is as expected */
+
+ if ((uint8_t)dst[ret] == 0xaa)
+ {
+ printf("The character just after the return value is the expected "
+ "0xaa value. No null-terminator.\n");
+ }
+ else
+ {
+ printf("The character just after the return value is not the expected "
+ "0xaa (value: %02x). This is a bug!\n", dst[ret]);
+ free(dst);
+ return EXIT_FAILURE;
+ }
+
+ printf("\nTest Scenario: len is smaller than the size of the converted "
+ " string. Do not expected the null-terminator at the end of the "
+ "converted string.\n");
+
+ /* Initialize dst with a known value (0xaa) */
+
+ memset(dst, 0xaa, dst_size);
+
+ /* Convert wide characters to multibyte characters */
+
+ ret = wcstombs(dst, src, dst_size - 2);
+
+ /* Check if the conversion was successful */
+
+ if (ret == (size_t)-1)
+ {
+ printf("ERROR: wcstombs failed.\n");
+ free(dst);
+ return EXIT_FAILURE;
+ }
+
+ /* Print the return code */
+
+ printf("Return code: %zu\n", ret);
+
+ /* Print the dst buffer as an array of uint8_t elements */
+
+ printf("dst buffer (as uint8_t array): ");
+ for (i = 0; i < dst_size; i++) /* Include the null terminator in the output
*/
+ {
+ printf("%02x ", (uint8_t)dst[i]);
+ }
+
+ printf("\n");
+
+ /* Check if the dst value just after the return value is as expected */
+
+ if ((uint8_t)dst[ret] == 0xaa)
+ {
+ printf("The character just after the return value is the expected "
+ "0xaa value. No null-terminator.\n");
+ }
+ else
+ {
+ printf("The character just after the return value is not the expected "
+ "0xaa (value: %02x). This is a bug!\n", dst[ret]);
+ free(dst);
+ return EXIT_FAILURE;
+ }
+
+ /* Free the allocated memory */
+
+ free(dst);
+
+ return EXIT_SUCCESS;
+}