From bcfff0b44d6bd19025f9c7a251f8208e7c4973e9 Mon Sep 17 00:00:00 2001
From: Amit Gupta <amit_@outlook.in>
Date: Sun, 19 Jan 2025 17:39:16 -0600
Subject: [PATCH] Working version, modified to remove some compile time
 warnings + Cmake fix

---
 CMakeLists.txt                          | 2 +-
 cmake/items-macros.cmake.in             | 8 ++++----
 cpp/src/KIM_SharedLibrary.cpp           | 3 ---
 cpp/src/base64-encode/CMakeLists.txt    | 2 +-
 cpp/src/base64-encode/base64-encode.cpp | 3 +--
 cpp/src/base64-encode/base64.hpp        | 4 ++--
 6 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5a86ec1c..fa56d4f5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -166,7 +166,7 @@ endif()
 # Keeping the name XXD for now, as otherwise this will result in much larger refactoring
 # But everywhere, XXD = base64-encode
 set(XXD_EXECUTABLE ${PROJECT_BINARY_DIR}/utils/base64-encode)
-add_subdirectory(cpp/src/base64-encode ${CMAKE_BINARY_DIR}/utils/base64-encode)
+add_subdirectory(cpp/src/base64-encode)
 add_dependencies(kim-api base64-encode)
 install(TARGETS base64-encode
     RUNTIME DESTINATION ${CMAKE_INSTALL_RELOC_BINDIR})
diff --git a/cmake/items-macros.cmake.in b/cmake/items-macros.cmake.in
index 3ccd08db..41240961 100644
--- a/cmake/items-macros.cmake.in
+++ b/cmake/items-macros.cmake.in
@@ -503,9 +503,9 @@ endmacro()
 #
 function(_add_custom_command_blob_to_cpp _dirin _filein _fileout)
   include(FindPackageMessage)
-  find_program(XXD_EXECUTABLE "kim-base64-encode")
+  find_program(XXD_EXECUTABLE "base64-encode")
   if(XXD_EXECUTABLE)
-    find_package_message(xxd "Found kim-base64-encode: (${XXD_EXECUTABLE})" "found")
+    find_package_message(xxd "Found base64-encode: (${XXD_EXECUTABLE})" "found")
 
     string(MAKE_C_IDENTIFIER ${_filein} _cfilein)
     set(_edit_xxd_output "${CMAKE_CURRENT_BINARY_DIR}/EditXXDOutput.cmake")
@@ -522,7 +522,7 @@ function(_add_custom_command_blob_to_cpp _dirin _filein _fileout)
         )
     endif()
     add_custom_command(OUTPUT ${_fileout}
-      COMMAND ${XXD_EXECUTABLE} "${_filein}" "${_fileout}"
+      COMMAND ${XXD_EXECUTABLE} -i "${_filein}" "${_fileout}"
       COMMAND ${CMAKE_COMMAND} "-Dvarname=${_cfilein}" "-Dfilein=${_filein}" "-Dfileout=${_fileout}" -P "${_edit_xxd_output}"
       DEPENDS "${_dirin}/${_filein}" "${_edit_xxd_output}"
       WORKING_DIRECTORY "${_dirin}"
@@ -533,7 +533,7 @@ function(_add_custom_command_blob_to_cpp _dirin _filein _fileout)
     # No backup yet
     # Possible Solutions: 1) CMAKE only implementation of base64 encoding? 
     #                     2) use system base64/openssl binaries?
-    message(FATAL_ERROR "Missing kim-base64-encode: Please check the KIM-API installation.")
+    message(FATAL_ERROR "Missing base64-encode: Please check the KIM-API installation.")
     # find_package_message(xxd "Missing xxd: Falling back to less efficient cmake implementation." "missing")
 
     # string(MAKE_C_IDENTIFIER ${_filein} _cfilein)
diff --git a/cpp/src/KIM_SharedLibrary.cpp b/cpp/src/KIM_SharedLibrary.cpp
index 3eafa7c6..76770f29 100644
--- a/cpp/src/KIM_SharedLibrary.cpp
+++ b/cpp/src/KIM_SharedLibrary.cpp
@@ -651,9 +651,6 @@ int SharedLibrary::WriteParameterFileDirectory()
     fl.open(specificationFilePathName.string().c_str(),
             std::ifstream::out | std::ifstream::binary);
 
-    int usable_chars
-        = static_cast<int>(len);  // unsigned int to signed to avoid underflow
-
     std::vector<char> binary_line;
     binary_line.reserve(base64::decoded_size(len));
     std::pair<std::size_t, std::size_t> char_out_and_char_in
diff --git a/cpp/src/base64-encode/CMakeLists.txt b/cpp/src/base64-encode/CMakeLists.txt
index 679d09d2..6c3d6611 100644
--- a/cpp/src/base64-encode/CMakeLists.txt
+++ b/cpp/src/base64-encode/CMakeLists.txt
@@ -13,6 +13,6 @@ add_executable(${PROJECT_NAME} ${SOURCE_FILES})
 
 set_target_properties(${PROJECT_NAME} PROPERTIES
     RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/utils
-)
+    )
 
 install(TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/cpp/src/base64-encode/base64-encode.cpp b/cpp/src/base64-encode/base64-encode.cpp
index 11d6230e..1f05822f 100644
--- a/cpp/src/base64-encode/base64-encode.cpp
+++ b/cpp/src/base64-encode/base64-encode.cpp
@@ -38,8 +38,7 @@ void WriteEncodedFile(std::string & fileName, std::string & outputFileName)
       = 0;  // current io positions, always < base64::MAX_BASE64_WIDTH
   unsigned int n_base64_char;  // total base64 char obtained
   char rawBuffer[base64::IO_CHUNK];  // buffer to store raw io data
-  char encodedBuffer[base64::encoded_size(
-      base64::IO_CHUNK)];  // buffer for converted data
+  char encodedBuffer[4 * ((base64::IO_CHUNK + 2) / 3)];  // buffer for converted data
 
   // setup fine names and pointers
   std::string xxdFormatFileName = fileName;
diff --git a/cpp/src/base64-encode/base64.hpp b/cpp/src/base64-encode/base64.hpp
index f6cffd94..0ba59906 100644
--- a/cpp/src/base64-encode/base64.hpp
+++ b/cpp/src/base64-encode/base64.hpp
@@ -15,7 +15,7 @@ namespace base64
 ///
 /// \param[in] n Size of char string
 /// \return max size of encoded string generated from n chars
-inline std::size_t const encoded_size(std::size_t n)
+inline std::size_t encoded_size(std::size_t n)
 {
   return 4 * ((n + 2) / 3);
 }
@@ -24,7 +24,7 @@ inline std::size_t const encoded_size(std::size_t n)
 ///
 /// \param[in] n Size of base64 string
 /// \return size of char string form n length base64 string
-inline std::size_t const decoded_size(std::size_t n)
+inline std::size_t decoded_size(std::size_t n)
 {
   return n / 4 * 3;  // requires n&3==0, smaller
 }