dynamic-layout.diff
changeset 42 0ee5e9903fa1
equal deleted inserted replaced
41:446ad24e6187 42:0ee5e9903fa1
       
     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