From d118beceee701580948eb3c23fb0677920042422 Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <lfleischer@calcurse.org>
Date: Mon, 11 Jan 2016 20:02:37 +0100
Subject: Implement {apoint,event,todo}_tostr()

Add functions to serialize non-recurrent objects without immediately
writing them to stdout.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
---
 src/apoint.c   | 30 +++++++++++++++++++++---------
 src/calcurse.h |  3 +++
 src/event.c    | 21 ++++++++++++++++-----
 src/todo.c     | 18 ++++++++++++++----
 4 files changed, 54 insertions(+), 18 deletions(-)

(limited to 'src')

diff --git a/src/apoint.c b/src/apoint.c
index c169c07..263db9d 100644
--- a/src/apoint.c
+++ b/src/apoint.c
@@ -136,30 +136,42 @@ void apoint_sec2str(struct apoint *o, long day, char *start, char *end)
 	}
 }
 
-void apoint_write(struct apoint *o, FILE * f)
+char *apoint_tostr(struct apoint *o)
 {
+	struct string s;
 	struct tm lt;
 	time_t t;
 
+	string_init(&s);
+
 	t = o->start;
 	localtime_r(&t, &lt);
-	fprintf(f, "%02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1, lt.tm_mday,
-		1900 + lt.tm_year, lt.tm_hour, lt.tm_min);
+	string_catf(&s, "%02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1,
+		lt.tm_mday, 1900 + lt.tm_year, lt.tm_hour, lt.tm_min);
 
 	t = o->start + o->dur;
 	localtime_r(&t, &lt);
-	fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u ", lt.tm_mon + 1,
+	string_catf(&s, " -> %02u/%02u/%04u @ %02u:%02u", lt.tm_mon + 1,
 		lt.tm_mday, 1900 + lt.tm_year, lt.tm_hour, lt.tm_min);
 
-	if (o->note != NULL)
-		fprintf(f, ">%s ", o->note);
+	if (o->note)
+		string_catf(&s, ">%s ", o->note);
 
 	if (o->state & APOINT_NOTIFY)
-		fputc('!', f);
+		string_catf(&s, "%c", '!');
 	else
-		fputc('|', f);
+		string_catf(&s, "%c", '|');
+
+	string_catf(&s, "%s", o->mesg);
 
-	fprintf(f, "%s\n", o->mesg);
+	return string_buf(&s);
+}
+
+void apoint_write(struct apoint *o, FILE * f)
+{
+	char *str = apoint_tostr(o);
+	fprintf(f, "%s\n", str);
+	mem_free(str);
 }
 
 struct apoint *apoint_scan(FILE * f, struct tm start, struct tm end,
diff --git a/src/calcurse.h b/src/calcurse.h
index aeeec4c..701dd01 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -683,6 +683,7 @@ void apoint_llist_free(void);
 struct apoint *apoint_new(char *, char *, long, long, char);
 unsigned apoint_inday(struct apoint *, long *);
 void apoint_sec2str(struct apoint *, long, char *, char *);
+char *apoint_tostr(struct apoint *);
 void apoint_write(struct apoint *, FILE *);
 struct apoint *apoint_scan(FILE *, struct tm, struct tm, char, char *,
 			   struct item_filter *);
@@ -776,6 +777,7 @@ void event_llist_init(void);
 void event_llist_free(void);
 struct event *event_new(char *, char *, long, int);
 unsigned event_inday(struct event *, long *);
+char *event_tostr(struct event *);
 void event_write(struct event *, FILE *);
 struct event *event_scan(FILE *, struct tm, int, char *, struct item_filter *);
 void event_delete(struct event *);
@@ -1002,6 +1004,7 @@ int string_printf(struct string *, const char *, ...);
 extern llist_t todolist;
 struct todo *todo_get_item(int);
 struct todo *todo_add(char *, int, char *);
+char *todo_tostr(struct todo *);
 void todo_write(struct todo *, FILE *);
 void todo_delete_note(struct todo *);
 void todo_delete(struct todo *);
diff --git a/src/event.c b/src/event.c
index 3918ce3..39224a3 100644
--- a/src/event.c
+++ b/src/event.c
@@ -104,19 +104,30 @@ unsigned event_inday(struct event *i, long *start)
 	return (i->day < *start + DAYINSEC && i->day >= *start);
 }
 
-/* Write to file the event in user-friendly format */
-void event_write(struct event *o, FILE * f)
+char *event_tostr(struct event *o)
 {
+	struct string s;
 	struct tm lt;
 	time_t t;
 
+	string_init(&s);
+
 	t = o->day;
 	localtime_r(&t, &lt);
-	fprintf(f, "%02u/%02u/%04u [%d] ", lt.tm_mon + 1, lt.tm_mday,
+	string_catf(&s, "%02u/%02u/%04u [%d] ", lt.tm_mon + 1, lt.tm_mday,
 		1900 + lt.tm_year, o->id);
 	if (o->note != NULL)
-		fprintf(f, ">%s ", o->note);
-	fprintf(f, "%s\n", o->mesg);
+		string_catf(&s, ">%s ", o->note);
+	string_catf(&s, "%s", o->mesg);
+
+	return string_buf(&s);
+}
+
+void event_write(struct event *o, FILE * f)
+{
+	char *str = event_tostr(o);
+	fprintf(f, "%s\n", str);
+	mem_free(str);
 }
 
 /* Load the events from file */
diff --git a/src/todo.c b/src/todo.c
index 95e591a..152fbaa 100644
--- a/src/todo.c
+++ b/src/todo.c
@@ -79,13 +79,23 @@ struct todo *todo_add(char *mesg, int id, char *note)
 	return todo;
 }
 
-void todo_write(struct todo *todo, FILE * f)
+char *todo_tostr(struct todo *todo)
 {
+	char *res;
+
 	if (todo->note)
-		fprintf(f, "[%d]>%s %s\n", todo->id, todo->note,
-			todo->mesg);
+		asprintf(&res, "[%d]>%s %s", todo->id, todo->note, todo->mesg);
 	else
-		fprintf(f, "[%d] %s\n", todo->id, todo->mesg);
+		asprintf(&res, "[%d] %s", todo->id, todo->mesg);
+
+	return res;
+}
+
+void todo_write(struct todo *todo, FILE * f)
+{
+	char *str = todo_tostr(todo);
+	fprintf(f, "%s\n", str);
+	mem_free(str);
 }
 
 /* Delete a note previously attached to a todo item. */
-- 
cgit v1.2.3-70-g09d2