lyric-decoder 0.1.0

decoder for KRC/QRC file in C
Documentation
use std::{
    ffi::{c_char, CStr},
    ptr::NonNull,
};
mod c_str;
use c_str::COwnedString;

extern "C" {
    fn krcdecode(
        src: *mut ::std::os::raw::c_char,
        src_len: ::std::os::raw::c_int,
    ) -> *mut ::std::os::raw::c_char;
    fn qrcdecode(
        src: *mut ::std::os::raw::c_char,
        src_len: ::std::os::raw::c_int,
    ) -> *mut ::std::os::raw::c_char;
}

pub fn krc_decode(resp: &mut [c_char]) -> Option<COwnedString> {
    unsafe {
        NonNull::new(krcdecode(resp.as_mut_ptr(), resp.len() as _)).map(|ptr| {
            let len = CStr::from_ptr(ptr.as_ptr() as _).to_bytes().len() as isize;
            COwnedString::from_raw_parts(ptr, len)
        })
    }
}

pub fn qrc_decode(resp: &mut [c_char]) -> Option<COwnedString> {
    unsafe {
        NonNull::new(qrcdecode(resp.as_mut_ptr(), resp.len() as _)).map(|ptr| {
            let len = CStr::from_ptr(ptr.as_ptr() as _).to_bytes().len() as isize;
            COwnedString::from_raw_parts(ptr, len)
        })
    }
}