diff options
Diffstat (limited to 'crypto/heimdal/lib/roken/parse_units.c')
-rw-r--r-- | crypto/heimdal/lib/roken/parse_units.c | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/crypto/heimdal/lib/roken/parse_units.c b/crypto/heimdal/lib/roken/parse_units.c index 217d55e..1960bec 100644 --- a/crypto/heimdal/lib/roken/parse_units.c +++ b/crypto/heimdal/lib/roken/parse_units.c @@ -33,13 +33,13 @@ #ifdef HAVE_CONFIG_H #include <config.h> -RCSID("$Id: parse_units.c,v 1.14 2001/09/04 09:56:00 assar Exp $"); +RCSID("$Id: parse_units.c 21005 2007-06-08 01:54:35Z lha $"); #endif #include <stdio.h> #include <ctype.h> #include <string.h> -#include <roken.h> +#include "roken.h" #include "parse_units.h" /* @@ -152,7 +152,7 @@ acc_units(int res, int val, unsigned mult) return res + val * mult; } -int +int ROKEN_LIB_FUNCTION parse_units (const char *s, const struct units *units, const char *def_unit) { @@ -178,7 +178,7 @@ acc_flags(int res, int val, unsigned mult) return -1; } -int +int ROKEN_LIB_FUNCTION parse_flags (const char *s, const struct units *units, int orig) { @@ -192,9 +192,8 @@ parse_flags (const char *s, const struct units *units, static int unparse_something (int num, const struct units *units, char *s, size_t len, - int (*print) (char *s, size_t len, int div, - const char *name, int rem), - int (*update) (int in, unsigned mult), + int (*print) (char *, size_t, int, const char *, int), + int (*update) (int, unsigned), const char *zero_string) { const struct units *u; @@ -204,17 +203,21 @@ unparse_something (int num, const struct units *units, char *s, size_t len, return snprintf (s, len, "%s", zero_string); for (u = units; num > 0 && u->name; ++u) { - int div; + int divisor; - div = num / u->mult; - if (div) { + divisor = num / u->mult; + if (divisor) { num = (*update) (num, u->mult); - tmp = (*print) (s, len, div, u->name, num); + tmp = (*print) (s, len, divisor, u->name, num); if (tmp < 0) return tmp; - - len -= tmp; - s += tmp; + if (tmp > len) { + len = 0; + s = NULL; + } else { + len -= tmp; + s += tmp; + } ret += tmp; } } @@ -222,11 +225,11 @@ unparse_something (int num, const struct units *units, char *s, size_t len, } static int -print_unit (char *s, size_t len, int div, const char *name, int rem) +print_unit (char *s, size_t len, int divisor, const char *name, int rem) { return snprintf (s, len, "%u %s%s%s", - div, name, - div == 1 ? "" : "s", + divisor, name, + divisor == 1 ? "" : "s", rem > 0 ? " " : ""); } @@ -245,7 +248,7 @@ update_unit_approx (int in, unsigned mult) return update_unit (in, mult); } -int +int ROKEN_LIB_FUNCTION unparse_units (int num, const struct units *units, char *s, size_t len) { return unparse_something (num, units, s, len, @@ -254,7 +257,7 @@ unparse_units (int num, const struct units *units, char *s, size_t len) "0"); } -int +int ROKEN_LIB_FUNCTION unparse_units_approx (int num, const struct units *units, char *s, size_t len) { return unparse_something (num, units, s, len, @@ -263,7 +266,7 @@ unparse_units_approx (int num, const struct units *units, char *s, size_t len) "0"); } -void +void ROKEN_LIB_FUNCTION print_units_table (const struct units *units, FILE *f) { const struct units *u, *u2; @@ -297,7 +300,7 @@ print_units_table (const struct units *units, FILE *f) } static int -print_flag (char *s, size_t len, int div, const char *name, int rem) +print_flag (char *s, size_t len, int divisor, const char *name, int rem) { return snprintf (s, len, "%s%s", name, rem > 0 ? ", " : ""); } @@ -308,7 +311,7 @@ update_flag (int in, unsigned mult) return in - mult; } -int +int ROKEN_LIB_FUNCTION unparse_flags (int num, const struct units *units, char *s, size_t len) { return unparse_something (num, units, s, len, @@ -317,7 +320,7 @@ unparse_flags (int num, const struct units *units, char *s, size_t len) ""); } -void +void ROKEN_LIB_FUNCTION print_flags_table (const struct units *units, FILE *f) { const struct units *u; |