diff --git a/meminfo_option.sh b/meminfo_option.sh
new file mode 100644
index 0000000000000000000000000000000000000000..444386811712d4fd3bd44a8dfd3224d996de64e2
--- /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 0000000000000000000000000000000000000000..f3369b8e5962d4db7deed234988887604b779675
--- /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 0000000000000000000000000000000000000000..f6168709f734688a87aacd807e3b7a0295f5b579
--- /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;
+}