Skip to content

Instantly share code, notes, and snippets.

@btv
Created August 27, 2016 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save btv/522ab01120cb77b96e4d3418e36f0787 to your computer and use it in GitHub Desktop.
Save btv/522ab01120cb77b96e4d3418e36f0787 to your computer and use it in GitHub Desktop.
I'm trying to push a pointer back to dst in the base64_decode function.
extern crate libc;
extern crate rustc_serialize;
use libc::{size_t, c_void, c_char};
use std::{slice, ptr, iter, str};
use std::ffi::{CString, CStr};
use rustc_serialize::base64::{ToBase64, FromBase64, STANDARD};
//to copy
//size_t base64_decode(void *dst, size_t sizeof_dst, const void *src, size_t sizeof_src);
#[no_mangle]
pub extern "C" fn base64_decode(dst: *mut c_void, dst_len: size_t, src: *const c_void, src_len: size_t) -> size_t {
let source = unsafe {
assert!(!src.is_null());
slice::from_raw_parts(src as *const u8, src_len as usize)
};
let source_text = match str::from_utf8(source) {
Err(e) => panic!("Error while ingesting the input string."),
Ok(o) => o,
};
let encode_text: String = source_text.as_bytes().to_base64(STANDARD);
let encode_text_size = encode_text.len() as usize;
let mut dst_pointer = CString::new(encode_text).unwrap().into_raw() as *mut _ as *mut c_void;
unsafe { (*dst) = dst_pointer};
return encode_text_size;
}
//size_t base64_encode(void *dst, size_t sizeof_dst, const void *src, size_t sizeof_src);
#[no_mangle]
pub extern fn base64_encode(dst: *mut c_void, dst_len: size_t, src: *const c_void, src_len: size_t) -> size_t {
let source = unsafe {
assert!(!src.is_null());
slice::from_raw_parts(src, src_len as usize)
};
src_len as usize
}
#[cfg(test)]
mod tests {
use super::{base64_decode, base64_encode};
use libc::{c_void};
use std::ffi::CString;
#[test]
fn test_decode() {
let text = "this is a test.";
let mut dest_ptr = CString::new(text).unwrap().into_raw() as *mut c_void;
let text_ptr = text.as_ptr() as *const c_void;
let retu: usize = base64_decode(dest_ptr, text.len(),text_ptr, text.len());
assert_eq!(retu, text.len());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment