utils: add helper functions to get names by values
authorAndre Heider <a.heider@gmail.com>
Tue, 22 Nov 2022 08:45:23 +0000 (09:45 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 15 Dec 2022 23:09:07 +0000 (00:09 +0100)
Some defines/enums use bits, while some functions only set a single one.
Make it less painful to get to a name for those.

This avoids hardcoding bit lists for consumers.

Signed-off-by: Andre Heider <a.heider@gmail.com>
include/iwinfo/utils.h
iwinfo_utils.c

index e9b8f1d9cd50a17c008ee19684851bc9b4066534..a7645dea1d89001b02c3745fdf328906e107531d 100644 (file)
@@ -43,6 +43,9 @@ static inline int iwinfo_mbm2dbm(int gain)
        return gain / 100;
 }
 
+const char * const iwinfo_band_name(int mask);
+const char * const iwinfo_htmode_name(int mask);
+
 size_t iwinfo_format_hwmodes(int modes, char *buf, size_t len);
 int iwinfo_htmode_is_ht(int htmode);
 int iwinfo_htmode_is_vht(int htmode);
index c7713edb25715c8d6d5a65425c2d0bdedb2c7cef..83f049a5a4b28a1995a8d1691b4a70cabe18dcaf 100644 (file)
@@ -77,6 +77,44 @@ int iwinfo_mw2dbm(int in)
        return (int)res;
 }
 
+static int iwinfo_bit(int value, int max)
+{
+       int i;
+
+       if (max > 31 || !(value & ((1 << max) - 1)))
+               return -1;
+
+       for (i = 0; i < max; i++)
+       {
+               if (value & 1)
+                       break;
+
+               value >>= 1;
+       }
+
+       return i;
+}
+
+static const char * const iwinfo_name(int mask, int max, const char * const names[])
+{
+       int index = iwinfo_bit(mask, max);
+
+       if (index < 0)
+               return NULL;
+
+       return names[index];
+}
+
+const char * const iwinfo_band_name(int mask)
+{
+       return iwinfo_name(mask, IWINFO_BAND_COUNT, IWINFO_BAND_NAMES);
+}
+
+const char * const iwinfo_htmode_name(int mask)
+{
+       return iwinfo_name(mask, IWINFO_HTMODE_COUNT, IWINFO_HTMODE_NAMES);
+}
+
 size_t iwinfo_format_hwmodes(int modes, char *buf, size_t len)
 {
        // bit numbers as per IWINFO_80211_*:  ad ac ax  a  b  g  n