diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/cmd/prctl/utils.h | |
download | illumos-gate-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz |
OpenSolaris Launch
Diffstat (limited to 'usr/src/cmd/prctl/utils.h')
-rw-r--r-- | usr/src/cmd/prctl/utils.h | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/usr/src/cmd/prctl/utils.h b/usr/src/cmd/prctl/utils.h new file mode 100644 index 0000000000..7ea3e5c4d5 --- /dev/null +++ b/usr/src/cmd/prctl/utils.h @@ -0,0 +1,233 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _UTILS_H +#define _UTILS_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/types.h> + +extern void warn(char *, ...); +extern char *setprogname(char *); + +/* + * scale_t + * + * Used to describe string modifiers and integer scales. + * modifiers: NULL terminated array of modifier strings, such as + * { "K", "M", NULL }, for strings like "100KB" or "100MB" + * scales: array of scales for each modifer string, such as + * { 1000, 1000000 } + */ +typedef struct scale_struct { + char **modifers; + uint64_t *scales; +} scale_t; + +/* + * pointers to standard scales. + */ +extern scale_t *scale_binary; +extern scale_t *scale_metric; + +#define SCALED_MODIFIER_CASE_INSENSITIVE_FLAG 0x01 +#define SCALED_UNIT_CASE_INSENSITIVE_FLAG 0x02 +#define SCALED_UNIT_OPTIONAL_FLAG 0x04 +#define SCALED_PAD_WIDTH_FLAG 0x08 +#define SCALED_ALL_FLAGS 0x0F + +/* + * 20 characters for UINT64_MAX, 1 character for modifer, 1 character for + * unit, 1 character for NULL, 1 extra. + */ +#define SCALED_STRLEN (24) + +#define SCALED_INVALID_MODIFIER 1 +#define SCALED_INVALID_UNIT 2 +#define SCALED_INVALID_NUMBER 3 +#define SCALED_OVERFLOW 4 + +#define SCALED_UNIT_BYTES "B" +#define SCALED_UNIT_SECONDS "s" +#define SCALED_UNIT_NONE "" + +/* + * scaledtouint64 + * + * converts a string in one of the forms: + * "[decimal number]][modifier][unit]" + * "[integer number][unit]" + * + * to a uint64. As seen from the two forms, If no modifier is present, + * the number must be an integer. + * + * Inputs: + * + * scaledin: input string containing number string + * scale: pointer to scale_t to describe scaling modifiers and scales + * unit: expected unit string, such as "B", for the number "100MB" + * flags: one of: + * SCALED_MODIFIER_CASE_INSENSITIVE_FLAG + * SCALED_UNIT_CASE_INSENSITIVE_FLAG + * SCALED_UNIT_OPTIONAL_FLAG + * which are pretty self explainatory. + * Outputs: + * + * return value: 0 on success, on errors: + * SCALED_INVALID_NUMBER - string contains no valid number + * SCALED_INVALID_MODIFIER - string has unknown modifier + * SCALED_INVALID_UNIT - string has unknown or missing unit + * SCALED_OVERFLOW - number exceeds MAX_UINT64 + * + * uint64out: uint64_t value of input string + * widthout: width of number (not including modifier and unit) + * in the input string. "10.0MB" has a width of 4. + * modiferout: pointer to the string in the modifiers array which + * was found in the input string. If no modifer was + * found, this well be set to NULL; + * unitout: If unit string was present in the input string, this + * will be set to point to unit, otherwise NULL. + */ +int scaledtouint64(char *scaledin, uint64_t *uint64out, + int *widthout, char **modifierout, char **unitout, + scale_t *scale, char *unit, int flags); + +/* + * uint64toscaled + * + * converts a uint64 to a string in one of the forms: + * "[decimal number]][modifier][unit]" + * "[integer number][unit]" + * (no modifier means number will be an integer) + * + * Inputs: + * + * uint64in: input number to convert to scaled string + * widthin: character width of desired string, not including modifier + * and unit. Eg: 1.00MB has a width of 4 for the "1.00". + * unit. + * maxmodifier: The maximium scaling to use. For instance, to limit the + * scaling to megabytes (no GB or higher), use "M" + * scale: pointer to scale_t to describe modifiers and scales + * unit: unit string, such as "B", for the number "100MB" + * flags: one of: + * SCALED_PAD_WIDTH_FLAG + * If the length of the scaled string is less than + * widthin, pad to the left with spaces. + * Outputs: + * + * return value: 0 on success, no error conditions. + * scaledout: Pointer to a string buffer to fill with the scaled string. + * widthout: Used to return the actual character length of the produced + * string, not including modifier and unit. + * modifierout: pointer to modifier used in scaled string. + */ +int uint64toscaled(uint64_t uint64in, int widthin, char *maxmodifier, + char *scaledout, int *widthout, char **modifierout, + scale_t *scale, char *unit, int flags); + +/* + * scaledtoscaled + * + * Used to rescale a string from/to the following forms: + * "[decimal number]][modifier][unit]" + * "[integer number][unit]" + * + * This is used ensure the desired width and letter casing. + * + * As seen from the two forms, If no modifier is present, + * the number must be an integer. + * + * Inputs: + * scaledin: input string containing number string + * widthin: character width of desired string, not including modifier + * and unit. Eg: 1.00MB has a width of 4 for the "1.00". + * unit. + * maxmodifier: The maximium scaling to use. For instance, to limit the + * scaling to megabytes (no GB or higher), use "M" + * scale: pointer to scale_t to describe modifiers and scales + * unit: unit string, such as "B", for the number "100MB" + * flags: one of: + * SCALED_PAD_WIDTH_FLAG + * If the length of the scaled string is less than + * widthin, pad to the left with spaces. + * SCALED_MODIFIER_CASE_INSENSITIVE_FLAG + * SCALED_UNIT_CASE_INSENSITIVE_FLAG + * SCALED_UNIT_OPTIONAL_FLAG + * which are pretty self explainatory. + * + * Outputs: + * + * return value: 0 on success, on errors: + * SCALED_INVALID_NUMBER - string contains no valid number + * SCALED_INVALID_MODIFIER - string has unknown modifier + * SCALED_INVALID_UNIT - string has unknown or missing unit + * SCALED_OVERFLOW - number exceeds MAX_UINT64 + * + * scaledout: Pointer to a string buffer to fill with the scaled string. + * widthout: width of number (not including modifier and unit) + * in the input string. "10.0MB" has a width of 4. + * modiferout: pointer to the string in the modifiers array which + * was found in the input string. If no modifer was + * found, this well be set to NULL; + */ +int scaledtoscaled(char *scaledin, int widthin, char *maxmodifier, + char *scaledout, int *widthout, char ** modifierout, + scale_t *scale, char *unit, int flags); + +/* + * scaledeqscaled + * + * Determine if two scaled strings are equivalent. Flags are same as + * scaledtouint64. + */ +int scaledeqscaled(char *scale1, char *scale2, + scale_t *scale, char *unit, int flags); + +/* + * scaledequint64 + * + * Determine if a scaled number is equal to an uint64. The uint64 is scaled + * to the same scale and width as the scaled strings. If the resultant string + * is equal, then the numbers are considered equal. + * + * minwidth: minimum number width to scale string and number to for + * comparision. + * flags are same as scaledtouint64. + */ +int scaledequint64(char *scaled, uint64_t uint64, int minwidth, + scale_t *scale, char *unit, int flags); + +#ifdef __cplusplus +} +#endif + +#endif /* _UTILS_H */ |