~nabijaczleweli/voreutils

f7a085d3b0b21d952a55c06c253d969757f1335e — наб 8 days ago 336a58e
Add expand(1)
312 files changed, 827 insertions(+), 22 deletions(-)

M README.md
A cmd/expand.cpp
M cmd/sleep.cpp
M include/vore-file
M include/vore-print
A include/vore-token
A man/expand.1
M man/true.1
M man/uname.1
A tests/expand/data/expand.1-1
A tests/expand/data/expand.1-1.d/expand.1-1   
A tests/expand/data/expand.1-1.d/expand.1-1 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t2,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t4,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54,55,68,78 -i
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,55,68,78   
A tests/expand/data/expand.1-1.d/expand.1-1 -t7,55,68,78 -i
A tests/expand/data/expand.1-2
A tests/expand/data/expand.1-2.d/expand.1-2   
A tests/expand/data/expand.1-2.d/expand.1-2 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t2,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t4,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54,55,68,78 -i
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,55,68,78   
A tests/expand/data/expand.1-2.d/expand.1-2 -t7,55,68,78 -i
A tests/expand/data/xaa
A tests/expand/data/xaa.d/xaa   
A tests/expand/data/xaa.d/xaa -i
A tests/expand/data/xaa.d/xaa -t2   
A tests/expand/data/xaa.d/xaa -t2 -i
A tests/expand/data/xaa.d/xaa -t2,26   
A tests/expand/data/xaa.d/xaa -t2,26 -i
A tests/expand/data/xaa.d/xaa -t2,26,37,52   
A tests/expand/data/xaa.d/xaa -t2,26,37,52 -i
A tests/expand/data/xaa.d/xaa -t2,26,37,52,55,68,78   
A tests/expand/data/xaa.d/xaa -t2,26,37,52,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t2,26,54   
A tests/expand/data/xaa.d/xaa -t2,26,54 -i
A tests/expand/data/xaa.d/xaa -t2,26,54,55,68,78   
A tests/expand/data/xaa.d/xaa -t2,26,54,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t2,26,55,68,78   
A tests/expand/data/xaa.d/xaa -t2,26,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t2,37,52   
A tests/expand/data/xaa.d/xaa -t2,37,52 -i
A tests/expand/data/xaa.d/xaa -t2,37,52,55,68,78   
A tests/expand/data/xaa.d/xaa -t2,37,52,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t2,54   
A tests/expand/data/xaa.d/xaa -t2,54 -i
A tests/expand/data/xaa.d/xaa -t2,54,55,68,78   
A tests/expand/data/xaa.d/xaa -t2,54,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t2,55,68,78   
A tests/expand/data/xaa.d/xaa -t2,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t4   
A tests/expand/data/xaa.d/xaa -t4 -i
A tests/expand/data/xaa.d/xaa -t4,26   
A tests/expand/data/xaa.d/xaa -t4,26 -i
A tests/expand/data/xaa.d/xaa -t4,26,37,52   
A tests/expand/data/xaa.d/xaa -t4,26,37,52 -i
A tests/expand/data/xaa.d/xaa -t4,26,37,52,55,68,78   
A tests/expand/data/xaa.d/xaa -t4,26,37,52,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t4,26,54   
A tests/expand/data/xaa.d/xaa -t4,26,54 -i
A tests/expand/data/xaa.d/xaa -t4,26,54,55,68,78   
A tests/expand/data/xaa.d/xaa -t4,26,54,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t4,26,55,68,78   
A tests/expand/data/xaa.d/xaa -t4,26,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t4,37,52   
A tests/expand/data/xaa.d/xaa -t4,37,52 -i
A tests/expand/data/xaa.d/xaa -t4,37,52,55,68,78   
A tests/expand/data/xaa.d/xaa -t4,37,52,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t4,54   
A tests/expand/data/xaa.d/xaa -t4,54 -i
A tests/expand/data/xaa.d/xaa -t4,54,55,68,78   
A tests/expand/data/xaa.d/xaa -t4,54,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t4,55,68,78   
A tests/expand/data/xaa.d/xaa -t4,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t7   
A tests/expand/data/xaa.d/xaa -t7 -i
A tests/expand/data/xaa.d/xaa -t7,26   
A tests/expand/data/xaa.d/xaa -t7,26 -i
A tests/expand/data/xaa.d/xaa -t7,26,37,52   
A tests/expand/data/xaa.d/xaa -t7,26,37,52 -i
A tests/expand/data/xaa.d/xaa -t7,26,37,52,55,68,78   
A tests/expand/data/xaa.d/xaa -t7,26,37,52,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t7,26,54   
A tests/expand/data/xaa.d/xaa -t7,26,54 -i
A tests/expand/data/xaa.d/xaa -t7,26,54,55,68,78   
A tests/expand/data/xaa.d/xaa -t7,26,54,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t7,26,55,68,78   
A tests/expand/data/xaa.d/xaa -t7,26,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t7,37,52   
A tests/expand/data/xaa.d/xaa -t7,37,52 -i
A tests/expand/data/xaa.d/xaa -t7,37,52,55,68,78   
A tests/expand/data/xaa.d/xaa -t7,37,52,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t7,54   
A tests/expand/data/xaa.d/xaa -t7,54 -i
A tests/expand/data/xaa.d/xaa -t7,54,55,68,78   
A tests/expand/data/xaa.d/xaa -t7,54,55,68,78 -i
A tests/expand/data/xaa.d/xaa -t7,55,68,78   
A tests/expand/data/xaa.d/xaa -t7,55,68,78 -i
A tests/expand/data/xab
A tests/expand/data/xab.d/xab   
A tests/expand/data/xab.d/xab -i
A tests/expand/data/xab.d/xab -t2   
A tests/expand/data/xab.d/xab -t2 -i
A tests/expand/data/xab.d/xab -t2,26   
A tests/expand/data/xab.d/xab -t2,26 -i
A tests/expand/data/xab.d/xab -t2,26,37,52   
A tests/expand/data/xab.d/xab -t2,26,37,52 -i
A tests/expand/data/xab.d/xab -t2,26,37,52,55,68,78   
A tests/expand/data/xab.d/xab -t2,26,37,52,55,68,78 -i
A tests/expand/data/xab.d/xab -t2,26,54   
A tests/expand/data/xab.d/xab -t2,26,54 -i
A tests/expand/data/xab.d/xab -t2,26,54,55,68,78   
A tests/expand/data/xab.d/xab -t2,26,54,55,68,78 -i
A tests/expand/data/xab.d/xab -t2,26,55,68,78   
A tests/expand/data/xab.d/xab -t2,26,55,68,78 -i
A tests/expand/data/xab.d/xab -t2,37,52   
A tests/expand/data/xab.d/xab -t2,37,52 -i
A tests/expand/data/xab.d/xab -t2,37,52,55,68,78   
A tests/expand/data/xab.d/xab -t2,37,52,55,68,78 -i
A tests/expand/data/xab.d/xab -t2,54   
A tests/expand/data/xab.d/xab -t2,54 -i
A tests/expand/data/xab.d/xab -t2,54,55,68,78   
A tests/expand/data/xab.d/xab -t2,54,55,68,78 -i
A tests/expand/data/xab.d/xab -t2,55,68,78   
A tests/expand/data/xab.d/xab -t2,55,68,78 -i
A tests/expand/data/xab.d/xab -t4   
A tests/expand/data/xab.d/xab -t4 -i
A tests/expand/data/xab.d/xab -t4,26   
A tests/expand/data/xab.d/xab -t4,26 -i
A tests/expand/data/xab.d/xab -t4,26,37,52   
A tests/expand/data/xab.d/xab -t4,26,37,52 -i
A tests/expand/data/xab.d/xab -t4,26,37,52,55,68,78   
A tests/expand/data/xab.d/xab -t4,26,37,52,55,68,78 -i
A tests/expand/data/xab.d/xab -t4,26,54   
A tests/expand/data/xab.d/xab -t4,26,54 -i
A tests/expand/data/xab.d/xab -t4,26,54,55,68,78   
A tests/expand/data/xab.d/xab -t4,26,54,55,68,78 -i
A tests/expand/data/xab.d/xab -t4,26,55,68,78   
A tests/expand/data/xab.d/xab -t4,26,55,68,78 -i
A tests/expand/data/xab.d/xab -t4,37,52   
A tests/expand/data/xab.d/xab -t4,37,52 -i
A tests/expand/data/xab.d/xab -t4,37,52,55,68,78   
A tests/expand/data/xab.d/xab -t4,37,52,55,68,78 -i
A tests/expand/data/xab.d/xab -t4,54   
A tests/expand/data/xab.d/xab -t4,54 -i
A tests/expand/data/xab.d/xab -t4,54,55,68,78   
A tests/expand/data/xab.d/xab -t4,54,55,68,78 -i
A tests/expand/data/xab.d/xab -t4,55,68,78   
A tests/expand/data/xab.d/xab -t4,55,68,78 -i
A tests/expand/data/xab.d/xab -t7   
A tests/expand/data/xab.d/xab -t7 -i
A tests/expand/data/xab.d/xab -t7,26   
A tests/expand/data/xab.d/xab -t7,26 -i
A tests/expand/data/xab.d/xab -t7,26,37,52   
A tests/expand/data/xab.d/xab -t7,26,37,52 -i
A tests/expand/data/xab.d/xab -t7,26,37,52,55,68,78   
A tests/expand/data/xab.d/xab -t7,26,37,52,55,68,78 -i
A tests/expand/data/xab.d/xab -t7,26,54   
A tests/expand/data/xab.d/xab -t7,26,54 -i
A tests/expand/data/xab.d/xab -t7,26,54,55,68,78   
A tests/expand/data/xab.d/xab -t7,26,54,55,68,78 -i
A tests/expand/data/xab.d/xab -t7,26,55,68,78   
A tests/expand/data/xab.d/xab -t7,26,55,68,78 -i
A tests/expand/data/xab.d/xab -t7,37,52   
A tests/expand/data/xab.d/xab -t7,37,52 -i
A tests/expand/data/xab.d/xab -t7,37,52,55,68,78   
A tests/expand/data/xab.d/xab -t7,37,52,55,68,78 -i
A tests/expand/data/xab.d/xab -t7,54   
A tests/expand/data/xab.d/xab -t7,54 -i
A tests/expand/data/xab.d/xab -t7,54,55,68,78   
A tests/expand/data/xab.d/xab -t7,54,55,68,78 -i
A tests/expand/data/xab.d/xab -t7,55,68,78   
A tests/expand/data/xab.d/xab -t7,55,68,78 -i
A tests/expand/test
M tests/uname
M tests/unlink
M README.md => README.md +1 -1
@@ 47,7 47,7 @@ GNU coreutils provide the following 105 binaries, according to `dpkg -L coreutil
  [ ] /usr/bin/dirname
  [ ] /usr/bin/du
  [ ] /usr/bin/env
  [ ] /usr/bin/expand
  [x] /usr/bin/expand
  [ ] /usr/bin/expr
  [ ] /usr/bin/factor
  [ ] /usr/bin/fmt

A cmd/expand.cpp => cmd/expand.cpp +150 -0
@@ 0,0 1,150 @@
// SPDX-License-Identifier: 0BSD


#include <algorithm>
#include <cstring>
#include <optional>
#include <unistd.h>
#include <variant>
#include <vector>
#include <vore-file>
#include <vore-getopt>
#include <vore-optarg>
#include <vore-print>
#include <vore-token>
#include <vore-visit>


static bool _parse_stop(const char * val, std::uint64_t & out) {
	if(val[0] == '\0') {
		errno = EINVAL;
		return false;
	}
	if(val[0] == '-') {
		errno = ERANGE;
		return false;
	}

	char * end{};
	errno = 0;
	out   = static_cast<std::uint64_t>(std::strtoull(val, &end, 0));
	if(errno)
		return false;
	if(out == 0) {
		errno = ERANGE;
		return false;
	}
	if(*end != '\0') {
		errno = EINVAL;
		return false;
	}

	return true;
}

static bool parse_stop(const char * self, const char * val, std::uint64_t & out) {
	if(!_parse_stop(val, out)) {
		std::fprintf(stderr, "%s: tab stop %s: %s\n", self, val, std::strerror(errno));
		return false;
	} else
		return true;
}


const char * default_stdin[] = {reinterpret_cast<const char *>(default_stdin), nullptr};  // sentinel


int main(int argc, char * const * argv) {
	bool initial_only                                             = false;
	std::variant<std::uint64_t, std::vector<std::uint64_t>> stops = static_cast<std::uint64_t>(8);

	for(auto && [arg, val] : vore::opt::get{argc, argv, "it:", {{"initial", no_argument, nullptr, 'i'}, {"tabs", required_argument, nullptr, 't'}}})
		switch(arg) {
			case 'i':
				initial_only = true;
				break;
			case 't':
				std::uint64_t s;
				if(std::strchr(val, ',')) {
					std::vector<std::uint64_t> ss;
					for(char * st : vore::tokenise{val, ", "}) {
						if(!parse_stop(argv[0], st, s))
							return 1;
						if(!ss.empty() && s <= ss.back()) {
							std::fprintf(stderr, "%s: tab stop %s: out of order\n", argv[0], st);
							return 1;
						}
						ss.emplace_back(s);
					}
					stops = std::move(ss);
				} else {
					if(!parse_stop(argv[0], val, s))
						return 1;
					stops = s;
				}
				break;
			default: {
				std::fprintf(stderr,
				             "usage: %s [-i] [-t width]               [file]...\n"
				             "       %s [-i] [-t stop,stop[,stop]...] [file]...\n",
				             argv[0], argv[0]);
				return 1;
			}
		}


	char * line         = nullptr;
	std::size_t linecap = 0;
	for(auto file : vore::opt::args{*(argv + optind) ? (argv + optind) : default_stdin}) {
		std::optional<vore::file::FILE<false>> backing_file;
		FILE * input = stdin;
		if(file != *default_stdin)
			input = backing_file.emplace(file, "re");
		if(!input) {
			std::fprintf(stderr, "%s: couldn't open %s: %s\n", argv[0], file, std::strerror(errno));
			return 1;
		}

		for(ssize_t len; (len = getline(&line, &linecap, input)) != -1;) {
			bool saw_nonblank{};
			std::uint64_t col{};

			for(auto c : std::string_view{line, static_cast<std::size_t>(len)})
				switch(c) {
					case '\b':
						if(col)
							--col;
						std::fputc('\b', stdout);
						saw_nonblank = true;
						break;

					case '\t':
						if(!saw_nonblank || !initial_only) {  // initial_only => !saw_nonblank
							auto blanks = std::visit(vore::overload{[&](std::uint64_t width) { return width - (col % width); },
							                                        [&](const std::vector<std::uint64_t> & stops) -> std::uint64_t {
								                                        if(auto stop = std::upper_bound(std::begin(stops), std::end(stops), col); stop != std::end(stops))
									                                        return *stop - col;
								                                        else
									                                        return 1;
							                                        }},
							                         stops);
							col += blanks;
							while(blanks--)
								std::fputc(' ', stdout);
						} else
							std::fputc('\t', stdout);
						break;

					default:
						saw_nonblank = true;
						[[fallthrough]];
					case ' ':
						++col;
						std::fputc(c, stdout);
						break;
				}
		}
	}

	return vore::flush_stdout(argv[0]);
}

M cmd/sleep.cpp => cmd/sleep.cpp +1 -0
@@ 23,6 23,7 @@ int main(int, char * const * argv) {
			switch(delay.back()) {
				case 'y':
					mult *= 365.25 / 7.;
					[[fallthrough]];
				case 'w':
					mult *= 7;
					[[fallthrough]];

M include/vore-file => include/vore-file +51 -6
@@ 4,6 4,7 @@
#pragma once


#include <cstdio>
#include <errno.h>
#include <fcntl.h>
#include <string_view>


@@ 36,14 37,14 @@ namespace vore::file {

			while((this->desc = open(path, flags)) == -1 && errno == EINTR)
				;
			opened = this->desc != -1;
			this->opened = this->desc != -1;
		}

		fd(const fd &) = delete;
		constexpr fd(fd && oth) noexcept : desc(oth.desc), opened(oth.opened) { oth.opened = false; }

		~fd() {
			if(opened)
			if(this->opened)
				close(this->desc);
		}



@@ 54,6 55,50 @@ namespace vore::file {
		bool opened = false;
	};

	template <bool allow_stdio>
	class FILE {
	public:
		FILE(const char * path, const char * opts) noexcept {
			using namespace std::literals;

			if(allow_stdio && path == "-"sv) {
				if(opts[0] && opts[1] == '+') {
					errno = EINVAL;
					return;
				}
				switch(opts[0]) {
					case 'r':
						this->stream = stdin;
						return;
					case 'w':
					case 'a':
						this->stream = stdout;
						return;
					default:
						errno = EINVAL;
						return;
				}
			}

			this->stream = fopen(path, opts);
			this->opened = this->stream;
		}

		FILE(const FILE &) = delete;
		constexpr FILE(FILE && oth) noexcept : stream(oth.stream), opened(oth.opened) { oth.opened = false; }

		~FILE() {
			if(this->opened)
				fclose(this->stream);
		}

		constexpr operator ::FILE *() const noexcept { return this->stream; }

	private:
		::FILE * stream = nullptr;
		bool opened     = false;
	};


	template <class C = char>
	class mapping {


@@ 71,10 116,10 @@ namespace vore::file {
		mapping(const mapping &) = delete;
		constexpr mapping(mapping && oth) noexcept : map(oth.map), opened(oth.opened) { oth.opened = false; }

		constexpr mapping& operator=(mapping && oth) noexcept {
			this->map     = oth.map;
			this->opened  = oth.opened;
			oth.opened    = false;
		constexpr mapping & operator=(mapping && oth) noexcept {
			this->map    = oth.map;
			this->opened = oth.opened;
			oth.opened   = false;
			return *this;
		}


M include/vore-print => include/vore-print +10 -5
@@ 9,6 9,15 @@


namespace vore {
	int flush_stdout(const char * self) {
		if(std::fflush(stdout)) {
			std::fprintf(stderr, "%s: %s\n", self, std::strerror(errno));
			return 1;
		} else
			return 0;

	}

	template <class I>
	int print_spaced(const char * self, I begin, I end, bool newline = true) {
		bool first = true;


@@ 29,11 38,7 @@ namespace vore {
		if(newline)
			std::fputc('\n', stdout);

		if(std::fflush(stdout)) {
			std::fprintf(stderr, "%s: %s\n", self, std::strerror(errno));
			return 1;
		} else
			return 0;
		return flush_stdout(self);
	}

	template <class C>

A include/vore-token => include/vore-token +47 -0
@@ 0,0 1,47 @@
// SPDX-License-Identifier: 0BSD


#pragma once

#include <cstdint>
#include <cstring>
#include <string>


namespace vore {
	struct tokenise_iter {
		const char * delim;
		char * saveptr = nullptr;
		char * token   = nullptr;


		tokenise_iter & operator++() noexcept {
			this->token = strsep(&saveptr, delim);
			return *this;
		}

		tokenise_iter operator++(int) noexcept {
			const auto ret = *this;
			++(*this);
			return ret;
		}

		constexpr bool operator==(const tokenise_iter & rhs) const noexcept { return this->token == rhs.token; }
		constexpr bool operator!=(const tokenise_iter & rhs) const noexcept { return !(*this == rhs); }

		constexpr char * operator*() const noexcept { return this->token; }
	};


	struct tokenise {
		using iterator = tokenise_iter;


		std::string str;
		const char * delim;


		iterator begin() noexcept { return ++iterator{this->delim, this->str.data()}; }
		constexpr iterator end() const noexcept { return {}; }
	};
}

A man/expand.1 => man/expand.1 +75 -0
@@ 0,0 1,75 @@
.\" SPDX-License-Identifier: 0BSD
.\"
.Dd
.Dt EXPAND 1
.Os
.
.Sh NAME
.Nm expand
.Nd tabulate files
.Sh SYNOPSIS
.Nm
.Op Fl i
.Op Fl t Ar width
.Oo Ar file Oc Ns …
.Nm
.Op Fl i
.Op Fl t Ar stop , Ns Ar stop Ns Oo , Ns Ar stop Oc Ns …
.Oo Ar file Oc Ns …
.
.Sh DESCRIPTION
Expands tab characters from
.Ar file Ns s Pq or the standard input stream ,
writing the result to the standard output stream.
.Pp
Each character except for the tab is copied verbatim; each copied character has a width of 1 column,
except for the backspace, which has a width of -1 column.
When a tab is encountered, it's replaced by blanks equal in number to the distance to the next stop;
if it's beyond the final defined stop, it's replaced by a single blank.
.
.Sh OPTIONS
.Bl -tag -compact -width "-t, --tabs=stop,stop[,stop]…"
.It Fl t , -tabs Ns = Ns Ar width
Lay out stops at columns equal to integer multiples of
.Ar width Pq default Sy 8 .
.
.It Fl t , -tabs Ns = Ns Ar stop , Ns Ar stop Ns Oo , Ns Ar stop Oc Ns …
Set stops at the specified columns.
.No Each Ar stop No must be further than the last .
.Ar stop Ns s can be separated by the comma and space characters.
.
.It Fl i , -initial
Only expand tabs if they were preceded by just blanks and other tabs.
.El
.
.Sh EXAMPLES
Align tab-separated data:
.Bd -literal -compact -offset 4n
.No $ Nm printf No '147.312$\et12$\et12\et2.3%%\en11 520$\et320$\et30\et20%%\en' | Nm expand
147.312$        12$     12      2.3%
11 520$ 320$    30      20%

.No $ Nm printf No '147.312$\et12$\et12\et2.3%%\en11 520$\et320$\et30\et20%%\en' | Nm expand Fl t Ar 12
147.312$    12$         12          2.3%
11 520$     320$        30          20%
.Ed
.
.Pp
Tabulate a simple form:
.Bd -literal -compact -offset 4n
.No $ {
.No > "  " Nm echo No Groceries for February :
.No > "  " Nm printf No '\etBananas\et3.5kg\et$4.51\en'
.No > "  " Nm printf No '\etKiwis\et2kg\et$3.19\etCall Siegfried to explain short!\en'
.No > "  " Nm printf No '\etBread\et\et$20.21\en'
.No > } | Nm expand Fl t Ar 4 , Ns Ar 15 , Ns Ar 25 , Ns Ar 35
Groceries for February:
    Bananas    3.5kg     $4.51
    Kiwis      2kg       $3.19     Call Siegfried to explain short!
    Bread                $20.21
.Ed
.
.Sh STANDARDS
.No Compatible with Bx 1 .
.Pp
.Fl i No is an extension, also present on the GNU system .

M man/true.1 => man/true.1 +2 -1
@@ 5,7 5,8 @@
.Os
.
.Sh NAME
.Nm true
.Nm true ,
.Nm false
.Nd do nothing
.Sh SYNOPSIS
.Nm true

M man/uname.1 => man/uname.1 +2 -1
@@ 5,7 5,8 @@
.Os
.
.Sh NAME
.Nm uname
.Nm uname ,
.Nm arch
.Nd print system information
.Sh SYNOPSIS
.Nm uname

A tests/expand/data/expand.1-1 => tests/expand/data/expand.1-1 +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1    => tests/expand/data/expand.1-1.d/expand.1-1    +2 -0
@@ 0,0 1,2 @@
147.312$        12$     12      2.3%
11 520$ 320$    30      20%

A tests/expand/data/expand.1-1.d/expand.1-1 -i => tests/expand/data/expand.1-1.d/expand.1-1 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2    => tests/expand/data/expand.1-1.d/expand.1-1 -t2    +2 -0
@@ 0,0 1,2 @@
147.312$  12$ 12  2.3%
11 520$ 320$  30  20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$ 12 2.3%
11 520$                   320$ 30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$        12             2.3%
11 520$                   320$       30             20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$        12             2.3%
11 520$                   320$       30             20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,37,52,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                         12 2.3%
11 520$                   320$                        30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                         12            2.3%
11 520$                   320$                        30            20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,54,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                          12           2.3%
11 520$                   320$                         30           20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,26,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52    +2 -0
@@ 0,0 1,2 @@
147.312$                             12$            12 2.3%
11 520$                              320$           30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                             12$            12 2.3%
11 520$                              320$           30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,37,52,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,54    +2 -0
@@ 0,0 1,2 @@
147.312$                                              12$ 12 2.3%
11 520$                                               320$ 30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,54 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,54,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                                              12$           12        2.3%
11 520$                                               320$          30        20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,54,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,54,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t2,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                                               12$          12        2.3%
11 520$                                                320$         30        20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t2,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t2,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4    => tests/expand/data/expand.1-1.d/expand.1-1 -t4    +2 -0
@@ 0,0 1,2 @@
147.312$    12$ 12  2.3%
11 520$ 320$    30  20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$ 12 2.3%
11 520$                   320$ 30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$        12             2.3%
11 520$                   320$       30             20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$        12             2.3%
11 520$                   320$       30             20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,37,52,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                         12 2.3%
11 520$                   320$                        30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                         12            2.3%
11 520$                   320$                        30            20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,54,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                          12           2.3%
11 520$                   320$                         30           20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,26,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52    +2 -0
@@ 0,0 1,2 @@
147.312$                             12$            12 2.3%
11 520$                              320$           30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                             12$            12 2.3%
11 520$                              320$           30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,37,52,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,54    +2 -0
@@ 0,0 1,2 @@
147.312$                                              12$ 12 2.3%
11 520$                                               320$ 30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,54 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,54,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                                              12$           12        2.3%
11 520$                                               320$          30        20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,54,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,54,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t4,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                                               12$          12        2.3%
11 520$                                                320$         30        20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t4,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t4,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7    => tests/expand/data/expand.1-1.d/expand.1-1 -t7    +2 -0
@@ 0,0 1,2 @@
147.312$      12$    12     2.3%
11 520$       320$   30     20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$ 12 2.3%
11 520$                   320$ 30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$        12             2.3%
11 520$                   320$       30             20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$        12             2.3%
11 520$                   320$       30             20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,37,52,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                         12 2.3%
11 520$                   320$                        30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                         12            2.3%
11 520$                   320$                        30            20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,54,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                  12$                          12           2.3%
11 520$                   320$                         30           20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,26,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52    +2 -0
@@ 0,0 1,2 @@
147.312$                             12$            12 2.3%
11 520$                              320$           30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                             12$            12 2.3%
11 520$                              320$           30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,37,52,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,54    +2 -0
@@ 0,0 1,2 @@
147.312$                                              12$ 12 2.3%
11 520$                                               320$ 30 20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,54 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,54,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                                              12$           12        2.3%
11 520$                                               320$          30        20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,54,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,54,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,55,68,78    => tests/expand/data/expand.1-1.d/expand.1-1 -t7,55,68,78    +2 -0
@@ 0,0 1,2 @@
147.312$                                               12$          12        2.3%
11 520$                                                320$         30        20%

A tests/expand/data/expand.1-1.d/expand.1-1 -t7,55,68,78 -i => tests/expand/data/expand.1-1.d/expand.1-1 -t7,55,68,78 -i +2 -0
@@ 0,0 1,2 @@
147.312$	12$	12	2.3%
11 520$	320$	30	20%

A tests/expand/data/expand.1-2 => tests/expand/data/expand.1-2 +4 -0
@@ 0,0 1,4 @@
Groceries for February:
	Bananas	3.5kg	$4.51
	Kiwis	2kg	$3.19	Call Siegfried to explain short!
	Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2    => tests/expand/data/expand.1-2.d/expand.1-2    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
        Bananas 3.5kg   $4.51
        Kiwis   2kg     $3.19   Call Siegfried to explain short!
        Bread           $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -i => tests/expand/data/expand.1-2.d/expand.1-2 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
        Bananas	3.5kg	$4.51
        Kiwis	2kg	$3.19	Call Siegfried to explain short!
        Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2    => tests/expand/data/expand.1-2.d/expand.1-2 -t2    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas 3.5kg $4.51
  Kiwis 2kg $3.19 Call Siegfried to explain short!
  Bread   $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                 3.5kg $4.51
  Kiwis                   2kg $3.19 Call Siegfried to explain short!
  Bread                    $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                 3.5kg      $4.51
  Kiwis                   2kg        $3.19          Call Siegfried to explain short!
  Bread                              $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                 3.5kg      $4.51
  Kiwis                   2kg        $3.19          Call Siegfried to explain short!
  Bread                              $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,37,52,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                 3.5kg                       $4.51
  Kiwis                   2kg                         $3.19 Call Siegfried to explain short!
  Bread                                               $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                 3.5kg                       $4.51
  Kiwis                   2kg                         $3.19         Call Siegfried to explain short!
  Bread                                               $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,54,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                 3.5kg                        $4.51
  Kiwis                   2kg                          $3.19        Call Siegfried to explain short!
  Bread                                                $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,26,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                            3.5kg          $4.51
  Kiwis                              2kg            $3.19 Call Siegfried to explain short!
  Bread                                             $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                            3.5kg          $4.51
  Kiwis                              2kg            $3.19           Call Siegfried to explain short!
  Bread                                             $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,37,52,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,54    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                                             3.5kg $4.51
  Kiwis                                               2kg $3.19 Call Siegfried to explain short!
  Bread                                                $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,54 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,54,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                                             3.5kg         $4.51
  Kiwis                                               2kg           $3.19     Call Siegfried to explain short!
  Bread                                                $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,54,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,54,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t2,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas                                              3.5kg        $4.51
  Kiwis                                                2kg          $3.19     Call Siegfried to explain short!
  Bread                                                             $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t2,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t2,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
  Bananas	3.5kg	$4.51
  Kiwis	2kg	$3.19	Call Siegfried to explain short!
  Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4    => tests/expand/data/expand.1-2.d/expand.1-2 -t4    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas 3.5kg   $4.51
    Kiwis   2kg $3.19   Call Siegfried to explain short!
    Bread       $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas               3.5kg $4.51
    Kiwis                 2kg $3.19 Call Siegfried to explain short!
    Bread                  $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas               3.5kg      $4.51
    Kiwis                 2kg        $3.19          Call Siegfried to explain short!
    Bread                            $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas               3.5kg      $4.51
    Kiwis                 2kg        $3.19          Call Siegfried to explain short!
    Bread                            $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,37,52,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas               3.5kg                       $4.51
    Kiwis                 2kg                         $3.19 Call Siegfried to explain short!
    Bread                                             $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas               3.5kg                       $4.51
    Kiwis                 2kg                         $3.19         Call Siegfried to explain short!
    Bread                                             $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,54,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas               3.5kg                        $4.51
    Kiwis                 2kg                          $3.19        Call Siegfried to explain short!
    Bread                                              $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,26,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas                          3.5kg          $4.51
    Kiwis                            2kg            $3.19 Call Siegfried to explain short!
    Bread                                           $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas                          3.5kg          $4.51
    Kiwis                            2kg            $3.19           Call Siegfried to explain short!
    Bread                                           $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,37,52,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,54    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas                                           3.5kg $4.51
    Kiwis                                             2kg $3.19 Call Siegfried to explain short!
    Bread                                              $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,54 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,54,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas                                           3.5kg         $4.51
    Kiwis                                             2kg           $3.19     Call Siegfried to explain short!
    Bread                                              $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,54,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,54,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t4,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas                                            3.5kg        $4.51
    Kiwis                                              2kg          $3.19     Call Siegfried to explain short!
    Bread                                                           $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t4,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t4,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
    Bananas	3.5kg	$4.51
    Kiwis	2kg	$3.19	Call Siegfried to explain short!
    Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7    => tests/expand/data/expand.1-2.d/expand.1-2 -t7    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas       3.5kg  $4.51
       Kiwis  2kg    $3.19  Call Siegfried to explain short!
       Bread         $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas            3.5kg $4.51
       Kiwis              2kg $3.19 Call Siegfried to explain short!
       Bread               $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas            3.5kg      $4.51
       Kiwis              2kg        $3.19          Call Siegfried to explain short!
       Bread                         $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas            3.5kg      $4.51
       Kiwis              2kg        $3.19          Call Siegfried to explain short!
       Bread                         $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,37,52,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas            3.5kg                       $4.51
       Kiwis              2kg                         $3.19 Call Siegfried to explain short!
       Bread                                          $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas            3.5kg                       $4.51
       Kiwis              2kg                         $3.19         Call Siegfried to explain short!
       Bread                                          $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,54,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas            3.5kg                        $4.51
       Kiwis              2kg                          $3.19        Call Siegfried to explain short!
       Bread                                           $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,26,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas                       3.5kg          $4.51
       Kiwis                         2kg            $3.19 Call Siegfried to explain short!
       Bread                                        $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas                       3.5kg          $4.51
       Kiwis                         2kg            $3.19           Call Siegfried to explain short!
       Bread                                        $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,37,52,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,54    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas                                        3.5kg $4.51
       Kiwis                                          2kg $3.19 Call Siegfried to explain short!
       Bread                                           $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,54 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,54,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas                                        3.5kg         $4.51
       Kiwis                                          2kg           $3.19     Call Siegfried to explain short!
       Bread                                           $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,54,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,54,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,55,68,78    => tests/expand/data/expand.1-2.d/expand.1-2 -t7,55,68,78    +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas                                         3.5kg        $4.51
       Kiwis                                           2kg          $3.19     Call Siegfried to explain short!
       Bread                                                        $20.21

A tests/expand/data/expand.1-2.d/expand.1-2 -t7,55,68,78 -i => tests/expand/data/expand.1-2.d/expand.1-2 -t7,55,68,78 -i +4 -0
@@ 0,0 1,4 @@
Groceries for February:
       Bananas	3.5kg	$4.51
       Kiwis	2kg	$3.19	Call Siegfried to explain short!
       Bread		$20.21

A tests/expand/data/xaa => tests/expand/data/xaa +0 -0
A tests/expand/data/xaa.d/xaa    => tests/expand/data/xaa.d/xaa    +0 -0
A tests/expand/data/xaa.d/xaa -i => tests/expand/data/xaa.d/xaa -i +0 -0
A tests/expand/data/xaa.d/xaa -t2    => tests/expand/data/xaa.d/xaa -t2    +0 -0
A tests/expand/data/xaa.d/xaa -t2 -i => tests/expand/data/xaa.d/xaa -t2 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,26    => tests/expand/data/xaa.d/xaa -t2,26    +0 -0
A tests/expand/data/xaa.d/xaa -t2,26 -i => tests/expand/data/xaa.d/xaa -t2,26 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,37,52    => tests/expand/data/xaa.d/xaa -t2,26,37,52    +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,37,52 -i => tests/expand/data/xaa.d/xaa -t2,26,37,52 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,37,52,55,68,78    => tests/expand/data/xaa.d/xaa -t2,26,37,52,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,37,52,55,68,78 -i => tests/expand/data/xaa.d/xaa -t2,26,37,52,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,54    => tests/expand/data/xaa.d/xaa -t2,26,54    +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,54 -i => tests/expand/data/xaa.d/xaa -t2,26,54 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,54,55,68,78    => tests/expand/data/xaa.d/xaa -t2,26,54,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,54,55,68,78 -i => tests/expand/data/xaa.d/xaa -t2,26,54,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,55,68,78    => tests/expand/data/xaa.d/xaa -t2,26,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t2,26,55,68,78 -i => tests/expand/data/xaa.d/xaa -t2,26,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,37,52    => tests/expand/data/xaa.d/xaa -t2,37,52    +0 -0
A tests/expand/data/xaa.d/xaa -t2,37,52 -i => tests/expand/data/xaa.d/xaa -t2,37,52 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,37,52,55,68,78    => tests/expand/data/xaa.d/xaa -t2,37,52,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t2,37,52,55,68,78 -i => tests/expand/data/xaa.d/xaa -t2,37,52,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,54    => tests/expand/data/xaa.d/xaa -t2,54    +0 -0
A tests/expand/data/xaa.d/xaa -t2,54 -i => tests/expand/data/xaa.d/xaa -t2,54 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,54,55,68,78    => tests/expand/data/xaa.d/xaa -t2,54,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t2,54,55,68,78 -i => tests/expand/data/xaa.d/xaa -t2,54,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t2,55,68,78    => tests/expand/data/xaa.d/xaa -t2,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t2,55,68,78 -i => tests/expand/data/xaa.d/xaa -t2,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4    => tests/expand/data/xaa.d/xaa -t4    +0 -0
A tests/expand/data/xaa.d/xaa -t4 -i => tests/expand/data/xaa.d/xaa -t4 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,26    => tests/expand/data/xaa.d/xaa -t4,26    +0 -0
A tests/expand/data/xaa.d/xaa -t4,26 -i => tests/expand/data/xaa.d/xaa -t4,26 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,37,52    => tests/expand/data/xaa.d/xaa -t4,26,37,52    +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,37,52 -i => tests/expand/data/xaa.d/xaa -t4,26,37,52 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,37,52,55,68,78    => tests/expand/data/xaa.d/xaa -t4,26,37,52,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,37,52,55,68,78 -i => tests/expand/data/xaa.d/xaa -t4,26,37,52,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,54    => tests/expand/data/xaa.d/xaa -t4,26,54    +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,54 -i => tests/expand/data/xaa.d/xaa -t4,26,54 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,54,55,68,78    => tests/expand/data/xaa.d/xaa -t4,26,54,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,54,55,68,78 -i => tests/expand/data/xaa.d/xaa -t4,26,54,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,55,68,78    => tests/expand/data/xaa.d/xaa -t4,26,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t4,26,55,68,78 -i => tests/expand/data/xaa.d/xaa -t4,26,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,37,52    => tests/expand/data/xaa.d/xaa -t4,37,52    +0 -0
A tests/expand/data/xaa.d/xaa -t4,37,52 -i => tests/expand/data/xaa.d/xaa -t4,37,52 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,37,52,55,68,78    => tests/expand/data/xaa.d/xaa -t4,37,52,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t4,37,52,55,68,78 -i => tests/expand/data/xaa.d/xaa -t4,37,52,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,54    => tests/expand/data/xaa.d/xaa -t4,54    +0 -0
A tests/expand/data/xaa.d/xaa -t4,54 -i => tests/expand/data/xaa.d/xaa -t4,54 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,54,55,68,78    => tests/expand/data/xaa.d/xaa -t4,54,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t4,54,55,68,78 -i => tests/expand/data/xaa.d/xaa -t4,54,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t4,55,68,78    => tests/expand/data/xaa.d/xaa -t4,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t4,55,68,78 -i => tests/expand/data/xaa.d/xaa -t4,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7    => tests/expand/data/xaa.d/xaa -t7    +0 -0
A tests/expand/data/xaa.d/xaa -t7 -i => tests/expand/data/xaa.d/xaa -t7 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,26    => tests/expand/data/xaa.d/xaa -t7,26    +0 -0
A tests/expand/data/xaa.d/xaa -t7,26 -i => tests/expand/data/xaa.d/xaa -t7,26 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,37,52    => tests/expand/data/xaa.d/xaa -t7,26,37,52    +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,37,52 -i => tests/expand/data/xaa.d/xaa -t7,26,37,52 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,37,52,55,68,78    => tests/expand/data/xaa.d/xaa -t7,26,37,52,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,37,52,55,68,78 -i => tests/expand/data/xaa.d/xaa -t7,26,37,52,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,54    => tests/expand/data/xaa.d/xaa -t7,26,54    +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,54 -i => tests/expand/data/xaa.d/xaa -t7,26,54 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,54,55,68,78    => tests/expand/data/xaa.d/xaa -t7,26,54,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,54,55,68,78 -i => tests/expand/data/xaa.d/xaa -t7,26,54,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,55,68,78    => tests/expand/data/xaa.d/xaa -t7,26,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t7,26,55,68,78 -i => tests/expand/data/xaa.d/xaa -t7,26,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,37,52    => tests/expand/data/xaa.d/xaa -t7,37,52    +0 -0
A tests/expand/data/xaa.d/xaa -t7,37,52 -i => tests/expand/data/xaa.d/xaa -t7,37,52 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,37,52,55,68,78    => tests/expand/data/xaa.d/xaa -t7,37,52,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t7,37,52,55,68,78 -i => tests/expand/data/xaa.d/xaa -t7,37,52,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,54    => tests/expand/data/xaa.d/xaa -t7,54    +0 -0
A tests/expand/data/xaa.d/xaa -t7,54 -i => tests/expand/data/xaa.d/xaa -t7,54 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,54,55,68,78    => tests/expand/data/xaa.d/xaa -t7,54,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t7,54,55,68,78 -i => tests/expand/data/xaa.d/xaa -t7,54,55,68,78 -i +0 -0
A tests/expand/data/xaa.d/xaa -t7,55,68,78    => tests/expand/data/xaa.d/xaa -t7,55,68,78    +0 -0
A tests/expand/data/xaa.d/xaa -t7,55,68,78 -i => tests/expand/data/xaa.d/xaa -t7,55,68,78 -i +0 -0
A tests/expand/data/xab => tests/expand/data/xab +0 -0
A tests/expand/data/xab.d/xab    => tests/expand/data/xab.d/xab    +0 -0
A tests/expand/data/xab.d/xab -i => tests/expand/data/xab.d/xab -i +0 -0
A tests/expand/data/xab.d/xab -t2    => tests/expand/data/xab.d/xab -t2    +0 -0
A tests/expand/data/xab.d/xab -t2 -i => tests/expand/data/xab.d/xab -t2 -i +0 -0
A tests/expand/data/xab.d/xab -t2,26    => tests/expand/data/xab.d/xab -t2,26    +0 -0
A tests/expand/data/xab.d/xab -t2,26 -i => tests/expand/data/xab.d/xab -t2,26 -i +0 -0
A tests/expand/data/xab.d/xab -t2,26,37,52    => tests/expand/data/xab.d/xab -t2,26,37,52    +0 -0
A tests/expand/data/xab.d/xab -t2,26,37,52 -i => tests/expand/data/xab.d/xab -t2,26,37,52 -i +0 -0
A tests/expand/data/xab.d/xab -t2,26,37,52,55,68,78    => tests/expand/data/xab.d/xab -t2,26,37,52,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t2,26,37,52,55,68,78 -i => tests/expand/data/xab.d/xab -t2,26,37,52,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t2,26,54    => tests/expand/data/xab.d/xab -t2,26,54    +0 -0
A tests/expand/data/xab.d/xab -t2,26,54 -i => tests/expand/data/xab.d/xab -t2,26,54 -i +0 -0
A tests/expand/data/xab.d/xab -t2,26,54,55,68,78    => tests/expand/data/xab.d/xab -t2,26,54,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t2,26,54,55,68,78 -i => tests/expand/data/xab.d/xab -t2,26,54,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t2,26,55,68,78    => tests/expand/data/xab.d/xab -t2,26,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t2,26,55,68,78 -i => tests/expand/data/xab.d/xab -t2,26,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t2,37,52    => tests/expand/data/xab.d/xab -t2,37,52    +0 -0
A tests/expand/data/xab.d/xab -t2,37,52 -i => tests/expand/data/xab.d/xab -t2,37,52 -i +0 -0
A tests/expand/data/xab.d/xab -t2,37,52,55,68,78    => tests/expand/data/xab.d/xab -t2,37,52,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t2,37,52,55,68,78 -i => tests/expand/data/xab.d/xab -t2,37,52,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t2,54    => tests/expand/data/xab.d/xab -t2,54    +0 -0
A tests/expand/data/xab.d/xab -t2,54 -i => tests/expand/data/xab.d/xab -t2,54 -i +0 -0
A tests/expand/data/xab.d/xab -t2,54,55,68,78    => tests/expand/data/xab.d/xab -t2,54,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t2,54,55,68,78 -i => tests/expand/data/xab.d/xab -t2,54,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t2,55,68,78    => tests/expand/data/xab.d/xab -t2,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t2,55,68,78 -i => tests/expand/data/xab.d/xab -t2,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t4    => tests/expand/data/xab.d/xab -t4    +0 -0
A tests/expand/data/xab.d/xab -t4 -i => tests/expand/data/xab.d/xab -t4 -i +0 -0
A tests/expand/data/xab.d/xab -t4,26    => tests/expand/data/xab.d/xab -t4,26    +0 -0
A tests/expand/data/xab.d/xab -t4,26 -i => tests/expand/data/xab.d/xab -t4,26 -i +0 -0
A tests/expand/data/xab.d/xab -t4,26,37,52    => tests/expand/data/xab.d/xab -t4,26,37,52    +0 -0
A tests/expand/data/xab.d/xab -t4,26,37,52 -i => tests/expand/data/xab.d/xab -t4,26,37,52 -i +0 -0
A tests/expand/data/xab.d/xab -t4,26,37,52,55,68,78    => tests/expand/data/xab.d/xab -t4,26,37,52,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t4,26,37,52,55,68,78 -i => tests/expand/data/xab.d/xab -t4,26,37,52,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t4,26,54    => tests/expand/data/xab.d/xab -t4,26,54    +0 -0
A tests/expand/data/xab.d/xab -t4,26,54 -i => tests/expand/data/xab.d/xab -t4,26,54 -i +0 -0
A tests/expand/data/xab.d/xab -t4,26,54,55,68,78    => tests/expand/data/xab.d/xab -t4,26,54,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t4,26,54,55,68,78 -i => tests/expand/data/xab.d/xab -t4,26,54,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t4,26,55,68,78    => tests/expand/data/xab.d/xab -t4,26,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t4,26,55,68,78 -i => tests/expand/data/xab.d/xab -t4,26,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t4,37,52    => tests/expand/data/xab.d/xab -t4,37,52    +0 -0
A tests/expand/data/xab.d/xab -t4,37,52 -i => tests/expand/data/xab.d/xab -t4,37,52 -i +0 -0
A tests/expand/data/xab.d/xab -t4,37,52,55,68,78    => tests/expand/data/xab.d/xab -t4,37,52,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t4,37,52,55,68,78 -i => tests/expand/data/xab.d/xab -t4,37,52,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t4,54    => tests/expand/data/xab.d/xab -t4,54    +0 -0
A tests/expand/data/xab.d/xab -t4,54 -i => tests/expand/data/xab.d/xab -t4,54 -i +0 -0
A tests/expand/data/xab.d/xab -t4,54,55,68,78    => tests/expand/data/xab.d/xab -t4,54,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t4,54,55,68,78 -i => tests/expand/data/xab.d/xab -t4,54,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t4,55,68,78    => tests/expand/data/xab.d/xab -t4,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t4,55,68,78 -i => tests/expand/data/xab.d/xab -t4,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t7    => tests/expand/data/xab.d/xab -t7    +0 -0
A tests/expand/data/xab.d/xab -t7 -i => tests/expand/data/xab.d/xab -t7 -i +0 -0
A tests/expand/data/xab.d/xab -t7,26    => tests/expand/data/xab.d/xab -t7,26    +0 -0
A tests/expand/data/xab.d/xab -t7,26 -i => tests/expand/data/xab.d/xab -t7,26 -i +0 -0
A tests/expand/data/xab.d/xab -t7,26,37,52    => tests/expand/data/xab.d/xab -t7,26,37,52    +0 -0
A tests/expand/data/xab.d/xab -t7,26,37,52 -i => tests/expand/data/xab.d/xab -t7,26,37,52 -i +0 -0
A tests/expand/data/xab.d/xab -t7,26,37,52,55,68,78    => tests/expand/data/xab.d/xab -t7,26,37,52,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t7,26,37,52,55,68,78 -i => tests/expand/data/xab.d/xab -t7,26,37,52,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t7,26,54    => tests/expand/data/xab.d/xab -t7,26,54    +0 -0
A tests/expand/data/xab.d/xab -t7,26,54 -i => tests/expand/data/xab.d/xab -t7,26,54 -i +0 -0
A tests/expand/data/xab.d/xab -t7,26,54,55,68,78    => tests/expand/data/xab.d/xab -t7,26,54,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t7,26,54,55,68,78 -i => tests/expand/data/xab.d/xab -t7,26,54,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t7,26,55,68,78    => tests/expand/data/xab.d/xab -t7,26,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t7,26,55,68,78 -i => tests/expand/data/xab.d/xab -t7,26,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t7,37,52    => tests/expand/data/xab.d/xab -t7,37,52    +0 -0
A tests/expand/data/xab.d/xab -t7,37,52 -i => tests/expand/data/xab.d/xab -t7,37,52 -i +0 -0
A tests/expand/data/xab.d/xab -t7,37,52,55,68,78    => tests/expand/data/xab.d/xab -t7,37,52,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t7,37,52,55,68,78 -i => tests/expand/data/xab.d/xab -t7,37,52,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t7,54    => tests/expand/data/xab.d/xab -t7,54    +0 -0
A tests/expand/data/xab.d/xab -t7,54 -i => tests/expand/data/xab.d/xab -t7,54 -i +0 -0
A tests/expand/data/xab.d/xab -t7,54,55,68,78    => tests/expand/data/xab.d/xab -t7,54,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t7,54,55,68,78 -i => tests/expand/data/xab.d/xab -t7,54,55,68,78 -i +0 -0
A tests/expand/data/xab.d/xab -t7,55,68,78    => tests/expand/data/xab.d/xab -t7,55,68,78    +0 -0
A tests/expand/data/xab.d/xab -t7,55,68,78 -i => tests/expand/data/xab.d/xab -t7,55,68,78 -i +0 -0
A tests/expand/test => tests/expand/test +29 -0
@@ 0,0 1,29 @@
#!/bin/sh
# SPDX-License-Identifier: 0BSD

# tr -cd 'a-z \0\t\n' < /dev/urandom | dd count=2 | split -b512

IFS="
"

expand="${CMDDIR}expand"
files="$(for f in data/*; do [ -f "$f" ] && echo "${f##*/}"; done)"

cd data 2>&3 || exit
for f in $files; do
  "$expand"    "$f" | cmp - "$f.d/$f   " || echo "expand:    wrong on $f" >&3
  "$expand" -i "$f" | cmp - "$f.d/$f -i" || echo "expand: -i wrong on $f" >&3
done &
for t0 in 2 4 7; do for t1 in '' ,26; do for t2 in '' ,37,52 ,54; do for t3 in '' ,55,68,78; do
  t="-t$t0$t1$t2$t3"
  for f in $files; do
    "$expand" $t    "$f" | cmp - "$f.d/$f $t   " || echo "expand: $t    wrong on $f" >&3
    "$expand" $t -i "$f" | cmp - "$f.d/$f $t -i" || echo "expand: $t -i wrong on $f" >&3
  done &
done; done; done; done
wait

for t in 0 1.1 1,1 ''; do
  errstr="$("$expand" -t "$t" 2>&1 > /dev/null < /dev/null)" && echo "expand: -t $t ok?" >&3
  [ -n "$errstr" ] || echo "expand: stderr empty for -t $t" >&3
done

M tests/uname => tests/uname +8 -7
@@ 36,21 36,22 @@ errstr="$("${tmpdir}$altname" 2>&1 > /dev/null)"; err=$?
#   https://twitter.com/nabijaczleweli/status/1402310047783399426
#   https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=256486
if [ "$(uname)" = "FreeBSD" ]; then
	echo "uname: skipping -v, broken on system" >&2
	V=
else
	V='-v'
fi

for s in '' '-s'; do for n in '' '-n'; do for r in '' '-r'; do for v in '' $V; do for m in '' '-m'; do for p in '' '-p'; do
	uname $s $n $r $v $m $p > "${tmpdir}uname $s $n $r $v $m $p"
	"${tmpdir}uname" $s $n $r $v $m $p | cmp - "${tmpdir}uname $s $n $r $v $m $p" || echo "uname: $s $n $r $v $m $p doesn't match system" >&3
done; done; done; done; done; done

if uname --version > /dev/null 2>&1; then  # Not checking for -i since FreeBSD also uses it, but for something different
	uname -i > "${tmpdir}uname -i"
	"${tmpdir}uname" -i | cmp - "${tmpdir}uname -i" || echo "uname: -s doesn't match system" >&3
	I='-i'
else
	echo "uname: skipping -i, no system support" >&2
	I=
fi

for s in '' '-s'; do for n in '' '-n'; do for r in '' '-r'; do for v in '' $V; do for m in '' '-m'; do for p in '' '-p'; do for i in '' $I; do
	uname $s $n $r $v $m $p $i > "${tmpdir}uname $s $n $r $v $m $p $i"
	"${tmpdir}uname" $s $n $r $v $m $p $i | cmp - "${tmpdir}uname $s $n $r $v $m $p $i" || echo "uname: $s $n $r $v $m $p $i doesn't match system" >&3
done; done; done; done; done; done; done

rm -rf "$tmpdir" >&3

M tests/unlink => tests/unlink +1 -1
@@ 7,7 7,7 @@ unlink="${CMDDIR}unlink"
altname="${tmpdir%/}"
altname="${altname##*/}"

cd "$tmpdir" || exit 1
cd "$tmpdir" 2>&3 || exit

for f in 'file' './file' '--'; do
	for fp in "$f" "${tmpdir}$f"; do