@ecmaos/coreutils 0.4.0 → 0.4.2

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 (171) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/dist/commands/awk.d.ts +4 -0
  4. package/dist/commands/awk.d.ts.map +1 -0
  5. package/dist/commands/awk.js +324 -0
  6. package/dist/commands/awk.js.map +1 -0
  7. package/dist/commands/chgrp.d.ts +4 -0
  8. package/dist/commands/chgrp.d.ts.map +1 -0
  9. package/dist/commands/chgrp.js +187 -0
  10. package/dist/commands/chgrp.js.map +1 -0
  11. package/dist/commands/chmod.d.ts.map +1 -1
  12. package/dist/commands/chmod.js +139 -2
  13. package/dist/commands/chmod.js.map +1 -1
  14. package/dist/commands/chown.d.ts +4 -0
  15. package/dist/commands/chown.d.ts.map +1 -0
  16. package/dist/commands/chown.js +257 -0
  17. package/dist/commands/chown.js.map +1 -0
  18. package/dist/commands/cksum.d.ts +4 -0
  19. package/dist/commands/cksum.d.ts.map +1 -0
  20. package/dist/commands/cksum.js +124 -0
  21. package/dist/commands/cksum.js.map +1 -0
  22. package/dist/commands/cmp.d.ts +4 -0
  23. package/dist/commands/cmp.d.ts.map +1 -0
  24. package/dist/commands/cmp.js +120 -0
  25. package/dist/commands/cmp.js.map +1 -0
  26. package/dist/commands/column.d.ts +4 -0
  27. package/dist/commands/column.d.ts.map +1 -0
  28. package/dist/commands/column.js +274 -0
  29. package/dist/commands/column.js.map +1 -0
  30. package/dist/commands/cp.d.ts.map +1 -1
  31. package/dist/commands/cp.js +81 -4
  32. package/dist/commands/cp.js.map +1 -1
  33. package/dist/commands/curl.d.ts +4 -0
  34. package/dist/commands/curl.d.ts.map +1 -0
  35. package/dist/commands/curl.js +238 -0
  36. package/dist/commands/curl.js.map +1 -0
  37. package/dist/commands/du.d.ts +4 -0
  38. package/dist/commands/du.d.ts.map +1 -0
  39. package/dist/commands/du.js +168 -0
  40. package/dist/commands/du.js.map +1 -0
  41. package/dist/commands/echo.d.ts.map +1 -1
  42. package/dist/commands/echo.js +125 -2
  43. package/dist/commands/echo.js.map +1 -1
  44. package/dist/commands/expand.d.ts +4 -0
  45. package/dist/commands/expand.d.ts.map +1 -0
  46. package/dist/commands/expand.js +197 -0
  47. package/dist/commands/expand.js.map +1 -0
  48. package/dist/commands/factor.d.ts +4 -0
  49. package/dist/commands/factor.d.ts.map +1 -0
  50. package/dist/commands/factor.js +141 -0
  51. package/dist/commands/factor.js.map +1 -0
  52. package/dist/commands/fmt.d.ts +4 -0
  53. package/dist/commands/fmt.d.ts.map +1 -0
  54. package/dist/commands/fmt.js +278 -0
  55. package/dist/commands/fmt.js.map +1 -0
  56. package/dist/commands/fold.d.ts +4 -0
  57. package/dist/commands/fold.d.ts.map +1 -0
  58. package/dist/commands/fold.js +253 -0
  59. package/dist/commands/fold.js.map +1 -0
  60. package/dist/commands/groups.d.ts +4 -0
  61. package/dist/commands/groups.d.ts.map +1 -0
  62. package/dist/commands/groups.js +61 -0
  63. package/dist/commands/groups.js.map +1 -0
  64. package/dist/commands/hostname.d.ts +4 -0
  65. package/dist/commands/hostname.d.ts.map +1 -0
  66. package/dist/commands/hostname.js +80 -0
  67. package/dist/commands/hostname.js.map +1 -0
  68. package/dist/commands/mount.d.ts.map +1 -1
  69. package/dist/commands/mount.js +192 -97
  70. package/dist/commands/mount.js.map +1 -1
  71. package/dist/commands/od.d.ts +4 -0
  72. package/dist/commands/od.d.ts.map +1 -0
  73. package/dist/commands/od.js +342 -0
  74. package/dist/commands/od.js.map +1 -0
  75. package/dist/commands/pr.d.ts +4 -0
  76. package/dist/commands/pr.d.ts.map +1 -0
  77. package/dist/commands/pr.js +298 -0
  78. package/dist/commands/pr.js.map +1 -0
  79. package/dist/commands/printf.d.ts +4 -0
  80. package/dist/commands/printf.d.ts.map +1 -0
  81. package/dist/commands/printf.js +271 -0
  82. package/dist/commands/printf.js.map +1 -0
  83. package/dist/commands/readlink.d.ts +4 -0
  84. package/dist/commands/readlink.d.ts.map +1 -0
  85. package/dist/commands/readlink.js +104 -0
  86. package/dist/commands/readlink.js.map +1 -0
  87. package/dist/commands/realpath.d.ts +4 -0
  88. package/dist/commands/realpath.d.ts.map +1 -0
  89. package/dist/commands/realpath.js +111 -0
  90. package/dist/commands/realpath.js.map +1 -0
  91. package/dist/commands/rev.d.ts +4 -0
  92. package/dist/commands/rev.d.ts.map +1 -0
  93. package/dist/commands/rev.js +134 -0
  94. package/dist/commands/rev.js.map +1 -0
  95. package/dist/commands/shuf.d.ts +4 -0
  96. package/dist/commands/shuf.d.ts.map +1 -0
  97. package/dist/commands/shuf.js +221 -0
  98. package/dist/commands/shuf.js.map +1 -0
  99. package/dist/commands/sleep.d.ts +4 -0
  100. package/dist/commands/sleep.d.ts.map +1 -0
  101. package/dist/commands/sleep.js +102 -0
  102. package/dist/commands/sleep.js.map +1 -0
  103. package/dist/commands/strings.d.ts +4 -0
  104. package/dist/commands/strings.d.ts.map +1 -0
  105. package/dist/commands/strings.js +170 -0
  106. package/dist/commands/strings.js.map +1 -0
  107. package/dist/commands/tac.d.ts +4 -0
  108. package/dist/commands/tac.d.ts.map +1 -0
  109. package/dist/commands/tac.js +130 -0
  110. package/dist/commands/tac.js.map +1 -0
  111. package/dist/commands/time.d.ts +4 -0
  112. package/dist/commands/time.d.ts.map +1 -0
  113. package/dist/commands/time.js +126 -0
  114. package/dist/commands/time.js.map +1 -0
  115. package/dist/commands/umount.d.ts.map +1 -1
  116. package/dist/commands/umount.js +2 -3
  117. package/dist/commands/umount.js.map +1 -1
  118. package/dist/commands/uname.d.ts +4 -0
  119. package/dist/commands/uname.d.ts.map +1 -0
  120. package/dist/commands/uname.js +149 -0
  121. package/dist/commands/uname.js.map +1 -0
  122. package/dist/commands/unexpand.d.ts +4 -0
  123. package/dist/commands/unexpand.d.ts.map +1 -0
  124. package/dist/commands/unexpand.js +286 -0
  125. package/dist/commands/unexpand.js.map +1 -0
  126. package/dist/commands/uptime.d.ts +4 -0
  127. package/dist/commands/uptime.d.ts.map +1 -0
  128. package/dist/commands/uptime.js +62 -0
  129. package/dist/commands/uptime.js.map +1 -0
  130. package/dist/commands/yes.d.ts +4 -0
  131. package/dist/commands/yes.d.ts.map +1 -0
  132. package/dist/commands/yes.js +58 -0
  133. package/dist/commands/yes.js.map +1 -0
  134. package/dist/index.d.ts +21 -0
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +73 -0
  137. package/dist/index.js.map +1 -1
  138. package/package.json +3 -2
  139. package/src/commands/awk.ts +340 -0
  140. package/src/commands/chmod.ts +141 -2
  141. package/src/commands/chown.ts +321 -0
  142. package/src/commands/cksum.ts +133 -0
  143. package/src/commands/cmp.ts +126 -0
  144. package/src/commands/column.ts +273 -0
  145. package/src/commands/cp.ts +93 -4
  146. package/src/commands/curl.ts +231 -0
  147. package/src/commands/echo.ts +122 -2
  148. package/src/commands/expand.ts +207 -0
  149. package/src/commands/factor.ts +151 -0
  150. package/src/commands/fmt.ts +293 -0
  151. package/src/commands/fold.ts +257 -0
  152. package/src/commands/groups.ts +72 -0
  153. package/src/commands/hostname.ts +81 -0
  154. package/src/commands/mount.ts +208 -99
  155. package/src/commands/od.ts +327 -0
  156. package/src/commands/pr.ts +291 -0
  157. package/src/commands/printf.ts +271 -0
  158. package/src/commands/readlink.ts +102 -0
  159. package/src/commands/realpath.ts +126 -0
  160. package/src/commands/rev.ts +143 -0
  161. package/src/commands/shuf.ts +218 -0
  162. package/src/commands/sleep.ts +109 -0
  163. package/src/commands/strings.ts +176 -0
  164. package/src/commands/tac.ts +138 -0
  165. package/src/commands/time.ts +144 -0
  166. package/src/commands/umount.ts +2 -3
  167. package/src/commands/uname.ts +130 -0
  168. package/src/commands/unexpand.ts +305 -0
  169. package/src/commands/uptime.ts +73 -0
  170. package/src/index.ts +73 -0
  171. package/tsconfig.json +4 -0
