mirror of
https://github.com/hyprwm/hyprlang.git
synced 2024-11-16 18:25:57 +01:00
parent
c140261214
commit
748fb531ca
5 changed files with 148 additions and 2 deletions
55
src/VarList.cpp
Normal file
55
src/VarList.cpp
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#include "VarList.hpp"
|
||||||
|
#include <ranges>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
static std::string removeBeginEndSpacesTabs(std::string str) {
|
||||||
|
if (str.empty())
|
||||||
|
return str;
|
||||||
|
|
||||||
|
int countBefore = 0;
|
||||||
|
while (str[countBefore] == ' ' || str[countBefore] == '\t') {
|
||||||
|
countBefore++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int countAfter = 0;
|
||||||
|
while ((int)str.length() - countAfter - 1 >= 0 && (str[str.length() - countAfter - 1] == ' ' || str[str.length() - 1 - countAfter] == '\t')) {
|
||||||
|
countAfter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
str = str.substr(countBefore, str.length() - countBefore - countAfter);
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
CVarList::CVarList(const std::string& in, const size_t lastArgNo, const char delim, const bool removeEmpty) {
|
||||||
|
if (in.empty())
|
||||||
|
m_vArgs.emplace_back("");
|
||||||
|
|
||||||
|
std::string args{in};
|
||||||
|
size_t idx = 0;
|
||||||
|
size_t pos = 0;
|
||||||
|
std::ranges::replace_if(
|
||||||
|
args, [&](const char& c) { return delim == 's' ? std::isspace(c) : c == delim; }, 0);
|
||||||
|
|
||||||
|
for (const auto& s : args | std::views::split(0)) {
|
||||||
|
if (removeEmpty && s.empty())
|
||||||
|
continue;
|
||||||
|
if (++idx == lastArgNo) {
|
||||||
|
m_vArgs.emplace_back(removeBeginEndSpacesTabs(in.substr(pos)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pos += s.size() + 1;
|
||||||
|
m_vArgs.emplace_back(removeBeginEndSpacesTabs(std::string_view{s}.data()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CVarList::join(const std::string& joiner, size_t from, size_t to) const {
|
||||||
|
size_t last = to == 0 ? size() : to;
|
||||||
|
|
||||||
|
std::string rolling;
|
||||||
|
for (size_t i = from; i < last; ++i) {
|
||||||
|
rolling += m_vArgs[i] + (i + 1 < last ? joiner : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rolling;
|
||||||
|
}
|
63
src/VarList.hpp
Normal file
63
src/VarList.hpp
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
#pragma once
|
||||||
|
#include <functional>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class CVarList {
|
||||||
|
public:
|
||||||
|
/** Split string into arg list
|
||||||
|
@param lastArgNo stop splitting after argv reaches maximum size, last arg will contain rest of unsplit args
|
||||||
|
@param delim if delimiter is 's', use std::isspace
|
||||||
|
@param removeEmpty remove empty args from argv
|
||||||
|
*/
|
||||||
|
CVarList(const std::string& in, const size_t maxSize = 0, const char delim = ',', const bool removeEmpty = false);
|
||||||
|
|
||||||
|
~CVarList() = default;
|
||||||
|
|
||||||
|
size_t size() const {
|
||||||
|
return m_vArgs.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string join(const std::string& joiner, size_t from = 0, size_t to = 0) const;
|
||||||
|
|
||||||
|
void map(std::function<void(std::string&)> func) {
|
||||||
|
for (auto& s : m_vArgs)
|
||||||
|
func(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void append(const std::string arg) {
|
||||||
|
m_vArgs.emplace_back(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string operator[](const size_t& idx) const {
|
||||||
|
if (idx >= m_vArgs.size())
|
||||||
|
return "";
|
||||||
|
return m_vArgs[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
// for range-based loops
|
||||||
|
std::vector<std::string>::iterator begin() {
|
||||||
|
return m_vArgs.begin();
|
||||||
|
}
|
||||||
|
std::vector<std::string>::const_iterator begin() const {
|
||||||
|
return m_vArgs.begin();
|
||||||
|
}
|
||||||
|
std::vector<std::string>::iterator end() {
|
||||||
|
return m_vArgs.end();
|
||||||
|
}
|
||||||
|
std::vector<std::string>::const_iterator end() const {
|
||||||
|
return m_vArgs.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool contains(const std::string& el) {
|
||||||
|
for (auto& a : m_vArgs) {
|
||||||
|
if (a == el)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<std::string> m_vArgs;
|
||||||
|
};
|
|
@ -9,6 +9,8 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#include "VarList.hpp"
|
||||||
|
|
||||||
using namespace Hyprlang;
|
using namespace Hyprlang;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
@ -510,6 +512,18 @@ CParseResult CConfig::parseVariable(const std::string& lhs, const std::string& r
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CConfigImpl::parseComment(const std::string& comment) {
|
||||||
|
const auto COMMENT = removeBeginEndSpacesTabs(comment);
|
||||||
|
|
||||||
|
if (!COMMENT.starts_with("hyprlang"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
CVarList args(COMMENT, 0, 's', true);
|
||||||
|
|
||||||
|
if (args[1] == "noerror")
|
||||||
|
currentFlags.noError = args[2] == "true" || args[2] == "yes" || args[2] == "enable" || args[2] == "enabled" || args[2] == "set";
|
||||||
|
}
|
||||||
|
|
||||||
CParseResult CConfig::parseLine(std::string line, bool dynamic) {
|
CParseResult CConfig::parseLine(std::string line, bool dynamic) {
|
||||||
CParseResult result;
|
CParseResult result;
|
||||||
|
|
||||||
|
@ -517,8 +531,10 @@ CParseResult CConfig::parseLine(std::string line, bool dynamic) {
|
||||||
|
|
||||||
auto commentPos = line.find('#');
|
auto commentPos = line.find('#');
|
||||||
|
|
||||||
if (commentPos == 0)
|
if (commentPos == 0) {
|
||||||
|
impl->parseComment(line.substr(1));
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
size_t lastHashPos = 0;
|
size_t lastHashPos = 0;
|
||||||
|
|
||||||
|
@ -737,7 +753,7 @@ CParseResult CConfig::parseFile(const char* file) {
|
||||||
|
|
||||||
const auto RET = parseLine(line);
|
const auto RET = parseLine(line);
|
||||||
|
|
||||||
if (RET.error && (impl->parseError.empty() || impl->configOptions.throwAllErrors)) {
|
if (!impl->currentFlags.noError && RET.error && (impl->parseError.empty() || impl->configOptions.throwAllErrors)) {
|
||||||
if (!impl->parseError.empty())
|
if (!impl->parseError.empty())
|
||||||
impl->parseError += "\n";
|
impl->parseError += "\n";
|
||||||
impl->parseError += std::format("Config error in file {} at line {}: {}", file, linenum, RET.errorStdString);
|
impl->parseError += std::format("Config error in file {} at line {}: {}", file, linenum, RET.errorStdString);
|
||||||
|
|
|
@ -87,4 +87,10 @@ class CConfigImpl {
|
||||||
std::string parseError = "";
|
std::string parseError = "";
|
||||||
|
|
||||||
Hyprlang::SConfigOptions configOptions;
|
Hyprlang::SConfigOptions configOptions;
|
||||||
|
|
||||||
|
void parseComment(const std::string& comment);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
bool noError = false;
|
||||||
|
} currentFlags;
|
||||||
};
|
};
|
|
@ -22,6 +22,12 @@ customType = abc
|
||||||
|
|
||||||
testStringColon = ee:ee:ee
|
testStringColon = ee:ee:ee
|
||||||
|
|
||||||
|
# hyprlang noerror true
|
||||||
|
|
||||||
|
errorVariable = true
|
||||||
|
|
||||||
|
# hyprlang noerror false
|
||||||
|
|
||||||
testCategory {
|
testCategory {
|
||||||
testValueInt = 123456
|
testValueInt = 123456
|
||||||
testValueHex = 0xF
|
testValueHex = 0xF
|
||||||
|
|
Loading…
Reference in a new issue