From cb2d847e6d84fb9cfb4f09db3cefc3b994671244 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 10 Mar 2022 15:21:36 -0800 Subject: [PATCH 01/13] add bonus squares for 21x21 board (linux only) --- xwords4/common/comtypes.h | 2 ++ xwords4/common/model.c | 2 +- xwords4/common/mscore.c | 4 ++++ xwords4/linux/linuxutl.c | 34 ++++++++++++++++++++++++++++------ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/xwords4/common/comtypes.h b/xwords4/common/comtypes.h index d2c35f93b..2779b4906 100644 --- a/xwords4/common/comtypes.h +++ b/xwords4/common/comtypes.h @@ -212,6 +212,8 @@ typedef enum { BONUS_DOUBLE_WORD, BONUS_TRIPLE_LETTER, BONUS_TRIPLE_WORD, + BONUS_QUAD_LETTER, + BONUS_QUAD_WORD, BONUS_LAST } XWBonusType; diff --git a/xwords4/common/model.c b/xwords4/common/model.c index 016355898..1381142da 100644 --- a/xwords4/common/model.c +++ b/xwords4/common/model.c @@ -391,7 +391,7 @@ model_setSquareBonuses( ModelCtxt* model, XWBonusType* bonuses, XP_U16 nBonuses XP_FREE( model->vol.mpool, model->vol.bonuses ); } model->vol.bonuses = XP_MALLOC( model->vol.mpool, - nBonuses * sizeof(model->vol.bonuses[0]) ); + nBonuses * sizeof(model->vol.bonuses[0]) ); XP_MEMCPY( model->vol.bonuses, bonuses, nBonuses * sizeof(model->vol.bonuses[0]) ); model->vol.nBonuses = nBonuses; diff --git a/xwords4/common/mscore.c b/xwords4/common/mscore.c index 2fbc18cf3..cdc54abc8 100644 --- a/xwords4/common/mscore.c +++ b/xwords4/common/mscore.c @@ -620,6 +620,8 @@ word_multiplier( const ModelCtxt* model, XWEnv xwe, XP_U16 col, XP_U16 row ) return 2; case BONUS_TRIPLE_WORD: return 3; + case BONUS_QUAD_WORD: + return 4; default: return 1; } @@ -634,6 +636,8 @@ tile_multiplier( const ModelCtxt* model, XWEnv xwe, XP_U16 col, XP_U16 row ) return 2; case BONUS_TRIPLE_LETTER: return 3; + case BONUS_QUAD_LETTER: + return 4; default: return 1; } diff --git a/xwords4/linux/linuxutl.c b/xwords4/linux/linuxutl.c index 3f52ad43a..6101b820d 100644 --- a/xwords4/linux/linuxutl.c +++ b/xwords4/linux/linuxutl.c @@ -115,11 +115,13 @@ linux_util_makeEmptyDict( XW_UtilCtxt* XP_UNUSED_DBG(uctx), XWEnv xwe ) #define DW BONUS_DOUBLE_WORD #define TL BONUS_TRIPLE_LETTER #define TW BONUS_TRIPLE_WORD +#define QL BONUS_QUAD_LETTER +#define QW BONUS_QUAD_WORD static XWBonusType* bonusesFor( XP_U16 boardSize, XP_U16* len ) { - static XWBonusType scrabbleBoard[] = { + static XWBonusType scrabbleBoard[] = { TW,//EM,EM,DL,EM,EM,EM,TW, EM,DW,//EM,EM,EM,TL,EM,EM, @@ -133,7 +135,7 @@ bonusesFor( XP_U16 boardSize, XP_U16* len ) TW,EM,EM,DL,EM,EM,EM,DW, }; /* scrabbleBoard */ - static XWBonusType seventeen[] = { + static XWBonusType seventeen[] = { TW,//EM,EM,DL,EM,EM,EM,TW, EM,DW,//EM,EM,EM,TL,EM,EM, @@ -146,17 +148,37 @@ bonusesFor( XP_U16 boardSize, XP_U16* len ) EM,EM,DL,EM,EM,EM,DL,//EM, TW,EM,EM,DL,EM,EM,EM,DW, TW,EM,EM,DL,EM,EM,EM,DW,DW, - }; /* scrabbleBoard */ + }; /* seventeen */ + + static XWBonusType twentyOne[] = { + QW, + EM, DW, + EM, EM, DW, + DL, EM, EM, TW, + EM, TL, EM, EM, DW, + EM, EM, QL, EM, EM, DW, + EM, EM, EM, DL, EM, EM, DW, + TW, EM, EM, EM, EM, EM, EM, DW, + EM, DW, EM, EM, TL, EM, EM, EM, TL, + EM, EM, DW, EM, EM, DL, EM, EM, EM, DL, + DL, EM, EM, TW, EM, EM, DL, EM, EM, EM, DW, + }; /* twentyOne */ XWBonusType* result = NULL; - if ( boardSize == 15 ) { + switch ( boardSize ) { + case 15: result = scrabbleBoard; *len = VSIZE(scrabbleBoard); - } else if ( boardSize == 17 ) { + break; + case 17: result = seventeen; *len = VSIZE(seventeen); + break; + case 21: + result = twentyOne; + *len = VSIZE(twentyOne); + break; } - return result; } From b34190d62d86e3f2921f3cf1a28c039675fad518 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 10 Mar 2022 16:56:09 -0800 Subject: [PATCH 02/13] make 21x21 work on Android Still needs default colors and the bonus square values working for smaller sizes. --- .../org/eehouse/android/xw4/BoardCanvas.java | 4 +- .../android/xw4/GameConfigDelegate.java | 24 +++- .../eehouse/android/xw4/jni/CommonPrefs.java | 2 +- .../app/src/main/res/values/common_rsrc.xml | 11 ++ .../app/src/main/res/values/strings.xml | 8 ++ .../main/res/xml/prefs_appear_colors_dark.xml | 10 ++ xwords4/android/jni/utilwrapper.c | 31 +----- xwords4/common/board.c | 2 +- xwords4/common/boarddrw.c | 4 +- xwords4/common/model.c | 78 +++++++++---- xwords4/common/model.h | 2 +- xwords4/common/mscore.c | 25 ++--- xwords4/common/util.h | 6 - xwords4/linux/linuxutl.c | 105 ------------------ 14 files changed, 123 insertions(+), 189 deletions(-) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java index a5a6cc257..a908741cf 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java @@ -173,7 +173,9 @@ public class BoardCanvas extends Canvas implements DrawCtx { int[] ids = { R.string.bonus_l2x_summary, R.string.bonus_w2x_summary , R.string.bonus_l3x_summary, - R.string.bonus_w3x_summary }; + R.string.bonus_w3x_summary, + R.string.bonus_l4x_summary, + R.string.bonus_w4x_summary }; m_bonusSummaries = new String[1 + ids.length]; for ( int ii = 0; ii < ids.length; ++ii ) { m_bonusSummaries[ ii+1 ] = res.getString( ids[ii] ); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java index 6d5788b91..f5a2d3699 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/GameConfigDelegate.java @@ -1123,9 +1123,12 @@ public class GameConfigDelegate extends DelegateBase private int positionToSize( int position ) { switch( position ) { - case 0: return 15; - case 1: return 13; - case 2: return 11; + case 0: return 21; + case 1: return 19; + case 2: return 17; + case 3: return 15; + case 4: return 13; + case 5: return 11; default: Assert.failDbg(); } @@ -1137,15 +1140,24 @@ public class GameConfigDelegate extends DelegateBase int size = m_gi.boardSize; int selection = 0; switch( size ) { - case 15: + case 21: selection = 0; break; - case 13: + case 19: selection = 1; break; - case 11: + case 17: selection = 2; break; + case 15: + selection = 3; + break; + case 13: + selection = 4; + break; + case 11: + selection = 5; + break; default: Assert.failDbg(); break; diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java index eec642156..a72df3583 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java @@ -79,7 +79,7 @@ public class CommonPrefs extends XWPrefs { private CommonPrefs() { playerColors = new int[4]; - bonusColors = new int[5]; + bonusColors = new int[7]; bonusColors[0] = 0xF0F0F0F0; // garbage otherColors = new int[COLOR_LAST]; } diff --git a/xwords4/android/app/src/main/res/values/common_rsrc.xml b/xwords4/android/app/src/main/res/values/common_rsrc.xml index 4d017c77b..0dae3ec8c 100644 --- a/xwords4/android/app/src/main/res/values/common_rsrc.xml +++ b/xwords4/android/app/src/main/res/values/common_rsrc.xml @@ -26,8 +26,10 @@ key_clr_player3 key_clr_bonus_l2x key_clr_bonus_l3x + key_clr_bonus_l4x key_clr_bonus_w2x key_clr_bonus_w3x + key_clr_bonus_w4x key_clr_tile_back key_clr_empty key_clr_background @@ -42,8 +44,10 @@ key_clr_player3_dark key_clr_bonus_l2x_dark key_clr_bonus_l3x_dark + key_clr_bonus_l4x_dark key_clr_bonus_w2x_dark key_clr_bonus_w3x_dark + key_clr_bonus_w4x_dark key_clr_tile_back_dark key_clr_empty_dark key_clr_background_dark @@ -198,6 +202,9 @@ https://eehouse.org/xw4/faq.html#%1$s + 21x21 + 19x19 + 17x17 15x15 13x13 11x11 @@ -389,6 +396,8 @@ @string/key_bonus_w2x @string/key_bonus_l3x @string/key_bonus_w3x + @string/key_bonus_l4x + @string/key_bonus_w4x @string/key_tile_back @string/key_empty @@ -408,6 +417,8 @@ @string/key_bonus_w2x_dark @string/key_bonus_l3x_dark @string/key_bonus_w3x_dark + @string/key_bonus_l4x_dark + @string/key_bonus_w4x_dark @string/key_tile_back_dark @string/key_empty_dark diff --git a/xwords4/android/app/src/main/res/values/strings.xml b/xwords4/android/app/src/main/res/values/strings.xml index bfe88e3b5..bbec9affe 100644 --- a/xwords4/android/app/src/main/res/values/strings.xml +++ b/xwords4/android/app/src/main/res/values/strings.xml @@ -445,6 +445,12 @@ 3W + + 4L + + 4W (No moves yet) @@ -863,10 +869,12 @@ Double letter Triple letter + Quadruple letter Double word Triple word + Quadruple word From cdc77eaf680aa7efbae5ce6f024a02d7ec515278 Mon Sep 17 00:00:00 2001 From: Eric House Date: Mon, 14 Mar 2022 18:28:08 +0100 Subject: [PATCH 10/13] add board sizes to wordlist format (English only) Modify language metadata to have possibly different counts of tiles for different board sizes. Make the necessary changes for loading such files. Works on linux version at least. Only English will build for now thanks to changes in info.txt format. --- xwords4/common/dictnry.c | 77 ++++++++++++++++++++++---------- xwords4/common/dictnry.h | 3 ++ xwords4/dawg/English/info.txt | 60 ++++++++++++++----------- xwords4/dawg/Makefile.langcommon | 8 +++- xwords4/dawg/dawg2dict.py | 30 ++++++++++--- xwords4/dawg/xloc.py | 40 +++++++++++++---- 6 files changed, 150 insertions(+), 68 deletions(-) diff --git a/xwords4/common/dictnry.c b/xwords4/common/dictnry.c index afaad90a3..8d00473a4 100644 --- a/xwords4/common/dictnry.c +++ b/xwords4/common/dictnry.c @@ -250,12 +250,12 @@ parseCommon( DictionaryCtxt* dctx, XWEnv xwe, const XP_U8** ptrp, const XP_U8* e if ( 0 < headerLen ) { dctx->desc = getNullTermParam( dctx, &ptr, &headerLen ); } else { - XP_LOGF( "%s: no note", __func__ ); + XP_LOGFF( "no note" ); } if ( 0 < headerLen ) { dctx->md5Sum = getNullTermParam( dctx, &ptr, &headerLen ); } else { - XP_LOGF( "%s: no md5Sum", __func__ ); + XP_LOGFF( "no md5Sum" ); } XP_U16 headerFlags = 0; @@ -268,12 +268,27 @@ parseCommon( DictionaryCtxt* dctx, XWEnv xwe, const XP_U8** ptrp, const XP_U8* e XP_LOGFF( "setting headerFlags: 0x%x", headerFlags ); dctx->headerFlags = headerFlags; + if ( 0 < headerLen ) { + dctx->nBoardSizes = *ptr++; + XP_ASSERT( dctx->nBoardSizes <= VSIZE(dctx->boardSizes) ); + for ( int ii = 0; ii < dctx->nBoardSizes; ++ii ) { + dctx->boardSizes[ii] = *ptr++; + } + headerLen -= 1 + dctx->nBoardSizes; + XP_ASSERT( 0 <= headerLen ); + } + if ( 0 < headerLen ) { XP_LOGFF( "skipping %d bytes of header", headerLen ); } ptr += headerLen; } + if ( 0 == dctx->nBoardSizes ) { /* wasn't provided */ + dctx->boardSizes[0] = 15; + dctx->nBoardSizes = 1; + } + if ( isUTF8 ) { numFaceBytes = *ptr++; } @@ -301,7 +316,8 @@ parseCommon( DictionaryCtxt* dctx, XWEnv xwe, const XP_U8** ptrp, const XP_U8* e dctx->nFaces = numFaces; - dctx->countsAndValues = XP_MALLOC( dctx->mpool, numFaces * 2 ); + dctx->countsAndValues = XP_MALLOC( dctx->mpool, + numFaces * (1 + dctx->nBoardSizes) ); XP_U16 facesSize = numFaceBytes; if ( !isUTF8 ) { facesSize /= 2; @@ -316,8 +332,9 @@ parseCommon( DictionaryCtxt* dctx, XWEnv xwe, const XP_U8** ptrp, const XP_U8* e unsigned short xloc; XP_MEMCPY( &xloc, ptr, sizeof(xloc) ); ptr += sizeof(xloc); - XP_MEMCPY( dctx->countsAndValues, ptr, numFaces*2 ); - ptr += numFaces*2; + size_t cvSize = numFaces * (1 + dctx->nBoardSizes); + XP_MEMCPY( dctx->countsAndValues, ptr, cvSize ); + ptr += cvSize; dctx->langCode = xloc & 0x7F; } @@ -413,7 +430,7 @@ dict_getBlankTile( const DictionaryCtxt* dict ) } /* dict_getBlankTile */ XP_U16 -dict_getTileValue( const DictionaryCtxt* dict, Tile tile ) +dict_getTileValue( const DictionaryCtxt* dict, const Tile tile ) { XP_ASSERT( !!dict ); if ( (tile & TILE_VALUE_MASK) != tile ) { @@ -421,9 +438,11 @@ dict_getTileValue( const DictionaryCtxt* dict, Tile tile ) tile == dict_getBlankTile( dict ) ); } XP_ASSERT( tile < dict->nFaces ); - tile *= 2; + int offset = tile * (1 + dict->nBoardSizes); XP_ASSERT( !!dict->countsAndValues ); - return dict->countsAndValues[tile+1]; + XP_U16 result = dict->countsAndValues[offset + dict->nBoardSizes]; + /* XP_LOGFF( "(%d) => %d", tile, result ); */ + return result; } /* dict_getTileValue */ static const XP_UCHAR* @@ -479,22 +498,32 @@ dict_getNextTileString( const DictionaryCtxt* dict, Tile tile, XP_U16 dict_numTilesForSize( const DictionaryCtxt* dict, Tile tile, XP_U16 nCols ) { - tile *= 2; - XP_U16 count = dict->countsAndValues[tile]; - - /* Wordlists are built assuming 15x15 boards. Different sized boards need - different numbers of tiles. The wordlist might provide for the size we - have. If not, let's adjust the count based on how many squares we have - vs. 15x15. - */ - XP_U16 pct = (nCols * nCols * 100) / (15 * 15); - XP_U16 newCount = count * pct / 100; - if ( 50 < (count * pct) % 100 ) { - ++newCount; + XP_Bool matched = XP_FALSE; + int offset = tile * (1 + dict->nBoardSizes); + for ( int ii = 0; !matched && ii < dict->nBoardSizes; ++ii ) { + if ( nCols == dict->boardSizes[ii] ) { /* perfect match? */ + offset += ii; + matched = XP_TRUE; + } } - XP_LOGFF( "adjusted count %d to %d based on pct of %d", count, newCount, pct ); - count = newCount; + XP_U16 count = dict->countsAndValues[offset]; + if ( !matched ) { + /* Older wordlists are built assuming 15x15 boards. Different sized + boards need different numbers of tiles. The wordlist might provide + for the size we have. If not, let's adjust the count based on how + many squares we have vs. 15x15. + */ + XP_U16 pct = (nCols * nCols * 100) / (15 * 15); + XP_U16 newCount = count * pct / 100; + if ( 50 < (count * pct) % 100 ) { + ++newCount; + } + // XP_LOGFF( "adjusted count %d to %d based on pct of %d", count, newCount, pct ); + count = newCount; + } + + // XP_LOGFF( "(tile=%d, ncols=%d) => %d", tile, nCols, count ); return count; } /* dict_numTiles */ @@ -702,6 +731,7 @@ dict_writeToStream( const DictionaryCtxt* dict, XWStreamCtxt* stream ) stream_putBits( stream, 6, dict->nFaces ); + XP_ASSERT(0); /* if this fires, need to fix for per-boardSize counts */ for ( ii = 0; ii < dict->nFaces*2; ii+=2 ) { XP_U16 count, value; @@ -789,6 +819,7 @@ common_destructor( DictionaryCtxt* dict, XWEnv XP_UNUSED(xwe) ) void dict_loadFromStream( DictionaryCtxt* dict, XWEnv xwe, XWStreamCtxt* stream ) { + XP_ASSERT(0); /* if this fires, need to fix for per-boardSize counts */ XP_U8 nFaces, nFaceBytes; XP_U16 maxCountBits, maxValueBits; XP_U16 ii, nSpecials; @@ -1043,7 +1074,7 @@ make_stubbed_dict( MPFORMAL_NOCOMMA ) setBlankTile( dict ); return dict; -} /* make_subbed_dict */ +} /* make_stubbed_dict */ #endif /* STUBBED_DICT */ diff --git a/xwords4/common/dictnry.h b/xwords4/common/dictnry.h index 7815423b1..e47e1b1b1 100644 --- a/xwords4/common/dictnry.h +++ b/xwords4/common/dictnry.h @@ -88,6 +88,9 @@ struct DictionaryCtxt { const XP_UCHAR** facePtrs; /* elems point into faces, above */ XP_U8* countsAndValues; + XP_U8 nBoardSizes; + XP_U8 boardSizes[2]; /* will be [15] or [15,21] for now */ + SpecialBitmaps* bitmaps; XP_UCHAR** chars; XP_UCHAR** charEnds; diff --git a/xwords4/dawg/English/info.txt b/xwords4/dawg/English/info.txt index 40593ae95..a99abd55e 100644 --- a/xwords4/dawg/English/info.txt +++ b/xwords4/dawg/English/info.txt @@ -38,34 +38,40 @@ LANGINFO: will simply be excluded from the dictionary.

