Author: jseidel-guest
Date: 2007-09-09 17:42:43 +0000 (Sun, 09 Sep 2007)
New Revision: 4140

Modified:
   packages/trunk/hex-a-hop/debian/changelog
   packages/trunk/hex-a-hop/debian/patches/endianess.patch
Log:
Game status file is now always written with little endian data.
So it's exchangeable across different systems.


Modified: packages/trunk/hex-a-hop/debian/changelog
===================================================================
--- packages/trunk/hex-a-hop/debian/changelog   2007-09-09 16:58:33 UTC (rev 
4139)
+++ packages/trunk/hex-a-hop/debian/changelog   2007-09-09 17:42:43 UTC (rev 
4140)
@@ -5,8 +5,7 @@
   * Reduced the CPU load a little bit. Thanks to Joey Hess
     <[EMAIL PROTECTED]> for the patch. Closes: #440377
     There is more to do to get it properly fixed.
-  * Code is now (more or less) big endian clean.
-    Closes: #438857
+  * Code is now big endian clean. Closes: #438857
   * Use an ordinary (ASCII) dash instead of a UTF-8
     encoded one in the Vietnamese translation which is
     invalid in the generated man page.
@@ -16,7 +15,7 @@
   * Added Tamil translation. Thanks to Tirumurti
     Vasudevan <[EMAIL PROTECTED]>. Closes: #441040
 
- -- Jens Seidel <[EMAIL PROTECTED]>  Thu, 06 Sep 2007 00:20:00 +0200
+ -- Jens Seidel <[EMAIL PROTECTED]>  Sun, 09 Sep 2007 19:20:00 +0200
 
 hex-a-hop (0.0.20070315-4) unstable; urgency=low
 

Modified: packages/trunk/hex-a-hop/debian/patches/endianess.patch
===================================================================
--- packages/trunk/hex-a-hop/debian/patches/endianess.patch     2007-09-09 
16:58:33 UTC (rev 4139)
+++ packages/trunk/hex-a-hop/debian/patches/endianess.patch     2007-09-09 
17:42:43 UTC (rev 4140)
@@ -4,8 +4,8 @@
 
 Index: hex-a-hop.svn/packfile.h
 ===================================================================
---- hex-a-hop.svn.orig/packfile.h      2007-09-06 20:37:51.000000000 +0200
-+++ hex-a-hop.svn/packfile.h   2007-09-06 20:44:29.000000000 +0200
+--- hex-a-hop.svn.orig/packfile.h      2007-09-09 18:28:14.000000000 +0200
++++ hex-a-hop.svn/packfile.h   2007-09-09 19:16:58.000000000 +0200
 @@ -16,11 +16,23 @@
      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
@@ -31,7 +31,15 @@
        public:
                char name[1];
  
-@@ -73,10 +85,11 @@
+@@ -42,6 +54,7 @@
+                       return len - strlen(name) - 1;
+               }
+       };
++      int static_assert1[sizeof(Entry)==8 ? 0 : -1];
+ 
+       int numfiles;
+       Entry** e;
+@@ -73,10 +86,11 @@
                if (numfiles || e || data)
                        FATAL("Calling Packfile1::Read when already 
initialised.");
  
@@ -44,7 +52,7 @@
                fseek(f, end_offset - size, SEEK_SET);
  
                data = malloc(size);
-@@ -88,6 +101,8 @@
+@@ -88,10 +102,12 @@
                while ((void*)i < data_end)
                {
                        numfiles++;
@@ -53,15 +61,22 @@
                        i = i->GetNext();
                }
                
+-              e = new Entry* [numfiles];
++              e = new Entry* [numfiles]; // CHECKME: where to delete?
+ 
+               i = (Entry*)data;
+               for (int j=0; j<numfiles; j++, i = i->GetNext())
 Index: hex-a-hop.svn/hex_puzzzle.cpp
 ===================================================================
---- hex-a-hop.svn.orig/hex_puzzzle.cpp 2007-09-06 20:37:51.000000000 +0200
-+++ hex-a-hop.svn/hex_puzzzle.cpp      2007-09-06 20:48:40.000000000 +0200
-@@ -444,10 +444,10 @@
+--- hex-a-hop.svn.orig/hex_puzzzle.cpp 2007-09-09 18:28:14.000000000 +0200
++++ hex-a-hop.svn/hex_puzzzle.cpp      2007-09-09 19:03:43.000000000 +0200
+@@ -444,10 +444,12 @@
  }
  
  
 -typedef int Tile;
++// somewhere else Tile map[][] is assigned to an unsigned char not int32_t
++// but the data file format expects it to be 32 bit wide!??
 +typedef int32_t Tile;
  typedef int Dir;
  struct Pos{
@@ -70,16 +85,19 @@
        Pos() : x(0), y(0) {}
        Pos(int a, int b) : x(a), y(b) {}
        bool operator == (Pos const & p) const 
-@@ -1497,7 +1497,7 @@
+@@ -1495,9 +1497,9 @@
+       #define MAP_SIZE 30
+       char* special[MAP_SIZE][MAP_SIZE];
        Tile map[MAP_SIZE][MAP_SIZE];
-       int map_item[MAP_SIZE][MAP_SIZE];
+-      int map_item[MAP_SIZE][MAP_SIZE];
++      int32_t map_item[MAP_SIZE][MAP_SIZE];
        int tileCount[NumTileTypes];
 -      int levelPar, levelDiff;
 +      int32_t levelPar, levelDiff;
        int turboAnim;
        Pos player;
        int player_items[2];
-@@ -1565,14 +1565,20 @@
+@@ -1565,14 +1567,20 @@
  
                        fgetc(f); // Remove '\n' character
  
@@ -103,68 +121,100 @@
  
                        int highval=0;
  
-@@ -1884,7 +1890,7 @@
+@@ -1902,13 +1910,18 @@
+               return false;
+       }
  
