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