git: 9dac609629d4 - main - libsysdecode: For future use extract common code to a separate files

From: Dmitry Chagin <dchagin_at_FreeBSD.org>
Date: Wed, 22 Jun 2022 11:40:56 UTC
The branch main has been updated by dchagin:

URL: https://cgit.FreeBSD.org/src/commit/?id=9dac609629d4e0ba813df6169f8bd8383fca024f

commit 9dac609629d4e0ba813df6169f8bd8383fca024f
Author:     Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2022-06-22 10:12:21 +0000
Commit:     Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2022-06-22 10:12:21 +0000

    libsysdecode: For future use extract common code to a separate files
    
    Reviewed by:            jhb, emaste
    Differential revision:  https://reviews.freebsd.org/D35353
    MFC after:              2 weeks
---
 lib/libsysdecode/Makefile  |   2 +-
 lib/libsysdecode/flags.c   | 159 +-----------------------------------------
 lib/libsysdecode/support.c | 168 +++++++++++++++++++++++++++++++++++++++++++++
 lib/libsysdecode/support.h |  62 +++++++++++++++++
 4 files changed, 232 insertions(+), 159 deletions(-)

diff --git a/lib/libsysdecode/Makefile b/lib/libsysdecode/Makefile
index 671c23d95a70..7f8175e7bd53 100644
--- a/lib/libsysdecode/Makefile
+++ b/lib/libsysdecode/Makefile
@@ -4,7 +4,7 @@
 
 LIB=	sysdecode
 
-SRCS=	errno.c flags.c ioctl.c signal.c syscallnames.c utrace.c
+SRCS=	errno.c flags.c ioctl.c signal.c syscallnames.c utrace.c support.c
 INCS=	sysdecode.h
 
 CFLAGS+= -I${.OBJDIR}
diff --git a/lib/libsysdecode/flags.c b/lib/libsysdecode/flags.c
index f02c8dd8b339..c89c0ab75302 100644
--- a/lib/libsysdecode/flags.c
+++ b/lib/libsysdecode/flags.c
@@ -71,14 +71,7 @@ __FBSDID("$FreeBSD$");
 #include <netgraph/bluetooth/include/ng_l2cap.h>
 #include <netgraph/bluetooth/include/ng_btsocket.h>
 
-/*
- * This is taken from the xlat tables originally in truss which were
- * in turn taken from strace.
- */
-struct name_table {
-	uintmax_t val;
-	const char *str;
-};
+#include "support.h"
 
 #define	X(a)	{ a, #a },
 #define	XEND	{ 0, NULL }
