Update config entry and switch to cmake

cmake
mbandic 3 weeks ago
parent 057ebe3eba
commit c0983b09f6
  1. 2
      .gitignore
  2. 3
      .vscode/settings.json
  3. 66
      CMakeLists.txt
  4. 1
      example/config.cfg
  5. 17
      lib/config.hpp
  6. 51
      src/config.cpp
  7. 6
      test/CMakeLists.txt
  8. 1
      test/compile.sh
  9. 4
      test/test.cpp
  10. BIN
      test/test.o

2
.gitignore vendored

@ -0,0 +1,2 @@
build/
*.o

@ -4,6 +4,7 @@
"compare": "cpp",
"type_traits": "cpp",
"iostream": "cpp",
"iosfwd": "cpp"
"iosfwd": "cpp",
"fstream": "cpp"
}
}

@ -0,0 +1,66 @@
cmake_minimum_required(VERSION 3.15)
project(config LANGUAGES CXX)
# Postavi standard za C++
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Dodaj glavnu biblioteku
add_library(config STATIC
src/config.cpp
)
# Uključi zaglavlja
target_include_directories(config
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>
$<INSTALL_INTERFACE:include>
)
# # Generiši export fajl za lokalnu upotrebu
# export(TARGETS config
# FILE ${CMAKE_CURRENT_BINARY_DIR}/configTargets.cmake
# NAMESPACE config::
# )
# Generiši configConfig.cmake
# include(CMakePackageConfigHelpers)
# configure_package_config_file(
# ${CMAKE_CURRENT_SOURCE_DIR}/cmake/configConfig.cmake.in
# ${CMAKE_CURRENT_BINARY_DIR}/configConfig.cmake
# INSTALL_DESTINATION lib/cmake/config
# )
# write_basic_package_version_file(
# ${CMAKE_CURRENT_BINARY_DIR}/configConfigVersion.cmake
# VERSION 1.0.0
# COMPATIBILITY SameMajorVersion
# )
# Instalacija za lokalnu upotrebu
install(TARGETS config
EXPORT configTargets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
install(EXPORT configTargets
FILE configTargets.cmake
NAMESPACE config::
DESTINATION lib/cmake/config
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/configConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/configConfigVersion.cmake
DESTINATION lib/cmake/config
)
# Opcionalno dodaj testove
# enable_testing()
# add_subdirectory(test)
add_subdirectory(test)

@ -10,4 +10,3 @@ DinioServer1Port=5000;
DinioServer2Port=4048;
DinioGetIPURL=http://lab-it.ddns.net/getip/index.php; #ovo ide na više A recorda i više servera pod istim domenom
# DinioGetIPURL2=http://ns-hl.ddns.net/getip/index.php;

@ -14,26 +14,27 @@ namespace marcelb {
/**
* Clears white fields from a string
*/
void clearWhiteSpaces(string &a);
static void clearWhiteSpaces(string &a);
/**
* Removes comments from a string
* Returns false if the entire line is a comment,
* false if it is not
*/
bool clearComments(string &a);
static bool clearComments(string &a);
/**
* It parses the line of the configuration file,
* receives the string line and returns the key,
* value pair via reference
*/
void parseConfigLine(const string a, string &b, string &c);
static void parseConfigLine(const string a, string &b, string &c);
/**
* Configuration class - at the level of a single file
*/
class config {
const string configFilePath;
vector<string> necessary;
map<string, string> element;
@ -47,6 +48,11 @@ class config {
*/
bool init(const string _configFilePath);
/**
* Update config file
*/
void update_file(const string& key);
public:
/**
@ -60,6 +66,11 @@ class config {
*/
string operator[] (const string& key);
/**
* Update config entry
*/
void update(const string& key, const string& value);
/**
* Method to print all configuration key value pairs
*/

@ -1,8 +1,9 @@
#include "../lib/config.hpp"
marcelb::config::config(const string _configFilePath, const vector<string> _necessary) {
necessary = _necessary;
marcelb::config::config(const string _configFilePath, const vector<string> _necessary):
configFilePath(_configFilePath), necessary(_necessary) {
if(!init(_configFilePath)) {
throw string("[ERROR] Init config file ");
}
@ -16,6 +17,10 @@ string marcelb::config::operator[](const string& key) {
return element[key];
}
void marcelb::config::update(const string& key, const string& value) {
element[key] = value;
update_file(key);
}
bool marcelb::config::init(const string _configFilePath) {
@ -63,6 +68,48 @@ bool marcelb::config::isHaveNecessary() {
}
void marcelb::config::update_file(const string& key) {
ifstream configFile(configFilePath);
if (!configFile.is_open()) {
throw invalid_argument("[ERROR] Cant open config file for update!");
}
vector<string> lines;
string line;
bool update = false;
while (getline(configFile, line)) {
size_t pos = line.find(key + "=");
if (pos != string::npos) {
size_t eqPos = line.find("=", pos);
size_t semicolonPos = line.find(";", eqPos);
if (eqPos != string::npos && semicolonPos != string::npos) {
line = key + "=" + element[key] + ";";
update = true;
}
}
lines.push_back(line);
}
if (!update) {
line = key + "=" + element[key] + ";";
lines.push_back(line);
}
configFile.close();
ofstream configFileOut(configFilePath);
if (!configFileOut.is_open()) {
throw invalid_argument("[ERROR] Cant update config file!");
}
for (const string& updatedLine : lines) {
configFileOut << updatedLine << endl;
}
configFileOut.close();
}
void marcelb::clearWhiteSpaces(string &a) {
const char whitespaces[] = {' ', '\t'};
for (int i=0; i<sizeof(whitespaces)/sizeof(const char); i++) {

@ -0,0 +1,6 @@
add_executable(config_test test.cpp)
target_link_libraries(config_test PRIVATE config)
# Dodaj direktorijum za zaglavlja
# target_include_directories(config_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib)

@ -1 +0,0 @@
g++ test.cpp ../src/* -o test.o

@ -9,5 +9,9 @@ int main() {
config mycfg ("../example/config.cfg", {"Username", "API", "Domain" });
cout << mycfg["consolePrintLogs"];
mycfg.update("Baba2", "Janja");
cout << mycfg["Baba"];
return 0;
}

Binary file not shown.
Loading…
Cancel
Save