@@ -444,109 +444,83 @@ const uint32_t yearLookup[] = {
444444// ARM does not implement gmtime. This is a simple alternative implementation
445445// based on section 4.16
446446// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html
447- static zxerr_t extractTime (uint64_t t , uint8_t * sec , uint8_t * min , uint8_t * hour ,
448- uint16_t * day , uint8_t * month , uint16_t * year ) {
449-
450- uint8_t tm_sec ;
451- uint8_t tm_min ;
452- uint8_t tm_hour ;
453- uint16_t tm_day ;
454- uint8_t tm_mon ;
455- uint16_t tm_year ;
447+ zxerr_t extractTime (uint64_t time , timedata_t * date ) {
448+ if (date == NULL ) {
449+ return zxerr_no_data ;
450+ }
451+ MEMZERO (date , sizeof (timedata_t ));
456452
457- tm_sec = (uint8_t ) (t % 60 );
458- t -= tm_sec ;
459- t /= 60 ;
453+ date -> tm_sec = (uint8_t ) (time % 60 );
454+ time -= date -> tm_sec ;
455+ time /= 60 ;
460456
461- tm_min = (uint8_t ) (t % 60 );
462- t -= tm_min ;
463- t /= 60 ;
457+ date -> tm_min = (uint8_t ) (time % 60 );
458+ time -= date -> tm_min ;
459+ time /= 60 ;
464460
465- tm_hour = (uint8_t ) (t % 24 );
466- t -= tm_hour ;
467- t /= 24 ;
461+ date -> tm_hour = (uint8_t ) (time % 24 );
462+ time -= date -> tm_hour ;
463+ time /= 24 ;
468464
469465 // Look up tm_year
470- tm_year = 0 ;
466+ date -> tm_year = 0 ;
471467 const uint16_t yearLookupSize = sizeof (yearLookup )/sizeof (yearLookup [0 ]);
472- while (tm_year < yearLookupSize && yearLookup [tm_year ] <= t ) tm_year ++ ;
468+ while (date -> tm_year < yearLookupSize && yearLookup [date -> tm_year ] <= time ) date -> tm_year ++ ;
473469
474- if (tm_year == 0 || tm_year == yearLookupSize ) {
470+ if (date -> tm_year == 0 || date -> tm_year == yearLookupSize ) {
475471 return zxerr_out_of_bounds ;
476472 }
477- tm_year -- ;
473+ date -> tm_year -- ;
478474
479- tm_day = (uint16_t ) (t - yearLookup [tm_year ] + 1 );
480- tm_year = (uint16_t ) (1970 + tm_year );
475+ date -> tm_day = (uint16_t ) (time - yearLookup [date -> tm_year ] + 1 );
476+ date -> tm_year = (uint16_t ) (1970 + date -> tm_year );
481477
482478 // Get day/month
483- uint8_t leap = (uint8_t ) (tm_year % 4 == 0 && (tm_year % 100 != 0 || tm_year % 400 == 0 ) ? 1 : 0 );
479+ uint8_t leap = (uint8_t ) (date -> tm_year % 4 == 0 && (date -> tm_year % 100 != 0 || date -> tm_year % 400 == 0 ) ? 1 : 0 );
484480
485- for (tm_mon = 0 ; tm_mon < 12 ; tm_mon ++ ) {
486- uint8_t tmp = monthDays [tm_mon ];
487- tmp += (tm_mon == 1 ? leap : 0 );
488- if (tm_day <= tmp ) {
481+ for (date -> tm_mon = 0 ; date -> tm_mon < 12 ; date -> tm_mon ++ ) {
482+ uint8_t tmp = monthDays [date -> tm_mon ];
483+ tmp += (date -> tm_mon == 1 ? leap : 0 );
484+ if (date -> tm_day <= tmp ) {
489485 break ;
490486 }
491- tm_day -= tmp ;
487+ date -> tm_day -= tmp ;
492488 }
493- tm_mon ++ ;
494-
495- * sec = tm_sec ;
496- * min = tm_min ;
497- * hour = tm_hour ;
498- * day = tm_day ;
499- * month = tm_mon ;
500- * year = tm_year ;
489+ date -> tm_mon ++ ;
490+ date -> monthName = getMonth (date -> tm_mon );
501491
502492 return zxerr_ok ;
503493}
504494
505495zxerr_t decodeTime (timedata_t * td , uint64_t t ) {
506- CHECK_ZXERR (extractTime (t , & td -> tm_sec , & td -> tm_min , & td -> tm_hour ,
507- & td -> tm_day , & td -> tm_mon , & td -> tm_year ))
508- td -> monthName = (char * ) getMonth (td -> tm_mon );
509- return zxerr_ok ;
496+ return extractTime (t , td );
510497}
511498
512499zxerr_t printTime (char * out , uint16_t outLen , uint64_t t ) {
513- uint8_t tm_sec ;
514- uint8_t tm_min ;
515- uint8_t tm_hour ;
516- uint16_t tm_day ;
517- uint8_t tm_mon ;
518- uint16_t tm_year ;
519-
520- CHECK_ZXERR (extractTime (t , & tm_sec , & tm_min , & tm_hour , & tm_day , & tm_mon , & tm_year ))
521- const char * monthName = getMonth (tm_mon );
500+ timedata_t date ;
501+ CHECK_ZXERR (extractTime (t , & date ))
522502
523503 // YYYYmmdd HH:MM:SS
524504 snprintf (out , outLen , "%02d%s%04d %02d:%02d:%02dUTC" ,
525- tm_day ,
526- monthName ,
527- tm_year ,
528- tm_hour , tm_min , tm_sec
505+ date . tm_day ,
506+ date . monthName ,
507+ date . tm_year ,
508+ date . tm_hour , date . tm_min , date . tm_sec
529509 );
530510
531511 return zxerr_ok ;
532512}
533513
534514zxerr_t printTimeSpecialFormat (char * out , uint16_t outLen , uint64_t t ) {
535- uint8_t tm_sec ;
536- uint8_t tm_min ;
537- uint8_t tm_hour ;
538- uint16_t tm_day ;
539- uint8_t tm_mon ;
540- uint16_t tm_year ;
541-
542- CHECK_ZXERR (extractTime (t , & tm_sec , & tm_min , & tm_hour , & tm_day , & tm_mon , & tm_year ))
515+ timedata_t date ;
516+ CHECK_ZXERR (extractTime (t , & date ))
543517
544518 // YYYYmmdd HH:MM:SS
545519 snprintf (out , outLen , "%d-%02d-%02dT%02d:%02d:%02dZ" ,
546- tm_year ,
547- tm_mon ,
548- tm_day ,
549- tm_hour , tm_min , tm_sec
520+ date . tm_year ,
521+ date . tm_mon ,
522+ date . tm_day ,
523+ date . tm_hour , date . tm_min , date . tm_sec
550524 );
551525
552526 return zxerr_ok ;
0 commit comments