This patch cleans up ecore_config lib a bit..

- remove timeout_* in favour of ecore_timer_*
- goto no more
- delete unused "eslist", hash and other code

esprintf could be replaced by asprintf, but probably wouldn't be as portable.

Cheers,
--
Morten
:wq
Index: src/lib/ecore_config/ecore_config_ipc_main.c
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/ecore_config_ipc_main.c,v
retrieving revision 1.6
diff -u -r1.6 ecore_config_ipc_main.c
--- src/lib/ecore_config/ecore_config_ipc_main.c        18 Sep 2005 12:25:57 
-0000      1.6
+++ src/lib/ecore_config/ecore_config_ipc_main.c        23 Dec 2005 03:32:19 
-0000
@@ -1,6 +1,7 @@
 /* ############## bad */
 #define HAVE_EVAS2
 
+#include "Ecore.h"
 #include "Ecore_Config.h"
 #include "ecore_config_util.h"
 #include "ecore_config_ipc.h"
@@ -18,7 +19,7 @@
 #include <stdlib.h>            /* malloc(), free() */
 
 static Ecore_Config_Server *__ecore_config_servers;
-static unsigned long ipc_timer = 0L;
+Ecore_Timer *ipc_timer = NULL;
 
 extern int _ecore_config_ipc_ecore_init(const char *pipe_name, void **data);
 extern int _ecore_config_ipc_ecore_exit(void **data);
@@ -232,7 +233,8 @@
    Ecore_Config_Server *l;
 
    if (ipc_timer)
-      timeout_remove(ipc_timer);
+      ecore_timer_del(ipc_timer);
+
    l = __ecore_config_servers;
    while (l)
      {
@@ -272,7 +274,7 @@
      ret_srv = list;
 
    if (!ipc_timer)
-     ipc_timer = timeout_add(100, _ecore_config_ipc_poll, NULL);
+     ipc_timer = ecore_timer_add(100, _ecore_config_ipc_poll, NULL);
    
    return ret_srv;
 }
Index: src/lib/ecore_config/ecore_config_util.c
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/ecore_config_util.c,v
retrieving revision 1.2
diff -u -r1.2 ecore_config_util.c
--- src/lib/ecore_config/ecore_config_util.c    2 Mar 2005 07:06:34 -0000       
1.2
+++ src/lib/ecore_config/ecore_config_util.c    23 Dec 2005 03:32:19 -0000
@@ -1,20 +1,10 @@
 /* azundris */
 
-/*#include <glib.h>*/
-
 #include <sys/types.h>
-#include <sys/time.h>          /* gimetimeofday() */
-#include <stdio.h>             /* NULL */
 #include <stdlib.h>            /* malloc(), free() */
 #include <string.h>            /* str...() */
-#include <ctype.h>             /* isspace() */
-
-#include <stdarg.h>            /* varargs in dlmulti() */
-#include <dlfcn.h>             /* dlopen() and friends for dlmulti() */
 
-/* #ifdef HAVE_GLIB2 */
-/* #  include <glib/gmain.h> */
-/* #endif */
+#include <stdarg.h>            /* varargs in sprintf/appendf */
 
 #include "ecore_private.h"
 
@@ -23,467 +13,12 @@
 
 #include "ecore_config_private.h"
 
