This adds two helper functions which map a given data field to a color,
so color_fprintf() statements don't have to be duplicated with only a
different color value depending on that data field's value. In order for
this to work in a generic way, COLOR_CLEAR has been added to serve as a
fallback default of uncolored output.

Signed-off-by: Phil Sutter <p...@nwl.cc>
---
 include/color.h |  5 ++++-
 ip/ipaddress.c  | 47 +++++++++++++----------------------------------
 lib/color.c     | 30 +++++++++++++++++++++++++++++-
 3 files changed, 46 insertions(+), 36 deletions(-)

diff --git a/include/color.h b/include/color.h
index b85003aed19f8..c1c29831159af 100644
--- a/include/color.h
+++ b/include/color.h
@@ -7,10 +7,13 @@ enum color_attr {
        COLOR_INET,
        COLOR_INET6,
        COLOR_OPERSTATE_UP,
-       COLOR_OPERSTATE_DOWN
+       COLOR_OPERSTATE_DOWN,
+       COLOR_CLEAR
 };
 
 void enable_color(void);
 int color_fprintf(FILE *fp, enum color_attr attr, const char *fmt, ...);
+enum color_attr ifa_family_color(__u8 ifa_family);
+enum color_attr oper_state_color(__u8 state);
 
 #endif
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index f8c5029400949..7aab8e781eae8 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -135,25 +135,15 @@ static const char *oper_states[] = {
 
 static void print_operstate(FILE *f, __u8 state)
 {
-       if (state >= ARRAY_SIZE(oper_states))
+       if (state >= ARRAY_SIZE(oper_states)) {
                fprintf(f, "state %#x ", state);
-       else {
-               if (brief) {
-                       if (strcmp(oper_states[state], "UP") == 0)
-                               color_fprintf(f, COLOR_OPERSTATE_UP, "%-14s ", 
oper_states[state]);
-                       else if (strcmp(oper_states[state], "DOWN") == 0)
-                               color_fprintf(f, COLOR_OPERSTATE_DOWN, "%-14s 
", oper_states[state]);
-                       else
-                               fprintf(f, "%-14s ", oper_states[state]);
-               } else {
-                       fprintf(f, "state ");
-                       if (strcmp(oper_states[state], "UP") == 0)
-                               color_fprintf(f, COLOR_OPERSTATE_UP, "%s ", 
oper_states[state]);
-                       else if (strcmp(oper_states[state], "DOWN") == 0)
-                               color_fprintf(f, COLOR_OPERSTATE_DOWN, "%s ", 
oper_states[state]);
-                       else
-                               fprintf(f, "%s ", oper_states[state]);
-               }
+       } else if (brief) {
+               color_fprintf(f, oper_state_color(state),
+                             "%-14s ", oper_states[state]);
+       } else {
+               fprintf(f, "state ");
+               color_fprintf(f, oper_state_color(state),
+                             "%s ", oper_states[state]);
        }
 }
 
@@ -1067,22 +1057,11 @@ int print_addrinfo(const struct sockaddr_nl *who, 
struct nlmsghdr *n,
        }
 
        if (rta_tb[IFA_LOCAL]) {
-               if (ifa->ifa_family == AF_INET)
-                       color_fprintf(fp, COLOR_INET, "%s", 
format_host(ifa->ifa_family,
-                                               RTA_PAYLOAD(rta_tb[IFA_LOCAL]),
-                                               RTA_DATA(rta_tb[IFA_LOCAL]),
-                                               abuf, sizeof(abuf)));
-               else if (ifa->ifa_family == AF_INET6)
-                       color_fprintf(fp, COLOR_INET6, "%s", 
format_host(ifa->ifa_family,
-                                               RTA_PAYLOAD(rta_tb[IFA_LOCAL]),
-                                               RTA_DATA(rta_tb[IFA_LOCAL]),
-                                               abuf, sizeof(abuf)));
-               else
-                       fprintf(fp, "%s", format_host(ifa->ifa_family,
-                                               RTA_PAYLOAD(rta_tb[IFA_LOCAL]),
-                                               RTA_DATA(rta_tb[IFA_LOCAL]),
-                                               abuf, sizeof(abuf)));
-
+               color_fprintf(fp, ifa_family_color(ifa->ifa_family), "%s",
+                             format_host(ifa->ifa_family,
+                                         RTA_PAYLOAD(rta_tb[IFA_LOCAL]),
+                                         RTA_DATA(rta_tb[IFA_LOCAL]),
+                                         abuf, sizeof(abuf)));
                if (rta_tb[IFA_ADDRESS] == NULL ||
                    memcmp(RTA_DATA(rta_tb[IFA_ADDRESS]), 
RTA_DATA(rta_tb[IFA_LOCAL]),
                           ifa->ifa_family == AF_INET ? 4 : 16) == 0) {
diff --git a/lib/color.c b/lib/color.c
index 8c9a48ba702bf..95596be236a05 100644
--- a/lib/color.c
+++ b/lib/color.c
@@ -1,5 +1,8 @@
 #include <stdio.h>
 #include <stdarg.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <linux/if.h>
 
 #include "color.h"
 
@@ -32,7 +35,8 @@ static enum color attr_colors[] = {
        C_MAGENTA,
        C_BLUE,
        C_GREEN,
-       C_RED
+       C_RED,
+       C_CLEAR
 };
 
 static int color_is_enabled;
@@ -62,3 +66,27 @@ end:
        va_end(args);
        return ret;
 }
+
+enum color_attr ifa_family_color(__u8 ifa_family)
+{
+       switch (ifa_family) {
+       case AF_INET:
+               return COLOR_INET;
+       case AF_INET6:
+               return COLOR_INET6;
+       default:
+               return COLOR_CLEAR;
+       }
+}
+
+enum color_attr oper_state_color(__u8 state)
+{
+       switch (state) {
+       case IF_OPER_UP:
+               return COLOR_OPERSTATE_UP;
+       case IF_OPER_DOWN:
+               return COLOR_OPERSTATE_DOWN;
+       default:
+               return COLOR_CLEAR;
+       }
+}
-- 
2.7.2

Reply via email to