diff --git a/README.md b/README.md index f8200e7..9013614 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ Build & Install Usage ----- - $ stt -a task # start task - $ stt -s # stop task - $ stt [-l] # print report + $ stt -a task # start task + $ stt -s # stop task + $ stt [-l [Y-m-d]] # print report task: task started at: Wed Oct 2 19:04:04 2019 ended at: Wed Oct 2 19:05:04 2019 diff --git a/stt.1 b/stt.1 index 7d70d0d..8443ca2 100644 --- a/stt.1 +++ b/stt.1 @@ -8,7 +8,7 @@ stt \- Simple time tracker .RB [ \-a .IR task " |" .RB \-s " |" -.RB \-l ] +.RB \-l [Y-m-d]] .SH DESCRIPTION .B stt keeps track of tasks during a work day. @@ -24,9 +24,10 @@ Registers given task as active. Will also stop previous active task. .B \-s Stops current active task. .TP -.B \-l +.B \-l [Y-m-d] Prints day report, for each tasks name, start time, end time or state if still running and duration (in decimal hours) is displayed. +Also accept a date as filter, default display today report. .TP .B \-h Prints synopsis help. diff --git a/stt.c b/stt.c index e4a7dd5..efc5d5e 100644 --- a/stt.c +++ b/stt.c @@ -2,6 +2,14 @@ #define _DEFAULT_SOURCE #endif +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif + +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 700 +#endif + #include #include #include @@ -48,7 +56,7 @@ int timesnode_heigh(struct timesnode *); int timesnode_getbalance(struct timesnode *); struct timesnode *timesnode_rightrotate(struct timesnode *); struct timesnode *timesnode_leftrotate(struct timesnode *); -int timesnode_print(struct timesnode *, time_t); +int timesnode_print(struct timesnode *, time_t aftertime, time_t beforetime); void timesnode_free(struct timesnode *); void @@ -267,7 +275,7 @@ timesnode_stop(struct timesnode * p, time_t endtime) } int -timesnode_print(struct timesnode * p, time_t aftertime) +timesnode_print(struct timesnode * p, time_t aftertime, time_t beforetime) { time_t *nowtime; int duration = 0; @@ -277,9 +285,9 @@ timesnode_print(struct timesnode * p, time_t aftertime) return 0; } if (p->left != NULL) { - totalDuration += timesnode_print(p->left, aftertime); + totalDuration += timesnode_print(p->left, aftertime, beforetime); } - if (p->starttime > aftertime || p->endtime > aftertime || p->endtime == 0) { + if ((p->starttime > aftertime && p->starttime < beforetime) && (p->endtime < beforetime || p->endtime == 0)) { printf("task: %s\n", p->task); printf("started at: %s", ctime(&p->starttime)); @@ -303,7 +311,7 @@ timesnode_print(struct timesnode * p, time_t aftertime) totalDuration += duration; } if (p->right != NULL) { - totalDuration += timesnode_print(p->right, aftertime); + totalDuration += timesnode_print(p->right, aftertime, beforetime); } return totalDuration; } @@ -328,14 +336,16 @@ main(int argc, char *argv[]) { unsigned int start, stop, list; char *task; + char *datefilter; FILE *fp; struct timesnode *timestree; time_t *nowtime; int changed; - struct tm today; + struct tm startfilter, endfilter; timestree = NULL; task = NULL; + datefilter = NULL; changed = start = stop = 0; list = 1; @@ -358,6 +368,8 @@ case 'l': /* list task */ start = 0; stop = 0; list = 1; + + datefilter = ARGF(); break; case 'v': fprintf(stderr, "%s-" VERSION " © 2016 Simon Lieb, see LICENSE for details\n", argv0); @@ -388,13 +400,25 @@ default: writetimes(fp, timestree); } if (list) { - localtime_r(nowtime, &today); + if (datefilter != NULL) { + strptime(datefilter, "%Y-%m-%d", &startfilter); + strptime(datefilter, "%Y-%m-%d", &endfilter); + } else { + localtime_r(nowtime, &startfilter); + localtime_r(nowtime, &endfilter); + } - today.tm_sec = 0; - today.tm_min = 0; - today.tm_hour = 0; + startfilter.tm_sec = 0; + startfilter.tm_min = 0; + startfilter.tm_hour = 0; + //startfilter.tm_mday-=4; - printf("total: %.2f\n", timesnode_print(timestree, mktime(&today)) / 3600.0); + endfilter.tm_sec = 0; + endfilter.tm_min = 0; + endfilter.tm_hour = 0; + endfilter.tm_mday++; + + printf("total: %.2f\n", timesnode_print(timestree, mktime(&startfilter), mktime(&endfilter)) / 3600.0); } fclose(fp);