Преглед изворни кода

* Changed the variables of the mapcache structs to fixed size equivalents. (64bit portability issue)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13483 54d463be-8e91-2dee-dedb-b68131a5f0ec
FlavioJS пре 16 година
родитељ
комит
9a8c2a60c9
4 измењених фајлова са 52 додато и 50 уклоњено
  1. 1 0
      Changelog-Trunk.txt
  2. 10 7
      src/map/map.c
  3. 3 7
      src/tool/Makefile.in
  4. 38 36
      src/tool/mapcache.c

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2009/01/24
+	* Changed the variables of the mapcache structs to fixed size equivalents.
 	* Changed all uses of struct skill_unit_group* to group_id in status_change_entry's. [FlavioJS]
 2009/01/23
 	* Changed npc_get_new_npc_id to ensure that it never returns invalid/used ids. [FlavioJS]

+ 10 - 7
src/map/map.c

@@ -136,16 +136,16 @@ struct charid2nick {
 
 // This is the main header found at the very beginning of the map cache
 struct map_cache_main_header {
-	unsigned long file_size;
-	unsigned short map_count;
+	uint32 file_size;
+	uint16 map_count;
 };
 
 // This is the header appended before every compressed map cells info in the map cache
 struct map_cache_map_info {
 	char name[MAP_NAME_LENGTH];
-	short xs;
-	short ys;
-	long len;
+	int16 xs;
+	int16 ys;
+	int32 len;
 };
 
 char map_cache_file[256]="db/map_cache.dat";
@@ -2694,9 +2694,12 @@ int map_readfromcache(struct map_data *m, FILE *fp)
 		unsigned char *buf, *buf2;
 		unsigned long size, xy;
 
+		if( info.xs <= 0 || info.ys <= 0 )
+			return 0;// invalid
+
 		m->xs = info.xs;
 		m->ys = info.ys;
-		size = info.xs*info.ys;
+		size = (unsigned long)info.xs*(unsigned long)info.ys;
 
 		buf = (unsigned char*)aMalloc(info.len); // temp buffer to read the zipped map
 		buf2 = (unsigned char*)aMalloc(size); // temp buffer to unpack the data
@@ -2713,7 +2716,7 @@ int map_readfromcache(struct map_data *m, FILE *fp)
 		return 1;
 	}
 
-	return 0;
+	return 0;// not found
 }
 
 int map_addmap(char* mapname)

+ 3 - 7
src/tool/Makefile.in

@@ -9,12 +9,11 @@ all: adduser mapcache
 adduser:
 	@CC@ -o ../../tools/adduser@EXEEXT@ adduser.c
 
-mapcache: obj_mapcache
-	@CC@ -c -o obj_mapcache/grfio.o grfio.c
-	@CC@ -o ../../mapcache@EXEEXT@ mapcache.c obj_mapcache/grfio.o -lz
+mapcache:
+	@CC@ -o ../../mapcache@EXEEXT@ mapcache.c grfio.c -lz
 
 clean:
-	rm -rf *.o obj_mapcache ../../tools/adduser@EXEEXT@ ../../mapcache@EXEEXT@
+	rm -rf *.o ../../tools/adduser@EXEEXT@ ../../mapcache@EXEEXT@
 
 help:
 	@echo "possible targets are 'adduser' 'mapcache' 'all' 'clean' 'help'"
@@ -25,6 +24,3 @@ help:
 	@echo "'help'      - outputs this message"
 
 #####################################################################
-
-obj_mapcache:
-	-mkdir obj_mapcache

+ 38 - 36
src/tool/mapcache.c

@@ -9,6 +9,7 @@
 #include <unistd.h>
 #endif
 
+#include "../common/cbasetypes.h"
 #include "grfio.h"
 
 #define MAP_NAME_LENGTH 12
@@ -26,23 +27,23 @@ unsigned long file_size;
 
 // Used internally, this structure contains the physical map cells
 struct map_data {
-	short xs;
-	short ys;
+	int16 xs;
+	int16 ys;
 	unsigned char *cells;
 };
 
 // This is the main header found at the very beginning of the file
 struct main_header {
-	unsigned long file_size;
-	unsigned short map_count;
+	uint32 file_size;
+	uint16 map_count;
 } header;
 
 // This is the header appended before every compressed map cells info
 struct map_info {
 	char name[MAP_NAME_LENGTH];
-	short xs;
-	short ys;
-	long len;
+	int16 xs;
+	int16 ys;
+	int32 len;
 };
 
 
