add timespec_clear_spec() and timespec_get_spec()
This commit is contained in:
@ -43,5 +43,7 @@ struct mgos_timespec;
|
|||||||
struct mgos_timespec *timespec_create();
|
struct mgos_timespec *timespec_create();
|
||||||
bool timespec_destroy(struct mgos_timespec **ts);
|
bool timespec_destroy(struct mgos_timespec **ts);
|
||||||
bool timespec_add_spec(struct mgos_timespec *ts, const char *spec);
|
bool timespec_add_spec(struct mgos_timespec *ts, const char *spec);
|
||||||
|
bool timespec_clear_spec(struct mgos_timespec *ts);
|
||||||
|
bool timespec_get_spec(struct mgos_timespec *ts, char *ret, int retlen);
|
||||||
bool timespec_match(const struct mgos_timespec *ts, const struct tm *tm);
|
bool timespec_match(const struct mgos_timespec *ts, const struct tm *tm);
|
||||||
bool timespec_match_now(const struct mgos_timespec *ts);
|
bool timespec_match_now(const struct mgos_timespec *ts);
|
||||||
|
@ -124,17 +124,7 @@ bool timespec_destroy(struct mgos_timespec **ts) {
|
|||||||
if (!ts) {
|
if (!ts) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
while (!SLIST_EMPTY(&(*ts)->specs)) {
|
timespec_clear_spec(*ts);
|
||||||
struct mgos_timespec_spec *t_spec;
|
|
||||||
|
|
||||||
t_spec = SLIST_FIRST(&(*ts)->specs);
|
|
||||||
SLIST_REMOVE_HEAD(&(*ts)->specs, entries);
|
|
||||||
if (t_spec) {
|
|
||||||
// LOG(LL_DEBUG, ("Removed mgos_timespec_spec"));
|
|
||||||
free(t_spec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(*ts);
|
free(*ts);
|
||||||
*ts = NULL;
|
*ts = NULL;
|
||||||
return true;
|
return true;
|
||||||
@ -206,3 +196,57 @@ bool timespec_match_now(const struct mgos_timespec *ts) {
|
|||||||
}
|
}
|
||||||
return timespec_match(ts, tm);
|
return timespec_match(ts, tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear the timespec linked list
|
||||||
|
// Returns true on success, false otherwise.
|
||||||
|
bool timespec_clear_spec(struct mgos_timespec *ts) {
|
||||||
|
if (!ts) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while (!SLIST_EMPTY(&ts->specs)) {
|
||||||
|
struct mgos_timespec_spec *t_spec;
|
||||||
|
|
||||||
|
t_spec = SLIST_FIRST(&ts->specs);
|
||||||
|
SLIST_REMOVE_HEAD(&ts->specs, entries);
|
||||||
|
if (t_spec) {
|
||||||
|
free(t_spec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a null terminated string in 'ret' of max retlen-1 which is a
|
||||||
|
// comma separated set of timespec elements from the linked list.
|
||||||
|
// Returns true on success, false otherwise.
|
||||||
|
bool timespec_get_spec(struct mgos_timespec *ts, char *ret, int retlen) {
|
||||||
|
struct mgos_timespec_spec *t_spec;
|
||||||
|
|
||||||
|
if (!ts) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ts) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*ret = '\0';
|
||||||
|
|
||||||
|
SLIST_FOREACH(t_spec, &ts->specs, entries) {
|
||||||
|
char spec_str[20];
|
||||||
|
|
||||||
|
snprintf(spec_str, sizeof(spec_str) - 1, "%02d:%02d:%02d-%02d:%02d:%02d", t_spec->start_h, t_spec->start_m, t_spec->start_s,
|
||||||
|
t_spec->stop_h, t_spec->stop_m, t_spec->stop_s);
|
||||||
|
if (strlen(spec_str) + strlen(ret) > retlen - 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (strlen(ret) > 0) {
|
||||||
|
strncat(ret, ",", retlen);
|
||||||
|
}
|
||||||
|
strncat(ret, spec_str, retlen);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -88,8 +88,12 @@ static void test_timespec_flips_and_seconds(const struct mgos_timespec *ts, cons
|
|||||||
static void test_timespec_state(void) {
|
static void test_timespec_state(void) {
|
||||||
struct mgos_timespec *ts = timespec_create();
|
struct mgos_timespec *ts = timespec_create();
|
||||||
struct tm target;
|
struct tm target;
|
||||||
|
char buf[500];
|
||||||
|
|
||||||
ASSERT(ts, "Created timespec");
|
ASSERT(ts, "Created timespec");
|
||||||
|
timespec_get_spec(ts, buf, sizeof(buf)-1);
|
||||||
|
ASSERT(0 == strcmp(buf, ""), "timespec_get_spec() didn't match input spec(s)");
|
||||||
|
|
||||||
ASSERT(timespec_add_spec(ts, "08-10"), "Added timespec");
|
ASSERT(timespec_add_spec(ts, "08-10"), "Added timespec");
|
||||||
ASSERT(timespec_add_spec(ts, "12:00-13:00"), "Added timespec");
|
ASSERT(timespec_add_spec(ts, "12:00-13:00"), "Added timespec");
|
||||||
ASSERT(timespec_add_spec(ts, "14:11:05-14:59:52"), "Added timespec");
|
ASSERT(timespec_add_spec(ts, "14:11:05-14:59:52"), "Added timespec");
|
||||||
@ -150,6 +154,11 @@ static void test_timespec_state(void) {
|
|||||||
target.tm_sec = 3; target.tm_min = 2; target.tm_hour = 1;
|
target.tm_sec = 3; target.tm_min = 2; target.tm_hour = 1;
|
||||||
ASSERT(!timespec_match(ts, &target), "No match at 01:02:03");
|
ASSERT(!timespec_match(ts, &target), "No match at 01:02:03");
|
||||||
|
|
||||||
|
// Test timespec retrieval
|
||||||
|
timespec_get_spec(ts, buf, sizeof(buf)-1);
|
||||||
|
ASSERT(0 == strcmp(buf, "23:01:02-01:02:03,14:11:05-14:59:52,12:00:00-13:00:00,08:00:00-10:00:00"), "timespec_get_spec() didn't match input spec(s)");
|
||||||
|
LOG(LL_INFO, ("Spec: '%s'", buf));
|
||||||
|
|
||||||
ASSERT(timespec_destroy(&ts), "Destroyed timespec");
|
ASSERT(timespec_destroy(&ts), "Destroyed timespec");
|
||||||
|
|
||||||
// Some time counting tests
|
// Some time counting tests
|
||||||
@ -174,6 +183,10 @@ static void test_timespec_state(void) {
|
|||||||
ASSERT(timespec_add_spec(ts, "03:02:03-04:03:04"), "Added timespec");
|
ASSERT(timespec_add_spec(ts, "03:02:03-04:03:04"), "Added timespec");
|
||||||
test_timespec_flips_and_seconds(ts, 9, 7200 + 0 + 7200 + 1 + 3661);
|
test_timespec_flips_and_seconds(ts, 9, 7200 + 0 + 7200 + 1 + 3661);
|
||||||
|
|
||||||
|
// Test timespec retrieval
|
||||||
|
timespec_get_spec(ts, buf, sizeof(buf)-1);
|
||||||
|
ASSERT(0 == strcmp(buf, "03:02:03-04:03:04,02:00:00-02:00:01,23:00:00-01:00:00,00:00:00-00:00:00,08:00:00-10:00:00"), "timespec_get_spec() didn't match input spec(s)");
|
||||||
|
|
||||||
ASSERT(timespec_destroy(&ts), "Destroyed timespec");
|
ASSERT(timespec_destroy(&ts), "Destroyed timespec");
|
||||||
|
|
||||||
// Some other time counting tests
|
// Some other time counting tests
|
||||||
@ -184,6 +197,10 @@ static void test_timespec_state(void) {
|
|||||||
ASSERT(timespec_add_spec(ts, "12-00"), "Added timespec");
|
ASSERT(timespec_add_spec(ts, "12-00"), "Added timespec");
|
||||||
test_timespec_flips_and_seconds(ts, 1, 24 * 60 * 60);
|
test_timespec_flips_and_seconds(ts, 1, 24 * 60 * 60);
|
||||||
|
|
||||||
|
// Test timespec retrieval
|
||||||
|
timespec_get_spec(ts, buf, sizeof(buf)-1);
|
||||||
|
ASSERT(0 == strcmp(buf, "12:00:00-00:00:00,00:00:00-12:00:00"), "timespec_get_spec() didn't match input spec(s)");
|
||||||
|
|
||||||
ASSERT(timespec_destroy(&ts), "Destroyed timespec");
|
ASSERT(timespec_destroy(&ts), "Destroyed timespec");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user