Skip to content

Commit 9d80549

Browse files
committed
dd: fix ISO-8859-1 case conversion for conv=lcase/ucase
1 parent 4c1536b commit 9d80549

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

src/uu/dd/src/conversion_tables.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ pub const ASCII_UCASE_TO_LCASE: ConversionTable = [
2222
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
2323
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
2424
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
25-
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
26-
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
25+
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
26+
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf,
2727
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
2828
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
2929
];
@@ -43,8 +43,8 @@ pub const ASCII_LCASE_TO_UCASE: ConversionTable = [
4343
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
4444
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
4545
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
46-
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
47-
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
46+
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
47+
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff,
4848
];
4949

5050
pub const ASCII_TO_EBCDIC: ConversionTable = [

tests/by-util/test_dd.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,3 +1945,44 @@ fn test_nocache_eof_fadvise_zero_length() {
19451945
"Expected len=0 at EOF: {strace}"
19461946
);
19471947
}
1948+
1949+
#[test]
1950+
fn test_iso8859_1_case_conversion() {
1951+
// Test ISO-8859-1 case conversion for accented characters
1952+
// É (0xC9) should convert to é (0xE9) with lcase
1953+
let input = vec![0xC9, 0x0A]; // É\n in ISO-8859-1
1954+
let expected = vec![0xE9, 0x0A]; // é\n in ISO-8859-1
1955+
let result = new_ucmd!()
1956+
.args(&["conv=lcase", "status=none"])
1957+
.pipe_in(input)
1958+
.succeeds();
1959+
assert_eq!(result.stdout(), expected);
1960+
1961+
// é (0xE9) should convert to É (0xC9) with ucase
1962+
let input = vec![0xE9, 0x0A]; // é\n in ISO-8859-1
1963+
let expected = vec![0xC9, 0x0A]; // É\n in ISO-8859-1
1964+
let result = new_ucmd!()
1965+
.args(&["conv=ucase", "status=none"])
1966+
.pipe_in(input)
1967+
.succeeds();
1968+
assert_eq!(result.stdout(), expected);
1969+
1970+
// Test multiple ISO-8859-1 characters
1971+
// À (0xC0), Ç (0xC7) should convert to à (0xE0), ç (0xE7) with lcase
1972+
let input = vec![0xC0, 0xC7, 0x0A]; // ÀÇ\n
1973+
let expected = vec![0xE0, 0xE7, 0x0A]; // àç\n
1974+
let result = new_ucmd!()
1975+
.args(&["conv=lcase", "status=none"])
1976+
.pipe_in(input)
1977+
.succeeds();
1978+
assert_eq!(result.stdout(), expected);
1979+
1980+
// à (0xE0), ç (0xE7) should convert to À (0xC0), Ç (0xC7) with ucase
1981+
let input = vec![0xE0, 0xE7, 0x0A]; // àç\n
1982+
let expected = vec![0xC0, 0xC7, 0x0A]; // ÀÇ\n
1983+
let result = new_ucmd!()
1984+
.args(&["conv=ucase", "status=none"])
1985+
.pipe_in(input)
1986+
.succeeds();
1987+
assert_eq!(result.stdout(), expected);
1988+
}

0 commit comments

Comments
 (0)