about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-07-26 05:36:25 -0400
committerRich Felker <dalias@aerifal.cx>2014-07-26 05:36:25 -0400
commitc5b8f1930512d206a7c1cf1093a4a47e1722a414 (patch)
treea8b58dafc8f53f19858bb10d7a70d9f79a40ba58
parent0206f596d5156af560e8af10e950d3cb2f29b73d (diff)
downloadmusl-c5b8f1930512d206a7c1cf1093a4a47e1722a414.tar.gz
musl-c5b8f1930512d206a7c1cf1093a4a47e1722a414.tar.xz
musl-c5b8f1930512d206a7c1cf1093a4a47e1722a414.zip
add support for LC_TIME and LC_MESSAGES translations
for LC_MESSAGES, translation of strerror and similar literal message
functions is supported. for messages in other places (particularly the
dynamic linker) that use format strings, translation is not yet
supported. in order to make it possible and safe, such messages will
need to be refactored to separate the textual content from the format.

for LC_TIME, the day and month names and strftime-style format strings
provided by nl_langinfo are supported for translation. however there
may be limitations, as some of the original C-locale nl_langinfo
strings are non-unique and thus perhaps non-suitable as keys.

overall, the locale support activated by this commit should not be
seen as complete and polished but as a basis for beginning to test
locale functionality and implement locales.
-rw-r--r--src/errno/strerror.c13
-rw-r--r--src/locale/langinfo.c1
-rw-r--r--src/locale/strerror_l.c7
-rw-r--r--src/network/gai_strerror.c4
-rw-r--r--src/network/hstrerror.c4
-rw-r--r--src/regex/regerror.c2
-rw-r--r--src/string/strsignal.c5
7 files changed, 23 insertions, 13 deletions
diff --git a/src/errno/strerror.c b/src/errno/strerror.c
index b5559cbe..24c94d37 100644
--- a/src/errno/strerror.c
+++ b/src/errno/strerror.c
@@ -1,5 +1,7 @@
 #include <errno.h>
 #include <string.h>
+#include "locale_impl.h"
+#include "libc.h"
 
 #define E(a,b) ((unsigned char)a),
 static const unsigned char errid[] = {
@@ -12,7 +14,7 @@ static const char errmsg[] =
 #include "__strerror.h"
 ;
 
-char *strerror(int e)
+char *__strerror_l(int e, locale_t loc)
 {
 	const char *s;
 	int i;
@@ -24,5 +26,12 @@ char *strerror(int e)
 	}
 	for (i=0; errid[i] && errid[i] != e; i++);
 	for (s=errmsg; i; s++, i--) for (; *s; s++);
-	return (char *)s;
+	return (char *)LCTRANS(s, LC_MESSAGES, loc);
+}
+
+char *strerror(int e)
+{
+	return __strerror_l(e, CURRENT_LOCALE);
 }
+
+weak_alias(__strerror_l, strerror_l);
diff --git a/src/locale/langinfo.c b/src/locale/langinfo.c
index aa0e8de6..a1ada246 100644
--- a/src/locale/langinfo.c
+++ b/src/locale/langinfo.c
@@ -57,6 +57,7 @@ char *__nl_langinfo_l(nl_item item, locale_t loc)
 	}
 
 	for (; idx; idx--, str++) for (; *str; str++);
+	if (cat != LC_NUMERIC && *str) str = LCTRANS(str, cat, loc);
 	return (char *)str;
 }
 
diff --git a/src/locale/strerror_l.c b/src/locale/strerror_l.c
deleted file mode 100644
index 765f5c69..00000000
--- a/src/locale/strerror_l.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <string.h>
-#include <locale.h>
-
-char *strerror_l(int err, locale_t l)
-{
-	return strerror(err);
-}
diff --git a/src/network/gai_strerror.c b/src/network/gai_strerror.c
index 0bf3e379..9596580e 100644
--- a/src/network/gai_strerror.c
+++ b/src/network/gai_strerror.c
@@ -1,4 +1,5 @@
 #include <netdb.h>
+#include "locale_impl.h"
 
 static const char msgs[] =
 	"Invalid flags\0"
@@ -19,5 +20,6 @@ const char *gai_strerror(int ecode)
 {
 	const char *s;
 	for (s=msgs, ecode++; ecode && *s; ecode++, s++) for (; *s; s++);
-	return *s ? s : s+1;
+	if (!*s) s++;
+	return LCTRANS_CUR(s);
 }
diff --git a/src/network/hstrerror.c b/src/network/hstrerror.c
index b7a6ab6c..a4d001c5 100644
--- a/src/network/hstrerror.c
+++ b/src/network/hstrerror.c
@@ -1,5 +1,6 @@
 #define _GNU_SOURCE
 #include <netdb.h>
+#include "locale_impl.h"
 
 static const char msgs[] =
 	"Host not found\0"
@@ -12,5 +13,6 @@ const char *hstrerror(int ecode)
 {
 	const char *s;
 	for (s=msgs, ecode--; ecode && *s; ecode--, s++) for (; *s; s++);
-	return *s ? s : s+1;
+	if (!*s) s++;
+	return LCTRANS_CUR(s);
 }
diff --git a/src/regex/regerror.c b/src/regex/regerror.c
index df4afa4f..5b347cc7 100644
--- a/src/regex/regerror.c
+++ b/src/regex/regerror.c
@@ -1,6 +1,7 @@
 #include <string.h>
 #include <regex.h>
 #include <stdio.h>
+#include "locale_impl.h"
 
 /* Error message strings for error codes listed in `regex.h'.  This list
    needs to be in sync with the codes listed there, naturally. */
@@ -31,5 +32,6 @@ size_t regerror(int e, const regex_t *restrict preg, char *restrict buf, size_t
 	const char *s;
 	for (s=messages; e && *s; e--, s+=strlen(s)+1);
 	if (!*s) s++;
+	s = LCTRANS_CUR(s);
 	return 1+snprintf(buf, size, "%s", s);
 }
diff --git a/src/string/strsignal.c b/src/string/strsignal.c
index 905c0956..96bfe841 100644
--- a/src/string/strsignal.c
+++ b/src/string/strsignal.c
@@ -1,5 +1,6 @@
 #include <signal.h>
 #include <string.h>
+#include "locale_impl.h"
 
 #if (SIGHUP == 1) && (SIGINT == 2) && (SIGQUIT == 3) && (SIGILL == 4) \
  && (SIGTRAP == 5) && (SIGABRT == 6) && (SIGBUS == 7) && (SIGFPE == 8) \
@@ -104,12 +105,12 @@ static const char strings[] =
 
 char *strsignal(int signum)
 {
-	char *s = (char *)strings;
+	const char *s = strings;
 
 	signum = sigmap(signum);
 	if (signum - 1U >= _NSIG-1) signum = 0;
 
 	for (; signum--; s++) for (; *s; s++);
 
-	return s;
+	return (char *)LCTRANS_CUR(s);
 }