eliot-dev
[Top][All Lists]
Advanced

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

[Eliot-dev] eliot dic/dic.h dic/dic_search.cpp dic/header.c...


From: Olivier Teuličre
Subject: [Eliot-dev] eliot dic/dic.h dic/dic_search.cpp dic/header.c...
Date: Tue, 23 Jun 2009 12:41:54 +0000

CVSROOT:        /cvsroot/eliot
Module name:    eliot
Changes by:     Olivier Teulière <ipkiss>       09/06/23 12:41:54

Modified files:
        dic            : dic.h dic_search.cpp header.cpp header.h 
                         tile.cpp tile.h 
        game           : bag.cpp pldrack.cpp rack.cpp round.cpp 
        qt             : bag_widget.cpp board_widget.cpp 
                         dic_tools_widget.cpp 
        test           : training_benj.ref training_racc.ref 
        utils          : eliottxt.cpp game_io.cpp ncurses.cpp 

Log message:
        Each letter (tile) now has a display string, defaulting to its internal 
char. It is not yet possible to change it.
        This display string is used in the ncurses and Qt interfaces.
        
        Display strings are types "wdstring" instead of plain "wstring" in a 
few places (not all of them) to help recognize them.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/dic.h?cvsroot=eliot&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/dic_search.cpp?cvsroot=eliot&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/header.cpp?cvsroot=eliot&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/header.h?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/tile.cpp?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/dic/tile.h?cvsroot=eliot&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/eliot/game/bag.cpp?cvsroot=eliot&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/eliot/game/pldrack.cpp?cvsroot=eliot&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/eliot/game/rack.cpp?cvsroot=eliot&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/eliot/game/round.cpp?cvsroot=eliot&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/eliot/qt/bag_widget.cpp?cvsroot=eliot&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/eliot/qt/board_widget.cpp?cvsroot=eliot&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/eliot/qt/dic_tools_widget.cpp?cvsroot=eliot&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_benj.ref?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/test/training_racc.ref?cvsroot=eliot&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/eliottxt.cpp?cvsroot=eliot&r1=1.35&r2=1.36
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/game_io.cpp?cvsroot=eliot&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/eliot/utils/ncurses.cpp?cvsroot=eliot&r1=1.32&r2=1.33

Patches:
Index: dic/dic.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/dic.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- dic/dic.h   22 Nov 2008 13:11:48 -0000      1.21
+++ dic/dic.h   23 Jun 2009 12:41:53 -0000      1.22
@@ -44,6 +44,17 @@
 struct params_regexp_t;
 class DicEdge;
 
