- more updates to support big endian

This commit is contained in:
Mark Vejvoda
2012-11-01 06:21:35 +00:00
parent 37b09daa77
commit 3bba236d02
4 changed files with 49 additions and 5 deletions

View File

@@ -3074,7 +3074,7 @@ int glestMain(int argc, char** argv) {
if( haveSpecialOutputCommandLineOption == false || if( haveSpecialOutputCommandLineOption == false ||
hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_VERSION]) == true) { hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_VERSION]) == true) {
printf("%s %s",extractFileFromDirectoryPath(argv[0]).c_str(),getNetworkPlatformFreeVersionString().c_str()); printf("%s %s",extractFileFromDirectoryPath(argv[0]).c_str(),getNetworkPlatformFreeVersionString().c_str());
printf("\nCompiled using: %s on: %s platform: %s",getCompilerNameString().c_str(),getCompileDateTime().c_str(),getPlatformNameString().c_str()); printf("\nCompiled using: %s on: %s platform: %s endianness: %s",getCompilerNameString().c_str(),getCompileDateTime().c_str(),getPlatformNameString().c_str(),(Shared::PlatformByteOrder::isBigEndian() == true ? "big" : "little"));
printf("\nSVN: [%s]",getSVNRevisionString().c_str()); printf("\nSVN: [%s]",getSVNRevisionString().c_str());
#ifdef USE_STREFLOP #ifdef USE_STREFLOP
//# define STREFLOP_NO_DENORMALS //# define STREFLOP_NO_DENORMALS

View File

@@ -91,6 +91,9 @@ struct MapFileHeader {
}; };
}; };
void toEndianMapFileHeader(MapFileHeader &header);
void fromEndianMapFileHeader(MapFileHeader &header);
class MapInfo { class MapInfo {
public: public:

View File

@@ -19,6 +19,7 @@
#include <iterator> #include <iterator>
#include "platform_util.h" #include "platform_util.h"
#include "conversion.h" #include "conversion.h"
#include "byte_order.h"
#ifndef WIN32 #ifndef WIN32
#include <errno.h> #include <errno.h>
@@ -747,6 +748,35 @@ void MapPreview::switchSurfaces(MapSurfaceType surf1, MapSurfaceType surf2) {
} }
} }
void toEndianMapFileHeader(MapFileHeader &header) {
header.version = Shared::PlatformByteOrder::toCommonEndian(header.version);
header.maxFactions = Shared::PlatformByteOrder::toCommonEndian(header.maxFactions);
header.width = Shared::PlatformByteOrder::toCommonEndian(header.width);
header.height = Shared::PlatformByteOrder::toCommonEndian(header.height);
header.heightFactor = Shared::PlatformByteOrder::toCommonEndian(header.heightFactor);
header.waterLevel = Shared::PlatformByteOrder::toCommonEndian(header.waterLevel);
for(unsigned int i =0; i < MAX_TITLE_LENGTH; ++i) {
header.title[i] = Shared::PlatformByteOrder::toCommonEndian(header.title[i]);
}
for(unsigned int i =0; i < MAX_DESCRIPTION_LENGTH; ++i) {
header.description[i] = Shared::PlatformByteOrder::toCommonEndian(header.description[i]);
}
}
void fromEndianMapFileHeader(MapFileHeader &header) {
header.version = Shared::PlatformByteOrder::fromCommonEndian(header.version);
header.maxFactions = Shared::PlatformByteOrder::fromCommonEndian(header.maxFactions);
header.width = Shared::PlatformByteOrder::fromCommonEndian(header.width);
header.height = Shared::PlatformByteOrder::fromCommonEndian(header.height);
header.heightFactor = Shared::PlatformByteOrder::fromCommonEndian(header.heightFactor);
header.waterLevel = Shared::PlatformByteOrder::fromCommonEndian(header.waterLevel);
for(unsigned int i =0; i < MAX_TITLE_LENGTH; ++i) {
header.title[i] = Shared::PlatformByteOrder::fromCommonEndian(header.title[i]);
}
for(unsigned int i =0; i < MAX_DESCRIPTION_LENGTH; ++i) {
header.description[i] = Shared::PlatformByteOrder::fromCommonEndian(header.description[i]);
}
}
void MapPreview::loadFromFile(const string &path) { void MapPreview::loadFromFile(const string &path) {
// "Could not open file, result: 3 - 2 No such file or directory [C:\Documents and Settings\人間五\Application Data\megaglest\maps\clearings_in_the_woods.gbm] // "Could not open file, result: 3 - 2 No such file or directory [C:\Documents and Settings\人間五\Application Data\megaglest\maps\clearings_in_the_woods.gbm]
@@ -768,16 +798,17 @@ void MapPreview::loadFromFile(const string &path) {
snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__); snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__);
throw megaglest_runtime_error(szBuf); throw megaglest_runtime_error(szBuf);
} }
fromEndianMapFileHeader(header);
heightFactor = header.heightFactor; heightFactor = header.heightFactor;
waterLevel = header.waterLevel; waterLevel = header.waterLevel;
title = header.title; title = header.title;
author = header.author; author = header.author;
cliffLevel = 0; cliffLevel = 0;
if(header.version==1){ if(header.version == 1) {
desc = header.description; desc = header.description;
} }
else if(header.version==2){ else if(header.version == 2) {
desc = header.version2.short_desc; desc = header.version2.short_desc;
cliffLevel=header.version2.cliffLevel; cliffLevel=header.version2.cliffLevel;
cameraHeight=header.version2.cameraHeight; cameraHeight=header.version2.cameraHeight;
@@ -792,6 +823,7 @@ void MapPreview::loadFromFile(const string &path) {
snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__); snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__);
throw megaglest_runtime_error(szBuf); throw megaglest_runtime_error(szBuf);
} }
startLocations[i].x = Shared::PlatformByteOrder::toCommonEndian(startLocations[i].x);
bytes = fread(&startLocations[i].y, sizeof(int32), 1, f1); bytes = fread(&startLocations[i].y, sizeof(int32), 1, f1);
if(bytes != 1) { if(bytes != 1) {
@@ -799,7 +831,7 @@ void MapPreview::loadFromFile(const string &path) {
snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__); snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__);
throw megaglest_runtime_error(szBuf); throw megaglest_runtime_error(szBuf);
} }
startLocations[i].y = Shared::PlatformByteOrder::toCommonEndian(startLocations[i].y);
} }
//read Heights //read Heights
@@ -812,6 +844,7 @@ void MapPreview::loadFromFile(const string &path) {
snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__); snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__);
throw megaglest_runtime_error(szBuf); throw megaglest_runtime_error(szBuf);
} }
cells[i][j].height = Shared::PlatformByteOrder::toCommonEndian(cells[i][j].height);
} }
} }
@@ -824,6 +857,7 @@ void MapPreview::loadFromFile(const string &path) {
snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__); snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__);
throw megaglest_runtime_error(szBuf); throw megaglest_runtime_error(szBuf);
} }
cells[i][j].surface = Shared::PlatformByteOrder::toCommonEndian(cells[i][j].surface);
} }
} }
@@ -837,6 +871,7 @@ void MapPreview::loadFromFile(const string &path) {
snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__); snprintf(szBuf,8096,"fread returned wrong size = %zu on line: %d.",bytes,__LINE__);
throw megaglest_runtime_error(szBuf); throw megaglest_runtime_error(szBuf);
} }
obj = Shared::PlatformByteOrder::toCommonEndian(obj);
if (obj <= 10) { if (obj <= 10) {
cells[i][j].object = obj; cells[i][j].object = obj;
@@ -1028,6 +1063,8 @@ bool MapPreview::loadMapInfo(string file, MapInfo *mapInfo, string i18nMaxMapPla
} }
} }
else { else {
fromEndianMapFileHeader(header);
if(header.version < mapver_1 || header.version >= mapver_MAX) { if(header.version < mapver_1 || header.version >= mapver_MAX) {
validMap = false; validMap = false;

View File

@@ -64,6 +64,7 @@
#include <algorithm> #include <algorithm>
#include "platform_util.h" #include "platform_util.h"
#include "utf8.h" #include "utf8.h"
#include "byte_order.h"
#include "leak_dumper.h" #include "leak_dumper.h"
#ifdef __APPLE__ #ifdef __APPLE__
@@ -654,6 +655,9 @@ pair<bool,time_t> hasCachedFileCRCValue(string crcCacheFile, uint32 &value) {
} }
int readbytes = fscanf(fp,"%20ld,%20u,%20ld",&refreshDate,&crcValue,&lastUpdateDate); int readbytes = fscanf(fp,"%20ld,%20u,%20ld",&refreshDate,&crcValue,&lastUpdateDate);
refreshDate = Shared::PlatformByteOrder::fromCommonEndian(refreshDate);
crcValue = Shared::PlatformByteOrder::fromCommonEndian(crcValue);
lastUpdateDate = Shared::PlatformByteOrder::fromCommonEndian(lastUpdateDate);
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) {
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Line: %d for Cache file [%s] readbytes = %d\n",__FILE__,__FUNCTION__,__LINE__,crcCacheFile.c_str(),readbytes); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Line: %d for Cache file [%s] readbytes = %d\n",__FILE__,__FUNCTION__,__LINE__,crcCacheFile.c_str(),readbytes);
@@ -746,7 +750,7 @@ void writeCachedFileCRCValue(string crcCacheFile, uint32 &crcValue) {
char szBuf1[100]=""; char szBuf1[100]="";
strftime(szBuf1,100,"%Y-%m-%d %H:%M:%S",loctime); strftime(szBuf1,100,"%Y-%m-%d %H:%M:%S",loctime);
fprintf(fp,"%ld,%u,%ld",refreshDate,crcValue,now); fprintf(fp,"%ld,%u,%ld",Shared::PlatformByteOrder::toCommonEndian(refreshDate),Shared::PlatformByteOrder::toCommonEndian(crcValue),Shared::PlatformByteOrder::toCommonEndian(now));
fclose(fp); fclose(fp);
//if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"========== Writing CRC Cache offset [%d] refreshDate = %ld [%s], crcValue = %u, file [%s]\n",offset,refreshDate,szBuf1,crcValue,crcCacheFile.c_str()); //if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"========== Writing CRC Cache offset [%d] refreshDate = %ld [%s], crcValue = %u, file [%s]\n",offset,refreshDate,szBuf1,crcValue,crcCacheFile.c_str());