#include "tests.h"
#include <stdio.h>
+enum sprintrc_fmt {
+ SPRINTRC_FMT_RAW,
+ SPRINTRC_FMT_GREP,
+};
+
/**
* Provides pointer to static string buffer with printed return code in format
* used by strace - with errno and error message.
*
- * @param rc Return code.
- * @return Pointer to (statically allocated) buffer containing decimal
- * representation of return code and errno/error message in case @rc
- * is equal to -1.
+ * @param rc Return code.
+ * @param fmt Output format. Currently, raw (used for diff matching) and grep
+ * (for extended POSIX regex-based pattern matching) formats are
+ * supported.
+ * @return Pointer to (statically allocated) buffer containing decimal
+ * representation of return code and errno/error message in case @rc
+ * is equal to -1.
*/
-const char *
-sprintrc(long rc)
+static inline const char *
+sprintrc_ex(long rc, enum sprintrc_fmt fmt)
{
+ static const char *formats[] = {
+ [SPRINTRC_FMT_RAW] = "-1 %s (%m)",
+ [SPRINTRC_FMT_GREP] = "-1 %s \\(%m\\)",
+ };
static char buf[4096];
+ if (fmt >= ARRAY_SIZE(formats))
+ perror_msg_and_fail("sprintrc_ex: incorrect format provided");
+
if (rc == 0)
return "0";
int ret = (rc == -1)
- ? snprintf(buf, sizeof(buf), "-1 %s (%m)", errno2name())
+ ? snprintf(buf, sizeof(buf), formats[fmt], errno2name())
: snprintf(buf, sizeof(buf), "%ld", rc);
if (ret < 0)
return buf;
}
+
+const char *
+sprintrc(long rc)
+{
+ return sprintrc_ex(rc, SPRINTRC_FMT_RAW);
+}
+
+const char *
+sprintrc_grep(long rc)
+{
+ return sprintrc_ex(rc, SPRINTRC_FMT_GREP);
+}
/* Print return code and, in case return code is -1, errno information. */
const char *sprintrc(long rc);
+/* sprintrc variant suitable for usage as part of grep pattern. */
+const char *sprintrc_grep(long rc);
struct xlat;