diff options
Diffstat (limited to 'src/io.c')
-rw-r--r-- | src/io.c | 209 |
1 files changed, 96 insertions, 113 deletions
@@ -151,7 +151,6 @@ static void progress_bar(progress_bar_t type, int progress) static FILE *get_export_stream(enum export_type type) { FILE *stream; - int cancel; char *home, *stream_name; const char *question = _("Choose the file used to export calcurse data:"); const char *wrong_name = @@ -169,8 +168,7 @@ static FILE *get_export_stream(enum export_type type) while (stream == NULL) { status_mesg(question, ""); - cancel = updatestring(win[STA].p, &stream_name, 0, 1); - if (cancel) { + if (updatestring(win[STA].p, &stream_name, 0, 1)) { mem_free(stream_name); return NULL; } @@ -231,7 +229,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 +246,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__); } } @@ -425,6 +427,12 @@ void io_save_cal(enum save_display display) pthread_mutex_unlock(&io_save_mutex); } +static void io_load_error(const char *filename, unsigned line, + const char *mesg) +{ + EXIT("%s:%u: %s", filename, line, mesg); +} + /* * Check what type of data is written in the appointment file, * and then load either: a new appointment, a new event, or a new @@ -441,6 +449,7 @@ void io_load_app(void) int freq; char type, state = 0L; char note[MAX_NOTESIZ + 1], *notep; + unsigned line = 0; t = time(NULL); localtime_r(&t, <); @@ -452,6 +461,7 @@ void io_load_app(void) for (;;) { LLIST_INIT(&exc); is_appointment = is_event = is_recursive = 0; + line++; c = getc(data_file); if (c == EOF) break; @@ -462,7 +472,7 @@ void io_load_app(void) */ if (fscanf(data_file, "%d / %d / %d ", &start.tm_mon, &start.tm_mday, &start.tm_year) != 3) - EXIT(_("syntax error in the item date")); + 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. @@ -474,7 +484,7 @@ void io_load_app(void) else if (c == '[') is_event = 1; else - EXIT(_("no event nor appointment found")); + io_load_error(path_apts, line, _("no event nor appointment found")); /* Read the remaining informations. */ if (is_appointment) { @@ -482,14 +492,16 @@ void io_load_app(void) &start.tm_hour, &start.tm_min, &end.tm_mon, &end.tm_mday, &end.tm_year, &end.tm_hour, &end.tm_min) != 7) - EXIT(_("syntax error in item time or duration")); + 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) != ']') - EXIT(_("syntax error in item identifier")); + io_load_error(path_apts, line, _("syntax error in item identifier")); while ((c = getc(data_file)) == ' ') ; ungetc(c, data_file); } else { - EXIT(_("wrong format in the appointment or event")); + io_load_error(path_apts, line, + _("wrong format in the appointment or event")); /* NOTREACHED */ } @@ -499,7 +511,7 @@ void io_load_app(void) if (c == '{') { is_recursive = 1; if (fscanf(data_file, " %d%c ", &freq, &type) != 2) - EXIT(_("syntax error in item repetition")); + io_load_error(path_apts, line, _("syntax error in item repetition")); c = getc(data_file); if (c == '}') { /* endless recurrent item */ @@ -509,7 +521,7 @@ void io_load_app(void) } else if (c == '-' && getc(data_file) == '>') { if (fscanf(data_file, " %d / %d / %d ", &until.tm_mon, &until.tm_mday, &until.tm_year) != 3) - EXIT(_("syntax error in item repetition")); + io_load_error(path_apts, line, _("syntax error in item repetition")); c = getc(data_file); if (c == '!') { ungetc(c, data_file); @@ -519,14 +531,15 @@ void io_load_app(void) while ((c = getc(data_file)) == ' ') ; ungetc(c, data_file); } else - EXIT(_("syntax error in item repetition")); + 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); c = getc(data_file); until.tm_year = 0; } else { - EXIT(_("wrong format in the appointment or event")); + io_load_error(path_apts, line, + _("wrong format in the appointment or event")); /* NOTREACHED */ } } else @@ -557,7 +570,7 @@ void io_load_app(void) while ((c = getc(data_file)) == ' ') ; ungetc(c, data_file); } else - EXIT(_("syntax error in item repetition")); + 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); @@ -571,7 +584,8 @@ void io_load_app(void) event_scan(data_file, start, id, notep); } } else { - EXIT(_("wrong format in the appointment or event")); + io_load_error(path_apts, line, + _("wrong format in the appointment or event")); /* NOTREACHED */ } } @@ -586,17 +600,19 @@ void io_load_todo(void) 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) != ']') - EXIT(_("syntax error in item identifier")); + io_load_error(path_todo, line, _("syntax error in item identifier")); while ((c = getc(data_file)) == ' ') ; ungetc(c, data_file); } else { @@ -777,10 +793,10 @@ void io_load_keys(const char *pager) WARN_MSG(_("Some actions do not have any associated key bindings!")); } -void io_check_dir(char *dir, int *missing) +int io_check_dir(const char *dir) { if (read_only) - return; + return -1; errno = 0; if (mkdir(dir, 0700) != 0) { @@ -788,45 +804,46 @@ void io_check_dir(char *dir, int *missing) fprintf(stderr, _("FATAL ERROR: could not create %s: %s\n"), dir, strerror(errno)); exit_calcurse(EXIT_FAILURE); + } else { + return 1; } } else { - if (missing) - (*missing)++; + return 0; } } -unsigned io_file_exist(char *file) +unsigned io_file_exist(const char *file) { FILE *fd; - if (!file) - return 0; - - if ((fd = fopen(file, "r")) == NULL) + if (file && (fd = fopen(file, "r")) != NULL) { + fclose(fd); + return 1; + } + else { return 0; - - fclose(fd); - - return 1; + } } -void io_check_file(char *file, int *missing) +int io_check_file(const char *file) { if (read_only) - return; + return -1; errno = 0; - if (!io_file_exist(file)) { + if (io_file_exist(file)) { + return 1; + } else { FILE *fd; - if (missing) - (*missing)++; 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; } } @@ -844,17 +861,15 @@ void io_check_file(char *file, int *missing) */ int io_check_data_files(void) { - int missing, missing_keys; + int missing = 0; - missing = missing_keys = 0; - errno = 0; - io_check_dir(path_dir, &missing); - io_check_dir(path_notes, &missing); - io_check_file(path_todo, &missing); - io_check_file(path_apts, &missing); - io_check_file(path_conf, &missing); - io_check_file(path_keys, &missing_keys); - if (missing_keys) { + 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); } @@ -879,14 +894,13 @@ void io_startup_screen(int no_data_file) /* Export calcurse data. */ void io_export_data(enum export_type type) { - FILE *stream; + 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")); - stream = 0; switch (ui_mode) { case UI_CMDLINE: stream = stdout; @@ -913,46 +927,20 @@ void io_export_data(enum export_type type) } } -/* Draws the export format selection bar */ -void io_export_bar(void) -{ - int smlspc, spc; - - smlspc = 2; - spc = 15; - - custom_apply_attr(win[STA].p, ATTR_HIGHEST); - mvwaddstr(win[STA].p, 0, 2, "Q"); - mvwaddstr(win[STA].p, 1, 2, "I"); - mvwaddstr(win[STA].p, 0, 2 + spc, "P"); - custom_remove_attr(win[STA].p, ATTR_HIGHEST); - - mvwaddstr(win[STA].p, 0, 2 + smlspc, _("Exit")); - mvwaddstr(win[STA].p, 1, 2 + smlspc, _("Ical")); - mvwaddstr(win[STA].p, 0, 2 + spc + smlspc, _("Pcal")); - - wnoutrefresh(win[STA].p); - wmove(win[STA].p, 0, 0); - wins_doupdate(); -} - static FILE *get_import_stream(enum export_type type) { - FILE *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."); - int cancel; - stream = NULL; stream_name = mem_malloc(BUFSIZ); memset(stream_name, 0, BUFSIZ); while (stream == NULL) { status_mesg(ask_fname, ""); - cancel = updatestring(win[STA].p, &stream_name, 0, 1); - if (cancel) { + if (updatestring(win[STA].p, &stream_name, 0, 1)) { mem_free(stream_name); return NULL; } @@ -1090,13 +1078,10 @@ void io_log_print(struct io_file *log, int line, const char *msg) void io_log_display(struct io_file *log, const char *msg, const char *pager) { - int ans; - RETURN_IF(log == NULL, _("No log file to display!")); if (ui_mode == UI_CMDLINE) { printf("\n%s [y/n] ", msg); - ans = fgetc(stdin); - if (ans == 'y') { + if (fgetc(stdin) == 'y') { const char *arg[] = { pager, log->name, NULL }; int pid; @@ -1125,9 +1110,7 @@ static pthread_t io_t_psave; /* Thread used to periodically save data. */ static void *io_psave_thread(void *arg) { - int delay; - - delay = conf.periodic_save; + int delay = conf.periodic_save; EXIT_IF(delay < 0, _("Invalid delay")); for (;;) { |