aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/string/strxfrm_l.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/string/strxfrm_l.c')
-rw-r--r--newlib/libc/string/strxfrm_l.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/newlib/libc/string/strxfrm_l.c b/newlib/libc/string/strxfrm_l.c
new file mode 100644
index 0000000..a1f4fe2
--- /dev/null
+++ b/newlib/libc/string/strxfrm_l.c
@@ -0,0 +1,71 @@
+/*
+FUNCTION
+ <<strxfrm_l>>---transform string
+
+INDEX
+ strxfrm_l
+
+ANSI_SYNOPSIS
+ #include <string.h>
+ size_t strxfrm_l(char *restrict <[s1]>, const char *restrict <[s2]>,
+ size_t <[n]>, locale_t <[locale]>);
+
+DESCRIPTION
+ This function transforms the string pointed to by <[s2]> and
+ places the resulting string into the array pointed to by
+ <[s1]>. The transformation is such that if the <<strcmp>>
+ function is applied to the two transformed strings, it returns
+ a value greater than, equal to, or less than zero,
+ correspoinding to the result of a <<strcoll>> function applied
+ to the same two original strings.
+
+ No more than <[n]> characters are placed into the resulting
+ array pointed to by <[s1]>, including the terminating null
+ character. If <[n]> is zero, <[s1]> may be a null pointer. If
+ copying takes place between objects that overlap, the behavior
+ is undefined.
+
+ (NOT Cygwin:) The current implementation of <<strxfrm_l>> simply copies
+ the input and does not support any language-specific transformations.
+
+ If <[locale]> is LC_GLOBAL_LOCALE or not a valid locale object, the
+ behaviour is undefined.
+
+RETURNS
+ The <<strxfrm_l>> function returns the length of the transformed string
+ (not including the terminating null character). If the value returned
+ is <[n]> or more, the contents of the array pointed to by
+ <[s1]> are indeterminate.
+
+PORTABILITY
+<<strxfrm_l>> is POSIX-1.2008.
+
+<<strxfrm_l>> requires no supporting OS subroutines.
+
+QUICKREF
+ strxfrm_l ansi pure
+*/
+
+#include <string.h>
+
+size_t
+strxfrm_l (char *__restrict s1, const char *__restrict s2, size_t n,
+ struct __locale_t *locale)
+{
+ size_t res;
+ res = 0;
+ while (n-- > 0)
+ {
+ if ((*s1++ = *s2++) != '\0')
+ ++res;
+ else
+ return res;
+ }
+ while (*s2)
+ {
+ ++s2;
+ ++res;
+ }
+
+ return res;
+}