U8 char_map[26]="22233344455566677778889999";

/*
Format of word list entry:
    U8 ACD_WORD_CHAR
    U8 word[] with terminating zero
    I16 block; //definition offset in ::/System/AutoComplete/ACDefs.DATA
*/
U0 PhoneNumWords(U8 *num)
{
    I64  ch;
    U8  *_num = StrNew(num), *dst = _num, 
        *dict = acd.word_list, *st, *src;

    while (*num)
    {
        if ('0' <= *num <= '9')
            *dst++ = *num;
        num++;
    }
    *dst = 0;

    while (*dict++)
    {
        if (StrLen(dict) > 2)
        {
            dst = st = StrNew(dict);
            while (ch = ToUpper(*dst))
            {
                if ('A' <= ch <= 'Z')
                    *dst = char_map[ch - 'A'];
                else
                    *dst = CH_SPACE;
                dst++;
            }
            *dst = 0;

            src = _num;
            while (*src)
            {
                if (!StrNCompare(st, src, StrLen(st)))
                {
                    ch = *src;
                    *src = 0;
                    "%s", _num;
                    *src = ch;
                    "$GREEN$%s$FG$", dict;
                    "%s\n", src + StrLen(st);
                }
                src++;
            }
            Free(st);
        }
        dict += StrLen(dict) + 3;
    }
    Free(_num);
    '\n';
}

U0 PNWDemo()
{
    U8 *st;

    while ((st = StrGet("Phone Num:")) && *st)
    {
        PhoneNumWords(st);
        Free(st);
    }
    Free(st);
}

PNWDemo;