]> rtime.felk.cvut.cz Git - linux-conf-perf.git/blob - scripts/write_config/solution.c
Rewrite write_config solution check and fix apply
[linux-conf-perf.git] / scripts / write_config / solution.c
1 #include "solution.h"
2
3 extern int exit_status;
4
5 struct solution *solution_load(FILE * fmap, FILE * fsolved) {
6     char buffer[BUFFER_SIZE];
7     size_t buff_pos;
8
9     int c;
10     buff_pos = 0;
11     size_t buff_pos_old;
12     while (1) {
13         c = fgetc(fsolved);
14         if (c == '\n') {
15             buff_pos_old = buff_pos;
16             buff_pos = 0;
17         } else if (c == EOF) {
18             break;
19         } else {
20             buffer[buff_pos++] = (char) c;
21         }
22     }
23     buffer[buff_pos_old++] = '\0';
24     char *hash;
25     hash = malloc(buff_pos_old * sizeof(char));
26     memcpy(hash, buffer, buff_pos_old * sizeof(char));
27
28     while (1) {
29         do {
30             c = fgetc(fmap);
31             buffer[buff_pos++] = (char) c;
32         } while (c != ':');
33         buffer[buff_pos] = '\0';
34         if (!strcmp(buffer, hash))
35             break;
36         do {
37             c = fgetc(fmap);
38         } while (c != '\n');
39     }
40
41     size_t sz = 2;
42     struct solution *sol;
43     sol = malloc(sizeof(struct solution));
44     sol->sol = malloc(sz * sizeof(int));
45     sol->size = 0;
46     while (1) {
47         c = fgetc(fmap);
48         if (c == ' ' || c == '\n') {
49             buffer[buff_pos] = '\0';
50             if (sol->size >= sz) {
51                 sz *= 2;
52                 sol->sol = realloc(sol->sol, sz * sizeof(int));
53             }
54             sol->sol[sol->size++] = atoi(buffer);
55         } else {
56             buffer[buff_pos++] = (char) c;
57         }
58         if (c == '\n')
59             break;
60     }
61
62     return sol;
63 }
64
65 void solution_check(struct symlist *sl, struct solution *s) {
66     unsigned i;
67     for (i = 0; i < s->size; s++) {
68         bool neg = false;
69         if (s->sol[i] < 0) {
70             neg = true;
71             s->sol[i] *= -1;
72         }
73         if ((unsigned) s->sol[i] > sl->maxid)
74             break;
75         if (s->sol[i] == 0)
76             continue;
77         if (sl->array[s->sol[i] - 1].sym == NULL)
78             continue;
79         if (neg ==
80             (sym_get_tristate_value(sl->array[s->sol[i] - 1].sym) ==
81              no ? true : false)) {
82         } else {
83             printf("Problem %s=%d/%d\n",
84                    sl->array[s->sol[i] - 1].sym->name, !neg,
85                    sym_get_tristate_value(sl->array[s->sol[i] - 1].sym));
86             exit_status++;
87         }
88     }
89 }