1 #ifndef FMT__NUMBER__H__
2 #define FMT__NUMBER__H__
3 
4 #include <stdarg.h>
5 struct str;
6 
7 /** \defgroup fmt fmt: Formatting Functions
8 
9 \par Function Naming
10 
11 -# Prefix
12    - \c fmt_ : Always present
13 -# Data type
14    - \c s : Signed integer (long)
15    - \c u : Unsigned integer (long)
16    - \c sll : Signed long long integer
17    - \c ull : Unsigned long long integer
18 -# Conversion type
19    - \c num : Generic number
20    - \c dec : Decimal
21    - \c hex : Hexadecimal (lower case)
22    - \c Hex : Hexadecimal (upper case)
23 -# Width / Padding
24    - \c w : (optional) Pad out the result to a minimum width
25 
26 For example, \c fmt_sdecw formats a signed integer using decimal with
27 width padding.
28 
29 \par Calling Convention
30 
31 Parameters to the fmt functions are passed in the following order.
32 The presence of all parameters, except for \c buffer, is dependant on
33 which function is being used.
34 
35 -# \c buffer : The character string into which to put the data result.
36    If this is \c NULL, no data is written, and only the length is
37    calculated.  This is useful for determining how long a formatted
38    string might be.
39 -# \c number or \c data : The input data item to convert.
40 -# \c width : The minimum output width.
41 -# \c pad : The character with which to pad the output.
42 -# \c base : The numerical base to use.
43 -# \c digits : The array of digits to use.
44 
45 \par Return Value
46 
47 All fmt functions return the number of bytes written to the buffer
48 space.
49 
50 @{ */
51 
52 /** The maximum space used by a formatted number.  This value is long
53   enough for 2^128 plus a trailing \c NUL byte. */
54 #define FMT_ULONG_LEN 40
55 
56 extern const char fmt_lcase_digits[36];
57 extern const char fmt_ucase_digits[36];
58 
59 extern unsigned fmt_pad(char* buffer, unsigned width, char pad);
60 extern unsigned fmt_sign_pad(char* buffer, int sign,
61 			     unsigned width, char pad);
62 
63 /** \name Signed integer conversions
64  * @{ */
65 
66 extern unsigned fmt_snumw(char* buffer, long num,
67 			  unsigned width, char pad,
68 			  unsigned base, const char* digits);
69 extern unsigned fmt_sdec(char* buffer, long num);
70 extern unsigned fmt_sdecw(char* buffer, long num,
71 			  unsigned width, char pad);
72 
73 /** @} */
74 
75 /** \name Signed long long integer conversions
76  * @{ */
77 
78 extern unsigned fmt_sllnumw(char* buffer, long long num,
79 			    unsigned width, char pad,
80 			    unsigned base, const char* digits);
81 extern unsigned fmt_slldec(char* buffer, long long num);
82 extern unsigned fmt_slldecw(char* buffer, long long num,
83 			    unsigned width, char pad);
84 
85 /** @} */
86 
87 /** \name Unsigned integer conversions
88  * @{ */
89 
90 extern unsigned fmt_unumw(char* buffer, unsigned long num,
91 			  unsigned width, char pad,
92 			  unsigned base, const char* digits);
93 extern unsigned fmt_udec(char* buffer, unsigned long num);
94 extern unsigned fmt_udecw(char* buffer, unsigned long num,
95 			  unsigned width, char pad);
96 extern unsigned fmt_uhex(char* buffer, unsigned long num);
97 extern unsigned fmt_uhexw(char* buffer, unsigned long num,
98 			  unsigned width, char pad);
99 extern unsigned fmt_uHex(char* buffer, unsigned long num);
100 extern unsigned fmt_uHexw(char* buffer, unsigned long num,
101 			  unsigned width, char pad);
102 
103 /** @} */
104 
105 /** \name Unsigned long long integer conversions
106  * @{ */
107 
108 extern unsigned fmt_ullnumw(char* buffer, unsigned long long num,
109 			    unsigned width, char pad,
110 			    unsigned base, const char* digits);
111 extern unsigned fmt_ulldec(char* buffer, unsigned long long num);
112 extern unsigned fmt_ulldecw(char* buffer, unsigned long long num,
113 			    unsigned width, char pad);
114 extern unsigned fmt_ullhex(char* buffer, unsigned long long num);
115 extern unsigned fmt_ullhexw(char* buffer, unsigned long long num,
116 			    unsigned width, char pad);
117 extern unsigned fmt_ullHex(char* buffer, unsigned long long num);
118 extern unsigned fmt_ullHexw(char* buffer, unsigned long long num,
119 			    unsigned width, char pad);
120 
121 /** @} */
122 
123 /** \name Miscelaneous formatting
124 
125 @{ */
126 
127 extern unsigned fmt_char(char* buffer, int ch, unsigned width, char pad);
128 extern unsigned fmt_mem(char* buffer, const char* s, unsigned length,
129 			unsigned width, char pad);
130 extern unsigned fmt_chars(char* buffer, const char* s,
131 			  unsigned width, char pad);
132 extern unsigned fmt_str(char* buffer, const struct str* s,
133 			unsigned width, char pad);
134 
135 /** @} */
136 
137 /** \name Multiple item formatting
138 
139 @{ */
140 
141 /** Format function prototype, used by the "@" conversion in fmt_multi() */
142 typedef unsigned (*fmt_function)(char* buffer,
143 				 const void* data,
144 				 unsigned width,
145 				 char pad);
146 
147 extern unsigned fmt_multi(char* buffer, const char* format, ...);
148 extern unsigned fmt_multiv(char* buffer, const char* format, va_list ap);
149 
150 /** @} */
151 
152 /** @} */
153 
154 #endif
155