vec.c 958 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include <string.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include "vec.h"
  5. void vec_add1(struct vec_basestruct *ctl,size_t sz)
  6. {
  7. if (!ctl->alen) {
  8. ctl->alen = 8;
  9. if (SIZE_MAX / 8 < sz)
  10. ctl->alen = 1;
  11. ctl->buf = malloc(ctl->alen * sz);
  12. if (!ctl->buf)
  13. abort();
  14. } else if (ctl->len >= ctl->alen) {
  15. ctl->alen *= 2;
  16. if (SIZE_MAX / ctl->alen < sz)
  17. abort();
  18. ctl->buf = realloc(ctl->buf,ctl->alen * sz);
  19. if (!ctl->buf)
  20. abort();
  21. }
  22. ++ctl->len;
  23. }
  24. void vec_addn(struct vec_basestruct *ctl,size_t sz,size_t n)
  25. {
  26. if (!ctl->alen) {
  27. if (SIZE_MAX / 8 >= sz)
  28. ctl->alen = 8;
  29. else
  30. ctl->alen = 1;
  31. }
  32. size_t nlen = ctl->alen;
  33. ctl->len += n;
  34. while (ctl->len > nlen)
  35. nlen *= 2;
  36. if (nlen > ctl->alen) {
  37. ctl->alen = nlen;
  38. if (SIZE_MAX / nlen < sz)
  39. abort();
  40. ctl->buf = realloc(ctl->buf,nlen * sz);
  41. if (!ctl->buf)
  42. abort();
  43. } else if (!ctl->buf) {
  44. ctl->buf = malloc(ctl->alen * sz);
  45. if (!ctl->buf)
  46. abort();
  47. }
  48. }