Cthulhu  0.2.10
Cthulhu compiler collection
update.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: LGPL-3.0-only
2 
3 #include "base/util.h"
4 #include "common.h"
5 
6 #include "std/vector.h"
7 
9 bool cfg_set_int(cfg_field_t *field, int value)
10 {
11  ASSERT_FIELD_TYPE(field, eConfigInt);
12 
13  int min = field->int_config.min;
14  int max = field->int_config.max;
15 
16  if (value < min || value > max)
17  {
18  return false;
19  }
20 
21  field->int_value = value;
22 
23  return true;
24 }
25 
27 void cfg_set_bool(cfg_field_t *field, bool value)
28 {
29  ASSERT_FIELD_TYPE(field, eConfigBool);
30 
31  field->bool_value = value;
32 }
33 
35 void cfg_set_string(cfg_field_t *field, char *value)
36 {
37  ASSERT_FIELD_TYPE(field, eConfigString);
38 
39  field->string_value = value;
40 }
41 
43 void cfg_vector_push(cfg_field_t *field, char *value)
44 {
45  ASSERT_FIELD_TYPE(field, eConfigVector);
46 
47  vector_push(&field->vec_value, value);
48 }
49 
51 bool cfg_set_enum(cfg_field_t *field, const char *choice)
52 {
53  ASSERT_FIELD_TYPE(field, eConfigEnum);
54  CTASSERT(choice != NULL);
55 
56  cfg_enum_t cfg = field->enum_config;
57 
58  for (size_t i = 0; i < cfg.count; i++)
59  {
60  cfg_choice_t option = cfg.options[i];
61  if (str_equal(choice, option.text))
62  {
63  field->enum_value = option.value;
64  return true;
65  }
66  }
67 
68  return false;
69 }
70 
71 #if CTU_PARANOID
72 static bool is_valid_choice(const cfg_enum_t *options, size_t value)
73 {
74  const cfg_choice_t *choices = options->options;
75  size_t len = options->count;
76 
77  for (size_t i = 0; i < len; i++)
78  {
79  cfg_choice_t choice = choices[i];
80  if (choice.value == value)
81  {
82  return true;
83  }
84  }
85 
86  return false;
87 }
88 #endif
89 
91 void cfg_set_enum_value(cfg_field_t *field, size_t value)
92 {
93  ASSERT_FIELD_TYPE(field, eConfigEnum);
94  CT_PARANOID_ASSERTF(is_valid_choice(&field->enum_config, value), "invalid enum value %zu for field %s", value, field->info->name);
95 
96  field->enum_value = value;
97 }
98 
99 static void set_flag(cfg_field_t *field, size_t value, bool set)
100 {
101  if (set)
102  {
103  field->flags_value |= value;
104  }
105  else
106  {
107  field->flags_value &= ~value;
108  }
109 }
110 
111 STA_DECL
112 bool cfg_set_flag(cfg_field_t *field, const char *choice, bool set)
113 {
114  ASSERT_FIELD_TYPE(field, eConfigFlags);
115  CTASSERT(choice != NULL);
116 
117  cfg_enum_t cfg = field->enum_config;
118 
119  for (size_t i = 0; i < cfg.count; i++)
120  {
121  cfg_choice_t option = cfg.options[i];
122  if (str_equal(choice, option.text))
123  {
124  set_flag(field, option.value, set);
125  return true;
126  }
127  }
128 
129  return false;
130 }
131 
132 #if CTU_PARANOID
133 static bool is_valid_flag(const cfg_enum_t *options, size_t value)
134 {
135  if (value == 0) return true;
136 
137  const cfg_choice_t *choices = options->options;
138  size_t len = options->count;
139 
140  size_t remaining = value;
141  for (size_t i = 0; i < len; i++)
142  {
143  cfg_choice_t choice = choices[i];
144  if (choice.value != 0 && remaining & choice.value)
145  {
146  remaining &= ~choice.value;
147  }
148  }
149 
150  return remaining == 0;
151 }
152 #endif
153 
154 STA_DECL
155 void cfg_set_flag_value(cfg_field_t *field, size_t value)
156 {
157  ASSERT_FIELD_TYPE(field, eConfigFlags);
158  CT_PARANOID_ASSERTF(is_valid_flag(&field->enum_config, value), "invalid flag value %zu for field %s", value, field->info->name);
159 
160  field->flags_value = value;
161 }
#define ASSERT_FIELD_TYPE(field, type)
Definition: common.h:43
#define STA_DECL
sal2 annotation on function implementations to copy annotations from the declaration
CT_NODISCARD CT_PUREFN CT_BASE_API bool str_equal(const char *lhs, const char *rhs)
compare strings equality
Definition: util.c:76
STA_DECL void cfg_vector_push(cfg_field_t *field, char *value)
push a new value onto an array field
Definition: update.c:43
STA_DECL bool cfg_set_int(cfg_field_t *field, int value)
set the current value of an int field
Definition: update.c:9
STA_DECL void cfg_set_enum_value(cfg_field_t *field, size_t value)
set the current value of an enum field set the value via an integer value
Definition: update.c:91
STA_DECL bool cfg_set_flag(cfg_field_t *field, const char *choice, bool set)
set the current value of a flags field set the value via a string name
Definition: update.c:112
STA_DECL void cfg_set_string(cfg_field_t *field, char *value)
set the current value of a string field
Definition: update.c:35
STA_DECL bool cfg_set_enum(cfg_field_t *field, const char *choice)
set the current value of an enum field set the value via a string name
Definition: update.c:51
STA_DECL void cfg_set_bool(cfg_field_t *field, bool value)
set the current value of a bool field
Definition: update.c:27
STA_DECL void cfg_set_flag_value(cfg_field_t *field, size_t value)
set the current value of a flags field set the value via an integer value
Definition: update.c:155
#define CTASSERT(expr)
assert a condition, prints the condition as a message
Definition: panic.h:130
#define CT_PARANOID_ASSERTF(expr,...)
assert a condition with a message and optional format arguments
CT_STD_API void vector_push(vector_t **vector, void *value)
push a value onto the end of a vector
Definition: vector.c:108
a choice in a set of options
Definition: config.h:97
STA_FIELD_STRING const char * text
the name of this choice
Definition: config.h:99
size_t value
the value of this choice
Definition: config.h:102
a choice from a set of options
Definition: config.h:107
size_t count
the number of choices in this set
Definition: config.h:112
vector_t * vec_value
Definition: common.h:30
char * string_value
Definition: common.h:27
bool bool_value
Definition: common.h:26
cfg_enum_t enum_config
Definition: common.h:21
const cfg_info_t * info
Definition: common.h:14
size_t flags_value
Definition: common.h:29
int int_value
Definition: common.h:25
cfg_int_t int_config
Definition: common.h:17
size_t enum_value
Definition: common.h:28
STA_FIELD_STRING const char * name
the name of this field
Definition: config.h:71