diff Wnn/etc/revdic.c @ 0:bbc77ca4def5

initial import
author Yoshiki Yazawa <yaz@cc.rim.or.jp>
date Thu, 13 Dec 2007 04:30:14 +0900
parents
children c966456648ad
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wnn/etc/revdic.c	Thu Dec 13 04:30:14 2007 +0900
@@ -0,0 +1,443 @@
+/*
+ *  $Id: revdic.c,v 1.5 2004/05/21 16:39:32 aono Exp $
+ */
+
+/*
+ * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
+ * This file is part of FreeWnn.
+ * 
+ * Copyright Kyoto University Research Institute for Mathematical Sciences
+ *                 1987, 1988, 1989, 1990, 1991, 1992
+ * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
+ * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992
+ * Copyright FreeWnn Project 1999, 2000, 2002
+ *
+ * Maintainer:  FreeWnn Project   <freewnn@tomo.gr.jp>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdio.h>
+#include "commonhd.h"
+#include "jslib.h"
+#include "jh.h"
+#include "jdata.h"
+
+
+#ifndef min
+#define min(a, b) ((a > b)? b:a)
+#define max(a, b) ((a < b)? b:a)
+#endif
+
+
+/*
+ * rev_ud_hontai(hostart, maxhontai)
+ * rev_ud_table(tary, maxtable)
+ * rev_sd_hontai(hostart)
+ * rev_hinsi(hinsi, maxserial)
+ */
+
+static int tmptmp;
+
+#define rev_int(x) (tmptmp = *(x), *(x) = ((tmptmp >> 24) & 0xff) | \
+                                      (((tmptmp >> 16) & 0xff) << 8) | \
+                                      (((tmptmp >> 8) & 0xff) << 16) | \
+                                      (((tmptmp & 0xff) << 24)))
+
+#define rev_short(x) (tmptmp = *(x), *(x) = ((tmptmp >> 8) & 0xff) | \
+                                            ((tmptmp & 0xff) << 8))
+
+#define rev_int_org(x) (tmptmp = *(x), *(x) = ((tmptmp >> 24) & 0xff) | \
+                                      (((tmptmp >> 16) & 0xff) << 8) | \
+                                      (((tmptmp >> 8) & 0xff) << 16) | \
+                                      ((tmptmp & 0xff) << 24), tmptmp)
+
+#define rev_short_org(x) (tmptmp = *(x), *(x) = ((tmptmp >> 8) & 0xff) | \
+                                            ((tmptmp & 0xff) << 8), tmptmp)
+
+
+
+void
+rev_ud_hontai (hostart, maxhontai, match)
+     UCHAR *hostart;
+     int maxhontai;
+     int match;                 /* whether the cpu type match the dictionary */
+{
+  UCHAR *hoend = hostart + maxhontai;
+  struct uind2 *hop, *hop1;
+  int k;
+  int len;
+
+  /* Skip first 4 bytes for some reason. (cf. ujistoud() in atod.c) */ 
+  for (hop = (struct uind2 *)((int *) hostart + 1); (UCHAR *) hop < hoend;)
+    {
+      rev_int (&(hop->next));
+      rev_int (&(hop->serial));
+      rev_int (&(hop->kanjipter));
+      rev_short (&(hop->kosuu));
+      if (match)
+        {
+          len = hop->yomi[0];
+          hop1 = (struct uind2 *) (AL_INT (&(hop->yomi[0]) + 1 + max ((len - 4), 0)));
+          rev_short (&(hop->yomi[0]));
+          for (k = 0; k < len - 4; k++)
+            {
+              rev_short (&(hop->yomi[k + 1]));
+            }
+          hop = hop1;
+        }
+      else
+        {
+          rev_short (&(hop->yomi[0]));
+          len = hop->yomi[0];
+          for (k = 0; k < len - 4; k++)
+            {
+              rev_short (&(hop->yomi[k + 1]));
+            }
+          hop = (struct uind2 *) (AL_INT (&(hop->yomi[0]) + 1 + max ((len - 4), 0)));
+        }
+    }
+}
+
+
+void
+rev_ud_table (tary, maxtable, match)
+     struct uind1 *tary;
+     int maxtable;
+     int match;
+{
+  int k;
+
+  for (k = 0; k < maxtable; k++)
+    {
+      rev_int (&(tary[k].pter1));
+      rev_int (&(tary[k].pter));
+      rev_int (&(tary[k].yomi1));
+      rev_int (&(tary[k].yomi2));
+    }
+}
+
+void
+rev_hinsi (hinsi, maxserial, match)
+     unsigned short *hinsi;
+     int maxserial;
+     int match;
+{
+  int k;
+
+  for (k = 0; k < maxserial; k++)
+    {
+      rev_short (&(hinsi[k]));
+    }
+}
+
+/*
+ * first element of each node is syurui,
+ * which is unsigned short less than 0xff.
+ */
+
+#define match_machine(x) (*(unsigned short *)(x) & 0xff)
+
+void travel_next_nodes ();
+void rev_sd_node ();
+
+void
+rev_sd_hontai0 (hopter, hostart, match)
+     UCHAR *hostart;
+     UCHAR *hopter;
+     int match;
+{
+  if (match)
+    {
+      travel_next_nodes (hopter, hostart, match);
+      rev_sd_node (hopter, hostart, match);
+    }
+  else
+    {
+      rev_sd_node (hopter, hostart, match);
+      travel_next_nodes (hopter, hostart, match);
+    }
+}
+
+void
+rev_sd_hontai (hostart, match)
+     UCHAR *hostart;
+     int match;
+{
+  rev_sd_hontai0 (hostart, hostart, match);
+}
+
+void
+travel_next_nodes (hopter, hostart, match)
+     UCHAR *hostart, *hopter;
+     int match;
+{
+  int k;
+  int tsize;
+  w_char *charst;
+  w_char *sumst;
+  int *ptrst;
+
+  switch (*(unsigned short *) hopter)
+    {
+    case ST_NORMAL:
+      tsize = *(w_char *) (hopter + 2);
+      charst = (w_char *) (hopter + 12);
+      sumst = ((w_char *) charst + tsize + 2);  /* + 2 keeps two zero words */
+      ptrst = (int *) ((w_char *) sumst + tsize);
+      for (k = 0; k < tsize; k++)
+        {
+          if (ptrst[k] != ENDPTR)
+            {
+              rev_sd_hontai0 (hostart + ptrst[k], hostart, match);
+            }
+        }
+      break;
+    case ST_NOPTER:
+      break;
+    case ST_NOENT:
+      tsize = *(w_char *) (hopter + 2);
+      charst = (w_char *) (hopter + 4);
+      ptrst = (int *) AL_INT ((w_char *) charst + tsize);
+      for (k = 0; k < tsize; k++)
+        {
+          rev_sd_hontai0 (hostart + ptrst[k], hostart, match);
+        }
+      break;
+    case ST_SMALL:
+      rev_sd_hontai0 (hopter + 4, hostart, match);
+      break;
+    }
+}
+
+#define rev_if_short(x) (match? rev_short_org(x): rev_short(x))
+#define rev_if_int(x) (match? rev_int_org(x): rev_int(x))
+
+void
+rev_sd_node (hopter, hostart, match)
+     UCHAR *hostart, *hopter;
+     int match;
+{
+  /* whether current state of dict matches the cpu type of the machine */
+  int k;
+  int tsize;
+  w_char *charst;
+  w_char *sumst;
+  int *ptrst;
+  int state;
+
+  state = rev_if_short ((unsigned short *) hopter);
+  switch (state)
+    {
+    case ST_NORMAL:
+    case ST_NOPTER:
+      tsize = rev_if_short ((w_char *) (hopter + 2));
+      rev_int ((int *) (hopter + 4));
+      rev_int ((int *) (hopter + 8));
+      charst = (w_char *) (hopter + 12);
+      sumst = ((w_char *) charst + tsize + 2);  /* + 2 keeps two zero words */
+      ptrst = (int *) ((w_char *) sumst + tsize);
+      for (k = 0; k < tsize; k++)
+        {
+          rev_short (charst + k);
+          rev_short (sumst + k);
+        }
+      if (state == ST_NORMAL)
+        {
+          for (k = 0; k < tsize; k++)
+            {
+              rev_int (ptrst + k);
+            }
+        }
+      break;
+    case ST_NOENT:
+      tsize = rev_if_short ((w_char *) (hopter + 2));
+      charst = (w_char *) (hopter + 4);
+      ptrst = (int *) AL_INT ((w_char *) charst + tsize);
+      for (k = 0; k < tsize; k++)
+        {
+          rev_short (charst + k);
+          rev_int (ptrst + k);
+        }
+      break;
+    case ST_SMALL:
+      rev_short ((unsigned short *) (hopter + 2));
+      break;
+    }
+}
+
+
+int
+little_endian ()
+{
+  int a = 1;
+#ifdef BYTE_SWAP
+  return (1);
+#else
+  return (*(char *) &a == 1);
+#endif
+}
+
+void
+rev_rd_rind1 (ri1, maxri1, match)
+     struct rind1 *ri1;
+     int maxri1;
+     int match;
+{
+  int k;
+
+  for (k = 0; k < maxri1; k++)
+    {
+      rev_int (&(ri1[k].pter1));
+      rev_int (&(ri1[k].pter));
+    }
+}
+
+void
+rev_rd_rind2 (ri2, maxri2, match)
+     struct rind2 *ri2;
+     int maxri2;
+     int match;
+{
+  int k;
+
+  for (k = 0; k < maxri2; k++)
+    {
+      rev_int (&(ri2[k].kanjipter));
+      rev_int (&(ri2[k].next[D_YOMI]));
+      rev_int (&(ri2[k].next[D_KANJI]));
+    }
+}
+
+void rev_w_char ();
+
+void
+rev_kanji (kpter, maxk, match)
+     UCHAR *kpter;
+     int maxk;
+     int match;
+{
+  UCHAR *kend = kpter + maxk;
+
+  while (kpter < kend && *kpter)
+    {
+      rev_w_char ((w_char *) (kpter + 2), *kpter / 2 - 1);
+      kpter += *kpter;
+    }
+}
+
+void
+rev_w_char (p, maxp)
+     w_char *p;
+     int maxp;
+{
+  for (; maxp > 0; maxp--)
+    {
+      rev_short (p);
+      p++;
+    }
+}
+
+/*
+ *  Change the byte-order of dictionary except for the header area.
+ *  Header and hindo area don't depend on byte-order.
+ *  If match is nonzero, the dict-type matches CPU type before conversion.
+ */
+
+int
+revdic (jtl, match)
+     struct JT *jtl;
+     int match;
+{
+  extern int rev_ud (), rev_rd (), rev_sd ();
+  int syurui = jtl->syurui;
+
+  syurui = jtl->syurui & 0xff;
+
+  if (syurui == WNN_UD_DICT)
+    {
+      if (rev_ud (jtl, match) == -1)
+        return (-1);
+    }
+  else if (syurui == WNN_REV_DICT)
+    {
+      if (rev_rd (jtl, match) == -1)
+        return (-1);
+    }
+  else
+    {
+      if (rev_sd (jtl, match) == -1)
+        return (-1);
+    }
+  return (0);
+}
+
+void rev_common ();
+
+int
+rev_ud (jtl, match)
+     struct JT *jtl;
+     int match;
+{
+  rev_common (jtl, match);
+  rev_ud_hontai (jtl->hontai, jtl->maxhontai, match);
+  rev_ud_table (jtl->table, jtl->maxtable, match);
+  return (0);
+}
+
+int
+rev_sd (jtl, match)
+     struct JT *jtl;
+     int match;
+{
+  rev_common (jtl, match);
+  rev_sd_hontai (jtl->hontai, match);
+  return (0);
+}
+
+int
+rev_rd (jtl, match)
+     struct JT *jtl;
+     int match;
+{
+  rev_common (jtl, match);
+  rev_rd_rind1 (jtl->ri1[D_YOMI], jtl->maxri1[D_YOMI], match);
+  rev_rd_rind1 (jtl->ri1[D_KANJI], jtl->maxri1[D_KANJI], match);
+  rev_rd_rind2 (jtl->ri2, jtl->maxri2, match);
+  return (0);
+}
+
+void
+rev_common (jtl, match)
+     struct JT *jtl;
+     int match;
+{
+  if (jtl->hinsi)
+    rev_hinsi (jtl->hinsi, jtl->maxserial, match);
+  if (jtl->kanji)
+    rev_kanji (jtl->kanji, jtl->maxkanji, match);
+  if (jtl->comment)
+    rev_w_char (jtl->comment, jtl->maxcomment);
+  if (jtl->hinsi_list)
+    rev_w_char (jtl->hinsi_list, jtl->maxhinsi_list);
+}
+
+/* rev_short is called from atod.c.... kanapiiii */
+void
+rev_short_fun (sp)
+     w_char *sp;
+{
+  rev_short (sp);
+}