Line data Source code
1 : #include <unordered_map>
2 : #include <string>
3 : static const char * const _kdbgentemplate_highlevel_c = "// clang-format off\n{{!\nThis template file is licensed under BSD Zero Clause License (0BSD).\nFor the full text see ./highlevel/LICENSE.txt\n}}\n{{=/*% %*/=}}\n// clang-format on\n/**\n * @file\n *\n * This file was automatically generated using `kdb gen highlevel`.\n * Any changes will be overwritten, when the file is regenerated.\n *\n * @copyright BSD Zero Clause License\n *\n * Copyright (C) 2019 Elektra Initiative (https://libelektra.org)\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"/*% header_file %*/\"\n\n/*%# more_headers %*/\n#include \"/*% . %*/\"\n/*%/ more_headers %*/\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include <kdbhelper.h>\n#include <kdbinvoke.h>\n#include <kdbopts.h>\n\n#include <elektra/conversion.h>\n\n/*%# embed_spec\? %*/\nstatic KeySet * embeddedSpec (void)\n{\n return /*%& spec %*/;\n}\n/*%/ embed_spec\? %*/\n\n/*%={{ }}=%*/\n/**\n * Initializes an instance of Elektra for the application \'{{{ parent_key }}}\'.\n *\n * This can be invoked as many times as you want, however it is not a cheap operation,\n * so you should try to reuse the Elektra handle as much as possible.\n *\n * @param elektra A reference to where the Elektra instance shall be stored.\n * Has to be disposed of with elektraClose().\n * @param error A reference to an ElektraError pointer. Will be passed to elektraOpen().\n *\n * @retval 0 on success, @p elektra will contain a new Elektra instance coming from elektraOpen(),\n * @p error will be unchanged\n * @retval -1 on error, @p elektra will be unchanged, @p error will be set\n * @retval 1 help mode, \'-h\' or \'--help\' was specified call {{{ help_function_name }}} to display\n * the help message. @p elektra will contain a new Elektra instance. It has to be passed\n * to {{{ help_function_name }}}. You also need to elektraClose() it.\n * @p error will be unchanged\n *\n * @see elektraOpen\n */// {{=/*% %*/=}}\nint /*%& init_function_name %*/ (Elektra ** elektra, ElektraError ** error)\n{\n /*%# spec_as_defaults\? %*/\n KeySet * defaults = embeddedSpec ();\n /*%/ spec_as_defaults\? %*/\n /*%^ spec_as_defaults\? %*/\n /*%# embed_defaults\? %*/\n KeySet * defaults = /*%& defaults %*/;\n /*%/ embed_defaults\? %*/\n /*%^ embed_defaults\? %*/\n KeySet * defaults = NULL;\n /*%/ embed_defaults\? %*/\n /*%/ spec_as_defaults\? %*/\n\n KeySet * contract = /*%& contract %*/;\n\n Elektra * e = elektraOpen (\"/*% parent_key %*/\", defaults, contract, error);\n\n if (defaults != NULL)\n {\n ksDel (defaults);\n }\n\n if (e == NULL)\n {\n return -1;\n }\n\n *elektra = e;\n return elektraHelpKey (e) != NULL \? 1 : 0;\n}\n\n/**\n * Checks whether specload mode was invoked and if so, sends the specification over stdout\n * in the format expected by specload.\n *\n * You MUST not output anything to stdout before invoking this function. Ideally invoking this\n * is the first thing you do in your main()-function.\n *\n * This function will ONLY RETURN, if specload mode was NOT invoked. Otherwise it will call `exit()`.\n *\n * @param argc pass the value of argc from main\n * @param argv pass the value of argv from main\n */\nvoid /*%& specload_function_name %*/ (int argc, const char ** argv)\n{\n /*%# embed_spec\? %*/\n if (argc != 2 || strcmp (argv[1], \"/*% specload_arg %*/\") != 0)\n {\n return;\n }\n\n KeySet * spec = embeddedSpec ();\n\n Key * parentKey = keyNew (\"/*% spec_parent_key %*/\", KEY_META, \"system/elektra/quickdump/noparent\", \"\", KEY_END);\n\n KeySet * specloadConf = ksNew (1, keyNew (\"system/sendspec\", KEY_END), KS_END);\n ElektraInvokeHandle * specload = elektraInvokeOpen (\"specload\", specloadConf, parentKey);\n\n int result = elektraInvoke2Args (specload, \"sendspec\", spec, parentKey);\n\n elektraInvokeClose (specload, parentKey);\n keyDel (parentKey);\n ksDel (specloadConf);\n ksDel (spec);\n\n exit (result == ELEKTRA_PLUGIN_STATUS_SUCCESS \? EXIT_SUCCESS : EXIT_FAILURE);\n /*%/ embed_spec\? %*/\n}\n\n/*%={{ }}=%*/\n/**\n * Outputs the help message to stdout\n *\n * @param elektra The Elektra instance produced by {{{ init_function_name }}}.\n * @param usage If this is not NULL, it will be used instead of the default usage line.\n * @param prefix If this is not NULL, it will be inserted between the usage line and the options list.\n */// {{=/*% %*/=}}\nvoid /*%& help_function_name %*/ (Elektra * elektra, const char * usage, const char * prefix)\n{\n Key * helpKey = elektraHelpKey (elektra);\n if (helpKey == NULL)\n {\n return;\n }\n\n char * help = elektraGetOptsHelpMessage (helpKey, usage, prefix);\n printf (\"%s\", help);\n elektraFree (help);\n}\n\n/*%> partial.enum.c %*/\n\n/*%> partial.union.c %*/\n\n/*%> partial.struct.c %*/\n";
4 : static const char * const _kdbgentemplate_highlevel_h = "// clang-format off\n{{!\nThis template file is licensed under BSD Zero Clause License (0BSD).\nFor the full text see ./highlevel/LICENSE.txt\n}}\n{{=/*% %*/=}}\n// clang-format on\n/**\n * @file\n *\n * This file was automatically generated using `kdb gen highlevel`.\n * Any changes will be overwritten, when the file is regenerated.\n *\n * @copyright BSD Zero Clause License\n *\n * Copyright (C) 2019 Elektra Initiative (https://libelektra.org)\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\n\n#ifndef /*%& include_guard %*/\n#define /*%& include_guard %*/\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <elektra.h>\n\n#include <kdbhelper.h>\n#include <string.h>\n\n/*%# more_headers %*/\n#include \"/*% . %*/\"\n/*%/ more_headers %*/\n\n/*%> partial.enum.decl.h %*/\n\n/*%> partial.union.decl.h %*/\n\n/*%> partial.struct.decl.h %*/\n\n/*%> partial.keys.tags.h %*/\n\n/*%> partial.keys.fun.h %*/\n\nint /*%& init_function_name %*/ (Elektra ** elektra, ElektraError ** error);\nvoid /*%& help_function_name %*/ (Elektra * elektra, const char * usage, const char * prefix);\nvoid /*%& specload_function_name %*/ (int argc, const char ** argv);\n\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with {{{ init_function_name }}}().\n * @param tag The tag to look up.\n *\n * @return The value stored at the given key.\n * The lifetime of returned pointers is documented in the ELEKTRA_GET(*) functions above.\n */// {{=/*% %*/=}}\n#define elektraGet(elektra, tag) ELEKTRA_GET (tag) (elektra)\n\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with {{{ init_function_name }}}().\n * @param tag The tag to look up.\n * @param ... Variable arguments depending on the given tag.\n *\n * @return The value stored at the given key.\n * The lifetime of returned pointers is documented in the ELEKTRA_GET(*) functions above.\n */// {{=/*% %*/=}}\n#define elektraGetV(elektra, tag, ...) ELEKTRA_GET (tag) (elektra, __VA_ARGS__)\n\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with {{{ init_function_name }}}().\n * @param result Points to the struct into which results will be stored.\n * The lifetime of pointers in this struct is documented in the ELEKTRA_GET(*) functions above.\n * @param tag The tag to look up.\n */// {{=/*% %*/=}}\n#define elektraFillStruct(elektra, result, tag) ELEKTRA_GET (tag) (elektra, result)\n\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with {{{ init_function_name }}}().\n * @param result Points to the struct into which results will be stored.\n * The lifetime of pointers in this struct is documented in the ELEKTRA_GET(*) functions above.\n * @param tag The tag to look up.\n * @param ... Variable arguments depending on the given tag.\n */// {{=/*% %*/=}}\n#define elektraFillStructV(elektra, result, tag, ...) ELEKTRA_GET (tag) (elektra, result, __VA_ARGS__)\n\n/*%# generate_setters\? %*/\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with the {{{ init_function_name }}}().\n * @param tag The tag to write to.\n * @param value The new value.\n * @param error Pass a reference to an ElektraError pointer.\n */// {{=/*% %*/=}}\n#define elektraSet(elektra, tag, value, error) ELEKTRA_SET (tag) (elektra, value, error)\n\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with the {{{ init_function_name }}}().\n * @param tag The tag to write to.\n * @param value The new value.\n * @param error Pass a reference to an ElektraError pointer.\n * @param ... Variable arguments depending on the given tag.\n */// {{=/*% %*/=}}\n#define elektraSetV(elektra, tag, value, error, ...) ELEKTRA_SET (tag) (elektra, value, __VA_ARGS__, error)\n/*%/ generate_setters\? %*/\n\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with {{{ init_function_name }}}().\n * @param tag The array tag to look up.\n *\n * @return The size of the array below the given key.\n */// {{=/*% %*/=}}\n#define elektraSize(elektra, tag) ELEKTRA_SIZE (tag) (elektra)\n\n/*%={{ }}=%*/\n/**\n * @param elektra The elektra instance initialized with {{{ init_function_name }}}().\n * @param tag The array tag to look up.\n * @param ... Variable arguments depending on the given tag.\n *\n * @return The size of the array below the given key.\n */// {{=/*% %*/=}}\n#define elektraSizeV(elektra, tag, ...) ELEKTRA_SIZE (tag) (elektra, __VA_ARGS__)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // /*%& include_guard %*/\n";
5 : static const char * const _kdbgentemplate_highlevel_mount_sh = "#!/bin/sh\n\n{{# direct_file\? }}\nif [ -z \"$SPEC_FILE\" ]; then\n # TODO: set SPEC_FILE to the installed path of your spec.eqd file\n SPEC_FILE=\'/usr/local/share/{{{ org_and_app }}}.spec.eqd\'\nfi\n\nif ! [ -f \"$SPEC_FILE\" ]; then\n echo \"ERROR: SPEC_FILE points to non-existent file\" 1>&2\n exit 1\nfi\n{{/ direct_file\? }}{{^ direct_file\? }}\nif [ -z \"$APP_PATH\" ]; then\n # TODO: set APP_PATH to the installed path of your application\n APP_PATH=\'/usr/local/bin/{{{ app }}}\'\nfi\n\nif ! [ -f \"$APP_PATH\" ]; then\n echo \"ERROR: APP_PATH points to non-existent file\" 1>&2\n exit 1\nfi\n{{/ direct_file\? }}\n\nerror_other_mp() {\n echo \"ERROR: another mountpoint already exists on {{{ spec_parent_key }}}. Please umount first.\" 1>&2\n exit 1\n}\n\nif kdb mount -13 | grep -Fxq \'{{{ spec_parent_key }}}\'; then\n if ! kdb mount | grep -Fxq \'{{{ mount_file }}} on {{{ spec_parent_key }}} with name {{{ spec_parent_key }}}\'; then\n error_other_mp\n fi\n\n MP=$(echo \"{{{ spec_parent_key }}}\" | sed \'s:\\\\:\\\\\\\\:g\' | sed \'s:/:\\\\/:g\')\n {{# direct_file\? }}\n if [ \"$(kdb get \"system/elektra/mountpoints/$MP/getplugins/#5#specload#specload#/config/file\")\" != \"$SPEC_FILE\" ]; then\n error_other_mp\n fi\n {{/ direct_file\? }}{{^ direct_file\? }}\n if [ -n \"$(kdb get \"system/elektra/mountpoints/$MP/getplugins/#5#specload#specload#/config/file\")\" ]; then\n error_other_mp\n fi\n if [ \"$(kdb get \"system/elektra/mountpoints/$MP/getplugins/#5#specload#specload#/config/app\")\" != \"$APP_PATH\" ]; then\n error_other_mp\n fi\n if [ -n \"$(kdb ls \"system/elektra/mountpoints/$MP/getplugins/#5#specload#specload#/config/app/args\")\" ]; then\n error_other_mp\n fi\n {{/ direct_file\? }}\nelse\n {{# direct_file\? }}\n sudo kdb mount -R noresolver \"{{{ mount_file }}}\" \"{{{ spec_parent_key }}}\" specload \"file=$SPEC_FILE\"\n {{/ direct_file\? }}{{^ direct_file\? }}\n sudo kdb mount -R noresolver \"{{{ mount_file }}}\" \"{{{ spec_parent_key }}}\" specload \"app=$APP_PATH\"\n {{/ direct_file\? }}\nfi\n\nif kdb mount -13 | grep -Fxq \'{{{ parent_key }}}\'; then\n if ! kdb mount | grep -Fxq \'{{{ spec_mount_file }}} on {{{ parent_key }}} with name {{{ parent_key }}}\'; then\n echo \"ERROR: another mountpoint already exists on {{{ parent_key }}}. Please umount first.\" 1>&2\n exit 1\n fi\nelse\n sudo kdb spec-mount \'{{{ parent_key }}}\'\nfi\n";
6 : static const char * const _kdbgentemplate_highlevel_enum_c = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n// -------------------------\n// Enum conversion functions\n// -------------------------\n\n/*%# enums %*/\nELEKTRA_KEY_TO_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n const char * string;\n if (!elektraKeyToString (key, &string) || strlen (string) == 0)\n {\n return 0;\n }\n\n /*%# switch_from_string\? %*/\n /*%& from_string_code %*/\n /*%/ switch_from_string\? %*/\n /*%^ switch_from_string\? %*/\n /*%# values %*/\n if (strcmp (string, \"/*% string_value %*/\") == 0)\n {\n *variable = /*%& name %*/;\n return 1;\n }\n /*%/ values %*/\n /*%/ switch_from_string\? %*/\n\n return 0;\n}\n\nELEKTRA_TO_STRING_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n switch (value)\n {\n /*%# values %*/\n case /*%& name %*/:\n return elektraStrDup (\"/*% string_value %*/\");\n /*%/ values %*/\n }\n\n // should be unreachable\n return elektraStrDup (\"\");\n}\n\nELEKTRA_TO_CONST_STRING_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n switch (value)\n {\n /*%# values %*/\n case /*%& name %*/:\n return \"/*% string_value %*/\";\n /*%/ values %*/\n }\n\n // should be unreachable\n return \"\";\n}\n/*%/ enums %*/\n\n// -------------------------\n// Enum accessor functions\n// -------------------------\n\n/*%# enums %*/\nELEKTRA_GET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n /*%& native_type %*/ result;\n const Key * key = elektraFindKey (elektra, keyname, KDB_TYPE_ENUM);\n if (!ELEKTRA_KEY_TO (/*%& type_name %*/) (key, &result))\n {\n elektraFatalError (elektra, elektraErrorConversionFromString (KDB_TYPE_ENUM, keyname, keyString (key)));\n return (/*%& native_type %*/) 0;\n }\n return result;\n}\n\nELEKTRA_GET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n /*%& native_type %*/ result;\n const Key * key = elektraFindArrayElementKey (elektra, keyname, index, KDB_TYPE_ENUM);\n if (!ELEKTRA_KEY_TO (/*%& type_name %*/) (key, &result))\n {\n elektraFatalError (elektra, elektraErrorConversionFromString (KDB_TYPE_ENUM, keyname, keyString (key)));\n return (/*%& native_type %*/) 0;\n }\n return result;\n}\n\n/*%# generate_setters\? %*/\nELEKTRA_SET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n char * string = ELEKTRA_TO_STRING (/*%& type_name %*/) (value);\n if (string == 0)\n {\n *error = elektraErrorConversionToString (KDB_TYPE_ENUM, keyname);\n return;\n }\n elektraSetRawString (elektra, keyname, string, KDB_TYPE_ENUM, error);\n elektraFree (string);\n}\n\nELEKTRA_SET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n char * string = ELEKTRA_TO_STRING (/*%& type_name %*/) (value);\n if (string == 0)\n {\n *error = elektraErrorConversionToString (KDB_TYPE_ENUM, keyname);\n return;\n }\n elektraSetRawStringArrayElement (elektra, keyname, index, string, KDB_TYPE_ENUM, error);\n elektraFree (string);\n}\n/*%/ generate_setters\? %*/\n/*%/ enums %*/\n";
7 : static const char * const _kdbgentemplate_highlevel_enum_decl_h = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n/*%# enums %*/\n/*%# generate_typedef\? %*/\ntypedef enum\n{\n /*%# values %*/\n /*%& name %*/ = /*%& value %*/,\n /*%/ values %*/\n} /*%& native_type %*/;\n\n/*%/ generate_typedef\? %*/\n/*%/ enums %*/\n\n#define ELEKTRA_TO_CONST_STRING(typeName) ELEKTRA_CONCAT (ELEKTRA_CONCAT (elektra, typeName), ToConstString)\n#define ELEKTRA_TO_CONST_STRING_SIGNATURE(cType, typeName) const char * ELEKTRA_TO_CONST_STRING (typeName) (cType value)\n\n/*%# enums %*/\nELEKTRA_KEY_TO_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\nELEKTRA_TO_STRING_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\nELEKTRA_TO_CONST_STRING_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\n\nELEKTRA_GET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\nELEKTRA_GET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\n/*%# generate_setters\? %*/\nELEKTRA_SET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\nELEKTRA_SET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\n/*%/ generate_setters\? %*/\n\n/*%/ enums %*/\n";
8 : static const char * const _kdbgentemplate_highlevel_keys_fun_h = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n// local helper macros to determine the length of a 64 bit integer\n#define elektra_len19(x) ((x) < 10000000000000000000ULL \? 19 : 20)\n#define elektra_len18(x) ((x) < 1000000000000000000ULL \? 18 : elektra_len19 (x))\n#define elektra_len17(x) ((x) < 100000000000000000ULL \? 17 : elektra_len18 (x))\n#define elektra_len16(x) ((x) < 10000000000000000ULL \? 16 : elektra_len17 (x))\n#define elektra_len15(x) ((x) < 1000000000000000ULL \? 15 : elektra_len16 (x))\n#define elektra_len14(x) ((x) < 100000000000000ULL \? 14 : elektra_len15 (x))\n#define elektra_len13(x) ((x) < 10000000000000ULL \? 13 : elektra_len14 (x))\n#define elektra_len12(x) ((x) < 1000000000000ULL \? 12 : elektra_len13 (x))\n#define elektra_len11(x) ((x) < 100000000000ULL \? 11 : elektra_len12 (x))\n#define elektra_len10(x) ((x) < 10000000000ULL \? 10 : elektra_len11 (x))\n#define elektra_len09(x) ((x) < 1000000000ULL \? 9 : elektra_len10 (x))\n#define elektra_len08(x) ((x) < 100000000ULL \? 8 : elektra_len09 (x))\n#define elektra_len07(x) ((x) < 10000000ULL \? 7 : elektra_len08 (x))\n#define elektra_len06(x) ((x) < 1000000ULL \? 6 : elektra_len07 (x))\n#define elektra_len05(x) ((x) < 100000ULL \? 5 : elektra_len06 (x))\n#define elektra_len04(x) ((x) < 10000ULL \? 4 : elektra_len05 (x))\n#define elektra_len03(x) ((x) < 1000ULL \? 3 : elektra_len04 (x))\n#define elektra_len02(x) ((x) < 100ULL \? 2 : elektra_len03 (x))\n#define elektra_len01(x) ((x) < 10ULL \? 1 : elektra_len02 (x))\n#define elektra_len00(x) ((x) < 0ULL \? 0 : elektra_len01 (x))\n#define elektra_len(x) elektra_len00 (x)\n\n#define ELEKTRA_SIZE(tagName) ELEKTRA_CONCAT (elektraSize, tagName)\n\n/*%# keys %*/\n/*%# is_struct\? %*/\n/*%> partial.keys.fun.struct.h %*/\n/*%/ is_struct\? %*/\n/*%^ is_struct\? %*/\n/*%# is_struct_ref\? %*/\n/*%> partial.keys.fun.structref.h %*/\n/*%/ is_struct_ref\? %*/\n/*%^ is_struct_ref\? %*/\n/*%={{ }}=%*/\n/**\n * Get the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n{{# args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ args\? }}\n *\n * @return the value of \'{{{ name }}}\'.\n{{# is_string\? }} * The returned pointer may become invalid, if the internal state of @p elektra\n * is modified. All calls to elektraSet* modify this state.\n{{/ is_string\? }}\n */// {{=/*% %*/=}}\nstatic inline /*%& native_type %*/ ELEKTRA_GET (/*%& macro_name %*/) (Elektra * elektra /*%# args\? %*/,\n /*%# args %*/ /*%& native_type %*/ /*%& name %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/ /*%/ args\? %*/)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n /*%& native_type %*/ result = ELEKTRA_GET (/*%& type_name %*/) (elektra, name);\n elektraFree (name);\n return result;\n /*%/ args\? %*/\n /*%^ args\? %*/\n return ELEKTRA_GET (/*%& type_name %*/) (elektra, \"/*% name %*/\");\n /*%/ args\? %*/\n}\n\n/*%# generate_setters\? %*/\n/*%={{ }}=%*/\n/**\n * Set the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n * @param value The value of \'{{{ name }}}\'.\n{{# args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ args\? }}\n * @param error Pass a reference to an ElektraError pointer.\n * Will only be set in case of an error.\n */// {{=/*% %*/=}}\nstatic inline void ELEKTRA_SET (/*%& macro_name %*/) (Elektra * elektra,\n /*%& native_type %*/ value, /*%# args\? %*/ /*%# args %*/\n /*%& native_type %*/ /*%& name %*/,\n /*%/ args %*/ /*%/ args\? %*/ ElektraError ** error)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n ELEKTRA_SET (/*%& type_name %*/) (elektra, name, value, error);\n elektraFree (name);\n /*%/ args\? %*/\n /*%^ args\? %*/\n ELEKTRA_SET (/*%& type_name %*/) (elektra, \"/*% name %*/\", value, error);\n /*%/ args\? %*/\n}\n/*%/ generate_setters\? %*/\n/*%/ is_struct_ref\? %*/\n/*%/ is_struct\? %*/\n/*%# is_array\? %*/\n/*%={{ }}=%*/\n/**\n * Get the size of the array \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n{{# array_args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ array_args\? }}\n */// {{=/*% %*/=}}\nstatic inline kdb_long_long_t ELEKTRA_SIZE (/*%& macro_name %*/) (Elektra * elektra /*%# array_args\? %*/,\n /*%# args %*/ /*%& native_type %*/ /*%& name %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/ /*%/ array_args\? %*/)\n{\n /*%# array_args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n kdb_long_long_t size = elektraArraySize (elektra, name);\n elektraFree (name);\n return size;\n /*%/ array_args\? %*/\n /*%^ array_args\? %*/\n return elektraArraySize (elektra, \"/*% array_name %*/\");\n /*%/ array_args\? %*/\n}\n/*%/ is_array\? %*/\n/*%/ keys %*/\n\n#undef elektra_len19\n#undef elektra_len18\n#undef elektra_len17\n#undef elektra_len16\n#undef elektra_len15\n#undef elektra_len14\n#undef elektra_len13\n#undef elektra_len12\n#undef elektra_len11\n#undef elektra_len10\n#undef elektra_len09\n#undef elektra_len08\n#undef elektra_len07\n#undef elektra_len06\n#undef elektra_len05\n#undef elektra_len04\n#undef elektra_len03\n#undef elektra_len02\n#undef elektra_len01\n#undef elektra_len00\n#undef elektra_len\n";
9 : static const char * const _kdbgentemplate_highlevel_keys_fun_struct_h = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n/*%# alloc\? %*/\n/*%={{ }}=%*/\n/**\n * Get the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n{{# args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ args\? }}\n *\n * @return the value of \'{{{ name }}}\', free with ELEKTRA_STRUCT_FREE ({{{ type_name }}}).\n * Pointers contained in the struct may become invalid, if the internal state of @p elektra\n * is modified. All calls to elektraSet* modify this state.\n */// {{=/*% %*/=}}\nstatic inline /*%& native_type %*/ * ELEKTRA_GET (/*%& macro_name %*/) (Elektra * elektra /*%# args\? %*/,\n /*%# args %*/ /*%& native_type %*/ /*%& name %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/ /*%/ args\? %*/)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n /*%& native_type %*/ *result = ELEKTRA_GET (/*%& type_name %*/) (elektra, name);\n elektraFree (name);\n return result;\n /*%/ args\? %*/\n /*%^ args\? %*/\n return ELEKTRA_GET (/*%& type_name %*/) (elektra, \"/*% name %*/\");\n /*%/ args\? %*/\n}\n/*%/ alloc\? %*/\n/*%^ alloc\? %*/\n/*%={{ }}=%*/\n/**\n * Get the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n * @param result The value will be stored in the referenced variable.\n * Pointers contained in the struct may become invalid, if the internal state of @p elektra\n * is modified. All calls to elektraSet* modify this state.\n{{# args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ args\? }}\n */// {{=/*% %*/=}}\nstatic inline void ELEKTRA_GET (/*%& macro_name %*/) (Elektra * elektra, /*%& native_type %*/ *result /*%# args\? %*/,\n /*%# args %*/ /*%& native_type %*/ /*%& name %*/ /*%^ last\? %*/, /*%/ last\? %*/\n /*%/ args %*/ /*%/ args\? %*/)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n ELEKTRA_GET (/*%& type_name %*/) (elektra, name, result);\n elektraFree (name);\n /*%/ args\? %*/\n /*%^ args\? %*/\n ELEKTRA_GET (/*%& type_name %*/) (elektra, \"/*% name %*/\", result);\n /*%/ args\? %*/\n}\n/*%/ alloc\? %*/\n\n/*%# generate_setters\? %*/\n/*%={{ }}=%*/\n/**\n * Set the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n * @param value The value of \'{{{ name }}}\'.\n{{# args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ args\? }}\n * @param error Pass a reference to an ElektraError pointer.\n * Will only be set in case of an error.\n */// {{=/*% %*/=}}\nstatic inline void ELEKTRA_SET (/*%& macro_name %*/) (Elektra * elektra, const /*%& native_type %*/ * value, /*%# args\? %*/ /*%# args %*/\n /*%& native_type %*/ /*%& name %*/,\n /*%/ args %*/ /*%/ args\? %*/ ElektraError ** error)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n ELEKTRA_SET (/*%& type_name %*/) (elektra, name, value, error);\n elektraFree (name);\n /*%/ args\? %*/\n /*%^ args\? %*/\n ELEKTRA_SET (/*%& type_name %*/) (elektra, \"/*% name %*/\", value, error);\n /*%/ args\? %*/\n}\n/*%/ generate_setters\? %*/\n";
10 : static const char * const _kdbgentemplate_highlevel_keys_fun_structref_h = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n/*%# alloc\? %*/\n/*%={{ }}=%*/\n/**\n * Get the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\nsucceed_if_same_string ($1)\n *\n * @return the value of \'{{{ name }}}\', free with ELEKTRA_STRUCT_FREE ({{{ type_name }}}).\n * Pointers contained in the struct may become invalid, if the internal state of @p elektra\n * is modified. All calls to elektraSet* modify this state.\n */// {{=/*% %*/=}}\nstatic inline /*%& native_type %*/ * ELEKTRA_GET (/*%& macro_name %*/) (Elektra * elektra /*%# args\? %*/,\n /*%# args %*/\n /*%& native_type %*/ /*%& name %*/ /*%^ last\? %*/, /*%/ last\? %*/\n /*%/ args %*/ /*%/ args\? %*/)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n const char * actualName = elektraFindReference (elektra, name);\n elektraFree (name);\n /*%/ args\? %*/\n /*%^ args\? %*/\n const char * actualName = elektraFindReference (elektra, \"/*% name %*/\");\n /*%/ args\? %*/\n\n if (actualName == NULL || strlen (actualName) == 0)\n {\n return NULL;\n }\n\n return ELEKTRA_GET (/*%& type_name %*/) (elektra, actualName);\n}\n/*%/ alloc\? %*/\n/*%^ alloc\? %*/\n/*%={{ }}=%*/\n/**\n * Get the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n * @param result The value will be stored in the referenced variable.\n * Pointers contained in the struct may become invalid, if the internal state of @p elektra\n * is modified. All calls to elektraSet* modify this state.\n{{# args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ args\? }}\n */// {{=/*% %*/=}}\nstatic inline void ELEKTRA_GET (/*%& macro_name %*/) (Elektra * elektra, /*%& native_type %*/ *result /*%# args\? %*/,\n /*%# args %*/\n /*%& native_type %*/ /*%& name %*/ /*%^ last\? %*/, /*%/ last\? %*/\n /*%/ args %*/ /*%/ args\? %*/)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n const char * actualName = elektraFindReference (elektra, name);\n elektraFree (name);\n /*%/ args\? %*/\n /*%^ args\? %*/\n const char * actualName = elektraFindReference (elektra, \"/*% name %*/\");\n /*%/ args\? %*/\n\n if (actualName == NULL || strlen (actualName) == 0)\n {\n return NULL;\n }\n\n ELEKTRA_GET (/*%& type_name %*/) (elektra, actualName, result);\n}\n/*%/ alloc\? %*/\n\n/*%# generate_setters\? %*/\n/*%={{ }}=%*/\n/**\n * Set the value of key \'{{{ name }}}\' (tag #{{{ macro_name }}}).\n *\n * WARNING: if the given value does not reference a valid struct, from this specification,\n * ELEKTRA_GET ({{{ tag_name }}}) will fail. Use the `reference` plugin to ensure valid values.\n *\n * @param elektra Instance of Elektra. Create with {{{ init_function_name }}}().\n * @param value The value of \'{{{ name }}}\', you must prefix it with \'{{{ parent_key }}}\' yourself.\n * This is because you may want to specify a namespace.\n{{# args\? }}{{# args }} * @param {{{ name }}} {{{ description }}}\n{{/ args }}{{/ args\? }}\n * @param error Pass a reference to an ElektraError pointer.\n * Will only be set in case of an error.\n */// {{=/*% %*/=}}\nstatic inline void ELEKTRA_SET (/*%& macro_name %*/) (Elektra * elektra, const char * value,\n /*%# args\? %*/ /*%# args %*/ /*%& native_type %*/ /*%& name %*/,\n /*%/ args %*/ /*%/ args\? %*/ ElektraError ** error)\n{\n /*%# args\? %*/\n char * name = elektraFormat (\"/*% fmt_string %*/\", /*%# args %*/ /*%& code %*/ /*%^ last\? %*/,\n /*%/ last\? %*/ /*%/ args %*/);\n elektraSetRawString (elektra, name, value, \"struct_ref\", error);\n elektraFree (name);\n /*%/ args\? %*/\n /*%^ args\? %*/\n elektraSetRawString (elektra, \"/*% name %*/\", value, \"struct_ref\", error);\n /*%/ args\? %*/\n}\n/*%/ generate_setters\? %*/\n";
11 : static const char * const _kdbgentemplate_highlevel_keys_tags_h = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n// clang-format off\n/*%# keys %*/\n/*%={{ }}=%*/\n/**\n* Tag name for \'{{{ name }}}\'\n* {{# args\? }}\n* Required arguments:\n* {{# args }}\n* - {{{ native_type }}} {{{ name }}}: {{{ description }}}\n* {{/ args }}\n* {{/ args\? }}\n*/// {{=/*% %*/=}}\n#define /*%& macro_name %*/ /*%& tag_name %*/\n/*%/ keys %*/\n// clang-format on\n";
12 : static const char * const _kdbgentemplate_highlevel_struct_alloc_fields_c = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n/*%# fields %*/\n/*%^ is_array_size\? %*/\n/*%^ is_discriminator\? %*/\nstrncpy (&field[nameLen], \"/*% key_name %*/\", /*%& max_field_len %*/);\n/*%# is_union\? %*/\n/*%# is_array\? %*/\nresult->/*%& size_field %*/ = elektraArraySize (elektra, field);\nif (result->/*%& size_field %*/ > 0)\n{\n result->/*%& name %*/ = elektraCalloc (sizeof (/*%& native_type %*/) * result->/*%& size_field %*/);\n result->/*%& discr_field %*/ = elektraCalloc (sizeof (/*%& discr_native_type %*/) * result->/*%& size_field %*/);\n for (kdb_long_long_t i = 0; i < result->/*%& size_field %*/; ++i)\n {\n const char * refname = elektraFindReferenceArrayElement (elektra, field, i);\n if (refname != NULL && refname[0] != \'\\0\')\n {\n size_t refnameLen = strlen (refname);\n char * discriminatorField = elektraCalloc ((refnameLen + sizeof (\"//*% discr_suffix %*/\")) * sizeof (char));\n strcpy (discriminatorField, refname);\n strcpy (&discriminatorField[refnameLen], \"//*% discr_suffix %*/\");\n\n result->/*% discr_field %*/[i] = ELEKTRA_GET (/*%& discr_type_name %*/) (elektra, discriminatorField);\n elektraFree (discriminatorField);\n\n result->/*%& name %*/[i] = ELEKTRA_GET (/*%& type_name %*/) (elektra, refname, result->/*% discr_field %*/[i]);\n }\n }\n}\n/*%/ is_array\? %*/\n/*%^ is_array\? %*/\nconst char * refname = elektraFindReference (elektra, field);\nif (refname != NULL && refname[0] != \'\\0\')\n{\n size_t refnameLen = strlen (refname);\n char * discriminatorField = elektraCalloc ((refnameLen + sizeof (\"//*% discr_suffix %*/\")) * sizeof (char));\n strcpy (discriminatorField, refname);\n strcpy (&discriminatorField[refnameLen], \"//*% discr_suffix %*/\");\n\n result->/*% discr_field %*/ = ELEKTRA_GET (/*%& discr_type_name %*/) (elektra, discriminatorField);\n elektraFree (discriminatorField);\n\n result->/*%& name %*/ = ELEKTRA_GET (/*%& type_name %*/) (elektra, refname, result->/*% discr_field %*/);\n}\n/*%/ is_array\? %*/\n/*%/ is_union\? %*/\n/*%^ is_union\? %*/\n/*%# is_array\? %*/\nresult->/*%& size_field %*/ = elektraArraySize (elektra, field);\nif (result->/*%& size_field %*/ > 0)\n{\n result->/*%& name %*/ = elektraCalloc (sizeof (/*%& native_type %*/) * result->/*%& size_field %*/);\n for (kdb_long_long_t i = 0; i < result->/*%& size_field %*/; ++i)\n {\n /*%# is_struct\? %*/\n const char * refname = elektraFindReferenceArrayElement (elektra, field, i);\n if (refname != NULL && refname[0] != \'\\0\')\n {\n /*%# alloc\? %*/\n result->/*%& name %*/[i] = ELEKTRA_GET (/*%& type_name %*/) (elektra, refname);\n /*%/ alloc\? %*/\n /*%^ alloc\? %*/\n result->/*%& name %*/[i] = elektraCalloc (sizeof (/*%& native_type %*/));\n ELEKTRA_GET (/*%& type_name %*/) (elektra, refname, &result->/*%& name %*/[i]);\n /*%/ alloc\? %*/\n }\n /*%/ is_struct\? %*/\n /*%^ is_struct\? %*/\n result->/*%& name %*/[i] = ELEKTRA_GET_ARRAY_ELEMENT (/*%& type_name %*/) (elektra, field, i);\n /*%/ is_struct\? %*/\n }\n}\n/*%/ is_array\? %*/\n/*%^ is_array\? %*/\n/*%# is_struct\? %*/\nconst char * refname = elektraFindReference (elektra, field);\nif (refname != NULL && refname[0] != \'\\0\')\n{\n /*%# alloc\? %*/\n result->/*%& name %*/ = ELEKTRA_GET (/*%& type_name %*/) (elektra, refname);\n /*%/ alloc\? %*/\n /*%^ alloc\? %*/\n result->/*%& name %*/ = elektraCalloc (sizeof (/*%& native_type %*/));\n ELEKTRA_GET (/*%& type_name %*/) (elektra, refname, result->/*%& name %*/);\n /*%/ alloc\? %*/\n}\n/*%/ is_struct\? %*/\n/*%^ is_struct\? %*/\nresult->/*%& name %*/ = ELEKTRA_GET (/*%& type_name %*/) (elektra, field);\n/*%/ is_struct\? %*/\n/*%/ is_array\? %*/\n/*%/ is_union\? %*/\n/*%/ is_discriminator\? %*/\n/*%/ is_array_size\? %*/\n\n/*%/ fields %*/\n";
13 : static const char * const _kdbgentemplate_highlevel_struct_c = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n// -------------------------\n// Struct accessor functions\n// -------------------------\n\n/*%# structs %*/\n/*%# alloc\? %*/\nELEKTRA_STRUCT_FREE_SIGNATURE (/*%& native_type %*/ *, /*%& type_name %*/)\n{\n if (*ptr == NULL)\n {\n return;\n }\n\n /*%# fields %*/\n /*%^ is_discriminator\? %*/\n /*%# is_union\? %*/\n /*%# is_array\? %*/\n for (kdb_long_long_t i = 0; i < (*ptr)->/*%& size_field %*/; ++i)\n {\n ELEKTRA_UNION_FREE (/*%& type_name %*/) (&(*ptr)->/*%& name %*/[i], ((*ptr)->/*%& discr_field %*/[i]));\n }\n /*%/ is_array\? %*/\n elektraFree ((*ptr)->/*%& name %*/);\n elektraFree ((*ptr)->/*%& discr_field %*/);\n /*%^ is_array\? %*/\n ELEKTRA_UNION_FREE (/*%& type_name %*/) ((*ptr)->/*%& name %*/, (*ptr)->/*%& discr_field %*/);\n /*%/ is_array\? %*/\n /*%/ is_union\? %*/\n /*%^ is_union\? %*/\n /*%# is_struct %*/\n /*%# is_array\? %*/\n for (kdb_long_long_t i = 0; i < (*ptr)->/*%& size_field %*/; ++i)\n {\n ELEKTRA_STRUCT_FREE (/*%& type_name %*/) (&(*ptr)->/*%& name %*/[i]);\n }\n elektraFree ((*ptr)->/*%& name %*/);\n /*%/ is_array\? %*/\n /*%^ is_array\? %*/\n ELEKTRA_STRUCT_FREE (/*%& type_name %*/) ((*ptr)->/*%& name %*/);\n /*%/ is_array\? %*/\n /*%/ is_struct %*/\n /*%/ is_union\? %*/\n /*%/ is_discriminator\? %*/\n /*%/ fields %*/\n elektraFree (*ptr);\n *ptr = NULL;\n}\n\nELEKTRA_GET_SIGNATURE (/*%& native_type %*/ *, /*%& type_name %*/)\n{\n /*%& native_type %*/ *result = elektraCalloc (sizeof (/*%& native_type %*/));\n size_t nameLen = strlen (keyname);\n char * field = elektraCalloc ((nameLen + 1 + /*%& max_field_len %*/ +1) * sizeof (char));\n strcpy (field, keyname);\n field[nameLen] = \'/\';\n ++nameLen;\n\n /*%> partial.struct.alloc.fields.c %*/\n\n elektraFree (field);\n return result;\n}\n\nELEKTRA_GET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/ *, /*%& type_name %*/)\n{\n /*%& native_type %*/ *result = elektraCalloc (sizeof (/*%& native_type %*/));\n size_t nameLen = strlen (keyname);\n char * field = elektraCalloc ((nameLen + 1 + /*%& max_field_len %*/ +1 + ELEKTRA_MAX_ARRAY_SIZE) * sizeof (char));\n strcpy (field, keyname);\n field[nameLen] = \'/\';\n ++nameLen;\n\n elektraWriteArrayNumber (&field[nameLen], index);\n nameLen = strlen (field);\n field[nameLen] = \'/\';\n ++nameLen;\n\n /*%> partial.struct.alloc.fields.c %*/\n\n elektraFree (field);\n return result;\n}\n/*%/ alloc\? %*/\n/*%^ alloc\? %*/\nELEKTRA_GET_OUT_PTR_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n size_t nameLen = strlen (keyname);\n char * field = elektraCalloc ((nameLen + 1 + /*%& max_field_len %*/ +1) * sizeof (char));\n strcpy (field, keyname);\n field[nameLen] = \'/\';\n ++nameLen;\n\n /*%# fields %*/\n /*%^ is_array_size\? %*/\n strncpy (&field[nameLen], \"/*% key_name %*/\", /*%& max_field_len %*/);\n /*%# is_struct\? %*/\n/*%! should never happend %*/\n#error \"struct reference inside non-allocating struct is not supported\"\n /*%/ is_struct\? %*/\n /*%^ is_struct\? %*/\n /*%# is_array\? %*/\n/*%! should never happend %*/\n#error \"array inside non-allocating struct is not supported\"\n /*%/ is_array\? %*/\n /*%^ is_array\? %*/\n result->/*%& name %*/ = ELEKTRA_GET (/*%& type_name %*/) (elektra, field);\n /*%/ is_array\? %*/\n /*%/ is_struct\? %*/\n /*%/ is_array_size\? %*/\n\n /*%/ fields %*/\n elektraFree (field);\n}\n\nELEKTRA_GET_OUT_PTR_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/)\n{\n size_t nameLen = strlen (keyname);\n char * field = elektraCalloc ((nameLen + 1 + /*%& max_field_len %*/ +1 + ELEKTRA_MAX_ARRAY_SIZE) * sizeof (char));\n strcpy (field, keyname);\n field[nameLen] = \'/\';\n ++nameLen;\n\n elektraWriteArrayNumber (&field[nameLen], index);\n nameLen = strlen (field);\n field[nameLen] = \'/\';\n ++nameLen;\n\n /*%# fields %*/\n /*%^ is_array_size\? %*/\n strncpy (&field[nameLen], \"/*% key_name %*/\", /*%& max_field_len %*/);\n /*%# is_struct\? %*/\n/*%! should never happend %*/\n#error \"struct reference inside non-allocating struct is not supported\"\n /*%/ is_struct\? %*/\n /*%^ is_struct\? %*/\n /*%# is_array\? %*/\n/*%! should never happend %*/\n#error \"array inside non-allocating struct is not supported\"\n /*%/ is_array\? %*/\n /*%^ is_array\? %*/\n result->/*%& name %*/ = ELEKTRA_GET (/*%& type_name %*/) (elektra, field);\n /*%/ is_array\? %*/\n /*%/ is_struct\? %*/\n /*%/ is_array_size\? %*/\n\n /*%/ fields %*/\n elektraFree (field);\n}\n/*%/ alloc\? %*/\n\n/*%# generate_setters\? %*/\nELEKTRA_SET_SIGNATURE (const /*%& native_type %*/ *, /*%& type_name %*/)\n{\n size_t nameLen = strlen (keyname);\n char * field = elektraCalloc ((nameLen + 1 + /*%& max_field_len %*/ +1) * sizeof (char));\n strcpy (field, keyname);\n field[nameLen] = \'/\';\n ++nameLen;\n\n /*%# fields %*/\n /*%^ is_array_size\? %*/\n /*%^ is_discriminator\? %*/\n strncpy (&field[nameLen], \"/*% key_name %*/\", /*%& max_field_len %*/);\n /*%# is_union\? %*/\n /*%# is_array\? %*/\n for (kdb_long_long_t i = 0; i < value->/*%& size_field %*/; ++i)\n {\n /*%& native_type %*/ v = value->/*%& name %*/[i];\n ELEKTRA_SET_ARRAY_ELEMENT (/*%& type_name %*/) (elektra, field, i, v, (value->/*%& discr_field %*/[i]), error);\n }\n /*%/ is_array\? %*/\n /*%^ is_array\? %*/\n ELEKTRA_SET (/*%& type_name %*/) (elektra, field, value->/*%& name %*/, value->/*%& discr_field %*/, error);\n /*%/ is_array\? %*/\n /*%/ is_union\? %*/\n /*%^ is_union\? %*/\n /*%# is_array\? %*/\n for (kdb_long_long_t i = 0; i < value->/*%& size_field %*/; ++i)\n {\n ELEKTRA_SET_ARRAY_ELEMENT (/*%& type_name %*/) (elektra, field, i, value->/*%& name %*/[i], error);\n }\n /*%/ is_array\? %*/\n /*%^ is_array\? %*/\n ELEKTRA_SET (/*%& type_name %*/) (elektra, field, value->/*%& name %*/, error);\n /*%/ is_array\? %*/\n /*%/ is_union\? %*/\n if (error != NULL)\n {\n return;\n }\n /*%/ is_discriminator\? %*/\n /*%/ is_array_size\? %*/\n\n /*%/ fields %*/\n}\n\nELEKTRA_SET_ARRAY_ELEMENT_SIGNATURE (const /*%& native_type %*/ *, /*%& type_name %*/)\n{\n size_t nameLen = strlen (keyname);\n char * field = elektraCalloc ((nameLen + 1 + /*%& max_field_len %*/ +1 + ELEKTRA_MAX_ARRAY_SIZE) * sizeof (char));\n strcpy (field, keyname);\n field[nameLen] = \'/\';\n ++nameLen;\n\n elektraWriteArrayNumber (&field[nameLen], index);\n nameLen = strlen (field);\n field[nameLen] = \'/\';\n ++nameLen;\n\n /*%# fields %*/\n /*%^ is_array_size\? %*/\n /*%^ is_discriminator\? %*/\n strncpy (&field[nameLen], \"/*% key_name %*/\", /*%& max_field_len %*/);\n /*%# is_union\? %*/\n /*%# is_array\? %*/\n for (kdb_long_long_t i = 0; i < value->/*%& size_field %*/; ++i)\n {\n /*%& native_type %*/ v = value->/*%& name %*/[i];\n ELEKTRA_SET_ARRAY_ELEMENT (/*%& type_name %*/) (elektra, field, i, v, (value->/*%& discr_field %*/[i]), error);\n }\n /*%/ is_array\? %*/\n /*%^ is_array\? %*/\n ELEKTRA_SET (/*%& type_name %*/) (elektra, field, value->/*%& name %*/, value->/*%& discr_field %*/, error);\n /*%/ is_array\? %*/\n /*%/ is_union\? %*/\n /*%^ is_union\? %*/\n /*%# is_array\? %*/\n for (kdb_long_long_t i = 0; i < value->/*%& size_field %*/; ++i)\n {\n ELEKTRA_SET_ARRAY_ELEMENT (/*%& type_name %*/) (elektra, field, i, value->/*%& name %*/[i], error);\n }\n /*%/ is_array\? %*/\n /*%^ is_array\? %*/\n ELEKTRA_SET (/*%& type_name %*/) (elektra, field, value->/*%& name %*/, error);\n /*%/ is_array\? %*/\n /*%/ is_union\? %*/\n if (error != NULL)\n {\n return;\n }\n /*%/ is_discriminator\? %*/\n /*%/ is_array_size\? %*/\n\n /*%/ fields %*/\n}\n/*%/ generate_setters\? %*/\n/*%/ structs %*/\n";
14 : static const char * const _kdbgentemplate_highlevel_struct_decl_h = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n#define ELEKTRA_STRUCT_FREE(typeName) ELEKTRA_CONCAT (elektraFree, typeName)\n#define ELEKTRA_STRUCT_FREE_SIGNATURE(cType, typeName) void ELEKTRA_STRUCT_FREE (typeName) (cType * ptr)\n\n/*%# structs %*/\n/*%# generate_typedef\? %*/\ntypedef struct /*%& native_type %*/\n{\n /*%# fields %*/\n /*%# is_union\? %*/\n /*%& native_type %*/ /*%# is_array\? %*/ * /*%/ is_array\? %*/ /*%& name%*/;\n /*%/ is_union\? %*/\n /*%^ is_union\? %*/ /*%# is_struct\? %*/\n struct /*%& native_type %*/ * /*%# is_array\? %*/ * /*%/ is_array\? %*/ /*%& name%*/;\n /*%/ is_struct\? %*/\n /*%^ is_struct\? %*/\n /*%& native_type %*/ /*%# is_array\? %*/ */*%/ is_array\? %*/ /*%& name%*/;\n /*%/ is_struct\? %*/ /*%/ is_union\? %*/\n\n /*%/ fields %*/\n} /*%& native_type %*/;\n\n/*%/ generate_typedef\? %*/\n/*%/ structs %*/\n\n/*%# structs %*/\n/*%# alloc\? %*/\nELEKTRA_STRUCT_FREE_SIGNATURE (/*%& native_type %*/ *, /*%& type_name %*/);\n\nELEKTRA_GET_SIGNATURE (/*%& native_type %*/ *, /*%& type_name %*/);\nELEKTRA_GET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/ *, /*%& type_name %*/);\n/*%/ alloc\? %*/\n/*%^ alloc\? %*/\nELEKTRA_GET_OUT_PTR_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\nELEKTRA_GET_OUT_PTR_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/);\n/*%/ alloc\? %*/\n/*%# generate_setters\? %*/\nELEKTRA_SET_SIGNATURE (const /*%& native_type %*/ *, /*%& type_name %*/);\nELEKTRA_SET_ARRAY_ELEMENT_SIGNATURE (const /*%& native_type %*/ *, /*%& type_name %*/);\n/*%/ generate_setters\? %*/\n\n/*%/ structs %*/\n";
15 : static const char * const _kdbgentemplate_highlevel_union_c = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n// -------------------------\n// Union accessor functions\n// -------------------------\n\n/*%# unions %*/\nELEKTRA_UNION_FREE_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/)\n{\n if (ptr == NULL)\n {\n return;\n }\n\n switch (discriminator)\n {\n /*%# fields %*/\n case /*%& enum_value %*/:\n ELEKTRA_STRUCT_FREE (/*% type_name %*/) (&ptr->/*%& name %*/);\n break;\n /*%/ fields %*/\n default:\n break;\n }\n}\n\nELEKTRA_UNION_GET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/)\n{\n switch (discriminator)\n {\n /*%# fields %*/\n case /*%& enum_value %*/:\n return (/*%& union_type %*/) ELEKTRA_GET (/*% type_name %*/) (elektra, keyname);\n /*%/ fields %*/\n default:\n // TODO: fatal error\n break;\n }\n return (/*%& native_type %*/) (/*%& default_type %*/ *) NULL;\n}\n\nELEKTRA_UNION_GET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/)\n{\n switch (discriminator)\n {\n /*%# fields %*/\n case /*%& enum_value %*/:\n return (/*%& union_type %*/) ELEKTRA_GET_ARRAY_ELEMENT (/*% type_name %*/) (elektra, keyname, index);\n /*%/ fields %*/\n default:\n // TODO: fatal error\n break;\n }\n return (/*%& native_type %*/) (/*%& default_type %*/ *) NULL;\n}\n\n/*%# generate_setters\? %*/\nELEKTRA_UNION_SET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/)\n{\n switch (discriminator)\n {\n /*%# fields %*/\n case /*%& enum_value %*/:\n ELEKTRA_SET (/*% type_name %*/) (elektra, keyname, value./*%& name %*/, error);\n break;\n /*%/ fields %*/\n default:\n // TODO: set error\n break;\n }\n}\n\nELEKTRA_UNION_SET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/)\n{\n switch (discriminator)\n {\n /*%# fields %*/\n case /*%& enum_value %*/:\n ELEKTRA_SET_ARRAY_ELEMENT (/*% type_name %*/) (elektra, keyname, index, value./*%& name %*/, error);\n break;\n /*%/ fields %*/\n default:\n // TODO: set error\n break;\n }\n}\n/*%/ generate_setters\? %*/\n/*%/ unions %*/\n";
16 : static const char * const _kdbgentemplate_highlevel_union_decl_h = "// clang-format off\n{{=/*% %*/=}}\n// clang-format on\n\n#define ELEKTRA_UNION_FREE(typeName) ELEKTRA_CONCAT (elektraFree, typeName)\n#define ELEKTRA_UNION_FREE_SIGNATURE(cType, typeName, discrType) void ELEKTRA_UNION_FREE (typeName) (cType * ptr, discrType discriminator)\n\n#define ELEKTRA_UNION_GET_SIGNATURE(cType, typeName, discrType) \\\n cType ELEKTRA_GET (typeName) (Elektra * elektra, const char * keyname, discrType discriminator)\n#define ELEKTRA_UNION_GET_ARRAY_ELEMENT_SIGNATURE(cType, typeName, discrType) \\\n cType ELEKTRA_GET_ARRAY_ELEMENT (typeName) (Elektra * elektra, const char * keyname, kdb_long_long_t index, discrType discriminator)\n/*%# generate_setters\? %*/\n#define ELEKTRA_UNION_SET_SIGNATURE(cType, typeName, discrType) \\\n void ELEKTRA_SET (typeName) (Elektra * elektra, const char * keyname, cType value, discrType discriminator, ElektraError ** error)\n#define ELEKTRA_UNION_SET_ARRAY_ELEMENT_SIGNATURE(cType, typeName, discrType) \\\n void ELEKTRA_SET_ARRAY_ELEMENT (typeName) (Elektra * elektra, const char * keyname, kdb_long_long_t index, cType value, \\\n discrType discriminator, ElektraError ** error)\n/*%/ generate_setters\? %*/\n\n/*%# unions %*/\n/*%# generate_typedef\? %*/\ntypedef union\n{\n /*%# fields %*/\n struct /*%& native_type %*/ * /*%& name %*/;\n /*%/ fields %*/\n} /*%& native_type %*/;\n\n/*%/ generate_typedef\? %*/\n/*%/ unions %*/\n\n/*%# unions %*/\nELEKTRA_UNION_GET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/);\nELEKTRA_UNION_GET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/);\n/*%# generate_setters\? %*/\nELEKTRA_UNION_SET_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/);\nELEKTRA_UNION_SET_ARRAY_ELEMENT_SIGNATURE (/*%& native_type %*/, /*%& type_name %*/, /*%& discr_native_type %*/);\n/*%/ generate_setters\? %*/\n\n/*%/ unions %*/\n";
17 :
18 64476 : static const std::unordered_map<std::string, std::string> kdbgenTemplates = {
19 : { "highlevel_c", _kdbgentemplate_highlevel_c },
20 : { "highlevel_h", _kdbgentemplate_highlevel_h },
21 : { "highlevel_mount_sh", _kdbgentemplate_highlevel_mount_sh },
22 : { "highlevel_enum_c", _kdbgentemplate_highlevel_enum_c },
23 : { "highlevel_enum_decl_h", _kdbgentemplate_highlevel_enum_decl_h },
24 : { "highlevel_keys_fun_h", _kdbgentemplate_highlevel_keys_fun_h },
25 : { "highlevel_keys_fun_struct_h", _kdbgentemplate_highlevel_keys_fun_struct_h },
26 : { "highlevel_keys_fun_structref_h", _kdbgentemplate_highlevel_keys_fun_structref_h },
27 : { "highlevel_keys_tags_h", _kdbgentemplate_highlevel_keys_tags_h },
28 : { "highlevel_struct_alloc_fields_c", _kdbgentemplate_highlevel_struct_alloc_fields_c },
29 : { "highlevel_struct_c", _kdbgentemplate_highlevel_struct_c },
30 : { "highlevel_struct_decl_h", _kdbgentemplate_highlevel_struct_decl_h },
31 : { "highlevel_union_c", _kdbgentemplate_highlevel_union_c },
32 : { "highlevel_union_decl_h", _kdbgentemplate_highlevel_union_decl_h },
33 50148 : };
34 :
|