Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!utgpu!water!watnot!watmath!clyde!rutgers!husc6!seismo!munnari!sources-request
From: sources-requ...@munnari.UUCP
Newsgroups: mod.sources
Subject: v09i021:  Public Domain (Table Driven) ``localtime'', Patch1
Message-ID: <1507@munnari.oz>
Date: Sun, 12-Apr-87 08:06:30 EST
Article-I.D.: munnari.1507
Posted: Sun Apr 12 08:06:30 1987
Date-Received: Sun, 12-Apr-87 20:02:55 EST
Sender: k...@munnari.oz
Lines: 339
Approved: k...@munnari.oz.au

Submitted by: Arthur David Olson <a...@elsie.UUCP>
Mod.sources: Volume 9, Issue 21
Archive-name: pd-localtime/Patch1

System: pd-localtime
Patch #: 1
Priority: MEDIUM

Description:
	This is patch #1 for the public domain localtime.

	It fixes the following problems (in decreasing order of severity):

	1) The "timezone" variable, defined when USG_COMPAT is defined
	   was being set to a value of the wrong sign (not compatible).

	2) asctime() did not guarantee zero filled 2 digit fields when
	   used with old versions of printf that cannot handle the "%.2d"
	   format specification.

	3) The STD_INSPIRED functions for converting "struct tm" values
	   to time_t's would fail when given a "struct tm" value that
	   was "illegal" (ie: not a possible output from localtime)
	   and which happen to occur just near the end of one of the
	   shorter months (the actual requirements are a little stricter
	   than this), or from timelocal or timeoff where the offset
	   moves the time from one month to another (where the earlier
	   month is one of the shorter ones).

	4) Missing rules for East Saskatchewan in Canada.

	5) Typos in the zic(8) manual page.

Fix:
	From your newsreading program, say "| patch -d DIR" where DIR
	is the directory where the pd-localtime distribution is saved.
	Alternatively, change to that directory, and do "patch -d . <newsitem".
	Recompile and re-install the library routines.  Recompile any
	programs using the STD_INSPIRED functions.  There is no need to
	recompile other programs unless the asctime output is incorrect.
	(nb: Patchlevel.h is a new file).

Index: Patchlevel.h
*** OLD/Patchlevel.h	Sun Apr 12 22:37:29 1987
--- Patchlevel.h	Sun Apr 12 22:37:46 1987
***************
*** 0

--- 1 -----
+ #define PATCHLEVEL 1

Index: asctime.c
*** OLD/asctime.c	Sun Apr 12 22:28:21 1987
--- asctime.c	Sun Apr 12 22:28:37 1987
***************
*** 5,13
  #include "stdio.h"
  
  #ifndef lint
  #ifndef NOID
! static char	sccsid[] = "@(#)asctime.c	3.1";
  #endif /* !NOID */
  #endif /* !lint */
  
  #include "time.h"

--- 5,13 -----
  #include "stdio.h"
  
  #ifndef lint
  #ifndef NOID
! static char	sccsid[] = "@(#)asctime.c	3.2";
  #endif /* !NOID */
  #endif /* !lint */
  
  #include "time.h"
***************
*** 33,41
  		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  	};
  	static char	result[26];
  
! 	(void) sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
  		wday_name[timeptr->tm_wday],
  		mon_name[timeptr->tm_mon],
  		timeptr->tm_mday, timeptr->tm_hour,
  		timeptr->tm_min, timeptr->tm_sec,

--- 33,41 -----
  		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  	};
  	static char	result[26];
  
! 	(void) sprintf(result, "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %d\n",
  		wday_name[timeptr->tm_wday],
  		mon_name[timeptr->tm_mon],
  		timeptr->tm_mday, timeptr->tm_hour,
  		timeptr->tm_min, timeptr->tm_sec,

Index: localtime.c
*** OLD/localtime.c	Sun Apr 12 22:28:22 1987
--- localtime.c	Sun Apr 12 22:28:39 1987
***************
*** 18,26
  #endif /* !MAXPATHLEN */
  
  #ifndef lint
  #ifndef NOID
! static char	sccsid[] = "@(#)localtime.c	3.1";
  #endif /* !NOID */
  #endif /* !lint */
  
  #ifndef TRUE

--- 18,26 -----
  #endif /* !MAXPATHLEN */
  
  #ifndef lint
  #ifndef NOID
! static char	sccsid[] = "@(#)localtime.c	3.2";
  #endif /* !NOID */
  #endif /* !lint */
  
  #ifndef TRUE
***************
*** 178,186
  	** Set tzname elements to initial values.
  	*/
  	tzname[0] = tzname[1] = &s.chars[0];
  #ifdef USG_COMPAT
! 	timezone = s.ttis[0].tt_gmtoff;
  	daylight = 0;
  #endif /* USG_COMPAT */
  	for (i = 1; i < s.typecnt; ++i) {
  		register struct ttinfo *	ttisp;

--- 178,186 -----
  	** Set tzname elements to initial values.
  	*/
  	tzname[0] = tzname[1] = &s.chars[0];
  #ifdef USG_COMPAT
! 	timezone = -s.ttis[0].tt_gmtoff;
  	daylight = 0;
  #endif /* USG_COMPAT */
  	for (i = 1; i < s.typecnt; ++i) {
  		register struct ttinfo *	ttisp;
***************
*** 193,201
  #endif /* USG_COMPAT */ 
  		} else {
  			tzname[0] = &s.chars[ttisp->tt_abbrind];
  #ifdef USG_COMPAT
! 			timezone = ttisp->tt_gmtoff;
  #endif /* USG_COMPAT */ 
  		}
  	}
  	return 0;

--- 193,201 -----
  #endif /* USG_COMPAT */ 
  		} else {
  			tzname[0] = &s.chars[ttisp->tt_abbrind];
  #ifdef USG_COMPAT
! 			timezone = -ttisp->tt_gmtoff;
  #endif /* USG_COMPAT */ 
  		}
  	}
  	return 0;

