os.odin 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. when ODIN_OS == "windows" do export "core:os_windows.odin";
  2. when ODIN_OS == "osx" do export "core:os_x.odin";
  3. when ODIN_OS == "linux" do export "core:os_linux.odin";
  4. import "mem.odin";
  5. write_string :: proc(fd: Handle, str: string) -> (int, Errno) {
  6. return write(fd, cast([]u8)str);
  7. }
  8. read_entire_file :: proc(name: string) -> (data: []u8, success: bool) {
  9. fd, err := open(name, O_RDONLY, 0);
  10. if err != 0 {
  11. return nil, false;
  12. }
  13. defer close(fd);
  14. length: i64;
  15. if length, err = file_size(fd); err != 0 {
  16. return nil, false;
  17. }
  18. if length <= 0 {
  19. return nil, true;
  20. }
  21. data := make([]u8, int(length));
  22. if data == nil {
  23. return nil, false;
  24. }
  25. bytes_read, read_err := read(fd, data);
  26. if read_err != 0 {
  27. free(data);
  28. return nil, false;
  29. }
  30. return data[0..bytes_read], true;
  31. }
  32. write_entire_file :: proc(name: string, data: []u8, truncate := true) -> (success: bool) {
  33. flags: int = O_WRONLY|O_CREATE;
  34. if truncate {
  35. flags |= O_TRUNC;
  36. }
  37. fd, err := open(name, flags, 0);
  38. if err != 0 {
  39. return false;
  40. }
  41. defer close(fd);
  42. bytes_written, write_err := write(fd, data);
  43. return write_err != 0;
  44. }
  45. write :: proc(fd: Handle, data: rawptr, len: int) -> (int, Errno) {
  46. return write(fd, mem.slice_ptr(cast(^u8)data, len));
  47. }
  48. read :: proc(fd: Handle, data: rawptr, len: int) -> (int, Errno) {
  49. return read(fd, mem.slice_ptr(cast(^u8)data, len));
  50. }