Module Name:    src
Committed By:   jmmv
Date:           Fri Feb 15 17:08:01 UTC 2013

Modified Files:
        src/external/bsd/atf/dist/atf-c: atf-c-api.3 macros_test.c
        src/external/bsd/atf/dist/atf-c++: tests.cpp tests.hpp
        src/external/bsd/atf/dist/atf-c++/detail: process.hpp
        src/external/bsd/atf/dist/atf-c/detail: process_test.c test_helpers.c
        src/external/bsd/atf/dist/atf-report: atf-report.cpp
        src/external/bsd/atf/dist/atf-run: fs.cpp timer.hpp
        src/external/bsd/atf/dist/atf-sh: atf-check.cpp atf-check_test.sh
        src/external/bsd/atf/dist/doc: atf-test-case.4
Removed Files:
        src/external/bsd/atf/dist/atf-c/detail: test_helpers_test.c
        src/external/bsd/atf/dist/test-programs: fork_test.sh

Log Message:
Fix merge conflicts after import of atf 0.17.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/atf/dist/atf-c/atf-c-api.3 \
    src/external/bsd/atf/dist/atf-c/macros_test.c
cvs rdiff -u -r1.8 -r1.9 src/external/bsd/atf/dist/atf-c++/tests.cpp
cvs rdiff -u -r1.6 -r1.7 src/external/bsd/atf/dist/atf-c++/tests.hpp
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/atf/dist/atf-c++/detail/process.hpp
cvs rdiff -u -r1.3 -r1.4 \
    src/external/bsd/atf/dist/atf-c/detail/process_test.c
cvs rdiff -u -r1.4 -r1.5 \
    src/external/bsd/atf/dist/atf-c/detail/test_helpers.c
cvs rdiff -u -r1.1.1.3 -r0 \
    src/external/bsd/atf/dist/atf-c/detail/test_helpers_test.c
cvs rdiff -u -r1.6 -r1.7 src/external/bsd/atf/dist/atf-report/atf-report.cpp
cvs rdiff -u -r1.4 -r1.5 src/external/bsd/atf/dist/atf-run/fs.cpp
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/atf/dist/atf-run/timer.hpp
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/atf/dist/atf-sh/atf-check.cpp
cvs rdiff -u -r1.5 -r1.6 src/external/bsd/atf/dist/atf-sh/atf-check_test.sh
cvs rdiff -u -r1.5 -r1.6 src/external/bsd/atf/dist/doc/atf-test-case.4
cvs rdiff -u -r1.1.1.3 -r0 \
    src/external/bsd/atf/dist/test-programs/fork_test.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/atf/dist/atf-c/atf-c-api.3
diff -u src/external/bsd/atf/dist/atf-c/atf-c-api.3:1.2 src/external/bsd/atf/dist/atf-c/atf-c-api.3:1.3
--- src/external/bsd/atf/dist/atf-c/atf-c-api.3:1.2	Wed Sep 26 23:27:34 2012
+++ src/external/bsd/atf/dist/atf-c/atf-c-api.3	Fri Feb 15 17:07:59 2013
@@ -26,14 +26,17 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd December 26, 2010
+.Dd November 30, 2012
 .Dt ATF-C-API 3
 .Os
 .Sh NAME
+.Nm atf-c-api ,
 .Nm ATF_CHECK ,
 .Nm ATF_CHECK_MSG ,
 .Nm ATF_CHECK_EQ ,
 .Nm ATF_CHECK_EQ_MSG ,
+.Nm ATF_CHECK_MATCH ,
+.Nm ATF_CHECK_MATCH_MSG ,
 .Nm ATF_CHECK_STREQ ,
 .Nm ATF_CHECK_STREQ_MSG ,
 .Nm ATF_CHECK_ERRNO ,
@@ -41,6 +44,8 @@
 .Nm ATF_REQUIRE_MSG ,
 .Nm ATF_REQUIRE_EQ ,
 .Nm ATF_REQUIRE_EQ_MSG ,
+.Nm ATF_REQUIRE_MATCH ,
+.Nm ATF_REQUIRE_MATCH_MSG ,
 .Nm ATF_REQUIRE_STREQ ,
 .Nm ATF_REQUIRE_STREQ_MSG ,
 .Nm ATF_REQUIRE_ERRNO ,
@@ -72,7 +77,19 @@
 .Nm atf_tc_fail ,
 .Nm atf_tc_fail_nonfatal ,
 .Nm atf_tc_pass ,
-.Nm atf_tc_skip
+.Nm atf_tc_skip ,
+.Nm atf_utils_cat_file ,
+.Nm atf_utils_compare_file ,
+.Nm atf_utils_copy_file ,
+.Nm atf_utils_create_file ,
+.Nm atf_utils_file_exists ,
+.Nm atf_utils_fork ,
+.Nm atf_utils_free_charpp ,
+.Nm atf_utils_grep_file ,
+.Nm atf_utils_grep_string ,
+.Nm atf_utils_readline ,
+.Nm atf_utils_redirect ,
+.Nm atf_utils_wait
 .Nd C API to write ATF-based test programs
 .Sh SYNOPSIS
 .In atf-c.h
@@ -80,6 +97,8 @@
 .Fn ATF_CHECK_MSG "expression" "fail_msg_fmt" ...
 .Fn ATF_CHECK_EQ "expression_1" "expression_2"
 .Fn ATF_CHECK_EQ_MSG "expression_1" "expression_2" "fail_msg_fmt" ...
+.Fn ATF_CHECK_MATCH "regexp" "string"
+.Fn ATF_CHECK_MATCH_MSG "regexp" "string" "fail_msg_fmt" ...
 .Fn ATF_CHECK_STREQ "string_1" "string_2"
 .Fn ATF_CHECK_STREQ_MSG "string_1" "string_2" "fail_msg_fmt" ...
 .Fn ATF_CHECK_ERRNO "exp_errno" "bool_expression"
@@ -87,6 +106,8 @@
 .Fn ATF_REQUIRE_MSG "expression" "fail_msg_fmt" ...
 .Fn ATF_REQUIRE_EQ "expression_1" "expression_2"
 .Fn ATF_REQUIRE_EQ_MSG "expression_1" "expression_2" "fail_msg_fmt" ...
