eliot-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Eliot-dev] Changes to eliot/dic/dic.c [antoine-1]


From: eliot-dev
Subject: [Eliot-dev] Changes to eliot/dic/dic.c [antoine-1]
Date: Sun, 23 Oct 2005 13:13:58 -0400

Index: eliot/dic/dic.c
diff -u /dev/null eliot/dic/dic.c:1.6.2.1
--- /dev/null   Sun Oct 23 17:13:58 2005
+++ eliot/dic/dic.c     Sun Oct 23 17:13:56 2005
@@ -0,0 +1,182 @@
+/* Eliot                                                                     */
+/* Copyright (C) 1999  Antoine Fraboulet                                     */
+/*                                                                           */
+/* This file is part of Eliot.                                               */
+/*                                                                           */
+/* Eliot 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.                                       */
+/*                                                                           */
+/* Elit 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
*/
+
+<<<<<<< dic.c
+/* $Id: dic.c,v 1.6.2.1 2005/10/23 17:13:56 afrab Exp $ */
+
+/**
+ *  \file   dic.c
+ *  \brief  Dawg dictionary
+ *  \author Antoine Fraboulet
+ *  \date   2002
+=======
+/*
+ * $Id: dic.c,v 1.6.2.1 2005/10/23 17:13:56 afrab Exp $
+>>>>>>> 1.6
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include "dic_internals.h"
+#include "dic.h"
+
+
+static int
+check_header(FILE* file, Dict_header *header)
+{
+  if (fread(header,sizeof(Dict_header),1,file) != 1)
+    return 1;
+  return strcmp(header->ident,_COMPIL_KEYWORD_);
+}
+
+
+int
+Dic_load(Dictionary *dic, const char* path)
+{
+  FILE* file;
+  Dict_header header;
+
+  *dic = NULL;
+  if ((file = fopen(path,"rb")) == NULL)
+    return 1;
+  if (check_header(file,&header))
+    return 2;
+  if ((*dic = (Dictionary) malloc(sizeof(struct _Dictionary))) == NULL)
+    return 3;
+  if (((*dic)->dawg = (Dawg_edge*)malloc((header.edgesused + 1)*
+                                  sizeof(Dawg_edge))) == NULL)
+    {
+      free(*dic);
+      *dic = NULL;
+      return 4;
+    }
+  if (fread((*dic)->dawg,sizeof(Dawg_edge),header.edgesused + 1,file) !=
+      (header.edgesused + 1))
+    {
+      free((*dic)->dawg);
+      free(*dic);
+      *dic = NULL;
+      return 5;
+    }
+  (*dic)->root   = header.root;
+  (*dic)->nwords = header.nwords;
+  (*dic)->nnodes = header.nodesused;
+  (*dic)->nedges = header.edgesused;
+
+  fclose(file);
+  return 0;
+}
+
+
+int
+Dic_destroy(Dictionary dic)
+{
+  if (dic != NULL)
+    {
+      if (dic->dawg != NULL)
+        free(dic->dawg);
+      else
+        {
+          free(dic);
+          return 2;
+        }
+      free(dic);
+    }
+  else
+    return 1;
+
+  return 0;
+}
+
+
+dic_elt_t
+Dic_next(Dictionary d, dic_elt_t e)
+{
+     if (! Dic_last(d,e))
+          return e+1;
+     return 0;
+}
+
+
+dic_elt_t
+Dic_succ(Dictionary d, dic_elt_t e)
+{
+  return (d->dawg[e]).ptr;
+}
+
+
+dic_elt_t
+Dic_root(Dictionary d)
+{
+  return d->root;
+}
+
+
+char
+Dic_chr(Dictionary d, dic_elt_t e)
+{
+  return (d->dawg[e]).chr;
+}
+
+
+int
+Dic_last(Dictionary d, dic_elt_t e)
+{
+  return (d->dawg[e]).last;
+}
+
+
+int
+Dic_word(Dictionary d, dic_elt_t e)
+{
+  return (d->dawg[e]).term;
+}
+
+
+unsigned int
+Dic_lookup(Dictionary d, dic_elt_t root, char* s)
+{
+    unsigned int p;
+begin:
+    if (! *s)
+        return root;
+    if (! Dic_succ(d, root))
+        return 0;
+    p = Dic_succ(d, root);
+    do
+    {
+        if (Dic_chr(d, p) == *s)
+        {
+            root = p;
+            s++;
+            goto begin;
+        }
+        else if (Dic_last(d, p))
+        {
+            return 0;
+        }
+        p = Dic_next(d, p);
+    } while (1);
+
+    return 0;
+}
+




reply via email to

[Prev in Thread] Current Thread [Next in Thread]