Convert do_printstat to a template function

* printstat.h: New file.
* Makefile.am (strace_SOURCES): Add it.
* file.c: Include "printstat.h".
(do_printstat): Move to printstat.h, parametrize its name
and struct stat.
diff --git a/printstat.h b/printstat.h
new file mode 100644
index 0000000..b6e18d3
--- /dev/null
+++ b/printstat.h
@@ -0,0 +1,72 @@
+#ifndef DO_PRINTSTAT
+# define DO_PRINTSTAT do_printstat
+#endif
+
+#ifndef STRUCT_STAT
+# define STRUCT_STAT struct stat
+#endif
+
+static void
+DO_PRINTSTAT(struct tcb *tcp, const STRUCT_STAT *statbuf)
+{
+	if (!abbrev(tcp)) {
+		tprintf("{st_dev=makedev(%u, %u), st_ino=%llu, st_mode=%s, ",
+			(unsigned int) major(statbuf->st_dev),
+			(unsigned int) minor(statbuf->st_dev),
+			(unsigned long long) statbuf->st_ino,
+			sprintmode(statbuf->st_mode));
+		tprintf("st_nlink=%u, st_uid=%u, st_gid=%u, ",
+			(unsigned int) statbuf->st_nlink,
+			(unsigned int) statbuf->st_uid,
+			(unsigned int) statbuf->st_gid);
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+		tprintf("st_blksize=%u, ", (unsigned int) statbuf->st_blksize);
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
+		tprintf("st_blocks=%llu, ",
+			(unsigned long long) statbuf->st_blocks);
+#endif
+	} else {
+		tprintf("{st_mode=%s, ", sprintmode(statbuf->st_mode));
+	}
+
+	switch (statbuf->st_mode & S_IFMT) {
+	case S_IFCHR: case S_IFBLK:
+#ifdef HAVE_STRUCT_STAT_ST_RDEV
+		tprintf("st_rdev=makedev(%u, %u), ",
+			(unsigned int) major(statbuf->st_rdev),
+			(unsigned int) minor(statbuf->st_rdev));
+#else /* !HAVE_STRUCT_STAT_ST_RDEV */
+		tprintf("st_size=makedev(%u, %u), ",
+			(unsigned int) major(statbuf->st_size),
+			(unsigned int) minor(statbuf->st_size));
+#endif /* !HAVE_STRUCT_STAT_ST_RDEV */
+		break;
+	default:
+		tprintf("st_size=%llu, ",
+			(unsigned long long) statbuf->st_size);
+		break;
+	}
+
+	if (!abbrev(tcp)) {
+		tprintf("st_atime=%s, ", sprinttime(statbuf->st_atime));
+		tprintf("st_mtime=%s, ", sprinttime(statbuf->st_mtime));
+		tprintf("st_ctime=%s", sprinttime(statbuf->st_ctime));
+#if HAVE_STRUCT_STAT_ST_FLAGS
+		tprintf(", st_flags=%u", (unsigned int) statbuf->st_flags);
+#endif
+#if HAVE_STRUCT_STAT_ST_FSTYPE
+		tprintf(", st_fstype=%.*s",
+			(int) sizeof statbuf->st_fstype, statbuf->st_fstype);
+#endif
+#if HAVE_STRUCT_STAT_ST_GEN
+		tprintf(", st_gen=%u", (unsigned int) statbuf->st_gen);
+#endif
+		tprints("}");
+	} else {
+		tprints("...}");
+	}
+}
+
+#undef STRUCT_STAT
+#undef DO_PRINTSTAT