From ca1d98a7baf7d650c02e027c6c15dfc8eeeb171d Mon Sep 17 00:00:00 2001
From: faketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6>
Date: Sun, 30 Oct 2011 11:41:18 +0000
Subject: [PATCH] Changed long to long long so it works fine on 32bit systems
 Added printing for Byte array tags (the length is incorrect though)
 Structured the tags enums a bit more In cConvert.cpp the correct compounds
 are opened before accessing data Added VS2010 project so the converter can be
 compiled through VS2010

git-svn-id: http://mc-server.googlecode.com/svn/trunk@27 0a769ca7-a7f5-676a-18bf-c427514a06d6
---
 VC2010/Converter.vcxproj         | 83 ++++++++++++++++++++++++++++++++
 VC2010/Converter.vcxproj.filters | 30 ++++++++++++
 VC2010/Converter.vcxproj.user    | 11 +++++
 VC2010/MCServer.sln              |  8 +++
 converter/cConvert.cpp           | 22 +++++----
 converter/cNBTData.cpp           | 27 ++++++-----
 converter/cNBTData.h             | 18 ++++---
 7 files changed, 169 insertions(+), 30 deletions(-)
 create mode 100644 VC2010/Converter.vcxproj
 create mode 100644 VC2010/Converter.vcxproj.filters
 create mode 100644 VC2010/Converter.vcxproj.user

