hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/user/save.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-10-04 16:03:42 +0200
committerhachem <im@hachem.wtf>2026-10-04 16:03:42 +0200
commit52dab7fc85d877e80e3032f0afabae906adebad8 (patch)
treeb6d56299b839413bb77b1b8c8fa9f7a682124a05 /user/save.c
parenta8a35a00a3c3c57cfbef2311d0348376c2e83208 (diff)
feat: fs tree and free list alloc
Diffstat (limited to 'user/save.c')
-rw-r--r--user/save.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/user/save.c b/user/save.c
new file mode 100644
index 0000000..b3664f4
--- /dev/null
+++ b/user/save.c
@@ -0,0 +1,45 @@
+#include "user.h"
+
+void _start(const char* arg, unsigned long arglen)
+{
+ if (arglen == 0 || arglen >= 64)
+ {
+ put("usage: run save <path>\n");
+ sys_exit(1);
+ }
+
+ char name[64];
+ for (unsigned long i = 0; i < arglen; i++)
+ name[i] = arg[i];
+ name[arglen] = 0;
+
+ put("saving to ");
+ put(name);
+ put(" -- type lines, a single . saves\n");
+
+ char buffer[4096];
+ int length = 0;
+ for (;;)
+ {
+ char line[256];
+ int n = read_line(line, 256);
+ put("\n");
+ if (n == 1 && line[0] == '.')
+ break;
+ for (int i = 0; i < n && length < 4000; i++)
+ buffer[length++] = line[i];
+ if (length < 4000)
+ buffer[length++] = '\n';
+ }
+
+ if (sys_fs_write(name, buffer, (unsigned long)length))
+ {
+ put("saved ");
+ put(name);
+ put("\n");
+ }
+ else
+ put("write failed\n");
+
+ sys_exit(0);
+}