1 #include <stdlib.h>
2 #include <stdint.h>
3
4 #include <harfbuzz-external.h>
5
6 #include "tables/category-properties.h"
7 #include "tables/combining-properties.h"
8
9 HB_LineBreakClass
HB_GetLineBreakClass(HB_UChar32 ch)10 HB_GetLineBreakClass(HB_UChar32 ch) {
11 abort();
12 return 0;
13 }
14
15 static int
combining_property_cmp(const void * vkey,const void * vcandidate)16 combining_property_cmp(const void *vkey, const void *vcandidate) {
17 const uint32_t key = (uint32_t) (intptr_t) vkey;
18 const struct combining_property *candidate = vcandidate;
19
20 if (key < candidate->range_start) {
21 return -1;
22 } else if (key > candidate->range_end) {
23 return 1;
24 } else {
25 return 0;
26 }
27 }
28
29 static int
code_point_to_combining_class(HB_UChar32 cp)30 code_point_to_combining_class(HB_UChar32 cp) {
31 const void *vprop = bsearch((void *) (intptr_t) cp, combining_properties,
32 combining_properties_count,
33 sizeof(struct combining_property),
34 combining_property_cmp);
35 if (!vprop)
36 return 0;
37
38 return ((const struct combining_property *) vprop)->klass;
39 }
40
41 int
HB_GetUnicodeCharCombiningClass(HB_UChar32 ch)42 HB_GetUnicodeCharCombiningClass(HB_UChar32 ch) {
43 return code_point_to_combining_class(ch);
44 return 0;
45 }
46
47 static int
category_property_cmp(const void * vkey,const void * vcandidate)48 category_property_cmp(const void *vkey, const void *vcandidate) {
49 const uint32_t key = (uint32_t) (intptr_t) vkey;
50 const struct category_property *candidate = vcandidate;
51
52 if (key < candidate->range_start) {
53 return -1;
54 } else if (key > candidate->range_end) {
55 return 1;
56 } else {
57 return 0;
58 }
59 }
60
61 static HB_CharCategory
code_point_to_category(HB_UChar32 cp)62 code_point_to_category(HB_UChar32 cp) {
63 const void *vprop = bsearch((void *) (intptr_t) cp, category_properties,
64 category_properties_count,
65 sizeof(struct category_property),
66 category_property_cmp);
67 if (!vprop)
68 return HB_NoCategory;
69
70 return ((const struct category_property *) vprop)->category;
71 }
72
73 void
HB_GetUnicodeCharProperties(HB_UChar32 ch,HB_CharCategory * category,int * combiningClass)74 HB_GetUnicodeCharProperties(HB_UChar32 ch,
75 HB_CharCategory *category,
76 int *combiningClass) {
77 *category = code_point_to_category(ch);
78 *combiningClass = code_point_to_combining_class(ch);
79 }
80
81 HB_CharCategory
HB_GetUnicodeCharCategory(HB_UChar32 ch)82 HB_GetUnicodeCharCategory(HB_UChar32 ch) {
83 return code_point_to_category(ch);
84 }
85