os.odin 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package os
  2. import "core:mem"
  3. write_string :: proc(fd: Handle, str: string) -> (int, Errno) {
  4. return write(fd, cast([]byte)str);
  5. }
  6. write_byte :: proc(fd: Handle, b: byte) -> (int, Errno) {
  7. return write(fd, []byte{b});
  8. }
  9. read_entire_file :: proc(name: string) -> (data: []byte, success: bool) {
  10. fd, err := open(name, O_RDONLY, 0);
  11. if err != 0 {
  12. return nil, false;
  13. }
  14. defer close(fd);
  15. length: i64;
  16. if length, err = file_size(fd); err != 0 {
  17. return nil, false;
  18. }
  19. if length <= 0 {
  20. return nil, true;
  21. }
  22. data = make([]byte, int(length));
  23. if data == nil {
  24. return nil, false;
  25. }
  26. bytes_read, read_err := read(fd, data);
  27. if read_err != 0 {
  28. delete(data);
  29. return nil, false;
  30. }
  31. return data[0:bytes_read], true;
  32. }
  33. write_entire_file :: proc(name: string, data: []byte, truncate := true) -> (success: bool) {
  34. flags: int = O_WRONLY|O_CREATE;
  35. if truncate {
  36. flags |= O_TRUNC;
  37. }
  38. fd, err := open(name, flags, 0);
  39. if err != 0 {
  40. return false;
  41. }
  42. defer close(fd);
  43. _, write_err := write(fd, data);
  44. return write_err == 0;
  45. }
  46. write_ptr :: proc(fd: Handle, data: rawptr, len: int) -> (int, Errno) {
  47. s := transmute([]byte)mem.Raw_Slice{data, len};
  48. return write(fd, s);
  49. }
  50. read_ptr :: proc(fd: Handle, data: rawptr, len: int) -> (int, Errno) {
  51. s := transmute([]byte)mem.Raw_Slice{data, len};
  52. return read(fd, s);
  53. }
  54. heap_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode,
  55. size, alignment: int,
  56. old_memory: rawptr, old_size: int, flags: u64 = 0, loc := #caller_location) -> rawptr {
  57. using mem.Allocator_Mode;
  58. switch mode {
  59. case Alloc:
  60. return heap_alloc(size);
  61. case Free:
  62. heap_free(old_memory);
  63. return nil;
  64. case Free_All:
  65. // NOTE(bill): Does nothing
  66. case Resize:
  67. ptr := heap_resize(old_memory, size);
  68. assert(ptr != nil);
  69. return ptr;
  70. }
  71. return nil;
  72. }
  73. heap_allocator :: proc() -> mem.Allocator {
  74. return mem.Allocator{
  75. procedure = heap_allocator_proc,
  76. data = nil,
  77. };
  78. }