]> git.sur5r.net Git - i3/i3/blobdiff - libi3/format_placeholders.c
Move title_format from window to container.
[i3/i3] / libi3 / format_placeholders.c
diff --git a/libi3/format_placeholders.c b/libi3/format_placeholders.c
new file mode 100644 (file)
index 0000000..825cab5
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
+ *
+ */
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "libi3.h"
+
+#ifndef STARTS_WITH
+#define STARTS_WITH(string, needle) (strncasecmp((string), (needle), strlen((needle))) == 0)
+#endif
+
+/*
+ * Replaces occurences of the defined placeholders in the format string.
+ *
+ */
+char *format_placeholders(char *format, placeholder_t *placeholders, int num) {
+    if (format == NULL)
+        return NULL;
+
+    /* We have to first iterate over the string to see how much buffer space
+     * we need to allocate. */
+    int buffer_len = strlen(format) + 1;
+    for (char *walk = format; *walk != '\0'; walk++) {
+        for (int i = 0; i < num; i++) {
+            if (!STARTS_WITH(walk, placeholders[i].name))
+                continue;
+
+            buffer_len = buffer_len - strlen(placeholders[i].name) + strlen(placeholders[i].value);
+            walk += strlen(placeholders[i].name) - 1;
+            break;
+        }
+    }
+
+    /* Now we can parse the format string. */
+    char buffer[buffer_len];
+    char *outwalk = buffer;
+    for (char *walk = format; *walk != '\0'; walk++) {
+        if (*walk != '%') {
+            *(outwalk++) = *walk;
+            continue;
+        }
+
+        bool matched = false;
+        for (int i = 0; i < num; i++) {
+            if (!STARTS_WITH(walk, placeholders[i].name)) {
+                continue;
+            }
+
+            matched = true;
+            outwalk += sprintf(outwalk, "%s", placeholders[i].value);
+            walk += strlen(placeholders[i].name) - 1;
+            break;
+        }
+
+        if (!matched)
+            *(outwalk++) = *walk;
+    }
+
+    *outwalk = '\0';
+    return sstrdup(buffer);
+}