[BACK]Return to io.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / calendar

Diff for /src/usr.bin/calendar/io.c between version 1.29 and 1.40

version 1.29, 2005/04/15 14:28:56 version 1.40, 2015/10/23 11:01:30
Line 29 
Line 29 
  * SUCH DAMAGE.   * SUCH DAMAGE.
  */   */
   
 #ifndef lint  
 static const char copyright[] =  
 "@(#) Copyright (c) 1989, 1993\n\  
         The Regents of the University of California.  All rights reserved.\n";  
 #endif /* not lint */  
   
 #ifndef lint  
 #if 0  
 static const char sccsid[] = "@(#)calendar.c  8.3 (Berkeley) 3/25/94";  
 #else  
 static const char rcsid[] = "$OpenBSD$";  
 #endif  
 #endif /* not lint */  
   
 #include <sys/param.h>  
 #include <sys/stat.h>  #include <sys/stat.h>
 #include <sys/time.h>  #include <sys/time.h>
 #include <sys/types.h>  #include <sys/types.h>
Line 59 
Line 44 
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <tzfile.h>  
 #include <unistd.h>  #include <unistd.h>
   #include <limits.h>
   
 #include "pathnames.h"  #include "pathnames.h"
 #include "calendar.h"  #include "calendar.h"
   
   
 struct iovec header[] = {  struct iovec header[] = {
         {"From: ", 6},          { "From: ", 6 },
         {NULL, 0},          { NULL, 0 },
         {" (Reminder Service)\nTo: ", 24},          { " (Reminder Service)\nTo: ", 24 },
         {NULL, 0},          { NULL, 0 },
         {"\nSubject: ", 10},          { "\nSubject: ", 10 },
         {NULL, 0},          { NULL, 0 },
         {"'s Calendar\nPrecedence: bulk\n\n",  30},          { "'s Calendar\nPrecedence: bulk\n",  29 },
           { "Auto-Submitted: auto-generated\n\n", 32 },
 };  };
   
   
 void  void
 cal(void)  cal(void)
 {  {
         int printing;          int ch, l, i, bodun = 0, bodun_maybe = 0, var, printing;
         char *p;  
         FILE *fp;  
         int ch, l, i, bodun = 0, bodun_maybe = 0;  
         int var;  
         char buf[2048 + 1], *prefix = NULL;  
         struct event *events, *cur_evt, *ev1, *tmp;          struct event *events, *cur_evt, *ev1, *tmp;
           char buf[2048 + 1], *prefix = NULL, *p;
         struct match *m;          struct match *m;
         size_t nlen;          FILE *fp;
   
         events = NULL;          events = NULL;
         cur_evt = NULL;          cur_evt = NULL;
Line 107 
Line 89 
                 if (strncmp(buf, "LANG=", 5) == 0) {                  if (strncmp(buf, "LANG=", 5) == 0) {
                         (void) setlocale(LC_ALL, buf + 5);                          (void) setlocale(LC_ALL, buf + 5);
                         setnnames();                          setnnames();
                         if (!strcmp(buf + 5, "ru_RU.KOI8-R") ||                          /* XXX remove KOI8 lines after 5.9 is out */
                           if (!strcmp(buf + 5, "ru_RU.UTF-8") ||
                               !strcmp(buf + 5, "uk_UA.UTF-8") ||
                               !strcmp(buf + 5, "by_BY.UTF-8")) ||
                               !strcmp(buf + 5, "ru_RU.KOI8-R") ||
                             !strcmp(buf + 5, "uk_UA.KOI8-U") ||                              !strcmp(buf + 5, "uk_UA.KOI8-U") ||
                             !strcmp(buf + 5, "by_BY.KOI8-B")) {                              !strcmp(buf + 5, "by_BY.KOI8-B")) {
                                 bodun_maybe++;                                  bodun_maybe++;
Line 147 
Line 133 
                 /* User defined names for special events */                  /* User defined names for special events */
                 if ((p = strchr(buf, '='))) {                  if ((p = strchr(buf, '='))) {
                         for (i = 0; i < NUMEV; i++) {                          for (i = 0; i < NUMEV; i++) {
                         if (strncasecmp(buf, spev[i].name, spev[i].nlen) == 0 &&                                  if (strncasecmp(buf, spev[i].name,
                             (p - buf == spev[i].nlen) && buf[spev[i].nlen + 1]) {                                      spev[i].nlen) == 0 &&
                                 p++;                                      (p - buf == spev[i].nlen) &&
                                 if (spev[i].uname != NULL)                                      buf[spev[i].nlen + 1]) {
                                         free(spev[i].uname);                                          p++;
                                 if ((spev[i].uname = strdup(p)) == NULL)                                          if (spev[i].uname != NULL)
                                         err(1, NULL);                                                  free(spev[i].uname);
                                 spev[i].ulen = strlen(p);                                          if ((spev[i].uname = strdup(p)) == NULL)
                                 i = NUMEV + 1;                                                  err(1, NULL);
                                           spev[i].ulen = strlen(p);
                                           i = NUMEV + 1;
                                   }
                         }                          }
                         }                          if (i > NUMEV)
                 if (i > NUMEV)                                  continue;
                         continue;  
                 }                  }
                 if (buf[0] != '\t') {                  if (buf[0] != '\t') {
                         printing = (m = isnow(buf, bodun)) ? 1 : 0;                          printing = (m = isnow(buf, bodun)) ? 1 : 0;
Line 178 
Line 166 
   
                                 ev1 = NULL;                                  ev1 = NULL;
                                 while (m) {                                  while (m) {
                                 cur_evt = (struct event *) malloc(sizeof(struct event));                                          cur_evt = malloc(sizeof(struct event));
                                 if (cur_evt == NULL)                                          if (cur_evt == NULL)
                                         err(1, NULL);  
   
                                 cur_evt->when = m->when;  
                                 snprintf(cur_evt->print_date,  
                                     sizeof(cur_evt->print_date), "%s%c",  
                                     m->print_date, (var + m->var) ? '*' : ' ');  
                                 if (ev1) {  
                                         cur_evt->desc = ev1->desc;  
                                         cur_evt->ldesc = NULL;  
                                 } else {  
                                         if (m->bodun && prefix) {  
                                                 int l1 = strlen(prefix);  
                                                 int l2 = strlen(p);  
                                                 int len = l1 + l2 + 2;  
                                                 if ((cur_evt->ldesc =  
                                                     malloc(len)) == NULL)  
                                                         err(1, NULL);  
                                                 snprintf(cur_evt->ldesc, len,  
                                                     "\t%s %s", prefix, p + 1);  
                                         } else if ((cur_evt->ldesc =  
                                             strdup(p)) == NULL)  
                                                 err(1, NULL);                                                  err(1, NULL);
                                         cur_evt->desc = &(cur_evt->ldesc);  
                                         ev1 = cur_evt;                                          cur_evt->when = m->when;
                                           snprintf(cur_evt->print_date,
                                               sizeof(cur_evt->print_date), "%s%c",
                                               m->print_date, (var + m->var) ? '*' : ' ');
                                           if (ev1) {
                                                   cur_evt->desc = ev1->desc;
                                                   cur_evt->ldesc = NULL;
                                           } else {
                                                   if (m->bodun && prefix) {
                                                           if (asprintf(&cur_evt->ldesc,
                                                               "\t%s %s", prefix,
                                                               p + 1) == -1)
                                                                   err(1, NULL);
                                                   } else if ((cur_evt->ldesc =
                                                       strdup(p)) == NULL)
                                                           err(1, NULL);
                                                   cur_evt->desc = &(cur_evt->ldesc);
                                                   ev1 = cur_evt;
                                           }
                                           insert(&events, cur_evt);
                                           foo = m;
                                           m = m->next;
                                           free(foo);
                                 }                                  }
                                 insert(&events, cur_evt);  
                                 foo = m;  
                                 m = m->next;  
                                 free(foo);  
                                 }  
                         }                          }
                 }                  } else if (printing) {
                 else if (printing) {                          if (asprintf(&p, "%s\n%s", ev1->ldesc,
                         nlen = strlen(ev1->ldesc) + strlen(buf) + 2;                              buf) == -1)
                         if ((ev1->ldesc = realloc(ev1->ldesc, nlen)) == NULL)  
                                 err(1, NULL);                                  err(1, NULL);
                         snprintf(ev1->ldesc, nlen, "%s\n%s", ev1->ldesc, buf);                          free(ev1->ldesc);
                           ev1->ldesc = p;
                 }                  }
         }          }
         tmp = events;          tmp = events;
Line 236 
Line 220 
 }  }
   
 int  int
 getfield(p, endp, flags)  getfield(char *p, char **endp, int *flags)
         char *p, **endp;  
         int *flags;  
 {  {
         int val, var, i;          int val, var, i;
         char *start, savech;          char *start, savech;
   
         for (; !isdigit(*p) && !isalpha(*p) && *p != '*' && *p != '\t'; ++p)          for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) &&
               *p != '*' && *p != '\t'; ++p)
                 ;                  ;
         if (*p == '*') {                        /* `*' is every month */          if (*p == '*') {                        /* `*' is every month */
                 *flags |= F_ISMONTH;                  *flags |= F_ISMONTH;
                 *endp = p+1;                  *endp = p+1;
                 return (-1);    /* means 'every month' */                  return (-1);    /* means 'every month' */
         }          }
         if (isdigit(*p)) {          if (isdigit((unsigned char)*p)) {
                 val = strtol(p, &p, 10);        /* if 0, it's failure */                  val = strtol(p, &p, 10);        /* if 0, it's failure */
                 for (; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p)                  for (; !isdigit((unsigned char)*p) &&
                       !isalpha((unsigned char)*p) && *p != '*'; ++p)
                         ;                          ;
                 *endp = p;                  *endp = p;
                 return (val);                  return (val);
         }          }
         for (start = p; isalpha(*++p);)          for (start = p; isalpha((unsigned char)*++p);)
                 ;                  ;
   
         /* Sunday-1 */          /* Sunday-1 */
         if (*p == '+' || *p == '-')          if (*p == '+' || *p == '-')
             for(; isdigit(*++p);)                  for(; isdigit((unsigned char)*++p); )
                 ;                          ;
   
         savech = *p;          savech = *p;
         *p = '\0';          *p = '\0';
