mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2024-12-26 09:58:20 +01:00
Fix two-device game by fixing dict<-->stream transitions.
This commit is contained in:
parent
8f08667f5d
commit
ee0b6ef0ef
1 changed files with 39 additions and 42 deletions
|
@ -80,14 +80,13 @@ dict_getTileValue( const DictionaryCtxt* dict, Tile tile )
|
|||
return dict->countsAndValues[tile+1];
|
||||
} /* dict_getTileValue */
|
||||
|
||||
static const XP_UCHAR*
|
||||
dict_getTileChar( const DictionaryCtxt* dict, Tile tile )
|
||||
const XP_UCHAR*
|
||||
dict_getTileString( const DictionaryCtxt* ctxt, Tile tile )
|
||||
{
|
||||
XP_ASSERT( tile < dict->nFaces );
|
||||
/* XP_ASSERT( (dict->faces[tile] & 0xFF00) == 0 ); /\* no unicode yet *\/ */
|
||||
XP_U16 index = dict->faceIndices[tile];
|
||||
return &dict->faces[index];
|
||||
} /* dict_getTileValue */
|
||||
XP_ASSERT( tile < ctxt->nFaces );
|
||||
XP_U16 index = ctxt->faceIndices[tile];
|
||||
return &ctxt->faces[index];
|
||||
}
|
||||
|
||||
XP_U16
|
||||
dict_numTiles( const DictionaryCtxt* dict, Tile tile )
|
||||
|
@ -112,7 +111,7 @@ dict_tilesToString( const DictionaryCtxt* ctxt, const Tile* tiles,
|
|||
|
||||
while ( nTiles-- ) {
|
||||
Tile tile = *tiles++;
|
||||
const XP_UCHAR* facep = dict_getTileChar( ctxt, tile );
|
||||
const XP_UCHAR* facep = dict_getTileString( ctxt, tile );
|
||||
|
||||
if ( IS_SPECIAL(*facep) ) {
|
||||
XP_UCHAR* chars = ctxt->chars[(XP_U16)*facep];
|
||||
|
@ -142,12 +141,6 @@ dict_tilesToString( const DictionaryCtxt* ctxt, const Tile* tiles,
|
|||
return result;
|
||||
} /* dict_tilesToString */
|
||||
|
||||
const XP_UCHAR*
|
||||
dict_getTileString( const DictionaryCtxt* ctxt, Tile tile )
|
||||
{
|
||||
return dict_getTileChar( ctxt, tile );
|
||||
}
|
||||
|
||||
Tile
|
||||
dict_tileForString( const DictionaryCtxt* dict, const XP_UCHAR* key )
|
||||
{
|
||||
|
@ -156,7 +149,7 @@ dict_tileForString( const DictionaryCtxt* dict, const XP_UCHAR* key )
|
|||
XP_Bool keyNotSpecial = XP_STRLEN(key) == 1;
|
||||
|
||||
for ( tile = 0; tile < nFaces; ++tile ) {
|
||||
const XP_UCHAR* facep = dict_getTileChar( dict, tile );
|
||||
const XP_UCHAR* facep = dict_getTileString( dict, tile );
|
||||
if ( IS_SPECIAL(*facep) ) {
|
||||
XP_UCHAR* chars = dict->chars[(XP_U16)*facep];
|
||||
if ( 0 == XP_STRNCMP( chars, key, XP_STRLEN(chars) ) ) {
|
||||
|
@ -174,47 +167,47 @@ dict_tilesAreSame( const DictionaryCtxt* dict1, const DictionaryCtxt* dict2 )
|
|||
{
|
||||
XP_Bool result = XP_FALSE;
|
||||
|
||||
Tile i;
|
||||
Tile ii;
|
||||
XP_U16 nTileFaces = dict_numTileFaces( dict1 );
|
||||
|
||||
if ( nTileFaces == dict_numTileFaces( dict2 ) ) {
|
||||
for ( i = 0; i < nTileFaces; ++i ) {
|
||||
for ( ii = 0; ii < nTileFaces; ++ii ) {
|
||||
|
||||
const XP_UCHAR* face1;
|
||||
const XP_UCHAR* face2;
|
||||
|
||||
if ( dict_getTileValue( dict1, i )
|
||||
!= dict_getTileValue( dict2, i ) ){
|
||||
if ( dict_getTileValue( dict1, ii )
|
||||
!= dict_getTileValue( dict2, ii ) ){
|
||||
break;
|
||||
}
|
||||
#if 1
|
||||
face1 = dict_getTileChar( dict1, i );
|
||||
face2 = dict_getTileChar( dict2, i );
|
||||
if ( face1 != face2 ) {
|
||||
#if 0
|
||||
face1 = dict_getTileString( dict1, ii );
|
||||
face2 = dict_getTileString( dict2, ii );
|
||||
if ( 0 != XP_STRCMP( face1, face2 ) ) {
|
||||
break;
|
||||
}
|
||||
#else
|
||||
face1 = dict_getTileChar( dict1, i );
|
||||
face2 = dict_getTileChar( dict2, i );
|
||||
if ( IS_SPECIAL(face1) != IS_SPECIAL(face2) ) {
|
||||
face1 = dict_getTileString( dict1, ii );
|
||||
face2 = dict_getTileString( dict2, ii );
|
||||
if ( IS_SPECIAL(*face1) != IS_SPECIAL(*face2) ) {
|
||||
break;
|
||||
}
|
||||
if ( IS_SPECIAL(face1) ) {
|
||||
XP_UCHAR* chars1 = dict1->chars[face1];
|
||||
XP_UCHAR* chars2 = dict2->chars[face2];
|
||||
if ( IS_SPECIAL(*face1) ) {
|
||||
XP_UCHAR* chars1 = dict1->chars[(int)*face1];
|
||||
XP_UCHAR* chars2 = dict2->chars[(int)*face2];
|
||||
XP_U16 len = XP_STRLEN(chars1);
|
||||
if ( 0 != XP_STRNCMP( chars1, chars2, len ) ) {
|
||||
break;
|
||||
}
|
||||
} else if ( face1 != face2 ) {
|
||||
} else if ( 0 != XP_STRCMP( face1, face2 ) ) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if ( dict_numTiles( dict1, i ) != dict_numTiles( dict2, i ) ) {
|
||||
if ( dict_numTiles( dict1, ii ) != dict_numTiles( dict2, ii ) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
result = i == nTileFaces; /* did we get that far */
|
||||
result = ii == nTileFaces; /* did we get that far */
|
||||
}
|
||||
return result;
|
||||
} /* dict_tilesAreSame */
|
||||
|
@ -226,10 +219,15 @@ ucharsToNarrow( const DictionaryCtxt* dict, XP_UCHAR* buf, XP_U16* bufsizep )
|
|||
XP_U16 nUsed = 0;
|
||||
XP_U16 bufsize = *bufsizep;
|
||||
for ( ii = 0; ii < dict->nFaces; ++ii ) {
|
||||
const XP_UCHAR* face = dict_getTileChar( dict, ii );
|
||||
nUsed += XP_SNPRINTF( &buf[nUsed], bufsize - nUsed, "%s", face );
|
||||
const XP_UCHAR* facep = dict_getTileString( 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;
|
||||
}
|
||||
|
||||
|
@ -275,7 +273,7 @@ dict_writeToStream( const DictionaryCtxt* dict, XWStreamCtxt* stream )
|
|||
stream_putBytes( stream, buf, nBytes );
|
||||
|
||||
for ( nSpecials = i = 0; i < dict->nFaces; ++i ) {
|
||||
const XP_UCHAR* facep = dict_getTileChar( dict, (Tile)i );
|
||||
const XP_UCHAR* facep = dict_getTileString( dict, (Tile)i );
|
||||
if ( IS_SPECIAL( *facep ) ) {
|
||||
stringToStream( stream, dict->chars[nSpecials++] );
|
||||
}
|
||||
|
@ -289,7 +287,7 @@ freeSpecials( DictionaryCtxt* dict )
|
|||
XP_U16 nSpecials;
|
||||
|
||||
for ( nSpecials = t = 0; t < dict->nFaces; ++t ) {
|
||||
const XP_UCHAR* facep = dict_getTileChar( dict, t );
|
||||
const XP_UCHAR* facep = dict_getTileString( dict, t );
|
||||
if ( IS_SPECIAL( *facep ) ) {
|
||||
|
||||
XP_ASSERT( !!dict->chars[nSpecials] );
|
||||
|
@ -321,13 +319,11 @@ common_destructor( DictionaryCtxt* dict )
|
|||
XP_FREE( dict->mpool, dict->faceIndices );
|
||||
|
||||
XP_FREE( dict->mpool, dict );
|
||||
} /* dict */
|
||||
} /* common_destructor */
|
||||
|
||||
void
|
||||
dict_loadFromStream( DictionaryCtxt* dict, XWStreamCtxt* stream )
|
||||
{
|
||||
XP_ASSERT(0);
|
||||
|
||||
XP_U8 nFaces, nFaceBytes;
|
||||
XP_U16 maxCountBits, maxValueBits;
|
||||
XP_U16 i, nSpecials;
|
||||
|
@ -357,10 +353,11 @@ dict_loadFromStream( DictionaryCtxt* dict, XWStreamCtxt* stream )
|
|||
nFaceBytes = (XP_U8)stream_getU8( stream );
|
||||
XP_U8 utf8[nFaceBytes];
|
||||
stream_getBytes( stream, utf8, nFaceBytes );
|
||||
dict->isUTF8 = XP_TRUE; /* need to communicate this in stream */
|
||||
dict_splitFaces( dict, utf8, nFaceBytes, nFaces );
|
||||
|
||||
for ( nSpecials = i = 0; i < nFaces; ++i ) {
|
||||
const XP_UCHAR* facep = dict_getTileChar( dict, (Tile)i );
|
||||
const XP_UCHAR* facep = dict_getTileString( dict, (Tile)i );
|
||||
if ( IS_SPECIAL( *facep ) ) {
|
||||
XP_UCHAR* txt = stringFromStream( dict->mpool, stream );
|
||||
XP_ASSERT( !!txt );
|
||||
|
@ -393,7 +390,7 @@ dict_getName( const DictionaryCtxt* dict )
|
|||
XP_Bool
|
||||
dict_faceIsBitmap( const DictionaryCtxt* dict, Tile tile )
|
||||
{
|
||||
const XP_UCHAR* facep = dict_getTileChar( dict, tile );
|
||||
const XP_UCHAR* facep = dict_getTileString( dict, tile );
|
||||
return IS_SPECIAL(*facep);
|
||||
} /* dict_faceIsBitmap */
|
||||
|
||||
|
@ -401,7 +398,7 @@ void
|
|||
dict_getFaceBitmaps( const DictionaryCtxt* dict, Tile tile, XP_Bitmaps* bmps )
|
||||
{
|
||||
SpecialBitmaps* bitmaps;
|
||||
const XP_UCHAR* facep = dict_getTileChar( dict, tile );
|
||||
const XP_UCHAR* facep = dict_getTileString( dict, tile );
|
||||
|
||||
XP_ASSERT( dict_faceIsBitmap( dict, tile ) );
|
||||
XP_ASSERT( !!dict->bitmaps );
|
||||
|
|
Loading…
Reference in a new issue