|
1 # HG changeset patch |
|
2 # Parent ebe29230ffb5572d2c37ab811d34ae970d6293ca |
|
3 [work-in-progress] Allow user to specify top to bottom window order |
|
4 |
|
5 diff -r ebe29230ffb5 mcabber/mcabber/utils.c |
|
6 --- a/mcabber/mcabber/utils.c Wed Aug 01 23:44:09 2012 +0300 |
|
7 +++ b/mcabber/mcabber/utils.c Fri Aug 03 14:35:36 2012 +0300 |
|
8 @@ -650,6 +650,42 @@ |
|
9 g_free(arglst); |
|
10 } |
|
11 |
|
12 +// parse_list(arg, cb, udata) |
|
13 +// Calls cb for every element in space/semicolon/comma-separated list. |
|
14 +// Designed to work in-place, so, no escapes, quoting etc. |
|
15 +// Terminates parsing if callback returns false. |
|
16 +void parse_list(const char *arg, parse_list_cb_t cb, void *udata) |
|
17 +{ |
|
18 + const char *p, *start; |
|
19 + enum { |
|
20 + in_space, |
|
21 + in_string, |
|
22 + } state; |
|
23 + |
|
24 + if (!arg) |
|
25 + return; |
|
26 + |
|
27 + state = in_space; |
|
28 + while ( *p ) { |
|
29 + if ( *p == ' ' || *p == ';' || *p == ',' ) { |
|
30 + if ( state == in_string ) { |
|
31 + if ( ! cb ( start, p, udata ) ) |
|
32 + return; |
|
33 + state = in_space; |
|
34 + } |
|
35 + } else { |
|
36 + if ( state == in_space ) { |
|
37 + start = p; |
|
38 + state = in_string; |
|
39 + } |
|
40 + } |
|
41 + p ++; |
|
42 + } |
|
43 + |
|
44 + if ( state == in_string ) |
|
45 + cb ( start, p, udata ); |
|
46 +} |
|
47 + |
|
48 // replace_nl_with_dots(bufstr) |
|
49 // Replace '\n' with "(...)" (or with a NUL if the string is too short) |
|
50 void replace_nl_with_dots(char *bufstr) |
|
51 diff -r ebe29230ffb5 mcabber/mcabber/utils.h |
|
52 --- a/mcabber/mcabber/utils.h Wed Aug 01 23:44:09 2012 +0300 |
|
53 +++ b/mcabber/mcabber/utils.h Fri Aug 03 14:35:36 2012 +0300 |
|
54 @@ -43,6 +43,11 @@ |
|
55 char **split_arg(const char *arg, unsigned int n, int dontstriplast); |
|
56 void free_arg_lst(char **arglst); |
|
57 |
|
58 +/* fast in-place string split on space/semicolon/comma |
|
59 + * stops processing if callback returns false value */ |
|
60 +typedef int (*parse_list_cb_t)(const char *start, const char *end, void *udata); |
|
61 +void parse_list(const char *arg, parse_list_cb_t cb, void *udata); |
|
62 + |
|
63 void replace_nl_with_dots(char *bufstr); |
|
64 char *ut_expand_tabs(const char *text); |
|
65 |