Added LEB128 decoding functions
authorJean-Paul Mari <djipi.mari@gmail.com>
Sun, 16 Sep 2018 05:41:16 +0000 (01:41 -0400)
committerJean-Paul Mari <djipi.mari@gmail.com>
Sun, 16 Sep 2018 05:41:16 +0000 (01:41 -0400)
Win-VS2017/virtualjaguar.vcxproj
Win-VS2017/virtualjaguar.vcxproj.filters
src/LEB128.cpp [new file with mode: 0644]
src/LEB128.h [new file with mode: 0644]
virtualjaguar.pro

index 3561824..4f8b2c8 100644 (file)
     <ClCompile Include="..\src\file.cpp" />\r
     <ClCompile Include="..\src\gui\keybindingstab.cpp" />\r
     <ClCompile Include="..\src\gui\modelsbiostab.cpp" />\r
+    <ClCompile Include="..\src\LEB128.cpp" />\r
     <ClCompile Include="..\src\log.cpp" />\r
     <ClCompile Include="..\src\settings.cpp" />\r
     <ClCompile Include="..\src\unzip.cpp" />\r
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_NO_DEBUG -DQT_OPENGL_LIB -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_UNICODE "-I." "-I.\..\src" "-I.\..\src\gui" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-IC:\SDK\OpenGL\include" "-IC:\SDK\SDL\SDL-1.2.15\include" "-IC:\SDK\DWARF\libdwarf-VS2015\include" "-IC:\SDK\Elf\libelf-0.8.13\include" "-IC:\SDK\zlib\zlib-1.2.11\include" "-I.\GeneratedFiles\$(ConfigurationName)\."</Command>\r
     </CustomBuild>\r
+    <ClInclude Include="..\src\LEB128.h" />\r
     <ClInclude Include="..\src\log.h" />\r
     <ClInclude Include="..\src\settings.h" />\r
     <ClInclude Include="..\src\unzip.h" />\r
index 720a840..bf19ace 100644 (file)
     <ClCompile Include="..\src\gui\modelsbiostab.cpp">\r
       <Filter>Source Files\gui\tab</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\src\LEB128.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\src\debugger\DWARFManager.h">\r
     <ClInclude Include="..\src\settings.h">\r
       <Filter>Header Files</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\src\LEB128.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <None Include="..\res\alpine-file.png">\r
diff --git a/src/LEB128.cpp b/src/LEB128.cpp
new file mode 100644 (file)
index 0000000..159b5f3
--- /dev/null
@@ -0,0 +1,46 @@
+
+
+// Decode an unsigned LEB128
+// Algorithm from Appendix C of the DWARF 2, and 3, spec section "7.6"
+unsigned long ReadULEB128(char *addr)
+{
+       unsigned long result = 0;
+       size_t shift = 0;
+       unsigned char byte;
+
+       do
+       {
+               byte = *addr++;
+               result |= (byte & 0x7f) << shift;
+               shift += 7;
+       }
+       while ((byte & 0x80));
+
+       return result;
+}
+
+
+// Decode a signed LEB128
+// Algorithm from Appendix C of the DWARF 2, and 3, spec section "7.6"
+long ReadLEB128(char *addr)
+{
+       long result = 0;
+       size_t shift = 0;
+       unsigned char byte;
+
+       do
+       {
+               byte = *addr++;
+               result |= (byte & 0x7f) << shift;
+               shift += 7;
+       }
+       while ((byte & 0x80));
+
+       if ((shift < (8 * sizeof(result))) && (byte & 0x40))
+       {
+               result |= (~0 << shift);
+       }
+
+       return result;
+}
+
diff --git a/src/LEB128.h b/src/LEB128.h
new file mode 100644 (file)
index 0000000..7f2c527
--- /dev/null
@@ -0,0 +1,6 @@
+
+// LEB128 handler
+
+//
+extern unsigned long ReadULEB128(char *addr);
+extern long ReadLEB128(char *addr);
index 60043d3..c3ca4c0 100644 (file)
@@ -127,7 +127,8 @@ HEADERS = \
        src/crc32.h \\r
        src/settings.h \\r
        src/modelsBIOS.h \\r
-       src/file.h\r
+       src/file.h \\r
+       src/LEB128.h\r
 \r
 SOURCES = \\r
        src/gui/about.cpp \\r
@@ -178,5 +179,6 @@ SOURCES = \
        src/crc32.cpp \\r
        src/settings.cpp \\r
        src/modelsBIOS.cpp \    \r
-       src/file.cpp\r
+       src/file.cpp \\r
+       src/LEB128.cpp\r
                
\ No newline at end of file