예제 #1
0
int main(int argc, char *argv[])
{
  int i, chg, rev, np;
  progname = argv[0];
  if (argc != 2) {
    fprintf(stderr, "Usage: %s dict\n", progname);
    exit(1);
  }
  tracef("Started");
  readdict(argv[1]);
  tracef("Dictionary read");
  rdict = (Word **)xmalloc(nword*sizeof(Word *));
  memcpy(rdict, dict, nword*sizeof(Word *));
  qsort(dict, nword, sizeof(Word *), wordcmp); /* sort forwards */
  tracef("Sorted fwd");
  qsort(rdict, nword, sizeof(Word *), rwordcmp); /* sort backwards */
  tracef("Sorted bwd");
  for (i=0; i<nword; i++) {
    dict[i]->map = (1<<(dict[i]->len+1))-1;
  }
  tracef("Set map");
  rev = FALSE;
  do {
    chg = FALSE;
    for (i=0; i<nword; i++) {
      if ((rev? check_rword: check_word)(dict[i])) chg = TRUE;
    }
    if ((np = purge()) != 0) chg = TRUE;
    tracef("%d words purged", np);
    rev = !rev;
  } while (chg);
  printdict(dict);
  return 0;
}
예제 #2
0
int
read_file (struct wnn_file *wf)
{
  FILE *fp;
  struct wnn_file_head fh;
  if (wf->localf == REMOTE)
    {
      if (fopen_read_cur (wf->name) == 0)
        {
          wnn_errorno = WNN_FILE_READ_ERROR;
          log_err ("read_file:could not open file %s.", wf->name);
          return (-1);
        }
      fp = NULL;
    }
  else
    {
#ifdef WRITE_CHECK
      check_backup (wf->name);
#endif
      if ((fp = fopen (wf->name, "r")) == NULL)
        {
          wnn_errorno = WNN_FILE_READ_ERROR;
          log_err("read_file:could not open file %s.", wf->name);
          return (-1);
        }
    }
  if (input_file_header (fp, &fh) == -1)
    {
      wnn_errorno = WNN_NOT_A_FILE;
      goto ERROR_RET;
    }
  bcopy ((char *) &(fh.file_uniq), (char *) &(wf->f_uniq), WNN_F_UNIQ_LEN);
  bcopy ((char *) &(fh.file_uniq_org), (char *) &(wf->f_uniq_org), WNN_F_UNIQ_LEN);
  strncpy (wf->passwd, fh.file_passwd, WNN_PASSWD_LEN);
  wf->file_type = fh.file_type;
  wf->ref_count = 0;

  switch (fh.file_type)
    {
    case WNN_FT_DICT_FILE:
      wf->area = (char *) readdict (fp);
      if (wf->area == NULL)
        goto ERROR_RET;
      break;
    case WNN_FT_HINDO_FILE:
      wf->area = (char *) readhindo (fp);
      if (wf->area == NULL)
        goto ERROR_RET;
      break;
    case WNN_FT_FUZOKUGO_FILE:
      wf->area = (char *) fzk_read (fp);
      if (wf->area == NULL)
        goto ERROR_RET;
      break;
    }
  vclose (fp);
  return (0);
ERROR_RET:
  vclose (fp);
  return (-1);
}