From 23fb73fefcf3e9585d939edf09894d9f67510ef1 Mon Sep 17 00:00:00 2001 From: skarg Date: Tue, 24 Nov 2015 20:34:54 +0000 Subject: [PATCH] =?UTF-8?q?Added=20Date=20Time=20Wildcard=20compare=20func?= =?UTF-8?q?tions=20and=20unit=20tests.=20Thank=20you,=20Nikola=20Jeli?= =?UTF-8?q?=C4=87!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bacnet-stack/include/datetime.h | 13 +++++ bacnet-stack/src/datetime.c | 100 ++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/bacnet-stack/include/datetime.h b/bacnet-stack/include/datetime.h index 86b41bca..fea2316b 100644 --- a/bacnet-stack/include/datetime.h +++ b/bacnet-stack/include/datetime.h @@ -139,6 +139,19 @@ extern "C" { BACNET_DATE_TIME * datetime1, BACNET_DATE_TIME * datetime2); + /* full comparison functions: + * taking into account FF fields in date and time structures, + * do a full comparison of two values */ + int datetime_wildcard_compare_date( + BACNET_DATE * date1, + BACNET_DATE * date2); + int datetime_wildcard_compare_time( + BACNET_TIME * time1, + BACNET_TIME * time2); + int datetime_wildcard_compare( + BACNET_DATE_TIME * datetime1, + BACNET_DATE_TIME * datetime2); + /* utility copy functions */ void datetime_copy_date( BACNET_DATE * dest, diff --git a/bacnet-stack/src/datetime.c b/bacnet-stack/src/datetime.c index b440983b..eefdeb11 100644 --- a/bacnet-stack/src/datetime.c +++ b/bacnet-stack/src/datetime.c @@ -368,6 +368,81 @@ int datetime_compare( return diff; } +int datetime_wildcard_compare_date( + BACNET_DATE * date1, + BACNET_DATE * date2) +{ + int diff = 0; + + if (date1 && date2) { + if ((date1->year != 1900 + 0xFF) && (date2->year != 1900 + 0xFF)) { + diff = (int)date1->year - (int)date2->year; + } + if (diff == 0) { + if ((date1->month != 0xFF) && (date2->month != 0xFF)) { + diff = (int)date1->month - (int)date2->month; + } + if (diff == 0) { + if ((date1->day != 0xFF) && (date2->day != 0xFF)) { + diff = (int)date1->day - (int)date2->day; + } + /* we ignore weekday in comparison */ + } + } + } + + return diff; +} + +int datetime_wildcard_compare_time( + BACNET_TIME * time1, + BACNET_TIME * time2) +{ + int diff = 0; + + if (time1 && time2) { + if ((time1->hour != 0xFF) && (time2->hour != 0xFF)) { + diff = (int)time1->hour - (int)time2->hour; + } + if (diff == 0) { + if ((time1->min != 0xFF) && (time2->min != 0xFF)) { + diff = (int)time1->min - (int)time2->min; + } + if (diff == 0) { + if ((time1->sec != 0xFF) && (time2->sec != 0xFF)) { + diff = (int)time1->sec - (int)time2->sec; + } + if (diff == 0) { + if ((time1->hundredths != 0xFF) && + (time2->hundredths != 0xFF)) { + diff = (int)time1->hundredths - (int)time2->hundredths; + } + } + } + } + } + + return diff; +} + +int datetime_wildcard_compare( + BACNET_DATE_TIME * datetime1, + BACNET_DATE_TIME * datetime2) +{ + int diff = 0; + + diff = datetime_wildcard_compare_date( + &datetime1->date, + &datetime2->date); + if (diff == 0) { + diff = datetime_wildcard_compare_time( + &datetime1->time, + &datetime2->time); + } + + return diff; +} + void datetime_copy_date( BACNET_DATE * dest_date, BACNET_DATE * src_date) @@ -1023,6 +1098,29 @@ static void testBACnetDateTime( return; } +static void testWildcardDateTime( + Test * pTest) +{ + BACNET_DATE_TIME bdatetime1, bdatetime2; + BACNET_DATE bdate; + BACNET_TIME btime; + int diff = 0; + + datetime_wildcard_set(&bdatetime1); + ct_test(pTest, datetime_wildcard(&bdatetime1)); + ct_test(pTest, datetime_wildcard_present(&bdatetime1)); + datetime_copy(&bdatetime2, &bdatetime1); + diff = datetime_wildcard_compare(&bdatetime1, &bdatetime2); + ct_test(pTest, diff == 0); + datetime_time_wildcard_set(&btime); + datetime_date_wildcard_set(&bdate); + datetime_set(&bdatetime1, &bdate, &btime); + diff = datetime_wildcard_compare(&bdatetime1, &bdatetime2); + ct_test(pTest, diff == 0); + + return; +} + static void testDayOfYear( Test * pTest) { @@ -1182,6 +1280,8 @@ void testDateTime( assert(rc); rc = ct_addTestFunction(pTest, testDayOfYear); assert(rc); + rc = ct_addTestFunction(pTest, testWildcardDateTime); + assert(rc); } #ifdef TEST_DATE_TIME