mod.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. use alloc::vec::Vec;
  2. use core::{fmt, ptr};
  3. use io::{self, Read, Write};
  4. pub use self::allocator::*;
  5. #[cfg(not(feature = "ralloc"))]
  6. #[path = "allocator/dlmalloc.rs"]
  7. mod allocator;
  8. #[cfg(feature = "ralloc")]
  9. #[path = "allocator/ralloc.rs"]
  10. mod allocator;
  11. pub use self::pal::{Pal, PalSignal, PalSocket};
  12. mod pal;
  13. pub use self::sys::Sys;
  14. #[cfg(all(not(feature = "no_std"), target_os = "linux"))]
  15. #[path = "linux/mod.rs"]
  16. mod sys;
  17. #[cfg(all(not(feature = "no_std"), target_os = "redox"))]
  18. #[path = "redox/mod.rs"]
  19. mod sys;
  20. pub use self::rlb::{Line, RawLineBuffer};
  21. pub mod rlb;
  22. use self::types::*;
  23. pub mod types;
  24. //TODO #[thread_local]
  25. #[allow(non_upper_case_globals)]
  26. #[no_mangle]
  27. pub static mut errno: c_int = 0;
  28. #[allow(non_upper_case_globals)]
  29. #[no_mangle]
  30. pub static mut environ: *mut *mut c_char = ptr::null_mut();
  31. #[allow(non_upper_case_globals)]
  32. pub static mut inner_environ: Vec<*mut c_char> = Vec::new();
  33. pub trait WriteByte: fmt::Write {
  34. fn write_u8(&mut self, byte: u8) -> fmt::Result;
  35. }
  36. impl<'a, W: WriteByte> WriteByte for &'a mut W {
  37. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  38. (**self).write_u8(byte)
  39. }
  40. }
  41. pub struct FileWriter(pub c_int);
  42. impl FileWriter {
  43. pub fn write(&mut self, buf: &[u8]) -> isize {
  44. Sys::write(self.0, buf)
  45. }
  46. }
  47. impl fmt::Write for FileWriter {
  48. fn write_str(&mut self, s: &str) -> fmt::Result {
  49. self.write(s.as_bytes());
  50. Ok(())
  51. }
  52. }
  53. impl WriteByte for FileWriter {
  54. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  55. self.write(&[byte]);
  56. Ok(())
  57. }
  58. }
  59. pub struct FileReader(pub c_int);
  60. impl FileReader {
  61. pub fn read(&mut self, buf: &mut [u8]) -> isize {
  62. Sys::read(self.0, buf)
  63. }
  64. }
  65. impl Read for FileReader {
  66. fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
  67. let i = Sys::read(self.0, buf);
  68. if i >= 0 {
  69. Ok(i as usize)
  70. } else {
  71. Err(io::Error::from_raw_os_error(-i as i32))
  72. }
  73. }
  74. }
  75. pub struct StringWriter(pub *mut u8, pub usize);
  76. impl Write for StringWriter {
  77. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  78. if self.1 > 1 {
  79. let copy_size = buf.len().min(self.1 - 1);
  80. unsafe {
  81. ptr::copy_nonoverlapping(buf.as_ptr(), self.0, copy_size);
  82. self.1 -= copy_size;
  83. self.0 = self.0.add(copy_size);
  84. *self.0 = 0;
  85. }
  86. Ok(copy_size)
  87. } else {
  88. Ok(0)
  89. }
  90. }
  91. fn flush(&mut self) -> io::Result<()> {
  92. Ok(())
  93. }
  94. }
  95. impl fmt::Write for StringWriter {
  96. fn write_str(&mut self, s: &str) -> fmt::Result {
  97. // can't fail
  98. self.write(s.as_bytes()).unwrap();
  99. Ok(())
  100. }
  101. }
  102. impl WriteByte for StringWriter {
  103. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  104. // can't fail
  105. self.write(&[byte]).unwrap();
  106. Ok(())
  107. }
  108. }
  109. pub struct UnsafeStringWriter(pub *mut u8);
  110. impl Write for UnsafeStringWriter {
  111. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  112. unsafe {
  113. ptr::copy_nonoverlapping(buf.as_ptr(), self.0, buf.len());
  114. self.0 = self.0.add(buf.len());
  115. *self.0 = b'\0';
  116. }
  117. Ok(buf.len())
  118. }
  119. fn flush(&mut self) -> io::Result<()> {
  120. Ok(())
  121. }
  122. }
  123. impl fmt::Write for UnsafeStringWriter {
  124. fn write_str(&mut self, s: &str) -> fmt::Result {
  125. // can't fail
  126. self.write(s.as_bytes()).unwrap();
  127. Ok(())
  128. }
  129. }
  130. impl WriteByte for UnsafeStringWriter {
  131. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  132. // can't fail
  133. self.write(&[byte]).unwrap();
  134. Ok(())
  135. }
  136. }
  137. pub struct UnsafeStringReader(pub *const u8);
  138. impl Read for UnsafeStringReader {
  139. fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
  140. unsafe {
  141. for i in 0..buf.len() {
  142. if *self.0 == 0 {
  143. return Ok(i);
  144. }
  145. buf[i] = *self.0;
  146. self.0 = self.0.offset(1);
  147. }
  148. Ok(buf.len())
  149. }
  150. }
  151. }
  152. pub struct CountingWriter<T> {
  153. pub inner: T,
  154. pub written: usize,
  155. }
  156. impl<T> CountingWriter<T> {
  157. pub fn new(writer: T) -> Self {
  158. Self {
  159. inner: writer,
  160. written: 0,
  161. }
  162. }
  163. }
  164. impl<T: fmt::Write> fmt::Write for CountingWriter<T> {
  165. fn write_str(&mut self, s: &str) -> fmt::Result {
  166. self.written += s.len();
  167. self.inner.write_str(s)
  168. }
  169. }
  170. impl<T: WriteByte> WriteByte for CountingWriter<T> {
  171. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  172. self.written += 1;
  173. self.inner.write_u8(byte)
  174. }
  175. }
  176. impl<T: Write> Write for CountingWriter<T> {
  177. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  178. let res = self.inner.write(buf);
  179. if let Ok(written) = res {
  180. self.written += written;
  181. }
  182. res
  183. }
  184. fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
  185. match self.inner.write_all(&buf) {
  186. Ok(()) => (),
  187. Err(ref err) if err.kind() == io::ErrorKind::WriteZero => (),
  188. Err(err) => return Err(err),
  189. }
  190. self.written += buf.len();
  191. Ok(())
  192. }
  193. fn flush(&mut self) -> io::Result<()> {
  194. self.inner.flush()
  195. }
  196. }