From 86c465b0e50e1479e819f63c0bac86e7aec236a1 Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Wed, 27 Jun 2012 12:07:02 +0200
Subject: Allow passing both "-D" and "-c"

This is particularly useful if one wants to use configuration and key
bindings from a specific directory, while using an appointment file from
somewhere else. "-c" has precedence over "-D".

Also update the usage message, man page and documentation.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/args.c | 15 +++-----------
 src/io.c   | 70 +++++++++++++++++++++++++++++++++-----------------------------
 2 files changed, 40 insertions(+), 45 deletions(-)

(limited to 'src')

diff --git a/src/args.c b/src/args.c
index 2a286dd..6646b29 100644
--- a/src/args.c
+++ b/src/args.c
@@ -62,7 +62,7 @@ static void usage(void)
   const char *arg_usage =
       _("Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n"
         "                [-d <date>|<num>] [-s[date]] [-r[range]]\n"
-        "                [-c<file> | -D<dir>] [-S<regex>] [--status]\n"
+        "                [-c<file>] [-D<dir>] [-S<regex>] [--status]\n"
         "                [--read-only]\n");
   fputs(arg_usage, stdout);
 }
@@ -112,9 +112,9 @@ static void help_arg(void)
         "	Don't save configuration nor appointments/todos. Use with care.\n"
         "\nFiles:\n"
         "  -c <file>, --calendar <file>\n"
-        "	specify the calendar <file> to use (incompatible with '-D').\n"
+        "	specify the calendar <file> to use (has precedence over '-D').\n"
         "\n  -D <dir>, --directory <dir>\n"
-        "	specify the data directory to use (incompatible with '-c').\n"
+        "	specify the data directory to use.\n"
         "\tIf not specified, the default directory is ~/.calcurse\n"
         "\nNon-interactive:\n"
         "  -a, --appointment\n"
@@ -445,9 +445,7 @@ int parse_args(int argc, char **argv)
   int unknown_flag = 0;
   /* Command-line flags */
   int aflag = 0;                /* -a: print appointments for current day */
-  int cflag = 0;                /* -c: specify the calendar file to use */
   int dflag = 0;                /* -d: print appointments for a specified days */
-  int Dflag = 0;                /* -D: specify data directory to use */
   int hflag = 0;                /* -h: print help text */
   int gflag = 0;                /* -g: run garbage collector */
   int iflag = 0;                /* -i: import data */
@@ -516,7 +514,6 @@ int parse_args(int argc, char **argv)
       load_data++;
       break;
     case 'c':
-      cflag = 1;
       multiple_flag++;
       cfile = optarg;
       load_data++;
@@ -528,7 +525,6 @@ int parse_args(int argc, char **argv)
       ddate = optarg;
       break;
     case 'D':
-      Dflag = 1;
       datadir = optarg;
       break;
     case 'h':
@@ -638,11 +634,6 @@ int parse_args(int argc, char **argv)
     usage_try();
     return EXIT_FAILURE;
     /* Incorrect arguments */
-  } else if (Dflag && cflag) {
-    fputs(_("Options '-D' and '-c' cannot be used at the same time\n"), stderr);
-    usage();
-    usage_try();
-    return EXIT_FAILURE;
   } else if (Sflag && !(aflag || dflag || rflag || sflag || tflag)) {
     fputs(_("Option '-S' must be used with either '-d', '-r', '-s', "
             "'-a' or '-t'\n"), stderr);
diff --git a/src/io.c b/src/io.c
index 9bffe1a..1263a6a 100644
--- a/src/io.c
+++ b/src/io.c
@@ -231,7 +231,6 @@ void io_init(const char *cfile, const char *datadir)
     snprintf(path_todo, BUFSIZ, "%s/" TODO_PATH_NAME, home);
     snprintf(path_conf, BUFSIZ, "%s/" CONF_PATH_NAME, home);
     snprintf(path_notes, BUFSIZ, "%s/" NOTES_DIR_NAME, home);
-    snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH_NAME, home);
     snprintf(path_keys, BUFSIZ, "%s/" KEYS_PATH_NAME, home);
     snprintf(path_cpid, BUFSIZ, "%s/" CPID_PATH_NAME, home);
     snprintf(path_dpid, BUFSIZ, "%s/" DPID_PATH_NAME, home);
@@ -249,43 +248,48 @@ void io_init(const char *cfile, const char *datadir)
     snprintf(path_dpid, BUFSIZ, "%s/" DPID_PATH, home);
     snprintf(path_dmon_log, BUFSIZ, "%s/" DLOG_PATH, home);
     snprintf(path_notes, BUFSIZ, "%s/" NOTES_DIR, home);
-    if (cfile == NULL) {
-      snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH, home);
+  }
+
+  if (cfile == NULL) {
+    if (datadir != NULL) {
+      snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH_NAME, home);
     } else {
-      snprintf(apts_file, BUFSIZ, "%s", cfile);
-      strncpy(path_apts, apts_file, BUFSIZ);
-      /* check if the file exists, otherwise create it */
-      data_file = fopen(path_apts, "r");
-      if (data_file == NULL) {
-        printf(_("%s does not exist, create it now [y or n] ? "), path_apts);
-        ch = getchar();
-        switch (ch) {
-        case 'N':
-        case 'n':
-          puts(_("aborting...\n"));
-          exit_calcurse(EXIT_FAILURE);
-          break;
-
-        case 'Y':
-        case 'y':
-          data_file = fopen(path_apts, "w");
-          if (data_file == NULL) {
-            perror(path_apts);
-            exit_calcurse(EXIT_FAILURE);
-          } else {
-            printf(_("%s successfully created\n"), path_apts);
-            puts(_("starting interactive mode...\n"));
-          }
-          break;
-
-        default:
-          puts(_("aborting...\n"));
+      snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH, home);
+    }
+  } else {
+    snprintf(apts_file, BUFSIZ, "%s", cfile);
+    strncpy(path_apts, apts_file, BUFSIZ);
+    /* check if the file exists, otherwise create it */
+    data_file = fopen(path_apts, "r");
+    if (data_file == NULL) {
+      printf(_("%s does not exist, create it now [y or n] ? "), path_apts);
+      ch = getchar();
+      switch (ch) {
+      case 'N':
+      case 'n':
+        puts(_("aborting...\n"));
+        exit_calcurse(EXIT_FAILURE);
+        break;
+
+      case 'Y':
+      case 'y':
+        data_file = fopen(path_apts, "w");
+        if (data_file == NULL) {
+          perror(path_apts);
           exit_calcurse(EXIT_FAILURE);
-          break;
+        } else {
+          printf(_("%s successfully created\n"), path_apts);
+          puts(_("starting interactive mode...\n"));
         }
+        break;
+
+      default:
+        puts(_("aborting...\n"));
+        exit_calcurse(EXIT_FAILURE);
+        break;
       }
-      file_close(data_file, __FILE_POS__);
     }
+    file_close(data_file, __FILE_POS__);
   }
 }
 
-- 
cgit v1.2.3-70-g09d2