Index: northamerica
*** OLD/northamerica	Sun Apr 12 22:28:23 1987
--- northamerica	Sun Apr 12 22:28:40 1987
***************
*** 1,5
! # @(#)northamerica	3.1
  
  # Despite the performance of existing (4.[123]BSD, System V Release 2.0) code,
  # US Daylight Saving Time ended on the last Sunday of *October* in 1974.
  # See, for example, the front page of the Saturday, October 26, 1974

--- 1,5 -----
! # @(#)northamerica	3.2
  
  # Despite the performance of existing (4.[123]BSD, System V Release 2.0) code,
  # US Daylight Saving Time ended on the last Sunday of *October* in 1974.
  # See, for example, the front page of the Saturday, October 26, 1974
***************
*** 86,93
  Zone	Canada/Newfoundland	-3:30	Canada		N%sT
  Zone	Canada/Atlantic		-4:00	Canada		A%sT
  Zone	Canada/Eastern		-5:00	Canada		E%sT
  Zone	Canada/Central		-6:00	Canada		C%sT
  Zone	Canada/Mountain		-7:00	Canada		M%sT
  Zone	Canada/Pacific		-8:00	Canada		P%sT
  Zone	Canada/Yukon		-9:00	Canada		Y%sT
  

--- 86,94 -----
  Zone	Canada/Newfoundland	-3:30	Canada		N%sT
  Zone	Canada/Atlantic		-4:00	Canada		A%sT
  Zone	Canada/Eastern		-5:00	Canada		E%sT
  Zone	Canada/Central		-6:00	Canada		C%sT
+ Zone	Canada/East-Saskatchewan	-6:00	-	CST # No DST as of 1987
  Zone	Canada/Mountain		-7:00	Canada		M%sT
  Zone	Canada/Pacific		-8:00	Canada		P%sT
  Zone	Canada/Yukon		-9:00	Canada		Y%sT
  

Index: timemk.c
*** OLD/timemk.c	Sun Apr 12 22:28:24 1987
--- timemk.c	Sun Apr 12 22:28:42 1987
***************
*** 3,11
  /*LINTLIBRARY*/
  
  #ifndef lint
  #ifndef NOID
! static char	sccsid[] = "@(#)timemk.c	3.1";
  #endif /* !NOID */
  #endif /* !lint */
  
  #ifdef STD_INSPIRED

--- 3,11 -----
  /*LINTLIBRARY*/
  
  #ifndef lint
  #ifndef NOID
! static char	sccsid[] = "@(#)timemk.c	3.2";
  #endif /* !NOID */
  #endif /* !lint */
  
  #ifdef STD_INSPIRED
***************
*** 111,119
  			*timeptr = yourtm;	/* restore "original" value */
  			if (yourtm.tm_mday == 31) {
  				timeptr->tm_mday = 1;
  				++(timeptr->tm_mon);
! 				t = timemk(timeptr, funcp);
  				if (t != WRONG)
  					return t;
  				*timeptr = yourtm;
  			} else if (yourtm.tm_mon == TM_FEBRUARY &&

--- 111,119 -----
  			*timeptr = yourtm;	/* restore "original" value */
  			if (yourtm.tm_mday == 31) {
  				timeptr->tm_mday = 1;
  				++(timeptr->tm_mon);
! 				t = timemk(timeptr, funcp, offset);
  				if (t != WRONG)
  					return t;
  				*timeptr = yourtm;
  			} else if (yourtm.tm_mon == TM_FEBRUARY &&
***************
*** 119,127
  			} else if (yourtm.tm_mon == TM_FEBRUARY &&
  				yourtm.tm_mday > 28) {
  					timeptr->tm_mday -= 28;
  					++(timeptr->tm_mon);
! 					t = timemk(timeptr, funcp);
  					if (t != WRONG)
  						return t;
  					*timeptr = yourtm;
  			}

--- 119,127 -----
  			} else if (yourtm.tm_mon == TM_FEBRUARY &&
  				yourtm.tm_mday > 28) {
  					timeptr->tm_mday -= 28;
  					++(timeptr->tm_mon);
! 					t = timemk(timeptr, funcp, offset);
  					if (t != WRONG)
  						return t;
  					*timeptr = yourtm;
  			}

Index: zic.8
*** OLD/zic.8	Sun Apr 12 22:28:26 1987
--- zic.8	Sun Apr 12 22:28:44 1987
***************
*** 97,105
  .B FROM
  field.
  .TP
  .B TYPE
! Gives the type of year in which the year applies.
  If
  .B TYPE
  is
  .B \-

--- 97,105 -----
  .B FROM
  field.
  .TP
  .B TYPE
! Gives the type of year in which the rule applies.
  If
  .B TYPE
  is
  .B \-
***************
*** 154,162
  .B ON
  field.
  .TP
  .B AT
! Gives the time of day at which the rule takes affect.
  Recognized forms include:
  .nf
  .in +.5i
  .sp

--- 154,162 -----
  .B ON
  field.
  .TP
  .B AT
! Gives the time of day at which the rule takes effect.
  Recognized forms include:
  .nf
  .in +.5i
  .sp
***************
*** 290,294
  .SH FILES
  /etc/zoneinfo	standard directory used for created files
  .SH "SEE ALSO"
  newctime(3), tzfile(5), zdump(8)
! .. @(#)zic.8	3.1

--- 290,294 -----
  .SH FILES
  /etc/zoneinfo	standard directory used for created files
  .SH "SEE ALSO"
  newctime(3), tzfile(5), zdump(8)
! .. @(#)zic.8	3.2