1*6a54128fSAndroid Build Coastguard Worker #define _GNU_SOURCE
2*6a54128fSAndroid Build Coastguard Worker
3*6a54128fSAndroid Build Coastguard Worker #include "block_range.h"
4*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
5*6a54128fSAndroid Build Coastguard Worker
new_block_range(blk64_t start,blk64_t end)6*6a54128fSAndroid Build Coastguard Worker struct block_range *new_block_range(blk64_t start, blk64_t end)
7*6a54128fSAndroid Build Coastguard Worker {
8*6a54128fSAndroid Build Coastguard Worker struct block_range *range = malloc(sizeof(*range));
9*6a54128fSAndroid Build Coastguard Worker range->start = start;
10*6a54128fSAndroid Build Coastguard Worker range->end = end;
11*6a54128fSAndroid Build Coastguard Worker range->next = NULL;
12*6a54128fSAndroid Build Coastguard Worker return range;
13*6a54128fSAndroid Build Coastguard Worker }
14*6a54128fSAndroid Build Coastguard Worker
add_blocks_to_range(struct block_range_list * list,blk64_t blk_start,blk64_t blk_end)15*6a54128fSAndroid Build Coastguard Worker void add_blocks_to_range(struct block_range_list *list, blk64_t blk_start,
16*6a54128fSAndroid Build Coastguard Worker blk64_t blk_end)
17*6a54128fSAndroid Build Coastguard Worker {
18*6a54128fSAndroid Build Coastguard Worker if (list->head == NULL)
19*6a54128fSAndroid Build Coastguard Worker list->head = list->tail = new_block_range(blk_start, blk_end);
20*6a54128fSAndroid Build Coastguard Worker else if (list->tail->end + 1 == blk_start)
21*6a54128fSAndroid Build Coastguard Worker list->tail->end += (blk_end - blk_start + 1);
22*6a54128fSAndroid Build Coastguard Worker else {
23*6a54128fSAndroid Build Coastguard Worker struct block_range *range = new_block_range(blk_start, blk_end);
24*6a54128fSAndroid Build Coastguard Worker list->tail->next = range;
25*6a54128fSAndroid Build Coastguard Worker list->tail = range;
26*6a54128fSAndroid Build Coastguard Worker }
27*6a54128fSAndroid Build Coastguard Worker }
28*6a54128fSAndroid Build Coastguard Worker
remove_head(struct block_range_list * list)29*6a54128fSAndroid Build Coastguard Worker static void remove_head(struct block_range_list *list)
30*6a54128fSAndroid Build Coastguard Worker {
31*6a54128fSAndroid Build Coastguard Worker struct block_range *next_range = list->head->next;
32*6a54128fSAndroid Build Coastguard Worker
33*6a54128fSAndroid Build Coastguard Worker free(list->head);
34*6a54128fSAndroid Build Coastguard Worker if (next_range == NULL)
35*6a54128fSAndroid Build Coastguard Worker list->head = list->tail = NULL;
36*6a54128fSAndroid Build Coastguard Worker else
37*6a54128fSAndroid Build Coastguard Worker list->head = next_range;
38*6a54128fSAndroid Build Coastguard Worker }
39*6a54128fSAndroid Build Coastguard Worker
delete_block_ranges(struct block_range_list * list)40*6a54128fSAndroid Build Coastguard Worker void delete_block_ranges(struct block_range_list *list)
41*6a54128fSAndroid Build Coastguard Worker {
42*6a54128fSAndroid Build Coastguard Worker while (list->head)
43*6a54128fSAndroid Build Coastguard Worker remove_head(list);
44*6a54128fSAndroid Build Coastguard Worker }
45*6a54128fSAndroid Build Coastguard Worker
write_block_ranges(FILE * f,struct block_range * range,char * sep)46*6a54128fSAndroid Build Coastguard Worker int write_block_ranges(FILE *f, struct block_range *range,
47*6a54128fSAndroid Build Coastguard Worker char *sep)
48*6a54128fSAndroid Build Coastguard Worker {
49*6a54128fSAndroid Build Coastguard Worker int len;
50*6a54128fSAndroid Build Coastguard Worker char *buf;
51*6a54128fSAndroid Build Coastguard Worker
52*6a54128fSAndroid Build Coastguard Worker while (range) {
53*6a54128fSAndroid Build Coastguard Worker if (range->start == range->end)
54*6a54128fSAndroid Build Coastguard Worker len = asprintf(&buf, "%llu%s", range->start, sep);
55*6a54128fSAndroid Build Coastguard Worker else
56*6a54128fSAndroid Build Coastguard Worker len = asprintf(&buf, "%llu-%llu%s", range->start,
57*6a54128fSAndroid Build Coastguard Worker range->end, sep);
58*6a54128fSAndroid Build Coastguard Worker if (fwrite(buf, 1, len, f) != (size_t)len) {
59*6a54128fSAndroid Build Coastguard Worker free(buf);
60*6a54128fSAndroid Build Coastguard Worker return -1;
61*6a54128fSAndroid Build Coastguard Worker }
62*6a54128fSAndroid Build Coastguard Worker free(buf);
63*6a54128fSAndroid Build Coastguard Worker range = range->next;
64*6a54128fSAndroid Build Coastguard Worker }
65*6a54128fSAndroid Build Coastguard Worker
66*6a54128fSAndroid Build Coastguard Worker len = strlen(sep);
67*6a54128fSAndroid Build Coastguard Worker if (fseek(f, -len, SEEK_CUR) == -len)
68*6a54128fSAndroid Build Coastguard Worker return -1;
69*6a54128fSAndroid Build Coastguard Worker return 0;
70*6a54128fSAndroid Build Coastguard Worker }
71*6a54128fSAndroid Build Coastguard Worker
consume_next_block(struct block_range_list * list)72*6a54128fSAndroid Build Coastguard Worker blk64_t consume_next_block(struct block_range_list *list)
73*6a54128fSAndroid Build Coastguard Worker {
74*6a54128fSAndroid Build Coastguard Worker blk64_t ret = list->head->start;
75*6a54128fSAndroid Build Coastguard Worker
76*6a54128fSAndroid Build Coastguard Worker list->head->start += 1;
77*6a54128fSAndroid Build Coastguard Worker if (list->head->start > list->head->end)
78*6a54128fSAndroid Build Coastguard Worker remove_head(list);
79*6a54128fSAndroid Build Coastguard Worker return ret;
80*6a54128fSAndroid Build Coastguard Worker }
81