xbintsc 0.1.9 → 0.1.10

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 (57) hide show
  1. package/README.md +12 -7
  2. package/dist/src/codegen/generator/calls.js +11 -1
  3. package/dist/src/codegen/generator/calls.js.map +1 -1
  4. package/dist/src/codegen/generator/module.js +1 -0
  5. package/dist/src/codegen/generator/module.js.map +1 -1
  6. package/dist/src/codegen/generator/state.js +5 -0
  7. package/dist/src/codegen/generator/state.js.map +1 -1
  8. package/dist/src/codegen/generator/tables.d.ts +2 -0
  9. package/dist/src/codegen/generator/tables.js +7 -0
  10. package/dist/src/codegen/generator/tables.js.map +1 -1
  11. package/dist/src/extensions/node/fs/fs-ops.d.ts +6 -0
  12. package/dist/src/extensions/node/fs/fs-ops.js +18 -0
  13. package/dist/src/extensions/node/fs/fs-ops.js.map +1 -0
  14. package/dist/src/extensions/node/fs/index.d.ts +3 -1
  15. package/dist/src/extensions/node/fs/index.js +11 -3
  16. package/dist/src/extensions/node/fs/index.js.map +1 -1
  17. package/dist/src/extensions/node/fs/write-file.d.ts +5 -0
  18. package/dist/src/extensions/node/fs/write-file.js +8 -0
  19. package/dist/src/extensions/node/fs/write-file.js.map +1 -0
  20. package/dist/src/extensions/node/index.d.ts +2 -1
  21. package/dist/src/extensions/node/index.js +7 -3
  22. package/dist/src/extensions/node/index.js.map +1 -1
  23. package/dist/src/extensions/node/os/index.d.ts +9 -0
  24. package/dist/src/extensions/node/os/index.js +14 -0
  25. package/dist/src/extensions/node/os/index.js.map +1 -0
  26. package/dist/src/extensions/node/path/index.d.ts +10 -0
  27. package/dist/src/extensions/node/path/index.js +15 -0
  28. package/dist/src/extensions/node/path/index.js.map +1 -0
  29. package/dist/src/extensions/node/process/index.d.ts +10 -0
  30. package/dist/src/extensions/node/process/index.js +15 -0
  31. package/dist/src/extensions/node/process/index.js.map +1 -0
  32. package/dist/tests/e2e/compile.test.js +55 -0
  33. package/dist/tests/e2e/compile.test.js.map +1 -1
  34. package/dist/tests/extensions/registry.test.js +9 -3
  35. package/dist/tests/extensions/registry.test.js.map +1 -1
  36. package/package.json +1 -1
  37. package/runtime/ext_node/fs/fs_common.h +166 -0
  38. package/runtime/ext_node/fs/fs_ops.c +342 -0
  39. package/runtime/ext_node/fs/read_file.c +12 -6
  40. package/runtime/ext_node/fs/write_file.c +47 -0
  41. package/runtime/ext_node/os/os.c +165 -0
  42. package/runtime/ext_node/path/path.c +324 -0
  43. package/runtime/ext_node/process/process.c +137 -0
  44. package/runtime/rt.h +6 -0
  45. package/runtime/xt_io.c +9 -0
  46. package/scripts/build-runtime.mjs +5 -0
  47. package/src/codegen/generator/calls.ts +13 -0
  48. package/src/codegen/generator/module.ts +1 -0
  49. package/src/codegen/generator/state.ts +5 -0
  50. package/src/codegen/generator/tables.ts +8 -0
  51. package/src/extensions/node/fs/fs-ops.ts +20 -0
  52. package/src/extensions/node/fs/index.ts +11 -3
  53. package/src/extensions/node/fs/write-file.ts +10 -0
  54. package/src/extensions/node/index.ts +7 -3
  55. package/src/extensions/node/os/index.ts +16 -0
  56. package/src/extensions/node/path/index.ts +17 -0
  57. package/src/extensions/node/process/index.ts +17 -0
@@ -1 +1 @@
1
- {"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile.test.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,8 @@ describe("ExtensionRegistry", () => {
28
28
  const builtins = registry.builtins();
29
29
  expect(builtins.print?.symbol).toBe("xt_println");
30
30
  expect(builtins.readFileSync?.symbol).toBe("xt_node_read_text_file");
31
+ expect(builtins.writeFileSync?.symbol).toBe("xt_node_write_file");
32
+ expect(builtins.existsSync?.symbol).toBe("xt_node_exists");
31
33
  });
