home *** CD-ROM | disk | FTP | other *** search
- Subject: v16i056: A visual calendar and appointment system, Part03/06
- Newsgroups: comp.sources.unix
- Sender: sources
- Approved: rsalz@uunet.UU.NET
-
- Submitted-by: Michael Morrell <hplabs!hpda!morrell>
- Posting-number: Volume 16, Issue 56
- Archive-name: month8.7/part03
-
- # This is a shell archive. Remove anything before this line,
- # then unpack it by saving it in a file and typing "sh file".
- # This archive contains:
- # print.c schedule.c time.c user.c
- # user2.c
- LANG=""; export LANG
-
- echo x - print.c
- cat >print.c <<'@EOF'
- #ifndef lint
- static char rcsid[] = "$Header: print.c,v 8.3 88/04/04 10:43:07 hull Exp $";
- #endif
-
- #include <curses.h>
- #include <pwd.h>
- #include "month.h"
-
- 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"
- };
-
- char *month_names[] = {
- "JANUARY",
- "FEBRUARY",
- "MARCH",
- "APRIL",
- "MAY",
- "JUNE",
- "JULY",
- "AUGUST",
- "SEPTEMBER",
- "OCTOBER",
- "NOVEMBER",
- "DECEMBER"
- };
-
- char *smtwtfs_names[] = {
- "Su",
- "Mo",
- "Tu",
- "We",
- "Th",
- "Fr",
- "Sa",
- };
-
- extern short month_start, days;
- extern short all_flag, over_flag, date_flag, ins_mode, keep_old, read_only;
- extern short crow, ccol, area_ptr;
- extern struct event_rec current_event;
- extern struct date_rec current_date, todays_date;
- extern struct area_rec areas[];
- extern char time_mode, *month_dir, *user_name;
-
- print_screen()
- {
- print_day_headers();
- show_all_events(current_date.month, current_date.year);
- print_border();
- print_all_months();
- print_all_years();
- print_user();
- print_flags();
- print_overview();
- }
-
- print_day_headers()
- {
- static char *days_of_week =
- "Sunday Monday Tuesday Wednesday Thursday Friday Saturday";
-
- mvaddstr(DAY_ROW, DAY_COL, days_of_week);
- }
-
- print_border()
- {
- short row;
- static char *border =
- "+------------------------------------------------------------------+";
-
- mvaddstr(DAY_ROW + 1, CAL_COL - 2, border);
-
- for (row = DAY_ROW + 2; row < YEAR_ROW - 1; row++) {
- mvaddch(row, CAL_COL - 2, '|');
- mvaddch(row, CAL_COL + 65, '|');
- }
-
- mvaddstr(YEAR_ROW - 1, CAL_COL - 2, border);
- }
-
- print_cal(month, year, all_events_list)
- register month, year;
- char *all_events_list;
- {
- short i, month_is_current, cday;
- short row = CAL_ROW, col = CAL_COL;
-
- if (current_date.day > days)
- current_date.day = days;
- else if (current_date.day < 1)
- current_date.day = 1;
-
- month_is_current = ((month == todays_date.month) &&
- (year == todays_date.year));
-
- for (i = 1, cday = 1; i <= 42; i++) {
- if ((cday <= days) && (i >= (month_start + 1))) {
- if (month_is_current && (cday == todays_date.day))
- attron(A_UNDERLINE);
-
- if (all_events_list && all_events_list[cday])
- mvprintw(row, col, "(%2d)", cday);
- else
- mvprintw(row, col, " %2d ", cday);
-
- attroff(A_UNDERLINE);
- cday++;
- } else
- mvprintw(row, col, " ");
-
- if ((i % 7) == 0) {
- row += 2;
- col = CAL_COL;
- } else
- col += 10;
- }
- hl_day(current_date.day, HL_ON);
- }
-
- print_all_months()
- {
- short i;
-
- for (i = 0; i <= 11; i++)
- mvaddstr(MONTH_ROW + i, 0, month_names[i]);
- hl_month(current_date.month, HL_ON);
- }
-
- print_all_years()
- {
- int ret = 1;
- short first_year, i;
-
- if (current_date.year < FIRST_YEAR) {
- current_date.month = 1;
- current_date.day = 1;
- current_date.year = FIRST_YEAR;
- ret = 0;
- } else if (current_date.year > LAST_YEAR) {
- current_date.month = 12;
- current_date.day = 31;
- current_date.year = LAST_YEAR;
- ret = 0;
- }
-
- first_year = current_date.year - (current_date.year % 10);
-
- move(YEAR_ROW, YEAR_COL);
- for (i = first_year; i < (first_year + 10); i++)
- printw(" %4d ", i);
- hl_year(current_date.year, HL_ON);
- return(ret);
- }
-
- print_flags()
- {
- if (all_flag)
- attron(A_BOLD);
- mvaddstr(0, FLAG_COL, "A");
- if (ins_mode)
- attron(A_BOLD);
- else
- attroff(A_BOLD);
- mvaddstr(0, FLAG_COL+2, "I");
- if (keep_old)
- attron(A_BOLD);
- else
- attroff(A_BOLD);
- mvaddstr(0, FLAG_COL+4, "K");
- if (over_flag)
- attron(A_BOLD);
- else
- attroff(A_BOLD);
- mvaddstr(0, FLAG_COL+6, "O");
- #if MULTIUSER
- if (read_only)
- attron(A_BOLD);
- else
- attroff(A_BOLD);
- mvaddstr(0, FLAG_COL+8, "R");
- #endif MULTIUSER
- attroff(A_BOLD);
- }
-
- print_user()
- {
- if (user_name != NULL) {
- mvprintw(0, USER_COL, "%*s", FLAG_COL - USER_COL, " ");
- mvaddstr(0, USER_COL, "User: ");
- attron(A_UNDERLINE);
- addstr(user_name);
- attroff(A_UNDERLINE);
- }
- }
-
- print_version()
- {
- char ver_string[BUFSIZE];
- extern float get_version();
-
- sprintf(ver_string, "version %-3.3g", get_version());
- print_message(ver_string, NO_BELL);
- }
-
- print_event_regularity(event)
- struct event_rec *event;
- {
- if (event->monthly)
- attron(A_BOLD);
- mvaddstr(SCHEDULE_ROW, MONTHLY_COL, "monthly");
- attroff(A_BOLD);
- if (event->yearly)
- attron(A_BOLD);
- mvaddstr(SCHEDULE_ROW, YEARLY_COL, "yearly");
- attroff(A_BOLD);
- if (event->every)
- attron(A_BOLD);
- mvaddstr(SCHEDULE_ROW, EVERY_COL, "every");
- attroff(A_BOLD);
- print_smtwtfs(event->smtwtfs);
- print_nth(event);
- if (event->last)
- attron(A_BOLD);
- mvaddstr(SCHEDULE_ROW, LAST_COL, "last");
- attroff(A_BOLD);
- print_until(event);
- }
-
- print_smtwtfs(smtwtfs)
- char smtwtfs[];
- {
- short i;
-
- move(SCHEDULE_ROW, SMTWTFS_COL);
-
- for (i = 0; i < 7; i++) {
- if (smtwtfs[i])
- attron(A_BOLD);
- addstr(smtwtfs_names[i]);
- if (smtwtfs[i])
- attroff(A_BOLD);
- }
- }
-
- print_event(event)
- struct event_rec *event;
- {
- clear_schedule_area();
- print_date(event);
- print_event_regularity(event);
- print_event_private(event);
- print_event_anti(event);
- print_times(event);
- print_warning(event);
- print_event_description(event);
- print_owner(event);
- }
-
- print_event_private(event)
- struct event_rec *event;
- {
- if (event->private)
- attron(A_BOLD);
- mvaddstr(SCHEDULE_ROW, PRIVATE_COL, "priv");
- attroff(A_BOLD);
- }
-
- print_event_anti(event)
- struct event_rec *event;
- {
- if (event->anti)
- attron(A_BOLD);
- mvaddstr(SCHEDULE_ROW, ANTI_COL, "anti");
- attroff(A_BOLD);
- }
-
- print_times(event)
- struct event_rec *event;
- {
- short hour;
- char *apm;
-
- hour = event->start_time.hour;
- apm = (hour < 12) ? "am" : "pm";
- hour = ((hour + 11) % 12) + 1;
-
- mvaddstr(TIME_ROW-1, START_COL, "start time");
- if (time_mode == START_MODE)
- attron(A_UNDERLINE);
- mvprintw(TIME_ROW, START_COL, "%2d:%02d %s", hour,
- event->start_time.minute, apm);
-
- attroff(A_UNDERLINE);
- mvaddstr(TIME_ROW-1, DURATION_COL, "duration");
- if (time_mode == DURATION_MODE)
- attron(A_UNDERLINE);
- mvprintw(TIME_ROW, DURATION_COL, "%2d:%02d", event->duration.hour,
- event->duration.minute);
-
- hour = event->end_time.hour;
- apm = (hour < 12) ? "am" : "pm";
- hour = ((hour + 11) % 12) + 1;
-
- attroff(A_UNDERLINE);
- mvaddstr(TIME_ROW-1, END_COL, "end time");
- if (time_mode == END_MODE)
- attron(A_UNDERLINE);
- mvprintw(TIME_ROW, END_COL, "%2d:%02d %s", hour,
- event->end_time.minute, apm);
- attroff(A_UNDERLINE);
- }
-
- print_warning(event)
- struct event_rec *event;
- {
- mvaddstr(TIME_ROW-1, WARNING_COL, "warning");
- mvprintw(TIME_ROW, WARNING_COL, "%2d:%02d", event->warning.hour,
- event->warning.minute);
- }
-
- print_event_description(event)
- struct event_rec *event;
- {
- mvprintw(DESCRIPTION_ROW, DESCRIPTION_COL-7, "event: %s",
- event->event_string);
- }
-
- print_owner(event)
- struct event_rec *event;
- {
- struct passwd *pw, *getpwuid();
-
- mvaddstr(OWNER_ROW-1, OWNER_COL, "owner");
- attron(A_UNDERLINE);
-
- if ((pw = getpwuid(event->event_owner)) != NULL)
- mvprintw(OWNER_ROW, OWNER_COL, "%s", pw->pw_name);
- else
- mvprintw(OWNER_ROW, OWNER_COL, "%d", event->event_owner);
-
- attroff(A_UNDERLINE);
- }
-
- print_until(event)
- struct event_rec *event;
- {
- if (event->until) {
- attron(A_BOLD);
- }
- mvprintw(SCHEDULE_ROW, UMONTH_COL, "%2d/%2d/%4d",
- event->until_date.month, event->until_date.day,
- event->until_date.year);
- attroff(A_BOLD);
- }
-
- print_date(event)
- struct event_rec *event;
- {
- attron(A_BOLD);
- mvprintw(SCHEDULE_ROW, SMONTH_COL, "%2d/%2d/%4d",
- event->start_date.month, event->start_date.day,
- event->start_date.year);
- attroff(A_BOLD);
- }
-
- print_message(str, sound)
- char *str;
- int sound;
- {
- int strlen();
-
- clear_message_line();
- standout();
- mvaddstr(0, 0, str);
- standend();
- refresh();
- if (sound) {
- sound_bell();
- }
- return(strlen(str));
- }
-
- print_nth(event)
- struct event_rec *event;
- {
- char *ns;
- short n;
-
- if (event->nth_is_on) {
- attron(A_BOLD);
- }
- n = event->nth;
- if (event->nth > 13) {
- n %= 10;
- }
-
- switch(n) {
- case 0:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- case 12:
- case 13:
- ns = "th";
- break;
- case 1:
- ns = "st";
- break;
- case 2:
- ns = "nd";
- break;
-
- case 3:
- ns = "rd";
- break;
- }
- mvprintw(SCHEDULE_ROW, NTH_COL, "%02d%s", event->nth, ns);
- attroff(A_BOLD);
- }
-
- print_overview()
- {
- short i, row, col, hour, minute, duration, n;
- struct eptr_rec *ep, *events_today;
- char *grid;
-
- clear_schedule_area();
-
- if (!over_flag) return;
-
- (void) get_daily_events(&events_today);
-
- for (i = 0; i < 4; i++)
- mvaddstr((SCHEDULE_ROW + i + i), 0, grids[i]);
-
- attron(A_REVERSE);
-
- ep = events_today;
- while (ep) {
- hour = ep->event->start_time.hour;
- minute = ep->event->start_time.minute;
-
- row = SCHEDULE_ROW + ((hour / 6) * 2);
-
- duration = (ep->event->duration.hour * 60) +
- ep->event->duration.minute;
- col = (12 * (hour % 6)) + (3 * (minute / 15));
- n = hour / 6;
- grid = grids[n];
- duration /= 15;
-
- move(row, col);
-
- for (i = 0; i < duration; i++) {
- addch(grid[col]);
- addch(grid[col + 1]);
- addch(grid[col + 2]);
-
- col += 3;
- if (col > 71 && i < (duration - 1)) {
- while(grid[col])
- addch(grid[col++]);
- col = 0;
- row += 2;
-
- if (row > (SCHEDULE_ROW + 6))
- break;
- move(row, col);
- grid = grids[++n];
- }
- }
- ep = ep->next_event;
- }
- attroff(A_REVERSE);
- }
-
- print_sched()
- {
- short shour, sminute, ehour, eminute, n;
- struct eptr_rec *ep, *events_today;
-
- if ((n = get_daily_events(&events_today)) <= 0) {
- print_message("no events this day", BELL);
- return;
- }
- sort_events(events_today, n);
-
- push_area(BOOK);
- clear();
- move(0,0);
- printw("%s %d/%d/%d\n",
- smtwtfs_names[(current_date.day+month_start-1) % 7],
- current_date.month, current_date.day, current_date.year);
-
- ep = events_today;
- while (ep) {
- shour = ep->event->start_time.hour;
- sminute = ep->event->start_time.minute;
- ehour = ep->event->end_time.hour;
- eminute = ep->event->end_time.minute;
-
- if (shour == ehour && sminute == eminute)
- printw(" %2d:%02d%2s ",
- ((shour + 11) % 12) + 1, sminute,
- ((shour < 12) ? "am" : "pm"));
- else
- printw(" %2d:%02d%2s-%2d:%02d%2s ",
- ((shour + 11) % 12) + 1, sminute,
- ((shour < 12) ? "am" : "pm"),
- ((ehour + 11) % 12) + 1, eminute,
- ((ehour < 12) ? "am" : "pm"));
- printw("%s\n", ep->event->event_string);
-
- ep = ep->next_event;
- }
- prompt_wait();
- clear();
- print_screen();
- pop_area();
- }
-
- print_book(ndays)
- int ndays;
- {
- short shour, sminute, ehour, eminute, n;
- struct eptr_rec *ep, *events_today;
-
- if (!date_flag) {
- current_date.month = todays_date.month;
- current_date.day = todays_date.day;
- current_date.year = todays_date.year;
- }
-
- if (ndays <= 0)
- return(-1);
- if (read_schedule(month_dir, READ_ONLY) != 0)
- return(-1);
-
- for (; ndays; ndays--) {
- month_start = get_month_start(current_date.month,
- current_date.year);
- days = days_in(current_date.month, current_date.year);
- if ((n = get_daily_events(&events_today)) == 0) {
- if (incr_date(1, ¤t_date))
- continue;
- else
- break;
- }
-
- sort_events(events_today, n);
- printf("%s %d/%d/%d\n",
- smtwtfs_names[(current_date.day+month_start-1) % 7],
- current_date.month, current_date.day, current_date.year);
-
- ep = events_today;
- while (ep) {
- shour = ep->event->start_time.hour;
- sminute = ep->event->start_time.minute;
- ehour = ep->event->end_time.hour;
- eminute = ep->event->end_time.minute;
-
- if (shour == ehour && sminute == eminute)
- printf(" %2d:%02d%2s ",
- ((shour + 11) % 12) + 1,sminute,
- ((shour < 12) ? "am" : "pm"));
- else
- printf(" %2d:%02d%2s-%2d:%02d%2s ",
- ((shour + 11) % 12) + 1,sminute,
- ((shour < 12) ? "am" : "pm"),
- ((ehour + 11) % 12) + 1,eminute,
- ((ehour < 12) ? "am" : "pm"));
- printf("%s\n", ep->event->event_string);
-
- ep = ep->next_event;
- }
- printf("\n");
- if (!incr_date(1, ¤t_date))
- break;
- }
- return(0);
- }
-
- sound_bell()
- {
- putchar(7);
- fflush(stdout);
- }
-
- clear_message_line()
- {
- mvprintw(0, 0, "%*s", USER_COL, " ");
- if (current_area == SCAN || current_area == SCHED_SCAN)
- ccol = 0;
- }
-
- clear_schedule_area()
- {
- move(SCHEDULE_ROW, 0);
- clrtobot();
- }
- @EOF
-
- chmod 644 print.c
-
- echo x - schedule.c
- cat >schedule.c <<'@EOF'
- #ifndef lint
- static char rcsid[] = "$Header: schedule.c,v 8.5 88/04/04 10:44:43 hull Exp $";
- #endif
-
- #include <curses.h>
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #if LOCKF
- #include <fcntl.h>
- #include <unistd.h>
- #endif LOCKF
- #if FLOCK
- #include <sys/file.h>
- #endif FLOCK
- #include "month.h"
-
- 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, 15}, {11, 0}, "", 0, 0, 0, 0, {0, 0, 0}, 0};
- short update_schedule = 0;
- short updating = 0, edit_flag = 0, parsed_correctly, alias_level;
- unsigned short file_owner;
- int fd;
- FILE *alias_file, *glob_alias_file;
-
- extern short days, month_start, my_file;
- extern short all_flag, keep_old, read_only;
- extern short crow, ccol;
- extern struct date_rec current_date, todays_date;
- extern short area_ptr;
- extern struct area_rec areas[];
- extern struct event_rec events;
- extern int user_id;
- extern char *month_dir, *user_name;
-
- group_post()
- {
- char names[BUFSIZE];
-
- push_area(SCAN);
- ccol = print_message("names: ", NO_BELL);
-
- if (get_string(names) == 0) {
- clear_message_line();
- pop_area();
- return;
- }
-
- post_event(); /* does push_area(SCHEDULE) */
- edit_flag = 1;
- parsed_correctly = 0;
- while ((user() == ACCEPT) && !parsed_correctly)
- ;
- pop_area();
- if (parsed_correctly)
- post_it_to_em(names, ¤t_event);
- edit_flag = 0;
- show_all_events(current_date.month, current_date.year);
- pop_area();
- }
-
- post_it_to_em(names, event)
- char *names;
- struct event_rec *event;
- {
- short i, save_keep;
- struct name_rec *name_list = NULL, *cur_name;
- char buf[BUFSIZE], *new_dir, *get_user_arg();
- char *alias_file_name;
- char ch, *name;
-
- glob_alias_file = fopen(ALIASFILE, "r");
- alias_file_name = malloc((unsigned) strlen(month_dir)+10);
- strcpy(alias_file_name, month_dir);
- strcat(alias_file_name, "/.monthrc");
- alias_file = fopen(alias_file_name, "r");
- free(alias_file_name);
-
- clear_schedule_area();
- refresh();
- alias_level = 0;
- if (expand_aliases(names, &name_list) == -1) {
- print_message("too many alias levels", BELL);
- fclose(alias_file);
- fclose(glob_alias_file);
- return;
- }
- /*
- cur_name = name_list;
- printf("name_list:\n");
- while (cur_name != NULL) {
- printf("*%s*\n", cur_name->name);
- cur_name = cur_name->next_name;
- }
- */
- fclose(alias_file);
- fclose(glob_alias_file);
- save_keep = keep_old;
- keep_old = 1;
-
- /* write out current user's schedule */
- if (!read_only && write_schedule() < 0) {
- more();
- sprintf(buf, "user %s: cannot write .month", user_name);
- ccol = print_message(buf, BELL);
- }
-
- cur_name = name_list;
- while (cur_name != NULL) {
- name = cur_name->name;
- if ((new_dir = get_user_arg(name)) != NULL) {
- while ((i = read_schedule(new_dir, READ_WRITE)) == -2) {
- more();
- sprintf(buf, "user %s: .month file locked", name);
- ccol = print_message(buf, BELL);
- more();
- ccol = print_message("try again? ", NO_BELL);
- ch = get_char();
- clear_message_line();
- if (ch != 'y')
- break; /* i is still -2 */
- }
-
- if (i == -1) {
- more();
- sprintf(buf, "user %s: cannot open .month", name);
- ccol = print_message(buf, BELL);
- } else if (i > 0) {
- more();
- sprintf(buf, "user %s: cannot read .month version %d",
- name, i);
- ccol = print_message(buf, BELL);
- } else if (i == 0) { /* normal case */
- link_event(event);
- if (write_schedule() < 0) {
- more();
- sprintf(buf, "user %s: cannot write .month", name);
- ccol = print_message(buf, BELL);
- }
- }
- } else {
- more();
- sprintf(buf, "invalid user: %s", name);
- ccol = print_message(buf, BELL);
- }
- cur_name = cur_name->next_name;
- }
-
- free_names(name_list);
-
- /* read in original user's schedule */
- if ((i = read_schedule(month_dir, read_only)) == -2) {
- more();
- ccol = print_message(".month file locked", BELL);
- i = read_schedule(month_dir, READ_ONLY);
- if (i == 0)
- read_only = 1;
- }
-
- if (i == -1) {
- more();
- ccol = print_message("cannot open .month", BELL);
- } else if (i > 0) {
- more();
- sprintf(buf, "cannot read .month version %d", i);
- ccol = print_message(buf, BELL);
- }
- show_all_events(current_date.month, current_date.year);
- keep_old = save_keep;
- }
-
- expand_aliases(names, list)
- char *names;
- struct name_rec **list;
- {
- struct name_rec *p, *q = NULL, *t;
- char *name, *look_up_name();
-
- name = strtok(names, " ,\t\n");
- while (name != NULL) {
- p = (struct name_rec *) malloc(sizeof(struct name_rec));
- p->name = strcpy(malloc((unsigned) strlen(name)+1), name);
- p->next_name = NULL;
- if (q == NULL)
- t = p;
- else
- q->next_name = p;
- q = p;
- name = strtok((char *)NULL, " ,\t\n");
- }
-
- p = t;
- while (p != NULL) {
- if ((names = look_up_name(p->name)) != NULL) {
- if (alias_level++ == MAX_ALIAS_LEVEL || /* to prevent loops */
- expand_aliases(names, list) == -1) {
- free(names);
- free_names(t);
- return(-1);
- }
- free(names);
- alias_level--;
- } else
- add_name(p->name, list);
- p = p->next_name;
- }
-
- free_names(t);
- return(0);
- }
-
- add_name(name, list)
- char *name;
- struct name_rec **list;
- {
- struct name_rec *p, *q;
-
- p = *list;
- while (p != NULL) {
- if (strcmp(p->name, name) == 0)
- return;
- q = p;
- p = p->next_name;
- }
-
- p = (struct name_rec *) malloc(sizeof(struct name_rec));
- p->name = strcpy(malloc((unsigned) strlen(name)+1), name);
- p->next_name = NULL;
-
- if (*list == NULL) {
- /* printf("add_name *%s* to empty list\n", p->name); */
- *list = p;
- } else {
- /* printf("add_name *%s*\n", p->name); */
- q->next_name = p;
- }
- }
-
- char *
- look_up_name(name)
- char *name;
- {
- char line[MAXLINE], *word;
-
- if (alias_file != NULL) {
- rewind(alias_file);
- while (fgets(line, MAXLINE, alias_file) != NULL) {
- line[strlen(line)-1] = '\0';
- if ((strcmp(strtok(line, " \t\n"), "alias") == 0) &&
- (strcmp(strtok((char *) NULL, " ,\t\n"), name) == 0) &&
- ((word = strtok((char *) NULL, " ,\t\n")) != NULL)) {
- *(word + strlen(word)) = ' ';
- /* printf("look_up_name: %s -> *%s*\n", name, word); */
- return(strcpy(malloc((unsigned) strlen(word)+1), word));
- }
- }
- }
-
- if (glob_alias_file != NULL) {
- rewind(glob_alias_file);
- while (fgets(line, MAXLINE, glob_alias_file) != NULL) {
- line[strlen(line)-1] = '\0';
- if ((strcmp(strtok(line, " \t\n"), "alias") == 0) &&
- (strcmp(strtok((char *) NULL, " ,\t\n"), name) == 0) &&
- ((word = strtok((char *) NULL, " ,\t\n")) != NULL)) {
- *(word + strlen(word)) = ' ';
- /* printf("look_up_name: %s -> *%s*\n", name, word); */
- return(strcpy(malloc((unsigned) strlen(word)+1), word));
- }
- }
- }
-
- return(NULL);
- }
-
- free_names(list)
- struct name_rec *list;
- {
- struct name_rec *p;
-
- while (list != NULL) {
- free(list->name);
- p = list->next_name;
- free((char *) list);
- list = p;
- }
- }
-
- post_event()
- {
- clear_message_line();
- push_area(SCHEDULE);
- current_event.start_date.month = current_date.month;
- current_event.start_date.day = current_date.day;
- current_event.start_date.year = current_date.year;
- current_event.event_owner = user_id;
- print_event(¤t_event);
- }
-
- write_sched()
- {
- int i;
-
- if (read_only) {
- print_message("read-only mode", BELL);
- return;
- }
-
- push_area(SCAN);
- if (update_schedule)
- ccol = print_message("updating schedule", NO_BELL);
- else
- ccol = print_message("schedule unchanged", NO_BELL);
-
- if (write_schedule() < 0) {
- more();
- ccol = print_message("cannot write .month", BELL);
- pop_area();
- return;
- }
-
- if ((i = read_schedule(month_dir, read_only)) == -2) {
- more();
- ccol = print_message(".month file locked", BELL);
- i = read_schedule(month_dir, READ_ONLY);
- if (i == 0)
- read_only = 1;
- }
-
- show_all_events(current_date.month, current_date.year);
-
- if (i != 0) {
- more();
- ccol = print_message("cannot open .month", BELL);
- }
- pop_area();
- }
-
- select_regularity_col(col)
- register col;
- {
- short i, hflag;
-
- switch(col) {
- case PRIVATE_COL:
- hl_all(¤t_event, (current_event.private ? 0 : 1),
- -1, -1, -1, -1, -1, -1, -1, -1);
- break;
- case ANTI_COL:
- hl_all(¤t_event, -1, (current_event.anti ? 0 : 1),
- -1, -1, -1, -1, -1, -1, -1);
- break;
- case MONTHLY_COL:
- hl_all(¤t_event, -1, -1,
- (current_event.monthly ? 0 : 1), 0, -1, -1, -1, -1, -1);
- break;
- case YEARLY_COL:
- hl_all(¤t_event, -1, -1, 0,
- (current_event.yearly ? 0 : 1), -1, -1, -1, -1, -1);
- break;
- case EVERY_COL:
- hl_all(¤t_event, -1, -1, -1, -1,
- (current_event.every ? 0 : 1), -1, -1, -1, -1);
- break;
- case NTH_COL:
- hl_all(¤t_event, -1, -1, -1, -1, -1,
- (current_event.nth_is_on ? 0 : 1), -1, -1, -1);
- break;
- case LAST_COL:
- hl_all(¤t_event, -1, -1, -1, -1, -1, -1,
- (current_event.last ? 0 : 1), -1, -1);
- break;
- case SMTWTFS_COL:
- case SMTWTFS_COL + 2:
- case SMTWTFS_COL + 4:
- case SMTWTFS_COL + 6:
- case SMTWTFS_COL + 8:
- case SMTWTFS_COL + 10:
- case SMTWTFS_COL + 12:
- i = (col - SMTWTFS_COL) / 2;
- hflag = (current_event.smtwtfs[i] = !current_event.smtwtfs[i]);
- hl_schedule(col, hflag);
- hl_all(¤t_event, -1, -1, -1, -1, -1, -1, -1, -1, -1);
- break;
- case UMONTH_COL:
- case UDAY_COL:
- case UYEAR_COL:
- hl_all(¤t_event, -1, -1, -1, -1, -1, -1, -1,
- (current_event.until ? 0 : 1), -1);
- break;
- }
- }
-
- accept_current_event()
- {
- if ((parse_event(¤t_event) != -1)) {
- if (!edit_flag) {
- pop_area();
- link_event(¤t_event);
- show_all_events(current_date.month, current_date.year);
- }
- }
- }
-
- cancel_current_event()
- {
- if (!edit_flag)
- pop_area();
- print_overview();
- }
-
- 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 (!date_ok(&event->start_date)) {
- print_message("invalid start date", BELL);
- return(-1);
- }
- if (event->until && !date_ok(&event->until_date)) {
- print_message("invalid until date", BELL);
- return(-1);
- }
- if ((event->every || event->nth_is_on || event->last) && !hs) {
- print_message("missing day of week", BELL);
- return(-1);
- }
- if (hs && !event->every && !event->nth_is_on && !event->last) {
- MQ: print_message("missing qualifier", BELL);
- return(-1);
- }
- if (!event->every &&
- (event->monthly || event->yearly) &&
- (event->nth_is_on || event->last)) {
- print_message("need 'every'", BELL);
- return(-1);
- }
- if (event->last && !event->monthly && !event->yearly) {
- print_message("monthly or yearly?", BELL);
- return(-1);
- }
- if ((event->nth_is_on || event->last || event->until) &&
- (!event->monthly && !event->yearly && !event->every)) {
- goto MQ;
- }
- parsed_correctly = 1;
- return(0);
- }
-
- is_event_today()
- /* are there any events today? */
- {
- struct event_rec *eptr;
-
- eptr = events.next_event;
- while (eptr) {
- if (event_today(eptr))
- return(1);
- eptr = eptr->next_event;
- }
-
- return(0);
- }
-
- get_daily_events(ep)
- struct eptr_rec **ep;
- {
- short i = 0;
- struct event_rec *eptr;
- struct eptr_rec *p, *q, *first_event;
-
- first_event = (struct eptr_rec *)NULL;
- q = (struct eptr_rec *)NULL;
-
- eptr = events.next_event;
- while (eptr) {
- if (event_today(eptr)) {
- i++;
- p = (struct eptr_rec *)malloc(sizeof(struct eptr_rec));
- p->event = eptr;
- p->next_event = (struct eptr_rec *)NULL;
- p->prev_event = q;
- if (q)
- q->next_event = p;
- else
- first_event = p;
- q = p;
- }
- eptr = eptr->next_event;
- }
-
- *ep = first_event;
- return(i);
- }
-
- get_every_event(ep)
- struct eptr_rec **ep;
- {
- short i = 0;
- struct event_rec *eptr;
- struct eptr_rec *p, *q, *first_event;
-
- first_event = (struct eptr_rec *)NULL;
- q = (struct eptr_rec *)NULL;
-
- eptr = events.next_event;
- while (eptr) {
- if (event_visible(eptr)) {
- i++;
- p = (struct eptr_rec *)malloc(sizeof(struct eptr_rec));
- p->event = eptr;
- p->next_event = (struct eptr_rec *)NULL;
- p->prev_event = q;
- if (q)
- q->next_event = p;
- else
- first_event = p;
- q = p;
- }
- eptr = eptr->next_event;
- }
-
- *ep = first_event;
- return(i);
- }
-
- event_visible(event)
- register struct event_rec *event;
- {
- /* returns 1 if event is visible, 0 if not */
-
- return(my_file || !event->private || (user_id == event->event_owner));
- }
-
- scan_todays_events()
- {
- struct eptr_rec *events_today;
- short n;
-
- if ((n = get_daily_events(&events_today)) <= 0) {
- print_message("no events this day", BELL);
- return;
- }
- sort_events(events_today, n);
-
- scan_events(&events_today);
- free_event_ptrs(events_today);
- print_overview();
- }
-
- scan_every_event()
- {
- struct eptr_rec *first_event;
-
- if (get_every_event(&first_event) <= 0) {
- print_message("no events at all", BELL);
- return;
- }
-
- scan_events(&first_event);
- free_event_ptrs(first_event);
- print_overview();
- }
-
- scan_events(first_event_p)
- struct eptr_rec **first_event_p;
- {
- register short ch;
- struct event_rec *ptr;
- struct eptr_rec *p, *q;
-
- push_area(SCHED_SCAN);
- p = *first_event_p;
- while (p) {
- ptr = p->event;
- current_event = *ptr;
- print_event(ptr);
-
- ch = get_npdeq(p->next_event != NULL, p->prev_event != NULL,
- !read_only && (my_file || (ptr->event_owner == user_id)));
-
- switch(ch) {
- case 'n':
- p = p->next_event;
- break;
- case 'p':
- p = p->prev_event;
- break;
- case 'd':
- delete_event(ptr);
- show_all_events(current_date.month, current_date.year);
- if (p->prev_event)
- p->prev_event->next_event = p->next_event;
- else
- *first_event_p = p->next_event;
- if (p->next_event) {
- p->next_event->prev_event = p->prev_event;
- q = p->next_event;
- } else
- q = p->prev_event;
- free((char *)p);
- p = q;
- break;
- case 'e':
- edit_flag = 1;
- push_area(SCHEDULE);
- parsed_correctly = 0;
- while (!parsed_correctly)
- if (user() == ACCEPT) {
- if (parsed_correctly) {
- *ptr = current_event;
- show_all_events(current_date.month,
- current_date.year);
- update_schedule++;
- }
- } else {
- print_event(ptr);
- break;
- }
- pop_area();
- edit_flag = 0;
- break;
- case 'q':
- p = (struct eptr_rec *)NULL;
- break;
- }
- }
- pop_area();
- clear_message_line();
- }
-
- 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 eptr_rec *e;
- int n;
- {
- register struct event_rec *ev, *nev;
- register struct eptr_rec *ev_ptr;
- register i;
- short f;
-
- for (i = 0; i < n; i++) {
- f = 0;
- ev_ptr = e;
- while (ev_ptr->next_event) {
- ev = ev_ptr->event;
- nev = ev_ptr->next_event->event;
- if ((ev->start_time.hour > nev->start_time.hour) ||
- ((ev->start_time.hour == nev->start_time.hour) &&
- (ev->start_time.minute > nev->start_time.minute))) {
- ev_ptr->event = nev;
- ev_ptr->next_event->event = ev;
- f++;
- }
- ev_ptr = ev_ptr->next_event;
- }
- if (f == 0)
- break;
- }
- }
-
- free_event_ptrs(eptr)
- struct eptr_rec *eptr;
- {
- while (eptr) {
- free((char *)eptr);
- eptr = eptr->next_event;
- }
- }
-
- show_all_events(month, year)
- register month, year;
- {
- register struct event_rec *eptr;
- short i;
- char match_list[32];
- short tday;
-
- month_start = get_month_start(month, year);
- days = days_in(month, year);
-
- if (all_flag) {
- tday = current_date.day;
- for (i = 1; i <= days; i++) {
- eptr = events.next_event;
- match_list[i] = 0;
- current_date.day = i;
-
- while (eptr) {
- if (event_today(eptr)) {
- match_list[i] = 1;
- break;
- }
- eptr = eptr->next_event;
- }
- }
- current_date.day = tday;
- print_cal(month, year, match_list);
- } else
- print_cal(month, year, (char *)0);
-
- if (current_area != SCHEDULE && current_area != SCHED_SCAN)
- print_overview();
- }
-
- #if !SYS5
- char *
- strtok(s1, s2)
- char *s1, *s2;
- {
- static char *pos;
- char *p, *q;
-
- if (s1 != (char *)NULL)
- pos = s1;
-
- if (*pos == '\0')
- return((char *)NULL);
-
- for (p = pos; *p != '\0'; p++) {
- if (index(s2, (int) *p) == (char *)NULL)
- continue;
- *p = '\0';
- q = pos;
- for (pos = ++p; *pos != '\0' && index(s2, (int) *pos) != (char *)NULL;
- pos++);
- if (*pos == '\0')
- return((char *)NULL);
- return(q);
- }
- q = pos;
- pos = (char *)NULL;
- return(q);
- }
- #endif
- @EOF
-
- chmod 644 schedule.c
-
- echo x - time.c
- cat >time.c <<'@EOF'
- #ifndef lint
- static char rcsid[] = "$Header: time.c,v 8.2 87/11/13 21:47:20 hull Exp $";
- #endif
-
- #include "month.h"
-
- extern struct date_rec current_date;
-
- void
- convert_year(base_year, year)
- short base_year, *year;
- {
- short delta;
-
- if (*year < 100) {
- *year += base_year - (base_year % 100);
- if ((delta = (*year - base_year)) >= 50)
- *year -= 100;
- else if (delta < -50)
- *year += 100;
- }
- }
-
- date_ok(date)
- struct date_rec *date;
- {
- if (date->day <= days_in(date->month, date->year))
- return(1);
- else
- return(0);
- }
-
- has_smtwtfs(smtwtfs)
- register char *smtwtfs;
- {
- register i;
-
- for (i = 0; i < 7; i++) {
- if (smtwtfs[i]) {
- return(1);
- }
- }
- return(0);
- }
-
- days_since_jan1(date)
- struct date_rec *date;
- {
- int dys = 0;
- short i;
-
- for (i = 1; i < date->month; i++) {
- dys += days_in(i, date->year);
- }
- dys += date->day;
- return(dys);
- }
-
- incr_date(inc, date)
- short inc;
- struct date_rec *date;
- {
- /* return in date the increment (or decrement) of the current date */
- /* return 1 if incr successful, 0 if not */
-
- date->month = current_date.month;
- date->day = current_date.day;
- date->year = current_date.year;
-
- while (inc > 0) {
- if (date->day < days_in(date->month, date->year))
- date->day = date->day + 1;
- else {
- if (date->month < 12) {
- date->month = date->month + 1;
- date->day = 1;
- } else {
- if (date->year < LAST_YEAR) {
- date->month = 1;
- date->day = 1;
- date->year = date->year + 1;
- } else
- return(0);
- }
- }
- inc--;
- }
-
- while (inc < 0) {
- if (date->day > 1)
- date->day = date->day - 1;
- else {
- if (date->month > 1) {
- date->month = date->month - 1;
- date->day = days_in(date->month, date->year);
- } else {
- if (date->year > FIRST_YEAR) {
- date->month = 12;
- date->year = date->year - 1;
- date->day = days_in(date->month, date->year);
- } else
- return(0);
- }
- }
- inc++;
- }
- return(1);
- }
-
- compute_times(event, mode)
- struct event_rec *event;
- char mode;
- {
- switch(mode) {
- case START_MODE:
- event->start_time.minute = 60 + event->end_time.minute -
- event->duration.minute;
- event->start_time.hour = (23 + event->end_time.hour -
- event->duration.hour + (event->start_time.minute / 60)) % 24;
- event->start_time.minute %= 60;
- break;
- case DURATION_MODE:
- event->duration.minute = 60 + event->end_time.minute -
- event->start_time.minute;
- event->duration.hour = (23 + event->end_time.hour -
- event->start_time.hour + (event->duration.minute / 60)) % 24;
- event->duration.minute %= 60;
- break;
- case END_MODE:
- event->end_time.minute = event->start_time.minute +
- event->duration.minute;
- event->end_time.hour = (event->start_time.hour +
- event->duration.hour + (event->end_time.minute / 60)) % 24;
- event->end_time.minute %= 60;
- break;
- }
- }
- @EOF
-
- chmod 644 time.c
-
- echo x - user.c
- cat >user.c <<'@EOF'
- #ifndef lint
- static char rcsid[] = "$Header: user.c,v 8.2 87/11/13 21:47:22 hull Exp $";
- #endif
-
- #include <curses.h>
- #if SYS5
- #include <string.h>
- #else
- #include <strings.h>
- #endif
- #include "month.h"
-
- extern short area_ptr, crow, ccol, edit_flag, read_only, over_flag;
- extern short my_file, event_status;
- extern struct area_rec areas[];
- extern struct date_rec current_date, todays_date, mdates[];
- extern struct event_rec current_event;
-
- user()
- {
- register short ch;
- short n, savecol;
- char *prompt, *incrp, iprompt[BUFSIZE];
-
- for (;;) {
- move(crow, ccol);
- refresh();
-
- GETCH:
- ch = get_char();
- /*
- mvprintw(0, 0, "ch = %c (0x%x)", ch, ch);
- move(crow, ccol);
- refresh();
- */
-
- switch(ch) {
- case '\001': /* ^A */
- if (current_area == SCHEDULE) {
- accept_current_event();
- if (edit_flag)
- return(ACCEPT);
- } else
- sound_bell();
- break;
- case '\033': /* ^[ */
- if (current_area == SCHEDULE) {
- cancel_current_event();
- if (edit_flag)
- return(CANCEL);
- } else
- sound_bell();
- break;
- case '/':
- if (current_area != SCHEDULE) {
- prompt = "date: ";
- if (get_date(¤t_date, prompt))
- goto_this_day(¤t_date);
- } else if (crow == SCHEDULE_ROW) {
- savecol = ccol;
- if (ccol <= SYEAR_COL) {
- prompt = "start date: ";
- if (get_date(¤t_event.start_date, prompt))
- print_date(¤t_event);
- } else if (ccol >= UMONTH_COL) {
- prompt = "until date: ";
- if (get_date(¤t_event.until_date,
- prompt)) {
- current_event.until = 1;
- print_until(¤t_event);
- }
- } else
- sound_bell();
- ccol = savecol;
- } else
- sound_bell();
- break;
- case ';':
- if (current_area != SCHEDULE)
- goto_this_day(&mdates[SEMI_MARK]);
- else
- sound_bell();
- break;
- case '?':
- if (current_area != SCHEDULE)
- help();
- else
- sound_bell();
- break;
- case '+':
- case '-':
- incrp = (ch == '+') ? "increment: " : "decrement: ";
- switch(current_area) {
- case MONTHS:
- strcpy(iprompt, "month ");
- strcat(iprompt, incrp);
- break;
- case DAYS:
- strcpy(iprompt, "day ");
- strcat(iprompt, incrp);
- break;
- case YEARS:
- strcpy(iprompt, "year ");
- strcat(iprompt, incrp);
- break;
- case SCHEDULE:
- if (crow == SCHEDULE_ROW) {
- switch(ccol) {
- case SMONTH_COL:
- case UMONTH_COL:
- strcpy(iprompt, "month ");
- strcat(iprompt, incrp);
- break;
- case SDAY_COL:
- case UDAY_COL:
- strcpy(iprompt, "day ");
- strcat(iprompt, incrp);
- break;
- case SYEAR_COL:
- case UYEAR_COL:
- strcpy(iprompt, "year ");
- strcat(iprompt, incrp);
- break;
- case NTH_COL:
- strcpy(iprompt, "nth ");
- strcat(iprompt, incrp);
- break;
- default:
- sound_bell();
- goto GETCH;
- }
- } else { /* must be on TIME_ROW */
- switch(ccol) {
- case START_COL:
- case DURATION_COL:
- case END_COL:
- case WARNING_COL:
- strcpy(iprompt, "hour ");
- strcat(iprompt, incrp);
- break;
- case START_COL+3:
- case DURATION_COL+3:
- case END_COL+3:
- case WARNING_COL+3:
- strcpy(iprompt, "minute ");
- strcat(iprompt, incrp);
- break;
- default:
- sound_bell();
- goto GETCH;
- }
- }
- break;
- }
- if ((n = enter_number(ch, iprompt)) >= 0)
- do_incr((ch == '+') ? n : -n);
- break;
- #if SHELL_ESCAPE
- case '!':
- if (current_area != SCHEDULE)
- shell_escape();
- else
- sound_bell();
- break;
- #endif
- case '\n':
- if ((n = selection()) != NOTHING)
- return(n);
- break;
- case 'a':
- if (current_area != SCHEDULE)
- print_aliases();
- else
- sound_bell();
- break;
- case 'd':
- case 'm':
- case 'y':
- if (current_area != SCHEDULE) {
- pop_area();
- push_area(ch);
- } else
- sound_bell();
- break;
- case 'h':
- case 'j':
- case 'k':
- case 'l':
- event_status = NOTHING;
- move_cursor(ch);
- switch(event_status) {
- case ACCEPT:
- accept_current_event();
- if (edit_flag)
- return(event_status);
- break;
- case CANCEL:
- cancel_current_event();
- if (edit_flag)
- return(event_status);
- break;
- }
- break;
- case 'n':
- case 'p':
- case ' ':
- case '\b':
- if (current_area == SCHEDULE)
- do_incr_sched((ch == 'n' || ch == ' ') ? 1: -1);
- else
- do_incr((ch == 'n' || ch == ' ') ? 1: -1);
- break;
- case 't':
- if (current_area == SCHEDULE)
- change_time_mode();
- else
- sound_bell();
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- switch(current_area) {
- case DAYS:
- prompt = "day: ";
- break;
- case MONTHS:
- prompt = "month: ";
- break;
- case YEARS:
- prompt = "year: ";
- break;
- case SCHEDULE:
- if (crow == SCHEDULE_ROW) {
- switch(ccol) {
- case SMONTH_COL:
- case UMONTH_COL:
- prompt = "month: ";
- break;
- case SDAY_COL:
- case UDAY_COL:
- prompt = "day: ";
- break;
- case SYEAR_COL:
- case UYEAR_COL:
- prompt = "year: ";
- break;
- case NTH_COL:
- prompt = "nth: ";
- break;
- default:
- goto GETCH;
- }
- } else { /* must be on TIME_ROW */
- switch(ccol) {
- case START_COL:
- case DURATION_COL:
- case END_COL:
- case WARNING_COL:
- prompt = "hour: ";
- break;
- case START_COL+3:
- case DURATION_COL+3:
- case END_COL+3:
- case WARNING_COL+3:
- prompt = "minute: ";
- break;
- default:
- sound_bell();
- goto GETCH;
- }
- }
- break;
- }
- if ((n = enter_number(ch, prompt)) >= 0)
- do_number(n);
- break;
- case 'A':
- if (current_area != SCHEDULE) {
- toggle_flag('A');
- show_all_events(current_date.month,
- current_date.year);
- } else
- sound_bell();
- break;
- case 'B':
- if (current_area != SCHEDULE)
- print_sched();
- else
- sound_bell();
- break;
- case 'C':
- if (current_area != SCHEDULE) {
- if (!over_flag)
- clear_schedule_area();
- clear_message_line();
- } else
- sound_bell();
- break;
- case 'E':
- if (current_area != SCHEDULE)
- scan_every_event();
- else
- sound_bell();
- break;
- case 'G':
- if (current_area != SCHEDULE)
- group_post();
- else
- sound_bell();
- break;
- case 'K':
- if (current_area != SCHEDULE)
- if (!my_file)
- print_message("must keep old events", BELL);
- else
- toggle_flag('K');
- else
- sound_bell();
- break;
- case 'L':
- if (current_area != SCHEDULE)
- lunar();
- else
- sound_bell();
- break;
- case 'M':
- case '\'':
- if (current_area != SCHEDULE)
- mark_day((ch != 'M'));
- else
- sound_bell();
- break;
- case 'O':
- if (current_area != SCHEDULE) {
- toggle_flag('O');
- print_overview();
- } else
- sound_bell();
- break;
- case 'P':
- if (current_area != SCHEDULE)
- if (read_only)
- print_message("read-only mode", BELL);
- else
- post_event();
- else
- sound_bell();
- break;
- case 'Q':
- if (current_area != SCHEDULE)
- return(ACCEPT);
- else
- sound_bell();
- break;
- #if MULTIUSER
- case 'R':
- if (current_area != SCHEDULE)
- do_read_mode();
- else
- sound_bell();
- break;
- #endif MULTIUSER
- case 'S':
- if (current_area != SCHEDULE)
- scan_todays_events();
- else
- sound_bell();
- break;
- case 'T':
- if (current_area != SCHEDULE)
- goto_this_day(&todays_date);
- else
- sound_bell();
- break;
- #if MULTIUSER
- case 'U':
- if (current_area != SCHEDULE)
- get_user();
- else
- sound_bell();
- break;
- #endif MULTIUSER
- case 'V':
- if (current_area != SCHEDULE)
- print_version();
- else
- sound_bell();
- break;
- case 'W':
- if (current_area != SCHEDULE)
- write_sched();
- else
- sound_bell();
- break;
- default:
- sound_bell();
- goto GETCH;
- }
-
- if ((current_date.month != mdates[CUR_MARK].month) ||
- (current_date.day != mdates[CUR_MARK].day) ||
- (current_date.year != mdates[CUR_MARK].year)) {
- mdates[SEMI_MARK] = mdates[CUR_MARK];
- mdates[CUR_MARK].month = current_date.month;
- mdates[CUR_MARK].day = current_date.day;
- mdates[CUR_MARK].year = current_date.year;
- }
- }
- /* NOTREACHED */
- }
- @EOF
-
- chmod 644 user.c
-
- echo x - user2.c
- cat >user2.c <<'@EOF'
- #ifndef lint
- static char rcsid[] = "$Header: user2.c,v 8.4 88/04/04 10:13:30 hull Exp $";
- #endif
-
- #include <signal.h>
- #include <curses.h>
- #include "month.h"
-
- extern short delchar, kilchar, update_schedule;
- extern short all_flag, ins_mode, keep_old, over_flag, read_only;
- extern short crow, ccol, days;
- extern short area_ptr;
- extern unsigned short getgid(), getegid();
- extern int user_id;
- extern char time_mode, *home_dir, *month_dir;
- extern struct area_rec areas[];
- extern struct date_rec current_date, todays_date, mdates[];
- extern struct event_rec current_event;
-
- selection()
- {
- switch(current_area) {
- case MONTHS:
- if ((crow - MONTH_ROW) != current_date.month - 1) {
- hl_month(current_date.month, HL_OFF);
- current_date.month = crow - MONTH_ROW + 1;
- show_all_events(current_date.month,
- current_date.year);
- hl_month(current_date.month, HL_ON);
- }
- break;
- case DAYS:
- hl_day(current_date.day, HL_OFF);
- current_date.day = get_day_from_row_col(crow, ccol);
- hl_day(current_date.day, HL_ON);
- print_overview();
- break;
- case YEARS:
- hl_year(current_date.year, HL_OFF);
- current_date.year = current_date.year -
- (current_date.year % 10) +
- ((ccol - (YEAR_COL + 4)) / 6);
- hl_year(current_date.year, HL_ON);
- show_all_events(current_date.month, current_date.year);
- break;
- case SCHEDULE:
- if (crow == SCHEDULE_ROW)
- select_regularity_col(ccol);
- else
- schedule_move_cursor('\n');
- break;
- }
- return(NOTHING);
- }
-
- enter_number(ch, prompt)
- short ch;
- char *prompt;
- {
- char nbuf[BUFSIZE];
- short i = 0, max_digits = 2;
- int retval = -1;
-
- if (current_area == YEARS) {
- max_digits = 4;
- push_area(SCAN);
- } else if (current_area == SCHEDULE) {
- if (ccol == SYEAR_COL || ccol == UYEAR_COL)
- max_digits = 4;
- push_area(SCHED_SCAN);
- } else
- push_area(SCAN);
-
- ccol = print_message(prompt, NO_BELL);
-
- for (;;) {
- if ((ch >= '0') && (ch <= '9')) {
- if (i < max_digits) {
- nbuf[i++] = ch;
- mvaddch(0, ccol++, ch);
- refresh();
- }
- } else if (ch == '\n') {
- nbuf[i] = 0;
- retval = atoi(nbuf);
- break;
- } else if (ch == '\b') {
- if (i > 0) {
- i--; ccol--;
- mvaddch(0, ccol, ' ');
- move(0, ccol);
- refresh();
- }
- } else if (ch == '\033') { /* ^[ */
- break;
- }
- ch = get_char();
- }
- clear_message_line();
- pop_area();
- return(retval);
- }
-
- do_number(n)
- short n;
- {
- void convert_year();
-
- switch(current_area) {
- case MONTHS:
- if (n <= 12 && n >= 1) {
- hl_month(current_date.month, HL_OFF);
- current_date.month = n;
- show_all_events(current_date.month, current_date.year);
- hl_month(current_date.month, HL_ON);
- goto_month();
- }
- break;
- case DAYS:
- if (n >= 1 && n <= days) {
- hl_day(current_date.day, HL_OFF);
- current_date.day = n;
- hl_day(current_date.day, HL_ON);
- print_overview();
- goto_day();
- }
- break;
- case YEARS:
- convert_year(current_date.year, &n);
- current_date.year = n;
- print_all_years();
- show_all_events(current_date.month, current_date.year);
- goto_year();
- break;
- case SCHEDULE:
- if (crow == SCHEDULE_ROW) {
- switch(ccol) {
- case SMONTH_COL:
- if (n >= 1 && n <= 12)
- current_event.start_date.month = n;
- print_date(¤t_event);
- break;
- case SDAY_COL:
- if (n >= 1 && n <= 31)
- current_event.start_date.day = n;
- print_date(¤t_event);
- break;
- case SYEAR_COL:
- convert_year(current_date.year, &n);
- if (n >= FIRST_YEAR && n <= LAST_YEAR)
- current_event.start_date.year = n;
- print_date(¤t_event);
- break;
- case UMONTH_COL:
- if (n >= 1 && n <= 12) {
- current_event.until_date.month = n;
- current_event.until = 1;
- }
- print_until(¤t_event);
- break;
- case UDAY_COL:
- if (n >= 1 && n <= 31) {
- current_event.until_date.day = n;
- current_event.until = 1;
- }
- print_until(¤t_event);
- break;
- case UYEAR_COL:
- convert_year(current_date.year, &n);
- if (n >= FIRST_YEAR && n <= LAST_YEAR) {
- current_event.until_date.year = n;
- current_event.until = 1;
- }
- print_until(¤t_event);
- break;
- case NTH_COL:
- if (n > 0 && n <= 53) {
- current_event.nth = n;
- current_event.nth_is_on = 1;
- print_nth(¤t_event);
- }
- break;
- default:
- sound_bell();
- break;
- }
- } else { /* must be on TIME_ROW */
- switch(ccol) {
- case START_COL:
- if (n < 24) {
- current_event.start_time.hour = n;
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- }
- break;
- case DURATION_COL:
- if (n < 24) {
- current_event.duration.hour = n;
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- }
- break;
- case END_COL:
- if (n < 24) {
- current_event.end_time.hour = n;
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- }
- break;
- case WARNING_COL:
- if (n < 24) {
- current_event.warning.hour = n;
- print_warning(¤t_event);
- }
- break;
- case START_COL+3:
- if (n < 60) {
- current_event.start_time.minute = n;
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- }
- break;
- case DURATION_COL+3:
- if (n < 60) {
- current_event.duration.minute = n;
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- }
- break;
- case END_COL+3:
- if (n < 60) {
- current_event.end_time.minute = n;
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- }
- break;
- case WARNING_COL+3:
- if (n < 60) {
- current_event.warning.minute = n;
- print_warning(¤t_event);
- }
- break;
- default:
- sound_bell();
- break;
- }
- }
- break;
- }
- }
-
- do_incr_sched(dir)
- register dir;
- {
- if (crow == TIME_ROW) {
- switch(ccol) {
- case START_COL:
- case DURATION_COL:
- case END_COL:
- case WARNING_COL:
- do_incr(dir);
- break;
- case START_COL+3:
- case DURATION_COL+3:
- case END_COL+3:
- case WARNING_COL+3:
- do_incr(15 * dir);
- break;
- default:
- sound_bell();
- break;
- }
- } else /* must be on SCHEDULE_ROW */
- do_incr(dir);
- }
-
- do_incr(n)
- short n;
- {
- short shift;
-
- switch(current_area) {
- case MONTHS:
- hl_month(current_date.month, HL_OFF);
- if (n < 0)
- shift = -((abs(n) / 12) +
- ((current_date.month - (abs(n) % 12) < 1) ? 1 : 0));
- else
- shift = (n / 12) +
- ((current_date.month + (n % 12) > 12) ? 1 : 0);
-
- current_date.year += shift;
- if (print_all_years())
- mod(¤t_date.month, 1, 12, n);
- show_all_events(current_date.month, current_date.year);
- hl_month(current_date.month, HL_ON);
- goto_month();
- break;
- case DAYS:
- hl_month(current_date.month, HL_OFF);
- (void) incr_date(n, ¤t_date);
- print_all_years();
- hl_month(current_date.month, HL_ON);
- show_all_events(current_date.month, current_date.year);
- goto_day();
- break;
- case YEARS:
- hl_month(current_date.month, HL_OFF);
- current_date.year += n;
- print_all_years();
- hl_month(current_date.month, HL_ON);
- show_all_events(current_date.month, current_date.year);
- goto_year();
- break;
- case SCHEDULE:
- if (crow == SCHEDULE_ROW) {
- switch(ccol) {
- case SMONTH_COL:
- mod(¤t_event.start_date.month, 1, 12, n);
- print_date(¤t_event);
- break;
- case SDAY_COL:
- mod(¤t_event.start_date.day, 1, 31, n);
- print_date(¤t_event);
- break;
- case SYEAR_COL:
- mod(¤t_event.start_date.year, FIRST_YEAR,
- LAST_YEAR, n);
- print_date(¤t_event);
- break;
- case UMONTH_COL:
- mod(¤t_event.until_date.month, 1, 12, n);
- current_event.until = 1;
- print_until(¤t_event);
- break;
- case UDAY_COL:
- mod(¤t_event.until_date.day, 1, 31, n);
- current_event.until = 1;
- print_until(¤t_event);
- break;
- case UYEAR_COL:
- mod(¤t_event.until_date.year, FIRST_YEAR,
- LAST_YEAR, n);
- current_event.until = 1;
- print_until(¤t_event);
- break;
- case NTH_COL:
- modc(¤t_event.nth, 0, 53, n);
- current_event.nth_is_on = 1;
- print_nth(¤t_event);
- break;
- default:
- sound_bell();
- break;
- }
- } else { /* must be on TIME_ROW */
- switch(ccol) {
- case START_COL:
- mod(¤t_event.start_time.hour, 0, 23, n);
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- break;
- case DURATION_COL:
- mod(¤t_event.duration.hour, 0, 23, n);
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- break;
- case END_COL:
- mod(¤t_event.end_time.hour, 0, 23, n);
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- break;
- case WARNING_COL:
- mod(¤t_event.warning.hour, 0, 23, n);
- print_warning(¤t_event);
- break;
- case START_COL+3:
- mod(¤t_event.start_time.minute, 0, 59, n);
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- break;
- case DURATION_COL+3:
- mod(¤t_event.duration.minute, 0, 59, n);
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- break;
- case END_COL+3:
- mod(¤t_event.end_time.minute, 0, 59, n);
- compute_times(¤t_event, time_mode);
- print_times(¤t_event);
- break;
- case WARNING_COL+3:
- mod(¤t_event.warning.minute, 0, 59, n);
- print_warning(¤t_event);
- break;
- default:
- sound_bell();
- break;
- }
- }
- break;
- }
- }
-
- prompt_wait()
- {
- move(LINES-1, 0);
- clrtoeol();
- standout();
- addstr("Press any key to return to calendar ");
- standend();
- refresh();
- (void) get_char();
- }
-
- more()
- {
- if (ccol != 0) {
- standout();
- addstr(" -more-");
- standend();
- ccol += 7;
- refresh();
- (void) get_char();
- }
- }
-
- mark_day(goto_flag)
- short goto_flag;
- {
- short ch;
-
- print_message("mark: ", NO_BELL);
-
- for (;;) {
- ch = get_char();
-
- switch(ch) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- mvaddch(0, 6, ch);
- refresh();
- ch -= '0';
-
- if (goto_flag)
- goto_this_day(&mdates[ch]);
- else {
- mdates[ch].month = current_date.month;
- mdates[ch].day = current_date.day;
- mdates[ch].year = current_date.year;
- }
- return;
- case '\033': /* ^[ */
- case '\n':
- clear_message_line();
- return;
- }
- }
- }
-
- toggle_flag(flag_char)
- char flag_char;
- {
- switch(flag_char) {
- case 'A':
- all_flag = !all_flag;
- break;
- case 'I':
- ins_mode = !ins_mode;
- break;
- case 'K':
- keep_old = !keep_old;
- break;
- case 'O':
- over_flag = !over_flag;
- break;
- case 'R':
- read_only = !read_only;
- break;
- }
-
- print_flags();
- }
-
- mod(var, min, max, inc)
- short *var, min, max, inc;
- {
- if (inc > 0)
- *var = ((*var - min + inc) % (max - min + 1)) + min;
- else
- *var = ((*var - min + (max - min + 1) -
- (abs(inc) % (max - min + 1))) % (max - min + 1)) + min;
- }
-
- modc(var, min, max, inc)
- char *var;
- short min, max, inc;
- {
- if (inc > 0)
- *var = (char) ((*var - min + inc) % (max - min + 1)) + min;
- else
- *var = (char) ((*var - min + (max - min + 1) -
- (abs(inc) % (max - min + 1))) % (max - min + 1)) + min;
- }
-
- #if MULTIUSER
- do_read_mode()
- {
- int i;
- char buf[BUFSIZE];
-
- if (read_only) {
- if ((i = read_schedule(month_dir, READ_WRITE)) == 0)
- toggle_flag('R');
- else if (i == -2) {
- print_message(".month file locked", BELL);
- i = read_schedule(month_dir, READ_ONLY);
- }
-
- if (i != 0)
- if (i == -1)
- print_message("cannot open .month", BELL);
- else {
- sprintf(buf, "cannot read .month version %d", i);
- print_message(buf, BELL);
- }
- } else /* read/write */ {
- push_area(SCAN);
- if (update_schedule)
- ccol = print_message("updating schedule", NO_BELL);
- else
- ccol = print_message("schedule unchanged", NO_BELL);
-
- if (write_schedule() < 0) {
- more();
- print_message("cannot write .month", BELL);
- pop_area();
- return;
- }
- toggle_flag('R');
- pop_area();
- }
-
- show_all_events(current_date.month, current_date.year);
- }
- #endif MULTIUSER
-
- help()
- {
- char *buf;
- int blast_out(), terminate();
-
- push_area(HELP);
- clear();
- refresh();
- buf = malloc((unsigned) (strlen(PG) + strlen(HELPFILE) + 2));
- sprintf(buf, "%s %s", PG, HELPFILE);
- do_system(buf);
- prompt_wait();
- clear();
- print_screen();
- pop_area();
- new_day(); /* may be new day now */
- }
-
- print_aliases()
- {
- char *alias_file_name, *buf;
- extern char *strcat(), *strcpy();
-
- alias_file_name = malloc((unsigned) strlen(month_dir)+10);
- strcpy(alias_file_name, month_dir);
- strcat(alias_file_name, "/.monthrc");
-
- push_area(ALIAS);
- clear();
- refresh();
- buf = malloc((unsigned) (strlen(PG) + strlen(alias_file_name) +
- strlen(ALIASFILE) + 3));
- sprintf(buf, "%s %s %s", PG, alias_file_name, ALIASFILE);
- free(alias_file_name);
- do_system(buf);
- prompt_wait();
- clear();
- print_screen();
- pop_area();
- new_day(); /* may be new day now */
- }
-
- #if SHELL_ESCAPE
- shell_escape()
- {
- char *buf;
-
- buf = malloc((unsigned) (strlen(SH) + 1));
- sprintf(buf, "%s", SH);
- clear();
- mvprintw(0, 0, "!%s\n", buf);
- refresh();
- endwin();
- do_system(buf);
- initscr();
- crmode();
- noecho();
- #if SYS5CURSES
- keypad(stdscr, TRUE);
- #endif
- clear();
- print_screen();
- new_day(); /* may be new day now */
- }
- #endif
-
- do_system(buf)
- char *buf;
- {
- int gid, egid;
- int blast_out(), terminate();
- alarm_t alarm();
-
- alarm((alarm_t) 0);
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- signal(SIGHUP, SIG_DFL);
- signal(SIGALRM, SIG_DFL);
- gid = (int) getgid(); /* get original group */
- egid = (int) getegid(); /* get group month */
- setgid(gid); /* change to original group */
- system(buf);
- setgid(egid); /* restore group month */
- free(buf);
- signal(SIGINT, blast_out);
- signal(SIGQUIT, blast_out);
- signal(SIGHUP, terminate);
- }
-
- lunar()
- {
- long yday, calculate();
-
- yday = (long) (days_since_jan1(¤t_date) + 1);
- (void) calculate(yday, ((long) (current_date.year - 1900)),
- 11L, 0L);
- push_area(LUNAR);
- draw();
- prompt_wait();
- clear();
- print_screen();
- pop_area();
- }
-
- change_time_mode()
- {
- short i, *cols;
-
- static short time_cols[] = {
- START_COL, START_COL+3, DURATION_COL, DURATION_COL+3,
- END_COL, END_COL+3, WARNING_COL, WARNING_COL+3
- };
- static short start_cols[] = {
- DURATION_COL, DURATION_COL+3, DURATION_COL, DURATION_COL+3,
- END_COL, END_COL+3, WARNING_COL, WARNING_COL+3
- };
- static short duration_cols[] = {
- START_COL, START_COL+3, END_COL, END_COL+3,
- END_COL, END_COL+3, WARNING_COL, WARNING_COL+3
- };
- static short end_cols[] = {
- START_COL, START_COL+3, DURATION_COL, DURATION_COL+3,
- START_COL, START_COL+3, WARNING_COL, WARNING_COL+3
- };
-
- switch(time_mode) {
- case START_MODE:
- cols = end_cols;
- time_mode = END_MODE;
- break;
- case DURATION_MODE:
- cols = start_cols;
- time_mode = START_MODE;
- break;
- case END_MODE:
- cols = duration_cols;
- time_mode = DURATION_MODE;
- break;
- }
-
- if (crow == TIME_ROW) {
- i = 0;
- while(time_cols[i] != ccol)
- i++;
- ccol = *(cols+i);
- }
-
- print_times(¤t_event);
- }
- @EOF
-
- chmod 644 user2.c
-
- exit 0
-
-