diff --git a/VC2010/Converter.vcxproj b/VC2010/Converter.vcxproj
new file mode 100644
index 000000000..a9a40457f
--- /dev/null
+++ b/VC2010/Converter.vcxproj
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\converter\cConvert.cpp" />
+    <ClCompile Include="..\converter\cNBTData.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\converter\cNBTData.h" />
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{9AB1FB82-2148-40E4-919F-3B184B4593C8}</ProjectGuid>
+    <RootNamespace>Converter</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>../converter/</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>../converter/</OutDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <AdditionalIncludeDirectories>../zlib-1.2.5</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalLibraryDirectories>./Debug/</AdditionalLibraryDirectories>
+      <AdditionalDependencies>ws2_32.lib;ZLib.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>../zlib-1.2.5</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalLibraryDirectories>./Release/</AdditionalLibraryDirectories>
+      <AdditionalDependencies>ws2_32.lib;ZLib.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/VC2010/Converter.vcxproj.filters b/VC2010/Converter.vcxproj.filters
new file mode 100644
index 000000000..dbe3b1c28
--- /dev/null
+++ b/VC2010/Converter.vcxproj.filters
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\converter\cConvert.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\converter\cNBTData.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\converter\cNBTData.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/VC2010/Converter.vcxproj.user b/VC2010/Converter.vcxproj.user
new file mode 100644
index 000000000..90d00fb58
--- /dev/null
+++ b/VC2010/Converter.vcxproj.user
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory>
+    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory>
+    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/VC2010/MCServer.sln b/VC2010/MCServer.sln
index 14e0e8457..322046d33 100644
--- a/VC2010/MCServer.sln
+++ b/VC2010/MCServer.sln
@@ -17,6 +17,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebServer", "WebServer.vcxp
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JsonCpp", "JsonCpp.vcxproj", "{ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Converter", "Converter.vcxproj", "{9AB1FB82-2148-40E4-919F-3B184B4593C8}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
@@ -71,6 +73,12 @@ Global
 		{ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}.Release|Win32.ActiveCfg = Release|Win32
 		{ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}.Release|Win32.Build.0 = Release|Win32
 		{ADBF25B9-7192-4E54-B35E-8EC47CA5EF86}.Release|x64.ActiveCfg = Release|Win32
+		{9AB1FB82-2148-40E4-919F-3B184B4593C8}.Debug|Win32.ActiveCfg = Debug|Win32
+		{9AB1FB82-2148-40E4-919F-3B184B4593C8}.Debug|Win32.Build.0 = Debug|Win32
+		{9AB1FB82-2148-40E4-919F-3B184B4593C8}.Debug|x64.ActiveCfg = Debug|Win32
+		{9AB1FB82-2148-40E4-919F-3B184B4593C8}.Release|Win32.ActiveCfg = Release|Win32
+		{9AB1FB82-2148-40E4-919F-3B184B4593C8}.Release|Win32.Build.0 = Release|Win32
+		{9AB1FB82-2148-40E4-919F-3B184B4593C8}.Release|x64.ActiveCfg = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/converter/cConvert.cpp b/converter/cConvert.cpp
index 565a6bd6a..e31730bf3 100644
--- a/converter/cConvert.cpp
+++ b/converter/cConvert.cpp
@@ -7,7 +7,7 @@
 #include <ctype.h>
 #include "zlib.h"
 #include <time.h>
-#include "cNBTData.cpp"
+#include "cNBTData.h"
 
 void quicksort(int*, int, int);
 int partition(int*, int, int, int);
@@ -32,7 +32,7 @@ int main () {
         FILE* wf = 0;
 	#ifdef _WIN32
 		sprintf_s(SourceFile, 128, "region/%s","r.0.0.mcr"); //replace hard coded file with file array variable
-                sprintf_s(OutputFile, 128, "world/%s","X0_Z0.pak"); //parce x and z from file array variable and place into pak file format
+        sprintf_s(OutputFile, 128, "world/%s","X0_Z0.pak"); //parce x and z from file array variable and place into pak file format
 		if( fopen_s(&wf, OutputFile, "wb" ) == 0 ) {} else { cout << "uhoh!" << endl; return 0; } //open new pak file for writing
 	#else
 		sprintf(SourceFile, "region/%s","r.0.0.mcr"); //same as above but for linux
@@ -48,9 +48,9 @@ int main () {
 		unsigned char byte1 = 0;
 		unsigned char byte2 = 0;
 		unsigned char byte3 = 0;
-                unsigned char byte4 = 0;
-                unsigned char byte5 = 0;
-                unsigned char trash = 0;
+        unsigned char byte4 = 0;
+        unsigned char byte5 = 0;
+        unsigned char trash = 0;
 		unsigned int  frloc = 0;
 		int toffset = 0;
 		int compdlength = 0;
@@ -107,8 +107,8 @@ int main () {
 				//cout << "frloc: " << frloc << endl;
 
 
-
-				char temparr[compdlength]; //can't get fread to read more than one char at a time into a char array... so that's what I'll do.  :(    At least it works.
+				// TODO - delete [] temparr after you're done with it, now it's a memory leak
+				char* temparr = new char[compdlength]; //can't get fread to read more than one char at a time into a char array... so that's what I'll do.  :(    At least it works.
 				if( fread( temparr, compdlength, 1, f) != 1 ) { cout << "ERROR rf22 READING FROM FILE " << SourceFile; fclose(f); return false; }
 				frloc = frloc + compdlength;
 				/*
@@ -173,7 +173,7 @@ int main () {
 
 
 				//testing of nbtparser.
-				cNBTData* NBTData = new cNBTData::cNBTData(BlockData, (testr));
+				cNBTData* NBTData = new cNBTData(BlockData, (testr));
 				//NBTData->m_bDecompressed = true;
 				NBTData->ParseData();
 				NBTData->PrintData();
@@ -181,10 +181,14 @@ int main () {
 				//NBTData->GetByteArray("Blocks");
 				//for(unsigned int i = 0; i < 111; i++) {//re
 					//printf("Blocks?: %i\n", NBTData->cNBTCompound::GetByteArray("Blocks")[0]);
+				NBTData->OpenCompound("");
+				NBTData->OpenCompound("Level"); // You need to open the right compounds before you can access the data in it
 					printf("xPos: %i\n", NBTData->GetInteger("xPos") );
 					//will print
 					//xPos: 0
-					printf("test: %i\n", NBTData->cNBTCompound::GetByteArray("Blocks")[0] );
+					printf("test: %i\n", NBTData->GetByteArray("Blocks")[0] );
+				NBTData->CloseCompound();// Close the compounds after you're done
+				NBTData->CloseCompound();
 				//}
 				return 1;
                                 fwrite( BlockData, DestSize, 1, wf ); //write contents of uncompressed block data to file to check to see if it's valid... It is! :D
diff --git a/converter/cNBTData.cpp b/converter/cNBTData.cpp
index 5bc6e3ddf..fc0dd628e 100644
--- a/converter/cNBTData.cpp
+++ b/converter/cNBTData.cpp
@@ -357,6 +357,11 @@ void cNBTCompound::PrintData( int a_Depth, std::string a_Name )
         printf("%s BYTE %s (%i)\n", Prefix, itr->first.c_str(), itr->second );
     }
 
+	for( ByteArrayMap::iterator itr = m_ByteArrays.begin(); itr != m_ByteArrays.end(); itr++ )
+	{
+		printf("%s BYTE ARRAY %s (length: %i)\n", Prefix, itr->first.c_str(), sizeof(itr->second) );
+	}
+
     delete Prefix;
 }
 
@@ -524,9 +529,9 @@ void cNBTData::ParseLong( bool a_bNamed )
 {
     std::string Name;
     if( a_bNamed ) Name = ReadName();
-    long Value = ReadLong();
+    long long Value = ReadLong();
 
-    PutInteger( Name, Value );
+    PutInteger( Name, (int)Value );
 
     printf("LONG: %s %li\n", Name.c_str(), Value );//re
 }
@@ -554,12 +559,8 @@ void cNBTData::ParseByteArray( bool a_bNamed )
     char* ByteArray = new char[ Length ];
     if( Length > 0 )
     {
-        for(int i = 0; i < Length; i++, m_Index++)
-        {
-	    ByteArray[i] = m_Buffer[ m_Index ];
-	    //ByteArray[i].push_back( m_Buffer[m_Index] );
-            //String.push_back( m_Buffer[m_Index] );
-        }
+		memcpy( ByteArray, &m_Buffer[ m_Index ], Length );
+        m_Index += Length;
     }
 
     PutByteArray( Name, ByteArray );
@@ -607,11 +608,11 @@ int cNBTData::ReadInt()
     return ntohl( Value );
 }
 
-long cNBTData::ReadLong()
+long long cNBTData::ReadLong()
 {
-    long Value = 0;
-    memcpy( &Value, m_Buffer+m_Index, sizeof(long) );
-    m_Index+=sizeof(long);
+    long long Value = 0;
+    memcpy( &Value, m_Buffer+m_Index, sizeof(long long) );
+    m_Index+=sizeof(long long);
 
     return ntohl( Value );
 }
@@ -757,4 +758,4 @@ void cNBTList::Clear()
         }
     }
     m_List.clear();
-}
+}
\ No newline at end of file
diff --git a/converter/cNBTData.h b/converter/cNBTData.h
index a0a40e68b..2ab5b0e21 100644
--- a/converter/cNBTData.h
+++ b/converter/cNBTData.h
@@ -20,14 +20,16 @@ public:
 #endif
     {
         TAG_End = 0,
-        TAG_Byte,
-        TAG_Short,
-        TAG_Int,
-	TAG_Long,
+        TAG_Byte = 1,
+        TAG_Short = 2,
+        TAG_Int = 3,
+		TAG_Long = 4,
+		TAG_Float = 5,
+		TAG_Double = 6,
         TAG_ByteArray = 7,
-	TAG_String,
-        TAG_List,
-        TAG_Compound,
+		TAG_String = 8,
+        TAG_List = 9,
+        TAG_Compound = 10,
         TAG_NumTags // Not a real tag, but contains number of tags
     };
 
@@ -167,7 +169,7 @@ private:
     std::string ReadName();
     char ReadByte();
     int ReadInt();
-    long ReadLong();
+    long long ReadLong();
 
     cNBTCompound*    m_CurrentCompound;