dynamic-layout.diff
author Myhailo Danylenko <isbear@ukrpost.net>
Sat, 07 Nov 2015 17:39:49 +0200
changeset 88 0a87df8ad9c1
parent 42 0ee5e9903fa1
permissions -rw-r--r--
Refresh queue for new mcabber

# HG changeset patch
# Parent ebe29230ffb5572d2c37ab811d34ae970d6293ca
[work-in-progress] Allow user to specify top to bottom window order

diff -r ebe29230ffb5 mcabber/mcabber/utils.c
--- a/mcabber/mcabber/utils.c	Wed Aug 01 23:44:09 2012 +0300
+++ b/mcabber/mcabber/utils.c	Fri Aug 03 14:35:36 2012 +0300
@@ -650,6 +650,42 @@
   g_free(arglst);
 }
 
+//  parse_list(arg, cb, udata)
+// Calls cb for every element in space/semicolon/comma-separated list.
+// Designed to work in-place, so, no escapes, quoting etc.
+// Terminates parsing if callback returns false.
+void parse_list(const char *arg, parse_list_cb_t cb, void *udata)
+{
+  const char *p, *start;
+  enum {
+    in_space,
+    in_string,
+  } state;
+
+  if (!arg) 
+    return;
+
+  state = in_space;
+  while ( *p ) {
+    if ( *p == ' ' || *p == ';' || *p == ',' ) {
+      if ( state == in_string ) {
+        if ( ! cb ( start, p, udata ) )
+          return;
+        state = in_space;
+      }
+    } else {
+      if ( state == in_space ) {
+        start = p;
+        state = in_string;
+      }
+    }
+    p ++;
+  }
+
+  if ( state == in_string )
+    cb ( start, p, udata );
+}
+
 //  replace_nl_with_dots(bufstr)
 // Replace '\n' with "(...)" (or with a NUL if the string is too short)
 void replace_nl_with_dots(char *bufstr)
diff -r ebe29230ffb5 mcabber/mcabber/utils.h
--- a/mcabber/mcabber/utils.h	Wed Aug 01 23:44:09 2012 +0300
+++ b/mcabber/mcabber/utils.h	Fri Aug 03 14:35:36 2012 +0300
@@ -43,6 +43,11 @@
 char **split_arg(const char *arg, unsigned int n, int dontstriplast);
 void free_arg_lst(char **arglst);
 
+/* fast in-place string split on space/semicolon/comma
+ * stops processing if callback returns false value */
+typedef int (*parse_list_cb_t)(const char *start, const char *end, void *udata);
+void parse_list(const char *arg, parse_list_cb_t cb, void *udata);
+
 void replace_nl_with_dots(char *bufstr);
 char *ut_expand_tabs(const char *text);