summaryrefslogtreecommitdiff
path: root/src/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/io.c')
-rw-r--r--src/io.c1939
1 files changed, 1000 insertions, 939 deletions
diff --git a/src/io.c b/src/io.c
index c1b3631..0f5d711 100644
--- a/src/io.c
+++ b/src/io.c
@@ -48,40 +48,40 @@
#include "sha1.h"
typedef enum {
- PROGRESS_BAR_SAVE,
- PROGRESS_BAR_LOAD,
- PROGRESS_BAR_EXPORT
+ PROGRESS_BAR_SAVE,
+ PROGRESS_BAR_LOAD,
+ PROGRESS_BAR_EXPORT
} progress_bar_t;
enum {
- PROGRESS_BAR_CONF,
- PROGRESS_BAR_TODO,
- PROGRESS_BAR_APTS,
- PROGRESS_BAR_KEYS
+ PROGRESS_BAR_CONF,
+ PROGRESS_BAR_TODO,
+ PROGRESS_BAR_APTS,
+ PROGRESS_BAR_KEYS
};
enum {
- PROGRESS_BAR_EXPORT_EVENTS,
- PROGRESS_BAR_EXPORT_APOINTS,
- PROGRESS_BAR_EXPORT_TODO
+ PROGRESS_BAR_EXPORT_EVENTS,
+ PROGRESS_BAR_EXPORT_APOINTS,
+ PROGRESS_BAR_EXPORT_TODO
};
struct ht_keybindings_s {
- const char *label;
- enum key key;
- HTABLE_ENTRY(ht_keybindings_s);
+ const char *label;
+ enum key key;
+ HTABLE_ENTRY(ht_keybindings_s);
};
static void load_keys_ht_getkey(struct ht_keybindings_s *, const char **,
- int *);
+ int *);
static int load_keys_ht_compare(struct ht_keybindings_s *,
- struct ht_keybindings_s *);
+ struct ht_keybindings_s *);
#define HSIZE 256
HTABLE_HEAD(ht_keybindings, HSIZE, ht_keybindings_s);
HTABLE_PROTOTYPE(ht_keybindings, ht_keybindings_s)
HTABLE_GENERATE(ht_keybindings, ht_keybindings_s, load_keys_ht_getkey,
- load_keys_ht_compare)
+ load_keys_ht_compare)
/* Draw a progress bar while saving, loading or exporting data. */
static void progress_bar(progress_bar_t type, int progress)
@@ -89,59 +89,63 @@ static void progress_bar(progress_bar_t type, int progress)
#define NBFILES 4
#define NBEXPORTED 3
#define LABELENGTH 15
- int i, step, steps;
- const char *mesg_sav = _("Saving...");
- const char *mesg_load = _("Loading...");
- const char *mesg_export = _("Exporting...");
- const char *error_msg = _("Internal error while displaying progress bar");
- const char *barchar = "|";
- const char *file[NBFILES] = {
- "[ conf ]",
- "[ todo ]",
- "[ apts ]",
- "[ keys ]"
- };
- const char *data[NBEXPORTED] = {
- "[ events ]",
- "[appointments]",
- "[ todo ]"
- };
- int ipos = LABELENGTH + 2;
- int epos[NBFILES];
-
- /* progress bar length init. */
- ipos = LABELENGTH + 2;
- steps = (type == PROGRESS_BAR_EXPORT) ? NBEXPORTED : NBFILES;
- step = floor(col / (steps + 1));
- for (i = 0; i < steps - 1; i++)
- epos[i] = (i + 2) * step;
- epos[steps - 1] = col - 2;
-
- switch (type) {
- case PROGRESS_BAR_SAVE:
- EXIT_IF(progress < 0 || progress > PROGRESS_BAR_KEYS, "%s", error_msg);
- status_mesg(mesg_sav, file[progress]);
- break;
- case PROGRESS_BAR_LOAD:
- EXIT_IF(progress < 0 || progress > PROGRESS_BAR_KEYS, "%s", error_msg);
- status_mesg(mesg_load, file[progress]);
- break;
- case PROGRESS_BAR_EXPORT:
- EXIT_IF(progress < 0
- || progress > PROGRESS_BAR_EXPORT_TODO, "%s", error_msg);
- status_mesg(mesg_export, data[progress]);
- break;
- }
-
- /* Draw the progress bar. */
- mvwaddstr(win[STA].p, 1, ipos, barchar);
- mvwaddstr(win[STA].p, 1, epos[steps - 1], barchar);
- custom_apply_attr(win[STA].p, ATTR_HIGHEST);
- for (i = ipos + 1; i < epos[progress]; i++)
- mvwaddch(win[STA].p, 1, i, ' ' | A_REVERSE);
- custom_remove_attr(win[STA].p, ATTR_HIGHEST);
- wmove(win[STA].p, 0, 0);
- wins_wrefresh(win[STA].p);
+ int i, step, steps;
+ const char *mesg_sav = _("Saving...");
+ const char *mesg_load = _("Loading...");
+ const char *mesg_export = _("Exporting...");
+ const char *error_msg =
+ _("Internal error while displaying progress bar");
+ const char *barchar = "|";
+ const char *file[NBFILES] = {
+ "[ conf ]",
+ "[ todo ]",
+ "[ apts ]",
+ "[ keys ]"
+ };
+ const char *data[NBEXPORTED] = {
+ "[ events ]",
+ "[appointments]",
+ "[ todo ]"
+ };
+ int ipos = LABELENGTH + 2;
+ int epos[NBFILES];
+
+ /* progress bar length init. */
+ ipos = LABELENGTH + 2;
+ steps = (type == PROGRESS_BAR_EXPORT) ? NBEXPORTED : NBFILES;
+ step = floor(col / (steps + 1));
+ for (i = 0; i < steps - 1; i++)
+ epos[i] = (i + 2) * step;
+ epos[steps - 1] = col - 2;
+
+ switch (type) {
+ case PROGRESS_BAR_SAVE:
+ EXIT_IF(progress < 0
+ || progress > PROGRESS_BAR_KEYS, "%s", error_msg);
+ status_mesg(mesg_sav, file[progress]);
+ break;
+ case PROGRESS_BAR_LOAD:
+ EXIT_IF(progress < 0
+ || progress > PROGRESS_BAR_KEYS, "%s", error_msg);
+ status_mesg(mesg_load, file[progress]);
+ break;
+ case PROGRESS_BAR_EXPORT:
+ EXIT_IF(progress < 0
+ || progress > PROGRESS_BAR_EXPORT_TODO, "%s",
+ error_msg);
+ status_mesg(mesg_export, data[progress]);
+ break;
+ }
+
+ /* Draw the progress bar. */
+ mvwaddstr(win[STA].p, 1, ipos, barchar);
+ mvwaddstr(win[STA].p, 1, epos[steps - 1], barchar);
+ custom_apply_attr(win[STA].p, ATTR_HIGHEST);
+ for (i = ipos + 1; i < epos[progress]; i++)
+ mvwaddch(win[STA].p, 1, i, ' ' | A_REVERSE);
+ custom_remove_attr(win[STA].p, ATTR_HIGHEST);
+ wmove(win[STA].p, 0, 0);
+ wins_wrefresh(win[STA].p);
#undef NBFILES
#undef NBEXPORTED
#undef LABELENGTH
@@ -150,63 +154,66 @@ static void progress_bar(progress_bar_t type, int progress)
/* Ask user for a file name to export data to. */
static FILE *get_export_stream(enum export_type type)
{
- FILE *stream;
- char *home, *stream_name;
- const char *question = _("Choose the file used to export calcurse data:");
- const char *wrong_name =
- _("The file cannot be accessed, please enter another file name.");
- const char *press_enter = _("Press [ENTER] to continue.");
- const char *file_ext[IO_EXPORT_NBTYPES] = { "ical", "txt" };
-
- stream = NULL;
- stream_name = (char *)mem_malloc(BUFSIZ);
- if ((home = getenv("HOME")) != NULL)
- snprintf(stream_name, BUFSIZ, "%s/calcurse.%s", home, file_ext[type]);
- else
- snprintf(stream_name, BUFSIZ, "%s/calcurse.%s", get_tempdir(),
- file_ext[type]);
-
- while (stream == NULL) {
- status_mesg(question, "");
- if (updatestring(win[STA].p, &stream_name, 0, 1)) {
- mem_free(stream_name);
- return NULL;
- }
- stream = fopen(stream_name, "w");
- if (stream == NULL) {
- status_mesg(wrong_name, press_enter);
- wgetch(win[KEY].p);
- }
- }
- mem_free(stream_name);
-
- return stream;
+ FILE *stream;
+ char *home, *stream_name;
+ const char *question =
+ _("Choose the file used to export calcurse data:");
+ const char *wrong_name =
+ _("The file cannot be accessed, please enter another file name.");
+ const char *press_enter = _("Press [ENTER] to continue.");
+ const char *file_ext[IO_EXPORT_NBTYPES] = { "ical", "txt" };
+
+ stream = NULL;
+ stream_name = (char *)mem_malloc(BUFSIZ);
+ if ((home = getenv("HOME")) != NULL)
+ snprintf(stream_name, BUFSIZ, "%s/calcurse.%s", home,
+ file_ext[type]);
+ else
+ snprintf(stream_name, BUFSIZ, "%s/calcurse.%s",
+ get_tempdir(), file_ext[type]);
+
+ while (stream == NULL) {
+ status_mesg(question, "");
+ if (updatestring(win[STA].p, &stream_name, 0, 1)) {
+ mem_free(stream_name);
+ return NULL;
+ }
+ stream = fopen(stream_name, "w");
+ if (stream == NULL) {
+ status_mesg(wrong_name, press_enter);
+ wgetch(win[KEY].p);
+ }
+ }
+ mem_free(stream_name);
+
+ return stream;
}
/* Append a line to a file. */
unsigned io_fprintln(const char *fname, const char *fmt, ...)
{
- FILE *fp;
- va_list ap;
- char buf[BUFSIZ];
- int ret;
+ FILE *fp;
+ va_list ap;
+ char buf[BUFSIZ];
+ int ret;
- fp = fopen(fname, "a");
- RETVAL_IF(!fp, 0, _("Failed to open \"%s\", - %s\n"), fname, strerror(errno));
+ fp = fopen(fname, "a");
+ RETVAL_IF(!fp, 0, _("Failed to open \"%s\", - %s\n"), fname,
+ strerror(errno));
- va_start(ap, fmt);
- ret = vsnprintf(buf, sizeof buf, fmt, ap);
- RETVAL_IF(ret < 0, 0, _("Failed to build message\n"));
- va_end(ap);
+ va_start(ap, fmt);
+ ret = vsnprintf(buf, sizeof buf, fmt, ap);
+ RETVAL_IF(ret < 0, 0, _("Failed to build message\n"));
+ va_end(ap);
- ret = fprintf(fp, "%s", buf);
- RETVAL_IF(ret < 0, 0, _("Failed to print message \"%s\"\n"), buf);
+ ret = fprintf(fp, "%s", buf);
+ RETVAL_IF(ret < 0, 0, _("Failed to print message \"%s\"\n"), buf);
- ret = fclose(fp);
- RETVAL_IF(ret != 0, 0, _("Failed to close \"%s\" - %s\n"),
- fname, strerror(errno));
+ ret = fclose(fp);
+ RETVAL_IF(ret != 0, 0, _("Failed to close \"%s\" - %s\n"),
+ fname, strerror(errno));
- return 1;
+ return 1;
}
/*
@@ -218,90 +225,94 @@ unsigned io_fprintln(const char *fname, const char *fmt, ...)
*/
void io_init(const char *cfile, const char *datadir)
{
- FILE *data_file;
- const char *home;
- char apts_file[BUFSIZ] = "";
- int ch;
-
- if (datadir != NULL) {
- home = datadir;
- snprintf(path_dir, BUFSIZ, "%s", home);
- 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_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);
- snprintf(path_dmon_log, BUFSIZ, "%s/" DLOG_PATH_NAME, home);
- } else {
- home = getenv("HOME");
- if (home == NULL) {
- home = ".";
- }
- snprintf(path_dir, BUFSIZ, "%s/" DIR_NAME, home);
- snprintf(path_todo, BUFSIZ, "%s/" TODO_PATH, home);
- snprintf(path_conf, BUFSIZ, "%s/" CONF_PATH, home);
- snprintf(path_keys, BUFSIZ, "%s/" KEYS_PATH, home);
- snprintf(path_cpid, BUFSIZ, "%s/" CPID_PATH, home);
- 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) {
- if (datadir != NULL) {
- snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH_NAME, home);
- } else {
- 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);
- } 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 *data_file;
+ const char *home;
+ char apts_file[BUFSIZ] = "";
+ int ch;
+
+ if (datadir != NULL) {
+ home = datadir;
+ snprintf(path_dir, BUFSIZ, "%s", home);
+ 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_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);
+ snprintf(path_dmon_log, BUFSIZ, "%s/" DLOG_PATH_NAME,
+ home);
+ } else {
+ home = getenv("HOME");
+ if (home == NULL) {
+ home = ".";
+ }
+ snprintf(path_dir, BUFSIZ, "%s/" DIR_NAME, home);
+ snprintf(path_todo, BUFSIZ, "%s/" TODO_PATH, home);
+ snprintf(path_conf, BUFSIZ, "%s/" CONF_PATH, home);
+ snprintf(path_keys, BUFSIZ, "%s/" KEYS_PATH, home);
+ snprintf(path_cpid, BUFSIZ, "%s/" CPID_PATH, home);
+ 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) {
+ if (datadir != NULL) {
+ snprintf(path_apts, BUFSIZ, "%s/" APTS_PATH_NAME,
+ home);
+ } else {
+ 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);
+ } 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__);
+ }
}
void io_extract_data(char *dst_data, const char *org, int len)
{
- int i;
-
- for (; *org == ' ' || *org == '\t'; org++) ;
- for (i = 0; i < len - 1; i++) {
- if (*org == '\n' || *org == '\0' || *org == '#')
- break;
- *dst_data++ = *org++;
- }
- *dst_data = '\0';
+ int i;
+
+ for (; *org == ' ' || *org == '\t'; org++) ;
+ for (i = 0; i < len - 1; i++) {
+ if (*org == '\n' || *org == '\0' || *org == '#')
+ break;
+ *dst_data++ = *org++;
+ }
+ *dst_data = '\0';
}
static pthread_mutex_t io_save_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -313,124 +324,125 @@ static pthread_mutex_t io_save_mutex = PTHREAD_MUTEX_INITIALIZER;
*/
unsigned io_save_apts(void)
{
- llist_item_t *i;
- FILE *fp;
+ llist_item_t *i;
+ FILE *fp;
- if (read_only)
- return 1;
+ if (read_only)
+ return 1;
- if ((fp = fopen(path_apts, "w")) == NULL)
- return 0;
+ if ((fp = fopen(path_apts, "w")) == NULL)
+ return 0;
- recur_save_data(fp);
+ recur_save_data(fp);
- if (ui_mode == UI_CURSES)
- LLIST_TS_LOCK(&alist_p);
- LLIST_TS_FOREACH(&alist_p, i) {
- struct apoint *apt = LLIST_TS_GET_DATA(i);
- apoint_write(apt, fp);
- }
- if (ui_mode == UI_CURSES)
- LLIST_TS_UNLOCK(&alist_p);
+ if (ui_mode == UI_CURSES)
+ LLIST_TS_LOCK(&alist_p);
+ LLIST_TS_FOREACH(&alist_p, i) {
+ struct apoint *apt = LLIST_TS_GET_DATA(i);
+ apoint_write(apt, fp);
+ }
+ if (ui_mode == UI_CURSES)
+ LLIST_TS_UNLOCK(&alist_p);
- LLIST_FOREACH(&eventlist, i) {
- struct event *ev = LLIST_TS_GET_DATA(i);
- event_write(ev, fp);
- }
- file_close(fp, __FILE_POS__);
+ LLIST_FOREACH(&eventlist, i) {
+ struct event *ev = LLIST_TS_GET_DATA(i);
+ event_write(ev, fp);
+ }
+ file_close(fp, __FILE_POS__);
- return 1;
+ return 1;
}
/* Save the todo data file. */
unsigned io_save_todo(void)
{
- llist_item_t *i;
- FILE *fp;
+ llist_item_t *i;
+ FILE *fp;
- if (read_only)
- return 1;
+ if (read_only)
+ return 1;
- if ((fp = fopen(path_todo, "w")) == NULL)
- return 0;
+ if ((fp = fopen(path_todo, "w")) == NULL)
+ return 0;
- LLIST_FOREACH(&todolist, i) {
- struct todo *todo = LLIST_TS_GET_DATA(i);
- todo_write(todo, fp);
- }
- file_close(fp, __FILE_POS__);
+ LLIST_FOREACH(&todolist, i) {
+ struct todo *todo = LLIST_TS_GET_DATA(i);
+ todo_write(todo, fp);
+ }
+ file_close(fp, __FILE_POS__);
- return 1;
+ return 1;
}
/* Save user-defined keys */
unsigned io_save_keys(void)
{
- FILE *fp;
+ FILE *fp;
- if (read_only)
- return 1;
+ if (read_only)
+ return 1;
- if ((fp = fopen(path_keys, "w")) == NULL)
- return 0;
+ if ((fp = fopen(path_keys, "w")) == NULL)
+ return 0;
- keys_save_bindings(fp);
- file_close(fp, __FILE_POS__);
+ keys_save_bindings(fp);
+ file_close(fp, __FILE_POS__);
- return 1;
+ return 1;
}
/* Save the calendar data */
void io_save_cal(enum save_display display)
{
- const char *access_pb = _("Problems accessing data file ...");
- const char *save_success = _("The data files were successfully saved");
- const char *enter = _("Press [ENTER] to continue");
- int show_bar;
-
- if (read_only)
- return;
-
- pthread_mutex_lock(&io_save_mutex);
-
- show_bar = 0;
- if (ui_mode == UI_CURSES && display == IO_SAVE_DISPLAY_BAR
- && conf.progress_bar)
- show_bar = 1;
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_CONF);
- if (!config_save())
- ERROR_MSG("%s", access_pb);
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_TODO);
- if (!io_save_todo())
- ERROR_MSG("%s", access_pb);
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_APTS);
- if (!io_save_apts())
- ERROR_MSG("%s", access_pb);
-
- if (show_bar)
- progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_KEYS);
- if (!io_save_keys())
- ERROR_MSG("%s", access_pb);
-
- /* Print a message telling data were saved */
- if (ui_mode == UI_CURSES && conf.system_dialogs) {
- status_mesg(save_success, enter);
- wgetch(win[KEY].p);
- }
-
- pthread_mutex_unlock(&io_save_mutex);
+ const char *access_pb = _("Problems accessing data file ...");
+ const char *save_success =
+ _("The data files were successfully saved");
+ const char *enter = _("Press [ENTER] to continue");
+ int show_bar;
+
+ if (read_only)
+ return;
+
+ pthread_mutex_lock(&io_save_mutex);
+
+ show_bar = 0;
+ if (ui_mode == UI_CURSES && display == IO_SAVE_DISPLAY_BAR
+ && conf.progress_bar)
+ show_bar = 1;
+
+ if (show_bar)
+ progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_CONF);
+ if (!config_save())
+ ERROR_MSG("%s", access_pb);
+
+ if (show_bar)
+ progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_TODO);
+ if (!io_save_todo())
+ ERROR_MSG("%s", access_pb);
+
+ if (show_bar)
+ progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_APTS);
+ if (!io_save_apts())
+ ERROR_MSG("%s", access_pb);
+
+ if (show_bar)
+ progress_bar(PROGRESS_BAR_SAVE, PROGRESS_BAR_KEYS);
+ if (!io_save_keys())
+ ERROR_MSG("%s", access_pb);
+
+ /* Print a message telling data were saved */
+ if (ui_mode == UI_CURSES && conf.system_dialogs) {
+ status_mesg(save_success, enter);
+ wgetch(win[KEY].p);
+ }
+
+ pthread_mutex_unlock(&io_save_mutex);
}
static void io_load_error(const char *filename, unsigned line,
- const char *mesg)
+ const char *mesg)
{
- EXIT("%s:%u: %s", filename, line, mesg);
+ EXIT("%s:%u: %s", filename, line, mesg);
}
/*
@@ -440,230 +452,252 @@ static void io_load_error(const char *filename, unsigned line,
*/
void io_load_app(void)
{
- FILE *data_file;
- int c, is_appointment, is_event, is_recursive;
- struct tm start, end, until, lt;
- llist_t exc;
- time_t t;
- int id = 0;
- int freq;
- char type, state = 0L;
- char note[MAX_NOTESIZ + 1], *notep;
- unsigned line = 0;
-
- t = time(NULL);
- localtime_r(&t, &lt);
- start = end = until = lt;
-
- data_file = fopen(path_apts, "r");
- EXIT_IF(data_file == NULL, _("failed to open appointment file"));
-
- for (;;) {
- LLIST_INIT(&exc);
- is_appointment = is_event = is_recursive = 0;
- line++;
- c = getc(data_file);
- if (c == EOF)
- break;
- ungetc(c, data_file);
-
- /* Read the date first: it is common to both events
- * and appointments.
- */
- if (fscanf(data_file, "%d / %d / %d ",
- &start.tm_mon, &start.tm_mday, &start.tm_year) != 3)
- io_load_error(path_apts, line, _("syntax error in the item date"));
-
- /* Read the next character : if it is an '@' then we have
- * an appointment, else if it is an '[' we have en event.
- */
- c = getc(data_file);
-
- if (c == '@')
- is_appointment = 1;
- else if (c == '[')
- is_event = 1;
- else
- io_load_error(path_apts, line, _("no event nor appointment found"));
-
- /* Read the remaining informations. */
- if (is_appointment) {
- if (fscanf(data_file, " %d : %d -> %d / %d / %d @ %d : %d ",
- &start.tm_hour, &start.tm_min,
- &end.tm_mon, &end.tm_mday, &end.tm_year,
- &end.tm_hour, &end.tm_min) != 7)
- io_load_error(path_apts, line,
- _("syntax error in item time or duration"));
- } else if (is_event) {
- if (fscanf(data_file, " %d ", &id) != 1 || getc(data_file) != ']')
- io_load_error(path_apts, line, _("syntax error in item identifier"));
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- } else {
- io_load_error(path_apts, line,
- _("wrong format in the appointment or event"));
- /* NOTREACHED */
- }
-
- /* Check if we have a recursive item. */
- c = getc(data_file);
-
- if (c == '{') {
- is_recursive = 1;
- if (fscanf(data_file, " %d%c ", &freq, &type) != 2)
- io_load_error(path_apts, line, _("syntax error in item repetition"));
-
- c = getc(data_file);
- if (c == '}') { /* endless recurrent item */
- until.tm_year = 0;
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- } else if (c == '-' && getc(data_file) == '>') {
- if (fscanf(data_file, " %d / %d / %d ", &until.tm_mon,
- &until.tm_mday, &until.tm_year) != 3)
- io_load_error(path_apts, line, _("syntax error in item repetition"));
- c = getc(data_file);
- if (c == '!') {
- ungetc(c, data_file);
- recur_exc_scan(&exc, data_file);
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- } else if (c == '}') {
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- } else {
- io_load_error(path_apts, line, _("syntax error in item repetition"));
- }
- } else if (c == '!') { /* endless item with exceptions */
- ungetc(c, data_file);
- recur_exc_scan(&exc, data_file);
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- until.tm_year = 0;
- } else {
- io_load_error(path_apts, line,
- _("wrong format in the appointment or event"));
- /* NOTREACHED */
- }
- } else {
- ungetc(c, data_file);
- }
-
- /* Check if a note is attached to the item. */
- c = getc(data_file);
- if (c == '>') {
- note_read(note, data_file);
- notep = note;
- } else {
- notep = NULL;
- ungetc(c, data_file);
- }
-
- /*
- * Last: read the item description and load it into its
- * corresponding linked list, depending on the item type.
- */
- if (is_appointment) {
- c = getc(data_file);
- if (c == '!') {
- state |= APOINT_NOTIFY;
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- } else if (c == '|') {
- state = 0L;
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- } else {
- io_load_error(path_apts, line, _("syntax error in item repetition"));
- }
- if (is_recursive) {
- recur_apoint_scan(data_file, start, end,
- type, freq, until, notep, &exc, state);
- } else {
- apoint_scan(data_file, start, end, state, notep);
- }
- } else if (is_event) {
- if (is_recursive) {
- recur_event_scan(data_file, start, id, type, freq, until, notep, &exc);
- } else {
- event_scan(data_file, start, id, notep);
- }
- } else {
- io_load_error(path_apts, line,
- _("wrong format in the appointment or event"));
- /* NOTREACHED */
- }
- }
- file_close(data_file, __FILE_POS__);
+ FILE *data_file;
+ int c, is_appointment, is_event, is_recursive;
+ struct tm start, end, until, lt;
+ llist_t exc;
+ time_t t;
+ int id = 0;
+ int freq;
+ char type, state = 0L;
+ char note[MAX_NOTESIZ + 1], *notep;
+ unsigned line = 0;
+
+ t = time(NULL);
+ localtime_r(&t, &lt);
+ start = end = until = lt;
+
+ data_file = fopen(path_apts, "r");
+ EXIT_IF(data_file == NULL, _("failed to open appointment file"));
+
+ for (;;) {
+ LLIST_INIT(&exc);
+ is_appointment = is_event = is_recursive = 0;
+ line++;
+ c = getc(data_file);
+ if (c == EOF)
+ break;
+ ungetc(c, data_file);
+
+ /* Read the date first: it is common to both events
+ * and appointments.
+ */
+ if (fscanf(data_file, "%d / %d / %d ",
+ &start.tm_mon, &start.tm_mday,
+ &start.tm_year) != 3)
+ io_load_error(path_apts, line,
+ _("syntax error in the item date"));
+
+ /* Read the next character : if it is an '@' then we have
+ * an appointment, else if it is an '[' we have en event.
+ */
+ c = getc(data_file);
+
+ if (c == '@')
+ is_appointment = 1;
+ else if (c == '[')
+ is_event = 1;
+ else
+ io_load_error(path_apts, line,
+ _("no event nor appointment found"));
+
+ /* Read the remaining informations. */
+ if (is_appointment) {
+ if (fscanf
+ (data_file,
+ " %d : %d -> %d / %d / %d @ %d : %d ",
+ &start.tm_hour, &start.tm_min, &end.tm_mon,
+ &end.tm_mday, &end.tm_year, &end.tm_hour,
+ &end.tm_min) != 7)
+ io_load_error(path_apts, line,
+ _("syntax error in item time or duration"));
+ } else if (is_event) {
+ if (fscanf(data_file, " %d ", &id) != 1
+ || getc(data_file) != ']')
+ io_load_error(path_apts, line,
+ _("syntax error in item identifier"));
+ while ((c = getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ } else {
+ io_load_error(path_apts, line,
+ _("wrong format in the appointment or event"));
+ /* NOTREACHED */
+ }
+
+ /* Check if we have a recursive item. */
+ c = getc(data_file);
+
+ if (c == '{') {
+ is_recursive = 1;
+ if (fscanf(data_file, " %d%c ", &freq, &type) != 2)
+ io_load_error(path_apts, line,
+ _("syntax error in item repetition"));
+
+ c = getc(data_file);
+ if (c == '}') { /* endless recurrent item */
+ until.tm_year = 0;
+ while ((c = getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ } else if (c == '-' && getc(data_file) == '>') {
+ if (fscanf
+ (data_file, " %d / %d / %d ",
+ &until.tm_mon, &until.tm_mday,
+ &until.tm_year) != 3)
+ io_load_error(path_apts, line,
+ _("syntax error in item repetition"));
+ c = getc(data_file);
+ if (c == '!') {
+ ungetc(c, data_file);
+ recur_exc_scan(&exc, data_file);
+ while ((c =
+ getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ } else if (c == '}') {
+ while ((c =
+ getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ } else {
+ io_load_error(path_apts, line,
+ _("syntax error in item repetition"));
+ }
+ } else if (c == '!') { /* endless item with exceptions */
+ ungetc(c, data_file);
+ recur_exc_scan(&exc, data_file);
+ while ((c = getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ until.tm_year = 0;
+ } else {
+ io_load_error(path_apts, line,
+ _("wrong format in the appointment or event"));
+ /* NOTREACHED */
+ }
+ } else {
+ ungetc(c, data_file);
+ }
+
+ /* Check if a note is attached to the item. */
+ c = getc(data_file);
+ if (c == '>') {
+ note_read(note, data_file);
+ notep = note;
+ } else {
+ notep = NULL;
+ ungetc(c, data_file);
+ }
+
+ /*
+ * Last: read the item description and load it into its
+ * corresponding linked list, depending on the item type.
+ */
+ if (is_appointment) {
+ c = getc(data_file);
+ if (c == '!') {
+ state |= APOINT_NOTIFY;
+ while ((c = getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ } else if (c == '|') {
+ state = 0L;
+ while ((c = getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ } else {
+ io_load_error(path_apts, line,
+ _("syntax error in item repetition"));
+ }
+ if (is_recursive) {
+ recur_apoint_scan(data_file, start, end,
+ type, freq, until, notep,
+ &exc, state);
+ } else {
+ apoint_scan(data_file, start, end, state,
+ notep);
+ }
+ } else if (is_event) {
+ if (is_recursive) {
+ recur_event_scan(data_file, start, id,
+ type, freq, until, notep,
+ &exc);
+ } else {
+ event_scan(data_file, start, id, notep);
+ }
+ } else {
+ io_load_error(path_apts, line,
+ _("wrong format in the appointment or event"));
+ /* NOTREACHED */
+ }
+ }
+ file_close(data_file, __FILE_POS__);
}
/* Load the todo data */
void io_load_todo(void)
{
- FILE *data_file;
- char *newline;
- int nb_tod = 0;
- int c, id;
- char buf[BUFSIZ], e_todo[BUFSIZ], note[MAX_NOTESIZ + 1];
- unsigned line = 0;
-
- data_file = fopen(path_todo, "r");
- EXIT_IF(data_file == NULL, _("failed to open todo file"));
-
- for (;;) {
- line++;
- c = getc(data_file);
- if (c == EOF) {
- break;
- } else if (c == '[') { /* new style with id */
- if (fscanf(data_file, " %d ", &id) != 1 || getc(data_file) != ']')
- io_load_error(path_todo, line, _("syntax error in item identifier"));
- while ((c = getc(data_file)) == ' ') ;
- ungetc(c, data_file);
- } else {
- id = 9;
- ungetc(c, data_file);
- }
- /* Now read the attached note, if any. */
- c = getc(data_file);
- if (c == '>') {
- note_read(note, data_file);
- } else {
- note[0] = '\0';
- ungetc(c, data_file);
- }
- /* Then read todo description. */
- if (!fgets(buf, sizeof buf, data_file))
- buf[0] = '\0';
- newline = strchr(buf, '\n');
- if (newline)
- *newline = '\0';
- io_extract_data(e_todo, buf, sizeof buf);
- todo_add(e_todo, id, note);
- ++nb_tod;
- }
- file_close(data_file, __FILE_POS__);
- ui_todo_set_nb(nb_tod);
+ FILE *data_file;
+ char *newline;
+ int nb_tod = 0;
+ int c, id;
+ char buf[BUFSIZ], e_todo[BUFSIZ], note[MAX_NOTESIZ + 1];
+ unsigned line = 0;
+
+ data_file = fopen(path_todo, "r");
+ EXIT_IF(data_file == NULL, _("failed to open todo file"));
+
+ for (;;) {
+ line++;
+ c = getc(data_file);
+ if (c == EOF) {
+ break;
+ } else if (c == '[') { /* new style with id */
+ if (fscanf(data_file, " %d ", &id) != 1
+ || getc(data_file) != ']')
+ io_load_error(path_todo, line,
+ _("syntax error in item identifier"));
+ while ((c = getc(data_file)) == ' ') ;
+ ungetc(c, data_file);
+ } else {
+ id = 9;
+ ungetc(c, data_file);
+ }
+ /* Now read the attached note, if any. */
+ c = getc(data_file);
+ if (c == '>') {
+ note_read(note, data_file);
+ } else {
+ note[0] = '\0';
+ ungetc(c, data_file);
+ }
+ /* Then read todo description. */
+ if (!fgets(buf, sizeof buf, data_file))
+ buf[0] = '\0';
+ newline = strchr(buf, '\n');
+ if (newline)
+ *newline = '\0';
+ io_extract_data(e_todo, buf, sizeof buf);
+ todo_add(e_todo, id, note);
+ ++nb_tod;
+ }
+ file_close(data_file, __FILE_POS__);
+ ui_todo_set_nb(nb_tod);
}
static void
-load_keys_ht_getkey(struct ht_keybindings_s *data, const char **key, int *len)
+load_keys_ht_getkey(struct ht_keybindings_s *data, const char **key,
+ int *len)
{
- *key = data->label;
- *len = strlen(data->label);
+ *key = data->label;
+ *len = strlen(data->label);
}
static int
load_keys_ht_compare(struct ht_keybindings_s *data1,
- struct ht_keybindings_s *data2)
+ struct ht_keybindings_s *data2)
{
- const int KEYLEN = strlen(data1->label);
+ const int KEYLEN = strlen(data1->label);
- if (strlen(data2->label) == KEYLEN
- && !memcmp(data1->label, data2->label, KEYLEN))
- return 0;
- else
- return 1;
+ if (strlen(data2->label) == KEYLEN
+ && !memcmp(data1->label, data2->label, KEYLEN))
+ return 0;
+ else
+ return 1;
}
/*
@@ -673,7 +707,7 @@ load_keys_ht_compare(struct ht_keybindings_s *data1,
*/
static int is_blank(int c)
{
- return c == ' ' || c == '\t';
+ return c == ' ' || c == '\t';
}
/*
@@ -685,176 +719,192 @@ static int is_blank(int c)
*/
void io_load_keys(const char *pager)
{
- struct ht_keybindings_s keys[NBKEYS];
- FILE *keyfp;
- char buf[BUFSIZ];
- struct io_file *log;
- int i, skipped, loaded, line;
- const int MAX_ERRORS = 5;
-
- keys_init();
-
- struct ht_keybindings ht_keys = HTABLE_INITIALIZER(&ht_keys);
-
- for (i = 0; i < NBKEYS; i++) {
- keys[i].key = (enum key)i;
- keys[i].label = keys_get_label((enum key)i);
- HTABLE_INSERT(ht_keybindings, &ht_keys, &keys[i]);
- }
-
- keyfp = fopen(path_keys, "r");
- EXIT_IF(keyfp == NULL, _("failed to open key file"));
-
- log = io_log_init();
- skipped = loaded = line = 0;
- while (fgets(buf, BUFSIZ, keyfp) != NULL) {
- char key_label[BUFSIZ], *p;
- struct ht_keybindings_s *ht_elm, ht_entry;
- const int AWAITED = 1;
- int assigned;
-
- line++;
- if (skipped > MAX_ERRORS) {
- const char *too_many =
- _("\nToo many errors while reading configuration file!\n"
- "Please backup your keys file, remove it from directory, "
- "and launch calcurse again.\n");
-
- io_log_print(log, line, too_many);
- break;
- }
- for (p = buf; is_blank((int)*p); p++) ;
- if (p != buf)
- memmove(buf, p, strlen(p));
- if (buf[0] == '#' || buf[0] == '\n')
- continue;
-
- if (sscanf(buf, "%s", key_label) != AWAITED) {
- skipped++;
- io_log_print(log, line, _("Could not read key label"));
- continue;
- }
-
- /* Skip legacy entries. */
- if (strcmp(key_label, "generic-cut") == 0)
- continue;
-
- ht_entry.label = key_label;
- p = buf + strlen(key_label) + 1;
- ht_elm = HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry);
- if (!ht_elm) {
- skipped++;
- io_log_print(log, line, _("Key label not recognized"));
- continue;
- }
- assigned = 0;
- for (;;) {
- char key_ch[BUFSIZ], tmpbuf[BUFSIZ];
-
- while (*p == ' ')
- p++;
- (void)strncpy(tmpbuf, p, BUFSIZ);
- if (sscanf(tmpbuf, "%s", key_ch) == AWAITED) {
- int ch;
-
- if ((ch = keys_str2int(key_ch)) < 0) {
- char unknown_key[BUFSIZ];
-
- skipped++;
- (void)snprintf(unknown_key, BUFSIZ,
- _("Error reading key: \"%s\""), key_ch);
- io_log_print(log, line, unknown_key);
- } else {
- int used;
-
- used = keys_assign_binding(ch, ht_elm->key);
- if (used) {
- char already_assigned[BUFSIZ];
-
- skipped++;
- (void)snprintf(already_assigned, BUFSIZ,
- _("\"%s\" assigned multiple times!"), key_ch);
- io_log_print(log, line, already_assigned);
- } else {
- assigned++;
- }
- }
- p += strlen(key_ch) + 1;
- } else {
- if (assigned)
- loaded++;
- break;
- }
- }
- }
- file_close(keyfp, __FILE_POS__);
- file_close(log->fd, __FILE_POS__);
- if (skipped > 0) {
- const char *view_log =
- _("There were some errors when loading keys file, see log file ?");
-
- io_log_display(log, view_log, pager);
- }
- io_log_free(log);
- EXIT_IF(skipped > MAX_ERRORS,
- _("Too many errors while reading keys file, aborting..."));
- if (loaded < NBKEYS)
- keys_fill_missing();
- if (keys_check_missing_bindings())
- WARN_MSG(_("Some actions do not have any associated key bindings!"));
+ struct ht_keybindings_s keys[NBKEYS];
+ FILE *keyfp;
+ char buf[BUFSIZ];
+ struct io_file *log;
+ int i, skipped, loaded, line;
+ const int MAX_ERRORS = 5;
+
+ keys_init();
+
+ struct ht_keybindings ht_keys = HTABLE_INITIALIZER(&ht_keys);
+
+ for (i = 0; i < NBKEYS; i++) {
+ keys[i].key = (enum key)i;
+ keys[i].label = keys_get_label((enum key)i);
+ HTABLE_INSERT(ht_keybindings, &ht_keys, &keys[i]);
+ }
+
+ keyfp = fopen(path_keys, "r");
+ EXIT_IF(keyfp == NULL, _("failed to open key file"));
+
+ log = io_log_init();
+ skipped = loaded = line = 0;
+ while (fgets(buf, BUFSIZ, keyfp) != NULL) {
+ char key_label[BUFSIZ], *p;
+ struct ht_keybindings_s *ht_elm, ht_entry;
+ const int AWAITED = 1;
+ int assigned;
+
+ line++;
+ if (skipped > MAX_ERRORS) {
+ const char *too_many =
+ _("\nToo many errors while reading configuration file!\n"
+ "Please backup your keys file, remove it from directory, "
+ "and launch calcurse again.\n");
+
+ io_log_print(log, line, too_many);
+ break;
+ }
+ for (p = buf; is_blank((int)*p); p++) ;
+ if (p != buf)
+ memmove(buf, p, strlen(p));
+ if (buf[0] == '#' || buf[0] == '\n')
+ continue;
+
+ if (sscanf(buf, "%s", key_label) != AWAITED) {
+ skipped++;
+ io_log_print(log, line,
+ _("Could not read key label"));
+ continue;
+ }
+
+ /* Skip legacy entries. */
+ if (strcmp(key_label, "generic-cut") == 0)
+ continue;
+
+ ht_entry.label = key_label;
+ p = buf + strlen(key_label) + 1;
+ ht_elm =
+ HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry);
+ if (!ht_elm) {
+ skipped++;
+ io_log_print(log, line,
+ _("Key label not recognized"));
+ continue;
+ }
+ assigned = 0;
+ for (;;) {
+ char key_ch[BUFSIZ], tmpbuf[BUFSIZ];
+
+ while (*p == ' ')
+ p++;
+ (void)strncpy(tmpbuf, p, BUFSIZ);
+ if (sscanf(tmpbuf, "%s", key_ch) == AWAITED) {
+ int ch;
+
+ if ((ch = keys_str2int(key_ch)) < 0) {
+ char unknown_key[BUFSIZ];
+
+ skipped++;
+ (void)snprintf(unknown_key, BUFSIZ,
+ _("Error reading key: \"%s\""),
+ key_ch);
+ io_log_print(log, line,
+ unknown_key);
+ } else {
+ int used;
+
+ used =
+ keys_assign_binding(ch,
+ ht_elm->
+ key);
+ if (used) {
+ char already_assigned
+ [BUFSIZ];
+
+ skipped++;
+ (void)
+ snprintf
+ (already_assigned,
+ BUFSIZ,
+ _("\"%s\" assigned multiple times!"),
+ key_ch);
+ io_log_print(log, line,
+ already_assigned);
+ } else {
+ assigned++;
+ }
+ }
+ p += strlen(key_ch) + 1;
+ } else {
+ if (assigned)
+ loaded++;
+ break;
+ }
+ }
+ }
+ file_close(keyfp, __FILE_POS__);
+ file_close(log->fd, __FILE_POS__);
+ if (skipped > 0) {
+ const char *view_log =
+ _("There were some errors when loading keys file, see log file ?");
+
+ io_log_display(log, view_log, pager);
+ }
+ io_log_free(log);
+ EXIT_IF(skipped > MAX_ERRORS,
+ _("Too many errors while reading keys file, aborting..."));
+ if (loaded < NBKEYS)
+ keys_fill_missing();
+ if (keys_check_missing_bindings())
+ WARN_MSG(_("Some actions do not have any associated key bindings!"));
}
int io_check_dir(const char *dir)
{
- if (read_only)
- return -1;
-
- errno = 0;
- if (mkdir(dir, 0700) != 0) {
- if (errno != EEXIST) {
- fprintf(stderr, _("FATAL ERROR: could not create %s: %s\n"), dir,
- strerror(errno));
- exit_calcurse(EXIT_FAILURE);
- } else {
- return 1;
- }
- } else {
- return 0;
- }
+ if (read_only)
+ return -1;
+
+ errno = 0;
+ if (mkdir(dir, 0700) != 0) {
+ if (errno != EEXIST) {
+ fprintf(stderr,
+ _("FATAL ERROR: could not create %s: %s\n"),
+ dir, strerror(errno));
+ exit_calcurse(EXIT_FAILURE);
+ } else {
+ return 1;
+ }
+ } else {
+ return 0;
+ }
}
unsigned io_file_exist(const char *file)
{
- FILE *fd;
-
- if (file && (fd = fopen(file, "r")) != NULL) {
- fclose(fd);
- return 1;
- } else {
- return 0;
- }
+ FILE *fd;
+
+ if (file && (fd = fopen(file, "r")) != NULL) {
+ fclose(fd);
+ return 1;
+ } else {
+ return 0;
+ }
}
int io_check_file(const char *file)
{
- if (read_only)
- return -1;
-
- errno = 0;
- if (io_file_exist(file)) {
- return 1;
- } else {
- FILE *fd;
-
- if ((fd = fopen(file, "w")) == NULL) {
- fprintf(stderr, _("FATAL ERROR: could not create %s: %s\n"), file,
- strerror(errno));
- exit_calcurse(EXIT_FAILURE);
- }
- file_close(fd, __FILE_POS__);
-
- return 0;
- }
+ if (read_only)
+ return -1;
+
+ errno = 0;
+ if (io_file_exist(file)) {
+ return 1;
+ } else {
+ FILE *fd;
+
+ if ((fd = fopen(file, "w")) == NULL) {
+ fprintf(stderr,
+ _("FATAL ERROR: could not create %s: %s\n"),
+ file, strerror(errno));
+ exit_calcurse(EXIT_FAILURE);
+ }
+ file_close(fd, __FILE_POS__);
+
+ return 0;
+ }
}
/*
@@ -871,98 +921,100 @@ int io_check_file(const char *file)
*/
int io_check_data_files(void)
{
- int missing = 0;
+ int missing = 0;
- missing += io_check_dir(path_dir) ? 0 : 1;
- missing += io_check_dir(path_notes) ? 0 : 1;
- missing += io_check_file(path_todo) ? 0 : 1;
- missing += io_check_file(path_apts) ? 0 : 1;
- missing += io_check_file(path_conf) ? 0 : 1;
+ missing += io_check_dir(path_dir) ? 0 : 1;
+ missing += io_check_dir(path_notes) ? 0 : 1;
+ missing += io_check_file(path_todo) ? 0 : 1;
+ missing += io_check_file(path_apts) ? 0 : 1;
+ missing += io_check_file(path_conf) ? 0 : 1;
- if (!io_check_file(path_keys)) {
- missing++;
- keys_dump_defaults(path_keys);
- }
+ if (!io_check_file(path_keys)) {
+ missing++;
+ keys_dump_defaults(path_keys);
+ }
- return missing;
+ return missing;
}
/* Draw the startup screen */
void io_startup_screen(int no_data_file)
{
- const char *enter = _("Press [ENTER] to continue");
+ const char *enter = _("Press [ENTER] to continue");
- if (no_data_file)
- status_mesg(_("Welcome to Calcurse. Missing data files were created."),
- enter);
- else
- status_mesg(_("Data files found. Data will be loaded now."), enter);
+ if (no_data_file)
+ status_mesg(_("Welcome to Calcurse. Missing data files were created."),
+ enter);
+ else
+ status_mesg(_("Data files found. Data will be loaded now."),
+ enter);
- wgetch(win[KEY].p);
+ wgetch(win[KEY].p);
}
/* Export calcurse data. */
void io_export_data(enum export_type type)
{
- FILE *stream = NULL;
- const char *success = _("The data were successfully exported");
- const char *enter = _("Press [ENTER] to continue");
-
- if (type < IO_EXPORT_ICAL || type >= IO_EXPORT_NBTYPES)
- EXIT(_("unknown export type"));
-
- switch (ui_mode) {
- case UI_CMDLINE:
- stream = stdout;
- break;
- case UI_CURSES:
- stream = get_export_stream(type);
- break;
- default:
- EXIT(_("wrong export mode"));
- /* NOTREACHED */
- }
-
- if (stream == NULL)
- return;
-
- if (type == IO_EXPORT_ICAL)
- ical_export_data(stream);
- else if (type == IO_EXPORT_PCAL)
- pcal_export_data(stream);
-
- if (conf.system_dialogs && ui_mode == UI_CURSES) {
- status_mesg(success, enter);
- wgetch(win[KEY].p);
- }
+ FILE *stream = NULL;
+ const char *success = _("The data were successfully exported");
+ const char *enter = _("Press [ENTER] to continue");
+
+ if (type < IO_EXPORT_ICAL || type >= IO_EXPORT_NBTYPES)
+ EXIT(_("unknown export type"));
+
+ switch (ui_mode) {
+ case UI_CMDLINE:
+ stream = stdout;
+ break;
+ case UI_CURSES:
+ stream = get_export_stream(type);
+ break;
+ default:
+ EXIT(_("wrong export mode"));
+ /* NOTREACHED */
+ }
+
+ if (stream == NULL)
+ return;
+
+ if (type == IO_EXPORT_ICAL)
+ ical_export_data(stream);
+ else if (type == IO_EXPORT_PCAL)
+ pcal_export_data(stream);
+
+ if (conf.system_dialogs && ui_mode == UI_CURSES) {
+ status_mesg(success, enter);
+ wgetch(win[KEY].p);
+ }
}
static FILE *get_import_stream(enum import_type type)
{
- FILE *stream = NULL;
- char *stream_name;
- const char *ask_fname = _("Enter the file name to import data from:");
- const char *wrong_file =
- _("The file cannot be accessed, please enter another file name.");
- const char *press_enter = _("Press [ENTER] to continue.");
-
- stream_name = mem_malloc(BUFSIZ);
- memset(stream_name, 0, BUFSIZ);
- while (stream == NULL) {
- status_mesg(ask_fname, "");
- if (updatestring(win[STA].p, &stream_name, 0, 1)) {
- mem_free(stream_name);
- return NULL;
- }
- stream = fopen(stream_name, "r");
- if (stream == NULL) {
- status_mesg(wrong_file, press_enter);
- wgetch(win[KEY].p);
- }
- }
- mem_free(stream_name);
-
- return stream;
+ FILE *stream = NULL;
+ char *stream_name;
+ const char *ask_fname =
+ _("Enter the file name to import data from:");
+ const char *wrong_file =
+ _("The file cannot be accessed, please enter another file name.");
+ const char *press_enter = _("Press [ENTER] to continue.");
+
+ stream_name = mem_malloc(BUFSIZ);
+ memset(stream_name, 0, BUFSIZ);
+ while (stream == NULL) {
+ status_mesg(ask_fname, "");
+ if (updatestring(win[STA].p, &stream_name, 0, 1)) {
+ mem_free(stream_name);
+ return NULL;
+ }
+ stream = fopen(stream_name, "r");
+ if (stream == NULL) {
+ status_mesg(wrong_file, press_enter);
+ wgetch(win[KEY].p);
+ }
+ }
+ mem_free(stream_name);
+
+ return stream;
}
/*
@@ -973,146 +1025,153 @@ static FILE *get_import_stream(enum import_type type)
*/
void io_import_data(enum import_type type, const char *stream_name)
{
- const char *proc_report = _("Import process report: %04d lines read ");
- char stats_str[4][BUFSIZ];
- FILE *stream = NULL;
- struct io_file *log;
- struct {
- unsigned events, apoints, todos, lines, skipped;
- } stats;
-
- EXIT_IF(type < 0 || type >= IO_IMPORT_NBTYPES, _("unknown import type"));
- switch (ui_mode) {
- case UI_CMDLINE:
- stream = fopen(stream_name, "r");
- EXIT_IF(stream == NULL,
- _("FATAL ERROR: the input file cannot be accessed, "
- "Aborting..."));
- break;
- case UI_CURSES:
- stream = get_import_stream(type);
- break;
- default:
- EXIT(_("FATAL ERROR: wrong import mode"));
- /* NOTREACHED */
- }
-
- if (stream == NULL)
- return;
-
- memset(&stats, 0, sizeof stats);
-
- log = io_log_init();
- if (log == NULL) {
- if (stream != stdin)
- file_close(stream, __FILE_POS__);
- return;
- }
-
- if (type == IO_IMPORT_ICAL)
- ical_import_data(stream, log->fd, &stats.events, &stats.apoints,
- &stats.todos, &stats.lines, &stats.skipped);
-
- if (stream != stdin)
- file_close(stream, __FILE_POS__);
-
- snprintf(stats_str[0], BUFSIZ,
- ngettext("%d app", "%d apps", stats.apoints), stats.apoints);
- snprintf(stats_str[1], BUFSIZ,
- ngettext("%d event", "%d events", stats.events), stats.events);
- snprintf(stats_str[2], BUFSIZ,
- ngettext("%d todo", "%d todos", stats.todos), stats.todos);
- snprintf(stats_str[3], BUFSIZ, _("%d skipped"), stats.skipped);
-
- /* Update the number of todo items. */
- ui_todo_set_nb(ui_todo_nb() + stats.todos);
-
- if (ui_mode == UI_CURSES && conf.system_dialogs) {
- char read[BUFSIZ], stat[BUFSIZ];
-
- snprintf(read, BUFSIZ, proc_report, stats.lines);
- snprintf(stat, BUFSIZ, "%s / %s / %s / %s (%s)", stats_str[0],
- stats_str[1], stats_str[2], stats_str[3],
- _("Press [ENTER] to continue"));
- status_mesg(read, stat);
- wgetch(win[KEY].p);
- } else if (ui_mode == UI_CMDLINE) {
- printf(proc_report, stats.lines);
- printf("\n%s / %s / %s / %s\n", stats_str[0], stats_str[1],
- stats_str[2], stats_str[3]);
- }
-
- /* User has the choice to look at the log file if some items could not be
- imported.
- */
- file_close(log->fd, __FILE_POS__);
- if (stats.skipped > 0) {
- const char *view_log =
- _("Some items could not be imported, see log file ?");
-
- io_log_display(log, view_log, conf.pager);
- }
- io_log_free(log);
+ const char *proc_report =
+ _("Import process report: %04d lines read ");
+ char stats_str[4][BUFSIZ];
+ FILE *stream = NULL;
+ struct io_file *log;
+ struct {
+ unsigned events, apoints, todos, lines, skipped;
+ } stats;
+
+ EXIT_IF(type < 0
+ || type >= IO_IMPORT_NBTYPES, _("unknown import type"));
+ switch (ui_mode) {
+ case UI_CMDLINE:
+ stream = fopen(stream_name, "r");
+ EXIT_IF(stream == NULL,
+ _("FATAL ERROR: the input file cannot be accessed, "
+ "Aborting..."));
+ break;
+ case UI_CURSES:
+ stream = get_import_stream(type);
+ break;
+ default:
+ EXIT(_("FATAL ERROR: wrong import mode"));
+ /* NOTREACHED */
+ }
+
+ if (stream == NULL)
+ return;
+
+ memset(&stats, 0, sizeof stats);
+
+ log = io_log_init();
+ if (log == NULL) {
+ if (stream != stdin)
+ file_close(stream, __FILE_POS__);
+ return;
+ }
+
+ if (type == IO_IMPORT_ICAL)
+ ical_import_data(stream, log->fd, &stats.events,
+ &stats.apoints, &stats.todos,
+ &stats.lines, &stats.skipped);
+
+ if (stream != stdin)
+ file_close(stream, __FILE_POS__);
+
+ snprintf(stats_str[0], BUFSIZ,
+ ngettext("%d app", "%d apps", stats.apoints),
+ stats.apoints);
+ snprintf(stats_str[1], BUFSIZ,
+ ngettext("%d event", "%d events", stats.events),
+ stats.events);
+ snprintf(stats_str[2], BUFSIZ,
+ ngettext("%d todo", "%d todos", stats.todos),
+ stats.todos);
+ snprintf(stats_str[3], BUFSIZ, _("%d skipped"), stats.skipped);
+
+ /* Update the number of todo items. */
+ ui_todo_set_nb(ui_todo_nb() + stats.todos);
+
+ if (ui_mode == UI_CURSES && conf.system_dialogs) {
+ char read[BUFSIZ], stat[BUFSIZ];
+
+ snprintf(read, BUFSIZ, proc_report, stats.lines);
+ snprintf(stat, BUFSIZ, "%s / %s / %s / %s (%s)",
+ stats_str[0], stats_str[1], stats_str[2],
+ stats_str[3], _("Press [ENTER] to continue"));
+ status_mesg(read, stat);
+ wgetch(win[KEY].p);
+ } else if (ui_mode == UI_CMDLINE) {
+ printf(proc_report, stats.lines);
+ printf("\n%s / %s / %s / %s\n", stats_str[0], stats_str[1],
+ stats_str[2], stats_str[3]);
+ }
+
+ /* User has the choice to look at the log file if some items could not be
+ imported.
+ */
+ file_close(log->fd, __FILE_POS__);
+ if (stats.skipped > 0) {
+ const char *view_log =
+ _("Some items could not be imported, see log file ?");
+
+ io_log_display(log, view_log, conf.pager);
+ }
+ io_log_free(log);
}
struct io_file *io_log_init(void)
{
- char logprefix[BUFSIZ];
- char *logname;
- struct io_file *log;
-
- snprintf(logprefix, BUFSIZ, "%s/calcurse_log.", get_tempdir());
- logname = new_tempfile(logprefix, TMPEXTSIZ);
- RETVAL_IF(logname == NULL, 0,
- _("Warning: could not create temporary log file, Aborting..."));
- log = mem_malloc(sizeof(struct io_file));
- RETVAL_IF(log == NULL, 0,
- _("Warning: could not open temporary log file, Aborting..."));
- snprintf(log->name, sizeof(log->name), "%s%s", logprefix, logname);
- mem_free(logname);
- log->fd = fopen(log->name, "w");
- if (log->fd == NULL) {
- ERROR_MSG(_("Warning: could not open temporary log file, Aborting..."));
- mem_free(log);
- return 0;
- }
-
- return log;
+ char logprefix[BUFSIZ];
+ char *logname;
+ struct io_file *log;
+
+ snprintf(logprefix, BUFSIZ, "%s/calcurse_log.", get_tempdir());
+ logname = new_tempfile(logprefix, TMPEXTSIZ);
+ RETVAL_IF(logname == NULL, 0,
+ _("Warning: could not create temporary log file, Aborting..."));
+ log = mem_malloc(sizeof(struct io_file));
+ RETVAL_IF(log == NULL, 0,
+ _("Warning: could not open temporary log file, Aborting..."));
+ snprintf(log->name, sizeof(log->name), "%s%s", logprefix, logname);
+ mem_free(logname);
+ log->fd = fopen(log->name, "w");
+ if (log->fd == NULL) {
+ ERROR_MSG(_("Warning: could not open temporary log file, Aborting..."));
+ mem_free(log);
+ return 0;
+ }
+
+ return log;
}
void io_log_print(struct io_file *log, int line, const char *msg)
{
- if (log && log->fd)
- fprintf(log->fd, "line %d: %s\n", line, msg);
+ if (log && log->fd)
+ fprintf(log->fd, "line %d: %s\n", line, msg);
}
-void io_log_display(struct io_file *log, const char *msg, const char *pager)
+void io_log_display(struct io_file *log, const char *msg,
+ const char *pager)
{
- RETURN_IF(log == NULL, _("No log file to display!"));
- if (ui_mode == UI_CMDLINE) {
- printf("\n%s [y/n] ", msg);
- if (fgetc(stdin) == 'y') {
- const char *arg[] = { pager, log->name, NULL };
- int pid;
-
- if ((pid = fork_exec(NULL, NULL, pager, arg)))
- child_wait(NULL, NULL, pid);
- }
- } else {
- if (status_ask_bool(msg) == 1)
- wins_launch_external(log->name, pager);
- wins_erase_status_bar();
- }
+ RETURN_IF(log == NULL, _("No log file to display!"));
+ if (ui_mode == UI_CMDLINE) {
+ printf("\n%s [y/n] ", msg);
+ if (fgetc(stdin) == 'y') {
+ const char *arg[] = { pager, log->name, NULL };
+ int pid;
+
+ if ((pid = fork_exec(NULL, NULL, pager, arg)))
+ child_wait(NULL, NULL, pid);
+ }
+ } else {
+ if (status_ask_bool(msg) == 1)
+ wins_launch_external(log->name, pager);
+ wins_erase_status_bar();
+ }
}
void io_log_free(struct io_file *log)
{
- if (!log)
- return;
- EXIT_IF(unlink(log->name) != 0,
- _("Warning: could not erase temporary log file %s, Aborting..."),
- log->name);
- mem_free(log);
+ if (!log)
+ return;
+ EXIT_IF(unlink(log->name) != 0,
+ _("Warning: could not erase temporary log file %s, Aborting..."),
+ log->name);
+ mem_free(log);
}
static pthread_t io_t_psave;
@@ -1120,28 +1179,28 @@ static pthread_t io_t_psave;
/* Thread used to periodically save data. */
static void *io_psave_thread(void *arg)
{
- int delay = conf.periodic_save;
- EXIT_IF(delay < 0, _("Invalid delay"));
+ int delay = conf.periodic_save;
+ EXIT_IF(delay < 0, _("Invalid delay"));
- for (;;) {
- sleep(delay * MININSEC);
- io_save_cal(IO_SAVE_DISPLAY_NONE);
- }
+ for (;;) {
+ sleep(delay * MININSEC);
+ io_save_cal(IO_SAVE_DISPLAY_NONE);
+ }
}
/* Launch the thread which handles periodic saves. */
void io_start_psave_thread(void)
{
- pthread_create(&io_t_psave, NULL, io_psave_thread, NULL);
+ pthread_create(&io_t_psave, NULL, io_psave_thread, NULL);
}
/* Stop periodic data saves. */
void io_stop_psave_thread(void)
{
- if (io_t_psave) {
- pthread_cancel(io_t_psave);
- pthread_join(io_t_psave, NULL);
- }
+ if (io_t_psave) {
+ pthread_cancel(io_t_psave);
+ pthread_join(io_t_psave, NULL);
+ }
}
/*
@@ -1157,32 +1216,33 @@ void io_stop_psave_thread(void)
*/
void io_set_lock(void)
{
- FILE *lock = fopen(path_cpid, "r");
- int pid;
-
- if (lock != NULL) {
- /* If there is a lock file, check whether the process exists. */
- if (fscanf(lock, "%d", &pid) == 1) {
- fclose(lock);
- if (kill(pid, 0) != 0 && errno == ESRCH)
- lock = NULL;
- } else {
- fclose(lock);
- }
- }
-
- if (lock != NULL) {
- fprintf(stderr,
- _("\nWARNING: it seems that another calcurse instance is "
- "already running.\n"
- "If this is not the case, please remove the following "
- "lock file: \n\"%s\"\n" "and restart calcurse.\n"), path_cpid);
- exit(EXIT_FAILURE);
- } else {
- if (!io_dump_pid(path_cpid))
- EXIT(_("FATAL ERROR: could not create %s: %s\n"),
- path_cpid, strerror(errno));
- }
+ FILE *lock = fopen(path_cpid, "r");
+ int pid;
+
+ if (lock != NULL) {
+ /* If there is a lock file, check whether the process exists. */
+ if (fscanf(lock, "%d", &pid) == 1) {
+ fclose(lock);
+ if (kill(pid, 0) != 0 && errno == ESRCH)
+ lock = NULL;
+ } else {
+ fclose(lock);
+ }
+ }
+
+ if (lock != NULL) {
+ fprintf(stderr,
+ _("\nWARNING: it seems that another calcurse instance is "
+ "already running.\n"
+ "If this is not the case, please remove the following "
+ "lock file: \n\"%s\"\n"
+ "and restart calcurse.\n"), path_cpid);
+ exit(EXIT_FAILURE);
+ } else {
+ if (!io_dump_pid(path_cpid))
+ EXIT(_("FATAL ERROR: could not create %s: %s\n"),
+ path_cpid, strerror(errno));
+ }
}
/*
@@ -1191,18 +1251,18 @@ void io_set_lock(void)
*/
unsigned io_dump_pid(char *file)
{
- pid_t pid;
- FILE *fp;
+ pid_t pid;
+ FILE *fp;
- if (!file)
- return 0;
+ if (!file)
+ return 0;
- pid = getpid();
- if (!(fp = fopen(file, "w"))
- || fprintf(fp, "%ld\n", (long)pid) < 0 || fclose(fp) != 0)
- return 0;
+ pid = getpid();
+ if (!(fp = fopen(file, "w"))
+ || fprintf(fp, "%ld\n", (long)pid) < 0 || fclose(fp) != 0)
+ return 0;
- return 1;
+ return 1;
}
/*
@@ -1212,21 +1272,21 @@ unsigned io_dump_pid(char *file)
*/
unsigned io_get_pid(char *file)
{
- FILE *fp;
- unsigned pid;
+ FILE *fp;
+ unsigned pid;
- if (!file)
- return 0;
+ if (!file)
+ return 0;
- if ((fp = fopen(file, "r")) == NULL)
- return 0;
+ if ((fp = fopen(file, "r")) == NULL)
+ return 0;
- if (fscanf(fp, "%u", &pid) != 1)
- return 0;
+ if (fscanf(fp, "%u", &pid) != 1)
+ return 0;
- fclose(fp);
+ fclose(fp);
- return pid;
+ return pid;
}
/*
@@ -1234,19 +1294,19 @@ unsigned io_get_pid(char *file)
*/
int io_file_is_empty(char *file)
{
- FILE *fp;
-
- if (file && (fp = fopen(file, "r"))) {
- if ((fgetc(fp) == '\n' && fgetc(fp) == EOF) || feof(fp)) {
- fclose(fp);
- return 1;
- } else {
- fclose(fp);
- return 0;
- }
- }
-
- return -1;
+ FILE *fp;
+
+ if (file && (fp = fopen(file, "r"))) {
+ if ((fgetc(fp) == '\n' && fgetc(fp) == EOF) || feof(fp)) {
+ fclose(fp);
+ return 1;
+ } else {
+ fclose(fp);
+ return 0;
+ }
+ }
+
+ return -1;
}
/*
@@ -1254,27 +1314,28 @@ int io_file_is_empty(char *file)
*/
int io_file_cp(const char *src, const char *dst)
{
- FILE *fp_src, *fp_dst;
- char *buffer[BUFSIZ];
- unsigned int bytes_read;
-
- if (!(fp_src = fopen(src, "rb")))
- return 0;
- if (!(fp_dst = fopen(dst, "wb")))
- return 0;
-
- while (!feof(fp_src)) {
- bytes_read = fread(buffer, 1, BUFSIZ, fp_src);
- if (bytes_read > 0) {
- if (fwrite(buffer, 1, bytes_read, fp_dst) != bytes_read)
- return 0;
- } else {
- return 0;
- }
- }
-
- fclose(fp_dst);
- fclose(fp_src);
-
- return 1;
+ FILE *fp_src, *fp_dst;
+ char *buffer[BUFSIZ];
+ unsigned int bytes_read;
+
+ if (!(fp_src = fopen(src, "rb")))
+ return 0;
+ if (!(fp_dst = fopen(dst, "wb")))
+ return 0;
+
+ while (!feof(fp_src)) {
+ bytes_read = fread(buffer, 1, BUFSIZ, fp_src);
+ if (bytes_read > 0) {
+ if (fwrite(buffer, 1, bytes_read, fp_dst) !=
+ bytes_read)
+ return 0;
+ } else {
+ return 0;
+ }
+ }
+
+ fclose(fp_dst);
+ fclose(fp_src);
+
+ return 1;
}