@@ -72,11 +72,43 @@ libmseed_memory_prealloc (void *ptr, size_t size, size_t *currentsize)
7272 return newptr ;
7373}
7474
75- /* A constant number of seconds between the NTP and Posix /Unix time epoch */
75+ /* A constant number of seconds between the NTP and POSIX /Unix time epoch */
7676#define NTPPOSIXEPOCHDELTA 2208988800LL
77+ #define NTPEPOCH2NSTIME (X ) (MS_EPOCH2NSTIME (X - NTPPOSIXEPOCHDELTA))
78+
79+ /* Embedded leap second list */
80+ static LeapSecond embedded_leapsecondlist [] = {
81+ {.leapsecond = NTPEPOCH2NSTIME (2272060800 ), .TAIdelta = 10 , .next = & embedded_leapsecondlist [1 ]},
82+ {.leapsecond = NTPEPOCH2NSTIME (2287785600 ), .TAIdelta = 11 , .next = & embedded_leapsecondlist [2 ]},
83+ {.leapsecond = NTPEPOCH2NSTIME (2303683200 ), .TAIdelta = 12 , .next = & embedded_leapsecondlist [3 ]},
84+ {.leapsecond = NTPEPOCH2NSTIME (2335219200 ), .TAIdelta = 13 , .next = & embedded_leapsecondlist [4 ]},
85+ {.leapsecond = NTPEPOCH2NSTIME (2366755200 ), .TAIdelta = 14 , .next = & embedded_leapsecondlist [5 ]},
86+ {.leapsecond = NTPEPOCH2NSTIME (2398291200 ), .TAIdelta = 15 , .next = & embedded_leapsecondlist [6 ]},
87+ {.leapsecond = NTPEPOCH2NSTIME (2429913600 ), .TAIdelta = 16 , .next = & embedded_leapsecondlist [7 ]},
88+ {.leapsecond = NTPEPOCH2NSTIME (2461449600 ), .TAIdelta = 17 , .next = & embedded_leapsecondlist [8 ]},
89+ {.leapsecond = NTPEPOCH2NSTIME (2492985600 ), .TAIdelta = 18 , .next = & embedded_leapsecondlist [9 ]},
90+ {.leapsecond = NTPEPOCH2NSTIME (2524521600 ), .TAIdelta = 19 , .next = & embedded_leapsecondlist [10 ]},
91+ {.leapsecond = NTPEPOCH2NSTIME (2571782400 ), .TAIdelta = 20 , .next = & embedded_leapsecondlist [11 ]},
92+ {.leapsecond = NTPEPOCH2NSTIME (2603318400 ), .TAIdelta = 21 , .next = & embedded_leapsecondlist [12 ]},
93+ {.leapsecond = NTPEPOCH2NSTIME (2634854400 ), .TAIdelta = 22 , .next = & embedded_leapsecondlist [13 ]},
94+ {.leapsecond = NTPEPOCH2NSTIME (2698012800 ), .TAIdelta = 23 , .next = & embedded_leapsecondlist [14 ]},
95+ {.leapsecond = NTPEPOCH2NSTIME (2776982400 ), .TAIdelta = 24 , .next = & embedded_leapsecondlist [15 ]},
96+ {.leapsecond = NTPEPOCH2NSTIME (2840140800 ), .TAIdelta = 25 , .next = & embedded_leapsecondlist [16 ]},
97+ {.leapsecond = NTPEPOCH2NSTIME (2871676800 ), .TAIdelta = 26 , .next = & embedded_leapsecondlist [17 ]},
98+ {.leapsecond = NTPEPOCH2NSTIME (2918937600 ), .TAIdelta = 27 , .next = & embedded_leapsecondlist [18 ]},
99+ {.leapsecond = NTPEPOCH2NSTIME (2950473600 ), .TAIdelta = 28 , .next = & embedded_leapsecondlist [19 ]},
100+ {.leapsecond = NTPEPOCH2NSTIME (2982009600 ), .TAIdelta = 29 , .next = & embedded_leapsecondlist [20 ]},
101+ {.leapsecond = NTPEPOCH2NSTIME (3029443200 ), .TAIdelta = 30 , .next = & embedded_leapsecondlist [21 ]},
102+ {.leapsecond = NTPEPOCH2NSTIME (3076704000 ), .TAIdelta = 31 , .next = & embedded_leapsecondlist [22 ]},
103+ {.leapsecond = NTPEPOCH2NSTIME (3124137600 ), .TAIdelta = 32 , .next = & embedded_leapsecondlist [23 ]},
104+ {.leapsecond = NTPEPOCH2NSTIME (3345062400 ), .TAIdelta = 33 , .next = & embedded_leapsecondlist [24 ]},
105+ {.leapsecond = NTPEPOCH2NSTIME (3439756800 ), .TAIdelta = 34 , .next = & embedded_leapsecondlist [25 ]},
106+ {.leapsecond = NTPEPOCH2NSTIME (3550089600 ), .TAIdelta = 35 , .next = & embedded_leapsecondlist [26 ]},
107+ {.leapsecond = NTPEPOCH2NSTIME (3644697600 ), .TAIdelta = 36 , .next = & embedded_leapsecondlist [27 ]},
108+ {.leapsecond = NTPEPOCH2NSTIME (3692217600 ), .TAIdelta = 37 , .next = NULL }};
77109
78110/* Global variable to hold a leap second list */
79- LeapSecond * leapsecondlist = NULL ;
111+ LeapSecond * leapsecondlist = & embedded_leapsecondlist [ 0 ] ;
80112
81113/* Days in each month, for non-leap and leap years */
82114static const int monthdays [] = {31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
@@ -1739,6 +1771,12 @@ ms_readleapsecondfile (const char *filename)
17391771 return -1 ;
17401772 }
17411773
1774+ /* Detatch embedded leap second list */
1775+ if (leapsecondlist == & embedded_leapsecondlist [0 ])
1776+ {
1777+ leapsecondlist = NULL ;
1778+ }
1779+
17421780 /* Free existing leapsecondlist */
17431781 while (leapsecondlist != NULL )
17441782 {
0 commit comments