From 614b2f51030710bdf56d3375ae03655154f572cf Mon Sep 17 00:00:00 2001 From: Tibor Nagy <xnagytibor@gmail.com> Date: Sat, 6 Oct 2018 00:12:32 +0200 Subject: [PATCH] Make assert more hygienic --- include/assert.h | 14 -------------- include/bits/assert.h | 12 ++++++++++++ src/header/assert/cbindgen.toml | 7 +++++++ src/header/assert/mod.rs | 17 +++++++++++++++++ src/header/mod.rs | 1 + 5 files changed, 37 insertions(+), 14 deletions(-) delete mode 100644 include/assert.h create mode 100644 include/bits/assert.h create mode 100644 src/header/assert/cbindgen.toml create mode 100644 src/header/assert/mod.rs diff --git a/include/assert.h b/include/assert.h deleted file mode 100644 index 1a402062..00000000 --- a/include/assert.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _ASSERT_H -#define _ASSERT_H - -#ifdef NDEBUG -# define assert(cond) -#else -# include <stdio.h> -# define assert(cond) if (!(cond)) { \ - fprintf(stderr, "%s: %s:%d: Assertion `%s` failed.\n", __func__, __FILE__, __LINE__, #cond); \ - abort(); \ - } -#endif - -#endif diff --git a/include/bits/assert.h b/include/bits/assert.h new file mode 100644 index 00000000..3a8c1b00 --- /dev/null +++ b/include/bits/assert.h @@ -0,0 +1,12 @@ +#ifndef _BITS_ASSERT_H +#define _BITS_ASSERT_H + +#ifdef NDEBUG +# define assert(cond) +#else +# define assert(cond) if (!(cond)) { \ + __assert(__func__, __FILE__, __LINE__, #cond); \ + } +#endif + +#endif diff --git a/src/header/assert/cbindgen.toml b/src/header/assert/cbindgen.toml new file mode 100644 index 00000000..8eeb4d6d --- /dev/null +++ b/src/header/assert/cbindgen.toml @@ -0,0 +1,7 @@ +sys_includes = ["bits/assert.h"] +include_guard = "_ASSERT_H" +language = "C" +style = "Tag" + +[enum] +prefix_with_name = true diff --git a/src/header/assert/mod.rs b/src/header/assert/mod.rs new file mode 100644 index 00000000..838050f9 --- /dev/null +++ b/src/header/assert/mod.rs @@ -0,0 +1,17 @@ +//! assert implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/assert.h.html + +use c_str::CStr; +use core::fmt::Write; +use header::{stdio, stdlib}; +use platform; +use platform::types::*; + +#[no_mangle] +pub unsafe extern "C" fn __assert(func: *const c_char, file: *const c_char, line: c_int, cond: *const c_char) { + let func = CStr::from_ptr(func).to_str().unwrap(); + let file = CStr::from_ptr(file).to_str().unwrap(); + let cond = CStr::from_ptr(cond).to_str().unwrap(); + + write!(*stdio::stderr, "{}: {}:{}: Assertion `{}` failed.\n", func, file, line, cond).unwrap(); + stdlib::abort(); +} diff --git a/src/header/mod.rs b/src/header/mod.rs index ce0c6b79..473bc1c0 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -1,5 +1,6 @@ pub mod aio; pub mod arpa_inet; +pub mod assert; pub mod ctype; pub mod dirent; pub mod errno; -- GitLab