Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void sortkey_handle_japanese_character(sortkey_data* data, weight_main_info* weightmain, const character_info* info, const character_info* info_other, BOOL is_special)
- {
- const BYTE MASK_PW = 0x87;
- const BYTE BASELINE_EXTRA = 0xc4;
- const BYTE ISOLATE_KANA = 0x20 | BASELINE_EXTRA; /* if bit is set then hiragana, else katakana */
- const BYTE ISOLATE_SMALL = 0x2 | BASELINE_EXTRA; /* if bit is set then normal kana, else small kana */
- const BYTE ISOLATE_WIDTH = 0x1 | BASELINE_EXTRA; /* if bit is set then full width, else half width */
- int weight_case;
- weight_extra_info extra;
- weightmain->script_member = 34;
- weightmain->weight_primary = info_other->weight_primary;
- if (info->weight_primary != 0 && is_special)
- weightmain->weight_primary = (char)(weightmain->weight_primary & MASK_PW); /* Special case found through testing, seems to work reliably */
- if (!is_special)
- main_weights_add(data, weightmain);
- weight_case = info_other->weight_case | BASELINE_EXTRA;
- extra.flag_small = (BYTE)(weight_case & ISOLATE_SMALL);
- extra.flag_kana = (BYTE)(weight_case & ISOLATE_KANA);
- extra.flag_width = (BYTE)(weight_case & ISOLATE_WIDTH);
- if (is_special && info->weight_primary == 1)
- extra.flag_width = (BYTE)((info->weight_case | BASELINE_EXTRA) & ISOLATE_WIDTH); // Special case found through testing, seems to work reliably
- if (data->flags & NORM_IGNOREKANATYPE)
- extra.flag_kana = BASELINE_EXTRA;
- if (data->flags & NORM_IGNOREWIDTH)
- extra.flag_width = BASELINE_EXTRA;
- LIST_ADD(data->weights_extra, weight_extra_info, extra);
- diacritic_weights_add(data, info, info->weight_diacritic);
- case_weights_add(data, MIN_WEIGHT);
- }
- weightmain = create_weight_main(info.script_member, info.weight_primary);
- if (weightmain.weight_primary <= 1)
- {
- int iprev;
- weightmain.script_member = 0xff;
- weightmain.weight_primary = 0xff;
- for (iprev = i - 1; iprev >= 0; iprev--)
- {
- WCHAR cprev = str[iprev];
- character_info prev_info;
- character_info_expansion dummy;
- if (!get_char(data->locale , &prev_info, cprev))
- {
- if (!get_expansion(&dummy, cprev))
- continue;
- else
- break;
- }
- if (prev_info.script_member < JAPANESE)
- {
- continue;
- }
- else if (prev_info.script_member == JAPANESE)
- {
- if (prev_info.weight_primary <= 1)
- continue;
- sortkey_handle_japanese_character(data, &weightmain, &info, &prev_info, TRUE);
- break;
- }
- else
- {
- weightmain.script_member = prev_info.script_member;
- weightmain.weight_primary = prev_info.weight_primary;
- diacritic_weights_add(data, &info, info.weight_diacritic);
- case_weights_add(data, MIN_WEIGHT);
- break;
- }
- }
- main_weights_add(data, &weightmain);
- }
- else
- {
- sortkey_handle_japanese_character(data, &weightmain, &info, &info, FALSE);
- }
- break;
Advertisement
Add Comment
Please, Sign In to add comment