|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T s ┃
Length: 11877 (0x2e65) Types: TextFile Names: »schedule.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/month/schedule.c«
/* * Modification History * * Origional Author: Tom Stoehn@Tektronics[zeus!tims] Modifications by: Marc * Ries@TRW[trwrb!ries] * */ #include <curses.h> #include "month.h" #include <sys/types.h> #include <sys/file.h> extern char *strcpy(), *strcat(); extern char *getenv(), *malloc(); #ifndef F_OK #define F_OK 00 #endif struct event_rec events = {0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0}; struct event_rec current_event = {0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0}, 1, 0, 0, 10, 0, 1, 0, "", 0}; short update_schedule = 0; short updating = 0, edit_flag = 0, put_into_schedule, parsed_correctly; char schedule_file_name[75]; short SCHEDULE_ROW, SKID_ROW; char *grids[] = { "mid. . . 1a . . . 2a . . . 3a . . . 4a . . . 5a . . . 6a", "6a . . . 7a . . . 8a . . . 9a . . . 10a. . . 11a. . . noon", "noon . . 1p . . . 2p . . . 3p . . . 4p . . . 5p . . . 6p", "6p . . . 7p . . . 8p . . . 9p . . . 10p. . . 11p. . . mid" }; extern short month, day, year, days, message_line_filled; post_event(month, day, year) short month, day, year; { goto_schedule(); current_event.event_month = month; current_event.event_day = day; current_event.event_year = year; display_event(¤t_event); } read_schedule() { char *s; int fd, rec_size; struct event_rec *event_ptr, *chain_ptr; chain_ptr = events.next_event; /* free old events */ while (chain_ptr) { event_ptr = chain_ptr; chain_ptr = chain_ptr->next_event; free((char *)event_ptr); } events.next_event = 0; if (!(s = getenv("HOME"))) { s = "."; } (void) strcpy(schedule_file_name, s); (void) strcat(schedule_file_name, "/.month"); rec_size = sizeof(struct event_rec); if ((fd = open(schedule_file_name, 0)) != -1) { chain_ptr = &events; for (;;) { if ((!(event_ptr = (struct event_rec *) malloc(rec_size))) || (read(fd, (char *)event_ptr, rec_size) != rec_size)) { break; } chain_ptr->next_event = event_ptr; chain_ptr = event_ptr; chain_ptr->next_event = (struct event_rec *) 0; } (void) close(fd); } } write_schedule() { int fd; struct event_rec *chain_ptr; updating = 1; if ((fd = creat(schedule_file_name, 0640)) == -1) { return (-1); } chain_ptr = events.next_event; while (chain_ptr) { if (!is_passed_event(chain_ptr)) { (void) write(fd, (char *) chain_ptr, sizeof(struct event_rec)); } chain_ptr = chain_ptr->next_event; } (void) close(fd); updating = 0; return (0); } select_regularity_col(col) register col; { short i, hflag; switch (col) { case MONTHLY_COL: hl_all(¤t_event, (current_event.monthly ? 0 : 1), 0, -1, -1, -1, -1); break; case YEARLY_COL: hl_all(¤t_event, 0, (current_event.yearly ? 0 : 1), -1, -1, -1, -1); break; case EVERY_COL: hl_all(¤t_event, -1, -1, (current_event.every ? 0 : 1), -1, -1, -1); break; case SMTWTFS_COL: case SMTWTFS_COL + 3: case SMTWTFS_COL + 6: case SMTWTFS_COL + 9: case SMTWTFS_COL + 12: case SMTWTFS_COL + 15: case SMTWTFS_COL + 18: i = (col - SMTWTFS_COL) / 3; hflag = (current_event.smtwtfs[i] = !current_event.smtwtfs[i]); hl_schedule(col, hflag); hl_all(¤t_event, -1, -1, -1, -1, -1, -1); break; case NTH_COL: hl_all(¤t_event, -1, -1, -1, (current_event.nth_is_on ? 0 : 1), -1, -1); break; case LAST_COL: hl_all(¤t_event, -1, -1, -1, -1, (current_event.last ? 0 : 1), -1); break; } } accept_cancel(is_accept) short is_accept; { if (is_accept) { accept_current_event(); } else { cancel_current_event(); display_event(¤t_event); } if (edit_flag) { clear_message_line(); } else { message_line_filled = 1; } goto_day(day); } accept_current_event() { if ((parse_event(¤t_event) != -1)) { if (get_answer("Put into schedule? ", "change cancelled", "done", 'n', 'y') == 'y') { if (!edit_flag) { link_event(¤t_event); } put_into_schedule = 1; } } } cancel_current_event() { if (!edit_flag) { current_event = events; } } link_event(event) struct event_rec *event; { struct event_rec *t, *ptr; if (!(ptr = (struct event_rec *) malloc(sizeof(struct event_rec)))) { return; } *ptr = *event; t = events.next_event; events.next_event = ptr; ptr->next_event = t; update_schedule++; } parse_event(event) struct event_rec *event; { short hs; hs = has_smtwtfs(event->smtwtfs); if ((event->every || event->nth_is_on || event->last) && !hs) { error_message("missing day of week", 1); return (-1); } if (hs && !event->every && !event->nth_is_on && !event->last) { MQ: error_message("missing qualifier", 1); return (-1); } if (!event->every && (event->monthly || event->yearly) && (event->nth_is_on || event->last)) { error_message("need 'every'", 1); return (-1); } if (event->last && !event->monthly && !event->yearly) { error_message("monthly or yearly?", 1); return (-1); } if ((event->nth_is_on || event->last) && (!event->monthly && !event->yearly && !event->every)) { goto MQ; } parsed_correctly = 1; return (0); } overview() { short i, j, row, col, hour, minute, span, n; struct event_rec *event_list[MAX_EVENTS]; char *grid; (void) get_daily_events(event_list); clear_schedule_area(); for (i = 0; i < 4; i++) { mvaddstr((SCHEDULE_ROW + i + i), 1, grids[i]); } standout(); i = 0; while (event_list[i]) { hour = event_list[i]->hour; minute = event_list[i]->minute; row = SCHEDULE_ROW + ((hour / 6) * 2); if (row > (LINES - 1)) { break; } span = (event_list[i]->span_hours * 60) + event_list[i]->span_minutes; col = 1 + (12 * (hour % 6)) + (3 * (minute / 15)); n = hour / 6; grid = grids[n]; span /= 15; move(row, col); for (j = 0; j < span; j++) { addch(grid[col - 1]); addch(grid[col]); addch(grid[col + 1]); col += 3; if (col > 72) { col = 1; row += 2; if (row > (SCHEDULE_ROW + 6)) { row = SCHEDULE_ROW; } move(row, col); grid = grids[++n % 4]; } } i++; } standend(); } get_daily_events(event_list) struct event_rec *event_list[]; { short i = 0; struct event_rec *eptr; eptr = events.next_event; while (eptr && (i < (MAX_EVENTS - 1))) { if (event_matches_date(eptr)) { event_list[i++] = eptr; } eptr = eptr->next_event; } event_list[i] = 0; return (i); } get_every_event(event_list) struct event_rec *event_list[]; { short i = 0; struct event_rec *eptr; eptr = events.next_event; while (eptr && (i < (MAX_EVENTS - 1))) { event_list[i++] = eptr; eptr = eptr->next_event; } event_list[i] = 0; return (i); } scan_events(schar) int schar; { struct event_rec *event_list[MAX_EVENTS]; short i, j, k, ch, n; if (schar == 'S') { /* scan todays events */ if ((n = get_daily_events(event_list)) <= 0) { error_message("No events this day", 0); clear_schedule_area(); return; } } else { /* scan all events */ if ((n = get_every_event(event_list)) <= 0) { error_message("No events", 0); clear_schedule_area(); return; } } sort_events(event_list, n); for (i = 0; i < n; i++) { current_event = *event_list[i]; display_event(event_list[i]); GETCH: ch = get_npdeq(); switch (ch) { case '\0': i--; break; case '\033': case 'q': goto OUT; case 'n': j = i + 1; while ((j < n) && (!event_list[j])) { j++; } if (j >= n) { /* * sound_bell(); goto GETCH; */ goto OUT; } i = j - 1; break; case 'p': j = i - 1; while ((j >= 0) && (!event_list[j])) { j--; } if (j < 0) { sound_bell(); goto GETCH; } i = j - 1; break; case 'd': delete_event(event_list[i]); event_list[i] = 0; for (k = i + 1; k < n; k++) { if (event_list[k] != 0) { i = k; break; } } if (event_list[i] == 0) { for (k = i - 1; k >= 0; k--) { if (event_list[k] != 0) { i = k; break; } } } if (event_list[i] != 0) { i--; } else { goto OUT; } break; case 'e': EDIT: goto_schedule(); edit_flag = 1; parsed_correctly = 0; put_into_schedule = 0; if (user() == ACCEPT) { if (parsed_correctly && put_into_schedule) { *event_list[i] = current_event; update_schedule++; } else if (!parsed_correctly) { goto EDIT; } } else { display_event(event_list[i]); } edit_flag = 0; i--; break; } } OUT: goto_day(day); } delete_event(event) struct event_rec *event; { struct event_rec *ptr; ptr = &events; while (ptr && (ptr->next_event != event)) { ptr = ptr->next_event; } if (ptr) { ptr->next_event = ptr->next_event->next_event; free((char *) event); } update_schedule++; } sort_events(e, n) register struct event_rec *e[]; int n; { register struct event_rec *t; register i, j; short f; for (i = 0; i < n; i++) { for (j = (n - 1), f = 0; j > 0; j--) { if ((e[j]->hour < e[j - 1]->hour) || ((e[j]->hour == e[j - 1]->hour) && (e[j]->minute < e[j - 1]->minute))) { t = e[j]; e[j] = e[j - 1]; e[j - 1] = t; f++; } } if (f == 0) { break; } } } show_all_events(month, year) register month, year; { register struct event_rec *eptr; short i; char match_list[32]; short tday; tday = day; for (i = 1; i <= days; i++) { eptr = events.next_event; match_list[i] = 0; day = i; while (eptr) { if (event_matches_date(eptr)) { if (!eptr->monthly && !eptr->yearly && !eptr->every) { match_list[i] = 2; break; } else { match_list[i] = 1; } } eptr = eptr->next_event; } } day = tday; print_cal(month, year, match_list); } file_events() { struct event_rec *event_list[MAX_EVENTS]; short i, ch, n; char buf[256]; int fd; if ((ch = get_answer("all, or current? [ac] ", "", "", 'a', 'c')) == 'c') { if ((n = get_daily_events(event_list)) <= 0) { error_message("No events this day", 0); return; } } else if (ch == 'a') { /* scan all events */ if ((n = get_every_event(event_list)) <= 0) { error_message("No events", 0); return; } } else { return; } if (!get_input_line("file: ", buf)) { return; } if (!access(buf, F_OK)) { if (get_answer("file already exists, use it? ", "aborted", "OK", 'n', 'y') == 'n') { return; } } if ((fd = creat(buf, 0640)) < 0) { error_message("permission denied", 1); } else { if (ch == 'c') { (void) strcpy(buf, "\n\t\t\tEvents for "); print_date(event_list[0]->event_month, event_list[0]->event_day, event_list[0]->event_year, buf + strlen(buf)); } else { (void) strcpy(buf, "\n\t\t\tAll Events Listing"); } (void) strcat(buf, "\n\n\n"); (void) write(fd, buf, strlen(buf)); for (i = 0; i < n; i++) { (void) strcpy(buf, " "); print_time(event_list[i], buf + strlen(buf)); (void) strcat(buf, "\n"); print_span(event_list[i], buf + strlen(buf)); (void) strcat(buf, "\n "); print_event_description(event_list[i], buf + strlen(buf)); (void) strcat(buf, "\n\n* * * * * * * * * *\n\n"); (void) write(fd, buf, strlen(buf)); } (void) close(fd); error_message("done", 0); } } scan_every_event_for_appt() { struct event_rec *ptr; ptr = events.next_event; while (ptr) { current_event = *ptr; display_appt(ptr); ptr = ptr->next_event; } }