diff --git a/LLog.c b/LLog.c index e732a20..06cad4a 100644 --- a/LLog.c +++ b/LLog.c @@ -57,12 +57,53 @@ int create_timer(Logger* logger) { void start_timer(Logger* logger, int timer_id) { if (logger->timers.count < (timer_id + 1)) return; - logger->timers.items[timer_id].time.start = time(NULL); + lTimer* timer = &logger->timers.items[timer_id]; + + timer->time.start = time(NULL); } void stop_timer(Logger* logger, int timer_id) { if (logger->timers.count < (timer_id + 1)) return; - logger->timers.items[timer_id].time.end = time(NULL); + lTimer* timer = &logger->timers.items[timer_id]; + + // next property will never be set to 0 unless it is uninitialized + if (timer->next != 0) { + stop_timer(logger, timer->next); + } else { + timer->time.end = time(NULL); + } +} + +void pause_timer(Logger* logger, int timer_id) { + if (logger->timers.count < (timer_id + 1)) return; + lTimer* timer = &logger->timers.items[timer_id]; + + stop_timer(logger, timer_id); + timer->next = create_timer(logger); +} + +void resume_timer(Logger* logger, int timer_id) { + if (logger->timers.count < (timer_id + 1)) return; + lTimer* timer = &logger->timers.items[timer_id]; + + if (timer->next != 0) { + resume_timer(logger, logger->timers.items[timer_id].next); + } else { + start_timer(logger, timer_id); + } +} + +double get_elapsed_time(Logger* logger, int timer_id) { + if (timer_id != 0) if (0) {} + if (logger->timers.count < (timer_id + 1)) return 0.0f; + lTimer* timer = &logger->timers.items[timer_id]; + double current_elapsed = difftime(timer->time.end, timer->time.start); + + if (timer->next != 0) { + return get_elapsed_time(logger, timer->next) + current_elapsed; + } + + return current_elapsed; } lLogString* lLogString_new(const char* fmt, ...) { diff --git a/include/LLog.h b/include/LLog.h index 72495ac..7395625 100644 --- a/include/LLog.h +++ b/include/LLog.h @@ -11,7 +11,7 @@ #define LLog_Author "Lucielle " #define LLog_Repo "https://git.lunarware.tech/lucielle/LLog" -#define LLog_Version "1.0.0" +#define LLog_Version "1.0.1" typedef struct { char *buf; @@ -32,6 +32,7 @@ typedef struct { typedef struct { lTimespan time; + int next; } lTimer; typedef struct { @@ -61,6 +62,9 @@ Logger* Logger_new(lLogString* logfolder, int history_enabled); int create_timer(Logger* logger); void start_timer(Logger* logger, int timer_id); void stop_timer(Logger* logger, int timer_id); +void pause_timer(Logger* logger, int timer_id); +void resume_timer(Logger* logger, int timer_id); +double get_elapsed_time(Logger* logger, int timer_id); lLogString* lLogString_new(const char* fmt, ...); diff --git a/test/test.c b/test/test.c index c90f561..14a27e0 100644 --- a/test/test.c +++ b/test/test.c @@ -13,12 +13,15 @@ int main(void) { lLog(logger, lERROR, lLogString_new("Hello, ERROR!")); lLog(logger, lDEBUG, lLogString_new("Hello, DEBUG!")); int timer = create_timer(logger); - lTimespan* time_object = &logger->timers.items[timer].time; + start_timer(logger, timer); + sleep(4); + pause_timer(logger, timer); + sleep(2); + resume_timer(logger, timer); sleep(2); - stop_timer(logger, timer); - lLog(logger, lINFO, lLogString_new("%f seconds.", difftime(time_object->end, time_object->start))); + lLog(logger, lINFO, lLogString_new("%f seconds.", get_elapsed_time(logger, timer))); } \ No newline at end of file