From 25fe62efde95e301f49b1e468c8ed09791c899ea Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Wed, 23 Nov 2005 12:46:33 +0000 Subject: [PATCH] add support for error-handling number/time parsing functions; need to replace ato{il}/strto[u]l throughout the code --- include/lutil.h | 18 +++++ libraries/liblutil/utils.c | 162 +++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/include/lutil.h b/include/lutil.h index c8e8430d51..c1a15b229f 100644 --- a/include/lutil.h +++ b/include/lutil.h @@ -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 */ diff --git a/libraries/liblutil/utils.c b/libraries/liblutil/utils.c index d227f32828..2c84ac4afd 100644 --- a/libraries/liblutil/utils.c +++ b/libraries/liblutil/utils.c @@ -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; +} + -- 2.39.5