From ac4020a18f148489590f6adc260d6a2aaaca9c24 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Mon, 9 Feb 2004 21:46:24 +0000 Subject: [PATCH] Implemented 'type = date' SVN revision: 751 --- doc/ChangeLog | 3 + src/elogd.c | 724 +++++++++++++++++++++++++++++++------------------- 2 files changed, 448 insertions(+), 279 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 3a4da6a6..634df6e6 100755 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -7,6 +7,9 @@ Version 2.5.1, released February xxth, 2004 - Implemented calendar - Added entry counter - Added form validation via JavaScript +- Changed "entry date" to "entry time" +- Changed "Date format" to "Time format" +- Implemented "Type = date" Version 2.5.0, released January 28th, 2004 ========================================== diff --git a/src/elogd.c b/src/elogd.c index 0dcea720..b3cc3957 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.241 2004/02/09 21:46:24 midas + Implemented 'type = date' + Revision 1.240 2004/02/06 14:34:11 midas Sorting now also works for logbooks @@ -401,7 +404,8 @@ typedef int INT; #define NAME_LENGTH 500 -#define DEFAULT_DATE_FORMAT "%#c" +#define DEFAULT_TIME_FORMAT "%#c" +#define DEFAULT_DATE_FORMAT "%#x" #define SUCCESS 1 @@ -497,6 +501,7 @@ char author_list[MAX_N_LIST][NAME_LENGTH] = { #define AF_ICON (1<<5) #define AF_RADIO (1<<6) #define AF_EXTENDABLE (1<<7) +#define AF_DATE (1<<8) /* attribute format flags */ #define AFF_SAME_LINE 1 @@ -616,7 +621,7 @@ void show_bottom_text(LOGBOOK * lbs); /*---- Funcions from the MIDAS library -----------------------------*/ -BOOL equal_ustring(const char *str1, const char *str2) +BOOL strieq(const char *str1, const char *str2) { if (str1 == NULL && str2 != NULL) return FALSE; @@ -1818,7 +1823,7 @@ int is_logbook(char *logbook) strlcpy(str, logbook, sizeof(str)); str[6] = 0; - return !equal_ustring(str, "global"); + return !strieq(str, "global"); } /*-------------------------------------------------------------------*/ @@ -1859,7 +1864,7 @@ int getcfg_simple(char *group, char *param, char *value) while (*p && *p != ']' && *p != '\n') *pstr++ = *p++; *pstr = 0; - if (equal_ustring(str, group)) { + if (strieq(str, group)) { /* search parameter */ p = strchr(p, '\n'); if (p) @@ -1872,7 +1877,7 @@ int getcfg_simple(char *group, char *param, char *value) while (pstr > str && (*pstr == ' ' || *pstr == '=' || *pstr == '\t')) *pstr-- = 0; - if (equal_ustring(str, param)) { + if (strieq(str, param)) { if (*p == '=') { p++; while (*p == ' ' || *p == '\t') @@ -1935,7 +1940,7 @@ int getcfg(char *group, char *param, char *value) int status; /* if group is [global] and top group exists, read from there */ - if (equal_ustring(group, "global") && getcfg_topgroup()) { + if (strieq(group, "global") && getcfg_topgroup()) { sprintf(str, "global %s", getcfg_topgroup()); if (getcfg(str, param, value)) return 1; @@ -1968,7 +1973,7 @@ char *find_param(char *buf, char *group, char *param) while (*p && *p != ']' && *p != '\n') *pstr++ = *p++; *pstr = 0; - if (equal_ustring(str, group)) { + if (strieq(str, group)) { /* search parameter */ p = strchr(p, '\n'); if (p) @@ -1982,7 +1987,7 @@ char *find_param(char *buf, char *group, char *param) while (pstr > str && (*pstr == ' ' || *pstr == '=' || *pstr == '\t')) *pstr-- = 0; - if (equal_ustring(str, param)) { + if (strieq(str, param)) { free(str); return pstart; } @@ -2022,7 +2027,7 @@ int is_group(char *group) while (*p && *p != ']' && *p != '\n') *pstr++ = *p++; *pstr = 0; - if (equal_ustring(str, group)) { + if (strieq(str, group)) { free(str); return 1; } @@ -2080,7 +2085,7 @@ int enumcfg(char *group, char *param, char *value, int index) while (*p && *p != ']' && *p != '\n' && *p != '\r') *pstr++ = *p++; *pstr = 0; - if (equal_ustring(str, group)) { + if (strieq(str, group)) { /* enumerate parameters */ i = 0; p = strchr(p, '\n'); @@ -2182,7 +2187,7 @@ int exist_top_group() if (!enumcfg("global", str, NULL, i)) break; str[9] = 0; - if (equal_ustring(str, "top group")) + if (strieq(str, "top group")) return 1; } @@ -2226,7 +2231,7 @@ int check_language() } } - if (equal_ustring(language, "english") || language[0] == 0) { + if (strieq(language, "english") || language[0] == 0) { if (_locbuffer) { free(_locbuffer); _locbuffer = NULL; @@ -2447,12 +2452,12 @@ void el_enum_attr(char *message, int n, char *attr_name, char *attr_value) strcpy(tmp, str); *strchr(tmp, ':') = 0; - if (equal_ustring(tmp, "$@MID@$") || - equal_ustring(tmp, "Date") || - equal_ustring(tmp, "Attachment") || - equal_ustring(tmp, "Reply To") || - equal_ustring(tmp, "In Reply To") || - equal_ustring(tmp, "Encoding") || equal_ustring(tmp, "Locked by")) + if (strieq(tmp, "$@MID@$") || + strieq(tmp, "Date") || + strieq(tmp, "Attachment") || + strieq(tmp, "Reply To") || + strieq(tmp, "In Reply To") || + strieq(tmp, "Encoding") || strieq(tmp, "Locked by")) i--; } } @@ -2621,10 +2626,10 @@ int el_build_index(LOGBOOK * lbs, BOOL rebuild) /* check if this logbook has same data dir as previous */ for (i = 0; lb_list[i].name[0] && &lb_list[i] != lbs; i++) - if (equal_ustring(lb_list[i].data_dir, lbs->data_dir)) + if (strieq(lb_list[i].data_dir, lbs->data_dir)) break; - if (equal_ustring(lb_list[i].data_dir, lbs->data_dir) + if (strieq(lb_list[i].data_dir, lbs->data_dir) && &lb_list[i] != lbs) { if (verbose) printf("\n Same index as logbook %s\n", lb_list[i].name); @@ -2825,7 +2830,7 @@ int el_index_logbooks(BOOL reinit) /* check for duplicate name */ for (j = 0; j < i; j++) - if (equal_ustring(lb_list[j].name, logbook)) { + if (strieq(lb_list[j].name, logbook)) { printf("Error in configuration file: Duplicate logbook \"%s\"\n", logbook); return EL_DUPLICATE; } @@ -3490,11 +3495,11 @@ int el_submit(LOGBOOK * lbs, int message_id, BOOL bedit, message[size] = 0; - if (equal_ustring(date, "")) + if (strieq(date, "")) el_decode(message, "Date: ", date); - if (equal_ustring(reply_to, "")) + if (strieq(reply_to, "")) el_decode(message, "Reply to: ", reply_to); - if (equal_ustring(in_reply_to, "")) + if (strieq(in_reply_to, "")) el_decode(message, "In reply to: ", in_reply_to); el_decode(message, "Attachment: ", attachment_all); @@ -3639,7 +3644,7 @@ int el_submit(LOGBOOK * lbs, int message_id, BOOL bedit, for (j = i + 1; j < *lbs->n_el_index - && equal_ustring(lbs->el_index[i].file_name, lbs->el_index[j].file_name); + && strieq(lbs->el_index[i].file_name, lbs->el_index[j].file_name); j++) lbs->el_index[j].offset += delta; } @@ -3895,7 +3900,7 @@ INT el_delete_message(LOGBOOK * lbs, int message_id, /* correct all offsets after deleted message */ for (i = 0; i < *lbs->n_el_index; i++) - if (equal_ustring(lbs->el_index[i].file_name, str) && + if (strieq(lbs->el_index[i].file_name, str) && lbs->el_index[i].offset > old_offset) lbs->el_index[i].offset -= size; @@ -4373,7 +4378,7 @@ int setparam(char *param, char *value) int i; char str[10000]; - if (equal_ustring(param, "text")) { + if (strieq(param, "text")) { if (strlen(value) >= TEXT_SIZE) { sprintf(str, "Error: Entry text too big (%d bytes). Please increase TEXT_SIZE and recompile elogd\n", @@ -4386,7 +4391,7 @@ int setparam(char *param, char *value) return 1; } - if (equal_ustring(param, "cmdline")) { + if (strieq(param, "cmdline")) { if (strlen(value) >= CMD_SIZE) { sprintf(str, "Error: Command line too big (%d bytes). Please increase CMD_SIZE and recompile elogd\n", @@ -4401,7 +4406,7 @@ int setparam(char *param, char *value) /* paremeters can be superseeded */ for (i = 0; i < MAX_PARAM; i++) - if (_param[i][0] == 0 || equal_ustring(param, _param[i])) + if (_param[i][0] == 0 || strieq(param, _param[i])) break; if (i < MAX_PARAM) { @@ -4433,14 +4438,14 @@ char *getparam(char *param) { int i; - if (equal_ustring(param, "text")) + if (strieq(param, "text")) return _mtext; - if (equal_ustring(param, "cmdline")) + if (strieq(param, "cmdline")) return _cmdline; for (i = 0; i < MAX_PARAM && _param[i][0]; i++) - if (equal_ustring(param, _param[i])) + if (strieq(param, _param[i])) break; if (i < MAX_PARAM) @@ -4470,7 +4475,7 @@ BOOL isparam(char *param) int i; for (i = 0; i < MAX_PARAM && _param[i][0]; i++) - if (equal_ustring(param, _param[i])) + if (strieq(param, _param[i])) break; if (i < MAX_PARAM && _param[i][0]) @@ -4484,7 +4489,7 @@ void unsetparam(char *param) int i; for (i = 0; i < MAX_PARAM; i++) - if (equal_ustring(param, _param[i])) + if (strieq(param, _param[i])) break; if (i < MAX_PARAM) { @@ -4730,7 +4735,7 @@ int scan_attributes(char *logbook, char *condition) /* scan configuration file for attributes and fill attr_list, attr_options and attr_flags arrays */ { - char list[10000], str[NAME_LENGTH], tmp_list[MAX_N_ATTR][NAME_LENGTH]; + char list[10000], str[NAME_LENGTH], type[NAME_LENGTH], tmp_list[MAX_N_ATTR][NAME_LENGTH]; int i, j, n, m; if (getcfg_cond(logbook, condition, "Attributes", list)) { @@ -4772,7 +4777,7 @@ and attr_flags arrays */ m = strbreak(list, tmp_list, MAX_N_ATTR); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) - if (equal_ustring(attr_list[j], tmp_list[i])) + if (strieq(attr_list[j], tmp_list[i])) attr_flags[j] |= AF_REQUIRED; } @@ -4781,7 +4786,7 @@ and attr_flags arrays */ m = strbreak(list, tmp_list, MAX_N_ATTR); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) - if (equal_ustring(attr_list[j], tmp_list[i])) + if (strieq(attr_list[j], tmp_list[i])) attr_flags[j] |= AF_LOCKED; } @@ -4790,7 +4795,7 @@ and attr_flags arrays */ m = strbreak(list, tmp_list, MAX_N_ATTR); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) - if (equal_ustring(attr_list[j], tmp_list[i])) + if (strieq(attr_list[j], tmp_list[i])) attr_flags[j] |= AF_FIXED_EDIT; } @@ -4799,7 +4804,7 @@ and attr_flags arrays */ m = strbreak(list, tmp_list, MAX_N_ATTR); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) - if (equal_ustring(attr_list[j], tmp_list[i])) + if (strieq(attr_list[j], tmp_list[i])) attr_flags[j] |= AF_FIXED_REPLY; } @@ -4808,8 +4813,17 @@ and attr_flags arrays */ m = strbreak(list, tmp_list, MAX_N_ATTR); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) - if (equal_ustring(attr_list[j], tmp_list[i])) + if (strieq(attr_list[j], tmp_list[i])) attr_flags[j] |= AF_EXTENDABLE; + + } + + for (i = 0; i < n; i++) { + sprintf(str, "Type %s", attr_list[i]); + if (getcfg_cond(logbook, condition, str, type)) { + if (strieq(type, "date")) + attr_flags[i] |= AF_DATE; + } } } else { @@ -4984,10 +4998,10 @@ LBLIST get_logbook_hierarchy(void) flag = 0; strlcpy(str, grpname, sizeof(str)); str[9] = 0; - if (equal_ustring(str, "top group")) + if (strieq(str, "top group")) flag = 2; str[5] = 0; - if (equal_ustring(str, "group")) + if (strieq(str, "group")) flag = 1; if (flag) { @@ -5030,14 +5044,13 @@ LBLIST get_logbook_hierarchy(void) for (j = 0; j < root->member[i]->n_members; j++) { /* check if node is valid logbook */ for (k = 0; lb_list[k].name[0]; k++) - if (equal_ustring(root->member[i]->member[j]->name, lb_list[k].name)) + if (strieq(root->member[i]->member[j]->name, lb_list[k].name)) break; /* check if node is subgroup of other node */ if (!lb_list[k].name[0]) { for (k = 0; k < root->n_members; k++) - if (equal_ustring - (root->member[i]->member[j]->name, root->member[k]->name)) { + if (strieq(root->member[i]->member[j]->name, root->member[k]->name)) { /* node is allocated twice, so free one... */ free(root->member[i]->member[j]); @@ -5112,11 +5125,11 @@ int is_logbook_in_group(LBLIST pgrp, char *logbook) { int i; - if (equal_ustring(pgrp->name, logbook)) + if (strieq(pgrp->name, logbook)) return 1; for (i = 0; i < pgrp->n_members; i++) { - if (equal_ustring(logbook, pgrp->member[i]->name)) + if (strieq(logbook, pgrp->member[i]->name)) return 1; if (pgrp->member[i]->n_members > 0 && is_logbook_in_group(pgrp->member[i], logbook)) @@ -5624,8 +5637,8 @@ int build_subst_list(LOGBOOK * lbs, char list[][NAME_LENGTH], char value[][NAME_ strcpy(list[i], "date"); time(&now); ts = localtime(&now); - if (!getcfg(lbs->name, "Date format", format)) - strcpy(format, DEFAULT_DATE_FORMAT); + if (!getcfg(lbs->name, "Time format", format)) + strcpy(format, DEFAULT_TIME_FORMAT); strftime(str, sizeof(str), format, ts); @@ -5909,7 +5922,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL BOOL breedit) { int i, j, n, index, size, width, height, fh, length, first, input_size, input_maxlen, - format_flags; + format_flags, year, month, day; char str[1000], preset[1000], *p, *pend, star[80], comment[10000], reply_string[256], list[MAX_N_ATTR][NAME_LENGTH], file_name[256], *buffer, format[256], date[80], attrib[MAX_N_ATTR][NAME_LENGTH], text[TEXT_SIZE], orig_tag[80], @@ -5917,7 +5930,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL slist[MAX_N_ATTR + 10][NAME_LENGTH], svalue[MAX_N_ATTR + 10][NAME_LENGTH], owner[256], locked_by[256], class_value[80], class_name[80], condition[256], ua[NAME_LENGTH]; - time_t now; + time_t now, ltime; char fl[8][NAME_LENGTH]; struct tm *pts, ts; @@ -5957,6 +5970,28 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL } else break; } + } else if (attr_flags[i] & AF_DATE) { + + sprintf(str, "y%d", i); + year = atoi(getparam(str)); + if (year < 100) + year += 2000; + + sprintf(str, "m%d", i); + month = atoi(getparam(str)); + + sprintf(str, "d%d", i); + day = atoi(getparam(str)); + + memset(&ts, 0, sizeof(struct tm)); + ts.tm_year = year - 1900; + ts.tm_mon = month - 1; + ts.tm_mday = day; + ts.tm_hour = 12; + + ltime = mktime(&ts); + sprintf(attrib[i], "%d", ltime); + } else { strlcpy(attrib[i], getparam(ua), NAME_LENGTH); } @@ -6068,7 +6103,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL n = strbreak(str, list, MAX_N_ATTR); for (i = 0; i < n; i++) for (j = 0; j < lbs->n_attr; j++) { - if (equal_ustring(attr_list[j], list[i])) + if (strieq(attr_list[j], list[i])) attrib[j][0] = 0; } } @@ -6215,8 +6250,8 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL time(&now); if (bedit) { - if (!getcfg_cond(lbs->name, condition, "Date format", format)) - strcpy(format, DEFAULT_DATE_FORMAT); + if (!getcfg_cond(lbs->name, condition, "Time format", format)) + strcpy(format, DEFAULT_TIME_FORMAT); memset(&ts, 0, sizeof(ts)); @@ -6235,7 +6270,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL mktime(&ts); strftime(str, sizeof(str), format, &ts); } else { - if (getcfg_cond(lbs->name, condition, "Date format", format)) + if (getcfg_cond(lbs->name, condition, "Time format", format)) strftime(str, sizeof(str), format, localtime(&now)); else strcpy(str, ctime(&now)); @@ -6244,7 +6279,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL } rsprintf("%s:", - loc("Entry date")); + loc("Entry time")); rsprintf("%s\n", str); rsprintf("\n", date); @@ -6350,11 +6385,75 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL ua, attrib[index]); } else { if (attr_options[index][0][0] == 0) { + + if (attr_flags[index] & AF_DATE) { + + year = month = day = 0; + if (attrib[index][0]) { + ltime = atoi(attrib[index]); + pts = localtime(<ime); + year = pts->tm_year+1900; + month = pts->tm_mon+1; + day = pts->tm_mday; + } + + + /* display date selector */ + rsprintf("\n"); + + rsprintf("\n"); + + if (year) + rsprintf(" %s: ", + loc("Year"), index, year); + else + rsprintf(" %s: ", + loc("Year"), index); + + rsprintf("\n\n"); + + rsprintf("\n"); + } else + + /* show normal edit field */ rsprintf ("\n", input_size, input_maxlen, ua, attrib[index]); + } else { - if (equal_ustring(attr_options[index][0], "boolean")) { + if (strieq(attr_options[index][0], "boolean")) { /* display checkbox */ if (atoi(attrib[index]) == 1) rsprintf @@ -6433,12 +6532,13 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL } rsprintf("\n"); + } else { rsprintf("\n"); sprintf(str, loc("Add %s"), attr_list[index]); - if (equal_ustring(getparam("extend"), str)) { + if (strieq(getparam("extend"), str)) { rsprintf(""); rsprintf(loc("Add new option here"), attr_list[index]); @@ -6467,8 +6567,8 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL if (strchr(str, '{')) *strchr(str, '{') = 0; - if (equal_ustring(attr_options[index][i], attrib[index]) - || equal_ustring(str, attrib[index])) + if (strieq(attr_options[index][i], attrib[index]) + || strieq(str, attrib[index])) rsprintf("