Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change data wrapping to use TypedData #181

Merged
merged 1 commit into from
Jul 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions ext/charlock_holmes/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ extern "C"
{
#endif

extern void Init_charlock_holmes();
extern void _init_charlock_encoding_detector();
extern void _init_charlock_converter();
extern void _init_charlock_transliterator();
extern void Init_charlock_holmes(void);
extern void _init_charlock_encoding_detector(void);
extern void _init_charlock_converter(void);
extern void _init_charlock_transliterator(void);

#ifdef __cplusplus
}
Expand Down
4 changes: 2 additions & 2 deletions ext/charlock_holmes/converter.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ static VALUE rb_converter_convert(VALUE self, VALUE rb_txt, VALUE rb_src_enc, VA
Check_Type(rb_dst_enc, T_STRING);

src_txt = RSTRING_PTR(rb_txt);
src_len = RSTRING_LEN(rb_txt);
src_len = (int32_t)RSTRING_LEN(rb_txt);
src_enc = RSTRING_PTR(rb_src_enc);
dst_enc = RSTRING_PTR(rb_dst_enc);

Expand Down Expand Up @@ -50,7 +50,7 @@ static VALUE rb_converter_convert(VALUE self, VALUE rb_txt, VALUE rb_src_enc, VA
return rb_out;
}

void _init_charlock_converter() {
void _init_charlock_converter(void) {
rb_cConverter = rb_define_class_under(rb_mCharlockHolmes, "Converter", rb_cObject);

rb_define_singleton_method(rb_cConverter, "convert", rb_converter_convert, 3);
Expand Down
49 changes: 28 additions & 21 deletions ext/charlock_holmes/encoding_detector.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,25 @@ typedef struct {
UCharsetDetector *csd;
} charlock_detector_t;

static void rb_encdec__free(void *obj)
{
charlock_detector_t *detector;

detector = (charlock_detector_t *)obj;

if (detector->csd)
ucsdet_close(detector->csd);

free(detector);
}

static const rb_data_type_t charlock_detector_type = {
"Charlock/Detector",
{ 0, rb_encdec__free, 0, },
0, 0,
RUBY_TYPED_FREE_IMMEDIATELY,
};

static VALUE rb_encdec_buildmatch(const UCharsetMatch *match)
{
UErrorCode status = U_ZERO_ERROR;
Expand Down Expand Up @@ -47,7 +66,7 @@ static VALUE rb_encdec_buildmatch(const UCharsetMatch *match)
return rb_match;
}

static VALUE rb_encdec_binarymatch() {
static VALUE rb_encdec_binarymatch(void) {
VALUE rb_match;

rb_match = rb_hash_new();
Expand Down Expand Up @@ -167,7 +186,7 @@ static VALUE rb_encdec_detect(int argc, VALUE *argv, VALUE self)
rb_scan_args(argc, argv, "11", &rb_str, &rb_enc_hint);

Check_Type(rb_str, T_STRING);
Data_Get_Struct(self, charlock_detector_t, detector);
TypedData_Get_Struct(self, charlock_detector_t, &charlock_detector_type, detector);

// first lets see if this is binary content
if (detect_binary_content(self, rb_str)) {
Expand All @@ -180,7 +199,7 @@ static VALUE rb_encdec_detect(int argc, VALUE *argv, VALUE self)

if (!NIL_P(rb_enc_hint)) {
Check_Type(rb_enc_hint, T_STRING);
ucsdet_setDeclaredEncoding(detector->csd, RSTRING_PTR(rb_enc_hint), RSTRING_LEN(rb_enc_hint), &status);
ucsdet_setDeclaredEncoding(detector->csd, RSTRING_PTR(rb_enc_hint), (int32_t)RSTRING_LEN(rb_enc_hint), &status);
}

return rb_encdec_buildmatch(ucsdet_detect(detector->csd, &status));
Expand Down Expand Up @@ -215,7 +234,7 @@ static VALUE rb_encdec_detect_all(int argc, VALUE *argv, VALUE self)
rb_scan_args(argc, argv, "11", &rb_str, &rb_enc_hint);

Check_Type(rb_str, T_STRING);
Data_Get_Struct(self, charlock_detector_t, detector);
TypedData_Get_Struct(self, charlock_detector_t, &charlock_detector_type, detector);

rb_ret = rb_ary_new();

Expand All @@ -229,7 +248,7 @@ static VALUE rb_encdec_detect_all(int argc, VALUE *argv, VALUE self)

if (!NIL_P(rb_enc_hint)) {
Check_Type(rb_enc_hint, T_STRING);
ucsdet_setDeclaredEncoding(detector->csd, RSTRING_PTR(rb_enc_hint), RSTRING_LEN(rb_enc_hint), &status);
ucsdet_setDeclaredEncoding(detector->csd, RSTRING_PTR(rb_enc_hint), (int32_t)RSTRING_LEN(rb_enc_hint), &status);
}

csm = ucsdet_detectAll(detector->csd, &match_count, &status);
Expand Down Expand Up @@ -257,7 +276,7 @@ static VALUE rb_get_strip_tags(VALUE self)
UBool val;
VALUE rb_val;

Data_Get_Struct(self, charlock_detector_t, detector);
TypedData_Get_Struct(self, charlock_detector_t, &charlock_detector_type, detector);

val = ucsdet_isInputFilterEnabled(detector->csd);

Expand All @@ -279,7 +298,7 @@ static VALUE rb_set_strip_tags(VALUE self, VALUE rb_val)
charlock_detector_t *detector;
UBool val;

Data_Get_Struct(self, charlock_detector_t, detector);
TypedData_Get_Struct(self, charlock_detector_t, &charlock_detector_type, detector);

val = rb_val == Qtrue ? 1 : 0;

Expand Down Expand Up @@ -334,26 +353,14 @@ static VALUE rb_get_supported_encodings(VALUE klass)
return rb_encoding_list;
}

static void rb_encdec__free(void *obj)
{
charlock_detector_t *detector;

detector = (charlock_detector_t *)obj;

if (detector->csd)
ucsdet_close(detector->csd);

free(detector);
}

static VALUE rb_encdec__alloc(VALUE klass)
{
charlock_detector_t *detector;
UErrorCode status = U_ZERO_ERROR;
VALUE obj;

detector = (charlock_detector_t *) calloc(1, sizeof(charlock_detector_t));
obj = Data_Wrap_Struct(klass, NULL, rb_encdec__free, (void *)detector);
obj = TypedData_Wrap_Struct(klass, &charlock_detector_type, (void *)detector);

detector->csd = ucsdet_open(&status);
if (U_FAILURE(status)) {
Expand All @@ -363,7 +370,7 @@ static VALUE rb_encdec__alloc(VALUE klass)
return obj;
}

void _init_charlock_encoding_detector()
void _init_charlock_encoding_detector(void)
{
rb_cEncodingDetector = rb_define_class_under(rb_mCharlockHolmes, "EncodingDetector", rb_cObject);
rb_define_alloc_func(rb_cEncodingDetector, rb_encdec__alloc);
Expand Down
2 changes: 1 addition & 1 deletion ext/charlock_holmes/ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

VALUE rb_mCharlockHolmes;

void Init_charlock_holmes() {
void Init_charlock_holmes(void) {
rb_mCharlockHolmes = rb_define_module("CharlockHolmes");

_init_charlock_encoding_detector();
Expand Down
2 changes: 1 addition & 1 deletion ext/charlock_holmes/transliterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ static VALUE rb_transliterator_transliterate(VALUE self, VALUE rb_txt, VALUE rb_
return rb_out;
}

void _init_charlock_transliterator() {
void _init_charlock_transliterator(void) {
#ifdef HAVE_RUBY_ENCODING_H
rb_eEncodingCompatibilityError = rb_const_get(rb_cEncoding, rb_intern("CompatibilityError"));
#endif
Expand Down
Loading