]> git.sur5r.net Git - openldap/commitdiff
add support for error-handling number/time parsing functions; need to replace ato...
authorPierangelo Masarati <ando@openldap.org>
Wed, 23 Nov 2005 12:46:33 +0000 (12:46 +0000)
committerPierangelo Masarati <ando@openldap.org>
Wed, 23 Nov 2005 12:46:33 +0000 (12:46 +0000)
include/lutil.h
libraries/liblutil/utils.c

index c8e8430d51c9817696d14e1d098e760757e3ea2b..c1a15b229f69e8026840100f4519d88c49659ad0 100644 (file)
@@ -273,6 +273,24 @@ lutil_LogStoppedEvent( char *svc );
 #define putc(c,fp)     do { char x=(c); __atoe_l(&x,1); putc(x,fp); } while(0)
 #endif
 
+LDAP_LUTIL_F (int)
+lutil_atoi( int *v, const char *s );
+
+LDAP_LUTIL_F (int)
+lutil_atou( unsigned *v, const char *s );
+
+LDAP_LUTIL_F (int)
+lutil_atol( long *v, const char *s );
+
+LDAP_LUTIL_F (int)
+lutil_atoul( unsigned long *v, const char *s );
+
+LDAP_LUTIL_F (int)
+lutil_parse_time( const char *in, unsigned long *tp );
+
+LDAP_LUTIL_F (int)
+lutil_unparse_time( char *buf, size_t buflen, unsigned long t );
+
 LDAP_END_DECL
 
 #endif /* _LUTIL_H */
index d227f328284b1551b4d1e1fe589f09c8af8d7464..2c84ac4afd8db0cc535bac9fbe40b9fb7c460071 100644 (file)
@@ -329,3 +329,165 @@ lutil_memrchr(const void *b, int c, size_t n)
 
        return NULL;
 }
+
+int
+lutil_atoi( int *v, const char *s )
+{
+       char            *next;
+       long            i;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       i = strtol( s, &next, 10 );
+       if ( next == s || next[ 0 ] != '\0' ) {
+               return -1;
+       }
+
+       if ( (long)(int)i != i ) {
+               return 1;
+       }
+
+       *v = (int)i;
+
+       return 0;
+}
+
+int
+lutil_atou( unsigned *v, const char *s )
+{
+       char            *next;
+       unsigned long   u;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       u = strtoul( s, &next, 10 );
+       if ( next == s || next[ 0 ] != '\0' ) {
+               return -1;
+       }
+
+       if ( (unsigned long)(unsigned)u != u ) {
+               return 1;
+       }
+
+       *v = u;
+
+       return 0;
+}
+
+int
+lutil_atol( long *v, const char *s )
+{
+       char            *next;
+       long            l;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       l = strtol( s, &next, 10 );
+       if ( next == s || next[ 0 ] != '\0' ) {
+               return -1;
+       }
+
+       *v = l;
+
+       return 0;
+}
+
+int
+lutil_atoul( unsigned long *v, const char *s )
+{
+       char            *next;
+       unsigned long   ul;
+
+       assert( s != NULL );
+       assert( v != NULL );
+
+       ul = strtoul( s, &next, 10 );
+       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 ];
+
+       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 ) {
+                       len = snprintf( buf, buflen, "%lu%c", v[ i ], time_unit[ i ] );
+                       if ( len < 0 || (unsigned)len >= buflen ) {
+                               return -1;
+                       }
+                       buflen -= len;
+                       buf += len;
+               }
+       }
+
+       return 0;
+}
+