| 1969 | #define CC_BLOCK_LEN 32 |
| 1970 | |
| 1971 | void build_cc_table(FILE *f) |
| 1972 | { |
| 1973 | int i, cc, n, cc_table_len, type, n1; |
| 1974 | DynBuf dbuf_s, *dbuf = &dbuf_s; |
| 1975 | DynBuf dbuf1_s, *dbuf1 = &dbuf1_s; |
| 1976 | int cw_len_tab[3], cw_start, block_end_pos; |
| 1977 | uint32_t v; |
| 1978 | |
| 1979 | dbuf_init(dbuf); |
| 1980 | dbuf_init(dbuf1); |
| 1981 | cc_table_len = 0; |
| 1982 | for(i = 0; i < countof(cw_len_tab); i++) |
| 1983 | cw_len_tab[i] = 0; |
| 1984 | block_end_pos = CC_BLOCK_LEN; |
| 1985 | for(i = 0; i <= CHARCODE_MAX;) { |
| 1986 | cc = unicode_db[i].combining_class; |
| 1987 | assert(cc <= 255); |
| 1988 | /* check increasing values */ |
| 1989 | n = 1; |
| 1990 | while ((i + n) <= CHARCODE_MAX && |
| 1991 | unicode_db[i + n].combining_class == (cc + n)) |
| 1992 | n++; |
| 1993 | if (n >= 2) { |
| 1994 | type = 1; |
| 1995 | } else { |
| 1996 | type = 0; |
| 1997 | n = 1; |
| 1998 | while ((i + n) <= CHARCODE_MAX && |
| 1999 | unicode_db[i + n].combining_class == cc) |
| 2000 | n++; |
| 2001 | } |
| 2002 | /* no need to encode the last run */ |
| 2003 | if (cc == 0 && (i + n - 1) == CHARCODE_MAX) |
| 2004 | break; |
| 2005 | #ifdef DUMP_CC_TABLE |
| 2006 | printf("%05x %6d %d %d\n", i, n, type, cc); |
| 2007 | #endif |
| 2008 | if (type == 0) { |
| 2009 | if (cc == 0) |
| 2010 | type = 2; |
| 2011 | else if (cc == 230) |
| 2012 | type = 3; |
| 2013 | } |
| 2014 | n1 = n - 1; |
| 2015 | |
| 2016 | /* add an entry to the index if necessary */ |
| 2017 | if (dbuf->size >= block_end_pos) { |
| 2018 | v = i | ((dbuf->size - block_end_pos) << 21); |
| 2019 | dbuf_putc(dbuf1, v); |
| 2020 | dbuf_putc(dbuf1, v >> 8); |
| 2021 | dbuf_putc(dbuf1, v >> 16); |
| 2022 | block_end_pos += CC_BLOCK_LEN; |
| 2023 | } |
| 2024 | cw_start = dbuf->size; |
| 2025 | if (n1 < 48) { |
| 2026 | dbuf_putc(dbuf, n1 | (type << 6)); |
| 2027 | } else if (n1 < 48 + (1 << 11)) { |
| 2028 | n1 -= 48; |