| 546 | } |
| 547 | |
| 548 | void parse_composition_exclusions(const char *filename) |
| 549 | { |
| 550 | FILE *f; |
| 551 | char line[4096], *p; |
| 552 | uint32_t c0; |
| 553 | |
| 554 | f = fopen(filename, "rb"); |
| 555 | if (!f) { |
| 556 | perror(filename); |
| 557 | exit(1); |
| 558 | } |
| 559 | |
| 560 | for(;;) { |
| 561 | if (!get_line(line, sizeof(line), f)) |
| 562 | break; |
| 563 | p = line; |
| 564 | while (isspace(*p)) |
| 565 | p++; |
| 566 | if (*p == '#' || *p == '@' || *p == '\0') |
| 567 | continue; |
| 568 | c0 = strtoul(p, (char **)&p, 16); |
| 569 | assert(c0 > 0 && c0 <= CHARCODE_MAX); |
| 570 | unicode_db[c0].is_excluded = true; |
| 571 | } |
| 572 | fclose(f); |
| 573 | } |
| 574 | |
| 575 | void parse_derived_core_properties(const char *filename) |
| 576 | { |