From 1ea061e3301aac82d34a4918a41dea0e1746b537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20B=C3=A1nffy?= Date: Tue, 28 Apr 2026 17:02:23 +0100 Subject: [PATCH 1/3] Add EBCDIC 037 view to data inspector --- media/editor/dataInspectorProperties.tsx | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/media/editor/dataInspectorProperties.tsx b/media/editor/dataInspectorProperties.tsx index 7081b0b3..5e90ea01 100644 --- a/media/editor/dataInspectorProperties.tsx +++ b/media/editor/dataInspectorProperties.tsx @@ -177,4 +177,29 @@ addTextDecoder("big5", 2); addTextDecoder("iso-2022-kr", 2); addTextDecoder("shift-jis", 2); +/** EBCDIC Code Page 037 (IBM US/Canada) to Unicode lookup table (256 entries). */ +const EBCDIC_CP037 = + "\u0000\u0001\u0002\u0003\u009C\u0009\u0086\u007F\u0097\u008D\u008E\u000B\u000C\u000D\u000E\u000F" + + "\u0010\u0011\u0012\u0013\u009D\u0085\u0008\u0087\u0018\u0019\u0092\u008F\u001C\u001D\u001E\u001F" + + "\u0080\u0081\u0082\u0083\u0084\u000A\u0017\u001B\u0088\u0089\u008A\u008B\u008C\u0005\u0006\u0007" + + "\u0090\u0091\u0016\u0093\u0094\u0095\u0096\u0004\u0098\u0099\u009A\u009B\u0014\u0015\u009E\u001A" + + "\u0020\u00A0\u00E2\u00E4\u00E0\u00E1\u00E3\u00E5\u00E7\u00F1\u00A2\u002E\u003C\u0028\u002B\u007C" + + "\u0026\u00E9\u00EA\u00EB\u00E8\u00ED\u00EE\u00EF\u00EC\u00DF\u0021\u0024\u002A\u0029\u003B\u00AC" + + "\u002D\u002F\u00C2\u00C4\u00C0\u00C1\u00C3\u00C5\u00C7\u00D1\u00A6\u002C\u0025\u005F\u003E\u003F" + + "\u00F8\u00C9\u00CA\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u0060\u003A\u0023\u0040\u0027\u003D\u0022" + + "\u00D8\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u00AB\u00BB\u00F0\u00FD\u00FE\u00B1" + + "\u00B0\u006A\u006B\u006C\u006D\u006E\u006F\u0070\u0071\u0072\u00AA\u00BA\u00E6\u00B8\u00C6\u00A4" + + "\u00B5\u007E\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007A\u00A1\u00BF\u00D0\u00DD\u00DE\u00AE" + + "\u005E\u00A3\u00A5\u00B7\u00A9\u00A7\u00B6\u00BC\u00BD\u00BE\u005B\u005D\u00AF\u00A8\u00B4\u00D7" + + "\u007B\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u00AD\u00F4\u00F6\u00F2\u00F3\u00F5" + + "\u007D\u004A\u004B\u004C\u004D\u004E\u004F\u0050\u0051\u0052\u00B9\u00FB\u00FC\u00F9\u00FA\u00FF" + + "\u005C\u00F7\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005A\u00B2\u00D4\u00D6\u00D2\u00D3\u00D5" + + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u00B3\u00DB\u00DC\u00D9\u00DA\u009F"; + +inspectTypesBuilder.push({ + label: "EBCDIC", + minBytes: 1, + convert: dv => EBCDIC_CP037[dv.getUint8(0)], +}); + export const inspectableTypes: readonly IInspectableType[] = inspectTypesBuilder; From d969a2879f7538d32e6d10c8308122c08136dcad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20B=C3=A1nffy?= Date: Tue, 28 Apr 2026 17:08:10 +0100 Subject: [PATCH 2/3] Add some tests to make sure EBCDIC 037 conversion is working as intended --- src/test/dataInspectorProperties.test.ts | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/dataInspectorProperties.test.ts diff --git a/src/test/dataInspectorProperties.test.ts b/src/test/dataInspectorProperties.test.ts new file mode 100644 index 00000000..aab542a6 --- /dev/null +++ b/src/test/dataInspectorProperties.test.ts @@ -0,0 +1,33 @@ +/*--------------------------------------------------------- + * Copyright (C) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------*/ +import { expect } from "chai"; +import { inspectableTypes } from "../../media/editor/dataInspectorProperties"; + +const ebcdic = inspectableTypes.find(t => t.label === "EBCDIC")!; + +const dvOf = (byte: number) => new DataView(new Uint8Array([byte]).buffer); + +describe("EBCDIC decoding", () => { + it("decodes space (0x40)", () => { + expect(ebcdic.convert(dvOf(0x40), false)).to.equal(" "); + }); + + it("decodes digits 0-9 (0xF0-0xF9)", () => { + for (let i = 0; i <= 9; i++) { + expect(ebcdic.convert(dvOf(0xf0 + i), false)).to.equal(String(i)); + } + }); + + it("decodes uppercase A-I (0xC1-0xC9)", () => { + for (let i = 0; i < 9; i++) { + expect(ebcdic.convert(dvOf(0xc1 + i), false)).to.equal(String.fromCharCode("A".charCodeAt(0) + i)); + } + }); + + it("decodes lowercase a-i (0x81-0x89)", () => { + for (let i = 0; i < 9; i++) { + expect(ebcdic.convert(dvOf(0x81 + i), false)).to.equal(String.fromCharCode("a".charCodeAt(0) + i)); + } + }); +}); From ea2941f4177f61e380243e0ecd4fe875c210e465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20B=C3=A1nffy?= Date: Tue, 28 Apr 2026 17:08:23 +0100 Subject: [PATCH 3/3] Register EBCDIC tests --- src/test/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/index.ts b/src/test/index.ts index d5ae6aef..aecb40ef 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -2,6 +2,7 @@ import Mocha from "mocha"; const fileImports = [ () => import("./backup.test"), + () => import("./dataInspectorProperties.test"), () => import("./hexDocumentModel.test"), () => import("./searchRequest.test"), () => import("./range.test"),