Added invalid NCR smoke signal support

This commit is contained in:
Willem Cazander 2025-01-14 12:39:26 +01:00
parent 639ff340fd
commit b8139ebda0
6 changed files with 172 additions and 63 deletions

View file

@ -137,7 +137,7 @@ public class FourCornerUnicodeDisplay {
lexer.withSmokeSignals(printer).read(chars); lexer.withSmokeSignals(printer).read(chars);
} }
private final class StenoUnicodePrinter implements FourCornerZion7Candlelier, FourCornerZionStenoLexerSmoke { private final class StenoUnicodePrinter implements FourCornerZion7Candlelier, FourCornerZionStenoLexerSmoke.Adapter {
private final StringBuilder output; private final StringBuilder output;

View file

@ -42,4 +42,23 @@ public interface FourCornerZion7Candlelier {
void strobeUnicode(List<Integer> codePoints); void strobeUnicode(List<Integer> codePoints);
void strobeNether(List<Integer> key, List<Integer> octals); void strobeNether(List<Integer> key, List<Integer> octals);
interface Adapter extends FourCornerZion7Candlelier {
@Override
default void strobeWords(FourCornerDotCake slice, List<Integer> offsets) {
}
@Override
default void strobeNCR1632(BigInteger denominator, BigInteger numerator) {
}
@Override
default void strobeUnicode(List<Integer> codePoints) {
}
@Override
default void strobeNether(List<Integer> key, List<Integer> octals) {
}
}
} }

View file

@ -79,22 +79,22 @@ public class FourCornerZionStenoLexer {
continue; // can't handle reserved, we be reported as continue; // can't handle reserved, we be reported as
} }
if (cakeSlice.getStop() <= 0xFF) { if (cakeSlice.getStop() <= 0xFF) {
continue; // handle CDC and DEC and muffins manual continue; // handle CDC and DEC and muffins manually
} }
if (FourCornerDotCake.FC_UNI2K_11.equals(cakeSlice)) { if (FourCornerDotCake.FC_UNI2K_11.equals(cakeSlice)) {
continue; // parse blocks manual continue; // parse block manually
} }
if (FourCornerDotCake.FC_UNI2K_22.equals(cakeSlice)) { if (FourCornerDotCake.FC_UNI2K_22.equals(cakeSlice)) {
continue; // parse blocks manual continue; // parse block manually
} }
if (FourCornerDotCake.FC_NETHER.equals(cakeSlice)) { if (FourCornerDotCake.FC_NETHER.equals(cakeSlice)) {
continue; // merge the nether data to octals manual continue; // merge the nether data to octals manually
} }
if (FourCornerDotCake.FC_NCR1632_XD.equals(cakeSlice)) { if (FourCornerDotCake.FC_NCR1632_XD.equals(cakeSlice)) {
continue; // merge the nether data to octals manual continue; // parse block manually
} }
if (FourCornerDotCake.FC_NCR1632_XN.equals(cakeSlice)) { if (FourCornerDotCake.FC_NCR1632_XN.equals(cakeSlice)) {
continue; // merge the nether data to octals manual continue; // parse block manually
} }
this.scanners.add(new StenoScannerWordCakeSlice(cakeSlice)); this.scanners.add(new StenoScannerWordCakeSlice(cakeSlice));
} }
@ -282,6 +282,7 @@ public class FourCornerZionStenoLexer {
private void handlePoints(List<Integer> slicedPoints) { private void handlePoints(List<Integer> slicedPoints) {
int denominatorBank[] = new int[64]; // <== is the terminator select per 9 bit group int denominatorBank[] = new int[64]; // <== is the terminator select per 9 bit group
int numeratorBank[] = new int[64]; int numeratorBank[] = new int[64];
boolean fired = false;
for (Integer cakePoint : slicedPoints) { for (Integer cakePoint : slicedPoints) {
if (cakePoint >= FourCornerDotCake.FC_NCR1632_XD.getStart() && cakePoint <= FourCornerDotCake.FC_NCR1632_XD.getStop()) { if (cakePoint >= FourCornerDotCake.FC_NCR1632_XD.getStart() && cakePoint <= FourCornerDotCake.FC_NCR1632_XD.getStop()) {
int denominatorX = cakePoint - FourCornerDotCake.FC_NCR1632_XD.getStart(); int denominatorX = cakePoint - FourCornerDotCake.FC_NCR1632_XD.getStart();
@ -303,6 +304,10 @@ public class FourCornerZionStenoLexer {
numerator = numerator.add(BigInteger.valueOf(numeratorBank[i]).shiftLeft(i*9)); numerator = numerator.add(BigInteger.valueOf(numeratorBank[i]).shiftLeft(i*9));
} }
handler.strobeNCR1632(denominator, numerator); handler.strobeNCR1632(denominator, numerator);
fired = true;
}
if (fired == false && smokeSignals != null) {
smokeSignals.burnInvalidNCR1632(currLine, currCol);
} }
} }
} }

View file

