From b0ed77f36c82b785f193bf0a41b6fae1760b87e1 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Mon, 27 Mar 2023 12:39:16 +0200
Subject: [PATCH 01/16] fix: fmt error msg

---
 tests/small_test.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/small_test.h b/tests/small_test.h
index 8301ae7..7e8c11e 100644
--- a/tests/small_test.h
+++ b/tests/small_test.h
@@ -270,8 +270,8 @@ int test(char *file, int line, unsigned int __indentation_level, const void *res
     static char buffer_expected[FMT_BUFFER_SIZE];
     int is_equal = interface->compare(result, expected);
 
-    char *fmt_result = interface->format(buffer_expected, expected);
-    char *fmt_expected = interface->format(buffer_result, result);
+    char *fmt_expected = interface->format(buffer_expected, expected);
+    char *fmt_result = interface->format(buffer_result, result);
     if  (!is_equal) {
         INDENTED_PRINT("%s:%d: failed, expected <%s>, got <%s>\n", file, line, fmt_expected, fmt_result);
     }
-- 
GitLab


From dadb4703629af08e5c329c0d2e1e67330874f6e3 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Mon, 27 Mar 2023 12:39:59 +0200
Subject: [PATCH 02/16] getline without alloc

---
 lib/info_reader.h          | 59 +++++++++++++++++++++++--
 tests/info_reader.c        | 90 ++++++++++++++++++++++++++++++--------
 tests/info_reader_test.txt |  9 ++++
 3 files changed, 137 insertions(+), 21 deletions(-)
 create mode 100644 tests/info_reader_test.txt

diff --git a/lib/info_reader.h b/lib/info_reader.h
index ec28db6..15a077c 100644
--- a/lib/info_reader.h
+++ b/lib/info_reader.h
@@ -105,6 +105,24 @@ static bool start_with(const char *prefix, const char *string);
  */
 static unsigned int match(Parser *parser, char *line, KeyFinder **key_finder, char **raw_value);
 
+/**
+* @brief Reads a line of text from a file stream and stores it in a static
+  buffer with a maximum size of PAGE_SIZE.
+
+* This function reads a line of text from the input stream pointed to by
+* 'stream'. The line of text is stored in a static buffer with a maximum size of
+* PAGE_SIZE. The function updates the pointer pointed to by 'lineptr' to point to
+* the buffer containing the line of text. If the line of text is longer than the
+* buffer, the function returns -1. If an error occurs,
+
+* @param lineptr A pointer to a pointer to the buffer where the line of text
+  will be stored.
+* @param stream A pointer to the input stream to read from.
+* @return The number of characters read, or -1 if an error occurred the
+  function returns -1.
+*/
+ssize_t buffer_getline(char **lineptr, FILE *stream);
+
 typedef size_t GenericPointer;
 typedef GenericPointer (CopyAllocator) (char *string);
 typedef void (Setter) (GenericPointer storage, GenericPointer value);
@@ -166,14 +184,50 @@ static unsigned int move_to_next(Parser *parser)
     return 1;
 }
 
