Feat(cli): Finished all functionalities
- passed all tests
This commit is contained in:
parent
d401122b30
commit
3402ac506f
17
.github/workflows/rust.yml
vendored
17
.github/workflows/rust.yml
vendored
@ -2,21 +2,22 @@ name: Rust
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "master" ]
|
branches: ["master"]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "master" ]
|
branches: ["master"]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Build
|
- name: Build
|
||||||
run: cargo build --verbose
|
run: cargo build --verbose
|
||||||
- name: Run tests
|
- name: Run pre tests
|
||||||
run: cargo test --verbose
|
run: ./mk-outs.sh
|
||||||
|
- name: Run tests
|
||||||
|
run: cargo test --verbose
|
||||||
|
208
Cargo.lock
generated
208
Cargo.lock
generated
@ -106,6 +106,7 @@ dependencies = [
|
|||||||
"clap",
|
"clap",
|
||||||
"predicates",
|
"predicates",
|
||||||
"rand",
|
"rand",
|
||||||
|
"rstest",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -202,6 +203,101 @@ dependencies = [
|
|||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
|
||||||
|
dependencies = [
|
||||||
|
"futures-channel",
|
||||||
|
"futures-core",
|
||||||
|
"futures-executor",
|
||||||
|
"futures-io",
|
||||||
|
"futures-sink",
|
||||||
|
"futures-task",
|
||||||
|
"futures-util",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-channel"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"futures-sink",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-core"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-executor"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"futures-task",
|
||||||
|
"futures-util",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-io"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-macro"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-sink"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-task"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-timer"
|
||||||
|
version = "3.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-util"
|
||||||
|
version = "0.3.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
|
||||||
|
dependencies = [
|
||||||
|
"futures-channel",
|
||||||
|
"futures-core",
|
||||||
|
"futures-io",
|
||||||
|
"futures-macro",
|
||||||
|
"futures-sink",
|
||||||
|
"futures-task",
|
||||||
|
"memchr",
|
||||||
|
"pin-project-lite",
|
||||||
|
"pin-utils",
|
||||||
|
"slab",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.10"
|
version = "0.2.10"
|
||||||
@ -213,6 +309,12 @@ dependencies = [
|
|||||||
"wasi",
|
"wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glob"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hermit-abi"
|
name = "hermit-abi"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
@ -278,6 +380,18 @@ version = "1.18.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
|
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pin-project-lite"
|
||||||
|
version = "0.2.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pin-utils"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ppv-lite86"
|
name = "ppv-lite86"
|
||||||
version = "0.2.17"
|
version = "0.2.17"
|
||||||
@ -315,6 +429,24 @@ dependencies = [
|
|||||||
"termtree",
|
"termtree",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.66"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.33"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.5"
|
version = "0.8.5"
|
||||||
@ -374,6 +506,50 @@ version = "0.7.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
|
checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "relative-path"
|
||||||
|
version = "1.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c707298afce11da2efef2f600116fa93ffa7a032b5d7b628aa17711ec81383ca"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rstest"
|
||||||
|
version = "0.18.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199"
|
||||||
|
dependencies = [
|
||||||
|
"futures",
|
||||||
|
"futures-timer",
|
||||||
|
"rstest_macros",
|
||||||
|
"rustc_version",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rstest_macros"
|
||||||
|
version = "0.18.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"glob",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"regex",
|
||||||
|
"relative-path",
|
||||||
|
"rustc_version",
|
||||||
|
"syn",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_version"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
|
||||||
|
dependencies = [
|
||||||
|
"semver",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.4"
|
version = "0.38.4"
|
||||||
@ -387,24 +563,56 @@ dependencies = [
|
|||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semver"
|
||||||
|
version = "1.0.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.176"
|
version = "1.0.176"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc"
|
checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "slab"
|
||||||
|
version = "0.4.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.29"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "termtree"
|
name = "termtree"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
|
checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf8parse"
|
name = "utf8parse"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -14,3 +14,4 @@ clap = { version = "4", features = ["cargo", "help"] }
|
|||||||
assert_cmd = "2.0.12"
|
assert_cmd = "2.0.12"
|
||||||
predicates = "3.0.3"
|
predicates = "3.0.3"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
rstest = "0.18.1"
|
||||||
|
29
mk-outs.sh
Executable file
29
mk-outs.sh
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -u
|
||||||
|
|
||||||
|
ROOT="tests/inputs"
|
||||||
|
OUT_DIR="tests/expected"
|
||||||
|
|
||||||
|
[[ ! -d "$OUT_DIR" ]] && mkdir -p "$OUT_DIR"
|
||||||
|
|
||||||
|
EMPTY="$ROOT/empty.txt"
|
||||||
|
FOX="$ROOT/fox.txt"
|
||||||
|
SPIDERS="$ROOT/spiders.txt"
|
||||||
|
BUSTLE="$ROOT/the-bustle.txt"
|
||||||
|
ALL="$EMPTY $FOX $SPIDERS $BUSTLE"
|
||||||
|
|
||||||
|
for FILE in $ALL; do
|
||||||
|
BASENAME=$(basename "$FILE")
|
||||||
|
cat $FILE > ${OUT_DIR}/${BASENAME}.out
|
||||||
|
cat -n $FILE > ${OUT_DIR}/${BASENAME}.n.out
|
||||||
|
cat -b $FILE > ${OUT_DIR}/${BASENAME}.b.out
|
||||||
|
done
|
||||||
|
|
||||||
|
cat $ALL > $OUT_DIR/all.out
|
||||||
|
cat -n $ALL > $OUT_DIR/all.n.out
|
||||||
|
cat -b $ALL > $OUT_DIR/all.b.out
|
||||||
|
|
||||||
|
cat < $BUSTLE > $OUT_DIR/$(basename $BUSTLE).stdin.out
|
||||||
|
cat -n < $BUSTLE > $OUT_DIR/$(basename $BUSTLE).n.stdin.out
|
||||||
|
cat -b < $BUSTLE > $OUT_DIR/$(basename $BUSTLE).b.stdin.out
|
66
src/lib.rs
66
src/lib.rs
@ -70,11 +70,75 @@ fn open(filename: &str) -> MyResult<Box<dyn BufRead>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn count_digits(mut number: usize) -> usize {
|
||||||
|
if number == 0 {
|
||||||
|
return 1; // Special case for the number 0
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
|
while number != 0 {
|
||||||
|
number /= 10;
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
count
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cat(
|
||||||
|
buf_reader: Box<dyn BufRead>,
|
||||||
|
line_num: &mut usize,
|
||||||
|
number_lines: bool,
|
||||||
|
number_nonblank_lines: bool,
|
||||||
|
) {
|
||||||
|
for line in buf_reader.lines() {
|
||||||
|
match line {
|
||||||
|
Ok(text) => match (number_lines, number_nonblank_lines) {
|
||||||
|
(true, false) => {
|
||||||
|
println!(
|
||||||
|
"{}{}\t{}",
|
||||||
|
" ".to_string().repeat(6 - count_digits(*line_num)),
|
||||||
|
line_num,
|
||||||
|
text
|
||||||
|
);
|
||||||
|
*line_num += 1;
|
||||||
|
}
|
||||||
|
(false, true) => {
|
||||||
|
if text.trim().is_empty() {
|
||||||
|
println!()
|
||||||
|
} else {
|
||||||
|
println!(
|
||||||
|
"{}{}\t{}",
|
||||||
|
" ".to_string().repeat(6 - count_digits(*line_num)),
|
||||||
|
line_num,
|
||||||
|
text
|
||||||
|
);
|
||||||
|
*line_num += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
println!("{}", text);
|
||||||
|
*line_num += 1;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Err(err) => eprintln!("Error: {}", err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn run(config: Config) -> MyResult<()> {
|
pub fn run(config: Config) -> MyResult<()> {
|
||||||
|
let mut line_num: usize = 1;
|
||||||
|
|
||||||
for filepath in config.files {
|
for filepath in config.files {
|
||||||
match open(&filepath) {
|
match open(&filepath) {
|
||||||
Err(err) => eprintln!("Failed to open {}: {}", filepath, err),
|
Err(err) => eprintln!("Failed to open {}: {}", filepath, err),
|
||||||
Ok(_) => println!("Opened {}", filepath),
|
Ok(buf_reader) => cat(
|
||||||
|
buf_reader,
|
||||||
|
&mut line_num,
|
||||||
|
config.number_lines,
|
||||||
|
config.number_nonblank_lines,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ fn usage() -> TestResult {
|
|||||||
Command::cargo_bin(PRG)?
|
Command::cargo_bin(PRG)?
|
||||||
.arg(flag)
|
.arg(flag)
|
||||||
.assert()
|
.assert()
|
||||||
.stdout(predicate::str::contains("USAGE"));
|
.stdout(predicate::str::contains("Usage"));
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
1 The quick brown fox jumps over the lazy dog.
|
1 The quick brown fox jumps over the lazy dog.
|
||||||
1 Don't worry, spiders,
|
2 Don't worry, spiders,
|
||||||
2 I keep house
|
3 I keep house
|
||||||
3 casually.
|
4 casually.
|
||||||
1 The bustle in a house
|
5 The bustle in a house
|
||||||
2 The morning after death
|
6 The morning after death
|
||||||
3 Is solemnest of industries
|
7 Is solemnest of industries
|
||||||
4 Enacted upon earth,—
|
8 Enacted upon earth,—
|
||||||
|
|
||||||
5 The sweeping up the heart,
|
9 The sweeping up the heart,
|
||||||
6 And putting love away
|
10 And putting love away
|
||||||
7 We shall not want to use again
|
11 We shall not want to use again
|
||||||
8 Until eternity.
|
12 Until eternity.
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
1 The quick brown fox jumps over the lazy dog.
|
1 The quick brown fox jumps over the lazy dog.
|
||||||
1 Don't worry, spiders,
|
2 Don't worry, spiders,
|
||||||
2 I keep house
|
3 I keep house
|
||||||
3 casually.
|
4 casually.
|
||||||
1 The bustle in a house
|
5 The bustle in a house
|
||||||
2 The morning after death
|
6 The morning after death
|
||||||
3 Is solemnest of industries
|
7 Is solemnest of industries
|
||||||
4 Enacted upon earth,—
|
8 Enacted upon earth,—
|
||||||
5
|
9
|
||||||
6 The sweeping up the heart,
|
10 The sweeping up the heart,
|
||||||
7 And putting love away
|
11 And putting love away
|
||||||
8 We shall not want to use again
|
12 We shall not want to use again
|
||||||
9 Until eternity.
|
13 Until eternity.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user