shell-dsl 0.0.36 → 0.0.37
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.
- package/README.md +2 -1
- package/dist/cjs/index.cjs +2 -1
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/commands/echo/echo.cjs +29 -23
- package/dist/cjs/src/commands/echo/echo.cjs.map +3 -3
- package/dist/cjs/src/commands/index.cjs +6 -2
- package/dist/cjs/src/commands/index.cjs.map +3 -3
- package/dist/cjs/src/commands/od/od.cjs +274 -0
- package/dist/cjs/src/commands/od/od.cjs.map +10 -0
- package/dist/mjs/index.mjs +4 -2
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/src/commands/echo/echo.mjs +29 -23
- package/dist/mjs/src/commands/echo/echo.mjs.map +3 -3
- package/dist/mjs/src/commands/index.mjs +6 -2
- package/dist/mjs/src/commands/index.mjs.map +3 -3
- package/dist/mjs/src/commands/od/od.mjs +234 -0
- package/dist/mjs/src/commands/od/od.mjs.map +10 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/src/commands/index.d.ts +1 -0
- package/dist/types/src/commands/od/od.d.ts +2 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -567,7 +567,7 @@ import { builtinCommands } from "shell-dsl/commands";
|
|
|
567
567
|
Or import individually:
|
|
568
568
|
|
|
569
569
|
```ts
|
|
570
|
-
import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk, cut } from "shell-dsl/commands";
|
|
570
|
+
import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk, cut, od } from "shell-dsl/commands";
|
|
571
571
|
```
|
|
572
572
|
|
|
573
573
|
| Command | Description |
|
|
@@ -593,6 +593,7 @@ import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk, cut } fr
|
|
|
593
593
|
| `sed` | Stream editor (`s///`, `d`, `p`, `-n`, `-e`) |
|
|
594
594
|
| `awk` | Pattern scanning (`{print $1}`, `-F`, `NF`, `NR`) |
|
|
595
595
|
| `cut` | Select fields/characters (`-f`, `-d`, `-c`, `-b`, `-s`, `--complement`) |
|
|
596
|
+
| `od` | Dump binary/text data (`-A`, `-t x1/x2/o1/o2/c`, `-j`, `-N`, `-v`) |
|
|
596
597
|
| `test` / `[` | File and string tests (`-f`, `-d`, `-e`, `-z`, `-n`, `=`, `!=`) |
|
|
597
598
|
| `true` | Exit with code 0 |
|
|
598
599
|
| `false` | Exit with code 1 |
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -69,6 +69,7 @@ __export(exports_shell_dsl, {
|
|
|
69
69
|
sed: () => import_commands2.sed,
|
|
70
70
|
rm: () => import_commands2.rm,
|
|
71
71
|
pwd: () => import_commands2.pwd,
|
|
72
|
+
od: () => import_commands2.od,
|
|
72
73
|
mv: () => import_commands2.mv,
|
|
73
74
|
mkdir: () => import_commands2.mkdir,
|
|
74
75
|
ls: () => import_commands2.ls,
|
|
@@ -90,4 +91,4 @@ __reExport(exports_shell_dsl, require("./src/index.cjs"), module.exports);
|
|
|
90
91
|
var import_commands = require("./src/commands/index.cjs");
|
|
91
92
|
var import_commands2 = require("./src/commands/index.cjs");
|
|
92
93
|
|
|
93
|
-
//# debugId=
|
|
94
|
+
//# debugId=D3C9D8D0D2FCEB0A64756E2164756E21
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"// Re-export everything from src\nexport * from \"./src/index.cjs\";\n\n// Re-export built-in commands\nexport { builtinCommands } from \"./src/commands/index.cjs\";\nexport {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n bracket,\n trueCmd,\n falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n breakCmd,\n continueCmd,\n} from \"./src/commands/index.cjs\";\n"
|
|
5
|
+
"// Re-export everything from src\nexport * from \"./src/index.cjs\";\n\n// Re-export built-in commands\nexport { builtinCommands } from \"./src/commands/index.cjs\";\nexport {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n bracket,\n trueCmd,\n falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n breakCmd,\n continueCmd,\n od,\n} from \"./src/commands/index.cjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAGgC,IAAhC;AA6BO,IA5BP;",
|
|
8
|
+
"debugId": "D3C9D8D0D2FCEB0A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
|
@@ -42,31 +42,37 @@ __export(exports_echo, {
|
|
|
42
42
|
echo: () => echo
|
|
43
43
|
});
|
|
44
44
|
module.exports = __toCommonJS(exports_echo);
|
|
45
|
-
var import_flag_parser = require("../../utils/flag-parser.cjs");
|
|
46
45
|
var import_expand_escapes = require("../../utils/expand-escapes.cjs");
|
|
47
|
-
var spec = {
|
|
48
|
-
name: "echo",
|
|
49
|
-
flags: [
|
|
50
|
-
{ short: "n" },
|
|
51
|
-
{ short: "e" }
|
|
52
|
-
],
|
|
53
|
-
usage: "echo [-neE] [string ...]",
|
|
54
|
-
stopAfterFirstPositional: true
|
|
55
|
-
};
|
|
56
46
|
var defaults = { noNewline: false, interpretEscapes: false };
|
|
57
|
-
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const result = parser.parse(ctx.args);
|
|
66
|
-
if (result.error) {
|
|
67
|
-
await parser.writeError(result.error, ctx.stderr);
|
|
68
|
-
return 1;
|
|
47
|
+
function isEchoOption(arg) {
|
|
48
|
+
if (!arg.startsWith("-") || arg === "-") {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
for (const char of arg.slice(1)) {
|
|
52
|
+
if (char !== "n" && char !== "e" && char !== "E") {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
69
55
|
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
function parseEchoArgs(args) {
|
|
59
|
+
const flags = { ...defaults };
|
|
60
|
+
let index = 0;
|
|
61
|
+
while (index < args.length && isEchoOption(args[index])) {
|
|
62
|
+
for (const char of args[index].slice(1)) {
|
|
63
|
+
if (char === "n")
|
|
64
|
+
flags.noNewline = true;
|
|
65
|
+
if (char === "e")
|
|
66
|
+
flags.interpretEscapes = true;
|
|
67
|
+
if (char === "E")
|
|
68
|
+
flags.interpretEscapes = false;
|
|
69
|
+
}
|
|
70
|
+
index++;
|
|
71
|
+
}
|
|
72
|
+
return { flags, args: args.slice(index) };
|
|
73
|
+
}
|
|
74
|
+
var echo = async (ctx) => {
|
|
75
|
+
const result = parseEchoArgs(ctx.args);
|
|
70
76
|
let output = result.args.join(" ");
|
|
71
77
|
if (result.flags.interpretEscapes) {
|
|
72
78
|
output = import_expand_escapes.expandEscapes(output);
|
|
@@ -79,4 +85,4 @@ var echo = async (ctx) => {
|
|
|
79
85
|
return 0;
|
|
80
86
|
};
|
|
81
87
|
|
|
82
|
-
//# debugId=
|
|
88
|
+
//# debugId=91584B2D49E63BEA64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/echo/echo.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\nimport {
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { expandEscapes } from \"../../utils/expand-escapes.cjs\";\n\ninterface EchoFlags {\n noNewline: boolean;\n interpretEscapes: boolean;\n}\n\nconst defaults: EchoFlags = { noNewline: false, interpretEscapes: false };\n\nfunction isEchoOption(arg: string): boolean {\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n return false;\n }\n\n for (const char of arg.slice(1)) {\n if (char !== \"n\" && char !== \"e\" && char !== \"E\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseEchoArgs(args: string[]): { flags: EchoFlags; args: string[] } {\n const flags = { ...defaults };\n let index = 0;\n\n // Match common shell echo behavior: only leading -n/-e/-E clusters are\n // treated as options. Anything else, including \"--\" and \"--invalid\", is\n // printed literally.\n while (index < args.length && isEchoOption(args[index]!)) {\n for (const char of args[index]!.slice(1)) {\n if (char === \"n\") flags.noNewline = true;\n if (char === \"e\") flags.interpretEscapes = true;\n if (char === \"E\") flags.interpretEscapes = false;\n }\n index++;\n }\n\n return { flags, args: args.slice(index) };\n}\n\nexport const echo: Command = async (ctx) => {\n const result = parseEchoArgs(ctx.args);\n\n let output = result.args.join(\" \");\n\n if (result.flags.interpretEscapes) {\n output = expandEscapes(output);\n }\n\n if (!result.flags.noNewline) {\n output += \"\\n\";\n }\n\n await ctx.stdout.writeText(output);\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAC8B,IAA9B;AAOA,IAAM,WAAsB,EAAE,WAAW,OAAO,kBAAkB,MAAM;AAExE,SAAS,YAAY,CAAC,KAAsB;AAAA,EAC1C,IAAI,CAAC,IAAI,WAAW,GAAG,KAAK,QAAQ,KAAK;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAQ,IAAI,MAAM,CAAC,GAAG;AAAA,IAC/B,IAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAAA,MAChD,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,MAAsD;AAAA,EAC3E,MAAM,QAAQ,KAAK,SAAS;AAAA,EAC5B,IAAI,QAAQ;AAAA,EAKZ,OAAO,QAAQ,KAAK,UAAU,aAAa,KAAK,MAAO,GAAG;AAAA,IACxD,WAAW,QAAQ,KAAK,OAAQ,MAAM,CAAC,GAAG;AAAA,MACxC,IAAI,SAAS;AAAA,QAAK,MAAM,YAAY;AAAA,MACpC,IAAI,SAAS;AAAA,QAAK,MAAM,mBAAmB;AAAA,MAC3C,IAAI,SAAS;AAAA,QAAK,MAAM,mBAAmB;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,OAAO,MAAM,KAAK,MAAM,KAAK,EAAE;AAAA;AAGnC,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAC1C,MAAM,SAAS,cAAc,IAAI,IAAI;AAAA,EAErC,IAAI,SAAS,OAAO,KAAK,KAAK,GAAG;AAAA,EAEjC,IAAI,OAAO,MAAM,kBAAkB;AAAA,IACjC,SAAS,oCAAc,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,CAAC,OAAO,MAAM,WAAW;AAAA,IAC3B,UAAU;AAAA;AAAA,EACZ;AAAA,EAEA,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,EACjC,OAAO;AAAA;",
|
|
8
|
+
"debugId": "91584B2D49E63BEA64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -52,6 +52,7 @@ __export(exports_commands, {
|
|
|
52
52
|
sed: () => import_sed.sed,
|
|
53
53
|
rm: () => import_rm.rm,
|
|
54
54
|
pwd: () => import_pwd.pwd,
|
|
55
|
+
od: () => import_od.od,
|
|
55
56
|
mv: () => import_mv.mv,
|
|
56
57
|
mkdir: () => import_mkdir.mkdir,
|
|
57
58
|
ls: () => import_ls.ls,
|
|
@@ -99,6 +100,7 @@ var import_colon = require("./colon/colon.cjs");
|
|
|
99
100
|
var import_cd = require("./cd/cd.cjs");
|
|
100
101
|
var import_tr = require("./tr/tr.cjs");
|
|
101
102
|
var import_cut = require("./cut/cut.cjs");
|
|
103
|
+
var import_od = require("./od/od.cjs");
|
|
102
104
|
var import_echo2 = require("./echo/echo.cjs");
|
|
103
105
|
var import_cat2 = require("./cat/cat.cjs");
|
|
104
106
|
var import_grep2 = require("./grep/grep.cjs");
|
|
@@ -126,6 +128,7 @@ var import_colon2 = require("./colon/colon.cjs");
|
|
|
126
128
|
var import_cd2 = require("./cd/cd.cjs");
|
|
127
129
|
var import_tr2 = require("./tr/tr.cjs");
|
|
128
130
|
var import_cut2 = require("./cut/cut.cjs");
|
|
131
|
+
var import_od2 = require("./od/od.cjs");
|
|
129
132
|
var builtinCommands = {
|
|
130
133
|
echo: import_echo2.echo,
|
|
131
134
|
cat: import_cat2.cat,
|
|
@@ -156,7 +159,8 @@ var builtinCommands = {
|
|
|
156
159
|
":": import_colon2.colon,
|
|
157
160
|
cd: import_cd2.cd,
|
|
158
161
|
tr: import_tr2.tr,
|
|
159
|
-
cut: import_cut2.cut
|
|
162
|
+
cut: import_cut2.cut,
|
|
163
|
+
od: import_od2.od
|
|
160
164
|
};
|
|
161
165
|
|
|
162
|
-
//# debugId=
|
|
166
|
+
//# debugId=3F2FAD85701006CD64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/commands/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../types.cjs\";\n\nexport { echo } from \"./echo/echo.cjs\";\nexport { cat } from \"./cat/cat.cjs\";\nexport { grep } from \"./grep/grep.cjs\";\nexport { wc } from \"./wc/wc.cjs\";\nexport { head } from \"./head/head.cjs\";\nexport { tail } from \"./tail/tail.cjs\";\nexport { sort } from \"./sort/sort.cjs\";\nexport { uniq } from \"./uniq/uniq.cjs\";\nexport { pwd } from \"./pwd/pwd.cjs\";\nexport { ls } from \"./ls/ls.cjs\";\nexport { mkdir } from \"./mkdir/mkdir.cjs\";\nexport { rm } from \"./rm/rm.cjs\";\nexport { test, bracket } from \"./test/test.cjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nexport { touch } from \"./touch/touch.cjs\";\nexport { cp } from \"./cp/cp.cjs\";\nexport { mv } from \"./mv/mv.cjs\";\nexport { tee } from \"./tee/tee.cjs\";\nexport { tree } from \"./tree/tree.cjs\";\nexport { find } from \"./find/find.cjs\";\nexport { sed } from \"./sed/sed.cjs\";\nexport { awk } from \"./awk/awk.cjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nexport { colon } from \"./colon/colon.cjs\";\nexport { cd } from \"./cd/cd.cjs\";\nexport { tr } from \"./tr/tr.cjs\";\nexport { cut } from \"./cut/cut.cjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.cjs\";\nimport { cat } from \"./cat/cat.cjs\";\nimport { grep } from \"./grep/grep.cjs\";\nimport { wc } from \"./wc/wc.cjs\";\nimport { head } from \"./head/head.cjs\";\nimport { tail } from \"./tail/tail.cjs\";\nimport { sort } from \"./sort/sort.cjs\";\nimport { uniq } from \"./uniq/uniq.cjs\";\nimport { pwd } from \"./pwd/pwd.cjs\";\nimport { ls } from \"./ls/ls.cjs\";\nimport { mkdir } from \"./mkdir/mkdir.cjs\";\nimport { rm } from \"./rm/rm.cjs\";\nimport { test, bracket } from \"./test/test.cjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nimport { touch } from \"./touch/touch.cjs\";\nimport { cp } from \"./cp/cp.cjs\";\nimport { mv } from \"./mv/mv.cjs\";\nimport { tee } from \"./tee/tee.cjs\";\nimport { tree } from \"./tree/tree.cjs\";\nimport { find } from \"./find/find.cjs\";\nimport { sed } from \"./sed/sed.cjs\";\nimport { awk } from \"./awk/awk.cjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nimport { colon } from \"./colon/colon.cjs\";\nimport { cd } from \"./cd/cd.cjs\";\nimport { tr } from \"./tr/tr.cjs\";\nimport { cut } from \"./cut/cut.cjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n cd,\n tr,\n cut,\n};\n"
|
|
5
|
+
"import type { Command } from \"../types.cjs\";\n\nexport { echo } from \"./echo/echo.cjs\";\nexport { cat } from \"./cat/cat.cjs\";\nexport { grep } from \"./grep/grep.cjs\";\nexport { wc } from \"./wc/wc.cjs\";\nexport { head } from \"./head/head.cjs\";\nexport { tail } from \"./tail/tail.cjs\";\nexport { sort } from \"./sort/sort.cjs\";\nexport { uniq } from \"./uniq/uniq.cjs\";\nexport { pwd } from \"./pwd/pwd.cjs\";\nexport { ls } from \"./ls/ls.cjs\";\nexport { mkdir } from \"./mkdir/mkdir.cjs\";\nexport { rm } from \"./rm/rm.cjs\";\nexport { test, bracket } from \"./test/test.cjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nexport { touch } from \"./touch/touch.cjs\";\nexport { cp } from \"./cp/cp.cjs\";\nexport { mv } from \"./mv/mv.cjs\";\nexport { tee } from \"./tee/tee.cjs\";\nexport { tree } from \"./tree/tree.cjs\";\nexport { find } from \"./find/find.cjs\";\nexport { sed } from \"./sed/sed.cjs\";\nexport { awk } from \"./awk/awk.cjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nexport { colon } from \"./colon/colon.cjs\";\nexport { cd } from \"./cd/cd.cjs\";\nexport { tr } from \"./tr/tr.cjs\";\nexport { cut } from \"./cut/cut.cjs\";\nexport { od } from \"./od/od.cjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.cjs\";\nimport { cat } from \"./cat/cat.cjs\";\nimport { grep } from \"./grep/grep.cjs\";\nimport { wc } from \"./wc/wc.cjs\";\nimport { head } from \"./head/head.cjs\";\nimport { tail } from \"./tail/tail.cjs\";\nimport { sort } from \"./sort/sort.cjs\";\nimport { uniq } from \"./uniq/uniq.cjs\";\nimport { pwd } from \"./pwd/pwd.cjs\";\nimport { ls } from \"./ls/ls.cjs\";\nimport { mkdir } from \"./mkdir/mkdir.cjs\";\nimport { rm } from \"./rm/rm.cjs\";\nimport { test, bracket } from \"./test/test.cjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nimport { touch } from \"./touch/touch.cjs\";\nimport { cp } from \"./cp/cp.cjs\";\nimport { mv } from \"./mv/mv.cjs\";\nimport { tee } from \"./tee/tee.cjs\";\nimport { tree } from \"./tree/tree.cjs\";\nimport { find } from \"./find/find.cjs\";\nimport { sed } from \"./sed/sed.cjs\";\nimport { awk } from \"./awk/awk.cjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nimport { colon } from \"./colon/colon.cjs\";\nimport { cd } from \"./cd/cd.cjs\";\nimport { tr } from \"./tr/tr.cjs\";\nimport { cut } from \"./cut/cut.cjs\";\nimport { od } from \"./od/od.cjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n cd,\n tr,\n cut,\n od,\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACmB,IAAnB;AAGqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACmB,IAAnB;AAEO,IAAM,kBAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
8
|
+
"debugId": "3F2FAD85701006CD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
8
|
+
var __toCommonJS = (from) => {
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
10
|
+
if (entry)
|
|
11
|
+
return entry;
|
|
12
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
__moduleCache.set(from, entry);
|
|
22
|
+
return entry;
|
|
23
|
+
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
29
|
+
var __export = (target, all) => {
|
|
30
|
+
for (var name in all)
|
|
31
|
+
__defProp(target, name, {
|
|
32
|
+
get: all[name],
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/commands/od/od.ts
|
|
40
|
+
var exports_od = {};
|
|
41
|
+
__export(exports_od, {
|
|
42
|
+
od: () => od
|
|
43
|
+
});
|
|
44
|
+
module.exports = __toCommonJS(exports_od);
|
|
45
|
+
var import_flag_parser = require("../../utils/flag-parser.cjs");
|
|
46
|
+
var ADDRESS_WIDTH = 7;
|
|
47
|
+
var ADDRESS_SEPARATOR = " ";
|
|
48
|
+
var NO_ADDRESS_PREFIX = " ".repeat(ADDRESS_WIDTH + ADDRESS_SEPARATOR.length);
|
|
49
|
+
var LINE_BYTES = 16;
|
|
50
|
+
var spec = {
|
|
51
|
+
name: "od",
|
|
52
|
+
flags: [
|
|
53
|
+
{ short: "A", takesValue: true },
|
|
54
|
+
{ short: "b" },
|
|
55
|
+
{ short: "c" },
|
|
56
|
+
{ short: "j", takesValue: true },
|
|
57
|
+
{ short: "N", takesValue: true },
|
|
58
|
+
{ short: "o" },
|
|
59
|
+
{ short: "t", takesValue: true },
|
|
60
|
+
{ short: "v" },
|
|
61
|
+
{ short: "x" }
|
|
62
|
+
],
|
|
63
|
+
usage: "od [-bcovx] [-A radix] [-j skip] [-N count] [-t type] [file ...]"
|
|
64
|
+
};
|
|
65
|
+
var defaults = {
|
|
66
|
+
addressRadix: "o",
|
|
67
|
+
format: null,
|
|
68
|
+
formatConflict: null,
|
|
69
|
+
invalidType: null,
|
|
70
|
+
verbose: false,
|
|
71
|
+
skip: null,
|
|
72
|
+
count: null
|
|
73
|
+
};
|
|
74
|
+
function selectFormat(flags, format, source) {
|
|
75
|
+
if (flags.format === null) {
|
|
76
|
+
flags.format = format;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
flags.formatConflict = source;
|
|
80
|
+
}
|
|
81
|
+
function isOutputFormat(value) {
|
|
82
|
+
return value === "x1" || value === "x2" || value === "o1" || value === "o2" || value === "c";
|
|
83
|
+
}
|
|
84
|
+
var parser = import_flag_parser.createFlagParser(spec, defaults, (flags, flag, value) => {
|
|
85
|
+
switch (flag.short) {
|
|
86
|
+
case "A":
|
|
87
|
+
flags.addressRadix = value ?? "o";
|
|
88
|
+
break;
|
|
89
|
+
case "b":
|
|
90
|
+
selectFormat(flags, "o1", "-b");
|
|
91
|
+
break;
|
|
92
|
+
case "c":
|
|
93
|
+
selectFormat(flags, "c", "-c");
|
|
94
|
+
break;
|
|
95
|
+
case "j":
|
|
96
|
+
flags.skip = value ?? null;
|
|
97
|
+
break;
|
|
98
|
+
case "N":
|
|
99
|
+
flags.count = value ?? null;
|
|
100
|
+
break;
|
|
101
|
+
case "o":
|
|
102
|
+
selectFormat(flags, "o2", "-o");
|
|
103
|
+
break;
|
|
104
|
+
case "t":
|
|
105
|
+
if (value && isOutputFormat(value)) {
|
|
106
|
+
selectFormat(flags, value, "-t");
|
|
107
|
+
} else if (value) {
|
|
108
|
+
flags.invalidType = value;
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case "v":
|
|
112
|
+
flags.verbose = true;
|
|
113
|
+
break;
|
|
114
|
+
case "x":
|
|
115
|
+
selectFormat(flags, "x2", "-x");
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
function isAddressRadix(value) {
|
|
120
|
+
return value === "o" || value === "d" || value === "x" || value === "n";
|
|
121
|
+
}
|
|
122
|
+
function parseNonNegativeInteger(value, label) {
|
|
123
|
+
if (!/^\d+$/.test(value)) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const parsed = Number(value);
|
|
127
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return parsed;
|
|
131
|
+
}
|
|
132
|
+
function formatAddress(offset, radix) {
|
|
133
|
+
const base = radix === "o" ? 8 : radix === "d" ? 10 : 16;
|
|
134
|
+
return offset.toString(base).padStart(ADDRESS_WIDTH, "0");
|
|
135
|
+
}
|
|
136
|
+
function formatCharacter(byte) {
|
|
137
|
+
let token;
|
|
138
|
+
if (byte === 0) {
|
|
139
|
+
token = "\\0";
|
|
140
|
+
} else if (byte === 9) {
|
|
141
|
+
token = "\\t";
|
|
142
|
+
} else if (byte === 10) {
|
|
143
|
+
token = "\\n";
|
|
144
|
+
} else if (byte >= 32 && byte <= 126) {
|
|
145
|
+
token = String.fromCharCode(byte);
|
|
146
|
+
} else {
|
|
147
|
+
token = `\\${byte.toString(8).padStart(3, "0")}`;
|
|
148
|
+
}
|
|
149
|
+
return token.length < 3 ? token.padStart(3, " ") : token;
|
|
150
|
+
}
|
|
151
|
+
function formatWord(bytes, index, radix) {
|
|
152
|
+
const low = bytes[index] ?? 0;
|
|
153
|
+
const high = bytes[index + 1] ?? 0;
|
|
154
|
+
const value = low | high << 8;
|
|
155
|
+
const base = radix === "hex" ? 16 : 8;
|
|
156
|
+
const width = radix === "hex" ? 4 : 6;
|
|
157
|
+
return value.toString(base).padStart(width, "0");
|
|
158
|
+
}
|
|
159
|
+
function formatRow(bytes, format) {
|
|
160
|
+
const values = [];
|
|
161
|
+
if (format === "x1") {
|
|
162
|
+
for (const byte of bytes) {
|
|
163
|
+
values.push(byte.toString(16).padStart(2, "0"));
|
|
164
|
+
}
|
|
165
|
+
} else if (format === "o1") {
|
|
166
|
+
for (const byte of bytes) {
|
|
167
|
+
values.push(byte.toString(8).padStart(3, "0"));
|
|
168
|
+
}
|
|
169
|
+
} else if (format === "c") {
|
|
170
|
+
for (const byte of bytes) {
|
|
171
|
+
values.push(formatCharacter(byte));
|
|
172
|
+
}
|
|
173
|
+
} else if (format === "x2") {
|
|
174
|
+
for (let i = 0;i < bytes.length; i += 2) {
|
|
175
|
+
values.push(formatWord(bytes, i, "hex"));
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
for (let i = 0;i < bytes.length; i += 2) {
|
|
179
|
+
values.push(formatWord(bytes, i, "octal"));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return values.join(" ");
|
|
183
|
+
}
|
|
184
|
+
async function readInput(ctx, files) {
|
|
185
|
+
if (files.length === 0) {
|
|
186
|
+
return await ctx.stdin.buffer();
|
|
187
|
+
}
|
|
188
|
+
const chunks = [];
|
|
189
|
+
for (const file of files) {
|
|
190
|
+
try {
|
|
191
|
+
const path = ctx.fs.resolve(ctx.cwd, file);
|
|
192
|
+
chunks.push(await ctx.fs.readFile(path));
|
|
193
|
+
} catch {
|
|
194
|
+
await ctx.stderr.writeText(`od: ${file}: No such file or directory
|
|
195
|
+
`);
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return Buffer.concat(chunks);
|
|
200
|
+
}
|
|
201
|
+
var od = async (ctx) => {
|
|
202
|
+
const result = parser.parse(ctx.args);
|
|
203
|
+
if (result.error) {
|
|
204
|
+
await parser.writeError(result.error, ctx.stderr);
|
|
205
|
+
return 1;
|
|
206
|
+
}
|
|
207
|
+
const { addressRadix, formatConflict, invalidType, skip, count, verbose } = result.flags;
|
|
208
|
+
if (!isAddressRadix(addressRadix)) {
|
|
209
|
+
await ctx.stderr.writeText(`od: invalid address radix '${addressRadix}'
|
|
210
|
+
`);
|
|
211
|
+
return 1;
|
|
212
|
+
}
|
|
213
|
+
if (invalidType !== null) {
|
|
214
|
+
await ctx.stderr.writeText(`od: invalid type string '${invalidType}'
|
|
215
|
+
`);
|
|
216
|
+
return 1;
|
|
217
|
+
}
|
|
218
|
+
if (formatConflict !== null) {
|
|
219
|
+
await ctx.stderr.writeText(`od: multiple output formats are not supported
|
|
220
|
+
`);
|
|
221
|
+
return 1;
|
|
222
|
+
}
|
|
223
|
+
const skipBytes = skip === null ? 0 : parseNonNegativeInteger(skip, "skip");
|
|
224
|
+
if (skipBytes === null) {
|
|
225
|
+
await ctx.stderr.writeText(`od: invalid skip '${skip}'
|
|
226
|
+
`);
|
|
227
|
+
return 1;
|
|
228
|
+
}
|
|
229
|
+
const countBytes = count === null ? null : parseNonNegativeInteger(count, "count");
|
|
230
|
+
if (count !== null && countBytes === null) {
|
|
231
|
+
await ctx.stderr.writeText(`od: invalid byte count '${count}'
|
|
232
|
+
`);
|
|
233
|
+
return 1;
|
|
234
|
+
}
|
|
235
|
+
const input = await readInput(ctx, result.args);
|
|
236
|
+
if (input === null) {
|
|
237
|
+
return 1;
|
|
238
|
+
}
|
|
239
|
+
const start = Math.min(skipBytes, input.length);
|
|
240
|
+
const sliced = countBytes === null ? input.subarray(start) : input.subarray(start, Math.min(start + countBytes, input.length));
|
|
241
|
+
if (sliced.length === 0) {
|
|
242
|
+
return 0;
|
|
243
|
+
}
|
|
244
|
+
const format = result.flags.format ?? "o2";
|
|
245
|
+
let previousRow = null;
|
|
246
|
+
let emittedSqueezeMarker = false;
|
|
247
|
+
let offset = start;
|
|
248
|
+
for (let i = 0;i < sliced.length; i += LINE_BYTES) {
|
|
249
|
+
const rowBytes = sliced.subarray(i, Math.min(i + LINE_BYTES, sliced.length));
|
|
250
|
+
const row = formatRow(rowBytes, format);
|
|
251
|
+
if (!verbose && row === previousRow) {
|
|
252
|
+
if (!emittedSqueezeMarker) {
|
|
253
|
+
await ctx.stdout.writeText(`*
|
|
254
|
+
`);
|
|
255
|
+
emittedSqueezeMarker = true;
|
|
256
|
+
}
|
|
257
|
+
offset += rowBytes.length;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
previousRow = row;
|
|
261
|
+
emittedSqueezeMarker = false;
|
|
262
|
+
const prefix = addressRadix === "n" ? NO_ADDRESS_PREFIX : `${formatAddress(offset, addressRadix)}${ADDRESS_SEPARATOR}`;
|
|
263
|
+
await ctx.stdout.writeText(`${prefix}${row}
|
|
264
|
+
`);
|
|
265
|
+
offset += rowBytes.length;
|
|
266
|
+
}
|
|
267
|
+
if (addressRadix !== "n") {
|
|
268
|
+
await ctx.stdout.writeText(`${formatAddress(offset, addressRadix)}
|
|
269
|
+
`);
|
|
270
|
+
}
|
|
271
|
+
return 0;
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
//# debugId=3DFF62CF5B2C215464756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/commands/od/od.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ntype AddressRadix = \"o\" | \"d\" | \"x\" | \"n\";\ntype OutputFormat = \"x1\" | \"x2\" | \"o1\" | \"o2\" | \"c\";\n\ninterface OdFlags {\n addressRadix: string;\n format: OutputFormat | null;\n formatConflict: string | null;\n invalidType: string | null;\n verbose: boolean;\n skip: string | null;\n count: string | null;\n}\n\nconst ADDRESS_WIDTH = 7;\nconst ADDRESS_SEPARATOR = \" \";\nconst NO_ADDRESS_PREFIX = \" \".repeat(ADDRESS_WIDTH + ADDRESS_SEPARATOR.length);\nconst LINE_BYTES = 16;\n\nconst spec = {\n name: \"od\",\n flags: [\n { short: \"A\", takesValue: true },\n { short: \"b\" },\n { short: \"c\" },\n { short: \"j\", takesValue: true },\n { short: \"N\", takesValue: true },\n { short: \"o\" },\n { short: \"t\", takesValue: true },\n { short: \"v\" },\n { short: \"x\" },\n ] as FlagDefinition[],\n usage: \"od [-bcovx] [-A radix] [-j skip] [-N count] [-t type] [file ...]\",\n};\n\nconst defaults: OdFlags = {\n addressRadix: \"o\",\n format: null,\n formatConflict: null,\n invalidType: null,\n verbose: false,\n skip: null,\n count: null,\n};\n\nfunction selectFormat(flags: OdFlags, format: OutputFormat, source: string): void {\n if (flags.format === null) {\n flags.format = format;\n return;\n }\n\n flags.formatConflict = source;\n}\n\nfunction isOutputFormat(value: string): value is OutputFormat {\n return value === \"x1\" || value === \"x2\" || value === \"o1\" || value === \"o2\" || value === \"c\";\n}\n\nconst parser = createFlagParser(spec, defaults, (flags, flag, value) => {\n switch (flag.short) {\n case \"A\":\n flags.addressRadix = value ?? \"o\";\n break;\n case \"b\":\n selectFormat(flags, \"o1\", \"-b\");\n break;\n case \"c\":\n selectFormat(flags, \"c\", \"-c\");\n break;\n case \"j\":\n flags.skip = value ?? null;\n break;\n case \"N\":\n flags.count = value ?? null;\n break;\n case \"o\":\n selectFormat(flags, \"o2\", \"-o\");\n break;\n case \"t\":\n if (value && isOutputFormat(value)) {\n selectFormat(flags, value, \"-t\");\n } else if (value) {\n flags.invalidType = value;\n }\n break;\n case \"v\":\n flags.verbose = true;\n break;\n case \"x\":\n selectFormat(flags, \"x2\", \"-x\");\n break;\n }\n});\n\nfunction isAddressRadix(value: string): value is AddressRadix {\n return value === \"o\" || value === \"d\" || value === \"x\" || value === \"n\";\n}\n\nfunction parseNonNegativeInteger(value: string, label: \"skip\" | \"count\"): number | null {\n if (!/^\\d+$/.test(value)) {\n return null;\n }\n\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed)) {\n return null;\n }\n\n return parsed;\n}\n\nfunction formatAddress(offset: number, radix: Exclude<AddressRadix, \"n\">): string {\n const base = radix === \"o\" ? 8 : radix === \"d\" ? 10 : 16;\n return offset.toString(base).padStart(ADDRESS_WIDTH, \"0\");\n}\n\nfunction formatCharacter(byte: number): string {\n let token: string;\n\n if (byte === 0) {\n token = \"\\\\0\";\n } else if (byte === 9) {\n token = \"\\\\t\";\n } else if (byte === 10) {\n token = \"\\\\n\";\n } else if (byte >= 32 && byte <= 126) {\n token = String.fromCharCode(byte);\n } else {\n token = `\\\\${byte.toString(8).padStart(3, \"0\")}`;\n }\n\n return token.length < 3 ? token.padStart(3, \" \") : token;\n}\n\nfunction formatWord(bytes: Uint8Array, index: number, radix: \"hex\" | \"octal\"): string {\n const low = bytes[index] ?? 0;\n const high = bytes[index + 1] ?? 0;\n const value = low | (high << 8);\n const base = radix === \"hex\" ? 16 : 8;\n const width = radix === \"hex\" ? 4 : 6;\n return value.toString(base).padStart(width, \"0\");\n}\n\nfunction formatRow(bytes: Uint8Array, format: OutputFormat): string {\n const values: string[] = [];\n\n if (format === \"x1\") {\n for (const byte of bytes) {\n values.push(byte.toString(16).padStart(2, \"0\"));\n }\n } else if (format === \"o1\") {\n for (const byte of bytes) {\n values.push(byte.toString(8).padStart(3, \"0\"));\n }\n } else if (format === \"c\") {\n for (const byte of bytes) {\n values.push(formatCharacter(byte));\n }\n } else if (format === \"x2\") {\n for (let i = 0; i < bytes.length; i += 2) {\n values.push(formatWord(bytes, i, \"hex\"));\n }\n } else {\n for (let i = 0; i < bytes.length; i += 2) {\n values.push(formatWord(bytes, i, \"octal\"));\n }\n }\n\n return values.join(\" \");\n}\n\nasync function readInput(ctx: Parameters<Command>[0], files: string[]): Promise<Buffer | null> {\n if (files.length === 0) {\n return await ctx.stdin.buffer();\n }\n\n const chunks: Buffer[] = [];\n\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n chunks.push(await ctx.fs.readFile(path));\n } catch {\n await ctx.stderr.writeText(`od: ${file}: No such file or directory\\n`);\n return null;\n }\n }\n\n return Buffer.concat(chunks);\n}\n\nexport const od: Command = async (ctx) => {\n const result = parser.parse(ctx.args);\n\n if (result.error) {\n await parser.writeError(result.error, ctx.stderr);\n return 1;\n }\n\n const { addressRadix, formatConflict, invalidType, skip, count, verbose } = result.flags;\n\n if (!isAddressRadix(addressRadix)) {\n await ctx.stderr.writeText(`od: invalid address radix '${addressRadix}'\\n`);\n return 1;\n }\n\n if (invalidType !== null) {\n await ctx.stderr.writeText(`od: invalid type string '${invalidType}'\\n`);\n return 1;\n }\n\n if (formatConflict !== null) {\n await ctx.stderr.writeText(\"od: multiple output formats are not supported\\n\");\n return 1;\n }\n\n const skipBytes = skip === null ? 0 : parseNonNegativeInteger(skip, \"skip\");\n if (skipBytes === null) {\n await ctx.stderr.writeText(`od: invalid skip '${skip}'\\n`);\n return 1;\n }\n\n const countBytes = count === null ? null : parseNonNegativeInteger(count, \"count\");\n if (count !== null && countBytes === null) {\n await ctx.stderr.writeText(`od: invalid byte count '${count}'\\n`);\n return 1;\n }\n\n const input = await readInput(ctx, result.args);\n if (input === null) {\n return 1;\n }\n\n const start = Math.min(skipBytes, input.length);\n const sliced = countBytes === null\n ? input.subarray(start)\n : input.subarray(start, Math.min(start + countBytes, input.length));\n\n if (sliced.length === 0) {\n return 0;\n }\n\n const format = result.flags.format ?? \"o2\";\n\n let previousRow: string | null = null;\n let emittedSqueezeMarker = false;\n let offset = start;\n\n for (let i = 0; i < sliced.length; i += LINE_BYTES) {\n const rowBytes = sliced.subarray(i, Math.min(i + LINE_BYTES, sliced.length));\n const row = formatRow(rowBytes, format);\n\n if (!verbose && row === previousRow) {\n if (!emittedSqueezeMarker) {\n await ctx.stdout.writeText(\"*\\n\");\n emittedSqueezeMarker = true;\n }\n offset += rowBytes.length;\n continue;\n }\n\n previousRow = row;\n emittedSqueezeMarker = false;\n\n const prefix = addressRadix === \"n\"\n ? NO_ADDRESS_PREFIX\n : `${formatAddress(offset, addressRadix)}${ADDRESS_SEPARATOR}`;\n\n await ctx.stdout.writeText(`${prefix}${row}\\n`);\n offset += rowBytes.length;\n }\n\n if (addressRadix !== \"n\") {\n await ctx.stdout.writeText(`${formatAddress(offset, addressRadix)}\\n`);\n }\n\n return 0;\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "3DFF62CF5B2C215464756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/mjs/index.mjs
CHANGED
|
@@ -27,7 +27,8 @@ import {
|
|
|
27
27
|
sed,
|
|
28
28
|
awk,
|
|
29
29
|
breakCmd,
|
|
30
|
-
continueCmd
|
|
30
|
+
continueCmd,
|
|
31
|
+
od
|
|
31
32
|
} from "./src/commands/index.mjs";
|
|
32
33
|
export {
|
|
33
34
|
wc,
|
|
@@ -42,6 +43,7 @@ export {
|
|
|
42
43
|
sed,
|
|
43
44
|
rm,
|
|
44
45
|
pwd,
|
|
46
|
+
od,
|
|
45
47
|
mv,
|
|
46
48
|
mkdir,
|
|
47
49
|
ls,
|
|
@@ -59,4 +61,4 @@ export {
|
|
|
59
61
|
awk
|
|
60
62
|
};
|
|
61
63
|
|
|
62
|
-
//# debugId=
|
|
64
|
+
//# debugId=0230C6604254204664756E2164756E21
|
package/dist/mjs/index.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"// Re-export everything from src\nexport * from \"./src/index.mjs\";\n\n// Re-export built-in commands\nexport { builtinCommands } from \"./src/commands/index.mjs\";\nexport {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n bracket,\n trueCmd,\n falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n breakCmd,\n continueCmd,\n} from \"./src/commands/index.mjs\";\n"
|
|
5
|
+
"// Re-export everything from src\nexport * from \"./src/index.mjs\";\n\n// Re-export built-in commands\nexport { builtinCommands } from \"./src/commands/index.mjs\";\nexport {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n bracket,\n trueCmd,\n falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n breakCmd,\n continueCmd,\n od,\n} from \"./src/commands/index.mjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AACA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AACA;AAGA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
8
|
+
"debugId": "0230C6604254204664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
// src/commands/echo/echo.ts
|
|
2
|
-
import { createFlagParser } from "../../utils/flag-parser.mjs";
|
|
3
2
|
import { expandEscapes } from "../../utils/expand-escapes.mjs";
|
|
4
|
-
var spec = {
|
|
5
|
-
name: "echo",
|
|
6
|
-
flags: [
|
|
7
|
-
{ short: "n" },
|
|
8
|
-
{ short: "e" }
|
|
9
|
-
],
|
|
10
|
-
usage: "echo [-neE] [string ...]",
|
|
11
|
-
stopAfterFirstPositional: true
|
|
12
|
-
};
|
|
13
3
|
var defaults = { noNewline: false, interpretEscapes: false };
|
|
14
|
-
|
|
15
|
-
if (
|
|
16
|
-
|
|
17
|
-
if (flag.short === "e")
|
|
18
|
-
flags.interpretEscapes = true;
|
|
19
|
-
};
|
|
20
|
-
var parser = createFlagParser(spec, defaults, handler);
|
|
21
|
-
var echo = async (ctx) => {
|
|
22
|
-
const result = parser.parse(ctx.args);
|
|
23
|
-
if (result.error) {
|
|
24
|
-
await parser.writeError(result.error, ctx.stderr);
|
|
25
|
-
return 1;
|
|
4
|
+
function isEchoOption(arg) {
|
|
5
|
+
if (!arg.startsWith("-") || arg === "-") {
|
|
6
|
+
return false;
|
|
26
7
|
}
|
|
8
|
+
for (const char of arg.slice(1)) {
|
|
9
|
+
if (char !== "n" && char !== "e" && char !== "E") {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
function parseEchoArgs(args) {
|
|
16
|
+
const flags = { ...defaults };
|
|
17
|
+
let index = 0;
|
|
18
|
+
while (index < args.length && isEchoOption(args[index])) {
|
|
19
|
+
for (const char of args[index].slice(1)) {
|
|
20
|
+
if (char === "n")
|
|
21
|
+
flags.noNewline = true;
|
|
22
|
+
if (char === "e")
|
|
23
|
+
flags.interpretEscapes = true;
|
|
24
|
+
if (char === "E")
|
|
25
|
+
flags.interpretEscapes = false;
|
|
26
|
+
}
|
|
27
|
+
index++;
|
|
28
|
+
}
|
|
29
|
+
return { flags, args: args.slice(index) };
|
|
30
|
+
}
|
|
31
|
+
var echo = async (ctx) => {
|
|
32
|
+
const result = parseEchoArgs(ctx.args);
|
|
27
33
|
let output = result.args.join(" ");
|
|
28
34
|
if (result.flags.interpretEscapes) {
|
|
29
35
|
output = expandEscapes(output);
|
|
@@ -39,4 +45,4 @@ export {
|
|
|
39
45
|
echo
|
|
40
46
|
};
|
|
41
47
|
|
|
42
|
-
//# debugId=
|
|
48
|
+
//# debugId=A414B87957271D3E64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/echo/echo.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.mjs\";\nimport {
|
|
5
|
+
"import type { Command } from \"../../types.mjs\";\nimport { expandEscapes } from \"../../utils/expand-escapes.mjs\";\n\ninterface EchoFlags {\n noNewline: boolean;\n interpretEscapes: boolean;\n}\n\nconst defaults: EchoFlags = { noNewline: false, interpretEscapes: false };\n\nfunction isEchoOption(arg: string): boolean {\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n return false;\n }\n\n for (const char of arg.slice(1)) {\n if (char !== \"n\" && char !== \"e\" && char !== \"E\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseEchoArgs(args: string[]): { flags: EchoFlags; args: string[] } {\n const flags = { ...defaults };\n let index = 0;\n\n // Match common shell echo behavior: only leading -n/-e/-E clusters are\n // treated as options. Anything else, including \"--\" and \"--invalid\", is\n // printed literally.\n while (index < args.length && isEchoOption(args[index]!)) {\n for (const char of args[index]!.slice(1)) {\n if (char === \"n\") flags.noNewline = true;\n if (char === \"e\") flags.interpretEscapes = true;\n if (char === \"E\") flags.interpretEscapes = false;\n }\n index++;\n }\n\n return { flags, args: args.slice(index) };\n}\n\nexport const echo: Command = async (ctx) => {\n const result = parseEchoArgs(ctx.args);\n\n let output = result.args.join(\" \");\n\n if (result.flags.interpretEscapes) {\n output = expandEscapes(output);\n }\n\n if (!result.flags.noNewline) {\n output += \"\\n\";\n }\n\n await ctx.stdout.writeText(output);\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AACA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AACA;AAOA,IAAM,WAAsB,EAAE,WAAW,OAAO,kBAAkB,MAAM;AAExE,SAAS,YAAY,CAAC,KAAsB;AAAA,EAC1C,IAAI,CAAC,IAAI,WAAW,GAAG,KAAK,QAAQ,KAAK;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAQ,IAAI,MAAM,CAAC,GAAG;AAAA,IAC/B,IAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAAA,MAChD,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,MAAsD;AAAA,EAC3E,MAAM,QAAQ,KAAK,SAAS;AAAA,EAC5B,IAAI,QAAQ;AAAA,EAKZ,OAAO,QAAQ,KAAK,UAAU,aAAa,KAAK,MAAO,GAAG;AAAA,IACxD,WAAW,QAAQ,KAAK,OAAQ,MAAM,CAAC,GAAG;AAAA,MACxC,IAAI,SAAS;AAAA,QAAK,MAAM,YAAY;AAAA,MACpC,IAAI,SAAS;AAAA,QAAK,MAAM,mBAAmB;AAAA,MAC3C,IAAI,SAAS;AAAA,QAAK,MAAM,mBAAmB;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,OAAO,MAAM,KAAK,MAAM,KAAK,EAAE;AAAA;AAGnC,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAC1C,MAAM,SAAS,cAAc,IAAI,IAAI;AAAA,EAErC,IAAI,SAAS,OAAO,KAAK,KAAK,GAAG;AAAA,EAEjC,IAAI,OAAO,MAAM,kBAAkB;AAAA,IACjC,SAAS,cAAc,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,CAAC,OAAO,MAAM,WAAW;AAAA,IAC3B,UAAU;AAAA;AAAA,EACZ;AAAA,EAEA,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,EACjC,OAAO;AAAA;",
|
|
8
|
+
"debugId": "A414B87957271D3E64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -26,6 +26,7 @@ import { colon } from "./colon/colon.mjs";
|
|
|
26
26
|
import { cd } from "./cd/cd.mjs";
|
|
27
27
|
import { tr } from "./tr/tr.mjs";
|
|
28
28
|
import { cut } from "./cut/cut.mjs";
|
|
29
|
+
import { od } from "./od/od.mjs";
|
|
29
30
|
import { echo as echo2 } from "./echo/echo.mjs";
|
|
30
31
|
import { cat as cat2 } from "./cat/cat.mjs";
|
|
31
32
|
import { grep as grep2 } from "./grep/grep.mjs";
|
|
@@ -53,6 +54,7 @@ import { colon as colon2 } from "./colon/colon.mjs";
|
|
|
53
54
|
import { cd as cd2 } from "./cd/cd.mjs";
|
|
54
55
|
import { tr as tr2 } from "./tr/tr.mjs";
|
|
55
56
|
import { cut as cut2 } from "./cut/cut.mjs";
|
|
57
|
+
import { od as od2 } from "./od/od.mjs";
|
|
56
58
|
var builtinCommands = {
|
|
57
59
|
echo: echo2,
|
|
58
60
|
cat: cat2,
|
|
@@ -83,7 +85,8 @@ var builtinCommands = {
|
|
|
83
85
|
":": colon2,
|
|
84
86
|
cd: cd2,
|
|
85
87
|
tr: tr2,
|
|
86
|
-
cut: cut2
|
|
88
|
+
cut: cut2,
|
|
89
|
+
od: od2
|
|
87
90
|
};
|
|
88
91
|
export {
|
|
89
92
|
wc,
|
|
@@ -99,6 +102,7 @@ export {
|
|
|
99
102
|
sed,
|
|
100
103
|
rm,
|
|
101
104
|
pwd,
|
|
105
|
+
od,
|
|
102
106
|
mv,
|
|
103
107
|
mkdir,
|
|
104
108
|
ls,
|
|
@@ -119,4 +123,4 @@ export {
|
|
|
119
123
|
awk
|
|
120
124
|
};
|
|
121
125
|
|
|
122
|
-
//# debugId=
|
|
126
|
+
//# debugId=B7E3709FE74A7FB764756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/commands/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../types.mjs\";\n\nexport { echo } from \"./echo/echo.mjs\";\nexport { cat } from \"./cat/cat.mjs\";\nexport { grep } from \"./grep/grep.mjs\";\nexport { wc } from \"./wc/wc.mjs\";\nexport { head } from \"./head/head.mjs\";\nexport { tail } from \"./tail/tail.mjs\";\nexport { sort } from \"./sort/sort.mjs\";\nexport { uniq } from \"./uniq/uniq.mjs\";\nexport { pwd } from \"./pwd/pwd.mjs\";\nexport { ls } from \"./ls/ls.mjs\";\nexport { mkdir } from \"./mkdir/mkdir.mjs\";\nexport { rm } from \"./rm/rm.mjs\";\nexport { test, bracket } from \"./test/test.mjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.mjs\";\nexport { touch } from \"./touch/touch.mjs\";\nexport { cp } from \"./cp/cp.mjs\";\nexport { mv } from \"./mv/mv.mjs\";\nexport { tee } from \"./tee/tee.mjs\";\nexport { tree } from \"./tree/tree.mjs\";\nexport { find } from \"./find/find.mjs\";\nexport { sed } from \"./sed/sed.mjs\";\nexport { awk } from \"./awk/awk.mjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.mjs\";\nexport { colon } from \"./colon/colon.mjs\";\nexport { cd } from \"./cd/cd.mjs\";\nexport { tr } from \"./tr/tr.mjs\";\nexport { cut } from \"./cut/cut.mjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.mjs\";\nimport { cat } from \"./cat/cat.mjs\";\nimport { grep } from \"./grep/grep.mjs\";\nimport { wc } from \"./wc/wc.mjs\";\nimport { head } from \"./head/head.mjs\";\nimport { tail } from \"./tail/tail.mjs\";\nimport { sort } from \"./sort/sort.mjs\";\nimport { uniq } from \"./uniq/uniq.mjs\";\nimport { pwd } from \"./pwd/pwd.mjs\";\nimport { ls } from \"./ls/ls.mjs\";\nimport { mkdir } from \"./mkdir/mkdir.mjs\";\nimport { rm } from \"./rm/rm.mjs\";\nimport { test, bracket } from \"./test/test.mjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.mjs\";\nimport { touch } from \"./touch/touch.mjs\";\nimport { cp } from \"./cp/cp.mjs\";\nimport { mv } from \"./mv/mv.mjs\";\nimport { tee } from \"./tee/tee.mjs\";\nimport { tree } from \"./tree/tree.mjs\";\nimport { find } from \"./find/find.mjs\";\nimport { sed } from \"./sed/sed.mjs\";\nimport { awk } from \"./awk/awk.mjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.mjs\";\nimport { colon } from \"./colon/colon.mjs\";\nimport { cd } from \"./cd/cd.mjs\";\nimport { tr } from \"./tr/tr.mjs\";\nimport { cut } from \"./cut/cut.mjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n cd,\n tr,\n cut,\n};\n"
|
|
5
|
+
"import type { Command } from \"../types.mjs\";\n\nexport { echo } from \"./echo/echo.mjs\";\nexport { cat } from \"./cat/cat.mjs\";\nexport { grep } from \"./grep/grep.mjs\";\nexport { wc } from \"./wc/wc.mjs\";\nexport { head } from \"./head/head.mjs\";\nexport { tail } from \"./tail/tail.mjs\";\nexport { sort } from \"./sort/sort.mjs\";\nexport { uniq } from \"./uniq/uniq.mjs\";\nexport { pwd } from \"./pwd/pwd.mjs\";\nexport { ls } from \"./ls/ls.mjs\";\nexport { mkdir } from \"./mkdir/mkdir.mjs\";\nexport { rm } from \"./rm/rm.mjs\";\nexport { test, bracket } from \"./test/test.mjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.mjs\";\nexport { touch } from \"./touch/touch.mjs\";\nexport { cp } from \"./cp/cp.mjs\";\nexport { mv } from \"./mv/mv.mjs\";\nexport { tee } from \"./tee/tee.mjs\";\nexport { tree } from \"./tree/tree.mjs\";\nexport { find } from \"./find/find.mjs\";\nexport { sed } from \"./sed/sed.mjs\";\nexport { awk } from \"./awk/awk.mjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.mjs\";\nexport { colon } from \"./colon/colon.mjs\";\nexport { cd } from \"./cd/cd.mjs\";\nexport { tr } from \"./tr/tr.mjs\";\nexport { cut } from \"./cut/cut.mjs\";\nexport { od } from \"./od/od.mjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.mjs\";\nimport { cat } from \"./cat/cat.mjs\";\nimport { grep } from \"./grep/grep.mjs\";\nimport { wc } from \"./wc/wc.mjs\";\nimport { head } from \"./head/head.mjs\";\nimport { tail } from \"./tail/tail.mjs\";\nimport { sort } from \"./sort/sort.mjs\";\nimport { uniq } from \"./uniq/uniq.mjs\";\nimport { pwd } from \"./pwd/pwd.mjs\";\nimport { ls } from \"./ls/ls.mjs\";\nimport { mkdir } from \"./mkdir/mkdir.mjs\";\nimport { rm } from \"./rm/rm.mjs\";\nimport { test, bracket } from \"./test/test.mjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.mjs\";\nimport { touch } from \"./touch/touch.mjs\";\nimport { cp } from \"./cp/cp.mjs\";\nimport { mv } from \"./mv/mv.mjs\";\nimport { tee } from \"./tee/tee.mjs\";\nimport { tree } from \"./tree/tree.mjs\";\nimport { find } from \"./find/find.mjs\";\nimport { sed } from \"./sed/sed.mjs\";\nimport { awk } from \"./awk/awk.mjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.mjs\";\nimport { colon } from \"./colon/colon.mjs\";\nimport { cd } from \"./cd/cd.mjs\";\nimport { tr } from \"./tr/tr.mjs\";\nimport { cut } from \"./cut/cut.mjs\";\nimport { od } from \"./od/od.mjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n cd,\n tr,\n cut,\n od,\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,iBAAS;AACT,gBAAS;AACT,iBAAS;AACT,eAAS;AACT,iBAAS;AACT,iBAAS;AACT,iBAAS;AACT,iBAAS;AACT,gBAAS;AACT,eAAS;AACT,kBAAS;AACT,eAAS;AACT,iBAAS,kBAAM;AACf,oBAAS,sBAAS;AAClB,kBAAS;AACT,eAAS;AACT,eAAS;AACT,gBAAS;AACT,iBAAS;AACT,iBAAS;AACT,gBAAS;AACT,gBAAS;AACT,qBAAS,0BAAU;AACnB,kBAAS;AACT,eAAS;AACT,eAAS;AACT,gBAAS;AAEF,IAAM,kBAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AACF;",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,iBAAS;AACT,gBAAS;AACT,iBAAS;AACT,eAAS;AACT,iBAAS;AACT,iBAAS;AACT,iBAAS;AACT,iBAAS;AACT,gBAAS;AACT,eAAS;AACT,kBAAS;AACT,eAAS;AACT,iBAAS,kBAAM;AACf,oBAAS,sBAAS;AAClB,kBAAS;AACT,eAAS;AACT,eAAS;AACT,gBAAS;AACT,iBAAS;AACT,iBAAS;AACT,gBAAS;AACT,gBAAS;AACT,qBAAS,0BAAU;AACnB,kBAAS;AACT,eAAS;AACT,eAAS;AACT,gBAAS;AACT,eAAS;AAEF,IAAM,kBAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
8
|
+
"debugId": "B7E3709FE74A7FB764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
// src/commands/od/od.ts
|
|
2
|
+
import { createFlagParser } from "../../utils/flag-parser.mjs";
|
|
3
|
+
var ADDRESS_WIDTH = 7;
|
|
4
|
+
var ADDRESS_SEPARATOR = " ";
|
|
5
|
+
var NO_ADDRESS_PREFIX = " ".repeat(ADDRESS_WIDTH + ADDRESS_SEPARATOR.length);
|
|
6
|
+
var LINE_BYTES = 16;
|
|
7
|
+
var spec = {
|
|
8
|
+
name: "od",
|
|
9
|
+
flags: [
|
|
10
|
+
{ short: "A", takesValue: true },
|
|
11
|
+
{ short: "b" },
|
|
12
|
+
{ short: "c" },
|
|
13
|
+
{ short: "j", takesValue: true },
|
|
14
|
+
{ short: "N", takesValue: true },
|
|
15
|
+
{ short: "o" },
|
|
16
|
+
{ short: "t", takesValue: true },
|
|
17
|
+
{ short: "v" },
|
|
18
|
+
{ short: "x" }
|
|
19
|
+
],
|
|
20
|
+
usage: "od [-bcovx] [-A radix] [-j skip] [-N count] [-t type] [file ...]"
|
|
21
|
+
};
|
|
22
|
+
var defaults = {
|
|
23
|
+
addressRadix: "o",
|
|
24
|
+
format: null,
|
|
25
|
+
formatConflict: null,
|
|
26
|
+
invalidType: null,
|
|
27
|
+
verbose: false,
|
|
28
|
+
skip: null,
|
|
29
|
+
count: null
|
|
30
|
+
};
|
|
31
|
+
function selectFormat(flags, format, source) {
|
|
32
|
+
if (flags.format === null) {
|
|
33
|
+
flags.format = format;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
flags.formatConflict = source;
|
|
37
|
+
}
|
|
38
|
+
function isOutputFormat(value) {
|
|
39
|
+
return value === "x1" || value === "x2" || value === "o1" || value === "o2" || value === "c";
|
|
40
|
+
}
|
|
41
|
+
var parser = createFlagParser(spec, defaults, (flags, flag, value) => {
|
|
42
|
+
switch (flag.short) {
|
|
43
|
+
case "A":
|
|
44
|
+
flags.addressRadix = value ?? "o";
|
|
45
|
+
break;
|
|
46
|
+
case "b":
|
|
47
|
+
selectFormat(flags, "o1", "-b");
|
|
48
|
+
break;
|
|
49
|
+
case "c":
|
|
50
|
+
selectFormat(flags, "c", "-c");
|
|
51
|
+
break;
|
|
52
|
+
case "j":
|
|
53
|
+
flags.skip = value ?? null;
|
|
54
|
+
break;
|
|
55
|
+
case "N":
|
|
56
|
+
flags.count = value ?? null;
|
|
57
|
+
break;
|
|
58
|
+
case "o":
|
|
59
|
+
selectFormat(flags, "o2", "-o");
|
|
60
|
+
break;
|
|
61
|
+
case "t":
|
|
62
|
+
if (value && isOutputFormat(value)) {
|
|
63
|
+
selectFormat(flags, value, "-t");
|
|
64
|
+
} else if (value) {
|
|
65
|
+
flags.invalidType = value;
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
case "v":
|
|
69
|
+
flags.verbose = true;
|
|
70
|
+
break;
|
|
71
|
+
case "x":
|
|
72
|
+
selectFormat(flags, "x2", "-x");
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
function isAddressRadix(value) {
|
|
77
|
+
return value === "o" || value === "d" || value === "x" || value === "n";
|
|
78
|
+
}
|
|
79
|
+
function parseNonNegativeInteger(value, label) {
|
|
80
|
+
if (!/^\d+$/.test(value)) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const parsed = Number(value);
|
|
84
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return parsed;
|
|
88
|
+
}
|
|
89
|
+
function formatAddress(offset, radix) {
|
|
90
|
+
const base = radix === "o" ? 8 : radix === "d" ? 10 : 16;
|
|
91
|
+
return offset.toString(base).padStart(ADDRESS_WIDTH, "0");
|
|
92
|
+
}
|
|
93
|
+
function formatCharacter(byte) {
|
|
94
|
+
let token;
|
|
95
|
+
if (byte === 0) {
|
|
96
|
+
token = "\\0";
|
|
97
|
+
} else if (byte === 9) {
|
|
98
|
+
token = "\\t";
|
|
99
|
+
} else if (byte === 10) {
|
|
100
|
+
token = "\\n";
|
|
101
|
+
} else if (byte >= 32 && byte <= 126) {
|
|
102
|
+
token = String.fromCharCode(byte);
|
|
103
|
+
} else {
|
|
104
|
+
token = `\\${byte.toString(8).padStart(3, "0")}`;
|
|
105
|
+
}
|
|
106
|
+
return token.length < 3 ? token.padStart(3, " ") : token;
|
|
107
|
+
}
|
|
108
|
+
function formatWord(bytes, index, radix) {
|
|
109
|
+
const low = bytes[index] ?? 0;
|
|
110
|
+
const high = bytes[index + 1] ?? 0;
|
|
111
|
+
const value = low | high << 8;
|
|
112
|
+
const base = radix === "hex" ? 16 : 8;
|
|
113
|
+
const width = radix === "hex" ? 4 : 6;
|
|
114
|
+
return value.toString(base).padStart(width, "0");
|
|
115
|
+
}
|
|
116
|
+
function formatRow(bytes, format) {
|
|
117
|
+
const values = [];
|
|
118
|
+
if (format === "x1") {
|
|
119
|
+
for (const byte of bytes) {
|
|
120
|
+
values.push(byte.toString(16).padStart(2, "0"));
|
|
121
|
+
}
|
|
122
|
+
} else if (format === "o1") {
|
|
123
|
+
for (const byte of bytes) {
|
|
124
|
+
values.push(byte.toString(8).padStart(3, "0"));
|
|
125
|
+
}
|
|
126
|
+
} else if (format === "c") {
|
|
127
|
+
for (const byte of bytes) {
|
|
128
|
+
values.push(formatCharacter(byte));
|
|
129
|
+
}
|
|
130
|
+
} else if (format === "x2") {
|
|
131
|
+
for (let i = 0;i < bytes.length; i += 2) {
|
|
132
|
+
values.push(formatWord(bytes, i, "hex"));
|
|
133
|
+
}
|
|
134
|
+
} else {
|
|
135
|
+
for (let i = 0;i < bytes.length; i += 2) {
|
|
136
|
+
values.push(formatWord(bytes, i, "octal"));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return values.join(" ");
|
|
140
|
+
}
|
|
141
|
+
async function readInput(ctx, files) {
|
|
142
|
+
if (files.length === 0) {
|
|
143
|
+
return await ctx.stdin.buffer();
|
|
144
|
+
}
|
|
145
|
+
const chunks = [];
|
|
146
|
+
for (const file of files) {
|
|
147
|
+
try {
|
|
148
|
+
const path = ctx.fs.resolve(ctx.cwd, file);
|
|
149
|
+
chunks.push(await ctx.fs.readFile(path));
|
|
150
|
+
} catch {
|
|
151
|
+
await ctx.stderr.writeText(`od: ${file}: No such file or directory
|
|
152
|
+
`);
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return Buffer.concat(chunks);
|
|
157
|
+
}
|
|
158
|
+
var od = async (ctx) => {
|
|
159
|
+
const result = parser.parse(ctx.args);
|
|
160
|
+
if (result.error) {
|
|
161
|
+
await parser.writeError(result.error, ctx.stderr);
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
const { addressRadix, formatConflict, invalidType, skip, count, verbose } = result.flags;
|
|
165
|
+
if (!isAddressRadix(addressRadix)) {
|
|
166
|
+
await ctx.stderr.writeText(`od: invalid address radix '${addressRadix}'
|
|
167
|
+
`);
|
|
168
|
+
return 1;
|
|
169
|
+
}
|
|
170
|
+
if (invalidType !== null) {
|
|
171
|
+
await ctx.stderr.writeText(`od: invalid type string '${invalidType}'
|
|
172
|
+
`);
|
|
173
|
+
return 1;
|
|
174
|
+
}
|
|
175
|
+
if (formatConflict !== null) {
|
|
176
|
+
await ctx.stderr.writeText(`od: multiple output formats are not supported
|
|
177
|
+
`);
|
|
178
|
+
return 1;
|
|
179
|
+
}
|
|
180
|
+
const skipBytes = skip === null ? 0 : parseNonNegativeInteger(skip, "skip");
|
|
181
|
+
if (skipBytes === null) {
|
|
182
|
+
await ctx.stderr.writeText(`od: invalid skip '${skip}'
|
|
183
|
+
`);
|
|
184
|
+
return 1;
|
|
185
|
+
}
|
|
186
|
+
const countBytes = count === null ? null : parseNonNegativeInteger(count, "count");
|
|
187
|
+
if (count !== null && countBytes === null) {
|
|
188
|
+
await ctx.stderr.writeText(`od: invalid byte count '${count}'
|
|
189
|
+
`);
|
|
190
|
+
return 1;
|
|
191
|
+
}
|
|
192
|
+
const input = await readInput(ctx, result.args);
|
|
193
|
+
if (input === null) {
|
|
194
|
+
return 1;
|
|
195
|
+
}
|
|
196
|
+
const start = Math.min(skipBytes, input.length);
|
|
197
|
+
const sliced = countBytes === null ? input.subarray(start) : input.subarray(start, Math.min(start + countBytes, input.length));
|
|
198
|
+
if (sliced.length === 0) {
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
const format = result.flags.format ?? "o2";
|
|
202
|
+
let previousRow = null;
|
|
203
|
+
let emittedSqueezeMarker = false;
|
|
204
|
+
let offset = start;
|
|
205
|
+
for (let i = 0;i < sliced.length; i += LINE_BYTES) {
|
|
206
|
+
const rowBytes = sliced.subarray(i, Math.min(i + LINE_BYTES, sliced.length));
|
|
207
|
+
const row = formatRow(rowBytes, format);
|
|
208
|
+
if (!verbose && row === previousRow) {
|
|
209
|
+
if (!emittedSqueezeMarker) {
|
|
210
|
+
await ctx.stdout.writeText(`*
|
|
211
|
+
`);
|
|
212
|
+
emittedSqueezeMarker = true;
|
|
213
|
+
}
|
|
214
|
+
offset += rowBytes.length;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
previousRow = row;
|
|
218
|
+
emittedSqueezeMarker = false;
|
|
219
|
+
const prefix = addressRadix === "n" ? NO_ADDRESS_PREFIX : `${formatAddress(offset, addressRadix)}${ADDRESS_SEPARATOR}`;
|
|
220
|
+
await ctx.stdout.writeText(`${prefix}${row}
|
|
221
|
+
`);
|
|
222
|
+
offset += rowBytes.length;
|
|
223
|
+
}
|
|
224
|
+
if (addressRadix !== "n") {
|
|
225
|
+
await ctx.stdout.writeText(`${formatAddress(offset, addressRadix)}
|
|
226
|
+
`);
|
|
227
|
+
}
|
|
228
|
+
return 0;
|
|
229
|
+
};
|
|
230
|
+
export {
|
|
231
|
+
od
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
//# debugId=2B4F57CE0D46E09864756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/commands/od/od.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { Command } from \"../../types.mjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.mjs\";\n\ntype AddressRadix = \"o\" | \"d\" | \"x\" | \"n\";\ntype OutputFormat = \"x1\" | \"x2\" | \"o1\" | \"o2\" | \"c\";\n\ninterface OdFlags {\n addressRadix: string;\n format: OutputFormat | null;\n formatConflict: string | null;\n invalidType: string | null;\n verbose: boolean;\n skip: string | null;\n count: string | null;\n}\n\nconst ADDRESS_WIDTH = 7;\nconst ADDRESS_SEPARATOR = \" \";\nconst NO_ADDRESS_PREFIX = \" \".repeat(ADDRESS_WIDTH + ADDRESS_SEPARATOR.length);\nconst LINE_BYTES = 16;\n\nconst spec = {\n name: \"od\",\n flags: [\n { short: \"A\", takesValue: true },\n { short: \"b\" },\n { short: \"c\" },\n { short: \"j\", takesValue: true },\n { short: \"N\", takesValue: true },\n { short: \"o\" },\n { short: \"t\", takesValue: true },\n { short: \"v\" },\n { short: \"x\" },\n ] as FlagDefinition[],\n usage: \"od [-bcovx] [-A radix] [-j skip] [-N count] [-t type] [file ...]\",\n};\n\nconst defaults: OdFlags = {\n addressRadix: \"o\",\n format: null,\n formatConflict: null,\n invalidType: null,\n verbose: false,\n skip: null,\n count: null,\n};\n\nfunction selectFormat(flags: OdFlags, format: OutputFormat, source: string): void {\n if (flags.format === null) {\n flags.format = format;\n return;\n }\n\n flags.formatConflict = source;\n}\n\nfunction isOutputFormat(value: string): value is OutputFormat {\n return value === \"x1\" || value === \"x2\" || value === \"o1\" || value === \"o2\" || value === \"c\";\n}\n\nconst parser = createFlagParser(spec, defaults, (flags, flag, value) => {\n switch (flag.short) {\n case \"A\":\n flags.addressRadix = value ?? \"o\";\n break;\n case \"b\":\n selectFormat(flags, \"o1\", \"-b\");\n break;\n case \"c\":\n selectFormat(flags, \"c\", \"-c\");\n break;\n case \"j\":\n flags.skip = value ?? null;\n break;\n case \"N\":\n flags.count = value ?? null;\n break;\n case \"o\":\n selectFormat(flags, \"o2\", \"-o\");\n break;\n case \"t\":\n if (value && isOutputFormat(value)) {\n selectFormat(flags, value, \"-t\");\n } else if (value) {\n flags.invalidType = value;\n }\n break;\n case \"v\":\n flags.verbose = true;\n break;\n case \"x\":\n selectFormat(flags, \"x2\", \"-x\");\n break;\n }\n});\n\nfunction isAddressRadix(value: string): value is AddressRadix {\n return value === \"o\" || value === \"d\" || value === \"x\" || value === \"n\";\n}\n\nfunction parseNonNegativeInteger(value: string, label: \"skip\" | \"count\"): number | null {\n if (!/^\\d+$/.test(value)) {\n return null;\n }\n\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed)) {\n return null;\n }\n\n return parsed;\n}\n\nfunction formatAddress(offset: number, radix: Exclude<AddressRadix, \"n\">): string {\n const base = radix === \"o\" ? 8 : radix === \"d\" ? 10 : 16;\n return offset.toString(base).padStart(ADDRESS_WIDTH, \"0\");\n}\n\nfunction formatCharacter(byte: number): string {\n let token: string;\n\n if (byte === 0) {\n token = \"\\\\0\";\n } else if (byte === 9) {\n token = \"\\\\t\";\n } else if (byte === 10) {\n token = \"\\\\n\";\n } else if (byte >= 32 && byte <= 126) {\n token = String.fromCharCode(byte);\n } else {\n token = `\\\\${byte.toString(8).padStart(3, \"0\")}`;\n }\n\n return token.length < 3 ? token.padStart(3, \" \") : token;\n}\n\nfunction formatWord(bytes: Uint8Array, index: number, radix: \"hex\" | \"octal\"): string {\n const low = bytes[index] ?? 0;\n const high = bytes[index + 1] ?? 0;\n const value = low | (high << 8);\n const base = radix === \"hex\" ? 16 : 8;\n const width = radix === \"hex\" ? 4 : 6;\n return value.toString(base).padStart(width, \"0\");\n}\n\nfunction formatRow(bytes: Uint8Array, format: OutputFormat): string {\n const values: string[] = [];\n\n if (format === \"x1\") {\n for (const byte of bytes) {\n values.push(byte.toString(16).padStart(2, \"0\"));\n }\n } else if (format === \"o1\") {\n for (const byte of bytes) {\n values.push(byte.toString(8).padStart(3, \"0\"));\n }\n } else if (format === \"c\") {\n for (const byte of bytes) {\n values.push(formatCharacter(byte));\n }\n } else if (format === \"x2\") {\n for (let i = 0; i < bytes.length; i += 2) {\n values.push(formatWord(bytes, i, \"hex\"));\n }\n } else {\n for (let i = 0; i < bytes.length; i += 2) {\n values.push(formatWord(bytes, i, \"octal\"));\n }\n }\n\n return values.join(\" \");\n}\n\nasync function readInput(ctx: Parameters<Command>[0], files: string[]): Promise<Buffer | null> {\n if (files.length === 0) {\n return await ctx.stdin.buffer();\n }\n\n const chunks: Buffer[] = [];\n\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n chunks.push(await ctx.fs.readFile(path));\n } catch {\n await ctx.stderr.writeText(`od: ${file}: No such file or directory\\n`);\n return null;\n }\n }\n\n return Buffer.concat(chunks);\n}\n\nexport const od: Command = async (ctx) => {\n const result = parser.parse(ctx.args);\n\n if (result.error) {\n await parser.writeError(result.error, ctx.stderr);\n return 1;\n }\n\n const { addressRadix, formatConflict, invalidType, skip, count, verbose } = result.flags;\n\n if (!isAddressRadix(addressRadix)) {\n await ctx.stderr.writeText(`od: invalid address radix '${addressRadix}'\\n`);\n return 1;\n }\n\n if (invalidType !== null) {\n await ctx.stderr.writeText(`od: invalid type string '${invalidType}'\\n`);\n return 1;\n }\n\n if (formatConflict !== null) {\n await ctx.stderr.writeText(\"od: multiple output formats are not supported\\n\");\n return 1;\n }\n\n const skipBytes = skip === null ? 0 : parseNonNegativeInteger(skip, \"skip\");\n if (skipBytes === null) {\n await ctx.stderr.writeText(`od: invalid skip '${skip}'\\n`);\n return 1;\n }\n\n const countBytes = count === null ? null : parseNonNegativeInteger(count, \"count\");\n if (count !== null && countBytes === null) {\n await ctx.stderr.writeText(`od: invalid byte count '${count}'\\n`);\n return 1;\n }\n\n const input = await readInput(ctx, result.args);\n if (input === null) {\n return 1;\n }\n\n const start = Math.min(skipBytes, input.length);\n const sliced = countBytes === null\n ? input.subarray(start)\n : input.subarray(start, Math.min(start + countBytes, input.length));\n\n if (sliced.length === 0) {\n return 0;\n }\n\n const format = result.flags.format ?? \"o2\";\n\n let previousRow: string | null = null;\n let emittedSqueezeMarker = false;\n let offset = start;\n\n for (let i = 0; i < sliced.length; i += LINE_BYTES) {\n const rowBytes = sliced.subarray(i, Math.min(i + LINE_BYTES, sliced.length));\n const row = formatRow(rowBytes, format);\n\n if (!verbose && row === previousRow) {\n if (!emittedSqueezeMarker) {\n await ctx.stdout.writeText(\"*\\n\");\n emittedSqueezeMarker = true;\n }\n offset += rowBytes.length;\n continue;\n }\n\n previousRow = row;\n emittedSqueezeMarker = false;\n\n const prefix = addressRadix === \"n\"\n ? NO_ADDRESS_PREFIX\n : `${formatAddress(offset, addressRadix)}${ADDRESS_SEPARATOR}`;\n\n await ctx.stdout.writeText(`${prefix}${row}\\n`);\n offset += rowBytes.length;\n }\n\n if (addressRadix !== \"n\") {\n await ctx.stdout.writeText(`${formatAddress(offset, addressRadix)}\\n`);\n }\n\n return 0;\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "2B4F57CE0D46E09864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from "./src/index.ts";
|
|
2
2
|
export { builtinCommands } from "./src/commands/index.ts";
|
|
3
|
-
export { echo, cat, grep, wc, head, tail, sort, uniq, pwd, ls, mkdir, rm, test, bracket, trueCmd, falseCmd, touch, cp, mv, tee, tree, find, sed, awk, breakCmd, continueCmd, } from "./src/commands/index.ts";
|
|
3
|
+
export { echo, cat, grep, wc, head, tail, sort, uniq, pwd, ls, mkdir, rm, test, bracket, trueCmd, falseCmd, touch, cp, mv, tee, tree, find, sed, awk, breakCmd, continueCmd, od, } from "./src/commands/index.ts";
|
package/package.json
CHANGED