@@ -0,0 +1,342 @@
1
+ import path from 'path';
2
+ import { TerminalCommand } from '../shared/terminal-command.js';
3
+ import { writelnStderr } from '../shared/helpers.js';
4
+ function printUsage(process, terminal) {
5
+ const usage = `Usage: od [OPTION]... [FILE]...
6
+ Dump files in octal and other formats.
7
+
8
+ -A, --address-radix=RADIX address format: d (decimal), o (octal), x (hex), n (none)
9
+ -t, --format=TYPE output format: o (octal), x (hex), d (decimal), u (unsigned), c (char), a (named char)
10
+ -N, --read-bytes=BYTES limit number of bytes to read
11
+ -j, --skip-bytes=BYTES skip bytes before reading
12
+ --help display this help and exit`;
13
+ writelnStderr(process, terminal, usage);
14
+ }
15
+ function formatAddress(offset, radix) {
16
+ switch (radix) {
17
+ case 'd':
18
+ return offset.toString(10).padStart(7, '0');
19
+ case 'o':
20
+ return offset.toString(8).padStart(7, '0');
21
+ case 'x':
22
+ return offset.toString(16).padStart(7, '0');
23
+ case 'n':
24
+ return '';
25
+ default:
26
+ return offset.toString(8).padStart(7, '0');
27
+ }
28
+ }
29
+ function formatByte(byte, format) {
30
+ switch (format) {
31
+ case 'o':
32
+ case 'o1':
33
+ return byte.toString(8).padStart(3, '0');
34
+ case 'x':
35
+ case 'x1':
36
+ return byte.toString(16).padStart(2, '0');
37
+ case 'd':
38
+ case 'd1':
39
+ return byte.toString(10).padStart(3, '0');
40
+ case 'u':
41
+ case 'u1':
42
+ return byte.toString(10).padStart(3, '0');
43
+ case 'c':
44
+ if (byte >= 32 && byte <= 126) {
45
+ return `'${String.fromCharCode(byte)}'`;
46
+ }
47
+ else if (byte === 0) {
48
+ return '\\0';
49
+ }
50
+ else if (byte === 7) {
51
+ return '\\a';
52
+ }
53
+ else if (byte === 8) {
54
+ return '\\b';
55
+ }
56
+ else if (byte === 9) {
57
+ return '\\t';
58
+ }
59
+ else if (byte === 10) {
60
+ return '\\n';
61
+ }
62
+ else if (byte === 11) {
63
+ return '\\v';
64
+ }
65
+ else if (byte === 12) {
66
+ return '\\f';
67
+ }
68
+ else if (byte === 13) {
69
+ return '\\r';
70
+ }
71
+ else {
72
+ return `\\${byte.toString(8).padStart(3, '0')}`;
73
+ }
74
+ case 'a':
75
+ if (byte >= 32 && byte <= 126) {
76
+ return String.fromCharCode(byte);
77
+ }
78
+ else {
79
+ return '.';
80
+ }
81
+ default:
82
+ return byte.toString(8).padStart(3, '0');
83
+ }
84
+ }
85
+ function formatLine(data, offset, addressRadix, format) {
86
+ const address = formatAddress(offset, addressRadix);
87
+ const bytes = [];
88
+ const ascii = [];
89
+ for (let i = 0; i < data.length; i++) {
90
+ const byte = data[i];
91
+ if (byte === undefined)
92
+ continue;
93
+ bytes.push(formatByte(byte, format));
94
+ if (byte >= 32 && byte <= 126) {
95
+ ascii.push(String.fromCharCode(byte));
96
+ }
97
+ else {
98
+ ascii.push('.');
99
+ }
100
+ }
101
+ let result = address ? `${address}: ` : '';
102
+ result += bytes.join(' ');
103
+ if (format !== 'c' && format !== 'a') {
104
+ result += ' ' + ascii.join('');
105
+ }
106
+ return result;
107
+ }
108
+ export function createCommand(kernel, shell, terminal) {
109
+ return new TerminalCommand({
110
+ command: 'od',
111
+ description: 'Dump files in octal and other formats',
112
+ kernel,
113
+ shell,
114
+ terminal,
115
+ run: async (pid, argv) => {
116
+ const process = kernel.processes.get(pid);
117
+ if (!process)
118
+ return 1;
119
+ if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
120
+ printUsage(process, terminal);
121
+ return 0;
122
+ }
123
+ let addressRadix = 'o';
124
+ let format = 'o1';
125
+ let readBytes = null;
126
+ let skipBytes = 0;
127
+ const files = [];
128
+ for (let i = 0; i < argv.length; i++) {
129
+ const arg = argv[i];
130
+ if (!arg)
131
+ continue;
132
+ if (arg === '--help' || arg === '-h') {
133
+ printUsage(process, terminal);
134
+ return 0;
135
+ }
136
+ else if (arg === '-A' || arg === '--address-radix') {
137
+ if (i + 1 < argv.length) {
138
+ const radix = argv[++i];
139
+ if (radix && ['d', 'o', 'x', 'n'].includes(radix)) {
140
+ addressRadix = radix;
141
+ }
142
+ else {
143
+ await writelnStderr(process, terminal, `od: invalid address radix: ${radix}`);
144
+ return 1;
145
+ }
146
+ }
147
+ }
148
+ else if (arg.startsWith('--address-radix=')) {
149
+ const radix = arg.slice(16);
150
+ if (['d', 'o', 'x', 'n'].includes(radix)) {
151
+ addressRadix = radix;
152
+ }
153
+ else {
154
+ await writelnStderr(process, terminal, `od: invalid address radix: ${radix}`);
155
+ return 1;
156
+ }
157
+ }
158
+ else if (arg.startsWith('-A')) {
159
+ const radix = arg.slice(2);
160
+ if (['d', 'o', 'x', 'n'].includes(radix)) {
161
+ addressRadix = radix;
162
+ }
163
+ else {
164
+ await writelnStderr(process, terminal, `od: invalid address radix: ${radix}`);
165
+ return 1;
166
+ }
167
+ }
168
+ else if (arg === '-t' || arg === '--format') {
169
+ if (i + 1 < argv.length) {
170
+ const fmt = argv[++i];
171
+ if (fmt) {
172
+ format = fmt;
173
+ }
174
+ }
175
+ }
176
+ else if (arg.startsWith('--format=')) {
177
+ format = arg.slice(9);
178
+ }
179
+ else if (arg.startsWith('-t')) {
180
+ format = arg.slice(2) || 'o1';
181
+ }
182
+ else if (arg === '-N' || arg === '--read-bytes') {
183
+ if (i + 1 < argv.length) {
184
+ const bytesStr = argv[++i];
185
+ if (bytesStr !== undefined) {
186
+ const parsed = parseInt(bytesStr, 10);
187
+ if (!isNaN(parsed) && parsed > 0) {
188
+ readBytes = parsed;
189
+ }
190
+ else {
191
+ await writelnStderr(process, terminal, `od: invalid byte count: ${bytesStr}`);
192
+ return 1;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ else if (arg.startsWith('--read-bytes=')) {
198
+ const bytesStr = arg.slice(13);
199
+ const parsed = parseInt(bytesStr, 10);
200
+ if (!isNaN(parsed) && parsed > 0) {
201
+ readBytes = parsed;
202
+ }
203
+ else {
204
+ await writelnStderr(process, terminal, `od: invalid byte count: ${bytesStr}`);
205
+ return 1;
206
+ }
207
+ }
208
+ else if (arg.startsWith('-N')) {
209
+ const bytesStr = arg.slice(2);
210
+ const parsed = parseInt(bytesStr, 10);
211
+ if (!isNaN(parsed) && parsed > 0) {
212
+ readBytes = parsed;
213
+ }
214
+ else {
215
+ await writelnStderr(process, terminal, `od: invalid byte count: ${bytesStr}`);
216
+ return 1;
217
+ }
218
+ }
219
+ else if (arg === '-j' || arg === '--skip-bytes') {
220
+ if (i + 1 < argv.length) {
221
+ const bytesStr = argv[++i];
222
+ if (bytesStr !== undefined) {
223
+ const parsed = parseInt(bytesStr, 10);
224
+ if (!isNaN(parsed) && parsed >= 0) {
225
+ skipBytes = parsed;
226
+ }
227
+ else {
228
+ await writelnStderr(process, terminal, `od: invalid skip count: ${bytesStr}`);
229
+ return 1;
230
+ }
231
+ }
232
+ }
233
+ }
234
+ else if (arg.startsWith('--skip-bytes=')) {
235
+ const bytesStr = arg.slice(13);
236
+ const parsed = parseInt(bytesStr, 10);
237
+ if (!isNaN(parsed) && parsed >= 0) {
238
+ skipBytes = parsed;
239
+ }
240
+ else {
241
+ await writelnStderr(process, terminal, `od: invalid skip count: ${bytesStr}`);
242
+ return 1;
243
+ }
244
+ }
245
+ else if (arg.startsWith('-j')) {
246
+ const bytesStr = arg.slice(2);
247
+ const parsed = parseInt(bytesStr, 10);
248
+ if (!isNaN(parsed) && parsed >= 0) {
249
+ skipBytes = parsed;
250
+ }
251
+ else {
252
+ await writelnStderr(process, terminal, `od: invalid skip count: ${bytesStr}`);
253
+ return 1;
254
+ }
255
+ }
256
+ else if (!arg.startsWith('-')) {
257
+ files.push(arg);
258
+ }
259
+ else {
260
+ await writelnStderr(process, terminal, `od: invalid option -- '${arg.slice(1)}'`);
261
+ await writelnStderr(process, terminal, "Try 'od --help' for more information.");
262
+ return 1;
263
+ }
264
+ }
265
+ const writer = process.stdout.getWriter();
266
+ try {
267
+ let data;
268
+ if (files.length === 0) {
269
+ if (!process.stdin) {
270
+ return 0;
271
+ }
272
+ const reader = process.stdin.getReader();
273
+ const chunks = [];
274
+ try {
275
+ while (true) {
276
+ const { done, value } = await reader.read();
277
+ if (done)
278
+ break;
279
+ if (value) {
280
+ chunks.push(value);
281
+ }
282
+ }
283
+ }
284
+ finally {
285
+ reader.releaseLock();
286
+ }
287
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
288
+ data = new Uint8Array(totalLength);
289
+ let offset = 0;
290
+ for (const chunk of chunks) {
291
+ data.set(chunk, offset);
292
+ offset += chunk.length;
293
+ }
294
+ }
295
+ else {
296
+ const file = files[0];
297
+ if (!file)
298
+ return 1;
299
+ const fullPath = path.resolve(shell.cwd, file);
300
+ try {
301
+ if (fullPath.startsWith('/dev')) {
302
+ await writelnStderr(process, terminal, `od: ${file}: cannot process device files`);
303
+ return 1;
304
+ }
305
+ const fileData = await shell.context.fs.promises.readFile(fullPath);
306
+ data = new Uint8Array(fileData);
307
+ }
308
+ catch (error) {
309
+ await writelnStderr(process, terminal, `od: ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`);
310
+ return 1;
311
+ }
312
+ }
313
+ if (skipBytes > 0) {
314
+ if (skipBytes >= data.length) {
315
+ return 0;
316
+ }
317
+ data = data.slice(skipBytes);
318
+ }
319
+ if (readBytes !== null && readBytes < data.length) {
320
+ data = data.slice(0, readBytes);
321
+ }
322
+ const bytesPerLine = 16;
323
+ let offset = 0;
324
+ while (offset < data.length) {
325
+ const lineData = data.slice(offset, offset + bytesPerLine);
326
+ const line = formatLine(lineData, offset + skipBytes, addressRadix, format);
327
+ await writer.write(new TextEncoder().encode(line + '\n'));
328
+ offset += lineData.length;
329
+ }
330
+ return 0;
331
+ }
332
+ catch (error) {
333
+ await writelnStderr(process, terminal, `od: ${error instanceof Error ? error.message : 'Unknown error'}`);
334
+ return 1;
335
+ }
336
+ finally {
337
+ writer.releaseLock();
338
+ }
339
+ }
340
+ });
341
+ }
342
+ //# sourceMappingURL=od.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"od.js","sourceRoot":"","sources":["../../src/commands/od.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Kernel, Shell, Terminal } from '@ecmaos/types';
2
+ import { TerminalCommand } from '../shared/terminal-command.js';
3
+ export declare function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal): TerminalCommand;
4
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AA8D/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAiO/F"}
@@ -0,0 +1,298 @@
1
+ import path from 'path';
2
+ import { TerminalEvents } from '@ecmaos/types';
3
+ import { TerminalCommand } from '../shared/terminal-command.js';
4
+ import { writelnStderr } from '../shared/helpers.js';
5
+ function printUsage(process, terminal) {
6
+ const usage = `Usage: pr [OPTION]... [FILE]...
7
+ Paginate or columnate files for printing.
8
+
9
+ -l, --length=NUMBER set page length (default: 66)
10
+ -w, --width=NUMBER set page width (default: 72)
11
+ -h, --header=HEADER set header string
12
+ -t, --omit-header omit page headers and footers
13
+ -n, --number-lines number lines
14
+ --help display this help and exit`;
15
+ writelnStderr(process, terminal, usage);
16
+ }
17
+ function formatPage(lines, pageLength, pageWidth, header, omitHeader, numberLines, pageNum, filename) {
18
+ const result = [];
19
+ const bodyLength = omitHeader ? pageLength : pageLength - 2;
20
+ if (!omitHeader && header !== undefined) {
21
+ const headerLine = header.padEnd(pageWidth).slice(0, pageWidth);
22
+ result.push(headerLine);
23
+ result.push('');
24
+ }
25
+ else if (!omitHeader) {
26
+ const date = new Date().toLocaleString();
27
+ const headerLine = `${filename} ${date}`.padEnd(pageWidth).slice(0, pageWidth);
28
+ result.push(headerLine);
29
+ result.push('');
30
+ }
31
+ const startLine = (pageNum - 1) * bodyLength;
32
+ const endLine = Math.min(startLine + bodyLength, lines.length);
33
+ for (let i = startLine; i < endLine; i++) {
34
+ let line = lines[i] || '';
35
+ if (line.length > pageWidth) {
36
+ line = line.slice(0, pageWidth);
37
+ }
38
+ else {
39
+ line = line.padEnd(pageWidth);
40
+ }
41
+ if (numberLines) {
42
+ const lineNum = (i + 1).toString().padStart(6);
43
+ line = `${lineNum} ${line.slice(0, pageWidth - 8)}`;
44
+ }
45
+ result.push(line);
46
+ }
47
+ while (result.length < pageLength && !omitHeader) {
48
+ result.push('');
49
+ }
50
+ if (!omitHeader) {
51
+ const footer = `Page ${pageNum}`.padStart(pageWidth);
52
+ result.push(footer);
53
+ }
54
+ return result;
55
+ }
56
+ export function createCommand(kernel, shell, terminal) {
57
+ return new TerminalCommand({
58
+ command: 'pr',
59
+ description: 'Paginate or columnate files for printing',
60
+ kernel,
61
+ shell,
62
+ terminal,
63
+ run: async (pid, argv) => {
64
+ const process = kernel.processes.get(pid);
65
+ if (!process)
66
+ return 1;
67
+ let pageLength = 66;
68
+ let pageWidth = 72;
69
+ let header;
70
+ let omitHeader = false;
71
+ let numberLines = false;
72
+ const files = [];
73
+ for (let i = 0; i < argv.length; i++) {
74
+ const arg = argv[i];
75
+ if (!arg)
76
+ continue;
77
+ if (arg === '--help') {
78
+ printUsage(process, terminal);
79
+ return 0;
80
+ }
81
+ else if (arg.startsWith('--header=')) {
82
+ header = arg.slice(9);
83
+ }
84
+ else if (arg === '--header') {
85
+ if (i + 1 < argv.length) {
86
+ header = argv[++i];
87
+ }
88
+ else {
89
+ await writelnStderr(process, terminal, `pr: option '--header' requires an argument`);
90
+ return 1;
91
+ }
92
+ }
93
+ else if (arg === '-h') {
94
+ if (i + 1 < argv.length) {
95
+ header = argv[++i];
96
+ }
97
+ else {
98
+ printUsage(process, terminal);
99
+ return 0;
100
+ }
101
+ }
102
+ else if (arg.startsWith('-h') && arg.length > 2) {
103
+ header = arg.slice(2);
104
+ }
105
+ else if (arg === '-l' || arg === '--length') {
106
+ if (i + 1 < argv.length) {
107
+ const lengthStr = argv[++i];
108
+ if (lengthStr !== undefined) {
109
+ const parsed = parseInt(lengthStr, 10);
110
+ if (!isNaN(parsed) && parsed > 0) {
111
+ pageLength = parsed;
112
+ }
113
+ else {
114
+ await writelnStderr(process, terminal, `pr: invalid page length: ${lengthStr}`);
115
+ return 1;
116
+ }
117
+ }
118
+ }
119
+ }
120
+ else if (arg.startsWith('--length=')) {
121
+ const lengthStr = arg.slice(9);
122
+ const parsed = parseInt(lengthStr, 10);
123
+ if (!isNaN(parsed) && parsed > 0) {
124
+ pageLength = parsed;
125
+ }
126
+ else {
127
+ await writelnStderr(process, terminal, `pr: invalid page length: ${lengthStr}`);
128
+ return 1;
129
+ }
130
+ }
131
+ else if (arg.startsWith('-l')) {
132
+ const lengthStr = arg.slice(2);
133
+ if (lengthStr) {
134
+ const parsed = parseInt(lengthStr, 10);
135
+ if (!isNaN(parsed) && parsed > 0) {
136
+ pageLength = parsed;
137
+ }
138
+ else {
139
+ await writelnStderr(process, terminal, `pr: invalid page length: ${lengthStr}`);
140
+ return 1;
141
+ }
142
+ }
143
+ }
144
+ else if (arg === '-w' || arg === '--width') {
145
+ if (i + 1 < argv.length) {
146
+ const widthStr = argv[++i];
147
+ if (widthStr !== undefined) {
148
+ const parsed = parseInt(widthStr, 10);
149
+ if (!isNaN(parsed) && parsed > 0) {
150
+ pageWidth = parsed;
151
+ }
152
+ else {
153
+ await writelnStderr(process, terminal, `pr: invalid page width: ${widthStr}`);
154
+ return 1;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ else if (arg.startsWith('--width=')) {
160
+ const widthStr = arg.slice(8);
161
+ const parsed = parseInt(widthStr, 10);
162
+ if (!isNaN(parsed) && parsed > 0) {
163
+ pageWidth = parsed;
164
+ }
165
+ else {
166
+ await writelnStderr(process, terminal, `pr: invalid page width: ${widthStr}`);
167
+ return 1;
168
+ }
169
+ }
170
+ else if (arg.startsWith('-w')) {
171
+ const widthStr = arg.slice(2);
172
+ if (widthStr) {
173
+ const parsed = parseInt(widthStr, 10);
174
+ if (!isNaN(parsed) && parsed > 0) {
175
+ pageWidth = parsed;
176
+ }
177
+ else {
178
+ await writelnStderr(process, terminal, `pr: invalid page width: ${widthStr}`);
179
+ return 1;
180
+ }
181
+ }
182
+ }
183
+ else if (arg === '-t' || arg === '--omit-header') {
184
+ omitHeader = true;
185
+ }
186
+ else if (arg === '-n' || arg === '--number-lines') {
187
+ numberLines = true;
188
+ }
189
+ else if (arg.startsWith('-')) {
190
+ const flags = arg.slice(1).split('');
191
+ if (flags.includes('t'))
192
+ omitHeader = true;
193
+ if (flags.includes('n'))
194
+ numberLines = true;
195
+ const invalidFlags = flags.filter(f => !['t', 'n'].includes(f));
196
+ if (invalidFlags.length > 0) {
197
+ await writelnStderr(process, terminal, `pr: invalid option -- '${invalidFlags[0]}'`);
198
+ await writelnStderr(process, terminal, "Try 'pr --help' for more information.");
199
+ return 1;
200
+ }
201
+ }
202
+ else {
203
+ files.push(arg);
204
+ }
205
+ }
206
+ const writer = process.stdout.getWriter();
207
+ try {
208
+ let lines = [];
209
+ if (files.length === 0) {
210
+ if (!process.stdin) {
211
+ return 0;
212
+ }
213
+ const reader = process.stdin.getReader();
214
+ const decoder = new TextDecoder();
215
+ let buffer = '';
216
+ try {
217
+ while (true) {
218
+ const { done, value } = await reader.read();
219
+ if (done)
220
+ break;
221
+ if (value) {
222
+ buffer += decoder.decode(value, { stream: true });
223
+ const newLines = buffer.split('\n');
224
+ buffer = newLines.pop() || '';
225
+ lines.push(...newLines);
226
+ }
227
+ }
228
+ if (buffer) {
229
+ lines.push(buffer);
230
+ }
231
+ }
232
+ finally {
233
+ reader.releaseLock();
234
+ }
235
+ }
236
+ else {
237
+ for (const file of files) {
238
+ const fullPath = path.resolve(shell.cwd, file);
239
+ let interrupted = false;
240
+ const interruptHandler = () => { interrupted = true; };
241
+ kernel.terminal.events.on(TerminalEvents.INTERRUPT, interruptHandler);
242
+ try {
243
+ if (fullPath.startsWith('/dev')) {
244
+ await writelnStderr(process, terminal, `pr: ${file}: cannot process device files`);
245
+ continue;
246
+ }
247
+ const handle = await shell.context.fs.promises.open(fullPath, 'r');
248
+ const stat = await shell.context.fs.promises.stat(fullPath);
249
+ const decoder = new TextDecoder();
250
+ let content = '';
251
+ let bytesRead = 0;
252
+ const chunkSize = 1024;
253
+ while (bytesRead < stat.size) {
254
+ if (interrupted)
255
+ break;
256
+ const data = new Uint8Array(chunkSize);
257
+ const readSize = Math.min(chunkSize, stat.size - bytesRead);
258
+ await handle.read(data, 0, readSize, bytesRead);
259
+ const chunk = data.subarray(0, readSize);
260
+ content += decoder.decode(chunk, { stream: true });
261
+ bytesRead += readSize;
262
+ }
263
+ const fileLines = content.split('\n');
264
+ if (fileLines[fileLines.length - 1] === '') {
265
+ fileLines.pop();
266
+ }
267
+ lines.push(...fileLines);
268
+ }
269
+ catch (error) {
270
+ await writelnStderr(process, terminal, `pr: ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`);
271
+ }
272
+ finally {
273
+ kernel.terminal.events.off(TerminalEvents.INTERRUPT, interruptHandler);
274
+ }
275
+ }
276
+ }
277
+ const bodyLength = omitHeader ? pageLength : pageLength - 2;
278
+ const totalPages = Math.ceil(lines.length / bodyLength);
279
+ const filename = files[0] ?? 'stdin';
280
+ for (let page = 1; page <= totalPages; page++) {
281
+ const pageLines = formatPage(lines, pageLength, pageWidth, header, omitHeader, numberLines, page, filename);
282
+ for (const line of pageLines) {
283
+ await writer.write(new TextEncoder().encode(line + '\n'));
284
+ }
285
+ }
286
+ return 0;
287
+ }
288
+ catch (error) {
289
+ await writelnStderr(process, terminal, `pr: ${error instanceof Error ? error.message : 'Unknown error'}`);
290
+ return 1;
291
+ }
292
+ finally {
293
+ writer.releaseLock();
294
+ }
295
+ }
296
+ });
297
+ }
298
+ //# sourceMappingURL=pr.js.map