parent
							
								
									868ca20ff5
								
							
						
					
					
						commit
						3f99eafe23
					
				| @ -43,6 +43,29 @@ func shouldUseCTable(nextRunes []rune, curEncoding byte) bool { | ||||
| 	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 { | ||||
| 	result := new(utils.BitList) | ||||
| 	curEncoding := byte(0) | ||||
| @ -59,12 +82,42 @@ func getCodeIndexList(content []rune) *utils.BitList { | ||||
| 			if content[i] == FNC1 { | ||||
| 				result.AddByte(102) | ||||
| 			} else { | ||||
| 
 | ||||
| 				idx := (content[i] - '0') * 10 | ||||
| 				i++ | ||||
| 				idx = idx + (content[i] - '0') | ||||
| 				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 { | ||||
| 			if curEncoding != startBSymbol { | ||||
| 				if curEncoding == byte(0) { | ||||
|  | ||||
| @ -11,7 +11,7 @@ func testEncode(t *testing.T, txt, testResult string) { | ||||
| 		t.Error(err) | ||||
| 	} else { | ||||
| 		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 { | ||||
| 			encoded := "" | ||||
| 			failed := false | ||||
| @ -88,3 +88,16 @@ func Test_shouldUseCTable(t *testing.T) { | ||||
| 		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 bTable = abTable + "`abcdefghijklmnopqrstuvwxyz{|}~\u007F" | ||||
| const aTable = abTable + | ||||
| 	"\u0000\u0001\u0002\u0003\u0004" + // NUL, SOH, STX, ETX, EOT | ||||
| const aOnlyTable = "\u0000\u0001\u0002\u0003\u0004" + // NUL, SOH, STX, ETX, EOT | ||||
| 	"\u0005\u0006\u0007\u0008\u0009" + // ENQ, ACK, BEL, BS,  HT | ||||
| 	"\u000A\u000B\u000C\u000D\u000E" + // LF,  VT,  FF,  CR,  SO | ||||
| 	"\u000F\u0010\u0011\u0012\u0013" + // SI,  DLE, DC1, DC2, DC3 | ||||
| 	"\u0014\u0015\u0016\u0017\u0018" + // DC4, NAK, SYN, ETB, CAN | ||||
| 	"\u0019\u001A\u001B\u001C\u001D" + // EM,  SUB, ESC, FS,  GS | ||||
| 	"\u001E\u001F" // RS,  US | ||||
| const aTable = abTable + aOnlyTable | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user