Skip to content
Snippets Groups Projects
Unverified Commit b52a1d61 authored by Jeremy Soller's avatar Jeremy Soller Committed by GitHub
Browse files

Merge pull request #59 from Tommoa/master

Add implementations of memchr and memccpy
parents a227338a a2a7efa9
No related branches found
No related tags found
No related merge requests found
......@@ -10,4 +10,5 @@ cbindgen = { path = "../../cbindgen" }
[dependencies]
platform = { path = "../platform" }
stdlib = { path = "../stdlib" }
errno = { path = "../errno" }
\ No newline at end of file
errno = { path = "../errno" }
compiler_builtins = { git = "https://github.com/rust-lang-nursery/compiler-builtins.git", default-features = false, features = ["mem"] }
//! string implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/string.h.html
#![feature(compiler_builtins_lib)]
#![no_std]
extern crate compiler_builtins;
extern crate errno;
extern crate platform;
extern crate stdlib;
......@@ -10,15 +12,40 @@ use platform::types::*;
use errno::*;
use core::cmp;
use core::usize;
use core::ptr;
#[no_mangle]
pub extern "C" fn memccpy(s1: *mut c_void, s2: *const c_void, c: c_int, n: usize) -> *mut c_void {
unimplemented!();
pub unsafe extern "C" fn memccpy(
dest: *mut c_void,
src: *const c_void,
c: c_int,
n: usize,
) -> *mut c_void {
use compiler_builtins::mem::memcpy;
let dest = dest as *mut u8;
let to = memchr(src, c, n);
if to.is_null() {
return to;
}
let src = src as *mut u8;
let dist = (to as usize) - (src as usize);
if memcpy(dest, src, dist).is_null() {
return ptr::null_mut();
}
dest.offset(dist as isize + 1) as *mut c_void
}
#[no_mangle]
pub extern "C" fn memchr(s: *const c_void, c: c_int, n: usize) -> *mut c_void {
unimplemented!();
pub unsafe extern "C" fn memchr(s: *const c_void, c: c_int, n: usize) -> *mut c_void {
let s = s as *mut u8;
let c = c as u8;
let mut i = 0;
for i in 0..n {
if *s.offset(i as isize) == c {
return s.offset(i as isize) as *mut c_void;
}
}
ptr::null_mut()
}
// #[no_mangle]
......
......@@ -20,6 +20,7 @@
/link
/link.out
/math
/mem
/setid
/sleep
/pipe
......
......@@ -16,6 +16,7 @@ BINS=\
getid \
link \
math \
mem \
pipe \
printf \
rmdir \
......
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char ** argv) {
printf("# mem #\n");
char arr[100];
memset(arr, 0, 100); // Compiler builtin, should work
arr[50] = 1;
if ((size_t)memchr((void *)arr, 1, 100) - (size_t)arr != 50) {
printf("Incorrect memchr\n");
exit(1);
}
printf("Correct memchr\n");
char arr2[51];
memset(arr2, 0, 51); // Compiler builtin, should work
memccpy((void *)arr2, (void *)arr, 1, 100);
if (arr[50] != 1) {
printf("Incorrect memccpy\n");
exit(1);
}
printf("Correct memccpy\n");
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment