EVTPARSE.C

15.6 KB 5d157e7a7bf1e127…
/*--------------------------------------------------------------------------*/
/*                                                                          */
/*                                                                          */
/*      ------------         Bit-Bucket Software, Co.                       */
/*      \ 10001101 /         Writers and Distributors of                    */
/*       \ 011110 /          Freely Available<tm> Software.                 */
/*        \ 1011 /                                                          */
/*         ------                                                           */
/*                                                                          */
/*  (C) Copyright 1987-91, Bit Bucket Software Co., a Delaware Corporation. */
/*                                                                          */
/*                                                                          */
/*                 This module was written by Bob Hartman                   */
/*                                                                          */
/*                                                                          */
/*                     BinkleyTerm Scheduler Routines                       */
/*                                                                          */
/*                                                                          */
/*    For complete  details  of the licensing restrictions, please refer    */
/*    to the License  agreement,  which  is published in its entirety in    */
/*    the MAKEFILE and BT.C, and also contained in the file LICENSE.250.    */
/*                                                                          */
/*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
/*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
/*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
/*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
/*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
/*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
/*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
/*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
/*                                                                          */
/*                                                                          */
/* You can contact Bit Bucket Software Co. at any one of the following      */
/* addresses:                                                               */
/*                                                                          */
/* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
/* P.O. Box 460398                AlterNet 7:491/0                          */
/* Aurora, CO 80046               BBS-Net  86:2030/1                        */
/*                                Internet f491.n343.z1.fidonet.org         */
/*                                                                          */
/* Please feel free to contact us at any time to share your comments about  */
/* our software and/or licensing policies.                                  */
/*                                                                          */
/*--------------------------------------------------------------------------*/

/* Include this file before any other includes or defines! */

#include "includes.h"

char *start_time (BINK_EVENT *, char *);
char *end_time (BINK_EVENT *, char *);


char *start_time (BINK_EVENTP e, char *p)
{
   int i, j, k, l, n;

   if ((n = sscanf (p, "%d:%d,%d,%d", &i, &j, &k, &l)) < 2)
      {
      return NULL;
      }

   e->minute = i * 60 + j;
   if ((e->minute < 0) || (e->minute > (24 * 60)))
      {
      return (NULL);
      }

   if (n >= 3)
      e->month = (char)k;
   if (n >= 4)
      e->day = (char)l;

   p = skip_to_blank (p);

   return (p);
}

char *end_time (BINK_EVENTP e, char *p)
{
   int i, j, k;

   if (sscanf (p, "%d:%d", &i, &j) != 2)
      {
      return NULL;
      }

   k = i * 60 + j;
   if ((k > (24 * 60)) || (k < 0))
      {
      return (NULL);
      }

   if (k < e->minute)
      {
      (void) printf (MSG_TXT(M_NO_END_MIDNIGHT));
      return (NULL);
      }

   e->length = k - e->minute;

   p = skip_to_blank (p);

   return (p);
}

