Guest User

Untitled

a guest
Sep 17th, 2018
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.15 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stdarg.h>
  4.  
  5. __attribute__((format(printf, 1, 0)))
  6. static char* strdup_printf(const char* fmt, va_list ap)
  7. {
  8. char* str = NULL;
  9. int required_size = 0;
  10. va_list ap_copy;
  11.  
  12. // find out required size
  13. va_copy(ap_copy, ap);
  14. required_size = vsnprintf(NULL, 0, fmt, ap) + 1; // add 1 for \0
  15. va_end(ap);
  16. if (required_size > 0)
  17. str = (char*)malloc((size_t)required_size);
  18. // write to str
  19. if (str != NULL)
  20. {
  21. va_copy(ap_copy, ap);
  22. vsnprintf(str, (size_t)required_size, fmt, ap);
  23. va_end(ap);
  24. }
  25. return str;
  26. }
  27.  
  28. __attribute__((format(printf, 1, 2)))
  29. char* w_strdup_printf(const char* fmt, ...)
  30. {
  31. va_list ap;
  32. char* msg;
  33. va_start(ap, fmt);
  34. msg = strdup_printf(fmt, ap);
  35. va_end(ap);
  36. return msg;
  37. }
  38.  
  39. int main()
  40. {
  41. //printf("=== FIRST\n");
  42. char* a = w_strdup_printf("generror %s %d", "abcd", 70);
  43. printf("a %p\n", a);
  44. free(a);
  45. //printf("=== SECOND\n");
  46. char* b = w_strdup_printf("generro %s %d", "zabcd", 70);
  47. printf("b %p\n", b);
  48. free(b);
  49. return 0;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment