runevsmprint.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "fmtdef.h"
  4. static int
  5. runeFmtStrFlush(Fmt *f)
  6. {
  7. Rune *s;
  8. int n;
  9. if(f->start == nil)
  10. return 0;
  11. n = (int)f->farg;
  12. n *= 2;
  13. s = f->start;
  14. f->start = realloc(s, sizeof(Rune)*n);
  15. if(f->start == nil){
  16. f->farg = nil;
  17. f->to = nil;
  18. f->stop = nil;
  19. free(s);
  20. return 0;
  21. }
  22. f->farg = (void*)n;
  23. f->to = (Rune*)f->start + ((Rune*)f->to - s);
  24. f->stop = (Rune*)f->start + n - 1;
  25. return 1;
  26. }
  27. int
  28. runefmtstrinit(Fmt *f)
  29. {
  30. int n;
  31. memset(f, 0, sizeof *f);
  32. f->runes = 1;
  33. n = 32;
  34. f->start = malloc(sizeof(Rune)*n);
  35. if(f->start == nil)
  36. return -1;
  37. f->to = f->start;
  38. f->stop = (Rune*)f->start + n - 1;
  39. f->flush = runeFmtStrFlush;
  40. f->farg = (void*)n;
  41. f->nfmt = 0;
  42. return 0;
  43. }
  44. /*
  45. * print into an allocated string buffer
  46. */
  47. Rune*
  48. runevsmprint(char *fmt, va_list args)
  49. {
  50. Fmt f;
  51. int n;
  52. if(runefmtstrinit(&f) < 0)
  53. return nil;
  54. f.args = args;
  55. n = dofmt(&f, fmt);
  56. if(f.start == nil)
  57. return nil;
  58. if(n < 0){
  59. free(f.start);
  60. return nil;
  61. }
  62. *(Rune*)f.to = '\0';
  63. return f.start;
  64. }