-                               if (!save)
-                               {
--                                      char* data = ReadAll(f);
-+                                      char* data = ReadAll(f); //??
-                                       _LoadSave(f, save);
-                                       delete [] data;
-                                       loadPtr = endLoad = 0;
-@@ -1935,10 +1941,16 @@
++  /** \brief Writes/reads game status to/from a file
++   *
++   *  The game data file is written in little endian so it can be shared
++   *  across different machines.
++   */
+       void _LoadSave(FILE* f, bool save)
+       {
+               typedef unsigned int _fn(void*, unsigned int, unsigned int, 
FILE*);
+               _fn * fn = save ? (_fn*)fwrite : (loadPtr ? (_fn*)fread_replace 
: (_fn*)fread);
+ 
+               #define VERSION 4
+-              int version = VERSION;
++              int version = VERSION; // 1--9
+               if (save)
+                       fprintf(f, "%d\n", version);
+               else
+@@ -1935,13 +1948,26 @@
                if (version==1)
                {
                        for (int i=0; i<MAP_SIZE; i++)
 -                              for (int j=0; j<MAP_SIZE; j++)
 +                              for (int j=0; j<MAP_SIZE; j++) {
++                                      map[i][j] = SWAP32(map[i][j]);
                                        fn(&map[i][j], sizeof(map[i][j]), 1, f);
 +                                      map[i][j] = SWAP32(map[i][j]);
-+                                      }
++                              }
  
++                      player.x = SWAP32(player.x);
++                      player.y = SWAP32(player.y);
                        fn(&player, sizeof(player), 1, f);
-+      if (!save) {
-+                                      player.x = SWAP32(player.x);
-+                                      player.y = SWAP32(player.y);
-+      }
++                      player.x = SWAP32(player.x);
++                      player.y = SWAP32(player.y);
  
++                      for (int i=0; i<MAP_SIZE; ++i)
++                              for (int j=0; j<MAP_SIZE; ++j)
++                                      map_item[i][j] = SWAP32(map_item[i][j]);
                        if (fn(map_item, sizeof(map_item), 1, f) == 0)
                                memset(map_item, 0, sizeof(map_item));
-@@ -1966,18 +1978,28 @@
++                      for (int i=0; i<MAP_SIZE; ++i)
++                              for (int j=0; j<MAP_SIZE; ++j)
++                                      map_item[i][j] = SWAP32(map_item[i][j]);
+               }
+               else if (version>=2 && version<=4)
+               {
+@@ -1966,18 +1992,28 @@
                                memset(map_item, 0, sizeof(map_item));
                        }
  
 -                      if (version>=3)
--                              fn(&levelPar, 1, sizeof(levelPar), f);
 +                      if (version>=3) {
-+                              fn(&levelPar, sizeof(levelPar), 1, f);
-+                              if (!save) {
-+                                      levelPar = SWAP32(levelPar);
-+                              }
++                              levelPar = SWAP32(levelPar);
+                               fn(&levelPar, 1, sizeof(levelPar), f);
++                              levelPar = SWAP32(levelPar);
 +                      }
                        else if (!save)
                                levelPar = 0;
  
 -                      if (version>=4)
--                              fn(&levelDiff, 1, sizeof(levelDiff), f);
 +                      if (version>=4) {
-+                              fn(&levelDiff, sizeof(levelDiff), 1, f);
-+                              if (!save) {
-+                                      levelDiff = SWAP32(levelDiff);
-+                              }
++                              levelDiff = SWAP32(levelDiff);
+                               fn(&levelDiff, 1, sizeof(levelDiff), f);
++                              levelDiff = SWAP32(levelDiff);
 +                      }
                        else if (!save)
                                levelDiff = 0;
  
--                      fn(bounds, sizeof(bounds), 1, f);
-+                      fn(bounds, sizeof(bounds), 1, f); // CHECKME
+                       fn(bounds, sizeof(bounds), 1, f);
++                      player.x = SWAP32(player.x);
++                      player.y = SWAP32(player.y);
                        fn(&player, sizeof(player), 1, f);
 +                      player.x = SWAP32(player.x);
 +                      player.y = SWAP32(player.y);
  
                        int offsetx=0, offsety=0;
  
-@@ -2027,13 +2049,14 @@
+@@ -2016,24 +2052,27 @@
+                                       for (int j=bounds[2]; j<=bounds[3]; j++)
+                                               if (special[i][j])
+                                               {
+-                                                      short len = 
strlen(special[i][j]);
++                                                      int16_t len = 
strlen(special[i][j]);
+                                                       unsigned char x=i, y=j;
+                                                       fn(&x, sizeof(x), 1, f);
+                                                       fn(&y, sizeof(y), 1, f);
++                                                      len = SWAP16(len);
+                                                       fn(&len, sizeof(len), 
1, f);
++                                                      len = SWAP16(len);
+                                                       fn(special[i][j], 1, 
len, f);
+                                               }
+                       }
                        else
                        {
                                while(1){
@@ -180,7 +230,7 @@
                                        if (len<0) break;
                                        char* tmp = new char[len+1];
                                        tmp[len] = 0;
-@@ -2398,10 +2421,12 @@
+@@ -2398,10 +2437,12 @@
                FILE* f = file_open(bmp, "rb");
                if (!f) FATAL("Unable to open file", bmp);
  
@@ -195,7 +245,7 @@
  
                tmp = new uint32[(int)w*h];
                
-@@ -2414,9 +2439,12 @@
+@@ -2414,9 +2455,12 @@
                        else
                        {
                                fread(&c, sizeof(c), 1, f);
@@ -209,3 +259,122 @@
                        }
                        tmp[p] = c | 0xff000000;
                }
+Index: hex-a-hop.svn/savestate.h
+===================================================================
+--- hex-a-hop.svn.orig/savestate.h     2007-09-09 18:28:14.000000000 +0200
++++ hex-a-hop.svn/savestate.h  2007-09-09 19:23:22.000000000 +0200
+@@ -23,12 +23,16 @@
+ {
+       friend struct HexPuzzle;
+ 
++      // CHECKME: If char is larger than 8 bits (== 1 byte???)
++      // the code is no longer big endian save? SWAP16/32 is necessary?
++      // Or is a byte always of the same size as char, e.g. 16 bits, so
++      // that int16_t is equally saved on big and little endian systems?
+       char * bestSolution;
+-      int bestSolutionLength;
+-      int bestScore;
++      int32_t bestSolutionLength;
++      int32_t bestScore;
+       #define NUM_LAST_SCORES 19
+-      int lastScores[NUM_LAST_SCORES];
+-      int unlocked;
++      int32_t lastScores[NUM_LAST_SCORES];
++      int32_t unlocked;
+ public:
+       LevelSave()
+       {
+@@ -47,11 +51,24 @@
+               typedef unsigned int _fn(void*, unsigned int, unsigned int, 
FILE*);
+               _fn * fn = save ? (_fn*)fwrite : (_fn*)fread;
+ 
++              // we write little endian data
++              bestSolutionLength = SWAP32(bestSolutionLength);
++              bestScore = SWAP32(bestScore);
++              for (int i=0; i<NUM_LAST_SCORES; ++i)
++                      lastScores[i] = SWAP32(lastScores[i]);
++              unlocked = SWAP32(unlocked);
++
+               fn(&bestSolutionLength, sizeof(bestSolutionLength), 1, f);
+               fn(&bestScore, sizeof(bestScore), 1, f);
+               fn(&lastScores, sizeof(lastScores), 1, f);
+               fn(&unlocked, sizeof(unlocked), 1, f);          
+-              
++
++              bestSolutionLength = SWAP32(bestSolutionLength);
++              bestScore = SWAP32(bestScore);
++              for (int i=0; i<NUM_LAST_SCORES; ++i)
++                      lastScores[i] = SWAP32(lastScores[i]);
++              unlocked = SWAP32(unlocked);
++
+               if (bestSolutionLength)
+               {
+                       if (!save) SetSolution(bestSolutionLength);
+@@ -132,12 +149,23 @@
+       };
+ 
+       struct General {
+-              int scoringOn;
+-              int hintFlags;
+-              int completionPercentage;
+-              int endSequence;
+-              int masteredPercentage;
+-              int pad[6];
++    /// Change big endian data into little endian data, do nothing on little 
endian systems
++              void SwapBytes()
++              {
++                      scoringOn = SWAP32(scoringOn);
++                      hintFlags = SWAP32(hintFlags);
++                      completionPercentage = SWAP32(completionPercentage);
++                      endSequence = SWAP32(endSequence);
++                      masteredPercentage = SWAP32(masteredPercentage);
++                      for (unsigned int i=0; i<sizeof(pad)/sizeof(int32_t); 
++i)
++                              pad[i] = SWAP32(pad[i]);
++              }
++              int32_t scoringOn;
++              int32_t hintFlags;
++              int32_t completionPercentage;
++              int32_t endSequence;
++              int32_t masteredPercentage;
++              int32_t pad[6];
+       };
+ 
+       X* first;
+@@ -191,12 +219,16 @@
+                       //printf("----\n");
+ 
+                       fputc('2', f);
++                      general.SwapBytes(); // big==>little endian
+                       fwrite(&general, sizeof(general), 1, f);
++                      general.SwapBytes(); // revert changes
+                       for(X* x=first; x; x=x->next)
+                       {
+-                              short len = strlen(x->name);
++                              int16_t len = strlen(x->name);
++                              len = SWAP16(len);
+                               fwrite(&len, sizeof(len), 1, f);
+-                              fwrite(x->name, len, 1, f);
++                              len = SWAP16(len);
++                              fwrite(x->name, 1, len, f);
+ 
+                               x->LoadSave(f,save);
+ 
+@@ -214,6 +246,7 @@
+                       if (v=='2')
+                       {
+                               fread(&general, sizeof(general), 1, f);
++                              general.SwapBytes();
+                               v = '1';
+                       }
+                       if (v=='1')
+@@ -221,8 +254,9 @@
+                               while(!feof(f))
+                               {
+                                       char temp[1000];
+-                                      short len;
++                                      int16_t len;
+                                       fread(&len, sizeof(len), 1, f);
++                                      len = SWAP16(len);
+                                       if (feof(f)) break;
+                                       fread(temp, len, 1, f);
+                                       temp[len] = 0;


_______________________________________________
Pkg-games-commits mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/pkg-games-commits

Reply via email to