/src/util/bsdstring.c

https://github.com/Stephen-Gose-Game-Studio/server · C · 130 lines · 109 code · 17 blank · 4 comment · 35 complexity · 998dbb0d8128e313b6610765d714e87d MD5 · raw file

  1. #include <platform.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <assert.h>
  6. #include <stdarg.h>
  7. #include <limits.h>
  8. #include "bsdstring.h"
  9. #include "log.h"
  10. int wrptr(char **ptr, size_t * size, int result)
  11. {
  12. size_t bytes = (size_t)result;
  13. if (result < 0) {
  14. /* buffer was too small */
  15. if (*size > 0) {
  16. **ptr = 0;
  17. *size = 0;
  18. }
  19. errno = 0;
  20. return ERANGE;
  21. }
  22. if (bytes == 0) {
  23. return 0;
  24. }
  25. if (bytes <= *size) {
  26. *ptr += bytes;
  27. *size -= bytes;
  28. return 0;
  29. }
  30. *ptr += *size;
  31. *size = 0;
  32. return ERANGE;
  33. }
  34. #ifndef HAVE_STRLCPY
  35. #define HAVE_STRLCPY
  36. size_t strlcpy(char *dst, const char *src, size_t siz)
  37. { /* copied from OpenBSD source code */
  38. register char *d = dst;
  39. register const char *s = src;
  40. register size_t n = siz;
  41. assert(src && dst);
  42. /* Copy as many bytes as will fit */
  43. if (n != 0 && --n != 0) {
  44. do {
  45. if ((*d++ = *s++) == 0)
  46. break;
  47. } while (--n != 0);
  48. }
  49. /* Not enough room in dst, add NUL and traverse rest of src */
  50. if (n == 0) {
  51. if (siz != 0)
  52. *d = '\0'; /* NUL-terminate dst */
  53. while (*s++);
  54. }
  55. return (s - src - 1); /* count does not include NUL */
  56. }
  57. #endif
  58. char * strlcpy_w(char *dst, const char *src, size_t *siz, const char *err, const char *file, int line)
  59. {
  60. size_t bytes = strlcpy(dst, src, *siz);
  61. char * buf = dst;
  62. assert(bytes <= INT_MAX);
  63. if (wrptr(&buf, siz, (int)bytes) != 0) {
  64. if (err) {
  65. log_warning("%s: static buffer too small in %s:%d\n", err, file, line);
  66. } else {
  67. log_warning("static buffer too small in %s:%d\n", file, line);
  68. }
  69. }
  70. return buf;
  71. }
  72. #ifndef HAVE_STRLCAT
  73. #define HAVE_STRLCAT
  74. size_t strlcat(char *dst, const char *src, size_t siz)
  75. {
  76. register char *d = dst;
  77. register const char *s = src;
  78. register size_t n = siz;
  79. size_t dlen;
  80. /* Find the end of dst and adjust bytes left but don't go past end */
  81. while (*d != '\0' && n-- != 0)
  82. d++;
  83. dlen = d - dst;
  84. n = siz - dlen;
  85. if (n == 0)
  86. return (dlen + strlen(s));
  87. while (*s != '\0') {
  88. if (n != 1) {
  89. *d++ = *s;
  90. n--;
  91. }
  92. s++;
  93. }
  94. *d = '\0';
  95. return (dlen + (s - src)); /* count does not include NUL */
  96. }
  97. #endif
  98. #ifndef HAVE_SLPRINTF
  99. #define HAVE_SLPRINTF
  100. size_t slprintf(char * dst, size_t size, const char * format, ...)
  101. {
  102. va_list args;
  103. int result;
  104. va_start(args, format);
  105. result = vsnprintf(dst, size, format, args);
  106. va_end(args);
  107. if (result < 0 || result >= (int)size) {
  108. dst[size - 1] = '\0';
  109. return size;
  110. }
  111. return (size_t)result;
  112. }
  113. #endif