YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
param_enum.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_enum.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
23
24static enum yac_param_type
26 const struct yac_param *param) {
27 UNUSED(param);
29}
30
32 const struct yac_param *param) {
33 const struct yac_param_enum *self =
34 (const struct yac_param_enum *)param;
35 if (!self->has_default) return 0;
36 return *(self->value_ptr) == self->default_value;
37}
38
39static const char *yac_param_enum_get_name(
40 const struct yac_param *param) {
41 const struct yac_param_enum *self =
42 (const struct yac_param_enum *)param;
43 return self->name;
44}
45
47 struct yac_param *param, int value) {
48 struct yac_param_enum *self =
49 (struct yac_param_enum *)param;
50 // Check if value is valid in enum_table
53 self->enum_table, self->enum_table_size, value) != NULL,
54 "value %d is not a valid enum for parameter '%s'", value, self->name);
55 *(self->value_ptr) = value;
56 self->is_defined = 1;
57 return 0;
58}
59
61 struct yac_param *param, const char *value_str) {
62 struct yac_param_enum *self =
63 (struct yac_param_enum *)param;
65 value_str,
66 "No value provided for enum parameter '%s'", self->name);
67 int value =
69 self->enum_table, self->enum_table_size, value_str);
71 value != INT_MAX,
72 "'%s' is not a valid enum name for parameter '%s'",
73 value_str, self->name);
74 *(self->value_ptr) = value;
75 self->is_defined = 1;
76 return 0;
77}
78
80 const struct yac_param *param, int *value) {
81 const struct yac_param_enum *self =
82 (const struct yac_param_enum *)param;
83 YAC_ASSERT(value, "value is NULL");
85 self->has_default || self->is_defined,
86 "value for parameter '%s' is undefined, user must set it first",
87 self->name);
88 *value = *(self->value_ptr);
89 return 0;
90}
91
93 const struct yac_param *param, char *buf, size_t buflen) {
94 const struct yac_param_enum *self =
95 (const struct yac_param_enum *)param;
97 self->has_default || self->is_defined,
98 "value for parameter '%s' is undefined, user must set it first",
99 self->name);
100 int value = *(self->value_ptr);
101 const char *name =
104 name, "value %d is not a valid enum for parameter '%s'", value, self->name);
105 YAC_ASSERT(buf, "buf is NULL");
106 int n = snprintf(buf, buflen, "%s", name);
108 (n >= 0) && ((size_t)n < buflen),
109 "buffer too small for value '%s' of parameter '%s'", name, self->name);
110 return 0;
111}
112
114 const struct yac_param *param,
115 enum yac_param_scalar_kind *scalar_kind) {
116 UNUSED(param);
117 *scalar_kind = YAC_PARAM_SCALAR_KIND_INT;
118 return 0;
119}
120
122 struct yac_param *param) {
123 struct yac_param_enum *self =
124 (struct yac_param_enum *)param;
125 free(self->name);
126 free(param);
127}
128
129static const struct yac_param_vtable
132 .is_default = yac_param_enum_is_default,
133 .get_name = yac_param_enum_get_name,
134 .delete = yac_param_enum_delete,
135 .get_sub_count = NULL,
136 .get_sub_by_name = NULL,
137 .get_sub_by_index = NULL,
138 .append = NULL,
139 .set_scalar = yac_param_enum_set_scalar,
140 .get_scalar = yac_param_enum_get_scalar,
141 .get_scalar_kind = yac_param_enum_get_scalar_kind,
142 .set_scalar_int = yac_param_enum_set_scalar_int,
143 .set_scalar_dble = NULL,
144 .get_scalar_int = yac_param_enum_get_scalar_int,
145 .get_scalar_dble = NULL
146};
147
149 const char *name, int *value_ptr, int default_value,
150 struct yac_name_type_pair const *enum_table, size_t enum_table_size,
151 int has_default, int is_defined) {
152
154 YAC_ASSERT(enum_table, "enum_table is NULL");
155 YAC_ASSERT(enum_table_size > 0, "enum_table_size is 0");
157 !has_default ||
159 enum_table, enum_table_size, default_value),
160 "default_value %d is not valid enum of parameter '%s'",
161 default_value, name);
163 !is_defined ||
164 yac_name_type_pair_get_name(enum_table, enum_table_size, *value_ptr),
165 "initial value %d is not valid enum of parameter '%s'",
166 *value_ptr, name);
167 struct yac_param_enum *self = xmalloc(1 * sizeof(*self));
169 self->name = xstrdup(name);
170 self->value_ptr = value_ptr;
172 self->enum_table = enum_table;
174 self->has_default = has_default;
175 self->is_defined = is_defined;
176 return (struct yac_param *)self;
177}
#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_enum_get_scalar_kind(const struct yac_param *param, enum yac_param_scalar_kind *scalar_kind)
Definition param_enum.c:113
static int yac_param_enum_set_scalar_int(struct yac_param *param, int value)
Definition param_enum.c:46
static int yac_param_enum_is_default(const struct yac_param *param)
Definition param_enum.c:31
static int yac_param_enum_get_scalar(const struct yac_param *param, char *buf, size_t buflen)
Definition param_enum.c:92
static int yac_param_enum_get_scalar_int(const struct yac_param *param, int *value)
Definition param_enum.c:79
static int yac_param_enum_set_scalar(struct yac_param *param, const char *value_str)
Definition param_enum.c:60
static void yac_param_enum_delete(struct yac_param *param)
Definition param_enum.c:121
static const char * yac_param_enum_get_name(const struct yac_param *param)
Definition param_enum.c:39
struct yac_param * yac_param_enum_new(const char *name, int *value_ptr, int default_value, struct yac_name_type_pair const *enum_table, size_t enum_table_size, int has_default, int is_defined)
Create a new enum parameter for configuration.
Definition param_enum.c:148
static const struct yac_param_vtable yac_param_enum_vtable
Definition param_enum.c:130
static enum yac_param_type yac_param_enum_get_type(const struct yac_param *param)
Definition param_enum.c:25
#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
struct yac_name_type_pair const * enum_table
Definition param_enum.c:18
size_t enum_table_size
Definition param_enum.c:19
const struct yac_param_vtable * vtable
Definition param_enum.c:14
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