X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=misc.c;h=d49980cf5f851c21836b3965c28014579ba16b8f;hb=refs%2Fheads%2Fexperimental;hp=c8d0d73ea3c75af259671504c2d7f41095123a94;hpb=addc54efb596b39b0e4e6ce219ee0f1506337475;p=pkg%2Fabook.git diff --git a/misc.c b/misc.c index c8d0d73..d49980c 100644 --- a/misc.c +++ b/misc.c @@ -1,6 +1,6 @@ /* - * $Id: misc.c,v 1.19 2005/08/11 07:32:35 jheinonen Exp $ + * $Id: misc.c,v 1.23 2006/09/04 18:29:25 cduval Exp $ * * by JH * @@ -18,9 +18,8 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#ifdef HANDLE_MULTIBYTE -# include -#endif +#include +#include "abook.h" #include "misc.h" #include "xmalloc.h" @@ -65,6 +64,19 @@ strtrim(char *s) return s; } +int +is_number(char *p) +{ + if(!p || !*p || (*p == '-' && !*++p)) + return 0; + + for(; *p; p++) + if(!isdigit(*p)) + return 0; + + return 1; +} + #ifdef HAVE_CONFIG_H # include "config.h" @@ -82,7 +94,7 @@ strtrim(char *s) #endif char * -mkstr (const char *format, ... ) +strdup_printf (const char *format, ... ) { MY_VA_LOCAL_DECL; size_t size = 100; @@ -274,11 +286,7 @@ int strwidth(const char *s) { assert(s); -#ifdef HANDLE_MULTIBYTE - return (int)mbswidth(s, 0); -#else - return strlen(s); -#endif + return mbswidth(s, 0); } int @@ -1082,3 +1090,189 @@ int main (void) #endif /* SNPRINTF_TEST */ #endif /* !HAVE_SNPRINTF */ + + + + +/* + * List handling functions + */ + +void +abook_list_append(abook_list **list, char *str) +{ + abook_list *tmp; + + if(!str) + return; + + for(tmp = *list; tmp && tmp->next; tmp = tmp->next) + ; + + if(tmp) { + tmp->next = xmalloc(sizeof(abook_list)); + tmp = tmp->next; + } else + tmp = *list = xmalloc(sizeof(abook_list)); + + tmp->data = xstrdup(str); + tmp->next = NULL; +} + +void +abook_list_free(abook_list **list) +{ + abook_list *prev = NULL, *tmp = *list; + + if(!list) + return; + + while(tmp) { + xfree(tmp->data); + prev = tmp; + tmp = tmp->next; + xfree(prev); + } + + *list = NULL; +} + +abook_list * +csv_to_abook_list(char *str) +{ + char *start, *p = str, *end; + abook_list *list = NULL; + + if(!str) + return NULL; + + SKIPWS(p); + start = end = p; + + while(*p) { + if(!strchr(", ", *p)) { + end = ++p; + continue; + } + + if((*p == ',') && (end - start)) { + abook_list_append(&list, xstrndup(start, end - start)); + p++; + SKIPWS(p); + start = end = p; + continue; + } + + p++; + } + if(end - start) + abook_list_append(&list, xstrndup(start, end - start)); + + return list; +} + +char * +abook_list_to_csv(abook_list *list) +{ + abook_list *tmp; + char *res = NULL; + + for(tmp = list; tmp; tmp = tmp->next) { + if(tmp == list) + res = xstrdup(tmp->data); + else { + res = xrealloc(res, strlen(res)+strlen(tmp->data)+2); + strcat(res, ","); + strcat(res, tmp->data); + } + } + + return res; +} + +void +abook_list_rotate(abook_list **list, enum rotate_dir dir) +{ + abook_list *tmp = *list; + + if(!tmp || !tmp->next) + return; + + switch(dir) { + case ROTATE_LEFT: + for(; tmp && tmp->next; tmp = tmp->next) + ; + + tmp->next = *list; + tmp = *list; + *list = (*list)->next; + tmp->next = NULL; + break; + case ROTATE_RIGHT: + for(; tmp && tmp->next && tmp->next->next; + tmp = tmp->next) + ; + + tmp->next->next = *list; + *list = tmp->next; + tmp->next = NULL; + break; + default: + assert(0); + } +} + +/* if str == NULL, deleting the list element */ +void +abook_list_replace(abook_list **list, int index, char *str) +{ + abook_list *cur, *prev; + int i = 0; + + cur = prev = *list; + + if((index == 0) && !str) { + *list = cur->next; + free(cur->data); + free(cur); + return; + } + + while(1) { + if(!cur) + return; + + if(i == index) + break; + + prev = cur; + cur = cur->next; + i++; + } + + if(str) { + free(cur->data); + cur->data = xstrdup(str); + } else { + prev->next = cur->next; + free(cur->data); + free(cur); + } +} + +abook_list * +abook_list_get(abook_list *list, int index) +{ + int i = 0; + + while(1) { + if(!list) + return NULL; + + if(i == index) + return list; + + i++; + list = list->next; + } +}