parent
868ca20ff5
commit
3f99eafe23
|
@ -43,6 +43,29 @@ func shouldUseCTable(nextRunes []rune, curEncoding byte) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tableContainsRune(table string, r rune) bool {
|
||||||
|
return strings.ContainsRune(table, r) || r == FNC1 || r == FNC2 || r == FNC3 || r == FNC4
|
||||||
|
}
|
||||||
|
|
||||||
|
func shouldUseATable(nextRunes []rune, curEncoding byte) bool {
|
||||||
|
nextRune := nextRunes[0]
|
||||||
|
if !tableContainsRune(bTable, nextRune) || curEncoding == startASymbol {
|
||||||
|
return tableContainsRune(aTable, nextRune)
|
||||||
|
}
|
||||||
|
if curEncoding == 0 {
|
||||||
|
for _, r := range nextRunes {
|
||||||
|
if tableContainsRune(abTable, r) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.ContainsRune(aOnlyTable, r) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func getCodeIndexList(content []rune) *utils.BitList {
|
func getCodeIndexList(content []rune) *utils.BitList {
|
||||||
result := new(utils.BitList)
|
result := new(utils.BitList)
|
||||||
curEncoding := byte(0)
|
curEncoding := byte(0)
|
||||||
|
@ -59,12 +82,42 @@ func getCodeIndexList(content []rune) *utils.BitList {
|
||||||
if content[i] == FNC1 {
|
if content[i] == FNC1 {
|
||||||
result.AddByte(102)
|
result.AddByte(102)
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
idx := (content[i] - '0') * 10
|
idx := (content[i] - '0') * 10
|
||||||
i++
|
i++
|
||||||
idx = idx + (content[i] - '0')
|
idx = idx + (content[i] - '0')
|
||||||
result.AddByte(byte(idx))
|
result.AddByte(byte(idx))
|
||||||
}
|
}
|
||||||
|
} else if shouldUseATable(content[i:], curEncoding) {
|
||||||
|
if curEncoding != startASymbol {
|
||||||
|
if curEncoding == byte(0) {
|
||||||
|
result.AddByte(startASymbol)
|
||||||
|
} else {
|
||||||
|
result.AddByte(codeASymbol)
|
||||||
|
}
|
||||||
|
curEncoding = startASymbol
|
||||||
|
}
|
||||||
|
var idx int
|
||||||
|
switch content[i] {
|
||||||
|
case FNC1:
|
||||||
|
idx = 102
|
||||||
|
break
|
||||||
|
case FNC2:
|
||||||
|
idx = 97
|
||||||
|
break
|
||||||
|
case FNC3:
|
||||||
|
idx = 96
|
||||||
|
break
|
||||||
|
case FNC4:
|
||||||
|
idx = 101
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
idx = strings.IndexRune(aTable, content[i])
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if idx < 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
result.AddByte(byte(idx))
|
||||||
} else {
|
} else {
|
||||||
if curEncoding != startBSymbol {
|
if curEncoding != startBSymbol {
|
||||||
if curEncoding == byte(0) {
|
if curEncoding == byte(0) {
|
||||||
|
|
|
@ -11,7 +11,7 @@ func testEncode(t *testing.T, txt, testResult string) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
} else {
|
} else {
|
||||||
if code.Bounds().Max.X != len(testResult) {
|
if code.Bounds().Max.X != len(testResult) {
|
||||||
t.Errorf("%v: length missmatch", txt)
|
t.Errorf("%v: length missmatch. Got %d expected %d", txt, code.Bounds().Max.X, len(testResult))
|
||||||
} else {
|
} else {
|
||||||
encoded := ""
|
encoded := ""
|
||||||
failed := false
|
failed := false
|
||||||
|
@ -88,3 +88,16 @@ func Test_shouldUseCTable(t *testing.T) {
|
||||||
t.Error("01[FNC1] failed")
|
t.Error("01[FNC1] failed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_Issue16(t *testing.T) {
|
||||||
|
if !shouldUseATable([]rune{'\r', 'A'}, 0) {
|
||||||
|
t.Error("Code should start with A-Table if the text start with \\r")
|
||||||
|
}
|
||||||
|
if !shouldUseATable([]rune{FNC1, '\r'}, 0) {
|
||||||
|
t.Error("Code should start with A-Table if the text start with <FNC1>\\r")
|
||||||
|
}
|
||||||
|
if shouldUseATable([]rune{FNC1, '1', '2', '3'}, 0) {
|
||||||
|
t.Error("Code should not start with A-Table if the text start with <FNC1>123")
|
||||||
|
}
|
||||||
|
testEncode(t, string(FNC3)+"$P\rI", "110100001001011110001010010001100111011101101111011101011000100010110001010001100011101011")
|
||||||
|
}
|
||||||
|
|
|
@ -133,11 +133,11 @@ const (
|
||||||
|
|
||||||
const abTable = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
|
const abTable = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
|
||||||
const bTable = abTable + "`abcdefghijklmnopqrstuvwxyz{|}~\u007F"
|
const bTable = abTable + "`abcdefghijklmnopqrstuvwxyz{|}~\u007F"
|
||||||
const aTable = abTable +
|
const aOnlyTable = "\u0000\u0001\u0002\u0003\u0004" + // NUL, SOH, STX, ETX, EOT
|
||||||
"\u0000\u0001\u0002\u0003\u0004" + // NUL, SOH, STX, ETX, EOT
|
|
||||||
"\u0005\u0006\u0007\u0008\u0009" + // ENQ, ACK, BEL, BS, HT
|
"\u0005\u0006\u0007\u0008\u0009" + // ENQ, ACK, BEL, BS, HT
|
||||||
"\u000A\u000B\u000C\u000D\u000E" + // LF, VT, FF, CR, SO
|
"\u000A\u000B\u000C\u000D\u000E" + // LF, VT, FF, CR, SO
|
||||||
"\u000F\u0010\u0011\u0012\u0013" + // SI, DLE, DC1, DC2, DC3
|
"\u000F\u0010\u0011\u0012\u0013" + // SI, DLE, DC1, DC2, DC3
|
||||||
"\u0014\u0015\u0016\u0017\u0018" + // DC4, NAK, SYN, ETB, CAN
|
"\u0014\u0015\u0016\u0017\u0018" + // DC4, NAK, SYN, ETB, CAN
|
||||||
"\u0019\u001A\u001B\u001C\u001D" + // EM, SUB, ESC, FS, GS
|
"\u0019\u001A\u001B\u001C\u001D" + // EM, SUB, ESC, FS, GS
|
||||||
"\u001E\u001F" // RS, US
|
"\u001E\u001F" // RS, US
|
||||||
|
const aTable = abTable + aOnlyTable
|
||||||
|
|
Loading…
Reference in New Issue