From f513fa4627fe88f7c45bbeaa0d2842201c108a01 Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Fri, 16 May 2014 09:45:11 +0200
Subject: Store appointments for the current day in a vector

This allows for more efficient access to items at specific positions.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/calcurse.h |  2 +-
 src/day.c      | 36 +++++++++++++++++++-----------------
 src/utils.c    |  2 +-
 3 files changed, 21 insertions(+), 19 deletions(-)

(limited to 'src')

diff --git a/src/calcurse.h b/src/calcurse.h
index 421a02a..54344bb 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -697,7 +697,7 @@ void custom_keys_config(void);
 void custom_config_main(void);
 
 /* day.c */
-void day_free_list(void);
+void day_free_vector(void);
 char *day_item_get_mesg(struct day_item *);
 char *day_item_get_note(struct day_item *);
 void day_item_erase_note(struct day_item *);
diff --git a/src/day.c b/src/day.c
index 0a1a700..20e2e71 100644
--- a/src/day.c
+++ b/src/day.c
@@ -42,27 +42,27 @@
 
 #include "calcurse.h"
 
-static llist_t day_items;
+static vector_t day_items;
 
 static void day_free(struct day_item *day)
 {
 	mem_free(day);
 }
 
-static void day_init_list(void)
+static void day_init_vector(void)
 {
-	LLIST_INIT(&day_items);
+	VECTOR_INIT(&day_items, 16);
 }
 
 /*
- * Free the current day linked list containing the events and appointments.
+ * Free the current day vector containing the events and appointments.
  * Must not free associated message and note, because their are not dynamically
  * allocated (only pointers to real objects are stored in this structure).
  */
-void day_free_list(void)
+void day_free_vector(void)
 {
-	LLIST_FREE_INNER(&day_items, day_free);
-	LLIST_FREE(&day_items);
+	VECTOR_FREE_INNER(&day_items, day_free);
+	VECTOR_FREE(&day_items);
 }
 
 static int day_cmp_start(struct day_item *a, struct day_item *b)
@@ -88,7 +88,7 @@ static void day_add_item(int type, long start, union aptev_ptr item)
 	day->start = start;
 	day->item = item;
 
-	LLIST_ADD_SORTED(&day_items, day, day_cmp_start);
+	VECTOR_ADD(&day_items, day);
 }
 
 /* Get the message of an item. */
@@ -341,14 +341,16 @@ day_store_items(long date, unsigned *pnb_events, unsigned *pnb_apoints,
 	int nb_events, nb_recur_events;
 	int nb_apoints, nb_recur_apoints;
 
-	day_free_list();
-	day_init_list();
+	day_free_vector();
+	day_init_vector();
 
 	nb_recur_events = day_store_recur_events(date, regex);
 	nb_events = day_store_events(date, regex);
 	nb_recur_apoints = day_store_recur_apoints(date, regex);
 	nb_apoints = day_store_apoints(date, regex);
 
+	VECTOR_SORT(&day_items, day_cmp_start);
+
 	if (pnb_apoints)
 		*pnb_apoints = nb_apoints + nb_recur_apoints;
 	if (pnb_events)
@@ -470,15 +472,15 @@ display_item(struct day_item *day, int incolor, int width, int y, int x)
  */
 void day_write_pad(long date, int width, int length, int incolor)
 {
-	llist_item_t *i;
+	int i;
 	int line, item_number;
 	const int x_pos = 0;
 	unsigned draw_line = 0;
 
 	line = item_number = 0;
 
-	LLIST_FOREACH(&day_items, i) {
-		struct day_item *day = LLIST_TS_GET_DATA(i);
+	VECTOR_FOREACH(&day_items, i) {
+		struct day_item *day = VECTOR_NTH(&day_items, i);
 
 		/* First print the events for current day. */
 		if (day->type < RECUR_APPT) {
@@ -509,12 +511,12 @@ void day_write_pad(long date, int width, int length, int incolor)
 void day_write_stdout(long date, const char *fmt_apt, const char *fmt_rapt,
 		      const char *fmt_ev, const char *fmt_rev, int *limit)
 {
-	llist_item_t *i;
+	int i;
 
-	LLIST_FOREACH(&day_items, i) {
+	VECTOR_FOREACH(&day_items, i) {
 		if (*limit == 0)
 			break;
-		struct day_item *day = LLIST_TS_GET_DATA(i);
+		struct day_item *day = VECTOR_NTH(&day_items, i);
 
 		switch (day->type) {
 		case APPT:
@@ -727,7 +729,7 @@ int day_paste_item(struct day_item *p, long date)
 /* Returns a structure containing the selected item. */
 struct day_item *day_get_item(int item_number)
 {
-	return LLIST_GET_DATA(LLIST_NTH(&day_items, item_number - 1));
+	return VECTOR_NTH(&day_items, item_number - 1);
 }
 
 /* Attach a note to an appointment or event. */
diff --git a/src/utils.c b/src/utils.c
index 493a180..0bcd9db 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -102,7 +102,7 @@ void free_user_data(void)
 {
 	unsigned i;
 
-	day_free_list();
+	day_free_vector();
 	event_llist_free();
 	apoint_llist_free();
 	recur_apoint_llist_free();
-- 
cgit v1.2.3-70-g09d2