xref: /illumos-gate/usr/src/cmd/prctl/utils.h (revision 3d393ee6c37fa10ac512ed6d36109ad616dc7c1a)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_UTILS_H
27 #define	_UTILS_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/types.h>
36 
37 extern void warn(const char *, ...);
38 extern char *setprogname(char *);
39 
40 /*
41  * scale_t
42  *
43  * Used to describe string modifiers and integer scales.
44  *	modifiers:  NULL terminated array of modifier strings, such as
45  *		    { "K", "M", NULL }, for strings like "100KB" or "100MB"
46  *	scales:	    array of scales for each modifer string, such as
47  *		    { 1000, 1000000 }
48  */
49 typedef struct scale_struct {
50 	char	    **modifers;
51 	uint64_t	*scales;
52 } scale_t;
53 
54 /*
55  * pointers to standard scales.
56  */
57 extern scale_t *scale_binary;
58 extern scale_t *scale_metric;
59 
60 #define	SCALED_MODIFIER_CASE_INSENSITIVE_FLAG 	0x01
61 #define	SCALED_UNIT_CASE_INSENSITIVE_FLAG	0x02
62 #define	SCALED_UNIT_OPTIONAL_FLAG		0x04
63 #define	SCALED_PAD_WIDTH_FLAG			0x08
64 #define	SCALED_ALL_FLAGS			0x0F
65 
66 /*
67  * 20 characters for UINT64_MAX, 1 character for modifer, 1 character for
68  * unit, 1 character for NULL, 1 extra.
69  */
70 #define	SCALED_STRLEN (24)
71 
72 #define	SCALED_INVALID_MODIFIER		1
73 #define	SCALED_INVALID_UNIT		2
74 #define	SCALED_INVALID_NUMBER		3
75 #define	SCALED_OVERFLOW			4
76 
77 #define	SCALED_UNIT_BYTES "B"
78 #define	SCALED_UNIT_SECONDS "s"
79 #define	SCALED_UNIT_NONE ""
80 
81 /*
82  * scaledtouint64
83  *
84  * converts a string in one of the forms:
85  *	 "[decimal number]][modifier][unit]"
86  *	 "[integer number][unit]"
87  *
88  * to a uint64.  As seen from the two forms, If no modifier is present,
89  * the number must be an integer.
90  *
91  * Inputs:
92  *
93  *	scaledin:   input string containing number string
94  *	scale:	    pointer to scale_t to describe scaling modifiers and scales
95  *	unit:	    expected unit string, such as "B", for the number "100MB"
96  *	flags:	    one of:
97  *			SCALED_MODIFIER_CASE_INSENSITIVE_FLAG
98  *			SCALED_UNIT_CASE_INSENSITIVE_FLAG
99  *			SCALED_UNIT_OPTIONAL_FLAG
100  *		    which are pretty self explainatory.
101  * Outputs:
102  *
103  *	return value:	0 on success, on errors:
104  *		SCALED_INVALID_NUMBER	- string contains no valid number
105  *		SCALED_INVALID_MODIFIER - string has unknown modifier
106  *		SCALED_INVALID_UNIT	- string has unknown or missing unit
107  *		SCALED_OVERFLOW		- number exceeds MAX_UINT64
108  *
109  *	uint64out:	uint64_t value of input string
110  *	widthout:	width of number (not including modifier and unit)
111  *			in the input string.  "10.0MB" has a width of 4.
112  *	modiferout:	pointer to the string in the modifiers array which
113  *			was found in the input string.  If no modifer was
114  *			found, this well be set to NULL;
115  *	unitout:	If unit string was present in the input string, this
116  *			will be set to point to unit, otherwise NULL.
117  */
118 int scaledtouint64(char *scaledin, uint64_t *uint64out,
119     int *widthout, char **modifierout, char **unitout,
120     scale_t *scale, char *unit, int flags);
121 
122 /*
123  * uint64toscaled
124  *
125  * converts a uint64 to a string in one of the forms:
126  *	 "[decimal number]][modifier][unit]"
127  *	 "[integer number][unit]"
128  * (no modifier means number will be an integer)
129  *
130  * Inputs:
131  *
132  *	uint64in:    input number to convert to scaled string
133  *	widthin:     character width of desired string, not including modifier
134  *		     and unit.  Eg:  1.00MB has a width of 4 for the "1.00".
135  *		     unit.
136  *	maxmodifier: The maximium scaling to use.  For instance, to limit the
137  *		     scaling to megabytes (no GB or higher), use "M"
138  *	scale:	     pointer to scale_t to describe modifiers and scales
139  *	unit:	     unit string, such as "B", for the number "100MB"
140  *	flags:	     one of:
141  *			SCALED_PAD_WIDTH_FLAG
142  *			    If the length of the scaled string is less than
143  *			    widthin, pad to the left with spaces.
144  * Outputs:
145  *
146  *	return value:	0 on success, no error conditions.
147  *	scaledout:   Pointer to a string buffer to fill with the scaled string.
148  *	widthout:    Used to return the actual character length of the produced
149  *		     string, not including modifier and unit.
150  *	modifierout: pointer to modifier used in scaled string.
151  */
152 int uint64toscaled(uint64_t uint64in, int widthin, char *maxmodifier,
153     char *scaledout, int *widthout, char **modifierout,
154     scale_t *scale, char *unit, int flags);
155 
156 /*
157  * scaledtoscaled
158  *
159  * Used to rescale a string from/to the following forms:
160  *	 "[decimal number]][modifier][unit]"
161  *	 "[integer number][unit]"
162  *
163  * This is used ensure the desired width and letter casing.
164  *
165  * As seen from the two forms, If no modifier is present,
166  * the number must be an integer.
167  *
168  * Inputs:
169  *	scaledin:   input string containing number string
170  *	widthin:     character width of desired string, not including modifier
171  *		     and unit.  Eg:  1.00MB has a width of 4 for the "1.00".
172  *		     unit.
173  *	maxmodifier: The maximium scaling to use.  For instance, to limit the
174  *		     scaling to megabytes (no GB or higher), use "M"
175  *	scale:	     pointer to scale_t to describe modifiers and scales
176  *	unit:	     unit string, such as "B", for the number "100MB"
177  *	flags:	     one of:
178  *			SCALED_PAD_WIDTH_FLAG
179  *			    If the length of the scaled string is less than
180  *			    widthin, pad to the left with spaces.
181  *			SCALED_MODIFIER_CASE_INSENSITIVE_FLAG
182  *			SCALED_UNIT_CASE_INSENSITIVE_FLAG
183  *			SCALED_UNIT_OPTIONAL_FLAG
184  *			    which are pretty self explainatory.
185  *
186  * Outputs:
187  *
188  *	return value:	0 on success, on errors:
189  *		SCALED_INVALID_NUMBER	- string contains no valid number
190  *		SCALED_INVALID_MODIFIER - string has unknown modifier
191  *		SCALED_INVALID_UNIT	- string has unknown or missing unit
192  *		SCALED_OVERFLOW		- number exceeds MAX_UINT64
193  *
194  *	scaledout:   Pointer to a string buffer to fill with the scaled string.
195  *	widthout:	width of number (not including modifier and unit)
196  *			in the input string.  "10.0MB" has a width of 4.
197  *	modiferout:	pointer to the string in the modifiers array which
198  *			was found in the input string.  If no modifer was
199  *			found, this well be set to NULL;
200  */
201 int scaledtoscaled(char *scaledin, int widthin, char *maxmodifier,
202     char *scaledout, int *widthout, char ** modifierout,
203     scale_t *scale, char *unit, int flags);
204 
205 /*
206  * scaledeqscaled
207  *
208  * Determine if two scaled strings are equivalent.  Flags are same as
209  * scaledtouint64.
210  */
211 int scaledeqscaled(char *scale1, char *scale2,
212     scale_t *scale, char *unit, int flags);
213 
214 /*
215  * scaledequint64
216  *
217  * Determine if a scaled number is equal to an uint64.  The uint64 is scaled
218  * to the same scale and width as the scaled strings.  If the resultant string
219  * is equal, then the numbers are considered equal.
220  *
221  * minwidth:  minimum number width to scale string and number to for
222  *	      comparision.
223  * flags are same as scaledtouint64.
224  */
225 int scaledequint64(char *scaled, uint64_t uint64, int minwidth,
226     scale_t *scale, char *unit, int flags);
227 
228 #ifdef	__cplusplus
229 }
230 #endif
231 
232 #endif	/* _UTILS_H */
233