-#define CHUNKLEN 4096
-
-/*****************************************************************************/
-/* MISC */
-/********/
-
-int
-dlmulti(const char *name, const char *file, int flag, void **libr, const char 
*fmt, ...)
-{
-#define MAX_SYM_LEN 256
-   va_list             ap;
-   void               *lib;
-   int                 ret = ECORE_CONFIG_ERR_SUCC;
-   char                buf[MAX_SYM_LEN] = "\0";
-
-   if (!libr)
-      return ECORE_CONFIG_ERR_FAIL;
-
-   if (!name)
-      name = file;
-
-   *libr = NULL;
-
-   if ((lib = dlopen(file, flag)))
-     {
-       void              **funr, *fun;
-       char               *b, *e;
-       size_t              l;
-       int                 required = 1;
-
-       va_start(ap, fmt);
-       while (*fmt)
-         {
-            switch (*fmt)
-              {
-              case '?':
-                 required = 0;
-                 fmt++;
-                 break;
-
-              case '!':
-              case '.':
-                 required = 1;
-                 fmt++;
-                 break;
-
-              case '\t':
-              case '\n':
-              case '\r':
-              case ';':
-              case ',':
-              case ' ':
-                 fmt++;
-                 break;
-
-              default:
-                 e = b = (char *)fmt;
-                 while (*e && (strchr("?!.,; \t\n\r", *e) == NULL))
-                    e++;
-
-                 fmt = e;
-                 if (e == b)
-                    ret = ECORE_CONFIG_ERR_NODATA;
-                 else if ((l = (e - b)) >= MAX_SYM_LEN)
-                    ret = ECORE_CONFIG_ERR_OOM;
-                 else
-                   {
-                      memcpy(buf, b, l);
-                      buf[l] = '\0';
-                      funr = va_arg(ap, void **);
-
-                      if (!(fun = dlsym(lib, buf)))
-                        {
-                           if ((ret =
-                                required ? ECORE_CONFIG_ERR_NOTFOUND :
-                                ECORE_CONFIG_ERR_PARTIAL) ==
-                               ECORE_CONFIG_ERR_NOTFOUND)
-                              E(1,
-                                "DLMulti: library/plugin/engine \"%s\" 
(\"%s\") did not contain required function \"%s\"...\n",
-                                name, file, buf);
-                        }
-                      E(2, "DLMulti: %p => %p %c\"%s\"\n", fun, funr,
-                        required ? '!' : '?', buf);
-                      if (funr)
-                         *funr = fun;
-                   }
-                 required = 1;
-              }
-         }
-
-       va_end(ap);
-
-       if ((ret == ECORE_CONFIG_ERR_SUCC) || (ret == ECORE_CONFIG_ERR_PARTIAL))
-          *libr = lib;
-       else
-          dlclose(lib);
-     }
-   else
-      ret = ECORE_CONFIG_ERR_NODATA;
-
-   return ret;
-}
-
-#if 0 /* Unused */
-/*****************************************************************************/
-
-unsigned long
-now(long delay)
-{
-   static struct timeval tv;
-   unsigned long       r;
-
-   gettimeofday(&tv, NULL);
-   r = tv.tv_sec * 1000 + (((float)tv.tv_usec) / 1000.0) + delay;
-   return r;
-}
-#endif
-
-/*****************************************************************************/
-
-int
-parse_line(char *in, char **o1, char **o2, char **o3, char **o4)
-{
-#define PLMAX 16
-   int                 c;
-   char               *p = in;
-   char               *r[PLMAX];
-
-   for (c = 0; c < PLMAX; c++)
-      r[c] = NULL;
-
-   c = 0;
-   if (!in || !*in)
-      goto pl_end;
-
-   do
-     {
-       while (isspace(*p))
-          *(p++) = '\0';
-
-       if (!*p || (strchr("#;", *p) && (!p[1] || isspace(p[1]))))
-          *p = '\0';           /* it ends HERE */
-       else
-         {
-            if (*p == '\"')
-              {
-                 r[c++] = ++p;
-                 while (*p && (*p != '\"'))
-                   {
-                      if ((*p == '\\') && p[1])
-                         p += 2;
-                      else
-                         p++;
-                   }
-                 if (*p)
-                    *(p++) = '\0';
-              }
-            else
-              {
-                 r[c++] = p;
-                 while (*p && !isspace(*p))
-                    p++;
-              }
-         }
-     }
-   while (*p);
-
- pl_end:
-   if (o1)
-      *o1 = r[0];
-   if (o2)
-      *o2 = r[1];
-   if (o3)
-      *o3 = r[2];
-   if (o4)
-      *o4 = r[3];
-
-   return c;
-}
-
-/*****************************************************************************/
-
-/*char *unit_size(char *size) {
-  gchar *unit="byte";
-  long s;
-
-  if((s=atol(size))&&(s>=1024)) {
-    if((s>(1024*1024*1024))) {
-      unit="GB";
-      s=(long)(s/(1024*1024)); }
-    else if((s>(1024*1024))) {
-      unit="MB";
-      s=(long)(s/1024); }
-    else
-      unit="KB";
-
-    if((s/1024)>31)
-      sprintf(size,"%ld %s",(long)(s/1024),unit);
-    else
-      sprintf(size,"%.1f %s",((float)s)/1024,unit); }
-  else
-    sprintf(size,"%ld %s",s,unit);
-
-  return size; }
-
-*/
-
-/*****************************************************************************/
-
-void
-qsrt(void *a[], void *data, int lo, int hi,
-     int (*compare) (const void *, const void *, const void *))
-{
-   int                 h, l;
-   void               *p, *t;
-
-   if (lo < hi)
-     {
-       l = lo;
-       h = hi;
-       p = a[hi];
-
-       do
-         {
-            while ((l < h) && (compare(data, a[l], p) <= 0))
-               l = l + 1;
-            while ((h > l) && (compare(data, a[h], p) >= 0))
-               h = h - 1;
-            if (l < h)
-              {
-                 t = a[l];
-                 a[l] = a[h];
-                 a[h] = t;
-              }
-         }
-       while (l < h);
-
-       t = a[l];
-       a[l] = a[hi];
-       a[hi] = t;
-
-       qsrt(a, data, lo, l - 1, compare);
-       qsrt(a, data, l + 1, hi, compare);
-     }
-}
-
-/*****************************************************************************/
-/* TIMERS */
-/**********/
-
-#ifdef HAVE_GLIB2
-
-unsigned long
-timeout_add(uint f, int (*fun) (void *), void *data)
-{
-   return g_timeout_add((guint) f, (GSourceFunc) fun, (gpointer) data);
-}
-
-int
-timeout_remove(unsigned long handle)
-{
-   return g_source_remove(handle) ? ECORE_CONFIG_ERR_SUCC :
-      ECORE_CONFIG_ERR_FAIL;
-}
-
-#else
-
-unsigned long
-timeout_add(uint f __UNUSED__, int (*fun) (void *) __UNUSED__, void *data 
__UNUSED__)
-{
-   return 0;
-}
-
-int
-timeout_remove(unsigned long handle __UNUSED__)
-{
-   return ECORE_CONFIG_ERR_NOTSUPP;
-}
-
-#endif /* HAVE_GLIB2 */
-
-/*****************************************************************************/
-/* HASHES */
-/**********/
-
-int
-eslist_free(eslist ** l)
-{
-   eslist             *e, *f;
-
-   if (!l)
-      return ECORE_CONFIG_ERR_NODATA;
-   for (e = *l; e; e = f)
-     {
-       f = e->next;
-       free(e);
-     }
-   *l = NULL;
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-int
-eslist_next(eslist ** e)
-{
-   if (!e || !*e)
-      return ECORE_CONFIG_ERR_NODATA;
-   *e = (*e)->next;
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-void               *
-eslist_payload(eslist ** e)
-{
-   return (!e || !*e) ? NULL : (*e)->payload;
-}
-
-int
-eslist_prepend(eslist ** e, void *p)
-{
-   eslist             *f;
-
-   if (!e)
-      return ECORE_CONFIG_ERR_NODATA;
-
-   if (!(f = malloc(sizeof(eslist))))
-      return ECORE_CONFIG_ERR_OOM;
+#define vasnprintf(a, b, c, d) \
+   va_start(d, c); \
+   need = vsnprintf(a, b, c, d); \
+   va_end(d);
 
-   f->payload = p;
-   f->next = *e;
-
-   *e = f;
-
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-int
-eslist_append(eslist ** e, void *p)
-{
-   eslist             *f;
-
-   if (!e)
-      return ECORE_CONFIG_ERR_NODATA;
-
-   if (!(f = malloc(sizeof(eslist))))
-      return ECORE_CONFIG_ERR_OOM;
-
-   f->payload = p;
-   f->next = NULL;
-
-   if (!*e)
-      *e = f;
-   else
-     {
-       eslist             *g = *e;
-
-       while (g->next)
-          g = g->next;
-       g->next = f;
-     }
-
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-/*****************************************************************************/
-/* HASHES */
-/**********/
-
-#ifdef HAVE_GLIB2
-
-void               *
-hash_table_new(void (*freekey), void (*freeval))
-{
-   return g_hash_table_new_full(g_str_hash, g_str_equal, freekey, freeval);
-}
-
-void               *
-hash_table_fetch(void *hashtable, char *key)
-{
-   return g_hash_table_lookup(hashtable, key);
-}
-
-int
-hash_table_insert(void *hashtable, char *key, void *value)
-{
-   g_hash_table_insert(hashtable, key, value);
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-int
-hash_table_replace(void *hashtable, char *key, void *value)
-{
-   g_hash_table_replace(hashtable, key, value);
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-int
-hash_table_remove(void *hashtable, char *key)
-{
-   g_hash_table_remove(hashtable, key);
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-int
-hash_table_dst(void *hashtable)
-{
-   g_hash_table_destroy(hashtable);
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-int
-hash_table_walk(void *hashtable, hash_walker fun, void *data)
-{
-   g_hash_table_foreach(hashtable, (GHFunc) fun, data);
-   return ECORE_CONFIG_ERR_SUCC;
-}
-
-#else
-
-void               *
-hash_table_new(void (*freekey) __UNUSED__, void (*freeval) __UNUSED__)
-{
-   return NULL;
-}
-
-void               *
-hash_table_fetch(void *hashtable __UNUSED__, char *key __UNUSED__)
-{
-   return NULL;
-}
-
-int
-hash_table_insert(void *hashtable __UNUSED__, char *key __UNUSED__, void 
*value __UNUSED__)
-{
-   return ECORE_CONFIG_ERR_NOTSUPP;
-}
-
-int
-hash_table_replace(void *hashtable __UNUSED__, char *key __UNUSED__, void 
*value __UNUSED__)
-{
-   return ECORE_CONFIG_ERR_NOTSUPP;
-}
-
-int
-hash_table_remove(void *hashtable __UNUSED__, char *key __UNUSED__)
-{
-   return ECORE_CONFIG_ERR_NOTSUPP;
-}
-
-int
-hash_table_dst(void *hashtable __UNUSED__)
-{
-   return ECORE_CONFIG_ERR_NOTSUPP;
-}
-
-int
-hash_table_walk(void *hashtable __UNUSED__, hash_walker fun __UNUSED__, void 
*data __UNUSED__)
-{
-   return ECORE_CONFIG_ERR_NOTSUPP;
-}
-
-#endif /* HAVE_GLIB2 */
+#define CHUNKLEN 4096
 
 /*****************************************************************************/
 /* STRINGS */
@@ -503,18 +38,6 @@
    return e;
 }
 
-estring            *
-estring_dst(estring * e)
-{
-   if (e)
-     {
-       if (e->str)
-          free(e->str);
-       free(e);
-     }
-   return NULL;
-}
-
 char               *
 estring_disown(estring * e)
 {
@@ -528,254 +51,72 @@
    return NULL;
 }
 
-char               *
-estring_free(estring * e, int release_payload)
-{                              /* glib compat */
-   if (release_payload)
-     {
-       estring_dst(e);
-       return NULL;
-     }
-   return estring_disown(e);
-}
-
-int
-estring_truncate(estring * e, int size)
-{
-   if (!e || (size < 0))
-      return ECORE_CONFIG_ERR_FAIL;
-   if (e->used <= size)
-      return e->used;
-   e->str[size] = '\0';
-   e->used = size;
-   return size;
-}
-
-int
-estring_printf(estring * e, const char *fmt, ...)
-{
-   int                 need;
-   va_list             ap;
-   char               *p;
-
-   if (!e)
-      return ECORE_CONFIG_ERR_FAIL;
-
-   if (!(e->str))
-     {
-       if (!(e->str = (char *)malloc(e->alloc = 512)))
-          return ECORE_CONFIG_ERR_OOM;
-     }
-
- retry:
-   va_start(ap, fmt);
-   need = vsnprintf(e->str, e->alloc, fmt, ap);
-   va_end(ap);
-
-   if ((need >= e->alloc) || (need < 0))
-     {
-       if (need < 0)
-          need = 2 * e->alloc;
-       else
-          need++;
-       if (!(p = (char *)realloc(e->str, need)))
-         {
-            free(e->str);
-            e->alloc = e->used = 0;
-            return ECORE_CONFIG_ERR_OOM;
-         }
-       e->alloc = need;
-       e->str = p;
-       goto retry;
-     }
-
-   return e->used = need;
-}
-
 int
 estring_appendf(estring * e, const char *fmt, ...)
 {
-   int                 need;
-   va_list             ap;
-   char               *p;
+   va_list     ap;
+   size_t      need;
+   char       *p;
 
    if (!e)
       return ECORE_CONFIG_ERR_FAIL;
 
    if (!e->str)
-     {
-       e->used = e->alloc = 0;
-       if (!(e->str = (char *)malloc(e->alloc = 512)))
-          return ECORE_CONFIG_ERR_OOM;
-     }
+     e->used = e->alloc = 0;
 
- retry:
    va_start(ap, fmt);
-   need = vsnprintf(e->str + e->used, e->alloc - e->used, fmt, ap);
+   need = vsnprintf(NULL, 0, fmt, ap);
    va_end(ap);
-
-   if ((need >= (e->alloc - e->used)) || (need < 0))
+   if(need >= (e->alloc - e->used))
      {
-       if (need < 0)
-          need = 2 * e->alloc;
-       else
-          need++;
-       need += e->used;
-       need += (CHUNKLEN - (need % CHUNKLEN));
-
-       if (!(p = (char *)realloc(e->str, need)))
-         {
+       if( !(p = (char *)realloc( e->str, need + e->used + 1 )) )
+          {
             free(e->str);
             e->alloc = e->used = 0;
             return ECORE_CONFIG_ERR_OOM;
-         }
-       e->alloc = need;
+          }
+       e->alloc += need + 1;
        e->str = p;
-       goto retry;
      }
 
-   return e->used += need;
-}
-
-int
-esprintf(char **result, const char *fmt, ...)
-{
-   int                 need, have;
-   va_list             ap;
-   char               *n;
-
-   if (!result)
-      return ECORE_CONFIG_ERR_FAIL;
-
-   if (!(n = (char *)malloc(have = 512)))
-      return ECORE_CONFIG_ERR_OOM;
-
- retry:
    va_start(ap, fmt);
-   need = vsnprintf(n, have, fmt, ap);
+   vsnprintf(e->str + e->used, e->alloc - e->used, fmt, ap);
    va_end(ap);
 
-   if ((need >= have) || (need < 0))
-     {
-       char               *p;
-
-       if (need < 0)
-          need = 2 * have;
-       else
-          need++;
-       if (!(p = (char *)realloc(n, need)))
-         {
-            free(n);
-            return ECORE_CONFIG_ERR_OOM;
-         }
-       have = need;
-       n = p;
-       goto retry;
-     }
-
-   if (*result)
-      free(*result);
-   *result = n;
-
-   return need;
+   return e->used;
 }
 
-#if 0
 int
-ejoin(char **result, char *delim, ...)
+esprintf(char **result, const char *fmt, ...)
 {
-   int                 dl, cl, ret = ECORE_CONFIG_ERR_SUCC;
-   va_list             ap;
-   char               *e, *n;
+   va_list   ap;
+   size_t    need;
+   char     *n;
 
    if (!result)
       return ECORE_CONFIG_ERR_FAIL;
-   if (!delim)
-      delim = "";
-   dl = strlen(delim);
-
-   va_start(ap, delim);
-   cl = -dl;
-   while ((e = va_arg(ap, char *)))
-                          cl += strlen(e) + dl;
 
+   va_start(ap, fmt);
+   need = vsnprintf(NULL, 0, fmt, ap) + 1;
    va_end(ap);
+   n = malloc(need + 1);
 
-   if (cl <= 0)
-     {
-       if (!(n = strdup("")))
-          ret = ECORE_CONFIG_ERR_OOM;
-     }
-   else if (!(n = malloc(cl + 1)))
-      ret = ECORE_CONFIG_ERR_OOM;
-   else
+   if (n)
      {
-       char               *p = n;
-
-       va_start(ap, delim);
-       while ((e = va_arg(ap, char *)))
-         {
-            if (dl && (p != n))
-              {
-                 strcpy(p, delim);
-                 p += dl;
-              }
-            strcpy(p, e);
-            p += strlen(p);
-         }
+       va_start(ap, fmt);
+       need = vsnprintf(n, need, fmt, ap);
        va_end(ap);
-     }
 
-   if (*result)
-      free(*result);
-   *result = n;
+       n[need] = 0;
 
-   return ret;
-}
+       if(*result)
+          free(result);
+       *result = n;
 
-int
-ecat(char **result, ...)
-{
-   int                 cl, ret = ECORE_CONFIG_ERR_SUCC;
-   va_list             ap;
-   char               *e, *n;
-
-   if (!result)
-      return ECORE_CONFIG_ERR_FAIL;
-
-   va_start(ap, result);
-   cl = 0;
-   while ((e = va_arg(ap, char *)))
-                          cl += strlen(e);
-
-   va_end(ap);
-
-   if (cl <= 0)
-     {
-       if (!(n = strdup("")))
-          ret = ECORE_CONFIG_ERR_OOM;
+       return need;
      }
-   else if (!(n = malloc(cl + 1)))
-      ret = ECORE_CONFIG_ERR_OOM;
-   else
-     {
-       char               *p = n;
-
-       va_start(ap, result);
-       while ((e = va_arg(ap, char *)))
-         {
-            strcpy(p, e);
-            p += strlen(p);
-         }
-       va_end(ap);
-     }
-
-   if (*result)
-      free(*result);
-   *result = n;
 
-   return ret;
+   return ECORE_CONFIG_ERR_OOM;
 }
-#endif
 
 /*****************************************************************************/
Index: src/lib/ecore_config/ecore_config_util.h
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/ecore_config_util.h,v
retrieving revision 1.2
diff -u -r1.2 ecore_config_util.h
--- src/lib/ecore_config/ecore_config_util.h    2 Mar 2005 07:06:34 -0000       
1.2
+++ src/lib/ecore_config/ecore_config_util.h    23 Dec 2005 03:32:19 -0000
@@ -7,57 +7,8 @@
    int                 alloc, used;
 } estring;
 
-typedef struct _eslist
-{
-   void               *payload;
-   struct _eslist     *next;
-} eslist;
-
-int                 parse_line(char *, char **, char **, char **, char **);
-char               *unit_size(char *size);
-
-/*unsigned long    now(long delay);*/
-void                qsrt(void *a[], void *data, int lo, int hi,
-                        int (*compare) (const void *, const void *,
-                                        const void *));
-int                 dlmulti(const char *name, const char *file, int flag, void 
**libr,
-                           const char *fmt, ...);
-
-typedef void        (*hash_walker) (char *key, void *value, void *data);
-
-void               *hash_table_new(void (*freekey), void (*freeval));
-void               *hash_table_fetch(void *hashtable, char *key);
-int                 hash_table_insert(void *hashtable, char *key, void *value);
-int                 hash_table_replace(void *hashtable, char *key, void 
*value);
-int                 hash_table_remove(void *hashtable, char *key);
-int                 hash_table_dst(void *hashtable);
-int                 hash_table_walk(void *hashtable, hash_walker fun,
-                                   void *data);
-
-int                 eslist_free(eslist **);
-int                 eslist_next(eslist **);
-
-#define  ESLIST_NEXT(e) (e=e->next)
-void               *eslist_payload(eslist **);
-
-#define  ESLIST_PAYLOAD(e) ((e)->payload)
-int                 eslist_prepend(eslist **, void *);
-int                 eslist_append(eslist **, void *);
-
 estring            *estring_new(int size);
-estring            *estring_dst(estring * e);
 char               *estring_disown(estring * e);
-char               *estring_free(estring * e, int release_payload);    /* glib 
compat */
-int                 estring_printf(estring * e, const char *fmt, ...);
 int                 estring_appendf(estring * e, const char *fmt, ...);
-int                 estring_truncate(estring * e, int size);
-
-#define  ESTRING_GET_CSTRING(a) ((a)->str)
 
 int                 esprintf(char **result, const char *fmt, ...);
-int                 ejoin(char **result, const char *delim, ...);
-int                 ecat(char **result, ...);
-
-unsigned long       timeout_add(unsigned int f, int (*fun) (void *),
-                               void *data);
-int                 timeout_remove(unsigned long handle);

Reply via email to