#include #include #include #include "hunspell.hxx" #include "textparser.hxx" #ifndef W32 using namespace std; #endif int main(int argc, char** argv) { FILE * f; /* first parse the command line options */ for (int i = 1; i < 6; i++) if (!argv[i]) { fprintf(stderr, "chmorph - change affixes by morphological analysis and generation\n" "correct syntax is:\nchmorph affix_file " "dictionary_file file_to_convert STRING1 STRING2\n" "STRINGS may be arbitrary parts of the morphological descriptions\n" "example: chmorph hu.aff hu.dic hu.txt SG_2 SG_3 " " (convert informal Hungarian second person texts to formal third person texts)\n"); exit(1); } /* open the words to check list */ f = fopen(argv[3], "r"); if (!f) { fprintf(stderr, "Error - could not open file to check\n"); exit(1); } Hunspell *pMS = new Hunspell(argv[1], argv[2]); TextParser * p = new TextParser("qwertzuiopasdfghjklyxcvbnméáúõûóüöíQWERTZUIOPASDFGHJKLYXCVBNMÍÉÁÕÚÖÜÓÛ"); char buf[MAXLNLEN]; char * next; while(fgets(buf,MAXLNLEN,f)) { p->put_line(buf); while ((next=p->next_token())) { char ** pl; int pln = pMS->analyze(&pl, next); if (pln) { int gen = 0; for (int i = 0; i < pln; i++) { char *pos = strstr(pl[i], argv[4]); if (pos) { char * r = (char * ) malloc(strlen(pl[i]) - strlen(argv[4]) + strlen(argv[5]) + 1); strncpy(r, pl[i], pos - pl[i]); strcpy(r + (pos - pl[i]), argv[5]); strcat(r, pos + strlen(argv[4])); free(pl[i]); pl[i] = r; gen = 1; } } if (gen) { char **pl2; int pl2n = pMS->generate(&pl2, next, pl, pln); if (pl2n) { p->change_token(pl2[0]); pMS->free_list(&pl2, pl2n); // jump over the (possibly un)modified word free(next); next=p->next_token(); } } pMS->free_list(&pl, pln); } free(next); } fprintf(stdout, "%s\n", p->get_line()); } delete p; fclose(f); return 0; }