rutie/rubysys/
encoding.rs

1use crate::rubysys::{
2    constant::{FL_USER_8, FL_USER_9},
3    types::{
4        c_char, c_int, size_t, CallbackPtr, EncodingIndex, EncodingType, InternalValue, RBasic,
5        Value,
6    },
7};
8use std::mem;
9
10pub const ENC_DUMMY_FLAG: isize = 1 << 24;
11pub const ENC_INDEX_MASK: isize = !(!0 << 24);
12pub const ENC_CODERANGE_UNKNOWN: isize = 0;
13pub const ENC_CODERANGE_7BIT: isize = FL_USER_8;
14pub const ENC_CODERANGE_VALID: isize = FL_USER_9;
15pub const ENC_CODERANGE_BROKEN: isize = FL_USER_8 | FL_USER_9;
16pub const ENC_CODERANGE_MASK: isize =
17    ENC_CODERANGE_7BIT | ENC_CODERANGE_VALID | ENC_CODERANGE_BROKEN;
18
19extern "C" {
20    // VALUE
21    // rb_enc_associate(VALUE obj, rb_encoding *enc)
22    pub fn rb_enc_associate(obj: Value, enc: EncodingType) -> Value;
23    // VALUE
24    // rb_enc_associate_index(VALUE obj, int idx)
25    pub fn rb_enc_associate_index(obj: Value, idx: c_int) -> Value;
26    // rb_encoding*
27    // rb_enc_compatible(VALUE str1, VALUE str2)
28    pub fn rb_enc_compatible(str1: Value, str2: Value) -> EncodingType;
29    // VALUE
30    // rb_enc_default_external(void)
31    pub fn rb_enc_default_external() -> Value;
32    // VALUE
33    // rb_enc_default_internal(void)
34    pub fn rb_enc_default_internal() -> Value;
35    // int
36    // rb_enc_find_index(const char *name)
37    pub fn rb_enc_find_index(name: *const c_char) -> EncodingIndex;
38    // ------------------------------------------------------
39    // LINKER CANNOT FIND
40    // // static VALUE
41    // // rb_enc_from_encoding_index(int idx)
42    // pub fn rb_enc_from_encoding_index(idx: c_int) -> Value;
43    // ------------------------------------------------------
44    // VALUE
45    // rb_enc_from_encoding(rb_encoding *encoding)
46    pub fn rb_enc_from_encoding(encoding: EncodingType) -> Value;
47    // rb_encoding *
48    // rb_enc_from_index(int index)
49    pub fn rb_enc_from_index(index: EncodingIndex) -> EncodingType;
50    // int
51    // rb_enc_get_index(VALUE obj)
52    pub fn rb_enc_get_index(obj: Value) -> EncodingIndex;
53    // void
54    // rb_enc_set_index(VALUE obj, int idx)
55    pub fn rb_enc_set_index(obj: Value, encindex: EncodingIndex);
56    // void
57    // rb_enc_set_default_external(VALUE encoding)
58    pub fn rb_enc_set_default_external(encoding: Value);
59    // void
60    // rb_enc_set_default_internal(VALUE encoding)
61    pub fn rb_enc_set_default_internal(encoding: Value);
62    // int
63    // rb_filesystem_encindex(void)
64    pub fn rb_filesystem_encindex() -> EncodingIndex;
65    // int
66    // rb_locale_encindex(void)
67    pub fn rb_locale_encindex() -> EncodingIndex;
68    // VALUE
69    // rb_obj_encoding(VALUE obj)
70    pub fn rb_obj_encoding(obj: Value) -> Value;
71    // rb_encoding *
72    // rb_to_encoding(VALUE enc)
73    pub fn rb_to_encoding(enc: Value) -> EncodingType;
74    // int
75    // rb_to_encoding_index(VALUE enc)
76    pub fn rb_to_encoding_index(obj: Value) -> EncodingIndex;
77    // int
78    // rb_usascii_encindex(void)
79    pub fn rb_usascii_encindex() -> EncodingIndex;
80    // int
81    // rb_utf8_encindex(void)
82    pub fn rb_utf8_encindex() -> EncodingIndex;
83    // VALUE
84    // rb_str_export_to_enc(VALUE str, rb_encoding *enc)
85    pub fn rb_str_export_to_enc(str: Value, enc: EncodingType) -> Value;
86    // VALUE
87    // rb_str_encode(VALUE str, VALUE to, int ecflags, VALUE ecopts)
88    pub fn rb_str_encode(str: Value, to: Value, ecflags: c_int, ecopts: Value) -> Value;
89    // int
90    // rb_econv_prepare_opts(VALUE opthash, VALUE *opts)
91    pub fn rb_econv_prepare_opts(opthash: Value, opts: *const Value) -> c_int;
92    // unsigned int
93    // rb_enc_codepoint_len(const char *p, const char *e, int *len_p, rb_encoding *enc)
94    pub fn rb_enc_codepoint_len(
95        ptr: *const c_char,
96        end: *const c_char,
97        len_p: *mut c_int,
98        enc: EncodingType,
99    ) -> size_t;
100}
101
102pub unsafe fn coderange_set(obj: Value, code_range: InternalValue) {
103    let basic: *mut RBasic = mem::transmute(obj.value);
104    (*basic).flags = ((*basic).flags & !(ENC_CODERANGE_MASK as InternalValue)) | code_range
105}
106
107pub unsafe fn coderange_clear(obj: Value) {
108    coderange_set(obj, 0)
109}