+/**
+ * A wdstring is a display string, i.e. it can contains more chars thani
+ * the represented string. The difference arises in languages such as Catalan,
+ * where for example "QU" is made of 2 real characters, but corresponds to a
+ * single tile.
+ *
+ * The wdstring type has no particular interest other than signaling
+ * a bit more precisely the type of contents of the string.
+ */
+typedef wstring wdstring;
+
 class Dictionary
 {
 public:
@@ -182,7 +193,7 @@
      * @param oWordList: results
      * @param iMaxResults: maximum number of returned results (0 means no 
limit)
      */
-    void searchBenj(const wstring &iWord, vector<wstring> &oWordList,
+    void searchBenj(const wstring &iWord, vector<wdstring> &oWordList,
                     unsigned int iMaxResults = 0) const;
 
     /**
@@ -191,27 +202,18 @@
      * @param oWordList: results
      * @param iMaxResults: maximum number of returned results (0 means no 
limit)
      */
-    void searchRacc(const wstring &iWord, vector<wstring> &oWordList,
-                    unsigned int iMaxResults = 0) const;
-
-    /**
-     * Search for crosswords
-     * @param iMask: letters
-     * @param oWordList: results
-     * @param iMaxResults: maximum number of returned results (0 means no 
limit)
-     */
-    void searchCross(const wstring &iMask, vector<wstring> &oWordList,
+    void searchRacc(const wstring &iWord, vector<wdstring> &oWordList,
                      unsigned int iMaxResults = 0) const;
 
     /**
      * Search for all feasible word with "rack" plus one letter
      * @param iRack: letters
-     * @param oWordlist: results
+     * @param oWordlist: results (grouped by added character)
      * @param joker: true if the search must be performed when a joker is in 
the rack
      * @param iMaxResults: maximum number of returned results (0 means no 
limit)
      */
     void search7pl1(const wstring &iRack,
-                    map<wchar_t, vector<wstring> > &oWordList,
+                    map<wstring, vector<wdstring> > &oWordList,
                     bool joker) const;
 
     /**
@@ -226,7 +228,7 @@
      * @throw InvalidRegexpException When the regular expression cannot be 
parsed
      */
     bool searchRegExp(const wstring &iRegexp,
-                      vector<wstring> &oWordList,
+                      vector<wdstring> &oWordList,
                       unsigned int iMinLength,
                       unsigned int iMaxLength,
                       unsigned int iMaxResults = 0) const;
@@ -257,22 +259,18 @@
      */
     const DicEdge * seekEdgePtr(const wchar_t *s, const DicEdge *eptr) const;
 
-    /// Helper for searchCross()
-    void searchCrossRec(struct params_cross_t *params,
-                        vector<wstring> &oWordList,
-                        const DicEdge *edgeptr,
-                        unsigned int iMaxResults) const;
-
     /// Helper for search7pl1()
-    void searchWordByLen(struct params_7plus1_t *params,
+    void searchWordByLen(struct params_7plus1_t &params,
                          int i, const DicEdge *edgeptr) const;
 
     /// Helper for searchRegExp()
-    void searchRegexpRec(struct params_regexp_t *params,
+    void searchRegexpRec(const struct params_regexp_t &params,
                          int state,
                          const DicEdge *edgeptr,
-                         vector<wstring> &oWordList,
-                         unsigned int iMaxResults) const;
+                         vector<wdstring> &oWordList,
+                         unsigned int iMaxResults,
+                         const wdstring &iCurrWord = L"",
+                         unsigned int iNbChars = 0) const;
 };
 
 #endif /* _DIC_H_ */

Index: dic/dic_search.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/dic_search.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- dic/dic_search.cpp  22 Nov 2008 13:11:48 -0000      1.13
+++ dic/dic_search.cpp  23 Jun 2009 12:41:53 -0000      1.14
@@ -75,14 +75,28 @@
 
 struct params_7plus1_t
 {
-    wchar_t added_char;
-    map<wchar_t, vector<wstring> > *results;
+    wchar_t added_code;
+    wdstring added_display;
+    map<wdstring, vector<wdstring> > *results;
     int search_len;
     wchar_t search_wordtst[DIC_WORD_MAX];
     char search_letters[63];
 };
 
-void Dictionary::searchWordByLen(struct params_7plus1_t *params,
+wdstring convertToDisplay(const Header &iHeader, const wstring &iWord)
+{
+    wdstring dispStr;
+    dispStr.reserve(iWord.size());
+    for (unsigned int i = 0; i < iWord.size(); ++i)
+    {
+        const wdstring &chr =
+            iHeader.getDisplayStr(iHeader.getCodeFromChar(iWord[i]));
+        dispStr += chr;
+    }
+    return dispStr;
+}
+
+void Dictionary::searchWordByLen(struct params_7plus1_t &params,
                                  int i, const DicEdge *edgeptr) const
 {
     /* depth first search in the dictionary */
@@ -92,49 +106,49 @@
         if (edgeptr->chr)
         {
             /* is the letter available in search_letters */
-            if (params->search_letters[edgeptr->chr])
+            if (params.search_letters[edgeptr->chr])
             {
-                params->search_wordtst[i] = 
getHeader().getCharFromCode(edgeptr->chr);
-                params->search_letters[edgeptr->chr] --;
-                if (i == params->search_len)
+                params.search_wordtst[i] = 
getHeader().getCharFromCode(edgeptr->chr);
+                params.search_letters[edgeptr->chr] --;
+                if (i == params.search_len)
                 {
                     if (edgeptr->term)
                     {
                         // Add the solution
-                        vector<wstring> &sols = 
(*params->results)[params->added_char];
-                        if (sols.empty() || sols.back() != 
params->search_wordtst)
-                            sols.push_back(params->search_wordtst);
+                        vector<wdstring> &sols = 
(*params.results)[params.added_display];
+                        if (sols.empty() || sols.back() != 
params.search_wordtst)
+                            sols.push_back(convertToDisplay(getHeader(), 
params.search_wordtst));
                     }
                 }
                 else
                 {
                     searchWordByLen(params, i + 1, getEdgeAt(edgeptr->ptr));
                 }
-                params->search_letters[edgeptr->chr] ++;
-                params->search_wordtst[i] = L'\0';
+                params.search_letters[edgeptr->chr] ++;
+                params.search_wordtst[i] = L'\0';
             }
 
             /* the letter is of course available if we have a joker available 
*/
-            if (params->search_letters[0])
+            if (params.search_letters[0])
             {
-                params->search_wordtst[i] = 
getHeader().getCharFromCode(edgeptr->chr);
-                params->search_letters[0] --;
-                if (i == params->search_len)
+                params.search_wordtst[i] = 
getHeader().getCharFromCode(edgeptr->chr);
+                params.search_letters[0] --;
+                if (i == params.search_len)
                 {
                     if (edgeptr->term)
                     {
                         // Add the solution
-                        vector<wstring> &sols = 
(*params->results)[params->added_char];
-                        if (sols.empty() || sols.back() != 
params->search_wordtst)
-                            sols.push_back(params->search_wordtst);
+                        vector<wdstring> &sols = 
(*params.results)[params.added_display];
+                        if (sols.empty() || sols.back() != 
params.search_wordtst)
+                            sols.push_back(convertToDisplay(getHeader(), 
params.search_wordtst));
                     }
                 }
                 else
                 {
                     searchWordByLen(params, i + 1, getEdgeAt(edgeptr->ptr));
                 }
-                params->search_letters[0] ++;
-                params->search_wordtst[i] = L'\0';
+                params.search_letters[0] ++;
+                params.search_wordtst[i] = L'\0';
             }
         }
     } while (! (*edgeptr++).last);
@@ -142,7 +156,7 @@
 
 
 void Dictionary::search7pl1(const wstring &iRack,
-                            map<wchar_t, vector<wstring> > &oWordList,
+                            map<wdstring, vector<wdstring> > &oWordList,
                             bool joker) const
 {
     if (iRack == L"" || iRack.size() > DIC_WORD_MAX)
@@ -189,10 +203,11 @@
     params.results = &oWordList;
 
     /* search for all the words that can be done with the letters */
-    params.added_char = L'\0';
+    params.added_code = 0;
+    params.added_display = L"";
     params.search_len = wordlen - 1;
     params.search_wordtst[wordlen] = L'\0';
-    searchWordByLen(&params, 0, root_edge);
+    searchWordByLen(params, 0, root_edge);
 
     /* search for all the words that can be done with the letters +1 */
     params.search_len = wordlen;
@@ -200,11 +215,12 @@
     const wstring &letters = getHeader().getLetters();
     for (unsigned int i = 0; i < letters.size(); i++)
     {
-        params.added_char = letters[i];
         unsigned int code = getHeader().getCodeFromChar(letters[i]);
+        params.added_code = code;
+        params.added_display = getHeader().getDisplayStr(code);
         params.search_letters[code]++;
 
-        searchWordByLen(&params, 0, root_edge);
+        searchWordByLen(params, 0, root_edge);
 
         params.search_letters[code]--;
     }
@@ -214,7 +230,7 @@
 /****************************************/
 
 void Dictionary::searchRacc(const wstring &iWord,
-                            vector<wstring> &oWordList,
+                            vector<wdstring> &oWordList,
                             unsigned int iMaxResults) const
 {
     if (iWord == L"")
@@ -226,31 +242,28 @@
     else
         oWordList.reserve(DEFAULT_VECT_ALLOC);
 
+    // Transform the given word to make it suitable for display
+    const wdstring &displayWord = convertToDisplay(getHeader(), iWord);
+
     // Try to add a letter at the front
-    wchar_t wordtst[DIC_WORD_MAX];
-    wcscpy(wordtst + 1, iWord.c_str());
     const wstring &letters = getHeader().getLetters();
     for (unsigned int i = 0; i <= letters.size(); i++)
     {
-        wordtst[0] = letters[i];
-        if (searchWord(wordtst))
-            oWordList.push_back(wordtst);
+        if (searchWord(letters[i] + iWord))
+        {
+            const wdstring &chr =
+                
getHeader().getDisplayStr(getHeader().getCodeFromChar(letters[i]));
+            oWordList.push_back(chr + displayWord);
+        }
         if (iMaxResults && oWordList.size() >= iMaxResults)
             return;
     }
 
     // Try to add a letter at the end
-    int i;
-    for (i = 0; iWord[i]; i++)
-        wordtst[i] = iWord[i];
-
-    wordtst[i  ] = '\0';
-    wordtst[i+1] = '\0';
-
     const DicEdge *edge_seek =
         seekEdgePtr(iWord.c_str(), getEdgeAt(getRoot()));
 
-    /* points to what the next letter can be */
+    // Point to what the next letter can be
     const DicEdge *edge = getEdgeAt(edge_seek->ptr);
 
     if (edge != getEdgeAt(0))
@@ -259,8 +272,7 @@
         {
             if (edge->term)
             {
-                wordtst[i] = getHeader().getCharFromCode(edge->chr);
-                oWordList.push_back(wordtst);
+                oWordList.push_back(displayWord + 
getHeader().getDisplayStr(edge->chr));
                 if (iMaxResults && oWordList.size() >= iMaxResults)
                     return;
             }
@@ -271,7 +283,7 @@
 /****************************************/
 /****************************************/
 
-void Dictionary::searchBenj(const wstring &iWord, vector<wstring> &oWordList,
+void Dictionary::searchBenj(const wstring &iWord, vector<wdstring> &oWordList,
                             unsigned int iMaxResults) const
 {
     if (iWord == L"")
@@ -283,26 +295,27 @@
     else
         oWordList.reserve(DEFAULT_VECT_ALLOC);
 
-    wchar_t wordtst[DIC_WORD_MAX];
-    wcscpy(wordtst + 3, iWord.c_str());
+    // Transform the given word to make it suitable for display
+    const wdstring &displayWord = convertToDisplay(getHeader(), iWord);
+
     const DicEdge *edge0, *edge1, *edge2, *edgetst;
     edge0 = getEdgeAt(getRoot());
     edge0 = getEdgeAt(edge0->ptr);
     do
     {
-        wordtst[0] = getHeader().getCharFromCode(edge0->chr);
+        const wdstring &chr0 = getHeader().getDisplayStr(edge0->chr);
         edge1 = getEdgeAt(edge0->ptr);
         do
         {
-            wordtst[1] = getHeader().getCharFromCode(edge1->chr);
+            const wdstring &chr1 = getHeader().getDisplayStr(edge1->chr);
             edge2 = getEdgeAt(edge1->ptr);
             do
             {
                 edgetst = seekEdgePtr(iWord.c_str(), edge2);
                 if (edgetst->term)
                 {
-                    wordtst[2] = getHeader().getCharFromCode(edge2->chr);
-                    oWordList.push_back(wordtst);
+                    const wdstring &chr2 = 
getHeader().getDisplayStr(edge2->chr);
+                    oWordList.push_back(chr0 + chr1 + chr2 + displayWord);
                     if (iMaxResults && oWordList.size() >= iMaxResults)
                         return;
                 }
@@ -314,121 +327,33 @@
 /****************************************/
 /****************************************/
 
-struct params_cross_t
-{
-    int wordlen;
-    wchar_t mask[DIC_WORD_MAX];
-};
-
-
-void Dictionary::searchCrossRec(struct params_cross_t *params,
-                                vector<wstring> &oWordList,
-                                const DicEdge *edgeptr,
-                                unsigned int iMaxResults) const
-{
-    if (iMaxResults && oWordList.size() >= iMaxResults)
-        return;
-
-    const DicEdge *current = getEdgeAt(edgeptr->ptr);
-
-    if (params->mask[params->wordlen] == '\0')
-    {
-        if (edgeptr->term)
-            oWordList.push_back(params->mask);
-    }
-    else if (current->chr == 0)
-    {
-        // Do not go on recursion if we are on the sink
-        return;
-    }
-    else if (params->mask[params->wordlen] == '.')
-    {
-        do
-        {
-            params->mask[params->wordlen] = 
getHeader().getCharFromCode(current->chr);
-            params->wordlen ++;
-            searchCrossRec(params, oWordList, current, iMaxResults);
-            params->wordlen --;
-            params->mask[params->wordlen] = '.';
-        }
-        while (!(*current++).last);
-    }
-    else
-    {
-        do
-        {
-            if (current->chr == 
getHeader().getCodeFromChar(params->mask[params->wordlen]))
-            {
-                params->wordlen ++;
-                searchCrossRec(params, oWordList, current, iMaxResults);
-                params->wordlen --;
-                break;
-            }
-        }
-        while (!(*current++).last);
-    }
-}
-
-
-void Dictionary::searchCross(const wstring &iMask, vector<wstring> &oWordList,
-                             unsigned int iMaxResults) const
-{
-    if (iMask == L"")
-        return;
-
-    // Allocate room for all the results
-    if (iMaxResults)
-        oWordList.reserve(iMaxResults);
-    else
-        oWordList.reserve(DEFAULT_VECT_ALLOC);
-
-    struct params_cross_t params;
-
-    int i;
-    for (i = 0; i < DIC_WORD_MAX && iMask[i]; i++)
-    {
-        if (iswalpha(iMask[i]))
-            params.mask[i] = towupper(iMask[i]);
-        else
-            params.mask[i] = '.';
-    }
-    params.mask[i] = '\0';
-
-    params.wordlen = 0;
-    searchCrossRec(&params, oWordList, getEdgeAt(getRoot()), iMaxResults);
-}
-
-/****************************************/
-/****************************************/
-
 struct params_regexp_t
 {
-    int minlength;
-    int maxlength;
+    unsigned int minlength;
+    unsigned int maxlength;
     Automaton *automaton_field;
-    wchar_t word[DIC_WORD_MAX];
-    int wordlen;
 };
 
 
-void Dictionary::searchRegexpRec(struct params_regexp_t *params,
+void Dictionary::searchRegexpRec(const struct params_regexp_t &params,
                                  int state,
                                  const DicEdge *edgeptr,
-                                 vector<wstring> &oWordList,
-                                 unsigned int iMaxResults) const
+                                 vector<wdstring> &oWordList,
+                                 unsigned int iMaxResults,
+                                 const wdstring &iCurrWord,
+                                 unsigned int iNbChars) const
 {
     if (iMaxResults && oWordList.size() >= iMaxResults)
         return;
 
     int next_state;
     /* if we have a valid word we store it */
-    if (params->automaton_field->accept(state) && edgeptr->term)
+    if (params.automaton_field->accept(state) && edgeptr->term)
     {
-        int l = wcslen(params->word);
-        if (params->minlength <= l &&
-            params->maxlength >= l)
+        if (params.minlength <= iNbChars &&
+            params.maxlength >= iNbChars)
         {
-            oWordList.push_back(params->word);
+            oWordList.push_back(iCurrWord);
         }
     }
     /* we now drive the search by exploring the dictionary */
@@ -436,16 +361,12 @@
     do
     {
         /* the current letter is current->chr */
-        next_state = params->automaton_field->getNextState(state, 
current->chr);
+        next_state = params.automaton_field->getNextState(state, current->chr);
         /* 1: the letter appears in the automaton as is */
         if (next_state)
         {
-            params->word[params->wordlen] =
-                getHeader().getCharFromCode(current->chr);
-            params->wordlen ++;
-            searchRegexpRec(params, next_state, current, oWordList, 
iMaxResults);
-            params->wordlen --;
-            params->word[params->wordlen] = L'\0';
+            searchRegexpRec(params, next_state, current, oWordList, 
iMaxResults,
+                            iCurrWord + 
getHeader().getDisplayStr(current->chr), iNbChars + 1);
         }
     } while (!(*current++).last);
 }
@@ -453,7 +374,6 @@
 
 /**
  * Initialize the lists of letters with pre-defined lists
- 
  * 0: all tiles
  * 1: vowels
  * 2: consonants
@@ -489,7 +409,7 @@
 
 
 bool Dictionary::searchRegExp(const wstring &iRegexp,
-                              vector<wstring> &oWordList,
+                              vector<wdstring> &oWordList,
                               unsigned int iMinLength,
                               unsigned int iMaxLength,
                               unsigned int iMaxResults) const
@@ -542,9 +462,7 @@
         params.minlength = iMinLength;
         params.maxlength = iMaxLength;
         params.automaton_field = a;
-        memset(params.word, L'\0', sizeof(params.word));
-        params.wordlen = 0;
-        searchRegexpRec(&params, a->getInitId(),
+        searchRegexpRec(params, a->getInitId(),
                         getEdgeAt(getRoot()), oWordList,
                         iMaxResults ? iMaxResults + 1 : 0);
         delete a;

Index: dic/header.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/header.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- dic/header.cpp      21 Jun 2009 12:32:25 -0000      1.6
+++ dic/header.cpp      23 Jun 2009 12:41:53 -0000      1.7
@@ -236,9 +236,9 @@
     // Safety check
     if (iCode == 0 || iCode > m_letters.size())
     {
-        ostringstream ss;
-        ss << iCode;
-        throw DicException("Header::getCharFromCode: no letter for code " + 
ss.str());
+        ostringstream oss;
+        oss << iCode;
+        throw DicException("Header::getCharFromCode: no letter for code " + 
oss.str());
     }
     return m_letters[iCode - 1];
 }
@@ -259,6 +259,20 @@
 }
 
 
+wstring Header::getDisplayStr(unsigned int iCode) const
+{
+    // Safety check
+    if (iCode == 0 || iCode > m_letters.size())
+    {
+        ostringstream oss;
+        oss << iCode;
+        throw DicException("Header::getDisplayStr: No code for letter '" + 
oss.str());
+    }
+    // TODO: return a const wstring & instead of a wstring
+    return wstring(1, m_letters[iCode - 1]);
+}
+
+
 void Header::read(istream &iStream)
 {
     Dict_header_old aHeader;

Index: dic/header.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/header.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- dic/header.h        22 Nov 2008 13:09:28 -0000      1.4
+++ dic/header.h        23 Jun 2009 12:41:53 -0000      1.5
@@ -122,6 +122,11 @@
     unsigned int getCodeFromChar(wchar_t iChar) const;
 
     /**
+     * Return the display stirng corresponding to the given code
+     */
+    wstring getDisplayStr(unsigned int iCode) const;
+
+    /**
      * Print a readable summary of the header on standard output
      */
     void print() const;

Index: dic/tile.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/tile.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- dic/tile.cpp        22 Nov 2008 13:09:29 -0000      1.3
+++ dic/tile.cpp        23 Jun 2009 12:41:53 -0000      1.4
@@ -21,6 +21,7 @@
 
 #include <sstream>
 #include <string>
+#include <algorithm>
 #include <wctype.h>
 #include "tile.h"
 #include "header.h"
@@ -95,6 +96,20 @@
 }
 
 
+wstring Tile::getDisplayStr() const
+{
+    if (m_code == 0)
+        throw DicException("Tile::getDisplayStr: Invalid tile");
+    if (m_joker && iswalpha(m_char))
+    {
+        wstring str = m_header->getDisplayStr(m_code);
+        std::transform(str.begin(), str.end(), str.begin(), towlower);
+        return str;
+    }
+    return m_header->getDisplayStr(m_code);
+}
+
+
 wchar_t Tile::toChar() const
 {
     if (m_joker)

Index: dic/tile.h
===================================================================
RCS file: /cvsroot/eliot/eliot/dic/tile.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- dic/tile.h  22 Nov 2008 13:09:29 -0000      1.4
+++ dic/tile.h  23 Jun 2009 12:41:53 -0000      1.5
@@ -24,6 +24,7 @@
 
 #include <list>
 #include <vector>
+#include <string>
 
 using namespace std;
 
@@ -57,6 +58,7 @@
     unsigned int getPoints() const;
     wchar_t toChar() const;
     unsigned int toCode() const;
+    wstring getDisplayStr() const;
 
     static const Tile &Joker()  { return m_TheJoker; }
 

Index: game/bag.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/bag.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- game/bag.cpp        22 Nov 2008 13:09:29 -0000      1.11
+++ game/bag.cpp        23 Jun 2009 12:41:53 -0000      1.12
@@ -81,7 +81,7 @@
 void Bag::takeTile(const Tile &iTile)
 {
     ASSERT(in(iTile),
-           "The bag does not contain the letter " + 
convertToMb(iTile.toChar()));
+           "The bag does not contain the letter " + 
convertToMb(iTile.getDisplayStr()));
 
     m_tilesMap[iTile]--;
     m_ntiles--;
@@ -91,7 +91,7 @@
 void Bag::replaceTile(const Tile &iTile)
 {
     ASSERT(in(iTile) < iTile.maxNumber(),
-           "Cannot replace tile: " + convertToMb(iTile.toChar()));
+           "Cannot replace tile: " + convertToMb(iTile.getDisplayStr()));
 
     m_tilesMap[iTile]++;
     m_ntiles++;

Index: game/pldrack.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/pldrack.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- game/pldrack.cpp    22 Nov 2008 13:09:31 -0000      1.13
+++ game/pldrack.cpp    23 Jun 2009 12:41:53 -0000      1.14
@@ -203,7 +203,7 @@
 
     BOOST_FOREACH(const Tile &tile, m_oldTiles)
     {
-        s += tile.toChar();
+        s += tile.getDisplayStr();
     }
 
     if (mode > RACK_SIMPLE && getNbOld() > 0 && getNbNew() > 0)
@@ -213,7 +213,7 @@
 
     BOOST_FOREACH(const Tile &tile, m_newTiles)
     {
-        s += tile.toChar();
+        s += tile.getDisplayStr();
     }
 
     return s;

Index: game/rack.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/rack.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- game/rack.cpp       22 Nov 2008 13:09:31 -0000      1.10
+++ game/rack.cpp       23 Jun 2009 12:41:53 -0000      1.11
@@ -34,7 +34,7 @@
 void Rack::remove(const Tile &t)
 {
     ASSERT(in(t),
-           "The rack does not contain the letter " + convertToMb(t.toChar()));
+           "The rack does not contain the letter " + 
convertToMb(t.getDisplayStr()));
     m_tiles[t.toCode()]--;
     m_ntiles--;
 }
@@ -67,7 +67,11 @@
     for (unsigned int i = 1; i < m_tiles.size(); i++)
     {
         // Append m_tiles[i] copies of the char
-        rs.append(m_tiles[i], 
Dictionary::GetDic().getTileFromCode(i).toChar());
+        const wstring &chr = 
Dictionary::GetDic().getTileFromCode(i).getDisplayStr();
+        for (unsigned int j = 0; j < m_tiles[i]; ++j)
+        {
+            rs += chr;
+        }
     }
     return rs;
 }

Index: game/round.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/game/round.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- game/round.cpp      23 Nov 2008 20:13:02 -0000      1.15
+++ game/round.cpp      23 Jun 2009 12:41:53 -0000      1.16
@@ -21,6 +21,7 @@
 
 #include <string>
 #include <sstream>
+#include <algorithm> // For std::transform
 #include <wctype.h>
 #include "tile.h"
 #include "round.h"
@@ -137,15 +138,14 @@
 
 wstring Round::getWord() const
 {
-    wchar_t c;
     wstring s;
 
     for (unsigned int i = 0; i < getWordLen(); i++)
     {
-        c = getTile(i).toChar();
+        wstring chr = getTile(i).getDisplayStr();
         if (isJoker(i))
-            c = towlower(c);
-        s += c;
+            std::transform(chr.begin(), chr.end(), chr.begin(), towlower);
+        s += chr;
     }
     return s;
 }

Index: qt/bag_widget.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/qt/bag_widget.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- qt/bag_widget.cpp   30 Nov 2008 20:53:45 -0000      1.5
+++ qt/bag_widget.cpp   23 Jun 2009 12:41:54 -0000      1.6
@@ -79,10 +79,14 @@
         unsigned int nb = bag.in(tile);
         if (nb != 0)
         {
+            // Concatenate the display char nb times
+            wdstring str;
+            for (unsigned int i = 0; i < nb; ++i)
+                str += tile.getDisplayStr();
+
             int rowNum = m_model->rowCount();
             m_model->insertRow(rowNum);
-            m_model->setData(m_model->index(rowNum, 0),
-                             qfw(wstring(nb, tile.toChar())));
+            m_model->setData(m_model->index(rowNum, 0), qfw(str));
             m_model->setData(m_model->index(rowNum, 1), tile.getPoints());
         }
     }

Index: qt/board_widget.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/qt/board_widget.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- qt/board_widget.cpp 21 Feb 2009 16:53:18 -0000      1.13
+++ qt/board_widget.cpp 23 Jun 2009 12:41:54 -0000      1.14
@@ -18,6 +18,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *****************************************************************************/
 
+#include <algorithm> // For std::transform
 #include <math.h>
 #include <QtGui/QPainter>
 #include <QtGui/QPaintEvent>
@@ -138,12 +139,14 @@
             // Draw the letter
             if (m_game != NULL && !m_game->getBoard().getTile(row, 
col).isEmpty())
             {
-                wchar_t chr = towupper(m_game->getBoard().getTile(row, 
col).toChar());
+                wstring chr = m_game->getBoard().getTile(row, 
col).getDisplayStr();
+                // Make the display char in upper case
+                std::transform(chr.begin(), chr.end(), chr.begin(), towupper);
                 if (m_game->getBoard().getCharAttr(row, col) & ATTR_JOKER)
                     painter.setPen(JokerColour);
                 painter.setFont(letterFont);
                 painter.drawText(xPos, yPos + 1, squareSize, squareSize,
-                                 Qt::AlignCenter, qfw(wstring(1, chr)));
+                                 Qt::AlignCenter, qfw(chr));
                 painter.setPen(NormalColour);
 
                 // Draw the points of the tile

Index: qt/dic_tools_widget.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/qt/dic_tools_widget.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- qt/dic_tools_widget.cpp     14 Dec 2008 13:20:40 -0000      1.6
+++ qt/dic_tools_widget.cpp     23 Jun 2009 12:41:54 -0000      1.7
@@ -185,18 +185,18 @@
 
     if (rack->text() != "")
     {
-        map<wchar_t, vector<wstring> > wordList;
+        map<wstring, vector<wstring> > wordList;
         m_dic->search7pl1(qtw(rack->text()), wordList, true);
 
         int rowNum = 0;
-        map<wchar_t, vector<wstring> >::const_iterator it;
+        map<wstring, vector<wstring> >::const_iterator it;
         for (it = wordList.begin(); it != wordList.end(); it++)
         {
             // Create the header line
             model->insertRow(rowNum);
             const QModelIndex &index = model->index(rowNum, 0);
-            if (it->first)
-                model->setData(index, qfw(wstring(1, it->first)));
+            if (it->first != L"")
+                model->setData(index, qfw(it->first));
             else
                 model->setData(index, _q("Anagrams"));
             treeView->setExpanded(index, true);
@@ -300,7 +300,7 @@
         {
             model->insertRow(rowNum);
             model->setData(model->index(rowNum, 0),
-                           qfw(wstring(1, it->toChar())));
+                           qfw(it->getDisplayStr()));
             model->setData(model->index(rowNum, 1), it->getPoints());
             model->setData(model->index(rowNum, 2), it->maxNumber());
             model->setData(model->index(rowNum, 3),

Index: test/training_benj.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_benj.ref,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/training_benj.ref      23 Nov 2008 08:33:17 -0000      1.3
+++ test/training_benj.ref      23 Jun 2009 12:41:54 -0000      1.4
@@ -4,12 +4,12 @@
 mode entraĂŽnement
 [?] pour l'aide
 commande> b b maison
-PLUmaison
+PLUMAISON
 commande> b b animal
 commande> b b jures
-CONjures
-GOUjures
-PARjures
+CONJURES
+GOUJURES
+PARJURES
 commande> q
 fin du mode entraĂŽnement
 commande> q

Index: test/training_racc.ref
===================================================================
RCS file: /cvsroot/eliot/eliot/test/training_racc.ref,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- test/training_racc.ref      23 Nov 2008 08:33:17 -0000      1.3
+++ test/training_racc.ref      23 Jun 2009 12:41:54 -0000      1.4
@@ -4,24 +4,24 @@
 mode entraĂŽnement
 [?] pour l'aide
 commande> b r ave
-Bave
-Cave
-Gave
-Have
-Lave
-Nave
-Pave
-Rave
-aveC
-aveN
-aveU
-aveZ
+BAVE
+CAVE
+GAVE
+HAVE
+LAVE
+NAVE
+PAVE
+RAVE
+AVEC
+AVEN
+AVEU
+AVEZ
 commande> b r yeux
 commande> b r ka
-Oka
-Ska
-kaN
-kaS
+OKA
+SKA
+KAN
+KAS
 commande> q
 fin du mode entraĂŽnement
 commande> q

Index: utils/eliottxt.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/eliottxt.cpp,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -b -r1.35 -r1.36
--- utils/eliottxt.cpp  21 Feb 2009 16:56:33 -0000      1.35
+++ utils/eliottxt.cpp  23 Jun 2009 12:41:54 -0000      1.36
@@ -485,7 +485,7 @@
     printf("search for %s (%d,%d,%d)\n", convertToMb(regexp).c_str(),
            nres, lmin, lmax);
 
-    vector<wstring> wordList;
+    vector<wdstring> wordList;
     try
     {
         iDic.searchRegExp(regexp, wordList, lmin, lmax, nres);
@@ -496,7 +496,7 @@
         return;
     }
 
-    BOOST_FOREACH(const wstring &wstr, wordList)
+    BOOST_FOREACH(const wdstring &wstr, wordList)
     {
         printf("%s\n", convertToMb(wstr).c_str());
     }
@@ -598,22 +598,22 @@
                                 {
                                     case L'b':
                                         {
-                                            vector<wstring> wordList;
+                                            vector<wdstring> wordList;
                                             iGame.getDic().searchBenj(word, 
wordList);
-                                            BOOST_FOREACH(const wstring &wstr, 
wordList)
+                                            BOOST_FOREACH(const wdstring 
&wstr, wordList)
                                                 cout << convertToMb(wstr) << 
endl;
                                         }
                                         break;
                                     case L'p':
                                         {
-                                            map<wchar_t, vector<wstring> > 
wordMap;
+                                            map<wdstring, vector<wdstring> > 
wordMap;
                                             iGame.getDic().search7pl1(word, 
wordMap, false);
-                                            map<wchar_t, vector<wstring> 
>::const_iterator it;
+                                            map<wdstring, vector<wdstring> 
>::const_iterator it;
                                             for (it = wordMap.begin(); it != 
wordMap.end(); ++it)
                                             {
-                                                if (it->first)
+                                                if (it->first != L"")
                                                     cout << "+" << 
convertToMb(it->first) << endl;
-                                                BOOST_FOREACH(const wstring 
&wstr, it->second)
+                                                BOOST_FOREACH(const wdstring 
&wstr, it->second)
                                                 {
                                                     cout << "  " << 
convertToMb(wstr) << endl;
                                                 }
@@ -622,9 +622,9 @@
                                         break;
                                     case L'r':
                                         {
-                                            vector<wstring> wordList;
+                                            vector<wdstring> wordList;
                                             iGame.getDic().searchRacc(word, 
wordList);
-                                            BOOST_FOREACH(const wstring &wstr, 
wordList)
+                                            BOOST_FOREACH(const wdstring 
&wstr, wordList)
                                                 cout << convertToMb(wstr) << 
endl;
                                         }
                                         break;
@@ -659,22 +659,6 @@
                             iGame.trainingSetRackManual(false, letters);
                     }
                     break;
-                case L'x':
-                    {
-                        const wstring &cross = checkCrossToken(tokens, 1);
-                        if (cross == L"")
-                            helpTraining();
-                        else
-                        {
-                            vector<wstring> wordList;
-                            iGame.getDic().searchCross(cross, wordList);
-                            BOOST_FOREACH(const wstring &wstr, wordList)
-                            {
-                                printf("  %s\n", convertToMb(wstr).c_str());
-                            }
-                        }
-                    }
-                    break;
                 case L'*':
                     iGame.trainingSetRackRandom(false, PublicGame::kRACK_ALL);
                     break;

Index: utils/game_io.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/game_io.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- utils/game_io.cpp   30 Nov 2008 20:53:46 -0000      1.15
+++ utils/game_io.cpp   23 Jun 2009 12:41:54 -0000      1.16
@@ -187,7 +187,7 @@
     {
         if (bag.in(tile) > 9)
             out << " ";
-        out << setw(2) << convertToMb(tile.toChar());
+        out << setw(2) << convertToMb(tile.getDisplayStr());
     }
     out << endl;
 

Index: utils/ncurses.cpp
===================================================================
RCS file: /cvsroot/eliot/eliot/utils/ncurses.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- utils/ncurses.cpp   26 Jan 2009 20:30:43 -0000      1.32
+++ utils/ncurses.cpp   23 Jun 2009 12:41:54 -0000      1.33
@@ -244,19 +244,22 @@
             mvwprintw(win, y + row + 1, x + 3 * col + 1, "   ");
 
             // Now add the letter
-            wchar_t c = m_game->getBoard().getChar(row, col);
-            if (c)
+            const Tile &t = m_game->getBoard().getTile(row, col);
+            if (!t.isEmpty())
             {
-                cchar_t cc;
-                if (iswlower(c))
+                const wstring &chr = t.getDisplayStr();
+                int offset = 0;
+                if (chr.size() > 1)
+                    offset = -1;
+                if (m_game->getBoard().isJoker(row, col))
                 {
-                    setcchar(&cc, &c, A_BOLD, COLOR_GREEN, NULL);
-                    mvwadd_wch(win, y + row + 1, x + 3 * col + 2, &cc);
+                    wattron(win, A_BOLD | COLOR_PAIR(COLOR_GREEN));
+                    mvwprintw(win, y + row + 1, x + 3 * col + 2 + offset, 
convertToMb(chr).c_str());
+                    wattroff(win, A_BOLD);
                 }
                 else
                 {
-                    setcchar(&cc, &c, 0, 0, NULL);
-                    mvwadd_wch(win, y + row + 1, x + 3 * col + 2, &cc);
+                    mvwprintw(win, y + row + 1, x + 3 * col + 2 + offset, 
convertToMb(chr).c_str());
                 }
             }
             else
@@ -392,7 +395,7 @@
             wstring coord = r.getCoord().toString();
             ioBox.printDataLine(i, x,
                 " %2d   %s   %s   %s   %3d   %1d   %c",
-                i + 1, padAndConvert(t.getPlayedRack().toString(), 8).c_str(),
+                i + 1, padAndConvert(t.getPlayedRack().toString(), 14, 
false).c_str(),
                 padAndConvert(r.getWord(), 15, false).c_str(),
                 padAndConvert(coord, 3).c_str(), r.getPoints(),
                 t.getPlayer(), r.getBonus() ? '*' : ' ');
@@ -403,7 +406,7 @@
             wstring invWord = L"<" + m.getBadWord() + L">";
             ioBox.printDataLine(i, x,
                 " %2d   %s   %s   %s   %3d   %1d",
-                i + 1, padAndConvert(t.getPlayedRack().toString(), 8).c_str(),
+                i + 1, padAndConvert(t.getPlayedRack().toString(), 14, 
false).c_str(),
                 padAndConvert(invWord, 15, false).c_str(),
                 padAndConvert(m.getBadCoord(), 3).c_str(), m.getScore(),
                 t.getPlayer());
@@ -419,7 +422,7 @@
 
             ioBox.printDataLine(i, x,
                 " %2d   %s   %s   %s   %3d   %1d",
-                i + 1, padAndConvert(t.getPlayedRack().toString(), 8).c_str(),
+                i + 1, padAndConvert(t.getPlayedRack().toString(), 14, 
false).c_str(),
                 padAndConvert(action, 15, false).c_str(),
                 " - ", m.getScore(), t.getPlayer());
         }
@@ -427,11 +430,11 @@
     int nbLines = min(i + 2 - ioBox.getFirstLine(),
                       ioBox.getLastLine() - ioBox.getFirstLine() + 2);
     mvwvline(m_win, y, x + 4,  ACS_VLINE, nbLines);
-    mvwvline(m_win, y, x + 15, ACS_VLINE, nbLines);
-    mvwvline(m_win, y, x + 33, ACS_VLINE, nbLines);
+    mvwvline(m_win, y, x + 21, ACS_VLINE, nbLines);
     mvwvline(m_win, y, x + 39, ACS_VLINE, nbLines);
     mvwvline(m_win, y, x + 45, ACS_VLINE, nbLines);
-    mvwvline(m_win, y, x + 49, ACS_VLINE, nbLines);
+    mvwvline(m_win, y, x + 51, ACS_VLINE, nbLines);
+    mvwvline(m_win, y, x + 55, ACS_VLINE, nbLines);
 }
 
 
@@ -500,13 +503,16 @@
     int i;
     for (i = ioBox.getFirstLine(); i < (int)allTiles.size() && i < 
ioBox.getLastLine(); i++)
     {
+        const wstring &chr = allTiles[i].getDisplayStr();
+        wstring str;
+        for (unsigned int j = 0; j < m_game->getBag().in(allTiles[i]); ++j)
+             str += chr;
         ioBox.printDataLine(i, ioBox.getLeft() + 1,
                             "  %s        %2d        %2d       %s",
-                            padAndConvert(wstring(1, allTiles[i].toChar()), 
2).c_str(),
+                            padAndConvert(allTiles[i].getDisplayStr(), 
2).c_str(),
                             allTiles[i].getPoints(),
                             allTiles[i].maxNumber(),
-                            
convertToMb(wstring(m_game->getBag().in(allTiles[i]),
-                                                
allTiles[i].toChar())).c_str());
+                            convertToMb(str).c_str());
     }
 
     int nbLines = min(i + 2 - ioBox.getFirstLine(),




reply via email to

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