aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Fleischer <calcurse@cryptocrack.de>2012-07-07 18:10:12 +0200
committerLukas Fleischer <calcurse@cryptocrack.de>2012-07-07 21:36:38 +0200
commit88588ad704329939834b45eb2058fb48f0a5068f (patch)
tree37156cf05dd7ce803d381089cbca977135790b7d
parent7fb25a84d427f4a3cb79ea02908daf9ce8ba07ca (diff)
downloadcalcurse-88588ad704329939834b45eb2058fb48f0a5068f.tar.gz
calcurse-88588ad704329939834b45eb2058fb48f0a5068f.zip
Refactor exception handling
Remove the exception handling code from recur_*_erase() and move it to separate functions recur_*_add_exc(). Create a wrapper function day_item_add_exc() that can be used to add an exception to generic items. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
-rw-r--r--src/calcurse.h7
-rw-r--r--src/day.c15
-rw-r--r--src/interaction.c15
-rw-r--r--src/recur.c89
4 files changed, 72 insertions, 54 deletions
diff --git a/src/calcurse.h b/src/calcurse.h
index b0f1477..25a91e3 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -671,6 +671,7 @@ char *day_item_get_note(struct day_item *);
void day_item_erase_note(struct day_item *);
long day_item_get_duration(struct day_item *);
int day_item_get_state(struct day_item *);
+void day_item_add_exc(struct day_item *, long);
void day_item_fork(struct day_item *, struct day_item *);
int day_store_items(long, unsigned *, unsigned *, regex_t *);
struct day_items_nb *day_process_storage(struct date *, unsigned,
@@ -887,8 +888,10 @@ unsigned recur_event_find_occurrence(struct recur_event *, long, unsigned *);
unsigned recur_item_inday(long, long, llist_t *, int, int, long, long);
unsigned recur_apoint_inday(struct recur_apoint *, long *);
unsigned recur_event_inday(struct recur_event *, long *);
-void recur_event_erase(struct recur_event *, long, unsigned, enum eraseflg);
-void recur_apoint_erase(struct recur_apoint *, long, unsigned, enum eraseflg);
+void recur_event_add_exc(struct recur_event *, long);
+void recur_apoint_add_exc(struct recur_apoint *, long);
+void recur_event_erase(struct recur_event *, enum eraseflg);
+void recur_apoint_erase(struct recur_apoint *, enum eraseflg);
void recur_exc_scan(llist_t *, FILE *);
struct notify_app *recur_apoint_check_next(struct notify_app *, long, long);
void recur_apoint_switch_notify(struct recur_apoint *);
diff --git a/src/day.c b/src/day.c
index 10caa05..bb949dc 100644
--- a/src/day.c
+++ b/src/day.c
@@ -168,6 +168,17 @@ int day_item_get_state(struct day_item *day)
}
}
+/* Add an exception to an item. */
+void day_item_add_exc(struct day_item *day, long date)
+{
+ switch (day->type) {
+ case RECUR_EVNT:
+ recur_event_add_exc(day->item.rev, date);
+ case RECUR_APPT:
+ recur_apoint_add_exc(day->item.rapt, date);
+ }
+}
+
/* Clone the actual item. */
void day_item_fork(struct day_item *day_in, struct day_item *day_out)
{
@@ -648,13 +659,13 @@ struct day_item *day_cut_item(long date, int item_number)
event_delete(p->item.ev, ERASE_CUT);
break;
case RECUR_EVNT:
- recur_event_erase(p->item.rev, date, 1, ERASE_CUT);
+ recur_event_erase(p->item.rev, ERASE_CUT);
break;
case APPT:
apoint_delete(p->item.apt, ERASE_CUT);
break;
case RECUR_APPT:
- recur_apoint_erase(p->item.rapt, date, 1, ERASE_CUT);
+ recur_apoint_erase(p->item.rapt, ERASE_CUT);
break;
default:
EXIT(_("unknwon type"));
diff --git a/src/interaction.c b/src/interaction.c
index 4d71520..d61ea4e 100644
--- a/src/interaction.c
+++ b/src/interaction.c
@@ -385,8 +385,6 @@ static int day_erase_item(long date, int item_number, enum eraseflg flag)
"Delete (i)tem or just its (n)ote ?");
const char *note_choices = _("[in]");
const int nb_note_choices = 2;
- int ans;
- unsigned delete_whole;
p = day_get_item(item_number);
if (flag == ERASE_DONT_FORCE && day_item_get_note(p)) {
@@ -408,23 +406,20 @@ static int day_erase_item(long date, int item_number, enum eraseflg flag)
} else if (p->type == APPT) {
apoint_delete(p->item.apt, flag);
} else {
- ans = status_ask_choice(erase_warning, erase_choices, nb_erase_choices);
-
- switch (ans) {
+ switch (status_ask_choice(erase_warning, erase_choices, nb_erase_choices)) {
case 1:
- delete_whole = 1;
break;
case 2:
- delete_whole = 0;
- break;
+ day_item_add_exc(p, date);
+ return 0;
default:
return 0;
}
if (p->type == RECUR_EVNT) {
- recur_event_erase(p->item.rev, date, delete_whole, flag);
+ recur_event_erase(p->item.rev, flag);
} else {
- recur_apoint_erase(p->item.rapt, date, delete_whole, flag);
+ recur_apoint_erase(p->item.rapt, flag);
}
}
diff --git a/src/recur.c b/src/recur.c
index d8215d1..335cbf6 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -672,37 +672,53 @@ unsigned recur_event_inday(struct recur_event *rev, long *day_start)
rev->rpt->freq, rev->rpt->until, *day_start);
}
+/* Add an exception to a recurrent event. */
+void
+recur_event_add_exc(struct recur_event *rev, long date)
+{
+ recur_add_exc(&rev->exc, date);
+}
+
+/* Add an exception to a recurrent appointment. */
+void
+recur_apoint_add_exc(struct recur_apoint *rapt, long date)
+{
+ int need_check_notify = 0;
+
+ if (notify_bar())
+ need_check_notify = notify_same_recur_item(rapt);
+ recur_add_exc(&rapt->exc, date);
+ if (need_check_notify)
+ notify_check_next_app(0);
+}
+
/*
* Delete a recurrent event from the list (if delete_whole is not null),
* or delete only one occurence of the recurrent event.
*/
void
-recur_event_erase(struct recur_event *rev, long start, unsigned delete_whole,
- enum eraseflg flag)
+recur_event_erase(struct recur_event *rev, enum eraseflg flag)
{
llist_item_t *i = LLIST_FIND_FIRST(&recur_elist, rev, NULL);
if (!i)
EXIT(_("event not found"));
- if (delete_whole) {
- switch (flag) {
- case ERASE_CUT:
- LLIST_REMOVE(&recur_elist, i);
- return;
- default:
- LLIST_REMOVE(&recur_elist, i);
- mem_free(rev->mesg);
- if (rev->rpt) {
- mem_free(rev->rpt);
- rev->rpt = 0;
- }
- free_exc_list(&rev->exc);
- mem_free(rev);
- break;
+ switch (flag) {
+ case ERASE_CUT:
+ LLIST_REMOVE(&recur_elist, i);
+ return;
+ default:
+ LLIST_REMOVE(&recur_elist, i);
+ mem_free(rev->mesg);
+ if (rev->rpt) {
+ mem_free(rev->rpt);
+ rev->rpt = 0;
}
- } else
- recur_add_exc(&rev->exc, start);
+ free_exc_list(&rev->exc);
+ mem_free(rev);
+ break;
+ }
}
/*
@@ -710,8 +726,7 @@ recur_event_erase(struct recur_event *rev, long start, unsigned delete_whole,
* or delete only one occurence of the recurrent appointment.
*/
void
-recur_apoint_erase(struct recur_apoint *rapt, long start,
- unsigned delete_whole, enum eraseflg flag)
+recur_apoint_erase(struct recur_apoint *rapt, enum eraseflg flag)
{
llist_item_t *i = LLIST_TS_FIND_FIRST(&recur_alist_p, rapt, NULL);
int need_check_notify = 0;
@@ -722,28 +737,22 @@ recur_apoint_erase(struct recur_apoint *rapt, long start,
LLIST_TS_LOCK(&recur_alist_p);
if (notify_bar())
need_check_notify = notify_same_recur_item(rapt);
- if (delete_whole) {
- switch (flag) {
- case ERASE_CUT:
- LLIST_TS_REMOVE(&recur_alist_p, i);
- break;
- default:
- LLIST_TS_REMOVE(&recur_alist_p, i);
- mem_free(rapt->mesg);
- if (rapt->rpt) {
- mem_free(rapt->rpt);
- rapt->rpt = 0;
- }
- free_exc_list(&rapt->exc);
- mem_free(rapt);
- if (need_check_notify)
- notify_check_next_app(0);
- break;
+ switch (flag) {
+ case ERASE_CUT:
+ LLIST_TS_REMOVE(&recur_alist_p, i);
+ break;
+ default:
+ LLIST_TS_REMOVE(&recur_alist_p, i);
+ mem_free(rapt->mesg);
+ if (rapt->rpt) {
+ mem_free(rapt->rpt);
+ rapt->rpt = 0;
}
- } else {
- recur_add_exc(&rapt->exc, start);
+ free_exc_list(&rapt->exc);
+ mem_free(rapt);
if (need_check_notify)
notify_check_next_app(0);
+ break;
}
LLIST_TS_UNLOCK(&recur_alist_p);
}