* lc_era.h: New file.
* nlsfuncs.cc: Include lc_era.h. (locale_cmp): convert arguments to char** to be usable for both types, lc_msg_t and lc_era_t. (__set_lc_time_from_win): Handle era-related data
This commit is contained in:
parent
f13fe16475
commit
6c36e83bab
|
@ -1,3 +1,11 @@
|
||||||
|
2010-02-19 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* lc_era.h: New file.
|
||||||
|
* nlsfuncs.cc: Include lc_era.h.
|
||||||
|
(locale_cmp): convert arguments to char** to be usable for both types,
|
||||||
|
lc_msg_t and lc_era_t.
|
||||||
|
(__set_lc_time_from_win): Handle era-related data
|
||||||
|
|
||||||
2010-02-19 Corinna Vinschen <corinna@vinschen.de>
|
2010-02-19 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_disk_file.cc (fhandler_disk_file::opendir): Try to open
|
* fhandler_disk_file.cc (fhandler_disk_file::opendir): Try to open
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
/* This struct of LC_TIME ERA data has been generated by fetching locale
|
||||||
|
data from a Linux system using glibc-2.10.2-1.i686 on 2010-02-19. */
|
||||||
|
|
||||||
|
struct lc_era_t
|
||||||
|
{
|
||||||
|
const char *locale;
|
||||||
|
const wchar_t *era;
|
||||||
|
const wchar_t *era_d_fmt;
|
||||||
|
const wchar_t *era_d_t_fmt;
|
||||||
|
const wchar_t *era_t_fmt;
|
||||||
|
const wchar_t *alt_digits;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct lc_era_t lc_era[] =
|
||||||
|
{
|
||||||
|
{ "fa_IR", L"", L"", L"", L"", L"\x06f0\x06f0;\x06f0\x06f1;\x06f0\x06f2;\x06f0\x06f3;\x06f0\x06f4;\x06f0\x06f5;\x06f0\x06f6;\x06f0\x06f7;\x06f0\x06f8;\x06f0\x06f9;\x06f1\x06f0;\x06f1\x06f1;\x06f1\x06f2;\x06f1\x06f3;\x06f1\x06f4;\x06f1\x06f5;\x06f1\x06f6;\x06f1\x06f7;\x06f1\x06f8;\x06f1\x06f9;\x06f2\x06f0;\x06f2\x06f1;\x06f2\x06f2;\x06f2\x06f3;\x06f2\x06f4;\x06f2\x06f5;\x06f2\x06f6;\x06f2\x06f7;\x06f2\x06f8;\x06f2\x06f9;\x06f3\x06f0;\x06f3\x06f1;\x06f3\x06f2;\x06f3\x06f3;\x06f3\x06f4;\x06f3\x06f5;\x06f3\x06f6;\x06f3\x06f7;\x06f3\x06f8;\x06f3\x06f9;\x06f4\x06f0;\x06f4\x06f1;\x06f4\x06f2;\x06f4\x06f3;\x06f4\x06f4;\x06f4\x06f5;\x06f4\x06f6;\x06f4\x06f7;\x06f4\x06f8;\x06f4\x06f9;\x06f5\x06f0;\x06f5\x06f1;\x06f5\x06f2;\x06f5\x06f3;\x06f5\x06f4;\x06f5\x06f5;\x06f5\x06f6;\x06f5\x06f7;\x06f5\x06f8;\x06f5\x06f9;\x06f6\x06f0;\x06f6\x06f1;\x06f6\x06f2;\x06f6\x06f3;\x06f6\x06f4;\x06f6\x06f5;\x06f6\x06f6;\x06f6\x06f7;\x06f6\x06f8;\x06f6\x06f9;\x06f7\x06f0;\x06f7\x06f1;\x06f7\x06f2;\x06f7\x06f3;\x06f7\x06f4;\x06f7\x06f5;\x06f7\x06f6;\x06f7\x06f7;\x06f7\x06f8;\x06f7\x06f9;\x06f8\x06f0;\x06f8\x06f1;\x06f8\x06f2;\x06f8\x06f3;\x06f8\x06f4;\x06f8\x06f5;\x06f8\x06f6;\x06f8\x06f7;\x06f8\x06f8;\x06f8\x06f9;\x06f9\x06f0;\x06f9\x06f1;\x06f9\x06f2;\x06f9\x06f3;\x06f9\x06f4;\x06f9\x06f5;\x06f9\x06f6;\x06f9\x06f7;\x06f9\x06f8;\x06f9\x06f9" },
|
||||||
|
{ "ja_JP", L"+:2:1990/01/01:+*:\x5e73\x6210:%EC%Ey\x5e74;+:1:1989/01/08:1989/12/31:\x5e73\x6210:%EC\x5143\x5e74;+:2:1927/01/01:1989/01/07:\x662d\x548c:%EC%Ey\x5e74;+:1:1926/12/25:1926/12/31:\x662d\x548c:%EC\x5143\x5e74;+:2:1913/01/01:1926/12/24:\x5927\x6b63:%EC%Ey\x5e74;+:2:1912/07/30:1912/12/31:\x5927\x6b63:%EC\x5143\x5e74;+:6:1873/01/01:1912/07/29:\x660e\x6cbb:%EC%Ey\x5e74;+:1:0001/01/01:1872/12/31:\x897f\x66a6:%EC%Ey\x5e74;+:1:-0001/12/31:-*:\x7d00\x5143\x524d:%EC%Ey\x5e74", L"%EY%m\x6708%d\x65e5", L"%EY%m\x6708%d\x65e5 %H\x6642%M\x5206%S\x79d2", L"", L"\x3007;\x4e00;\x4e8c;\x4e09;\x56db;\x4e94;\x516d;\x4e03;\x516b;\x4e5d;\x5341;\x5341\x4e00;\x5341\x4e8c;\x5341\x4e09;\x5341\x56db;\x5341\x4e94;\x5341\x516d;\x5341\x4e03;\x5341\x516b;\x5341\x4e5d;\x4e8c\x5341;\x4e8c\x5341\x4e00;\x4e8c\x5341\x4e8c;\x4e8c\x5341\x4e09;\x4e8c\x5341\x56db;\x4e8c\x5341\x4e94;\x4e8c\x5341\x516d;\x4e8c\x5341\x4e03;\x4e8c\x5341\x516b;\x4e8c\x5341\x4e5d;\x4e09\x5341;\x4e09\x5341\x4e00;\x4e09\x5341\x4e8c;\x4e09\x5341\x4e09;\x4e09\x5341\x56db;\x4e09\x5341\x4e94;\x4e09\x5341\x516d;\x4e09\x5341\x4e03;\x4e09\x5341\x516b;\x4e09\x5341\x4e5d;\x56db\x5341;\x56db\x5341\x4e00;\x56db\x5341\x4e8c;\x56db\x5341\x4e09;\x56db\x5341\x56db;\x56db\x5341\x4e94;\x56db\x5341\x516d;\x56db\x5341\x4e03;\x56db\x5341\x516b;\x56db\x5341\x4e5d;\x4e94\x5341;\x4e94\x5341\x4e00;\x4e94\x5341\x4e8c;\x4e94\x5341\x4e09;\x4e94\x5341\x56db;\x4e94\x5341\x4e94;\x4e94\x5341\x516d;\x4e94\x5341\x4e03;\x4e94\x5341\x516b;\x4e94\x5341\x4e5d;\x516d\x5341;\x516d\x5341\x4e00;\x516d\x5341\x4e8c;\x516d\x5341\x4e09;\x516d\x5341\x56db;\x516d\x5341\x4e94;\x516d\x5341\x516d;\x516d\x5341\x4e03;\x516d\x5341\x516b;\x516d\x5341\x4e5d;\x4e03\x5341;\x4e03\x5341\x4e00;\x4e03\x5341\x4e8c;\x4e03\x5341\x4e09;\x4e03\x5341\x56db;\x4e03\x5341\x4e94;\x4e03\x5341\x516d;\x4e03\x5341\x4e03;\x4e03\x5341\x516b;\x4e03\x5341\x4e5d;\x516b\x5341;\x516b\x5341\x4e00;\x516b\x5341\x4e8c;\x516b\x5341\x4e09;\x516b\x5341\x56db;\x516b\x5341\x4e94;\x516b\x5341\x516d;\x516b\x5341\x4e03;\x516b\x5341\x516b;\x516b\x5341\x4e5d;\x4e5d\x5341;\x4e5d\x5341\x4e00;\x4e5d\x5341\x4e8c;\x4e5d\x5341\x4e09;\x4e5d\x5341\x56db;\x4e5d\x5341\x4e94;\x4e5d\x5341\x516d;\x4e5d\x5341\x4e03;\x4e5d\x5341\x516b;\x4e5d\x5341\x4e5d" },
|
||||||
|
{ "lo_LA", L"+:1:-543/01/01:+*:\x0e9e.\x0eaa.:%EC %Ey", L"%e %b %Ey", L"\x0ea7\x0eb1\x0e99%A\x0e97\x0eb5\x0ec8 %e %B %EC %Ey, %H.%M.%S \x0e99.", L"%H.%M.%S \x0e99.", L"" },
|
||||||
|
{ "or_IN", L"", L"", L"", L"", L"\x0b66;\x0b67;\x0b68;\x0b69;\x0b6a;\x0b6b;\x0b6c;\x0b6d;\x0b6e;\x0b6f;\x0b67\x0b66;\x0b67\x0b67;\x0b67\x0b68;\x0b67\x0b69;\x0b67\x0b6a;\x0b67\x0b6b;\x0b67\x0b6c;\x0b67\x0b6d;\x0b67\x0b6e;\x0b67\x0b6f;\x0b68\x0b66;\x0b68\x0b67;\x0b68\x0b68;\x0b68\x0b69;\x0b68\x0b6a;\x0b68\x0b6b;\x0b68\x0b6c;\x0b68\x0b6d;\x0b68\x0b6e;\x0b68\x0b6f;\x0b69\x0b66;\x0b69\x0b67;\x0b69\x0b68;\x0b69\x0b69;\x0b69\x0b6a;\x0b69\x0b6b;\x0b69\x0b6c;\x0b69\x0b6d;\x0b69\x0b6e;\x0b69\x0b6f;\x0b6a\x0b66;\x0b6a\x0b67;\x0b6a\x0b68;\x0b6a\x0b69;\x0b6a\x0b6a;\x0b6a\x0b6b;\x0b6a\x0b6c;\x0b6a\x0b6d;\x0b6a\x0b6e;\x0b6a\x0b6f;\x0b6b\x0b66;\x0b6b\x0b67;\x0b6b\x0b68;\x0b6b\x0b69;\x0b6b\x0b6a;\x0b6b\x0b6b;\x0b6b\x0b6c;\x0b6b\x0b6d;\x0b6b\x0b6e;\x0b6b\x0b6f;\x0b6c\x0b66;\x0b6c\x0b67;\x0b6c\x0b68;\x0b6c\x0b69;\x0b6c\x0b6a;\x0b6c\x0b6b;\x0b6c\x0b6c;\x0b6c\x0b6d;\x0b6c\x0b6e;\x0b6c\x0b6f;\x0b6d\x0b66;\x0b6d\x0b67;\x0b6d\x0b68;\x0b6d\x0b69;\x0b6d\x0b6a;\x0b6d\x0b6b;\x0b6d\x0b6c;\x0b6d\x0b6d;\x0b6d\x0b6e;\x0b6d\x0b6f;\x0b6e\x0b66;\x0b6e\x0b67;\x0b6e\x0b68;\x0b6e\x0b69;\x0b6e\x0b6a;\x0b6e\x0b6b;\x0b6e\x0b6c;\x0b6e\x0b6d;\x0b6e\x0b6e;\x0b6e\x0b6f;\x0b6f\x0b66;\x0b6f\x0b67;\x0b6f\x0b68;\x0b6f\x0b69;\x0b6f\x0b6a;\x0b6f\x0b6b;\x0b6f\x0b6c;\x0b6f\x0b6d;\x0b6f\x0b6e;\x0b6f\x0b6f" },
|
||||||
|
{ "th_TH", L"+:1:-543/01/01:+*:\x0e1e.\x0e28.:%EC %Ey", L"%e %b %Ey", L"\x0e27\x0e31\x0e19%A\x0e17\x0e35\x0e48 %e %B %EC %Ey, %H.%M.%S \x0e19.", L"%H.%M.%S \x0e19.", L"" },
|
||||||
|
{ "uk_UA", L"", L"", L"", L"", L"0;\x0441\x0456\x0447\x043d\x044f;\x043b\x044e\x0442\x043e\x0433\x043e;\x0431\x0435\x0440\x0435\x0437\x043d\x044f;\x043a\x0432\x0456\x0442\x043d\x044f;\x0442\x0440\x0430\x0432\x043d\x044f;\x0447\x0435\x0440\x0432\x043d\x044f;\x043b\x0438\x043f\x043d\x044f;\x0441\x0435\x0440\x043f\x043d\x044f;\x0432\x0435\x0440\x0435\x0441\x043d\x044f;\x0436\x043e\x0432\x0442\x043d\x044f;\x043b\x0438\x0441\x0442\x043e\x043f\x0430\x0434\x0430;\x0433\x0440\x0443\x0434\x043d\x044f" },
|
||||||
|
};
|
|
@ -25,6 +25,7 @@ details. */
|
||||||
#include "../locale/lmonetary.h"
|
#include "../locale/lmonetary.h"
|
||||||
#include "../locale/lmessages.h"
|
#include "../locale/lmessages.h"
|
||||||
#include "lc_msg.h"
|
#include "lc_msg.h"
|
||||||
|
#include "lc_era.h"
|
||||||
|
|
||||||
#define _LC(x) &lc_##x##_ptr,lc_##x##_end-lc_##x##_ptr
|
#define _LC(x) &lc_##x##_ptr,lc_##x##_end-lc_##x##_ptr
|
||||||
|
|
||||||
|
@ -316,6 +317,14 @@ lc_mbstowcs (mbtowc_p f_mbtowc, const char *charset,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
locale_cmp (const void *a, const void *b)
|
||||||
|
{
|
||||||
|
char **la = (char **) a;
|
||||||
|
char **lb = (char **) b;
|
||||||
|
return strcmp (*la, *lb);
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
__getlocaleinfo (LCID lcid, LCTYPE type, char **ptr, size_t size,
|
__getlocaleinfo (LCID lcid, LCTYPE type, char **ptr, size_t size,
|
||||||
wctomb_p f_wctomb, const char *charset)
|
wctomb_p f_wctomb, const char *charset)
|
||||||
|
@ -531,22 +540,90 @@ __set_lc_time_from_win (const char *name, struct lc_time_T *_time_locale,
|
||||||
_time_locale->ampm_fmt = eval_datetimefmt (LOCALE_STIMEFORMAT, DT_AMPM);
|
_time_locale->ampm_fmt = eval_datetimefmt (LOCALE_STIMEFORMAT, DT_AMPM);
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
char locale[ENCODING_LEN + 1];
|
||||||
|
char *c, *c2;
|
||||||
|
|
||||||
|
strcpy (locale, name);
|
||||||
|
/* Removes the charset from the locale and attach the modifer to the
|
||||||
|
language_TERRITORY part. */
|
||||||
|
c = strchr (locale, '.');
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
*c = '\0';
|
||||||
|
c2 = strchr (c + 1, '@');
|
||||||
|
/* Ignore @cjknarrow modifier since it's a very personal thing between
|
||||||
|
Cygwin and newlib... */
|
||||||
|
if (c2 && strcmp (c2, "@cjknarrow"))
|
||||||
|
memmove (c, c2, strlen (c2) + 1);
|
||||||
|
}
|
||||||
|
/* Now search in the alphabetically order lc_era array for the
|
||||||
|
locale. */
|
||||||
|
lc_era_t locale_key = { locale, NULL, NULL, NULL, NULL, NULL };
|
||||||
|
lc_era_t *res = (lc_era_t *) bsearch ((void *) &locale_key, (void *) lc_era,
|
||||||
|
sizeof lc_era / sizeof *lc_era,
|
||||||
|
sizeof *lc_era, locale_cmp);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
/* Evaluate string length in target charset. Characters invalid in the
|
||||||
|
target charset are simply ignored, as on Linux. */
|
||||||
|
size_t len = 0;
|
||||||
|
len += lc_wcstombs (f_wctomb, charset, NULL, res->era, 0) + 1;
|
||||||
|
len += lc_wcstombs (f_wctomb, charset, NULL, res->era_d_fmt, 0) + 1;
|
||||||
|
len += lc_wcstombs (f_wctomb, charset, NULL, res->era_d_t_fmt, 0) + 1;
|
||||||
|
len += lc_wcstombs (f_wctomb, charset, NULL, res->era_t_fmt, 0) + 1;
|
||||||
|
len += lc_wcstombs (f_wctomb, charset, NULL, res->alt_digits, 0) + 1;
|
||||||
|
|
||||||
|
/* Make sure data fits into the buffer */
|
||||||
|
if (lc_time_ptr + len > lc_time_end)
|
||||||
|
{
|
||||||
|
len = lc_time_ptr + len - new_lc_time_buf;
|
||||||
|
char *tmp = (char *) realloc (new_lc_time_buf, len);
|
||||||
|
if (!tmp)
|
||||||
|
res = NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lc_time_ptr = tmp + (lc_time_ptr - new_lc_time_buf);
|
||||||
|
new_lc_time_buf = tmp;
|
||||||
|
lc_time_end = new_lc_time_buf + len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Copy over */
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
/* era */
|
/* era */
|
||||||
_time_locale->era = lc_time_ptr;
|
_time_locale->era = (const char *) lc_time_ptr;
|
||||||
*lc_time_ptr++ = '\0';
|
len = lc_wcstombs (f_wctomb, charset, lc_time_ptr, res->era,
|
||||||
|
lc_time_end - lc_time_ptr) + 1;
|
||||||
/* era_d_fmt */
|
/* era_d_fmt */
|
||||||
_time_locale->era_d_fmt = lc_time_ptr;
|
_time_locale->era_d_fmt = (const char *) (lc_time_ptr += len);
|
||||||
*lc_time_ptr++ = '\0';
|
len = lc_wcstombs (f_wctomb, charset, lc_time_ptr, res->era_d_fmt,
|
||||||
|
lc_time_end - lc_time_ptr) + 1;
|
||||||
/* era_d_t_fmt */
|
/* era_d_t_fmt */
|
||||||
_time_locale->era_d_t_fmt = lc_time_ptr;
|
_time_locale->era_d_t_fmt = (const char *) (lc_time_ptr += len);
|
||||||
*lc_time_ptr++ = '\0';
|
len = lc_wcstombs (f_wctomb, charset, lc_time_ptr, res->era_d_t_fmt,
|
||||||
|
lc_time_end - lc_time_ptr) + 1;
|
||||||
/* era_t_fmt */
|
/* era_t_fmt */
|
||||||
_time_locale->era_t_fmt = lc_time_ptr;
|
_time_locale->era_t_fmt = (const char *) (lc_time_ptr += len);
|
||||||
*lc_time_ptr++ = '\0';
|
len = lc_wcstombs (f_wctomb, charset, lc_time_ptr, res->era_t_fmt,
|
||||||
|
lc_time_end - lc_time_ptr) + 1;
|
||||||
/* alt_digits */
|
/* alt_digits */
|
||||||
_time_locale->alt_digits = lc_time_ptr;
|
_time_locale->alt_digits = (const char *) (lc_time_ptr += len);
|
||||||
|
len = lc_wcstombs (f_wctomb, charset, lc_time_ptr, res->alt_digits,
|
||||||
|
lc_time_end - lc_time_ptr) + 1;
|
||||||
|
lc_time_ptr += len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!res)
|
||||||
|
{
|
||||||
|
_time_locale->era =
|
||||||
|
_time_locale->era_d_fmt =
|
||||||
|
_time_locale->era_d_t_fmt =
|
||||||
|
_time_locale->era_t_fmt =
|
||||||
|
_time_locale->alt_digits = (const char *) lc_time_ptr;
|
||||||
|
/* Twice, to make sure era and alt_strings are correctly terminated
|
||||||
|
with two NULs */
|
||||||
*lc_time_ptr++ = '\0';
|
*lc_time_ptr++ = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
char *tmp = (char *) realloc (new_lc_time_buf, lc_time_ptr - new_lc_time_buf);
|
char *tmp = (char *) realloc (new_lc_time_buf, lc_time_ptr - new_lc_time_buf);
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
|
@ -702,14 +779,6 @@ __set_lc_monetary_from_win (const char *name,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
locale_cmp (const void *a, const void *b)
|
|
||||||
{
|
|
||||||
struct lc_msg_t *la = (struct lc_msg_t *) a;
|
|
||||||
struct lc_msg_t *lb = (struct lc_msg_t *) b;
|
|
||||||
return strcmp (la->locale, lb->locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
__set_lc_messages_from_win (const char *name,
|
__set_lc_messages_from_win (const char *name,
|
||||||
struct lc_messages_T *_messages_locale,
|
struct lc_messages_T *_messages_locale,
|
||||||
|
|
Loading…
Reference in New Issue