#include #include #include #include #include "dictmgr.hxx" #if !defined(_MSC_VER) using namespace std; #endif // some utility functions extern void mychomp(char * s); extern char * mystrdup(const char * s); extern char * mystrsep(char ** stringp, const char delim); DictMgr::DictMgr(const char * dictpath, const char * etype) { // load list of etype entries numdict = 0; pdentry = (dictentry *)malloc(MAXDICTIONARIES*sizeof(struct dictentry)); if (pdentry) { if (parse_file(dictpath, etype)) { numdict = 0; // no dictionary.lst found is okay } } else { numdict = 0; } } DictMgr::~DictMgr() { dictentry * pdict = NULL; if (pdentry) { pdict = pdentry; for (int i=0;ilang) { free(pdict->lang); pdict->lang = NULL; } if (pdict->region) { free(pdict->region); pdict->region=NULL; } if (pdict->filename) { free(pdict->filename); pdict->filename = NULL; } pdict++; } free(pdentry); pdentry = NULL; pdict = NULL; } numdict = 0; } // read in list of etype entries and build up structure to describe them int DictMgr::parse_file(const char * dictpath, const char * etype) { int i; char line[MAXDICTENTRYLEN+1]; dictentry * pdict = pdentry; // open the dictionary list file FILE * dictlst; dictlst = fopen(dictpath,"r"); if (!dictlst) { return 1; } // step one is to parse the dictionary list building up the // descriptive structures // read in each line ignoring any that dont start with etype while (fgets(line,MAXDICTENTRYLEN,dictlst)) { mychomp(line); /* parse in a dictionary entry */ if (strncmp(line,etype,4) == 0) { if (numdict < MAXDICTIONARIES) { char * tp = line; char * piece; i = 0; while ((piece=mystrsep(&tp,' '))) { if (*piece != '\0') { switch(i) { case 0: break; case 1: pdict->lang = mystrdup(piece); break; case 2: if (strcmp (piece, "ANY") == 0) pdict->region = mystrdup(""); else pdict->region = mystrdup(piece); break; case 3: pdict->filename = mystrdup(piece); break; default: break; } i++; } free(piece); } if (i == 4) { numdict++; pdict++; } else { fprintf(stderr,"dictionary list corruption in line \"%s\"\n",line); fflush(stderr); } } } } fclose(dictlst); return 0; } // return text encoding of dictionary int DictMgr::get_list(dictentry ** ppentry) { *ppentry = pdentry; return numdict; }