From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/4368 Path: news.gmane.org!not-for-mail From: Szabolcs Nagy Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCHv2] Add support for leap seconds in zoneinfo files Date: Thu, 5 Dec 2013 06:18:09 +0100 Message-ID: <20131205051809.GY1685@port70.net> References: <5294EE35.8040603@skarnet.org> <20131126233212.GE24286@brightrain.aerifal.cx> <529570BB.2060804@skarnet.org> <20131127042550.GI24286@brightrain.aerifal.cx> <529588D8.3020006@skarnet.org> <20131127184307.GN1685@port70.net> <52965735.9070409@skarnet.org> <529FD33A.8000509@skarnet.org> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1386220699 27972 80.91.229.3 (5 Dec 2013 05:18:19 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 5 Dec 2013 05:18:19 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-4372-gllmg-musl=m.gmane.org@lists.openwall.com Thu Dec 05 06:18:23 2013 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1VoRKR-0005dS-Ee for gllmg-musl@plane.gmane.org; Thu, 05 Dec 2013 06:18:23 +0100 Original-Received: (qmail 13481 invoked by uid 550); 5 Dec 2013 05:18:21 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 13473 invoked from network); 5 Dec 2013 05:18:21 -0000 Content-Disposition: inline In-Reply-To: <529FD33A.8000509@skarnet.org> User-Agent: Mutt/1.5.21 (2010-09-15) Xref: news.gmane.org gmane.linux.lib.musl.general:4368 Archived-At: * Laurent Bercot [2013-12-05 01:13:30 +0000]: > > +static int leapsecs_sub(long long *t) > +{ > + long long trans; > + int corr; > + unsigned int i = __leapsecs_num; > + int hit = 0; > + for (; i; i--) { > + __leapsecs_read(i-1, &trans, &corr); > + if (*t >= trans) break; > + } > + if (i) { > + if (*t == trans) hit = 1; > + *t -= corr; > + } > + return hit; > +} > > +static void leapsecs_add(long long *t, int hit) > +{ > + int oldcorr = 0; > + unsigned int i = 0; > + for (; i < __leapsecs_num; i++) { > + long long trans; > + int newcorr; > + __leapsecs_read(i, &trans, &newcorr); > + if (*t < trans) break; > + if (!hit || (*t > trans)) { > + *t += newcorr - oldcorr; > + } > + oldcorr = newcorr; > + } > +} > + i assume hit=leapsecs_sub(&t); if(hit) t++; leapsecs_add(&t,hit); should give back the original t, then the add part can go backwards on the leapsec list instead of forward: static void leapsecs_add(long long *t, int hit) { long long trans; int corr; unsigned int i = __leapsecs_num; for (; i; i--) { __leapsecs_read(i-1, &trans, &corr); if (*t+corr > trans) { *t += corr; // only consider hit at a leapsecond if (hit && *t == trans+1) *t--; break; } } }