@@ -50,55 +51,52 @@ struct map_info {
 * Big-endian compatibility functions *
 *************************************/
 
-// Converts a short (16 bits) from current machine order to little-endian
-short MakeShortLE(short val)
+// Converts an int16 from current machine order to little-endian
+int16 MakeShortLE(int16 val)
 {
 	unsigned char buf[2];
 	buf[0] = (unsigned char)( (val & 0x00FF)         );
 	buf[1] = (unsigned char)( (val & 0xFF00) >> 0x08 );
-	return *((short*)buf);
+	return *((int16*)buf);
 }
 
-// Converts a long (32 bits) from current machine order to little-endian
-long MakeLongLE(long val)
+// Converts an int32 from current machine order to little-endian
+int32 MakeLongLE(int32 val)
 {
 	unsigned char buf[4];
 	buf[0] = (unsigned char)( (val & 0x000000FF)         );
 	buf[1] = (unsigned char)( (val & 0x0000FF00) >> 0x08 );
 	buf[2] = (unsigned char)( (val & 0x00FF0000) >> 0x10 );
 	buf[3] = (unsigned char)( (val & 0xFF000000) >> 0x18 );
-	return *((long*)buf);
+	return *((int32*)buf);
 }
 
-// Reads an unsigned short (16 bits) in little-endian from the buffer
-unsigned short GetUShort(const unsigned char *buf)
+// Reads an uint16 in little-endian from the buffer
+uint16 GetUShort(const unsigned char* buf)
 {
-	return	 ( ((unsigned short)(buf[0]))         )
-			|( ((unsigned short)(buf[1])) << 0x08 );
+	return	 ( ((uint16)(buf[0]))         )
+			|( ((uint16)(buf[1])) << 0x08 );
 }
 
-// Reads a long (32 bits) in little-endian from the buffer
-long GetLong(const unsigned char *buf)
+// Reads an uint32 in little-endian from the buffer
+uint32 GetULong(const unsigned char* buf)
 {
-	return	 ( ((long)(buf[0]))         )
-			|( ((long)(buf[1])) << 0x08 )
-			|( ((long)(buf[2])) << 0x10 )
-			|( ((long)(buf[3])) << 0x18 );
+	return	 ( ((uint32)(buf[0]))         )
+			|( ((uint32)(buf[1])) << 0x08 )
+			|( ((uint32)(buf[2])) << 0x10 )
+			|( ((uint32)(buf[3])) << 0x18 );
 }
 
-// Reads an unsigned long (32 bits) in little-endian from the buffer
-unsigned long GetULong(const unsigned char *buf)
+// Reads an int32 in little-endian from the buffer
+int32 GetLong(const unsigned char* buf)
 {
-	return	 ( ((unsigned long)(buf[0]))         )
-			|( ((unsigned long)(buf[1])) << 0x08 )
-			|( ((unsigned long)(buf[2])) << 0x10 )
-			|( ((unsigned long)(buf[3])) << 0x18 );
+	return (int32)GetULong(buf);
 }
 
 // Reads a float (32 bits) from the buffer
-float GetFloat(const unsigned char *buf)
+float GetFloat(const unsigned char* buf)
 {
-	unsigned long val = GetULong(buf);
+	uint32 val = GetULong(buf);
 	return *((float*)&val);
 }
 
@@ -111,7 +109,7 @@ int read_map(char *name, struct map_data *m)
 	int water_height;
 	size_t xy, off, num_cells;
 	float height;
-	unsigned long type;
+	uint32 type;
 
 	// Open map GAT
 	sprintf(filename,"data\\%s.gat", name);
@@ -131,9 +129,13 @@ int read_map(char *name, struct map_data *m)
 		water_height = NO_WATER;
 
 	// Read map size and allocate needed memory
-	m->xs = (short)GetULong(gat+6);
-	m->ys = (short)GetULong(gat+10);
-	num_cells = (size_t)m->xs*m->ys;
+	m->xs = (int16)GetULong(gat+6);
+	m->ys = (int16)GetULong(gat+10);
+	if (m->xs <= 0 || m->ys <= 0) {
+		free(gat);
+		return 0;
+	}
+	num_cells = (size_t)m->xs*(size_t)m->ys;
 	m->cells = (unsigned char *)malloc(num_cells);
 
 	// Set cell properties
@@ -165,7 +167,7 @@ void cache_map(char *name, struct map_data *m)
 	unsigned char *write_buf;
 
 	// Create an output buffer twice as big as the uncompressed map... this way we're sure it fits
-	len = m->xs*m->ys*2;
+	len = (unsigned long)m->xs*(unsigned long)m->ys*2;
 	write_buf = (unsigned char *)malloc(len);
 	// Compress the cells and get the compressed length
 	encode_zip(write_buf, &len, m->cells, m->xs*m->ys);