2 ** Copyright 2011 Double Precision, Inc.
3 ** See COPYING for distribution information.
7 #include "unicode_config.h"
13 #define UNICODE_GRAPHEMEBREAK_ANY 0x00
14 #define UNICODE_GRAPHEMEBREAK_CR 0x01
15 #define UNICODE_GRAPHEMEBREAK_LF 0x02
16 #define UNICODE_GRAPHEMEBREAK_Control 0x03
17 #define UNICODE_GRAPHEMEBREAK_Extend 0x04
18 #define UNICODE_GRAPHEMEBREAK_Prepend 0x05
19 #define UNICODE_GRAPHEMEBREAK_SpacingMark 0x06
20 #define UNICODE_GRAPHEMEBREAK_L 0x07
21 #define UNICODE_GRAPHEMEBREAK_V 0x08
22 #define UNICODE_GRAPHEMEBREAK_T 0x09
23 #define UNICODE_GRAPHEMEBREAK_LV 0x0A
24 #define UNICODE_GRAPHEMEBREAK_LVT 0x0B
26 #include "graphemebreaktab.h"
28 int unicode_grapheme_break(unicode_char a
, unicode_char b
)
30 uint8_t ac
=unicode_tab_lookup(a
, unicode_indextab
,
31 sizeof(unicode_indextab
)/sizeof(unicode_indextab
[0]),
34 UNICODE_GRAPHEMEBREAK_ANY
),
35 bc
=unicode_tab_lookup(b
, unicode_indextab
,
36 sizeof(unicode_indextab
)/sizeof(unicode_indextab
[0]),
39 UNICODE_GRAPHEMEBREAK_ANY
);
41 /* GB1 and GB2 are implied */
43 if (ac
== UNICODE_GRAPHEMEBREAK_CR
&& bc
== UNICODE_GRAPHEMEBREAK_LF
)
48 case UNICODE_GRAPHEMEBREAK_CR
:
49 case UNICODE_GRAPHEMEBREAK_LF
:
50 case UNICODE_GRAPHEMEBREAK_Control
:
57 case UNICODE_GRAPHEMEBREAK_CR
:
58 case UNICODE_GRAPHEMEBREAK_LF
:
59 case UNICODE_GRAPHEMEBREAK_Control
:
65 if (ac
== UNICODE_GRAPHEMEBREAK_L
)
67 case UNICODE_GRAPHEMEBREAK_L
:
68 case UNICODE_GRAPHEMEBREAK_V
:
69 case UNICODE_GRAPHEMEBREAK_LV
:
70 case UNICODE_GRAPHEMEBREAK_LVT
:
74 if ((ac
== UNICODE_GRAPHEMEBREAK_LV
||
75 ac
== UNICODE_GRAPHEMEBREAK_V
) &&
76 (bc
== UNICODE_GRAPHEMEBREAK_V
||
77 bc
== UNICODE_GRAPHEMEBREAK_T
))
80 if ((ac
== UNICODE_GRAPHEMEBREAK_LVT
||
81 ac
== UNICODE_GRAPHEMEBREAK_T
) &&
82 bc
== UNICODE_GRAPHEMEBREAK_T
)
85 if (bc
== UNICODE_GRAPHEMEBREAK_Extend
)
88 if (bc
== UNICODE_GRAPHEMEBREAK_SpacingMark
)
91 if (ac
== UNICODE_GRAPHEMEBREAK_Prepend
)