/crypto/heimdal/lib/roken/strpool.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 110 lines · 59 code · 10 blank · 41 comment · 11 complexity · 14075db444d2fd8c4fd3644c342e7966 MD5 · raw file

  1. /*
  2. * Copyright (c) 2005 Kungliga Tekniska Hรถgskolan
  3. * (Royal Institute of Technology, Stockholm, Sweden).
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. *
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. *
  17. * 3. Neither the name of the Institute nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
  22. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. * SUCH DAMAGE.
  32. */
  33. #include <config.h>
  34. #include <stdarg.h>
  35. #include <stdlib.h>
  36. #include "roken.h"
  37. struct rk_strpool {
  38. char *str;
  39. size_t len;
  40. };
  41. /*
  42. *
  43. */
  44. ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
  45. rk_strpoolfree(struct rk_strpool *p)
  46. {
  47. if (p->str) {
  48. free(p->str);
  49. p->str = NULL;
  50. }
  51. free(p);
  52. }
  53. /*
  54. *
  55. */
  56. ROKEN_LIB_FUNCTION struct rk_strpool * ROKEN_LIB_CALL
  57. rk_strpoolprintf(struct rk_strpool *p, const char *fmt, ...)
  58. {
  59. va_list ap;
  60. char *str, *str2;
  61. int len;
  62. if (p == NULL) {
  63. p = malloc(sizeof(*p));
  64. if (p == NULL)
  65. return NULL;
  66. p->str = NULL;
  67. p->len = 0;
  68. }
  69. va_start(ap, fmt);
  70. len = vasprintf(&str, fmt, ap);
  71. va_end(ap);
  72. if (str == NULL) {
  73. rk_strpoolfree(p);
  74. return NULL;
  75. }
  76. str2 = realloc(p->str, len + p->len + 1);
  77. if (str2 == NULL) {
  78. rk_strpoolfree(p);
  79. return NULL;
  80. }
  81. p->str = str2;
  82. memcpy(p->str + p->len, str, len + 1);
  83. p->len += len;
  84. free(str);
  85. return p;
  86. }
  87. /*
  88. *
  89. */
  90. ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
  91. rk_strpoolcollect(struct rk_strpool *p)
  92. {
  93. char *str;
  94. if (p == NULL)
  95. return strdup("");
  96. str = p->str;
  97. p->str = NULL;
  98. free(p);
  99. return str;
  100. }