]> granicus.if.org Git - strace/commitdiff
xlat.c: add sprintxval for printing xval to string
authorEugene Syromiatnikov <esyr@redhat.com>
Sat, 5 Aug 2017 14:19:15 +0000 (16:19 +0200)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 7 Jan 2018 00:05:42 +0000 (00:05 +0000)
* defs.h (sprintxval): New declaration.
(sprintxval): New function.

defs.h
xlat.c

diff --git a/defs.h b/defs.h
index d38565bb80bf1b7f90aa8a16b97623fd787267ff..a07e9ecea1280055e66960d378b311fdf4260682 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -546,6 +546,8 @@ extern int printxval_searchn(const struct xlat *xlat, size_t xlat_size,
        uint64_t val, const char *dflt);
 #define printxval_search(xlat__, val__, dflt__) \
        printxval_searchn(xlat__, ARRAY_SIZE(xlat__), val__, dflt__)
+extern int sprintxval(char *buf, size_t size, const struct xlat *,
+       unsigned int val, const char *dflt);
 extern int printargs(struct tcb *);
 extern int printargs_u(struct tcb *);
 extern int printargs_d(struct tcb *);
diff --git a/xlat.c b/xlat.c
index 5e2dfff80cd3061a7bf693487dc2f2bfbc4a9390..e15371c2618d8d949b67922e640ac9c9413f4f07 100644 (file)
--- a/xlat.c
+++ b/xlat.c
@@ -94,6 +94,20 @@ printxvals(const uint64_t val, const char *dflt, const struct xlat *xlat, ...)
        return 0;
 }
 
+int
+sprintxval(char *const buf, const size_t size, const struct xlat *const x,
+          const unsigned int val, const char *const dflt)
+{
+       const char *const str = xlookup(x, val);
+
+       if (str)
+               return xsnprintf(buf, size, "%s", str);
+       if (dflt)
+               return xsnprintf(buf, size, "%#x /* %s */", val, dflt);
+
+       return xsnprintf(buf, size, "%#x", val);
+}
+
 /**
  * Print entry in sorted struct xlat table, if it is there.
  *