Sfoglia il codice sorgente

* Merged decode_zip/encode_zip from eapp's grfio to replace our direct use of zlib's uncompress/compress.
* Fixed strict-aliasing warning in mapcache's GetFloat.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14888 54d463be-8e91-2dee-dedb-b68131a5f0ec

flaviojs 14 anni fa
parent
commit
0394156c54
5 ha cambiato i file con 80 aggiunte e 6 eliminazioni
  1. 2 0
      Changelog-Trunk.txt
  2. 72 3
      src/common/grfio.c
  3. 3 0
      src/common/grfio.h
  4. 1 1
      src/map/map.c
  5. 2 2
      src/tool/mapcache.c

+ 2 - 0
Changelog-Trunk.txt

@@ -2,6 +2,8 @@ Date	Added
 
 2011/07/06
 	* Changed grfio.c include order and moved zlib include from the header to the source. [FlavioJS]
+	* Merged decode_zip/encode_zip from eapp's grfio to replace our direct use of zlib's uncompress/compress.
+	* Fixed strict-aliasing warning in mapcache's GetFloat.
 2011/07/05
 	* CMake: split txt and sql variants of login-server and map-server. [FlavioJS]
 2011/07/04

+ 72 - 3
src/common/grfio.c

@@ -220,6 +220,75 @@ unsigned long grfio_crc32 (const unsigned char* buf, unsigned int len)
 	return crc32(crc32(0L, Z_NULL, 0), buf, len);
 }
 
+
+///////////////////////////////////////////////////////////////////////////////
+///	Grf data sub : zip decode
+int decode_zip(unsigned char* dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen)
+{
+	z_stream stream;
+	int err;
+
+	stream.next_in = (Bytef*)source;
+	stream.avail_in = (uInt)sourceLen;
+	// Check for source > 64K on 16-bit machine:
+	if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+	stream.next_out = (Bytef*) dest;
+	stream.avail_out = (uInt)*destLen;
+	if ((unsigned long)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+	stream.zalloc = (alloc_func)0;
+	stream.zfree = (free_func)0;
+
+	err = inflateInit(&stream);
+	if (err != Z_OK) return err;
+
+	err = inflate(&stream, Z_FINISH);
+	if (err != Z_STREAM_END) {
+		inflateEnd(&stream);
+		return err == Z_OK ? Z_BUF_ERROR : err;
+	}
+	*destLen = stream.total_out;
+
+	err = inflateEnd(&stream);
+	return err;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+///	Grf data sub : zip encode 
+int encode_zip(unsigned char* dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen)
+{
+	z_stream stream;
+	int err;
+
+	stream.next_in = (Bytef*)source;
+	stream.avail_in = (uInt)sourceLen;
+	// Check for source > 64K on 16-bit machine: 
+	if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+	stream.next_out = (Bytef*) dest;
+	stream.avail_out = (uInt)*destLen;
+	if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+	stream.zalloc = (alloc_func)0;
+	stream.zfree = (free_func)0;
+
+	err = deflateInit(&stream,Z_DEFAULT_COMPRESSION);
+	if (err != Z_OK) return err;
+
+	err = deflate(&stream, Z_FINISH);
+	if (err != Z_STREAM_END) {
+		deflateEnd(&stream);
+		return err == Z_OK ? Z_BUF_ERROR : err;
+	}
+	*destLen = stream.total_out;
+
+	err = deflateEnd(&stream);
+	return err;
+}
+
+
 /***********************************************************
  ***                File List Subroutines                ***
  ***********************************************************/
@@ -430,9 +499,9 @@ void* grfio_reads(char* fname, int* size)
 				if (entry->cycle >= 0)
 					decode_des_etc(buf, entry->srclen_aligned, entry->cycle == 0, entry->cycle);
 				len = entry->declen;
-				uncompress(buf2, &len, buf, entry->srclen);
+				decode_zip(buf2, &len, buf, entry->srclen);
 				if (len != (uLong)entry->declen) {
-					ShowError("uncompress size mismatch err: %d != %d\n", (int)len, entry->declen);
+					ShowError("decode_zip size mismatch err: %d != %d\n", (int)len, entry->declen);
 					aFree(buf);
 					aFree(buf2);
 					return NULL;
@@ -579,7 +648,7 @@ static int grfio_entryread(char* grfname, int gentry)
 		grf_filelist = (unsigned char *)aMallocA(eSize);	// Get a Extend Size
 		fread(rBuf,1,rSize,fp);
 		fclose(fp);
-		uncompress(grf_filelist, &eSize, rBuf, rSize);	// Decode function
+		decode_zip(grf_filelist, &eSize, rBuf, rSize);	// Decode function
 		list_size = eSize;
 		aFree(rBuf);
 

+ 3 - 0
src/common/grfio.h

@@ -14,4 +14,7 @@ char *grfio_find_file(char *fname);
 int grfio_size(char*);			// GRFIO data file size get
 unsigned long grfio_crc32(const unsigned char *buf, unsigned int len);
 
+int decode_zip(unsigned char* dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
+int encode_zip(unsigned char* dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
+
 #endif /* _GRFIO_H_ */

+ 1 - 1
src/map/map.c

@@ -2727,7 +2727,7 @@ int map_readfromcache(struct map_data *m, char *buffer, char *decode_buffer)
 		}
 
 		// TO-DO: Maybe handle the scenario, if the decoded buffer isn't the same size as expected? [Shinryo]
-		uncompress(decode_buffer, &size, p+sizeof(struct map_cache_map_info), info->len);
+		decode_zip(decode_buffer, &size, p+sizeof(struct map_cache_map_info), info->len);
 
 		CREATE(m->cell, struct mapcell, size);
 

+ 2 - 2
src/tool/mapcache.c

@@ -98,7 +98,7 @@ int32 GetLong(const unsigned char* buf)
 float GetFloat(const unsigned char* buf)
 {
 	uint32 val = GetULong(buf);
-	return *((float*)&val);
+	return *((float*)(void*)&val);
 }
 
 
@@ -171,7 +171,7 @@ void cache_map(char *name, struct map_data *m)
 	len = (unsigned long)m->xs*(unsigned long)m->ys*2;
 	write_buf = (unsigned char *)aMalloc(len);
 	// Compress the cells and get the compressed length
-	compress(write_buf, &len, m->cells, m->xs*m->ys);
+	encode_zip(write_buf, &len, m->cells, m->xs*m->ys);
 
 	// Fill the map header
 	strncpy(info.name, name, MAP_NAME_LENGTH);