/**
 * Dictionary I/O routines for Cryptogram Solver
 * Author: Ramkumar Natarajan (nrk@cs.purdue.edu)
 **/

#include "dict.h"

Dictionary dicts[MAX_WORDLEN_] =
    {
        { "dic/dic1",  NULL, 0, 0, 1  },
        { "dic/dic2",  NULL, 0, 0, 2  },
        { "dic/dic3",  NULL, 0, 0, 3  },
        { "dic/dic4",  NULL, 0, 0, 4  },
        { "dic/dic5",  NULL, 0, 0, 5  },
        { "dic/dic6",  NULL, 0, 0, 6  },
        { "dic/dic7",  NULL, 0, 0, 7  },
        { "dic/dic8",  NULL, 0, 0, 8  },
        { "dic/dic9",  NULL, 0, 0, 9  },
        { "dic/dic10", NULL, 0, 0, 10 },
        { "dic/dic11", NULL, 0, 0, 11 },
        { "dic/dic12", NULL, 0, 0, 12 },
        { "dic/dic13", NULL, 0, 0, 13 },
        { "dic/dic14", NULL, 0, 0, 14 },
        { "dic/dic15", NULL, 0, 0, 15 },
        { "dic/dic16", NULL, 0, 0, 16 },
        { "dic/dic17", NULL, 0, 0, 17 },
        { "dic/dic18", NULL, 0, 0, 18 },
        { "dic/dic19", NULL, 0, 0, 19 },
        { "dic/dic20", NULL, 0, 0, 20 },
        { "dic/dic21", NULL, 0, 0, 21 },
        { "dic/dic22", NULL, 0, 0, 22 },
        { "dic/dic23", NULL, 0, 0, 23 },
        { "dic/dic24", NULL, 0, 0, 24 },
        { "dic/dic25", NULL, 0, 0, 25 },
        { "dic/dic26", NULL, 0, 0, 26 },
        { "dic/dic27", NULL, 0, 0, 27 },
        { "dic/dic28", NULL, 0, 0, 28 },
        { "dic/dic29", NULL, 0, 0, 29 },
        { "dic/dic30", NULL, 0, 0, 30 },
        { "dic/dic31", NULL, 0, 0, 31 },
        { "dic/dic32", NULL, 0, 0, 30 },
    };

int readDict(Dictionary *dptr) {
    FILE *fp;
    int nwords, maxwords, retval;
    char *cptr;
    char fmtbuf[16];

    if ( dptr->isRead ) return 0;

    fp = fopen(dptr->filename, "r");
    if ( !fp ) {
        dptr->isRead = 1;
        dptr->nwords = 0;
        return 0;
    }

    nwords      = 0;
    maxwords    = WORDLIST_SZ_;
    cptr = dptr->words = my_malloc((sizeof *dptr->words * dptr->wordlen * maxwords) + 1);
    sprintf(fmtbuf, "%%%ds\\n", dptr->wordlen);
    while ( 1 ) {
        if ( nwords >= maxwords ) {
            dptr->words = my_realloc(dptr->words, (sizeof *dptr->words * dptr->wordlen * (maxwords + WORDLIST_SZ_)) + 1);
            maxwords += WORDLIST_SZ_;
            cptr = dptr->words + (nwords * dptr->wordlen);
        }
        retval = fscanf(fp, fmtbuf, cptr);
        if ( retval == EOF ) break;
        cptr += dptr->wordlen;
        ++nwords;        
    }

    dptr->isRead = 1;
    dptr->nwords = nwords;
    dptr->words = my_realloc(dptr->words, (sizeof *dptr->words * dptr->wordlen * dptr->nwords) + 1);
    fclose(fp);
    return 0;
}
