filedat: add getist() and getmap()
This commit is contained in:
parent
09c4bdb692
commit
8e7ec95e05
4 changed files with 45 additions and 27 deletions
6
Makefile
6
Makefile
|
|
@ -6,7 +6,7 @@ ODIR_SHARED=obj_so
|
||||||
NAME = libztd
|
NAME = libztd
|
||||||
|
|
||||||
CC=g++
|
CC=g++
|
||||||
CXXFLAGS= -I$(IDIR) -Wall -pedantic -std=c++17 -O2
|
CXXFLAGS= -I$(IDIR) -Wall -std=c++17 -O2
|
||||||
|
|
||||||
$(shell mkdir -p $(ODIR))
|
$(shell mkdir -p $(ODIR))
|
||||||
$(shell mkdir -p $(ODIR_SHARED))
|
$(shell mkdir -p $(ODIR_SHARED))
|
||||||
|
|
@ -41,9 +41,9 @@ static: $(OBJ)
|
||||||
shared: $(OBJ_SHARED)
|
shared: $(OBJ_SHARED)
|
||||||
$(CC) -shared -o libztd.so $^
|
$(CC) -shared -o libztd.so $^
|
||||||
|
|
||||||
install: all
|
install:
|
||||||
mkdir -p $(INSTALL)/usr/lib
|
mkdir -p $(INSTALL)/usr/lib
|
||||||
mv libztd.a libztd.so $(INSTALL)/usr/lib
|
cp libztd.a libztd.so $(INSTALL)/usr/lib
|
||||||
mkdir -p $(INSTALL)/usr/include/ztd
|
mkdir -p $(INSTALL)/usr/include/ztd
|
||||||
cp -r include/* $(INSTALL)/usr/include/ztd
|
cp -r include/* $(INSTALL)/usr/include/ztd
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,8 @@ namespace ztd
|
||||||
//! @brief Erase index from list
|
//! @brief Erase index from list
|
||||||
void erase(const unsigned int index);
|
void erase(const unsigned int index);
|
||||||
|
|
||||||
|
std::vector<ztd::chunkdat*> getlist();
|
||||||
|
std::map<std::string, ztd::chunkdat*> getmap();
|
||||||
|
|
||||||
//! @brief Create a copy of the chunk
|
//! @brief Create a copy of the chunk
|
||||||
inline chunkdat copy() const { return chunkdat(*this); }
|
inline chunkdat copy() const { return chunkdat(*this); }
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ namespace ztd
|
||||||
inline int pclose2(FILE* fd, pid_t pid) { return eclose(fd, pid); }
|
inline int pclose2(FILE* fd, pid_t pid) { return eclose(fd, pid); }
|
||||||
|
|
||||||
|
|
||||||
/// exec extensions
|
// exec extensions
|
||||||
|
|
||||||
//! @brief Execute a binary and retrieve its outputs
|
//! @brief Execute a binary and retrieve its outputs
|
||||||
/*!
|
/*!
|
||||||
|
|
@ -139,8 +139,9 @@ namespace ztd
|
||||||
@param args Arguments given to the binary
|
@param args Arguments given to the binary
|
||||||
*/
|
*/
|
||||||
std::pair<std::string, int> exec(std::string const& bin, std::vector<std::string> const& args);
|
std::pair<std::string, int> exec(std::string const& bin, std::vector<std::string> const& args);
|
||||||
template<class... Args>
|
|
||||||
//! @brief Variadic call of exec()
|
//! @brief Variadic call of exec()
|
||||||
|
template<class... Args>
|
||||||
std::pair<std::string, int> exec(std::string const& bin, Args... args) { std::vector<std::string> rargs = { static_cast<std::string>(args)...}; return exec(bin, rargs); }
|
std::pair<std::string, int> exec(std::string const& bin, Args... args) { std::vector<std::string> rargs = { static_cast<std::string>(args)...}; return exec(bin, rargs); }
|
||||||
|
|
||||||
//! @brief Execute string as a binary file
|
//! @brief Execute string as a binary file
|
||||||
|
|
@ -149,6 +150,7 @@ namespace ztd
|
||||||
@param args Arguments given to the file
|
@param args Arguments given to the file
|
||||||
*/
|
*/
|
||||||
std::pair<std::string, int> script(std::string const& data, std::vector<std::string> const& args);
|
std::pair<std::string, int> script(std::string const& data, std::vector<std::string> const& args);
|
||||||
|
|
||||||
//! @brief Variadic call of script()
|
//! @brief Variadic call of script()
|
||||||
template<class... Args>
|
template<class... Args>
|
||||||
std::pair<std::string, int> script(std::string const& data, Args... args) { std::vector<std::string> rargs = { static_cast<std::string>(args)...}; return script(data, rargs); }
|
std::pair<std::string, int> script(std::string const& data, Args... args) { std::vector<std::string> rargs = { static_cast<std::string>(args)...}; return script(data, rargs); }
|
||||||
|
|
|
||||||
|
|
@ -73,14 +73,19 @@ std::string ztd::filedat::removeComments(std::string str)
|
||||||
uint32_t i=0;
|
uint32_t i=0;
|
||||||
while(i < str.size())
|
while(i < str.size())
|
||||||
{
|
{
|
||||||
if( str[i] == '"') // double quotes
|
if( str[i] == '\\')
|
||||||
|
{
|
||||||
|
//skip checking char
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else if( str[i] == '"') // double quotes
|
||||||
{
|
{
|
||||||
uint32_t j=i;
|
uint32_t j=i;
|
||||||
i++;
|
i++;
|
||||||
while(i < str.size() && str[i]!='"') // until end of quote
|
while(i < str.size() && str[i]!='"') // until end of quote
|
||||||
{
|
{
|
||||||
if(i+1 < str.size() && str[i] == '\\' && str[i+1] == '"') //escaped quote
|
if(i+1 < str.size() && str[i] == '\\' && str[i+1] == '"') //escaped quote
|
||||||
i++; //ignore backslash
|
i++; //ignore backslash
|
||||||
|
|
||||||
i++; // add char and increment
|
i++; // add char and increment
|
||||||
}
|
}
|
||||||
|
|
@ -275,12 +280,12 @@ static std::tuple<std::string, std::string, int, int, bool> _getstrval(const std
|
||||||
while(i < str.size() && str[i]!='"') // until end of quote
|
while(i < str.size() && str[i]!='"') // until end of quote
|
||||||
{
|
{
|
||||||
if(i+1 < str.size() && str[i] == '\\' && str[i+1] == '"') //escaped quote
|
if(i+1 < str.size() && str[i] == '\\' && str[i+1] == '"') //escaped quote
|
||||||
i++; //ignore backslash
|
i++; //ignore backslash
|
||||||
|
|
||||||
val.push_back(str[i++]); // add char and increment
|
val.push_back(str[i++]); // add char and increment
|
||||||
}
|
}
|
||||||
if(i >= str.size()) // quote didn't end
|
if(i >= str.size()) // quote didn't end
|
||||||
throw ztd::format_error("Double quote doesn't close", "", str, j);
|
throw ztd::format_error("Double quote doesn't close", "", str, j);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
else if( str[i] == '\'') // single quotes
|
else if( str[i] == '\'') // single quotes
|
||||||
|
|
@ -290,12 +295,12 @@ static std::tuple<std::string, std::string, int, int, bool> _getstrval(const std
|
||||||
while(i < str.size() && str[i]!='\'') // until end of quote
|
while(i < str.size() && str[i]!='\'') // until end of quote
|
||||||
{
|
{
|
||||||
if(i+1 < str.size() && str[i] == '\\' && str[i+1] == '\'') //escaped quote
|
if(i+1 < str.size() && str[i] == '\\' && str[i+1] == '\'') //escaped quote
|
||||||
i++; //ignore backslash
|
i++; //ignore backslash
|
||||||
|
|
||||||
val += str[i++]; // add char
|
val += str[i++]; // add char
|
||||||
}
|
}
|
||||||
if(i >= str.size()) // quote didn't end
|
if(i >= str.size()) // quote didn't end
|
||||||
throw ztd::format_error("Single quote doesn't close", "", str, j);
|
throw ztd::format_error("Single quote doesn't close", "", str, j);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
if(str[i] == '{') // {} map
|
if(str[i] == '{') // {} map
|
||||||
|
|
@ -830,6 +835,31 @@ void ztd::chunkdat::erase(const unsigned int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<ztd::chunkdat*> ztd::chunkdat::getlist()
|
||||||
|
{
|
||||||
|
if(this->type()!=ztd::chunk_abstract::list)
|
||||||
|
{
|
||||||
|
if(m_parent != nullptr)
|
||||||
|
throw ztd::format_error("chunkdat isn't a list", m_parent->filePath(), m_parent->im_data(), m_offset );
|
||||||
|
else
|
||||||
|
throw ztd::format_error("chunkdat isn't a list", "", this->strval(), -1);
|
||||||
|
}
|
||||||
|
ztd::chunk_list* cl = dynamic_cast<chunk_list*>(m_achunk);
|
||||||
|
return cl->list;
|
||||||
|
}
|
||||||
|
std::map<std::string, ztd::chunkdat*> ztd::chunkdat::getmap()
|
||||||
|
{
|
||||||
|
if(this->type()!=ztd::chunk_abstract::map)
|
||||||
|
{
|
||||||
|
if(m_parent != nullptr)
|
||||||
|
throw ztd::format_error("chunkdat isn't a map", m_parent->filePath(), m_parent->im_data(), m_offset );
|
||||||
|
else
|
||||||
|
throw ztd::format_error("chunkdat isn't a map", "", this->strval(), -1);
|
||||||
|
}
|
||||||
|
ztd::chunk_map* dc = dynamic_cast<chunk_map*>(m_achunk);
|
||||||
|
return dc->values;
|
||||||
|
}
|
||||||
|
|
||||||
std::string ztd::chunkdat::strval(unsigned int alignment, std::string const& aligner) const
|
std::string ztd::chunkdat::strval(unsigned int alignment, std::string const& aligner) const
|
||||||
{
|
{
|
||||||
if(this->type()==ztd::chunk_abstract::string)
|
if(this->type()==ztd::chunk_abstract::string)
|
||||||
|
|
@ -941,26 +971,18 @@ ztd::chunkdat& ztd::chunkdat::subChunkRef(std::string const& in) const
|
||||||
if(this->type()!=ztd::chunk_abstract::map)
|
if(this->type()!=ztd::chunk_abstract::map)
|
||||||
{
|
{
|
||||||
if(m_parent != nullptr)
|
if(m_parent != nullptr)
|
||||||
{
|
|
||||||
throw ztd::format_error("chunkdat isn't a map", m_parent->filePath(), m_parent->im_data(), m_offset );
|
throw ztd::format_error("chunkdat isn't a map", m_parent->filePath(), m_parent->im_data(), m_offset );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
throw ztd::format_error("chunkdat isn't a map", "", this->strval(), -1);
|
throw ztd::format_error("chunkdat isn't a map", "", this->strval(), -1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ztd::chunk_map* dc = dynamic_cast<chunk_map*>(m_achunk);
|
ztd::chunk_map* dc = dynamic_cast<chunk_map*>(m_achunk);
|
||||||
auto fi = dc->values.find(in);
|
auto fi = dc->values.find(in);
|
||||||
if(fi == dc->values.end())
|
if(fi == dc->values.end())
|
||||||
{
|
{
|
||||||
if(m_parent != nullptr)
|
if(m_parent != nullptr)
|
||||||
{
|
|
||||||
throw ztd::format_error("Map doesn't have '" + in + "' flag", m_parent->filePath(), m_parent->im_data(), m_offset );
|
throw ztd::format_error("Map doesn't have '" + in + "' flag", m_parent->filePath(), m_parent->im_data(), m_offset );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
throw ztd::format_error("Map doesn't have '" + in + "' flag", "", this->strval(), -1);
|
throw ztd::format_error("Map doesn't have '" + in + "' flag", "", this->strval(), -1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return *fi->second;
|
return *fi->second;
|
||||||
}
|
}
|
||||||
|
|
@ -970,25 +992,17 @@ ztd::chunkdat& ztd::chunkdat::subChunkRef(const unsigned int a) const
|
||||||
if(this->type()!=ztd::chunk_abstract::list)
|
if(this->type()!=ztd::chunk_abstract::list)
|
||||||
{
|
{
|
||||||
if(m_parent != nullptr)
|
if(m_parent != nullptr)
|
||||||
{
|
|
||||||
throw ztd::format_error("chunkdat isn't a list", m_parent->filePath(), m_parent->im_data(), m_offset );
|
throw ztd::format_error("chunkdat isn't a list", m_parent->filePath(), m_parent->im_data(), m_offset );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
throw ztd::format_error("chunkdat isn't a list", "", this->strval(), -1);
|
throw ztd::format_error("chunkdat isn't a list", "", this->strval(), -1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ztd::chunk_list* cl = dynamic_cast<chunk_list*>(m_achunk);
|
ztd::chunk_list* cl = dynamic_cast<chunk_list*>(m_achunk);
|
||||||
if(a >= cl->list.size())
|
if(a >= cl->list.size())
|
||||||
{
|
{
|
||||||
if(m_parent != nullptr)
|
if(m_parent != nullptr)
|
||||||
{
|
|
||||||
throw ztd::format_error("List size is below " + std::to_string(a), m_parent->filePath(), m_parent->im_data(), m_offset );
|
throw ztd::format_error("List size is below " + std::to_string(a), m_parent->filePath(), m_parent->im_data(), m_offset );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
throw ztd::format_error("List size is below " + std::to_string(a), "", this->strval(), -1);
|
throw ztd::format_error("List size is below " + std::to_string(a), "", this->strval(), -1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return *cl->list[a];
|
return *cl->list[a];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue