]> pd.if.org Git - pdclib/commitdiff
I am not sure I understood strcoll() and strxfrm() correctly, but this is it for...
authorsolar <unknown>
Fri, 31 Dec 2010 08:47:37 +0000 (08:47 +0000)
committersolar <unknown>
Fri, 31 Dec 2010 08:47:37 +0000 (08:47 +0000)
functions/string/strcoll.c
functions/string/strxfrm.c
platform/example/functions/_PDCLIB/stdinit.c
platform/example/internals/_PDCLIB_config.h

index 58814d65ecd8d8aa0eb3998b93b898ca51291be5..16a5680b610c14ea5aaf078f60ced375095753b8 100644 (file)
 
 #ifndef REGTEST
 
-/* TODO: Dummy function, PDCLib does not support locales yet. */
+#include <locale.h>
+
 int strcoll( const char * s1, const char * s2 )
 {
-    return strcmp( s1, s2 );
+    while ( ( *s1 ) && ( _PDCLIB_lconv.ctype[(unsigned char)*s1].collation == _PDCLIB_lconv.ctype[(unsigned char)*s2].collation ) )
+    {
+        ++s1;
+        ++s2;
+    }
+    return ( _PDCLIB_lconv.ctype[(unsigned char)*s1].collation == _PDCLIB_lconv.ctype[(unsigned char)*s2].collation );
 }
 
 #endif
index 2f8f7a61777886a522fc9ef66f3830b23dcbfa5a..4f5e4a099bb1902f502b26dce62faa77ef1dce97 100644 (file)
@@ -10,7 +10,8 @@
 
 #ifndef REGTEST
 
-/* TODO: Dummy function, no locale support yet. */
+#include <locale.h>
+
 size_t strxfrm( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n )
 {
     size_t len = strlen( s2 );
@@ -19,7 +20,7 @@ size_t strxfrm( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, si
         /* Cannot use strncpy() here as the filling of s1 with '\0' is not part
            of the spec.
         */
-        while ( n-- && ( *s1++ = *s2++ ) );
+        while ( n-- && ( *s1++ = _PDCLIB_lconv.ctype[(unsigned char)*s2++].collation ) );
     }
     return len;
 }
index 9467077d4e9b34acf1558860ce29bf7be7005d59..2554e9fe8c702df81ef0806765ebc6e43ce3255a 100644 (file)
@@ -310,7 +310,8 @@ struct lconv _PDCLIB_lconv = {
     {
         /* no error */ (char *)"",
         /* ERANGE   */ (char *)"ERANGE (Range error)",
-        /* EDOM     */ (char *)"EDOM (Domain error)"
+        /* EDOM     */ (char *)"EDOM (Domain error)",
+        /* EILSEQ   */ (char *)"EILSEQ (Illegal sequence)"
     },
     /* decimal_point      */ (char *)".",
     /* thousands_sep      */ (char *)"",
index 0059a7f6d9b9c41975e43bbb7eef0d46f8215619..64cc98dc73411bcc4e854ff936e09ab0d2e76f63 100644 (file)
@@ -37,8 +37,8 @@
 /* strerror() and perror() functions. (If you change this value because you   */
 /* are using additional errno values, you *HAVE* to provide appropriate error */
 /* messages for *ALL* locales.)                                               */
-/* Default is 2 (0, ERANGE, EDOM).                                            */
-#define _PDCLIB_ERRNO_MAX 3
+/* Default is 4 (0, ERANGE, EDOM, EILSEQ).                                    */
+#define _PDCLIB_ERRNO_MAX 4
 
 /* -------------------------------------------------------------------------- */
 /* Integers                                                                   */
@@ -341,6 +341,9 @@ typedef int _PDCLIB_fd_t;
    an uppercase 'E', and there is no mechanics in <errno.h> to unmask that
    particular value (for exactly that reason).
 
+   There also is no error message available for this value through either the
+   strerror() or perror() functions. It is being reported as "unknown" error.
+
    The idea is that you scan the source of PDCLib for occurrences of this macro
    and replace _PDCLIB_ERROR with whatever additional errno value you came up
    with for your platform.