@@ -93,156 +86,6 @@ struct name_table {
 #undef TABLE_ENTRY
 #undef TABLE_END
 
-/*
- * These are simple support macros. print_or utilizes a variable
- * defined in the calling function to track whether or not it should
- * print a logical-OR character ('|') before a string. if_print_or
- * simply handles the necessary "if" statement used in many lines
- * of this file.
- */
-#define print_or(fp,str,orflag) do {                     \
-	if (orflag) fputc(fp, '|'); else orflag = true;  \
-	fprintf(fp, str); }                              \
-	while (0)
-#define if_print_or(fp,i,flag,orflag) do {         \
-	if ((i & flag) == flag)                    \
-	print_or(fp,#flag,orflag); }               \
-	while (0)
-
-static const char *
-lookup_value(struct name_table *table, uintmax_t val)
-{
-
-	for (; table->str != NULL; table++)
-		if (table->val == val)
-			return (table->str);
-	return (NULL);
-}
-
-/*
- * Used when the value maps to a bitmask of #definition values in the
- * table.  This is a helper routine which outputs a symbolic mask of
- * matched masks.  Multiple masks are separated by a pipe ('|').
- * The value is modified on return to only hold unmatched bits.
- */
-static void
-print_mask_part(FILE *fp, struct name_table *table, uintmax_t *valp,
-    bool *printed)
-{
-	uintmax_t rem;
-
-	rem = *valp;
-	for (; table->str != NULL; table++) {
-		if ((table->val & rem) == table->val) {
-			/*
-			 * Only print a zero mask if the raw value is
-			 * zero.
-			 */
-			if (table->val == 0 && *valp != 0)
-				continue;
-			fprintf(fp, "%s%s", *printed ? "|" : "", table->str);
-			*printed = true;
-			rem &= ~table->val;
-		}
-	}
-
-	*valp = rem;
-}
-
-/*
- * Used when the value maps to a bitmask of #definition values in the
- * table.  The return value is true if something was printed.  If
- * rem is not NULL, *rem holds any bits not decoded if something was
- * printed.  If nothing was printed and rem is not NULL, *rem holds
- * the original value.
- */
-static bool
-print_mask_int(FILE *fp, struct name_table *table, int ival, int *rem)
-{
-	uintmax_t val;
-	bool printed;
-
-	printed = false;
-	val = (unsigned)ival;
-	print_mask_part(fp, table, &val, &printed);
-	if (rem != NULL)
-		*rem = val;
-	return (printed);
-}
-
-/*
- * Used for a mask of optional flags where a value of 0 is valid.
- */
-static bool
-print_mask_0(FILE *fp, struct name_table *table, int val, int *rem)
-{
-
-	if (val == 0) {
-		fputs("0", fp);
-		if (rem != NULL)
-			*rem = 0;
-		return (true);
-	}
-	return (print_mask_int(fp, table, val, rem));
-}
-
-/*
- * Like print_mask_0 but for a unsigned long instead of an int.
- */
-static bool
-print_mask_0ul(FILE *fp, struct name_table *table, u_long lval, u_long *rem)
-{
-	uintmax_t val;
-	bool printed;
-
-	if (lval == 0) {
-		fputs("0", fp);
-		if (rem != NULL)
-			*rem = 0;
-		return (true);
-	}
-
-	printed = false;
-	val = lval;
-	print_mask_part(fp, table, &val, &printed);
-	if (rem != NULL)
-		*rem = val;
-	return (printed);
-}
-
-static void
-print_integer(FILE *fp, int val, int base)
-{
-
-	switch (base) {
-	case 8:
-		fprintf(fp, "0%o", val);
-		break;
-	case 10:
-		fprintf(fp, "%d", val);
-		break;
-	case 16:
-		fprintf(fp, "0x%x", val);
-		break;
-	default:
-		abort2("bad base", 0, NULL);
-		break;
-	}
-}
-
-static bool
-print_value(FILE *fp, struct name_table *table, uintmax_t val)
-{
-	const char *str;
-
-	str = lookup_value(table, val);
-	if (str != NULL) {
-		fputs(str, fp);
-		return (true);
-	}
-	return (false);
-}
-
 const char *
 sysdecode_atfd(int fd)
 {
diff --git a/lib/libsysdecode/support.c b/lib/libsysdecode/support.c
new file mode 100644
index 000000000000..0777ab28f52e
--- /dev/null
+++ b/lib/libsysdecode/support.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "support.h"
+
+const char *
+lookup_value(struct name_table *table, uintmax_t val)
+{
+
+	for (; table->str != NULL; table++)
+		if (table->val == val)
+			return (table->str);
+	return (NULL);
+}
+
+/*
+ * Used when the value maps to a bitmask of #definition values in the
+ * table.  This is a helper routine which outputs a symbolic mask of
+ * matched masks.  Multiple masks are separated by a pipe ('|').
+ * The value is modified on return to only hold unmatched bits.
+ */
+void
+print_mask_part(FILE *fp, struct name_table *table, uintmax_t *valp,
+    bool *printed)
+{
+	uintmax_t rem;
+
+	rem = *valp;
+	for (; table->str != NULL; table++) {
+		if ((table->val & rem) == table->val) {
+			/*
+			 * Only print a zero mask if the raw value is
+			 * zero.
+			 */
+			if (table->val == 0 && *valp != 0)
+				continue;
+			fprintf(fp, "%s%s", *printed ? "|" : "", table->str);
+			*printed = true;
+			rem &= ~table->val;
+		}
+	}
+
+	*valp = rem;
+}
+
+/*
+ * Used when the value maps to a bitmask of #definition values in the
+ * table.  The return value is true if something was printed.  If
+ * rem is not NULL, *rem holds any bits not decoded if something was
+ * printed.  If nothing was printed and rem is not NULL, *rem holds
+ * the original value.
+ */
+bool
+print_mask_int(FILE *fp, struct name_table *table, int ival, int *rem)
+{
+	uintmax_t val;
+	bool printed;
+
+	printed = false;
+	val = (unsigned)ival;
+	print_mask_part(fp, table, &val, &printed);
+	if (rem != NULL)
+		*rem = val;
+	return (printed);
+}
+
+/*
+ * Used for a mask of optional flags where a value of 0 is valid.
+ */
+bool
+print_mask_0(FILE *fp, struct name_table *table, int val, int *rem)
+{
+
+	if (val == 0) {
+		fputs("0", fp);
+		if (rem != NULL)
+			*rem = 0;
+		return (true);
+	}
+	return (print_mask_int(fp, table, val, rem));
+}
+
+/*
+ * Like print_mask_0 but for a unsigned long instead of an int.
+ */
+bool
+print_mask_0ul(FILE *fp, struct name_table *table, u_long lval, u_long *rem)
+{
+	uintmax_t val;
+	bool printed;
+
+	if (lval == 0) {
+		fputs("0", fp);
+		if (rem != NULL)
+			*rem = 0;
+		return (true);
+	}
+
+	printed = false;
+	val = lval;
+	print_mask_part(fp, table, &val, &printed);
+	if (rem != NULL)
+		*rem = val;
+	return (printed);
+}
+
+void
+print_integer(FILE *fp, int val, int base)
+{
+
+	switch (base) {
+	case 8:
+		fprintf(fp, "0%o", val);
+		break;
+	case 10:
+		fprintf(fp, "%d", val);
+		break;
+	case 16:
+		fprintf(fp, "0x%x", val);
+		break;
+	default:
+		abort2("bad base", 0, NULL);
+		break;
+	}
+}
+
+bool
+print_value(FILE *fp, struct name_table *table, uintmax_t val)
+{
+	const char *str;
+
+	str = lookup_value(table, val);
+	if (str != NULL) {
+		fputs(str, fp);
+		return (true);
+	}
+	return (false);
+}
diff --git a/lib/libsysdecode/support.h b/lib/libsysdecode/support.h
new file mode 100644
index 000000000000..fecb0bf1bb5e
--- /dev/null
+++ b/lib/libsysdecode/support.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef __SYSDECODE_SUPPORT_H__
+#define __SYSDECODE_SUPPORT_H__
+
+/*
+ * This is taken from the xlat tables originally in truss which were
+ * in turn taken from strace.
+ */
+struct name_table {
+	uintmax_t val;
+	const char *str;
+};
+
+/*
+ * These are simple support macros. print_or utilizes a variable
+ * defined in the calling function to track whether or not it should
+ * print a logical-OR character ('|') before a string. if_print_or
+ * simply handles the necessary "if" statement used in many lines
+ * of this file.
+ */
+#define print_or(fp,str,orflag) do {                     \
+	if (orflag) fputc(fp, '|'); else orflag = true;  \
+	fprintf(fp, str); }                              \
+	while (0)
+#define if_print_or(fp,i,flag,orflag) do {         \
+	if ((i & flag) == flag)                    \
+	print_or(fp,#flag,orflag); }               \
+	while (0)
+
+const char *lookup_value(struct name_table *, uintmax_t);
+void	print_integer(FILE *, int, int);
+bool	print_mask_0(FILE *, struct name_table *, int, int *);
+bool	print_mask_0ul(FILE *, struct name_table *, u_long, u_long *);
+bool	print_mask_int(FILE *, struct name_table *, int, int *);
+void	print_mask_part(FILE *, struct name_table *, uintmax_t *, bool *);
+bool	print_value(FILE *, struct name_table *, uintmax_t);
+
+#endif /* !__SYSDECODE_SUPPORT_H__ */