]> git.sur5r.net Git - openldap/blobdiff - libraries/liblutil/utils.c
cleanup
[openldap] / libraries / liblutil / utils.c
index d2fea36db2a0a4d84f1d81f5288df3158bb95b7a..77baee98c65b847caf69e2bff2dc641df84f1fd5 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2006 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -311,22 +311,184 @@ int mkstemp( char * template )
 }
 #endif
 
-/* 
+/*
  * Memory Reverse Search
  */
 void *
-lutil_memrchr(const void *b, int c, size_t n) 
+lutil_memrchr(const void *b, int c, size_t n)
 {
        if (n != 0) {
-               const unsigned char *s;
+               const unsigned char *s, *bb = b, cc = c;
 
-               for ( s = b + n; s-- > b; ) {
-                       if ( *s == c ) {
-                               return s;
+               for ( s = bb + n; s > bb; ) {
+                       if ( *--s == cc ) {
+                               return (void *) s;
                        }
                }
        }
 
        return NULL;
-} 
+}
+
+int
+lutil_atoix( int *v, const char *s, int x )
+{
+       char            *next;
+       long            i;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       i = strtol( s, &next, x );
+       if ( next == s || next[ 0 ] != '\0' ) {
+               return -1;
+       }
+
+       if ( (long)(int)i != i ) {
+               return 1;
+       }
+
+       *v = (int)i;
+
+       return 0;
+}
+
+int
+lutil_atoux( unsigned *v, const char *s, int x )
+{
+       char            *next;
+       unsigned long   u;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       u = strtoul( s, &next, x );
+       if ( next == s || next[ 0 ] != '\0' ) {
+               return -1;
+       }
+
+       if ( (unsigned long)(unsigned)u != u ) {
+               return 1;
+       }
+
+       *v = u;
+
+       return 0;
+}
+
+int
+lutil_atolx( long *v, const char *s, int x )
+{
+       char            *next;
+       long            l;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       l = strtol( s, &next, x );
+       if ( next == s || next[ 0 ] != '\0' ) {
+               return -1;
+       }
+
+       *v = l;
+
+       return 0;
+}
+
+int
+lutil_atoulx( unsigned long *v, const char *s, int x )
+{
+       char            *next;
+       unsigned long   ul;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       ul = strtoul( s, &next, x );
+       if ( next == s || next[ 0 ] != '\0' ) {
+               return -1;
+       }
+
+       *v = ul;
+
+       return 0;
+}
+
+static char            time_unit[] = "dhms";
+
+int
+lutil_parse_time(
+       const char      *in,
+       unsigned long   *tp )
+{
+       unsigned long   t = 0;
+       char            *s,
+                       *next;
+       int             sofar = -1,
+                       scale[] = { 86400, 3600, 60, 1 };
+
+       *tp = 0;
+
+       for ( s = (char *)in; s[ 0 ] != '\0'; ) {
+               unsigned long   u;
+               char            *what;
+
+               u = strtoul( s, &next, 10 );
+               if ( next == s ) {
+                       return -1;
+               }
+
+               if ( next[ 0 ] == '\0' ) {
+                       /* assume seconds */
+                       t += u;
+                       break;
+               }
+
+               what = strchr( time_unit, next[ 0 ] );
+               if ( what == NULL ) {
+                       return -1;
+               }
+
+               if ( what - time_unit <= sofar ) {
+                       return -1;
+               }
+
+               sofar = what - time_unit;
+               t += u * scale[ sofar ];
+
+               s = &next[ 1 ];
+       }
+
+       *tp = t;
+       return 0;
+}
+
+int
+lutil_unparse_time(
+       char                    *buf,
+       size_t                  buflen,
+       unsigned long           t )
+{
+       int             len, i;
+       unsigned long   v[ 4 ];
+       char            *ptr = buf;
+
+       v[ 0 ] = t/86400;
+       v[ 1 ] = (t%86400)/3600;
+       v[ 2 ] = (t%3600)/60;
+       v[ 3 ] = t%60;
+
+       for ( i = 0; i < 4; i++ ) {
+               if ( v[i] > 0 || ( i == 3 && ptr == buf ) ) {
+                       len = snprintf( ptr, buflen, "%lu%c", v[ i ], time_unit[ i ] );
+                       if ( len < 0 || (unsigned)len >= buflen ) {
+                               return -1;
+                       }
+                       buflen -= len;
+                       ptr += len;
+               }
+       }
+
+       return 0;
+}