Created
August 27, 2016 08:39
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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