Skip to content

Commit c738d41

Browse files
author
Martin Belanger
committed
libnvme: replace manual accessor functions with auto-generated ones
Remove hand-written getter/setter implementations from tree.c and tree.h for nvme_host, nvme_subsystem, and nvme_ctrl structs, replacing them with automatically generated equivalents produced by generate-accessors. Supporting changes: - Rename structs-to-include.txt to generate-accessors-include.list for clarity and consistency with the new generate-accessors-exclude.list - Add generate-accessors-exclude.list to suppress generation for members that have custom accessor logic (pdc_enabled, state, address, etc.) - Introduce SET_FMT/GET_FMT macros in generate-accessors.c to make the naming convention (nvme_foo_get/nvme_foo_set) configurable in one place - Wire accessors_dep into libnvme_dep and libnvme_test_dep, and add ccan_dep into accessors_dep, so dependents get the correct include paths - Include <nvme/accessors.h> from libnvme.h to expose the generated API Signed-off-by: Martin Belanger <[email protected]>
1 parent 09049e3 commit c738d41

8 files changed

Lines changed: 54 additions & 705 deletions

File tree

libnvme/src/libnvme.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ extern "C" {
2525
#include <nvme/tree.h>
2626
#include <nvme/types.h>
2727
#include <nvme/util.h>
28+
#include <nvme/accessors.h>
2829

2930
#ifdef __cplusplus
3031
}

libnvme/src/meson.build

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pkg.generate(libnvme,
6969
libnvme_dep = declare_dependency(
7070
dependencies: [
7171
json_c_dep.partial_dependency(compile_args: true, includes: true),
72+
accessors_dep,
7273
],
7374
link_with: libnvme,
7475
include_directories: '.',
@@ -86,6 +87,9 @@ libnvme_test = library(
8687
libnvme_test_dep = declare_dependency(
8788
link_with: libnvme_test,
8889
include_directories: '.',
90+
dependencies: [
91+
accessors_dep,
92+
],
8993
)
9094

9195
mode = 'rw-r--r--'
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# SPDX-License-Identifier: LGPL-2.1-or-later
2+
3+
nvme_ns::generic_name
4+
nvme_ctrl::state
5+
nvme_ctrl::address
6+
nvme_ctrl::phy_slot
7+
nvme_ctrl::subsysnqn
8+
nvme_path::queue_depth
9+
nvme_host::pdc_enabled
10+
File renamed without changes.

libnvme/src/nvme/generate-accessors.c

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@
5858
#define SPACES " \t\n\r"
5959
#define streq(a, b) (strcmp((a), (b)) == 0)
6060

61+
/**
62+
* Function naming convention:
63+
* This controls whether to generate the functions as:
64+
* nvme_foo_get() / nvme_foo_set()
65+
* Or:
66+
* nvme_get_foo() / nvme_set_foo()
67+
*/
68+
#define SET_FMT "%s_set_%s" /* alternate name: "%s_%s_set" */
69+
#define GET_FMT "%s_get_%s" /* alternate name: "%s_%s_get" */
70+
6171
static const char *banner =
6272
"// SPDX-License-Identifier: LGPL-2.1-or-later\n"
6373
"/**\n"
@@ -207,8 +217,8 @@ static char *to_uppercase(char *s)
207217
* Any character that violates these rules is replaced with an underscore ('_').
208218
* The string is always modified in place; no new memory is allocated.
209219
*
210-
* @param s Pointer to the NUL-terminated string to sanitize.
211-
* If @p s is NULL or points to an empty string, the function does nothing.
220+
* @param s Pointer to the NUL-terminated string to sanitize. If @s is NULL or
221+
* points to an empty string, the function does nothing.
212222
*
213223
* @note This function does not check for C keywords or identifier length limits.
214224
*
@@ -808,7 +818,7 @@ typedef struct Conf {
808818
bool verbose;
809819
const char *c_fname; /* Generated output *.c file name */
810820
const char *h_fname; /* Generated output *.h file name */
811-
const char *l_fname; /* Generated ou5tput *.ld file name */
821+
const char *l_fname; /* Generated output *.ld file name */
812822
const char *prefix; /* Prefix added to each functions */
813823
StringList_t hdr_files; /* Input header file list */
814824
StringList_t incl_list; /* Inclusion list (read from --incl) */
@@ -1269,19 +1279,20 @@ static void generate_hdr(FILE *generated_hdr, StructInfo_t *si, Conf_t *conf)
12691279
if (!members->is_const) { /* No setter on const members */
12701280
if (members->is_char_array || streq(members->type, "const char *"))
12711281
fprintf(generated_hdr,
1272-
"void %s%s_%s_set(struct %s *p, const char *%s);\n",
1273-
conf->prefix, si->name,
1274-
members->name, si->name, members->name);
1282+
"void %s" SET_FMT "(struct %s *p, const char *%s);\n",
1283+
conf->prefix, si->name, members->name,
1284+
si->name, members->name);
12751285
else
12761286
fprintf(generated_hdr,
1277-
"void %s%s_%s_set(struct %s *p, %s %s);\n",
1278-
conf->prefix, si->name,
1279-
members->name, si->name, members->type, members->name);
1287+
"void %s" SET_FMT "(struct %s *p, %s %s);\n",
1288+
conf->prefix, si->name, members->name,
1289+
si->name, members->type, members->name);
12801290
}
12811291

12821292
/* Getter method */
1283-
fprintf(generated_hdr, "%s %s%s_%s_get(const struct %s *p);\n\n",
1284-
members->type, conf->prefix, si->name, members->name, si->name);
1293+
fprintf(generated_hdr, "%s %s" GET_FMT "(const struct %s *p);\n\n",
1294+
members->type, conf->prefix, si->name, members->name,
1295+
si->name);
12851296
}
12861297
}
12871298

