YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
param_bool.c
Go to the documentation of this file.
1// Copyright (c) 2026 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include "param_bool.h"
6#include "param_internal.h"
7#include "utils_common.h"
8#include <stdlib.h>
9#include <string.h>
10#include <stdio.h>
11#include <limits.h>
12
13static const struct yac_name_type_pair bool_table[] = {
14 {"false", 0},
15 {"False", 0},
16 {"FALSE", 0},
17 {"no", 0},
18 {"NO", 0},
19 {"0", 0},
20 {"true", 1},
21 {"True", 1},
22 {"TRUE", 1},
23 {"yes", 1},
24 {"YES", 1},
25 {"1", 1},
26};
27enum {BOOL_TABLE_SIZE = sizeof(bool_table) / sizeof(bool_table[0])};
28
37
38static enum yac_param_type
40 const struct yac_param *param) {
41 UNUSED(param);
43}
44
46 const struct yac_param *param) {
47 const struct yac_param_bool *self =
48 (const struct yac_param_bool *)param;
49 if (!self->has_default) return 0;
50 return *(self->value_ptr) == self->default_value;
51}
52
53static const char *yac_param_bool_get_name(
54 const struct yac_param *param) {
55 const struct yac_param_bool *self =
56 (const struct yac_param_bool *)param;
57 return self->name;
58}
59
61 struct yac_param *param, const char *value_str) {
62 struct yac_param_bool *self =
63 (struct yac_param_bool *)param;
65 value_str,
66 "No value provided for boolean parameter '%s'", self->name);
67 int value =
70 value != INT_MAX,
71 "'%s' is not a valid bool value for parameter '%s'",
72 value_str, self->name);
73 *(self->value_ptr) = value;
74 self->is_defined = 1;
75 return 0;
76}
77
79 const struct yac_param *param, char *buf, size_t buflen) {
80 const struct yac_param_bool *self =
81 (const struct yac_param_bool *)param;
82 if (!self || !self->value_ptr || !buf) return 1;
84 self->has_default || self->is_defined,
85 "value for parameter '%s' is undefined, user must set it first",
86 self->name);
87 // Use yac_name_type_pair_get_name to get the canonical string for the value
88 const char *str =
91 YAC_ASSERT(str, "internal error");
92 YAC_ASSERT(str, "buf is NULL");
93 int n = snprintf(buf, buflen, "%s", str);
95 (n >= 0) && ((size_t)n < buflen),
96 "buffer too small for value '%s' of parameter '%s'", str, self->name);
97 return 0;
98}
99
101 const struct yac_param *param,
102 enum yac_param_scalar_kind *scalar_kind) {
103 UNUSED(param);
104 *scalar_kind = YAC_PARAM_SCALAR_KIND_INT;
105 return 0;
106}
107
108// int setter for bool
110 struct yac_param *param, int value) {
111 struct yac_param_bool *self =
112 (struct yac_param_bool *)param;
113 *(self->value_ptr) = (value != 0);
114 self->is_defined = 1;
115 return 0;
116}
117
118// int getter for bool
120 const struct yac_param *param, int *value) {
121 const struct yac_param_bool *self =
122 (const struct yac_param_bool *)param;
123 YAC_ASSERT(value, "value is NULL");
125 self->has_default || self->is_defined,
126 "value for parameter '%s' is undefined, user must set it first",
127 self->name);
128 *value = *(self->value_ptr);
129 return 0;
130}
131
133 struct yac_param *param) {
134 struct yac_param_bool *self =
135 (struct yac_param_bool *)param;
136 free(self->name);
137 free(param);
138}
139
140static const struct yac_param_vtable
143 .is_default = yac_param_bool_is_default,
144 .get_name = yac_param_bool_get_name,
145 .delete = yac_param_bool_delete,
146 .get_sub_count = NULL,
147 .get_sub_by_name = NULL,
148 .get_sub_by_index = NULL,
149 .append = NULL,
150 .set_scalar = yac_param_bool_set_scalar,
151 .get_scalar = yac_param_bool_get_scalar,
152 .get_scalar_kind = yac_param_bool_get_scalar_kind,
153 .set_scalar_int = yac_param_bool_set_scalar_int,
154 .set_scalar_dble = NULL,
155 .get_scalar_int = yac_param_bool_get_scalar_int,
156 .get_scalar_dble = NULL
157};
158
160 const char *name, int *value_ptr, int default_value, int has_default,
161 int is_defined) {
162
165 !is_defined || ((*value_ptr == 0) || (*value_ptr == 1)),
166 "initial value %d is not a valid bool for parameter '%s'",
167 *value_ptr, name);
168 struct yac_param_bool *self = xmalloc(1 * sizeof(*self));
170 self->name = xstrdup(name);
171 self->value_ptr = value_ptr;
173 self->has_default = has_default;
174 self->is_defined = is_defined;
175 return (struct yac_param *)self;
176}
#define YAC_ASSERT(exp, msg)
#define UNUSED(x)
Definition core.h:72
int yac_name_type_pair_get_type(struct yac_name_type_pair const *pairs, size_t count, char const *name)
Definition utils_core.c:23
char const * yac_name_type_pair_get_name(struct yac_name_type_pair const *pairs, size_t count, int type)
Definition utils_core.c:14
struct @23::@24 value
yac_param_scalar_kind
Scalar parameter storage kind.
Definition param.h:185
@ YAC_PARAM_SCALAR_KIND_INT
Scalar value backed by int storage.
Definition param.h:189
yac_param_type
Parameter type for generic configuration interface.
Definition param.h:171
@ YAC_PARAM_TYPE_SCALAR
Single typed value (e.g., int, double, string, enum)
Definition param.h:177
static int yac_param_bool_set_scalar(struct yac_param *param, const char *value_str)
Definition param_bool.c:60
static void yac_param_bool_delete(struct yac_param *param)
Definition param_bool.c:132
static int yac_param_bool_set_scalar_int(struct yac_param *param, int value)
Definition param_bool.c:109
struct yac_param * yac_param_bool_new(const char *name, int *value_ptr, int default_value, int has_default, int is_defined)
Create a bool parameter (backed by int)
Definition param_bool.c:159
static const char * yac_param_bool_get_name(const struct yac_param *param)
Definition param_bool.c:53
static int yac_param_bool_get_scalar_kind(const struct yac_param *param, enum yac_param_scalar_kind *scalar_kind)
Definition param_bool.c:100
static int yac_param_bool_get_scalar_int(const struct yac_param *param, int *value)
Definition param_bool.c:119
static enum yac_param_type yac_param_bool_get_type(const struct yac_param *param)
Definition param_bool.c:39
static int yac_param_bool_is_default(const struct yac_param *param)
Definition param_bool.c:45
static const struct yac_name_type_pair bool_table[]
Definition param_bool.c:13
@ BOOL_TABLE_SIZE
Definition param_bool.c:27
static const struct yac_param_vtable yac_param_bool_vtable
Definition param_bool.c:141
static int yac_param_bool_get_scalar(const struct yac_param *param, char *buf, size_t buflen)
Definition param_bool.c:78
#define YAC_PARAM_ASSERT(COND,...)
#define YAC_PARAM_CHECK_BASIC()
#define xstrdup(s)
Definition ppm_xfuncs.h:84
#define xmalloc(size)
Definition ppm_xfuncs.h:66
const struct yac_param_vtable * vtable
Definition param_bool.c:30
enum yac_param_type(* get_type)(const struct yac_param *param)
char const * name
Definition toy_scrip.c:114
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:39