]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Lib: recursive printf
authorJan Maria Matejka <mq@ucw.cz>
Wed, 22 Aug 2018 12:58:53 +0000 (14:58 +0200)
committerJan Maria Matejka <mq@ucw.cz>
Wed, 22 Aug 2018 13:14:06 +0000 (15:14 +0200)
Use like this:

void func(const char *msg, va_list args) {
  ...
  bvsnprintf(buf, len, "file %s, line %d: %V (foo %d, bar %d)", file, line, msg, &args, foo, bar);
  ...
}

lib/printf.c

index 533a1300b0b0471a2694d56abd7340d791d4f6c6..cafeeb93157ee133b6f2a125416b978270265e9b 100644 (file)
@@ -270,6 +270,17 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args)
                                *str++ = ' ';
                        continue;
 
+               case 'V': {
+                       const char *vfmt = va_arg(args, const char *);
+                       va_list *vargs = va_arg(args, va_list *);
+                       int res = bvsnprintf(str, size, vfmt, *vargs);
+                       if (res < 0)
+                               return -1;
+                       str += res;
+                       size -= res;
+                       continue;
+                       }
+
                case 'p':
                        if (field_width == -1) {
                                field_width = 2*sizeof(void *);