| 1685 | } |
| 1686 | |
| 1687 | void build_script_table(FILE *f) |
| 1688 | { |
| 1689 | int i, v, j, n, n1, type; |
| 1690 | DynBuf dbuf_s, *dbuf = &dbuf_s; |
| 1691 | int cw_count, cw_len_count[4], cw_start; |
| 1692 | |
| 1693 | fprintf(f, "typedef enum {\n"); |
| 1694 | for(i = 0; i < SCRIPT_COUNT; i++) |
| 1695 | fprintf(f, " UNICODE_SCRIPT_%s,\n", unicode_script_name[i]); |
| 1696 | fprintf(f, " UNICODE_SCRIPT_COUNT,\n"); |
| 1697 | fprintf(f, "} UnicodeScriptEnum;\n\n"); |
| 1698 | |
| 1699 | i = 1; |
| 1700 | dump_name_table(f, "unicode_script_name_table", |
| 1701 | unicode_script_name + i, SCRIPT_COUNT - i, |
| 1702 | unicode_script_short_name + i); |
| 1703 | |
| 1704 | dbuf_init(dbuf); |
| 1705 | cw_count = 0; |
| 1706 | for(i = 0; i < 4; i++) |
| 1707 | cw_len_count[i] = 0; |
| 1708 | for(i = 0; i <= CHARCODE_MAX;) { |
| 1709 | v = unicode_db[i].script; |
| 1710 | j = i + 1; |
| 1711 | while (j <= CHARCODE_MAX && unicode_db[j].script == v) |
| 1712 | j++; |
| 1713 | n = j - i; |
| 1714 | if (v == 0 && j == (CHARCODE_MAX + 1)) |
| 1715 | break; |
| 1716 | // printf("%05x %05x %d\n", i, n, v); |
| 1717 | cw_count++; |
| 1718 | n--; |
| 1719 | cw_start = dbuf->size; |
| 1720 | if (v == 0) |
| 1721 | type = 0; |
| 1722 | else |
| 1723 | type = 1; |
| 1724 | if (n < 96) { |
| 1725 | dbuf_putc(dbuf, n | (type << 7)); |
| 1726 | } else if (n < 96 + (1 << 12)) { |
| 1727 | n1 = n - 96; |
| 1728 | assert(n1 < (1 << 12)); |
| 1729 | dbuf_putc(dbuf, ((n1 >> 8) + 96) | (type << 7)); |
| 1730 | dbuf_putc(dbuf, n1); |
| 1731 | } else { |
| 1732 | n1 = n - (96 + (1 << 12)); |
| 1733 | assert(n1 < (1 << 20)); |
| 1734 | dbuf_putc(dbuf, ((n1 >> 16) + 112) | (type << 7)); |
| 1735 | dbuf_putc(dbuf, n1 >> 8); |
| 1736 | dbuf_putc(dbuf, n1); |
| 1737 | } |
| 1738 | if (type != 0) |
| 1739 | dbuf_putc(dbuf, v); |
| 1740 | |
| 1741 | cw_len_count[dbuf->size - cw_start - 1]++; |
| 1742 | i += n + 1; |
| 1743 | } |
| 1744 | #if defined(DUMP_TABLE_SIZE) |
no test coverage detected