From 5bbce37789f27e5e720c2ffec0a8e50850f4e9e7 Mon Sep 17 00:00:00 2001 From: Alex Lyon Date: Fri, 26 Apr 2019 20:32:44 -0700 Subject: [PATCH] string: add strnlen_s() --- src/header/string/mod.rs | 9 ++++ tests/expected/string/strlen.stderr | 0 tests/expected/string/strlen.stdout | 9 ++++ tests/string/strlen.c | 73 +++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 tests/expected/string/strlen.stderr create mode 100644 tests/expected/string/strlen.stdout create mode 100644 tests/string/strlen.c diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs index c402707f36..e58e5beb69 100644 --- a/src/header/string/mod.rs +++ b/src/header/string/mod.rs @@ -263,6 +263,15 @@ pub unsafe extern "C" fn strnlen(s: *const c_char, size: size_t) -> size_t { i as size_t } +#[no_mangle] +pub unsafe extern "C" fn strnlen_s(s: *const c_char, size: size_t) -> size_t { + if s.is_null() { + 0 + } else { + strnlen(s, size) + } +} + #[no_mangle] pub unsafe extern "C" fn strcat(s1: *mut c_char, s2: *const c_char) -> *mut c_char { strncat(s1, s2, usize::MAX) diff --git a/tests/expected/string/strlen.stderr b/tests/expected/string/strlen.stderr new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expected/string/strlen.stdout b/tests/expected/string/strlen.stdout new file mode 100644 index 0000000000..9ce90c8a65 --- /dev/null +++ b/tests/expected/string/strlen.stdout @@ -0,0 +1,9 @@ +12 +0 +12 +12 +0 +12 +6 +12 +0 diff --git a/tests/string/strlen.c b/tests/string/strlen.c new file mode 100644 index 0000000000..f7fd46f5b5 --- /dev/null +++ b/tests/string/strlen.c @@ -0,0 +1,73 @@ +#include +#include + +#include "test_helpers.h" + +int main(void) { + char dest1[13] = "hello world!"; + int dest1_len = strlen(dest1); + printf("%d\n", dest1_len); + if(dest1_len != 12) { + puts("strlen(\"hello world!\") failed"); + exit(EXIT_FAILURE); + } + + char empty[1] = { 0 }; + int empty_len = strlen(empty); + printf("%d\n", empty_len); + if(empty_len != 0) { + puts("strlen(\"\") failed"); + exit(EXIT_FAILURE); + } + + dest1_len = strnlen(dest1, sizeof(dest1)); + printf("%d\n", dest1_len); + if(dest1_len != 12) { + puts("strnlen(\"hello world!\", 13) failed"); + exit(EXIT_FAILURE); + } + + dest1_len = strnlen(dest1, sizeof(dest1) - 1); + printf("%d\n", dest1_len); + if(dest1_len != 12) { + puts("strnlen(\"hello world!\", 12) failed"); + exit(EXIT_FAILURE); + } + + dest1_len = strnlen(dest1, 0); + printf("%d\n", dest1_len); + if(dest1_len != 0) { + puts("strnlen(\"hello world!\", 0) failed"); + exit(EXIT_FAILURE); + } + + dest1_len = strnlen(dest1, 300); + printf("%d\n", dest1_len); + if(dest1_len != 12) { + puts("strnlen(\"hello world!\", 300) failed"); + exit(EXIT_FAILURE); + } + + dest1_len = strnlen_s(dest1, 6); + printf("%d\n", dest1_len); + if(dest1_len != 6) { + puts("strnlen_s(\"hello world!\", 6) failed"); + exit(EXIT_FAILURE); + } + + dest1_len = strnlen_s(dest1, 20); + printf("%d\n", dest1_len); + if(dest1_len != 12) { + puts("strnlen_s(\"hello world!\", 20) failed"); + exit(EXIT_FAILURE); + } + + int null_len = strnlen_s(NULL, 100); + printf("%d\n", null_len); + if(null_len != 0) { + puts("strnlen_s(NULL, 100) failed"); + exit(EXIT_FAILURE); + } + + return 0; +}