diff options
| author | Dirk Engling <erdgeist@erdgeist.org> | 2026-02-27 16:22:32 +0100 |
|---|---|---|
| committer | Dirk Engling <erdgeist@erdgeist.org> | 2026-02-27 16:22:32 +0100 |
| commit | e20226a557859c3935a477255426959a2664d9e1 (patch) | |
| tree | 469eb483551164aa9685cd4eff6cffa6353562f6 | |
| parent | 22fb9ba0b9129b604fa332893c0d04c3bdd0cebf (diff) | |
convert bitfields to intranges
| -rw-r--r-- | src/postprocess/merge_entries.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/postprocess/merge_entries.c b/src/postprocess/merge_entries.c index 4097a2d..083122d 100644 --- a/src/postprocess/merge_entries.c +++ b/src/postprocess/merge_entries.c | |||
| @@ -193,13 +193,39 @@ static void escape_string(char * s, size_t len) { | |||
| 193 | fwrite(s, len, 1, stdout); | 193 | fwrite(s, len, 1, stdout); |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | static void print_multirange(__uint128_t range) { | ||
| 197 | int bit = 0, start = -1, ranges = 0; | ||
| 198 | |||
| 199 | printf("\"{"); | ||
| 200 | |||
| 201 | for (bit = 0; range; bit++, range >>= 1) { | ||
| 202 | if (range & 1) { | ||
| 203 | if (start == -1) | ||
| 204 | start = bit; | ||
| 205 | } else { | ||
| 206 | if (start >= 0) { | ||
| 207 | if (ranges++) | ||
| 208 | printf(","); | ||
| 209 | printf ("[%d,%d)", start, bit); | ||
| 210 | } | ||
| 211 | start = -1; | ||
| 212 | } | ||
| 213 | } | ||
| 214 | if (start >= 0) { | ||
| 215 | if (ranges++) | ||
| 216 | printf(","); | ||
| 217 | printf ("[%d,%d)", start, bit); | ||
| 218 | } | ||
| 219 | printf("}\"\t"); | ||
| 220 | } | ||
| 221 | |||
| 196 | int main(int argc, char **args) { | 222 | int main(int argc, char **args) { |
| 197 | MAP tbuch; | 223 | MAP tbuch; |
| 198 | char *ptr; | 224 | char *ptr; |
| 199 | entry_t * sort_array; | 225 | entry_t * sort_array; |
| 200 | int outoff = 0, lines = COLUMNS; | 226 | int outoff = 0, lines = COLUMNS; |
| 201 | unsigned long current = 0, i, flag; | 227 | unsigned long current = 0, i, flag; |
| 202 | uint64_t year_list = 0, revflag_list = 0, bizflag_list = 0; | 228 | __uint128_t year_list = 0, revflag_list = 0, bizflag_list = 0; |
| 203 | 229 | ||
| 204 | if (argc != 2) exit(1); | 230 | if (argc != 2) exit(1); |
| 205 | tbuch = map_file(args[1], 1); | 231 | tbuch = map_file(args[1], 1); |
| @@ -257,7 +283,11 @@ int main(int argc, char **args) { | |||
| 257 | if (sort_array[i].flag & 0x40 ) revflag_list |= 1LL << sort_array[i].year; | 283 | if (sort_array[i].flag & 0x40 ) revflag_list |= 1LL << sort_array[i].year; |
| 258 | 284 | ||
| 259 | if ((i == current - 1) || compare_entries(sort_array+i, sort_array+i+1)) { | 285 | if ((i == current - 1) || compare_entries(sort_array+i, sort_array+i+1)) { |
| 260 | printf("%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t", year_list, bizflag_list, revflag_list); | 286 | // printf("%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\t", year_list, bizflag_list, revflag_list); |
| 287 | print_multirange(year_list); | ||
| 288 | print_multirange(bizflag_list); | ||
| 289 | print_multirange(revflag_list); | ||
| 290 | |||
| 261 | for (int c=2; c<COLUMNS; ++c) { | 291 | for (int c=2; c<COLUMNS; ++c) { |
| 262 | int j, started = 0, skipped = 0; | 292 | int j, started = 0, skipped = 0; |
| 263 | for (j=0; j<=sort_array[i].rows; ++j) { | 293 | for (j=0; j<=sort_array[i].rows; ++j) { |