Line 274 
Line 258 
   
         /* Day */          /* Day */
         else if ((val = getday(start)) != 0) {          else if ((val = getday(start)) != 0) {
             *flags |= F_ISDAY;                  *flags |= F_ISDAY;
   
             /* variable weekday */                  /* variable weekday */
             if ((var = getdayvar(start)) != 0) {                  if ((var = getdayvar(start)) != 0) {
                 if (var <= 5 && var >= -4)                          if (var <= 5 && var >= -4)
                     val += var * 10;                                  val += var * 10;
 #ifdef DEBUG  #ifdef DEBUG
                 printf("var: %d\n", var);                          printf("var: %d\n", var);
 #endif  #endif
             }                  }
         }          }
   
         /* Try specials (Easter, Paskha, ...) */          /* Try specials (Easter, Paskha, ...) */
Line 301 
Line 285 
                         }                          }
                 }                  }
                 if (i > NUMEV) {                  if (i > NUMEV) {
                         switch(*start) {                          const char *errstr;
   
                           switch (*start) {
                         case '-':                          case '-':
                         case '+':                          case '+':
                            var = atoi(start);                                  var = strtonum(start + 1, 0, 365, &errstr);
                            if (var > 365 || var < -365)                                  if (errstr)
                                    return (0); /* Someone is just being silly */                                          return (0); /* Someone is just being silly */
                            val += (NUMEV + 1) * var;                                  if (*start == '-')
                            /* We add one to the matching event and multiply by                                          var = -var;
                             * (NUMEV + 1) so as not to return 0 if there's a match.                                  val += (NUMEV + 1) * var;
                             * val will overflow if there is an obscenely large                                  /* We add one to the matching event and multiply by
                             * number of special events. */                                   * (NUMEV + 1) so as not to return 0 if there's a match.
                            break;                                   * val will overflow if there is an obscenely large
                                    * number of special events. */
                                   break;
                         }                          }
                 *flags |= F_SPECIAL;                          *flags |= F_SPECIAL;
                 }                  }
                 if (!(*flags & F_SPECIAL)) {                  if (!(*flags & F_SPECIAL)) {
                 /* undefined rest */                          /* undefined rest */
                         *p = savech;                          *p = savech;
                         return (0);                          return (0);
                 }                  }
         }          }
         for (*p = savech; !isdigit(*p) && !isalpha(*p) && *p != '*' && *p != '\t'; ++p)          for (*p = savech; !isdigit((unsigned char)*p) &&
               !isalpha((unsigned char)*p) && *p != '*' && *p != '\t'; ++p)
                 ;                  ;
         *endp = p;          *endp = p;
         return (val);          return (val);
