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