sprintf.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /* sprintf.c */
  2. /*
  3. * Copyright (c) 1997-2010, 2013-2014 Wind River Systems, Inc.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. */
  7. #include <stdarg.h>
  8. #include <stdio.h>
  9. #include <sys/cbprintf.h>
  10. struct emitter {
  11. char *ptr;
  12. int len;
  13. };
  14. static int sprintf_out(int c, struct emitter *p)
  15. {
  16. if (p->len > 1) { /* need to reserve a byte for EOS */
  17. *(p->ptr) = c;
  18. p->ptr += 1;
  19. p->len -= 1;
  20. }
  21. return 0; /* indicate keep going so we get the total count */
  22. }
  23. #ifdef __UVISION_VERSION
  24. int $Sub$$snprintf(char *_MLIBC_RESTRICT s, size_t len,
  25. const char *_MLIBC_RESTRICT format, ...)
  26. #else
  27. int snprintf(char *_MLIBC_RESTRICT s, size_t len,
  28. const char *_MLIBC_RESTRICT format, ...)
  29. #endif
  30. {
  31. va_list vargs;
  32. struct emitter p;
  33. int r;
  34. char dummy;
  35. if (len == 0) {
  36. s = &dummy; /* write final NUL to dummy, can't change *s */
  37. }
  38. p.ptr = s;
  39. p.len = (int) len;
  40. va_start(vargs, format);
  41. r = cbvprintf(sprintf_out, (void *) (&p), format, vargs);
  42. va_end(vargs);
  43. *(p.ptr) = 0;
  44. return r;
  45. }
  46. #ifdef __UVISION_VERSION
  47. int $Sub$$sprintf(char *_MLIBC_RESTRICT s, const char *_MLIBC_RESTRICT format, ...)
  48. #else
  49. int sprintf(char *_MLIBC_RESTRICT s, const char *_MLIBC_RESTRICT format, ...)
  50. #endif
  51. {
  52. va_list vargs;
  53. struct emitter p;
  54. int r;
  55. p.ptr = s;
  56. p.len = (int) 0x7fffffff; /* allow up to "maxint" characters */
  57. va_start(vargs, format);
  58. r = cbvprintf(sprintf_out, (void *) (&p), format, vargs);
  59. va_end(vargs);
  60. *(p.ptr) = 0;
  61. return r;
  62. }
  63. #ifdef __UVISION_VERSION
  64. int $Sub$$vsnprintf(char *_MLIBC_RESTRICT s, size_t len,
  65. const char *_MLIBC_RESTRICT format, va_list vargs)
  66. #else
  67. int vsnprintf(char *_MLIBC_RESTRICT s, size_t len,
  68. const char *_MLIBC_RESTRICT format, va_list vargs)
  69. #endif
  70. {
  71. struct emitter p;
  72. int r;
  73. char dummy;
  74. if (len == 0) {
  75. s = &dummy; /* write final NUL to dummy, can't change * *s */
  76. }
  77. p.ptr = s;
  78. p.len = (int) len;
  79. r = cbvprintf(sprintf_out, (void *) (&p), format, vargs);
  80. *(p.ptr) = 0;
  81. return r;
  82. }
  83. #ifdef __UVISION_VERSION
  84. int $Sub$$vsprintf(char *_MLIBC_RESTRICT s, const char *_MLIBC_RESTRICT format,
  85. va_list vargs)
  86. #else
  87. int vsprintf(char *_MLIBC_RESTRICT s, const char *_MLIBC_RESTRICT format,
  88. va_list vargs)
  89. #endif
  90. {
  91. struct emitter p;
  92. int r;
  93. p.ptr = s;
  94. p.len = (int) 0x7fffffff; /* allow up to "maxint" characters */
  95. r = cbvprintf(sprintf_out, (void *) (&p), format, vargs);
  96. *(p.ptr) = 0;
  97. return r;
  98. }