home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume16 / month8.7 / part04 < prev    next >
Text File  |  1988-11-08  |  21KB  |  893 lines

  1. Subject:  v16i057:  A visual calendar and appointment system, Part04/06
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: Michael Morrell <hplabs!hpda!morrell>
  7. Posting-number: Volume 16, Issue 57
  8. Archive-name: month8.7/part04
  9.  
  10. # This is a shell archive.  Remove anything before this line,
  11. # then unpack it by saving it in a file and typing "sh file".
  12. # This archive contains:
  13. #    days_in.c    event_today.c    get_home.c    get_month.c    
  14. #    get_today.c    hidden.c    how_many.c    is_future.c    
  15. #    is_leap.c    is_past.c    jan1.c        matches.c    
  16. #    read_sched.c    write_sched.c    version.c    
  17. LANG=""; export LANG
  18.  
  19. echo x - days_in.c
  20. cat >days_in.c <<'@EOF'
  21. #ifndef lint
  22. static char rcsid[] = "$Header: days_in.c,v 8.2 87/11/13 21:46:25 hull Exp $";
  23. #endif
  24.  
  25. days_in(month, year)
  26. short month, year;
  27. {
  28.     switch(month) {
  29.     case 1:
  30.     case 3:
  31.     case 5:
  32.     case 7:
  33.     case 8:
  34.     case 10:
  35.     case 12:
  36.         return(31);
  37.     case 4:
  38.     case 6:
  39.     case 9:
  40.     case 11:
  41.         return(30);
  42.     case 2:
  43.         return(28 + is_leap_year(year));
  44.     }
  45.     /* NOTREACHED */
  46. }
  47. @EOF
  48.  
  49. chmod 644 days_in.c
  50.  
  51. echo x - event_today.c
  52. cat >event_today.c <<'@EOF'
  53. #ifndef lint
  54. static char rcsid[] = "$Header: event_today.,v 8.2 87/11/13 21:46:29 hull Exp $";
  55. #endif
  56.  
  57. #include "month.h"
  58.  
  59. extern struct date_rec current_date;
  60. extern short my_file;
  61. extern int user_id;
  62.  
  63. event_today(event)
  64. register struct event_rec *event;
  65. {
  66.     /* returns 1 if event is visible on the current day, 0 if not */
  67.  
  68.     /* check if this in an anti-event */
  69.  
  70.     if (event->anti)
  71.         return(0);
  72.  
  73.     /* check if the file belongs to this user, the event is private,
  74.        and the user id does not match the event owner */
  75.  
  76.     if (!my_file && event->private && (user_id != event->event_owner))
  77.         return(0);
  78.  
  79.     /* check if event matches the current date */
  80.  
  81.     if (!event_matches_date(event, ¤t_date))
  82.         return(0);
  83.  
  84.     /* check if event hidden by anti-event */
  85.  
  86.     if (event_hidden(event, ¤t_date))
  87.         return(0);
  88.  
  89.     return(1);
  90. }
  91. @EOF
  92.  
  93. chmod 644 event_today.c
  94.  
  95. echo x - get_home.c
  96. cat >get_home.c <<'@EOF'
  97. #ifndef lint
  98. static char rcsid[] = "$Header: get_home.c,v 1.1 87/12/02 18:07:19 hull Exp $";
  99. #endif
  100.  
  101. #include <pwd.h>
  102.  
  103. extern char *malloc();
  104.  
  105. char *
  106. get_home_dir(uid)
  107. int uid;
  108. {
  109.     struct passwd *pw;
  110.     char *strcpy();
  111.     int strlen();
  112.  
  113.     if ((pw = getpwuid(uid)) == (struct passwd *)0)
  114.         return((char *)0);
  115.     else
  116.         return(strcpy(malloc((unsigned)strlen(pw->pw_dir)+1), pw->pw_dir));
  117. }
  118. @EOF
  119.  
  120. chmod 644 get_home.c
  121.  
  122. echo x - get_month.c
  123. cat >get_month.c <<'@EOF'
  124. #ifndef lint
  125. static char rcsid[] = "$Header: get_month.c,v 8.2 87/11/13 21:46:38 hull Exp $";
  126. #endif
  127.  
  128. get_month_start(month, year)
  129. register month, year;
  130. {
  131.     short day, i;
  132.  
  133.     day = jan1(year);
  134.  
  135.     for (i = 1; i < month; i++) {
  136.         day = (day + days_in(i, year)) % 7;
  137.     }
  138.     return(day);
  139. }
  140. @EOF
  141.  
  142. chmod 644 get_month.c
  143.  
  144. echo x - get_today.c
  145. cat >get_today.c <<'@EOF'
  146. #ifndef lint
  147. static char rcsid[] = "$Header: get_today.c,v 8.3 88/04/04 09:58:17 hull Exp $";
  148. #endif
  149.  
  150. #if SYS5
  151. #include <time.h>
  152. #else
  153. #include <sys/time.h>
  154. #endif
  155. #include "month.h"
  156.  
  157. extern struct date_rec todays_date;
  158. extern short dhour, dminute, dsecond;
  159.  
  160. get_todays_date()
  161. {
  162. #if SYS5
  163.     long tloc, time();
  164. #else
  165.     struct timeval tp;
  166.     struct timezone tzp;
  167. #endif
  168.     struct tm *tmp;
  169.  
  170. #if SYS5
  171.     if (time(&tloc) == -1)
  172.         return(-1);
  173.     tmp = localtime(&tloc);
  174. #else
  175.     if (gettimeofday(&tp, &tzp) != 0)
  176.         return(-1);
  177.     tmp = localtime((long *) &tp.tv_sec);
  178. #endif
  179.     todays_date.month = tmp->tm_mon + 1;
  180.     todays_date.day = tmp->tm_mday;
  181.     todays_date.year = 1900 + tmp->tm_year;
  182.     /* random values for testing */
  183.     /*
  184.     todays_date.month = random(12) + 1;
  185.     todays_date.day = random(29) + 1;
  186.     todays_date.year = 1900 + random(100);
  187.     */
  188.     dhour = tmp->tm_hour;
  189.     dminute = tmp->tm_min;
  190.     dsecond = tmp->tm_sec;
  191.     return(0);
  192. }
  193.  
  194. /* for testing */
  195. /*
  196. random(m)
  197. int m;
  198. {
  199.     long lrand48();
  200.  
  201.     return ((int) (lrand48() % m));
  202. }
  203. */
  204. @EOF
  205.  
  206. chmod 644 get_today.c
  207.  
  208. echo x - hidden.c
  209. cat >hidden.c <<'@EOF'
  210. #ifndef lint
  211. static char rcsid[] = "$Header: hidden.c,v 8.2 87/11/13 21:46:43 hull Exp $";
  212. #endif
  213.  
  214. #include "month.h"
  215.  
  216. extern struct event_rec events;
  217.  
  218. event_hidden(event, date)
  219. register struct event_rec *event;
  220. register struct date_rec *date;
  221. {
  222.     /* returns 1 if event hidden by anti-event on date, 0 if not */
  223.  
  224.     register struct event_rec *ptr;
  225.     extern unsigned short file_owner;
  226.     extern int strcmp();
  227.  
  228.     ptr = events.next_event;
  229.  
  230.     while (ptr) {
  231.         if (ptr->anti &&
  232.         (ptr->start_time.hour == event->start_time.hour) &&
  233.         (ptr->start_time.minute == event->start_time.minute) &&
  234.         (ptr->duration.hour == event->duration.hour) &&
  235.         (ptr->duration.minute == event->duration.minute) &&
  236.         (ptr->warning.hour == event->warning.hour) &&
  237.         (ptr->warning.minute == event->warning.minute) &&
  238.         (strcmp(ptr->event_string, event->event_string) == 0) &&
  239.         ((ptr->event_owner == event->event_owner) ||
  240.             (ptr->event_owner == file_owner)) &&
  241.         event_matches_date(ptr, date))
  242.         return(1);
  243.         ptr = ptr->next_event;
  244.     }
  245.     return(0);
  246. }
  247. @EOF
  248.  
  249. chmod 644 hidden.c
  250.  
  251. echo x - how_many.c
  252. cat >how_many.c <<'@EOF'
  253. #ifndef lint
  254. static char rcsid[] = "$Header: how_many.c,v 8.2 87/11/13 21:46:48 hull Exp $";
  255. #endif
  256.  
  257. #include "month.h"
  258.  
  259. how_many_since(edate, cdate)
  260. struct date_rec *edate, *cdate;
  261. {
  262.     register total_days_passed;
  263.     short i;
  264.  
  265.     if (edate->year < cdate->year) {
  266.         total_days_passed = 0;
  267.         for (i = edate->month; i <= 12; i++)
  268.         total_days_passed += days_in(i, edate->year);
  269.  
  270.         total_days_passed -= (edate->day - 1);
  271.         for (i = (edate->year + 1); i < cdate->year; i++)
  272.         total_days_passed += (365 + is_leap_year(i));
  273.  
  274.         for (i = 1; i < cdate->month; i++)
  275.         total_days_passed += days_in(i, cdate->year);
  276.  
  277.         total_days_passed += cdate->day;
  278.     } else if (edate->month == cdate->month)
  279.         total_days_passed = cdate->day - edate->day + 1;
  280.     else {
  281.         total_days_passed = 1 - edate->day;
  282.         for (i = edate->month; i < cdate->month; i++)
  283.         total_days_passed += days_in(i, cdate->year);
  284.  
  285.         total_days_passed += cdate->day;
  286.     }
  287.     return(((total_days_passed - 1) / 7) + 1);
  288. }
  289. @EOF
  290.  
  291. chmod 644 how_many.c
  292.  
  293. echo x - is_future.c
  294. cat >is_future.c <<'@EOF'
  295. #ifndef lint
  296. static char rcsid[] = "$Header: is_future.c,v 8.2 87/11/13 21:46:50 hull Exp $";
  297. #endif
  298.  
  299. #include "month.h"
  300.  
  301. is_future_event(event, date)
  302. struct event_rec *event;
  303. struct date_rec *date;
  304. {
  305.     if (date->year < event->start_date.year)
  306.         return(1);
  307.  
  308.     if (date->year > event->start_date.year)
  309.         return(0);
  310.  
  311.     if (date->month < event->start_date.month)
  312.         return(1);
  313.  
  314.     if (date->month > event->start_date.month)
  315.         return(0);
  316.  
  317.     if (date->day < event->start_date.day)
  318.         return(1);
  319.  
  320.     return(0);
  321. }
  322. @EOF
  323.  
  324. chmod 644 is_future.c
  325.  
  326. echo x - is_leap.c
  327. cat >is_leap.c <<'@EOF'
  328. #ifndef lint
  329. static char rcsid[] = "$Header: is_leap.c,v 8.2 87/11/13 21:46:52 hull Exp $";
  330. #endif
  331.  
  332. is_leap_year(year)
  333. int year;
  334. {
  335.     return((((jan1(year + 1) + 7 - jan1(year)) % 7) == 2) ? 1 : 0);
  336. }
  337. @EOF
  338.  
  339. chmod 644 is_leap.c
  340.  
  341. echo x - is_past.c
  342. cat >is_past.c <<'@EOF'
  343. #ifndef lint
  344. static char rcsid[] = "$Header: is_past.c,v 8.2 87/11/13 21:46:54 hull Exp $";
  345. #endif
  346.  
  347. #include "month.h"
  348.  
  349. is_past_event(event, date)
  350. struct event_rec *event;
  351. struct date_rec *date;
  352. {
  353.     register end_month, end_day, end_year;
  354.  
  355.     if (!event->until && (event->monthly || event->yearly || event->every))
  356.         return(0);
  357.  
  358.     if (event->until) {
  359.         end_month = event->until_date.month;
  360.         end_day = event->until_date.day;
  361.         end_year = event->until_date.year;
  362.     } else {
  363.         end_month = event->start_date.month;
  364.         end_day = event->start_date.day;
  365.         end_year = event->start_date.year;
  366.     }
  367.  
  368.     if (end_year > date->year)
  369.         return(0);
  370.  
  371.     if (end_year < date->year)
  372.         return(1);
  373.  
  374.     if (end_month > date->month)
  375.         return(0);
  376.  
  377.     if (end_month < date->month)
  378.         return(1);
  379.  
  380.     if (end_day < date->day)
  381.         return(1);
  382.  
  383.     return(0);
  384. }
  385. @EOF
  386.  
  387. chmod 644 is_past.c
  388.  
  389. echo x - jan1.c
  390. cat >jan1.c <<'@EOF'
  391. #ifndef lint
  392. static char rcsid[] = "$Header: jan1.c,v 8.2 87/11/13 21:46:55 hull Exp $";
  393. #endif
  394.  
  395. jan1(year)
  396. register year;
  397. {
  398.     register day;
  399.  
  400.     day = year + (year + 3) / 4;
  401.  
  402.     if (year > 1800) {
  403.         day -= (year - 1701) / 100;
  404.         day += (year - 1601) / 400;
  405.     }
  406.     if (year > 4000)
  407.         day -= year / 4000;
  408.  
  409.     return(day % 7);
  410. }
  411. @EOF
  412.  
  413. chmod 644 jan1.c
  414.  
  415. echo x - matches.c
  416. cat >matches.c <<'@EOF'
  417. #ifndef lint
  418. static char rcsid[] = "$Header: matches.c,v 8.2 87/11/13 21:47:00 hull Exp $";
  419. #endif
  420.  
  421. #include "month.h"
  422.  
  423. #define nth_smtwtfs_of_month(date)  (((date->day - 1) / 7) + 1)
  424. #define last_smtwtfs_of_month(date) \
  425.     ((date->day + 7) > days_in(date->month, date->year) ? 1 : 0)
  426.  
  427. event_matches_date(event, date)
  428. register struct event_rec *event;
  429. register struct date_rec *date;
  430. {
  431.     /* returns 1 if event matches date, 0 if not */
  432.  
  433.     short mnth_start;
  434.     int n;
  435.  
  436.     /* check if event is a future or past event */
  437.  
  438.     if (is_future_event(event, date) ||
  439.         is_past_event(event, date))
  440.         return(0);
  441.  
  442.     /* one time events must match date */
  443.  
  444.     if ((event->start_date.year == date->year) &&
  445.         (event->start_date.month == date->month) &&
  446.         (event->start_date.day == date->day) && !event->every &&
  447.         !event->nth_is_on && !event->last && !event->until) {
  448.         return(1);
  449.     }
  450.  
  451.     /* once monthly or once yearly events */
  452.  
  453.     if (!event->every && !event->nth_is_on && !event->last) {
  454.         if (event->monthly) {
  455.         if (event->start_date.day == date->day)
  456.             return(1);
  457.         } else if (event->yearly) {
  458.         if ((event->start_date.month == date->month) &&
  459.             (event->start_date.day == date->day))
  460.             return(1);
  461.         }
  462.     }
  463.  
  464.     mnth_start = get_month_start(date->month, date->year);
  465.     if (!event->smtwtfs[(date->day - 1 + mnth_start) % 7])
  466.         return(0);
  467.  
  468.     /* everys */
  469.  
  470.     if (event->every) {
  471.  
  472.         /* every smtwtfs */
  473.  
  474.         if (!event->nth_is_on && !event->last) {
  475. EVDAY:            if (event->smtwtfs[(date->day - 1 + mnth_start) % 7])
  476.             return(1);
  477.             return(0);
  478.         }
  479.  
  480.         /* every monthly/yearly */
  481.  
  482.         if (event->monthly || event->yearly) {
  483.         /* every monthly not-1st2nd3rdlast */
  484.         if (!event->nth_is_on && !event->last)
  485.             goto EVDAY;
  486.  
  487.         /* every monthly/yearly with one of 1st2nd3rd... */
  488.  
  489.         if (event->nth_is_on) {
  490.             if (event->monthly && (nth_smtwtfs_of_month(date)
  491.             == event->nth)) 
  492.             return(1);
  493.             if (event->yearly && (nth_smtwtfs_of_year(date)
  494.             == event->nth))
  495.             return(1);
  496.         }
  497.  
  498.         /* every monthly/yearly with last */
  499.  
  500.         if (event->last) {
  501.             if (event->monthly) {
  502.             if (last_smtwtfs_of_month(date))
  503.                 return(1);
  504.             }
  505.             if (event->yearly) {
  506.             if (last_smtwtfs_of_year(date))
  507.                 return(1);
  508.             }
  509.         }
  510.  
  511.         } else {
  512.  
  513.         /* every not-monthly and not-yearly */
  514.  
  515.         if (!event->nth_is_on && !event->last)
  516.             goto EVDAY;
  517.  
  518.         /* every nth/dayofweek */
  519.  
  520.         if (event->nth == 1)
  521.             return(1);
  522.  
  523.         n = how_many_since(&event->start_date, date);
  524.         if ((n % event->nth) == 1)
  525.             return(1);
  526.         }
  527.     }
  528.     return(0);
  529. }
  530.  
  531. nth_smtwtfs_of_year(date)
  532. struct date_rec *date;
  533. {
  534.     short dys, i;
  535.  
  536.     for (i = 1, dys = date->day; i < date->month; i++) {
  537.         dys += days_in(i, date->year);
  538.     }
  539.  
  540.     return(((dys - 1) / 7) + 1);
  541. }
  542.  
  543. last_smtwtfs_of_year(date)
  544. struct date_rec *date;
  545. {
  546.     short dys, i;
  547.  
  548.     for (i = 1, dys = date->day; i < date->month; i++) {
  549.         dys += days_in(i, date->year);
  550.     }
  551.  
  552.     return((dys + 7) > (365 + is_leap_year(date->year)) ? 1 : 0);
  553. }
  554. @EOF
  555.  
  556. chmod 644 matches.c
  557.  
  558. echo x - read_sched.c
  559. cat >read_sched.c <<'@EOF'
  560. #ifndef lint
  561. static char rcsid[] = "$Header: read_sched.c,v 8.4 88/04/04 11:00:49 hull Exp $";
  562. #endif
  563.  
  564. #include <sys/types.h>
  565. #include <sys/stat.h>
  566. #if LOCKF
  567. #include <fcntl.h>
  568. #include <unistd.h>
  569. #endif LOCKF
  570. #if FLOCK
  571. #include <sys/file.h>
  572. #endif FLOCK
  573. #include "month.h"
  574.  
  575. extern unsigned short file_owner;
  576. extern int fd;
  577. extern struct event_rec events;
  578.  
  579. read_schedule(m_dir, read_mode)
  580. char *m_dir;
  581. short read_mode;
  582. {
  583.     char *schedule_file_name;
  584.     unsigned rec_size;
  585.     struct stat stat_buf;
  586.     short file_version;
  587.     struct event_rec event_buf, *event_ptr, *chain_ptr;
  588.     extern float get_version();
  589.     extern char *strcat(), *strcpy();
  590.  
  591.     schedule_file_name = malloc((unsigned) strlen(m_dir)+8);
  592.     strcpy(schedule_file_name, m_dir);
  593.     strcat(schedule_file_name, "/.month");
  594.  
  595.     rec_size = sizeof(struct event_rec);
  596.     umask(0);
  597.  
  598.     chain_ptr = events.next_event;    /* free old events */
  599.     while (chain_ptr) {
  600.         event_ptr = chain_ptr;
  601.         chain_ptr = chain_ptr->next_event;
  602.         free((char *)event_ptr);
  603.     }
  604.     events.next_event = 0;
  605.  
  606. #if MULTIUSER
  607.     if (read_mode == READ_ONLY)
  608.         fd = open(schedule_file_name, O_RDONLY);
  609.     else {
  610.         if ((fd = open(schedule_file_name, O_RDWR|O_CREAT, 0660)) != -1)
  611. #if LOCKF
  612.         if (lockf(fd, F_TLOCK, 0L) == -1) {
  613.             close(fd);
  614.             fd = -2;
  615.             return(-2);
  616.         }
  617. #else
  618. #if FLOCK
  619.         if (flock(fd, LOCK_EX | LOCK_NB) == -1) {
  620.             close(fd);
  621.             fd = -2;
  622.             return(-2);
  623.         }
  624. #endif FLOCK
  625. #endif LOCKF
  626.     }
  627. #else
  628.     fd = open(schedule_file_name, O_RDWR|O_CREAT, 0660);
  629. #endif MULTIUSER
  630.     free(schedule_file_name);
  631.  
  632.     if (fd != -1) {
  633.         if (read(fd, (char *) &file_version, sizeof(file_version))
  634.             == sizeof(file_version)) {
  635.             if (file_version != (int) get_version()) {
  636.             close(fd);
  637.             fd = -1;
  638.             return(file_version);
  639.             }
  640.         } else {    /* no version field so assume empty file */
  641.             if (read_mode == READ_ONLY) {
  642.             close(fd);
  643.             fd = -1;
  644.             }
  645.             return(0);
  646.         }
  647.  
  648.         chain_ptr = &events;
  649.  
  650.         while (read(fd, &event_buf, rec_size) == rec_size) {
  651.             if (event_ptr = (struct event_rec *)malloc(rec_size)) {
  652.                 chain_ptr->next_event = event_ptr;
  653.                 chain_ptr = event_ptr;
  654.                 *chain_ptr = event_buf;
  655.                 chain_ptr->next_event = (struct event_rec *)0;
  656.             } else
  657.                 break;
  658.         }
  659.         fstat(fd, &stat_buf);
  660.         file_owner = stat_buf.st_uid;
  661.         if (read_mode == READ_ONLY) {
  662.             close(fd);
  663.             fd = -1;
  664.         }
  665.         return(0);
  666.     }
  667.     /* if here, open failed */
  668.     return(-1);
  669. }
  670. @EOF
  671.  
  672. chmod 644 read_sched.c
  673.  
  674. echo x - write_sched.c
  675. cat >write_sched.c <<'@EOF'
  676. #ifndef lint
  677. static char rcsid[] = "$Header: write_sched.,v 8.3 87/12/01 23:40:05 hull Exp $";
  678. #endif
  679.  
  680. #include "month.h"
  681.  
  682. extern short updating, update_schedule, keep_old;
  683. extern int fd;
  684. extern off_type lseek();
  685. extern struct date_rec todays_date;
  686. extern struct event_rec events;
  687.  
  688. write_schedule()
  689. {
  690.     short file_version;
  691.     struct event_rec *chain_ptr;
  692.     float get_version();
  693.  
  694.     if (fd < 0)    /* file not really open */
  695.         return(fd);
  696.  
  697.     if (!update_schedule) {
  698.         close(fd);
  699.         return(0);
  700.     }
  701.  
  702.     updating = 1;
  703.     file_version = (int) get_version();
  704.  
  705.     if (lseek(fd, (off_type) 0, 0) == -1) {
  706.         close(fd);
  707.         return(-1);
  708.     }
  709.  
  710. #if !SYS5
  711.     if (ftruncate(fd, (off_type) 0) == -1) {
  712.         close(fd);
  713.         return(-1);
  714.     }
  715. #endif
  716.  
  717.     write(fd, (char *) &file_version, sizeof(short));
  718.     chain_ptr = events.next_event;
  719.  
  720.     while (chain_ptr) {
  721.         if (keep_old || !is_past_event(chain_ptr, &todays_date))
  722.             write(fd, (char *)chain_ptr, sizeof(struct event_rec));
  723.         else
  724.             delete_event(chain_ptr);
  725.         chain_ptr = chain_ptr->next_event;
  726.     }
  727.     close(fd);    /* also releases lock */
  728.     update_schedule = updating = 0;
  729.     return(0);
  730. }
  731. @EOF
  732.  
  733. chmod 644 write_sched.c
  734.  
  735. echo x - version.c
  736. cat >version.c <<'@EOF'
  737. #ifndef lint
  738. static char rcsid[] = "$Header: version.c,v 8.7 88/06/03 22:35:16 hull Exp $";
  739. #endif
  740.  
  741. /* $Log:    version.c,v $
  742.  * Revision 8.7  88/06/03  22:35:16  22:35:16  hull (James Hull)
  743.  * Changed year_area display to always display "whole" decades.
  744.  * Changed semantics of 2-digit year entry.
  745.  * Fixed screen-memory-file consistency bug.
  746.  * 
  747.  * Revision 8.6  88/04/04  11:17:12  11:17:12  hull (James Hull)
  748.  * Added alarm calls and new_day function so today's date is updated.
  749.  * Fixed bug so that 'R' command updates schedule display.
  750.  * Various other bug fixes and code clean-ups.
  751.  * 
  752.  * Revision 8.5  88/01/15  10:48:52  10:48:52  hull (James Hull)
  753.  * Fixed bug by only calling write_schedule if not in read-only mode.
  754.  * 
  755.  * Revision 8.4  87/12/02  18:49:50  18:49:50  hull (James Hull)
  756.  * Moved get_home_dir() out of month.c, monthd.c, and xmonthd.c to a separate file.
  757.  * Deleted some unnecessary include files from month.c, monthd.c, xmonthd.c.
  758.  * 
  759.  * Revision 8.3  87/12/01  23:50:22  23:50:22  hull (James Hull)
  760.  * Fixed bug in read_schedule which caused monthd to mysteriously die.
  761.  * Problem was caused by never closing the file descriptor and eventually
  762.  * reaching the open file descriptor limit imposed by the operating system.
  763.  * 
  764.  * Revision 8.2  87/11/13  21:25:07  21:25:07  hull (James Hull)
  765.  * Fixed 'd', 'm', 'y' bug which allowed exit from schedule area.
  766.  * Fixed user_name bug in 'U' and 'G' commands.
  767.  * Added 'a' (print aliases) command.
  768.  * Added ',' to list of allowed name separators.
  769.  * Fixed security hole in 'a' and 'H' commands.
  770.  * 
  771.  * Revision 8.1  87/11/13  21:24:26  21:24:26  hull (James Hull)
  772.  * Added environment flag and command line option for time mode.
  773.  * Added 't' (change time mode) command in schedule area.
  774.  * 
  775.  * Revision 8.0  87/11/13  21:21:37  21:21:37  hull (James Hull)
  776.  * Added ending time to event_rec structure.
  777.  * Changed "monthd", print_sched, print_book to use ending time.
  778.  * Changed format of schedule_area.
  779.  * Changed all event_rec times to use time_rec structure.
  780.  * Cleaned up do_incr and scroll_time so 'n' and 'p' consistent.
  781.  * Fixed digit counting bug in enter_number.
  782.  * Cleaned up code to "beep" for even more invalid keys.
  783.  * Changed "monthd" to use process group to determine user logout.
  784.  * Merged write_schedule into "common.a".
  785.  * 
  786.  * Revision 7.7  87/11/13  21:21:06  21:21:06  hull (James Hull)
  787.  * Added global alias file for 'G' command.
  788.  * 
  789.  * Revision 7.6  87/11/13  21:20:16  21:20:16  hull (James Hull)
  790.  * Changed get_npdeq to only show appropriate keys.
  791.  * Cleaned up code to "beep" for most invalid keys.
  792.  * 
  793.  * Revision 7.5  87/11/13  21:19:39  21:19:39  hull (James Hull)
  794.  * Split daemon into separate "monthd" program.
  795.  * Created "common.a" library.
  796.  * 
  797.  * Revision 7.4  87/11/13  21:18:37  21:18:37  hull (James Hull)
  798.  * Changed "goto mark" command from 'G' to '''.
  799.  * Added 'G' (group post) command.
  800.  * Minor fixes to push_area, pop_area, more, clear_message_line.
  801.  * 
  802.  * Revision 7.3  87/11/13  21:16:35  21:16:35  morrell (Michael Morrell)
  803.  * Added 'p' (previous) to 'E' command; now identical to 'S'.
  804.  * Fixed security hole in shell escape.
  805.  * Added '-O' option and changed 'O' command to track date.
  806.  * Cleaned up code to make lint happy.
  807.  * 
  808.  * Revision 7.2  87/11/13  21:15:59  21:15:59  hull (James Hull)
  809.  * Added current date to print_sched.
  810.  * Added special case for printing zero-length events.
  811.  * 
  812.  * Revision 7.1  87/11/13  21:15:21  21:15:21  hull (James Hull)
  813.  * Fixed cursor initialization bug.
  814.  * 
  815.  * Revision 7.0  87/11/13  21:13:09  21:13:09  hull (James Hull)
  816.  * Changed functions and event_rec to use date structure.
  817.  * Added push/pop ara functions to fix cursor positioning bug.
  818.  * Added cursor wraparound in months, days, and years areas.
  819.  * Added '!' (shell escape) command.
  820.  * Added 'e' (event editing) to 'E' command.
  821.  * Added 'W' (write schedule) command.
  822.  * 
  823.  * Revision 6.1  87/11/13  21:12:38  21:12:38  hull (James Hull)
  824.  * Fixed next/previous bug in month area when changing years.
  825.  * 
  826.  * Revision 6.0  87/11/13  21:11:55  21:11:55  hull (James Hull)
  827.  * Added anti-events.
  828.  * Fixed boundary conditions for dates.
  829.  * Fixed get_date bug which trashed month, day, year.
  830.  * 
  831.  * Revision 5.3  87/11/13  21:09:22  21:09:22  hull (James Hull)
  832.  * '?', 'C', and 'P' commands check area.
  833.  * Fixed 'In' printf bug in remind.
  834.  * Cleaned up hl_month_year.
  835.  * Added hl_day and day selection (this_day underlined).
  836.  * Removed warn_day and added return to m, d, or y area.
  837.  * Split display.c into hl.c, move.c, print.c, user2.c.
  838.  * Added 'a', 'i', 'k', and 'r' command-line options.
  839.  * Added border around days area.
  840.  * Cleaned up code to make lint happy.
  841.  * 
  842.  * Revision 5.2  87/11/13  21:07:34  21:07:34  hull (James Hull)
  843.  * Added MONTH environment variable.
  844.  * Fixed memory problem in get_home_dir & get_user_arg.
  845.  * Removed many temp print buffers by using mvprintw.
  846.  * Changed several numeric constants to named constants.
  847.  * Added event description editing and insert-mode flag.
  848.  * 
  849.  * Revision 5.0  87/11/13  21:06:16  21:06:16  hull (James Hull)
  850.  * Added warning time to events.
  851.  * Made year optional in '/' command and on command line.
  852.  * Added '?' (help) command and file.
  853.  * 
  854.  * Revision 4.0  87/11/13  21:05:43  21:05:43  hull (James Hull)
  855.  * Added until date to events.
  856.  * Replaced Accept/Cancel with ^A.
  857.  * 
  858.  * Revision 3.0  87/11/13  21:04:14  21:04:14  hull (James Hull)
  859.  * Added owner to events allowing multi-user access.
  860.  * Added read-only flag and '-R' flag.
  861.  * Added version values to .month file and month program.
  862.  * Wrote chmonth to update .month files to new versions.
  863.  * 
  864.  * Revision 2.0  87/11/13  21:03:22  21:03:22  hull (James Hull)
  865.  * Added private flag to events.
  866.  * Added direct entry of hours and minutes.
  867.  * Added curses keypad input.
  868.  * 
  869.  * Revision 1.0  87/11/13  21:00:40  21:00:40  hull (James Hull)
  870.  * Initial revision
  871.  * 
  872.  */
  873.  
  874. /*
  875. The integer portion of version changes when the event structure changes.
  876. The fractional portion changes for everything else.
  877. */
  878.  
  879. float
  880. get_version()
  881. {
  882.     float version;
  883.  
  884.     (void) sscanf("$Revision: 8.7 $", "%*s%f", &version);
  885.     return(version);
  886. }
  887. @EOF
  888.  
  889. chmod 644 version.c
  890.  
  891. exit 0
  892.  
  893.