X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcsnprintf.c;h=d49b6d1fa85df441aef677f93d99f3340432b281;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hp=501625abf21704d2fde80b45c65947fe00f2f165;hpb=0162cc800a7ca6f21bffe5f4c66f3c8ee357b564;p=silc.git diff --git a/lib/silcutil/silcsnprintf.c b/lib/silcutil/silcsnprintf.c index 501625ab..d49b6d1f 100644 --- a/lib/silcutil/silcsnprintf.c +++ b/lib/silcutil/silcsnprintf.c @@ -128,6 +128,7 @@ static size_t dopr(char *buffer, size_t maxlen, const char *format, int cflags; size_t currlen; va_list args; + SilcSnprintfRender render; silc_va_copy(args, args_in); @@ -354,6 +355,23 @@ static size_t dopr(char *buffer, size_t maxlen, const char *format, /* not supported yet, treat as next char */ ch = *format++; break; + case '@': + /* Renderer function */ + render = va_arg (args, SilcSnprintfRender); + if (render) { + void *ptr = va_arg (args, void *); + if (ptr) { + strvalue = render (ptr); + if (strvalue) { + if (max == -1) + max = strlen(strvalue); + if (min > 0 && max >= 0 && min > max) max = min; + fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max); + silc_free(strvalue); + } + } + } + break; default: /* Unknown, skip */ break;