Files
Tools_CPP/lib/inifile.cpp
2024-11-18 21:19:07 +05:00

481 lines
13 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* inifile.cpp
*
* Created on: 17 дек. 2014 г.
* Author: ivanov.i
*/
#ifdef _ATL_DLL
#include "stdafx.h"
#endif
#include <list>
#include <string> // std::string, std::stol
#include <iostream>
#include <fstream> // std::ifstream
#include <sstream>
#include <cwctype> // For std::towlower
#include <algorithm>
#include "inifile.h"
#include "stdTools.h"
#include "ascii.h" //Зачем коментил потом раскоментил? (раскоментил потому что буква "я" не конвертируется функцией WStringToString)
//******************************************************************************
TIniFile::TIniFile()
{
path="";
first=NULL;
last=NULL;
}
//------------------------------------------------------------------------------
TIniFile::~TIniFile()
{
TIniWStruct* inistrdel;
TIniWStruct* inistr = first;
while (inistr!=NULL)
{
inistrdel=inistr;
inistr=inistr->next;
delete inistrdel;
}
}
//------------------------------------------------------------------------------
bool TIniFile::Load(std::wstring path)
{
return Load(Utility::WStringToString(path, std::locale("")));
}
//------------------------------------------------------------------------------
bool TIniFile::Load(std::string path)
{
this->path = path;
first = NULL;
std::ifstream fin(path.c_str());
if (fin.is_open())
{
std::string str;
std::wstring section;
while (std::getline(fin, str))
{
if (str.find('[') != std::string::npos)
{
section = Utility::convUTF8ToUTF16(Utility::BeforeLast(Utility::AfterFirst(str, '['), ']'));
}
if (str.find('=') != std::string::npos)
{
TIniWStruct* inistr = new TIniWStruct();
inistr->next = NULL;
inistr->section = section;
inistr->ident = Utility::convUTF8ToUTF16(Utility::BeforeFirst(str, '='));
Utility::TrimW(inistr->ident);
inistr->value = Utility::convUTF8ToUTF16(Utility::AfterFirst(str, '='));
Utility::TrimW(inistr->value);
if (first == NULL)
{
first = inistr;
last = inistr;
}
else
{
last->next = inistr;
last = inistr;
}
}
}
fin.close();
}
else
return false;
return true;
}
//------------------------------------------------------------------------------
bool TIniFile::getSection(std::string Section) //Есть ли заданая секция в iti файле
{
TIniWStruct* inistr = first;
while (inistr!=NULL)
{
if (inistr->section==Utility::StringToWString(Section,std::locale("")))
{
return true;
}
inistr=inistr->next;
}
return false;
}
//------------------------------------------------------------------------------^M
//Получить список идентификаторов по секции^M
std::list<std::string> TIniFile::getIdents(std::string Section)
{
std::list<std::string> list;
TIniWStruct* inistr = first;
while (inistr!=NULL)
{
if (inistr->section==Utility::StringToWString(Section,std::locale("")))
{
list.push_back(Utility::WStringToString(inistr->ident, std::locale("")));
}
inistr=inistr->next;
}
return list;
}
//------------------------------------------------------------------------------
std::wstring TIniFile::ReadString(std::wstring Section, std::wstring Ident, std::wstring Default)
{
TIniWStruct* inistr = first;
while (inistr != NULL)
{
if ((inistr->section == Section) && (inistr->ident == Ident))
{
return inistr->value;
}
inistr = inistr->next;
}
return Default;
}
//------------------------------------------------------------------------------
std::string TIniFile::ReadString(std::string Section,std::string Ident,std::string Default)
{
TIniWStruct* inistr = first;
while (inistr!=NULL)
{
if ((inistr->section==Utility::StringToWString(Section, std::locale(""))) && (inistr->ident==Utility::StringToWString(Ident, std::locale(""))))
{
return Utility::WStringToString(inistr->value, std::locale(""));
}
inistr=inistr->next;
}
return Default;
}
//------------------------------------------------------------------------------
long TIniFile::ReadLong(std::string Section,std::string Ident,std::string Default)
{
long result;
std::stringstream ss;
ss << ReadString(Section,Ident,Default);
ss >> result;
return result;
}
//------------------------------------------------------------------------------
long TIniFile::ReadLong(const char* Section, const char* Ident, const char* Default)
{
return ReadLong(std::string(Section), std::string(Ident), std::string(Default));
}
//------------------------------------------------------------------------------
unsigned int TIniFile::ReadUInt(std::string Section,std::string Ident,std::string Default)
{
unsigned int result;
std::stringstream ss;
ss << ReadString(Section,Ident,Default);
ss >> result;
return result;
}
//------------------------------------------------------------------------------
void TIniFile::WriteUInt(std::string Section,std::string Ident,unsigned int Value)
{
std::stringstream ss;
ss << Value;
WriteString(Section,Ident,ss.str());
}
//------------------------------------------------------------------------------
float TIniFile::ReadFloat(std::string Section,std::string Ident,std::string Default)
{
float result;
std::stringstream ss;
ss << ReadString(Section,Ident,Default);
ss >> result;
return result;
}
//------------------------------------------------------------------------------
//Default: "0" или "1"
bool TIniFile::ReadBool(std::string Section,std::string Ident,std::string Default)
{
std::string rez=ReadString(Section,Ident,Default);
if(rez=="1") return true;
if(rez=="0") return false;
return false;
}
//------------------------------------------------------------------------------
void TIniFile::WriteString(std::string Section,std::string Ident,std::string Value)
{
//ищем старое значение в заданной секции
bool b=false;
TIniWStruct* lastSel = NULL;
TIniWStruct* inistr = first;
while (inistr!=NULL)
{
if(inistr->section==Utility::StringToWString(Section, std::locale("")))
{
lastSel=inistr;
if(inistr->ident==Utility::StringToWString(Ident, std::locale("")))
{ inistr->value=Utility::StringToWString(Value, std::locale(""));
b=true;
}
}
inistr=inistr->next;
}
//если не найденно то добавляем новое значение
if (!b)
{
TIniWStruct* inistr= new TIniWStruct;
inistr->next=NULL;
inistr->section= Utility::StringToWString(Section, std::locale(""));
inistr->ident= Utility::StringToWString(Ident, std::locale(""));
inistr->value= Utility::StringToWString(Value, std::locale(""));
if (first==NULL)
{
first=inistr;
last=inistr;
}else
{
if(lastSel==NULL)
{
last->next=inistr;
last=inistr;
}
else
{
if(last==lastSel){
last=inistr;
}
inistr->next=lastSel->next;
lastSel->next=inistr;
}
}
}
}
//------------------------------------------------------------------------------
void TIniFile::WriteString(std::wstring Section, std::wstring Ident, std::wstring Value)
{
//Пробегаемся по структуре и пытаемся заменить старое значение в секции
bool b = false;
TIniWStruct* lastSel = NULL;
TIniWStruct* inistr = first;
while (inistr != NULL)
{
if (inistr->section == Section)
{
lastSel = inistr;
if (inistr->ident == Ident)
{
inistr->value = Value;
b = true;
}
}
inistr = inistr->next;
}
//если не найденно то добавляем новое значение
if (!b)
{
TIniWStruct* inistr = new TIniWStruct;
inistr->next = NULL;
inistr->section = Section;
inistr->ident = Ident;
inistr->value = Value;
if (first == NULL)
{
first = inistr;
last = inistr;
}
else
{
if (lastSel == NULL)
{
last->next = inistr;
last = inistr;
}
else
{
inistr->next = lastSel->next;
lastSel->next = inistr;
}
}
}
}
//------------------------------------------------------------------------------
bool TIniFile::Save()
{
bool result=false;
try
{
FILE *file = fopen(path.c_str(), "w");
if(file)
{
std::wstring LastSection=L"";
TIniWStruct* inistr = first;
while (inistr!=NULL)
{
if (inistr->section!=LastSection)
{
fputs("[",file);
fputs(Utility::convUTF16ToUTF8(inistr->section).c_str(), file);
fputs("]\n",file);
LastSection=inistr->section;
}
fputs(Utility::convUTF16ToUTF8(inistr->ident).c_str(),file);
fputs("=",file);
fputs(Utility::convUTF16ToUTF8(inistr->value).c_str(),file);
fputs("\n",file);
inistr=inistr->next;
}
fclose(file);
result=true;
}
}catch(...)
{}
return result;
}
//------------------------------------------------------------------------------
void TIniFile::WriteLong(std::string Section,std::string Ident,long Value)
{
std::stringstream ss;
ss << Value;
WriteString(Section,Ident,ss.str());
}
//------------------------------------------------------------------------------
void TIniFile::WriteBool(std::string Section, std::string Ident, bool Value)
{
std::string v;
if (Value) v = "1"; else v = "0";
WriteString(Section, Ident, v);
}
//------------------------------------------------------------------------------
// Save binary data by converting it to Base64 beforehand.
void TIniFile::WriteBase64(std::string Section, std::string Ident, char* Value, int Size)
{
std::string base64;
}
//------------------------------------------------------------------------------
void TIniFile::WriteFloat(std::string Section,std::string Ident,float Value)
{
std::stringstream ss;
ss.precision(7); //Поменял с 4 на 6 так как сохраняю широту и долготу
ss << std::fixed << Value;
WriteString(Section,Ident,ss.str());
}
//------------------------------------------------------------------------------
void TIniFile::WriteDouble(std::string Section,std::string Ident,double Value){
std::stringstream ss;
ss.precision(7); //Поменял с 4 на 6 так как сохраняю широту и долготу
ss << std::fixed << Value;
WriteString(Section,Ident,ss.str());
}
//------------------------------------------------------------------------------
JSON::JSON(std::wstring data)
{
first = NULL;
last = NULL;
while (true)
{
//std::cout << data << std::endl;;
Utility::CutBeforeWFirst(data, '"');
std::wstring ident = Utility::CutBeforeWFirst(data, '"');
std::transform(ident.begin(), ident.end(), ident.begin(), ::tolower);
std::wstring value;
size_t startpos = data.find_first_not_of(L" :\t\f\n\r");
if (startpos != std::string::npos)
{
//Если следующий символ это " то это строка
if (data[startpos] == '"')
{
//Читаем и вырезаем строку
size_t i;
for (i = startpos + 1; i<data.size(); i++)
{
if (data[i] != '"') value += data[i];
else if (data[i - 1] == '\\') value[value.size() - 1] = '"';
else break;
}
data.erase(0, i + 1);
}
else
{
//Читаем и вырезаем циферки
Utility::CutBeforeWFirst(data, ':');
value = Utility::CutBeforeWFirst(data, ',');
Utility::TrimW(value);
}
//std::cout << "(" <<ident << "=" << value << ")" << std::endl;;
if (ident != L"")
{
TIniWStruct* inistr = new TIniWStruct;
inistr->next = NULL;
inistr->section = L"";
inistr->ident = ident;
inistr->value = value;
if (first == NULL)
{
first = inistr;
last = inistr;
}
else
{
last->next = inistr;
last = inistr;
}
}
}
else
{
break;
}
}
}
//------------------------------------------------------------------------------
std::string JSON::ReadAString(std::wstring Ident,std::wstring Default)
{
std::wstring str = ReadString(Ident,Default);
//std::string rez = Utility::WStringToString(str, std::locale("")); //en_US.UTF-8 я не конвертирует поэтому использую самодельную функцию
std::string rez = toKAZASCII(str);
return rez;
}
//------------------------------------------------------------------------------
std::wstring JSON::ReadString(std::wstring Ident,std::wstring Default)
{
std::transform(Ident.begin(), Ident.end(), Ident.begin(), ::tolower);
TIniWStruct* inistr = first;
while (inistr!=NULL)
{
if (inistr->ident==Ident)
{
return inistr->value;
}
inistr=inistr->next;
}
return Default;
}
//------------------------------------------------------------------------------
long JSON::ReadLong(std::wstring Ident,std::wstring Default)
{
long result;
std::wstringstream ss;
ss << ReadString(Ident,Default);
ss >> result;
return result;
}
//------------------------------------------------------------------------------
char JSON::ReadChar(std::wstring Ident,std::wstring Default)
{
return (char)ReadString(Ident,Default)[0];
}
//------------------------------------------------------------------------------
double JSON::ReadDouble(std::wstring Ident,std::wstring Default)
{
double result;
std::wstringstream ss;
ss << ReadString(Ident,Default);
ss >> result;
return result;
}
//------------------------------------------------------------------------------