Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,6 @@ test/*
*.o
*.save
*.dbf
*.so
*.so
build
.vscode
15 changes: 15 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.28)
project(dbf)
set(CMAKE_CXX_STANDARD 17)

set(CMAKE_CXX_FLAGS -O3)

include_directories(include)

add_library(dbf SHARED src/DBaseColDef.cpp
src/DBaseField.cpp
src/DBaseFieldProperty.cpp
src/DBaseFile.cpp
src/DBaseHeader.cpp
src/DBaseRecord.cpp
)
2 changes: 2 additions & 0 deletions include/DBaseFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ struct DBaseFile
unsigned int m_totalHeaderLength = 0;
/**< Header contents (read raw from disk)*/
std::string m_headerData = "";
/**<special block for visual Foxpro only> */
unsigned int m_dbcSize = 0;
};

/**< \section Exceptions */
Expand Down
11 changes: 9 additions & 2 deletions src/DBaseFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

using namespace std;

constexpr unsigned int DBC_SIZE = 263;

/** \brief Constructs dBase structure from given file.
* \param Name of the dBase file
* \return True if succeded. Otherwise throws exception
Expand All @@ -39,8 +41,13 @@ bool DBaseFile::openFile(const std::string fileName) {
//Read file contents into heap memory
readHeader(iFile);

// compatable with viso
if (m_header.m_fileType.find("Visual FoxPro") != std::string::npos) {
m_dbcSize = DBC_SIZE;
}

//Check header
m_colDefLength = m_header.m_numBytesInHeader - m_totalHeaderLength -1;
m_colDefLength = m_header.m_numBytesInHeader - m_fileHeaderLength - m_dbcSize -1;
validateBlockSize(m_colDefBlockSize, m_colDefLength);
if(!(m_headerData.empty())) { m_header.parse(m_headerData);}
validateBlockSize(m_colDefBlockSize, m_colDefLength);
Expand All @@ -65,7 +72,7 @@ void DBaseFile::readHeader(std::ifstream& iFile) {
///Read column definition
void DBaseFile::readColDef(std::ifstream& iFile, DBaseHeader& iFileHeader) {
//omit terminating byte at header end
unsigned int headerLengthWOTerminatingChar = iFileHeader.m_numBytesInHeader - 1;
unsigned int headerLengthWOTerminatingChar = iFileHeader.m_numBytesInHeader - 1 - (m_dbcSize + 1);
iFile.seekg((m_fileHeaderLength), iFile.beg);
std::string colDefBuf((headerLengthWOTerminatingChar - m_fileHeaderLength), ' ');
iFile.read(&(colDefBuf.at(0)), (headerLengthWOTerminatingChar - m_fileHeaderLength));
Expand Down