int parse_event (char *e_line)
{
   int i, j, j1, j2;
   char *p, *p1, *eptr;
   BINK_EVENT e;

   /* If we already have a schedule, then forget it */
   if (got_sched)
      return (0);

   /* Zero out the event structure */

   (void) memset ((char *)&e, 0 , sizeof (e));

   /* Skip blanks to get to the days field */
   p = skip_blanks (e_line);

   /* Parse the days field */
   e.days = 0;
   e.wait_time = 120;
   while ((*p) && (!isspace (*p)))
      {
      switch (toupper (*p))
         {
         case 'S':                              /* Sunday or Saturday */
            if (!strnicmp (p, "sun", 3))
               {
               e.days |= DAY_SUNDAY;
               }
            else if (!strnicmp (p, "sat", 3))
               {
               e.days |= DAY_SATURDAY;
               }
            else /* Error condition */ 
               {
               goto err;
               }
            p += 3;
            break;

         case 'M':                              /* Monday */
            if (!strnicmp (p, "mon", 3))
               {
               e.days |= DAY_MONDAY;
               }
            else /* Error condition */ 
               {
               goto err;
               }
            p += 3;
            break;

         case 'T':                              /* Tuesday or Thursday */
            if (!strnicmp (p, "tue", 3))
               {
               e.days |= DAY_TUESDAY;
               }
            else if (!strnicmp (p, "thu", 3))
               {
               e.days |= DAY_THURSDAY;
               }
            else /* Error condition */ 
               {
               goto err;
               }
            p += 3;
            break;

         case 'W':                              /* Wednesday, Week or
                                                  * Weekend */
            if (!strnicmp (p, "wed", 3))
               {
               e.days |= DAY_WEDNESDAY;
               p += 3;
               }
            else if (!strnicmp (p, "week", 4))
               {
               e.days |= DAY_WEEK;
               p += 4;
               }
            else if (!strnicmp (p, "wkend", 5))
               {
               e.days |= DAY_WKEND;
               p += 5;
               }
            else /* Error condition */ 
               {
               goto err;
               }
            break;

         case 'F':                              /* Friday */
            if (!strnicmp (p, "fri", 3))
               {
               e.days |= DAY_FRIDAY;
               }
            else /* Error condition */ 
               {
               goto err;
               }
            p += 3;
            break;

         case 'A':                              /* All */
            if (!strnicmp (p, "all", 3))
               {
               e.days |= (DAY_WEEK | DAY_WKEND);
               }
            else /* Error condition */ 
               {
               goto err;
               }
            p += 3;
            break;

         default:                               /* Error condition */
            goto err;
         }

      if (*p == '|')
         ++p;
      }

   /* Did we get something valid? */
   if (e.days == 0)
      {
      goto err;
      }

   /* Skip blanks to get to the start-time field */
   p = skip_blanks (p);

   /* Parse the start-time field */
   if ((p = start_time (&e, p)) == NULL)
      {
      eptr = MSG_TXT(M_INVALID_START);
      goto bad_line;
      }

   /* Give each event a default of 60 minutes */
   e.length = 60;

   /* Give each event a local cost of 0 */
   e.node_cost = 0;

   /* Each event defaults to Q=0 */
   e.mailqsize = 0l;

   /* Give each event a default of T=3,10000 */
   e.with_connect = 3;
   e.no_connect = 10000;

   /* While there are still things on the line */
   while (*p)
      {
      /* Skip blanks to get to the next field */
      p = skip_blanks (p);

      /* switch to find what thing is being parsed */

      switch (tolower (*p))
         {
         case '\0':                             /* No more stuff */
            break;

         case '0':                              /* Digits must be an ending
                                                  * time */
         case '1':
         case '2':
         case '3':
         case '4':
         case '5':
         case '6':
         case '7':
         case '8':
         case '9':
            /* Parse ending time */
            if ((p = end_time (&e, p)) == NULL)
               {
               (void) printf (MSG_TXT(M_INVALID_END), e_line);
               return (1);
               }
            break;

         case ';':                              /* Comment */
         case '%':
            *p = '\0';
            break;

         case '"':                              /* Extra chars to append to
                                                  * packer strings */
            ++p;
            p1 = e.cmd;
            *p1++ = ' ';
            while (*p != '"')
               *p1++ = *p++;
            *p1 = '\0';
            ++p;
            break;

         case 'a':                              /* Average wait */
            ++p;
            if (*p == '=')
               {
               ++p;
               if (isdigit (*p))
                  {
                  i = atoi (p);
                  if ((i > 1800) || (i < 0))
                     {
                     eptr = MSG_TXT(M_INVALID_AVGWAIT);
                     goto bad_line;
                     }
                  e.wait_time = i;
                  p = skip_to_blank (p);
                  break;
                  }
               }
            eptr = MSG_TXT(M_INVALID_AVGWAIT);
            goto bad_line;

         case 'b':                              /* BBS type event */
            p = skip_to_blank (p);
            e.behavior |= MAT_BBS;
            break;

         case 'c':                              /* #CM event */
            p = skip_to_blank (p);
            e.behavior |= MAT_CM;
            break;

         case 'd':                              /* Dynamic event */
            p = skip_to_blank (p);
            e.behavior |= MAT_DYNAM;
            break;

         case 'e':                              /* An errorlevel exit */
            ++p;
            if (isdigit (*p))
               {
               i = *p - '0';
               ++p;
               if (*p == '=')
                  {
                  if ((i <= 3) && (i > 0))
                     {
                     ++p;
                     if (isdigit (*p))
                        {
                        j = atoi (p);
                        e.errlevel[i - 1] = (unsigned char) j;
                        p = skip_to_blank (p);
                        break;
                        }
                     }
                  else if ((i > 3) && (i <= 9))
                     {
                     ++p;
                     if (isdigit (*p))
                        {
                        j = atoi (p);
                        e.errlevel[i - 1] = (unsigned char) j;
                        while (*p && (*p != ','))
                           ++p;
                        ++p;
                        (void) strncpy (&(e.err_extent[i - 4][0]), p, 3);
                        p = skip_to_blank (p);
                        break;
                        }
                     }
                  }
               }
            eptr = MSG_TXT(M_BAD_ERRORLEVEL);
            goto bad_line;

         case 'f':                              /* Forced event */
            p = skip_to_blank (p);
            e.behavior |= MAT_FORCED;
            break;

         case 'h':                              /* hi-priority crash */
            p = skip_to_blank (p);
            e.behavior |= MAT_HIPRICM;
            break;

         case 'k':                              /* no #CM event */
            p = skip_to_blank (p);
            e.behavior |= MAT_NOCM;
            break;

         case 'l':                              /* Local only mail */
            ++p;
            e.node_cost = 0;
            if (*p == '=')
               {
               ++p;
               if (isdigit (*p))
                  {
                  e.node_cost = atoi (p);
                  }
               }
            else if (*p == '>')
               {
               ++p;
               if (isdigit (*p))
                  {
                  e.node_cost = -atoi (p) - 1;
                  }
               }
            else if (*p == '<')
               {
               ++p;
               if (isdigit (*p))
                  {
                  e.node_cost = atoi (p) - 1;
                  }
               }
            p = skip_to_blank (p);
            e.behavior |= MAT_LOCAL;
            break;

         case 'm':                              /* Mailable 24 hours */
            p = skip_to_blank (p);
            e.behavior |= MAT_NOMAIL24;
            break;

         case 'n':                              /* No requests */
            p = skip_to_blank (p);
            e.behavior |= MAT_NOREQ;
            break;

         case 'q':                              /* Mail Queued size */
            ++p;
            if (*p == '=')
               {
               ++p;
               if (isdigit (*p))
                  {
                  e.mailqsize = (unsigned long) atol (p);
                  p = skip_to_blank (p);
                  break;
                  }
               }
            eptr = MSG_TXT(M_BAD_QSIZE);
            goto bad_line;

         case 'r':                              /* Receive only */
            p = skip_to_blank (p);
            e.behavior |= MAT_NOOUT;
            break;

         case 's':                              /* Send only */
            p = skip_to_blank (p);
            e.behavior |= MAT_OUTONLY;
            break;

         case 't':                              /* Tries */
            ++p;
            if (sscanf (p, "=%d,%d", &j1, &j2) != 2)
               {
               eptr = MSG_TXT(M_BAD_TRIES);
               goto bad_line;
               }
            else
               {
               if ((j1 > 8) || (j1 < 1))
                  {
                  eptr = MSG_TXT(M_BAD_TRIES);
                  goto bad_line;
                  }
               e.with_connect = j1;
               e.no_connect = j2;
               }
            p = skip_to_blank (p);
            break;

         case 'x':                              /* No outbound requests here */
            p = skip_to_blank (p);
            e.behavior |= MAT_NOOUTREQ;
            break;

         default:                               /* Error condition */
            eptr = MSG_TXT(M_INDECIPHERABLE);
            goto bad_line;
         }
      }

   /* Save it in the array  of pointers */
   e_ptrs[num_events++] = e;

   /* Return that everything is cool */
   return (0);

err:
   eptr = MSG_TXT(M_BAD_DAY);
bad_line:
   (void) printf (eptr, e_line);
   return (1);
}