YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
param_struct.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_struct.h"
6#include "param_internal.h"
7#include "utils_common.h"
8#include <stdlib.h>
9#include <string.h>
10
12 const struct yac_param_vtable *vtable;
13 char *name;
16};
17
18static enum yac_param_type
20 const struct yac_param *param) {
21 UNUSED(param);
23}
24
26 const struct yac_param *param) {
27 const struct yac_param_struct *self =
28 (const struct yac_param_struct *)param;
29 int ret = 1;
30 for (size_t i = 0; (i < self->subparam_count) && ret; ++i) {
31 ret = yac_param_is_default(self->subparams[i]);
32 }
33 return ret;
34}
35
36static const char *yac_param_struct_get_name(
37 const struct yac_param *param) {
38 const struct yac_param_struct *self =
39 (const struct yac_param_struct *)param;
40 return self->name;
41}
42
44 const struct yac_param *param, size_t *count) {
45 const struct yac_param_struct *self =
46 (const struct yac_param_struct *)param;
47 YAC_ASSERT(count, "count is NULL");
48 *count = self->subparam_count;
49 return 0;
50}
51
53 const struct yac_param *param, const char *name,
54 struct yac_param **sub_param) {
55 const struct yac_param_struct *self =
56 (const struct yac_param_struct *)param;
57 YAC_ASSERT(name, "name is NULL");
58 YAC_ASSERT(sub_param, "sub_param is NULL");
59 int ret = 1;
60 for (size_t i = 0; (i < self->subparam_count) && ret; ++i) {
61 const char *subname =
63 if (subname && strcmp(subname, name) == 0) {
64 ret = 0;
65 *sub_param = self->subparams[i];
66 }
67 }
69 ret == 0, "subparam '%s' not found in param '%s'", name, self->name);
70 return ret;
71}
72
74 struct yac_param *param, size_t idx,
75 struct yac_param **sub_param) {
76 struct yac_param_struct *self =
77 (struct yac_param_struct *)param;
78 YAC_ASSERT(sub_param, "sub_param is NULL");
80 idx < self->subparam_count,
81 "idx %zu exceeds subparameter count (%zu) for parameter '%s'",
82 idx, self->subparam_count, self->name);
83 *sub_param = self->subparams[idx];
84 return 0;
85}
86
88 struct yac_param *param) {
89 struct yac_param_struct *self =
90 (struct yac_param_struct *)param;
91 for (size_t i = 0; i < self->subparam_count; ++i) {
93 }
94 free(self->subparams);
95 free(self->name);
96 free(param);
97}
98
99static const struct yac_param_vtable
102 .is_default = yac_param_struct_is_default,
103 .get_name = yac_param_struct_get_name,
104 .delete = yac_param_struct_delete,
105 .get_sub_count = yac_param_struct_get_sub_count,
106 .get_sub_by_name = yac_param_struct_get_sub_by_name,
107 .get_sub_by_index = yac_param_struct_get_sub_by_index,
108 .append = NULL,
109 .set_scalar = NULL,
110 .get_scalar = NULL,
111 .get_scalar_kind = NULL,
112 .set_scalar_int = NULL,
113 .set_scalar_dble = NULL,
114 .get_scalar_int = NULL,
115 .get_scalar_dble = NULL
116};
117
119 const char *name,
120 struct yac_param **subparams,
121 size_t subparam_count) {
122 YAC_ASSERT(name, "name is NULL");
123 YAC_ASSERT(name[0] != '\0', "name is empty string");
124 YAC_ASSERT((subparam_count == 0) || (subparams != NULL), "subparams is NULL");
125 struct yac_param_struct *self = xmalloc(1 * sizeof(*self));
127 self->name = xstrdup(name);
129 self->subparams =
130 (subparam_count > 0)
131 ? xmalloc(subparam_count * sizeof(*self->subparams))
132 : NULL;
133 for (size_t i = 0; i < subparam_count; ++i)
134 self->subparams[i] = subparams[i];
135 return (struct yac_param *)self;
136}
#define YAC_ASSERT(exp, msg)
#define UNUSED(x)
Definition core.h:72
void yac_param_delete(struct yac_param *param)
Definition param.c:304
int yac_param_is_default(const struct yac_param *param)
Check whether a parameter is at its default value.
Definition param.c:37
const char * yac_param_get_name(const struct yac_param *param)
Get the name of the current parameter.
Definition param.c:50
yac_param_type
Parameter type for generic configuration interface.
Definition param.h:171
@ YAC_PARAM_TYPE_STRUCT
Named, fixed set of subparameters.
Definition param.h:179
#define YAC_PARAM_ASSERT(COND,...)
static int yac_param_struct_get_sub_count(const struct yac_param *param, size_t *count)
static void yac_param_struct_delete(struct yac_param *param)
static const struct yac_param_vtable yac_param_struct_vtable
struct yac_param * yac_param_struct_new(const char *name, struct yac_param **subparams, size_t subparam_count)
Create a new struct parameter with a given name and subparameters.
static enum yac_param_type yac_param_struct_get_type(const struct yac_param *param)
static int yac_param_struct_get_sub_by_name(const struct yac_param *param, const char *name, struct yac_param **sub_param)
static int yac_param_struct_is_default(const struct yac_param *param)
static const char * yac_param_struct_get_name(const struct yac_param *param)
static int yac_param_struct_get_sub_by_index(struct yac_param *param, size_t idx, struct yac_param **sub_param)
#define xstrdup(s)
Definition ppm_xfuncs.h:84
#define xmalloc(size)
Definition ppm_xfuncs.h:66
const struct yac_param_vtable * vtable
struct yac_param ** subparams
enum yac_param_type(* get_type)(const struct yac_param *param)
char const * name
Definition toy_scrip.c:114