194cba803SRyan Moeller /*-
294cba803SRyan Moeller * Copyright (c) 2020, Ryan Moeller <freqlabs@FreeBSD.org>
394cba803SRyan Moeller *
494cba803SRyan Moeller * Redistribution and use in source and binary forms, with or without
594cba803SRyan Moeller * modification, are permitted provided that the following conditions
694cba803SRyan Moeller * are met:
794cba803SRyan Moeller * 1. Redistributions of source code must retain the above copyright
894cba803SRyan Moeller * notice, this list of conditions and the following disclaimer.
994cba803SRyan Moeller * 2. Redistributions in binary form must reproduce the above copyright
1094cba803SRyan Moeller * notice, this list of conditions and the following disclaimer in the
1194cba803SRyan Moeller * documentation and/or other materials provided with the distribution.
1294cba803SRyan Moeller *
1394cba803SRyan Moeller * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1494cba803SRyan Moeller * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1594cba803SRyan Moeller * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1694cba803SRyan Moeller * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1794cba803SRyan Moeller * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1894cba803SRyan Moeller * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1994cba803SRyan Moeller * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2094cba803SRyan Moeller * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2194cba803SRyan Moeller * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2294cba803SRyan Moeller * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2394cba803SRyan Moeller * SUCH DAMAGE.
2494cba803SRyan Moeller */
2594cba803SRyan Moeller
2694cba803SRyan Moeller {# THIS IS A TEMPLATE PROCESSED BY lib/libifconfig/sfp.lua #}
2794cba803SRyan Moeller
2894cba803SRyan Moeller #include <libifconfig_sfp_tables.h>
2994cba803SRyan Moeller #include <libifconfig_sfp_tables_internal.h>
3094cba803SRyan Moeller
3194cba803SRyan Moeller struct sfp_enum_metadata {
3294cba803SRyan Moeller int value; /* numeric discriminant value */
3394cba803SRyan Moeller const char *symbol; /* symbolic name */
3494cba803SRyan Moeller const char *description; /* brief description */
3594cba803SRyan Moeller const char *display; /* shortened display name */
3694cba803SRyan Moeller };
3794cba803SRyan Moeller
3894cba803SRyan Moeller const struct sfp_enum_metadata *
find_metadata(const struct sfp_enum_metadata * table,int value)3994cba803SRyan Moeller find_metadata(const struct sfp_enum_metadata *table, int value)
4094cba803SRyan Moeller {
4194cba803SRyan Moeller while (table->value != value && table->symbol != NULL)
4294cba803SRyan Moeller ++table;
4394cba803SRyan Moeller return (table->symbol != NULL ? table : NULL);
4494cba803SRyan Moeller }
4594cba803SRyan Moeller
4694cba803SRyan Moeller {%
4794cba803SRyan Moeller for _, ent in ipairs(enums) do
4894cba803SRyan Moeller if type(ent) == "string" then
4994cba803SRyan Moeller %}
5094cba803SRyan Moeller /*
5194cba803SRyan Moeller * {*ent*}
5294cba803SRyan Moeller */
5394cba803SRyan Moeller
5494cba803SRyan Moeller {%
5594cba803SRyan Moeller else
5694cba803SRyan Moeller local enum = ent
5794cba803SRyan Moeller local name = "sfp_"..enum.name
5894cba803SRyan Moeller local sym, desc, disp
5994cba803SRyan Moeller %}
6094cba803SRyan Moeller static const struct sfp_enum_metadata {*name*}_table_[] = {
6194cba803SRyan Moeller {%
6294cba803SRyan Moeller for _, item in ipairs(enum.values) do
6394cba803SRyan Moeller _, sym, desc, disp = table.unpack(item)
6494cba803SRyan Moeller local symbol = string.upper(name).."_"..sym
6594cba803SRyan Moeller %}
6694cba803SRyan Moeller {
6794cba803SRyan Moeller .value = {*symbol*},
6894cba803SRyan Moeller .symbol = "{*symbol*}",
6994cba803SRyan Moeller .description = "{*desc*}",
7094cba803SRyan Moeller {%
7194cba803SRyan Moeller if disp then
7294cba803SRyan Moeller %}
7394cba803SRyan Moeller .display = "{*disp*}",
7494cba803SRyan Moeller {%
7594cba803SRyan Moeller end
7694cba803SRyan Moeller %}
7794cba803SRyan Moeller },
7894cba803SRyan Moeller {%
7994cba803SRyan Moeller end
8094cba803SRyan Moeller %}
8194cba803SRyan Moeller {0}
8294cba803SRyan Moeller };
8394cba803SRyan Moeller const struct sfp_enum_metadata *{*name*}_table = {*name*}_table_;
8494cba803SRyan Moeller
8594cba803SRyan Moeller const char *
8694cba803SRyan Moeller ifconfig_{*name*}_symbol(enum {*name*} v)
8794cba803SRyan Moeller {
8894cba803SRyan Moeller const struct sfp_enum_metadata *metadata;
8994cba803SRyan Moeller
9094cba803SRyan Moeller if ((metadata = find_metadata({*name*}_table, v)) == NULL)
9194cba803SRyan Moeller return (NULL);
9294cba803SRyan Moeller return (metadata->symbol);
9394cba803SRyan Moeller }
9494cba803SRyan Moeller
9594cba803SRyan Moeller const char *
9694cba803SRyan Moeller ifconfig_{*name*}_description(enum {*name*} v)
9794cba803SRyan Moeller {
9894cba803SRyan Moeller const struct sfp_enum_metadata *metadata;
9994cba803SRyan Moeller
10094cba803SRyan Moeller if ((metadata = find_metadata({*name*}_table, v)) == NULL)
10194cba803SRyan Moeller return (NULL);
10294cba803SRyan Moeller return (metadata->description);
10394cba803SRyan Moeller }
10494cba803SRyan Moeller
10594cba803SRyan Moeller {%
10694cba803SRyan Moeller if disp then
10794cba803SRyan Moeller %}
10894cba803SRyan Moeller const char *
10994cba803SRyan Moeller ifconfig_{*name*}_display(enum {*name*} v)
11094cba803SRyan Moeller {
11194cba803SRyan Moeller const struct sfp_enum_metadata *metadata;
11294cba803SRyan Moeller
11394cba803SRyan Moeller if ((metadata = find_metadata({*name*}_table, v)) == NULL)
11494cba803SRyan Moeller return (NULL);
11594cba803SRyan Moeller return (metadata->display);
11694cba803SRyan Moeller }
11794cba803SRyan Moeller
11894cba803SRyan Moeller {%
11994cba803SRyan Moeller end
12094cba803SRyan Moeller end
12194cba803SRyan Moeller end
12294cba803SRyan Moeller %}
123