# English==1. Low byte is padding XLOC_HEADER:0x8100 +# COUNT_SIZES: Columns 2-n in the BEGIN_TILES section are for boards +# of what sizes? 15 is the default, and COUNT_SIZES is not needed if +# there's only one sizes column and it's for a 15x15 board. Having +# only one column that's for other than 15 is an error. +COUNT_SIZES: 15 21 + -2 0 {"_"} -9 1 'A|a' -2 3 'B|b' -2 3 'C|c' -4 2 'D|d' -12 1 'E|e' -2 4 'F|f' -3 2 'G|g' -2 4 'H|h' -9 1 'I|i' -1 8 'J|j' -1 5 'K|k' -4 1 'L|l' -2 3 'M|m' -6 1 'N|n' -8 1 'O|o' -2 3 'P|p' -1 10 'Q|q' -6 1 'R|r' -4 1 'S|s' -6 1 'T|t' -4 1 'U|u' -2 4 'V|v' -2 4 'W|w' -1 8 'X|x' -2 4 'Y|y' -1 10 'Z|z' +{"_"} 0 2 4 +'A|a' 1 9 16 +'B|b' 3 2 4 +'C|c' 3 2 6 +'D|d' 2 4 8 +'E|e' 1 12 24 +'F|f' 4 2 4 +'G|g' 2 3 5 +'H|h' 4 2 5 +'I|i' 1 9 13 +'J|j' 8 1 2 +'K|k' 5 1 2 +'L|l' 1 4 7 +'M|m' 3 2 6 +'N|n' 1 6 13 +'O|o' 1 8 15 +'P|p' 3 2 4 +'Q|q' 10 1 2 +'R|r' 1 6 13 +'S|s' 1 4 10 +'T|t' 1 6 15 +'U|u' 1 4 7 +'V|v' 4 2 3 +'W|w' 4 2 4 +'X|x' 8 1 2 +'Y|y' 4 2 4 +'Z|z' 10 1 2 # should ignore all after the above diff --git a/xwords4/dawg/Makefile.langcommon b/xwords4/dawg/Makefile.langcommon index 45d26f033..432bbf118 100644 --- a/xwords4/dawg/Makefile.langcommon +++ b/xwords4/dawg/Makefile.langcommon @@ -220,7 +220,8 @@ endif frankspecials.bin: ../frank_mkspecials.py $(BMPFILES) $< $(BLANK_INFO) $(LANG_SPECIAL_INFO) > $@ -$(XWLANG)%.$(FRANK_EXT): dawg$(XWLANG)%.stamp $(XWLANG)%_flags.bin $(XWLANG)%_newheader.bin charcount.bin table.bin values.bin frankspecials.bin +$(XWLANG)%.$(FRANK_EXT): dawg$(XWLANG)%.stamp $(XWLANG)%_flags.bin $(XWLANG)%_newheader.bin \ + charcount.bin table.bin values.bin frankspecials.bin cat $(XWLANG)$*_flags.bin $(XWLANG)$*_newheader.bin charcount.bin table.bin values.bin \ frankspecials.bin $(XWLANG)StartLoc.bin \ $$(ls dawg$(XWLANG)$*_*.bin) > $@ @@ -273,6 +274,9 @@ allbins: $(MAKE) TARGET_TYPE=FRANK byodbins rm palmspecials.bin +boardSizes.bin: ../xloc.py info.txt + ../xloc.py -bs -out $@ + table.bin: ../xloc.py ifdef NEWDAWG ../xloc.py $(ENCP) -tn -out $@ @@ -308,7 +312,7 @@ $(XWLANG)%_headerFlags.bin: perl -e "print pack(\"n\",$$FLAGS)" > $@ $(XWLANG)%_newheader.bin: $(XWLANG)%_wordcount.bin $(XWLANG)%_note.bin \ - $(XWLANG)%_md5sum.bin $(XWLANG)%_headerFlags.bin + $(XWLANG)%_md5sum.bin $(XWLANG)%_headerFlags.bin boardSizes.bin SIZ=0; \ for FILE in $+; do \ SIZ=$$(($$SIZ + $$(ls -l $$FILE | awk '{print $$5}'))); \ diff --git a/xwords4/dawg/dawg2dict.py b/xwords4/dawg/dawg2dict.py index 3c325f188..9d7ae87b1 100755 --- a/xwords4/dawg/dawg2dict.py +++ b/xwords4/dawg/dawg2dict.py @@ -54,12 +54,13 @@ def splitFaces( buf ): return faces -def loadCountsAndValues( fh, numFaces, data ): - twoBytesFmt = struct.Struct('BB') +def loadCountsAndValues( fh, numFaces, nSizes, data ): for ii in range(numFaces): - pair = twoBytesFmt.unpack(fh.read(twoBytesFmt.size)) - data[ii]['count'] = int(pair[0]) - data[ii]['val'] = int(pair[1]) + counts = [] + for jj in range(nSizes): + counts.append(int.from_bytes(fh.read(1), 'little')) + data[ii]['counts'] = counts + data[ii]['val'] = int.from_bytes(fh.read(1), 'little') def eatBitmap( fh ): nCols = int(oneByteFmt.unpack(fh.read(oneByteFmt.size))[0]) @@ -142,6 +143,7 @@ def process(args): with open(args.DAWG, "rb") as dawg: nWords = 0 + boardSizes = [15] headerFmt = struct.Struct('!HH') (flags, headerLen) = headerFmt.unpack(dawg.read(headerFmt.size)) @@ -162,7 +164,21 @@ def process(args): sys.exit(0) md5Sum = getNullTermParam(header) print( 'header: read sum: {}'.format(md5Sum), file=sys.stderr ) - except: + + # skip header flags + header.read(2) + print( 'header: skipped flags', file=sys.stderr) + + nBoardSizes = int.from_bytes(header.read(1), 'big') + print( 'header: nBoardSizes: {}'.format(nBoardSizes), file=sys.stderr ) + boardSizes = [] + for ii in range(nBoardSizes): + siz = int.from_bytes(header.read(1), 'big') + boardSizes.append(siz) + print( 'header: read sizes: {}'.format(boardSizes), file=sys.stderr) + + except Exception as ex: + print( 'header: exception!! {} '.format(ex) ) md5Sum = None if args.GET_SUM: @@ -214,7 +230,7 @@ def process(args): langCode = 0x7F & oneByteFmt.unpack(dawg.read(oneByteFmt.size))[0] dawg.read( oneByteFmt.size ) # skip byte - loadCountsAndValues( dawg, numFaces, data ) + loadCountsAndValues( dawg, numFaces, len(boardSizes), data ) loadSpecialData( dawg, data ) offsetStruct = struct.Struct('!L') diff --git a/xwords4/dawg/xloc.py b/xwords4/dawg/xloc.py index c329ebd34..b3e651817 100755 --- a/xwords4/dawg/xloc.py +++ b/xwords4/dawg/xloc.py @@ -8,7 +8,10 @@ def errorOut(msg): def mkParser(): parser = argparse.ArgumentParser() parser.add_argument('-enc', dest = 'ENCODING', type = str, help = 'use this encoding' ) - parser.add_argument('-tn', dest = 'DO_TABLE', action = 'store_true', help = 'output table file' ) + parser.add_argument('-tn', dest = 'DO_TABLE', action = 'store_true', + help = 'output table file' ) + parser.add_argument('-bs', dest = 'DO_BOARDSIZE', action = 'store_true', + help = 'output boardSizes file' ) # parser.add_argument('-tn', dest = 'UNICODE', default = False, # action = 'store_true', help = 'assume unicode') @@ -53,8 +56,10 @@ def parseTileInfo(infoFile, encoding): if sEndTiles.match(line): break else: - (count, val, face) = line.split(None, 2) - result['_TILES'].append((count, val, face)) + (face, val, counts) = line.split(None, 2) + result['_TILES'].append({'counts': counts, + 'val': val, + 'face': face}) elif sBeginTiles.match(line): inTiles = True else: @@ -72,11 +77,11 @@ def printLetters( letters, outfile ): outfile.write(letters.encode('utf8')) def writeMapFile(xlocToken, outfile): - print('writeMapFile()') + print('writeMapFile(out={})'.format(outfile)) tiles = xlocToken['_TILES'] specialCount = 0 for tile in tiles: - face = tile[2] + face = tile['face'] match = sSingleCharMatch.match(face) if match: printLetters( match.group(1), outfile ) @@ -94,13 +99,25 @@ def writeMapFile(xlocToken, outfile): def writeValuesFile(xlocToken, outfile): header = xlocToken.get('XLOC_HEADER') or errorOut('no XLOC_HEADER found') - print('writing header: {}'.format(header)) + print('writeValuesFile(out={}): writing header: {}'.format(outfile, header)) outfile.write(struct.pack('!H', int(header, 16))) + nCounts = 0 for tile in xlocToken['_TILES']: - val = int(tile[0]) - count = int(tile[1]) - outfile.write(struct.pack('BB', val, count)) + counts = tile['counts'].split() + assert nCounts == 0 or nCounts == len(counts) + nCounts = len(counts) + for count in counts: + outfile.write(struct.pack('B', int(count))) + + val = int(tile['val']) + outfile.write(struct.pack('B', val)) + +def writeBoardSizesFile(xlocToken, outfile): + cs = xlocToken.get('COUNT_SIZES', '15').split() + outfile.write(struct.pack('B', len(cs))) + for siz in cs: + outfile.write(struct.pack('B', int(siz))) def main(): print('{}.main {} called'.format(sys.argv[0], sys.argv[1:])) @@ -127,6 +144,11 @@ def main(): with open(path, 'wb') as outfile: writeValuesFile( xlocToken, outfile ) + if args.DO_BOARDSIZE and args.OUTFILE: + with open(args.OUTFILE, 'wb') as outfile: + writeBoardSizesFile( xlocToken, outfile ) + + ############################################################################## if __name__ == '__main__': main() From c970d397686532e982e7ab08cd79cc56add45ff1 Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 15 Mar 2022 10:12:31 +0100 Subject: [PATCH 11/13] move extra counts to header Fix so old versions of the app will still be able to read the new format --- xwords4/dawg/English/Makefile.BasEnglish | 2 +- xwords4/dawg/English/info.txt | 3 +- xwords4/dawg/Makefile.langcommon | 16 ++++++-- xwords4/dawg/dawg2dict.py | 34 ++++++++++------- xwords4/dawg/xloc.py | 47 ++++++++++++++++++------ 5 files changed, 72 insertions(+), 30 deletions(-) diff --git a/xwords4/dawg/English/Makefile.BasEnglish b/xwords4/dawg/English/Makefile.BasEnglish index fa67d38a8..0041e8dd5 100644 --- a/xwords4/dawg/English/Makefile.BasEnglish +++ b/xwords4/dawg/English/Makefile.BasEnglish @@ -16,7 +16,7 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. XWLANG=BasEnglish -LANGCODE=en_US +LANGCODE=en DICT2DAWGARGS = -r -nosort DICTNOTE = "Wordlist created in the 1930s for language learners" diff --git a/xwords4/dawg/English/info.txt b/xwords4/dawg/English/info.txt index a99abd55e..ca95195f9 100644 --- a/xwords4/dawg/English/info.txt +++ b/xwords4/dawg/English/info.txt @@ -15,7 +15,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -LANGCODE:en_US +LANGCODE:en +LANGNAME:English # deal with DOS files LANGFILTER: tr -d '\r' diff --git a/xwords4/dawg/Makefile.langcommon b/xwords4/dawg/Makefile.langcommon index 432bbf118..16c48441a 100644 --- a/xwords4/dawg/Makefile.langcommon +++ b/xwords4/dawg/Makefile.langcommon @@ -274,8 +274,8 @@ allbins: $(MAKE) TARGET_TYPE=FRANK byodbins rm palmspecials.bin -boardSizes.bin: ../xloc.py info.txt - ../xloc.py -bs -out $@ +extraCounts.bin: ../xloc.py info.txt + ../xloc.py -ec -out $@ table.bin: ../xloc.py ifdef NEWDAWG @@ -302,6 +302,15 @@ $(XWLANG)%_note.bin: echo -n $(DICTNOTE) > $@ perl -e "print pack(\"c\",0)" >> $@ +langName.bin: ../xloc.py + ../xloc.py -info LANGNAME -out $@ + +langCode.bin: ../xloc.py + ../xloc.py -info LANGCODE -out $@ + +otherCounts.bin: ../xloc.py + ../xloc.py -oc -out otherCounts.bin + $(XWLANG)%_md5sum.bin: cat table.bin values.bin frankspecials.bin $(XWLANG)StartLoc.bin \ dawg$(XWLANG)$*_*.bin | md5sum | awk '{print $$1}' | tr -d '\n' > $@ @@ -312,7 +321,8 @@ $(XWLANG)%_headerFlags.bin: perl -e "print pack(\"n\",$$FLAGS)" > $@ $(XWLANG)%_newheader.bin: $(XWLANG)%_wordcount.bin $(XWLANG)%_note.bin \ - $(XWLANG)%_md5sum.bin $(XWLANG)%_headerFlags.bin boardSizes.bin + $(XWLANG)%_md5sum.bin $(XWLANG)%_headerFlags.bin langName.bin \ + langCode.bin otherCounts.bin SIZ=0; \ for FILE in $+; do \ SIZ=$$(($$SIZ + $$(ls -l $$FILE | awk '{print $$5}'))); \ diff --git a/xwords4/dawg/dawg2dict.py b/xwords4/dawg/dawg2dict.py index 9d7ae87b1..08248a317 100755 --- a/xwords4/dawg/dawg2dict.py +++ b/xwords4/dawg/dawg2dict.py @@ -54,13 +54,18 @@ def splitFaces( buf ): return faces -def loadCountsAndValues( fh, numFaces, nSizes, data ): +def loadCountsAndValues( fh, numFaces, extraData, data ): for ii in range(numFaces): - counts = [] - for jj in range(nSizes): - counts.append(int.from_bytes(fh.read(1), 'little')) - data[ii]['counts'] = counts + data[ii]['counts'] = {15: int.from_bytes(fh.read(1), 'little')} data[ii]['val'] = int.from_bytes(fh.read(1), 'little') + if extraData: + buf = io.BytesIO(extraData) + while True: + siz = int.from_bytes(buf.read(1), 'little') + if not siz: break + for ii in range(numFaces): + count = int.from_bytes(buf.read(1), 'little') + data[ii]['counts'][siz] = count def eatBitmap( fh ): nCols = int(oneByteFmt.unpack(fh.read(oneByteFmt.size))[0]) @@ -143,7 +148,7 @@ def process(args): with open(args.DAWG, "rb") as dawg: nWords = 0 - boardSizes = [15] + extraData = None headerFmt = struct.Struct('!HH') (flags, headerLen) = headerFmt.unpack(dawg.read(headerFmt.size)) @@ -169,13 +174,14 @@ def process(args): header.read(2) print( 'header: skipped flags', file=sys.stderr) - nBoardSizes = int.from_bytes(header.read(1), 'big') - print( 'header: nBoardSizes: {}'.format(nBoardSizes), file=sys.stderr ) - boardSizes = [] - for ii in range(nBoardSizes): - siz = int.from_bytes(header.read(1), 'big') - boardSizes.append(siz) - print( 'header: read sizes: {}'.format(boardSizes), file=sys.stderr) + langName = getNullTermParam(header) + langCode = getNullTermParam(header) + print('header: langName: {}; langCode: {}'.format(langName, langCode), + file=sys.stderr) + + extraSize = int.from_bytes(header.read(1), 'little') + print( 'header: extraSize: {}'.format(extraSize), file=sys.stderr ) + extraData = header.read(extraSize) except Exception as ex: print( 'header: exception!! {} '.format(ex) ) @@ -230,7 +236,7 @@ def process(args): langCode = 0x7F & oneByteFmt.unpack(dawg.read(oneByteFmt.size))[0] dawg.read( oneByteFmt.size ) # skip byte - loadCountsAndValues( dawg, numFaces, len(boardSizes), data ) + loadCountsAndValues( dawg, numFaces, extraData, data ) loadSpecialData( dawg, data ) offsetStruct = struct.Struct('!L') diff --git a/xwords4/dawg/xloc.py b/xwords4/dawg/xloc.py index b3e651817..ec895ffa8 100755 --- a/xwords4/dawg/xloc.py +++ b/xwords4/dawg/xloc.py @@ -10,8 +10,10 @@ def mkParser(): parser.add_argument('-enc', dest = 'ENCODING', type = str, help = 'use this encoding' ) parser.add_argument('-tn', dest = 'DO_TABLE', action = 'store_true', help = 'output table file' ) - parser.add_argument('-bs', dest = 'DO_BOARDSIZE', action = 'store_true', - help = 'output boardSizes file' ) + parser.add_argument('-oc', dest = 'DO_OTHERCOUNTS', action = 'store_true', + help = 'write extra (non-15x15 board) counts' ) + parser.add_argument('-info', dest = 'INFO_KEY', type = str, + help = 'info.txt keyword to write null-terminated' ) # parser.add_argument('-tn', dest = 'UNICODE', default = False, # action = 'store_true', help = 'assume unicode') @@ -76,6 +78,12 @@ def printLetters( letters, outfile ): letters = ' '.join(letters) outfile.write(letters.encode('utf8')) +def writeInfoFile(xlocToken, key, outfile): + val = xlocToken[key] + assert val + outfile.write(val.encode('utf8')) + outfile.write(struct.pack('B', 0 )) + def writeMapFile(xlocToken, outfile): print('writeMapFile(out={})'.format(outfile)) tiles = xlocToken['_TILES'] @@ -102,22 +110,36 @@ def writeValuesFile(xlocToken, outfile): print('writeValuesFile(out={}): writing header: {}'.format(outfile, header)) outfile.write(struct.pack('!H', int(header, 16))) + cs = xlocToken.get('COUNT_SIZES', '15').split() + useOffset = cs.index('15') + nCounts = 0 for tile in xlocToken['_TILES']: counts = tile['counts'].split() assert nCounts == 0 or nCounts == len(counts) nCounts = len(counts) - for count in counts: - outfile.write(struct.pack('B', int(count))) + assert nCounts == len(cs) + outfile.write(struct.pack('B', int(counts[useOffset]))) val = int(tile['val']) outfile.write(struct.pack('B', val)) -def writeBoardSizesFile(xlocToken, outfile): +def writeOtherCounts(xlocToken, outfile): cs = xlocToken.get('COUNT_SIZES', '15').split() - outfile.write(struct.pack('B', len(cs))) - for siz in cs: - outfile.write(struct.pack('B', int(siz))) + + tiles = xlocToken['_TILES'] + # Write the size of the data so it can be skipped by the reader, + # which won't know how many faces the tile set has yet. + totalSiz = (len(cs) - 1) * (1 + len(tiles)) + outfile.write(struct.pack('B', totalSiz)) + + for useOffset in range(len(cs)): + siz = int(cs[useOffset]) + if siz == 15: continue + outfile.write(struct.pack('B', siz)) + for tile in tiles: + count = tile['counts'].split()[useOffset] + outfile.write(struct.pack('B', int(count))) def main(): print('{}.main {} called'.format(sys.argv[0], sys.argv[1:])) @@ -128,6 +150,10 @@ def main(): errorOut('{} not found'.format(infoFile)) xlocToken = parseTileInfo(infoFile, args.ENCODING) + if args.INFO_KEY and args.OUTFILE: + with open(args.OUTFILE, 'wb') as outfile: + writeInfoFile(xlocToken, args.INFO_KEY, outfile); + if args.DO_TABLE or args.TABLE_FILE: path = args.TABLE_FILE or args.OUTFILE with open(path, 'wb') as outfile: @@ -144,10 +170,9 @@ def main(): with open(path, 'wb') as outfile: writeValuesFile( xlocToken, outfile ) - if args.DO_BOARDSIZE and args.OUTFILE: + if args.DO_OTHERCOUNTS and args.OUTFILE: with open(args.OUTFILE, 'wb') as outfile: - writeBoardSizesFile( xlocToken, outfile ) - + writeOtherCounts(xlocToken, outfile) ############################################################################## if __name__ == '__main__': From 9568e4ab0337a6644fa944215719131cf37081a8 Mon Sep 17 00:00:00 2001 From: Eric House Date: Tue, 15 Mar 2022 23:03:03 +0100 Subject: [PATCH 12/13] move extra counts into header so new dicts backward compatible --- .../app/src/main/assets/BasEnglish2to8.xwd | Bin 4803 -> 4831 bytes .../app/src/main/assets/CollegeEng_2to8.xwd | Bin 101094 -> 101206 bytes .../android/app/src/main/assets/Top5000.xwd | Bin 19907 -> 19935 bytes xwords4/android/jni/anddict.c | 8 +- xwords4/common/comtypes.h | 1 + xwords4/common/dictnry.c | 342 ++++++++++-------- xwords4/common/dictnry.h | 9 +- xwords4/dawg/English/Makefile.top5000 | 4 +- xwords4/linux/Makefile | 2 +- xwords4/linux/gtknewgame.c | 7 +- xwords4/linux/linuxdict.c | 10 +- 11 files changed, 216 insertions(+), 167 deletions(-) diff --git a/xwords4/android/app/src/main/assets/BasEnglish2to8.xwd b/xwords4/android/app/src/main/assets/BasEnglish2to8.xwd index 4a070bc2c94fb39688763e6d9f0f5569207ff9ec..8d4b9958d749670b259900304da3bdaa1e406367 100644 GIT binary patch delta 62 zcmX@CdS8`=L587uB8&M%PbDn|2G_jwoXp}3hSWR;8BrDi7B&tE7FJeXCMI?^UVauP RUM_xiW)>zErj6MVLI9&G3Z4J} delta 34 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