32
34
  it("collects runtime sources and linker flags", () => {
33
35
  const registry = new ExtensionRegistry().register(demoExtension);
@@ -38,10 +40,14 @@ describe("ExtensionRegistry", () => {
38
40
  expect(coreExtension.builtins?.().print?.symbol).toBe("xt_println");
39
41
  expect(createDefaultRegistry().has("core")).toBe(true);
40
42
  });
41
- it("node extension points at the ext C source", () => {
43
+ it("node extension points at the ext C sources", () => {
42
44
  const sources = nodeExtension.runtimeSources?.() ?? [];
43
- expect(sources).toHaveLength(1);
44
- expect(sources[0]).toMatch(/ext_node[\\/]fs[\\/]read_file\.c$/);
45
+ expect(sources.length).toBeGreaterThanOrEqual(6);
46
+ expect(sources.some((s) => /ext_node[\\/]fs[\\/]read_file\.c$/.test(s))).toBe(true);
47
+ expect(sources.some((s) => /ext_node[\\/]fs[\\/]fs_ops\.c$/.test(s))).toBe(true);
48
+ expect(sources.some((s) => /ext_node[\\/]path[\\/]path\.c$/.test(s))).toBe(true);
49
+ expect(sources.some((s) => /ext_node[\\/]os[\\/]os\.c$/.test(s))).toBe(true);
50
+ expect(sources.some((s) => /ext_node[\\/]process[\\/]process\.c$/.test(s))).toBe(true);
45
51
  });
46
52
  });
47
53
  //# sourceMappingURL=registry.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../tests/extensions/registry.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../tests/extensions/registry.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xbintsc",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "xbintsc - a TypeScript binary compiler (TypeScript -> LLVM IR -> native binary)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,166 @@
1
+ /*
2
+ * Shared helpers for the xbintsc Node `fs` runtime.
3
+ *
4
+ * The `fs` builtins live in several translation units (read_file.c,
5
+ * write_file.c, fs_ops.c) but agree on encoding handling and error reporting
6
+ * through these static inline helpers. Encoding support is deliberately
7
+ * buffer-free: `base64`/`hex` are encoded to strings directly, since xbintsc
8
+ * has no `Buffer` value type yet.
9
+ */
10
+ #ifndef XT_NODE_FS_COMMON_H
11
+ #define XT_NODE_FS_COMMON_H
12
+
13
+ #include "rt.h"
14
+
15
+ #include <stdio.h>
16
+ #include <stdlib.h>
17
+ #include <string.h>
18
+
19
+ static const char xt_fs_base64_alphabet[] =
20
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
21
+
22
+ /* Accepts a bare encoding string or an options object with `encoding`. */
23
+ static inline const char *xt_fs_encoding(xt_value options) {
24
+ if (XT_IS_STRING(options)) return xt_string_data(options);
25
+ if (XT_IS_OBJECT(options)) {
26
+ xt_value encoding = xt_object_get_cstr(options, "encoding");
27
+ if (XT_IS_STRING(encoding)) return xt_string_data(encoding);
28
+ }
29
+ return NULL;
30
+ }
31
+
32
+ static inline int xt_fs_is_hex(const char *encoding) {
33
+ return encoding && strcmp(encoding, "hex") == 0;
34
+ }
35
+
36
+ static inline int xt_fs_is_base64(const char *encoding) {
37
+ return encoding && strcmp(encoding, "base64") == 0;
38
+ }
39
+
40
+ static inline xt_value xt_fs_encode_hex(const unsigned char *data, size_t length) {
41
+ static const char digits[] = "0123456789abcdef";
42
+ char *buffer = (char *)malloc(length * 2 + 1);
43
+ if (!buffer) return xt_undefined();
44
+ for (size_t i = 0; i < length; i++) {
45
+ buffer[i * 2] = digits[data[i] >> 4];
46
+ buffer[i * 2 + 1] = digits[data[i] & 0x0f];
47
+ }
48
+ xt_value result = xt_string_new(buffer, length * 2);
49
+ free(buffer);
50
+ return result;
51
+ }
52
+
53
+ static inline xt_value xt_fs_encode_base64(const unsigned char *data, size_t length) {
54
+ size_t outLength = ((length + 2) / 3) * 4;
55
+ char *buffer = (char *)malloc(outLength + 1);
56
+ if (!buffer) return xt_undefined();
57
+ size_t i = 0, j = 0;
58
+ while (i + 2 < length) {
59
+ uint32_t n = ((uint32_t)data[i] << 16) | ((uint32_t)data[i + 1] << 8) | (uint32_t)data[i + 2];
60
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 18) & 63];
61
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 12) & 63];
62
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 6) & 63];
63
+ buffer[j++] = xt_fs_base64_alphabet[n & 63];
64
+ i += 3;
65
+ }
66
+ if (length - i == 1) {
67
+ uint32_t n = (uint32_t)data[i] << 16;
68
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 18) & 63];
69
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 12) & 63];
70
+ buffer[j++] = '=';
71
+ buffer[j++] = '=';
72
+ } else if (length - i == 2) {
73
+ uint32_t n = ((uint32_t)data[i] << 16) | ((uint32_t)data[i + 1] << 8);
74
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 18) & 63];
75
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 12) & 63];
76
+ buffer[j++] = xt_fs_base64_alphabet[(n >> 6) & 63];
77
+ buffer[j++] = '=';
78
+ }
79
+ xt_value result = xt_string_new(buffer, j);
80
+ free(buffer);
81
+ return result;
82
+ }
83
+
84
+ /* Encode bytes for `readFileSync` according to `encoding` (default raw UTF-8). */
85
+ static inline xt_value xt_fs_encode_bytes(const unsigned char *data, size_t length, const char *encoding) {
86
+ if (xt_fs_is_hex(encoding)) return xt_fs_encode_hex(data, length);
87
+ if (xt_fs_is_base64(encoding)) return xt_fs_encode_base64(data, length);
88
+ return xt_string_new((const char *)data, length);
89
+ }
90
+
91
+ static inline int xt_fs_base64_value(char c) {
92
+ if (c >= 'A' && c <= 'Z') return c - 'A';
93
+ if (c >= 'a' && c <= 'z') return c - 'a' + 26;
94
+ if (c >= '0' && c <= '9') return c - '0' + 52;
95
+ if (c == '+') return 62;
96
+ if (c == '/') return 63;
97
+ return -1;
98
+ }
99
+
100
+ static inline int xt_fs_hex_value(char c) {
101
+ if (c >= '0' && c <= '9') return c - '0';
102
+ if (c >= 'a' && c <= 'f') return c - 'a' + 10;
103
+ if (c >= 'A' && c <= 'F') return c - 'A' + 10;
104
+ return -1;
105
+ }
106
+
107
+ /*
108
+ * Decode text for `writeFileSync` according to `encoding`. Returns a malloc'd
109
+ * byte buffer (never NULL unless allocation failed) and stores its length in
110
+ * `*outLength`; the caller frees it.
111
+ */
112
+ static inline unsigned char *xt_fs_decode_text(const char *text, size_t length, const char *encoding, size_t *outLength) {
113
+ unsigned char *bytes = NULL;
114
+ if (xt_fs_is_base64(encoding)) {
115
+ size_t capacity = (length / 4 + 1) * 3;
116
+ bytes = (unsigned char *)malloc(capacity + 1);
117
+ if (!bytes) return NULL;
118
+ size_t written = 0;
119
+ int accumulator = 0, bits = 0;
120
+ for (size_t i = 0; i < length; i++) {
121
+ if (text[i] == '=') break;
122
+ int value = xt_fs_base64_value(text[i]);
123
+ if (value < 0) continue;
124
+ accumulator = (accumulator << 6) | value;
125
+ bits += 6;
126
+ if (bits >= 8) {
127
+ bits -= 8;
128
+ bytes[written++] = (unsigned char)((accumulator >> bits) & 0xff);
129
+ }
130
+ }
131
+ bytes[written] = '\0';
132
+ *outLength = written;
133
+ return bytes;
134
+ }
135
+ if (xt_fs_is_hex(encoding)) {
136
+ bytes = (unsigned char *)malloc(length / 2 + 1);
137
+ if (!bytes) return NULL;
138
+ size_t written = 0;
139
+ int high = -1;
140
+ for (size_t i = 0; i < length; i++) {
141
+ int value = xt_fs_hex_value(text[i]);
142
+ if (value < 0) continue;
143
+ if (high < 0) {
144
+ high = value;
145
+ } else {
146
+ bytes[written++] = (unsigned char)((high << 4) | value);
147
+ high = -1;
148
+ }
149
+ }
150
+ bytes[written] = '\0';
151
+ *outLength = written;
152
+ return bytes;
153
+ }
154
+ bytes = (unsigned char *)malloc(length + 1);
155
+ if (!bytes) return NULL;
156
+ if (length > 0) memcpy(bytes, text, length);
157
+ bytes[length] = '\0';
158
+ *outLength = length;
159
+ return bytes;
160
+ }
161
+
162
+ static inline void xt_fs_error(const char *action, const char *path) {
163
+ fprintf(stderr, "xbintsc: cannot %s '%s'\n", action, path ? path : "");
164
+ }
165
+
166
+ #endif /* XT_NODE_FS_COMMON_H */
@@ -0,0 +1,342 @@
1
+ /*
2
+ * Node.js `fs` filesystem operations for xbintsc.
3
+ *
4
+ * Covers the synchronous, non-descriptor half of the module:
5
+ * existsSync, readdirSync, mkdirSync, rmSync, unlinkSync, rmdirSync,
6
+ * renameSync, copyFileSync, realpathSync, statSync, lstatSync
7
+ *
8
+ * Error handling is intentionally Node-compatible in spirit but not in
9
+ * mechanics: xbintsc has no try/catch that can catch native errors yet, so
10
+ * failures print to stderr and return `undefined` (or `false` for
11
+ * `existsSync`) instead of throwing `ENOENT`-style exceptions.
12
+ */
13
+
14
+ #include "rt.h"
15
+ #include "fs_common.h"
16
+
17
+ #include <dirent.h>
18
+ #include <errno.h>
19
+ #include <sys/stat.h>
20
+ #include <sys/types.h>
21
+ #include <unistd.h>
22
+
23
+ #if defined(_WIN32)
24
+ #include <direct.h>
25
+ #define xt_fs_mkdir_one(path) _mkdir(path)
26
+ #define xt_fs_rmdir_one(path) _rmdir(path)
27
+ #else
28
+ #define xt_fs_mkdir_one(path) mkdir(path, 0777)
29
+ #define xt_fs_rmdir_one(path) rmdir(path)
30
+ #endif
31
+
32
+ /* ------------------------------------------------------------------------- */
33
+ /* existsSync */
34
+ /* ------------------------------------------------------------------------- */
35
+
36
+ xt_value xt_node_exists(int32_t argc, xt_value *argv) {
37
+ if (argc < 1) return xt_bool(0);
38
+ const char *path = xt_string_data(xt_to_string(argv[0]));
39
+ if (!path) return xt_bool(0);
40
+ return xt_bool(access(path, F_OK) == 0);
41
+ }
42
+
43
+ /* ------------------------------------------------------------------------- */
44
+ /* readdirSync */
45
+ /* ------------------------------------------------------------------------- */
46
+
47
+ xt_value xt_node_read_dir(int32_t argc, xt_value *argv) {
48
+ if (argc < 1) return xt_undefined();
49
+ const char *path = xt_string_data(xt_to_string(argv[0]));
50
+ if (!path) return xt_undefined();
51
+
52
+ DIR *dir = opendir(path);
53
+ if (!dir) {
54
+ xt_fs_error("open directory", path);
55
+ return xt_undefined();
56
+ }
57
+
58
+ size_t count = 0;
59
+ size_t capacity = 16;
60
+ xt_value *items = (xt_value *)malloc(sizeof(xt_value) * capacity);
61
+ if (!items) {
62
+ closedir(dir);
63
+ return xt_undefined();
64
+ }
65
+
66
+ struct dirent *entry;
67
+ while ((entry = readdir(dir)) != NULL) {
68
+ if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
69
+ if (count == capacity) {
70
+ capacity *= 2;
71
+ xt_value *grown = (xt_value *)realloc(items, sizeof(xt_value) * capacity);
72
+ if (!grown) break;
73
+ items = grown;
74
+ }
75
+ items[count++] = xt_string_from_cstr(entry->d_name);
76
+ }
77
+ closedir(dir);
78
+
79
+ xt_value result = xt_array_new((int32_t)count, items);
80
+ free(items);
81
+ return result;
82
+ }
83
+
84
+ /* ------------------------------------------------------------------------- */
85
+ /* mkdirSync */
86
+ /* ------------------------------------------------------------------------- */
87
+
88
+ /* True when the second argument asks for recursive creation. */
89
+ static int xt_fs_recursive(xt_value options) {
90
+ if (!xt_truthy(options)) return 0;
91
+ if (XT_IS_OBJECT(options)) return xt_truthy(xt_object_get_cstr(options, "recursive"));
92
+ return 1;
93
+ }
94
+
95
+ static int xt_fs_mkdir_recursive(const char *path) {
96
+ size_t length = strlen(path);
97
+ char *copy = (char *)malloc(length + 1);
98
+ if (!copy) return -1;
99
+ memcpy(copy, path, length + 1);
100
+
101
+ while (length > 1 && copy[length - 1] == '/') copy[--length] = '\0';
102
+ for (size_t i = 1; i <= length; i++) {
103
+ if (copy[i] != '/' && copy[i] != '\0') continue;
104
+ char saved = copy[i];
105
+ copy[i] = '\0';
106
+ if (xt_fs_mkdir_one(copy) != 0 && errno != EEXIST) {
107
+ free(copy);
108
+ return -1;
109
+ }
110
+ copy[i] = saved;
111
+ }
112
+ free(copy);
113
+ return 0;
114
+ }
115
+
116
+ xt_value xt_node_mkdir(int32_t argc, xt_value *argv) {
117
+ if (argc < 1) return xt_undefined();
118
+ const char *path = xt_string_data(xt_to_string(argv[0]));
119
+ if (!path) return xt_undefined();
120
+
121
+ if (argc > 1 && xt_fs_recursive(argv[1])) {
122
+ if (xt_fs_mkdir_recursive(path) != 0) xt_fs_error("create directory", path);
123
+ return xt_undefined();
124
+ }
125
+ if (xt_fs_mkdir_one(path) != 0 && errno != EEXIST) xt_fs_error("create directory", path);
126
+ return xt_undefined();
127
+ }
128
+
129
+ /* ------------------------------------------------------------------------- */
130
+ /* rmSync / unlinkSync / rmdirSync */
131
+ /* ------------------------------------------------------------------------- */
132
+
133
+ static int xt_fs_remove_recursive(const char *path) {
134
+ struct stat info;
135
+ if (lstat(path, &info) != 0) return -1;
136
+ if (!S_ISDIR(info.st_mode)) return remove(path);
137
+
138
+ DIR *dir = opendir(path);
139
+ if (!dir) return -1;
140
+ struct dirent *entry;
141
+ while ((entry = readdir(dir)) != NULL) {
142
+ if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
143
+ size_t size = strlen(path) + strlen(entry->d_name) + 2;
144
+ char *child = (char *)malloc(size);
145
+ if (!child) continue;
146
+ snprintf(child, size, "%s/%s", path, entry->d_name);
147
+ xt_fs_remove_recursive(child);
148
+ free(child);
149
+ }
150
+ closedir(dir);
151
+ return xt_fs_rmdir_one(path);
152
+ }
153
+
154
+ xt_value xt_node_rm(int32_t argc, xt_value *argv) {
155
+ if (argc < 1) return xt_undefined();
156
+ const char *path = xt_string_data(xt_to_string(argv[0]));
157
+ if (!path) return xt_undefined();
158
+
159
+ int recursive = argc > 1 && xt_fs_recursive(argv[1]);
160
+ int status = recursive ? xt_fs_remove_recursive(path) : remove(path);
161
+ if (status != 0) xt_fs_error("remove", path);
162
+ return xt_undefined();
163
+ }
164
+
165
+ xt_value xt_node_unlink(int32_t argc, xt_value *argv) {
166
+ if (argc < 1) return xt_undefined();
167
+ const char *path = xt_string_data(xt_to_string(argv[0]));
168
+ if (!path) return xt_undefined();
169
+ if (remove(path) != 0) xt_fs_error("remove file", path);
170
+ return xt_undefined();
171
+ }
172
+
173
+ xt_value xt_node_rmdir(int32_t argc, xt_value *argv) {
174
+ if (argc < 1) return xt_undefined();
175
+ const char *path = xt_string_data(xt_to_string(argv[0]));
176
+ if (!path) return xt_undefined();
177
+ if (xt_fs_rmdir_one(path) != 0) xt_fs_error("remove directory", path);
178
+ return xt_undefined();
179
+ }
180
+
181
+ /* ------------------------------------------------------------------------- */
182
+ /* renameSync / copyFileSync / realpathSync */
183
+ /* ------------------------------------------------------------------------- */
184
+
185
+ xt_value xt_node_rename(int32_t argc, xt_value *argv) {
186
+ if (argc < 2) return xt_undefined();
187
+ const char *from = xt_string_data(xt_to_string(argv[0]));
188
+ const char *to = xt_string_data(xt_to_string(argv[1]));
189
+ if (!from || !to) return xt_undefined();
190
+ if (rename(from, to) != 0) xt_fs_error("rename", from);
191
+ return xt_undefined();
192
+ }
193
+
194
+ xt_value xt_node_copy_file(int32_t argc, xt_value *argv) {
195
+ if (argc < 2) return xt_undefined();
196
+ const char *from = xt_string_data(xt_to_string(argv[0]));
197
+ const char *to = xt_string_data(xt_to_string(argv[1]));
198
+ if (!from || !to) return xt_undefined();
199
+
200
+ FILE *source = fopen(from, "rb");
201
+ if (!source) {
202
+ xt_fs_error("open", from);
203
+ return xt_undefined();
204
+ }
205
+ FILE *destination = fopen(to, "wb");
206
+ if (!destination) {
207
+ fclose(source);
208
+ xt_fs_error("open", to);
209
+ return xt_undefined();
210
+ }
211
+
212
+ char buffer[8192];
213
+ size_t read;
214
+ while ((read = fread(buffer, 1, sizeof(buffer), source)) > 0) fwrite(buffer, 1, read, destination);
215
+ fclose(source);
216
+ fclose(destination);
217
+ return xt_undefined();
218
+ }
219
+
220
+ xt_value xt_node_realpath(int32_t argc, xt_value *argv) {
221
+ if (argc < 1) return xt_undefined();
222
+ const char *path = xt_string_data(xt_to_string(argv[0]));
223
+ if (!path) return xt_undefined();
224
+ #if defined(_WIN32)
225
+ char resolved[_MAX_PATH];
226
+ if (_fullpath(resolved, path, _MAX_PATH) == NULL) {
227
+ xt_fs_error("resolve", path);
228
+ return xt_undefined();
229
+ }
230
+ return xt_string_from_cstr(resolved);
231
+ #else
232
+ char *resolved = realpath(path, NULL);
233
+ if (!resolved) {
234
+ xt_fs_error("resolve", path);
235
+ return xt_undefined();
236
+ }
237
+ xt_value result = xt_string_from_cstr(resolved);
238
+ free(resolved);
239
+ return result;
240
+ #endif
241
+ }
242
+
243
+ /* ------------------------------------------------------------------------- */
244
+ /* statSync / lstatSync */
245
+ /* ------------------------------------------------------------------------- */
246
+
247
+ /*
248
+ * Stats methods (`isFile`, `isDirectory`, ...) are native closures capturing
249
+ * the raw mode; the closure environment carries `[mode, methodName]`.
250
+ */
251
+ static xt_value xt_fs_stat_method(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
252
+ (void)thisValue;
253
+ (void)argc;
254
+ (void)argv;
255
+ unsigned int mode = (unsigned int)xt_to_number(xt_closure_env(env, 0));
256
+ const char *method = xt_string_data(xt_closure_env(env, 1));
257
+ if (!method) return xt_bool(0);
258
+ int result = 0;
259
+ if (strcmp(method, "isFile") == 0) result = S_ISREG(mode);
260
+ else if (strcmp(method, "isDirectory") == 0) result = S_ISDIR(mode);
261
+ else if (strcmp(method, "isSymbolicLink") == 0) result = S_ISLNK(mode);
262
+ else if (strcmp(method, "isFIFO") == 0) result = S_ISFIFO(mode);
263
+ else if (strcmp(method, "isSocket") == 0) result = S_ISSOCK(mode);
264
+ else if (strcmp(method, "isBlockDevice") == 0) result = S_ISBLK(mode);
265
+ else if (strcmp(method, "isCharacterDevice") == 0) result = S_ISCHR(mode);
266
+ return xt_bool(result);
267
+ }
268
+
269
+ static void xt_fs_define_stat_method(xt_value object, const char *name, unsigned int mode) {
270
+ xt_value env[2];
271
+ env[0] = xt_number((double)mode);
272
+ env[1] = xt_string_from_cstr(name);
273
+ xt_value fn = xt_closure_new((void *)xt_fs_stat_method, 2, env);
274
+ xt_object_set(object, xt_string_from_cstr(name), fn);
275
+ }
276
+
277
+ static double xt_fs_seconds_ms(long seconds, long nanoseconds) {
278
+ return (double)seconds * 1000.0 + (double)nanoseconds / 1000000.0;
279
+ }
280
+
281
+ static xt_value xt_node_stat_result(const struct stat *info) {
282
+ xt_value object = xt_object_new();
283
+ xt_object_set(object, xt_string_from_cstr("size"), xt_number((double)info->st_size));
284
+ xt_object_set(object, xt_string_from_cstr("mode"), xt_number((double)info->st_mode));
285
+ xt_object_set(object, xt_string_from_cstr("uid"), xt_number((double)info->st_uid));
286
+ xt_object_set(object, xt_string_from_cstr("gid"), xt_number((double)info->st_gid));
287
+ xt_object_set(object, xt_string_from_cstr("dev"), xt_number((double)info->st_dev));
288
+ xt_object_set(object, xt_string_from_cstr("ino"), xt_number((double)info->st_ino));
289
+ xt_object_set(object, xt_string_from_cstr("nlink"), xt_number((double)info->st_nlink));
290
+ xt_object_set(object, xt_string_from_cstr("rdev"), xt_number((double)info->st_rdev));
291
+ #if defined(__APPLE__)
292
+ xt_object_set(object, xt_string_from_cstr("blocks"), xt_number((double)info->st_blocks));
293
+ xt_object_set(object, xt_string_from_cstr("blksize"), xt_number((double)info->st_blksize));
294
+ xt_object_set(object, xt_string_from_cstr("mtimeMs"),
295
+ xt_number(xt_fs_seconds_ms(info->st_mtimespec.tv_sec, info->st_mtimespec.tv_nsec)));
296
+ xt_object_set(object, xt_string_from_cstr("atimeMs"),
297
+ xt_number(xt_fs_seconds_ms(info->st_atimespec.tv_sec, info->st_atimespec.tv_nsec)));
298
+ xt_object_set(object, xt_string_from_cstr("ctimeMs"),
299
+ xt_number(xt_fs_seconds_ms(info->st_ctimespec.tv_sec, info->st_ctimespec.tv_nsec)));
300
+ #elif defined(_WIN32)
301
+ xt_object_set(object, xt_string_from_cstr("mtimeMs"), xt_number((double)info->st_mtime * 1000.0));
302
+ xt_object_set(object, xt_string_from_cstr("atimeMs"), xt_number((double)info->st_atime * 1000.0));
303
+ xt_object_set(object, xt_string_from_cstr("ctimeMs"), xt_number((double)info->st_ctime * 1000.0));
304
+ #else
305
+ xt_object_set(object, xt_string_from_cstr("blocks"), xt_number((double)info->st_blocks));
306
+ xt_object_set(object, xt_string_from_cstr("blksize"), xt_number((double)info->st_blksize));
307
+ xt_object_set(object, xt_string_from_cstr("mtimeMs"),
308
+ xt_number(xt_fs_seconds_ms(info->st_mtim.tv_sec, info->st_mtim.tv_nsec)));
309
+ xt_object_set(object, xt_string_from_cstr("atimeMs"),
310
+ xt_number(xt_fs_seconds_ms(info->st_atim.tv_sec, info->st_atim.tv_nsec)));
311
+ xt_object_set(object, xt_string_from_cstr("ctimeMs"),
312
+ xt_number(xt_fs_seconds_ms(info->st_ctim.tv_sec, info->st_ctim.tv_nsec)));
313
+ #endif
314
+
315
+ unsigned int mode = (unsigned int)info->st_mode;
316
+ xt_fs_define_stat_method(object, "isFile", mode);
317
+ xt_fs_define_stat_method(object, "isDirectory", mode);
318
+ xt_fs_define_stat_method(object, "isSymbolicLink", mode);
319
+ xt_fs_define_stat_method(object, "isFIFO", mode);
320
+ xt_fs_define_stat_method(object, "isSocket", mode);
321
+ xt_fs_define_stat_method(object, "isBlockDevice", mode);
322
+ xt_fs_define_stat_method(object, "isCharacterDevice", mode);
323
+ return object;
324
+ }
325
+
326
+ static xt_value xt_node_stat_common(int32_t argc, xt_value *argv, int followLinks) {
327
+ if (argc < 1) return xt_undefined();
328
+ const char *path = xt_string_data(xt_to_string(argv[0]));
329
+ if (!path) return xt_undefined();
330
+
331
+ struct stat info;
332
+ int status = followLinks ? stat(path, &info) : lstat(path, &info);
333
+ if (status != 0) {
334
+ xt_fs_error("stat", path);
335
+ return xt_undefined();
336
+ }
337
+ return xt_node_stat_result(&info);
338
+ }
339
+
340
+ xt_value xt_node_stat(int32_t argc, xt_value *argv) { return xt_node_stat_common(argc, argv, 1); }
341
+
342
+ xt_value xt_node_lstat(int32_t argc, xt_value *argv) { return xt_node_stat_common(argc, argv, 0); }
@@ -1,15 +1,19 @@
1
1
  /*
2
- * Node.js `fs` module for xbintsc.
2
+ * Node.js `fs.readFileSync` for xbintsc.
3
3
  *
4
4
  * Compiled and linked only when the `node` extension is registered. Following
5
- * the runtime calling convention, every builtin is:
5
+ * the runtime calling convention, the builtin is:
6
6
  * xt_value fn(int32_t argc, xt_value *argv)
7
+ *
8
+ * `readFileSync(path[, options])` reads a file and returns its contents as a
9
+ * string. `options` may be an encoding string or an object with an `encoding`
10
+ * property; `"utf8"` (the default), `"ascii"`, `"latin1"` and `"binary"` return
11
+ * the raw bytes, while `"hex"` and `"base64"` return encoded strings. There is
12
+ * no `Buffer` type yet, so binary reads always come back as text.
7
13
  */
