Index: packages/infra/current/include/diag.h =================================================================== --- packages/infra/current/include/diag.h (.../etna/ecos/ecos-cvs/packages/infra/current) (revision 1835) +++ packages/infra/current/include/diag.h (.../trunk/etna/ecos/ecos-cvs/packages/infra/current) (revision 1861) @@ -102,6 +102,8 @@ CYGBLD_ATTRIB_PRINTF_FORMAT(3,4); externC int diag_vsprintf(char *buf, const char *fmt, va_list ap) CYGBLD_ATTRIB_PRINTF_FORMAT(2,0); +externC int diag_vsnprintf(char *buf, size_t len, const char *fmt, va_list ap) + CYGBLD_ATTRIB_PRINTF_FORMAT(3,0); externC int diag_vprintf(const char *fmt, va_list ap) CYGBLD_ATTRIB_PRINTF_FORMAT(1,0); Index: packages/infra/current/src/diag.cxx =================================================================== --- packages/infra/current/src/diag.cxx (.../etna/ecos/ecos-cvs/packages/infra/current) (revision 1835) +++ packages/infra/current/src/diag.cxx (.../trunk/etna/ecos/ecos-cvs/packages/infra/current) (revision 1861) @@ -284,6 +284,11 @@ #define is_digit(c) ((c >= '0') && (c <= '9')) +struct _sputc_info { + char *ptr; + int max, len; +}; + static int _vprintf(void (*putc)(char c, void **param), void **param, const char *fmt, va_list ap) { @@ -501,14 +506,10 @@ res++; } } - return (res); + + return (param ? ((struct _sputc_info *)param)->len : res); } -struct _sputc_info { - char *ptr; - int max, len; -}; - static void _sputc(char c, void **param) { @@ -566,6 +567,19 @@ return (info.len); } +int +diag_vsnprintf(char *buf, size_t len, const char *fmt, va_list ap) +{ + int ret; + struct _sputc_info info; + + info.ptr = buf; + info.max = len-1; + info.len = 0; + ret = _vprintf(_sputc, (void **)&info, fmt, ap); + return (info.len); +} + int diag_printf(const char *fmt, ...) {