diff -urNp src/lib/libc_bk/locale/collate.c src/lib/libc/locale/collate.c --- src/lib/libc_bk/locale/collate.c Tue Mar 4 08:41:26 2008 +++ src/lib/libc/locale/collate.c Tue Mar 4 08:43:12 2008 @@ -48,11 +48,13 @@ int __collate_load_error = 1; int __collate_substitute_nontrivial; u_char __collate_substitute_table[UCHAR_MAX + 1][STR_LEN]; -struct __collate_st_char_pri __collate_char_pri_table[UCHAR_MAX + 1]; +struct __collate_st_char_pri *__collate_char_pri_table; struct __collate_st_chain_pri *__collate_chain_pri_table; void __collate_err(int ex, const char *f) __dead2; +int __unicode; + int __collate_load_tables(const char *encoding) { @@ -62,6 +64,7 @@ __collate_load_tables(const char *encodi char strbuf[STR_LEN], buf[PATH_MAX]; void *TMP_substitute_table, *TMP_char_pri_table, *TMP_chain_pri_table; static char collate_encoding[ENCODING_LEN + 1]; + int __char_pri_size; /* 'encoding' must be already checked. */ if (strcmp(encoding, "C") == 0 || strcmp(encoding, "POSIX") == 0) { @@ -97,10 +100,17 @@ __collate_load_tables(const char *encodi return (_LDP_ERROR); } chains = -1; + __char_pri_size = sizeof(struct __collate_st_char_pri) * + (UCHAR_MAX + 1); if (strcmp(strbuf, COLLATE_VERSION) == 0) chains = 0; else if (strcmp(strbuf, COLLATE_VERSION1_2) == 0) chains = 1; + else if (strcmp(strbuf, COLLATE_VERSION1_3) == 0) { + __unicode = 1; + __char_pri_size = sizeof(struct __collate_st_char_pri) * 65536; + chains = 1; + } if (chains < 0) { (void)fclose(fp); errno = EFTYPE; @@ -129,7 +139,7 @@ __collate_load_tables(const char *encodi return (_LDP_ERROR); } if ((TMP_char_pri_table = - malloc(sizeof(__collate_char_pri_table))) == NULL) { + malloc(__char_pri_size)) == NULL) { saverr = errno; free(TMP_substitute_table); (void)fclose(fp); @@ -160,7 +170,7 @@ __collate_load_tables(const char *encodi } FREAD(TMP_substitute_table, sizeof(__collate_substitute_table), 1, fp); - FREAD(TMP_char_pri_table, sizeof(__collate_char_pri_table), 1, fp); + FREAD(TMP_char_pri_table, __char_pri_size, 1, fp); FREAD(TMP_chain_pri_table, sizeof(*__collate_chain_pri_table), chains, fp); (void)fclose(fp); @@ -169,9 +179,10 @@ __collate_load_tables(const char *encodi if (__collate_substitute_table_ptr != NULL) free(__collate_substitute_table_ptr); __collate_substitute_table_ptr = TMP_substitute_table; - if (__collate_char_pri_table_ptr != NULL) - free(__collate_char_pri_table_ptr); - __collate_char_pri_table_ptr = TMP_char_pri_table; + if (__collate_char_pri_table != NULL) + free(__collate_char_pri_table); + __collate_char_pri_table = TMP_char_pri_table; + for (i = 0; i < UCHAR_MAX + 1; i++) { __collate_char_pri_table[i].prim = ntohl(__collate_char_pri_table[i].prim); @@ -196,6 +207,8 @@ __collate_load_tables(const char *encodi } } __collate_load_error = 0; + if (__unicode) + __collate_substitute_nontrivial = 0; return (_LDP_LOADED); } @@ -231,6 +244,9 @@ void __collate_lookup(const u_char *t, int *len, int *prim, int *sec) { struct __collate_st_chain_pri *p2; +#if 1 + wchar_t wc; +#endif *len = 1; *prim = *sec = 0; @@ -243,8 +259,12 @@ __collate_lookup(const u_char *t, int *l return; } } - *prim = __collate_char_pri_table[*t].prim; - *sec = __collate_char_pri_table[*t].sec; + if (__unicode) + *len = mbtowc(&wc, (void *)t, strlen((void *)t)); + else + wc = *t; + *prim = __collate_char_pri_table[wc].prim; + *sec = __collate_char_pri_table[wc].sec; } u_char * diff -urNp src/lib/libc_bk/locale/collate.h src/lib/libc/locale/collate.h --- src/lib/libc_bk/locale/collate.h Tue Mar 4 08:38:27 2008 +++ src/lib/libc/locale/collate.h Tue Mar 4 08:32:29 2008 @@ -40,6 +40,7 @@ #define TABLE_SIZE 100 #define COLLATE_VERSION "1.0\n" #define COLLATE_VERSION1_2 "1.2\n" +#define COLLATE_VERSION1_3 "1.3\n" struct __collate_st_char_pri { int prim, sec; @@ -53,8 +54,7 @@ extern int __collate_load_error; extern int __collate_substitute_nontrivial; #define __collate_substitute_table (*__collate_substitute_table_ptr) extern u_char __collate_substitute_table[UCHAR_MAX + 1][STR_LEN]; -#define __collate_char_pri_table (*__collate_char_pri_table_ptr) -extern struct __collate_st_char_pri __collate_char_pri_table[UCHAR_MAX + 1]; + extern struct __collate_st_chain_pri *__collate_chain_pri_table; __BEGIN_DECLS