+.Fn ATF_REQUIRE_MATCH "regexp" "string"
+.Fn ATF_REQUIRE_MATCH_MSG "regexp" "string" "fail_msg_fmt" ...
 .Fn ATF_REQUIRE_STREQ "string_1" "string_2"
 .Fn ATF_REQUIRE_STREQ_MSG "string_1" "string_2" "fail_msg_fmt" ...
 .Fn ATF_REQUIRE_ERRNO "exp_errno" "bool_expression"
@@ -119,6 +140,67 @@
 .Fn atf_tc_fail_nonfatal "reason"
 .Fn atf_tc_pass
 .Fn atf_tc_skip "reason"
+.Ft void
+.Fo atf_utils_cat_file
+.Fa "const char *file"
+.Fa "const char *prefix"
+.Fc
+.Ft bool
+.Fo atf_utils_compare_file
+.Fa "const char *file"
+.Fa "const char *contents"
+.Fc
+.Ft void
+.Fo atf_utils_copy_file
+.Fa "const char *source"
+.Fa "const char *destination"
+.Fc
+.Ft void
+.Fo atf_utils_create_file
+.Fa "const char *file"
+.Fa "const char *contents"
+.Fa "..."
+.Fc
+.Ft void
+.Fo atf_utils_file_exists
+.Fa "const char *file"
+.Fc
+.Ft pid_t
+.Fo atf_utils_fork
+.Fa "void"
+.Fc
+.Ft void
+.Fo atf_utils_free_charpp
+.Fa "char **argv"
+.Fc
+.Ft bool
+.Fo atf_utils_grep_file
+.Fa "const char *regexp"
+.Fa "const char *file"
+.Fa "..."
+.Fc
+.Ft bool
+.Fo atf_utils_grep_string
+.Fa "const char *regexp"
+.Fa "const char *str"
+.Fa "..."
+.Fc
+.Ft char *
+.Fo atf_utils_readline
+.Fa "int fd"
+.Fc
+.Ft void
+.Fo atf_utils_redirect
+.Fa "const int fd"
+.Fa "const char *file"
+.Fc
+.Ft void
+.Fo atf_utils_wait
+.Fa "const pid_t pid"
+.Fa "const int expected_exit_status"
+.Fa "const char *expected_stdout"
+.Fa "const char *expected_stderr"
+.Fc
 .Sh DESCRIPTION
 The ATF
 .Pp
@@ -417,6 +499,16 @@ and
 .Fn ATF_REQUIRE_EQ_MSG
 take two expressions and fail if the two evaluated values are not equal.
 .Pp
+.Fn ATF_CHECK_MATCH ,
+.Fn ATF_CHECK_MATCH_MSG ,
+.Fn ATF_REQUIRE_MATCH
+and
+.Fn ATF_REQUIRE_MATCH_MSG
+take a regular expression and a string and fail if the regular expression does
+not match the given string.
+Note that the regular expression is not anchored, so it will match anywhere in
+the string.
+.Pp
 .Fn ATF_CHECK_STREQ ,
 .Fn ATF_CHECK_STREQ_MSG ,
 .Fn ATF_REQUIRE_STREQ
@@ -433,6 +525,180 @@ variable and, second, a boolean expressi
 means that a call failed and
 .Va errno
 has to be checked against the first value.
+.Ss Utility functions
+The following functions are provided as part of the
+.Nm
+API to simplify the creation of a variety of tests.
+In particular, these are useful to write tests for command-line interfaces.
+.Pp
+.Ft void
+.Fo atf_utils_cat_file
+.Fa "const char *file"
+.Fa "const char *prefix"
+.Fc
+.Bd -offset indent
+Prints the contents of
+.Fa file
+to the standard output, prefixing every line with the string in
+.Fa prefix .
+.Ed
+.Pp
+.Ft bool
+.Fo atf_utils_compare_file
+.Fa "const char *file"
+.Fa "const char *contents"
+.Fc
+.Bd -offset indent
+Returns true if the given
+.Fa file
+matches exactly the expected inlined
+.Fa contents .
+.Ed
+.Pp
+.Ft void
+.Fo atf_utils_copy_file
+.Fa "const char *source"
+.Fa "const char *destination"
+.Fc
+.Bd -offset indent
+Copies the file
+.Fa source
+to
+.Fa destination .
+The permissions of the file are preserved during the code.
+.Ed
+.Pp
+.Ft void
+.Fo atf_utils_create_file
+.Fa "const char *file"
+.Fa "const char *contents"
+.Fa "..."
+.Fc
+.Bd -offset indent
+Creates
+.Fa file
+with the text given in
+.Fa contents ,
+which is a formatting string that uses the rest of the variable arguments.
+.Ed
+.Pp
+.Ft void
+.Fo atf_utils_file_exists
+.Fa "const char *file"
+.Fc
+.Bd -offset indent
+Checks if
+.Fa file
+exists.
+.Ed
+.Pp
+.Ft pid_t
+.Fo atf_utils_fork
+.Fa "void"
+.Fc
+.Bd -offset indent
+Forks a process and redirects the standard output and standard error of the
+child to files for later validation with
+.Fn atf_utils_wait .
+Fails the test case if the fork fails, so this does not return an error.
+.Ed
+.Pp
+.Ft void
+.Fo atf_utils_free_charpp
+.Fa "char **argv"
+.Fc
+.Bd -offset indent
+Frees a dynamically-allocated array of dynamically-allocated strings.
+.Ed
+.Pp
+.Ft bool
+.Fo atf_utils_grep_file
+.Fa "const char *regexp"
+.Fa "const char *file"
+.Fa "..."
+.Fc
+.Bd -offset indent
+Searches for the
+.Fa regexp ,
+which is a formatting string representing the regular expression,
+in the
+.Fa file .
+The variable arguments are used to construct the regular expression.
+.Ed
+.Pp
+.Ft bool
+.Fo atf_utils_grep_string
+.Fa "const char *regexp"
+.Fa "const char *str"
+.Fa "..."
+.Fc
+.Bd -offset indent
+Searches for the
+.Fa regexp ,
+which is a formatting string representing the regular expression,
+in the literal string
+.Fa str .
+The variable arguments are used to construct the regular expression.
+.Ed
+.Pp
+.Ft char *
+.Fo atf_utils_readline
+.Fa "int fd"
+.Fc
+.Bd -offset indent
+Reads a line from the file descriptor
+.Fa fd .
+The line, if any, is returned as a dynamically-allocated buffer that must be
+released with
+.Xr free 3 .
+If there was nothing to read, returns
+.Sq NULL .
+.Ed
+.Pp
+.Ft void
+.Fo atf_utils_redirect
+.Fa "const int fd"
+.Fa "const char *file"
+.Fc
+.Bd -offset indent
+Redirects the given file descriptor
+.Fa fd
+to
+.Fa file .
+This function exits the process in case of an error and does not properly mark
+the test case as failed.
+As a result, it should only be used in subprocesses of the test case; specially
+those spawned by
+.Fn atf_utils_fork .
+.Ed
+.Pp
+.Ft void
+.Fo atf_utils_wait
+.Fa "const pid_t pid"
+.Fa "const int expected_exit_status"
+.Fa "const char *expected_stdout"
+.Fa "const char *expected_stderr"
+.Fc
+.Bd -offset indent
+Waits and validates the result of a subprocess spawned with
+.Fn atf_utils_wait .
+The validation involves checking that the subprocess exited cleanly and returned
+the code specified in
+.Fa expected_exit_status
+and that its standard output and standard error match the strings given in
+.Fa expected_stdout
+and
+.Fa expected_stderr .
+.Pp
+If any of the
+.Fa expected_stdout
+or
+.Fa expected_stderr
+strings are prefixed with
+.Sq save: ,
+then they specify the name of the file into which to store the stdout or stderr
+of the subprocess, and no comparison is performed.
+.Ed
 .Sh EXAMPLES
 The following shows a complete test program with a single test case that
 validates the addition operator:
