cstack.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "cstack.h"
  4. static void* cstack_malloc();
  5. static void cstack_free_node(cstack_node* nd);
  6. static void cstack_free_Item(cstack_Item* nd);
  7. static void cstack_free(cstack_t st);
  8. void _sf_cstack_create(cstack_t* header, cstack_constructor_t c, cstack_destructor_t d, size_t type_size) {
  9. (*header) = (cstack_t) cstack_malloc();
  10. (*header)->constructor = c;
  11. (*header)->constructor = d;
  12. (*header)->bytes = type_size;
  13. (*header)->head = NULL;
  14. (*header)->size = 0;
  15. }
  16. void _sf_cstack_pop(cstack_t cs) {
  17. cstack_destructor_t destructor = cs->destructor;
  18. cstack_node* tmp = cstack_unpack(cs);
  19. if (tmp) {
  20. cs->head = cs->head->next;
  21. --cs->size;
  22. if (destructor) {
  23. destructor(tmp->mem->data);
  24. }
  25. free(tmp->mem->data);
  26. cstack_free_Item(tmp->mem);
  27. cstack_free_node(tmp);
  28. }
  29. }
  30. cstack_node* sf_cstack_peek(cstack_t stack, size_t count) {
  31. cstack_node* tmp = stack->head;
  32. size_t i = 1;
  33. while (i++ < count) {
  34. tmp = tmp->next;
  35. }
  36. return tmp;
  37. }
  38. void sf_cstack_destroy(cstack_t st) {
  39. cstack_node* current_node = cstack_unpack(st);
  40. cstack_node* next_node = NULL;
  41. cstack_destructor_t destructor = st->destructor;
  42. while (current_node != NULL) {
  43. next_node = current_node->next;
  44. if (destructor) {
  45. destructor(current_node->mem->data);
  46. }
  47. free(current_node->mem->data);
  48. cstack_free_Item(current_node->mem);
  49. cstack_free_node(current_node);
  50. current_node = next_node;
  51. }
  52. }
  53. /*
  54. ****************************** STATIC FUNCTION *******************************
  55. */
  56. static void* cstack_malloc() {
  57. return malloc(sizeof(cstack_header));
  58. }
  59. static void cstack_free_node(cstack_node* nd) {
  60. free(nd);
  61. }
  62. static void cstack_free_Item(cstack_Item* nd) {
  63. free(nd);
  64. }
  65. static void cstack_free(cstack_t st) {
  66. free(st);
  67. }