]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/selection: refactor kr_selection_error_str()
authorVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 26 Jan 2021 11:25:09 +0000 (12:25 +0100)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 26 Jan 2021 11:25:09 +0000 (12:25 +0100)
This way leaves less room for mistakes, etc.  It's just the idea from:
https://gitlab.nic.cz/knot/knot-resolver/-/commit/dd0c99bdb6332ba3628833a8543a5f9f33141ddd#note_191580

lib/selection.c

index e0266404a71cdc5019111ed83a3a6844fb209d8f..cef4662e83a1fd431e6f74ab7ef7ff1a7521735d 100644 (file)
 #define EPSILON_NOMIN 1
 #define EPSILON_DENOM 20
 
-static const char *kr_selection_error_names[] = {
-       [KR_SELECTION_OK] = "OK",
-       [KR_SELECTION_QUERY_TIMEOUT] = "QUERY_TIMEOUT",
-       [KR_SELECTION_TLS_HANDSHAKE_FAILED] = "TLS_HANDSHAKE_FAILED",
-       [KR_SELECTION_TCP_CONNECT_FAILED] = "TCP_CONNECT_FAILED",
-       [KR_SELECTION_TCP_CONNECT_TIMEOUT] = "TCP_CONNECT_TIMEOUT",
-       [KR_SELECTION_REFUSED] = "REFUSED",
-       [KR_SELECTION_SERVFAIL] = "SERVFAIL",
-       [KR_SELECTION_FORMERROR] = "FORMERROR",
-       [KR_SELECTION_NOTIMPL] = "NOTIMPL",
-       [KR_SELECTION_OTHER_RCODE] = "OTHER_RCODE",
-       [KR_SELECTION_MALFORMED] = "MALFORMED",
-       [KR_SELECTION_MISMATCHED] = "MISMATCHED",
-       [KR_SELECTION_TRUNCATED] = "TRUNCATED",
-       [KR_SELECTION_DNSSEC_ERROR] = "DNSSEC_ERROR",
-       [KR_SELECTION_LAME_DELEGATION] = "LAME_DELEGATION",
-       [KR_SELECTION_BAD_CNAME] = "BAD_CNAME",
-};
-
 static const char *kr_selection_error_str(enum kr_selection_error err) {
-       return err < KR_SELECTION_NUMBER_OF_ERRORS ? kr_selection_error_names[err] : NULL;
+       switch (err) {
+       #define X(ENAME) case KR_SELECTION_ ## ENAME: return #ENAME
+               X(OK);
+               X(QUERY_TIMEOUT);
+               X(TLS_HANDSHAKE_FAILED);
+               X(TCP_CONNECT_FAILED);
+               X(TCP_CONNECT_TIMEOUT);
+               X(REFUSED);
+               X(SERVFAIL);
+               X(FORMERROR);
+               X(NOTIMPL);
+               X(OTHER_RCODE);
+               X(MALFORMED);
+               X(MISMATCHED);
+               X(TRUNCATED);
+               X(DNSSEC_ERROR);
+               X(LAME_DELEGATION);
+               X(BAD_CNAME);
+               case KR_SELECTION_NUMBER_OF_ERRORS: break; // not a valid code
+       #undef X
+       }
+       assert(false); // we want to define all; compiler helps by -Wswitch (no default:)
+       return NULL;
 }
 
 /* Simple cache interface follows */