+void* allocCopy(void* src, int *boff, size_t size) {
+ void* mem = NULL;
+ if ( size == 0 ) return NULL;
+
+ mem = malloc(size);
+ memcpy(mem, src + *boff / 8, size);
+ *boff += size * 8;
+ return mem;
+}
+
+time_t parseMJD( unsigned char *data ) {
+ int tnum, year, mon, mday;
+ struct tm MJD;
+
+ tnum = (data[0] & 0xFF) << 8 | (data[1] & 0xFF);
+ year = (tnum - 15078.2) / 365.25;
+ mon = ((tnum - 14956.1) - (int)(year * 365.25)) / 30.6001;
+ mday = (tnum - 14956) - (int)(year * 365.25) - (int)(mon * 30.6001);
+
+ if(mon == 14 || mon == 15) {
+ year += 1;
+ mon -= 13;
+ } else {
+ mon -= 1;
+ }
+
+ memset( &MJD, 0, sizeof(MJD) );
+ MJD.tm_year = year;
+ MJD.tm_mon = mon - 1;
+ MJD.tm_mday = mday;
+
+ MJD.tm_hour = BCD(data[2]);
+ MJD.tm_min = BCD(data[3]);
+ MJD.tm_sec = BCD(data[4]);
+ return mktime( &MJD );
+}
+