aboutsummaryrefslogtreecommitdiffstats
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rwxr-xr-xsrc/utils.c1370
1 files changed, 704 insertions, 666 deletions
diff --git a/src/utils.c b/src/utils.c
index f7f0717..7f89f90 100755
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,4 +1,4 @@
-/* $calcurse: utils.c,v 1.44 2008/04/09 20:38:29 culot Exp $ */
+/* $calcurse: utils.c,v 1.45 2008/04/12 21:14:03 culot Exp $ */
/*
* Calcurse - text-based organizer
@@ -24,7 +24,7 @@
*
*/
-#include <time.h>
+#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
@@ -42,139 +42,142 @@
static unsigned status_page;
/* General routine to exit calcurse properly. */
-void
-exit_calcurse(int status)
+void
+exit_calcurse (int status)
{
- clear();
- refresh();
- endwin();
- calendar_stop_date_thread();
- exit(status);
+ clear ();
+ refresh ();
+ endwin ();
+ calendar_stop_date_thread ();
+ exit (status);
}
/* Function to exit on internal error. */
void
-ierror(const char *errmsg, ierror_sev_e sev)
-{
- WINDOW *errwin;
- char *label = _("INTERNAL ERROR");
- char *exitmsg = _("calcurse will now exit...");
- char *reportmsg = _("Please report the following bug:");
- const int winrow = 10;
- const int wincol = col - 2;
- const int msglen = wincol - 2;
- char msg[msglen];
-
- strncpy(msg, errmsg, msglen);
- errwin = newwin(winrow, wincol, (row - winrow) / 2, (col - wincol) / 2);
- custom_apply_attr(errwin, ATTR_HIGHEST);
- box(errwin, 0, 0);
- wins_show(errwin, label);
- if (sev == IERROR_FATAL)
- mvwprintw(errwin, 3, 1, reportmsg);
- mvwprintw(errwin, 5, (wincol - strlen(msg)) / 2, "%s", msg);
- if (sev == IERROR_FATAL)
- mvwprintw(errwin, winrow - 2, wincol - strlen(exitmsg) - 1, "%s",
- exitmsg);
- custom_remove_attr(errwin, ATTR_HIGHEST);
- wrefresh(errwin);
- wgetch(errwin);
- if (sev == IERROR_FATAL)
- exit_calcurse(EXIT_FAILURE);
+ierror (const char *errmsg, ierror_sev_e sev)
+{
+ WINDOW *errwin;
+ char *label = _("INTERNAL ERROR");
+ char *exitmsg = _("calcurse will now exit...");
+ char *reportmsg = _("Please report the following bug:");
+ const int winrow = 10;
+ const int wincol = col - 2;
+ const int msglen = wincol - 2;
+ char msg[msglen];
+
+ strncpy (msg, errmsg, msglen);
+ errwin = newwin (winrow, wincol, (row - winrow) / 2, (col - wincol) / 2);
+ custom_apply_attr (errwin, ATTR_HIGHEST);
+ box (errwin, 0, 0);
+ wins_show (errwin, label);
+ if (sev == IERROR_FATAL)
+ mvwprintw (errwin, 3, 1, reportmsg);
+ mvwprintw (errwin, 5, (wincol - strlen (msg)) / 2, "%s", msg);
+ if (sev == IERROR_FATAL)
+ mvwprintw (errwin, winrow - 2, wincol - strlen (exitmsg) - 1, "%s",
+ exitmsg);
+ custom_remove_attr (errwin, ATTR_HIGHEST);
+ wrefresh (errwin);
+ wgetch (errwin);
+ if (sev == IERROR_FATAL)
+ exit_calcurse (EXIT_FAILURE);
}
/* Function to handle an assertion failure. */
void
-aerror(const char *file, int line, const char *assertion)
+aerror (const char *file, int line, const char *assertion)
{
- char errmsg[BUFSIZ];
+ char errmsg[BUFSIZ];
- snprintf(errmsg, BUFSIZ,
- "assert \"%s\" failed: file \"%s\", line %d", assertion, file, line);
- ierror(errmsg, IERROR_FATAL);
+ snprintf (errmsg, BUFSIZ,
+ "assert \"%s\" failed: file \"%s\", line %d", assertion, file,
+ line);
+ ierror (errmsg, IERROR_FATAL);
}
/*
* Print a message in the status bar.
* Message texts for first line and second line are to be provided.
*/
-void
-status_mesg(char *mesg_line1, char *mesg_line2)
+void
+status_mesg (char *mesg_line1, char *mesg_line2)
{
- erase_status_bar();
- custom_apply_attr(win[STA].p, ATTR_HIGHEST);
- mvwprintw(win[STA].p, 0, 0, mesg_line1);
- mvwprintw(win[STA].p, 1, 0, mesg_line2);
- custom_remove_attr(win[STA].p, ATTR_HIGHEST);
+ erase_status_bar ();
+ custom_apply_attr (win[STA].p, ATTR_HIGHEST);
+ mvwprintw (win[STA].p, 0, 0, mesg_line1);
+ mvwprintw (win[STA].p, 1, 0, mesg_line2);
+ custom_remove_attr (win[STA].p, ATTR_HIGHEST);
}
/* Erase status bar. */
void
-erase_status_bar(void)
+erase_status_bar (void)
{
- erase_window_part(win[STA].p, 0, 0, col, STATUSHEIGHT);
+ erase_window_part (win[STA].p, 0, 0, col, STATUSHEIGHT);
}
/* Erase part of a window. */
-void
-erase_window_part(WINDOW *win, int first_col, int first_row, int last_col,
- int last_row)
+void
+erase_window_part (WINDOW *win, int first_col, int first_row, int last_col,
+ int last_row)
{
- int c, r;
+ int c, r;
- for (r = first_row; r <= last_row; r++){
- for (c = first_col; c <= last_col; c++){
- mvwprintw(win, r, c, " ");
- }
+ for (r = first_row; r <= last_row; r++)
+ {
+ for (c = first_col; c <= last_col; c++)
+ {
+ mvwprintw (win, r, c, " ");
}
- wnoutrefresh(win);
+ }
+ wnoutrefresh (win);
}
/* draws a popup window */
-WINDOW * popup(int pop_row, int pop_col,
- int pop_y, int pop_x, char *pop_lab)
-{
- char *txt_pop = _("Press any key to continue...");
- char label[BUFSIZ];
- WINDOW *popup_win;
-
- popup_win = newwin(pop_row, pop_col, pop_y, pop_x);
- keypad(popup_win, TRUE);
- custom_apply_attr(popup_win, ATTR_HIGHEST);
- box(popup_win, 0, 0);
- snprintf(label, BUFSIZ, "%s", pop_lab);
- wins_show(popup_win, label);
- mvwprintw(popup_win, pop_row - 2, pop_col - (strlen(txt_pop) + 1), "%s",
- txt_pop);
- custom_remove_attr(popup_win, ATTR_HIGHEST);
- wnoutrefresh(popup_win);
- doupdate();
- return popup_win;
+WINDOW *
+popup (int pop_row, int pop_col, int pop_y, int pop_x, char *pop_lab)
+{
+ char *txt_pop = _("Press any key to continue...");
+ char label[BUFSIZ];
+ WINDOW *popup_win;
+
+ popup_win = newwin (pop_row, pop_col, pop_y, pop_x);
+ keypad (popup_win, TRUE);
+ custom_apply_attr (popup_win, ATTR_HIGHEST);
+ box (popup_win, 0, 0);
+ snprintf (label, BUFSIZ, "%s", pop_lab);
+ wins_show (popup_win, label);
+ mvwprintw (popup_win, pop_row - 2, pop_col - (strlen (txt_pop) + 1), "%s",
+ txt_pop);
+ custom_remove_attr (popup_win, ATTR_HIGHEST);
+ wnoutrefresh (popup_win);
+ doupdate ();
+ return (popup_win);
}
/* prints in middle of a panel */
void
-print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
+print_in_middle (WINDOW *win, int starty, int startx, int width, char *string)
{
- int length, x, y;
- float temp;
+ int length, x, y;
+ float temp;
- if (win == NULL)
- win = stdscr;
- getyx(win, y, x);
- if (startx != 0)
- x = startx;
- if (starty != 0)
- y = starty;
- if (width == 0)
- width = 80;
+ if (win == NULL)
+ win = stdscr;
+ getyx (win, y, x);
+ if (startx != 0)
+ x = startx;
+ if (starty != 0)
+ y = starty;
+ if (width == 0)
+ width = 80;
- length = strlen(string);
- temp = (width - length) / 2;
- x = startx + (int) temp;
- custom_apply_attr(win, ATTR_HIGHEST);
- mvwprintw(win, y, x, "%s", string);
- custom_remove_attr(win, ATTR_HIGHEST);
+ length = strlen (string);
+ temp = (width - length) / 2;
+ x = startx + (int) temp;
+ custom_apply_attr (win, ATTR_HIGHEST);
+ mvwprintw (win, y, x, "%s", string);
+ custom_remove_attr (win, ATTR_HIGHEST);
}
/*
@@ -182,66 +185,72 @@ print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
* As echoing is not set, we need to know the string we are working on to
* handle display correctly.
*/
-static void
-showcursor(WINDOW *win, int y, int pos, char *str, int l, int offset)
+static void
+showcursor (WINDOW *win, int y, int pos, char *str, int l, int offset)
{
- char *nc;
+ char *nc;
- nc = str + pos;
- wmove(win, y, pos - offset);
- (pos >= l) ? waddch(win, SPC|A_REVERSE) : waddch(win, *nc|A_REVERSE);
+ nc = str + pos;
+ wmove (win, y, pos - offset);
+ (pos >= l) ? waddch (win, SPC | A_REVERSE) : waddch (win, *nc | A_REVERSE);
}
/* Print the string at the desired position. */
-static void
-showstring(WINDOW *win, int y, int x, char *str, int len, int pos)
-{
- const int rec = 30, border = 3;
- const int max_col = col - border, max_len = max_col - rec;
- int page, max_page, offset, c = 0;
- char *orig;
-
- orig = str;
- max_page = (len - rec) / max_len;
- page = (pos - rec) / max_len;
- offset = page * max_len;
- str += offset;
- mvwaddnstr(win, y, x, str, MIN(len, max_col));
- wclrtoeol(win);
- if (page > 0 && page < max_page) {
- c = '*';
- } else if (page > 0) {
- c = '<';
- } else if (page < max_page) {
- c = '>';
- } else
- c = 0;
- mvwprintw(win, y, col - 1, "%c", c);
- showcursor(win, y, pos, orig, len, offset);
+static void
+showstring (WINDOW *win, int y, int x, char *str, int len, int pos)
+{
+ const int rec = 30, border = 3;
+ const int max_col = col - border, max_len = max_col - rec;
+ int page, max_page, offset, c = 0;
+ char *orig;
+
+ orig = str;
+ max_page = (len - rec) / max_len;
+ page = (pos - rec) / max_len;
+ offset = page * max_len;
+ str += offset;
+ mvwaddnstr (win, y, x, str, MIN (len, max_col));
+ wclrtoeol (win);
+ if (page > 0 && page < max_page)
+ {
+ c = '*';
+ }
+ else if (page > 0)
+ {
+ c = '<';
+ }
+ else if (page < max_page)
+ {
+ c = '>';
+ }
+ else
+ c = 0;
+ mvwprintw (win, y, col - 1, "%c", c);
+ showcursor (win, y, pos, orig, len, offset);
}
/* Delete a character at the given position in string. */
-static void
-del_char(int pos, char *str)
+static void
+del_char (int pos, char *str)
{
- int len;
+ int len;
- str += pos;
- len = strlen(str) + 1;
- memmove(str, str + 1, len);
+ str += pos;
+ len = strlen (str) + 1;
+ memmove (str, str + 1, len);
}
/* Add a character at the given position in string. */
static char *
-add_char(int pos, int ch, char *str)
+add_char (int pos, int ch, char *str)
{
- int len;
+ int len;
- str += pos;
- len = strlen(str) + 1;
- memmove(str + 1, str, len);
- *str = ch;
- return (str += len);
+ str += pos;
+ len = strlen (str) + 1;
+ memmove (str + 1, str, len);
+ *str = ch;
+ return (str += len);
}
/*
@@ -252,135 +261,146 @@ add_char(int pos, int ch, char *str)
* environment, otherwise the cursor would move from place to place without
* control.
*/
-int
-getstring(WINDOW *win, char *str, int l, int x, int y)
-{
- int ch, newpos, len = 0;
- char *orig;
-
- orig = str;
- custom_apply_attr(win, ATTR_HIGHEST);
- for (; *str; ++str, ++len)
- ;
- newpos = x + len;
- showstring(win, y, x, orig, len, newpos);
-
- while ((ch = wgetch(win)) != '\n') {
-
- switch (ch) {
-
- case KEY_BACKSPACE: /* delete one character */
- case 330:
- case 127:
- case CTRL('H'):
- if (len > 0) {
- --newpos; --len;
- if (newpos >= x + len)
- --str;
- else /* to be deleted inside string */
- del_char(newpos, orig);
- }
- break;
-
- case CTRL('D'): /* delete next character */
- if (newpos != (x + len)) {
- --len;
- if (newpos >= x + len)
- --str;
- else
- del_char(newpos, orig);
- } else
- printf("\a");
- break;
-
- case CTRL('K'): /* delete to end-of-line */
- str = orig + newpos;
- *str = 0;
- len -= (len - newpos);
- break;
-
- case CTRL('A'): /* go to begginning of string */
- newpos = x;
- break;
-
- case CTRL('E'): /* go to end of string */
- newpos = x + len;
- break;
-
- case KEY_LEFT: /* move one char backward */
- case CTRL('B'):
- if (newpos > x)
- newpos--;
- break;
-
- case KEY_RIGHT: /* move one char forward */
- case CTRL('F'):
- if (newpos < len)
- newpos++;
- break;
-
- case ESCAPE: /* cancel editing */
- return (GETSTRING_ESC);
- break;
-
- default: /* insert one character */
- if (len < l - 1) {
- if (newpos >= len) {
- str = orig + newpos;
- *str++ = ch;
- }
- else // char is to be inserted inside string
- str = add_char(newpos, ch, orig);
- ++len; ++newpos;
- }
-
+int
+getstring (WINDOW *win, char *str, int l, int x, int y)
+{
+ int ch, newpos, len = 0;
+ char *orig;
+
+ orig = str;
+ custom_apply_attr (win, ATTR_HIGHEST);
+ for (; *str; ++str, ++len)
+ ;
+ newpos = x + len;
+ showstring (win, y, x, orig, len, newpos);
+
+ while ((ch = wgetch (win)) != '\n')
+ {
+ switch (ch)
+ {
+ case KEY_BACKSPACE: /* delete one character */
+ case 330:
+ case 127:
+ case CTRL ('H'):
+ if (len > 0)
+ {
+ --newpos;
+ --len;
+ if (newpos >= x + len)
+ --str;
+ else /* to be deleted inside string */
+ del_char (newpos, orig);
+ }
+ break;
+
+ case CTRL ('D'): /* delete next character */
+ if (newpos != (x + len))
+ {
+ --len;
+ if (newpos >= x + len)
+ --str;
+ else
+ del_char (newpos, orig);
+ }
+ else
+ printf ("\a");
+ break;
+
+ case CTRL ('K'): /* delete to end-of-line */
+ str = orig + newpos;
+ *str = 0;
+ len -= (len - newpos);
+ break;
+
+ case CTRL ('A'): /* go to begginning of string */
+ newpos = x;
+ break;
+
+ case CTRL ('E'): /* go to end of string */
+ newpos = x + len;
+ break;
+
+ case KEY_LEFT: /* move one char backward */
+ case CTRL ('B'):
+ if (newpos > x)
+ newpos--;
+ break;
+
+ case KEY_RIGHT: /* move one char forward */
+ case CTRL ('F'):
+ if (newpos < len)
+ newpos++;
+ break;
+
+ case ESCAPE: /* cancel editing */
+ return (GETSTRING_ESC);
+ break;
+
+ default: /* insert one character */
+ if (len < l - 1)
+ {
+ if (newpos >= len)
+ {
+ str = orig + newpos;
+ *str++ = ch;
}
- showstring(win, y, x, orig, len, newpos);
- doupdate();
+ else // char is to be inserted inside string
+ str = add_char (newpos, ch, orig);
+ ++len;
+ ++newpos;
+ }
+
}
- *str = 0;
- custom_remove_attr(win, ATTR_HIGHEST);
- return (len == 0 ? GETSTRING_RET : GETSTRING_VALID);
+ showstring (win, y, x, orig, len, newpos);
+ doupdate ();
+ }
+ *str = 0;
+ custom_remove_attr (win, ATTR_HIGHEST);
+ return (len == 0 ? GETSTRING_RET : GETSTRING_VALID);
}
/* Update an already existing string. */
-int
-updatestring(WINDOW *win, char **str, int x, int y)
-{
- char *newstr;
- int escape, len = strlen(*str) + 1;
-
- newstr = (char *) malloc(BUFSIZ);
- (void)memcpy(newstr, *str, len);
- escape = getstring(win, newstr, BUFSIZ, x, y);
- if (!escape) {
- len = strlen(newstr) + 1;
- if ((*str = (char *) realloc(*str, len)) == NULL) {
- /* NOTREACHED */
- ierror(_("FATAL ERROR in updatestring: out of memory"),
- IERROR_FATAL);
- } else
- (void)memcpy(*str, newstr, len);
- }
- free(newstr);
- return escape;
+int
+updatestring (WINDOW *win, char **str, int x, int y)
+{
+ char *newstr;
+ int escape, len = strlen (*str) + 1;
+
+ newstr = (char *) malloc (BUFSIZ);
+ (void) memcpy (newstr, *str, len);
+ escape = getstring (win, newstr, BUFSIZ, x, y);
+ if (!escape)
+ {
+ len = strlen (newstr) + 1;
+ if ((*str = (char *) realloc (*str, len)) == NULL)
+ {
+ /* NOTREACHED */
+ ierror (_("FATAL ERROR in updatestring: out of memory"),
+ IERROR_FATAL);
+ }
+ else
+ (void) memcpy (*str, newstr, len);
+ }
+ free (newstr);
+ return (escape);
}
/* checks if a string is only made of digits */
-int is_all_digit(char *string)
+int
+is_all_digit (char *string)
{
- int digit, i;
- int all_digit;
+ int digit, i;
+ int all_digit;
- digit = 0;
- all_digit = 0;
+ digit = 0;
+ all_digit = 0;
- for (i = 0; i <= strlen(string); i++)
- if (isdigit(string[i]) != 0)
- digit++;
- if (digit == strlen(string))
- all_digit = 1;
- return all_digit;
+ for (i = 0; i <= strlen (string); i++)
+ if (isdigit (string[i]) != 0)
+ digit++;
+ if (digit == strlen (string))
+ all_digit = 1;
+ return (all_digit);
}
/*
@@ -389,146 +409,148 @@ int is_all_digit(char *string)
* table, and update the NB_CAL_CMDS, NB_APP_CMDS or NB_TOD_CMDS defines in
* utils.h, depending on which panel the added keybind is assigned to.
*/
-void
-status_bar(void)
-{
- window_e which_pan;
- int cmd_length, space_between_cmds, start, end, i, j = 0;
- const int pos[NB_PANELS + 1] =
- {0, NB_CAL_CMDS, NB_CAL_CMDS + NB_APP_CMDS, TOTAL_CMDS};
-
- binding_t help = { " ?", _("Help") };
- binding_t quit = { " Q", _("Quit") };
- binding_t save = { " S", _("Save") };
- binding_t export = { " X", _("Export") };
- binding_t add = { " A", _("Add Item") };
- binding_t del = { " D", _("Del Item") };
- binding_t edit = { " E", _("Edit Itm") };
- binding_t flag = { " !", _("Flag Itm") };
- binding_t day = { "H/L", _("-+1 Day") };
- binding_t week = { "K/J", _("-+1 Week") };
- binding_t updn = { "K/J", _("Up/Down") };
- binding_t rept = { " R", _("Repeat") };
- binding_t prio = { "+/-", _("Priority") };
- binding_t tab = { "Tab", _("Chg View") };
- binding_t togo = { " G", _("Go to") };
- binding_t conf = { " C", _("Config") };
- binding_t view = { " V", _("View") };
- binding_t draw = { " ^R", _("Redraw") };
- binding_t appt = { " ^A", _("Add Appt") };
- binding_t todo = { " ^T", _("Add Todo") };
- binding_t enote = { " N", _("EditNote") };
- binding_t vnote = { " >", _("ViewNote") };
- binding_t eday = { "^HL", _("-+1 Day") };
- binding_t ewek = { "^KJ", _("-+1 Week") };
- binding_t othr = { " O", _("OtherCmd") };
-
- binding_t *binding[TOTAL_CMDS] = {
- /* calendar keys */
- &help, &quit, &save, &export, &day, &week, &tab, &togo, &appt,
- &todo, &conf, &othr, &eday, &ewek, &draw, &othr,
- /* appointment keys */
- &help, &quit, &save, &export, &add, &del, &edit, &view, &rept,
- &updn, &flag, &othr, &enote, &vnote, &appt, &todo, &eday, &ewek,
- &conf, &togo, &tab, &draw, &othr,
- /* todo keys */
- &help, &quit, &save, &export, &add, &del, &edit, &view, &prio,
- &updn, &tab, &othr, &enote, &vnote, &appt, &todo, &eday, &ewek,
- &conf, &togo, &draw, &othr
- };
-
- /* Total length of a command. */
- cmd_length = KEY_LENGTH + LABEL_LENGTH;
- space_between_cmds = floor(col / CMDS_PER_LINE - cmd_length);
- cmd_length += space_between_cmds;
-
- /* Drawing the keybinding with attribute and label without. */
- erase_status_bar();
- which_pan = wins_slctd();
- start = pos[which_pan] + 2 * CMDS_PER_LINE * (status_page - 1);
- end = MIN(start + 2 * CMDS_PER_LINE, pos[which_pan + 1]);
- for (i = start; i < end; i += 2) {
- custom_apply_attr(win[STA].p, ATTR_HIGHEST);
- mvwprintw(win[STA].p, 0, j * cmd_length, binding[i]->key);
- if (i + 1 != end)
- mvwprintw(win[STA].p, 1, j * cmd_length,
- binding[i+1]->key);
- custom_remove_attr(win[STA].p, ATTR_HIGHEST);
- mvwprintw(win[STA].p, 0 , j * cmd_length + KEY_LENGTH,
- binding[i]->label);
- if (i + 1 != end)
- mvwprintw(win[STA].p, 1, j * cmd_length + KEY_LENGTH,
- binding[i+1]->label);
- j++;
- }
- wnoutrefresh(win[STA].p);
-}
-
-long
-date2sec(date_t day, unsigned hour, unsigned min)
-{
- struct tm start, *lt;
- time_t tstart, t;
-
- t = time(NULL);
- lt = localtime(&t);
- start = *lt;
-
- start.tm_mon = day.mm;
- start.tm_mday = day.dd;
- start.tm_year = day.yyyy;
- start.tm_hour = hour;
- start.tm_min = min;
- start.tm_sec = 0;
- start.tm_isdst = -1;
- start.tm_year -= 1900;
- start.tm_mon--;
- tstart = mktime(&start);
- if (tstart == -1) {
- fputs(_("FATAL ERROR in date2sec: failure in mktime\n"),
- stderr);
- fprintf(stderr, "%u %u %u %u %u\n", day.yyyy, day.mm, day.dd,
- hour, min);
- exit(EXIT_FAILURE);
- }
+void
+status_bar (void)
+{
+ window_e which_pan;
+ int cmd_length, space_between_cmds, start, end, i, j = 0;
+ const int pos[NB_PANELS + 1] =
+ { 0, NB_CAL_CMDS, NB_CAL_CMDS + NB_APP_CMDS, TOTAL_CMDS };
+
+ binding_t help = { " ?", _("Help") };
+ binding_t quit = { " Q", _("Quit") };
+ binding_t save = { " S", _("Save") };
+ binding_t export = { " X", _("Export") };
+ binding_t add = { " A", _("Add Item") };
+ binding_t del = { " D", _("Del Item") };
+ binding_t edit = { " E", _("Edit Itm") };
+ binding_t flag = { " !", _("Flag Itm") };
+ binding_t day = { "H/L", _("-+1 Day") };
+ binding_t week = { "K/J", _("-+1 Week") };
+ binding_t updn = { "K/J", _("Up/Down") };
+ binding_t rept = { " R", _("Repeat") };
+ binding_t prio = { "+/-", _("Priority") };
+ binding_t tab = { "Tab", _("Chg View") };
+ binding_t togo = { " G", _("Go to") };
+ binding_t conf = { " C", _("Config") };
+ binding_t view = { " V", _("View") };
+ binding_t draw = { " ^R", _("Redraw") };
+ binding_t appt = { " ^A", _("Add Appt") };
+ binding_t todo = { " ^T", _("Add Todo") };
+ binding_t enote = { " N", _("EditNote") };
+ binding_t vnote = { " >", _("ViewNote") };
+ binding_t eday = { "^HL", _("-+1 Day") };
+ binding_t ewek = { "^KJ", _("-+1 Week") };
+ binding_t othr = { " O", _("OtherCmd") };
+
+ binding_t *binding[TOTAL_CMDS] = {
+ /* calendar keys */
+ &help, &quit, &save, &export, &day, &week, &tab, &togo, &appt,
+ &todo, &conf, &othr, &eday, &ewek, &draw, &othr,
+ /* appointment keys */
+ &help, &quit, &save, &export, &add, &del, &edit, &view, &rept,
+ &updn, &flag, &othr, &enote, &vnote, &appt, &todo, &eday, &ewek,
+ &conf, &togo, &tab, &draw, &othr,
+ /* todo keys */
+ &help, &quit, &save, &export, &add, &del, &edit, &view, &prio,
+ &updn, &tab, &othr, &enote, &vnote, &appt, &todo, &eday, &ewek,
+ &conf, &togo, &draw, &othr
+ };
+
+ /* Total length of a command. */
+ cmd_length = KEY_LENGTH + LABEL_LENGTH;
+ space_between_cmds = floor (col / CMDS_PER_LINE - cmd_length);
+ cmd_length += space_between_cmds;
+
+ /* Drawing the keybinding with attribute and label without. */
+ erase_status_bar ();
+ which_pan = wins_slctd ();
+ start = pos[which_pan] + 2 * CMDS_PER_LINE * (status_page - 1);
+ end = MIN (start + 2 * CMDS_PER_LINE, pos[which_pan + 1]);
+ for (i = start; i < end; i += 2)
+ {
+ custom_apply_attr (win[STA].p, ATTR_HIGHEST);
+ mvwprintw (win[STA].p, 0, j * cmd_length, binding[i]->key);
+ if (i + 1 != end)
+ mvwprintw (win[STA].p, 1, j * cmd_length, binding[i + 1]->key);
+ custom_remove_attr (win[STA].p, ATTR_HIGHEST);
+ mvwprintw (win[STA].p, 0, j * cmd_length + KEY_LENGTH,
+ binding[i]->label);
+ if (i + 1 != end)
+ mvwprintw (win[STA].p, 1, j * cmd_length + KEY_LENGTH,
+ binding[i + 1]->label);
+ j++;
+ }
+ wnoutrefresh (win[STA].p);
+}
- return (tstart);
+long
+date2sec (date_t day, unsigned hour, unsigned min)
+{
+ struct tm start, *lt;
+ time_t tstart, t;
+
+ t = time (NULL);
+ lt = localtime (&t);
+ start = *lt;
+
+ start.tm_mon = day.mm;
+ start.tm_mday = day.dd;
+ start.tm_year = day.yyyy;
+ start.tm_hour = hour;
+ start.tm_min = min;
+ start.tm_sec = 0;
+ start.tm_isdst = -1;
+ start.tm_year -= 1900;
+ start.tm_mon--;
+ tstart = mktime (&start);
+ if (tstart == -1)
+ {
+ fputs (_("FATAL ERROR in date2sec: failure in mktime\n"), stderr);
+ fprintf (stderr, "%u %u %u %u %u\n", day.yyyy, day.mm, day.dd,
+ hour, min);
+ exit (EXIT_FAILURE);
+ }
+
+ return (tstart);
}
/* Return a string containing the hour of a given date in seconds. */
-char *date_sec2hour_str(long sec)
+char *
+date_sec2hour_str (long sec)
{
- const int TIME_LEN = 6;
- struct tm *lt;
- time_t t;
- char *timestr;
-
- t = sec;
- lt = localtime(&t);
- timestr = (char *) malloc(TIME_LEN);
- snprintf(timestr, TIME_LEN, "%02u:%02u", lt->tm_hour, lt->tm_min);
- return timestr;
+ const int TIME_LEN = 6;
+ struct tm *lt;
+ time_t t;
+ char *timestr;
+
+ t = sec;
+ lt = localtime (&t);
+ timestr = (char *) malloc (TIME_LEN);
+ snprintf (timestr, TIME_LEN, "%02u:%02u", lt->tm_hour, lt->tm_min);
+ return (timestr);
}
/* Return a string containing the date, given a date in seconds. */
char *
-date_sec2date_str(long sec, char *datefmt)
-{
- struct tm *lt;
- time_t t;
- char *datestr;
-
- datestr = (char *)malloc(sizeof(char) * BUFSIZ);
-
- if (sec == 0)
- snprintf(datestr, BUFSIZ, "0");
- else {
- t = sec;
- lt = localtime(&t);
- strftime(datestr, BUFSIZ, datefmt, lt);
- }
+date_sec2date_str (long sec, char *datefmt)
+{
+ struct tm *lt;
+ time_t t;
+ char *datestr;
- return (datestr);
+ datestr = (char *) malloc (sizeof (char) * BUFSIZ);
+
+ if (sec == 0)
+ snprintf (datestr, BUFSIZ, "0");
+ else
+ {
+ t = sec;
+ lt = localtime (&t);
+ strftime (datestr, BUFSIZ, datefmt, lt);
+ }
+
+ return (datestr);
}
/*
@@ -537,16 +559,16 @@ date_sec2date_str(long sec, char *datefmt)
* (calcurse event equivalent).
*/
void
-date_sec2ical_date(long sec, char *ical_date)
+date_sec2ical_date (long sec, char *ical_date)
{
#define DATELENGTH 9
- struct tm *lt;
- time_t t;
+ struct tm *lt;
+ time_t t;
- t = sec;
- lt = localtime(&t);
- strftime(ical_date, DATELENGTH, "%Y%m%d", lt);
+ t = sec;
+ lt = localtime (&t);
+ strftime (ical_date, DATELENGTH, "%Y%m%d", lt);
}
/*
@@ -554,36 +576,36 @@ date_sec2ical_date(long sec, char *ical_date)
* seconds. This is used to build iCal VEVENT (calcurse appointment equivalent).
*/
void
-date_sec2ical_datetime(long sec, char *ical_datetime)
+date_sec2ical_datetime (long sec, char *ical_datetime)
{
#define DATETIMELENGTH 16
- struct tm *lt;
- time_t t;
+ struct tm *lt;
+ time_t t;
- t = sec;
- lt = localtime(&t);
- strftime(ical_datetime, DATETIMELENGTH, "%Y%m%dT%H%M%S", lt);
+ t = sec;
+ lt = localtime (&t);
+ strftime (ical_datetime, DATETIMELENGTH, "%Y%m%dT%H%M%S", lt);
}
/*
* Return a long containing the date which is updated taking into account
* the new time and date entered by the user.
*/
-long
-update_time_in_date(long date, unsigned hr, unsigned mn)
+long
+update_time_in_date (long date, unsigned hr, unsigned mn)
{
- struct tm *lt;
- time_t t, new_date;
+ struct tm *lt;
+ time_t t, new_date;
- t = date;
- lt = localtime(&t);
- lt->tm_hour = hr;
- lt->tm_min = mn;
- new_date = mktime(lt);
- ASSERT(new_date != -1);
+ t = date;
+ lt = localtime (&t);
+ lt->tm_hour = hr;
+ lt->tm_min = mn;
+ new_date = mktime (lt);
+ ASSERT (new_date != -1);
- return (new_date);
+ return (new_date);
}
/*
@@ -591,33 +613,34 @@ update_time_in_date(long date, unsigned hr, unsigned mn)
* If no date is entered, current date is chosen.
*/
long
-get_sec_date(date_t date)
-{
- struct tm *ptrtime;
- time_t timer;
- long long_date;
- char current_day[] = "dd ";
- char current_month[] = "mm ";
- char current_year[] = "yyyy ";
-
- if (date.yyyy == 0 && date.mm == 0 && date.dd == 0) {
- timer = time(NULL);
- ptrtime = localtime(&timer);
- strftime(current_day, strlen(current_day), "%d", ptrtime);
- strftime(current_month, strlen(current_month), "%m", ptrtime);
- strftime(current_year, strlen(current_year), "%Y", ptrtime);
- date.mm = atoi(current_month);
- date.dd = atoi(current_day);
- date.yyyy = atoi(current_year);
- }
- long_date = date2sec(date, 0, 0);
- return long_date;
+get_sec_date (date_t date)
+{
+ struct tm *ptrtime;
+ time_t timer;
+ long long_date;
+ char current_day[] = "dd ";
+ char current_month[] = "mm ";
+ char current_year[] = "yyyy ";
+
+ if (date.yyyy == 0 && date.mm == 0 && date.dd == 0)
+ {
+ timer = time (NULL);
+ ptrtime = localtime (&timer);
+ strftime (current_day, strlen (current_day), "%d", ptrtime);
+ strftime (current_month, strlen (current_month), "%m", ptrtime);
+ strftime (current_year, strlen (current_year), "%Y", ptrtime);
+ date.mm = atoi (current_month);
+ date.dd = atoi (current_day);
+ date.yyyy = atoi (current_year);
+ }
+ long_date = date2sec (date, 0, 0);
+ return (long_date);
}
-long
-min2sec(unsigned minutes)
+long
+min2sec (unsigned minutes)
{
- return (minutes * MININSEC);
+ return (minutes * MININSEC);
}
/*
@@ -628,62 +651,59 @@ min2sec(unsigned minutes)
* [h:mm] or [hh:mm] format, and 2 if the entered time is correct and entered
* in [mm] format.
*/
-int
-check_time(char *string)
-{
- int ok = 0;
- char hour[] = " ";
- char minutes[] = " ";
-
- if (((strlen(string) == 2) || (strlen(string) == 3)) &&
- (isdigit(string[0]) != 0) && (isdigit(string[1]) != 0)) {
-
- strncpy(minutes, string, 2);
- if (atoi(minutes) >= 0)
-
- ok = 2; /* [MM] format */
-
- } else if ((strlen(string) == 4) && (isdigit(string[0]) != 0) &&
- (isdigit(string[2]) != 0) && (isdigit(string[3]) != 0) &&
- (string[1] == ':')) {
-
- strncpy(hour, string, 1);
- strncpy(minutes, string + 2, 2);
- if ((atoi(hour) <= 24) && (atoi(hour) >= 0) &&
- (atoi(minutes) < MININSEC) && (atoi(minutes) >= 0))
-
- ok = 1; /* [H:MM] format */
-
- } else if ((strlen(string) == 5) && (isdigit(string[0]) != 0) &&
- (isdigit(string[1]) != 0) && (isdigit(string[3]) != 0) &&
- (isdigit(string[4]) != 0) && (string[2] == ':')) {
-
- strncpy(hour, string, 2);
- strncpy(minutes, string + 3, 2);
- if ((atoi(hour) <= 24) && (atoi(hour) >= 0) &&
- (atoi(minutes) < MININSEC) && (atoi(minutes) >= 0))
-
- ok = 1; /* [HH:MM] format */
- }
-
- return (ok);
+int
+check_time (char *string)
+{
+ int ok = 0;
+ char hour[] = " ";
+ char minutes[] = " ";
+
+ if (((strlen (string) == 2) || (strlen (string) == 3))
+ && (isdigit (string[0]) != 0) && (isdigit (string[1]) != 0))
+ {
+ strncpy (minutes, string, 2);
+ if (atoi (minutes) >= 0)
+ ok = 2; /* [MM] format */
+ }
+ else if ((strlen (string) == 4) && (isdigit (string[0]) != 0)
+ && (isdigit (string[2]) != 0) && (isdigit (string[3]) != 0)
+ && (string[1] == ':'))
+ {
+ strncpy (hour, string, 1);
+ strncpy (minutes, string + 2, 2);
+ if ((atoi (hour) <= 24) && (atoi (hour) >= 0)
+ && (atoi (minutes) < MININSEC) && (atoi (minutes) >= 0))
+ ok = 1; /* [H:MM] format */
+ }
+ else if ((strlen (string) == 5) && (isdigit (string[0]) != 0)
+ && (isdigit (string[1]) != 0) && (isdigit (string[3]) != 0)
+ && (isdigit (string[4]) != 0) && (string[2] == ':'))
+ {
+ strncpy (hour, string, 2);
+ strncpy (minutes, string + 3, 2);
+ if ((atoi (hour) <= 24) && (atoi (hour) >= 0)
+ && (atoi (minutes) < MININSEC) && (atoi (minutes) >= 0))
+ ok = 1; /* [HH:MM] format */
+ }
+ return (ok);
}
/*
* Display a scroll bar when there are so many items that they
* can not be displayed inside the corresponding panel.
*/
-void draw_scrollbar(WINDOW *win, int y, int x, int length,
+void
+draw_scrollbar (WINDOW *win, int y, int x, int length,
int bar_top, int bar_bottom, bool hilt)
{
- mvwvline(win, bar_top, x, ACS_VLINE, bar_bottom - bar_top);
- if (hilt)
- custom_apply_attr(win, ATTR_HIGHEST);
- wattron(win, A_REVERSE);
- mvwvline(win, y, x, ' ', length);
- wattroff(win, A_REVERSE);
- if (hilt)
- custom_remove_attr(win, ATTR_HIGHEST);
+ mvwvline (win, bar_top, x, ACS_VLINE, bar_bottom - bar_top);
+ if (hilt)
+ custom_apply_attr (win, ATTR_HIGHEST);
+ wattron (win, A_REVERSE);
+ mvwvline (win, y, x, ' ', length);
+ wattroff (win, A_REVERSE);
+ if (hilt)
+ custom_remove_attr (win, ATTR_HIGHEST);
}
/*
@@ -691,144 +711,158 @@ void draw_scrollbar(WINDOW *win, int y, int x, int length,
* popup window. This is useful if an item description is too
* long to fit in its corresponding panel window.
*/
-void item_in_popup(char *saved_a_start, char *saved_a_end, char *msg,
- char *pop_title)
-{
- WINDOW *popup_win, *pad;
- const int margin_left = 4, margin_top = 4;
- const int winl = row - 5, winw = col - margin_left;
- const int padl = winl - 2, padw = winw - margin_left;
-
- pad = newpad(padl, padw);
- popup_win = popup(winl, winw, 1, 2, pop_title);
- if (strncmp(pop_title, _("Appointment"), 11) == 0) {
- mvwprintw(popup_win, margin_top, margin_left, "- %s -> %s",
- saved_a_start, saved_a_end);
- }
- mvwprintw(pad, 0, margin_left, "%s", msg);
- wmove(win[STA].p, 0, 0);
- pnoutrefresh(pad, 0, 0, margin_top + 2, margin_left, padl, winw);
- doupdate();
- wgetch(popup_win);
- delwin(pad);
- delwin(popup_win);
+void
+item_in_popup (char *saved_a_start, char *saved_a_end, char *msg,
+ char *pop_title)
+{
+ WINDOW *popup_win, *pad;
+ const int margin_left = 4, margin_top = 4;
+ const int winl = row - 5, winw = col - margin_left;
+ const int padl = winl - 2, padw = winw - margin_left;
+
+ pad = newpad (padl, padw);
+ popup_win = popup (winl, winw, 1, 2, pop_title);
+ if (strncmp (pop_title, _("Appointment"), 11) == 0)
+ {
+ mvwprintw (popup_win, margin_top, margin_left, "- %s -> %s",
+ saved_a_start, saved_a_end);
+ }
+ mvwprintw (pad, 0, margin_left, "%s", msg);
+ wmove (win[STA].p, 0, 0);
+ pnoutrefresh (pad, 0, 0, margin_top + 2, margin_left, padl, winw);
+ doupdate ();
+ wgetch (popup_win);
+ delwin (pad);
+ delwin (popup_win);
}
/* Reset the status bar page. */
-void reset_status_page(void)
+void
+reset_status_page (void)
{
- status_page = 1;
+ status_page = 1;
}
/* Update the status bar page number to display other commands. */
-void other_status_page(int panel)
-{
- int nb_item = 0, max_page;
- char *error = _("FATAL ERROR in other_status_page: unknown panel\n");
-
- switch (panel) {
- case CAL:
- nb_item = NB_CAL_CMDS;
- break;
- case APP:
- nb_item = NB_APP_CMDS;
- break;
- case TOD:
- nb_item = NB_TOD_CMDS;
- break;
- default:
- ierror(error, IERROR_FATAL);
- }
- max_page = ceil( nb_item / (2*CMDS_PER_LINE) ) + 1;
- if (status_page < max_page) {
- status_page++;
- } else {
- status_page = 1;
- }
+void
+other_status_page (int panel)
+{
+ int nb_item = 0, max_page;
+ char *error = _("FATAL ERROR in other_status_page: unknown panel\n");
+
+ switch (panel)
+ {
+ case CAL:
+ nb_item = NB_CAL_CMDS;
+ break;
+ case APP:
+ nb_item = NB_APP_CMDS;
+ break;
+ case TOD:
+ nb_item = NB_TOD_CMDS;
+ break;
+ default:
+ ierror (error, IERROR_FATAL);
+ }
+ max_page = ceil (nb_item / (2 * CMDS_PER_LINE)) + 1;
+ if (status_page < max_page)
+ {
+ status_page++;
+ }
+ else
+ {
+ status_page = 1;
+ }
}
/* Returns the beginning of current day in seconds from 1900. */
-long
-get_today(void)
+long
+get_today (void)
{
- struct tm *lt;
- time_t current_time;
- long current_day;
- date_t day;
+ struct tm *lt;
+ time_t current_time;
+ long current_day;
+ date_t day;
- current_time = time(NULL);
- lt = localtime(&current_time);
- day.mm = lt->tm_mon + 1;
- day.dd = lt->tm_mday;
- day.yyyy = lt->tm_year + 1900;
- current_day = date2sec(day, 0, 0);
+ current_time = time (NULL);
+ lt = localtime (&current_time);
+ day.mm = lt->tm_mon + 1;
+ day.dd = lt->tm_mday;
+ day.yyyy = lt->tm_year + 1900;
+ current_day = date2sec (day, 0, 0);
- return current_day;
+ return (current_day);
}
/* Returns the current time in seconds. */
-long now(void)
+long
+now (void)
{
- time_t current_time;
+ time_t current_time;
- current_time = time(NULL);
- return current_time;
+ current_time = time (NULL);
+ return (current_time);
}
/* Copy a string */
-char *mycpy(const char *src)
+char *
+mycpy (const char *src)
{
- char *string = malloc(strlen(src) + 1);
-
- if (string != NULL)
- return strncpy(string, src, strlen(src) + 1);
- else
- return NULL;
+ char *string = malloc (strlen (src) + 1);
+
+ if (string != NULL)
+ return (strncpy (string, src, strlen (src) + 1));
+ else
+ return (NULL);
}
long
-mystrtol(const char *str)
+mystrtol (const char *str)
{
- char *ep;
- long lval;
- const char *not_a_number =
- _("FATAL ERROR in mystrtol: could not convert string");
- const char *out_of_range =
- _("FATAL ERROR in mystrtol: number is out of range");
+ char *ep;
+ long lval;
+ const char *not_a_number =
+ _("FATAL ERROR in mystrtol: could not convert string");
+ const char *out_of_range =
+ _("FATAL ERROR in mystrtol: number is out of range");
- errno = 0;
- lval = strtol(str, &ep, 10);
- if (str[0] == '\0' || *ep != '\0')
- ierror(not_a_number, IERROR_FATAL);
- if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN))
- ierror(out_of_range, IERROR_FATAL);
+ errno = 0;
+ lval = strtol (str, &ep, 10);
+ if (str[0] == '\0' || *ep != '\0')
+ ierror (not_a_number, IERROR_FATAL);
+ if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN))
+ ierror (out_of_range, IERROR_FATAL);
- return (lval);
+ return (lval);
}
/* Print the given option value with appropriate color. */
-void
-print_option_incolor(WINDOW *win, bool option, int pos_y, int pos_x)
-{
- int color = 0;
- char option_value[BUFSIZ] = "";
-
- if (option == true) {
- color = ATTR_TRUE;
- strncpy(option_value, _("yes"), BUFSIZ);
- } else if (option == false) {
- color = ATTR_FALSE;
- strncpy(option_value, _("no"), BUFSIZ);
- } else {
- ierror(
- _("option not defined - Problem in print_option_incolor()"),
- IERROR_FATAL);
- }
- custom_apply_attr(win, color);
- mvwprintw(win, pos_y, pos_x, "%s", option_value);
- custom_remove_attr(win, color);
- wnoutrefresh(win);
- doupdate();
+void
+print_option_incolor (WINDOW *win, bool option, int pos_y, int pos_x)
+{
+ int color = 0;
+ char option_value[BUFSIZ] = "";
+
+ if (option == true)
+ {
+ color = ATTR_TRUE;
+ strncpy (option_value, _("yes"), BUFSIZ);
+ }
+ else if (option == false)
+ {
+ color = ATTR_FALSE;
+ strncpy (option_value, _("no"), BUFSIZ);
+ }
+ else
+ {
+ ierror (_("option not defined - Problem in print_option_incolor()"),
+ IERROR_FATAL);
+ }
+ custom_apply_attr (win, color);
+ mvwprintw (win, pos_y, pos_x, "%s", option_value);
+ custom_remove_attr (win, color);
+ wnoutrefresh (win);
+ doupdate ();
}
/*
@@ -836,94 +870,98 @@ print_option_incolor(WINDOW *win, bool option, int pos_y, int pos_x)
* the random part of the file name.
*/
char *
-new_tempfile(const char *prefix, int trailing_len)
-{
- char fullname[BUFSIZ];
- int prefix_len, fd;
- FILE *file;
-
- if (prefix == NULL)
- return (NULL);
-
- prefix_len = strlen(prefix);
- if (prefix_len + trailing_len >= BUFSIZ)
- return (NULL);
- memcpy(fullname, prefix, prefix_len);
- memset(fullname + prefix_len, 'X', trailing_len);
- fullname[prefix_len + trailing_len] = '\0';
- if ((fd = mkstemp(fullname)) == -1 ||
- (file = fdopen(fd, "w+")) == NULL) {
- if (fd != -1) {
- unlink(fullname);
- close(fd);
- }
- ierror(
- _("FATAL ERROR: temporary file could not be created!"),
- IERROR_WARN);
- return (NULL);
+new_tempfile (const char *prefix, int trailing_len)
+{
+ char fullname[BUFSIZ];
+ int prefix_len, fd;
+ FILE *file;
+
+ if (prefix == NULL)
+ return (NULL);
+
+ prefix_len = strlen (prefix);
+ if (prefix_len + trailing_len >= BUFSIZ)
+ return (NULL);
+ memcpy (fullname, prefix, prefix_len);
+ memset (fullname + prefix_len, 'X', trailing_len);
+ fullname[prefix_len + trailing_len] = '\0';
+ if ((fd = mkstemp (fullname)) == -1 || (file = fdopen (fd, "w+")) == NULL)
+ {
+ if (fd != -1)
+ {
+ unlink (fullname);
+ close (fd);
}
- fclose(file);
+ ierror (_("FATAL ERROR: temporary file could not be created!"),
+ IERROR_WARN);
+ return (NULL);
+ }
+ fclose (file);
- return (strdup(fullname + prefix_len));
+ return (strdup (fullname + prefix_len));
}
/* Erase a note previously attached to a todo, event or appointment. */
void
-erase_note(char **note, erase_flag_e flag)
+erase_note (char **note, erase_flag_e flag)
{
- char fullname[BUFSIZ];
- char *errmsg = _("FATAL ERROR in erase_note: could not remove note\n");
+ char fullname[BUFSIZ];
+ char *errmsg = _("FATAL ERROR in erase_note: could not remove note\n");
- if (*note == NULL)
- return;
- if (flag != ERASE_FORCE_KEEP_NOTE) {
- snprintf(fullname, BUFSIZ, "%s%s", path_notes, *note);
- if (unlink(fullname) != 0)
- ierror(errmsg, IERROR_FATAL);
- }
- free(*note);
- *note = NULL;
+ if (*note == NULL)
+ return;
+ if (flag != ERASE_FORCE_KEEP_NOTE)
+ {
+ snprintf (fullname, BUFSIZ, "%s%s", path_notes, *note);
+ if (unlink (fullname) != 0)
+ ierror (errmsg, IERROR_FATAL);
+ }
+ free (*note);
+ *note = NULL;
}
+
/*
* Convert a string containing a date into three integers containing the year,
* month and day.
* Returns 1 if sucessfully converted or 0 if the string is an invalid date.
*/
-int parse_date(char *date_string, int datefmt,
- int *year, int *month, int *day) {
- int in1, in2, in3;
- int lyear, lmonth, lday;
- if (date_string == NULL)
- return 0;
- if (sscanf(date_string, "%d / %d / %d", &in1, &in2, &in3) < 3 )
- return 0;
- switch (datefmt) {
- case 1:
- lmonth = in1;
- lday = in2;
- lyear = in3;
- break;
- case 2:
- lday = in1;
- lmonth = in2;
- lyear = in3;
- break;
- case 3:
- lyear = in1;
- lmonth = in2;
- lday = in3;
- break;
- default:
- return (0);
- }
- if (lyear < 1 || lyear > 9999 || lmonth < 1 || lmonth > 12 ||
- lday < 1 || lday > 31)
- return 0;
- if (year != NULL)
- *year = lyear;
- if (month != NULL)
- *month = lmonth;
- if (day != NULL)
- *day = lday;
- return (1);
+int
+parse_date (char *date_string, int datefmt, int *year, int *month, int *day)
+{
+ int in1, in2, in3;
+ int lyear, lmonth, lday;
+ if (date_string == NULL)
+ return (0);
+ if (sscanf (date_string, "%d / %d / %d", &in1, &in2, &in3) < 3)
+ return (0);
+ switch (datefmt)
+ {
+ case 1:
+ lmonth = in1;
+ lday = in2;
+ lyear = in3;
+ break;
+ case 2:
+ lday = in1;
+ lmonth = in2;
+ lyear = in3;
+ break;
+ case 3:
+ lyear = in1;
+ lmonth = in2;
+ lday = in3;
+ break;
+ default:
+ return (0);
+ }
+ if (lyear < 1 || lyear > 9999 || lmonth < 1 || lmonth > 12 || lday < 1
+ || lday > 31)
+ return (0);
+ if (year != NULL)
+ *year = lyear;
+ if (month != NULL)
+ *month = lmonth;
+ if (day != NULL)
+ *day = lday;
+ return (1);
}