@salang/sa 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/bin/sa.js +19 -1
  2. package/package.json +8 -7
  3. package/sa_std/alloc/layout.sal +12 -0
  4. package/sa_std/alloc/prelude.sa +1 -0
  5. package/sa_std/alloc/prelude.sal +1 -0
  6. package/sa_std/alloc/string.sa +3 -0
  7. package/sa_std/alloc/vec.sa +684 -0
  8. package/sa_std/alloc/vec.sal +4 -0
  9. package/sa_std/any.sa +130 -0
  10. package/sa_std/any.sal +23 -0
  11. package/sa_std/array.sa +1876 -0
  12. package/sa_std/ascii.sa +2 -0
  13. package/sa_std/ascii.sal +1 -0
  14. package/sa_std/async.sla +116 -0
  15. package/sa_std/binary_heap.sa +3003 -0
  16. package/sa_std/binary_heap.sal +7 -0
  17. package/sa_std/borrow.sa +171 -0
  18. package/sa_std/borrow.sal +13 -0
  19. package/sa_std/btree_map.sa +2210 -0
  20. package/sa_std/btree_map.sal +11 -0
  21. package/sa_std/btree_set.sa +1072 -0
  22. package/sa_std/btree_set.sal +6 -0
  23. package/sa_std/char.sa +1309 -0
  24. package/sa_std/char.sal +50 -0
  25. package/sa_std/cmp.sa +554 -0
  26. package/sa_std/cmp.sal +14 -0
  27. package/sa_std/collections/binary_heap.sa +1 -0
  28. package/sa_std/collections/btree_map.sa +1 -0
  29. package/sa_std/collections/btree_set.sa +1 -0
  30. package/sa_std/collections/hashmap.sa +1 -0
  31. package/sa_std/collections/hashset.sa +1 -0
  32. package/sa_std/collections/linked_list.sa +1120 -0
  33. package/sa_std/collections/linked_list.sal +10 -0
  34. package/sa_std/collections/prelude.sa +7 -0
  35. package/sa_std/collections/prelude.sal +1 -0
  36. package/sa_std/collections/vec_deque.sa +1 -0
  37. package/sa_std/collections.sal +13 -0
  38. package/sa_std/convert.sa +1115 -0
  39. package/sa_std/convert.sal +24 -0
  40. package/sa_std/core/arc.sa +233 -0
  41. package/sa_std/core/arc.sal +4 -0
  42. package/sa_std/core/ascii.sa +784 -0
  43. package/sa_std/core/ascii.sal +34 -0
  44. package/sa_std/core/bit.sa +41 -0
  45. package/sa_std/core/box.sa +1 -0
  46. package/sa_std/core/box.sal +2 -0
  47. package/sa_std/core/cell.sa +108 -0
  48. package/sa_std/core/cell.sal +5 -0
  49. package/sa_std/core/cleanup.sa +26 -0
  50. package/sa_std/core/control.sa +20 -0
  51. package/sa_std/core/derive.sa +60 -0
  52. package/sa_std/core/derive.sal +1 -0
  53. package/sa_std/core/dispatch.sa +7 -0
  54. package/sa_std/core/dispatch.sal +5 -0
  55. package/sa_std/core/future.sa +777 -0
  56. package/sa_std/core/future.sal +73 -0
  57. package/sa_std/core/hash.sa +48 -0
  58. package/sa_std/core/iter.sa +2805 -0
  59. package/sa_std/core/iter.sal +4 -0
  60. package/sa_std/core/loop.sa +60 -0
  61. package/sa_std/core/mem.sa +220 -0
  62. package/sa_std/core/option.sa +825 -0
  63. package/sa_std/core/option.sal +11 -0
  64. package/sa_std/core/panic.sa +23 -0
  65. package/sa_std/core/panic.sal +12 -0
  66. package/sa_std/core/prelude.sa +18 -0
  67. package/sa_std/core/prelude.sal +18 -0
  68. package/sa_std/core/rc.sa +225 -0
  69. package/sa_std/core/rc.sal +4 -0
  70. package/sa_std/core/refcell.sa +283 -0
  71. package/sa_std/core/refcell.sal +13 -0
  72. package/sa_std/core/result.sa +708 -0
  73. package/sa_std/core/result.sal +6 -0
  74. package/sa_std/core/rust_patterns.sal +295 -0
  75. package/sa_std/core/sa_core.sa +84 -0
  76. package/sa_std/core/slice.sa +4021 -0
  77. package/sa_std/core/slice.sal +7 -0
  78. package/sa_std/core/task.sa +112 -0
  79. package/sa_std/core/task.sal +15 -0
  80. package/sa_std/core/trait_object.sa +26 -0
  81. package/sa_std/core/trait_object.sal +4 -0
  82. package/sa_std/core/waker.sa +289 -0
  83. package/sa_std/core/waker.sal +31 -0
  84. package/sa_std/core/weak.sa +2 -0
  85. package/sa_std/core/weak.sal +4 -0
  86. package/sa_std/cow.sa +3 -0
  87. package/sa_std/cow.sal +2 -0
  88. package/sa_std/cstring.sa +3 -0
  89. package/sa_std/cstring.sal +2 -0
  90. package/sa_std/default.sa +99 -0
  91. package/sa_std/duration.sa +3 -0
  92. package/sa_std/duration.sal +2 -0
  93. package/sa_std/encoding/json.sa +259 -0
  94. package/sa_std/encoding/json.sai +54 -0
  95. package/sa_std/encoding/json.sal +35 -0
  96. package/sa_std/encoding/prelude.sa +1 -0
  97. package/sa_std/encoding/prelude.sal +0 -0
  98. package/sa_std/env.sa +390 -0
  99. package/sa_std/env.sai +25 -0
  100. package/sa_std/error.sa +253 -0
  101. package/sa_std/error.sal +44 -0
  102. package/sa_std/ffi/cstring.sa +3 -0
  103. package/sa_std/ffi/cstring.sal +1 -0
  104. package/sa_std/ffi/prelude.sa +2 -0
  105. package/sa_std/ffi/prelude.sal +2 -0
  106. package/sa_std/ffi.sa +635 -0
  107. package/sa_std/ffi.sal +51 -0
  108. package/sa_std/fmt.sa +2 -0
  109. package/sa_std/fmt.sai +18 -0
  110. package/sa_std/fmt.sal +35 -0
  111. package/sa_std/fs.sa +1023 -0
  112. package/sa_std/fs.sai +127 -0
  113. package/sa_std/fs.sal +51 -0
  114. package/sa_std/future.sa +2 -0
  115. package/sa_std/future.sal +1 -0
  116. package/sa_std/hash.sa +1486 -0
  117. package/sa_std/hash.sal +13 -0
  118. package/sa_std/hashmap.sa +1962 -0
  119. package/sa_std/hashmap.sal +20 -0
  120. package/sa_std/hashset.sa +1004 -0
  121. package/sa_std/hashset.sal +18 -0
  122. package/sa_std/http2.sa +78 -0
  123. package/sa_std/http2.sai +26 -0
  124. package/sa_std/http2.sal +36 -0
  125. package/sa_std/instant.sa +3 -0
  126. package/sa_std/instant.sal +2 -0
  127. package/sa_std/io/buf_reader.sa +43 -0
  128. package/sa_std/io/buf_writer.sa +35 -0
  129. package/sa_std/io/bufio.sa +4 -0
  130. package/sa_std/io/bufio.sal +4 -0
  131. package/sa_std/io/prelude.sa +1 -0
  132. package/sa_std/io/prelude.sal +1 -0
  133. package/sa_std/io/print.sa +2 -0
  134. package/sa_std/io/print.sai +3 -0
  135. package/sa_std/io.sa +925 -0
  136. package/sa_std/io.sai +25 -0
  137. package/sa_std/io.sal +84 -0
  138. package/sa_std/iter.sa +2 -0
  139. package/sa_std/iter.sal +1 -0
  140. package/sa_std/join_handle.sa +3 -0
  141. package/sa_std/join_handle.sal +2 -0
  142. package/sa_std/libsa_async.sa +80 -0
  143. package/sa_std/m_async.sa +137 -0
  144. package/sa_std/m_async.sal +30 -0
  145. package/sa_std/m_async.sla +2 -0
  146. package/sa_std/manually_drop.sa +3 -0
  147. package/sa_std/manually_drop.sal +2 -0
  148. package/sa_std/marker/phantom_data.sa +3 -0
  149. package/sa_std/marker/phantom_data.sal +1 -0
  150. package/sa_std/marker/prelude.sa +4 -0
  151. package/sa_std/marker/prelude.sal +4 -0
  152. package/sa_std/marker.sa +220 -0
  153. package/sa_std/marker.sal +15 -0
  154. package/sa_std/math.sa +84 -0
  155. package/sa_std/math.sai +10 -0
  156. package/sa_std/mem/manually_drop.sa +3 -0
  157. package/sa_std/mem/manually_drop.sal +1 -0
  158. package/sa_std/mem/prelude.sa +2 -0
  159. package/sa_std/mem/prelude.sal +2 -0
  160. package/sa_std/mem.sa +564 -0
  161. package/sa_std/mem.sal +40 -0
  162. package/sa_std/modstate.sai +19 -0
  163. package/sa_std/net.sa +4227 -0
  164. package/sa_std/net.sai +239 -0
  165. package/sa_std/net.sal +159 -0
  166. package/sa_std/netx.sa +85 -0
  167. package/sa_std/netx.sai +11 -0
  168. package/sa_std/netx.sal +39 -0
  169. package/sa_std/nonzero.sa +3 -0
  170. package/sa_std/nonzero.sal +2 -0
  171. package/sa_std/num/nonzero.sa +3 -0
  172. package/sa_std/num/nonzero.sal +1 -0
  173. package/sa_std/num/prelude.sa +3 -0
  174. package/sa_std/num/prelude.sal +3 -0
  175. package/sa_std/num.sa +17302 -0
  176. package/sa_std/num.sai +11 -0
  177. package/sa_std/num.sal +341 -0
  178. package/sa_std/ops.sa +1884 -0
  179. package/sa_std/ops.sal +68 -0
  180. package/sa_std/option.sa +2 -0
  181. package/sa_std/option.sal +1 -0
  182. package/sa_std/os/fd.sa +96 -0
  183. package/sa_std/os/fd.sai +7 -0
  184. package/sa_std/os/fd.sal +11 -0
  185. package/sa_std/os/prelude.sa +2 -0
  186. package/sa_std/os/prelude.sal +1 -0
  187. package/sa_std/os/unix_ffi.sa +271 -0
  188. package/sa_std/panic.sa +1 -0
  189. package/sa_std/panic.sal +1 -0
  190. package/sa_std/path.sa +3170 -0
  191. package/sa_std/path.sal +12 -0
  192. package/sa_std/phantom_data.sa +3 -0
  193. package/sa_std/phantom_data.sal +2 -0
  194. package/sa_std/pin.sa +79 -0
  195. package/sa_std/pin.sal +5 -0
  196. package/sa_std/plugin_async.sa +90 -0
  197. package/sa_std/plugin_async.sal +29 -0
  198. package/sa_std/plugin_async.sla +4 -0
  199. package/sa_std/plugin_http_async.sa +46 -0
  200. package/sa_std/plugin_http_server.sa +61 -0
  201. package/sa_std/plugin_http_server.sla +2 -0
  202. package/sa_std/plugin_sqlite.sa +106 -0
  203. package/sa_std/plugin_sqlite.sla +2 -0
  204. package/sa_std/prelude.sa +60 -0
  205. package/sa_std/prelude.sal +55 -0
  206. package/sa_std/process.sa +916 -0
  207. package/sa_std/process.sai +57 -0
  208. package/sa_std/process.sal +27 -0
  209. package/sa_std/ptr.sa +503 -0
  210. package/sa_std/ptr.sal +2 -0
  211. package/sa_std/result.sa +2 -0
  212. package/sa_std/result.sal +1 -0
  213. package/sa_std/rust_core.sa +51 -0
  214. package/sa_std/rust_core.sal +26 -0
  215. package/sa_std/sa.mod +7 -0
  216. package/sa_std/sort.sa +156 -0
  217. package/sa_std/str.sla +13 -0
  218. package/sa_std/string.sa +12240 -0
  219. package/sa_std/string.sai +25 -0
  220. package/sa_std/string.sal +17 -0
  221. package/sa_std/string_format.sa +269 -0
  222. package/sa_std/sync/atomic.sa +1500 -0
  223. package/sa_std/sync/atomic.sal +45 -0
  224. package/sa_std/sync/barrier.sa +105 -0
  225. package/sa_std/sync/barrier.sal +7 -0
  226. package/sa_std/sync/condvar.sa +240 -0
  227. package/sa_std/sync/condvar.sal +4 -0
  228. package/sa_std/sync/mpsc.sa +758 -0
  229. package/sa_std/sync/mpsc.sal +42 -0
  230. package/sa_std/sync/mpsc_list.sa +255 -0
  231. package/sa_std/sync/mpsc_list.sal +3 -0
  232. package/sa_std/sync/mutex.sa +182 -0
  233. package/sa_std/sync/mutex.sal +7 -0
  234. package/sa_std/sync/once.sa +371 -0
  235. package/sa_std/sync/once.sal +31 -0
  236. package/sa_std/sync/poison.sa +36 -0
  237. package/sa_std/sync/poison.sal +11 -0
  238. package/sa_std/sync/prelude.sa +8 -0
  239. package/sa_std/sync/prelude.sal +7 -0
  240. package/sa_std/sync/rwlock.sa +369 -0
  241. package/sa_std/sync/rwlock.sal +13 -0
  242. package/sa_std/task.sa +2 -0
  243. package/sa_std/task.sal +1 -0
  244. package/sa_std/term.sa +2 -0
  245. package/sa_std/term.sai +10 -0
  246. package/sa_std/term.sal +33 -0
  247. package/sa_std/testing/assert.sai +4 -0
  248. package/sa_std/testing/mock_io.sa +174 -0
  249. package/sa_std/testing/mock_io.sal +5 -0
  250. package/sa_std/testing/prelude.sa +2 -0
  251. package/sa_std/testing/prelude.sal +1 -0
  252. package/sa_std/text/prelude.sa +1 -0
  253. package/sa_std/text/prelude.sal +1 -0
  254. package/sa_std/text/regex.sa +2 -0
  255. package/sa_std/text/regex.sai +9 -0
  256. package/sa_std/text/regex.sal +33 -0
  257. package/sa_std/thread/join_handle.sa +3 -0
  258. package/sa_std/thread/join_handle.sal +1 -0
  259. package/sa_std/thread/prelude.sa +4 -0
  260. package/sa_std/thread/prelude.sal +3 -0
  261. package/sa_std/thread.sa +160 -0
  262. package/sa_std/thread.sai +11 -0
  263. package/sa_std/thread.sal +4 -0
  264. package/sa_std/thread_local.sa +45 -0
  265. package/sa_std/thread_local.sai +9 -0
  266. package/sa_std/time/duration.sa +3 -0
  267. package/sa_std/time/duration.sal +1 -0
  268. package/sa_std/time/instant.sa +3 -0
  269. package/sa_std/time/instant.sal +1 -0
  270. package/sa_std/time/prelude.sa +4 -0
  271. package/sa_std/time/prelude.sal +4 -0
  272. package/sa_std/time.sa +850 -0
  273. package/sa_std/time.sai +37 -0
  274. package/sa_std/time.sal +35 -0
  275. package/sa_std/time.sla +67 -0
  276. package/sa_std/tls_client.sai +39 -0
  277. package/sa_std/vec.sa +5754 -0
  278. package/sa_std/vec.sal +1 -0
  279. package/sa_std/vec_deque.sa +4925 -0
  280. package/sa_std/vec_deque.sal +8 -0
  281. package/sa_std/vec_runtime_macros.sa +11 -0
  282. package/sa_std/ws_client.sai +57 -0
