summaryrefslogtreecommitdiff
path: root/tests/examplefiles
diff options
context:
space:
mode:
authorMiikka Salminen <miikka.salminen@gmail.com>2015-10-28 16:39:01 +0200
committerMiikka Salminen <miikka.salminen@gmail.com>2015-10-28 16:39:01 +0200
commitef0518913142c9c87f6fddba695e77d873211a43 (patch)
tree6e98de43c901ff6ffedcf35e7bc548cad7973020 /tests/examplefiles
parentb8f3945ff8955bc5adb77277cda3341edc58e33d (diff)
downloadpygments-ef0518913142c9c87f6fddba695e77d873211a43.tar.gz
Added support for od and xxd. Minor enhancements.
Diffstat (limited to 'tests/examplefiles')
-rw-r--r--tests/examplefiles/hexdump_debugexe309
-rw-r--r--tests/examplefiles/hexdump_hd (renamed from tests/examplefiles/hexdump_test)0
-rw-r--r--tests/examplefiles/hexdump_hexcat247
-rw-r--r--tests/examplefiles/hexdump_hexdump310
-rw-r--r--tests/examplefiles/hexdump_od310
-rw-r--r--tests/examplefiles/hexdump_xxd309
6 files changed, 1485 insertions, 0 deletions
diff --git a/tests/examplefiles/hexdump_debugexe b/tests/examplefiles/hexdump_debugexe
new file mode 100644
index 00000000..31fefdb7
--- /dev/null
+++ b/tests/examplefiles/hexdump_debugexe
@@ -0,0 +1,309 @@
+0000:0000 2F 2F 20 43 72 65 61 74-65 64 20 62 79 20 4C 69 // Created by Li
+0000:0010 6F 6E 65 6C 6C 6F 20 4C-75 6E 65 73 75 20 61 6E onello Lunesu an
+0000:0020 64 20 70 6C 61 63 65 64-20 69 6E 20 74 68 65 20 d placed in the
+0000:0030 70 75 62 6C 69 63 20 64-6F 6D 61 69 6E 2E 0A 2F public domain.◙/
+0000:0040 2F 20 54 68 69 73 20 66-69 6C 65 20 68 61 73 20 / This file has
+0000:0050 62 65 65 6E 20 6D 6F 64-69 66 69 65 64 20 66 72 been modified fr
+0000:0060 6F 6D 20 69 74 73 20 6F-72 69 67 69 6E 61 6C 20 om its original
+0000:0070 76 65 72 73 69 6F 6E 2E-0A 2F 2F 20 49 74 20 68 version.◙// It h
+0000:0080 61 73 20 62 65 65 6E 20-66 6F 72 6D 61 74 74 65 as been formatte
+0000:0090 64 20 74 6F 20 66 69 74-20 79 6F 75 72 20 73 63 d to fit your sc
+0000:00A0 72 65 65 6E 2E 0A 6D 6F-64 75 6C 65 20 70 68 6F reen.◙module pho
+0000:00B0 6E 65 6E 6F 3B 20 20 20-20 20 2F 2F 20 6F 70 74 neno; // opt
+0000:00C0 69 6F 6E 61 6C 0A 69 6D-70 6F 72 74 20 73 74 64 ional◙import std
+0000:00D0 2E 73 74 64 69 6F 3B 20-20 20 2F 2F 20 77 72 69 .stdio; // wri
+0000:00E0 74 65 66 6C 6E 20 20 20-20 20 0A 69 6D 70 6F 72 tefln ◙impor
+0000:00F0 74 20 73 74 64 2E 63 74-79 70 65 3B 20 20 20 2F t std.ctype; /
+0000:0100 2F 20 69 73 64 69 67 69-74 20 20 20 20 20 0A 69 / isdigit ◙i
+0000:0110 6D 70 6F 72 74 20 73 74-64 2E 73 74 72 65 61 6D mport std.stream
+0000:0120 3B 20 20 2F 2F 20 42 75-66 66 65 72 65 64 46 69 ; // BufferedFi
+0000:0130 6C 65 0A 0A 2F 2F 20 4A-75 73 74 20 66 6F 72 20 le◙◙// Just for
+0000:0140 72 65 61 64 61 62 69 6C-69 74 79 20 28 69 6D 61 readability (ima
+0000:0150 67 69 6E 65 20 63 68 61-72 5B 5D 5B 5D 5B 63 68 gine char[][][ch
+0000:0160 61 72 5B 5D 5D 29 20 20-20 20 0A 61 6C 69 61 73 ar[]]) ◙alias
+0000:0170 20 63 68 61 72 5B 5D 20-73 74 72 69 6E 67 3B 0A char[] string;◙
+0000:0180 61 6C 69 61 73 20 73 74-72 69 6E 67 5B 5D 20 73 alias string[] s
+0000:0190 74 72 69 6E 67 61 72 72-61 79 3B 0A 0A 2F 2F 2F tringarray;◙◙///
+0000:01A0 20 53 74 72 69 70 73 20-6E 6F 6E 2D 64 69 67 69 Strips non-digi
+0000:01B0 74 20 63 68 61 72 61 63-74 65 72 73 20 66 72 6F t characters fro
+0000:01C0 6D 20 74 68 65 20 73 74-72 69 6E 67 20 28 43 4F m the string (CO
+0000:01D0 57 29 0A 73 74 72 69 6E-67 20 73 74 72 69 70 4E W)◙string stripN
+0000:01E0 6F 6E 44 69 67 69 74 28-20 69 6E 20 73 74 72 69 onDigit( in stri
+0000:01F0 6E 67 20 6C 69 6E 65 20-29 20 0A 7B 0A 20 20 20 ng line ) ◙{◙
+0000:0200 20 73 74 72 69 6E 67 20-72 65 74 3B 0A 20 20 20 string ret;◙
+0000:0210 20 66 6F 72 65 61 63 68-28 75 69 6E 74 20 69 2C foreach(uint i,
+0000:0220 20 63 3B 20 6C 69 6E 65-29 20 7B 0A 20 20 20 20 c; line) {◙
+0000:0230 20 20 20 20 2F 2F 20 45-72 72 6F 72 3A 20 73 74 // Error: st
+0000:0240 64 2E 63 74 79 70 65 2E-69 73 64 69 67 69 74 20 d.ctype.isdigit
+0000:0250 61 74 20 43 3A 5C 64 6D-64 5C 73 72 63 5C 70 68 at C:\dmd\src\ph
+0000:0260 6F 62 6F 73 5C 73 74 64-5C 63 74 79 70 65 2E 64 obos\std\ctype.d
+0000:0270 28 33 37 29 20 0A 20 20-20 20 20 20 20 20 2F 2F (37) ◙ //
+0000:0280 20 63 6F 6E 66 6C 69 63-74 73 20 77 69 74 68 20 conflicts with
+0000:0290 73 74 64 2E 73 74 72 65-61 6D 2E 69 73 64 69 67 std.stream.isdig
+0000:02A0 69 74 20 61 74 20 43 3A-5C 64 6D 64 5C 73 72 63 it at C:\dmd\src
+0000:02B0 5C 70 68 6F 62 6F 73 5C-73 74 64 5C 73 74 72 65 \phobos\std\stre
+0000:02C0 61 6D 2E 64 28 32 39 32-34 29 0A 20 20 20 20 20 am.d(2924)◙
+0000:02D0 20 20 20 69 66 20 28 21-73 74 64 2E 63 74 79 70 if (!std.ctyp
+0000:02E0 65 2E 69 73 64 69 67 69-74 28 63 29 29 20 7B 0A e.isdigit(c)) {◙
+0000:02F0 20 20 20 20 20 20 20 20-20 20 20 20 69 66 20 28 if (
+0000:0300 21 72 65 74 29 0A 20 20-20 20 20 20 20 20 20 20 !ret)◙
+0000:0310 20 20 20 20 20 20 72 65-74 20 3D 20 6C 69 6E 65 ret = line
+0000:0320 5B 30 2E 2E 69 5D 3B 20-20 20 20 0A 20 20 20 20 [0..i]; ◙
+0000:0330 20 20 20 20 7D 20 20 20-20 0A 20 20 20 20 20 20 } ◙
+0000:0340 20 20 65 6C 73 65 20 69-66 20 28 72 65 74 29 0A else if (ret)◙
+0000:0350 20 20 20 20 20 20 20 20-20 20 20 20 72 65 74 20 ret
+0000:0360 7E 3D 20 63 3B 20 20 20-20 0A 20 20 20 20 7D 20 ~= c; ◙ }
+0000:0370 20 20 20 0A 20 20 20 20-72 65 74 75 72 6E 20 72 ◙ return r
+0000:0380 65 74 3F 72 65 74 3A 6C-69 6E 65 3B 0A 7D 0A 0A et?ret:line;◙}◙◙
+0000:0390 75 6E 69 74 74 65 73 74-20 7B 0A 20 20 20 20 61 unittest {◙ a
+0000:03A0 73 73 65 72 74 28 20 73-74 72 69 70 4E 6F 6E 44 ssert( stripNonD
+0000:03B0 69 67 69 74 28 22 61 73-64 66 22 29 20 3D 3D 20 igit("asdf") ==
+0000:03C0 22 22 20 20 29 3B 0A 20-20 20 20 61 73 73 65 72 "" );◙ asser
+0000:03D0 74 28 20 73 74 72 69 70-4E 6F 6E 44 69 67 69 74 t( stripNonDigit
+0000:03E0 28 22 5C 27 31 33 2D 3D-32 20 34 6B 6F 70 22 29 ("\'13-=2 4kop")
+0000:03F0 20 3D 3D 20 20 22 31 33-32 34 22 20 20 29 3B 0A == "1324" );◙
+0000:0400 7D 0A 0A 2F 2F 2F 20 43-6F 6E 76 65 72 74 73 20 }◙◙/// Converts
+0000:0410 61 20 77 6F 72 64 20 69-6E 74 6F 20 61 20 6E 75 a word into a nu
+0000:0420 6D 62 65 72 2C 20 69 67-6E 6F 72 69 6E 67 20 61 mber, ignoring a
+0000:0430 6C 6C 20 6E 6F 6E 20 61-6C 70 68 61 20 63 68 61 ll non alpha cha
+0000:0440 72 61 63 74 65 72 73 20-20 0A 73 74 72 69 6E 67 racters ◙string
+0000:0450 20 77 6F 72 64 54 6F 4E-75 6D 28 20 69 6E 20 73 wordToNum( in s
+0000:0460 74 72 69 6E 67 20 77 6F-72 64 20 29 0A 7B 0A 2F tring word )◙{◙/
+0000:0470 2F 20 74 72 61 6E 73 6C-61 74 69 6F 6E 20 74 61 / translation ta
+0000:0480 62 6C 65 20 66 6F 72 20-74 68 65 20 74 61 73 6B ble for the task
+0000:0490 20 61 74 20 68 61 6E 64-0A 63 6F 6E 73 74 20 63 at hand◙const c
+0000:04A0 68 61 72 5B 32 35 36 5D-20 54 52 41 4E 53 4C 41 har[256] TRANSLA
+0000:04B0 54 45 20 3D 20 20 20 20-0A 20 20 20 20 22 20 20 TE = ◙ "
+0000:04C0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:04D0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 22 20 "
+0000:04E0 20 2F 2F 20 30 20 20 20-0A 20 20 20 20 22 20 20 // 0 ◙ "
+0000:04F0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 30 31 01
+0000:0500 32 33 34 35 36 37 38 39-20 20 20 20 20 20 22 20 23456789 "
+0000:0510 20 2F 2F 20 33 32 20 20-20 20 20 0A 20 20 20 20 // 32 ◙
+0000:0520 22 20 35 37 36 33 30 34-39 39 36 31 37 38 35 31 " 57630499617851
+0000:0530 38 38 31 32 33 34 37 36-32 32 33 39 20 20 20 20 881234762239
+0000:0540 20 22 20 20 2F 2F 20 36-34 20 20 20 0A 20 20 20 " // 64 ◙
+0000:0550 20 22 20 35 37 36 33 30-34 39 39 36 31 37 38 35 " 5763049961785
+0000:0560 31 38 38 31 32 33 34 37-36 32 32 33 39 20 20 20 1881234762239
+0000:0570 20 20 22 0A 20 20 20 20-22 20 20 20 20 20 20 20 "◙ "
+0000:0580 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:0590 20 20 20 20 20 20 20 20-20 22 0A 20 20 20 20 22 "◙ "
+0000:05A0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:05B0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:05C0 22 0A 20 20 20 20 22 20-20 20 20 20 20 20 20 20 "◙ "
+0000:05D0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:05E0 20 20 20 20 20 20 20 22-20 20 20 20 0A 20 20 20 " ◙
+0000:05F0 20 22 20 20 20 20 20 20-20 20 20 20 20 20 20 20 "
+0000:0600 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:0610 20 20 22 3B 0A 20 20 20-20 73 74 72 69 6E 67 20 ";◙ string
+0000:0620 72 65 74 3B 0A 20 20 20-20 66 6F 72 65 61 63 68 ret;◙ foreach
+0000:0630 28 63 3B 20 63 61 73 74-28 75 62 79 74 65 5B 5D (c; cast(ubyte[]
+0000:0640 29 77 6F 72 64 29 0A 20-20 20 20 20 20 20 20 69 )word)◙ i
+0000:0650 66 20 28 54 52 41 4E 53-4C 41 54 45 5B 63 5D 20 f (TRANSLATE[c]
+0000:0660 21 3D 20 27 20 27 29 0A-20 20 20 20 20 20 20 20 != ' ')◙
+0000:0670 20 20 20 20 72 65 74 20-7E 3D 20 54 52 41 4E 53 ret ~= TRANS
+0000:0680 4C 41 54 45 5B 63 5D 3B-0A 20 20 20 20 72 65 74 LATE[c];◙ ret
+0000:0690 75 72 6E 20 72 65 74 3B-0A 7D 0A 0A 75 6E 69 74 urn ret;◙}◙◙unit
+0000:06A0 74 65 73 74 20 7B 0A 20-2F 2F 20 54 65 73 74 20 test {◙ // Test
+0000:06B0 77 6F 72 64 54 6F 4E 75-6D 20 75 73 69 6E 67 20 wordToNum using
+0000:06C0 74 68 65 20 74 61 62 6C-65 20 66 72 6F 6D 20 74 the table from t
+0000:06D0 68 65 20 74 61 73 6B 20-64 65 73 63 72 69 70 74 he task descript
+0000:06E0 69 6F 6E 2E 0A 20 61 73-73 65 72 74 28 20 22 30 ion.◙ assert( "0
+0000:06F0 31 31 31 32 32 32 33 33-33 34 34 35 35 36 36 36 1112223334455666
+0000:0700 37 37 37 38 38 38 39 39-39 22 20 3D 3D 0A 20 20 777888999" ==◙
+0000:0710 20 77 6F 72 64 54 6F 4E-75 6D 28 22 45 20 7C 20 wordToNum("E |
+0000:0720 4A 20 4E 20 51 20 7C 20-52 20 57 20 58 20 7C 20 J N Q | R W X |
+0000:0730 44 20 53 20 59 20 7C 20-46 20 54 20 7C 20 41 20 D S Y | F T | A
+0000:0740 4D 20 7C 20 43 20 49 20-56 20 7C 20 42 20 4B 20 M | C I V | B K
+0000:0750 55 20 7C 20 4C 20 4F 20-50 20 7C 20 47 20 48 20 U | L O P | G H
+0000:0760 5A 22 29 29 3B 0A 20 61-73 73 65 72 74 28 20 22 Z"));◙ assert( "
+0000:0770 30 31 31 31 32 32 32 33-33 33 34 34 35 35 36 36 0111222333445566
+0000:0780 36 37 37 37 38 38 38 39-39 39 22 20 3D 3D 20 0A 6777888999" == ◙
+0000:0790 20 20 20 77 6F 72 64 54-6F 4E 75 6D 28 22 65 20 wordToNum("e
+0000:07A0 7C 20 6A 20 6E 20 71 20-7C 20 72 20 77 20 78 20 | j n q | r w x
+0000:07B0 7C 20 64 20 73 20 79 20-7C 20 66 20 74 20 7C 20 | d s y | f t |
+0000:07C0 61 20 6D 20 7C 20 63 20-69 20 76 20 7C 20 62 20 a m | c i v | b
+0000:07D0 6B 20 75 20 7C 20 6C 20-6F 20 70 20 7C 20 67 20 k u | l o p | g
+0000:07E0 68 20 7A 22 29 29 3B 0A-20 61 73 73 65 72 74 28 h z"));◙ assert(
+0000:07F0 20 22 30 31 32 33 34 35-36 37 38 39 22 20 3D 3D "0123456789" ==
+0000:0800 20 0A 20 20 20 77 6F 72-64 54 6F 4E 75 6D 28 22 ◙ wordToNum("
+0000:0810 30 20 7C 20 20 20 31 20-20 20 7C 20 20 20 32 20 0 | 1 | 2
+0000:0820 20 20 7C 20 20 20 33 20-20 20 7C 20 20 34 20 20 | 3 | 4
+0000:0830 7C 20 20 35 20 20 7C 20-20 20 36 20 20 20 7C 20 | 5 | 6 |
+0000:0840 20 20 37 20 20 20 7C 20-20 20 38 20 20 20 7C 20 7 | 8 |
+0000:0850 20 20 39 22 29 29 3B 0A-7D 0A 0A 76 6F 69 64 20 9"));◙}◙◙void
+0000:0860 6D 61 69 6E 28 20 73 74-72 69 6E 67 5B 5D 20 61 main( string[] a
+0000:0870 72 67 73 20 29 0A 7B 0A-20 20 20 20 2F 2F 20 54 rgs )◙{◙ // T
+0000:0880 68 69 73 20 61 73 73 6F-63 69 61 74 69 76 65 20 his associative
+0000:0890 61 72 72 61 79 20 6D 61-70 73 20 61 20 6E 75 6D array maps a num
+0000:08A0 62 65 72 20 74 6F 20 61-6E 20 61 72 72 61 79 20 ber to an array
+0000:08B0 6F 66 20 77 6F 72 64 73-2E 20 20 20 20 0A 20 20 of words. ◙
+0000:08C0 20 20 73 74 72 69 6E 67-61 72 72 61 79 5B 73 74 stringarray[st
+0000:08D0 72 69 6E 67 5D 20 20 20-20 6E 75 6D 32 77 6F 72 ring] num2wor
+0000:08E0 64 73 3B 0A 0A 20 20 20-20 66 6F 72 65 61 63 68 ds;◙◙ foreach
+0000:08F0 28 73 74 72 69 6E 67 20-77 6F 72 64 3B 20 6E 65 (string word; ne
+0000:0900 77 20 42 75 66 66 65 72-65 64 46 69 6C 65 28 22 w BufferedFile("
+0000:0910 64 69 63 74 69 6F 6E 61-72 79 2E 74 78 74 22 20 dictionary.txt"
+0000:0920 29 20 29 0A 20 20 20 20-20 20 20 20 6E 75 6D 32 ) )◙ num2
+0000:0930 77 6F 72 64 73 5B 20 77-6F 72 64 54 6F 4E 75 6D words[ wordToNum
+0000:0940 28 77 6F 72 64 29 20 5D-20 7E 3D 20 77 6F 72 64 (word) ] ~= word
+0000:0950 2E 64 75 70 3B 20 20 20-20 20 20 20 20 2F 2F 20 .dup; //
+0000:0960 6D 75 73 74 20 64 75 70-0A 0A 20 20 20 20 2F 2F must dup◙◙ //
+0000:0970 2F 20 46 69 6E 64 73 20-61 6C 6C 20 61 6C 74 65 / Finds all alte
+0000:0980 72 6E 61 74 69 76 65 73-20 66 6F 72 20 74 68 65 rnatives for the
+0000:0990 20 67 69 76 65 6E 20 6E-75 6D 62 65 72 0A 20 20 given number◙
+0000:09A0 20 20 2F 2F 2F 20 28 73-68 6F 75 6C 64 20 68 61 /// (should ha
+0000:09B0 76 65 20 62 65 65 6E 20-73 74 72 69 70 70 65 64 ve been stripped
+0000:09C0 20 66 72 6F 6D 20 6E 6F-6E 2D 64 69 67 69 74 20 from non-digit
+0000:09D0 63 68 61 72 61 63 74 65-72 73 29 0A 20 20 20 20 characters)◙
+0000:09E0 73 74 72 69 6E 67 61 72-72 61 79 20 5F 46 69 6E stringarray _Fin
+0000:09F0 64 57 6F 72 64 73 28 20-73 74 72 69 6E 67 20 6E dWords( string n
+0000:0A00 75 6D 62 65 72 73 2C 20-62 6F 6F 6C 20 64 69 67 umbers, bool dig
+0000:0A10 69 74 6F 6B 20 29 0A 20-20 20 20 69 6E 20 7B 0A itok )◙ in {◙
+0000:0A20 20 20 20 20 20 20 20 20-61 73 73 65 72 74 28 6E assert(n
+0000:0A30 75 6D 62 65 72 73 2E 6C-65 6E 67 74 68 20 3E 20 umbers.length >
+0000:0A40 20 30 29 3B 20 20 20 20-0A 20 20 20 20 7D 20 20 0); ◙ }
+0000:0A50 20 20 0A 20 20 20 20 6F-75 74 28 72 65 73 75 6C ◙ out(resul
+0000:0A60 74 29 20 7B 0A 20 20 20-20 20 20 20 20 66 6F 72 t) {◙ for
+0000:0A70 65 61 63 68 20 28 61 3B-20 72 65 73 75 6C 74 29 each (a; result)
+0000:0A80 0A 20 20 20 20 20 20 20-20 20 20 20 20 61 73 73 ◙ ass
+0000:0A90 65 72 74 28 20 77 6F 72-64 54 6F 4E 75 6D 28 61 ert( wordToNum(a
+0000:0AA0 29 20 3D 3D 20 6E 75 6D-62 65 72 73 20 29 3B 0A ) == numbers );◙
+0000:0AB0 20 20 20 20 7D 20 20 20-20 0A 20 20 20 20 62 6F } ◙ bo
+0000:0AC0 64 79 20 7B 0A 20 20 20-20 20 20 20 20 73 74 72 dy {◙ str
+0000:0AD0 69 6E 67 61 72 72 61 79-20 72 65 74 3B 0A 20 20 ingarray ret;◙
+0000:0AE0 20 20 20 20 20 20 62 6F-6F 6C 20 66 6F 75 6E 64 bool found
+0000:0AF0 77 6F 72 64 20 3D 20 66-61 6C 73 65 3B 0A 20 20 word = false;◙
+0000:0B00 20 20 20 20 20 20 66 6F-72 20 28 75 69 6E 74 20 for (uint
+0000:0B10 74 3D 31 3B 20 74 3C 3D-6E 75 6D 62 65 72 73 2E t=1; t<=numbers.
+0000:0B20 6C 65 6E 67 74 68 3B 20-2B 2B 74 29 20 7B 0A 20 length; ++t) {◙
+0000:0B30 20 20 20 20 20 20 20 20-20 20 20 61 75 74 6F 20 auto
+0000:0B40 61 6C 74 65 72 6E 61 74-69 76 65 73 20 3D 20 6E alternatives = n
+0000:0B50 75 6D 62 65 72 73 5B 30-2E 2E 74 5D 20 69 6E 20 umbers[0..t] in
+0000:0B60 6E 75 6D 32 77 6F 72 64-73 3B 0A 20 20 20 20 20 num2words;◙
+0000:0B70 20 20 20 20 20 20 20 69-66 20 28 21 61 6C 74 65 if (!alte
+0000:0B80 72 6E 61 74 69 76 65 73-29 0A 20 20 20 20 20 20 rnatives)◙
+0000:0B90 20 20 20 20 20 20 20 20-20 20 63 6F 6E 74 69 6E contin
+0000:0BA0 75 65 3B 0A 20 20 20 20-20 20 20 20 20 20 20 20 ue;◙
+0000:0BB0 66 6F 75 6E 64 77 6F 72-64 20 3D 20 74 72 75 65 foundword = true
+0000:0BC0 3B 0A 20 20 20 20 20 20-20 20 20 20 20 20 69 66 ;◙ if
+0000:0BD0 20 28 6E 75 6D 62 65 72-73 2E 6C 65 6E 67 74 68 (numbers.length
+0000:0BE0 20 3E 20 20 74 29 20 7B-0A 20 20 20 20 20 20 20 > t) {◙
+0000:0BF0 20 20 20 20 20 20 20 20-20 2F 2F 20 43 6F 6D 62 // Comb
+0000:0C00 69 6E 65 20 61 6C 6C 20-63 75 72 72 65 6E 74 20 ine all current
+0000:0C10 61 6C 74 65 72 6E 61 74-69 76 65 73 20 77 69 74 alternatives wit
+0000:0C20 68 20 61 6C 6C 20 61 6C-74 65 72 6E 61 74 69 76 h all alternativ
+0000:0C30 65 73 20 20 20 20 20 0A-20 20 20 20 20 20 20 20 es ◙
+0000:0C40 20 20 20 20 20 20 20 20-2F 2F 20 6F 66 20 74 68 // of th
+0000:0C50 65 20 72 65 73 74 20 28-6E 65 78 74 20 70 69 65 e rest (next pie
+0000:0C60 63 65 20 63 61 6E 20 73-74 61 72 74 20 77 69 74 ce can start wit
+0000:0C70 68 20 61 20 64 69 67 69-74 29 20 20 20 20 20 20 h a digit)
+0000:0C80 20 20 20 20 20 20 20 20-0A 20 20 20 20 20 20 20 ◙
+0000:0C90 20 20 20 20 20 20 20 20-20 66 6F 72 65 61 63 68 foreach
+0000:0CA0 20 28 61 32 3B 20 5F 46-69 6E 64 57 6F 72 64 73 (a2; _FindWords
+0000:0CB0 28 20 6E 75 6D 62 65 72-73 5B 74 2E 2E 24 5D 2C ( numbers[t..$],
+0000:0CC0 20 74 72 75 65 20 20 20-20 20 29 20 29 0A 20 20 true ) )◙
+0000:0CD0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:0CE0 20 20 66 6F 72 65 61 63-68 28 61 31 3B 20 2A 61 foreach(a1; *a
+0000:0CF0 6C 74 65 72 6E 61 74 69-76 65 73 29 0A 20 20 20 lternatives)◙
+0000:0D00 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:0D10 20 20 20 20 72 65 74 20-7E 3D 20 61 31 20 7E 20 ret ~= a1 ~
+0000:0D20 22 20 22 20 7E 20 61 32-3B 0A 20 20 20 20 20 20 " " ~ a2;◙
+0000:0D30 20 20 20 20 20 20 7D 0A-20 20 20 20 20 20 20 20 }◙
+0000:0D40 20 20 20 20 65 6C 73 65-20 20 20 20 0A 20 20 20 else ◙
+0000:0D50 20 20 20 20 20 20 20 20-20 20 20 20 20 72 65 74 ret
+0000:0D60 20 7E 3D 20 2A 61 6C 74-65 72 6E 61 74 69 76 65 ~= *alternative
+0000:0D70 73 3B 20 20 20 20 2F 2F-20 61 70 70 65 6E 64 20 s; // append
+0000:0D80 74 68 65 73 65 20 61 6C-74 65 72 6E 61 74 69 76 these alternativ
+0000:0D90 65 73 0A 20 20 20 20 20-20 20 20 7D 0A 20 20 20 es◙ }◙
+0000:0DA0 20 20 20 20 20 2F 2F 20-54 72 79 20 74 6F 20 6B // Try to k
+0000:0DB0 65 65 70 20 31 20 64 69-67 69 74 2C 20 6F 6E 6C eep 1 digit, onl
+0000:0DC0 79 20 69 66 20 77 65 27-72 65 20 61 6C 6C 6F 77 y if we're allow
+0000:0DD0 65 64 20 61 6E 64 20 6E-6F 20 6F 74 68 65 72 0A ed and no other◙
+0000:0DE0 20 20 20 20 20 20 20 20-2F 2F 20 61 6C 74 65 72 // alter
+0000:0DF0 6E 61 74 69 76 65 73 20-77 65 72 65 20 66 6F 75 natives were fou
+0000:0E00 6E 64 0A 20 20 20 20 20-20 20 20 2F 2F 20 54 65 nd◙ // Te
+0000:0E10 73 74 69 6E 67 20 22 72-65 74 2E 6C 65 6E 67 74 sting "ret.lengt
+0000:0E20 68 22 20 6D 61 6B 65 73-20 6D 6F 72 65 20 73 65 h" makes more se
+0000:0E30 6E 73 65 20 74 68 61 6E-20 74 65 73 74 69 6E 67 nse than testing
+0000:0E40 20 22 66 6F 75 6E 64 77-6F 72 64 22 2C 0A 20 20 "foundword",◙
+0000:0E50 20 20 20 20 20 20 2F 2F-20 62 75 74 20 74 68 65 // but the
+0000:0E60 20 6F 74 68 65 72 20 69-6D 70 6C 65 6D 65 6E 74 other implement
+0000:0E70 61 74 69 6F 6E 73 20 73-65 65 6D 20 74 6F 20 64 ations seem to d
+0000:0E80 6F 20 6A 75 73 74 20 74-68 69 73 2E 0A 20 20 20 o just this.◙
+0000:0E90 20 20 20 20 20 69 66 20-28 64 69 67 69 74 6F 6B if (digitok
+0000:0EA0 20 26 26 20 21 66 6F 75-6E 64 77 6F 72 64 29 20 && !foundword)
+0000:0EB0 7B 20 2F 2F 72 65 74 2E-6C 65 6E 67 74 68 20 3D { //ret.length =
+0000:0EC0 3D 20 30 20 20 0A 20 20-20 20 20 20 20 20 20 20 = 0 ◙
+0000:0ED0 20 20 69 66 28 6E 75 6D-62 65 72 73 2E 6C 65 6E if(numbers.len
+0000:0EE0 67 74 68 20 3E 20 20 31-29 20 7B 0A 20 20 20 20 gth > 1) {◙
+0000:0EF0 20 20 20 20 20 20 20 20-20 20 20 20 2F 2F 20 43 // C
+0000:0F00 6F 6D 62 69 6E 65 20 31-20 64 69 67 69 74 20 77 ombine 1 digit w
+0000:0F10 69 74 68 20 61 6C 6C 20-61 6C 74 65 6E 61 74 69 ith all altenati
+0000:0F20 76 65 73 20 66 72 6F 6D-20 74 68 65 20 72 65 73 ves from the res
+0000:0F30 74 20 20 20 20 0A 20 20-20 20 20 20 20 20 20 20 t ◙
+0000:0F40 20 20 20 20 20 20 2F 2F-20 28 6E 65 78 74 20 70 // (next p
+0000:0F50 69 65 63 65 20 63 61 6E-20 6E 6F 74 20 73 74 61 iece can not sta
+0000:0F60 72 74 20 77 69 74 68 20-61 20 64 69 67 69 74 29 rt with a digit)
+0000:0F70 20 20 20 20 20 20 20 20-20 20 0A 20 20 20 20 20 ◙
+0000:0F80 20 20 20 20 20 20 20 20-20 20 20 66 6F 72 65 61 forea
+0000:0F90 63 68 20 28 61 3B 20 5F-46 69 6E 64 57 6F 72 64 ch (a; _FindWord
+0000:0FA0 73 28 20 6E 75 6D 62 65-72 73 5B 31 2E 2E 24 5D s( numbers[1..$]
+0000:0FB0 2C 20 66 61 6C 73 65 20-29 20 29 0A 20 20 20 20 , false ) )◙
+0000:0FC0 20 20 20 20 20 20 20 20-20 20 20 20 20 20 20 20
+0000:0FD0 72 65 74 20 7E 3D 20 6E-75 6D 62 65 72 73 5B 30 ret ~= numbers[0
+0000:0FE0 2E 2E 31 5D 20 7E 20 22-20 22 20 7E 20 61 3B 0A ..1] ~ " " ~ a;◙
+0000:0FF0 20 20 20 20 20 20 20 20-20 20 20 20 7D 20 20 20 }
+0000:1000 20 0A 20 20 20 20 20 20-20 20 20 20 20 20 65 6C ◙ el
+0000:1010 73 65 20 20 20 20 0A 20-20 20 20 20 20 20 20 20 se ◙
+0000:1020 20 20 20 20 20 20 20 72-65 74 20 7E 3D 20 6E 75 ret ~= nu
+0000:1030 6D 62 65 72 73 5B 30 2E-2E 31 5D 3B 20 20 20 20 mbers[0..1];
+0000:1040 2F 2F 20 6A 75 73 74 20-61 70 70 65 6E 64 20 74 // just append t
+0000:1050 68 69 73 20 64 69 67 69-74 20 20 20 20 20 20 20 his digit
+0000:1060 20 20 20 20 20 20 0A 20-20 20 20 20 20 20 20 7D ◙ }
+0000:1070 20 20 20 20 0A 20 20 20-20 20 20 20 20 72 65 74 ◙ ret
+0000:1080 75 72 6E 20 72 65 74 3B-0A 20 20 20 20 7D 0A 0A urn ret;◙ }◙◙
+0000:1090 20 20 20 20 2F 2F 2F 20-28 54 68 69 73 20 66 75 /// (This fu
+0000:10A0 6E 63 74 69 6F 6E 20 77-61 73 20 69 6E 6C 69 6E nction was inlin
+0000:10B0 65 64 20 69 6E 20 74 68-65 20 6F 72 69 67 69 6E ed in the origin
+0000:10C0 61 6C 20 70 72 6F 67 72-61 6D 29 20 0A 20 20 20 al program) ◙
+0000:10D0 20 2F 2F 2F 20 46 69 6E-64 73 20 61 6C 6C 20 61 /// Finds all a
+0000:10E0 6C 74 65 72 6E 61 74 69-76 65 73 20 66 6F 72 20 lternatives for
+0000:10F0 74 68 65 20 67 69 76 65-6E 20 70 68 6F 6E 65 20 the given phone
+0000:1100 6E 75 6D 62 65 72 20 0A-20 20 20 20 2F 2F 2F 20 number ◙ ///
+0000:1110 52 65 74 75 72 6E 73 3A-20 61 72 72 61 79 20 6F Returns: array o
+0000:1120 66 20 73 74 72 69 6E 67-73 20 0A 20 20 20 20 73 f strings ◙ s
+0000:1130 74 72 69 6E 67 61 72 72-61 79 20 46 69 6E 64 57 tringarray FindW
+0000:1140 6F 72 64 73 28 20 73 74-72 69 6E 67 20 70 68 6F ords( string pho
+0000:1150 6E 65 5F 6E 75 6D 62 65-72 20 29 0A 20 20 20 20 ne_number )◙
+0000:1160 7B 0A 20 20 20 20 20 20-20 20 69 66 20 28 21 70 {◙ if (!p
+0000:1170 68 6F 6E 65 5F 6E 75 6D-62 65 72 2E 6C 65 6E 67 hone_number.leng
+0000:1180 74 68 29 0A 20 20 20 20-20 20 20 20 20 20 20 20 th)◙
+0000:1190 72 65 74 75 72 6E 20 6E-75 6C 6C 3B 0A 20 20 20 return null;◙
+0000:11A0 20 20 20 20 20 2F 2F 20-53 74 72 69 70 20 74 68 // Strip th
+0000:11B0 65 20 6E 6F 6E 2D 64 69-67 69 74 20 63 68 61 72 e non-digit char
+0000:11C0 61 63 74 65 72 73 20 66-72 6F 6D 20 74 68 65 20 acters from the
+0000:11D0 70 68 6F 6E 65 20 6E 75-6D 62 65 72 2C 20 61 6E phone number, an
+0000:11E0 64 0A 20 20 20 20 20 20-20 20 2F 2F 20 70 61 73 d◙ // pas
+0000:11F0 73 20 69 74 20 74 6F 20-74 68 65 20 72 65 63 75 s it to the recu
+0000:1200 72 73 69 76 65 20 66 75-6E 63 74 69 6F 6E 20 28 rsive function (
+0000:1210 6C 65 61 64 69 6E 67 20-64 69 67 69 74 20 69 73 leading digit is
+0000:1220 20 61 6C 6C 6F 77 65 64-29 0A 20 20 20 20 20 20 allowed)◙
+0000:1230 20 20 72 65 74 75 72 6E-20 5F 46 69 6E 64 57 6F return _FindWo
+0000:1240 72 64 73 28 20 73 74 72-69 70 4E 6F 6E 44 69 67 rds( stripNonDig
+0000:1250 69 74 28 70 68 6F 6E 65-5F 6E 75 6D 62 65 72 29 it(phone_number)
+0000:1260 2C 20 74 72 75 65 20 29-3B 20 20 20 20 0A 20 20 , true ); ◙
+0000:1270 20 20 7D 20 20 20 20 0A-20 20 20 20 0A 20 20 20 } ◙ ◙
+0000:1280 20 2F 2F 20 52 65 61 64-20 74 68 65 20 70 68 6F // Read the pho
+0000:1290 6E 65 20 6E 75 6D 62 65-72 73 20 20 20 20 20 0A ne numbers ◙
+0000:12A0 20 20 20 20 66 6F 72 65-61 63 68 28 73 74 72 69 foreach(stri
+0000:12B0 6E 67 20 70 68 6F 6E 65-3B 20 6E 65 77 20 42 75 ng phone; new Bu
+0000:12C0 66 66 65 72 65 64 46 69-6C 65 28 22 69 6E 70 75 fferedFile("inpu
+0000:12D0 74 2E 74 78 74 22 20 20-20 29 20 29 0A 20 20 20 t.txt" ) )◙
+0000:12E0 20 20 20 20 20 66 6F 72-65 61 63 68 28 61 6C 74 foreach(alt
+0000:12F0 65 72 6E 61 74 69 76 65-3B 20 46 69 6E 64 57 6F ernative; FindWo
+0000:1300 72 64 73 28 20 70 68 6F-6E 65 20 29 20 29 0A 20 rds( phone ) )◙
+0000:1310 20 20 20 20 20 20 20 20-20 20 20 77 72 69 74 65 write
+0000:1320 66 6C 6E 28 70 68 6F 6E-65 2C 20 22 3A 20 22 2C fln(phone, ": ",
+0000:1330 20 61 6C 74 65 72 6E 61-74 69 76 65 20 29 3B 0A alternative );◙
+0000:1340 7D 0A 0A }◙◙
diff --git a/tests/examplefiles/hexdump_test b/tests/examplefiles/hexdump_hd
index 4af46fcb..4af46fcb 100644
--- a/tests/examplefiles/hexdump_test
+++ b/tests/examplefiles/hexdump_hd
diff --git a/tests/examplefiles/hexdump_hexcat b/tests/examplefiles/hexdump_hexcat
new file mode 100644
index 00000000..522074cf
--- /dev/null
+++ b/tests/examplefiles/hexdump_hexcat
@@ -0,0 +1,247 @@
+00000000 2F 2F 20 43 72 65 61 74 65 64 20 62 79 20 4C 69 6F 6E 65 6C //.Created.by.Lionel
+00000014 6C 6F 20 4C 75 6E 65 73 75 20 61 6E 64 20 70 6C 61 63 65 64 lo.Lunesu.and.placed
+00000028 20 69 6E 20 74 68 65 20 70 75 62 6C 69 63 20 64 6F 6D 61 69 .in.the.public.domai
+0000003C 6E 2E 0A 2F 2F 20 54 68 69 73 20 66 69 6C 65 20 68 61 73 20 n..//.This.file.has.
+00000050 62 65 65 6E 20 6D 6F 64 69 66 69 65 64 20 66 72 6F 6D 20 69 been.modified.from.i
+00000064 74 73 20 6F 72 69 67 69 6E 61 6C 20 76 65 72 73 69 6F 6E 2E ts.original.version.
+00000078 0A 2F 2F 20 49 74 20 68 61 73 20 62 65 65 6E 20 66 6F 72 6D .//.It.has.been.form
+0000008C 61 74 74 65 64 20 74 6F 20 66 69 74 20 79 6F 75 72 20 73 63 atted.to.fit.your.sc
+000000A0 72 65 65 6E 2E 0A 6D 6F 64 75 6C 65 20 70 68 6F 6E 65 6E 6F reen..module.phoneno
+000000B4 3B 20 20 20 20 20 2F 2F 20 6F 70 74 69 6F 6E 61 6C 0A 69 6D ;.....//.optional.im
+000000C8 70 6F 72 74 20 73 74 64 2E 73 74 64 69 6F 3B 20 20 20 2F 2F port.std.stdio;...//
+000000DC 20 77 72 69 74 65 66 6C 6E 20 20 20 20 20 0A 69 6D 70 6F 72 .writefln......impor
+000000F0 74 20 73 74 64 2E 63 74 79 70 65 3B 20 20 20 2F 2F 20 69 73 t.std.ctype;...//.is
+00000104 64 69 67 69 74 20 20 20 20 20 0A 69 6D 70 6F 72 74 20 73 74 digit......import.st
+00000118 64 2E 73 74 72 65 61 6D 3B 20 20 2F 2F 20 42 75 66 66 65 72 d.stream;..//.Buffer
+0000012C 65 64 46 69 6C 65 0A 0A 2F 2F 20 4A 75 73 74 20 66 6F 72 20 edFile..//.Just.for.
+00000140 72 65 61 64 61 62 69 6C 69 74 79 20 28 69 6D 61 67 69 6E 65 readability.(imagine
+00000154 20 63 68 61 72 5B 5D 5B 5D 5B 63 68 61 72 5B 5D 5D 29 20 20 .char[][][char[]])..
+00000168 20 20 0A 61 6C 69 61 73 20 63 68 61 72 5B 5D 20 73 74 72 69 ...alias.char[].stri
+0000017C 6E 67 3B 0A 61 6C 69 61 73 20 73 74 72 69 6E 67 5B 5D 20 73 ng;.alias.string[].s
+00000190 74 72 69 6E 67 61 72 72 61 79 3B 0A 0A 2F 2F 2F 20 53 74 72 tringarray;..///.Str
+000001A4 69 70 73 20 6E 6F 6E 2D 64 69 67 69 74 20 63 68 61 72 61 63 ips.non-digit.charac
+000001B8 74 65 72 73 20 66 72 6F 6D 20 74 68 65 20 73 74 72 69 6E 67 ters.from.the.string
+000001CC 20 28 43 4F 57 29 0A 73 74 72 69 6E 67 20 73 74 72 69 70 4E .(COW).string.stripN
+000001E0 6F 6E 44 69 67 69 74 28 20 69 6E 20 73 74 72 69 6E 67 20 6C onDigit(.in.string.l
+000001F4 69 6E 65 20 29 20 0A 7B 0A 20 20 20 20 73 74 72 69 6E 67 20 ine.)..{.....string.
+00000208 72 65 74 3B 0A 20 20 20 20 66 6F 72 65 61 63 68 28 75 69 6E ret;.....foreach(uin
+0000021C 74 20 69 2C 20 63 3B 20 6C 69 6E 65 29 20 7B 0A 20 20 20 20 t.i,.c;.line).{.....
+00000230 20 20 20 20 2F 2F 20 45 72 72 6F 72 3A 20 73 74 64 2E 63 74 ....//.Error:.std.ct
+00000244 79 70 65 2E 69 73 64 69 67 69 74 20 61 74 20 43 3A 5C 64 6D ype.isdigit.at.C:\dm
+00000258 64 5C 73 72 63 5C 70 68 6F 62 6F 73 5C 73 74 64 5C 63 74 79 d\src\phobos\std\cty
+0000026C 70 65 2E 64 28 33 37 29 20 0A 20 20 20 20 20 20 20 20 2F 2F pe.d(37)..........//
+00000280 20 63 6F 6E 66 6C 69 63 74 73 20 77 69 74 68 20 73 74 64 2E .conflicts.with.std.
+00000294 73 74 72 65 61 6D 2E 69 73 64 69 67 69 74 20 61 74 20 43 3A stream.isdigit.at.C:
+000002A8 5C 64 6D 64 5C 73 72 63 5C 70 68 6F 62 6F 73 5C 73 74 64 5C \dmd\src\phobos\std\
+000002BC 73 74 72 65 61 6D 2E 64 28 32 39 32 34 29 0A 20 20 20 20 20 stream.d(2924)......
+000002D0 20 20 20 69 66 20 28 21 73 74 64 2E 63 74 79 70 65 2E 69 73 ...if.(!std.ctype.is
+000002E4 64 69 67 69 74 28 63 29 29 20 7B 0A 20 20 20 20 20 20 20 20 digit(c)).{.........
+000002F8 20 20 20 20 69 66 20 28 21 72 65 74 29 0A 20 20 20 20 20 20 ....if.(!ret).......
+0000030C 20 20 20 20 20 20 20 20 20 20 72 65 74 20 3D 20 6C 69 6E 65 ..........ret.=.line
+00000320 5B 30 2E 2E 69 5D 3B 20 20 20 20 0A 20 20 20 20 20 20 20 20 [0..i];.............
+00000334 7D 20 20 20 20 0A 20 20 20 20 20 20 20 20 65 6C 73 65 20 69 }.............else.i
+00000348 66 20 28 72 65 74 29 0A 20 20 20 20 20 20 20 20 20 20 20 20 f.(ret).............
+0000035C 72 65 74 20 7E 3D 20 63 3B 20 20 20 20 0A 20 20 20 20 7D 20 ret.~=.c;.........}.
+00000370 20 20 20 0A 20 20 20 20 72 65 74 75 72 6E 20 72 65 74 3F 72 ........return.ret?r
+00000384 65 74 3A 6C 69 6E 65 3B 0A 7D 0A 0A 75 6E 69 74 74 65 73 74 et:line;.}..unittest
+00000398 20 7B 0A 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 69 70 .{.....assert(.strip
+000003AC 4E 6F 6E 44 69 67 69 74 28 22 61 73 64 66 22 29 20 3D 3D 20 NonDigit("asdf").==.
+000003C0 22 22 20 20 29 3B 0A 20 20 20 20 61 73 73 65 72 74 28 20 73 ""..);.....assert(.s
+000003D4 74 72 69 70 4E 6F 6E 44 69 67 69 74 28 22 5C 27 31 33 2D 3D tripNonDigit("\'13-=
+000003E8 32 20 34 6B 6F 70 22 29 20 3D 3D 20 20 22 31 33 32 34 22 20 2.4kop").==.."1324".
+000003FC 20 29 3B 0A 7D 0A 0A 2F 2F 2F 20 43 6F 6E 76 65 72 74 73 20 .);.}..///.Converts.
+00000410 61 20 77 6F 72 64 20 69 6E 74 6F 20 61 20 6E 75 6D 62 65 72 a.word.into.a.number
+00000424 2C 20 69 67 6E 6F 72 69 6E 67 20 61 6C 6C 20 6E 6F 6E 20 61 ,.ignoring.all.non.a
+00000438 6C 70 68 61 20 63 68 61 72 61 63 74 65 72 73 20 20 0A 73 74 lpha.characters...st
+0000044C 72 69 6E 67 20 77 6F 72 64 54 6F 4E 75 6D 28 20 69 6E 20 73 ring.wordToNum(.in.s
+00000460 74 72 69 6E 67 20 77 6F 72 64 20 29 0A 7B 0A 2F 2F 20 74 72 tring.word.).{.//.tr
+00000474 61 6E 73 6C 61 74 69 6F 6E 20 74 61 62 6C 65 20 66 6F 72 20 anslation.table.for.
+00000488 74 68 65 20 74 61 73 6B 20 61 74 20 68 61 6E 64 0A 63 6F 6E the.task.at.hand.con
+0000049C 73 74 20 63 68 61 72 5B 32 35 36 5D 20 54 52 41 4E 53 4C 41 st.char[256].TRANSLA
+000004B0 54 45 20 3D 20 20 20 20 0A 20 20 20 20 22 20 20 20 20 20 20 TE.=........."......
+000004C4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ....................
+000004D8 20 20 20 20 20 20 22 20 20 2F 2F 20 30 20 20 20 0A 20 20 20 ......"..//.0.......
+000004EC 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 31 ."................01
+00000500 32 33 34 35 36 37 38 39 20 20 20 20 20 20 22 20 20 2F 2F 20 23456789......"..//.
+00000514 33 32 20 20 20 20 20 0A 20 20 20 20 22 20 35 37 36 33 30 34 32..........".576304
+00000528 39 39 36 31 37 38 35 31 38 38 31 32 33 34 37 36 32 32 33 39 99617851881234762239
+0000053C 20 20 20 20 20 22 20 20 2F 2F 20 36 34 20 20 20 0A 20 20 20 ....."..//.64.......
+00000550 20 22 20 35 37 36 33 30 34 39 39 36 31 37 38 35 31 38 38 31 .".57630499617851881
+00000564 32 33 34 37 36 32 32 33 39 20 20 20 20 20 22 0A 20 20 20 20 234762239.....".....
+00000578 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "...................
+0000058C 20 20 20 20 20 20 20 20 20 20 20 20 20 22 0A 20 20 20 20 22 ............."....."
+000005A0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ....................
+000005B4 20 20 20 20 20 20 20 20 20 20 20 20 22 0A 20 20 20 20 22 20 ............".....".
+000005C8 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ....................
+000005DC 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 0A 20 20 20 ..........."........
+000005F0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ."..................
+00000604 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3B 0A 20 20 20 ..............";....
+00000618 20 73 74 72 69 6E 67 20 72 65 74 3B 0A 20 20 20 20 66 6F 72 .string.ret;.....for
+0000062C 65 61 63 68 28 63 3B 20 63 61 73 74 28 75 62 79 74 65 5B 5D each(c;.cast(ubyte[]
+00000640 29 77 6F 72 64 29 0A 20 20 20 20 20 20 20 20 69 66 20 28 54 )word).........if.(T
+00000654 52 41 4E 53 4C 41 54 45 5B 63 5D 20 21 3D 20 27 20 27 29 0A RANSLATE[c].!=.'.').
+00000668 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 20 7E 3D 20 54 ............ret.~=.T
+0000067C 52 41 4E 53 4C 41 54 45 5B 63 5D 3B 0A 20 20 20 20 72 65 74 RANSLATE[c];.....ret
+00000690 75 72 6E 20 72 65 74 3B 0A 7D 0A 0A 75 6E 69 74 74 65 73 74 urn.ret;.}..unittest
+000006A4 20 7B 0A 20 2F 2F 20 54 65 73 74 20 77 6F 72 64 54 6F 4E 75 .{..//.Test.wordToNu
+000006B8 6D 20 75 73 69 6E 67 20 74 68 65 20 74 61 62 6C 65 20 66 72 m.using.the.table.fr
+000006CC 6F 6D 20 74 68 65 20 74 61 73 6B 20 64 65 73 63 72 69 70 74 om.the.task.descript
+000006E0 69 6F 6E 2E 0A 20 61 73 73 65 72 74 28 20 22 30 31 31 31 32 ion...assert(."01112
+000006F4 32 32 33 33 33 34 34 35 35 36 36 36 37 37 37 38 38 38 39 39 22333445566677788899
+00000708 39 22 20 3D 3D 0A 20 20 20 77 6F 72 64 54 6F 4E 75 6D 28 22 9".==....wordToNum("
+0000071C 45 20 7C 20 4A 20 4E 20 51 20 7C 20 52 20 57 20 58 20 7C 20 E.|.J.N.Q.|.R.W.X.|.
+00000730 44 20 53 20 59 20 7C 20 46 20 54 20 7C 20 41 20 4D 20 7C 20 D.S.Y.|.F.T.|.A.M.|.
+00000744 43 20 49 20 56 20 7C 20 42 20 4B 20 55 20 7C 20 4C 20 4F 20 C.I.V.|.B.K.U.|.L.O.
+00000758 50 20 7C 20 47 20 48 20 5A 22 29 29 3B 0A 20 61 73 73 65 72 P.|.G.H.Z"));..asser
+0000076C 74 28 20 22 30 31 31 31 32 32 32 33 33 33 34 34 35 35 36 36 t(."0111222333445566
+00000780 36 37 37 37 38 38 38 39 39 39 22 20 3D 3D 20 0A 20 20 20 77 6777888999".==.....w
+00000794 6F 72 64 54 6F 4E 75 6D 28 22 65 20 7C 20 6A 20 6E 20 71 20 ordToNum("e.|.j.n.q.
+000007A8 7C 20 72 20 77 20 78 20 7C 20 64 20 73 20 79 20 7C 20 66 20 |.r.w.x.|.d.s.y.|.f.
+000007BC 74 20 7C 20 61 20 6D 20 7C 20 63 20 69 20 76 20 7C 20 62 20 t.|.a.m.|.c.i.v.|.b.
+000007D0 6B 20 75 20 7C 20 6C 20 6F 20 70 20 7C 20 67 20 68 20 7A 22 k.u.|.l.o.p.|.g.h.z"
+000007E4 29 29 3B 0A 20 61 73 73 65 72 74 28 20 22 30 31 32 33 34 35 ));..assert(."012345
+000007F8 36 37 38 39 22 20 3D 3D 20 0A 20 20 20 77 6F 72 64 54 6F 4E 6789".==.....wordToN
+0000080C 75 6D 28 22 30 20 7C 20 20 20 31 20 20 20 7C 20 20 20 32 20 um("0.|...1...|...2.
+00000820 20 20 7C 20 20 20 33 20 20 20 7C 20 20 34 20 20 7C 20 20 35 ..|...3...|..4..|..5
+00000834 20 20 7C 20 20 20 36 20 20 20 7C 20 20 20 37 20 20 20 7C 20 ..|...6...|...7...|.
+00000848 20 20 38 20 20 20 7C 20 20 20 39 22 29 29 3B 0A 7D 0A 0A 76 ..8...|...9"));.}..v
+0000085C 6F 69 64 20 6D 61 69 6E 28 20 73 74 72 69 6E 67 5B 5D 20 61 oid.main(.string[].a
+00000870 72 67 73 20 29 0A 7B 0A 20 20 20 20 2F 2F 20 54 68 69 73 20 rgs.).{.....//.This.
+00000884 61 73 73 6F 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6D 61 associative.array.ma
+00000898 70 73 20 61 20 6E 75 6D 62 65 72 20 74 6F 20 61 6E 20 61 72 ps.a.number.to.an.ar
+000008AC 72 61 79 20 6F 66 20 77 6F 72 64 73 2E 20 20 20 20 0A 20 20 ray.of.words........
+000008C0 20 20 73 74 72 69 6E 67 61 72 72 61 79 5B 73 74 72 69 6E 67 ..stringarray[string
+000008D4 5D 20 20 20 20 6E 75 6D 32 77 6F 72 64 73 3B 0A 0A 20 20 20 ]....num2words;.....
+000008E8 20 66 6F 72 65 61 63 68 28 73 74 72 69 6E 67 20 77 6F 72 64 .foreach(string.word
+000008FC 3B 20 6E 65 77 20 42 75 66 66 65 72 65 64 46 69 6C 65 28 22 ;.new.BufferedFile("
+00000910 64 69 63 74 69 6F 6E 61 72 79 2E 74 78 74 22 20 29 20 29 0A dictionary.txt".).).
+00000924 20 20 20 20 20 20 20 20 6E 75 6D 32 77 6F 72 64 73 5B 20 77 ........num2words[.w
+00000938 6F 72 64 54 6F 4E 75 6D 28 77 6F 72 64 29 20 5D 20 7E 3D 20 ordToNum(word).].~=.
+0000094C 77 6F 72 64 2E 64 75 70 3B 20 20 20 20 20 20 20 20 2F 2F 20 word.dup;........//.
+00000960 6D 75 73 74 20 64 75 70 0A 0A 20 20 20 20 2F 2F 2F 20 46 69 must.dup......///.Fi
+00000974 6E 64 73 20 61 6C 6C 20 61 6C 74 65 72 6E 61 74 69 76 65 73 nds.all.alternatives
+00000988 20 66 6F 72 20 74 68 65 20 67 69 76 65 6E 20 6E 75 6D 62 65 .for.the.given.numbe
+0000099C 72 0A 20 20 20 20 2F 2F 2F 20 28 73 68 6F 75 6C 64 20 68 61 r.....///.(should.ha
+000009B0 76 65 20 62 65 65 6E 20 73 74 72 69 70 70 65 64 20 66 72 6F ve.been.stripped.fro
+000009C4 6D 20 6E 6F 6E 2D 64 69 67 69 74 20 63 68 61 72 61 63 74 65 m.non-digit.characte
+000009D8 72 73 29 0A 20 20 20 20 73 74 72 69 6E 67 61 72 72 61 79 20 rs).....stringarray.
+000009EC 5F 46 69 6E 64 57 6F 72 64 73 28 20 73 74 72 69 6E 67 20 6E _FindWords(.string.n
+00000A00 75 6D 62 65 72 73 2C 20 62 6F 6F 6C 20 64 69 67 69 74 6F 6B umbers,.bool.digitok
+00000A14 20 29 0A 20 20 20 20 69 6E 20 7B 0A 20 20 20 20 20 20 20 20 .).....in.{.........
+00000A28 61 73 73 65 72 74 28 6E 75 6D 62 65 72 73 2E 6C 65 6E 67 74 assert(numbers.lengt
+00000A3C 68 20 3E 20 20 30 29 3B 20 20 20 20 0A 20 20 20 20 7D 20 20 h.>..0);.........}..
+00000A50 20 20 0A 20 20 20 20 6F 75 74 28 72 65 73 75 6C 74 29 20 7B .......out(result).{
+00000A64 0A 20 20 20 20 20 20 20 20 66 6F 72 65 61 63 68 20 28 61 3B .........foreach.(a;
+00000A78 20 72 65 73 75 6C 74 29 0A 20 20 20 20 20 20 20 20 20 20 20 .result)............
+00000A8C 20 61 73 73 65 72 74 28 20 77 6F 72 64 54 6F 4E 75 6D 28 61 .assert(.wordToNum(a
+00000AA0 29 20 3D 3D 20 6E 75 6D 62 65 72 73 20 29 3B 0A 20 20 20 20 ).==.numbers.);.....
+00000AB4 7D 20 20 20 20 0A 20 20 20 20 62 6F 64 79 20 7B 0A 20 20 20 }.........body.{....
+00000AC8 20 20 20 20 20 73 74 72 69 6E 67 61 72 72 61 79 20 72 65 74 .....stringarray.ret
+00000ADC 3B 0A 20 20 20 20 20 20 20 20 62 6F 6F 6C 20 66 6F 75 6E 64 ;.........bool.found
+00000AF0 77 6F 72 64 20 3D 20 66 61 6C 73 65 3B 0A 20 20 20 20 20 20 word.=.false;.......
+00000B04 20 20 66 6F 72 20 28 75 69 6E 74 20 74 3D 31 3B 20 74 3C 3D ..for.(uint.t=1;.t<=
+00000B18 6E 75 6D 62 65 72 73 2E 6C 65 6E 67 74 68 3B 20 2B 2B 74 29 numbers.length;.++t)
+00000B2C 20 7B 0A 20 20 20 20 20 20 20 20 20 20 20 20 61 75 74 6F 20 .{.............auto.
+00000B40 61 6C 74 65 72 6E 61 74 69 76 65 73 20 3D 20 6E 75 6D 62 65 alternatives.=.numbe
+00000B54 72 73 5B 30 2E 2E 74 5D 20 69 6E 20 6E 75 6D 32 77 6F 72 64 rs[0..t].in.num2word
+00000B68 73 3B 0A 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 s;.............if.(!
+00000B7C 61 6C 74 65 72 6E 61 74 69 76 65 73 29 0A 20 20 20 20 20 20 alternatives).......
+00000B90 20 20 20 20 20 20 20 20 20 20 63 6F 6E 74 69 6E 75 65 3B 0A ..........continue;.
+00000BA4 20 20 20 20 20 20 20 20 20 20 20 20 66 6F 75 6E 64 77 6F 72 ............foundwor
+00000BB8 64 20 3D 20 74 72 75 65 3B 0A 20 20 20 20 20 20 20 20 20 20 d.=.true;...........
+00000BCC 20 20 69 66 20 28 6E 75 6D 62 65 72 73 2E 6C 65 6E 67 74 68 ..if.(numbers.length
+00000BE0 20 3E 20 20 74 29 20 7B 0A 20 20 20 20 20 20 20 20 20 20 20 .>..t).{............
+00000BF4 20 20 20 20 20 2F 2F 20 43 6F 6D 62 69 6E 65 20 61 6C 6C 20 .....//.Combine.all.
+00000C08 63 75 72 72 65 6E 74 20 61 6C 74 65 72 6E 61 74 69 76 65 73 current.alternatives
+00000C1C 20 77 69 74 68 20 61 6C 6C 20 61 6C 74 65 72 6E 61 74 69 76 .with.all.alternativ
+00000C30 65 73 20 20 20 20 20 0A 20 20 20 20 20 20 20 20 20 20 20 20 es..................
+00000C44 20 20 20 20 2F 2F 20 6F 66 20 74 68 65 20 72 65 73 74 20 28 ....//.of.the.rest.(
+00000C58 6E 65 78 74 20 70 69 65 63 65 20 63 61 6E 20 73 74 61 72 74 next.piece.can.start
+00000C6C 20 77 69 74 68 20 61 20 64 69 67 69 74 29 20 20 20 20 20 20 .with.a.digit)......
+00000C80 20 20 20 20 20 20 20 20 0A 20 20 20 20 20 20 20 20 20 20 20 ....................
+00000C94 20 20 20 20 20 66 6F 72 65 61 63 68 20 28 61 32 3B 20 5F 46 .....foreach.(a2;._F
+00000CA8 69 6E 64 57 6F 72 64 73 28 20 6E 75 6D 62 65 72 73 5B 74 2E indWords(.numbers[t.
+00000CBC 2E 24 5D 2C 20 74 72 75 65 20 20 20 20 20 29 20 29 0A 20 20 .$],.true.....).)...
+00000CD0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6F ..................fo
+00000CE4 72 65 61 63 68 28 61 31 3B 20 2A 61 6C 74 65 72 6E 61 74 69 reach(a1;.*alternati
+00000CF8 76 65 73 29 0A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ves)................
+00000D0C 20 20 20 20 20 20 20 20 72 65 74 20 7E 3D 20 61 31 20 7E 20 ........ret.~=.a1.~.
+00000D20 22 20 22 20 7E 20 61 32 3B 0A 20 20 20 20 20 20 20 20 20 20 ".".~.a2;...........
+00000D34 20 20 7D 0A 20 20 20 20 20 20 20 20 20 20 20 20 65 6C 73 65 ..}.............else
+00000D48 20 20 20 20 0A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ....................
+00000D5C 20 72 65 74 20 7E 3D 20 2A 61 6C 74 65 72 6E 61 74 69 76 65 .ret.~=.*alternative
+00000D70 73 3B 20 20 20 20 2F 2F 20 61 70 70 65 6E 64 20 74 68 65 73 s;....//.append.thes
+00000D84 65 20 61 6C 74 65 72 6E 61 74 69 76 65 73 0A 20 20 20 20 20 e.alternatives......
+00000D98 20 20 20 7D 0A 20 20 20 20 20 20 20 20 2F 2F 20 54 72 79 20 ...}.........//.Try.
+00000DAC 74 6F 20 6B 65 65 70 20 31 20 64 69 67 69 74 2C 20 6F 6E 6C to.keep.1.digit,.onl
+00000DC0 79 20 69 66 20 77 65 27 72 65 20 61 6C 6C 6F 77 65 64 20 61 y.if.we're.allowed.a
+00000DD4 6E 64 20 6E 6F 20 6F 74 68 65 72 0A 20 20 20 20 20 20 20 20 nd.no.other.........
+00000DE8 2F 2F 20 61 6C 74 65 72 6E 61 74 69 76 65 73 20 77 65 72 65 //.alternatives.were
+00000DFC 20 66 6F 75 6E 64 0A 20 20 20 20 20 20 20 20 2F 2F 20 54 65 .found.........//.Te
+00000E10 73 74 69 6E 67 20 22 72 65 74 2E 6C 65 6E 67 74 68 22 20 6D sting."ret.length".m
+00000E24 61 6B 65 73 20 6D 6F 72 65 20 73 65 6E 73 65 20 74 68 61 6E akes.more.sense.than
+00000E38 20 74 65 73 74 69 6E 67 20 22 66 6F 75 6E 64 77 6F 72 64 22 .testing."foundword"
+00000E4C 2C 0A 20 20 20 20 20 20 20 20 2F 2F 20 62 75 74 20 74 68 65 ,.........//.but.the
+00000E60 20 6F 74 68 65 72 20 69 6D 70 6C 65 6D 65 6E 74 61 74 69 6F .other.implementatio
+00000E74 6E 73 20 73 65 65 6D 20 74 6F 20 64 6F 20 6A 75 73 74 20 74 ns.seem.to.do.just.t
+00000E88 68 69 73 2E 0A 20 20 20 20 20 20 20 20 69 66 20 28 64 69 67 his..........if.(dig
+00000E9C 69 74 6F 6B 20 26 26 20 21 66 6F 75 6E 64 77 6F 72 64 29 20 itok.&&.!foundword).
+00000EB0 7B 20 2F 2F 72 65 74 2E 6C 65 6E 67 74 68 20 3D 3D 20 30 20 {.//ret.length.==.0.
+00000EC4 20 0A 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 6E 75 6D ..............if(num
+00000ED8 62 65 72 73 2E 6C 65 6E 67 74 68 20 3E 20 20 31 29 20 7B 0A bers.length.>..1).{.
+00000EEC 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2F 2F 20 43 ................//.C
+00000F00 6F 6D 62 69 6E 65 20 31 20 64 69 67 69 74 20 77 69 74 68 20 ombine.1.digit.with.
+00000F14 61 6C 6C 20 61 6C 74 65 6E 61 74 69 76 65 73 20 66 72 6F 6D all.altenatives.from
+00000F28 20 74 68 65 20 72 65 73 74 20 20 20 20 0A 20 20 20 20 20 20 .the.rest...........
+00000F3C 20 20 20 20 20 20 20 20 20 20 2F 2F 20 28 6E 65 78 74 20 70 ..........//.(next.p
+00000F50 69 65 63 65 20 63 61 6E 20 6E 6F 74 20 73 74 61 72 74 20 77 iece.can.not.start.w
+00000F64 69 74 68 20 61 20 64 69 67 69 74 29 20 20 20 20 20 20 20 20 ith.a.digit)........
+00000F78 20 20 0A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 ...................f
+00000F8C 6F 72 65 61 63 68 20 28 61 3B 20 5F 46 69 6E 64 57 6F 72 64 oreach.(a;._FindWord
+00000FA0 73 28 20 6E 75 6D 62 65 72 73 5B 31 2E 2E 24 5D 2C 20 66 61 s(.numbers[1..$],.fa
+00000FB4 6C 73 65 20 29 20 29 0A 20 20 20 20 20 20 20 20 20 20 20 20 lse.).).............
+00000FC8 20 20 20 20 20 20 20 20 72 65 74 20 7E 3D 20 6E 75 6D 62 65 ........ret.~=.numbe
+00000FDC 72 73 5B 30 2E 2E 31 5D 20 7E 20 22 20 22 20 7E 20 61 3B 0A rs[0..1].~.".".~.a;.
+00000FF0 20 20 20 20 20 20 20 20 20 20 20 20 7D 20 20 20 20 0A 20 20 ............}.......
+00001004 20 20 20 20 20 20 20 20 20 20 65 6C 73 65 20 20 20 20 0A 20 ..........else......
+00001018 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 20 7E ...............ret.~
+0000102C 3D 20 6E 75 6D 62 65 72 73 5B 30 2E 2E 31 5D 3B 20 20 20 20 =.numbers[0..1];....
+00001040 2F 2F 20 6A 75 73 74 20 61 70 70 65 6E 64 20 74 68 69 73 20 //.just.append.this.
+00001054 64 69 67 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 0A 20 digit...............
+00001068 20 20 20 20 20 20 20 7D 20 20 20 20 0A 20 20 20 20 20 20 20 .......}............
+0000107C 20 72 65 74 75 72 6E 20 72 65 74 3B 0A 20 20 20 20 7D 0A 0A .return.ret;.....}..
+00001090 20 20 20 20 2F 2F 2F 20 28 54 68 69 73 20 66 75 6E 63 74 69 ....///.(This.functi
+000010A4 6F 6E 20 77 61 73 20 69 6E 6C 69 6E 65 64 20 69 6E 20 74 68 on.was.inlined.in.th
+000010B8 65 20 6F 72 69 67 69 6E 61 6C 20 70 72 6F 67 72 61 6D 29 20 e.original.program).
+000010CC 0A 20 20 20 20 2F 2F 2F 20 46 69 6E 64 73 20 61 6C 6C 20 61 .....///.Finds.all.a
+000010E0 6C 74 65 72 6E 61 74 69 76 65 73 20 66 6F 72 20 74 68 65 20 lternatives.for.the.
+000010F4 67 69 76 65 6E 20 70 68 6F 6E 65 20 6E 75 6D 62 65 72 20 0A given.phone.number..
+00001108 20 20 20 20 2F 2F 2F 20 52 65 74 75 72 6E 73 3A 20 61 72 72 ....///.Returns:.arr
+0000111C 61 79 20 6F 66 20 73 74 72 69 6E 67 73 20 0A 20 20 20 20 73 ay.of.strings......s
+00001130 74 72 69 6E 67 61 72 72 61 79 20 46 69 6E 64 57 6F 72 64 73 tringarray.FindWords
+00001144 28 20 73 74 72 69 6E 67 20 70 68 6F 6E 65 5F 6E 75 6D 62 65 (.string.phone_numbe
+00001158 72 20 29 0A 20 20 20 20 7B 0A 20 20 20 20 20 20 20 20 69 66 r.).....{.........if
+0000116C 20 28 21 70 68 6F 6E 65 5F 6E 75 6D 62 65 72 2E 6C 65 6E 67 .(!phone_number.leng
+00001180 74 68 29 0A 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 th).............retu
+00001194 72 6E 20 6E 75 6C 6C 3B 0A 20 20 20 20 20 20 20 20 2F 2F 20 rn.null;.........//.
+000011A8 53 74 72 69 70 20 74 68 65 20 6E 6F 6E 2D 64 69 67 69 74 20 Strip.the.non-digit.
+000011BC 63 68 61 72 61 63 74 65 72 73 20 66 72 6F 6D 20 74 68 65 20 characters.from.the.
+000011D0 70 68 6F 6E 65 20 6E 75 6D 62 65 72 2C 20 61 6E 64 0A 20 20 phone.number,.and...
+000011E4 20 20 20 20 20 20 2F 2F 20 70 61 73 73 20 69 74 20 74 6F 20 ......//.pass.it.to.
+000011F8 74 68 65 20 72 65 63 75 72 73 69 76 65 20 66 75 6E 63 74 69 the.recursive.functi
+0000120C 6F 6E 20 28 6C 65 61 64 69 6E 67 20 64 69 67 69 74 20 69 73 on.(leading.digit.is
+00001220 20 61 6C 6C 6F 77 65 64 29 0A 20 20 20 20 20 20 20 20 72 65 .allowed).........re
+00001234 74 75 72 6E 20 5F 46 69 6E 64 57 6F 72 64 73 28 20 73 74 72 turn._FindWords(.str
+00001248 69 70 4E 6F 6E 44 69 67 69 74 28 70 68 6F 6E 65 5F 6E 75 6D ipNonDigit(phone_num
+0000125C 62 65 72 29 2C 20 74 72 75 65 20 29 3B 20 20 20 20 0A 20 20 ber),.true.);.......
+00001270 20 20 7D 20 20 20 20 0A 20 20 20 20 0A 20 20 20 20 2F 2F 20 ..}..............//.
+00001284 52 65 61 64 20 74 68 65 20 70 68 6F 6E 65 20 6E 75 6D 62 65 Read.the.phone.numbe
+00001298 72 73 20 20 20 20 20 0A 20 20 20 20 66 6F 72 65 61 63 68 28 rs..........foreach(
+000012AC 73 74 72 69 6E 67 20 70 68 6F 6E 65 3B 20 6E 65 77 20 42 75 string.phone;.new.Bu
+000012C0 66 66 65 72 65 64 46 69 6C 65 28 22 69 6E 70 75 74 2E 74 78 fferedFile("input.tx
+000012D4 74 22 20 20 20 29 20 29 0A 20 20 20 20 20 20 20 20 66 6F 72 t"...).).........for
+000012E8 65 61 63 68 28 61 6C 74 65 72 6E 61 74 69 76 65 3B 20 46 69 each(alternative;.Fi
+000012FC 6E 64 57 6F 72 64 73 28 20 70 68 6F 6E 65 20 29 20 29 0A 20 ndWords(.phone.).)..
+00001310 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 66 6C 6E 28 ...........writefln(
+00001324 70 68 6F 6E 65 2C 20 22 3A 20 22 2C 20 61 6C 74 65 72 6E 61 phone,.":.",.alterna
+00001338 74 69 76 65 20 29 3B 0A 7D 0A 0A tive.);.}..
diff --git a/tests/examplefiles/hexdump_hexdump b/tests/examplefiles/hexdump_hexdump
new file mode 100644
index 00000000..06c2e861
--- /dev/null
+++ b/tests/examplefiles/hexdump_hexdump
@@ -0,0 +1,310 @@
+0000000 2f2f 4320 6572 7461 6465 6220 2079 694c
+0000010 6e6f 6c65 6f6c 4c20 6e75 7365 2075 6e61
+0000020 2064 6c70 6361 6465 6920 206e 6874 2065
+0000030 7570 6c62 6369 6420 6d6f 6961 2e6e 2f0a
+0000040 202f 6854 7369 6620 6c69 2065 6168 2073
+0000050 6562 6e65 6d20 646f 6669 6569 2064 7266
+0000060 6d6f 6920 7374 6f20 6972 6967 616e 206c
+0000070 6576 7372 6f69 2e6e 2f0a 202f 7449 6820
+0000080 7361 6220 6565 206e 6f66 6d72 7461 6574
+0000090 2064 6f74 6620 7469 7920 756f 2072 6373
+00000a0 6572 6e65 0a2e 6f6d 7564 656c 7020 6f68
+00000b0 656e 6f6e 203b 2020 2020 2f2f 6f20 7470
+00000c0 6f69 616e 0a6c 6d69 6f70 7472 7320 6474
+00000d0 732e 6474 6f69 203b 2020 2f2f 7720 6972
+00000e0 6574 6c66 206e 2020 2020 690a 706d 726f
+00000f0 2074 7473 2e64 7463 7079 3b65 2020 2f20
+0000100 202f 7369 6964 6967 2074 2020 2020 690a
+0000110 706d 726f 2074 7473 2e64 7473 6572 6d61
+0000120 203b 2f20 202f 7542 6666 7265 6465 6946
+0000130 656c 0a0a 2f2f 4a20 7375 2074 6f66 2072
+0000140 6572 6461 6261 6c69 7469 2079 6928 616d
+0000150 6967 656e 6320 6168 5b72 5b5d 5b5d 6863
+0000160 7261 5d5b 295d 2020 2020 610a 696c 7361
+0000170 6320 6168 5b72 205d 7473 6972 676e 0a3b
+0000180 6c61 6169 2073 7473 6972 676e 5d5b 7320
+0000190 7274 6e69 6167 7272 7961 0a3b 2f0a 2f2f
+00001a0 5320 7274 7069 2073 6f6e 2d6e 6964 6967
+00001b0 2074 6863 7261 6361 6574 7372 6620 6f72
+00001c0 206d 6874 2065 7473 6972 676e 2820 4f43
+00001d0 2957 730a 7274 6e69 2067 7473 6972 4e70
+00001e0 6e6f 6944 6967 2874 6920 206e 7473 6972
+00001f0 676e 6c20 6e69 2065 2029 7b0a 200a 2020
+0000200 7320 7274 6e69 2067 6572 3b74 200a 2020
+0000210 6620 726f 6165 6863 7528 6e69 2074 2c69
+0000220 6320 203b 696c 656e 2029 0a7b 2020 2020
+0000230 2020 2020 2f2f 4520 7272 726f 203a 7473
+0000240 2e64 7463 7079 2e65 7369 6964 6967 2074
+0000250 7461 4320 5c3a 6d64 5c64 7273 5c63 6870
+0000260 626f 736f 735c 6474 635c 7974 6570 642e
+0000270 3328 2937 0a20 2020 2020 2020 2020 2f2f
+0000280 6320 6e6f 6c66 6369 7374 7720 7469 2068
+0000290 7473 2e64 7473 6572 6d61 692e 6473 6769
+00002a0 7469 6120 2074 3a43 645c 646d 735c 6372
+00002b0 705c 6f68 6f62 5c73 7473 5c64 7473 6572
+00002c0 6d61 642e 3228 3239 2934 200a 2020 2020
+00002d0 2020 6920 2066 2128 7473 2e64 7463 7079
+00002e0 2e65 7369 6964 6967 2874 2963 2029 0a7b
+00002f0 2020 2020 2020 2020 2020 2020 6669 2820
+0000300 7221 7465 0a29 2020 2020 2020 2020 2020
+0000310 2020 2020 2020 6572 2074 203d 696c 656e
+0000320 305b 2e2e 5d69 203b 2020 0a20 2020 2020
+0000330 2020 2020 207d 2020 0a20 2020 2020 2020
+0000340 2020 6c65 6573 6920 2066 7228 7465 0a29
+0000350 2020 2020 2020 2020 2020 2020 6572 2074
+0000360 3d7e 6320 203b 2020 0a20 2020 2020 207d
+0000370 2020 0a20 2020 2020 6572 7574 6e72 7220
+0000380 7465 723f 7465 6c3a 6e69 3b65 7d0a 0a0a
+0000390 6e75 7469 6574 7473 7b20 200a 2020 6120
+00003a0 7373 7265 2874 7320 7274 7069 6f4e 446e
+00003b0 6769 7469 2228 7361 6664 2922 3d20 203d
+00003c0 2222 2020 3b29 200a 2020 6120 7373 7265
+00003d0 2874 7320 7274 7069 6f4e 446e 6769 7469
+00003e0 2228 275c 3331 3d2d 2032 6b34 706f 2922
+00003f0 3d20 203d 2220 3331 3432 2022 2920 0a3b
+0000400 0a7d 2f0a 2f2f 4320 6e6f 6576 7472 2073
+0000410 2061 6f77 6472 6920 746e 206f 2061 756e
+0000420 626d 7265 202c 6769 6f6e 6972 676e 6120
+0000430 6c6c 6e20 6e6f 6120 706c 6168 6320 6168
+0000440 6172 7463 7265 2073 0a20 7473 6972 676e
+0000450 7720 726f 5464 4e6f 6d75 2028 6e69 7320
+0000460 7274 6e69 2067 6f77 6472 2920 7b0a 2f0a
+0000470 202f 7274 6e61 6c73 7461 6f69 206e 6174
+0000480 6c62 2065 6f66 2072 6874 2065 6174 6b73
+0000490 6120 2074 6168 646e 630a 6e6f 7473 6320
+00004a0 6168 5b72 3532 5d36 5420 4152 534e 414c
+00004b0 4554 3d20 2020 2020 200a 2020 2220 2020
+00004c0 2020 2020 2020 2020 2020 2020 2020 2020
+00004d0 2020 2020 2020 2020 2020 2020 2020 2022
+00004e0 2f20 202f 2030 2020 200a 2020 2220 2020
+00004f0 2020 2020 2020 2020 2020 2020 2020 3130
+0000500 3332 3534 3736 3938 2020 2020 2020 2022
+0000510 2f20 202f 3233 2020 2020 0a20 2020 2020
+0000520 2022 3735 3336 3430 3939 3136 3837 3135
+0000530 3838 3231 3433 3637 3232 3933 2020 2020
+0000540 2220 2020 2f2f 3620 2034 2020 200a 2020
+0000550 2220 3520 3637 3033 3934 3639 3731 3538
+0000560 3831 3138 3332 3734 3236 3332 2039 2020
+0000570 2020 0a22 2020 2020 2022 2020 2020 2020
+0000580 2020 2020 2020 2020 2020 2020 2020 2020
+0000590 2020 2020 2020 2020 2220 200a 2020 2220
+00005a0 2020 2020 2020 2020 2020 2020 2020 2020
+*
+00005c0 0a22 2020 2020 2022 2020 2020 2020 2020
+00005d0 2020 2020 2020 2020 2020 2020 2020 2020
+00005e0 2020 2020 2020 2220 2020 2020 200a 2020
+00005f0 2220 2020 2020 2020 2020 2020 2020 2020
+0000600 2020 2020 2020 2020 2020 2020 2020 2020
+0000610 2020 3b22 200a 2020 7320 7274 6e69 2067
+0000620 6572 3b74 200a 2020 6620 726f 6165 6863
+0000630 6328 203b 6163 7473 7528 7962 6574 5d5b
+0000640 7729 726f 2964 200a 2020 2020 2020 6920
+0000650 2066 5428 4152 534e 414c 4554 635b 205d
+0000660 3d21 2720 2720 0a29 2020 2020 2020 2020
+0000670 2020 2020 6572 2074 3d7e 5420 4152 534e
+0000680 414c 4554 635b 3b5d 200a 2020 7220 7465
+0000690 7275 206e 6572 3b74 7d0a 0a0a 6e75 7469
+00006a0 6574 7473 7b20 200a 2f2f 5420 7365 2074
+00006b0 6f77 6472 6f54 754e 206d 7375 6e69 2067
+00006c0 6874 2065 6174 6c62 2065 7266 6d6f 7420
+00006d0 6568 7420 7361 206b 6564 6373 6972 7470
+00006e0 6f69 2e6e 200a 7361 6573 7472 2028 3022
+00006f0 3131 3231 3232 3333 3433 3534 3635 3636
+0000700 3737 3837 3838 3939 2239 3d20 0a3d 2020
+0000710 7720 726f 5464 4e6f 6d75 2228 2045 207c
+0000720 204a 204e 2051 207c 2052 2057 2058 207c
+0000730 2044 2053 2059 207c 2046 2054 207c 2041
+0000740 204d 207c 2043 2049 2056 207c 2042 204b
+0000750 2055 207c 204c 204f 2050 207c 2047 2048
+0000760 225a 2929 0a3b 6120 7373 7265 2874 2220
+0000770 3130 3131 3232 3332 3333 3434 3535 3636
+0000780 3736 3737 3838 3938 3939 2022 3d3d 0a20
+0000790 2020 7720 726f 5464 4e6f 6d75 2228 2065
+00007a0 207c 206a 206e 2071 207c 2072 2077 2078
+00007b0 207c 2064 2073 2079 207c 2066 2074 207c
+00007c0 2061 206d 207c 2063 2069 2076 207c 2062
+00007d0 206b 2075 207c 206c 206f 2070 207c 2067
+00007e0 2068 227a 2929 0a3b 6120 7373 7265 2874
+00007f0 2220 3130 3332 3534 3736 3938 2022 3d3d
+0000800 0a20 2020 7720 726f 5464 4e6f 6d75 2228
+0000810 2030 207c 2020 2031 2020 207c 2020 2032
+0000820 2020 207c 2020 2033 2020 207c 3420 2020
+0000830 207c 3520 2020 207c 2020 2036 2020 207c
+0000840 2020 2037 2020 207c 2020 2038 2020 207c
+0000850 2020 2239 2929 0a3b 0a7d 760a 696f 2064
+0000860 616d 6e69 2028 7473 6972 676e 5d5b 6120
+0000870 6772 2073 0a29 0a7b 2020 2020 2f2f 5420
+0000880 6968 2073 7361 6f73 6963 7461 7669 2065
+0000890 7261 6172 2079 616d 7370 6120 6e20 6d75
+00008a0 6562 2072 6f74 6120 206e 7261 6172 2079
+00008b0 666f 7720 726f 7364 202e 2020 0a20 2020
+00008c0 2020 7473 6972 676e 7261 6172 5b79 7473
+00008d0 6972 676e 205d 2020 6e20 6d75 7732 726f
+00008e0 7364 0a3b 200a 2020 6620 726f 6165 6863
+00008f0 7328 7274 6e69 2067 6f77 6472 203b 656e
+0000900 2077 7542 6666 7265 6465 6946 656c 2228
+0000910 6964 7463 6f69 616e 7972 742e 7478 2022
+0000920 2029 0a29 2020 2020 2020 2020 756e 326d
+0000930 6f77 6472 5b73 7720 726f 5464 4e6f 6d75
+0000940 7728 726f 2964 5d20 7e20 203d 6f77 6472
+0000950 642e 7075 203b 2020 2020 2020 2f20 202f
+0000960 756d 7473 6420 7075 0a0a 2020 2020 2f2f
+0000970 202f 6946 646e 2073 6c61 206c 6c61 6574
+0000980 6e72 7461 7669 7365 6620 726f 7420 6568
+0000990 6720 7669 6e65 6e20 6d75 6562 0a72 2020
+00009a0 2020 2f2f 202f 7328 6f68 6c75 2064 6168
+00009b0 6576 6220 6565 206e 7473 6972 7070 6465
+00009c0 6620 6f72 206d 6f6e 2d6e 6964 6967 2074
+00009d0 6863 7261 6361 6574 7372 0a29 2020 2020
+00009e0 7473 6972 676e 7261 6172 2079 465f 6e69
+00009f0 5764 726f 7364 2028 7473 6972 676e 6e20
+0000a00 6d75 6562 7372 202c 6f62 6c6f 6420 6769
+0000a10 7469 6b6f 2920 200a 2020 6920 206e 0a7b
+0000a20 2020 2020 2020 2020 7361 6573 7472 6e28
+0000a30 6d75 6562 7372 6c2e 6e65 7467 2068 203e
+0000a40 3020 3b29 2020 2020 200a 2020 7d20 2020
+0000a50 2020 200a 2020 6f20 7475 7228 7365 6c75
+0000a60 2974 7b20 200a 2020 2020 2020 6620 726f
+0000a70 6165 6863 2820 3b61 7220 7365 6c75 2974
+0000a80 200a 2020 2020 2020 2020 2020 6120 7373
+0000a90 7265 2874 7720 726f 5464 4e6f 6d75 6128
+0000aa0 2029 3d3d 6e20 6d75 6562 7372 2920 0a3b
+0000ab0 2020 2020 207d 2020 0a20 2020 2020 6f62
+0000ac0 7964 7b20 200a 2020 2020 2020 7320 7274
+0000ad0 6e69 6167 7272 7961 7220 7465 0a3b 2020
+0000ae0 2020 2020 2020 6f62 6c6f 6620 756f 646e
+0000af0 6f77 6472 3d20 6620 6c61 6573 0a3b 2020
+0000b00 2020 2020 2020 6f66 2072 7528 6e69 2074
+0000b10 3d74 3b31 7420 3d3c 756e 626d 7265 2e73
+0000b20 656c 676e 6874 203b 2b2b 2974 7b20 200a
+0000b30 2020 2020 2020 2020 2020 6120 7475 206f
+0000b40 6c61 6574 6e72 7461 7669 7365 3d20 6e20
+0000b50 6d75 6562 7372 305b 2e2e 5d74 6920 206e
+0000b60 756e 326d 6f77 6472 3b73 200a 2020 2020
+0000b70 2020 2020 2020 6920 2066 2128 6c61 6574
+0000b80 6e72 7461 7669 7365 0a29 2020 2020 2020
+0000b90 2020 2020 2020 2020 2020 6f63 746e 6e69
+0000ba0 6575 0a3b 2020 2020 2020 2020 2020 2020
+0000bb0 6f66 6e75 7764 726f 2064 203d 7274 6575
+0000bc0 0a3b 2020 2020 2020 2020 2020 2020 6669
+0000bd0 2820 756e 626d 7265 2e73 656c 676e 6874
+0000be0 3e20 2020 2974 7b20 200a 2020 2020 2020
+0000bf0 2020 2020 2020 2020 2f20 202f 6f43 626d
+0000c00 6e69 2065 6c61 206c 7563 7272 6e65 2074
+0000c10 6c61 6574 6e72 7461 7669 7365 7720 7469
+0000c20 2068 6c61 206c 6c61 6574 6e72 7461 7669
+0000c30 7365 2020 2020 0a20 2020 2020 2020 2020
+0000c40 2020 2020 2020 2020 2f2f 6f20 2066 6874
+0000c50 2065 6572 7473 2820 656e 7478 7020 6569
+0000c60 6563 6320 6e61 7320 6174 7472 7720 7469
+0000c70 2068 2061 6964 6967 2974 2020 2020 2020
+0000c80 2020 2020 2020 2020 200a 2020 2020 2020
+0000c90 2020 2020 2020 2020 6620 726f 6165 6863
+0000ca0 2820 3261 203b 465f 6e69 5764 726f 7364
+0000cb0 2028 756e 626d 7265 5b73 2e74 242e 2c5d
+0000cc0 7420 7572 2065 2020 2020 2029 0a29 2020
+0000cd0 2020 2020 2020 2020 2020 2020 2020 2020
+0000ce0 2020 6f66 6572 6361 2868 3161 203b 612a
+0000cf0 746c 7265 616e 6974 6576 2973 200a 2020
+0000d00 2020 2020 2020 2020 2020 2020 2020 2020
+0000d10 2020 2020 6572 2074 3d7e 6120 2031 207e
+0000d20 2022 2022 207e 3261 0a3b 2020 2020 2020
+0000d30 2020 2020 2020 0a7d 2020 2020 2020 2020
+0000d40 2020 2020 6c65 6573 2020 2020 200a 2020
+0000d50 2020 2020 2020 2020 2020 2020 7220 7465
+0000d60 7e20 203d 612a 746c 7265 616e 6974 6576
+0000d70 3b73 2020 2020 2f2f 6120 7070 6e65 2064
+0000d80 6874 7365 2065 6c61 6574 6e72 7461 7669
+0000d90 7365 200a 2020 2020 2020 7d20 200a 2020
+0000da0 2020 2020 2f20 202f 7254 2079 6f74 6b20
+0000db0 6565 2070 2031 6964 6967 2c74 6f20 6c6e
+0000dc0 2079 6669 7720 2765 6572 6120 6c6c 776f
+0000dd0 6465 6120 646e 6e20 206f 746f 6568 0a72
+0000de0 2020 2020 2020 2020 2f2f 6120 746c 7265
+0000df0 616e 6974 6576 2073 6577 6572 6620 756f
+0000e00 646e 200a 2020 2020 2020 2f20 202f 6554
+0000e10 7473 6e69 2067 7222 7465 6c2e 6e65 7467
+0000e20 2268 6d20 6b61 7365 6d20 726f 2065 6573
+0000e30 736e 2065 6874 6e61 7420 7365 6974 676e
+0000e40 2220 6f66 6e75 7764 726f 2264 0a2c 2020
+0000e50 2020 2020 2020 2f2f 6220 7475 7420 6568
+0000e60 6f20 6874 7265 6920 706d 656c 656d 746e
+0000e70 7461 6f69 736e 7320 6565 206d 6f74 6420
+0000e80 206f 756a 7473 7420 6968 2e73 200a 2020
+0000e90 2020 2020 6920 2066 6428 6769 7469 6b6f
+0000ea0 2620 2026 6621 756f 646e 6f77 6472 2029
+0000eb0 207b 2f2f 6572 2e74 656c 676e 6874 3d20
+0000ec0 203d 2030 0a20 2020 2020 2020 2020 2020
+0000ed0 2020 6669 6e28 6d75 6562 7372 6c2e 6e65
+0000ee0 7467 2068 203e 3120 2029 0a7b 2020 2020
+0000ef0 2020 2020 2020 2020 2020 2020 2f2f 4320
+0000f00 6d6f 6962 656e 3120 6420 6769 7469 7720
+0000f10 7469 2068 6c61 206c 6c61 6574 616e 6974
+0000f20 6576 2073 7266 6d6f 7420 6568 7220 7365
+0000f30 2074 2020 0a20 2020 2020 2020 2020 2020
+0000f40 2020 2020 2020 2f2f 2820 656e 7478 7020
+0000f50 6569 6563 6320 6e61 6e20 746f 7320 6174
+0000f60 7472 7720 7469 2068 2061 6964 6967 2974
+0000f70 2020 2020 2020 2020 2020 200a 2020 2020
+0000f80 2020 2020 2020 2020 2020 6620 726f 6165
+0000f90 6863 2820 3b61 5f20 6946 646e 6f57 6472
+0000fa0 2873 6e20 6d75 6562 7372 315b 2e2e 5d24
+0000fb0 202c 6166 736c 2065 2029 0a29 2020 2020
+0000fc0 2020 2020 2020 2020 2020 2020 2020 2020
+0000fd0 6572 2074 3d7e 6e20 6d75 6562 7372 305b
+0000fe0 2e2e 5d31 7e20 2220 2220 7e20 6120 0a3b
+0000ff0 2020 2020 2020 2020 2020 2020 207d 2020
+0001000 0a20 2020 2020 2020 2020 2020 2020 6c65
+0001010 6573 2020 2020 200a 2020 2020 2020 2020
+0001020 2020 2020 2020 7220 7465 7e20 203d 756e
+0001030 626d 7265 5b73 2e30 312e 3b5d 2020 2020
+0001040 2f2f 6a20 7375 2074 7061 6570 646e 7420
+0001050 6968 2073 6964 6967 2074 2020 2020 2020
+0001060 2020 2020 2020 200a 2020 2020 2020 7d20
+0001070 2020 2020 200a 2020 2020 2020 7220 7465
+0001080 7275 206e 6572 3b74 200a 2020 7d20 0a0a
+0001090 2020 2020 2f2f 202f 5428 6968 2073 7566
+00010a0 636e 6974 6e6f 7720 7361 6920 6c6e 6e69
+00010b0 6465 6920 206e 6874 2065 726f 6769 6e69
+00010c0 6c61 7020 6f72 7267 6d61 2029 200a 2020
+00010d0 2f20 2f2f 4620 6e69 7364 6120 6c6c 6120
+00010e0 746c 7265 616e 6974 6576 2073 6f66 2072
+00010f0 6874 2065 6967 6576 206e 6870 6e6f 2065
+0001100 756e 626d 7265 0a20 2020 2020 2f2f 202f
+0001110 6552 7574 6e72 3a73 6120 7272 7961 6f20
+0001120 2066 7473 6972 676e 2073 200a 2020 7320
+0001130 7274 6e69 6167 7272 7961 4620 6e69 5764
+0001140 726f 7364 2028 7473 6972 676e 7020 6f68
+0001150 656e 6e5f 6d75 6562 2072 0a29 2020 2020
+0001160 0a7b 2020 2020 2020 2020 6669 2820 7021
+0001170 6f68 656e 6e5f 6d75 6562 2e72 656c 676e
+0001180 6874 0a29 2020 2020 2020 2020 2020 2020
+0001190 6572 7574 6e72 6e20 6c75 3b6c 200a 2020
+00011a0 2020 2020 2f20 202f 7453 6972 2070 6874
+00011b0 2065 6f6e 2d6e 6964 6967 2074 6863 7261
+00011c0 6361 6574 7372 6620 6f72 206d 6874 2065
+00011d0 6870 6e6f 2065 756e 626d 7265 202c 6e61
+00011e0 0a64 2020 2020 2020 2020 2f2f 7020 7361
+00011f0 2073 7469 7420 206f 6874 2065 6572 7563
+0001200 7372 7669 2065 7566 636e 6974 6e6f 2820
+0001210 656c 6461 6e69 2067 6964 6967 2074 7369
+0001220 6120 6c6c 776f 6465 0a29 2020 2020 2020
+0001230 2020 6572 7574 6e72 5f20 6946 646e 6f57
+0001240 6472 2873 7320 7274 7069 6f4e 446e 6769
+0001250 7469 7028 6f68 656e 6e5f 6d75 6562 2972
+0001260 202c 7274 6575 2920 203b 2020 0a20 2020
+0001270 2020 207d 2020 0a20 2020 2020 200a 2020
+0001280 2f20 202f 6552 6461 7420 6568 7020 6f68
+0001290 656e 6e20 6d75 6562 7372 2020 2020 0a20
+00012a0 2020 2020 6f66 6572 6361 2868 7473 6972
+00012b0 676e 7020 6f68 656e 203b 656e 2077 7542
+00012c0 6666 7265 6465 6946 656c 2228 6e69 7570
+00012d0 2e74 7874 2274 2020 2920 2920 200a 2020
+00012e0 2020 2020 6620 726f 6165 6863 6128 746c
+00012f0 7265 616e 6974 6576 203b 6946 646e 6f57
+0001300 6472 2873 7020 6f68 656e 2920 2920 200a
+0001310 2020 2020 2020 2020 2020 7720 6972 6574
+0001320 6c66 286e 6870 6e6f 2c65 2220 203a 2c22
+0001330 6120 746c 7265 616e 6974 6576 2920 0a3b
+0001340 0a7d 000a
+0001343
diff --git a/tests/examplefiles/hexdump_od b/tests/examplefiles/hexdump_od
new file mode 100644
index 00000000..a407aef0
--- /dev/null
+++ b/tests/examplefiles/hexdump_od
@@ -0,0 +1,310 @@
+0000000 2f 2f 20 43 72 65 61 74 65 64 20 62 79 20 4c 69 >// Created by Li<
+0000020 6f 6e 65 6c 6c 6f 20 4c 75 6e 65 73 75 20 61 6e >onello Lunesu an<
+0000040 64 20 70 6c 61 63 65 64 20 69 6e 20 74 68 65 20 >d placed in the <
+0000060 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2e 0a 2f >public domain../<
+0000100 2f 20 54 68 69 73 20 66 69 6c 65 20 68 61 73 20 >/ This file has <
+0000120 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 66 72 >been modified fr<
+0000140 6f 6d 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 >om its original <
+0000160 76 65 72 73 69 6f 6e 2e 0a 2f 2f 20 49 74 20 68 >version..// It h<
+0000200 61 73 20 62 65 65 6e 20 66 6f 72 6d 61 74 74 65 >as been formatte<
+0000220 64 20 74 6f 20 66 69 74 20 79 6f 75 72 20 73 63 >d to fit your sc<
+0000240 72 65 65 6e 2e 0a 6d 6f 64 75 6c 65 20 70 68 6f >reen..module pho<
+0000260 6e 65 6e 6f 3b 20 20 20 20 20 2f 2f 20 6f 70 74 >neno; // opt<
+0000300 69 6f 6e 61 6c 0a 69 6d 70 6f 72 74 20 73 74 64 >ional.import std<
+0000320 2e 73 74 64 69 6f 3b 20 20 20 2f 2f 20 77 72 69 >.stdio; // wri<
+0000340 74 65 66 6c 6e 20 20 20 20 20 0a 69 6d 70 6f 72 >tefln .impor<
+0000360 74 20 73 74 64 2e 63 74 79 70 65 3b 20 20 20 2f >t std.ctype; /<
+0000400 2f 20 69 73 64 69 67 69 74 20 20 20 20 20 0a 69 >/ isdigit .i<
+0000420 6d 70 6f 72 74 20 73 74 64 2e 73 74 72 65 61 6d >mport std.stream<
+0000440 3b 20 20 2f 2f 20 42 75 66 66 65 72 65 64 46 69 >; // BufferedFi<
+0000460 6c 65 0a 0a 2f 2f 20 4a 75 73 74 20 66 6f 72 20 >le..// Just for <
+0000500 72 65 61 64 61 62 69 6c 69 74 79 20 28 69 6d 61 >readability (ima<
+0000520 67 69 6e 65 20 63 68 61 72 5b 5d 5b 5d 5b 63 68 >gine char[][][ch<
+0000540 61 72 5b 5d 5d 29 20 20 20 20 0a 61 6c 69 61 73 >ar[]]) .alias<
+0000560 20 63 68 61 72 5b 5d 20 73 74 72 69 6e 67 3b 0a > char[] string;.<
+0000600 61 6c 69 61 73 20 73 74 72 69 6e 67 5b 5d 20 73 >alias string[] s<
+0000620 74 72 69 6e 67 61 72 72 61 79 3b 0a 0a 2f 2f 2f >tringarray;..///<
+0000640 20 53 74 72 69 70 73 20 6e 6f 6e 2d 64 69 67 69 > Strips non-digi<
+0000660 74 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f >t characters fro<
+0000700 6d 20 74 68 65 20 73 74 72 69 6e 67 20 28 43 4f >m the string (CO<
+0000720 57 29 0a 73 74 72 69 6e 67 20 73 74 72 69 70 4e >W).string stripN<
+0000740 6f 6e 44 69 67 69 74 28 20 69 6e 20 73 74 72 69 >onDigit( in stri<
+0000760 6e 67 20 6c 69 6e 65 20 29 20 0a 7b 0a 20 20 20 >ng line ) .{. <
+0001000 20 73 74 72 69 6e 67 20 72 65 74 3b 0a 20 20 20 > string ret;. <
+0001020 20 66 6f 72 65 61 63 68 28 75 69 6e 74 20 69 2c > foreach(uint i,<
+0001040 20 63 3b 20 6c 69 6e 65 29 20 7b 0a 20 20 20 20 > c; line) {. <
+0001060 20 20 20 20 2f 2f 20 45 72 72 6f 72 3a 20 73 74 > // Error: st<
+0001100 64 2e 63 74 79 70 65 2e 69 73 64 69 67 69 74 20 >d.ctype.isdigit <
+0001120 61 74 20 43 3a 5c 64 6d 64 5c 73 72 63 5c 70 68 >at C:\dmd\src\ph<
+0001140 6f 62 6f 73 5c 73 74 64 5c 63 74 79 70 65 2e 64 >obos\std\ctype.d<
+0001160 28 33 37 29 20 0a 20 20 20 20 20 20 20 20 2f 2f >(37) . //<
+0001200 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 > conflicts with <
+0001220 73 74 64 2e 73 74 72 65 61 6d 2e 69 73 64 69 67 >std.stream.isdig<
+0001240 69 74 20 61 74 20 43 3a 5c 64 6d 64 5c 73 72 63 >it at C:\dmd\src<
+0001260 5c 70 68 6f 62 6f 73 5c 73 74 64 5c 73 74 72 65 >\phobos\std\stre<
+0001300 61 6d 2e 64 28 32 39 32 34 29 0a 20 20 20 20 20 >am.d(2924). <
+0001320 20 20 20 69 66 20 28 21 73 74 64 2e 63 74 79 70 > if (!std.ctyp<
+0001340 65 2e 69 73 64 69 67 69 74 28 63 29 29 20 7b 0a >e.isdigit(c)) {.<
+0001360 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 > if (<
+0001400 21 72 65 74 29 0a 20 20 20 20 20 20 20 20 20 20 >!ret). <
+0001420 20 20 20 20 20 20 72 65 74 20 3d 20 6c 69 6e 65 > ret = line<
+0001440 5b 30 2e 2e 69 5d 3b 20 20 20 20 0a 20 20 20 20 >[0..i]; . <
+0001460 20 20 20 20 7d 20 20 20 20 0a 20 20 20 20 20 20 > } . <
+0001500 20 20 65 6c 73 65 20 69 66 20 28 72 65 74 29 0a > else if (ret).<
+0001520 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 20 > ret <
+0001540 7e 3d 20 63 3b 20 20 20 20 0a 20 20 20 20 7d 20 >~= c; . } <
+0001560 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 > . return r<
+0001600 65 74 3f 72 65 74 3a 6c 69 6e 65 3b 0a 7d 0a 0a >et?ret:line;.}..<
+0001620 75 6e 69 74 74 65 73 74 20 7b 0a 20 20 20 20 61 >unittest {. a<
+0001640 73 73 65 72 74 28 20 73 74 72 69 70 4e 6f 6e 44 >ssert( stripNonD<
+0001660 69 67 69 74 28 22 61 73 64 66 22 29 20 3d 3d 20 >igit("asdf") == <
+0001700 22 22 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 >"" );. asser<
+0001720 74 28 20 73 74 72 69 70 4e 6f 6e 44 69 67 69 74 >t( stripNonDigit<
+0001740 28 22 5c 27 31 33 2d 3d 32 20 34 6b 6f 70 22 29 >("\'13-=2 4kop")<
+0001760 20 3d 3d 20 20 22 31 33 32 34 22 20 20 29 3b 0a > == "1324" );.<
+0002000 7d 0a 0a 2f 2f 2f 20 43 6f 6e 76 65 72 74 73 20 >}../// Converts <
+0002020 61 20 77 6f 72 64 20 69 6e 74 6f 20 61 20 6e 75 >a word into a nu<
+0002040 6d 62 65 72 2c 20 69 67 6e 6f 72 69 6e 67 20 61 >mber, ignoring a<
+0002060 6c 6c 20 6e 6f 6e 20 61 6c 70 68 61 20 63 68 61 >ll non alpha cha<
+0002100 72 61 63 74 65 72 73 20 20 0a 73 74 72 69 6e 67 >racters .string<
+0002120 20 77 6f 72 64 54 6f 4e 75 6d 28 20 69 6e 20 73 > wordToNum( in s<
+0002140 74 72 69 6e 67 20 77 6f 72 64 20 29 0a 7b 0a 2f >tring word ).{./<
+0002160 2f 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 61 >/ translation ta<
+0002200 62 6c 65 20 66 6f 72 20 74 68 65 20 74 61 73 6b >ble for the task<
+0002220 20 61 74 20 68 61 6e 64 0a 63 6f 6e 73 74 20 63 > at hand.const c<
+0002240 68 61 72 5b 32 35 36 5d 20 54 52 41 4e 53 4c 41 >har[256] TRANSLA<
+0002260 54 45 20 3d 20 20 20 20 0a 20 20 20 20 22 20 20 >TE = . " <
+0002300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+0002320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 > " <
+0002340 20 2f 2f 20 30 20 20 20 0a 20 20 20 20 22 20 20 > // 0 . " <
+0002360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 31 > 01<
+0002400 32 33 34 35 36 37 38 39 20 20 20 20 20 20 22 20 >23456789 " <
+0002420 20 2f 2f 20 33 32 20 20 20 20 20 0a 20 20 20 20 > // 32 . <
+0002440 22 20 35 37 36 33 30 34 39 39 36 31 37 38 35 31 >" 57630499617851<
+0002460 38 38 31 32 33 34 37 36 32 32 33 39 20 20 20 20 >881234762239 <
+0002500 20 22 20 20 2f 2f 20 36 34 20 20 20 0a 20 20 20 > " // 64 . <
+0002520 20 22 20 35 37 36 33 30 34 39 39 36 31 37 38 35 > " 5763049961785<
+0002540 31 38 38 31 32 33 34 37 36 32 32 33 39 20 20 20 >1881234762239 <
+0002560 20 20 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 > ". " <
+0002600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+0002620 20 20 20 20 20 20 20 20 20 22 0a 20 20 20 20 22 > ". "<
+0002640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+*
+0002700 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 >". " <
+0002720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+0002740 20 20 20 20 20 20 20 22 20 20 20 20 0a 20 20 20 > " . <
+0002760 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > " <
+0003000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+0003020 20 20 22 3b 0a 20 20 20 20 73 74 72 69 6e 67 20 > ";. string <
+0003040 72 65 74 3b 0a 20 20 20 20 66 6f 72 65 61 63 68 >ret;. foreach<
+0003060 28 63 3b 20 63 61 73 74 28 75 62 79 74 65 5b 5d >(c; cast(ubyte[]<
+0003100 29 77 6f 72 64 29 0a 20 20 20 20 20 20 20 20 69 >)word). i<
+0003120 66 20 28 54 52 41 4e 53 4c 41 54 45 5b 63 5d 20 >f (TRANSLATE[c] <
+0003140 21 3d 20 27 20 27 29 0a 20 20 20 20 20 20 20 20 >!= ' '). <
+0003160 20 20 20 20 72 65 74 20 7e 3d 20 54 52 41 4e 53 > ret ~= TRANS<
+0003200 4c 41 54 45 5b 63 5d 3b 0a 20 20 20 20 72 65 74 >LATE[c];. ret<
+0003220 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 75 6e 69 74 >urn ret;.}..unit<
+0003240 74 65 73 74 20 7b 0a 20 2f 2f 20 54 65 73 74 20 >test {. // Test <
+0003260 77 6f 72 64 54 6f 4e 75 6d 20 75 73 69 6e 67 20 >wordToNum using <
+0003300 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 >the table from t<
+0003320 68 65 20 74 61 73 6b 20 64 65 73 63 72 69 70 74 >he task descript<
+0003340 69 6f 6e 2e 0a 20 61 73 73 65 72 74 28 20 22 30 >ion.. assert( "0<
+0003360 31 31 31 32 32 32 33 33 33 34 34 35 35 36 36 36 >1112223334455666<
+0003400 37 37 37 38 38 38 39 39 39 22 20 3d 3d 0a 20 20 >777888999" ==. <
+0003420 20 77 6f 72 64 54 6f 4e 75 6d 28 22 45 20 7c 20 > wordToNum("E | <
+0003440 4a 20 4e 20 51 20 7c 20 52 20 57 20 58 20 7c 20 >J N Q | R W X | <
+0003460 44 20 53 20 59 20 7c 20 46 20 54 20 7c 20 41 20 >D S Y | F T | A <
+0003500 4d 20 7c 20 43 20 49 20 56 20 7c 20 42 20 4b 20 >M | C I V | B K <
+0003520 55 20 7c 20 4c 20 4f 20 50 20 7c 20 47 20 48 20 >U | L O P | G H <
+0003540 5a 22 29 29 3b 0a 20 61 73 73 65 72 74 28 20 22 >Z"));. assert( "<
+0003560 30 31 31 31 32 32 32 33 33 33 34 34 35 35 36 36 >0111222333445566<
+0003600 36 37 37 37 38 38 38 39 39 39 22 20 3d 3d 20 0a >6777888999" == .<
+0003620 20 20 20 77 6f 72 64 54 6f 4e 75 6d 28 22 65 20 > wordToNum("e <
+0003640 7c 20 6a 20 6e 20 71 20 7c 20 72 20 77 20 78 20 >| j n q | r w x <
+0003660 7c 20 64 20 73 20 79 20 7c 20 66 20 74 20 7c 20 >| d s y | f t | <
+0003700 61 20 6d 20 7c 20 63 20 69 20 76 20 7c 20 62 20 >a m | c i v | b <
+0003720 6b 20 75 20 7c 20 6c 20 6f 20 70 20 7c 20 67 20 >k u | l o p | g <
+0003740 68 20 7a 22 29 29 3b 0a 20 61 73 73 65 72 74 28 >h z"));. assert(<
+0003760 20 22 30 31 32 33 34 35 36 37 38 39 22 20 3d 3d > "0123456789" ==<
+0004000 20 0a 20 20 20 77 6f 72 64 54 6f 4e 75 6d 28 22 > . wordToNum("<
+0004020 30 20 7c 20 20 20 31 20 20 20 7c 20 20 20 32 20 >0 | 1 | 2 <
+0004040 20 20 7c 20 20 20 33 20 20 20 7c 20 20 34 20 20 > | 3 | 4 <
+0004060 7c 20 20 35 20 20 7c 20 20 20 36 20 20 20 7c 20 >| 5 | 6 | <
+0004100 20 20 37 20 20 20 7c 20 20 20 38 20 20 20 7c 20 > 7 | 8 | <
+0004120 20 20 39 22 29 29 3b 0a 7d 0a 0a 76 6f 69 64 20 > 9"));.}..void <
+0004140 6d 61 69 6e 28 20 73 74 72 69 6e 67 5b 5d 20 61 >main( string[] a<
+0004160 72 67 73 20 29 0a 7b 0a 20 20 20 20 2f 2f 20 54 >rgs ).{. // T<
+0004200 68 69 73 20 61 73 73 6f 63 69 61 74 69 76 65 20 >his associative <
+0004220 61 72 72 61 79 20 6d 61 70 73 20 61 20 6e 75 6d >array maps a num<
+0004240 62 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 >ber to an array <
+0004260 6f 66 20 77 6f 72 64 73 2e 20 20 20 20 0a 20 20 >of words. . <
+0004300 20 20 73 74 72 69 6e 67 61 72 72 61 79 5b 73 74 > stringarray[st<
+0004320 72 69 6e 67 5d 20 20 20 20 6e 75 6d 32 77 6f 72 >ring] num2wor<
+0004340 64 73 3b 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 >ds;.. foreach<
+0004360 28 73 74 72 69 6e 67 20 77 6f 72 64 3b 20 6e 65 >(string word; ne<
+0004400 77 20 42 75 66 66 65 72 65 64 46 69 6c 65 28 22 >w BufferedFile("<
+0004420 64 69 63 74 69 6f 6e 61 72 79 2e 74 78 74 22 20 >dictionary.txt" <
+0004440 29 20 29 0a 20 20 20 20 20 20 20 20 6e 75 6d 32 >) ). num2<
+0004460 77 6f 72 64 73 5b 20 77 6f 72 64 54 6f 4e 75 6d >words[ wordToNum<
+0004500 28 77 6f 72 64 29 20 5d 20 7e 3d 20 77 6f 72 64 >(word) ] ~= word<
+0004520 2e 64 75 70 3b 20 20 20 20 20 20 20 20 2f 2f 20 >.dup; // <
+0004540 6d 75 73 74 20 64 75 70 0a 0a 20 20 20 20 2f 2f >must dup.. //<
+0004560 2f 20 46 69 6e 64 73 20 61 6c 6c 20 61 6c 74 65 >/ Finds all alte<
+0004600 72 6e 61 74 69 76 65 73 20 66 6f 72 20 74 68 65 >rnatives for the<
+0004620 20 67 69 76 65 6e 20 6e 75 6d 62 65 72 0a 20 20 > given number. <
+0004640 20 20 2f 2f 2f 20 28 73 68 6f 75 6c 64 20 68 61 > /// (should ha<
+0004660 76 65 20 62 65 65 6e 20 73 74 72 69 70 70 65 64 >ve been stripped<
+0004700 20 66 72 6f 6d 20 6e 6f 6e 2d 64 69 67 69 74 20 > from non-digit <
+0004720 63 68 61 72 61 63 74 65 72 73 29 0a 20 20 20 20 >characters). <
+0004740 73 74 72 69 6e 67 61 72 72 61 79 20 5f 46 69 6e >stringarray _Fin<
+0004760 64 57 6f 72 64 73 28 20 73 74 72 69 6e 67 20 6e >dWords( string n<
+0005000 75 6d 62 65 72 73 2c 20 62 6f 6f 6c 20 64 69 67 >umbers, bool dig<
+0005020 69 74 6f 6b 20 29 0a 20 20 20 20 69 6e 20 7b 0a >itok ). in {.<
+0005040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6e > assert(n<
+0005060 75 6d 62 65 72 73 2e 6c 65 6e 67 74 68 20 3e 20 >umbers.length > <
+0005100 20 30 29 3b 20 20 20 20 0a 20 20 20 20 7d 20 20 > 0); . } <
+0005120 20 20 0a 20 20 20 20 6f 75 74 28 72 65 73 75 6c > . out(resul<
+0005140 74 29 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 >t) {. for<
+0005160 65 61 63 68 20 28 61 3b 20 72 65 73 75 6c 74 29 >each (a; result)<
+0005200 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 >. ass<
+0005220 65 72 74 28 20 77 6f 72 64 54 6f 4e 75 6d 28 61 >ert( wordToNum(a<
+0005240 29 20 3d 3d 20 6e 75 6d 62 65 72 73 20 29 3b 0a >) == numbers );.<
+0005260 20 20 20 20 7d 20 20 20 20 0a 20 20 20 20 62 6f > } . bo<
+0005300 64 79 20 7b 0a 20 20 20 20 20 20 20 20 73 74 72 >dy {. str<
+0005320 69 6e 67 61 72 72 61 79 20 72 65 74 3b 0a 20 20 >ingarray ret;. <
+0005340 20 20 20 20 20 20 62 6f 6f 6c 20 66 6f 75 6e 64 > bool found<
+0005360 77 6f 72 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 >word = false;. <
+0005400 20 20 20 20 20 20 66 6f 72 20 28 75 69 6e 74 20 > for (uint <
+0005420 74 3d 31 3b 20 74 3c 3d 6e 75 6d 62 65 72 73 2e >t=1; t<=numbers.<
+0005440 6c 65 6e 67 74 68 3b 20 2b 2b 74 29 20 7b 0a 20 >length; ++t) {. <
+0005460 20 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 20 > auto <
+0005500 61 6c 74 65 72 6e 61 74 69 76 65 73 20 3d 20 6e >alternatives = n<
+0005520 75 6d 62 65 72 73 5b 30 2e 2e 74 5d 20 69 6e 20 >umbers[0..t] in <
+0005540 6e 75 6d 32 77 6f 72 64 73 3b 0a 20 20 20 20 20 >num2words;. <
+0005560 20 20 20 20 20 20 20 69 66 20 28 21 61 6c 74 65 > if (!alte<
+0005600 72 6e 61 74 69 76 65 73 29 0a 20 20 20 20 20 20 >rnatives). <
+0005620 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e > contin<
+0005640 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 >ue;. <
+0005660 66 6f 75 6e 64 77 6f 72 64 20 3d 20 74 72 75 65 >foundword = true<
+0005700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 >;. if<
+0005720 20 28 6e 75 6d 62 65 72 73 2e 6c 65 6e 67 74 68 > (numbers.length<
+0005740 20 3e 20 20 74 29 20 7b 0a 20 20 20 20 20 20 20 > > t) {. <
+0005760 20 20 20 20 20 20 20 20 20 2f 2f 20 43 6f 6d 62 > // Comb<
+0006000 69 6e 65 20 61 6c 6c 20 63 75 72 72 65 6e 74 20 >ine all current <
+0006020 61 6c 74 65 72 6e 61 74 69 76 65 73 20 77 69 74 >alternatives wit<
+0006040 68 20 61 6c 6c 20 61 6c 74 65 72 6e 61 74 69 76 >h all alternativ<
+0006060 65 73 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 >es . <
+0006100 20 20 20 20 20 20 20 20 2f 2f 20 6f 66 20 74 68 > // of th<
+0006120 65 20 72 65 73 74 20 28 6e 65 78 74 20 70 69 65 >e rest (next pie<
+0006140 63 65 20 63 61 6e 20 73 74 61 72 74 20 77 69 74 >ce can start wit<
+0006160 68 20 61 20 64 69 67 69 74 29 20 20 20 20 20 20 >h a digit) <
+0006200 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 > . <
+0006220 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 > foreach<
+0006240 20 28 61 32 3b 20 5f 46 69 6e 64 57 6f 72 64 73 > (a2; _FindWords<
+0006260 28 20 6e 75 6d 62 65 72 73 5b 74 2e 2e 24 5d 2c >( numbers[t..$],<
+0006300 20 74 72 75 65 20 20 20 20 20 29 20 29 0a 20 20 > true ) ). <
+0006320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+0006340 20 20 66 6f 72 65 61 63 68 28 61 31 3b 20 2a 61 > foreach(a1; *a<
+0006360 6c 74 65 72 6e 61 74 69 76 65 73 29 0a 20 20 20 >lternatives). <
+0006400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+0006420 20 20 20 20 72 65 74 20 7e 3d 20 61 31 20 7e 20 > ret ~= a1 ~ <
+0006440 22 20 22 20 7e 20 61 32 3b 0a 20 20 20 20 20 20 >" " ~ a2;. <
+0006460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 > }. <
+0006500 20 20 20 20 65 6c 73 65 20 20 20 20 0a 20 20 20 > else . <
+0006520 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 > ret<
+0006540 20 7e 3d 20 2a 61 6c 74 65 72 6e 61 74 69 76 65 > ~= *alternative<
+0006560 73 3b 20 20 20 20 2f 2f 20 61 70 70 65 6e 64 20 >s; // append <
+0006600 74 68 65 73 65 20 61 6c 74 65 72 6e 61 74 69 76 >these alternativ<
+0006620 65 73 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 >es. }. <
+0006640 20 20 20 20 20 2f 2f 20 54 72 79 20 74 6f 20 6b > // Try to k<
+0006660 65 65 70 20 31 20 64 69 67 69 74 2c 20 6f 6e 6c >eep 1 digit, onl<
+0006700 79 20 69 66 20 77 65 27 72 65 20 61 6c 6c 6f 77 >y if we're allow<
+0006720 65 64 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 0a >ed and no other.<
+0006740 20 20 20 20 20 20 20 20 2f 2f 20 61 6c 74 65 72 > // alter<
+0006760 6e 61 74 69 76 65 73 20 77 65 72 65 20 66 6f 75 >natives were fou<
+0007000 6e 64 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 65 >nd. // Te<
+0007020 73 74 69 6e 67 20 22 72 65 74 2e 6c 65 6e 67 74 >sting "ret.lengt<
+0007040 68 22 20 6d 61 6b 65 73 20 6d 6f 72 65 20 73 65 >h" makes more se<
+0007060 6e 73 65 20 74 68 61 6e 20 74 65 73 74 69 6e 67 >nse than testing<
+0007100 20 22 66 6f 75 6e 64 77 6f 72 64 22 2c 0a 20 20 > "foundword",. <
+0007120 20 20 20 20 20 20 2f 2f 20 62 75 74 20 74 68 65 > // but the<
+0007140 20 6f 74 68 65 72 20 69 6d 70 6c 65 6d 65 6e 74 > other implement<
+0007160 61 74 69 6f 6e 73 20 73 65 65 6d 20 74 6f 20 64 >ations seem to d<
+0007200 6f 20 6a 75 73 74 20 74 68 69 73 2e 0a 20 20 20 >o just this.. <
+0007220 20 20 20 20 20 69 66 20 28 64 69 67 69 74 6f 6b > if (digitok<
+0007240 20 26 26 20 21 66 6f 75 6e 64 77 6f 72 64 29 20 > && !foundword) <
+0007260 7b 20 2f 2f 72 65 74 2e 6c 65 6e 67 74 68 20 3d >{ //ret.length =<
+0007300 3d 20 30 20 20 0a 20 20 20 20 20 20 20 20 20 20 >= 0 . <
+0007320 20 20 69 66 28 6e 75 6d 62 65 72 73 2e 6c 65 6e > if(numbers.len<
+0007340 67 74 68 20 3e 20 20 31 29 20 7b 0a 20 20 20 20 >gth > 1) {. <
+0007360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43 > // C<
+0007400 6f 6d 62 69 6e 65 20 31 20 64 69 67 69 74 20 77 >ombine 1 digit w<
+0007420 69 74 68 20 61 6c 6c 20 61 6c 74 65 6e 61 74 69 >ith all altenati<
+0007440 76 65 73 20 66 72 6f 6d 20 74 68 65 20 72 65 73 >ves from the res<
+0007460 74 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 >t . <
+0007500 20 20 20 20 20 20 2f 2f 20 28 6e 65 78 74 20 70 > // (next p<
+0007520 69 65 63 65 20 63 61 6e 20 6e 6f 74 20 73 74 61 >iece can not sta<
+0007540 72 74 20 77 69 74 68 20 61 20 64 69 67 69 74 29 >rt with a digit)<
+0007560 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 > . <
+0007600 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 > forea<
+0007620 63 68 20 28 61 3b 20 5f 46 69 6e 64 57 6f 72 64 >ch (a; _FindWord<
+0007640 73 28 20 6e 75 6d 62 65 72 73 5b 31 2e 2e 24 5d >s( numbers[1..$]<
+0007660 2c 20 66 61 6c 73 65 20 29 20 29 0a 20 20 20 20 >, false ) ). <
+0007700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 > <
+0007720 72 65 74 20 7e 3d 20 6e 75 6d 62 65 72 73 5b 30 >ret ~= numbers[0<
+0007740 2e 2e 31 5d 20 7e 20 22 20 22 20 7e 20 61 3b 0a >..1] ~ " " ~ a;.<
+0007760 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 20 20 > } <
+0010000 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c > . el<
+0010020 73 65 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 >se . <
+0010040 20 20 20 20 20 20 20 72 65 74 20 7e 3d 20 6e 75 > ret ~= nu<
+0010060 6d 62 65 72 73 5b 30 2e 2e 31 5d 3b 20 20 20 20 >mbers[0..1]; <
+0010100 2f 2f 20 6a 75 73 74 20 61 70 70 65 6e 64 20 74 >// just append t<
+0010120 68 69 73 20 64 69 67 69 74 20 20 20 20 20 20 20 >his digit <
+0010140 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d > . }<
+0010160 20 20 20 20 0a 20 20 20 20 20 20 20 20 72 65 74 > . ret<
+0010200 75 72 6e 20 72 65 74 3b 0a 20 20 20 20 7d 0a 0a >urn ret;. }..<
+0010220 20 20 20 20 2f 2f 2f 20 28 54 68 69 73 20 66 75 > /// (This fu<
+0010240 6e 63 74 69 6f 6e 20 77 61 73 20 69 6e 6c 69 6e >nction was inlin<
+0010260 65 64 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e >ed in the origin<
+0010300 61 6c 20 70 72 6f 67 72 61 6d 29 20 0a 20 20 20 >al program) . <
+0010320 20 2f 2f 2f 20 46 69 6e 64 73 20 61 6c 6c 20 61 > /// Finds all a<
+0010340 6c 74 65 72 6e 61 74 69 76 65 73 20 66 6f 72 20 >lternatives for <
+0010360 74 68 65 20 67 69 76 65 6e 20 70 68 6f 6e 65 20 >the given phone <
+0010400 6e 75 6d 62 65 72 20 0a 20 20 20 20 2f 2f 2f 20 >number . /// <
+0010420 52 65 74 75 72 6e 73 3a 20 61 72 72 61 79 20 6f >Returns: array o<
+0010440 66 20 73 74 72 69 6e 67 73 20 0a 20 20 20 20 73 >f strings . s<
+0010460 74 72 69 6e 67 61 72 72 61 79 20 46 69 6e 64 57 >tringarray FindW<
+0010500 6f 72 64 73 28 20 73 74 72 69 6e 67 20 70 68 6f >ords( string pho<
+0010520 6e 65 5f 6e 75 6d 62 65 72 20 29 0a 20 20 20 20 >ne_number ). <
+0010540 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 70 >{. if (!p<
+0010560 68 6f 6e 65 5f 6e 75 6d 62 65 72 2e 6c 65 6e 67 >hone_number.leng<
+0010600 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 >th). <
+0010620 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 >return null;. <
+0010640 20 20 20 20 20 2f 2f 20 53 74 72 69 70 20 74 68 > // Strip th<
+0010660 65 20 6e 6f 6e 2d 64 69 67 69 74 20 63 68 61 72 >e non-digit char<
+0010700 61 63 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 >acters from the <
+0010720 70 68 6f 6e 65 20 6e 75 6d 62 65 72 2c 20 61 6e >phone number, an<
+0010740 64 0a 20 20 20 20 20 20 20 20 2f 2f 20 70 61 73 >d. // pas<
+0010760 73 20 69 74 20 74 6f 20 74 68 65 20 72 65 63 75 >s it to the recu<
+0011000 72 73 69 76 65 20 66 75 6e 63 74 69 6f 6e 20 28 >rsive function (<
+0011020 6c 65 61 64 69 6e 67 20 64 69 67 69 74 20 69 73 >leading digit is<
+0011040 20 61 6c 6c 6f 77 65 64 29 0a 20 20 20 20 20 20 > allowed). <
+0011060 20 20 72 65 74 75 72 6e 20 5f 46 69 6e 64 57 6f > return _FindWo<
+0011100 72 64 73 28 20 73 74 72 69 70 4e 6f 6e 44 69 67 >rds( stripNonDig<
+0011120 69 74 28 70 68 6f 6e 65 5f 6e 75 6d 62 65 72 29 >it(phone_number)<
+0011140 2c 20 74 72 75 65 20 29 3b 20 20 20 20 0a 20 20 >, true ); . <
+0011160 20 20 7d 20 20 20 20 0a 20 20 20 20 0a 20 20 20 > } . . <
+0011200 20 2f 2f 20 52 65 61 64 20 74 68 65 20 70 68 6f > // Read the pho<
+0011220 6e 65 20 6e 75 6d 62 65 72 73 20 20 20 20 20 0a >ne numbers .<
+0011240 20 20 20 20 66 6f 72 65 61 63 68 28 73 74 72 69 > foreach(stri<
+0011260 6e 67 20 70 68 6f 6e 65 3b 20 6e 65 77 20 42 75 >ng phone; new Bu<
+0011300 66 66 65 72 65 64 46 69 6c 65 28 22 69 6e 70 75 >fferedFile("inpu<
+0011320 74 2e 74 78 74 22 20 20 20 29 20 29 0a 20 20 20 >t.txt" ) ). <
+0011340 20 20 20 20 20 66 6f 72 65 61 63 68 28 61 6c 74 > foreach(alt<
+0011360 65 72 6e 61 74 69 76 65 3b 20 46 69 6e 64 57 6f >ernative; FindWo<
+0011400 72 64 73 28 20 70 68 6f 6e 65 20 29 20 29 0a 20 >rds( phone ) ). <
+0011420 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 > write<
+0011440 66 6c 6e 28 70 68 6f 6e 65 2c 20 22 3a 20 22 2c >fln(phone, ": ",<
+0011460 20 61 6c 74 65 72 6e 61 74 69 76 65 20 29 3b 0a > alternative );.<
+0011500 7d 0a 0a >}..<
+0011503
diff --git a/tests/examplefiles/hexdump_xxd b/tests/examplefiles/hexdump_xxd
new file mode 100644
index 00000000..33a8a6e1
--- /dev/null
+++ b/tests/examplefiles/hexdump_xxd
@@ -0,0 +1,309 @@
+0000000: 2f2f 2043 7265 6174 6564 2062 7920 4c69 // Created by Li
+0000010: 6f6e 656c 6c6f 204c 756e 6573 7520 616e onello Lunesu an
+0000020: 6420 706c 6163 6564 2069 6e20 7468 6520 d placed in the
+0000030: 7075 626c 6963 2064 6f6d 6169 6e2e 0a2f public domain../
+0000040: 2f20 5468 6973 2066 696c 6520 6861 7320 / This file has
+0000050: 6265 656e 206d 6f64 6966 6965 6420 6672 been modified fr
+0000060: 6f6d 2069 7473 206f 7269 6769 6e61 6c20 om its original
+0000070: 7665 7273 696f 6e2e 0a2f 2f20 4974 2068 version..// It h
+0000080: 6173 2062 6565 6e20 666f 726d 6174 7465 as been formatte
+0000090: 6420 746f 2066 6974 2079 6f75 7220 7363 d to fit your sc
+00000a0: 7265 656e 2e0a 6d6f 6475 6c65 2070 686f reen..module pho
+00000b0: 6e65 6e6f 3b20 2020 2020 2f2f 206f 7074 neno; // opt
+00000c0: 696f 6e61 6c0a 696d 706f 7274 2073 7464 ional.import std
+00000d0: 2e73 7464 696f 3b20 2020 2f2f 2077 7269 .stdio; // wri
+00000e0: 7465 666c 6e20 2020 2020 0a69 6d70 6f72 tefln .impor
+00000f0: 7420 7374 642e 6374 7970 653b 2020 202f t std.ctype; /
+0000100: 2f20 6973 6469 6769 7420 2020 2020 0a69 / isdigit .i
+0000110: 6d70 6f72 7420 7374 642e 7374 7265 616d mport std.stream
+0000120: 3b20 202f 2f20 4275 6666 6572 6564 4669 ; // BufferedFi
+0000130: 6c65 0a0a 2f2f 204a 7573 7420 666f 7220 le..// Just for
+0000140: 7265 6164 6162 696c 6974 7920 2869 6d61 readability (ima
+0000150: 6769 6e65 2063 6861 725b 5d5b 5d5b 6368 gine char[][][ch
+0000160: 6172 5b5d 5d29 2020 2020 0a61 6c69 6173 ar[]]) .alias
+0000170: 2063 6861 725b 5d20 7374 7269 6e67 3b0a char[] string;.
+0000180: 616c 6961 7320 7374 7269 6e67 5b5d 2073 alias string[] s
+0000190: 7472 696e 6761 7272 6179 3b0a 0a2f 2f2f tringarray;..///
+00001a0: 2053 7472 6970 7320 6e6f 6e2d 6469 6769 Strips non-digi
+00001b0: 7420 6368 6172 6163 7465 7273 2066 726f t characters fro
+00001c0: 6d20 7468 6520 7374 7269 6e67 2028 434f m the string (CO
+00001d0: 5729 0a73 7472 696e 6720 7374 7269 704e W).string stripN
+00001e0: 6f6e 4469 6769 7428 2069 6e20 7374 7269 onDigit( in stri
+00001f0: 6e67 206c 696e 6520 2920 0a7b 0a20 2020 ng line ) .{.
+0000200: 2073 7472 696e 6720 7265 743b 0a20 2020 string ret;.
+0000210: 2066 6f72 6561 6368 2875 696e 7420 692c foreach(uint i,
+0000220: 2063 3b20 6c69 6e65 2920 7b0a 2020 2020 c; line) {.
+0000230: 2020 2020 2f2f 2045 7272 6f72 3a20 7374 // Error: st
+0000240: 642e 6374 7970 652e 6973 6469 6769 7420 d.ctype.isdigit
+0000250: 6174 2043 3a5c 646d 645c 7372 635c 7068 at C:\dmd\src\ph
+0000260: 6f62 6f73 5c73 7464 5c63 7479 7065 2e64 obos\std\ctype.d
+0000270: 2833 3729 200a 2020 2020 2020 2020 2f2f (37) . //
+0000280: 2063 6f6e 666c 6963 7473 2077 6974 6820 conflicts with
+0000290: 7374 642e 7374 7265 616d 2e69 7364 6967 std.stream.isdig
+00002a0: 6974 2061 7420 433a 5c64 6d64 5c73 7263 it at C:\dmd\src
+00002b0: 5c70 686f 626f 735c 7374 645c 7374 7265 \phobos\std\stre
+00002c0: 616d 2e64 2832 3932 3429 0a20 2020 2020 am.d(2924).
+00002d0: 2020 2069 6620 2821 7374 642e 6374 7970 if (!std.ctyp
+00002e0: 652e 6973 6469 6769 7428 6329 2920 7b0a e.isdigit(c)) {.
+00002f0: 2020 2020 2020 2020 2020 2020 6966 2028 if (
+0000300: 2172 6574 290a 2020 2020 2020 2020 2020 !ret).
+0000310: 2020 2020 2020 7265 7420 3d20 6c69 6e65 ret = line
+0000320: 5b30 2e2e 695d 3b20 2020 200a 2020 2020 [0..i]; .
+0000330: 2020 2020 7d20 2020 200a 2020 2020 2020 } .
+0000340: 2020 656c 7365 2069 6620 2872 6574 290a else if (ret).
+0000350: 2020 2020 2020 2020 2020 2020 7265 7420 ret
+0000360: 7e3d 2063 3b20 2020 200a 2020 2020 7d20 ~= c; . }
+0000370: 2020 200a 2020 2020 7265 7475 726e 2072 . return r
+0000380: 6574 3f72 6574 3a6c 696e 653b 0a7d 0a0a et?ret:line;.}..
+0000390: 756e 6974 7465 7374 207b 0a20 2020 2061 unittest {. a
+00003a0: 7373 6572 7428 2073 7472 6970 4e6f 6e44 ssert( stripNonD
+00003b0: 6967 6974 2822 6173 6466 2229 203d 3d20 igit("asdf") ==
+00003c0: 2222 2020 293b 0a20 2020 2061 7373 6572 "" );. asser
+00003d0: 7428 2073 7472 6970 4e6f 6e44 6967 6974 t( stripNonDigit
+00003e0: 2822 5c27 3133 2d3d 3220 346b 6f70 2229 ("\'13-=2 4kop")
+00003f0: 203d 3d20 2022 3133 3234 2220 2029 3b0a == "1324" );.
+0000400: 7d0a 0a2f 2f2f 2043 6f6e 7665 7274 7320 }../// Converts
+0000410: 6120 776f 7264 2069 6e74 6f20 6120 6e75 a word into a nu
+0000420: 6d62 6572 2c20 6967 6e6f 7269 6e67 2061 mber, ignoring a
+0000430: 6c6c 206e 6f6e 2061 6c70 6861 2063 6861 ll non alpha cha
+0000440: 7261 6374 6572 7320 200a 7374 7269 6e67 racters .string
+0000450: 2077 6f72 6454 6f4e 756d 2820 696e 2073 wordToNum( in s
+0000460: 7472 696e 6720 776f 7264 2029 0a7b 0a2f tring word ).{./
+0000470: 2f20 7472 616e 736c 6174 696f 6e20 7461 / translation ta
+0000480: 626c 6520 666f 7220 7468 6520 7461 736b ble for the task
+0000490: 2061 7420 6861 6e64 0a63 6f6e 7374 2063 at hand.const c
+00004a0: 6861 725b 3235 365d 2054 5241 4e53 4c41 har[256] TRANSLA
+00004b0: 5445 203d 2020 2020 0a20 2020 2022 2020 TE = . "
+00004c0: 2020 2020 2020 2020 2020 2020 2020 2020
+00004d0: 2020 2020 2020 2020 2020 2020 2020 2220 "
+00004e0: 202f 2f20 3020 2020 0a20 2020 2022 2020 // 0 . "
+00004f0: 2020 2020 2020 2020 2020 2020 2020 3031 01
+0000500: 3233 3435 3637 3839 2020 2020 2020 2220 23456789 "
+0000510: 202f 2f20 3332 2020 2020 200a 2020 2020 // 32 .
+0000520: 2220 3537 3633 3034 3939 3631 3738 3531 " 57630499617851
+0000530: 3838 3132 3334 3736 3232 3339 2020 2020 881234762239
+0000540: 2022 2020 2f2f 2036 3420 2020 0a20 2020 " // 64 .
+0000550: 2022 2035 3736 3330 3439 3936 3137 3835 " 5763049961785
+0000560: 3138 3831 3233 3437 3632 3233 3920 2020 1881234762239
+0000570: 2020 220a 2020 2020 2220 2020 2020 2020 ". "
+0000580: 2020 2020 2020 2020 2020 2020 2020 2020
+0000590: 2020 2020 2020 2020 2022 0a20 2020 2022 ". "
+00005a0: 2020 2020 2020 2020 2020 2020 2020 2020
+00005b0: 2020 2020 2020 2020 2020 2020 2020 2020
+00005c0: 220a 2020 2020 2220 2020 2020 2020 2020 ". "
+00005d0: 2020 2020 2020 2020 2020 2020 2020 2020
+00005e0: 2020 2020 2020 2022 2020 2020 0a20 2020 " .
+00005f0: 2022 2020 2020 2020 2020 2020 2020 2020 "
+0000600: 2020 2020 2020 2020 2020 2020 2020 2020
+0000610: 2020 223b 0a20 2020 2073 7472 696e 6720 ";. string
+0000620: 7265 743b 0a20 2020 2066 6f72 6561 6368 ret;. foreach
+0000630: 2863 3b20 6361 7374 2875 6279 7465 5b5d (c; cast(ubyte[]
+0000640: 2977 6f72 6429 0a20 2020 2020 2020 2069 )word). i
+0000650: 6620 2854 5241 4e53 4c41 5445 5b63 5d20 f (TRANSLATE[c]
+0000660: 213d 2027 2027 290a 2020 2020 2020 2020 != ' ').
+0000670: 2020 2020 7265 7420 7e3d 2054 5241 4e53 ret ~= TRANS
+0000680: 4c41 5445 5b63 5d3b 0a20 2020 2072 6574 LATE[c];. ret
+0000690: 7572 6e20 7265 743b 0a7d 0a0a 756e 6974 urn ret;.}..unit
+00006a0: 7465 7374 207b 0a20 2f2f 2054 6573 7420 test {. // Test
+00006b0: 776f 7264 546f 4e75 6d20 7573 696e 6720 wordToNum using
+00006c0: 7468 6520 7461 626c 6520 6672 6f6d 2074 the table from t
+00006d0: 6865 2074 6173 6b20 6465 7363 7269 7074 he task descript
+00006e0: 696f 6e2e 0a20 6173 7365 7274 2820 2230 ion.. assert( "0
+00006f0: 3131 3132 3232 3333 3334 3435 3536 3636 1112223334455666
+0000700: 3737 3738 3838 3939 3922 203d 3d0a 2020 777888999" ==.
+0000710: 2077 6f72 6454 6f4e 756d 2822 4520 7c20 wordToNum("E |
+0000720: 4a20 4e20 5120 7c20 5220 5720 5820 7c20 J N Q | R W X |
+0000730: 4420 5320 5920 7c20 4620 5420 7c20 4120 D S Y | F T | A
+0000740: 4d20 7c20 4320 4920 5620 7c20 4220 4b20 M | C I V | B K
+0000750: 5520 7c20 4c20 4f20 5020 7c20 4720 4820 U | L O P | G H
+0000760: 5a22 2929 3b0a 2061 7373 6572 7428 2022 Z"));. assert( "
+0000770: 3031 3131 3232 3233 3333 3434 3535 3636 0111222333445566
+0000780: 3637 3737 3838 3839 3939 2220 3d3d 200a 6777888999" == .
+0000790: 2020 2077 6f72 6454 6f4e 756d 2822 6520 wordToNum("e
+00007a0: 7c20 6a20 6e20 7120 7c20 7220 7720 7820 | j n q | r w x
+00007b0: 7c20 6420 7320 7920 7c20 6620 7420 7c20 | d s y | f t |
+00007c0: 6120 6d20 7c20 6320 6920 7620 7c20 6220 a m | c i v | b
+00007d0: 6b20 7520 7c20 6c20 6f20 7020 7c20 6720 k u | l o p | g
+00007e0: 6820 7a22 2929 3b0a 2061 7373 6572 7428 h z"));. assert(
+00007f0: 2022 3031 3233 3435 3637 3839 2220 3d3d "0123456789" ==
+0000800: 200a 2020 2077 6f72 6454 6f4e 756d 2822 . wordToNum("
+0000810: 3020 7c20 2020 3120 2020 7c20 2020 3220 0 | 1 | 2
+0000820: 2020 7c20 2020 3320 2020 7c20 2034 2020 | 3 | 4
+0000830: 7c20 2035 2020 7c20 2020 3620 2020 7c20 | 5 | 6 |
+0000840: 2020 3720 2020 7c20 2020 3820 2020 7c20 7 | 8 |
+0000850: 2020 3922 2929 3b0a 7d0a 0a76 6f69 6420 9"));.}..void
+0000860: 6d61 696e 2820 7374 7269 6e67 5b5d 2061 main( string[] a
+0000870: 7267 7320 290a 7b0a 2020 2020 2f2f 2054 rgs ).{. // T
+0000880: 6869 7320 6173 736f 6369 6174 6976 6520 his associative
+0000890: 6172 7261 7920 6d61 7073 2061 206e 756d array maps a num
+00008a0: 6265 7220 746f 2061 6e20 6172 7261 7920 ber to an array
+00008b0: 6f66 2077 6f72 6473 2e20 2020 200a 2020 of words. .
+00008c0: 2020 7374 7269 6e67 6172 7261 795b 7374 stringarray[st
+00008d0: 7269 6e67 5d20 2020 206e 756d 3277 6f72 ring] num2wor
+00008e0: 6473 3b0a 0a20 2020 2066 6f72 6561 6368 ds;.. foreach
+00008f0: 2873 7472 696e 6720 776f 7264 3b20 6e65 (string word; ne
+0000900: 7720 4275 6666 6572 6564 4669 6c65 2822 w BufferedFile("
+0000910: 6469 6374 696f 6e61 7279 2e74 7874 2220 dictionary.txt"
+0000920: 2920 290a 2020 2020 2020 2020 6e75 6d32 ) ). num2
+0000930: 776f 7264 735b 2077 6f72 6454 6f4e 756d words[ wordToNum
+0000940: 2877 6f72 6429 205d 207e 3d20 776f 7264 (word) ] ~= word
+0000950: 2e64 7570 3b20 2020 2020 2020 202f 2f20 .dup; //
+0000960: 6d75 7374 2064 7570 0a0a 2020 2020 2f2f must dup.. //
+0000970: 2f20 4669 6e64 7320 616c 6c20 616c 7465 / Finds all alte
+0000980: 726e 6174 6976 6573 2066 6f72 2074 6865 rnatives for the
+0000990: 2067 6976 656e 206e 756d 6265 720a 2020 given number.
+00009a0: 2020 2f2f 2f20 2873 686f 756c 6420 6861 /// (should ha
+00009b0: 7665 2062 6565 6e20 7374 7269 7070 6564 ve been stripped
+00009c0: 2066 726f 6d20 6e6f 6e2d 6469 6769 7420 from non-digit
+00009d0: 6368 6172 6163 7465 7273 290a 2020 2020 characters).
+00009e0: 7374 7269 6e67 6172 7261 7920 5f46 696e stringarray _Fin
+00009f0: 6457 6f72 6473 2820 7374 7269 6e67 206e dWords( string n
+0000a00: 756d 6265 7273 2c20 626f 6f6c 2064 6967 umbers, bool dig
+0000a10: 6974 6f6b 2029 0a20 2020 2069 6e20 7b0a itok ). in {.
+0000a20: 2020 2020 2020 2020 6173 7365 7274 286e assert(n
+0000a30: 756d 6265 7273 2e6c 656e 6774 6820 3e20 umbers.length >
+0000a40: 2030 293b 2020 2020 0a20 2020 207d 2020 0); . }
+0000a50: 2020 0a20 2020 206f 7574 2872 6573 756c . out(resul
+0000a60: 7429 207b 0a20 2020 2020 2020 2066 6f72 t) {. for
+0000a70: 6561 6368 2028 613b 2072 6573 756c 7429 each (a; result)
+0000a80: 0a20 2020 2020 2020 2020 2020 2061 7373 . ass
+0000a90: 6572 7428 2077 6f72 6454 6f4e 756d 2861 ert( wordToNum(a
+0000aa0: 2920 3d3d 206e 756d 6265 7273 2029 3b0a ) == numbers );.
+0000ab0: 2020 2020 7d20 2020 200a 2020 2020 626f } . bo
+0000ac0: 6479 207b 0a20 2020 2020 2020 2073 7472 dy {. str
+0000ad0: 696e 6761 7272 6179 2072 6574 3b0a 2020 ingarray ret;.
+0000ae0: 2020 2020 2020 626f 6f6c 2066 6f75 6e64 bool found
+0000af0: 776f 7264 203d 2066 616c 7365 3b0a 2020 word = false;.
+0000b00: 2020 2020 2020 666f 7220 2875 696e 7420 for (uint
+0000b10: 743d 313b 2074 3c3d 6e75 6d62 6572 732e t=1; t<=numbers.
+0000b20: 6c65 6e67 7468 3b20 2b2b 7429 207b 0a20 length; ++t) {.
+0000b30: 2020 2020 2020 2020 2020 2061 7574 6f20 auto
+0000b40: 616c 7465 726e 6174 6976 6573 203d 206e alternatives = n
+0000b50: 756d 6265 7273 5b30 2e2e 745d 2069 6e20 umbers[0..t] in
+0000b60: 6e75 6d32 776f 7264 733b 0a20 2020 2020 num2words;.
+0000b70: 2020 2020 2020 2069 6620 2821 616c 7465 if (!alte
+0000b80: 726e 6174 6976 6573 290a 2020 2020 2020 rnatives).
+0000b90: 2020 2020 2020 2020 2020 636f 6e74 696e contin
+0000ba0: 7565 3b0a 2020 2020 2020 2020 2020 2020 ue;.
+0000bb0: 666f 756e 6477 6f72 6420 3d20 7472 7565 foundword = true
+0000bc0: 3b0a 2020 2020 2020 2020 2020 2020 6966 ;. if
+0000bd0: 2028 6e75 6d62 6572 732e 6c65 6e67 7468 (numbers.length
+0000be0: 203e 2020 7429 207b 0a20 2020 2020 2020 > t) {.
+0000bf0: 2020 2020 2020 2020 202f 2f20 436f 6d62 // Comb
+0000c00: 696e 6520 616c 6c20 6375 7272 656e 7420 ine all current
+0000c10: 616c 7465 726e 6174 6976 6573 2077 6974 alternatives wit
+0000c20: 6820 616c 6c20 616c 7465 726e 6174 6976 h all alternativ
+0000c30: 6573 2020 2020 200a 2020 2020 2020 2020 es .
+0000c40: 2020 2020 2020 2020 2f2f 206f 6620 7468 // of th
+0000c50: 6520 7265 7374 2028 6e65 7874 2070 6965 e rest (next pie
+0000c60: 6365 2063 616e 2073 7461 7274 2077 6974 ce can start wit
+0000c70: 6820 6120 6469 6769 7429 2020 2020 2020 h a digit)
+0000c80: 2020 2020 2020 2020 0a20 2020 2020 2020 .
+0000c90: 2020 2020 2020 2020 2066 6f72 6561 6368 foreach
+0000ca0: 2028 6132 3b20 5f46 696e 6457 6f72 6473 (a2; _FindWords
+0000cb0: 2820 6e75 6d62 6572 735b 742e 2e24 5d2c ( numbers[t..$],
+0000cc0: 2074 7275 6520 2020 2020 2920 290a 2020 true ) ).
+0000cd0: 2020 2020 2020 2020 2020 2020 2020 2020
+0000ce0: 2020 666f 7265 6163 6828 6131 3b20 2a61 foreach(a1; *a
+0000cf0: 6c74 6572 6e61 7469 7665 7329 0a20 2020 lternatives).
+0000d00: 2020 2020 2020 2020 2020 2020 2020 2020
+0000d10: 2020 2020 7265 7420 7e3d 2061 3120 7e20 ret ~= a1 ~
+0000d20: 2220 2220 7e20 6132 3b0a 2020 2020 2020 " " ~ a2;.
+0000d30: 2020 2020 2020 7d0a 2020 2020 2020 2020 }.
+0000d40: 2020 2020 656c 7365 2020 2020 0a20 2020 else .
+0000d50: 2020 2020 2020 2020 2020 2020 2072 6574 ret
+0000d60: 207e 3d20 2a61 6c74 6572 6e61 7469 7665 ~= *alternative
+0000d70: 733b 2020 2020 2f2f 2061 7070 656e 6420 s; // append
+0000d80: 7468 6573 6520 616c 7465 726e 6174 6976 these alternativ
+0000d90: 6573 0a20 2020 2020 2020 207d 0a20 2020 es. }.
+0000da0: 2020 2020 202f 2f20 5472 7920 746f 206b // Try to k
+0000db0: 6565 7020 3120 6469 6769 742c 206f 6e6c eep 1 digit, onl
+0000dc0: 7920 6966 2077 6527 7265 2061 6c6c 6f77 y if we're allow
+0000dd0: 6564 2061 6e64 206e 6f20 6f74 6865 720a ed and no other.
+0000de0: 2020 2020 2020 2020 2f2f 2061 6c74 6572 // alter
+0000df0: 6e61 7469 7665 7320 7765 7265 2066 6f75 natives were fou
+0000e00: 6e64 0a20 2020 2020 2020 202f 2f20 5465 nd. // Te
+0000e10: 7374 696e 6720 2272 6574 2e6c 656e 6774 sting "ret.lengt
+0000e20: 6822 206d 616b 6573 206d 6f72 6520 7365 h" makes more se
+0000e30: 6e73 6520 7468 616e 2074 6573 7469 6e67 nse than testing
+0000e40: 2022 666f 756e 6477 6f72 6422 2c0a 2020 "foundword",.
+0000e50: 2020 2020 2020 2f2f 2062 7574 2074 6865 // but the
+0000e60: 206f 7468 6572 2069 6d70 6c65 6d65 6e74 other implement
+0000e70: 6174 696f 6e73 2073 6565 6d20 746f 2064 ations seem to d
+0000e80: 6f20 6a75 7374 2074 6869 732e 0a20 2020 o just this..
+0000e90: 2020 2020 2069 6620 2864 6967 6974 6f6b if (digitok
+0000ea0: 2026 2620 2166 6f75 6e64 776f 7264 2920 && !foundword)
+0000eb0: 7b20 2f2f 7265 742e 6c65 6e67 7468 203d { //ret.length =
+0000ec0: 3d20 3020 200a 2020 2020 2020 2020 2020 = 0 .
+0000ed0: 2020 6966 286e 756d 6265 7273 2e6c 656e if(numbers.len
+0000ee0: 6774 6820 3e20 2031 2920 7b0a 2020 2020 gth > 1) {.
+0000ef0: 2020 2020 2020 2020 2020 2020 2f2f 2043 // C
+0000f00: 6f6d 6269 6e65 2031 2064 6967 6974 2077 ombine 1 digit w
+0000f10: 6974 6820 616c 6c20 616c 7465 6e61 7469 ith all altenati
+0000f20: 7665 7320 6672 6f6d 2074 6865 2072 6573 ves from the res
+0000f30: 7420 2020 200a 2020 2020 2020 2020 2020 t .
+0000f40: 2020 2020 2020 2f2f 2028 6e65 7874 2070 // (next p
+0000f50: 6965 6365 2063 616e 206e 6f74 2073 7461 iece can not sta
+0000f60: 7274 2077 6974 6820 6120 6469 6769 7429 rt with a digit)
+0000f70: 2020 2020 2020 2020 2020 0a20 2020 2020 .
+0000f80: 2020 2020 2020 2020 2020 2066 6f72 6561 forea
+0000f90: 6368 2028 613b 205f 4669 6e64 576f 7264 ch (a; _FindWord
+0000fa0: 7328 206e 756d 6265 7273 5b31 2e2e 245d s( numbers[1..$]
+0000fb0: 2c20 6661 6c73 6520 2920 290a 2020 2020 , false ) ).
+0000fc0: 2020 2020 2020 2020 2020 2020 2020 2020
+0000fd0: 7265 7420 7e3d 206e 756d 6265 7273 5b30 ret ~= numbers[0
+0000fe0: 2e2e 315d 207e 2022 2022 207e 2061 3b0a ..1] ~ " " ~ a;.
+0000ff0: 2020 2020 2020 2020 2020 2020 7d20 2020 }
+0001000: 200a 2020 2020 2020 2020 2020 2020 656c . el
+0001010: 7365 2020 2020 0a20 2020 2020 2020 2020 se .
+0001020: 2020 2020 2020 2072 6574 207e 3d20 6e75 ret ~= nu
+0001030: 6d62 6572 735b 302e 2e31 5d3b 2020 2020 mbers[0..1];
+0001040: 2f2f 206a 7573 7420 6170 7065 6e64 2074 // just append t
+0001050: 6869 7320 6469 6769 7420 2020 2020 2020 his digit
+0001060: 2020 2020 2020 0a20 2020 2020 2020 207d . }
+0001070: 2020 2020 0a20 2020 2020 2020 2072 6574 . ret
+0001080: 7572 6e20 7265 743b 0a20 2020 207d 0a0a urn ret;. }..
+0001090: 2020 2020 2f2f 2f20 2854 6869 7320 6675 /// (This fu
+00010a0: 6e63 7469 6f6e 2077 6173 2069 6e6c 696e nction was inlin
+00010b0: 6564 2069 6e20 7468 6520 6f72 6967 696e ed in the origin
+00010c0: 616c 2070 726f 6772 616d 2920 0a20 2020 al program) .
+00010d0: 202f 2f2f 2046 696e 6473 2061 6c6c 2061 /// Finds all a
+00010e0: 6c74 6572 6e61 7469 7665 7320 666f 7220 lternatives for
+00010f0: 7468 6520 6769 7665 6e20 7068 6f6e 6520 the given phone
+0001100: 6e75 6d62 6572 200a 2020 2020 2f2f 2f20 number . ///
+0001110: 5265 7475 726e 733a 2061 7272 6179 206f Returns: array o
+0001120: 6620 7374 7269 6e67 7320 0a20 2020 2073 f strings . s
+0001130: 7472 696e 6761 7272 6179 2046 696e 6457 tringarray FindW
+0001140: 6f72 6473 2820 7374 7269 6e67 2070 686f ords( string pho
+0001150: 6e65 5f6e 756d 6265 7220 290a 2020 2020 ne_number ).
+0001160: 7b0a 2020 2020 2020 2020 6966 2028 2170 {. if (!p
+0001170: 686f 6e65 5f6e 756d 6265 722e 6c65 6e67 hone_number.leng
+0001180: 7468 290a 2020 2020 2020 2020 2020 2020 th).
+0001190: 7265 7475 726e 206e 756c 6c3b 0a20 2020 return null;.
+00011a0: 2020 2020 202f 2f20 5374 7269 7020 7468 // Strip th
+00011b0: 6520 6e6f 6e2d 6469 6769 7420 6368 6172 e non-digit char
+00011c0: 6163 7465 7273 2066 726f 6d20 7468 6520 acters from the
+00011d0: 7068 6f6e 6520 6e75 6d62 6572 2c20 616e phone number, an
+00011e0: 640a 2020 2020 2020 2020 2f2f 2070 6173 d. // pas
+00011f0: 7320 6974 2074 6f20 7468 6520 7265 6375 s it to the recu
+0001200: 7273 6976 6520 6675 6e63 7469 6f6e 2028 rsive function (
+0001210: 6c65 6164 696e 6720 6469 6769 7420 6973 leading digit is
+0001220: 2061 6c6c 6f77 6564 290a 2020 2020 2020 allowed).
+0001230: 2020 7265 7475 726e 205f 4669 6e64 576f return _FindWo
+0001240: 7264 7328 2073 7472 6970 4e6f 6e44 6967 rds( stripNonDig
+0001250: 6974 2870 686f 6e65 5f6e 756d 6265 7229 it(phone_number)
+0001260: 2c20 7472 7565 2029 3b20 2020 200a 2020 , true ); .
+0001270: 2020 7d20 2020 200a 2020 2020 0a20 2020 } . .
+0001280: 202f 2f20 5265 6164 2074 6865 2070 686f // Read the pho
+0001290: 6e65 206e 756d 6265 7273 2020 2020 200a ne numbers .
+00012a0: 2020 2020 666f 7265 6163 6828 7374 7269 foreach(stri
+00012b0: 6e67 2070 686f 6e65 3b20 6e65 7720 4275 ng phone; new Bu
+00012c0: 6666 6572 6564 4669 6c65 2822 696e 7075 fferedFile("inpu
+00012d0: 742e 7478 7422 2020 2029 2029 0a20 2020 t.txt" ) ).
+00012e0: 2020 2020 2066 6f72 6561 6368 2861 6c74 foreach(alt
+00012f0: 6572 6e61 7469 7665 3b20 4669 6e64 576f ernative; FindWo
+0001300: 7264 7328 2070 686f 6e65 2029 2029 0a20 rds( phone ) ).
+0001310: 2020 2020 2020 2020 2020 2077 7269 7465 write
+0001320: 666c 6e28 7068 6f6e 652c 2022 3a20 222c fln(phone, ": ",
+0001330: 2061 6c74 6572 6e61 7469 7665 2029 3b0a alternative );.
+0001340: 7d0a 0a }..