Print this page
12310 Add demangle(1) command

@@ -19,10 +19,11 @@
 #include <string.h>
 #include <errno.h>
 #include <pthread.h>
 #include <sys/ctype.h>
 #include <sys/debug.h>
+#include <sys/sysmacros.h>
 #include <stdarg.h>
 #include "demangle-sys.h"
 #include "demangle_int.h"
 
 #define DEMANGLE_DEBUG  "DEMANGLE_DEBUG"

@@ -29,23 +30,44 @@
 
 static pthread_once_t debug_once = PTHREAD_ONCE_INIT;
 volatile boolean_t demangle_debug;
 FILE *debugf = stderr;
 
+static struct {
+        const char      *str;
+        sysdem_lang_t   lang;
+} lang_tbl[] = {
+        { "auto", SYSDEM_LANG_AUTO },
+        { "c++", SYSDEM_LANG_CPP },
+        { "rust", SYSDEM_LANG_RUST },
+};
+
 static const char *
 langstr(sysdem_lang_t lang)
 {
-        switch (lang) {
-        case SYSDEM_LANG_AUTO:
-                return ("auto");
-        case SYSDEM_LANG_CPP:
-                return ("c++");
-        case SYSDEM_LANG_RUST:
-                return ("rust");
-        default:
+        size_t i;
+
+        for (i = 0; i < ARRAY_SIZE(lang_tbl); i++) {
+                if (lang == lang_tbl[i].lang)
+                        return (lang_tbl[i].str);
+        }
                 return ("invalid");
+}
+
+boolean_t
+sysdem_parse_lang(const char *str, sysdem_lang_t *langp)
+{
+        size_t i;
+
+        for (i = 0; i < ARRAY_SIZE(lang_tbl); i++) {
+                if (strcmp(str, lang_tbl[i].str) == 0) {
+                        *langp = lang_tbl[i].lang;
+                        return (B_TRUE);
         }
+        }
+
+        return (B_FALSE);
 }
 
 static sysdem_lang_t
 detect_lang(const char *str, size_t n)
 {