aspell-devel
[Top][All Lists]
Advanced

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

Re: [aspell-devel] sort personal dictionaries


From: Karl Chen
Subject: Re: [aspell-devel] sort personal dictionaries
Date: Wed, 19 Oct 2005 18:34:57 -0700
User-agent: Gnus/5.110004 (No Gnus v0.4) Emacs/22.0.50 (gnu/linux)

>>>>> On 2005-10-18 19:05 PDT, Kevin Atkinson writes:

    Karl> Would it be possible to output the personal dictionary
    Karl> sorted, if so specified by a configuration option?  Also
    Karl> I would like to be able write "0" as the size hint, to
    Karl> be able to merge the dictionary from multiple places
    Karl> without conflicts.

    Kevin> I will consider a patch but only if it is made optional
    Kevin> at run-time via a configure option.

Attached is a patch.  Would you please consider it?  Thanks.

Index: common/config.cpp
===================================================================
RCS file: /cvsroot/aspell/aspell/common/config.cpp,v
retrieving revision 1.77
diff -u -b -w -r1.77 config.cpp
--- common/config.cpp   3 May 2005 05:08:19 -0000       1.77
+++ common/config.cpp   20 Oct 2005 01:33:05 -0000
@@ -1477,6 +1477,10 @@
     , {"personal", KeyInfoString, PERSONAL,
        N_("personal dictionary file name")}
     , {"personal-path", KeyInfoString, "<home-dir/personal>", 0}
+    , {"personal-no-hint", KeyInfoBool, "false",
+       N_("don't write size hint to personal dictionary when saving")}
+    , {"personal-sort", KeyInfoBool, "false",
+       N_("sort personal dictionary when saving")}
     , {"prefix",   KeyInfoString, PREFIX,
        N_("prefix directory")}
     , {"repl",     KeyInfoString, REPL,
Index: common/hash.hpp
===================================================================
RCS file: /cvsroot/aspell/aspell/common/hash.hpp,v
retrieving revision 1.8
diff -u -b -w -r1.8 hash.hpp
--- common/hash.hpp     3 May 2005 05:08:19 -0000       1.8
+++ common/hash.hpp     20 Oct 2005 01:33:05 -0000
@@ -47,6 +47,11 @@
   template <class Value>
   class HT_Iterator {
   public: // but don't use
+    typedef std::input_iterator_tag iterator_category;
+    typedef Value                   value_type;
+    typedef ptrdiff_t               difference_type;
+    typedef Value*                  pointer;
+    typedef Value&                  reference;
     typedef typename BlockSList<Value>::Node Node;
     Node * * t;
     Node * * n;
Index: modules/speller/default/writable.cpp
===================================================================
RCS file: /cvsroot/aspell/aspell/modules/speller/default/writable.cpp,v
retrieving revision 1.30
diff -u -b -w -r1.30 writable.cpp
--- modules/speller/default/writable.cpp        3 May 2005 05:08:19 -0000       
1.30
+++ modules/speller/default/writable.cpp        20 Oct 2005 01:33:05 -0000
@@ -99,6 +99,7 @@
   WritableBase(BasicType t, const char * n, const char * s, const char * cs)
     : Dictionary(t,n),
       suffix(s), compatibility_suffix(cs),
+      personal_no_hint(false), personal_sort(false),
       use_soundslike(true) {fast_lookup = true;}
   virtual ~WritableBase() {}
   
@@ -121,6 +122,12 @@
   PosibErr<void> synchronize() {return save(true);}
   PosibErr<void> save_noupdate() {return save(false);}
 
+  template <typename InputIterator>
+  void save_words(FStream&, InputIterator, InputIterator);
+
+  bool personal_no_hint;
+  bool personal_sort;
+
   bool use_soundslike;
   ObjStack             buffer;
  
@@ -139,6 +146,9 @@
   const String f = file_name();
   FStream in;
 
+  personal_no_hint = config.retrieve_bool("personal-no-hint");
+  personal_sort = config.retrieve_bool("personal-sort");
+
   if (file_exists(f)) {
       
     RET_ON_ERR(open_file_readlock(in, f));
@@ -607,19 +617,40 @@
   return no_err;
 }
 
-PosibErr<void> WritableDict::save(FStream & out, ParmString file_name) 
+template <typename InputIterator>
+inline void WritableBase::save_words(FStream& out, InputIterator i, 
InputIterator e)
 {
-  out.printf("personal_ws-1.1 %s %i %s\n", 
-             lang_name(), word_lookup->size(), file_encoding.c_str());
-
-  WordLookup::const_iterator i = word_lookup->begin();
-  WordLookup::const_iterator e = word_lookup->end();
-    
   ConvP conv(oconv);
   for (;i != e; ++i) {
     const char *w = (*i)->word_;
     out.printf("%s\n", conv(w));
   }
+}
+
+// return true if r1 < r2
+inline bool compare_WordRec(WordRec const* r1, WordRec const* r2)
+{
+  return strcmp(r1->key(), r2->key()) < 0;
+}
+
+PosibErr<void> WritableDict::save(FStream & out, ParmString file_name)
+{
+  int size = personal_no_hint ? 0 : word_lookup->size();
+
+  out.printf("personal_ws-1.1 %s %i %s\n",
+             lang_name(), size, file_encoding.c_str());
+
+  if (personal_sort) {
+    // WordVec sorted_words(word_lookup->begin(), word_lookup->end());
+    // WordVec doesn't support the iterator copy constructor
+    WordVec sorted_words;
+    sorted_words.assign(word_lookup->begin(), word_lookup->end());
+    std::sort(sorted_words.begin(), sorted_words.end(), compare_WordRec);
+    save_words(out, sorted_words.begin(), sorted_words.end());
+  } else {
+    save_words(out, word_lookup->begin(), word_lookup->end());
+  }
+
   return no_err;
 }
 
-- 
Karl 2005-10-19 18:33

reply via email to

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