aboutsummaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2023-12-08 10:31:42 +0200
committerSyndamia <kamen@syndamia.com>2023-12-08 10:31:42 +0200
commit0382fccd17bdab223166f20541005bf45f113726 (patch)
tree86d8ec0bf5b0f0ac7abf124c7ef246eb77e8677a /util.c
parent3495fadef2cf2a88f137aa4539fba4146a352658 (diff)
downloadpico-web-0382fccd17bdab223166f20541005bf45f113726.tar
pico-web-0382fccd17bdab223166f20541005bf45f113726.tar.gz
pico-web-0382fccd17bdab223166f20541005bf45f113726.zip
[browser] Implemented initial syntax parsing
Diffstat (limited to 'util.c')
-rw-r--r--util.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/util.c b/util.c
index 6a0c0a3..e210e34 100644
--- a/util.c
+++ b/util.c
@@ -4,6 +4,7 @@
#include <stdio.h>
#include <errno.h>
+#include <regex.h>
uint16_t inet_atop(const char *port) {
return htons(atoi(port));
@@ -21,3 +22,27 @@ void herr(int output, const char* funcName) {
exit(errno);
}
}
+
+sds gsub(const sds str, const char* regex, const char* repl) {
+ regex_t preg;
+ regcomp(&preg, regex, 0);
+
+ int strInd = 0;
+ regmatch_t pmatch[1] = {
+ { .rm_so = 0, .rm_eo = 0, },
+ };
+
+ sds ret = sdsempty();
+ // sdslen is in O(1) time
+ while (strInd < sdslen(str)) {
+ if (regexec(&preg, str + strInd, 1, pmatch, 0) > 0) {
+ ret = sdscat(ret, str + strInd);
+ break;
+ }
+ ret = sdscatlen(ret, str + strInd, pmatch[0].rm_so);
+ ret = sdscat(ret, repl);
+ strInd += pmatch[0].rm_eo;
+ }
+
+ return ret;
+}