Implement swab
This commit is contained in:
@@ -555,9 +555,20 @@ pub extern "C" fn sleep(seconds: c_uint) -> c_uint {
|
||||
0
|
||||
}
|
||||
|
||||
// #[no_mangle]
|
||||
#[no_mangle]
|
||||
pub extern "C" fn swab(src: *const c_void, dest: *mut c_void, nbytes: ssize_t) {
|
||||
unimplemented!();
|
||||
if nbytes <= 0 {
|
||||
return
|
||||
}
|
||||
let number_of_swaps = nbytes / 2;
|
||||
let mut offset = 0;
|
||||
for i in 0..number_of_swaps {
|
||||
unsafe {
|
||||
src.offset(offset).copy_to(dest.offset(offset + 1), 1);
|
||||
src.offset(offset + 1).copy_to(dest.offset(offset), 1);
|
||||
}
|
||||
offset += 2;
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
@@ -81,6 +81,7 @@ EXPECT_BINS=\
|
||||
unistd/pipe \
|
||||
unistd/rmdir \
|
||||
unistd/sleep \
|
||||
unistd/swab \
|
||||
unistd/write \
|
||||
waitpid \
|
||||
wchar/mbrtowc \
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
#include <unistd.h>
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
|
||||
const char source[] = {0, 1, 2, 3, 4, 5, 6};
|
||||
char destination[] = {0, 0, 0, 0, 0, 0};
|
||||
const char flipped_source[] = {1, 0, 3, 2, 5, 4};
|
||||
const char first_two_source_bytes_flipped[] = {1, 0};
|
||||
|
||||
swab(source, destination, /* nbytes */ -3);
|
||||
for (int i = 0; i < sizeof(destination); ++i) {
|
||||
if (destination[i] != 0) {
|
||||
puts("If nbytes is negative destionation shouldn't be modified");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
swab(source, destination, /* nbytes */ 0);
|
||||
for (int i = 0; i < sizeof(destination); ++i) {
|
||||
if (destination[i] != 0) {
|
||||
puts("If nbytes is zero destionation shouldn't be modified");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
swab(source, destination, /* nbytes */ 3);
|
||||
for (int i = 0; i < sizeof(first_two_source_bytes_flipped); ++i) {
|
||||
if (destination[i] != first_two_source_bytes_flipped[i]) {
|
||||
puts("copied bytes don't match expected values");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// If nbytes is not even it's not specified what should happen to the
|
||||
// last byte so the third byte in destination is not checked.
|
||||
for (int i = sizeof(first_two_source_bytes_flipped) + 1; i < sizeof(destination); ++i) {
|
||||
if (destination[i] != 0) {
|
||||
puts("swab modified too many bytes in destination");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
swab(source, destination, /* nbytes */ sizeof(destination));
|
||||
for (int i = 0; i < sizeof(destination); ++i) {
|
||||
if (destination[i] != flipped_source[i]) {
|
||||
puts("copied bytes don't match expected values");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user