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