compiler: RETURNS_NONNULL macro
[ccan] / ccan / list / test / helper.c
1 #include <stdlib.h>
2 #include <stdbool.h>
3 #include <time.h>
4
5 #include <ccan/list/list.h>
6 #include "helper.h"
7
8 #define ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING \
9   (42)
10
11 struct opaque {
12   struct list_node list;
13   size_t secret_offset;
14   char   secret_drawer[42];
15 };
16
17 static bool not_randomized = true;
18
19 struct opaque *create_opaque_blob(void)
20 {
21   struct opaque *blob = calloc(1, sizeof(struct opaque));
22
23   if (not_randomized) {
24     srandom((int)time(NULL));
25     not_randomized = false;
26   }
27
28   blob->secret_offset = random() % (sizeof(blob->secret_drawer));
29   blob->secret_drawer[blob->secret_offset] =
30     ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING;
31
32   return blob;
33 }
34
35 bool if_blobs_know_the_secret(struct opaque *blob)
36 {
37   bool answer = true;
38   int i;
39   for (i = 0; i < sizeof(blob->secret_drawer) /
40                sizeof(blob->secret_drawer[0]); i++)
41           if (i != blob->secret_offset)
42                   answer = answer && (blob->secret_drawer[i] == 0);
43           else
44                   answer = answer &&
45                           (blob->secret_drawer[blob->secret_offset] ==
46            ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING);
47
48   return answer;
49 }
50
51 void destroy_opaque_blob(struct opaque *blob)
52 {
53   free(blob);
54 }
55
56