diff --git a/src/mtime_iso8601.c b/src/mtime_iso8601.c index 6e5f4cbb1705beb15f3c81a019b54e4672493fe7..bf7397199dfe95ffdcb1bc6f91623e32ad63b50a 100644 --- a/src/mtime_iso8601.c +++ b/src/mtime_iso8601.c @@ -633,35 +633,44 @@ _match: char* _du_ms; int _ms; int _seconds; - + div_t _split; + + if (strstr(_du_second,".")) + { + _du_ms = (strstr(_du_second,".")+1); + if (_du_ms[0] == '-') + _du_ms = _du_ms + 1; + + _ms = atoi(_du_ms); + + if (strlen(_du_ms) == 1) + duObj->ms += _ms*100; + else if (strlen(_du_ms) == 2) + duObj->ms += _ms*10; + else + duObj->ms += _ms; + } + + if (duObj->ms > 999) + { + _split = div(duObj->ms, 1000); + duObj->second += _split.quot; + duObj->ms = _split.rem; + } + strncpy( _du_second, ts, (size_t)(te-ts)); _du_second[MAX_BUFFER_LENGTH-1] = '\0'; _seconds = atoi(_du_second); + _seconds += duObj->day * 86400 + duObj->hour * 3600 + duObj->minute * 60 + duObj->second; duObj->day = _seconds / 86400; _seconds -= duObj->day * 86400; duObj->hour = _seconds / 3600; _seconds -= duObj->hour * 3600; duObj->minute = _seconds / 60; - duObj->second = _seconds - duObj->minute * 60; - - if(strstr(_du_second,".")) - { - _du_ms = (strstr(_du_second,".")+1); - if(_du_ms[0] == '-') - _du_ms = _du_ms + 1; - - _ms = atoi(_du_ms); - - if(strlen(_du_ms) == 1) - duObj->ms = _ms*100; - else if(strlen(_du_ms) == 2) - duObj->ms = _ms*10; - else - duObj->ms = _ms; - } + duObj->second = _seconds - duObj->minute * 60; } break; -#line 665 "mtime_iso8601.c" +#line 674 "mtime_iso8601.c" } } @@ -674,7 +683,7 @@ _again: _out: {} } -#line 548 "mtime_iso8601.rl" +#line 557 "mtime_iso8601.rl" } diff --git a/src/mtime_iso8601.rl b/src/mtime_iso8601.rl index 94a1207eb69d32919433461f32b524cb6f258894..9bade13a607a0d03bc174c7e3ed8ffcfd6170f3b 100644 --- a/src/mtime_iso8601.rl +++ b/src/mtime_iso8601.rl @@ -281,32 +281,41 @@ date_machine( char *str, ISO8601_STATUS* stat, struct internal_datetime* dtObj, char* _du_ms; int _ms; int _seconds; - + div_t _split; + + if (strstr(_du_second,".")) + { + _du_ms = (strstr(_du_second,".")+1); + if (_du_ms[0] == '-') + _du_ms = _du_ms + 1; + + _ms = atoi(_du_ms); + + if (strlen(_du_ms) == 1) + duObj->ms += _ms*100; + else if (strlen(_du_ms) == 2) + duObj->ms += _ms*10; + else + duObj->ms += _ms; + } + + if (duObj->ms > 999) + { + _split = div(duObj->ms, 1000); + duObj->second += _split.quot; + duObj->ms = _split.rem; + } + strncpy( _du_second, ts, (size_t)(te-ts)); _du_second[MAX_BUFFER_LENGTH-1] = '\0'; _seconds = atoi(_du_second); + _seconds += duObj->day * 86400 + duObj->hour * 3600 + duObj->minute * 60 + duObj->second; duObj->day = _seconds / 86400; _seconds -= duObj->day * 86400; duObj->hour = _seconds / 3600; _seconds -= duObj->hour * 3600; duObj->minute = _seconds / 60; - duObj->second = _seconds - duObj->minute * 60; - - if(strstr(_du_second,".")) - { - _du_ms = (strstr(_du_second,".")+1); - if(_du_ms[0] == '-') - _du_ms = _du_ms + 1; - - _ms = atoi(_du_ms); - - if(strlen(_du_ms) == 1) - duObj->ms = _ms*100; - else if(strlen(_du_ms) == 2) - duObj->ms = _ms*10; - else - duObj->ms = _ms; - } + duObj->second = _seconds - duObj->minute * 60; } diff --git a/test/duration.f90 b/test/duration.f90 index 4da39d97cd9e8ae4396759d1aae8f7a88de72b3c..66a5de0454ba54feec5e3567df3280090b72bc96 100644 --- a/test/duration.f90 +++ b/test/duration.f90 @@ -21,8 +21,30 @@ program duration call testTimedelta('P2DT6H', 'P02DT06H') call testTimedelta('P200D', 'P200D') + call testTimedeltaComp('PT24M', 'PT06H00M00S', '<', .TRUE.) + contains + subroutine testTimedeltaComp(td_A, td_B, op, expected) + character(len=*), intent(in) :: td_a + character(len=*), intent(in) :: td_b + character(len=*), intent(in) :: op + logical, intent(in) :: expected + + TYPE(timedelta), POINTER :: mtime_A, mtime_B + + mtime_A => newTimedelta(td_a) + mtime_B => newTimedelta(td_b) + + select case (op) + case ('<') + print *, td_a, ' < ', td_b, ' ? ', mtime_A < mtime_B, ' expected ', expected + case default + print *, 'Unknown comparison operator.' + end select + + end subroutine testTimedeltaComp + subroutine testTimedelta(interval, expected) character(len=*), intent(in) :: interval, expected character(len=max_timedelta_str_len) :: dstring