Line 396 
Line 385 
 }  }
   
 void  void
 closecal(fp)  closecal(FILE *fp)
         FILE *fp;  
 {  {
         struct stat sbuf;          struct stat sbuf;
         int nread, pdes[2], status;          int nread, pdes[2], status;
Line 433 
Line 421 
   
         header[1].iov_base = header[3].iov_base = pw->pw_name;          header[1].iov_base = header[3].iov_base = pw->pw_name;
         header[1].iov_len = header[3].iov_len = strlen(pw->pw_name);          header[1].iov_len = header[3].iov_len = strlen(pw->pw_name);
         writev(pdes[1], header, 7);          writev(pdes[1], header, 8);
         while ((nread = read(fileno(fp), buf, sizeof(buf))) > 0)          while ((nread = read(fileno(fp), buf, sizeof(buf))) > 0)
                 (void)write(pdes[1], buf, nread);                  (void)write(pdes[1], buf, nread);
         (void)close(pdes[1]);          (void)close(pdes[1]);
Line 444 
Line 432 
   
   
 void  void
 insert(head, cur_evt)  insert(struct event **head, struct event *cur_evt)
         struct event **head;  
         struct event *cur_evt;  
 {  {
         struct event *tmp, *tmp2;          struct event *tmp, *tmp2;
   

Legend:
Removed from v.1.29  
changed lines
  Added in v.1.40