seccomp.c: use print_array function

* seccomp.c (decode_filter, decode_seccomp_fprog): Remove.
(print_bpf_filter): New function.
(print_seccomp_fprog): Use it via print_array.
* tests/seccomp-filter-v.c (main): Update.
diff --git a/seccomp.c b/seccomp.c
index e62f99a..5d972f9 100644
--- a/seccomp.c
+++ b/seccomp.c
@@ -108,6 +108,8 @@
 
 }
 
+#endif /* HAVE_LINUX_FILTER_H */
+
 static void
 decode_bpf_stmt(const struct bpf_filter *filter)
 {
@@ -146,54 +148,44 @@
 #endif /* HAVE_LINUX_FILTER_H */
 }
 
-static void
-decode_filter(const struct bpf_filter *filter)
-{
-	if (filter->jt || filter->jf)
-		decode_bpf_jump(filter);
-	else
-		decode_bpf_stmt(filter);
-}
-
-#endif /* HAVE_LINUX_FILTER_H */
-
 #ifndef BPF_MAXINSNS
 # define BPF_MAXINSNS 4096
 #endif
 
-static void
-decode_seccomp_fprog(struct tcb *tcp, unsigned short len, unsigned long addr)
+static bool
+print_bpf_filter(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
 {
-	struct bpf_filter filter;
-	const unsigned long start_addr = addr;
-	unsigned int i = 0;
+	const struct bpf_filter *filter = elem_buf;
+	unsigned int *pn = data;
 
-	for (; addr >= start_addr && i < len; ++i, addr += sizeof(filter)) {
-		if (i) {
-			tprints(", ");
-			if (i >= BPF_MAXINSNS) {
-				tprints("...");
-				break;
-			}
-		}
-		if (umove_or_printaddr(tcp, addr, &filter))
-			break;
-		if (!i)
-			tprints("[");
-		decode_filter(&filter);
+	if ((*pn)++ >= BPF_MAXINSNS) {
+		tprints("...");
+		return false;
 	}
-	if (i)
-		tprints("]");
+
+	if (filter->jt || filter->jf)
+		decode_bpf_jump(filter);
+	else
+		decode_bpf_stmt(filter);
+
+	return true;
 }
 
 static void
-print_seccomp_fprog(struct tcb *tcp, unsigned short len, unsigned long addr)
+print_seccomp_fprog(struct tcb *tcp, unsigned long addr, unsigned short len)
 {
 	tprintf("{len=%u, filter=", len);
-	if (abbrev(tcp) || !len)
+
+	if (abbrev(tcp)) {
 		printaddr(addr);
-	else
-		decode_seccomp_fprog(tcp, len, addr);
+	} else {
+		unsigned int insns = 0;
+		struct bpf_filter filter;
+
+		print_array(tcp, addr, len, &filter, sizeof(filter),
+			    umoven_or_printaddr, print_bpf_filter, &insns);
+	}
+
 	tprints("}");
 }
 
@@ -205,7 +197,7 @@
 	struct seccomp_fprog fprog;
 
 	if (fetch_seccomp_fprog(tcp, addr, &fprog))
-		print_seccomp_fprog(tcp, fprog.len, fprog.filter);
+		print_seccomp_fprog(tcp, fprog.filter, fprog.len);
 }
 
 static void
diff --git a/tests/seccomp-filter-v.c b/tests/seccomp-filter-v.c
index 9a70658..ef69c0d 100644
--- a/tests/seccomp-filter-v.c
+++ b/tests/seccomp-filter-v.c
@@ -128,8 +128,8 @@
 
 	prog->len = 0;
 	syscall(__NR_seccomp, SECCOMP_SET_MODE_FILTER, 0, prog);
-	tprintf("seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=0, filter=%p})"
-		" = -1 EINVAL (%m)\n", prog->filter);
+	tprintf("seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=0, filter=[]})"
+		" = -1 EINVAL (%m)\n");
 
 	unsigned int i;
 	for (i = 0; i <= BPF_MAXINSNS; ++i) {