@@ -1309,7 +1320,7 @@ static void generate_src(FILE *generated_src, StructInfo_t *si, Conf_t *conf)
13091320
if (!member->is_char_array && streq(member->type, "const char *")) {
13101321
/* dynamic string */
13111322
fprintf(generated_src,
1312-
"void %s%s_%s_set(struct %s *p, const char *%s) {\n"
1323+
"void %s" SET_FMT "(struct %s *p, const char *%s) {\n"
13131324
" free(p->%s);\n"
13141325
" p->%s = %s ? strdup(%s) : NULL;\n"
13151326
"}\n\n",
@@ -1323,7 +1334,7 @@ static void generate_src(FILE *generated_src, StructInfo_t *si, Conf_t *conf)
13231334
unsigned long sz = strtoul(member->array_size, NULL, 10);
13241335

13251336
fprintf(generated_src,
1326-
"void %s%s_%s_set(struct %s *p, const char *%s) {\n"
1337+
"void %s" SET_FMT "(struct %s *p, const char *%s) {\n"
13271338
" strncpy(p->%s, %s, %lu);\n"
13281339
" p->%s[%lu] = '\\0';\n"
13291340
"}\n\n",
@@ -1333,7 +1344,7 @@ static void generate_src(FILE *generated_src, StructInfo_t *si, Conf_t *conf)
13331344
member->name, sz - 1);
13341345
} else {
13351346
fprintf(generated_src,
1336-
"void %s%s_%s_set(struct %s *p, const char *%s) {\n"
1347+
"void %s" SET_FMT "(struct %s *p, const char *%s) {\n"
13371348
" strncpy(p->%s, %s, %s);\n"
13381349
" p->%s[%s - 1] = '\\0';\n"
13391350
"}\n\n",
@@ -1344,22 +1355,22 @@ static void generate_src(FILE *generated_src, StructInfo_t *si, Conf_t *conf)
13441355
}
13451356
} else { /* numeric or struct */
13461357
fprintf(generated_src,
1347-
"void %s%s_%s_set(struct %s *p, %s %s) {\n"
1358+
"void %s" SET_FMT "(struct %s *p, %s %s) {\n"
13481359
" p->%s = %s;\n"
13491360
"}\n\n",
1350-
conf->prefix, si->name, member->name, si->name,
1351-
member->type, member->name,
1361+
conf->prefix, si->name, member->name,
1362+
si->name, member->type, member->name,
13521363
member->name, member->name);
13531364

13541365
}
13551366
}
13561367

13571368
/* Getter method */
1358-
fprintf(generated_src, "%s %s%s_%s_get(const struct %s *p) {\n"
1369+
fprintf(generated_src, "%s %s" GET_FMT "(const struct %s *p) {\n"
13591370
" return p->%s;\n"
13601371
"}\n\n",
1361-
member->type, conf->prefix, si->name, member->name, si->name,
1362-
member->name);
1372+
member->type, conf->prefix, si->name, member->name,
1373+
si->name, member->name);
13631374
}
13641375
}
13651376

@@ -1368,7 +1379,7 @@ static void generate_src(FILE *generated_src, StructInfo_t *si, Conf_t *conf)
13681379
* one struct.
13691380
*
13701381
* Writes linker entries for each member in @si to the provided output
1371-
* FILE (@generated_ld). Handles special
1382+
* FILE (@generated_ld).
13721383
*
13731384
* @param generated_ld: FILE* to write implementations to.
13741385
* @param si: Pointer to the struct description.
@@ -1380,8 +1391,8 @@ static void generate_ld(FILE *generated_ld, StructInfo_t *si, Conf_t *conf)
13801391
Member_t *member = &si->members[m];
13811392

13821393
fprintf(generated_ld,
1383-
"\t\t%s%s_%s_get;\n"
1384-
"\t\t%s%s_%s_set;\n",
1394+
"\t\t%s" GET_FMT ";\n"
1395+
"\t\t%s" SET_FMT ";\n",
13851396
conf->prefix, si->name, member->name,
13861397
conf->prefix, si->name, member->name);
13871398
}

libnvme/src/nvme/meson.build

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ accessors_ch_custom_tgt = custom_target(
4141
'--h-out', '@OUTPUT0@',
4242
'--c-out', '@OUTPUT1@',
4343
'--ld-out', '@OUTPUT2@',
44-
'--incl', join_paths(meson.current_source_dir(), 'structs-to-include.txt'),
44+
'--incl', join_paths(meson.current_source_dir(), 'generate-accessors-include.list'),
45+
'--excl', join_paths(meson.current_source_dir(), 'generate-accessors-exclude.list'),
4546
'@INPUT@',
4647
],
4748
build_by_default: true,
@@ -64,6 +65,9 @@ accessors_dep = declare_dependency(
6465
tgt_accessors_h,
6566
],
6667
include_directories: '.',
68+
dependencies: [
69+
ccan_dep,
70+
],
6771
)
6872

6973
if meson.version().version_compare('>=1.4.0')

0 commit comments

Comments
 (0)