From cd4f8bb68fbdd0983a2375202134c560878de3ac Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Fri, 13 Apr 2012 18:27:00 +0200
Subject: src/utils.c: Break out format specifier parsing

Move the format specifier parser to a separate function. This is done in
preparation for supporting long format specifiers.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/utils.c | 96 +++++++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 72 insertions(+), 24 deletions(-)

(limited to 'src')

diff --git a/src/utils.c b/src/utils.c
index 73c1eea..aa52977 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -49,6 +49,21 @@
 
 #define ISLEAP(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
 
+enum format_specifier {
+  FS_STARTDATE,
+  FS_STARTDATESTR,
+  FS_DURATION,
+  FS_ENDDATE,
+  FS_ENDDATESTR,
+  FS_MESSAGE,
+  FS_NOTE,
+  FS_NOTEFILE,
+  FS_PRIORITY,
+  FS_PSIGN,
+  FS_EOF,
+  FS_UNKNOWN
+};
+
 /* General routine to exit calcurse properly. */
 void
 exit_calcurse (int status)
@@ -1063,6 +1078,39 @@ print_escape (const char *s)
     }
 }
 
+/* Parse a format specifier. */
+static enum format_specifier
+parse_fs (const char *s)
+{
+  switch (*s)
+    {
+    case 's':
+      return FS_STARTDATE;
+    case 'S':
+      return FS_STARTDATESTR;
+    case 'd':
+      return FS_DURATION;
+    case 'e':
+      return FS_ENDDATE;
+    case 'E':
+      return FS_ENDDATESTR;
+    case 'm':
+      return FS_MESSAGE;
+    case 'n':
+      return FS_NOTE;
+    case 'N':
+      return FS_NOTEFILE;
+    case 'p':
+      return FS_PRIORITY;
+    case '%':
+      return FS_PSIGN;
+    case '\0':
+      return FS_EOF;
+    default:
+      return FS_UNKNOWN;
+    }
+}
+
 /* Print a formatted appointment to stdout. */
 void
 print_apoint (const char *format, long day, struct apoint *apt)
@@ -1076,36 +1124,36 @@ print_apoint (const char *format, long day, struct apoint *apt)
     {
       if (*p == '%') {
         p++;
-        switch (*p)
+        switch (parse_fs (p))
           {
-          case 's':
+          case FS_STARTDATE:
             printf ("%ld", apt->start);
             break;
-          case 'S':
+          case FS_STARTDATESTR:
             printf ("%s", str_start);
             break;
-          case 'd':
+          case FS_DURATION:
             printf ("%ld", apt->dur);
             break;
-          case 'e':
+          case FS_ENDDATE:
             printf ("%ld", apt->start + apt->dur);
             break;
-          case 'E':
+          case FS_ENDDATESTR:
             printf ("%s", str_end);
             break;
-          case 'm':
+          case FS_MESSAGE:
             printf ("%s", apt->mesg);
             break;
-          case 'n':
+          case FS_NOTE:
             printf ("%s", apt->note);
             break;
-          case 'N':
+          case FS_NOTEFILE:
             print_notefile (stdout, apt->note, 1);
             break;
-          case '%':
+          case FS_PSIGN:
             putchar ('%');
             break;
-          case '\0':
+          case FS_EOF:
             return;
             break;
           default:
@@ -1130,21 +1178,21 @@ print_event (const char *format, long day, struct event *ev)
     {
       if (*p == '%') {
         p++;
-        switch (*p)
+        switch (parse_fs (p))
           {
-          case 'm':
+          case FS_MESSAGE:
             printf ("%s", ev->mesg);
             break;
-          case 'n':
+          case FS_NOTE:
             printf ("%s", ev->note);
             break;
-          case 'N':
+          case FS_NOTEFILE:
             print_notefile (stdout, ev->note, 1);
             break;
-          case '%':
+          case FS_PSIGN:
             putchar ('%');
             break;
-          case '\0':
+          case FS_EOF:
             return;
             break;
           default:
@@ -1196,24 +1244,24 @@ print_todo (const char *format, struct todo *todo)
     {
       if (*p == '%') {
         p++;
-        switch (*p)
+        switch (parse_fs (p))
           {
-          case 'p':
+          case FS_PRIORITY:
             printf ("%d", abs (todo->id));
             break;
-          case 'm':
+          case FS_MESSAGE:
             printf ("%s", todo->mesg);
             break;
-          case 'n':
+          case FS_NOTE:
             printf ("%s", todo->note);
             break;
-          case 'N':
+          case FS_NOTEFILE:
             print_notefile (stdout, todo->note, 1);
             break;
-          case '%':
+          case FS_PSIGN:
             putchar ('%');
             break;
-          case '\0':
+          case FS_EOF:
             return;
             break;
           default:
-- 
cgit v1.2.3-70-g09d2