::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method PHONECODE:  Print word combinations for a list of phone numbers.

 entry Code    Path,           &Path of a code word dictionary file.
       Phone   Path            :Path of a phone number file.

 local Dictionary   Map..heap..string,  &Dictionary map number -> {code, ...}
       Digit        string,             &Digits in a phone number
       Line         word,               &Current line in the phone number file
       Hit          Bit,                &A partial encoding was found
       Phone.Max |= 50                  :Maximum phone number width
:
:  Note:  The Phonecode program will terminate on input errors.
:...............................................................................


LOAD.DICTIONARY  Dictionary, Code`Value;   Read in all code words.
assert  Dictionary`Size  pass Code`Value;  ERROR:  The dictionary file is empty.

DO Number  from Read.Text( Phone`Value ):  DO over the phone number file,
   Line += 1;                                 Current line number.
   Digit = "";                                Begin accumulating digits.

   assert  length( Number ) <= Phone.Max     &ERROR:  Phone number is too long.
           pass  "line = " ! form( Line )

   DO C  in  Number:                          DO over phone number characters,
      IF C = '0' to '9':                         IF a decimal digit,
         Digit != C;                                Accumulate digits.

      ELSE:                                      ELSE skipping a non-digit,
         assert  C = '/' | '-'                     &ERROR:  Invalid phone number.
                 pass  "line = " ! form( Line )
   -  .

   assert  Digit  pass Number;                ERROR:  A phone number has no digits.

   ENCODE.PHONE  Dictionary, Number, Digit,  &Print combinations of words.
                 "", 1, Hit

   IF Hit = 0:                                IF no partial encoding,
      IF length( Digit ) = 1:                    IF a trivial one digit number,
         PRINT  Number ! ":", Digit;                Encode as a digit.

      ELSE:                                      ELSE multiple digits,
         ENCODE.PHONE  Dictionary, Number, Digit,  &Encode with a lead digit.
                       left( Digit ), 2
-  .  .

return