* 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:
Corinna Vinschen 2010-02-19 17:30:19 +00:00
parent f13fe16475
commit 6c36e83bab
3 changed files with 122 additions and 23 deletions

View File

@ -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

22
winsup/cygwin/lc_era.h Normal file
View File

@ -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" },
};

View File

@ -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,