From 57e66f56d3044caf2d5d6904ad917968018489c1 Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Sun, 15 Oct 2023 21:45:20 +0200 Subject: mico-dump: add filtering by time --- mico-dump.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/mico-dump.c b/mico-dump.c index aea7138..75219d5 100644 --- a/mico-dump.c +++ b/mico-dump.c @@ -6,11 +6,15 @@ #include #include #include +#include #include #define MICO_HEADER "\211MiC\r\n\032\n" +static int lflag; +static int64_t fflag, tflag; + zip_t *zip; struct bitreader { @@ -102,20 +106,42 @@ mystrccpy(char *dst, char *src, int c) return 0; } -#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32)) +int64_t parsetimestamp(char *t) +{ + struct tm tm = { 0 }; + + /* XXX switch to iso format, treat number as raw timestamp */ + + switch(strlen(t)) { + case 4: strptime(t, "%Y", &tm); break; + case 6: strptime(t, "%Y%m", &tm); break; + case 8: strptime(t, "%Y%m%d", &tm); break; + case 10: strptime(t, "%Y%m%d%H", &tm); break; + case 12: strptime(t, "%Y%m%d%H%M", &tm); break; + case 14: strptime(t, "%Y%m%d%H%M%S", &tm); break; + default: + fprintf(stderr, "can't parse timestamp: %s\n", t); + exit(-1); + } -static int tflag; + // tm.tm_gmtoff = 0; + return mktime(&tm) * 1000; +} + +#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32)) int main(int argc, char *argv[]) { int c; - while ((c = getopt(argc, argv, "t")) != -1) { + while ((c = getopt(argc, argv, "f:lt:")) != -1) { switch (c) { - case 't': tflag = 1; break; + case 'l': lflag = 1; break; + case 'f': fflag = parsetimestamp(optarg); break; + case 't': tflag = parsetimestamp(optarg); break; case '?': usage: - fprintf(stderr, "usage: %s [-t] input.zip [filter...]\n", argv[0]); + fprintf(stderr, "usage: %s [-l] [-f TIME] [-t TIME] input.zip [filter...]\n", argv[0]); exit(-1); } } @@ -177,7 +203,7 @@ main(int argc, char *argv[]) if (!keep) continue; - if (tflag) { + if (lflag) { printf("%s\n", name); continue; } @@ -219,7 +245,7 @@ main(int argc, char *argv[]) lenv = ntohll(lenv); if (len != lenv) { - fprintf(stderr, "time and value length don't agree\n"); + fprintf(stderr, "time and value length don't agree: %ld != %ld\n", len, lenv); exit(-1); } @@ -234,6 +260,11 @@ main(int argc, char *argv[]) t += td; v += vd; + if (fflag && t < fflag) + continue; + if (tflag && t > tflag) + break; + printf("%s %f %ld\n", name, v/10000.0, t); } } -- cgit 1.4.1