From 330ca4d3cbd702f4f0e7689a1da4f77945f768e0 Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Wed, 9 Nov 2011 18:29:22 +0100
Subject: Use a dynamic method to print appointments to stdout

Add a flexible helper function print_apoint() and use it whenever we
print appointments to stdout. This reduces the number of copy-pasted
code and eventually allows for specifying custom format strings.

Following format specifiers are supported:

* s: Print the start time of the appointment as UNIX time stamp
* S: Print the start time of the appointment using the "hh:mm" format
* d: Print the duration of the appointment in seconds
* e: Print the end time of the appointment as UNIX time stamp
* E: Print the end time of the appointment using the "hh:mm" format
* m: Print the description of the item
* n: Print the name of the note file belonging to the item

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/args.c     | 20 ++------------------
 src/calcurse.h |  1 +
 src/utils.c    | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+), 18 deletions(-)

(limited to 'src')

diff --git a/src/args.c b/src/args.c
index 3c5831a..d51478a 100644
--- a/src/args.c
+++ b/src/args.c
@@ -357,8 +357,6 @@ app_arg (int add_line, struct date *day, long date, int print_note,
   long today;
   unsigned print_date = 1;
   int app_found = 0;
-  char apoint_start_time[HRMIN_SIZE];
-  char apoint_end_time[HRMIN_SIZE];
 
   if (date == 0)
     today = get_sec_date (*day);
@@ -468,14 +466,7 @@ app_arg (int add_line, struct date *day, long date, int print_note,
               arg_print_date (today);
               print_date = 0;
             }
-          apoint_sec2str (apt, today, apoint_start_time, apoint_end_time);
-          fputs (" - ", stdout);
-          fputs (apoint_start_time, stdout);
-          fputs (" -> ", stdout);
-          fputs (apoint_end_time, stdout);
-          fputs ("\n\t", stdout);
-          fputs (apt->mesg, stdout);
-          fputs ("\n", stdout);
+          print_apoint (" - %S -> %E\n\t%m\n", today, apt);
           if (print_note && apt->note)
             print_notefile (stdout, apt->note, 2);
           i = LLIST_TS_FIND_NEXT (i, today, apoint_inday);
@@ -494,16 +485,9 @@ app_arg (int add_line, struct date *day, long date, int print_note,
               print_date = 0;
             }
           apt = apoint_recur_s2apoint_s (ra);
-          apoint_sec2str (apt, today, apoint_start_time, apoint_end_time);
+          print_apoint (" - %S -> %E\n\t%m\n", today, apt);
           mem_free (apt->mesg);
           mem_free (apt);
-          fputs (" - ", stdout);
-          fputs (apoint_start_time, stdout);
-          fputs (" -> ", stdout);
-          fputs (apoint_end_time, stdout);
-          fputs ("\n\t", stdout);
-          fputs (ra->mesg, stdout);
-          fputs ("\n", stdout);
           if (print_note && ra->note)
             print_notefile (stdout, ra->note, 2);
           apt = NULL;
diff --git a/src/calcurse.h b/src/calcurse.h
index 687c118..e4acab2 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -922,6 +922,7 @@ int          fork_exec (int *, int *, const char *, char *const *);
 int          shell_exec (int *, int *, char *);
 int          child_wait (int *, int *, int);
 void         press_any_key (void);
+void         print_apoint (const char *, long, struct apoint *);
 
 /* vars.c */
 extern int               col, row;
diff --git a/src/utils.c b/src/utils.c
index 3c7f595..4628798 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -953,3 +953,52 @@ press_any_key (void)
   fflush (stdin);
   fputs ("\r\n", stdout);
 }
+
+/* Print a formatted appointment to stdout. */
+void
+print_apoint (const char *format, long day, struct apoint *apt)
+{
+  const char *p;
+  char str_start[HRMIN_SIZE], str_end[HRMIN_SIZE];
+
+  apoint_sec2str (apt, day, str_start, str_end);
+
+  for (p = format; *p; p++)
+    {
+      if (*p == '%') {
+        p++;
+        switch (*p)
+          {
+          case 's':
+            printf ("%ld", apt->start);
+            break;
+          case 'S':
+            printf ("%s", str_start);
+            break;
+          case 'd':
+            printf ("%ld", apt->dur);
+            break;
+          case 'e':
+            printf ("%ld", apt->start + apt->dur);
+            break;
+          case 'E':
+            printf ("%s", str_end);
+            break;
+          case 'm':
+            printf ("%s", apt->mesg);
+            break;
+          case 'n':
+            printf ("%s", apt->note);
+            break;
+          case '\0':
+            return;
+            break;
+          default:
+            putchar ('?');
+            break;
+          }
+        }
+      else
+        putchar (*p);
+    }
+}
-- 
cgit v1.2.3-70-g09d2