8
14
 
9
15
  #include "rt.h"
10
-
11
- #include <stdio.h>
12
- #include <stdlib.h>
16
+ #include "fs_common.h"
13
17
 
14
18
  xt_value xt_node_read_text_file(int32_t argc, xt_value *argv) {
15
19
  if (argc < 1) return xt_undefined();
@@ -37,7 +41,9 @@ xt_value xt_node_read_text_file(int32_t argc, xt_value *argv) {
37
41
  size_t read = fread(buffer, 1, (size_t)size, file);
38
42
  fclose(file);
39
43
  buffer[read] = '\0';
40
- xt_value result = xt_string_new(buffer, read);
44
+
45
+ const char *encoding = argc > 1 ? xt_fs_encoding(argv[1]) : NULL;
46
+ xt_value result = xt_fs_encode_bytes((const unsigned char *)buffer, read, encoding);
41
47
  free(buffer);
42
48
  return result;
43
49
  }
@@ -0,0 +1,47 @@
1
+ /*
2
+ * Node.js `fs.writeFileSync` / `fs.appendFileSync` for xbintsc.
3
+ *
4
+ * `writeFileSync(path, data[, options])` truncates the file before writing;
5
+ * `appendFileSync(path, data[, options])` appends. `data` is converted to a
6
+ * string with the usual JS rules and `options` selects an encoding:
7
+ * `"hex"`/`"base64"` decode the string, everything else writes its UTF-8 bytes.
8
+ */
9
+
10
+ #include "rt.h"
11
+ #include "fs_common.h"
12
+
13
+ static xt_value xt_node_write_common(int32_t argc, xt_value *argv, const char *mode) {
14
+ if (argc < 2) return xt_undefined();
15
+ xt_value pathValue = xt_to_string(argv[0]);
16
+ const char *path = xt_string_data(pathValue);
17
+ if (!path) return xt_undefined();
18
+
19
+ xt_value dataValue = xt_to_string(argv[1]);
20
+ const char *text = xt_string_data(dataValue);
21
+ int32_t length = xt_string_length_value(dataValue);
22
+ if (!text || length < 0) return xt_undefined();
23
+
24
+ const char *encoding = argc > 2 ? xt_fs_encoding(argv[2]) : NULL;
25
+ size_t byteLength = 0;
26
+ unsigned char *bytes = xt_fs_decode_text(text, (size_t)length, encoding, &byteLength);
27
+ if (!bytes) return xt_undefined();
28
+
29
+ FILE *file = fopen(path, mode);
30
+ if (!file) {
31
+ fprintf(stderr, "xbintsc: cannot open '%s'\n", path);
32
+ free(bytes);
33
+ return xt_undefined();
34
+ }
35
+ if (byteLength > 0) fwrite(bytes, 1, byteLength, file);
36
+ fclose(file);
37
+ free(bytes);
38
+ return xt_undefined();
39
+ }
40
+
41
+ xt_value xt_node_write_file(int32_t argc, xt_value *argv) {
42
+ return xt_node_write_common(argc, argv, "wb");
43
+ }
44
+
45
+ xt_value xt_node_append_file(int32_t argc, xt_value *argv) {
46
+ return xt_node_write_common(argc, argv, "ab");
47
+ }