+
+#define PAGE_SIZE 4096
+ssize_t buffer_getline(char **lineptr, FILE *stream) {
+    ssize_t num_chars_read = 0;
+    static char buffer[PAGE_SIZE] = {0};
+
+    if (!lineptr || !stream) {
+        return -1;
+    }
+
+    while (1) {
+        int ch = fgetc(stream);
+        if (ch == EOF) {
+            if (num_chars_read == 0) {
+                return -1;
+            } else {
+                break;
+            }
+        }
+
+        if (num_chars_read == PAGE_SIZE - 1) {
+            return -1;
+        }
+
+        buffer[num_chars_read++] = ch;
+        if (ch == '\n') {
+            break;
+        }
+    }
+
+    buffer[num_chars_read] = '\0';
+    *lineptr = buffer;
+
+    return num_chars_read;
+}
+
+
 static unsigned int parse(Parser *parser)
 {
     char *line = NULL;
-    size_t len = 0;
     ssize_t read;
     unsigned int key_assigned = 0;
 
-    while ((read = getline(&line, &len, parser->file)) != -1) {
+    while ((read = buffer_getline(&line, parser->file)) != -1) {
         if (key_assigned == parser->nb_keys && read > 1) {
             continue;
         } else if (read == 1) {
@@ -194,7 +248,6 @@ static unsigned int parse(Parser *parser)
     if (key_assigned > 0) {
         parser->nb_stored++;
     }
-    free(line);
     return 1;
 }
 
diff --git a/tests/info_reader.c b/tests/info_reader.c
index 5000f48..92f2ff9 100644
--- a/tests/info_reader.c
+++ b/tests/info_reader.c
@@ -169,28 +169,36 @@ TFUNCTION(test_start_with, {
 })
 
 #define NONE 0
+#define INIT_KEYFINDER(__key_finder, __key, __delimiter, __copy, __set)  \
+  do {                                                                   \
+    __key_finder = (KeyFinder) {                                         \
+      .key = __key,                                                      \
+      .delimiter = __delimiter,                                          \
+      .copy = __copy,                                                    \
+      .set = __set                                                       \
+    };                                                                   \
+  } while (0);
+
 #define DUMMY_KEYFINDER(__key_finder, __key, __delimiter) \
-  do {                                                    \
-    __key_finder = (KeyFinder) {                          \
-      .key = __key,                                       \
-      .delimiter = __delimiter,                           \
-      .copy = NONE,                                       \
-      .set = NONE                                         \
-    };                                                    \
+  INIT_KEYFINDER(__key_finder, __key, __delimiter, NONE, NONE)    \
+
+#define INIT_PARSER(__parser, __storage, __nb_stored, __capacity,     \
+                    __storage_struct_size, __keys, __nb_keys, __file) \
+do {                                                                  \
+    __parser = (Parser) {                                             \
+      .storage = __storage,                                           \
+      .nb_stored = __nb_stored,                                       \
+      .capacity = __capacity,                                         \
+      .storage_struct_size = __storage_struct_size,                   \
+      .keys = __keys,                                                 \
+      .nb_keys = __nb_keys,                                           \
+      .file = __file                                                  \
+    };                                                                \
   } while (0);
 
+
 #define DUMMY_PARSER(__parser, __keys, __nb_keys) \
-  do {                                            \
-    __parser = (Parser) {                         \
-      .storage = NONE,                            \
-      .nb_stored = NONE,                          \
-      .capacity = NONE,                           \
-      .storage_struct_size = NONE,                \
-      .keys = __keys,                             \
-      .nb_keys = __nb_keys,                       \
-      .file = NONE                                \
-    };                                            \
-  } while (0);
+  INIT_PARSER(__parser, NONE, NONE, NONE, NONE, __keys, __nb_keys, NONE)
 
 
 TFUNCTION(test_match, {
@@ -275,10 +283,56 @@ TFUNCTION(test_match, {
     TEST_STR(raw_value, NULL);
 })
 
+
+#define __NB_KEYS 4
+
+typedef struct {
+  int values[__NB_KEYS];
+} IntArray;
+
+GenericPointer __test_file_int_allocator(char *s)
+{
+    unsigned int value = atoi(s);
+    return (GenericPointer) value;
+}
+
+void __test_file_set_int(GenericPointer storage, GenericPointer data)
+{
+    IntArray *array = (IntArray*) storage;
+    int i = (int) data;
+    array->values[i] = i;
+}
+
+TFUNCTION(test_dummy_file, {
+    KeyFinder keys[__NB_KEYS];
+    INIT_KEYFINDER(keys[0], "int0", " : ", __test_file_int_allocator, __test_file_set_int);
+    INIT_KEYFINDER(keys[1], "int1", " ", __test_file_int_allocator, __test_file_set_int);
+    INIT_KEYFINDER(keys[2], "int2", " -> ", __test_file_int_allocator, __test_file_set_int);
+    INIT_KEYFINDER(keys[3], "int3", "--", __test_file_int_allocator, __test_file_set_int);
+
+    IntArray results;
+    IntArray expected;
+
+    expected.values[0] = 0;
+    expected.values[1] = 1;
+    expected.values[2] = 2;
+    expected.values[3] = 3;
+
+    Parser parser;
+    FILE* file = fopen("./tests/info_reader_test.txt", "r");
+    INIT_PARSER(parser, (GenericPointer) &results, 0, 1, sizeof(IntArray), keys, __NB_KEYS, file);
+    parse(&parser);
+
+    for (unsigned int i = 0; i < __NB_KEYS; i++) {
+        TEST_INT(&(results.values[i]), &(expected.values[i]));
+    }
+})
+
 TFILE_ENTRY_POINT(test_info_reader, {
     CALL_TFUNCTION(test_replace_first);
     CALL_TFUNCTION(test_split_on_delimiter);
     CALL_TFUNCTION(test_start_with);
     CALL_TFUNCTION(test_match);
+    CALL_TFUNCTION(test_dummy_file);
 })
 
diff --git a/tests/info_reader_test.txt b/tests/info_reader_test.txt
new file mode 100644
index 0000000..17d4ee4
--- /dev/null
+++ b/tests/info_reader_test.txt
@@ -0,0 +1,9 @@
+noise:
+int0 : 0
+noise--
+int1 1
+int2 -> 2
+noise->
+int3--3
+noise----->>ss<<
+noiseee
-- 
GitLab


From e6199994a3da3d66e0addd1eefd487e263d6cc19 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Mon, 27 Mar 2023 15:18:50 +0200
Subject: [PATCH 03/16] fix: leak close

---
 tests/info_reader.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/info_reader.c b/tests/info_reader.c
index 92f2ff9..af2873c 100644
--- a/tests/info_reader.c
+++ b/tests/info_reader.c
@@ -326,6 +326,7 @@ TFUNCTION(test_dummy_file, {
     for (unsigned int i = 0; i < __NB_KEYS; i++) {
         TEST_INT(&(results.values[i]), &(expected.values[i]));
     }
+    fclose(file);
 })
 
 TFILE_ENTRY_POINT(test_info_reader, {
-- 
GitLab


From 881086c732d33f02d7a3ef77d9620f06dd33d042 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Mon, 27 Mar 2023 15:20:19 +0200
Subject: [PATCH 04/16] fix: make format

---
 src/amd_rapl.c      | 34 +++++++++++++--------------
 src/network.c       |  6 ++---
 tests/info_reader.c |  9 ++++----
 tests/util.c        | 56 ++++++++++++++++++++++-----------------------
 4 files changed, 53 insertions(+), 52 deletions(-)

diff --git a/src/amd_rapl.c b/src/amd_rapl.c
index 9eaac45..572ac56 100644
--- a/src/amd_rapl.c
+++ b/src/amd_rapl.c
@@ -201,7 +201,7 @@ void debug_print_amd_rapl(AmdRapl *rapl)
 unsigned int get_nb_cpu()
 {
     char filename[BUFFER_SIZE];
-	int	cpy_errno;
+    int	cpy_errno;
 
     unsigned int n_cpu = 0;
     for (;; n_cpu++) {
@@ -215,22 +215,22 @@ unsigned int get_nb_cpu()
         close(fd);
     }
 
-	if (n_cpu == 0) {
-		perror("open()");
-		fprintf(stderr, "on the file: '%s'\n", filename);
-		switch (cpy_errno) {
-			case ENOENT:
-				fprintf(stderr, "Amd rapl works with msr module, try to run 'sudo modprobe msr', then retry.\n");
-				exit(99);
-			case EACCES:
-				fprintf(stderr, "Amd rapl must be executed with the administrator privilege, try with 'sudo'.\n");
-				exit(98);
-			default:
-				fprintf(stderr, "Unexpected error\n");
-				exit(97);
-		}
-	}
-	// n_cpu > 0
+    if (n_cpu == 0) {
+        perror("open()");
+        fprintf(stderr, "on the file: '%s'\n", filename);
+        switch (cpy_errno) {
+        case ENOENT:
+            fprintf(stderr, "Amd rapl works with msr module, try to run 'sudo modprobe msr', then retry.\n");
+            exit(99);
+        case EACCES:
+            fprintf(stderr, "Amd rapl must be executed with the administrator privilege, try with 'sudo'.\n");
+            exit(98);
+        default:
+            fprintf(stderr, "Unexpected error\n");
+            exit(97);
+        }
+    }
+    // n_cpu > 0
     return n_cpu;
 }
 
diff --git a/src/network.c b/src/network.c
index a668725..fec9424 100644
--- a/src/network.c
+++ b/src/network.c
@@ -159,9 +159,9 @@ unsigned int init_network(char *dev, void **ptr)
             /* compare dev name to the previously saved one */
             int newdev = 1;
             for (int i = 0; i < state->ndev && newdev; i++) {
-	            if (strncmp(start_of_dev, state->devs[i], s - start_of_dev) == 0) {
-	            	newdev = 0;
-	            }
+                if (strncmp(start_of_dev, state->devs[i], s - start_of_dev) == 0) {
+                    newdev = 0;
+                }
             }
             if (newdev) {
                 if (state->ndev >= NB_MAX_DEV) {
diff --git a/tests/info_reader.c b/tests/info_reader.c
index af2873c..1e4f281 100644
--- a/tests/info_reader.c
+++ b/tests/info_reader.c
@@ -287,7 +287,7 @@ TFUNCTION(test_match, {
 #define __NB_KEYS 4
 
 typedef struct {
-  int values[__NB_KEYS];
+    int values[__NB_KEYS];
 } IntArray;
 
 GenericPointer __test_file_int_allocator(char *s)
@@ -298,7 +298,7 @@ GenericPointer __test_file_int_allocator(char *s)
 
 void __test_file_set_int(GenericPointer storage, GenericPointer data)
 {
-    IntArray *array = (IntArray*) storage;
+    IntArray *array = (IntArray *) storage;
     int i = (int) data;
     array->values[i] = i;
 }
@@ -319,11 +319,12 @@ TFUNCTION(test_dummy_file, {
     expected.values[3] = 3;
 
     Parser parser;
-    FILE* file = fopen("./tests/info_reader_test.txt", "r");
+    FILE *file = fopen("./tests/info_reader_test.txt", "r");
     INIT_PARSER(parser, (GenericPointer) &results, 0, 1, sizeof(IntArray), keys, __NB_KEYS, file);
     parse(&parser);
 
-    for (unsigned int i = 0; i < __NB_KEYS; i++) {
+    for (unsigned int i = 0; i < __NB_KEYS; i++)
+    {
         TEST_INT(&(results.values[i]), &(expected.values[i]));
     }
     fclose(file);
diff --git a/tests/util.c b/tests/util.c
index 231ab47..ff979b9 100644
--- a/tests/util.c
+++ b/tests/util.c
@@ -78,45 +78,45 @@ TFUNCTION(test_modulo_substraction, {
 })
 
 TFUNCTION(test_max, {
-  int expected = 0;
-  int result = 0;
+    int expected = 0;
+    int result = 0;
 
-  expected = 10;
-  result = MAX(expected, 9);
-  TEST_INT(&result, &expected);
+    expected = 10;
+    result = MAX(expected, 9);
+    TEST_INT(&result, &expected);
 
-  expected = -15;
-  result = MAX(expected, -16);
-  TEST_INT(&result, &expected);
+    expected = -15;
+    result = MAX(expected, -16);
+    TEST_INT(&result, &expected);
 
-  expected = 0;
-  result = MAX(expected, -1);
-  TEST_INT(&result, &expected);
+    expected = 0;
+    result = MAX(expected, -1);
+    TEST_INT(&result, &expected);
 
-  expected = 1;
-  result = MAX(expected, 0);
-  TEST_INT(&result, &expected);
+    expected = 1;
+    result = MAX(expected, 0);
+    TEST_INT(&result, &expected);
 })
 
 TFUNCTION(test_min, {
-  int expected = 0;
-  int result = 0;
+    int expected = 0;
+    int result = 0;
 
-  expected = 9;
-  result = MIN(expected, 10);
-  TEST_INT(&result, &expected);
+    expected = 9;
+    result = MIN(expected, 10);
+    TEST_INT(&result, &expected);
 
-  expected = -16;
-  result = MIN(expected, -15);
-  TEST_INT(&result, &expected);
+    expected = -16;
+    result = MIN(expected, -15);
+    TEST_INT(&result, &expected);
 
-  expected = -1;
-  result = MIN(expected, 0);
-  TEST_INT(&result, &expected);
+    expected = -1;
+    result = MIN(expected, 0);
+    TEST_INT(&result, &expected);
 
-  expected = 0;
-  result = MIN(expected, 1);
-  TEST_INT(&result, &expected);
+    expected = 0;
+    result = MIN(expected, 1);
+    TEST_INT(&result, &expected);
 })
 
 TFILE_ENTRY_POINT(test_util, {
-- 
GitLab


From 064cfdf09660498e5b001c5d075585c7530164c3 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Mon, 27 Mar 2023 18:55:37 +0200
Subject: [PATCH 05/16] working on progress

---
 meminfo_option.sh    |  48 ++++++
 src/meminfo_option.h | 402 +++++++++++++++++++++++++++++++++++++++++++
 src/memory_extra.c   |  95 ++++++++++
 3 files changed, 545 insertions(+)
 create mode 100644 meminfo_option.sh
 create mode 100644 src/meminfo_option.h
 create mode 100644 src/memory_extra.c

diff --git a/meminfo_option.sh b/meminfo_option.sh
new file mode 100644
index 0000000..4443868
--- /dev/null
+++ b/meminfo_option.sh
@@ -0,0 +1,48 @@
+#!bin/sh
+
+MEMINFO="/proc/meminfo"
+COUNT=0
+
+function get_meminfo_words {
+	printf "char *meminfo_words[] = {\n"
+	while read line; do
+		COUNT=$(expr $COUNT + 1)
+		word=$(echo $line | awk '{print $1}')
+		printf "    \"${word::-1}\",\n"
+	done <$MEMINFO
+
+	printf "};\n\n"
+}
+
+function get_count {
+	printf "static const unsigned int meminfo_count = $COUNT;\n\n"
+}
+
+function get_meminfo_setter {
+	count=0
+	while [ $count -lt $COUNT ]; do
+		printf "void set_result_offset$count(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[$count] = (uint64_t) data;
+}\n\n"
+		count=$(expr $count + 1)
+	done
+}
+
+function get_functions {
+	printf "static void (*setter_functions[])(GenericPointer, GenericPointer) = {\n"
+	count=0
+	while [ $count -lt $COUNT ]; do
+		printf "    set_result_offset$count,\n"
+		count=$(expr $count + 1)
+	done
+	printf "};\n\n"
+}
+
+DEST="./src/meminfo_option.h"
+printf "#include \"inttypes.h\"\n" >$DEST
+printf "#include <info_reader.h>\n\n" >>$DEST
+get_meminfo_words "./text.h" >>$DEST
+get_count >>$DEST
+get_meminfo_setter >>$DEST
+get_functions >>$DEST
diff --git a/src/meminfo_option.h b/src/meminfo_option.h
new file mode 100644
index 0000000..f3369b8
--- /dev/null
+++ b/src/meminfo_option.h
@@ -0,0 +1,402 @@
+#include "inttypes.h"
+#include <info_reader.h>
+char *meminfo_words[] = {
+    "MemTotal",
+    "MemFree",
+    "MemAvailable",
+    "Buffers",
+    "Cached",
+    "SwapCached",
+    "Active",
+    "Inactive",
+    "Active(anon)",
+    "Inactive(anon)",
+    "Active(file)",
+    "Inactive(file)",
+    "Unevictable",
+    "Mlocked",
+    "SwapTotal",
+    "SwapFree",
+    "Zswap",
+    "Zswapped",
+    "Dirty",
+    "Writeback",
+    "AnonPages",
+    "Mapped",
+    "Shmem",
+    "KReclaimable",
+    "Slab",
+    "SReclaimable",
+    "SUnreclaim",
+    "KernelStack",
+    "PageTables",
+    "SecPageTables",
+    "NFS_Unstable",
+    "Bounce",
+    "WritebackTmp",
+    "CommitLimit",
+    "Committed_AS",
+    "VmallocTotal",
+    "VmallocUsed",
+    "VmallocChunk",
+    "Percpu",
+    "HardwareCorrupted",
+    "AnonHugePages",
+    "ShmemHugePages",
+    "ShmemPmdMapped",
+    "FileHugePages",
+    "FilePmdMapped",
+    "CmaTotal",
+    "CmaFree",
+    "HugePages_Total",
+    "HugePages_Free",
+    "HugePages_Rsvd",
+    "HugePages_Surp",
+    "Hugepagesize",
+    "Hugetlb",
+    "DirectMap4k",
+    "DirectMap2M",
+    "DirectMap1G",
+};
+
+static const unsigned int meminfo_count = 56;
+
+void set_result_offset0(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[0] = (uint64_t) data;
+}
+
+void set_result_offset1(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[1] = (uint64_t) data;
+}
+
+void set_result_offset2(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[2] = (uint64_t) data;
+}
+
+void set_result_offset3(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[3] = (uint64_t) data;
+}
+
+void set_result_offset4(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[4] = (uint64_t) data;
+}
+
+void set_result_offset5(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[5] = (uint64_t) data;
+}
+
+void set_result_offset6(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[6] = (uint64_t) data;
+}
+
+void set_result_offset7(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[7] = (uint64_t) data;
+}
+
+void set_result_offset8(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[8] = (uint64_t) data;
+}
+
+void set_result_offset9(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[9] = (uint64_t) data;
+}
+
+void set_result_offset10(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[10] = (uint64_t) data;
+}
+
+void set_result_offset11(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[11] = (uint64_t) data;
+}
+
+void set_result_offset12(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[12] = (uint64_t) data;
+}
+
+void set_result_offset13(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[13] = (uint64_t) data;
+}
+
+void set_result_offset14(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[14] = (uint64_t) data;
+}
+
+void set_result_offset15(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[15] = (uint64_t) data;
+}
+
+void set_result_offset16(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[16] = (uint64_t) data;
+}
+
+void set_result_offset17(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[17] = (uint64_t) data;
+}
+
+void set_result_offset18(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[18] = (uint64_t) data;
+}
+
+void set_result_offset19(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[19] = (uint64_t) data;
+}
+
+void set_result_offset20(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[20] = (uint64_t) data;
+}
+
+void set_result_offset21(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[21] = (uint64_t) data;
+}
+
+void set_result_offset22(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[22] = (uint64_t) data;
+}
+
+void set_result_offset23(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[23] = (uint64_t) data;
+}
+
+void set_result_offset24(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[24] = (uint64_t) data;
+}
+
+void set_result_offset25(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[25] = (uint64_t) data;
+}
+
+void set_result_offset26(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[26] = (uint64_t) data;
+}
+
+void set_result_offset27(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[27] = (uint64_t) data;
+}
+
+void set_result_offset28(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[28] = (uint64_t) data;
+}
+
+void set_result_offset29(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[29] = (uint64_t) data;
+}
+
+void set_result_offset30(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[30] = (uint64_t) data;
+}
+
+void set_result_offset31(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[31] = (uint64_t) data;
+}
+
+void set_result_offset32(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[32] = (uint64_t) data;
+}
+
+void set_result_offset33(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[33] = (uint64_t) data;
+}
+
+void set_result_offset34(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[34] = (uint64_t) data;
+}
+
+void set_result_offset35(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[35] = (uint64_t) data;
+}
+
+void set_result_offset36(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[36] = (uint64_t) data;
+}
+
+void set_result_offset37(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[37] = (uint64_t) data;
+}
+
+void set_result_offset38(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[38] = (uint64_t) data;
+}
+
+void set_result_offset39(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[39] = (uint64_t) data;
+}
+
+void set_result_offset40(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[40] = (uint64_t) data;
+}
+
+void set_result_offset41(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[41] = (uint64_t) data;
+}
+
+void set_result_offset42(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[42] = (uint64_t) data;
+}
+
+void set_result_offset43(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[43] = (uint64_t) data;
+}
+
+void set_result_offset44(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[44] = (uint64_t) data;
+}
+
+void set_result_offset45(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[45] = (uint64_t) data;
+}
+
+void set_result_offset46(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[46] = (uint64_t) data;
+}
+
+void set_result_offset47(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[47] = (uint64_t) data;
+}
+
+void set_result_offset48(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[48] = (uint64_t) data;
+}
+
+void set_result_offset49(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[49] = (uint64_t) data;
+}
+
+void set_result_offset50(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[50] = (uint64_t) data;
+}
+
+void set_result_offset51(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[51] = (uint64_t) data;
+}
+
+void set_result_offset52(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[52] = (uint64_t) data;
+}
+
+void set_result_offset53(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[53] = (uint64_t) data;
+}
+
+void set_result_offset54(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[54] = (uint64_t) data;
+}
+
+void set_result_offset55(GenericPointer ptr, GenericPointer data) {
+    uint64_t* result = (uint64_t *) ptr;
+    result[55] = (uint64_t) data;
+}
+
+static void (*setter_functions[])(GenericPointer, GenericPointer) = {
+    set_result_offset0,
+    set_result_offset1,
+    set_result_offset2,
+    set_result_offset3,
+    set_result_offset4,
+    set_result_offset5,
+    set_result_offset6,
+    set_result_offset7,
+    set_result_offset8,
+    set_result_offset9,
+    set_result_offset10,
+    set_result_offset11,
+    set_result_offset12,
+    set_result_offset13,
+    set_result_offset14,
+    set_result_offset15,
+    set_result_offset16,
+    set_result_offset17,
+    set_result_offset18,
+    set_result_offset19,
+    set_result_offset20,
+    set_result_offset21,
+    set_result_offset22,
+    set_result_offset23,
+    set_result_offset24,
+    set_result_offset25,
+    set_result_offset26,
+    set_result_offset27,
+    set_result_offset28,
+    set_result_offset29,
+    set_result_offset30,
+    set_result_offset31,
+    set_result_offset32,
+    set_result_offset33,
+    set_result_offset34,
+    set_result_offset35,
+    set_result_offset36,
+    set_result_offset37,
+    set_result_offset38,
+    set_result_offset39,
+    set_result_offset40,
+    set_result_offset41,
+    set_result_offset42,
+    set_result_offset43,
+    set_result_offset44,
+    set_result_offset45,
+    set_result_offset46,
+    set_result_offset47,
+    set_result_offset48,
+    set_result_offset49,
+    set_result_offset50,
+    set_result_offset51,
+    set_result_offset52,
+    set_result_offset53,
+    set_result_offset54,
+    set_result_offset55,
+};
+
diff --git a/src/memory_extra.c b/src/memory_extra.c
new file mode 100644
index 0000000..f616870
--- /dev/null
+++ b/src/memory_extra.c
@@ -0,0 +1,95 @@
+#include "meminfo_option.h"
+#include <info_reader.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static const char *path = "/proc/meminfo";
+
+GenericPointer long_allocator(char *s) {
+  long value = atol(s);
+  return (GenericPointer)value;
+}
+
+KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes) {
+  KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
+  for (unsigned int i = 0; i < count; i++) {
+    unsigned int idx = indexes[i];
+    KeyFinder key = {.key = meminfo_words[idx],
+                     .delimiter = ":",
+                     .copy = long_allocator,
+                     .set = setter_functions[i]};
+    memcpy(&keys[i], &key, sizeof(KeyFinder));
+  }
+  return keys;
+}
+
+void memory_list(char *memory_string, unsigned int *count,
+                 unsigned int *indexes) {
+  char *token;
+  *count = 0;
+
+  while ((token = strtok(memory_string, ",")) != NULL) {
+    memory_string = NULL;
+
+    unsigned int i;
+    for (i = 0; i < meminfo_count; i++) {
+      if (strcmp(meminfo_words[i], token) == 0) {
+        (*count)++;
+        indexes[*count - 1] = i;
+        break;
+      }
+    }
+
+    if (i == meminfo_count) {
+      fprintf(stderr, "Unknown memory counter: %s\n", token);
+      exit(EXIT_FAILURE);
+    }
+
+    if ((*count) > meminfo_count) {
+      fprintf(stderr, "Too much counters, there are probably duplicates\n");
+      exit(EXIT_FAILURE);
+    }
+  }
+}
+
+int main(int argc, char **argv) {
+
+  if (argc != 2) {
+    fprintf(stderr, "Usage ... [elem1,elem2...]\n");
+    exit(EXIT_FAILURE);
+  }
+
+  unsigned int indexes[meminfo_count];
+  unsigned int count = 0;
+  memory_list(argv[1], &count, indexes);
+
+  printf("%d, count \n", count);
+
+  KeyFinder *keys = build_keyfinder(count, indexes);
+  uint64_t value[count];
+
+  // -- Init the parser
+  Parser parser = {.storage = (GenericPointer)&value,
+                   .capacity = 1,
+                   .storage_struct_size = sizeof(uint64_t) * count,
+                   .keys = keys,
+                   .nb_keys = count,
+                   .file = fopen(path, "r")};
+
+  // -- Parse the file
+  while (1) {
+    parse(&parser);
+    for (unsigned int i = 0; i < count; i++) {
+      printf("%s: %" PRIu64 "\n", keys[i].key, value[i]);
+    }
+  }
+
+  free(keys);
+
+  // Print and free the results
+
+  fclose(parser.file);
+  return 0;
+}
-- 
GitLab


From 5149f2fe08bc672f671b9afff72192885f14b120 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Tue, 28 Mar 2023 09:36:14 +0200
Subject: [PATCH 06/16] update: script

---
 .gitignore                                |   1 +
 meminfo_option.sh                         |  48 ---
 src/meminfo_option.h                      | 402 ----------------------
 src/meminfo_option.sh                     |  46 +++
 src/{memory_extra.c => memory_counters.c} |  12 +-
 5 files changed, 53 insertions(+), 456 deletions(-)
 delete mode 100644 meminfo_option.sh
 delete mode 100644 src/meminfo_option.h
 create mode 100644 src/meminfo_option.sh
 rename src/{memory_extra.c => memory_counters.c} (89%)

diff --git a/.gitignore b/.gitignore
index 83a8dc0..eb6940e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@ doc/info_reader_ex
 doc/mojitos.1
 tests/run
 src/counters_option.h
+src/meminfo_option.h
 src/sensors.h
 sensors.mk
 bin
diff --git a/meminfo_option.sh b/meminfo_option.sh
deleted file mode 100644
index 4443868..0000000
--- a/meminfo_option.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!bin/sh
-
-MEMINFO="/proc/meminfo"
-COUNT=0
-
-function get_meminfo_words {
-	printf "char *meminfo_words[] = {\n"
-	while read line; do
-		COUNT=$(expr $COUNT + 1)
-		word=$(echo $line | awk '{print $1}')
-		printf "    \"${word::-1}\",\n"
-	done <$MEMINFO
-
-	printf "};\n\n"
-}
-
-function get_count {
-	printf "static const unsigned int meminfo_count = $COUNT;\n\n"
-}
-
-function get_meminfo_setter {
-	count=0
-	while [ $count -lt $COUNT ]; do
-		printf "void set_result_offset$count(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[$count] = (uint64_t) data;
-}\n\n"
-		count=$(expr $count + 1)
-	done
-}
-
-function get_functions {
-	printf "static void (*setter_functions[])(GenericPointer, GenericPointer) = {\n"
-	count=0
-	while [ $count -lt $COUNT ]; do
-		printf "    set_result_offset$count,\n"
-		count=$(expr $count + 1)
-	done
-	printf "};\n\n"
-}
-
-DEST="./src/meminfo_option.h"
-printf "#include \"inttypes.h\"\n" >$DEST
-printf "#include <info_reader.h>\n\n" >>$DEST
-get_meminfo_words "./text.h" >>$DEST
-get_count >>$DEST
-get_meminfo_setter >>$DEST
-get_functions >>$DEST
diff --git a/src/meminfo_option.h b/src/meminfo_option.h
deleted file mode 100644
index f3369b8..0000000
--- a/src/meminfo_option.h
+++ /dev/null
@@ -1,402 +0,0 @@
-#include "inttypes.h"
-#include <info_reader.h>
-char *meminfo_words[] = {
-    "MemTotal",
-    "MemFree",
-    "MemAvailable",
-    "Buffers",
-    "Cached",
-    "SwapCached",
-    "Active",
-    "Inactive",
-    "Active(anon)",
-    "Inactive(anon)",
-    "Active(file)",
-    "Inactive(file)",
-    "Unevictable",
-    "Mlocked",
-    "SwapTotal",
-    "SwapFree",
-    "Zswap",
-    "Zswapped",
-    "Dirty",
-    "Writeback",
-    "AnonPages",
-    "Mapped",
-    "Shmem",
-    "KReclaimable",
-    "Slab",
-    "SReclaimable",
-    "SUnreclaim",
-    "KernelStack",
-    "PageTables",
-    "SecPageTables",
-    "NFS_Unstable",
-    "Bounce",
-    "WritebackTmp",
-    "CommitLimit",
-    "Committed_AS",
-    "VmallocTotal",
-    "VmallocUsed",
-    "VmallocChunk",
-    "Percpu",
-    "HardwareCorrupted",
-    "AnonHugePages",
-    "ShmemHugePages",
-    "ShmemPmdMapped",
-    "FileHugePages",
-    "FilePmdMapped",
-    "CmaTotal",
-    "CmaFree",
-    "HugePages_Total",
-    "HugePages_Free",
-    "HugePages_Rsvd",
-    "HugePages_Surp",
-    "Hugepagesize",
-    "Hugetlb",
-    "DirectMap4k",
-    "DirectMap2M",
-    "DirectMap1G",
-};
-
-static const unsigned int meminfo_count = 56;
-
-void set_result_offset0(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[0] = (uint64_t) data;
-}
-
-void set_result_offset1(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[1] = (uint64_t) data;
-}
-
-void set_result_offset2(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[2] = (uint64_t) data;
-}
-
-void set_result_offset3(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[3] = (uint64_t) data;
-}
-
-void set_result_offset4(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[4] = (uint64_t) data;
-}
-
-void set_result_offset5(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[5] = (uint64_t) data;
-}
-
-void set_result_offset6(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[6] = (uint64_t) data;
-}
-
-void set_result_offset7(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[7] = (uint64_t) data;
-}
-
-void set_result_offset8(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[8] = (uint64_t) data;
-}
-
-void set_result_offset9(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[9] = (uint64_t) data;
-}
-
-void set_result_offset10(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[10] = (uint64_t) data;
-}
-
-void set_result_offset11(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[11] = (uint64_t) data;
-}
-
-void set_result_offset12(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[12] = (uint64_t) data;
-}
-
-void set_result_offset13(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[13] = (uint64_t) data;
-}
-
-void set_result_offset14(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[14] = (uint64_t) data;
-}
-
-void set_result_offset15(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[15] = (uint64_t) data;
-}
-
-void set_result_offset16(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[16] = (uint64_t) data;
-}
-
-void set_result_offset17(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[17] = (uint64_t) data;
-}
-
-void set_result_offset18(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[18] = (uint64_t) data;
-}
-
-void set_result_offset19(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[19] = (uint64_t) data;
-}
-
-void set_result_offset20(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[20] = (uint64_t) data;
-}
-
-void set_result_offset21(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[21] = (uint64_t) data;
-}
-
-void set_result_offset22(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[22] = (uint64_t) data;
-}
-
-void set_result_offset23(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[23] = (uint64_t) data;
-}
-
-void set_result_offset24(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[24] = (uint64_t) data;
-}
-
-void set_result_offset25(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[25] = (uint64_t) data;
-}
-
-void set_result_offset26(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[26] = (uint64_t) data;
-}
-
-void set_result_offset27(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[27] = (uint64_t) data;
-}
-
-void set_result_offset28(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[28] = (uint64_t) data;
-}
-
-void set_result_offset29(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[29] = (uint64_t) data;
-}
-
-void set_result_offset30(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[30] = (uint64_t) data;
-}
-
-void set_result_offset31(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[31] = (uint64_t) data;
-}
-
-void set_result_offset32(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[32] = (uint64_t) data;
-}
-
-void set_result_offset33(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[33] = (uint64_t) data;
-}
-
-void set_result_offset34(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[34] = (uint64_t) data;
-}
-
-void set_result_offset35(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[35] = (uint64_t) data;
-}
-
-void set_result_offset36(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[36] = (uint64_t) data;
-}
-
-void set_result_offset37(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[37] = (uint64_t) data;
-}
-
-void set_result_offset38(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[38] = (uint64_t) data;
-}
-
-void set_result_offset39(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[39] = (uint64_t) data;
-}
-
-void set_result_offset40(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[40] = (uint64_t) data;
-}
-
-void set_result_offset41(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[41] = (uint64_t) data;
-}
-
-void set_result_offset42(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[42] = (uint64_t) data;
-}
-
-void set_result_offset43(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[43] = (uint64_t) data;
-}
-
-void set_result_offset44(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[44] = (uint64_t) data;
-}
-
-void set_result_offset45(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[45] = (uint64_t) data;
-}
-
-void set_result_offset46(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[46] = (uint64_t) data;
-}
-
-void set_result_offset47(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[47] = (uint64_t) data;
-}
-
-void set_result_offset48(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[48] = (uint64_t) data;
-}
-
-void set_result_offset49(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[49] = (uint64_t) data;
-}
-
-void set_result_offset50(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[50] = (uint64_t) data;
-}
-
-void set_result_offset51(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[51] = (uint64_t) data;
-}
-
-void set_result_offset52(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[52] = (uint64_t) data;
-}
-
-void set_result_offset53(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[53] = (uint64_t) data;
-}
-
-void set_result_offset54(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[54] = (uint64_t) data;
-}
-
-void set_result_offset55(GenericPointer ptr, GenericPointer data) {
-    uint64_t* result = (uint64_t *) ptr;
-    result[55] = (uint64_t) data;
-}
-
-static void (*setter_functions[])(GenericPointer, GenericPointer) = {
-    set_result_offset0,
-    set_result_offset1,
-    set_result_offset2,
-    set_result_offset3,
-    set_result_offset4,
-    set_result_offset5,
-    set_result_offset6,
-    set_result_offset7,
-    set_result_offset8,
-    set_result_offset9,
-    set_result_offset10,
-    set_result_offset11,
-    set_result_offset12,
-    set_result_offset13,
-    set_result_offset14,
-    set_result_offset15,
-    set_result_offset16,
-    set_result_offset17,
-    set_result_offset18,
-    set_result_offset19,
-    set_result_offset20,
-    set_result_offset21,
-    set_result_offset22,
-    set_result_offset23,
-    set_result_offset24,
-    set_result_offset25,
-    set_result_offset26,
-    set_result_offset27,
-    set_result_offset28,
-    set_result_offset29,
-    set_result_offset30,
-    set_result_offset31,
-    set_result_offset32,
-    set_result_offset33,
-    set_result_offset34,
-    set_result_offset35,
-    set_result_offset36,
-    set_result_offset37,
-    set_result_offset38,
-    set_result_offset39,
-    set_result_offset40,
-    set_result_offset41,
-    set_result_offset42,
-    set_result_offset43,
-    set_result_offset44,
-    set_result_offset45,
-    set_result_offset46,
-    set_result_offset47,
-    set_result_offset48,
-    set_result_offset49,
-    set_result_offset50,
-    set_result_offset51,
-    set_result_offset52,
-    set_result_offset53,
-    set_result_offset54,
-    set_result_offset55,
-};
-
diff --git a/src/meminfo_option.sh b/src/meminfo_option.sh
new file mode 100644
index 0000000..54a2c6e
--- /dev/null
+++ b/src/meminfo_option.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+# SPDX-License-Identifier: GPL-3.0-or-later
+# Copyright (C) 2018-2023 Georges Da Costa <georges.da-costa@irit.fr>
+
+MEMINFO_PATH="/proc/meminfo"
+
+FUNCTION_TEMPLATE="void set_result_offset%s(GenericPointer ptr, GenericPointer data)
+{
+    uint64_t* result = (uint64_t *) ptr;
+    result[%s] = (uint64_t) data;
+}\n\n"
+
+nb_counters=0
+
+echo '#include <inttypes.h>'
+echo "#include <info_reader.h>"
+echo
+
+echo 'static char *memory_counters[] = {'
+while read line; do
+  nb_counters=$(expr $nb_counters + 1)
+  word=$(echo $line | awk '{print $1}')
+  echo "    \"${word::-1}\","
+done <$MEMINFO_PATH
+echo "};"
+echo
+
+echo "#define NB_COUNTERS $nb_counters"
+echo
+
+count=0
+while [ $count -lt $nb_counters ]; do
+  printf "$FUNCTION_TEMPLATE" $count $count
+  count=$(expr $count + 1)
+done
+
+echo "static void (*setter_functions[])(GenericPointer, GenericPointer) = {"
+count=0
+while [ $count -lt $nb_counters ]; do
+  echo "    set_result_offset$count,"
+  count=$(expr $count + 1)
+done
+echo "};"
+echo
+
diff --git a/src/memory_extra.c b/src/memory_counters.c
similarity index 89%
rename from src/memory_extra.c
rename to src/memory_counters.c
index f616870..4572ff0 100644
--- a/src/memory_extra.c
+++ b/src/memory_counters.c
@@ -16,7 +16,7 @@ KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes) {
   KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
   for (unsigned int i = 0; i < count; i++) {
     unsigned int idx = indexes[i];
-    KeyFinder key = {.key = meminfo_words[idx],
+    KeyFinder key = {.key = memory_counters[idx],
                      .delimiter = ":",
                      .copy = long_allocator,
                      .set = setter_functions[i]};
@@ -34,20 +34,20 @@ void memory_list(char *memory_string, unsigned int *count,
     memory_string = NULL;
 
     unsigned int i;
-    for (i = 0; i < meminfo_count; i++) {
-      if (strcmp(meminfo_words[i], token) == 0) {
+    for (i = 0; i < NB_COUNTERS; i++) {
+      if (strcmp(memory_counters[i], token) == 0) {
         (*count)++;
         indexes[*count - 1] = i;
         break;
       }
     }
 
-    if (i == meminfo_count) {
+    if (i == NB_COUNTERS) {
       fprintf(stderr, "Unknown memory counter: %s\n", token);
       exit(EXIT_FAILURE);
     }
 
-    if ((*count) > meminfo_count) {
+    if ((*count) > NB_COUNTERS) {
       fprintf(stderr, "Too much counters, there are probably duplicates\n");
       exit(EXIT_FAILURE);
     }
@@ -61,7 +61,7 @@ int main(int argc, char **argv) {
     exit(EXIT_FAILURE);
   }
 
-  unsigned int indexes[meminfo_count];
+  unsigned int indexes[NB_COUNTERS];
   unsigned int count = 0;
   memory_list(argv[1], &count, indexes);
 
-- 
GitLab


From db433cca717ddc0ec8842eb6a3c155817e95a7fc Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Tue, 28 Mar 2023 10:00:50 +0200
Subject: [PATCH 07/16] update: create api

---
 src/memory_counters.c | 74 +++++++++++++++++++++++++------------------
 1 file changed, 44 insertions(+), 30 deletions(-)

diff --git a/src/memory_counters.c b/src/memory_counters.c
index 4572ff0..7225352 100644
--- a/src/memory_counters.c
+++ b/src/memory_counters.c
@@ -1,4 +1,6 @@
 #include "meminfo_option.h"
+#include <bits/stdint-uintn.h>
+#include <fcntl.h>
 #include <info_reader.h>
 #include <inttypes.h>
 #include <stdio.h>
@@ -7,6 +9,12 @@
 
 static const char *path = "/proc/meminfo";
 
+typedef struct {
+  KeyFinder *keys;
+  unsigned int count;
+  FILE *file;
+} MemoryCounters;
+
 GenericPointer long_allocator(char *s) {
   long value = atol(s);
   return (GenericPointer)value;
@@ -54,42 +62,48 @@ void memory_list(char *memory_string, unsigned int *count,
   }
 }
 
-int main(int argc, char **argv) {
-
-  if (argc != 2) {
-    fprintf(stderr, "Usage ... [elem1,elem2...]\n");
-    exit(EXIT_FAILURE);
-  }
-
+unsigned int init_memory_counters(char *args, void **ptr) {
   unsigned int indexes[NB_COUNTERS];
   unsigned int count = 0;
-  memory_list(argv[1], &count, indexes);
-
-  printf("%d, count \n", count);
+  memory_list(args, &count, indexes);
 
   KeyFinder *keys = build_keyfinder(count, indexes);
-  uint64_t value[count];
+  FILE *file = fopen(path, "r");
 
-  // -- Init the parser
-  Parser parser = {.storage = (GenericPointer)&value,
-                   .capacity = 1,
-                   .storage_struct_size = sizeof(uint64_t) * count,
-                   .keys = keys,
-                   .nb_keys = count,
-                   .file = fopen(path, "r")};
-
-  // -- Parse the file
-  while (1) {
-    parse(&parser);
-    for (unsigned int i = 0; i < count; i++) {
-      printf("%s: %" PRIu64 "\n", keys[i].key, value[i]);
-    }
-  }
+  MemoryCounters *counters = calloc(1, sizeof(MemoryCounters));
+  counters->keys = keys;
+  counters->count = count;
+  counters->file = file;
 
-  free(keys);
+  *ptr = (void *)counters;
+  return count;
+}
 
-  // Print and free the results
+unsigned int get_memory_counters(uint64_t *results, void *ptr) {
+  MemoryCounters *counters = (MemoryCounters *)ptr;
+  fseek(counters->file, 0, SEEK_SET);
+  Parser parser = {.storage = (GenericPointer)results,
+                   .capacity = 1,
+                   .nb_stored = 0,
+                   .storage_struct_size = sizeof(uint64_t) * counters->count,
+                   .keys = counters->keys,
+                   .nb_keys = counters->count,
+                   .file = counters->file};
+
+  parse(&parser);
+  return counters->count;
+}
+
+void label_memory_counters(char **labels, void *ptr) {
+  MemoryCounters *counters = (MemoryCounters *)ptr;
+  for (unsigned int i = 0; i < counters->count; i++) {
+    labels[i] = counters->keys[i].key;
+  }
+}
 
-  fclose(parser.file);
-  return 0;
+void clean_memory_counters(void *ptr) {
+  MemoryCounters *counters = (MemoryCounters *)ptr;
+  fclose(counters->file);
+  free(counters->keys);
+  free(ptr);
 }
-- 
GitLab


From f1348876b0dd2f8872f0ebf0bab6b9f80ca63f79 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Tue, 28 Mar 2023 10:11:08 +0200
Subject: [PATCH 08/16] update header

---
 src/memory_counters.c | 13 ++++++++++-
 src/memory_counters.h | 54 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 src/memory_counters.h

diff --git a/src/memory_counters.c b/src/memory_counters.c
index 7225352..23e3f96 100644
--- a/src/memory_counters.c
+++ b/src/memory_counters.c
@@ -1,5 +1,5 @@
 #include "meminfo_option.h"
-#include <bits/stdint-uintn.h>
+#include "util.h"
 #include <fcntl.h>
 #include <info_reader.h>
 #include <inttypes.h>
@@ -107,3 +107,14 @@ void clean_memory_counters(void *ptr) {
   free(counters->keys);
   free(ptr);
 }
+
+void *show_all_memory_counters(void *none1, size_t none2) {
+  for (unsigned int i = 0; i < NB_COUNTERS; i++) {
+    printf("%s\n", memory_counters[i]);
+  }
+
+  UNUSED(none1);
+  UNUSED(none2);
+  exit(EXIT_SUCCESS);
+  return NULL; /* not reached */
+}
diff --git a/src/memory_counters.h b/src/memory_counters.h
new file mode 100644
index 0000000..a066c42
--- /dev/null
+++ b/src/memory_counters.h
@@ -0,0 +1,54 @@
+/*******************************************************
+ Copyright (C) 2023-2023 Georges Da Costa <georges.da-costa@irit.fr>
+
+    This file is part of Mojitos.
+
+    Mojitos is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    Mojitos is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with MojitO/S.  If not, see <https://www.gnu.org/licenses/>.
+
+ *******************************************************/
+
+unsigned int init_memory_counters(char *args, void **ptr);
+unsigned int get_memory_counters(uint64_t *results, void *ptr);
+void label_memory_counters(char **labels, void *ptr);
+void clean_memory_counters(void *ptr);
+void *show_all_memory_counters(void *, size_t);
+
+sensor memory_counters = {
+    .init = init_memory_counters,
+    .get = get_memory_counters,
+    .clean = clean_memory_counters,
+    .label = label_memory_counters,
+    .nb_opt = 2,
+};
+
+Optparse memory_counters_opt[2] = {
+    {
+        .longname = "memory-counters",
+        .shortname = 'M',
+        .argtype = OPTPARSE_REQUIRED,
+        .usage_arg = "<memory_list>",
+        .usage_msg =
+            "memory counters\n"
+            "\tmemory_list is a coma separated list of memory counters.\n"
+            "\tEx: Zswap,Zswapped",
+    },
+    {
+        .longname = "memory-list",
+        .shortname = 'L',
+        .argtype = OPTPARSE_NONE,
+        .usage_arg = NULL,
+        .usage_msg = "list the available performance counters and quit",
+        .fn = show_all_memory_counters,
+    },
+};
-- 
GitLab


From a9496a7f8861c9bbe7994b110f89a93f2d6bfdd5 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Tue, 28 Mar 2023 10:28:33 +0200
Subject: [PATCH 09/16] update: add in autoconf

---
 .gitignore                                  | 2 +-
 configure.sh                                | 1 +
 makefile                                    | 6 +++++-
 src/memory_counters.h                       | 2 +-
 src/{meminfo_option.sh => memory_option.sh} | 0
 5 files changed, 8 insertions(+), 3 deletions(-)
 rename src/{meminfo_option.sh => memory_option.sh} (100%)
 mode change 100644 => 100755

diff --git a/.gitignore b/.gitignore
index eb6940e..d652549 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,7 +6,7 @@ doc/info_reader_ex
 doc/mojitos.1
 tests/run
 src/counters_option.h
-src/meminfo_option.h
+src/memory_option.h
 src/sensors.h
 sensors.mk
 bin
diff --git a/configure.sh b/configure.sh
index 7e10ec3..56abf93 100755
--- a/configure.sh
+++ b/configure.sh
@@ -117,6 +117,7 @@ detect_caps() {
 	[ -r /usr/include/linux/perf_event.h ] && hdr_whitelist=counters
 	[ -d /sys/class/infiniband ] && hdr_whitelist="${hdr_whitelist}|infiniband"
 	[ -r /proc/stat ] && hdr_whitelist="${hdr_whitelist}|load"
+	[ -r /proc/meminfo ] && hdr_whitelist="${hdr_whitelist}|memory_counters"
 
 	if [ "$(uname -r | cut -d "." -f 1)" -gt "2" ]; then
 		hdr_whitelist="${hdr_whitelist}|memory"
diff --git a/makefile b/makefile
index f25d563..63fa983 100644
--- a/makefile
+++ b/makefile
@@ -40,8 +40,9 @@ $(BIN): $(BIN_DIR) $(OBJ) $(OBJ_DIR)/$(BIN).o
 
 $(OBJ): $(OBJ_DIR)
 $(OBJ_DIR)/counters.o: $(SRC_DIR)/counters_option.h
+$(OBJ_DIR)/memory_counters.o: $(SRC_DIR)/memory_option.h
 
-$(OBJ_DIR)/$(BIN).o: $(SRC_DIR)/$(BIN).c $(SRC_DIR)/counters_option.h
+$(OBJ_DIR)/$(BIN).o: $(SRC_DIR)/$(BIN).c $(SRC_DIR)/counters_option.h $(SRC_DIR)/memory_counters.h
 	$(CC) $(CFLAGS) -c $< -o $@
 
 $(OBJ_DIR)/util.o: $(SRC_DIR)/util.c $(SRC_DIR)/util.h
@@ -50,6 +51,9 @@ $(OBJ_DIR)/util.o: $(SRC_DIR)/util.c $(SRC_DIR)/util.h
 $(SRC_DIR)/counters_option.h: $(SRC_DIR)/counters_option.sh
 	sh ./$(SRC_DIR)/counters_option.sh > $(SRC_DIR)/counters_option.h
 
+$(SRC_DIR)/memory_option.h: $(SRC_DIR)/memory_option.sh
+	sh ./$(SRC_DIR)/memory_option.sh > $(SRC_DIR)/memory_option.h
+
 $(OBJ_DIR):
 	mkdir -p $(OBJ_DIR)
 
diff --git a/src/memory_counters.h b/src/memory_counters.h
index a066c42..a0b9613 100644
--- a/src/memory_counters.h
+++ b/src/memory_counters.h
@@ -24,7 +24,7 @@ void label_memory_counters(char **labels, void *ptr);
 void clean_memory_counters(void *ptr);
 void *show_all_memory_counters(void *, size_t);
 
-sensor memory_counters = {
+Sensor memory_counters = {
     .init = init_memory_counters,
     .get = get_memory_counters,
     .clean = clean_memory_counters,
diff --git a/src/meminfo_option.sh b/src/memory_option.sh
old mode 100644
new mode 100755
similarity index 100%
rename from src/meminfo_option.sh
rename to src/memory_option.sh
-- 
GitLab


From 0e090d56181052a6fd014377602915efd8d69c7c Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Tue, 28 Mar 2023 10:29:39 +0200
Subject: [PATCH 10/16] fix header name

---
 src/memory_counters.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/memory_counters.c b/src/memory_counters.c
index 23e3f96..8e8e916 100644
--- a/src/memory_counters.c
+++ b/src/memory_counters.c
@@ -1,4 +1,4 @@
-#include "meminfo_option.h"
+#include "memory_option.h"
 #include "util.h"
 #include <fcntl.h>
 #include <info_reader.h>
-- 
GitLab


From e969987e3c39fdd4e7ddcdbc084a89fb00431cda Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Tue, 28 Mar 2023 10:43:45 +0200
Subject: [PATCH 11/16] fix: clean, usage

---
 makefile              | 1 +
 src/memory_counters.h | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/makefile b/makefile
index 63fa983..a57eca2 100644
--- a/makefile
+++ b/makefile
@@ -75,6 +75,7 @@ format:
 clean:
 	\rm -f $(OBJ_DIR)/* $(BIN_DIR)/* \
 		$(SRC_DIR)/counters_option.h \
+		$(SRC_DIR)/memory_option.h \
 		$(TESTS_DIR)/run \
 		$(DOC_DIR)/test_main_ex \
 		$(DOC_DIR)/info_reader_ex
diff --git a/src/memory_counters.h b/src/memory_counters.h
index a0b9613..50e0be3 100644
--- a/src/memory_counters.h
+++ b/src/memory_counters.h
@@ -48,7 +48,7 @@ Optparse memory_counters_opt[2] = {
         .shortname = 'L',
         .argtype = OPTPARSE_NONE,
         .usage_arg = NULL,
-        .usage_msg = "list the available performance counters and quit",
+        .usage_msg = "list the available memory counters and quit",
         .fn = show_all_memory_counters,
     },
 };
-- 
GitLab


From aa98e7f8ce29bd899fd484883bb3865d063d4d97 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Tue, 28 Mar 2023 10:52:08 +0200
Subject: [PATCH 12/16] format

---
 src/memory_counters.c | 180 ++++++++++++++++++++++--------------------
 src/memory_counters.h |   6 +-
 2 files changed, 98 insertions(+), 88 deletions(-)

diff --git a/src/memory_counters.c b/src/memory_counters.c
index 8e8e916..185f454 100644
--- a/src/memory_counters.c
+++ b/src/memory_counters.c
@@ -10,111 +10,121 @@
 static const char *path = "/proc/meminfo";
 
 typedef struct {
-  KeyFinder *keys;
-  unsigned int count;
-  FILE *file;
+    KeyFinder *keys;
+    unsigned int count;
+    FILE *file;
 } MemoryCounters;
 
-GenericPointer long_allocator(char *s) {
-  long value = atol(s);
-  return (GenericPointer)value;
+GenericPointer long_allocator(char *s)
+{
+    long value = atol(s);
+    return (GenericPointer)value;
 }
 
-KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes) {
-  KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
-  for (unsigned int i = 0; i < count; i++) {
-    unsigned int idx = indexes[i];
-    KeyFinder key = {.key = memory_counters[idx],
-                     .delimiter = ":",
-                     .copy = long_allocator,
-                     .set = setter_functions[i]};
-    memcpy(&keys[i], &key, sizeof(KeyFinder));
-  }
-  return keys;
+KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes)
+{
+    KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
+    for (unsigned int i = 0; i < count; i++) {
+        unsigned int idx = indexes[i];
+        KeyFinder key = {.key = memory_counters[idx],
+                         .delimiter = ":",
+                         .copy = long_allocator,
+                         .set = setter_functions[i]
+                        };
+        memcpy(&keys[i], &key, sizeof(KeyFinder));
+    }
+    return keys;
 }
 
 void memory_list(char *memory_string, unsigned int *count,
-                 unsigned int *indexes) {
-  char *token;
-  *count = 0;
-
-  while ((token = strtok(memory_string, ",")) != NULL) {
-    memory_string = NULL;
-
-    unsigned int i;
-    for (i = 0; i < NB_COUNTERS; i++) {
-      if (strcmp(memory_counters[i], token) == 0) {
-        (*count)++;
-        indexes[*count - 1] = i;
-        break;
-      }
-    }
-
-    if (i == NB_COUNTERS) {
-      fprintf(stderr, "Unknown memory counter: %s\n", token);
-      exit(EXIT_FAILURE);
+                 unsigned int *indexes)
+{
+    char *token;
+    *count = 0;
+
+    while ((token = strtok(memory_string, ",")) != NULL) {
+        memory_string = NULL;
+
+        unsigned int i;
+        for (i = 0; i < NB_COUNTERS; i++) {
+            if (strcmp(memory_counters[i], token) == 0) {
+                (*count)++;
+                indexes[*count - 1] = i;
+                break;
+            }
+        }
+
+        if (i == NB_COUNTERS) {
+            fprintf(stderr, "Unknown memory counter: %s\n", token);
+            exit(EXIT_FAILURE);
+        }
+
+        if ((*count) > NB_COUNTERS) {
+            fprintf(stderr, "Too much counters, there are probably duplicates\n");
+            exit(EXIT_FAILURE);
+        }
     }
-
-    if ((*count) > NB_COUNTERS) {
-      fprintf(stderr, "Too much counters, there are probably duplicates\n");
-      exit(EXIT_FAILURE);
-    }
-  }
 }
 
-unsigned int init_memory_counters(char *args, void **ptr) {
-  unsigned int indexes[NB_COUNTERS];
-  unsigned int count = 0;
-  memory_list(args, &count, indexes);
+unsigned int init_memory_counters(char *args, void **ptr)
+{
+    unsigned int indexes[NB_COUNTERS];
+    unsigned int count = 0;
+    memory_list(args, &count, indexes);
 
-  KeyFinder *keys = build_keyfinder(count, indexes);
-  FILE *file = fopen(path, "r");
+    KeyFinder *keys = build_keyfinder(count, indexes);
+    FILE *file = fopen(path, "r");
 
-  MemoryCounters *counters = calloc(1, sizeof(MemoryCounters));
-  counters->keys = keys;
-  counters->count = count;
-  counters->file = file;
+    MemoryCounters *counters = calloc(1, sizeof(MemoryCounters));
+    counters->keys = keys;
+    counters->count = count;
+    counters->file = file;
 
-  *ptr = (void *)counters;
-  return count;
+    *ptr = (void *)counters;
+    return count;
 }
 
-unsigned int get_memory_counters(uint64_t *results, void *ptr) {
-  MemoryCounters *counters = (MemoryCounters *)ptr;
-  fseek(counters->file, 0, SEEK_SET);
-  Parser parser = {.storage = (GenericPointer)results,
-                   .capacity = 1,
-                   .nb_stored = 0,
-                   .storage_struct_size = sizeof(uint64_t) * counters->count,
-                   .keys = counters->keys,
-                   .nb_keys = counters->count,
-                   .file = counters->file};
-
-  parse(&parser);
-  return counters->count;
+unsigned int get_memory_counters(uint64_t *results, void *ptr)
+{
+    MemoryCounters *counters = (MemoryCounters *)ptr;
+    fseek(counters->file, 0, SEEK_SET);
+    Parser parser = {.storage = (GenericPointer)results,
+                     .capacity = 1,
+                     .nb_stored = 0,
+                     .storage_struct_size = sizeof(uint64_t) * counters->count,
+                     .keys = counters->keys,
+                     .nb_keys = counters->count,
+                     .file = counters->file
+                    };
+
+    parse(&parser);
+    return counters->count;
 }
 
-void label_memory_counters(char **labels, void *ptr) {
-  MemoryCounters *counters = (MemoryCounters *)ptr;
-  for (unsigned int i = 0; i < counters->count; i++) {
-    labels[i] = counters->keys[i].key;
-  }
+void label_memory_counters(char **labels, void *ptr)
+{
+    MemoryCounters *counters = (MemoryCounters *)ptr;
+    for (unsigned int i = 0; i < counters->count; i++) {
+        labels[i] = counters->keys[i].key;
+    }
 }
 
-void clean_memory_counters(void *ptr) {
-  MemoryCounters *counters = (MemoryCounters *)ptr;
-  fclose(counters->file);
-  free(counters->keys);
-  free(ptr);
+void clean_memory_counters(void *ptr)
+{
+    MemoryCounters *counters = (MemoryCounters *)ptr;
+    fclose(counters->file);
+    free(counters->keys);
+    free(ptr);
 }
 
-void *show_all_memory_counters(void *none1, size_t none2) {
-  for (unsigned int i = 0; i < NB_COUNTERS; i++) {
-    printf("%s\n", memory_counters[i]);
-  }
+void *show_all_memory_counters(void *none1, size_t none2)
+{
+    for (unsigned int i = 0; i < NB_COUNTERS; i++) {
+        printf("%s\n", memory_counters[i]);
+    }
 
-  UNUSED(none1);
-  UNUSED(none2);
-  exit(EXIT_SUCCESS);
-  return NULL; /* not reached */
+    UNUSED(none1);
+    UNUSED(none2);
+    exit(EXIT_SUCCESS);
+    return NULL; /* not reached */
 }
diff --git a/src/memory_counters.h b/src/memory_counters.h
index 50e0be3..eaf9f36 100644
--- a/src/memory_counters.h
+++ b/src/memory_counters.h
@@ -39,9 +39,9 @@ Optparse memory_counters_opt[2] = {
         .argtype = OPTPARSE_REQUIRED,
         .usage_arg = "<memory_list>",
         .usage_msg =
-            "memory counters\n"
-            "\tmemory_list is a coma separated list of memory counters.\n"
-            "\tEx: Zswap,Zswapped",
+        "memory counters\n"
+        "\tmemory_list is a coma separated list of memory counters.\n"
+        "\tEx: Zswap,Zswapped",
     },
     {
         .longname = "memory-list",
-- 
GitLab


From b6fb43a0eb175610ea618bcee8ab765e511c3c05 Mon Sep 17 00:00:00 2001
From: ghuter <ghuter@disroot.org>
Date: Thu, 30 Mar 2023 15:58:48 +0200
Subject: [PATCH 13/16] modify memory_option.sh

---
 src/memory_option.sh | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/memory_option.sh b/src/memory_option.sh
index 54a2c6e..30a3831 100755
--- a/src/memory_option.sh
+++ b/src/memory_option.sh
@@ -3,9 +3,9 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 # Copyright (C) 2018-2023 Georges Da Costa <georges.da-costa@irit.fr>
 
-MEMINFO_PATH="/proc/meminfo"
+meminfo_path=/proc/meminfo
 
-FUNCTION_TEMPLATE="void set_result_offset%s(GenericPointer ptr, GenericPointer data)
+function_template="void set_result_offset%s(GenericPointer ptr, GenericPointer data)
 {
     uint64_t* result = (uint64_t *) ptr;
     result[%s] = (uint64_t) data;
@@ -14,16 +14,15 @@ FUNCTION_TEMPLATE="void set_result_offset%s(GenericPointer ptr, GenericPointer d
 nb_counters=0
 
 echo '#include <inttypes.h>'
-echo "#include <info_reader.h>"
+echo '#include <info_reader.h>'
 echo
 
 echo 'static char *memory_counters[] = {'
 while read line; do
-  nb_counters=$(expr $nb_counters + 1)
-  word=$(echo $line | awk '{print $1}')
-  echo "    \"${word::-1}\","
-done <$MEMINFO_PATH
-echo "};"
+  : $((nb_counters += 1))
+  echo "$line" | awk -F ':' '{printf("    \"%s\",\n", $1)}'
+done < "$meminfo_path"
+echo '};'
 echo
 
 echo "#define NB_COUNTERS $nb_counters"
@@ -31,16 +30,16 @@ echo
 
 count=0
 while [ $count -lt $nb_counters ]; do
-  printf "$FUNCTION_TEMPLATE" $count $count
-  count=$(expr $count + 1)
+  printf "$function_template" $count $count
+  : $((count += 1))
 done
 
-echo "static void (*setter_functions[])(GenericPointer, GenericPointer) = {"
+echo 'static void (*setter_functions[])(GenericPointer, GenericPointer) = {'
 count=0
 while [ $count -lt $nb_counters ]; do
   echo "    set_result_offset$count,"
-  count=$(expr $count + 1)
+  : $((count += 1))
 done
-echo "};"
+echo '};'
 echo
 
-- 
GitLab


From 2ad61f79f7eb594e04afb260db8839cb0be5ec53 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Flor=C3=A9al=20Risso?= <floreal.risso@univ-tlse3.fr>
Date: Wed, 19 Apr 2023 08:48:51 +0200
Subject: [PATCH 14/16] fix: make dependency

---
 makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/makefile b/makefile
index a57eca2..3997f40 100644
--- a/makefile
+++ b/makefile
@@ -42,7 +42,7 @@ $(OBJ): $(OBJ_DIR)
 $(OBJ_DIR)/counters.o: $(SRC_DIR)/counters_option.h
 $(OBJ_DIR)/memory_counters.o: $(SRC_DIR)/memory_option.h
 
-$(OBJ_DIR)/$(BIN).o: $(SRC_DIR)/$(BIN).c $(SRC_DIR)/counters_option.h $(SRC_DIR)/memory_counters.h
+$(OBJ_DIR)/$(BIN).o: $(SRC_DIR)/$(BIN).c
 	$(CC) $(CFLAGS) -c $< -o $@
 
 $(OBJ_DIR)/util.o: $(SRC_DIR)/util.c $(SRC_DIR)/util.h
-- 
GitLab


From a7c3287ae184633e49b732938eaf4d6ecfd0dd56 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Thu, 20 Apr 2023 10:05:05 +0200
Subject: [PATCH 15/16] fix make

---
 README.md             |  14 ++-
 configure.sh          |   4 +-
 lib/info_reader.c     | 146 ++++++++++++++++++++++++++
 lib/info_reader.h     | 236 ++++++++++--------------------------------
 makefile              |  15 ++-
 src/memory_counters.c | 180 +++++++++++++++-----------------
 6 files changed, 313 insertions(+), 282 deletions(-)
 create mode 100644 lib/info_reader.c

diff --git a/README.md b/README.md
index 9fee622..4c0b186 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ The following is an exhaustive list of all the sensors (it is very likely
 that one will not have all the sensors activated in his build):
 ```bash
 SENSORS:
--a|--amd-rapl
+-r|--amd-rapl
 	AMD RAPL
 -p|--perf-list <perf_list>
 	performance counters
@@ -41,8 +41,20 @@ SENSORS:
 	system load
 -d|--net-dev <net_dev>
 	network monitoring (if network_device is X, tries to detect it automatically)
+-n|--nvidia-gpu
+	provides basic gpu information [clocks, memory, utilization, power, temperature].
 -r|--intel-rapl
 	INTEL RAPL
+-c|--cpu-temp
+	processor temperature
+-m|--memory
+	Retrieves information about the memory via the syscall 'sysinfo(2)'.
+-M|--memory-counters <memory_list>
+	memory counters
+	memory_list is a coma separated list of memory counters.
+	Ex: Zswap,Zswapped
+-L|--memory-list
+	list the available memory counters and quit
 ```
 
 ## Installation Instructions
diff --git a/configure.sh b/configure.sh
index 56abf93..1246b0c 100755
--- a/configure.sh
+++ b/configure.sh
@@ -29,7 +29,7 @@ debug=0
 target_hdr=src/sensors.h
 target_mk=sensors.mk
 
-nonsensor='counters_option|sensors|util'
+nonsensor='counters_option|memory_option|sensors|util'
 
 hdr_blacklist=$nonsensor
 hdr_whitelist=''
@@ -157,6 +157,8 @@ detect_caps() {
 case $1 in
 --all | -a)
 	all=1
+	NVML_LDFLAGS="-L/usr/local/cuda/lib64 -lnvidia-ml"
+	NVML_IFLAGS="-I/usr/local/cuda/include"
 	;;
 esac
 
diff --git a/lib/info_reader.c b/lib/info_reader.c
new file mode 100644
index 0000000..d23f554
--- /dev/null
+++ b/lib/info_reader.c
@@ -0,0 +1,146 @@
+#include <info_reader.h>
+
+ void set_value(Parser *parser, KeyFinder *key_finder, char *raw_value)
+{
+    GenericPointer address = parser->storage + (parser->storage_struct_size * parser->nb_stored);
+    GenericPointer value = key_finder->copy(raw_value);
+    key_finder->set(address, value);
+}
+
+ unsigned int match(Parser *parser, char *line, KeyFinder **key_finder, char **raw_value)
+{
+    for (unsigned int i = 0; i < parser->nb_keys; i++) {
+        KeyFinder *finder = &parser->keys[i];
+
+        if (start_with(finder->key, line)) {
+            char *value = NULL;
+            char *key = NULL;
+
+            split_on_delimiter(line, finder->delimiter, &key, &value);
+            if ( key == NULL || value == NULL) {
+                return 0;
+            }
+            *key_finder = finder;
+            *raw_value = value;
+            return 1;
+        }
+    }
+    return 0;
+}
+
+ unsigned int move_to_next(Parser *parser)
+{
+    parser->nb_stored += 1;
+    if (parser->nb_stored >= parser->capacity) {
+        return 0;
+    }
+    return 1;
+}
+
+
+#define PAGE_SIZE 4096
+ssize_t buffer_getline(char **lineptr, FILE *stream) {
+    ssize_t num_chars_read = 0;
+    static char buffer[PAGE_SIZE] = {0};
+
+    if (!lineptr || !stream) {
+        return -1;
+    }
+
+    while (1) {
+        int ch = fgetc(stream);
+        if (ch == EOF) {
+            if (num_chars_read == 0) {
+                return -1;
+            } else {
+                break;
+            }
+        }
+
+        if (num_chars_read == PAGE_SIZE - 1) {
+            return -1;
+        }
+
+        buffer[num_chars_read++] = ch;
+        if (ch == '\n') {
+            break;
+        }
+    }
+
+    buffer[num_chars_read] = '\0';
+    *lineptr = buffer;
+
+    return num_chars_read;
+}
+
+
+ unsigned int parse(Parser *parser)
+{
+    char *line = NULL;
+    ssize_t read;
+    unsigned int key_assigned = 0;
+
+    while ((read = buffer_getline(&line, parser->file)) != -1) {
+        if (key_assigned == parser->nb_keys && read > 1) {
+            continue;
+        } else if (read == 1) {
+            if (!move_to_next(parser)) {
+                return 0;
+            }
+            key_assigned = 0;
+        } else {
+            KeyFinder *key_finder = NULL;
+            char *raw_value = NULL;
+            replace_first(line, '\n', '\0');
+            if (match(parser, line, &key_finder, &raw_value)) {
+                set_value(parser, key_finder, raw_value);
+                ++key_assigned;
+            }
+        }
+    }
+    if (key_assigned > 0) {
+        parser->nb_stored++;
+    }
+    return 1;
+}
+
+
+
+ void replace_first(char *string, char from, char to)
+{
+    for (int i = 0; string[i] != '\0'; i++) {
+        if (string[i] == from) {
+            string[i] = to;
+            break;
+        }
+    }
+}
+
+ void split_on_delimiter(char *string, const char *delimiter, char **key, char **value)
+{
+    *key = NULL;
+    *value = NULL;
+    size_t delimiter_len = strlen(delimiter);
+    char *start_delimiter = strstr(string, delimiter);
+    if (start_delimiter != NULL) {
+        *start_delimiter = '\0';
+        *key = string;
+        *value = start_delimiter + delimiter_len;
+    }
+}
+
+bool start_with(const char *prefix, const char *string)
+{
+    if (prefix == NULL || string == NULL) {
+        return false;
+    }
+
+    size_t prefix_len = strlen(prefix);
+    size_t string_len = strlen(string);
+
+    if (string_len < prefix_len) {
+        return false;
+    } else {
+        return  memcmp(prefix, string, prefix_len) == 0;
+    }
+}
diff --git a/lib/info_reader.h b/lib/info_reader.h
index 15a077c..403bb19 100644
--- a/lib/info_reader.h
+++ b/lib/info_reader.h
@@ -21,36 +21,42 @@
 #ifndef _INFO_READER_H
 #define _INFO_READER_H
 
-#include <string.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 /**
  * @struct Parser
  * @brief The parser struct
- * The struct containing all the necessary informations and functions to parse a file
+ * The struct containing all the necessary informations and functions to parse a
+ * file
  *
- * @var storage : GenericPointer : pointer to the storage where the parsed data will be stored
+ * @var storage : GenericPointer : pointer to the storage where the parsed data
+ * will be stored
  * @var nb_stored : unsigned int : the number of struct stored
- * @var capacity : unsigned int : the maximum number of struct that can be stored
- * @var storage_struct_size : size_t : the size of the struct stored in the storage
- * @var keys : KeyFinder* : pointer to an array of KeyFinder containing the possible keys
+ * @var capacity : unsigned int : the maximum number of struct that can be
+ * stored
+ * @var storage_struct_size : size_t : the size of the struct stored in the
+ * storage
+ * @var keys : KeyFinder* : pointer to an array of KeyFinder containing the
+ * possible keys
  * @var nb_keys : unsigned int : number of key finders
  * @var file : FILE* : pointer to the file that will be parsed
-*/
+ */
 typedef struct Parser Parser;
 
 /**
  * @struct KeyFinder
  * @brief The key finder struct
- * The struct containing all the necessary informations and functions to find a key in a line of text
+ * The struct containing all the necessary informations and functions to find a
+ * key in a line of text
  *
  * @var key : char* : the key to be found
  * @var delimiter : char* : the delimiter between the key and the value
  * @var copy : CopyAllocator*: the function to use to make a copy of the value
  * @var set : Setter*: the function to use to store the value in the storage
-*/
+ */
 typedef struct KeyFinder KeyFinder;
 
 /**
@@ -68,20 +74,24 @@ typedef struct KeyFinder KeyFinder;
  * @param[out] value A pointer to a char pointer where the value will be stored.
  * @return None.
  */
-static void split_on_delimiter(char *string, const char *delimiter, char **key, char **value);
+void split_on_delimiter(char *string, const char *delimiter, char **key,
+                        char **value);
 
 /**
- * @brief Replace the first occurrence of a character in a string with another character.
+ * @brief Replace the first occurrence of a character in a string with another
+ * character.
  *
- * The function takes a string and two characters as input, and replaces the first
- * occurrence of the first character in the string with the second character.
+ * The function takes a string and two characters as input, and replaces the
+ * first occurrence of the first character in the string with the second
+ * character.
  *
- * @param[in,out] string The input string where the replacement should take place.
+ * @param[in,out] string The input string where the replacement should take
+ * place.
  * @param[in] from The character to be replaced.
  * @param[in] to The character to replace with.
  * @return None.
  */
-static void replace_first(char *string, char from, char to);
+void replace_first(char *string, char from, char to);
 
 /**
  * @brief Check if a string starts with a prefix.
@@ -89,21 +99,25 @@ static void replace_first(char *string, char from, char to);
  * @param[in] prefix The prefix to check.
  * @param[in] string The string to check.
  * @return true The string starts with the prefix.
- * @return false The string does not start with the prefix or one of the input pointers is NULL.
+ * @return false The string does not start with the prefix or one of the input
+ * pointers is NULL.
  */
-static bool start_with(const char *prefix, const char *string);
+bool start_with(const char *prefix, const char *string);
 
 /**
  * @brief Matches a line of text to a key in the parser's list of keys.
  *
  * @param[in] parser Pointer to the Parser struct.
  * @param[in] line Line of text to match.
- * @param[out] key_finder Pointer to a KeyFinder pointer where the matched key will be stored.
- * @param[out] raw_value Pointer to a char pointer where the value associated with the matched key will be stored.
+ * @param[out] key_finder Pointer to a KeyFinder pointer where the matched key
+ * will be stored.
+ * @param[out] raw_value Pointer to a char pointer where the value associated
+ * with the matched key will be stored.
  *
  * @return Returns 1 if a key is matched, 0 otherwise.
  */
-static unsigned int match(Parser *parser, char *line, KeyFinder **key_finder, char **raw_value);
+unsigned int match(Parser *parser, char *line, KeyFinder **key_finder,
+                   char **raw_value);
 
 /**
 * @brief Reads a line of text from a file stream and stores it in a static
@@ -111,7 +125,8 @@ static unsigned int match(Parser *parser, char *line, KeyFinder **key_finder, ch
 
 * This function reads a line of text from the input stream pointed to by
 * 'stream'. The line of text is stored in a static buffer with a maximum size of
-* PAGE_SIZE. The function updates the pointer pointed to by 'lineptr' to point to
+* PAGE_SIZE. The function updates the pointer pointed to by 'lineptr' to point
+to
 * the buffer containing the line of text. If the line of text is longer than the
 * buffer, the function returns -1. If an error occurs,
 
@@ -123,174 +138,35 @@ static unsigned int match(Parser *parser, char *line, KeyFinder **key_finder, ch
 */
 ssize_t buffer_getline(char **lineptr, FILE *stream);
 
+/**
+ * @brief Parse with the configured parser.
+ *
+ * @param parser the parser.
+ */
+unsigned int parse(Parser *parser);
+
 typedef size_t GenericPointer;
-typedef GenericPointer (CopyAllocator) (char *string);
-typedef void (Setter) (GenericPointer storage, GenericPointer value);
+typedef GenericPointer(CopyAllocator)(char *string);
+typedef void(Setter)(GenericPointer storage, GenericPointer value);
 
 struct KeyFinder {
-    char *key;
-    char *delimiter;
+  char *key;
+  char *delimiter;
 
-    CopyAllocator *copy;
-    Setter *set;
+  CopyAllocator *copy;
+  Setter *set;
 };
 
 struct Parser {
-    GenericPointer storage;
-    unsigned int nb_stored;
-    unsigned int capacity;
-    size_t storage_struct_size;
+  GenericPointer storage;
+  unsigned int nb_stored;
+  unsigned int capacity;
+  size_t storage_struct_size;
 
-    KeyFinder *keys;
-    unsigned int nb_keys;
+  KeyFinder *keys;
+  unsigned int nb_keys;
 
-    FILE *file;
+  FILE *file;
 };
 
-static void set_value(Parser *parser, KeyFinder *key_finder, char *raw_value)
-{
-    GenericPointer address = parser->storage + (parser->storage_struct_size * parser->nb_stored);
-    GenericPointer value = key_finder->copy(raw_value);
-    key_finder->set(address, value);
-}
-
-static unsigned int match(Parser *parser, char *line, KeyFinder **key_finder, char **raw_value)
-{
-    for (unsigned int i = 0; i < parser->nb_keys; i++) {
-        KeyFinder *finder = &parser->keys[i];
-
-        if (start_with(finder->key, line)) {
-            char *value = NULL;
-            char *key = NULL;
-
-            split_on_delimiter(line, finder->delimiter, &key, &value);
-            if ( key == NULL || value == NULL) {
-                return 0;
-            }
-            *key_finder = finder;
-            *raw_value = value;
-            return 1;
-        }
-    }
-    return 0;
-}
-
-static unsigned int move_to_next(Parser *parser)
-{
-    parser->nb_stored += 1;
-    if (parser->nb_stored >= parser->capacity) {
-        return 0;
-    }
-    return 1;
-}
-
-
-#define PAGE_SIZE 4096
-ssize_t buffer_getline(char **lineptr, FILE *stream) {
-    ssize_t num_chars_read = 0;
-    static char buffer[PAGE_SIZE] = {0};
-
-    if (!lineptr || !stream) {
-        return -1;
-    }
-
-    while (1) {
-        int ch = fgetc(stream);
-        if (ch == EOF) {
-            if (num_chars_read == 0) {
-                return -1;
-            } else {
-                break;
-            }
-        }
-
-        if (num_chars_read == PAGE_SIZE - 1) {
-            return -1;
-        }
-
-        buffer[num_chars_read++] = ch;
-        if (ch == '\n') {
-            break;
-        }
-    }
-
-    buffer[num_chars_read] = '\0';
-    *lineptr = buffer;
-
-    return num_chars_read;
-}
-
-
-static unsigned int parse(Parser *parser)
-{
-    char *line = NULL;
-    ssize_t read;
-    unsigned int key_assigned = 0;
-
-    while ((read = buffer_getline(&line, parser->file)) != -1) {
-        if (key_assigned == parser->nb_keys && read > 1) {
-            continue;
-        } else if (read == 1) {
-            if (!move_to_next(parser)) {
-                return 0;
-            }
-            key_assigned = 0;
-        } else {
-            KeyFinder *key_finder = NULL;
-            char *raw_value = NULL;
-            replace_first(line, '\n', '\0');
-            if (match(parser, line, &key_finder, &raw_value)) {
-                set_value(parser, key_finder, raw_value);
-                ++key_assigned;
-            }
-        }
-    }
-    if (key_assigned > 0) {
-        parser->nb_stored++;
-    }
-    return 1;
-}
-
-
-
-static void replace_first(char *string, char from, char to)
-{
-    for (int i = 0; string[i] != '\0'; i++) {
-        if (string[i] == from) {
-            string[i] = to;
-            break;
-        }
-    }
-}
-
-static void split_on_delimiter(char *string, const char *delimiter, char **key, char **value)
-{
-    *key = NULL;
-    *value = NULL;
-    size_t delimiter_len = strlen(delimiter);
-    char *start_delimiter = strstr(string, delimiter);
-    if (start_delimiter != NULL) {
-        *start_delimiter = '\0';
-        *key = string;
-        *value = start_delimiter + delimiter_len;
-    }
-}
-
-static bool start_with(const char *prefix, const char *string)
-{
-    if (prefix == NULL || string == NULL) {
-        return false;
-    }
-
-    size_t prefix_len = strlen(prefix);
-    size_t string_len = strlen(string);
-
-    if (string_len < prefix_len) {
-        return false;
-    } else {
-        return  memcmp(prefix, string, prefix_len) == 0;
-    }
-}
-
 #endif
-
diff --git a/makefile b/makefile
index 3997f40..4dcbce4 100644
--- a/makefile
+++ b/makefile
@@ -3,6 +3,7 @@
 SRC_DIR = src
 DOC_DIR = doc
 OBJ_DIR = obj
+LIB_DIR = lib
 BIN_DIR = bin
 TESTS_DIR = tests
 
@@ -25,8 +26,9 @@ NVML_IFLAGS =
 include ./sensors.mk
 
 OBJ =  \
-	$(CAPTOR_OBJ) \
-	$(OBJ_DIR)/util.o
+	$(OBJ_DIR)/util.o \
+	$(OBJ_DIR)/info_reader.o \
+	$(CAPTOR_OBJ)
 
 options:
 	@echo BIN: $(BIN)
@@ -48,6 +50,9 @@ $(OBJ_DIR)/$(BIN).o: $(SRC_DIR)/$(BIN).c
 $(OBJ_DIR)/util.o: $(SRC_DIR)/util.c $(SRC_DIR)/util.h
 	$(CC) $(CFLAGS) -c $< -o $@
 
+$(OBJ_DIR)/info_reader.o: $(LIB_DIR)/info_reader.c
+	$(CC) $(CFLAGS) -c $< -o $@
+
 $(SRC_DIR)/counters_option.h: $(SRC_DIR)/counters_option.sh
 	sh ./$(SRC_DIR)/counters_option.sh > $(SRC_DIR)/counters_option.h
 
@@ -63,8 +68,8 @@ $(BIN_DIR):
 debug: CFLAGS = $(CPPFLAGS) -DDEBUG -g -Og
 debug: $(BIN)
 
-tests:
-	$(CC) $(CPPFLAGS) $(TESTS_DIR)/main.c $(SRC_DIR)/util.c -o $(TESTS_DIR)/run
+tests: $(OBJ_DIR)/util.o $(OBJ_DIR)/info_reader.o
+	$(CC) $(CPPFLAGS) $(OBJ_DIR)/util.o $(OBJ_DIR)/info_reader.o $(TESTS_DIR)/main.c  -o $(TESTS_DIR)/run
 	$(TESTS_DIR)/run
 
 format:
@@ -80,7 +85,7 @@ clean:
 		$(DOC_DIR)/test_main_ex \
 		$(DOC_DIR)/info_reader_ex
 
-readme: $(BIN)
+readme:
 	sh ./tools/update-readme-usage.sh
 
 man: $(BIN)
diff --git a/src/memory_counters.c b/src/memory_counters.c
index 185f454..8e8e916 100644
--- a/src/memory_counters.c
+++ b/src/memory_counters.c
@@ -10,121 +10,111 @@
 static const char *path = "/proc/meminfo";
 
 typedef struct {
-    KeyFinder *keys;
-    unsigned int count;
-    FILE *file;
+  KeyFinder *keys;
+  unsigned int count;
+  FILE *file;
 } MemoryCounters;
 
-GenericPointer long_allocator(char *s)
-{
-    long value = atol(s);
-    return (GenericPointer)value;
+GenericPointer long_allocator(char *s) {
+  long value = atol(s);
+  return (GenericPointer)value;
 }
 
-KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes)
-{
-    KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
-    for (unsigned int i = 0; i < count; i++) {
-        unsigned int idx = indexes[i];
-        KeyFinder key = {.key = memory_counters[idx],
-                         .delimiter = ":",
-                         .copy = long_allocator,
-                         .set = setter_functions[i]
-                        };
-        memcpy(&keys[i], &key, sizeof(KeyFinder));
-    }
-    return keys;
+KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes) {
+  KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
+  for (unsigned int i = 0; i < count; i++) {
+    unsigned int idx = indexes[i];
+    KeyFinder key = {.key = memory_counters[idx],
+                     .delimiter = ":",
+                     .copy = long_allocator,
+                     .set = setter_functions[i]};
+    memcpy(&keys[i], &key, sizeof(KeyFinder));
+  }
+  return keys;
 }
 
 void memory_list(char *memory_string, unsigned int *count,
-                 unsigned int *indexes)
-{
-    char *token;
-    *count = 0;
-
-    while ((token = strtok(memory_string, ",")) != NULL) {
-        memory_string = NULL;
-
-        unsigned int i;
-        for (i = 0; i < NB_COUNTERS; i++) {
-            if (strcmp(memory_counters[i], token) == 0) {
-                (*count)++;
-                indexes[*count - 1] = i;
-                break;
-            }
-        }
-
-        if (i == NB_COUNTERS) {
-            fprintf(stderr, "Unknown memory counter: %s\n", token);
-            exit(EXIT_FAILURE);
-        }
-
-        if ((*count) > NB_COUNTERS) {
-            fprintf(stderr, "Too much counters, there are probably duplicates\n");
-            exit(EXIT_FAILURE);
-        }
+                 unsigned int *indexes) {
+  char *token;
+  *count = 0;
+
+  while ((token = strtok(memory_string, ",")) != NULL) {
+    memory_string = NULL;
+
+    unsigned int i;
+    for (i = 0; i < NB_COUNTERS; i++) {
+      if (strcmp(memory_counters[i], token) == 0) {
+        (*count)++;
+        indexes[*count - 1] = i;
+        break;
+      }
+    }
+
+    if (i == NB_COUNTERS) {
+      fprintf(stderr, "Unknown memory counter: %s\n", token);
+      exit(EXIT_FAILURE);
     }
+
+    if ((*count) > NB_COUNTERS) {
+      fprintf(stderr, "Too much counters, there are probably duplicates\n");
+      exit(EXIT_FAILURE);
+    }
+  }
 }
 
-unsigned int init_memory_counters(char *args, void **ptr)
-{
-    unsigned int indexes[NB_COUNTERS];
-    unsigned int count = 0;
-    memory_list(args, &count, indexes);
+unsigned int init_memory_counters(char *args, void **ptr) {
+  unsigned int indexes[NB_COUNTERS];
+  unsigned int count = 0;
+  memory_list(args, &count, indexes);
 
-    KeyFinder *keys = build_keyfinder(count, indexes);
-    FILE *file = fopen(path, "r");
+  KeyFinder *keys = build_keyfinder(count, indexes);
+  FILE *file = fopen(path, "r");
 
-    MemoryCounters *counters = calloc(1, sizeof(MemoryCounters));
-    counters->keys = keys;
-    counters->count = count;
-    counters->file = file;
+  MemoryCounters *counters = calloc(1, sizeof(MemoryCounters));
+  counters->keys = keys;
+  counters->count = count;
+  counters->file = file;
 
-    *ptr = (void *)counters;
-    return count;
+  *ptr = (void *)counters;
+  return count;
 }
 
-unsigned int get_memory_counters(uint64_t *results, void *ptr)
-{
-    MemoryCounters *counters = (MemoryCounters *)ptr;
-    fseek(counters->file, 0, SEEK_SET);
-    Parser parser = {.storage = (GenericPointer)results,
-                     .capacity = 1,
-                     .nb_stored = 0,
-                     .storage_struct_size = sizeof(uint64_t) * counters->count,
-                     .keys = counters->keys,
-                     .nb_keys = counters->count,
-                     .file = counters->file
-                    };
-
-    parse(&parser);
-    return counters->count;
+unsigned int get_memory_counters(uint64_t *results, void *ptr) {
+  MemoryCounters *counters = (MemoryCounters *)ptr;
+  fseek(counters->file, 0, SEEK_SET);
+  Parser parser = {.storage = (GenericPointer)results,
+                   .capacity = 1,
+                   .nb_stored = 0,
+                   .storage_struct_size = sizeof(uint64_t) * counters->count,
+                   .keys = counters->keys,
+                   .nb_keys = counters->count,
+                   .file = counters->file};
+
+  parse(&parser);
+  return counters->count;
 }
 
-void label_memory_counters(char **labels, void *ptr)
-{
-    MemoryCounters *counters = (MemoryCounters *)ptr;
-    for (unsigned int i = 0; i < counters->count; i++) {
-        labels[i] = counters->keys[i].key;
-    }
+void label_memory_counters(char **labels, void *ptr) {
+  MemoryCounters *counters = (MemoryCounters *)ptr;
+  for (unsigned int i = 0; i < counters->count; i++) {
+    labels[i] = counters->keys[i].key;
+  }
 }
 
-void clean_memory_counters(void *ptr)
-{
-    MemoryCounters *counters = (MemoryCounters *)ptr;
-    fclose(counters->file);
-    free(counters->keys);
-    free(ptr);
+void clean_memory_counters(void *ptr) {
+  MemoryCounters *counters = (MemoryCounters *)ptr;
+  fclose(counters->file);
+  free(counters->keys);
+  free(ptr);
 }
 
-void *show_all_memory_counters(void *none1, size_t none2)
-{
-    for (unsigned int i = 0; i < NB_COUNTERS; i++) {
-        printf("%s\n", memory_counters[i]);
-    }
+void *show_all_memory_counters(void *none1, size_t none2) {
+  for (unsigned int i = 0; i < NB_COUNTERS; i++) {
+    printf("%s\n", memory_counters[i]);
+  }
 
-    UNUSED(none1);
-    UNUSED(none2);
-    exit(EXIT_SUCCESS);
-    return NULL; /* not reached */
+  UNUSED(none1);
+  UNUSED(none2);
+  exit(EXIT_SUCCESS);
+  return NULL; /* not reached */
 }
-- 
GitLab


From 079b25060bce14922749bc006e2dd8b08486baa1 Mon Sep 17 00:00:00 2001
From: FlorealRISSO <floreal.risso@univ-tlse3.fr>
Date: Thu, 20 Apr 2023 10:15:52 +0200
Subject: [PATCH 16/16] format

---
 doc/info_reader_ex.c  |  85 +++++++++++++-------
 src/memory_counters.c | 180 ++++++++++++++++++++++--------------------
 2 files changed, 152 insertions(+), 113 deletions(-)

diff --git a/doc/info_reader_ex.c b/doc/info_reader_ex.c
index f1e6d96..d99e916 100644
--- a/doc/info_reader_ex.c
+++ b/doc/info_reader_ex.c
@@ -18,8 +18,10 @@
 
 *******************************************************/
 
+// ~/mojitos/doc/$ gcc -Wall -Wextra -Wpedantic -O3 -o info_reader_ex
+// info_reader_ex.c ./../src/util.c && ./info_reader_ex
 
-// ~/mojitos/doc/$ gcc -Wall -Wextra -Wpedantic -O3 -o info_reader_ex info_reader_ex.c ./../src/util.c && ./info_reader_ex
+#include "./../lib/info_reader.c"
 #include "./../lib/info_reader.h"
 
 #define MAX_PROCS 64
@@ -40,7 +42,7 @@ typedef struct {
 GenericPointer int_allocator(char *s)
 {
     unsigned int value = atoi(s);
-    return (GenericPointer) value;
+    return (GenericPointer)value;
 }
 
 // -- Define the behaviour if the attempted value is a string
@@ -48,49 +50,49 @@ GenericPointer string_allocator(char *s)
 {
     char *value = malloc(strlen(s) + 1);
     strcpy(value, s);
-    return (GenericPointer) value;
+    return (GenericPointer)value;
 }
 
 // -- Define the processor setter
 void set_processor(GenericPointer storage, GenericPointer data)
 {
-    Cpu *cpu = (Cpu *) storage;
+    Cpu *cpu = (Cpu *)storage;
     cpu->processor = data;
 }
 
 // -- Define the vendor_id setter
 void set_vendor_id(GenericPointer storage, GenericPointer data)
 {
-    Cpu *cpu = (Cpu *) storage;
-    cpu->vendor_id = (char *) data;
+    Cpu *cpu = (Cpu *)storage;
+    cpu->vendor_id = (char *)data;
 }
 
 // -- Define the family setter
 void set_family(GenericPointer storage, GenericPointer data)
 {
-    Cpu *cpu = (Cpu *) storage;
+    Cpu *cpu = (Cpu *)storage;
     cpu->family = data;
 }
 
 // -- Define the core_id setter
 void set_core_id(GenericPointer storage, GenericPointer data)
 {
-    Cpu *cpu = (Cpu *) storage;
+    Cpu *cpu = (Cpu *)storage;
     cpu->core_id = data;
 }
 
 // -- Define the physical_id setter
 void set_physical_id(GenericPointer storage, GenericPointer data)
 {
-    Cpu *cpu = (Cpu *) storage;
+    Cpu *cpu = (Cpu *)storage;
     cpu->physical_id = data;
 }
 
 // -- Define the model_name setter
 void set_model_name(GenericPointer storage, GenericPointer data)
 {
-    Cpu *cpu = (Cpu *) storage;
-    cpu->model_name = (char *) data;
+    Cpu *cpu = (Cpu *)storage;
+    cpu->model_name = (char *)data;
 }
 
 int main()
@@ -98,26 +100,54 @@ int main()
     Cpu cpus[MAX_PROCS];
 
     // -- Define the setter, the allocator for each key / separator.
-    KeyFinder keys[] = {
-        {.key = "processor", .delimiter = ": ", .copy = (CopyAllocator *) int_allocator, .set = (Setter *)set_processor},
-        {.key = "vendor_id", .delimiter = ": ", .copy = (CopyAllocator *) string_allocator, .set = (Setter *)set_vendor_id},
-        {.key = "cpu family", .delimiter = ": ", .copy = (CopyAllocator *) int_allocator, .set = (Setter *)set_family},
-        {.key = "core id", .delimiter = ": ", .copy = (CopyAllocator *) int_allocator, .set = (Setter *)set_core_id},
-        {.key = "physical id", .delimiter = ": ", .copy = (CopyAllocator *) int_allocator, .set = (Setter *)set_physical_id},
-        {.key = "model name", .delimiter = ": ", .copy = (CopyAllocator *) string_allocator, .set = (Setter *)set_model_name}
+    KeyFinder keys[] = {{
+            .key = "processor",
+            .delimiter = ": ",
+            .copy = (CopyAllocator *)int_allocator,
+            .set = (Setter *)set_processor
+        },
+        {
+            .key = "vendor_id",
+            .delimiter = ": ",
+            .copy = (CopyAllocator *)string_allocator,
+            .set = (Setter *)set_vendor_id
+        },
+        {
+            .key = "cpu family",
+            .delimiter = ": ",
+            .copy = (CopyAllocator *)int_allocator,
+            .set = (Setter *)set_family
+        },
+        {
+            .key = "core id",
+            .delimiter = ": ",
+            .copy = (CopyAllocator *)int_allocator,
+            .set = (Setter *)set_core_id
+        },
+        {
+            .key = "physical id",
+            .delimiter = ": ",
+            .copy = (CopyAllocator *)int_allocator,
+            .set = (Setter *)set_physical_id
+        },
+        {
+            .key = "model name",
+            .delimiter = ": ",
+            .copy = (CopyAllocator *)string_allocator,
+            .set = (Setter *)set_model_name
+        }
     };
 
-    size_t nb_keys = sizeof(keys)/sizeof(KeyFinder);
+    size_t nb_keys = sizeof(keys) / sizeof(KeyFinder);
 
     // -- Init the parser
-    Parser parser = {
-        .storage = (GenericPointer) cpus,
-        .capacity = MAX_PROCS,
-        .storage_struct_size = sizeof(Cpu),
-        .keys = keys,
-        .nb_keys = nb_keys,
-        .file = fopen("/proc/cpuinfo", "r")
-    };
+    Parser parser = {.storage = (GenericPointer)cpus,
+                     .capacity = MAX_PROCS,
+                     .storage_struct_size = sizeof(Cpu),
+                     .keys = keys,
+                     .nb_keys = nb_keys,
+                     .file = fopen("/proc/cpuinfo", "r")
+                    };
 
     // -- Parse the file
     parse(&parser);
@@ -137,4 +167,3 @@ int main()
     printf("==============================\n");
     return 0;
 }
-
diff --git a/src/memory_counters.c b/src/memory_counters.c
index 8e8e916..185f454 100644
--- a/src/memory_counters.c
+++ b/src/memory_counters.c
@@ -10,111 +10,121 @@
 static const char *path = "/proc/meminfo";
 
 typedef struct {
-  KeyFinder *keys;
-  unsigned int count;
-  FILE *file;
+    KeyFinder *keys;
+    unsigned int count;
+    FILE *file;
 } MemoryCounters;
 
-GenericPointer long_allocator(char *s) {
-  long value = atol(s);
-  return (GenericPointer)value;
+GenericPointer long_allocator(char *s)
+{
+    long value = atol(s);
+    return (GenericPointer)value;
 }
 
-KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes) {
-  KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
-  for (unsigned int i = 0; i < count; i++) {
-    unsigned int idx = indexes[i];
-    KeyFinder key = {.key = memory_counters[idx],
-                     .delimiter = ":",
-                     .copy = long_allocator,
-                     .set = setter_functions[i]};
-    memcpy(&keys[i], &key, sizeof(KeyFinder));
-  }
-  return keys;
+KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes)
+{
+    KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder));
+    for (unsigned int i = 0; i < count; i++) {
+        unsigned int idx = indexes[i];
+        KeyFinder key = {.key = memory_counters[idx],
+                         .delimiter = ":",
+                         .copy = long_allocator,
+                         .set = setter_functions[i]
+                        };
+        memcpy(&keys[i], &key, sizeof(KeyFinder));
+    }
+    return keys;
 }
 
 void memory_list(char *memory_string, unsigned int *count,
-                 unsigned int *indexes) {
-  char *token;
-  *count = 0;
-
-  while ((token = strtok(memory_string, ",")) != NULL) {
-    memory_string = NULL;
-
-    unsigned int i;
-    for (i = 0; i < NB_COUNTERS; i++) {
-      if (strcmp(memory_counters[i], token) == 0) {
-        (*count)++;
-        indexes[*count - 1] = i;
-        break;
-      }
-    }
-
-    if (i == NB_COUNTERS) {
-      fprintf(stderr, "Unknown memory counter: %s\n", token);
-      exit(EXIT_FAILURE);
+                 unsigned int *indexes)
+{
+    char *token;
+    *count = 0;
+
+    while ((token = strtok(memory_string, ",")) != NULL) {
+        memory_string = NULL;
+
+        unsigned int i;
+        for (i = 0; i < NB_COUNTERS; i++) {
+            if (strcmp(memory_counters[i], token) == 0) {
+                (*count)++;
+                indexes[*count - 1] = i;
+                break;
+            }
+        }
+
+        if (i == NB_COUNTERS) {
+            fprintf(stderr, "Unknown memory counter: %s\n", token);
+            exit(EXIT_FAILURE);
+        }
+
+        if ((*count) > NB_COUNTERS) {
+            fprintf(stderr, "Too much counters, there are probably duplicates\n");
+            exit(EXIT_FAILURE);
+        }
     }
-
-    if ((*count) > NB_COUNTERS) {
-      fprintf(stderr, "Too much counters, there are probably duplicates\n");
-      exit(EXIT_FAILURE);
-    }
-  }
 }
 
-unsigned int init_memory_counters(char *args, void **ptr) {
-  unsigned int indexes[NB_COUNTERS];
-  unsigned int count = 0;
-  memory_list(args, &count, indexes);
+unsigned int init_memory_counters(char *args, void **ptr)
+{
+    unsigned int indexes[NB_COUNTERS];
+    unsigned int count = 0;
+    memory_list(args, &count, indexes);
 
-  KeyFinder *keys = build_keyfinder(count, indexes);
-  FILE *file = fopen(path, "r");
+    KeyFinder *keys = build_keyfinder(count, indexes);
+    FILE *file = fopen(path, "r");
 
-  MemoryCounters *counters = calloc(1, sizeof(MemoryCounters));
-  counters->keys = keys;
-  counters->count = count;
-  counters->file = file;
+    MemoryCounters *counters = calloc(1, sizeof(MemoryCounters));
+    counters->keys = keys;
+    counters->count = count;
+    counters->file = file;
 
-  *ptr = (void *)counters;
-  return count;
+    *ptr = (void *)counters;
+    return count;
 }
 
-unsigned int get_memory_counters(uint64_t *results, void *ptr) {
-  MemoryCounters *counters = (MemoryCounters *)ptr;
-  fseek(counters->file, 0, SEEK_SET);
-  Parser parser = {.storage = (GenericPointer)results,
-                   .capacity = 1,
-                   .nb_stored = 0,
-                   .storage_struct_size = sizeof(uint64_t) * counters->count,
-                   .keys = counters->keys,
-                   .nb_keys = counters->count,
-                   .file = counters->file};
-
-  parse(&parser);
-  return counters->count;
+unsigned int get_memory_counters(uint64_t *results, void *ptr)
+{
+    MemoryCounters *counters = (MemoryCounters *)ptr;
+    fseek(counters->file, 0, SEEK_SET);
+    Parser parser = {.storage = (GenericPointer)results,
+                     .capacity = 1,
+                     .nb_stored = 0,
+                     .storage_struct_size = sizeof(uint64_t) * counters->count,
+                     .keys = counters->keys,
+                     .nb_keys = counters->count,
+                     .file = counters->file
+                    };
+
+    parse(&parser);
+    return counters->count;
 }
 
-void label_memory_counters(char **labels, void *ptr) {
-  MemoryCounters *counters = (MemoryCounters *)ptr;
-  for (unsigned int i = 0; i < counters->count; i++) {
-    labels[i] = counters->keys[i].key;
-  }
+void label_memory_counters(char **labels, void *ptr)
+{
+    MemoryCounters *counters = (MemoryCounters *)ptr;
+    for (unsigned int i = 0; i < counters->count; i++) {
+        labels[i] = counters->keys[i].key;
+    }
 }
 
-void clean_memory_counters(void *ptr) {
-  MemoryCounters *counters = (MemoryCounters *)ptr;
-  fclose(counters->file);
-  free(counters->keys);
-  free(ptr);
+void clean_memory_counters(void *ptr)
+{
+    MemoryCounters *counters = (MemoryCounters *)ptr;
+    fclose(counters->file);
+    free(counters->keys);
+    free(ptr);
 }
 
-void *show_all_memory_counters(void *none1, size_t none2) {
-  for (unsigned int i = 0; i < NB_COUNTERS; i++) {
-    printf("%s\n", memory_counters[i]);
-  }
+void *show_all_memory_counters(void *none1, size_t none2)
+{
+    for (unsigned int i = 0; i < NB_COUNTERS; i++) {
+        printf("%s\n", memory_counters[i]);
+    }
 
-  UNUSED(none1);
-  UNUSED(none2);
-  exit(EXIT_SUCCESS);
-  return NULL; /* not reached */
+    UNUSED(none1);
+    UNUSED(none2);
+    exit(EXIT_SUCCESS);
+    return NULL; /* not reached */
 }
-- 
GitLab