X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=common%2Futils.c;h=5db9c58922e32d05dbda4e0b57e1b0b9a6fa8889;hb=f5018426d1d10585f5093cecc506c5867f56b8c1;hp=701f1621f4c7381b7b511aee331ba4e9c0fe4ffd;hpb=ffb8ed40b1aefe37a0f1d1b2d7c3bef9eb8e2cbc;p=doldaconnect.git diff --git a/common/utils.c b/common/utils.c index 701f162..5db9c58 100644 --- a/common/utils.c +++ b/common/utils.c @@ -29,7 +29,6 @@ #include #include #include -#include #ifdef HAVE_CONFIG_H #include @@ -37,6 +36,15 @@ #include #include +struct treeiter { + struct { + struct btree *n; + int s; + } *st; + size_t stsize; + int sp; +}; + static char *base64set = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static int base64rev[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -409,34 +417,13 @@ double ntime(void) return((double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0)); } -int wcsexists(wchar_t *h, wchar_t *n) +wchar_t *wcslower(wchar_t *wcs) { - int i, o, nl, hl; - wchar_t *ln, *lh; + wchar_t *p; - ln = alloca(sizeof(*ln) * (nl = wcslen(n))); - for(i = 0; i < nl; i++) - ln[i] = towlower(n[i]); - lh = alloca(sizeof(*lh) * (hl = wcslen(h))); - if(nl > hl) - return(0); - for(i = 0; i < nl; i++) - lh[i] = towlower(h[i]); - i = 0; - while(1) - { - for(o = 0; o < nl; o++) - { - if(lh[i + o] != ln[o]) - break; - } - if(o == nl) - return(1); - if(i == hl - nl) - return(0); - lh[i + nl] = towlower(h[i + nl]); - i++; - } + for(p = wcs; *p != L'\0'; p++) + *p = towlower(*p); + return(wcs); } #ifndef HAVE_WCSCASECMP @@ -1030,3 +1017,93 @@ void *btreeget(struct btree *tree, void *key, int (*cmp)(void *, void *)) } } +void btreefree(struct btree *tree) +{ + if(tree == NULL) + return; + btreefree(tree->l); + btreefree(tree->r); + free(tree); +} + +static void *btreenext(void **iterp) +{ + struct treeiter *iter; + int s; + struct btree *n; + + if((iter = *iterp) == NULL) + return(NULL); + while(1) { + s = iter->st[iter->sp].s; + n = iter->st[iter->sp].n; + if(s == 0) { + iter->st[iter->sp].s = 1; + if(n->l != NULL) { + iter->sp++; + sizebuf2(iter->st, iter->sp + 1, 1); + iter->st[iter->sp].s = 0; + iter->st[iter->sp].n = n->l; + } + } else if(s == 1) { + iter->st[iter->sp].s = 2; + return(iter->st[iter->sp].n->d); + } else if(s == 2) { + iter->st[iter->sp].s = 3; + if(n->r != NULL) { + iter->sp++; + sizebuf2(iter->st, iter->sp + 1, 1); + iter->st[iter->sp].s = 0; + iter->st[iter->sp].n = n->r; + } + } else { + iter->sp--; + if(iter->sp < 0) { + free(iter->st); + free(iter); + *iterp = NULL; + return(NULL); + } + } + } +} + +static void *btreefirst(struct btree *tree, void **iterp) +{ + struct treeiter *iter; + + if(tree == NULL) { + *iterp = NULL; + return(NULL); + } + *iterp = iter = memset(smalloc(sizeof(*iter)), 0, sizeof(*iter)); + sizebuf2(iter->st, 1, 1); + iter->st[0].n = tree; + iter->st[0].s = 0; + return(btreenext(iterp)); +} + +static void btreestop(void **iterp) +{ + struct treeiter *iter; + + if((iter = *iterp) == NULL) + return; + if(iter->st != NULL) + free(iter->st); + free(iter); + *iterp = NULL; +} + +void *btreeiter(struct btree *tree) +{ + static void *iter = NULL; + + if(tree == NULL) { + return(btreenext(&iter)); + } else { + if(iter != NULL) + btreestop(&iter); + return(btreefirst(tree, &iter)); + } +}