Skip to main content

rassa_unibreak_sys/
lib.rs

1#![allow(non_camel_case_types)]
2
3use std::ffi::{c_char, c_int};
4
5pub type utf8_t = u8;
6pub type utf16_t = u16;
7pub type utf32_t = u32;
8
9pub const LIBUNIBREAK_LINKED: bool = cfg!(libunibreak_available);
10
11pub const LINEBREAK_MUSTBREAK: c_char = 0;
12pub const LINEBREAK_ALLOWBREAK: c_char = 1;
13pub const LINEBREAK_NOBREAK: c_char = 2;
14pub const LINEBREAK_INSIDEACHAR: c_char = 3;
15pub const LINEBREAK_INDETERMINATE: c_char = 4;
16
17pub const WORDBREAK_BREAK: c_char = 0;
18pub const WORDBREAK_NOBREAK: c_char = 1;
19pub const WORDBREAK_INSIDEACHAR: c_char = 2;
20
21#[cfg(libunibreak_available)]
22unsafe extern "C" {
23    pub fn init_linebreak();
24    pub fn set_linebreaks_utf32(
25        s: *const utf32_t,
26        len: usize,
27        lang: *const c_char,
28        brks: *mut c_char,
29    );
30    pub fn is_line_breakable(char1: utf32_t, char2: utf32_t, lang: *const c_char) -> c_int;
31
32    pub fn init_wordbreak();
33    pub fn set_wordbreaks_utf32(
34        s: *const utf32_t,
35        len: usize,
36        lang: *const c_char,
37        brks: *mut c_char,
38    );
39}
40
41/// Analyze Unicode line breaks when libunibreak is available.
42///
43/// # Safety
44///
45/// `s` must cover `len` UTF-32 code units; `brks` must cover `len` writable
46/// markers. `lang` must be null or a valid C string. Pointers must not alias
47/// illegally.
48pub unsafe fn analyze_linebreaks_utf32(
49    s: *const utf32_t,
50    len: usize,
51    lang: *const c_char,
52    brks: *mut c_char,
53) -> bool {
54    #[cfg(libunibreak_available)]
55    {
56        unsafe {
57            init_linebreak();
58            set_linebreaks_utf32(s, len, lang, brks);
59        }
60        true
61    }
62
63    #[cfg(not(libunibreak_available))]
64    {
65        let _ = (s, len, lang, brks);
66        false
67    }
68}
69
70/// Analyze Unicode word breaks when libunibreak is available.
71///
72/// # Safety
73///
74/// `s` must cover `len` UTF-32 code units; `brks` must cover `len` writable
75/// markers. `lang` must be null or a valid C string. Pointers must not alias
76/// illegally.
77pub unsafe fn analyze_wordbreaks_utf32(
78    s: *const utf32_t,
79    len: usize,
80    lang: *const c_char,
81    brks: *mut c_char,
82) -> bool {
83    #[cfg(libunibreak_available)]
84    {
85        unsafe {
86            init_wordbreak();
87            set_wordbreaks_utf32(s, len, lang, brks);
88        }
89        true
90    }
91
92    #[cfg(not(libunibreak_available))]
93    {
94        let _ = (s, len, lang, brks);
95        false
96    }
97}