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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user