summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Engling <erdgeist@erdgeist.org>2026-02-27 16:22:32 +0100
committerDirk Engling <erdgeist@erdgeist.org>2026-02-27 16:22:32 +0100
commite20226a557859c3935a477255426959a2664d9e1 (patch)
tree469eb483551164aa9685cd4eff6cffa6353562f6
parent22fb9ba0b9129b604fa332893c0d04c3bdd0cebf (diff)
convert bitfields to intranges
-rw-r--r--src/postprocess/merge_entries.c34
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
196static 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
196int main(int argc, char **args) { 222int 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) {