package/sa_std/fs.sa ADDED
@@ -0,0 +1,1023 @@
1
+ @import "fs.sal"
2
+ @import "fs.sai"
3
+ @import "os/fd.sa"
4
+
5
+ [MACRO] FS_OPEN_READ %out_status, %out_file, %path, %path_len
6
+ __fs_open_read_handle_%out_status = alloc 8
7
+ %out_status = call @sa_std_fs_open_read(&%path, %path_len, &__fs_open_read_handle_%out_status)
8
+ %out_file = load __fs_open_read_handle_%out_status+0 as u64
9
+ !__fs_open_read_handle_%out_status
10
+ [END_MACRO]
11
+
12
+ [MACRO] FS_OPEN_WRITE %out_status, %out_file, %path, %path_len, %truncate
13
+ __fs_open_write_handle_%out_status = alloc 8
14
+ %out_status = call @sa_std_fs_open_write(&%path, %path_len, %truncate, &__fs_open_write_handle_%out_status)
15
+ %out_file = load __fs_open_write_handle_%out_status+0 as u64
16
+ !__fs_open_write_handle_%out_status
17
+ [END_MACRO]
18
+
19
+ [MACRO] FS_CREATE %out_status, %out_file, %path, %path_len
20
+ EXPAND FS_OPEN_WRITE %out_status, %out_file, %path, %path_len, 1
21
+ [END_MACRO]
22
+
23
+ [MACRO] FS_OPEN_OPTIONS %out_status, %out_file, %path, %path_len, %flags, %create_mode, %custom_flags
24
+ __fs_open_options_handle_%out_status = stack_alloc 8
25
+ %out_status = call @sa_std_fs_open_options(&%path, %path_len, %flags, %create_mode, %custom_flags, &__fs_open_options_handle_%out_status)
26
+ %out_file = load __fs_open_options_handle_%out_status+0 as u64
27
+ [END_MACRO]
28
+
29
+ [MACRO] FS_OPEN_FLAGS %out_status, %out_file, %path, %path_len, %flags
30
+ EXPAND FS_OPEN_OPTIONS %out_status, %out_file, %path, %path_len, %flags, SA_FS_OPEN_MODE_DEFAULT, 0
31
+ [END_MACRO]
32
+
33
+ [MACRO] FS_CLOSE %out_status, %file
34
+ %out_status = call @sa_std_close(%file)
35
+ [END_MACRO]
36
+
37
+ [MACRO] FS_FILE_AS_RAW_FD %out_status, %out_fd, %file
38
+ EXPAND FD_AS_RAW %out_status, %out_fd, %file
39
+ [END_MACRO]
40
+
41
+ [MACRO] FS_FILE_AS_FD %out_status, %out_fd, %file
42
+ EXPAND FD_AS_RAW %out_status, %out_fd, %file
43
+ [END_MACRO]
44
+
45
+ [MACRO] FS_FILE_INTO_RAW_FD %out_status, %out_fd, %file
46
+ EXPAND FD_INTO_RAW %out_status, %out_fd, %file
47
+ [END_MACRO]
48
+
49
+ [MACRO] FS_FILE_FROM_RAW_FD %out_status, %out_file, %fd
50
+ __fs_file_from_raw_slot_%out_status = stack_alloc 8
51
+ %out_status = call @sa_std_fs_file_from_raw_fd(%fd, &__fs_file_from_raw_slot_%out_status)
52
+ %out_file = load __fs_file_from_raw_slot_%out_status+0 as u64
53
+ [END_MACRO]
54
+
55
+ [MACRO] FS_FILE_INTO_OWNED_FD %out_status, %out_fd_handle, %file
56
+ EXPAND FS_FILE_INTO_RAW_FD __fs_file_into_owned_status_%out_status, __fs_file_owned_raw_%out_status, %file
57
+ EXPAND FD_FROM_RAW %out_status, %out_fd_handle, __fs_file_owned_raw_%out_status
58
+ !__fs_file_into_owned_status_%out_status
59
+ !__fs_file_owned_raw_%out_status
60
+ [END_MACRO]
61
+
62
+ [MACRO] FS_FILE_FROM_OWNED_FD %out_status, %out_file, %fd_handle
63
+ EXPAND FD_INTO_RAW __fs_file_from_owned_status_%out_status, __fs_file_from_owned_raw_%out_status, %fd_handle
64
+ EXPAND FS_FILE_FROM_RAW_FD %out_status, %out_file, __fs_file_from_owned_raw_%out_status
65
+ !__fs_file_from_owned_status_%out_status
66
+ !__fs_file_from_owned_raw_%out_status
67
+ [END_MACRO]
68
+
69
+ [MACRO] FS_READ %out_status, %out_len, %file, %buf, %cap
70
+ __fs_read_len_%out_status = stack_alloc 8
71
+ %out_status = call @sa_std_fs_file_read(%file, &%buf, %cap, &__fs_read_len_%out_status)
72
+ %out_len = load __fs_read_len_%out_status+0 as u64
73
+ [END_MACRO]
74
+
75
+ [MACRO] FS_READ_BYTES %out_status, %out_len, %file, %buf, %cap
76
+ EXPAND FS_READ %out_status, %out_len, %file, %buf, %cap
77
+ [END_MACRO]
78
+
79
+ [MACRO] FS_READ_EXACT %out_status, %file, %buf, %len
80
+ %out_status = call @sa_fs_file_read_exact(%file, &%buf, %len)
81
+ [END_MACRO]
82
+
83
+ [MACRO] FS_READ_EXACT_BYTES %out_status, %file, %buf, %len
84
+ EXPAND FS_READ_EXACT %out_status, %file, %buf, %len
85
+ [END_MACRO]
86
+
87
+ [MACRO] FS_READ_AT %out_status, %out_len, %file, %buf, %cap, %offset
88
+ __fs_read_at_len_%out_status = stack_alloc 8
89
+ %out_status = call @sa_std_fs_file_read_at(%file, &%buf, %cap, %offset, &__fs_read_at_len_%out_status)
90
+ %out_len = load __fs_read_at_len_%out_status+0 as u64
91
+ [END_MACRO]
92
+
93
+ [MACRO] FS_READ_AT_BYTES %out_status, %out_len, %file, %buf, %cap, %offset
94
+ EXPAND FS_READ_AT %out_status, %out_len, %file, %buf, %cap, %offset
95
+ [END_MACRO]
96
+
97
+ [MACRO] FS_READ_EXACT_AT %out_status, %file, %buf, %len, %offset
98
+ %out_status = call @sa_std_fs_file_read_exact_at(%file, &%buf, %len, %offset)
99
+ [END_MACRO]
100
+
101
+ [MACRO] FS_READ_EXACT_AT_BYTES %out_status, %file, %buf, %len, %offset
102
+ EXPAND FS_READ_EXACT_AT %out_status, %file, %buf, %len, %offset
103
+ [END_MACRO]
104
+
105
+ [MACRO] FS_WRITE %out_status, %out_len, %file, %buf, %len
106
+ __fs_write_len_%out_status = stack_alloc 8
107
+ %out_status = call @sa_std_fs_file_write(%file, &%buf, %len, &__fs_write_len_%out_status)
108
+ %out_len = load __fs_write_len_%out_status+0 as u64
109
+ [END_MACRO]
110
+
111
+ [MACRO] FS_WRITE_BYTES %out_status, %out_len, %file, %buf, %len
112
+ EXPAND FS_WRITE %out_status, %out_len, %file, %buf, %len
113
+ [END_MACRO]
114
+
115
+ [MACRO] FS_WRITE_ALL %out_status, %file, %buf, %len
116
+ %out_status = call @sa_fs_file_write_all(%file, &%buf, %len)
117
+ [END_MACRO]
118
+
119
+ [MACRO] FS_WRITE_ALL_BYTES %out_status, %file, %buf, %len
120
+ EXPAND FS_WRITE_ALL %out_status, %file, %buf, %len
121
+ [END_MACRO]
122
+
123
+ [MACRO] FS_WRITE_AT %out_status, %out_len, %file, %buf, %len, %offset
124
+ __fs_write_at_len_%out_status = stack_alloc 8
125
+ %out_status = call @sa_std_fs_file_write_at(%file, &%buf, %len, %offset, &__fs_write_at_len_%out_status)
126
+ %out_len = load __fs_write_at_len_%out_status+0 as u64
127
+ [END_MACRO]
128
+
129
+ [MACRO] FS_WRITE_AT_BYTES %out_status, %out_len, %file, %buf, %len, %offset
130
+ EXPAND FS_WRITE_AT %out_status, %out_len, %file, %buf, %len, %offset
131
+ [END_MACRO]
132
+
133
+ [MACRO] FS_WRITE_ALL_AT %out_status, %file, %buf, %len, %offset
134
+ %out_status = call @sa_std_fs_file_write_all_at(%file, &%buf, %len, %offset)
135
+ [END_MACRO]
136
+
137
+ [MACRO] FS_WRITE_ALL_AT_BYTES %out_status, %file, %buf, %len, %offset
138
+ EXPAND FS_WRITE_ALL_AT %out_status, %file, %buf, %len, %offset
139
+ [END_MACRO]
140
+
141
+ [MACRO] FS_FLUSH %out_status, %file
142
+ %out_status = call @sa_fs_file_flush(%file)
143
+ [END_MACRO]
144
+
145
+ [MACRO] FS_SYNC_DATA %out_status, %file
146
+ %out_status = call @sa_fs_file_sync_data(%file)
147
+ [END_MACRO]
148
+
149
+ [MACRO] FS_SYNC_ALL %out_status, %file
150
+ %out_status = call @sa_fs_file_sync(%file)
151
+ [END_MACRO]
152
+
153
+ [MACRO] FS_SET_LEN %out_status, %file, %len
154
+ %out_status = call @sa_fs_file_truncate(%file, %len)
155
+ [END_MACRO]
156
+
157
+ [MACRO] FS_SEEK %out_status, %out_pos, %file, %whence, %offset
158
+ __fs_seek_pos_%out_status = stack_alloc 8
159
+ %out_status = call @sa_std_fs_file_seek(%file, %whence, %offset, &__fs_seek_pos_%out_status)
160
+ %out_pos = load __fs_seek_pos_%out_status+0 as u64
161
+ [END_MACRO]
162
+
163
+ [MACRO] FS_REWIND %out_status, %file
164
+ __fs_rewind_pos_%out_status = stack_alloc 8
165
+ %out_status = call @sa_std_fs_file_seek(%file, SA_FS_SEEK_START, 0, &__fs_rewind_pos_%out_status)
166
+ [END_MACRO]
167
+
168
+ [MACRO] FS_READ_FILE %out_status, %out_buffer, %path, %path_len, %max_bytes
169
+ __fs_read_file_handle_%out_status = stack_alloc 8
170
+ %out_status = call @sa_std_fs_read_file(&%path, %path_len, %max_bytes, &__fs_read_file_handle_%out_status)
171
+ %out_buffer = load __fs_read_file_handle_%out_status+0 as u64
172
+ [END_MACRO]
173
+
174
+ [MACRO] FS_READ_FILE_BYTES %out_status, %out_buffer, %path, %path_len, %max_bytes
175
+ EXPAND FS_READ_FILE %out_status, %out_buffer, %path, %path_len, %max_bytes
176
+ [END_MACRO]
177
+
178
+ [MACRO] FS_READ_TO_STRING %out_status, %out_buffer, %path, %path_len, %max_bytes
179
+ __fs_read_to_string_handle_%out_status = stack_alloc 8
180
+ %out_status = call @sa_std_fs_read_to_string(&%path, %path_len, %max_bytes, &__fs_read_to_string_handle_%out_status)
181
+ %out_buffer = load __fs_read_to_string_handle_%out_status+0 as u64
182
+ [END_MACRO]
183
+
184
+ [MACRO] FS_WRITE_FILE %out_status, %path, %path_len, %buf, %len
185
+ %out_status = call @sa_fs_write_file(&%path, %path_len, &%buf, %len)
186
+ [END_MACRO]
187
+
188
+ [MACRO] FS_WRITE_FILE_BYTES %out_status, %path, %path_len, %buf, %len
189
+ EXPAND FS_WRITE_FILE %out_status, %path, %path_len, %buf, %len
190
+ [END_MACRO]
191
+
192
+ [MACRO] FS_READ_BUFFER_DATA %out_ptr, %buffer
193
+ %out_ptr = call @sa_fs_read_buffer_data(%buffer)
194
+ [END_MACRO]
195
+
196
+ [MACRO] FS_READ_BUFFER_LEN %out_len, %buffer
197
+ %out_len = call @sa_fs_read_buffer_len(%buffer)
198
+ [END_MACRO]
199
+
200
+ [MACRO] FS_READ_BUFFER_FREE %out_status, %buffer
201
+ %out_status = call @sa_fs_read_buffer_free(^%buffer)
202
+ [END_MACRO]
203
+
204
+ [MACRO] FS_READ_FILE_BASE64 %out_status, %out_buffer, %path, %path_len, %max_bytes
205
+ __fs_read_b64_handle_%out_status = stack_alloc 8
206
+ %out_status = call @sa_std_fs_read_file_base64(&%path, %path_len, %max_bytes, &__fs_read_b64_handle_%out_status)
207
+ %out_buffer = load __fs_read_b64_handle_%out_status+0 as u64
208
+ [END_MACRO]
209
+
210
+ [MACRO] FS_WRITE_FILE_BASE64 %out_status, %path, %path_len, %buf, %len
211
+ %out_status = call @sa_fs_write_file_base64(&%path, %path_len, &%buf, %len)
212
+ [END_MACRO]
213
+
214
+ [MACRO] FS_READ_DIR_JSON %out_status, %out_buffer, %path, %path_len, %max_entries
215
+ __fs_read_dir_handle_%out_status = stack_alloc 8
216
+ %out_status = call @sa_std_fs_read_dir_json(&%path, %path_len, %max_entries, &__fs_read_dir_handle_%out_status)
217
+ %out_buffer = load __fs_read_dir_handle_%out_status+0 as u64
218
+ [END_MACRO]
219
+
220
+ [MACRO] FS_DIR_BUFFER_DATA %out_ptr, %buffer
221
+ %out_ptr = call @sa_fs_dir_buffer_data(%buffer)
222
+ [END_MACRO]
223
+
224
+ [MACRO] FS_DIR_BUFFER_LEN %out_len, %buffer
225
+ %out_len = call @sa_fs_dir_buffer_len(%buffer)
226
+ [END_MACRO]
227
+
228
+ [MACRO] FS_DIR_BUFFER_FREE %out_status, %buffer
229
+ %out_status = call @sa_fs_dir_buffer_free(^%buffer)
230
+ [END_MACRO]
231
+
232
+ [MACRO] FS_READ_DIR_ENTRIES %out_status, %out_entries, %path, %path_len, %max_entries
233
+ __fs_read_dir_entries_handle_%out_status = stack_alloc 8
234
+ %out_status = call @sa_std_fs_read_dir_entries(&%path, %path_len, %max_entries, &__fs_read_dir_entries_handle_%out_status)
235
+ %out_entries = load __fs_read_dir_entries_handle_%out_status+0 as u64
236
+ [END_MACRO]
237
+
238
+ [MACRO] FS_DIR_ENTRIES_LEN %out_len, %entries
239
+ %out_len = call @sa_fs_dir_entries_len(%entries)
240
+ [END_MACRO]
241
+
242
+ [MACRO] FS_DIR_ENTRIES_GET %out_status, %out_entry, %entries, %index
243
+ __fs_dir_entry_handle_%out_status = stack_alloc 8
244
+ %out_status = call @sa_std_fs_dir_entries_get(%entries, %index, &__fs_dir_entry_handle_%out_status)
245
+ %out_entry = load __fs_dir_entry_handle_%out_status+0 as u64
246
+ [END_MACRO]
247
+
248
+ [MACRO] FS_DIR_ENTRIES_FREE %out_status, %entries
249
+ %out_status = call @sa_fs_dir_entries_free(^%entries)
250
+ [END_MACRO]
251
+
252
+ [MACRO] FS_DIR_ENTRY_NAME_PTR %out_ptr, %entry
253
+ %out_ptr = call @sa_fs_dir_entry_name_ptr(%entry)
254
+ [END_MACRO]
255
+
256
+ [MACRO] FS_DIR_ENTRY_NAME_LEN %out_len, %entry
257
+ %out_len = call @sa_fs_dir_entry_name_len(%entry)
258
+ [END_MACRO]
259
+
260
+ [MACRO] FS_DIR_ENTRY_FILE_NAME_REF_PTR %out_ptr, %entry
261
+ %out_ptr = call @sa_fs_dir_entry_file_name_ptr(%entry)
262
+ [END_MACRO]
263
+
264
+ [MACRO] FS_DIR_ENTRY_FILE_NAME_REF_LEN %out_len, %entry
265
+ %out_len = call @sa_fs_dir_entry_file_name_len(%entry)
266
+ [END_MACRO]
267
+
268
+ [MACRO] FS_DIR_ENTRY_KIND %out_kind, %entry
269
+ %out_kind = call @sa_fs_dir_entry_kind(%entry)
270
+ [END_MACRO]
271
+
272
+ [MACRO] FS_DIR_ENTRY_INO %out_ino, %entry
273
+ %out_ino = call @sa_fs_dir_entry_ino(%entry)
274
+ [END_MACRO]
275
+
276
+ [MACRO] FS_DIR_ENTRY_FREE %out_status, %entry
277
+ %out_status = call @sa_fs_dir_entry_free(^%entry)
278
+ [END_MACRO]
279
+
280
+ [MACRO] FS_METADATA %out_status, %out_metadata, %path, %path_len
281
+ __fs_metadata_handle_%out_status = stack_alloc 8
282
+ %out_status = call @sa_std_fs_metadata(&%path, %path_len, &__fs_metadata_handle_%out_status)
283
+ %out_metadata = load __fs_metadata_handle_%out_status+0 as u64
284
+ [END_MACRO]
285
+
286
+ [MACRO] FS_METADATA_JSON %out_status, %out_buffer, %path, %path_len
287
+ __fs_metadata_json_handle_%out_status = stack_alloc 8
288
+ %out_status = call @sa_std_fs_metadata_json(&%path, %path_len, &__fs_metadata_json_handle_%out_status)
289
+ %out_buffer = load __fs_metadata_json_handle_%out_status+0 as u64
290
+ [END_MACRO]
291
+
292
+ [MACRO] FS_METADATA_IS_FILE %out_flag, %metadata
293
+ %out_flag = call @sa_fs_metadata_is_file(%metadata)
294
+ [END_MACRO]
295
+
296
+ [MACRO] FS_METADATA_IS_DIR %out_flag, %metadata
297
+ %out_flag = call @sa_fs_metadata_is_directory(%metadata)
298
+ [END_MACRO]
299
+
300
+ [MACRO] FS_METADATA_IS_SYMLINK %out_flag, %metadata
301
+ %out_flag = call @sa_fs_metadata_is_symlink(%metadata)
302
+ [END_MACRO]
303
+
304
+ [MACRO] FS_METADATA_IS_BLOCK_DEVICE %out_flag, %metadata
305
+ %out_flag = call @sa_fs_metadata_is_block_device(%metadata)
306
+ [END_MACRO]
307
+
308
+ [MACRO] FS_METADATA_IS_CHAR_DEVICE %out_flag, %metadata
309
+ %out_flag = call @sa_fs_metadata_is_char_device(%metadata)
310
+ [END_MACRO]
311
+
312
+ [MACRO] FS_METADATA_IS_FIFO %out_flag, %metadata
313
+ %out_flag = call @sa_fs_metadata_is_fifo(%metadata)
314
+ [END_MACRO]
315
+
316
+ [MACRO] FS_METADATA_IS_SOCKET %out_flag, %metadata
317
+ %out_flag = call @sa_fs_metadata_is_socket(%metadata)
318
+ [END_MACRO]
319
+
320
+ [MACRO] FS_METADATA_MODIFIED_MS %out_ms, %metadata
321
+ %out_ms = call @sa_fs_metadata_modified_ms(%metadata)
322
+ [END_MACRO]
323
+
324
+ [MACRO] FS_METADATA_CREATED_MS %out_ms, %metadata
325
+ %out_ms = call @sa_fs_metadata_created_ms(%metadata)
326
+ [END_MACRO]
327
+
328
+ [MACRO] FS_METADATA_ACCESSED_MS %out_ms, %metadata
329
+ %out_ms = call @sa_fs_metadata_accessed_ms(%metadata)
330
+ [END_MACRO]
331
+
332
+ [MACRO] FS_METADATA_CHANGED_MS %out_ms, %metadata
333
+ %out_ms = call @sa_fs_metadata_changed_ms(%metadata)
334
+ [END_MACRO]
335
+
336
+ [MACRO] FS_METADATA_LEN %out_len, %metadata
337
+ %out_len = call @sa_fs_metadata_len(%metadata)
338
+ [END_MACRO]
339
+
340
+ [MACRO] FS_METADATA_MODE %out_mode, %metadata
341
+ %out_mode = call @sa_fs_metadata_mode(%metadata)
342
+ [END_MACRO]
343
+
344
+ [MACRO] FS_METADATA_UID %out_uid, %metadata
345
+ %out_uid = call @sa_fs_metadata_uid(%metadata)
346
+ [END_MACRO]
347
+
348
+ [MACRO] FS_METADATA_GID %out_gid, %metadata
349
+ %out_gid = call @sa_fs_metadata_gid(%metadata)
350
+ [END_MACRO]
351
+
352
+ [MACRO] FS_METADATA_INO %out_ino, %metadata
353
+ %out_ino = call @sa_fs_metadata_ino(%metadata)
354
+ [END_MACRO]
355
+
356
+ [MACRO] FS_METADATA_DEV %out_dev, %metadata
357
+ %out_dev = call @sa_fs_metadata_dev(%metadata)
358
+ [END_MACRO]
359
+
360
+ [MACRO] FS_METADATA_NLINK %out_nlink, %metadata
361
+ %out_nlink = call @sa_fs_metadata_nlink(%metadata)
362
+ [END_MACRO]
363
+
364
+ [MACRO] FS_METADATA_RDEV %out_rdev, %metadata
365
+ %out_rdev = call @sa_fs_metadata_rdev(%metadata)
366
+ [END_MACRO]
367
+
368
+ [MACRO] FS_METADATA_BLKSIZE %out_blksize, %metadata
369
+ %out_blksize = call @sa_fs_metadata_blksize(%metadata)
370
+ [END_MACRO]
371
+
372
+ [MACRO] FS_METADATA_BLOCKS %out_blocks, %metadata
373
+ %out_blocks = call @sa_fs_metadata_blocks(%metadata)
374
+ [END_MACRO]
375
+
376
+ [MACRO] FS_METADATA_ST_DEV %out_dev, %metadata
377
+ %out_dev = call @sa_fs_metadata_st_dev(%metadata)
378
+ [END_MACRO]
379
+
380
+ [MACRO] FS_METADATA_ST_INO %out_ino, %metadata
381
+ %out_ino = call @sa_fs_metadata_st_ino(%metadata)
382
+ [END_MACRO]
383
+
384
+ [MACRO] FS_METADATA_ST_MODE %out_mode, %metadata
385
+ %out_mode = call @sa_fs_metadata_st_mode(%metadata)
386
+ [END_MACRO]
387
+
388
+ [MACRO] FS_METADATA_ST_NLINK %out_nlink, %metadata
389
+ %out_nlink = call @sa_fs_metadata_st_nlink(%metadata)
390
+ [END_MACRO]
391
+
392
+ [MACRO] FS_METADATA_ST_UID %out_uid, %metadata
393
+ %out_uid = call @sa_fs_metadata_st_uid(%metadata)
394
+ [END_MACRO]
395
+
396
+ [MACRO] FS_METADATA_ST_GID %out_gid, %metadata
397
+ %out_gid = call @sa_fs_metadata_st_gid(%metadata)
398
+ [END_MACRO]
399
+
400
+ [MACRO] FS_METADATA_ST_RDEV %out_rdev, %metadata
401
+ %out_rdev = call @sa_fs_metadata_st_rdev(%metadata)
402
+ [END_MACRO]
403
+
404
+ [MACRO] FS_METADATA_ST_SIZE %out_size, %metadata
405
+ %out_size = call @sa_fs_metadata_st_size(%metadata)
406
+ [END_MACRO]
407
+
408
+ [MACRO] FS_METADATA_ST_ATIME %out_sec, %metadata
409
+ %out_sec = call @sa_fs_metadata_st_atime(%metadata)
410
+ [END_MACRO]
411
+
412
+ [MACRO] FS_METADATA_ST_ATIME_NSEC %out_nsec, %metadata
413
+ %out_nsec = call @sa_fs_metadata_st_atime_nsec(%metadata)
414
+ [END_MACRO]
415
+
416
+ [MACRO] FS_METADATA_ST_MTIME %out_sec, %metadata
417
+ %out_sec = call @sa_fs_metadata_st_mtime(%metadata)
418
+ [END_MACRO]
419
+
420
+ [MACRO] FS_METADATA_ST_MTIME_NSEC %out_nsec, %metadata
421
+ %out_nsec = call @sa_fs_metadata_st_mtime_nsec(%metadata)
422
+ [END_MACRO]
423
+
424
+ [MACRO] FS_METADATA_ST_CTIME %out_sec, %metadata
425
+ %out_sec = call @sa_fs_metadata_st_ctime(%metadata)
426
+ [END_MACRO]
427
+
428
+ [MACRO] FS_METADATA_ST_CTIME_NSEC %out_nsec, %metadata
429
+ %out_nsec = call @sa_fs_metadata_st_ctime_nsec(%metadata)
430
+ [END_MACRO]
431
+
432
+ [MACRO] FS_METADATA_ST_BLKSIZE %out_blksize, %metadata
433
+ %out_blksize = call @sa_fs_metadata_st_blksize(%metadata)
434
+ [END_MACRO]
435
+
436
+ [MACRO] FS_METADATA_ST_BLOCKS %out_blocks, %metadata
437
+ %out_blocks = call @sa_fs_metadata_st_blocks(%metadata)
438
+ [END_MACRO]
439
+
440
+ [MACRO] FS_METADATA_FREE %out_status, %metadata
441
+ %out_status = call @sa_std_fs_metadata_free(%metadata)
442
+ [END_MACRO]
443
+
444
+ [MACRO] FS_CANONICALIZE %out_status, %out_buffer, %path, %path_len
445
+ __fs_canonical_handle_%out_status = stack_alloc 8
446
+ %out_status = call @sa_std_fs_canonicalize(&%path, %path_len, &__fs_canonical_handle_%out_status)
447
+ %out_buffer = load __fs_canonical_handle_%out_status+0 as u64
448
+ [END_MACRO]
449
+
450
+ [MACRO] FS_EXISTS %out_flag, %path, %path_len
451
+ __fs_exists_status_%out_flag = call @sa_std_fs_exists(&%path, %path_len)
452
+ %out_flag = eq __fs_exists_status_%out_flag, SA_FS_OK
453
+ !__fs_exists_status_%out_flag
454
+ [END_MACRO]
455
+
456
+ [MACRO] FS_TRY_EXISTS %out_status, %out_flag, %path, %path_len
457
+ __fs_try_exists_slot_%out_status = stack_alloc 1
458
+ %out_status = call @sa_std_fs_try_exists(&%path, %path_len, &__fs_try_exists_slot_%out_status)
459
+ %out_flag = load __fs_try_exists_slot_%out_status+0 as u8
460
+ [END_MACRO]
461
+
462
+ [MACRO] FS_LEN %out_status, %out_len, %path, %path_len
463
+ __fs_len_slot_%out_status = stack_alloc 8
464
+ %out_status = call @sa_std_fs_len(&%path, %path_len, &__fs_len_slot_%out_status)
465
+ %out_len = load __fs_len_slot_%out_status+0 as u64
466
+ [END_MACRO]
467
+
468
+ [MACRO] FS_REMOVE_FILE %out_status, %path, %path_len
469
+ %out_status = call @sa_fs_remove_file(&%path, %path_len)
470
+ [END_MACRO]
471
+
472
+ [MACRO] FS_REMOVE %out_status, %path, %path_len
473
+ %out_status = call @sa_std_fs_remove(&%path, %path_len)
474
+ [END_MACRO]
475
+
476
+ [MACRO] FS_REMOVE_DIR %out_status, %path, %path_len
477
+ %out_status = call @sa_fs_remove_dir(&%path, %path_len)
478
+ [END_MACRO]
479
+
480
+ [MACRO] FS_REMOVE_DIR_ALL %out_status, %path, %path_len
481
+ %out_status = call @sa_fs_remove_dir_all(&%path, %path_len)
482
+ [END_MACRO]
483
+
484
+ [MACRO] FS_REMOVE_PATH %out_status, %path, %path_len
485
+ %out_status = call @sa_fs_remove_path(&%path, %path_len)
486
+ [END_MACRO]
487
+
488
+ [MACRO] FS_RENAME %out_status, %from_path, %from_len, %to_path, %to_len
489
+ %out_status = call @sa_fs_rename(&%from_path, %from_len, &%to_path, %to_len)
490
+ [END_MACRO]
491
+
492
+ [MACRO] FS_MAKE_DIR %out_status, %path, %path_len
493
+ %out_status = call @sa_fs_make_dir(&%path, %path_len)
494
+ [END_MACRO]
495
+
496
+ [MACRO] FS_MAKE_DIR_MODE %out_status, %path, %path_len, %mode
497
+ %out_status = call @sa_fs_make_dir_mode(&%path, %path_len, %mode)
498
+ [END_MACRO]
499
+
500
+ [MACRO] FS_CREATE_DIR %out_status, %path, %path_len
501
+ %out_status = call @sa_fs_create_dir(&%path, %path_len)
502
+ [END_MACRO]
503
+
504
+ [MACRO] FS_CREATE_DIR_MODE %out_status, %path, %path_len, %mode
505
+ %out_status = call @sa_fs_create_dir_mode(&%path, %path_len, %mode)
506
+ [END_MACRO]
507
+
508
+ [MACRO] FS_CREATE_DIR_ALL %out_status, %path, %path_len
509
+ EXPAND FS_MAKE_DIR %out_status, %path, %path_len
510
+ [END_MACRO]
511
+
512
+ [MACRO] FS_CREATE_DIR_ALL_MODE %out_status, %path, %path_len, %mode
513
+ EXPAND FS_MAKE_DIR_MODE %out_status, %path, %path_len, %mode
514
+ [END_MACRO]
515
+
516
+ [MACRO] FS_COPY %out_status, %from_path, %from_len, %to_path, %to_len
517
+ %out_status = call @sa_fs_copy_file(&%from_path, %from_len, &%to_path, %to_len)
518
+ [END_MACRO]
519
+
520
+ [MACRO] FS_SET_PERMISSIONS %out_status, %path, %path_len, %mode
521
+ %out_status = call @sa_fs_set_permissions(&%path, %path_len, %mode)
522
+ [END_MACRO]
523
+
524
+ [MACRO] FS_PERMISSIONS_FROM_MODE %out_permissions, %mode
525
+ store %out_permissions+SaFsPermissions_mode, %mode as u32
526
+ [END_MACRO]
527
+
528
+ [MACRO] FS_PERMISSIONS_MODE %out_mode, %permissions
529
+ %out_mode = load %permissions+SaFsPermissions_mode as u32
530
+ [END_MACRO]
531
+
532
+ [MACRO] FS_PERMISSIONS_SET_MODE %permissions, %mode
533
+ store %permissions+SaFsPermissions_mode, %mode as u32
534
+ [END_MACRO]
535
+
536
+ // Concrete Permissions object helpers over the SaFsPermissions mode slot.
537
+ // readonly checks/clears the POSIX write bits (0222); set_readonly(false)
538
+ // sets owner-write (0200), matching Rust's Unix Permissions::set_readonly.
539
+
540
+ [MACRO] FS_PERMISSIONS_NEW %out_permissions
541
+ store %out_permissions+SaFsPermissions_mode, 0 as u32
542
+ [END_MACRO]
543
+
544
+ // Rust-style Default alias over FS_PERMISSIONS_NEW.
545
+ [MACRO] FS_PERMISSIONS_DEFAULT %out_permissions
546
+ EXPAND FS_PERMISSIONS_NEW %out_permissions
547
+ [END_MACRO]
548
+
549
+ [MACRO] FS_METADATA_PERMISSIONS %out_permissions, %metadata
550
+ __fs_meta_perm_mode_%out_permissions = call @sa_fs_metadata_st_mode(%metadata)
551
+ store %out_permissions+SaFsPermissions_mode, __fs_meta_perm_mode_%out_permissions as u32
552
+ !__fs_meta_perm_mode_%out_permissions
553
+ [END_MACRO]
554
+
555
+ [MACRO] FS_PERMISSIONS_READONLY %out_flag, %permissions
556
+ __fs_perm_mode_%out_flag = load %permissions+SaFsPermissions_mode as u32
557
+ __fs_perm_write_%out_flag = and __fs_perm_mode_%out_flag, SA_FS_PERM_WRITE_BITS
558
+ __fs_perm_is_ro_%out_flag = eq __fs_perm_write_%out_flag, 0
559
+ %out_flag = add 0, __fs_perm_is_ro_%out_flag
560
+ !__fs_perm_is_ro_%out_flag
561
+ !__fs_perm_write_%out_flag
562
+ !__fs_perm_mode_%out_flag
563
+ [END_MACRO]
564
+
565
+ [MACRO] FS_PERMISSIONS_SET_READONLY %permissions, %flag
566
+ __fs_perm_mode_%permissions = load %permissions+SaFsPermissions_mode as u32
567
+ __fs_perm_is_ro_%permissions = ne %flag, 0
568
+ __fs_perm_is_rw_%permissions = eq %flag, 0
569
+ __fs_perm_clear_bits_%permissions = mul SA_FS_PERM_WRITE_BITS, __fs_perm_is_ro_%permissions
570
+ __fs_perm_mask_%permissions = xor __fs_perm_clear_bits_%permissions, 4294967295
571
+ __fs_perm_cleared_%permissions = and __fs_perm_mode_%permissions, __fs_perm_mask_%permissions
572
+ __fs_perm_owner_bits_%permissions = mul SA_FS_PERM_OWNER_WRITE, __fs_perm_is_rw_%permissions
573
+ __fs_perm_new_mode_%permissions = or __fs_perm_cleared_%permissions, __fs_perm_owner_bits_%permissions
574
+ store %permissions+SaFsPermissions_mode, __fs_perm_new_mode_%permissions as u32
575
+ !__fs_perm_new_mode_%permissions
576
+ !__fs_perm_owner_bits_%permissions
577
+ !__fs_perm_cleared_%permissions
578
+ !__fs_perm_mask_%permissions
579
+ !__fs_perm_clear_bits_%permissions
580
+ !__fs_perm_is_rw_%permissions
581
+ !__fs_perm_is_ro_%permissions
582
+ !__fs_perm_mode_%permissions
583
+ [END_MACRO]
584
+
585
+ [MACRO] FS_SET_PERMISSIONS_OBJ %out_status, %path, %path_len, %permissions
586
+ __fs_set_perm_mode_%out_status = load %permissions+SaFsPermissions_mode as u32
587
+ %out_status = call @sa_fs_set_permissions(&%path, %path_len, __fs_set_perm_mode_%out_status)
588
+ !__fs_set_perm_mode_%out_status
589
+ [END_MACRO]
590
+
591
+ [MACRO] FS_SET_TIMES_MS %out_status, %path, %path_len, %accessed_ms, %modified_ms
592
+ %out_status = call @sa_fs_set_times_ms(&%path, %path_len, %accessed_ms, %modified_ms)
593
+ [END_MACRO]
594
+
595
+ [MACRO] FS_HARD_LINK %out_status, %from_path, %from_len, %to_path, %to_len
596
+ %out_status = call @sa_fs_hard_link(&%from_path, %from_len, &%to_path, %to_len)
597
+ [END_MACRO]
598
+
599
+ [MACRO] FS_SYMLINK %out_status, %target_path, %target_len, %link_path, %link_len
600
+ %out_status = call @sa_fs_symlink(&%target_path, %target_len, &%link_path, %link_len)
601
+ [END_MACRO]
602
+
603
+ [MACRO] FS_UNIX_SYMLINK %out_status, %target_path, %target_len, %link_path, %link_len
604
+ EXPAND FS_SYMLINK %out_status, %target_path, %target_len, %link_path, %link_len
605
+ [END_MACRO]
606
+
607
+ [MACRO] FS_CHOWN %out_status, %path, %path_len, %uid, %gid, %has_uid, %has_gid
608
+ %out_status = call @sa_fs_chown(&%path, %path_len, %uid, %gid, %has_uid, %has_gid)
609
+ [END_MACRO]
610
+
611
+ [MACRO] FS_UNIX_CHOWN %out_status, %path, %path_len, %uid, %gid, %has_uid, %has_gid
612
+ EXPAND FS_CHOWN %out_status, %path, %path_len, %uid, %gid, %has_uid, %has_gid
613
+ [END_MACRO]
614
+
615
+ [MACRO] FS_LCHOWN %out_status, %path, %path_len, %uid, %gid, %has_uid, %has_gid
616
+ %out_status = call @sa_fs_lchown(&%path, %path_len, %uid, %gid, %has_uid, %has_gid)
617
+ [END_MACRO]
618
+
619
+ [MACRO] FS_UNIX_LCHOWN %out_status, %path, %path_len, %uid, %gid, %has_uid, %has_gid
620
+ EXPAND FS_LCHOWN %out_status, %path, %path_len, %uid, %gid, %has_uid, %has_gid
621
+ [END_MACRO]
622
+
623
+ [MACRO] FS_FCHOWN %out_status, %file, %uid, %gid, %has_uid, %has_gid
624
+ %out_status = call @sa_fs_fchown(%file, %uid, %gid, %has_uid, %has_gid)
625
+ [END_MACRO]
626
+
627
+ [MACRO] FS_UNIX_FCHOWN %out_status, %file, %uid, %gid, %has_uid, %has_gid
628
+ EXPAND FS_FCHOWN %out_status, %file, %uid, %gid, %has_uid, %has_gid
629
+ [END_MACRO]
630
+
631
+ [MACRO] FS_CHOWN_RAW %out_status, %path, %path_len, %uid, %gid
632
+ __fs_chown_has_uid_%out_status = ne %uid, SA_FS_CHOWN_ID_UNCHANGED
633
+ __fs_chown_has_gid_%out_status = ne %gid, SA_FS_CHOWN_ID_UNCHANGED
634
+ %out_status = call @sa_fs_chown(&%path, %path_len, %uid, %gid, __fs_chown_has_uid_%out_status, __fs_chown_has_gid_%out_status)
635
+ !__fs_chown_has_gid_%out_status
636
+ !__fs_chown_has_uid_%out_status
637
+ [END_MACRO]
638
+
639
+ [MACRO] FS_LCHOWN_RAW %out_status, %path, %path_len, %uid, %gid
640
+ __fs_lchown_has_uid_%out_status = ne %uid, SA_FS_CHOWN_ID_UNCHANGED
641
+ __fs_lchown_has_gid_%out_status = ne %gid, SA_FS_CHOWN_ID_UNCHANGED
642
+ %out_status = call @sa_fs_lchown(&%path, %path_len, %uid, %gid, __fs_lchown_has_uid_%out_status, __fs_lchown_has_gid_%out_status)
643
+ !__fs_lchown_has_gid_%out_status
644
+ !__fs_lchown_has_uid_%out_status
645
+ [END_MACRO]
646
+
647
+ [MACRO] FS_FCHOWN_RAW %out_status, %file, %uid, %gid
648
+ __fs_fchown_has_uid_%out_status = ne %uid, SA_FS_CHOWN_ID_UNCHANGED
649
+ __fs_fchown_has_gid_%out_status = ne %gid, SA_FS_CHOWN_ID_UNCHANGED
650
+ %out_status = call @sa_fs_fchown(%file, %uid, %gid, __fs_fchown_has_uid_%out_status, __fs_fchown_has_gid_%out_status)
651
+ !__fs_fchown_has_gid_%out_status
652
+ !__fs_fchown_has_uid_%out_status
653
+ [END_MACRO]
654
+
655
+ [MACRO] FS_UNIX_FCHOWN_RAW %out_status, %file, %uid, %gid
656
+ EXPAND FS_FCHOWN_RAW %out_status, %file, %uid, %gid
657
+ [END_MACRO]
658
+
659
+ [MACRO] FS_CHROOT %out_status, %path, %path_len
660
+ %out_status = call @sa_fs_chroot(&%path, %path_len)
661
+ [END_MACRO]
662
+
663
+ [MACRO] FS_UNIX_CHROOT %out_status, %path, %path_len
664
+ EXPAND FS_CHROOT %out_status, %path, %path_len
665
+ [END_MACRO]
666
+
667
+ [MACRO] FS_MKFIFO %out_status, %path, %path_len, %mode
668
+ %out_status = call @sa_fs_mkfifo(&%path, %path_len, %mode)
669
+ [END_MACRO]
670
+
671
+ [MACRO] FS_UNIX_MKFIFO %out_status, %path, %path_len, %mode
672
+ EXPAND FS_MKFIFO %out_status, %path, %path_len, %mode
673
+ [END_MACRO]
674
+
675
+ [MACRO] FS_READ_LINK %out_status, %out_buffer, %path, %path_len
676
+ __fs_read_link_handle_%out_status = stack_alloc 8
677
+ %out_status = call @sa_std_fs_read_link(&%path, %path_len, &__fs_read_link_handle_%out_status)
678
+ %out_buffer = load __fs_read_link_handle_%out_status+0 as u64
679
+ [END_MACRO]
680
+
681
+
682
+ [MACRO] FS_DIR_BUILDER_NEW %out_recursive, %out_mode
683
+ %out_recursive = add 0, 0
684
+ %out_mode = add 0, 493
685
+ [END_MACRO]
686
+
687
+ [MACRO] FS_DIR_BUILDER_WITH_RECURSIVE %out_recursive, %out_mode, %in_recursive, %in_mode, %flag
688
+ __fs_dir_builder_flag_is_zero_%out_recursive = eq %flag, 0
689
+ br __fs_dir_builder_flag_is_zero_%out_recursive -> L_FS_DIR_BUILDER_ZERO_%out_recursive, L_FS_DIR_BUILDER_NONZERO_%out_recursive
690
+ L_FS_DIR_BUILDER_ZERO_%out_recursive:
691
+ %out_recursive = add 0, 0
692
+ %out_mode = add 0, %in_mode
693
+ !__fs_dir_builder_flag_is_zero_%out_recursive
694
+ jmp L_FS_DIR_BUILDER_WITH_RECURSIVE_END_%out_recursive
695
+ L_FS_DIR_BUILDER_NONZERO_%out_recursive:
696
+ %out_recursive = add 0, 1
697
+ %out_mode = add 0, %in_mode
698
+ !__fs_dir_builder_flag_is_zero_%out_recursive
699
+ jmp L_FS_DIR_BUILDER_WITH_RECURSIVE_END_%out_recursive
700
+ L_FS_DIR_BUILDER_WITH_RECURSIVE_END_%out_recursive:
701
+ [END_MACRO]
702
+
703
+ [MACRO] FS_DIR_BUILDER_WITH_MODE %out_recursive, %out_mode, %in_recursive, %in_mode, %new_mode
704
+ %out_recursive = add 0, %in_recursive
705
+ %out_mode = add 0, %new_mode
706
+ [END_MACRO]
707
+
708
+ [MACRO] FS_DIR_BUILDER_CREATE %out_status, %recursive, %mode, %path, %path_len
709
+ __fs_dir_builder_is_nonrecursive_%out_status = eq %recursive, 0
710
+ br __fs_dir_builder_is_nonrecursive_%out_status -> L_FS_DIR_BUILDER_NONRECURSIVE_%out_status, L_FS_DIR_BUILDER_RECURSIVE_%out_status
711
+ L_FS_DIR_BUILDER_NONRECURSIVE_%out_status:
712
+ EXPAND FS_CREATE_DIR_MODE %out_status, %path, %path_len, %mode
713
+ !__fs_dir_builder_is_nonrecursive_%out_status
714
+ jmp L_FS_DIR_BUILDER_END_%out_status
715
+ L_FS_DIR_BUILDER_RECURSIVE_%out_status:
716
+ EXPAND FS_CREATE_DIR_ALL_MODE %out_status, %path, %path_len, %mode
717
+ !__fs_dir_builder_is_nonrecursive_%out_status
718
+ jmp L_FS_DIR_BUILDER_END_%out_status
719
+ L_FS_DIR_BUILDER_END_%out_status:
720
+ [END_MACRO]
721
+
722
+
723
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_NEW %out_flags, %out_mode, %out_custom
724
+ %out_flags = add 0, 0
725
+ %out_mode = add 0, SA_FS_OPEN_MODE_DEFAULT
726
+ %out_custom = add 0, 0
727
+ [END_MACRO]
728
+
729
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_READ %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
730
+ __fs_oob_read_zero_%out_flags = eq %flag, 0
731
+ br __fs_oob_read_zero_%out_flags -> L_FS_OOB_READ_KEEP_%out_flags, L_FS_OOB_READ_OR_%out_flags
732
+ L_FS_OOB_READ_KEEP_%out_flags:
733
+ %out_flags = add 0, %in_flags
734
+ %out_mode = add 0, %in_mode
735
+ %out_custom = add 0, %in_custom
736
+ !__fs_oob_read_zero_%out_flags
737
+ jmp L_FS_OOB_READ_END_%out_flags
738
+ L_FS_OOB_READ_OR_%out_flags:
739
+ %out_flags = or %in_flags, SA_FS_OPEN_READ
740
+ %out_mode = add 0, %in_mode
741
+ %out_custom = add 0, %in_custom
742
+ !__fs_oob_read_zero_%out_flags
743
+ jmp L_FS_OOB_READ_END_%out_flags
744
+ L_FS_OOB_READ_END_%out_flags:
745
+ [END_MACRO]
746
+
747
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_WRITE %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
748
+ __fs_oob_write_zero_%out_flags = eq %flag, 0
749
+ br __fs_oob_write_zero_%out_flags -> L_FS_OOB_WRITE_KEEP_%out_flags, L_FS_OOB_WRITE_OR_%out_flags
750
+ L_FS_OOB_WRITE_KEEP_%out_flags:
751
+ %out_flags = add 0, %in_flags
752
+ %out_mode = add 0, %in_mode
753
+ %out_custom = add 0, %in_custom
754
+ !__fs_oob_write_zero_%out_flags
755
+ jmp L_FS_OOB_WRITE_END_%out_flags
756
+ L_FS_OOB_WRITE_OR_%out_flags:
757
+ %out_flags = or %in_flags, SA_FS_OPEN_WRITE
758
+ %out_mode = add 0, %in_mode
759
+ %out_custom = add 0, %in_custom
760
+ !__fs_oob_write_zero_%out_flags
761
+ jmp L_FS_OOB_WRITE_END_%out_flags
762
+ L_FS_OOB_WRITE_END_%out_flags:
763
+ [END_MACRO]
764
+
765
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_APPEND %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
766
+ __fs_oob_append_zero_%out_flags = eq %flag, 0
767
+ br __fs_oob_append_zero_%out_flags -> L_FS_OOB_APPEND_KEEP_%out_flags, L_FS_OOB_APPEND_OR_%out_flags
768
+ L_FS_OOB_APPEND_KEEP_%out_flags:
769
+ %out_flags = add 0, %in_flags
770
+ %out_mode = add 0, %in_mode
771
+ %out_custom = add 0, %in_custom
772
+ !__fs_oob_append_zero_%out_flags
773
+ jmp L_FS_OOB_APPEND_END_%out_flags
774
+ L_FS_OOB_APPEND_OR_%out_flags:
775
+ %out_flags = or %in_flags, SA_FS_OPEN_APPEND
776
+ %out_mode = add 0, %in_mode
777
+ %out_custom = add 0, %in_custom
778
+ !__fs_oob_append_zero_%out_flags
779
+ jmp L_FS_OOB_APPEND_END_%out_flags
780
+ L_FS_OOB_APPEND_END_%out_flags:
781
+ [END_MACRO]
782
+
783
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_CREATE %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
784
+ __fs_oob_create_zero_%out_flags = eq %flag, 0
785
+ br __fs_oob_create_zero_%out_flags -> L_FS_OOB_CREATE_KEEP_%out_flags, L_FS_OOB_CREATE_OR_%out_flags
786
+ L_FS_OOB_CREATE_KEEP_%out_flags:
787
+ %out_flags = add 0, %in_flags
788
+ %out_mode = add 0, %in_mode
789
+ %out_custom = add 0, %in_custom
790
+ !__fs_oob_create_zero_%out_flags
791
+ jmp L_FS_OOB_CREATE_END_%out_flags
792
+ L_FS_OOB_CREATE_OR_%out_flags:
793
+ %out_flags = or %in_flags, SA_FS_OPEN_CREATE
794
+ %out_mode = add 0, %in_mode
795
+ %out_custom = add 0, %in_custom
796
+ !__fs_oob_create_zero_%out_flags
797
+ jmp L_FS_OOB_CREATE_END_%out_flags
798
+ L_FS_OOB_CREATE_END_%out_flags:
799
+ [END_MACRO]
800
+
801
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_TRUNCATE %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
802
+ __fs_oob_truncate_zero_%out_flags = eq %flag, 0
803
+ br __fs_oob_truncate_zero_%out_flags -> L_FS_OOB_TRUNCATE_KEEP_%out_flags, L_FS_OOB_TRUNCATE_OR_%out_flags
804
+ L_FS_OOB_TRUNCATE_KEEP_%out_flags:
805
+ %out_flags = add 0, %in_flags
806
+ %out_mode = add 0, %in_mode
807
+ %out_custom = add 0, %in_custom
808
+ !__fs_oob_truncate_zero_%out_flags
809
+ jmp L_FS_OOB_TRUNCATE_END_%out_flags
810
+ L_FS_OOB_TRUNCATE_OR_%out_flags:
811
+ %out_flags = or %in_flags, SA_FS_OPEN_TRUNCATE
812
+ %out_mode = add 0, %in_mode
813
+ %out_custom = add 0, %in_custom
814
+ !__fs_oob_truncate_zero_%out_flags
815
+ jmp L_FS_OOB_TRUNCATE_END_%out_flags
816
+ L_FS_OOB_TRUNCATE_END_%out_flags:
817
+ [END_MACRO]
818
+
819
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_MODE %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %new_mode
820
+ %out_flags = add 0, %in_flags
821
+ %out_mode = add 0, %new_mode
822
+ %out_custom = add 0, %in_custom
823
+ [END_MACRO]
824
+
825
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_CUSTOM_FLAGS %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %new_custom
826
+ %out_flags = add 0, %in_flags
827
+ %out_mode = add 0, %in_mode
828
+ %out_custom = add 0, %new_custom
829
+ [END_MACRO]
830
+
831
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_OPEN %out_status, %out_file, %flags, %mode, %custom, %path, %path_len
832
+ EXPAND FS_OPEN_OPTIONS %out_status, %out_file, %path, %path_len, %flags, %mode, %custom
833
+ [END_MACRO]
834
+
835
+
836
+ [MACRO] FS_FILE_TYPE_IS_FILE %out_flag, %metadata
837
+ EXPAND FS_METADATA_IS_FILE %out_flag, %metadata
838
+ [END_MACRO]
839
+
840
+ [MACRO] FS_FILE_TYPE_IS_DIR %out_flag, %metadata
841
+ EXPAND FS_METADATA_IS_DIR %out_flag, %metadata
842
+ [END_MACRO]
843
+
844
+ [MACRO] FS_FILE_TYPE_IS_SYMLINK %out_flag, %metadata
845
+ EXPAND FS_METADATA_IS_SYMLINK %out_flag, %metadata
846
+ [END_MACRO]
847
+
848
+ [MACRO] FS_FILE_TYPE_IS_BLOCK_DEVICE %out_flag, %metadata
849
+ EXPAND FS_METADATA_IS_BLOCK_DEVICE %out_flag, %metadata
850
+ [END_MACRO]
851
+
852
+ [MACRO] FS_FILE_TYPE_IS_CHAR_DEVICE %out_flag, %metadata
853
+ EXPAND FS_METADATA_IS_CHAR_DEVICE %out_flag, %metadata
854
+ [END_MACRO]
855
+
856
+ [MACRO] FS_FILE_TYPE_IS_FIFO %out_flag, %metadata
857
+ EXPAND FS_METADATA_IS_FIFO %out_flag, %metadata
858
+ [END_MACRO]
859
+
860
+ [MACRO] FS_FILE_TYPE_IS_SOCKET %out_flag, %metadata
861
+ EXPAND FS_METADATA_IS_SOCKET %out_flag, %metadata
862
+ [END_MACRO]
863
+
864
+
865
+
866
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_SYNC %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
867
+ __fs_oob_sync_zero_%out_flags = eq %flag, 0
868
+ br __fs_oob_sync_zero_%out_flags -> L_FS_OOB_SYNC_KEEP_%out_flags, L_FS_OOB_SYNC_OR_%out_flags
869
+ L_FS_OOB_SYNC_KEEP_%out_flags:
870
+ %out_flags = add 0, %in_flags
871
+ %out_mode = add 0, %in_mode
872
+ %out_custom = add 0, %in_custom
873
+ !__fs_oob_sync_zero_%out_flags
874
+ jmp L_FS_OOB_SYNC_END_%out_flags
875
+ L_FS_OOB_SYNC_OR_%out_flags:
876
+ %out_flags = add 0, %in_flags
877
+ %out_mode = add 0, %in_mode
878
+ %out_custom = or %in_custom, SA_FS_CUSTOM_SYNC
879
+ !__fs_oob_sync_zero_%out_flags
880
+ jmp L_FS_OOB_SYNC_END_%out_flags
881
+ L_FS_OOB_SYNC_END_%out_flags:
882
+ [END_MACRO]
883
+
884
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_DSYNC %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
885
+ __fs_oob_dsync_zero_%out_flags = eq %flag, 0
886
+ br __fs_oob_dsync_zero_%out_flags -> L_FS_OOB_DSYNC_KEEP_%out_flags, L_FS_OOB_DSYNC_OR_%out_flags
887
+ L_FS_OOB_DSYNC_KEEP_%out_flags:
888
+ %out_flags = add 0, %in_flags
889
+ %out_mode = add 0, %in_mode
890
+ %out_custom = add 0, %in_custom
891
+ !__fs_oob_dsync_zero_%out_flags
892
+ jmp L_FS_OOB_DSYNC_END_%out_flags
893
+ L_FS_OOB_DSYNC_OR_%out_flags:
894
+ %out_flags = add 0, %in_flags
895
+ %out_mode = add 0, %in_mode
896
+ %out_custom = or %in_custom, SA_FS_CUSTOM_DSYNC
897
+ !__fs_oob_dsync_zero_%out_flags
898
+ jmp L_FS_OOB_DSYNC_END_%out_flags
899
+ L_FS_OOB_DSYNC_END_%out_flags:
900
+ [END_MACRO]
901
+
902
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_NONBLOCK %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
903
+ __fs_oob_nonblock_zero_%out_flags = eq %flag, 0
904
+ br __fs_oob_nonblock_zero_%out_flags -> L_FS_OOB_NONBLOCK_KEEP_%out_flags, L_FS_OOB_NONBLOCK_OR_%out_flags
905
+ L_FS_OOB_NONBLOCK_KEEP_%out_flags:
906
+ %out_flags = add 0, %in_flags
907
+ %out_mode = add 0, %in_mode
908
+ %out_custom = add 0, %in_custom
909
+ !__fs_oob_nonblock_zero_%out_flags
910
+ jmp L_FS_OOB_NONBLOCK_END_%out_flags
911
+ L_FS_OOB_NONBLOCK_OR_%out_flags:
912
+ %out_flags = add 0, %in_flags
913
+ %out_mode = add 0, %in_mode
914
+ %out_custom = or %in_custom, SA_FS_CUSTOM_NONBLOCK
915
+ !__fs_oob_nonblock_zero_%out_flags
916
+ jmp L_FS_OOB_NONBLOCK_END_%out_flags
917
+ L_FS_OOB_NONBLOCK_END_%out_flags:
918
+ [END_MACRO]
919
+
920
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_NOFOLLOW %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
921
+ __fs_oob_nofollow_zero_%out_flags = eq %flag, 0
922
+ br __fs_oob_nofollow_zero_%out_flags -> L_FS_OOB_NOFOLLOW_KEEP_%out_flags, L_FS_OOB_NOFOLLOW_OR_%out_flags
923
+ L_FS_OOB_NOFOLLOW_KEEP_%out_flags:
924
+ %out_flags = add 0, %in_flags
925
+ %out_mode = add 0, %in_mode
926
+ %out_custom = add 0, %in_custom
927
+ !__fs_oob_nofollow_zero_%out_flags
928
+ jmp L_FS_OOB_NOFOLLOW_END_%out_flags
929
+ L_FS_OOB_NOFOLLOW_OR_%out_flags:
930
+ %out_flags = add 0, %in_flags
931
+ %out_mode = add 0, %in_mode
932
+ %out_custom = or %in_custom, SA_FS_CUSTOM_NOFOLLOW
933
+ !__fs_oob_nofollow_zero_%out_flags
934
+ jmp L_FS_OOB_NOFOLLOW_END_%out_flags
935
+ L_FS_OOB_NOFOLLOW_END_%out_flags:
936
+ [END_MACRO]
937
+
938
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_DIRECT %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
939
+ __fs_oob_direct_zero_%out_flags = eq %flag, 0
940
+ br __fs_oob_direct_zero_%out_flags -> L_FS_OOB_DIRECT_KEEP_%out_flags, L_FS_OOB_DIRECT_OR_%out_flags
941
+ L_FS_OOB_DIRECT_KEEP_%out_flags:
942
+ %out_flags = add 0, %in_flags
943
+ %out_mode = add 0, %in_mode
944
+ %out_custom = add 0, %in_custom
945
+ !__fs_oob_direct_zero_%out_flags
946
+ jmp L_FS_OOB_DIRECT_END_%out_flags
947
+ L_FS_OOB_DIRECT_OR_%out_flags:
948
+ %out_flags = add 0, %in_flags
949
+ %out_mode = add 0, %in_mode
950
+ %out_custom = or %in_custom, SA_FS_CUSTOM_DIRECT
951
+ !__fs_oob_direct_zero_%out_flags
952
+ jmp L_FS_OOB_DIRECT_END_%out_flags
953
+ L_FS_OOB_DIRECT_END_%out_flags:
954
+ [END_MACRO]
955
+
956
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_DIRECTORY %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
957
+ __fs_oob_directory_zero_%out_flags = eq %flag, 0
958
+ br __fs_oob_directory_zero_%out_flags -> L_FS_OOB_DIRECTORY_KEEP_%out_flags, L_FS_OOB_DIRECTORY_OR_%out_flags
959
+ L_FS_OOB_DIRECTORY_KEEP_%out_flags:
960
+ %out_flags = add 0, %in_flags
961
+ %out_mode = add 0, %in_mode
962
+ %out_custom = add 0, %in_custom
963
+ !__fs_oob_directory_zero_%out_flags
964
+ jmp L_FS_OOB_DIRECTORY_END_%out_flags
965
+ L_FS_OOB_DIRECTORY_OR_%out_flags:
966
+ %out_flags = add 0, %in_flags
967
+ %out_mode = add 0, %in_mode
968
+ %out_custom = or %in_custom, SA_FS_CUSTOM_DIRECTORY
969
+ !__fs_oob_directory_zero_%out_flags
970
+ jmp L_FS_OOB_DIRECTORY_END_%out_flags
971
+ L_FS_OOB_DIRECTORY_END_%out_flags:
972
+ [END_MACRO]
973
+
974
+ [MACRO] FS_OPEN_OPTIONS_BUILDER_WITH_CLOEXEC %out_flags, %out_mode, %out_custom, %in_flags, %in_mode, %in_custom, %flag
975
+ __fs_oob_cloexec_zero_%out_flags = eq %flag, 0
976
+ br __fs_oob_cloexec_zero_%out_flags -> L_FS_OOB_CLOEXEC_KEEP_%out_flags, L_FS_OOB_CLOEXEC_OR_%out_flags
977
+ L_FS_OOB_CLOEXEC_KEEP_%out_flags:
978
+ %out_flags = add 0, %in_flags
979
+ %out_mode = add 0, %in_mode
980
+ %out_custom = add 0, %in_custom
981
+ !__fs_oob_cloexec_zero_%out_flags
982
+ jmp L_FS_OOB_CLOEXEC_END_%out_flags
983
+ L_FS_OOB_CLOEXEC_OR_%out_flags:
984
+ %out_flags = add 0, %in_flags
985
+ %out_mode = add 0, %in_mode
986
+ %out_custom = or %in_custom, SA_FS_CUSTOM_CLOEXEC
987
+ !__fs_oob_cloexec_zero_%out_flags
988
+ jmp L_FS_OOB_CLOEXEC_END_%out_flags
989
+ L_FS_OOB_CLOEXEC_END_%out_flags:
990
+ [END_MACRO]
991
+
992
+
993
+ // Concrete FileTimes builder over two propagating SSA millisecond timestamps.
994
+ // Applies through the existing FS_SET_TIMES_MS / sa_fs_set_times_ms FFI.
995
+
996
+ [MACRO] FS_FILE_TIMES_NEW %out_accessed_ms, %out_modified_ms
997
+ %out_accessed_ms = add 0, 0
998
+ %out_modified_ms = add 0, 0
999
+ [END_MACRO]
1000
+
1001
+ // Rust-style Default alias over FS_FILE_TIMES_NEW (0,0 timestamps).
1002
+ [MACRO] FS_FILE_TIMES_DEFAULT %out_accessed_ms, %out_modified_ms
1003
+ EXPAND FS_FILE_TIMES_NEW %out_accessed_ms, %out_modified_ms
1004
+ [END_MACRO]
1005
+
1006
+ [MACRO] FS_FILE_TIMES_WITH_ACCESSED %out_accessed_ms, %out_modified_ms, %in_accessed_ms, %in_modified_ms, %accessed_ms
1007
+ %out_accessed_ms = add 0, %accessed_ms
1008
+ %out_modified_ms = add 0, %in_modified_ms
1009
+ [END_MACRO]
1010
+
1011
+ [MACRO] FS_FILE_TIMES_WITH_MODIFIED %out_accessed_ms, %out_modified_ms, %in_accessed_ms, %in_modified_ms, %modified_ms
1012
+ %out_accessed_ms = add 0, %in_accessed_ms
1013
+ %out_modified_ms = add 0, %modified_ms
1014
+ [END_MACRO]
1015
+
1016
+ [MACRO] FS_FILE_TIMES_SET %out_status, %path, %path_len, %accessed_ms, %modified_ms
1017
+ EXPAND FS_SET_TIMES_MS %out_status, %path, %path_len, %accessed_ms, %modified_ms
1018
+ [END_MACRO]
1019
+
1020
+ [MACRO] FS_METADATA_FILE_TIMES %out_accessed_ms, %out_modified_ms, %metadata
1021
+ %out_accessed_ms = call @sa_fs_metadata_accessed_ms(%metadata)
1022
+ %out_modified_ms = call @sa_fs_metadata_modified_ms(%metadata)
1023
+ [END_MACRO]