home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / util / timeplanner-1.0.lha / TimePlanner / tp.c < prev   
C/C++ Source or Header  |  1994-05-29  |  27KB  |  936 lines

  1. //----------------------------------------------------------------------------
  2. // TimePlanner V1.0                                        © 1993 L. Vanhelsuwé
  3. // ----------------                                        --------------------
  4. // Background deamon for starting periodic background processes or for reminding
  5. // users of appointments (birthdays, car insurance, ...).
  6. // Uses an Events file to find out when to become active and notify user or to
  7. // execute secondary batch processes.
  8. //
  9. // BUGS:
  10. // -----
  11. // -Program is not localization-proof. When locale is not English : corruption
  12. //  occurs in EV.LST
  13. //
  14. // History:
  15. // --------
  16. // Sat 24-JAN-93: started this file.
  17. // Sun 31-JAN-93: finished basic useful version
  18. // Sun 09-MAY-93: added early reminder "X DAYS/HOURS/MINUTES to go before.."
  19. // Mon 10-MAY-93: added ENV:EV.LST marking to find out where we're waiting
  20. //          bumped revision to 1.1
  21. // Tue 18-MAY-93: added graceful exit for 1.3 users.
  22. // Fri 21-JAN-94: implemented EXECUTE option to execute batch files or commands
  23. //                  added delay after initial loading for faster/clearer startup
  24. //
  25. //----------------------------------------------------------------------------
  26.  
  27. #include    <stdio.h>
  28. #include    <string.h>
  29. #include    <stdlib.h>
  30.  
  31. #ifdef    AMIGA
  32.  
  33. #include    <exec/types.h>
  34. #include    <exec/memory.h>
  35. #include    <dos/dos.h>
  36. #include    <dos/datetime.h>
  37. #include    <intuition/screens.h>
  38. #include    <intuition/intuitionbase.h>
  39. #include    <graphics/gfx.h>
  40.  
  41. #include    <clib/exec_protos.h>            // ANSI function prototypes
  42. #include    <clib/alib_protos.h>
  43. #include    <clib/dos_protos.h>
  44. #include    <clib/graphics_protos.h>
  45. #include    <clib/intuition_protos.h>
  46.  
  47. #endif
  48.  
  49. #define    MAX_REMINDERS    (12)            // upto N-1 early reminders
  50.  
  51. #define    COLON        (':')
  52. #define    SEMICOLON    (';')
  53. #define    COMMA        (',')
  54. #define    HYPHEN        ('-')
  55. #define    QUOTE        ('"')
  56. #define    VERT_BAR    ('|')
  57. #define    TAB            (9)
  58. #define    LF            (10)
  59. #define    ASTERISK    ('*')
  60. #define    SPACE        (32)
  61.  
  62. #define    MINUTETICKS    (60*50)                // 50 Amiga TICKS in a second
  63. #define    HOURTICKS    (60*MINUTETICKS)
  64. #define    DAYTICKS    (24*HOURTICKS)
  65. #define    WEEKTICKS    (7*DAYTICKS)
  66. #define    MONTHTICKS    (30*DAYTICKS)
  67.  
  68. #define    NUM_DAYS    (7)
  69. #define    NUM_MONTHS    (12)
  70.  
  71. #define    BUT_OK        (1)
  72. #define    BUT_CANCEL    (2)
  73. //-----------------------------------------------------------------------------
  74. // Function prototypes
  75. // -------------------
  76.  
  77. void    parse_user_events    ( void );
  78. void    skip_line            ( void );
  79. void    skip_whitespc        ( void );
  80. void    print_line            ( void );
  81. char    popup_requester        ( char *msg, char buttons);
  82. void    make_exe_file        ( void );
  83. void    process_line        ( void );
  84. void    process_on_line        ( void );
  85. void    init_TP                ( void );
  86. void    adjust                ( struct DateStamp *ds, ULONG ticks);
  87. void    handle_events        ( void );
  88. void    mark_file            ( char *file, int position, char *tag);
  89. void    do_event            ( char *req_msg, char *batch_file);
  90.  
  91. char    * load_file            ( char * filename);
  92.  
  93. BOOL    is_string            ( char * txt, char * string);
  94. BOOL    DStampToStr            ( struct DateStamp *ds, char *daystr, char *datestr, char *timestr);
  95.  
  96. short    get_num                ( void );
  97. short    get_month            ( void );
  98. short    get_dayname            ( void );
  99. short    process_remind_line    ( void );
  100. short    month_from_str        ( char *month );
  101.  
  102. //-----------------------------------------------------------------------------
  103. // Global statics
  104. // --------------
  105.  
  106. struct    IntuitionBase *IntuitionBase;        // for access to ActiveWindow
  107.  
  108. struct    DateStamp    datestamp;                // for DateStamp(), DateToStr(),..
  109. struct    DateTime    datetime;
  110.  
  111. char    day_str[16];                        // Wednesday is biggest
  112. char    date_str[10];                        // 24-JAN-93
  113. char    time_str[10];                        // 21:47:47
  114.  
  115. char    *file_buf, *events_file;
  116. char    *txt;                                // text pointer (into buffer)
  117. ULONG    file_size;
  118.  
  119. struct REM                            // REMINDER structure
  120. {
  121.     struct DateStamp    REM_ds;
  122.     char                REM_string[80];
  123. };
  124.  
  125. struct REM reminders[MAX_REMINDERS];        // 0..N reminder dates/times
  126.  
  127. char    month_codes[]="0123456789AB";        // month codes
  128.  
  129. char    *months[]={"JAN","FEB","MAR","APR","MAY","JUN",
  130.                    "JUL","AUG","SEP","OCT","NOV","DEC"};
  131.  
  132. char    *days[]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
  133.  
  134. char    *version = "$VER: TimePlanner 1.0 ©LVA 22/JAN/94\n";
  135.  
  136. FILE    *fh;                                // file handle
  137.  
  138. BOOL    ok;
  139.  
  140. int        i;
  141.  
  142. //-----------------------------------------------------------------------------
  143. // outline of program:
  144. // - from user events file, create a sorted formalized version
  145. // - process all future events by waiting for event time, then executing action
  146. //-----------------------------------------------------------------------------
  147.  
  148. void main (void) {
  149.  
  150. struct DosBase * libptr;
  151.  
  152.     printf("TimePlanner (TM) V1.0\n");
  153.     printf("Designed and implemented by Laurence Vanhelsuwé © Jan 1993\n\n");
  154.  
  155.     libptr = ( struct DosBase*) OpenLibrary("dos.library", 37);    // check for 2.0 OS
  156.  
  157.     if (libptr) {
  158.         CloseLibrary((struct Library*)libptr);
  159.  
  160.         Delay(5*50);                            // let startup-sequence complete
  161.  
  162.         init_TP();                                // initialize things
  163.  
  164.         events_file = load_file("S:EVENTS");    // cache user events file
  165.  
  166.         parse_user_events();                    // generate formalised events list
  167.  
  168.         FreeMem(file_buf, file_size);            // free user events file buffer
  169.  
  170.         Execute("Sort ENV:ev.raw TO ENV:ev.lst", NULL, NULL);    // sort events on date
  171.         DeleteFile("ENV:ev.raw");                // delete unsorted file
  172.  
  173.         handle_events();                        // process queue, waiting for right times..
  174.  
  175.         FreeMem(file_buf, file_size);            // free events file buffer
  176.     } else {
  177.         printf("TimePlanner needs AmigaDOS 2.0 (V37+)...Sorry!\n");
  178.     }
  179.  
  180.     printf("TimePlanner quitting. Have a nice day.\n");
  181. }
  182.  
  183. //-----------------------------------------------------------------------------
  184. // Initialize program.
  185. //-----------------------------------------------------------------------------
  186. void init_TP (void) {
  187.  
  188.     DateStamp(&datestamp);
  189.     ok = DStampToStr(&datestamp, day_str, date_str, time_str);
  190.     printf("Today is %s %s and the time is %s\n", day_str, date_str, time_str);
  191.  
  192.     IntuitionBase = (struct IntuitionBase*) OpenLibrary("intuition.library", 36);
  193.     if (!IntuitionBase) {
  194.         printf("TimePlanner ERROR: No IntuitionBase !\n");
  195.         exit(100);
  196.     }
  197. }
  198. //-----------------------------------------------------------------------------
  199. // Scan through sorted events list, waiting for next event and then executing
  200. // the required action.
  201. //
  202. // Example lines:
  203. //
  204. // 1994 0 22 15:55:00 R 5 Minutes to go before...Jonah !|
  205. // 1994 0 22 16:00:00 N Jonah !|
  206. //
  207. //-----------------------------------------------------------------------------
  208. void handle_events( void ) {
  209.  
  210. unsigned int delay,offset;
  211. short    day,month,year,hour,minute;
  212. ULONG    tmin_days,tmin_mins,tmin_ticks;        // T-minus X days, minutes, ticks
  213. char     ch;
  214. char    * req_msg;                    // pointer to text for requester
  215. char    * file_end;
  216. char    datestring[20], timestring[20];
  217. char    * batch_file;                        // don't execute anything
  218. static    char reminder_msg[256];
  219.  
  220.     txt = events_file = load_file("ENV:EV.LST");    // load sorted events file
  221.  
  222.     file_end = txt + file_size;                    // calculate EOF in buffer
  223.  
  224.     while (txt < file_end) {                    // while not past EOF
  225.  
  226.         req_msg    = NULL;
  227.         batch_file        = NULL;                    // assume no BATCH file
  228.  
  229.         offset = txt - events_file;
  230.         mark_file ("ENV:EV.LST", offset, ">");    // label line we're waiting on
  231.  
  232.         year    = get_num(); txt++;                // get event date and time...
  233.         month    = (*txt) < 'A' ? (*txt)-'0' : (*txt)-'A'+10;
  234.         txt +=2;
  235.         day        = get_num(); txt++;                // skip space
  236.         hour    = get_num(); txt++;                // skip COLON
  237.         minute    = get_num(); txt++;                // skip COLON
  238.         get_num();                                // discard seconds field
  239.  
  240.         txt++;                                    // skip space char
  241.  
  242.         ch = *txt++;
  243.  
  244.         switch (ch) {
  245.             case 'N':    txt++;                    // skip space
  246.     
  247.                         req_msg = txt;                // notif. msg is user's string
  248.     
  249.                         while (*txt++ != VERT_BAR) ;
  250.                         *(txt-1) = 0;            // turn into C-string
  251.     
  252.                         if (*txt == LF) break;
  253.  
  254.                         txt++;                    // skip space
  255.                         if (*txt++ == 'E') {
  256.                             txt++;                // skip space
  257.                             txt++;                // skip filename quote
  258.                             batch_file = txt;
  259.                             while (*txt != QUOTE) txt++;
  260.                             *txt++ = 0;            // turn filname into C-string
  261.                         }
  262.                         break;
  263.     
  264.             case 'R':    txt++;                    // skip space
  265.     
  266.                         req_msg = txt;
  267.     
  268.                         while (*txt++ != VERT_BAR) ;
  269.                         *(txt-1) = 0;            // turn into C-string
  270.     
  271.                         sprintf(reminder_msg, "EARLY REMINDER MESSAGE:\n\n");
  272.                         sprintf(reminder_msg+24, req_msg);
  273.                         req_msg = reminder_msg;
  274.     
  275.                         break;
  276.     
  277.             cas