Rev 2131 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2131 | Rev 2307 | ||
---|---|---|---|
Line 41... | Line 41... | ||
41 | size_t size; /* total space for string */ |
41 | size_t size; /* total space for string */ |
42 | size_t len; /* count of currently used characters */ |
42 | size_t len; /* count of currently used characters */ |
43 | char *string; /* destination string */ |
43 | char *string; /* destination string */ |
44 | }; |
44 | }; |
45 | 45 | ||
46 | int vsnprintf_write(const char *str, size_t count, struct vsnprintf_data *data); |
- | |
47 | - | ||
48 | /** Write string to given buffer. |
46 | /** Write string to given buffer. |
49 | * Write at most data->size characters including trailing zero. According to C99 has snprintf to return number |
47 | * Write at most data->size characters including trailing zero. According to C99 has snprintf to return number |
50 | * of characters that would have been written if enough space had been available. Hence the return value is not |
48 | * of characters that would have been written if enough space had been available. Hence the return value is not |
51 | * number of really printed characters but size of input string. Number of really used characters |
49 | * number of really printed characters but size of input string. Number of really used characters |
52 | * is stored in data->len. |
50 | * is stored in data->len. |
53 | * @param str source string to print |
51 | * @param str source string to print |
54 | * @param count size of source string |
52 | * @param count size of source string |
55 | * @param data structure with destination string, counter of used space and total string size. |
53 | * @param data structure with destination string, counter of used space and total string size. |
56 | * @return number of characters to print (not characters really printed!) |
54 | * @return number of characters to print (not characters really printed!) |
57 | */ |
55 | */ |
58 | int vsnprintf_write(const char *str, size_t count, struct vsnprintf_data *data) |
56 | static int vsnprintf_write(const char *str, size_t count, struct vsnprintf_data *data) |
59 | { |
57 | { |
60 | size_t i; |
58 | size_t i; |
61 | i = data->size - data->len; |
59 | i = data->size - data->len; |
62 | 60 | ||
63 | if (i == 0) { |
61 | if (i == 0) { |
Line 95... | Line 93... | ||
95 | * \see For more details about format string see printf_core. |
93 | * \see For more details about format string see printf_core. |
96 | */ |
94 | */ |
97 | int vsnprintf(char *str, size_t size, const char *fmt, va_list ap) |
95 | int vsnprintf(char *str, size_t size, const char *fmt, va_list ap) |
98 | { |
96 | { |
99 | struct vsnprintf_data data = {size, 0, str}; |
97 | struct vsnprintf_data data = {size, 0, str}; |
100 | struct printf_spec ps = {(int(*)(void *, size_t, void *))vsnprintf_write, &data}; |
98 | struct printf_spec ps = {(int(*)(void *, size_t, void *)) vsnprintf_write, &data}; |
101 | 99 | ||
102 | /* Print 0 at end of string - fix the case that nothing will be printed */ |
100 | /* Print 0 at end of string - fix the case that nothing will be printed */ |
103 | if (size > 0) |
101 | if (size > 0) |
104 | str[0] = 0; |
102 | str[0] = 0; |
105 | 103 |