dvector.c
上传用户:knt0001
上传日期:2022-01-28
资源大小:264k
文件大小:1k
源码类别:

Email客户端

开发平台:

C/C++

  1. #include "dvector.h"
  2. #include "dutil.h"
  3. struct __dvhdr {
  4. size_t size;
  5. size_t length;
  6. dvDestructor destroy;
  7. };
  8. dvector
  9. dvCreate(size_t size, dvDestructor destr)
  10. {
  11. void *mem = xmalloc(sizeof(struct __dvhdr) + (sizeof(void *) * (size+1)));
  12. struct __dvhdr *hdr=mem;
  13. dvector ptr = mem+sizeof(struct __dvhdr);
  14. hdr->size = size;
  15. hdr->length = 0;
  16. hdr->destroy = destr;
  17. return ptr;
  18. }
  19. void
  20. dvAddItem(dvector *vec, void *item)
  21. {
  22. void *mem = (((void *)*vec) - sizeof(struct __dvhdr));
  23. struct __dvhdr *hdr=mem;
  24. size_t size = hdr->size;
  25. if (hdr->length >= size) {
  26. size *= 2;
  27. mem = xrealloc(mem, sizeof(struct __dvhdr) + 
  28. (sizeof(void *) * (size+1)));
  29. hdr = mem;
  30. hdr->size = size;
  31. *vec = mem + sizeof(struct __dvhdr);
  32. }
  33. (*vec)[hdr->length++] = item;
  34. (*vec)[hdr->length] = NULL;
  35. }
  36. void
  37. dvDestroy(dvector vec)
  38. {
  39. void *mem = (((void *)vec) - sizeof(struct __dvhdr));
  40. struct __dvhdr *hdr=mem;
  41. if (hdr->destroy) {
  42. uint i;
  43. for (i=0; i < hdr->length; i++) {
  44. hdr->destroy(vec[i]);
  45. }
  46. }
  47. xfree(mem);
  48. }
  49. size_t
  50. dvSize(dvector vec)
  51. {
  52. void *mem = (((void *)vec) - sizeof(struct __dvhdr));
  53. struct __dvhdr *hdr=mem;
  54. return hdr->size;
  55. }
  56. size_t
  57. dvLength(dvector vec)
  58. {
  59. void *mem = (((void *)vec) - sizeof(struct __dvhdr));
  60. struct __dvhdr *hdr=mem;
  61. return hdr->length;
  62. }