1 /*- 2 * Copyright (c) 2020, Ryan Moeller <freqlabs@FreeBSD.org> 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 * SUCH DAMAGE. 24 */ 25 26 {# THIS IS A TEMPLATE PROCESSED BY lib/libifconfig/sfp.lua #} 27 28 #include <libifconfig_sfp_tables.h> 29 #include <libifconfig_sfp_tables_internal.h> 30 31 struct sfp_enum_metadata { 32 int value; /* numeric discriminant value */ 33 const char *symbol; /* symbolic name */ 34 const char *description; /* brief description */ 35 const char *display; /* shortened display name */ 36 }; 37 38 const struct sfp_enum_metadata * 39 find_metadata(const struct sfp_enum_metadata *table, int value) 40 { 41 while (table->value != value && table->symbol != NULL) 42 ++table; 43 return (table->symbol != NULL ? table : NULL); 44 } 45 46 {% 47 for _, ent in ipairs(enums) do 48 if type(ent) == "string" then 49 %} 50 /* 51 * {*ent*} 52 */ 53 54 {% 55 else 56 local enum = ent 57 local name = "sfp_"..enum.name 58 local sym, desc, disp 59 %} 60 static const struct sfp_enum_metadata {*name*}_table_[] = { 61 {% 62 for _, item in ipairs(enum.values) do 63 _, sym, desc, disp = table.unpack(item) 64 local symbol = string.upper(name).."_"..sym 65 %} 66 { 67 .value = {*symbol*}, 68 .symbol = "{*symbol*}", 69 .description = "{*desc*}", 70 {% 71 if disp then 72 %} 73 .display = "{*disp*}", 74 {% 75 end 76 %} 77 }, 78 {% 79 end 80 %} 81 {0} 82 }; 83 const struct sfp_enum_metadata *{*name*}_table = {*name*}_table_; 84 85 const char * 86 ifconfig_{*name*}_symbol(enum {*name*} v) 87 { 88 const struct sfp_enum_metadata *metadata; 89 90 if ((metadata = find_metadata({*name*}_table, v)) == NULL) 91 return (NULL); 92 return (metadata->symbol); 93 } 94 95 const char * 96 ifconfig_{*name*}_description(enum {*name*} v) 97 { 98 const struct sfp_enum_metadata *metadata; 99 100 if ((metadata = find_metadata({*name*}_table, v)) == NULL) 101 return (NULL); 102 return (metadata->description); 103 } 104 105 {% 106 if disp then 107 %} 108 const char * 109 ifconfig_{*name*}_display(enum {*name*} v) 110 { 111 const struct sfp_enum_metadata *metadata; 112 113 if ((metadata = find_metadata({*name*}_table, v)) == NULL) 114 return (NULL); 115 return (metadata->display); 116 } 117 118 {% 119 end 120 end 121 end 122 %} 123