Dw;M=|9*$` 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 delta 36 scmcaVoAK~$MivGchS-TLx_k;6PWk02IjKdNRjDbO6AhI%)+YG^0Mc;_)c^nh diff --git a/xwords4/android/jni/anddict.c b/xwords4/android/jni/anddict.c index e9ca5d87e..9f84c046c 100644 --- a/xwords4/android/jni/anddict.c +++ b/xwords4/android/jni/anddict.c @@ -231,13 +231,7 @@ and_dictionary_destroy( DictionaryCtxt* dict, XWEnv xwe ) XP_FREE( ctxt->super.mpool, ctxt->super.bitmaps ); } - XP_FREEP( ctxt->super.mpool, &ctxt->super.md5Sum ); - XP_FREEP( ctxt->super.mpool, &ctxt->super.desc ); - XP_FREEP( ctxt->super.mpool, &ctxt->super.faces ); - XP_FREEP( ctxt->super.mpool, &ctxt->super.facePtrs ); - XP_FREEP( ctxt->super.mpool, &ctxt->super.countsAndValues ); - XP_FREEP( ctxt->super.mpool, &ctxt->super.name ); - XP_FREEP( ctxt->super.mpool, &ctxt->super.langName ); + dict_super_destroy( &ctxt->super ); if ( NULL == ctxt->byteArray ) { /* mmap case */ #ifdef DEBUG diff --git a/xwords4/common/comtypes.h b/xwords4/common/comtypes.h index 2779b4906..2b5943317 100644 --- a/xwords4/common/comtypes.h +++ b/xwords4/common/comtypes.h @@ -46,6 +46,7 @@ # define MAX_ROWS 16 #endif #define MAX_COLS MAX_ROWS +#define MIN_COLS 11 #define STREAM_VERS_SMALLCOMMS 0x1F #define STREAM_VERS_NINETILES 0x1E diff --git a/xwords4/common/dictnry.c b/xwords4/common/dictnry.c index 8d00473a4..9659cf3a8 100644 --- a/xwords4/common/dictnry.c +++ b/xwords4/common/dictnry.c @@ -1,6 +1,6 @@ /* -*- compile-command: "cd ../linux && make MEMDEBUG=TRUE -j3"; -*- */ /* - * Copyright 1997-2011 by Eric House (xwords@eehouse.org). All rights + * Copyright 1997 - 2022 by Eric House (xwords@eehouse.org). All rights * reserved. * * This program is free software; you can redistribute it and/or @@ -41,6 +41,7 @@ extern "C" { ****************************************************************************/ static XP_Bool makeBitmap( XP_U8 const** ptrp, const XP_U8* end ); +static XP_U8* getCountsFor( const DictionaryCtxt* dict, XP_U16 nCols ); const DictionaryCtxt* p_dict_ref( const DictionaryCtxt* dict, XWEnv XP_UNUSED(xwe) @@ -99,14 +100,12 @@ dict_unref_all( PlayerDicts* pd, XWEnv xwe ) } static XP_UCHAR* -getNullTermParam( DictionaryCtxt* XP_UNUSED_DBG(dctx), const XP_U8** ptr, - XP_U16* headerLen ) +getNullTermParam( DictionaryCtxt* XP_UNUSED_DBG(dctx), const XP_U8** ptr ) { XP_U16 len = 1 + XP_STRLEN( (XP_UCHAR*)*ptr ); XP_UCHAR* result = XP_MALLOC( dctx->mpool, len ); XP_MEMCPY( result, *ptr, len ); *ptr += len; - *headerLen -= len; return result; } @@ -234,59 +233,78 @@ parseCommon( DictionaryCtxt* dctx, XWEnv xwe, const XP_U8** ptrp, const XP_U8* e XP_U8 numFaceBytes, numFaces; if ( hasHeader ) { - XP_U16 headerLen; + const XP_U8* headerEnd; + { + XP_U16 headerLen; + XP_MEMCPY( &headerLen, ptr, sizeof(headerLen) ); + ptr += sizeof(headerLen); + headerLen = XP_NTOHS( headerLen ); + headerEnd = ptr + headerLen; + } + XP_U32 wordCount; - - XP_MEMCPY( &headerLen, ptr, sizeof(headerLen) ); - ptr += sizeof(headerLen); - headerLen = XP_NTOHS( headerLen ); - XP_MEMCPY( &wordCount, ptr, sizeof(wordCount) ); ptr += sizeof(wordCount); - headerLen -= sizeof(wordCount); dctx->nWords = XP_NTOHL( wordCount ); XP_DEBUGF( "dict contains %d words", dctx->nWords ); - if ( 0 < headerLen ) { - dctx->desc = getNullTermParam( dctx, &ptr, &headerLen ); - } else { + if ( ptr == headerEnd ) { XP_LOGFF( "no note" ); + goto done; } - if ( 0 < headerLen ) { - dctx->md5Sum = getNullTermParam( dctx, &ptr, &headerLen ); - } else { + XP_ASSERT( ptr < headerEnd ); + dctx->desc = getNullTermParam( dctx, &ptr ); + + if ( ptr == headerEnd ) { XP_LOGFF( "no md5Sum" ); + goto done; } + XP_ASSERT( ptr < headerEnd ); + dctx->md5Sum = getNullTermParam( dctx, &ptr ); XP_U16 headerFlags = 0; - if ( sizeof(headerFlags) <= headerLen ) { - XP_MEMCPY( &headerFlags, ptr, sizeof(headerFlags) ); - headerFlags = XP_NTOHS( headerFlags ); - ptr += sizeof(headerFlags); - headerLen -= sizeof(headerFlags); + if ( ptr + sizeof(headerFlags) > headerEnd ) { + goto done; } + XP_MEMCPY( &headerFlags, ptr, sizeof(headerFlags) ); + headerFlags = XP_NTOHS( headerFlags ); + ptr += sizeof(headerFlags); + XP_LOGFF( "setting headerFlags: 0x%x", headerFlags ); dctx->headerFlags = headerFlags; - if ( 0 < headerLen ) { - dctx->nBoardSizes = *ptr++; - XP_ASSERT( dctx->nBoardSizes <= VSIZE(dctx->boardSizes) ); - for ( int ii = 0; ii < dctx->nBoardSizes; ++ii ) { - dctx->boardSizes[ii] = *ptr++; + if ( ptr == headerEnd ) { + goto done; + } + XP_UCHAR* langName = getNullTermParam( dctx, &ptr ); + if ( ptr == headerEnd ) { + goto done; + } + XP_UCHAR* langCode = getNullTermParam( dctx, &ptr ); + XP_LOGFF( "got langName: %s; langCode: %s", langName, langCode ); + XP_FREE( dctx->mpool, langName ); + XP_FREE( dctx->mpool, langCode ); + + if ( ptr == headerEnd ) { + goto done; + } + XP_U8 otherLen = *ptr++; + XP_LOGFF( "otherLen: %d", otherLen ); + if ( 0 < otherLen ) { + XP_ASSERT( ptr + otherLen <= headerEnd ); + if ( ptr + otherLen <= headerEnd ) { + dctx->otherCounts = XP_MALLOC( dctx->mpool, otherLen ); + dctx->otherCountsEnd = dctx->otherCounts + otherLen; + XP_MEMCPY( dctx->otherCounts, ptr, otherLen ); + ptr += otherLen; } - headerLen -= 1 + dctx->nBoardSizes; - XP_ASSERT( 0 <= headerLen ); } - if ( 0 < headerLen ) { - XP_LOGFF( "skipping %d bytes of header", headerLen ); + done: + if ( ptr < headerEnd ) { + XP_LOGFF( "skipping %zu bytes of header", headerEnd - ptr ); } - ptr += headerLen; - } - - if ( 0 == dctx->nBoardSizes ) { /* wasn't provided */ - dctx->boardSizes[0] = 15; - dctx->nBoardSizes = 1; + ptr = headerEnd; } if ( isUTF8 ) { @@ -316,8 +334,10 @@ parseCommon( DictionaryCtxt* dctx, XWEnv xwe, const XP_U8** ptrp, const XP_U8* e dctx->nFaces = numFaces; - dctx->countsAndValues = XP_MALLOC( dctx->mpool, - numFaces * (1 + dctx->nBoardSizes) ); + dctx->values = XP_MALLOC( dctx->mpool, numFaces); + XP_U8* counts15 = XP_MALLOC( dctx->mpool, numFaces); /* leaking */ + dctx->counts[15>>1] = counts15; + XP_U16 facesSize = numFaceBytes; if ( !isUTF8 ) { facesSize /= 2; @@ -332,9 +352,11 @@ parseCommon( DictionaryCtxt* dctx, XWEnv xwe, const XP_U8** ptrp, const XP_U8* e unsigned short xloc; XP_MEMCPY( &xloc, ptr, sizeof(xloc) ); ptr += sizeof(xloc); - size_t cvSize = numFaces * (1 + dctx->nBoardSizes); - XP_MEMCPY( dctx->countsAndValues, ptr, cvSize ); - ptr += cvSize; + + for ( int ii = 0; ii < numFaces; ++ii ) { + counts15[ii] = *ptr++; + dctx->values[ii] = *ptr++; + } dctx->langCode = xloc & 0x7F; } @@ -438,11 +460,8 @@ dict_getTileValue( const DictionaryCtxt* dict, const Tile tile ) tile == dict_getBlankTile( dict ) ); } XP_ASSERT( tile < dict->nFaces ); - int offset = tile * (1 + dict->nBoardSizes); - XP_ASSERT( !!dict->countsAndValues ); - XP_U16 result = dict->countsAndValues[offset + dict->nBoardSizes]; - /* XP_LOGFF( "(%d) => %d", tile, result ); */ - return result; + XP_ASSERT( !!dict->values ); + return dict->values[tile]; } /* dict_getTileValue */ static const XP_UCHAR* @@ -498,34 +517,55 @@ dict_getNextTileString( const DictionaryCtxt* dict, Tile tile, XP_U16 dict_numTilesForSize( const DictionaryCtxt* dict, Tile tile, XP_U16 nCols ) { - XP_Bool matched = XP_FALSE; - int offset = tile * (1 + dict->nBoardSizes); - for ( int ii = 0; !matched && ii < dict->nBoardSizes; ++ii ) { - if ( nCols == dict->boardSizes[ii] ) { /* perfect match? */ - offset += ii; - matched = XP_TRUE; - } - } + XP_U8* counts = getCountsFor( dict, nCols ); + return counts[tile]; +} - XP_U16 count = dict->countsAndValues[offset]; - if ( !matched ) { - /* Older wordlists are built assuming 15x15 boards. Different sized - boards need different numbers of tiles. The wordlist might provide - for the size we have. If not, let's adjust the count based on how - many squares we have vs. 15x15. - */ - XP_U16 pct = (nCols * nCols * 100) / (15 * 15); - XP_U16 newCount = count * pct / 100; - if ( 50 < (count * pct) % 100 ) { - ++newCount; +/* Older wordlists are built assuming 15x15 boards. Different sized boards + need different numbers of tiles. The wordlist might provide for the size we + have, in which case we use it. Otherwise we extrapolate. +*/ +static XP_U8* +getCountsFor( const DictionaryCtxt* dict, XP_U16 nCols ) +{ + int offset = nCols >> 1; + XP_U8* counts = dict->counts[offset]; + if ( !counts ) { + counts = XP_MALLOC( dict->mpool, dict->nFaces ); + ((DictionaryCtxt*)dict)->counts[offset] = counts; + + XP_U8* ptr = dict->otherCounts; + XP_Bool found = XP_FALSE; + while ( !found && !!ptr && ptr < dict->otherCountsEnd ) { + XP_U8 siz = *ptr++; + found = siz == nCols; + if ( found ) { + XP_MEMCPY( counts, ptr, dict->nFaces ); + } else { + ptr += dict->nFaces; + } + } + + /* don't have it in the wordlist? Extrapolate */ + if ( !found ) { + XP_U16 pct = (nCols * nCols * 100) / (15 * 15); + XP_U8* src15 = dict->counts[15>>1]; + XP_ASSERT( !!src15 ); + + for ( int ii = 0; ii < dict->nFaces; ++ii ) { + XP_U16 count = src15[ii]; + XP_U16 newCount = count * pct / 100; + if ( 50 < (count * pct) % 100 ) { + ++newCount; + } + counts[ii] = newCount; + } } - // XP_LOGFF( "adjusted count %d to %d based on pct of %d", count, newCount, pct ); - count = newCount; } // XP_LOGFF( "(tile=%d, ncols=%d) => %d", tile, nCols, count ); - return count; -} /* dict_numTiles */ + return counts; +} /* getCountsFor */ XP_U16 dict_numTileFaces( const DictionaryCtxt* dict ) @@ -685,24 +725,24 @@ dict_tilesAreSame( const DictionaryCtxt* dict1, const DictionaryCtxt* dict2 ) } /* dict_tilesAreSame */ #ifndef XWFEATURE_STANDALONE_ONLY -static void -ucharsToNarrow( const DictionaryCtxt* dict, XP_UCHAR* buf, XP_U16* bufsizep ) -{ - XP_U16 ii; - XP_U16 nUsed = 0; - XP_U16 bufsize = *bufsizep; - for ( ii = 0; ii < dict->nFaces; ++ii ) { - const XP_UCHAR* facep = dict_getTileStringRaw( dict, ii ); - if ( IS_SPECIAL(*facep) ) { - buf[nUsed++] = *facep; - } else { - nUsed += XP_SNPRINTF( &buf[nUsed], bufsize - nUsed, "%s", facep ); - } - XP_ASSERT( nUsed < bufsize ); - } - buf[nUsed] = 0; - *bufsizep = nUsed; -} +/* static void */ +/* ucharsToNarrow( const DictionaryCtxt* dict, XP_UCHAR* buf, XP_U16* bufsizep ) */ +/* { */ +/* XP_U16 ii; */ +/* XP_U16 nUsed = 0; */ +/* XP_U16 bufsize = *bufsizep; */ +/* for ( ii = 0; ii < dict->nFaces; ++ii ) { */ +/* const XP_UCHAR* facep = dict_getTileStringRaw( dict, ii ); */ +/* if ( IS_SPECIAL(*facep) ) { */ +/* buf[nUsed++] = *facep; */ +/* } else { */ +/* nUsed += XP_SNPRINTF( &buf[nUsed], bufsize - nUsed, "%s", facep ); */ +/* } */ +/* XP_ASSERT( nUsed < bufsize ); */ +/* } */ +/* buf[nUsed] = 0; */ +/* *bufsizep = nUsed; */ +/* } */ /* Summarize tile info in a way it can be presented to users */ void @@ -720,61 +760,63 @@ dict_writeTilesInfo( const DictionaryCtxt* dict, XP_U16 boardSize, XWStreamCtxt* } void -dict_writeToStream( const DictionaryCtxt* dict, XWStreamCtxt* stream ) +dict_writeToStream( const DictionaryCtxt* XP_UNUSED(dict), + XWStreamCtxt* XP_UNUSED(stream) ) { - XP_U16 maxCount = 0; - XP_U16 maxValue = 0; - XP_U16 ii, nSpecials; - XP_U16 maxCountBits, maxValueBits; - XP_UCHAR buf[64]; - XP_U16 nBytes; + XP_ASSERT(0); + /* XP_U16 maxCount = 0; */ + /* XP_U16 maxValue = 0; */ + /* XP_U16 ii, nSpecials; */ + /* XP_U16 maxCountBits, maxValueBits; */ + /* XP_UCHAR buf[64]; */ + /* XP_U16 nBytes; */ - stream_putBits( stream, 6, dict->nFaces ); + /* stream_putBits( stream, 6, dict->nFaces ); */ - XP_ASSERT(0); /* if this fires, need to fix for per-boardSize counts */ - for ( ii = 0; ii < dict->nFaces*2; ii+=2 ) { - XP_U16 count, value; + /* XP_ASSERT(0); /\* if this fires, need to fix for per-boardSize counts *\/ */ + /* for ( ii = 0; ii < dict->nFaces*2; ii+=2 ) { */ + /* XP_U16 count, value; */ - count = dict->countsAndValues[ii]; - if ( maxCount < count ) { - maxCount = count; - } + /* count = dict->countsAndValues[ii]; */ + /* if ( maxCount < count ) { */ + /* maxCount = count; */ + /* } */ - value = dict->countsAndValues[ii+1]; - if ( maxValue < value ) { - maxValue = value; - } - } + /* value = dict->countsAndValues[ii+1]; */ + /* if ( maxValue < value ) { */ + /* maxValue = value; */ + /* } */ + /* } */ - maxCountBits = bitsForMax( maxCount ); - maxValueBits = bitsForMax( maxValue ); + /* maxCountBits = bitsForMax( maxCount ); */ + /* maxValueBits = bitsForMax( maxValue ); */ - stream_putBits( stream, 3, maxCountBits ); /* won't be bigger than 5 */ - stream_putBits( stream, 3, maxValueBits ); + /* stream_putBits( stream, 3, maxCountBits ); /\* won't be bigger than 5 *\/ */ + /* stream_putBits( stream, 3, maxValueBits ); */ - for ( ii = 0; ii < dict->nFaces*2; ii+=2 ) { - stream_putBits( stream, maxCountBits, dict->countsAndValues[ii] ); - stream_putBits( stream, maxValueBits, dict->countsAndValues[ii+1] ); - } + /* for ( ii = 0; ii < dict->nFaces; ++ii ) { */ + /* stream_putBits( stream, maxCountBits, counts[ii] ); */ + /* stream_putBits( stream, maxValueBits, dict->values[ii] ); */ + /* } */ - /* Stream format of the faces is unchanged: chars run together, which - * happens to equal utf-8 for ascii. But now there may be more than one - * byte per face. Old code assumes that, but compatibility is ensured by - * the caller which will not accept an incoming message if the version's - * too new. And utf-8 dicts are flagged as newer by the sender. - */ + /* /\* Stream format of the faces is unchanged: chars run together, which */ + /* * happens to equal utf-8 for ascii. But now there may be more than one */ + /* * byte per face. Old code assumes that, but compatibility is ensured by */ + /* * the caller which will not accept an incoming message if the version's */ + /* * too new. And utf-8 dicts are flagged as newer by the sender. */ + /* *\/ */ - nBytes = sizeof(buf); - ucharsToNarrow( dict, buf, &nBytes ); - stream_putU8( stream, nBytes ); - stream_putBytes( stream, buf, nBytes ); + /* nBytes = sizeof(buf); */ + /* ucharsToNarrow( dict, buf, &nBytes ); */ + /* stream_putU8( stream, nBytes ); */ + /* stream_putBytes( stream, buf, nBytes ); */ - for ( nSpecials = ii = 0; ii < dict->nFaces; ++ii ) { - const XP_UCHAR* facep = dict_getTileStringRaw( dict, (Tile)ii ); - if ( IS_SPECIAL( *facep ) ) { - stringToStream( stream, dict->chars[nSpecials++] ); - } - } + /* for ( nSpecials = ii = 0; ii < dict->nFaces; ++ii ) { */ + /* const XP_UCHAR* facep = dict_getTileStringRaw( dict, (Tile)ii ); */ + /* if ( IS_SPECIAL( *facep ) ) { */ + /* stringToStream( stream, dict->chars[nSpecials++] ); */ + /* } */ + /* } */ } /* dict_writeToStream */ #endif @@ -808,7 +850,11 @@ common_destructor( DictionaryCtxt* dict, XWEnv XP_UNUSED(xwe) ) { freeSpecials( dict ); - XP_FREE( dict->mpool, dict->countsAndValues ); + XP_FREE( dict->mpool, dict->values ); + for ( int ii = 0; ii < VSIZE(dict->counts); ++ii ) { + XP_FREEP( dict->mpool, &dict->counts[ii] ); + } + XP_FREE( dict->mpool, dict->otherCounts ); XP_FREE( dict->mpool, dict->faces ); XP_FREE( dict->mpool, dict->facePtrs ); @@ -838,15 +884,14 @@ dict_loadFromStream( DictionaryCtxt* dict, XWEnv xwe, XWStreamCtxt* stream ) dict->nFaces = nFaces; - dict->countsAndValues = - (XP_U8*)XP_MALLOC( dict->mpool, - sizeof(dict->countsAndValues[0]) * nFaces * 2 ); + dict->values = (XP_U8*)XP_MALLOC( dict->mpool, + sizeof(dict->values[0]) * nFaces ); + XP_U8* counts = dict->counts[15>>1] + = (XP_U8*)XP_MALLOC( dict->mpool, sizeof(dict->values[0]) * nFaces ); - for ( ii = 0; ii < dict->nFaces*2; ii+=2 ) { - dict->countsAndValues[ii] = (XP_U8)stream_getBits( stream, - maxCountBits ); - dict->countsAndValues[ii+1] = (XP_U8)stream_getBits( stream, - maxValueBits ); + for ( ii = 0; ii < dict->nFaces; ++ii ) { + counts[ii] = (XP_U8)stream_getBits( stream, maxCountBits ); + dict->values[ii] = (XP_U8)stream_getBits( stream, maxValueBits ); } nFaceBytes = (XP_U8)stream_getU8( stream ); @@ -1169,6 +1214,21 @@ dict_super_init( MPFORMAL DictionaryCtxt* dict ) pthread_mutex_init( &dict->mutex, NULL ); } /* dict_super_init */ +void +dict_super_destroy( DictionaryCtxt* dict ) +{ + XP_FREEP( dict->mpool, &dict->desc ); + XP_FREEP( dict->mpool, &dict->md5Sum ); + XP_FREEP( dict->mpool, &dict->values ); + for ( int ii = 0; ii < VSIZE(dict->counts); ++ii ) { + XP_FREEP( dict->mpool, &dict->counts[ii] ); + } + XP_FREEP( dict->mpool, &dict->otherCounts ); + XP_FREEP( dict->mpool, &dict->faces ); + XP_FREEP( dict->mpool, &dict->facePtrs ); + XP_FREEP( dict->mpool, &dict->name ); +} + const XP_UCHAR* dict_getLangName( const DictionaryCtxt* ctxt ) { diff --git a/xwords4/common/dictnry.h b/xwords4/common/dictnry.h index e47e1b1b1..20ce061e5 100644 --- a/xwords4/common/dictnry.h +++ b/xwords4/common/dictnry.h @@ -86,10 +86,11 @@ struct DictionaryCtxt { XP_UCHAR* desc; XP_UCHAR* md5Sum; const XP_UCHAR** facePtrs; /* elems point into faces, above */ - XP_U8* countsAndValues; + XP_U8* counts[(MAX_COLS>>1) + 1]; + XP_U8* values; - XP_U8 nBoardSizes; - XP_U8 boardSizes[2]; /* will be [15] or [15,21] for now */ + XP_U8* otherCounts; + XP_U8* otherCountsEnd; SpecialBitmaps* bitmaps; XP_UCHAR** chars; @@ -236,6 +237,8 @@ XP_Bool checkSanity( DictionaryCtxt* dict, XP_U32 numEdges ); /* To be called only by subclasses!!! */ void dict_super_init( MPFORMAL DictionaryCtxt* ctxt ); +void dict_super_destroy( DictionaryCtxt* ctxt ); + /* Must be implemented by subclasses */ void dict_splitFaces( DictionaryCtxt* dict, XWEnv xwe, const XP_U8* bytes, XP_U16 nBytes, XP_U16 nFaceos ); diff --git a/xwords4/dawg/English/Makefile.top5000 b/xwords4/dawg/English/Makefile.top5000 index 0323c9108..13d7bdc5b 100644 --- a/xwords4/dawg/English/Makefile.top5000 +++ b/xwords4/dawg/English/Makefile.top5000 @@ -24,7 +24,7 @@ DICTNOTE = "Words on a list at www.wordfrequency.info" include ../Makefile.langcommon ENGLISH = $(XWDICTPATH)/English -SOURCEDICT ?= $(ENGLISH)/CSW.dict.gz +SOURCEDICT ?= $(ENGLISH)/CSW19.dict # I have permission to download the "top 5000" wordlist but not # necessarily to distribute it. And it contains words, especially @@ -35,7 +35,7 @@ $(XWLANG)Main.dict.gz: $(SOURCEDICT) $(ENGLISH)/Top_5000.dict.gz zcat $(ENGLISH)/Top_5000.dict.gz | \ sed 's/[[:lower:]]*/\U&/' | \ sort > /tmp/Top_5000.dict - zcat $< | tr -d '\r' | \ + cat $< | tr -d '\r' | \ sed 's/[[:lower:]]*/\U&/' | \ grep -e "^[A-Z]\{2,15\}$$" | \ sort > /tmp/$$(basename $<) diff --git a/xwords4/linux/Makefile b/xwords4/linux/Makefile index da4ab9986..5abbcdcfa 100644 --- a/xwords4/linux/Makefile +++ b/xwords4/linux/Makefile @@ -137,7 +137,7 @@ DEFINES += -DNLI_VERSION=1 # DEFINES += -DRELAY_VIA_HTTP # MAX_ROWS controls STREAM_VERS_BIGBOARD and with it move hashing -DEFINES += -DMAX_ROWS=32 +DEFINES += -DMAX_ROWS=23 ifdef CURSES_CELL_HT DEFINES += -DCURSES_CELL_HT=$(CURSES_CELL_HT) diff --git a/xwords4/linux/gtknewgame.c b/xwords4/linux/gtknewgame.c index 64b0f12b1..a625f1b7d 100644 --- a/xwords4/linux/gtknewgame.c +++ b/xwords4/linux/gtknewgame.c @@ -30,9 +30,6 @@ #include "gtkutils.h" #include "gtkask.h" -#define MIN_BOARD_SIZE 11 -#define MAX_BOARD_SIZE 23 - #define BINGO_THRESHOLD "Bingo threshold" #define TRAY_SIZE "Tray size" @@ -169,7 +166,7 @@ size_combo_changed( GtkComboBox* combo, gpointer gp ) GtkNewGameState* state = (GtkNewGameState*)gp; gint index = gtk_combo_box_get_active( GTK_COMBO_BOX(combo) ); if ( index >= 0 ) { - state->nCols = MIN_BOARD_SIZE + (index * 2); + state->nCols = MIN_COLS + (index * 2); XP_LOGF( "set nCols = %d", state->nCols ); } } /* size_combo_changed */ @@ -350,7 +347,7 @@ addSizesRow( GtkNewGameState* state, GtkWidget* parent ) } int curEntry = 0; - for ( int siz = MIN_BOARD_SIZE; siz <= MAX_BOARD_SIZE; siz += 2 ) { + for ( int siz = MIN_COLS; siz <= MAX_COLS; siz += 2 ) { char buf[10]; // XP_U16 siz = MAX_COLS - ii; snprintf( buf, sizeof(buf), "%dx%d", siz, siz ); diff --git a/xwords4/linux/linuxdict.c b/xwords4/linux/linuxdict.c index ec6649384..4873cd997 100644 --- a/xwords4/linux/linuxdict.c +++ b/xwords4/linux/linuxdict.c @@ -48,7 +48,6 @@ typedef struct LinuxDictionaryCtxt { XP_Bool useMMap; } LinuxDictionaryCtxt; - /************************ Prototypes ***********************/ static XP_Bool initFromDictFile( LinuxDictionaryCtxt* dctx, const LaunchParams* params, @@ -279,13 +278,8 @@ linux_dictionary_destroy( DictionaryCtxt* dict, XWEnv XP_UNUSED(xwe) ) } } - /* super's destructor should do this!!!! */ - XP_FREEP( dict->mpool, &ctxt->super.desc ); - XP_FREEP( dict->mpool, &ctxt->super.md5Sum ); - XP_FREEP( dict->mpool, &ctxt->super.countsAndValues ); - XP_FREEP( dict->mpool, &ctxt->super.faces ); - XP_FREEP( dict->mpool, &ctxt->super.facePtrs ); - XP_FREEP( dict->mpool, &ctxt->super.name ); + dict_super_destroy( &ctxt->super ); + XP_FREE( dict->mpool, ctxt ); } /* linux_dictionary_destroy */ From 93b38d568d03bca48999189044bde8128efc5230 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 1 Apr 2022 08:36:15 +0200 Subject: [PATCH 13/13] use new format --- xwords4/dawg/Finnish/info.txt | 52 +++++++++++++++++------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/xwords4/dawg/Finnish/info.txt b/xwords4/dawg/Finnish/info.txt index e111545c7..21da44a14 100644 --- a/xwords4/dawg/Finnish/info.txt +++ b/xwords4/dawg/Finnish/info.txt @@ -32,30 +32,30 @@ XLOC_HEADER:0x9900 # From wikipedia -2 0 {"_"} -10 1 'A|a' -5 2 'Ä|ä' -1 8 'B|b' -1 10 'C|c' -1 7 'D|d' -8 1 'E|e' -1 8 'F|f' -1 8 'G|g' -2 4 'H|h' -10 1 'I|i' -2 4 'J|j' -5 2 'K|k' -5 2 'L|l' -3 3 'M|m' -9 1 'N|n' -5 2 'O|o' -1 7 'Ö|ö' -2 4 'P|p' -2 4 'R|r' -7 1 'S|s' -9 1 'T|t' -4 3 'U|u' -2 4 'V|v' -1 8 'W|w' -2 4 'Y|y' +{"_"} 0 2 +'A|a' 1 10 +'Ä|ä' 2 5 +'B|b' 8 1 +'C|c' 10 1 +'D|d' 7 1 +'E|e' 1 8 +'F|f' 8 1 +'G|g' 8 1 +'H|h' 4 2 +'I|i' 1 10 +'J|j' 4 2 +'K|k' 2 5 +'L|l' 2 5 +'M|m' 3 3 +'N|n' 1 9 +'O|o' 2 5 +'Ö|ö' 7 1 +'P|p' 4 2 +'R|r' 4 2 +'S|s' 1 7 +'T|t' 1 9 +'U|u' 3 4 +'V|v' 4 2 +'W|w' 8 1 +'Y|y' 4 2