export.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //! IMPLEMENTATION DETAILS USED BY MACROS
  2. use crate::hio::{self, HostStream};
  3. use core::fmt::{self, Write};
  4. static mut HSTDOUT: Option<HostStream> = None;
  5. static mut HSTDERR: Option<HostStream> = None;
  6. #[cfg(not(feature = "u-mode"))]
  7. mod machine {
  8. use super::*;
  9. pub fn hstdout_str(s: &str) {
  10. let _result = critical_section::with(|_| unsafe {
  11. if HSTDOUT.is_none() {
  12. HSTDOUT = Some(hio::hstdout()?);
  13. }
  14. HSTDOUT.as_mut().unwrap().write_str(s).map_err(drop)
  15. });
  16. }
  17. pub fn hstdout_fmt(args: fmt::Arguments) {
  18. let _result = critical_section::with(|_| unsafe {
  19. if HSTDOUT.is_none() {
  20. HSTDOUT = Some(hio::hstdout()?);
  21. }
  22. HSTDOUT.as_mut().unwrap().write_fmt(args).map_err(drop)
  23. });
  24. }
  25. pub fn hstderr_str(s: &str) {
  26. let _result = critical_section::with(|_| unsafe {
  27. if HSTDERR.is_none() {
  28. HSTDERR = Some(hio::hstderr()?);
  29. }
  30. HSTDERR.as_mut().unwrap().write_str(s).map_err(drop)
  31. });
  32. }
  33. pub fn hstderr_fmt(args: fmt::Arguments) {
  34. let _result = critical_section::with(|_| unsafe {
  35. if HSTDERR.is_none() {
  36. HSTDERR = Some(hio::hstderr()?);
  37. }
  38. HSTDERR.as_mut().unwrap().write_fmt(args).map_err(drop)
  39. });
  40. }
  41. }
  42. #[cfg(not(feature = "u-mode"))]
  43. pub use machine::*;
  44. #[cfg(feature = "u-mode")]
  45. mod user {
  46. use super::*;
  47. pub fn hstdout_str(s: &str) {
  48. let _result = unsafe {
  49. if HSTDOUT.is_none() {
  50. HSTDOUT = Some(hio::hstdout().unwrap());
  51. }
  52. HSTDOUT.as_mut().unwrap().write_str(s).map_err(drop)
  53. };
  54. }
  55. pub fn hstdout_fmt(args: fmt::Arguments) {
  56. let _result = unsafe {
  57. if HSTDOUT.is_none() {
  58. HSTDOUT = Some(hio::hstdout().unwrap());
  59. }
  60. HSTDOUT.as_mut().unwrap().write_fmt(args).map_err(drop)
  61. };
  62. }
  63. pub fn hstderr_str(s: &str) {
  64. let _result = unsafe {
  65. if HSTDERR.is_none() {
  66. HSTDERR = Some(hio::hstderr().unwrap());
  67. }
  68. HSTDERR.as_mut().unwrap().write_str(s).map_err(drop)
  69. };
  70. }
  71. pub fn hstderr_fmt(args: fmt::Arguments) {
  72. let _result = unsafe {
  73. if HSTDERR.is_none() {
  74. HSTDERR = Some(hio::hstderr().unwrap());
  75. }
  76. HSTDERR.as_mut().unwrap().write_fmt(args).map_err(drop)
  77. };
  78. }
  79. }
  80. #[cfg(feature = "u-mode")]
  81. pub use user::*;