ToString.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "core/ToString.h"
  2. #include <stdarg.h>
  3. #include <stdio.h>
  4. #include "core/BitArray.h"
  5. #include "core/Box.h"
  6. #include "core/HashMap.h"
  7. #include "core/Matrix.h"
  8. #include "core/Plane.h"
  9. #include "core/Queue.h"
  10. #include "core/Utility.h"
  11. size_t coreToString(char* buffer, size_t n, const char* format, ...) {
  12. va_list args;
  13. va_start(args, format);
  14. int w = vsnprintf(buffer, n, format, args);
  15. va_end(args);
  16. return w < 0 ? 0 : (size_t)w;
  17. }
  18. size_t toStringSize(const void* p, char* buffer, size_t n) {
  19. return toString(buffer, n, "%zu", *(const size_t*)p);
  20. }
  21. size_t toStringInt(const void* p, char* buffer, size_t n) {
  22. return toString(buffer, n, "%d", *(const int*)p);
  23. }
  24. void stringAdd(size_t* w, char** buffer, size_t* n, size_t shift) {
  25. *w += shift;
  26. if(*n > shift) {
  27. *buffer += shift;
  28. *n -= shift;
  29. } else {
  30. *n = 0;
  31. }
  32. }
  33. size_t toStringBitArray(const BitArray* a, char* buffer, size_t n) {
  34. size_t w = 0;
  35. stringAdd(&w, &buffer, &n, coreToString(buffer, n, "["));
  36. size_t length = a->length;
  37. if(length > 0) {
  38. length--;
  39. for(size_t i = 0; i < length; i++) {
  40. u64 v = getBits(a, i);
  41. stringAdd(&w, &buffer, &n, coreToString(buffer, n, "%lu, ", v));
  42. }
  43. u64 v = getBits(a, length);
  44. stringAdd(&w, &buffer, &n, coreToString(buffer, n, "%lu", v));
  45. }
  46. stringAdd(&w, &buffer, &n, coreToString(buffer, n, "]"));
  47. return w;
  48. }
  49. size_t toStringBox(const Box* box, char* buffer, size_t n) {
  50. return coreToString(buffer, n,
  51. "Box([%.3f, %.3f, %.3f], [%.3f, %.3f, %.3f])",
  52. (double)box->min.data[0], (double)box->min.data[1],
  53. (double)box->min.data[2], (double)box->max.data[0],
  54. (double)box->max.data[1], (double)box->max.data[2]);
  55. }
  56. size_t toStringMatrix(const Matrix* m, char* buffer, size_t n) {
  57. size_t w = 0;
  58. stringAdd(&w, &buffer, &n, toString(buffer, n, "["));
  59. stringAdd(&w, &buffer, &n, toStringV4(m->data + 0, buffer, n));
  60. stringAdd(&w, &buffer, &n, toString(buffer, n, ", "));
  61. stringAdd(&w, &buffer, &n, toStringV4(m->data + 1, buffer, n));
  62. stringAdd(&w, &buffer, &n, toString(buffer, n, ", "));
  63. stringAdd(&w, &buffer, &n, toStringV4(m->data + 2, buffer, n));
  64. stringAdd(&w, &buffer, &n, toString(buffer, n, ", "));
  65. stringAdd(&w, &buffer, &n, toStringV4(m->data + 3, buffer, n));
  66. stringAdd(&w, &buffer, &n, toString(buffer, n, "]"));
  67. return w;
  68. }
  69. size_t toStringPlane(const Plane* p, char* buffer, size_t n) {
  70. return coreToString(buffer, n, "(%.3f x + %.3f y + %.3f z + %.3f)",
  71. (double)p->abc.data[0], (double)p->abc.data[1],
  72. (double)p->abc.data[2], (double)p->d);
  73. }
  74. size_t toStringQueue(const Queue* r, char* buffer, size_t n, ToString c) {
  75. size_t w = 0;
  76. stringAdd(&w, &buffer, &n, coreToString(buffer, n, "["));
  77. size_t end = r->length;
  78. if(end > 0) {
  79. end--;
  80. for(size_t i = 0; i < end; i++) {
  81. stringAdd(&w, &buffer, &n, c(getQueueIndex(r, i), buffer, n));
  82. stringAdd(&w, &buffer, &n, coreToString(buffer, n, ", "));
  83. }
  84. stringAdd(&w, &buffer, &n, c(getQueueIndex(r, end), buffer, n));
  85. }
  86. stringAdd(&w, &buffer, &n, coreToString(buffer, n, "]"));
  87. return w;
  88. }