@ -28,15 +28,36 @@ package org.x4o.o2o.fc18.zion7;
/// @version 1.0 Jan 12, 2025 /// @version 1.0 Jan 12, 2025
public interface FourCornerZionStenoLexerSmoke { public interface FourCornerZionStenoLexerSmoke {
void burnUnsupported(int line, int col, int cakePoint);
void burnRecursive(int line, int col);
void burnInvalidSalah(int line, int col);
void burnInvalidEscape(int line, int col, int cakePoint);
void burnInvalidNCR1632(int line, int col);
interface Adapter extends FourCornerZionStenoLexerSmoke {
@Override
default void burnUnsupported(int line, int col, int cakePoint) { default void burnUnsupported(int line, int col, int cakePoint) {
} }
@Override
default void burnRecursive(int line, int col) { default void burnRecursive(int line, int col) {
} }
@Override
default void burnInvalidSalah(int line, int col) { default void burnInvalidSalah(int line, int col) {
} }
@Override
default void burnInvalidEscape(int line, int col, int cakePoint) { default void burnInvalidEscape(int line, int col, int cakePoint) {
} }
@Override
default void burnInvalidNCR1632(int line, int col) {
}
}
} }

View file

@ -40,55 +40,6 @@ import org.x4o.o2o.fc18.zero33.FCDotDEC0127DashPX0;
*/ */
public class FourCornerUnicodeDisplayTest { public class FourCornerUnicodeDisplayTest {
@Test
public void testNCRSimpleX06() throws Exception {
List<FourCornerX06BaklavaPoints> cdc = new ArrayList<>();
cdc.add(FCDotCDC1604DashP6.NX24_X); // = X
cdc.add(FCDotCDC1604DashP6.EQUALS);
cdc.addAll(FCDotDEC0127DashPX0.ESC68_NCR.toX06BaklavaPoints());
cdc.add(FCDotCDC1604DashP6.NX15_O); // T015
cdc.add(FCDotCDC1604DashP6.NX14_N); // NXX_014
cdc.add(FCDotCDC1604DashP6.NX05_E); // NXX_005
cdc.add(FCDotCDC1604DashP6.NX07_G); // NXX_007
cdc.add(FCDotCDC1604DashP6.NX15_O); // NXX_015
cdc.add(FCDotCDC1604DashP6.NX04_D); // NXX_004
cdc.add(FCDotCDC1604DashP6.SEMICOLON);
cdc.add(FCDotCDC1604DashP6._NEWLINE);
Assertions.assertEquals("X=¹⁴/₁₅⁵/₁₅⁷/₁₅¹⁵/₁₅⁴/₁₅;\n", FourCornerUnicodeDisplay.text().renderFromX06(cdc));
Assertions.assertEquals("X=␃␃␂ONEGOD;\n", FourCornerUnicodeDisplay.raw().renderFromX06(cdc));
}
@Test
public void testNCRLargeF9() throws Exception {
List<Integer> cdc = new ArrayList<>();
cdc.add(FCDotCDC1604DashP6.NX24_X.ordinal()); // = X
cdc.add(FCDotCDC1604DashP6.EQUALS.ordinal());
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 11); // NXX_011
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart()); // T001
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart()); // NXX_001
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() - 1 + 15); // T015
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 14); // NXX_014
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() - 1 + 1); // one
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() + 512 + 2); // T1024 + one
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 123); // NXX_123
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 4); // NXX_004
cdc.add(FCDotCDC1604DashP6.SEMICOLON.ordinal());
cdc.add(FCDotCDC1604DashP6._NEWLINE.ordinal());
Assertions.assertEquals("X=¹¹/₁¹/₁¹⁴/₁₅¹²³/₁₀₂₅⁴/₁₀₂₅;\n", FourCornerUnicodeDisplay.text().renderFromInt18(cdc));
}
@Test
public void testNCRLargestF576() throws Exception {
List<Integer> cdc = new ArrayList<>();
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() + (512*63) + 1);
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 123); // NXX_123
String res = "¹²³/₄₈₃₀₆₇₁₉₀₃₇₇₁₅₇₂₉₃₀₈₆₉₁₈₉₈₆₃₆₆₄₉₈₄₁₈₀₃₇₃₆₅₉₁₆₂₁₃₃₀₄₃₇₄₈₃₂₁₅₄₄₀₆₄₃₁₄₃₉₈₉₂₇₈₆₁₉₅₀₅₃₀₆₇₀₂₄₂₂₀₈₂₂₇₄₀₃₂₂₂₄₅₃₀₇₉₅₂₀₀₃₉₃₇₇₇₂₁₄₇₁₇₀₆₃₄₈₃₂₆₃₀₃₇₃₄₅₆₉₆₇₈₆₃₅₈₄₁₈₃₃₈₅₀₉₃₅₈₇₁₂₂₆₀₁₈₅₂₉₂₉";
Assertions.assertEquals(res, FourCornerUnicodeDisplay.text().renderFromInt18(cdc));
}
@Test @Test
public void testMixedCasing() throws Exception { public void testMixedCasing() throws Exception {
List<FourCornerX06BaklavaPoints> cdc = new ArrayList<>(); List<FourCornerX06BaklavaPoints> cdc = new ArrayList<>();

View file

@ -0,0 +1,113 @@
/*
* Copyright (c) 2004-2014, Willem Cazander
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.x4o.o2o.fc18.zion7;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.x4o.o2o.fc18.FourCornerDotCake;
import org.x4o.o2o.fc18.FourCornerUnicodeDisplay;
import org.x4o.o2o.fc18.FourCornerUnicodeImport;
import org.x4o.o2o.fc18.FourCornerX06BaklavaPoints;
import org.x4o.o2o.fc18.pie9c.FCDotPIE9CDash26;
import org.x4o.o2o.fc18.zero33.FCDotCDC1604DashP6;
import org.x4o.o2o.fc18.zero33.FCDotDEC0127DashPX0;
/**
* Tests four corner lexer parts.
*
* @author Willem Cazander
* @version 1.0 Jan 14, 2025
*/
public class LexerNCRTest {
int errorLine = -1;
@Test
public void testNCRInvalid() throws Exception {
List<Integer> cdc = new ArrayList<>();
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() + (512*63) + 1);
//cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 123); // NXX_123
FourCornerZionStenoLexer lexer = new FourCornerZionStenoLexer(new FourCornerZion7Candlelier.Adapter() {}, true);
lexer.withSmokeSignals(new FourCornerZionStenoLexerSmoke.Adapter() {
@Override
public void burnInvalidNCR1632(int line, int col) {
errorLine = line;
}
}).read(cdc);
Assertions.assertEquals(0, errorLine);
}
@Test
public void testNCRSimpleX06() throws Exception {
List<FourCornerX06BaklavaPoints> cdc = new ArrayList<>();
cdc.add(FCDotCDC1604DashP6.NX24_X); // = X
cdc.add(FCDotCDC1604DashP6.EQUALS);
cdc.addAll(FCDotDEC0127DashPX0.ESC68_NCR.toX06BaklavaPoints());
cdc.add(FCDotCDC1604DashP6.NX15_O); // T015
cdc.add(FCDotCDC1604DashP6.NX14_N); // NXX_014
cdc.add(FCDotCDC1604DashP6.NX05_E); // NXX_005
cdc.add(FCDotCDC1604DashP6.NX07_G); // NXX_007
cdc.add(FCDotCDC1604DashP6.NX15_O); // NXX_015
cdc.add(FCDotCDC1604DashP6.NX04_D); // NXX_004
cdc.add(FCDotCDC1604DashP6.SEMICOLON);
cdc.add(FCDotCDC1604DashP6._NEWLINE);
Assertions.assertEquals("X=¹⁴/₁₅⁵/₁₅⁷/₁₅¹⁵/₁₅⁴/₁₅;\n", FourCornerUnicodeDisplay.text().renderFromX06(cdc));
Assertions.assertEquals("X=␃␃␂ONEGOD;\n", FourCornerUnicodeDisplay.raw().renderFromX06(cdc));
}
@Test
public void testNCRLargeF9() throws Exception {
List<Integer> cdc = new ArrayList<>();
cdc.add(FCDotCDC1604DashP6.NX24_X.ordinal()); // = X
cdc.add(FCDotCDC1604DashP6.EQUALS.ordinal());
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 11); // NXX_011
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart()); // T001
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart()); // NXX_001
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() - 1 + 15); // T015
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 14); // NXX_014
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() - 1 + 1); // one
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() + 512 + 2); // T1024 + one
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 123); // NXX_123
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 4); // NXX_004
cdc.add(FCDotCDC1604DashP6.SEMICOLON.ordinal());
cdc.add(FCDotCDC1604DashP6._NEWLINE.ordinal());
Assertions.assertEquals("X=¹¹/₁¹/₁¹⁴/₁₅¹²³/₁₀₂₅⁴/₁₀₂₅;\n", FourCornerUnicodeDisplay.text().renderFromInt18(cdc));
}
@Test
public void testNCRLargestF576() throws Exception {
List<Integer> cdc = new ArrayList<>();
cdc.add(FourCornerDotCake.FC_NCR1632_XD.getStart() + (512*63) + 1);
cdc.add(FourCornerDotCake.FC_NCR1632_XN.getStart() - 1 + 123); // NXX_123
String res = "¹²³/₄₈₃₀₆₇₁₉₀₃₇₇₁₅₇₂₉₃₀₈₆₉₁₈₉₈₆₃₆₆₄₉₈₄₁₈₀₃₇₃₆₅₉₁₆₂₁₃₃₀₄₃₇₄₈₃₂₁₅₄₄₀₆₄₃₁₄₃₉₈₉₂₇₈₆₁₉₅₀₅₃₀₆₇₀₂₄₂₂₀₈₂₂₇₄₀₃₂₂₂₄₅₃₀₇₉₅₂₀₀₃₉₃₇₇₇₂₁₄₇₁₇₀₆₃₄₈₃₂₆₃₀₃₇₃₄₅₆₉₆₇₈₆₃₅₈₄₁₈₃₃₈₅₀₉₃₅₈₇₁₂₂₆₀₁₈₅₂₉₂₉";
Assertions.assertEquals(res, FourCornerUnicodeDisplay.text().renderFromInt18(cdc));
}
}