mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-25 15:42:06 +03:00
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.
This commit is contained in:
parent
0206f596d5
commit
c5b8f19305
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
#include <string.h>
|
||||
#include <locale.h>
|
||||
|
||||
char *strerror_l(int err, locale_t l)
|
||||
{
|
||||
return strerror(err);
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user