]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
ctrlvalues: add a function to only check if an entry is contained
authorBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 12 Apr 2023 13:10:20 +0000 (15:10 +0200)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Wed, 12 Apr 2023 13:10:20 +0000 (15:10 +0200)
this allows to reduce memory usage and simplify code

include/ctrlvalues.h
src/ctrlvalues.c
tests/mlmmj.c

index 207896c1b65ffc8efe8e7f31a8a5dbe1fd321676..08d16f5acf932eb9ae78381175d8d4bb1f0c89ef 100644 (file)
  * IN THE SOFTWARE.
  */
 
-#ifndef CTRLVALUES_H
-#define CTRLVALUES_H
+#pragma once
 
 #include "mlmmj.h"
+#include <stdbool.h>
 
 strlist *ctrlvalues(int ctrlfd, const char *ctrlstr);
-
-#endif /* CTRLVALUES_H */
+bool ctrlvalues_contains(int ctrlfd, const char *ctrlstr, const char *pattern, bool sensitivity);
index f68b4ead26c4262f78ad3bc8222c0ef10b1bd28f..cdb6aa6a63957635a0e9e4f2d0802f7debd24ebb 100644 (file)
@@ -28,6 +28,9 @@
 #include "chomp.h"
 #include "mlmmj.h"
 
+
+typedef int (cmpf)(const char *s1, const char *s2);
+
 strlist *ctrlvalues(int ctrlfd, const char *ctrlstr)
 {
        char *line = NULL;
@@ -53,3 +56,33 @@ strlist *ctrlvalues(int ctrlfd, const char *ctrlstr)
 
        return ret;
 }
+
+bool
+ctrlvalues_contains(int ctrlfd, const char *ctrlstr, const char *comp, bool casesensitive)
+{
+       char *line = NULL;
+       size_t linecap = 0;
+       FILE *f;
+       int fd;
+       cmpf *cmp;
+
+       cmp = casesensitive ? strcmp : strcasecmp;
+
+       fd = openat(ctrlfd, ctrlstr, O_RDONLY|O_CLOEXEC);
+       if (fd == -1 || (f = fdopen(fd, "r")) == NULL)
+               return (false);
+       while (getline(&line, &linecap, f) > 0) {
+               chomp(line);
+               if (*line == '\0')
+                       continue;
+               if (cmp(comp, line) == 0) {
+                       free(line);
+                       fclose(f);
+                       return (true);
+               }
+       }
+
+       free(line);
+       fclose(f);
+       return (false);
+}
index 8d44c8a298e784acd014acc74cd078062fbd0a6e..1825cc2838c4256e17e0120296a10d4146d98528 100644 (file)
@@ -1335,6 +1335,10 @@ ATF_TC_BODY(controls, tc)
        ATF_REQUIRE_EQ(ctrlcontent(-1, "plop"), NULL);
        ATF_REQUIRE_EQ(ctrlcontent(ctrlfd, "plop"), NULL);
        ATF_REQUIRE_EQ(ctrlvalues(ctrlfd, "plop"), NULL);
+       ATF_REQUIRE(!ctrlvalues_contains(ctrlfd, "plop", "nope", false));
+       ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "listaddress", "test@test", false));
+       ATF_REQUIRE(!ctrlvalues_contains(ctrlfd, "listaddress", "tesT@test", true));
+       ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "listaddress", "tesT@test", false));
        ATF_REQUIRE_STREQ(ctrlcontent(ctrlfd, "listaddress"), "test@test\n");
        ATF_REQUIRE_EQ(ctrltimet(ctrlfd, "listaddress", 0), 0);
        ATF_REQUIRE_EQ(ctrltimet(ctrlfd, "plop", 0), 0);
@@ -1361,6 +1365,10 @@ ATF_TC_BODY(controls, tc)
        ATF_REQUIRE_EQ(textcontent(ctrlfd, "text"), NULL);
        atf_utils_create_file("control/text/text", "this is a test");
        ATF_REQUIRE_STREQ(textcontent(ctrlfd, "text"), "this is a test");
+
+       ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "val", "line2", true));
+       ATF_REQUIRE(!ctrlvalues_contains(ctrlfd, "val", "Line2", true));
+       ATF_REQUIRE(ctrlvalues_contains(ctrlfd, "val", "Line2", false));
 }
 
 ATF_TC_BODY(incindexfile, tc)