Index: src/external/bsd/atf/dist/atf-c/macros_test.c
diff -u src/external/bsd/atf/dist/atf-c/macros_test.c:1.2 src/external/bsd/atf/dist/atf-c/macros_test.c:1.3
--- src/external/bsd/atf/dist/atf-c/macros_test.c:1.2	Thu Sep 13 21:44:49 2012
+++ src/external/bsd/atf/dist/atf-c/macros_test.c	Fri Feb 15 17:07:59 2013
@@ -125,6 +125,11 @@ init_and_run_h_tc(const char *name, void
 #define H_CHECK_STREQ(id, v1, v2) \
     H_DEF(check_streq_ ## id, ATF_CHECK_STREQ(v1, v2))
 
+#define H_CHECK_MATCH_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_match_ ## id)
+#define H_CHECK_MATCH_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_match_ ## id)
+#define H_CHECK_MATCH(id, v1, v2) \
+    H_DEF(check_match_ ## id, ATF_CHECK_MATCH(v1, v2))
+
 #define H_CHECK_EQ_MSG_HEAD_NAME(id) \
     ATF_TC_HEAD_NAME(h_check_eq_msg_ ## id)
 #define H_CHECK_EQ_MSG_BODY_NAME(id) \
@@ -139,6 +144,13 @@ init_and_run_h_tc(const char *name, void
 #define H_CHECK_STREQ_MSG(id, v1, v2, msg) \
     H_DEF(check_streq_msg_ ## id, ATF_CHECK_STREQ_MSG(v1, v2, msg))
 
+#define H_CHECK_MATCH_MSG_HEAD_NAME(id) \
+    ATF_TC_HEAD_NAME(h_check_match_msg_ ## id)
+#define H_CHECK_MATCH_MSG_BODY_NAME(id) \
+    ATF_TC_BODY_NAME(h_check_match_msg_ ## id)
+#define H_CHECK_MATCH_MSG(id, v1, v2, msg) \
+    H_DEF(check_match_msg_ ## id, ATF_CHECK_MATCH_MSG(v1, v2, msg))
+
 #define H_CHECK_ERRNO_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_check_errno_ ## id)
 #define H_CHECK_ERRNO_BODY_NAME(id) ATF_TC_BODY_NAME(h_check_errno_ ## id)
 #define H_CHECK_ERRNO(id, exp_errno, bool_expr) \
@@ -164,6 +176,11 @@ init_and_run_h_tc(const char *name, void
 #define H_REQUIRE_STREQ(id, v1, v2) \
     H_DEF(require_streq_ ## id, ATF_REQUIRE_STREQ(v1, v2))
 
+#define H_REQUIRE_MATCH_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_match_ ## id)
+#define H_REQUIRE_MATCH_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_match_ ## id)
+#define H_REQUIRE_MATCH(id, v1, v2) \
+    H_DEF(require_match_ ## id, ATF_REQUIRE_MATCH(v1, v2))
+
 #define H_REQUIRE_EQ_MSG_HEAD_NAME(id) \
     ATF_TC_HEAD_NAME(h_require_eq_msg_ ## id)
 #define H_REQUIRE_EQ_MSG_BODY_NAME(id) \
@@ -178,6 +195,13 @@ init_and_run_h_tc(const char *name, void
 #define H_REQUIRE_STREQ_MSG(id, v1, v2, msg) \
     H_DEF(require_streq_msg_ ## id, ATF_REQUIRE_STREQ_MSG(v1, v2, msg))
 
+#define H_REQUIRE_MATCH_MSG_HEAD_NAME(id) \
+    ATF_TC_HEAD_NAME(h_require_match_msg_ ## id)
+#define H_REQUIRE_MATCH_MSG_BODY_NAME(id) \
+    ATF_TC_BODY_NAME(h_require_match_msg_ ## id)
+#define H_REQUIRE_MATCH_MSG(id, v1, v2, msg) \
+    H_DEF(require_match_msg_ ## id, ATF_REQUIRE_MATCH_MSG(v1, v2, msg))
+
 #define H_REQUIRE_ERRNO_HEAD_NAME(id) ATF_TC_HEAD_NAME(h_require_errno_ ## id)
 #define H_REQUIRE_ERRNO_BODY_NAME(id) ATF_TC_BODY_NAME(h_require_errno_ ## id)
 #define H_REQUIRE_ERRNO(id, exp_errno, bool_expr) \
@@ -240,11 +264,11 @@ ATF_TC_BODY(check_errno, tc)
         ATF_REQUIRE(exists("after"));
 
         if (t->ok) {
-            ATF_REQUIRE(grep_file("result", "^passed"));
+            ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
         } else {
-            ATF_REQUIRE(grep_file("result", "^failed"));
-            ATF_REQUIRE(grep_file("error", "macros_test.c:[0-9]+: %s$",
-                t->exp_regex));
+            ATF_REQUIRE(atf_utils_grep_file("^failed", "result"));
+            ATF_REQUIRE(atf_utils_grep_file(
+                "macros_test.c:[0-9]+: %s$", "error", t->exp_regex));
         }
 
         ATF_REQUIRE(unlink("before") != -1);
@@ -282,11 +306,12 @@ ATF_TC_BODY(require_errno, tc)
 
         ATF_REQUIRE(exists("before"));
         if (t->ok) {
-            ATF_REQUIRE(grep_file("result", "^passed"));
+            ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
             ATF_REQUIRE(exists("after"));
         } else {
-            ATF_REQUIRE(grep_file("result", "^failed: .*macros_test.c:[0-9]+: "
-                "%s$", t->exp_regex));
+            ATF_REQUIRE(atf_utils_grep_file(
+                "^failed: .*macros_test.c:[0-9]+: %s$", "result",
+                t->exp_regex));
             ATF_REQUIRE(!exists("after"));
         }
 
@@ -340,11 +365,11 @@ ATF_TC_BODY(check, tc)
         ATF_REQUIRE(exists("after"));
 
         if (t->ok) {
-            ATF_REQUIRE(grep_file("result", "^passed"));
+            ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
         } else {
-            ATF_REQUIRE(grep_file("result", "^failed"));
-            ATF_REQUIRE(grep_file("error", "Check failed: .*"
-                "macros_test.c:[0-9]+: %s$", t->msg));
+            ATF_REQUIRE(atf_utils_grep_file("^failed", "result"));
+            ATF_REQUIRE(atf_utils_grep_file("Check failed: .*"
+                "macros_test.c:[0-9]+: %s$", "error", t->msg));
         }
 
         ATF_REQUIRE(unlink("before") != -1);
@@ -381,11 +406,11 @@ do_check_eq_tests(const struct check_eq_
         ATF_CHECK(exists("after"));
 
         if (t->ok) {
-            ATF_REQUIRE(grep_file("result", "^passed"));
+            ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
         } else {
-            ATF_REQUIRE(grep_file("result", "^failed"));
-            ATF_CHECK(grep_file("error", "Check failed: .*"
-                "macros_test.c:[0-9]+: %s$", t->msg));
+            ATF_REQUIRE(atf_utils_grep_file("^failed", "result"));
+            ATF_CHECK(atf_utils_grep_file("Check failed: .*"
+                "macros_test.c:[0-9]+: %s$", "error", t->msg));
         }
 
         ATF_CHECK(unlink("before") != -1);
@@ -442,8 +467,8 @@ H_CHECK_STREQ_MSG(2_1, "2", "1", "2 does
 H_CHECK_STREQ_MSG(2_2, "2", "2", "2 does not match 2");
 #define CHECK_STREQ_VAR1 "5"
 #define CHECK_STREQ_VAR2 "9"
-const char check_streq_var1[] = CHECK_STREQ_VAR1;
-const char check_streq_var2[] = CHECK_STREQ_VAR2;
+const char *check_streq_var1 = CHECK_STREQ_VAR1;
+const char *check_streq_var2 = CHECK_STREQ_VAR2;
 H_CHECK_STREQ(vars, check_streq_var1, check_streq_var2);
 
 ATF_TC(check_streq);
@@ -485,6 +510,40 @@ ATF_TC_BODY(check_streq, tc)
 }
 
 /* ---------------------------------------------------------------------
+ * Test cases for the ATF_CHECK_MATCH and ATF_CHECK_MATCH_MSG macros.
+ * --------------------------------------------------------------------- */
+
+H_CHECK_MATCH(yes, "hello [a-z]+", "abc hello world");
+H_CHECK_MATCH(no, "hello [a-z]+", "abc hello WORLD");
+H_CHECK_MATCH_MSG(yes, "hello [a-z]+", "abc hello world", "lowercase");
+H_CHECK_MATCH_MSG(no, "hello [a-z]+", "abc hello WORLD", "uppercase");
+
+ATF_TC(check_match);
+ATF_TC_HEAD(check_match, tc)
+{
+    atf_tc_set_md_var(tc, "descr", "Tests the ATF_CHECK_MATCH and "
+                      "ATF_CHECK_MATCH_MSG macros");
+}
+ATF_TC_BODY(check_match, tc)
+{
+    struct check_eq_test tests[] = {
+        { H_CHECK_MATCH_HEAD_NAME(yes), H_CHECK_MATCH_BODY_NAME(yes),
+          "hello [a-z]+", "abc hello world", "", true },
+        { H_CHECK_MATCH_HEAD_NAME(no), H_CHECK_MATCH_BODY_NAME(no),
+          "hello [a-z]+", "abc hello WORLD",
+          "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD'", false },
+        { H_CHECK_MATCH_MSG_HEAD_NAME(yes), H_CHECK_MATCH_MSG_BODY_NAME(yes),
+          "hello [a-z]+", "abc hello world", "", true },
+        { H_CHECK_MATCH_MSG_HEAD_NAME(no), H_CHECK_MATCH_MSG_BODY_NAME(no),
+          "hello [a-z]+", "abc hello WORLD",
+          "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD': uppercase",
+          false },
+        { NULL, NULL, 0, 0, "", false }
+    };
+    do_check_eq_tests(tests);
+}
+
+/* ---------------------------------------------------------------------
  * Test cases for the ATF_REQUIRE and ATF_REQUIRE_MSG macros.
  * --------------------------------------------------------------------- */
 
@@ -526,11 +585,11 @@ ATF_TC_BODY(require, tc)
 
         ATF_REQUIRE(exists("before"));
         if (t->ok) {
-            ATF_REQUIRE(grep_file("result", "^passed"));
+            ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
             ATF_REQUIRE(exists("after"));
         } else {
-            ATF_REQUIRE(grep_file("result", "^failed: .*macros_test.c:[0-9]+: "
-                                  "%s$", t->msg));
+            ATF_REQUIRE(atf_utils_grep_file(
+                "^failed: .*macros_test.c:[0-9]+: %s$", "result", t->msg));
             ATF_REQUIRE(!exists("after"));
         }
 
@@ -567,11 +626,11 @@ do_require_eq_tests(const struct require
 
         ATF_REQUIRE(exists("before"));
         if (t->ok) {
-            ATF_REQUIRE(grep_file("result", "^passed"));
+            ATF_REQUIRE(atf_utils_grep_file("^passed", "result"));
             ATF_REQUIRE(exists("after"));
         } else {
-            ATF_REQUIRE(grep_file("result", "^failed: .*macros_test.c"
-                ":[0-9]+: %s$", t->msg));
+            ATF_REQUIRE(atf_utils_grep_file("^failed: .*macros_test.c"
+                ":[0-9]+: %s$", "result", t->msg));
             ATF_REQUIRE(!exists("after"));
         }
 
@@ -630,8 +689,8 @@ H_REQUIRE_STREQ_MSG(2_1, "2", "1", "2 do
 H_REQUIRE_STREQ_MSG(2_2, "2", "2", "2 does not match 2");
 #define REQUIRE_STREQ_VAR1 "5"
 #define REQUIRE_STREQ_VAR2 "9"
-const char require_streq_var1[] = REQUIRE_STREQ_VAR1;
-const char require_streq_var2[] = REQUIRE_STREQ_VAR2;
+const char *require_streq_var1 = REQUIRE_STREQ_VAR1;
+const char *require_streq_var2 = REQUIRE_STREQ_VAR2;
 H_REQUIRE_STREQ(vars, require_streq_var1, require_streq_var2);
 
 ATF_TC(require_streq);
@@ -673,6 +732,41 @@ ATF_TC_BODY(require_streq, tc)
 }
 
 /* ---------------------------------------------------------------------
+ * Test cases for the ATF_REQUIRE_MATCH and ATF_REQUIRE_MATCH_MSG macros.
+ * --------------------------------------------------------------------- */
+
+H_REQUIRE_MATCH(yes, "hello [a-z]+", "abc hello world");
+H_REQUIRE_MATCH(no, "hello [a-z]+", "abc hello WORLD");
+H_REQUIRE_MATCH_MSG(yes, "hello [a-z]+", "abc hello world", "lowercase");
+H_REQUIRE_MATCH_MSG(no, "hello [a-z]+", "abc hello WORLD", "uppercase");
+
+ATF_TC(require_match);
+ATF_TC_HEAD(require_match, tc)
+{
+    atf_tc_set_md_var(tc, "descr", "Tests the ATF_REQUIRE_MATCH and "
+                      "ATF_REQUIRE_MATCH_MSG macros");
+}
+ATF_TC_BODY(require_match, tc)
+{
+    struct require_eq_test tests[] = {
+        { H_REQUIRE_MATCH_HEAD_NAME(yes), H_REQUIRE_MATCH_BODY_NAME(yes),
+          "hello [a-z]+", "abc hello world", "", true },
+        { H_REQUIRE_MATCH_HEAD_NAME(no), H_REQUIRE_MATCH_BODY_NAME(no),
+          "hello [a-z]+", "abc hello WORLD",
+          "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD'", false },
+        { H_REQUIRE_MATCH_MSG_HEAD_NAME(yes),
+          H_REQUIRE_MATCH_MSG_BODY_NAME(yes),
+          "hello [a-z]+", "abc hello world", "", true },
+        { H_REQUIRE_MATCH_MSG_HEAD_NAME(no), H_REQUIRE_MATCH_MSG_BODY_NAME(no),
+          "hello [a-z]+", "abc hello WORLD",
+          "'hello \\[a-z\\]\\+' not matched in 'abc hello WORLD': uppercase",
+          false },
+        { NULL, NULL, 0, 0, "", false }
+    };
+    do_require_eq_tests(tests);
+}
+
+/* ---------------------------------------------------------------------
  * Miscellaneous test cases covering several macros.
  * --------------------------------------------------------------------- */
 
@@ -728,12 +822,12 @@ ATF_TC_BODY(msg_embedded_fmt, tc)
 
         if (t->fatal) {
             bool matched =
-                grep_file("result", "^failed: .*macros_test.c:[0-9]+: "
-                          "%s$", t->msg);
+                atf_utils_grep_file(
+                    "^failed: .*macros_test.c:[0-9]+: %s$", "result", t->msg);
             ATF_CHECK_MSG(matched, "couldn't find error string in result");
         } else {
-            bool matched = grep_file("error", "Check failed: .*"
-                "macros_test.c:[0-9]+: %s$", t->msg);
+            bool matched = atf_utils_grep_file("Check failed: .*"
+                "macros_test.c:[0-9]+: %s$", "error", t->msg);
             ATF_CHECK_MSG(matched, "couldn't find error string in output");
         }
     }
@@ -765,11 +859,13 @@ ATF_TP_ADD_TCS(tp)
     ATF_TP_ADD_TC(tp, check_eq);
     ATF_TP_ADD_TC(tp, check_streq);
     ATF_TP_ADD_TC(tp, check_errno);
+    ATF_TP_ADD_TC(tp, check_match);
 
     ATF_TP_ADD_TC(tp, require);
     ATF_TP_ADD_TC(tp, require_eq);
     ATF_TP_ADD_TC(tp, require_streq);
     ATF_TP_ADD_TC(tp, require_errno);
+    ATF_TP_ADD_TC(tp, require_match);
 
     ATF_TP_ADD_TC(tp, msg_embedded_fmt);
 

Index: src/external/bsd/atf/dist/atf-c++/tests.cpp
diff -u src/external/bsd/atf/dist/atf-c++/tests.cpp:1.8 src/external/bsd/atf/dist/atf-c++/tests.cpp:1.9
--- src/external/bsd/atf/dist/atf-c++/tests.cpp:1.8	Mon Jan 16 22:41:30 2012
+++ src/external/bsd/atf/dist/atf-c++/tests.cpp	Fri Feb 15 17:08:00 2013
@@ -55,9 +55,11 @@ extern "C" {
 #include "atf-c/utils.h"
 }
 
+#include "noncopyable.hpp"
 #include "tests.hpp"
 
 #include "detail/application.hpp"
+#include "detail/auto_array.hpp"
 #include "detail/env.hpp"
 #include "detail/exceptions.hpp"
 #include "detail/fs.hpp"
@@ -127,7 +129,7 @@ detail::match(const std::string& regexp,
 static std::map< atf_tc_t*, impl::tc* > wraps;
 static std::map< const atf_tc_t*, const impl::tc* > cwraps;
 
-struct impl::tc_impl : atf::utils::noncopyable {
+struct impl::tc_impl : atf::noncopyable {
     std::string m_ident;
     atf_tc_t m_tc;
     bool m_has_cleanup;
@@ -190,8 +192,7 @@ impl::tc::init(const vars_map& config)
 {
     atf_error_t err;
 
-    utils::auto_array< const char * > array(
-        new const char*[(config.size() * 2) + 1]);
+    auto_array< const char * > array(new const char*[(config.size() * 2) + 1]);
     const char **ptr = array.get();
     for (vars_map::const_iterator iter = config.begin();
          iter != config.end(); iter++) {

Index: src/external/bsd/atf/dist/atf-c++/tests.hpp
diff -u src/external/bsd/atf/dist/atf-c++/tests.hpp:1.6 src/external/bsd/atf/dist/atf-c++/tests.hpp:1.7
--- src/external/bsd/atf/dist/atf-c++/tests.hpp:1.6	Mon Jan 16 22:41:30 2012
+++ src/external/bsd/atf/dist/atf-c++/tests.hpp	Fri Feb 15 17:08:00 2013
@@ -38,7 +38,7 @@ extern "C" {
 #include <atf-c/defs.h>
 }
 
-#include <atf-c++/utils.hpp>
+#include <atf-c++/noncopyable.hpp>
 
 namespace atf {
 namespace tests {
@@ -74,7 +74,7 @@ typedef std::map< std::string, std::stri
 
 struct tc_impl;
 
-class tc : utils::noncopyable {
+class tc : noncopyable {
     std::auto_ptr< tc_impl > pimpl;
 
 protected:

Index: src/external/bsd/atf/dist/atf-c++/detail/process.hpp
diff -u src/external/bsd/atf/dist/atf-c++/detail/process.hpp:1.3 src/external/bsd/atf/dist/atf-c++/detail/process.hpp:1.4
--- src/external/bsd/atf/dist/atf-c++/detail/process.hpp:1.3	Mon Jan 16 22:41:30 2012
+++ src/external/bsd/atf/dist/atf-c++/detail/process.hpp	Fri Feb 15 17:08:00 2013
@@ -41,11 +41,10 @@ extern "C" {
 #include <string>
 #include <vector>
 
+#include "auto_array.hpp"
 #include "exceptions.hpp"
 #include "fs.hpp"
 
-#include "../utils.hpp"
-
 namespace atf {
 namespace process {
 
@@ -64,7 +63,7 @@ class argv_array {
     // std::tr1::shared_array instead when it becomes widely available.
     // The reason would be to remove all copy constructors and assignment
     // operators from this class.
-    utils::auto_array< const char* > m_exec_argv;
+    auto_array< const char* > m_exec_argv;
     void ctor_init_exec_argv(void);
 
 public:

Index: src/external/bsd/atf/dist/atf-c/detail/process_test.c
diff -u src/external/bsd/atf/dist/atf-c/detail/process_test.c:1.3 src/external/bsd/atf/dist/atf-c/detail/process_test.c:1.4
--- src/external/bsd/atf/dist/atf-c/detail/process_test.c:1.3	Mon Jan 16 22:41:30 2012
+++ src/external/bsd/atf/dist/atf-c/detail/process_test.c	Fri Feb 15 17:07:59 2013
@@ -95,12 +95,12 @@ check_file(const enum out_type type)
 {
     switch (type) {
     case stdout_type:
-        ATF_CHECK(grep_file("stdout", "stdout: msg"));
-        ATF_CHECK(!grep_file("stdout", "stderr: msg"));
+        ATF_CHECK(atf_utils_grep_file("stdout: msg", "stdout"));
+        ATF_CHECK(!atf_utils_grep_file("stderr: msg", "stdout"));
         break;
     case stderr_type:
-        ATF_CHECK(grep_file("stderr", "stderr: msg"));
-        ATF_CHECK(!grep_file("stderr", "stdout: msg"));
+        ATF_CHECK(atf_utils_grep_file("stderr: msg", "stderr"));
+        ATF_CHECK(!atf_utils_grep_file("stdout: msg", "stderr"));
         break;
     default:
         UNREACHABLE;
@@ -110,7 +110,7 @@ check_file(const enum out_type type)
 struct capture_stream {
     struct base_stream m_base;
 
-    atf_dynstr_t m_msg;
+    char *m_msg;
 };
 #define CAPTURE_STREAM(type) \
     { .m_base = BASE_STREAM(capture_stream_init, \
@@ -126,7 +126,7 @@ capture_stream_init(void *v)
 
     s->m_base.m_sb_ptr = &s->m_base.m_sb;
     RE(atf_process_stream_init_capture(&s->m_base.m_sb));
-    RE(atf_dynstr_init(&s->m_msg));
+    s->m_msg = NULL;
 }
 
 static
@@ -137,10 +137,10 @@ capture_stream_process(void *v, atf_proc
 
     switch (s->m_base.m_type) {
     case stdout_type:
-        (void)read_line(atf_process_child_stdout(c), &s->m_msg);
+        s->m_msg = atf_utils_readline(atf_process_child_stdout(c));
         break;
     case stderr_type:
-        (void)read_line(atf_process_child_stderr(c), &s->m_msg);
+        s->m_msg = atf_utils_readline(atf_process_child_stderr(c));
         break;
     default:
         UNREACHABLE;
@@ -155,18 +155,18 @@ capture_stream_fini(void *v)
 
     switch (s->m_base.m_type) {
     case stdout_type:
-        ATF_CHECK(grep_string(&s->m_msg, "stdout: msg"));
-        ATF_CHECK(!grep_string(&s->m_msg, "stderr: msg"));
+        ATF_CHECK(atf_utils_grep_string("stdout: msg", s->m_msg));
+        ATF_CHECK(!atf_utils_grep_string("stderr: msg", s->m_msg));
         break;
     case stderr_type:
-        ATF_CHECK(!grep_string(&s->m_msg, "stdout: msg"));
-        ATF_CHECK(grep_string(&s->m_msg, "stderr: msg"));
+        ATF_CHECK(!atf_utils_grep_string("stdout: msg", s->m_msg));
+        ATF_CHECK(atf_utils_grep_string("stderr: msg", s->m_msg));
         break;
     default:
         UNREACHABLE;
     }
 
-    atf_dynstr_fini(&s->m_msg);
+    free(s->m_msg);
     atf_process_stream_fini(&s->m_base.m_sb);
 }
 
@@ -881,16 +881,10 @@ static
 void
 check_line(int fd, const char *exp)
 {
-    atf_dynstr_t line;
-    bool eof;
-
-    atf_dynstr_init(&line);
-    eof = read_line(fd, &line);
-    ATF_CHECK(!eof);
-    ATF_CHECK_MSG(atf_equal_dynstr_cstring(&line, exp),
-                  "read: '%s', expected: '%s'",
-                  atf_dynstr_cstring(&line), exp);
-    atf_dynstr_fini(&line);
+    char *line = atf_utils_readline(fd);
+    ATF_CHECK(line != NULL);
+    ATF_CHECK_STREQ_MSG(exp, line, "read: '%s', expected: '%s'", line, exp);
+    free(line);
 }
 
 ATF_TC(exec_failure);

Index: src/external/bsd/atf/dist/atf-c/detail/test_helpers.c
diff -u src/external/bsd/atf/dist/atf-c/detail/test_helpers.c:1.4 src/external/bsd/atf/dist/atf-c/detail/test_helpers.c:1.5
--- src/external/bsd/atf/dist/atf-c/detail/test_helpers.c:1.4	Wed Jul 11 22:38:40 2012
+++ src/external/bsd/atf/dist/atf-c/detail/test_helpers.c	Fri Feb 15 17:07:59 2013
@@ -30,7 +30,6 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <regex.h>
 #include <unistd.h>
 
 #include "atf-c/build.h"
@@ -106,72 +105,6 @@ get_process_helpers_path(const atf_tc_t 
                             is_detail ? "" : "detail/"));
 }
 
-bool
-grep_string(const atf_dynstr_t *str, const char *regex)
-{
-    int res;
-    regex_t preg;
-
-    printf("Looking for '%s' in '%s'\n", regex, atf_dynstr_cstring(str));
-    ATF_REQUIRE(regcomp(&preg, regex, REG_EXTENDED) == 0);
-
-    res = regexec(&preg, atf_dynstr_cstring(str), 0, NULL, 0);
-    ATF_REQUIRE(res == 0 || res == REG_NOMATCH);
-
-    regfree(&preg);
-
-    return res == 0;
-}
-
-bool
-grep_file(const char *file, const char *regex, ...)
-{
-    bool done, found;
-    int fd;
-    va_list ap;
-    atf_dynstr_t formatted;
-
-    va_start(ap, regex);
-    RE(atf_dynstr_init_ap(&formatted, regex, ap));
-    va_end(ap);
-
-    done = false;
-    found = false;
-    ATF_REQUIRE((fd = open(file, O_RDONLY)) != -1);
-    do {
-        atf_dynstr_t line;
-
-        RE(atf_dynstr_init(&line));
-
-        done = read_line(fd, &line);
-        if (!done)
-            found = grep_string(&line, atf_dynstr_cstring(&formatted));
-
-        atf_dynstr_fini(&line);
-    } while (!found && !done);
-    close(fd);
-
-    atf_dynstr_fini(&formatted);
-
-    return found;
-}
-
-bool
-read_line(int fd, atf_dynstr_t *dest)
-{
-    char ch;
-    ssize_t cnt;
-
-    while ((cnt = read(fd, &ch, sizeof(ch))) == sizeof(ch) &&
-           ch != '\n') {
-        const atf_error_t err = atf_dynstr_append_fmt(dest, "%c", ch);
-        ATF_REQUIRE(!atf_is_error(err));
-    }
-    ATF_REQUIRE(cnt != -1);
-
-    return cnt == 0;
-}
-
 struct run_h_tc_data {
     atf_tc_t *m_tc;
     const char *m_resname;

Index: src/external/bsd/atf/dist/atf-report/atf-report.cpp
diff -u src/external/bsd/atf/dist/atf-report/atf-report.cpp:1.6 src/external/bsd/atf/dist/atf-report/atf-report.cpp:1.7
--- src/external/bsd/atf/dist/atf-report/atf-report.cpp:1.6	Mon Jan 16 22:41:30 2012
+++ src/external/bsd/atf/dist/atf-report/atf-report.cpp	Fri Feb 15 17:08:00 2013
@@ -31,6 +31,7 @@ extern "C" {
 #include <sys/time.h>
 }
 
+#include <cctype>
 #include <cstdlib>
 #include <fstream>
 #include <iomanip>
@@ -381,7 +382,6 @@ public:
 class xml_writer : public writer {
     ostream_ptr m_os;
 
-    size_t m_curtp, m_ntps;
     std::string m_tcname, m_tpname;
 
     static
@@ -395,17 +395,24 @@ class xml_writer : public writer {
     std::string
     elemval(const std::string& str)
     {
-        std::string ostr;
+        std::ostringstream buf;
         for (std::string::const_iterator iter = str.begin();
              iter != str.end(); iter++) {
-            switch (*iter) {
-            case '&': ostr += "&amp;"; break;
-            case '<': ostr += "&lt;"; break;
-            case '>': ostr += "&gt;"; break;
-            default:  ostr += *iter;
+            const int character = static_cast< unsigned char >(*iter);
+            if (character == '&') {
+                buf << "&amp;";
+            } else if (character == '<') {
+                buf << "&lt;";
+            } else if (character == '>') {
+                buf << "&gt;";
+            } else if (std::isalnum(character) || std::ispunct(character) ||
+                       std::isspace(character)) {
+                buf << static_cast< char >(character);
+            } else {
+                buf << "&amp;#" << character << ";";
             }
         }
-        return ostr;
+        return buf.str();
     }
 
     void

Index: src/external/bsd/atf/dist/atf-run/fs.cpp
diff -u src/external/bsd/atf/dist/atf-run/fs.cpp:1.4 src/external/bsd/atf/dist/atf-run/fs.cpp:1.5
--- src/external/bsd/atf/dist/atf-run/fs.cpp:1.4	Thu Apr  5 01:04:18 2012
+++ src/external/bsd/atf/dist/atf-run/fs.cpp	Fri Feb 15 17:08:00 2013
@@ -44,6 +44,7 @@ extern "C" {
 #include <cstdlib>
 #include <cstring>
 
+#include "atf-c++/detail/auto_array.hpp"
 #include "atf-c++/detail/process.hpp"
 #include "atf-c++/detail/sanity.hpp"
 
@@ -200,7 +201,7 @@ retry_unmount:
 
 impl::temp_dir::temp_dir(const atf::fs::path& p)
 {
-    atf::utils::auto_array< char > buf(new char[p.str().length() + 1]);
+    atf::auto_array< char > buf(new char[p.str().length() + 1]);
     std::strcpy(buf.get(), p.c_str());
     if (::mkdtemp(buf.get()) == NULL)
         throw system_error(IMPL_NAME "::temp_dir::temp_dir(" +

Index: src/external/bsd/atf/dist/atf-run/timer.hpp
diff -u src/external/bsd/atf/dist/atf-run/timer.hpp:1.3 src/external/bsd/atf/dist/atf-run/timer.hpp:1.4
--- src/external/bsd/atf/dist/atf-run/timer.hpp:1.3	Mon Jan 16 22:41:30 2012
+++ src/external/bsd/atf/dist/atf-run/timer.hpp	Fri Feb 15 17:08:00 2013
@@ -36,7 +36,7 @@ extern "C" {
 
 #include <memory>
 
-#include "atf-c++/utils.hpp"
+#include "atf-c++/noncopyable.hpp"
 
 namespace atf {
 namespace atf_run {
@@ -47,7 +47,7 @@ class signal_programmer;
 // The "timer" class.
 // ------------------------------------------------------------------------
 
-class timer : utils::noncopyable {
+class timer : noncopyable {
     struct impl;
     std::auto_ptr< impl > m_pimpl;
 

Index: src/external/bsd/atf/dist/atf-sh/atf-check.cpp
diff -u src/external/bsd/atf/dist/atf-sh/atf-check.cpp:1.7 src/external/bsd/atf/dist/atf-sh/atf-check.cpp:1.8
--- src/external/bsd/atf/dist/atf-sh/atf-check.cpp:1.7	Wed Jul 11 22:38:40 2012
+++ src/external/bsd/atf/dist/atf-sh/atf-check.cpp	Fri Feb 15 17:08:00 2013
@@ -49,9 +49,9 @@ extern "C" {
 
 #include "atf-c++/check.hpp"
 #include "atf-c++/config.hpp"
-#include "atf-c++/utils.hpp"
 
 #include "atf-c++/detail/application.hpp"
+#include "atf-c++/detail/auto_array.hpp"
 #include "atf-c++/detail/exceptions.hpp"
 #include "atf-c++/detail/fs.hpp"
 #include "atf-c++/detail/process.hpp"
@@ -116,7 +116,7 @@ public:
         std::ostream(NULL),
         m_fd(-1)
     {
-        atf::utils::auto_array< char > buf(new char[p.str().length() + 1]);
+        atf::auto_array< char > buf(new char[p.str().length() + 1]);
         std::strcpy(buf.get(), p.c_str());
 
         m_fd = ::mkstemp(buf.get());

Index: src/external/bsd/atf/dist/atf-sh/atf-check_test.sh
diff -u src/external/bsd/atf/dist/atf-sh/atf-check_test.sh:1.5 src/external/bsd/atf/dist/atf-sh/atf-check_test.sh:1.6
--- src/external/bsd/atf/dist/atf-sh/atf-check_test.sh:1.5	Mon Jan 16 22:41:31 2012
+++ src/external/bsd/atf/dist/atf-sh/atf-check_test.sh	Fri Feb 15 17:08:00 2013
@@ -211,10 +211,10 @@ oflag_inline_body()
     h_pass "echo foo bar" -o inline:"foo bar\n"
     h_pass "printf 'foo bar'" -o inline:"foo bar"
     h_pass "printf '\t\n\t\n'" -o inline:"\t\n\t\n"
-    # XXX Ugly hack to workaround the lack of \e in FreeBSD.  Look for a
-    # nicer solution...
+    # XXX Ugly hack to workaround the lack of \e in FreeBSD.  Also, \e doesn't
+    # seem to work as expected in Linux.  Look for a nicer solution.
     case $(uname) in
-    Darwin|FreeBSD)
+    Darwin|FreeBSD|Linux)
         h_pass "printf '\a\b\f\n\r\t\v'" -o inline:"\a\b\f\n\r\t\v"
         ;;
     *)
@@ -331,10 +331,10 @@ eflag_inline_body()
     h_pass "echo foo bar 1>&2" -e inline:"foo bar\n"
     h_pass "printf 'foo bar' 1>&2" -e inline:"foo bar"
     h_pass "printf '\t\n\t\n' 1>&2" -e inline:"\t\n\t\n"
-    # XXX Ugly hack to workaround the lack of \e in FreeBSD.  Look for a
-    # nicer solution...
+    # XXX Ugly hack to workaround the lack of \e in FreeBSD.  Also, \e doesn't
+    # seem to work as expected in Linux.  Look for a nicer solution.
     case $(uname) in
-    Darwin|FreeBSD)
+    Darwin|FreeBSD|Linux)
         h_pass "printf '\a\b\f\n\r\t\v' 1>&2" -e inline:"\a\b\f\n\r\t\v"
         ;;
     *)

Index: src/external/bsd/atf/dist/doc/atf-test-case.4
diff -u src/external/bsd/atf/dist/doc/atf-test-case.4:1.5 src/external/bsd/atf/dist/doc/atf-test-case.4:1.6
--- src/external/bsd/atf/dist/doc/atf-test-case.4:1.5	Mon Jan 16 22:41:31 2012
+++ src/external/bsd/atf/dist/doc/atf-test-case.4	Fri Feb 15 17:08:00 2013
@@ -61,7 +61,7 @@ failures.
 This body is only executed if the abstract conditions specified by the
 header are met.
 The
-.Em cleanup routine
+.Em cleanup
 routine is a piece of code always executed after the body, regardless of
 the exit status of the test case.
 It can be used to undo side-effects of the test case.

Reply via email to