events.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. Copyright (C) 2014 Olivier Marty <olivier.marty.m at gmail.com>
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU General Public License
  5. as published by the Free Software Foundation; either version 2
  6. of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  14. */
  15. #include "rich_text.h"
  16. #include "time.h"
  17. #include "string.h"
  18. #include "events.h"
  19. #include <assert.h>
  20. #include <stdlib.h>
  21. #include <stdio.h>
  22. t_events eventsInit(int initSize)
  23. {
  24. t_events events = {0,initSize,NULL};
  25. assert(initSize > 0);
  26. events.events = malloc(sizeof(t_event[initSize]));
  27. if(events.events == NULL)
  28. {
  29. perror("malloc()");
  30. exit(1);
  31. }
  32. return events;
  33. }
  34. int id_min(t_events events)
  35. {
  36. int min = 0, i;
  37. mytime tmin;
  38. if(events.size == 0)
  39. return -1;
  40. tmin = events.events[0].any.time;
  41. for(i = 1; i < events.size; i++)
  42. {
  43. if(timeDiff(events.events[i].any.time, tmin).tv_sec < 0)
  44. {
  45. min = i;
  46. tmin = events.events[i].any.time;
  47. }
  48. }
  49. return min;
  50. }
  51. // events must be non empty
  52. mytime eventsNextTime(t_events events)
  53. {
  54. int id = id_min(events);
  55. assert(id >= 0);
  56. return events.events[id].any.time;
  57. }
  58. // events must be non empty
  59. t_event eventsPop(t_events *events)
  60. {
  61. int id = id_min(*events);
  62. assert(id >= 0);
  63. t_event e = events->events[id];
  64. memmove(events->events+id, events->events+(id+1),
  65. sizeof(t_event[events->size-id-1]));
  66. events->size--;
  67. return e;
  68. }
  69. void eventsPush(t_events *events, t_event e)
  70. {
  71. if(events->size == events->maxsize)
  72. {
  73. events->maxsize *= 2;
  74. events->events = realloc(events->events, sizeof(t_event[events->maxsize]));
  75. if(events->events == NULL)
  76. {
  77. perror("realloc()");
  78. exit(1);
  79. }
  80. }
  81. events->events[events->size] = e;
  82. events->size++;
  83. }
  84. int eventsEmpty(t_events events)
  85. {
  86. return !events.size;
  87. }