diff options
| author | hachem <im@hachem.wtf> | 2026-10-04 16:03:42 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-10-04 16:03:42 +0200 |
| commit | 52dab7fc85d877e80e3032f0afabae906adebad8 (patch) | |
| tree | b6d56299b839413bb77b1b8c8fa9f7a682124a05 /user/save.c | |
| parent | a8a35a00a3c3c57cfbef2311d0348376c2e83208 (diff) | |
feat: fs tree and free list alloc
Diffstat (limited to 'user/save.c')
| -rw-r--r-- | user/save.c | 45 |
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); +} |
